openscad-2019.05/.circleci/config.yml0000644000076500000240000001373213441240314017724 0ustar kintelstaff00000000000000version: 2 jobs: openscad-mxe-32bit: working_directory: ~/workspace docker: - image: openscad/mxe-i686-deps:latest steps: - checkout - run: name: Build OpenSCAD Windows Application (32bit) no_output_timeout: 18000 command: | export NUMCPU=2 export MXEDIR=/mxe export LIB3MF_INCLUDEPATH=/mxe/usr/i686-w64-mingw32.static.posix/include/lib3mf export LIB3MF_LIBPATH=/mxe/usr/i686-w64-mingw32.static.posix/include/lib3mf if [ x"${CIRCLE_BRANCH}" = xmaster ]; then export SUFFIX=""; else export SUFFIX="_$(echo ${CIRCLE_BRANCH} | sed -e 's,pull/,PR,')"; fi export OPENSCAD_VERSION="$(date +%Y.%m.%d).ci${CIRCLE_BUILD_NUM}" ./scripts/release-common.sh -snapshot -mingw32 -v "$OPENSCAD_VERSION" mkdir -p /tmp/out for f in mingw*/*.zip mingw*/*.exe; do N=$(basename "$f" | sed -e "s/\\(-x86-[36][24]\\)/\\1${SUFFIX}/;"); cp -iv "$f" /tmp/out/"$N"; done if [ -n "${CODE_SIGNING_KEY}" ]; then cd /tmp/out echo $CODE_SIGNING_DATA | base64 -d | gzip -d | gpg --import --allow-secret-key-import --pinentry-mode loopback --passphrase-file <(echo $CODE_SIGNING_PW) export GPG_ARGS="--batch --yes --passphrase-fd 0 --pinentry-mode loopback --detach-sign --armor" for a in *.exe *.zip; do echo "$CODE_SIGNING_PW" | gpg -u "$CODE_SIGNING_KEY" $GPG_ARGS "$a"; sha1sum "$a" | tee "${a}.sha1"; sha256sum "$a" | tee "${a}.sha256"; done rm -rf ~/.gnupg else echo "Skipping code signing." fi - store_artifacts: path: /tmp/out destination: 32-bit openscad-mxe-64bit: working_directory: ~/workspace docker: - image: openscad/mxe-x86_64-deps:latest steps: - checkout - run: name: Build OpenSCAD Windows Application (64bit) no_output_timeout: 18000 command: | export NUMCPU=2 export MXEDIR=/mxe export LIB3MF_INCLUDEPATH=/mxe/usr/x86_64-w64-mingw32.static.posix/include/lib3mf export LIB3MF_LIBPATH=/mxe/usr/x86_64-w64-mingw32.static.posix/include/lib3mf if [ x"${CIRCLE_BRANCH}" = xmaster ]; then export SUFFIX=""; else export SUFFIX="_$(echo ${CIRCLE_BRANCH} | sed -e 's,pull/,PR,')"; fi export OPENSCAD_VERSION="$(date +%Y.%m.%d).ci${CIRCLE_BUILD_NUM}" ./scripts/release-common.sh -snapshot -mingw64 -v "$OPENSCAD_VERSION" mkdir -p /tmp/out for f in mingw*/*.zip mingw*/*.exe; do N=$(basename "$f" | sed -e "s/\\(-x86-[36][24]\\)/\\1${SUFFIX}/;"); cp -iv "$f" /tmp/out/"$N"; done if [ -n "${CODE_SIGNING_KEY}" ]; then cd /tmp/out echo $CODE_SIGNING_DATA | base64 -d | gzip -d | gpg --import --allow-secret-key-import --pinentry-mode loopback --passphrase-file <(echo $CODE_SIGNING_PW) export GPG_ARGS="--batch --yes --passphrase-fd 0 --pinentry-mode loopback --detach-sign --armor" for a in *.exe *.zip; do echo "$CODE_SIGNING_PW" | gpg -u "$CODE_SIGNING_KEY" $GPG_ARGS "$a"; sha1sum "$a" | tee "${a}.sha1"; sha256sum "$a" | tee "${a}.sha256"; done rm -rf ~/.gnupg else echo "Skipping code signing." fi - store_artifacts: path: /tmp/out destination: 64-bit openscad-appimage-64bit: working_directory: ~/workspace docker: - image: openscad/appimage-x86_64-base:latest steps: - checkout - run: name: Build OpenSCAD AppImage (64bit) no_output_timeout: 18000 command: | set +e . /opt/qt511/bin/qt511-env.sh set -e export OPENSCAD_COMMIT=$(git log -1 --pretty=format:%h) export OPENSCAD_VERSION="$(date +%Y.%m.%d).ai${CIRCLE_BUILD_NUM}" if [ x"${CIRCLE_BRANCH}" = xmaster ]; then export SUFFIX=""; else export SUFFIX="_$(echo ${CIRCLE_BRANCH} | sed -e 's,pull/,PR,')"; fi qmake -v qmake CONFIG+=experimental CONFIG+=snapshot CONFIG-=debug PREFIX=/usr VERSION="$OPENSCAD_VERSION" OPENSCAD_COMMIT="$OPENSCAD_COMMIT" make -j2 make install INSTALL_ROOT=AppDir export PATH=/appimage/usr/bin:"$PATH" linuxdeploy --plugin qt --output appimage --appdir AppDir mkdir -p /tmp/out for f in OpenSCAD-*.AppImage; do N=$(basename "$f" | sed -e "s/OpenSCAD-\\(.*\\)/OpenSCAD-${OPENSCAD_VERSION}-${SUFFIX}\\1/;"); cp -iv "$f" /tmp/out/"$N"; done if [ -n "${CODE_SIGNING_KEY}" ]; then cd /tmp/out echo $CODE_SIGNING_DATA | base64 -d | gzip -d | gpg --import export GPG_ARGS="--batch --yes --passphrase-fd 0 --detach-sign --armor" for a in *.AppImage; do echo "$CODE_SIGNING_PW" | gpg -u "$CODE_SIGNING_KEY" $GPG_ARGS "$a"; sha1sum "$a" | tee "${a}.sha1"; sha256sum "$a" | tee "${a}.sha256"; done rm -rf ~/.gnupg else echo "Skipping code signing." fi - store_artifacts: path: /tmp/out destination: 64-bit workflows: version: 2 build: jobs: - openscad-mxe-32bit: context: secret-context filters: branches: ignore: - coverity_scan - /^(?i:continuous)$/ - openscad-mxe-64bit: context: secret-context filters: branches: ignore: - coverity_scan - /^(?i:continuous)$/ - openscad-appimage-64bit: context: secret-context filters: branches: ignore: - coverity_scan - /^(?i:continuous)$/ openscad-2019.05/.clang-format0000644000076500000240000000104613402025764016456 0ustar kintelstaff00000000000000--- Language: Cpp BasedOnStyle: LLVM TabWidth: 2 UseTab: ForContinuationAndIndentation AlignEscapedNewlinesLeft: true AllowShortFunctionsOnASingleLine: Inline AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: true AlwaysBreakTemplateDeclarations: true BraceWrapping: AfterClass: true AfterFunction: true BeforeElse: true BreakBeforeBraces: Custom ColumnLimit: 100 ConstructorInitializerIndentWidth: 2 NamespaceIndentation: None PenaltyReturnTypeOnItsOwnLine: 1000 SortIncludes: false ... openscad-2019.05/.clang-tidy0000644000076500000240000000013613402025764016136 0ustar kintelstaff00000000000000Checks: '-*,modernize-use-nullptr' WarningsAsErrors: '' AnalyzeTemporaryDtors: false openscad-2019.05/.qmake.cache0000644000076500000240000000000113465200776016241 0ustar kintelstaff00000000000000 openscad-2019.05/.travis.yml0000644000076500000240000002410413452415427016220 0ustar kintelstaff00000000000000language: cpp matrix: include: - os: linux compiler: gcc dist: xenial env: - DIST="xenial" - PARALLEL_CTEST=-j1 sudo: required cache: - apt - ccache - if: NOT branch = coverity_scan os: osx compiler: clang env: - DIST="osx" - PARALLEL_CTEST=-j4 cache: - ccache - directories: - $HOME/Library/Caches/Homebrew notifications: irc: channels: - "chat.freenode.net#openscad" on_success: change use_notice: false skip_join: true before_install: # Fix for "write error" build failures ( https://github.com/travis-ci/travis-ci/issues/8920 ) - python -c "import fcntl; fcntl.fcntl(1, fcntl.F_SETFL, 0)" - if [[ "$DIST" == "trusty" ]]; then wget -qO - http://files.openscad.org/OBS-Repository-Key.pub | sudo apt-key add - ; echo 'yes' | sudo add-apt-repository 'deb http://download.opensuse.org/repositories/home:/t-paul:/lib3mf/xUbuntu_14.04/ ./' ; sudo apt-get update -qq ; sudo apt-get purge -qq fglrx ; sudo apt-get install -qq build-essential qtbase5-dev libqt5opengl5-dev qtmultimedia5-dev libxmu-dev bison flex git-core libboost-all-dev libxi-dev libmpfr-dev libboost-dev libglew-dev libeigen3-dev libcgal-dev libgmp3-dev libgmp-dev curl imagemagick libfontconfig-dev libopencsg-dev libharfbuzz-dev libzip-dev lib3mf-dev libdouble-conversion-dev; fi - if [[ "$DIST" == "xenial" ]]; then wget -qO - http://files.openscad.org/OBS-Repository-Key.pub | sudo apt-key add - ; echo 'yes' | sudo add-apt-repository 'deb http://download.opensuse.org/repositories/home:/t-paul:/lib3mf/xUbuntu_16.04/ ./' ; sudo apt-get update -qq ; sudo apt-get purge -qq fglrx ; sudo apt-get install -qq build-essential qtbase5-dev libqt5opengl5-dev qtmultimedia5-dev libqt5scintilla2-dev libxmu-dev cmake bison flex git-core libboost-all-dev libxi-dev libmpfr-dev libboost-dev libglew-dev libeigen3-dev libcgal-dev libcgal-qt5-dev libgmp3-dev libgmp-dev curl imagemagick libfontconfig-dev libopencsg-dev libharfbuzz-dev libzip-dev lib3mf-dev libdouble-conversion-dev; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./scripts/macosx-build-homebrew.sh ; fi branches: only: - master - coverity_scan before_script: - echo -e "Host files.openscad.org\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config - for i in {0..40}; do eval $(printf "echo \$openscad_rsa_%02d\n" $i) >> ~/.ssh/openscad_rsa_base64; done - base64 --decode ~/.ssh/openscad_rsa_base64 > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa script: if [ "${COVERITY_SCAN_BRANCH}" = 1 ]; then ./scripts/coverity.sh ; else ./scripts/travis-ci.sh ; fi env: global: - QT_SELECT=qt5 - OPENSCAD_UPLOAD_TESTS=yes - secure: "mBWdnkXe8BL1SqYRBnOOpXn60xtHGfpeVOh+HrK8xZPflLyJLdgAz3jsrgPaaMibfuygOEfn86jm8dFZPDJSeGh+gGbcjbtOywvYtr0d/KJPk2ccCavlGEBsTSdfWVBMH2hqZ+OXrSn4amx12fmcF/rnpRZu0jHxRWrL4SbouXM=" - secure: "gYPUvQekTxYW4bNIDvL6MFdPihd0HFGIq2saEbcOVyGYuZTdyBIzoh3tLIdG6jJNLWb/Nn2iWEsbsSsSIVk9UowW2qmuKVmzOyezKiu7wO2bdk08zeNtZLdFU4f8NsPz/ODXGQBCbjrBr8csnczQ9DKcxQeG2Lr9z1PjpJE43zY=" - secure: "N4tu1zJPq4tDrfArXawiQZ/oAb3jZ1xEonxH2WWMnUXj6CGMSrRbkUD7h7Yx5WcIgxkDE87Q+mMgKDNDhDQuK4RiTngwokXKSCHYn0odo10o1SWiNE42czLpbCTWJeM/5m+nyPhE1Hn8StTwiwqiA2YkBUICh/z+s6cmqV5JaEU=" - secure: "hfkGLUH90vkYIIQlBjAlYRxl/KJE/d5Z8cGnXGN77+RuvmGN2vMspSTXdvIe7KXesLs3ly96iA/mx3LLzW4YQu1qlwaAtffXiX2GBUFgRAHQV4Ty6PJzwRjzTxqZTh2jE+lZukB/6oh0ZlF4lpFYRFIMwLQMP64gGN0aqdQwc0I=" - secure: "UBH3ATAhykSH4su70oG6vmnOfV62ghNDLO/Y5dZwZvZVkKdERdddtpP8tPmJrkeqZp6nZs2DPA1ufgifaShZgv5eo5U1pdg4zFRA8UuOlK51QWdPYdk4/kTbifqeKhiQlNpvMXGnRPfk0a2HdAiaAHk0FKIPBRPAgwJlE03zKf4=" - secure: "YAMu566rDdaAHflMlvBdwkb7F4DNoDa6nJ1/d0bbaPDDk2onxzt5Nos9P3LMMya9XDo/+/8XZWUhdU2t8fwKfKiAanaIPiDYFaS7gZDohu7TI41rqJnnHFF1KNtG624PbABIgKBu8AEHsF1op7EG31SD8ZFyYTBdFOlgVruNWEA=" - secure: "cLVNa1aAtGyO7nHumphZRcNmMnFp+Ts4Bqh6WlclZ3RljEp5rKqHP3knHVgE6T0jC6zMTdNDwKHkyW2jlETRa0l7SGblZI1iuAATnNMwH14FPJgfHP2g30dYu714J6ik6UWUyFNex6o5ZlrVnTnrTuQpTQmF/Ehb4xBcFh780S8=" - secure: "VXa5G1ow1YND0Ap7jTH6oewSlgE3bQz0ZRKPz/bMEQhmImitAW24LG+kLi1RWfvtwJdHBOExlwh/yGpe508WXLF5F/Hv9LKTeAFixUSpFXt1Llsx1/LuApy7i4bq9nmx30Of5GiFvUARTr0wa1a3BbH5E0Sj963vVLwy+FZDiS8=" - secure: "K9pzYAsFc9rvFVz12Y80uFpruH7R5tJpurtGxQJpgSRCr4kRlJO+ODt4/Voq7lzFCiMuhbBiE0G4f8SzylyyiyJaZshAxqRBteEdDEMEnx1ND4FbqDnB9apWnWRoY1AbqBx1ckEy3jCvw1Tn9bRvvvcnOI6qXFxLpTJMP3eY6R4=" - secure: "Oa/blQENesTANzJbqzdQPQ1Hg99DaUVCekms1xkymLBUCSzqPL44KVdz3cxVGYBl/Om7mBwENEQ9BOUI6vGq+CZ7aaTYrYfEUokgvhGUgku0iLjxpHrIH04TH4XwpDXRg/iLwdQZO3d+xq7Q4XTBLOEyHVdzn5uDGP+cNoW9NbM=" - secure: "L3vKi+0gahSm8DF2GGp98FPhuWtUlqRRpCXjAUsSVNCPtru01tI4i6Kls7yqq2L+31FtkyWqBIlm1S1OZw8uiPyis3eUDqMRgASs4tOx/q2Xj2TEK8p+TKK+d3A8mct/y0e806GwdH5JIIppGSPOknPtxT92jZMrv0PnGnPAJSQ=" - secure: "fZzEs4GUtK494s63as9K72kmw0taicfouk2NDym58wHqS88UeRVjvrAkwoIGLJS6rCrh/4NkKhxPkd6JNVRVHy3KH8j2FYoIwtLStEC7YZfT25gi8EiN+O6MrTVre1WA9RT52v5gQ+a2v2YPUU6fBJAy6Xgy372PzoQrXF4iYOA=" - secure: "fNSoCKmJQUJJn4rFxsX0YXHIEtF3JCIixBkM8sCmuzOxjUPFLEjD/5D4x/t+FJfGwb1PR4194L3Tys7AK4IrpIDDXBO8vF3PYK1/evoPLPgj4IkPOReoX2zDUhxsvnEVlF3pGMK6erB6QZoDFCYD6OvqeQUxDDDuEvG8UEvNUgc=" - secure: "apJEmAnp5Ome0UJk+UEsdlVNBOX4bXE9FjBp6yYVrSeAEASFZTZbnIQXP9N8XwFc+TBa5aBlV9s7GZaieVW1/uNZg9njGUsbxPLtqpyHqJTDBgw3edcs7V12jGl+quRJoYVOtbyMQyr5VwCPzV6MmaLOoEtJM75yoSUoerkyNiI=" - secure: "AnXGOWlfhnxEuwqfnir411x/Z2Kvd/R37F8Jcv60+3dugCTLsOL/9i7rY5mwwm2ZFx4uwbCDXEC+UlW/vUhLhvdh8sCYocpghxY+WQye1cib+voqkP6Tgi1AtZL2CxBTJ2Kvyr+kNGTl0TvQC/uv3qI/D+ePijn89KFt9Z2NQEk=" - secure: "KPpkgyXr1mpbNOtxn0NAH2iS0NSy/LC6/DBoR9PBmK80LmHqhQkcB+OAwHy5q4RvRpeNIm2zg49OvV7RgzXQD3NXIy7Eik3uM6IzrcHXlDO6zPye/EAMYt/C0tJylR6ESDfp1+pEI0VyFz6pjFFs7FAX5m9UinaEJns7vucb8SA=" - secure: "Hf1TNzMMPw7msFCttHoF0V2wOFQERbGwYsZSMUac8njBXDjbsP+S/iYNkqoqJIfBjknXbn1U0RDfiDwvs/71lhV0FEoF2zPbOWitO7+ZeqpNcP2oMqnPBLCuCldKWxbsjKLwE5Qgd9KflPh49ZlnHe/cZZdzeDCIpAmHk+Ey/4U=" - secure: "cG7qndC1YAHa05QSLD8CzAZJOyJsHj4+I8OKvv+nfKFO/pQVZzKfF84v0ZVxpqdFNRRUwdH4n7zYCNAaMSoeSQmk++jyf+w8cu+x1MZ9HcnfqduuyirZR5iehmlIy1v/c1CsxAQeovDMulnFJOXGf7q7tUqB3rw/WlZZHn6Fpfc=" - secure: "NHym8MhLToBE5dlldCKTBn8NuLQg9jhjdB/9Gnn0h5j0G3x3O9yx3XbBtVSKNdvtqfGog6NG6XT2UhCYGtv59lTcWVR5tPulYkJV1vqeHfY21QeDYIESr/JOZaAIZ0RQaT/jWnoIghQNe38VMozWdwZ3ulKQ2HnzFagTbftfF5A=" - secure: "mClAXQOm9gc7UXuXpyqfNWp7JJU4n6n3pd792VK8K8ioXKVSySZLbJOFul5KY8ZLePCvdliZ0yfKqyBR7XqbzPFwH/0R3pppaI+T/0mZRi5SqcJ9KnJdf7jkTLsQI73wU25YC/T6ZHodEfANYTaP06Ex7QnY/djWsTvAH3Ga2dA=" - secure: "BdYq/BztHLp4TGExfjAxRW9Qtnpi7aizY6fyQNqOBorF6aYKNLOaaN8i7bURL7I5B+WT2vR/NFDv8Ehz096HFjnDZ8vVFn4tQQgGlxf+BcYrBOeA+AIxA9XR/yp9v6ljONasD7PQ8uDJoyUy9FOimet6T5GAOTy8LO8SRQDvxoY=" - secure: "iHb3IwbyrCKW884oVvckz7BR8F9YhLQXkEUvufc/5oKtsn/zMflHQ1+OV04q4j7B5hdu9/ur8T0q80YysJL8btHT0vnR7kx/uDx/S8tqXlMMb0Tr1JUGLFIHBZWRPUCayXTcBk06BrYRA1wB8cLQnLxqI4OfgMAN+rOv60CGR8k=" - secure: "XzK4KXCtcu5B1Flyiq9jl7hxnsUXXTYcmSq7bmIM4g8dsRz6EdDWrSBJUIstKCLckmoeQcfyCyXYjy2dvGgv7FX+Hu1nNGCZGy/rOIaciiinHf9mQZVTTwUZv1gGPZo2jdue15NvvCLwJt/N6SSZYor8fRyPyuVnK8/PBj4jcao=" - secure: "YFEbESe4qlFKXsgYgST3Z9NRMyNEj2oVYEzgcB+dWsVnfDufhtjUhQ+AGw+vsbYg2g2TIQzyVSWMG+mQo41SX4bLFH0Rwgial4ZnpWP7NHrkCgjIeeZRP/f81KIdGnCyabatOkJPQQ5qS0cZVRpQaXq8Zsxk+aDmYc2kZwWA3xc=" - secure: "Tv1OUgeQDBPwnL5GsEBiKjr1HdMrvsedk5I6ckbpBa6S1dKCzirOJRRHr9ZP4/TiZYEBd84nQZ5fKTIrCxU18CQzrs/gsS2hHyN+Nr8cpWpa6IovKOpMKxCYryLJFpX69cihcOVzp1xQq+a7sZq/yhZJmKaUBFlZchyPtJ1ysmg=" - secure: "iYz1GPvgcYpue6CKaW/O8iEolwC0UFztsZWzJZyrpZGrsw0fZbqpcn9ACEc+LQKYmvTo3hdBj9ewZB4+Bj4VMVIjgTlYsP0rYESsPd7njgpll+WfslRd5WNJLioUiPeb29yC4woiGa+/YHy2ACJI+ix7F6NyHk+2ri0MCOa4BnQ=" - secure: "Xwco3s7JM7hsAuDrAKuaYBjMccNTKWCXsoE48kQsKGlBM/iQ849nGTmImIKvdh0tZG5LDXgc04rbldhnpvMfWmty0hrQZuwjPaHBqHQ7zWXeNl3/CpAIGTBsefO7hTRoT2+xw1I6f4n8a5U7FICaGmWkR/MvykPOJyR+ms/hOQM=" - secure: "lNW2JDlel5MC9kwRu9lvNPWdlkbhAmkLo/YovVsrKyXPZfETWZO6IU2dDfKQvetIB2zQQnplbozdyiRBMywBnAk27FqLRAjbBqlKTC1jPlU4W29SBCMf+kJlVcQHvh0feeJChBZrVb2GQIAiHEkloDFX03E7RhOPAE5GqzvYow0=" - secure: "ZCfE5sS+70M4MVDOxVMlYcge7LewYbHIm0DE7QFfkwJ9sobaVr+uQMWe+9bA3DhxhdvQQ9p6lGE36ST+WYWopO7SHW6Ly+WvH1kM1nOZfY4w5R+BlAJ9QPcudnPUuFMOBXM0Wm8XccPuld2D5Jg7SalmS1F6mdArXsuL55CXxco=" - secure: "G4MDFYa3BbzqUGMfrABOjEjIa/pXHR8/jgOIQxY3FK2/0bYr//2YU/bw1gJBPQc8Ef243LzhTKvfFhntTecSfH2pS0Ezm2HWwtaF+lBg/A5bYCJX5Tek6HAOv1+aajTRZAjjj4X28T0NCqJI6u1WvbHwYFmW8wsfZtYZKB8JFuo=" - secure: "Py01+IBxGWKG7lyV10bZPYnqvLxNNBE+L6i1hvvvQmx078LfKtVr3tdDSZJVjf3H+gMXW0qnEhBYWJlzKPO5zCMhX314s43yxW3a5N+QZ74ucCO0Yvc4JXA8y7+g4lgsihJmzLSGQZziT+xnn0Q4iNpB8G0kXcl7zVT/ZsLFooQ=" - secure: "lkkLCzuHhR1Z3zzV/8me/PbzMConA8kdxUQ6mQb4VZE8h3wsRDh9P8yKciluV/ZVgqZtLG8VbVnLHgVzzu2zDTqf1t/Gsb5u8Rq5w/sTZyqMpB9qpRjHmq+uPds+ScvAplyoPH4oskXS8xQ8G1ykJwPBbRETyZzAU2/JoOgWiOs=" - secure: "KQlczojVt3jfMtsnl1GFiKsCxkPOaIr95MxopGYqqOVxzRDeNvtJcA/xQU1ouibJlx9B/EHZx0K+/DIk6dyr+irAVzgPGdT5pRxmjSREONPDaGEj9f4D6GWS3AtUJW2AqTMdtI3+d6o7oaYFGGXTCeW+qFMcsxEpn3eT1HMJs1A=" - secure: "XeqXuqqHPAW6/5WukY8y3n1PmaP7ASuNvMTd/Xv3sXzcci11ZKWNEOQDxZeRUwuEot4v2WG+m4HuvIqGWbz6mi8+4OaWUynLRitlGWj7JBu1igN9awmOw+HOcM32v2UcxUdsUSB5AdEOs7hafjodbshxrWQbo05ruk6Au4+jrd4=" - secure: "Ej8RRGUT95llMPDUtbx/lF7D9bKGxTCGdKZbTKFdIPjUzTJgE0pm89vIxKvq7y//oMCposX5DjcVolF+dS2Ya2031MTUto3mUwFq+sx3t2knWt812mQ6p2Ow/l6/uOlr2FHxUJKOxPeWqLRB6NYd9YnUiC3OJNlERr8nyHkCx4c=" - secure: "JsOTX5JsRAY3zyKa/5yYkd48Nejt9CAEraXVpN1NDW25jJmsOynyW5d2WYazJ1H0x1oR6Fhc4gstNxaj1MNh/gVM9O3UM2tyFnSxDY6fZnEGWaf17ln4dqi3KHXWU7h2Gdg1ah19NS0nWytooW6VcEXmk+cYSheTqyfc5gK7Sdo=" - secure: "mMc9MyopIjvzpDg3eN6owSmr2PI58JiPnlLhMNvOWW9axUzup5tthfqM+tvR/AqdLQSSMUC9JXwwQK0d543Q4YyoQ0jwVY2RT56VdEywxD5+yWRfXD+ANlJhdQWmlPVc3KsavKYmfQPBLbwe0nyhtQTWGeAgKTYvYT+k1/PD4rg=" - secure: "X7KDSiSOR3XcePJgTXNzwE1wU285yFsxB7crMLskD08wU8xdRqS8NL+1++/Lju6pypOkospI2AYH1JAJ7JK3Sx5QYM4MxgRJcrMHiTMirN3cm3KzkWUuv3iEZNJ7q6ANi5oFfHh3k0D4JhCEnA1ICTDPdq+r9+mOvgkrly8V0Dw=" # scan.coverity token - secure: "CGHkiv3Aki3HF2xiNPbPEqB66Xcz8HrdhSpFYjQFqHsrseIXOmZGLaIdnkwCqoIHUMFVtqGVGSxRhhrSOrAq+uOgc6Wyst8u6ThN3HhRbvQgF2v7XvtGsTiAObxLvj5V91gqQwHxWPHf948Cm12QQgmEd+dbhyjPWsmVMDb4gNk=" addons: coverity_scan: project: name: "openscad/openscad" description: "The Programmers Solid 3D CAD Modeller" notification_email: dev@openscad.org build_command_prepend: qmake CONFIG-=debug CONFIG+=experimental CONFIG+=snapshot build_command: make branch_pattern: coverity_scan openscad-2019.05/.uncrustify.cfg0000644000076500000240000000374013402025764017060 0ustar kintelstaff00000000000000# # OpenSCAD uncrustify C++ config # # # General indentation strategy # input_tab_size=2 output_tab_size=2 indent_with_tabs=0 indent_columns=output_tab_size indent_class=true indent_namespace=false indent_extern=false indent_align_assign=false # # Alignment # align_right_cmt_span=0 # # Code modification # mod_remove_extra_semicolon=true mod_add_long_ifdef_endif_comment=10 mod_add_long_namespace_closebrace_comment=30 # # Newline management # nl_func_leave_one_liners=true nl_class_brace=force nl_create_if_one_liner=true nl_if_brace=remove nl_brace_else=force nl_elseif_brace=remove nl_else_brace=remove nl_else_if=remove nl_for_brace=remove nl_while_brace=remove nl_do_brace=remove nl_brace_while=remove nl_switch_brace=remove nl_create_while_one_liner=false nl_brace_catch=force # # Spacing rules # sp_before_semi_for=remove sp_after_semi_for=force sp_paren_brace=force sp_before_sparen=force sp_inside_sparen=remove sp_inside_paren=remove sp_inside_fparens=remove sp_inside_fparen=remove sp_before_byref=force sp_before_unnamed_byref=ignore sp_before_byref_func=force sp_after_byref=remove sp_after_byref_func=remove sp_before_ptr_star=force sp_before_unnamed_ptr_star=ignore sp_before_ptr_star_func=force sp_after_ptr_star=remove sp_after_ptr_star_func=remove sp_after_ptr_star_qualifier=remove sp_between_ptr_star=remove sp_ptr_star_paren=remove sp_arith=force sp_assign=force sp_compare=force sp_after_comma=add sp_before_comma=remove sp_template_angle=force sp_before_angle=remove sp_inside_angle=remove sp_after_angle=force sp_angle_paren=remove sp_angle_paren_empty=remove sp_angle_word=force sp_angle_shift=remove sp_permit_cpp11_shift=true sp_after_operator=remove sp_after_operator_sym=remove sp_after_operator_sym_empty=remove sp_func_proto_paren=remove sp_func_def_paren=remove sp_func_call_paren=remove sp_else_brace=force sp_brace_else=force sp_before_case_colon=remove sp_before_class_colon=force sp_after_class_colon=force sp_before_constr_colon=force sp_after_constr_colon=force openscad-2019.05/CMakeLists.txt0000644000076500000240000005401613452415427016654 0ustar kintelstaff00000000000000# # CMake build system for OpenSCAD # # Configuration variables # -DHEADLESS= # -DNULLGL= # -DSNAPSHOT= # -DEXPERIMENTAL= # # TODO # find packages for spnav, hidapi if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) endif() cmake_minimum_required(VERSION 3.3) # CMP0071 introduced in 3.10.2 if (CMAKE_VERSION VERSION_GREATER "3.10.1") cmake_policy(SET CMP0071 OLD) endif() project(openscad) option(EXPERIMENTAL "Enable Experimental Features" OFF) option(SNAPSHOT "Create dev snapshot, uses nightly icons" OFF) option(HEADLESS "Build without GUI frontend" OFF) option(NULLGL "Build without OpenGL, (implies HEADLESS=ON) " OFF) option(IDPREFIX "Prefix CSG nodes with index # (debugging purposes only, will break node cache)" OFF) if (NULLGL) set(HEADLESS ON) endif() if(EXPERIMENTAL) add_definitions(-DENABLE_EXPERIMENTAL) endif() if(IDPREFIX) add_definitions(-DIDPREFIX) endif() set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/objects") set(AUTOGEN_BUILD_DIR "${CMAKE_SOURCE_DIR}/objects") file(MAKE_DIRECTORY ${AUTOGEN_BUILD_DIR}) # Default to Release build #if(NOT CMAKE_BUILD_TYPE) # message(STATUS "CMAKE_BUILD_TYPE not specified. Defaulting to 'Release'") # message(STATUS "Usage: cmake -DCMAKE_BUILD_TYPE=[Debug|Release|RelWithDebInfo|MinSizeRel] .") # set(CMAKE_BUILD_TYPE Release) #else() # message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") #endif() add_compile_options("$<$:-DDEBUG>") # Use same optimization as qmake build string(REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) set(CMAKE_CXX_STANDARD 11) add_definitions(-D_REENTRANT -DUNICODE -D_UNICODE) # Stack size 8MB; github issue 116 add_definitions(-DSTACKSIZE=8388608) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frounding-math") if (WIN32) # gcc bug spams warnings, See issue #2771 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes") endif() endif() set(BOOST_DIRECTLY_REQUIRED_LIBRARIES filesystem system thread regex program_options) find_package(PkgConfig) macro(find_graphics) # NULLGL - Allow us to build without OpenGL(TM). run 'cmake .. -DNULLGL=1' # Most tests will fail, but it can be used for testing/experiments if(NULLGL) add_definitions(-DNULLGL) else() find_package(OpenGL REQUIRED QUIET) list(APPEND COMMON_LIBRARIES ${OPENGL_LIBRARIES}) if(MSVC) find_package(GLEW CONFIG REQUIRED QUIET) message(STATUS "GLEW: Using target GLEW::GLEW") list(APPEND COMMON_LIBRARIES GLEW::GLEW) find_path(OPENCSG_INCLUDE_DIRS opencsg/opencsg.h) include_directories("${OPENCSG_INCLUDE_DIRS}/opencsg") else() find_package(GLEW REQUIRED) message(STATUS "GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}") message(STATUS "GLEW_LIBRARY: ${GLEW_LIBRARY}") include_directories("${GLEW_INCLUDE_DIR}") list(APPEND COMMON_LIBRARIES ${GLEW_LIBRARY}) find_path(OPENCSG_INCLUDE_DIRS opencsg.h) include_directories("${OPENCSG_INCLUDE_DIRS}") endif() find_library(OPENCSG_LIBRARY opencsg) list(APPEND COMMON_LIBRARIES ${OPENCSG_LIBRARY}) message(STATUS "OpenCSG: ${OPENCSG_VERSION_STRING}") add_definitions(-DENABLE_OPENCSG) endif() endmacro(find_graphics) # NOTE FindCGAL.cmake resets the BOOST_* and Boost_* variables, # because it looks for Boost itself, so it has to be called # before we look for our own required boost libraries. find_package(CGAL REQUIRED) message(STATUS "CGAL: ${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}") add_definitions(-DENABLE_CGAL) if(TARGET CGAL::CGAL) list(APPEND COMMON_LIBRARIES CGAL::CGAL) message(STATUS "CGAL: Using target CGAL::CGAL") else() list(APPEND COMMON_LIBRARIES ${CGAL_LIBRARY}) list(APPEND COMMON_LIBRARIES ${GMP_LIBRARIES}) list(APPEND COMMON_LIBRARIES ${MPFR_LIBRARIES}) endif() # revert any changes to module path from CGAL_Macros.cmake if (CGAL_MODULE_PATH_IS_SET) set(CMAKE_MODULE_PATH ORIGINAL_CMAKE_MODULE_PATH) endif() if (MSVC) # Flex lexer options set(WINCOMPAT "--wincompat --nounistd") add_definitions(-D_USE_MATH_DEFINES) message("COMMON_LIBRARIES ${COMMON_LIBRARIES}") find_package(Eigen3 CONFIG REQUIRED) list(APPEND COMMON_LIBRARIES Eigen3::Eigen) set(Boost_USE_STATIC_LIBS TRUE) find_package(Boost 1.36 REQUIRED COMPONENTS ${BOOST_DIRECTLY_REQUIRED_LIBRARIES} QUIET) message(STATUS "Boost: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") message("BOOST DIRS ${Boost_INCLUDE_DIRS}") include_directories(${Boost_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES ${Boost_LIBRARIES}) # Check if boost dependency libraries have been found too list(LENGTH BOOST_DIRECTLY_REQUIRED_LIBRARIES BOOST_DIRECTLY_REQUIRED_LIBRARIES_LENGTH) list(LENGTH Boost_LIBRARIES Boost_LIBRARIES_LENGTH) if(Boost_LIBRARIES_LENGTH EQUAL BOOST_DIRECTLY_REQUIRED_LIBRARIES_LENGTH) message(FATAL_ERROR "No dependent Boost libraries found. Your CMake (${CMAKE_VERSION}) version might be too old for the version of boost you are using (${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}). In that case, you should have received warnings above of the type: 'Imported targets not available for Boost version ${Boost_VERSION}'") endif() find_package(harfbuzz CONFIG REQUIRED) find_path(HARFBUZZ_INCLUDE_DIRS harfbuzz) include_directories(${HARFBUZZ_INCLUDE_DIRS}/harfbuzz) list(APPEND COMMON_LIBRARIES harfbuzz::harfbuzz) find_package(unofficial-fontconfig CONFIG REQUIRED) list(APPEND COMMON_LIBRARIES unofficial::fontconfig::fontconfig) find_package(unofficial-glib CONFIG REQUIRED) include_directories(${GLIB2_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES unofficial::glib::gio unofficial::glib::glib unofficial::glib::gmodule unofficial::glib::gobject) find_package(double-conversion CONFIG REQUIRED) list(APPEND COMMON_LIBRARIES double-conversion::double-conversion) find_library(GETTEXT_LIBRARY libintl) list(APPEND COMMON_LIBRARIES ${GETTEXT_LIBRARY}) # call before setting local CMAKE_MODULE_PATH so we use VCPKG version of FindGLEW find_graphics() # needed for Qt5QScintilla, maybe others set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") else() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") set(CMAKE_PREFIX_PATH "$ENV{OPENSCAD_LIBRARIES}") find_package(Eigen3 QUIET) if (NOT Eigen3_FOUND) # Ubuntu Trusty Eigen package installs FindEigen3.cmake but assumes cmake-2.8, not cmake3 # See https://packages.ubuntu.com/trusty/all/libeigen3-dev/filelist list(APPEND CMAKE_MODULE_PATH "/usr/share/cmake-2.8/Modules") find_package(Eigen3 REQUIRED QUIET) list(REMOVE_ITEM CMAKE_MODULE_PATH "/usr/share/cmake-2.8/Modules") endif() if (EIGEN3_VERSION) message(STATUS "Eigen3: ${EIGEN3_VERSION}") else() message(STATUS "Eigen3: ${EIGEN3_VERSION_STRING}") endif() include_directories(${EIGEN3_INCLUDE_DIR}) add_definitions(-DEIGEN_DONT_ALIGN) find_package(Boost 1.36 REQUIRED COMPONENTS ${BOOST_DIRECTLY_REQUIRED_LIBRARIES} QUIET) message(STATUS "Boost: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") include_directories(${Boost_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES ${Boost_LIBRARIES}) # Check if boost dependency libraries have been found too list(LENGTH BOOST_DIRECTLY_REQUIRED_LIBRARIES BOOST_DIRECTLY_REQUIRED_LIBRARIES_LENGTH) list(LENGTH Boost_LIBRARIES Boost_LIBRARIES_LENGTH) if(Boost_LIBRARIES_LENGTH EQUAL BOOST_DIRECTLY_REQUIRED_LIBRARIES_LENGTH) message(FATAL_ERROR "No dependent Boost libraries found. Your CMake (${CMAKE_VERSION}) version might be too old for the version of boost you are using (${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}). In that case, you should have received warnings above of the type: 'Imported targets not available for Boost version ${Boost_VERSION}'") endif() find_package(HarfBuzz 0.9.19 REQUIRED QUIET) message(STATUS "Harfbuzz: ${HARFBUZZ_VERSION}") include_directories(${HARFBUZZ_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES ${HARFBUZZ_LIBRARIES}) find_package(FontConfig 2.8.0 REQUIRED QUIET) message(STATUS "Fontconfig: ${FONTCONFIG_VERSION}") list(APPEND COMMON_LIBRARIES ${FONTCONFIG_LIBRARIES}) find_package(GLIB2 2.26 REQUIRED QUIET) message(STATUS "Glib: ${GLIB2_VERSION}") include_directories(${GLIB2_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES ${GLIB2_LIBRARIES}) list(APPEND COMMON_LIBRARIES double-conversion) find_graphics() endif() find_package(LibZip REQUIRED QUIET) include_directories(${LIBZIP_INCLUDE_DIR_ZIP}) include_directories(${LIBZIP_INCLUDE_DIR_ZIPCONF}) list(APPEND COMMON_LIBRARIES ${LIBZIP_LIBRARY}) add_definitions(-DENABLE_LIBZIP) find_package(Freetype 2.4.9 REQUIRED QUIET) message(STATUS "Freetype: ${FREETYPE_VERSION_STRING}") include_directories(${FREETYPE_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES ${FREETYPE_LIBRARIES}) find_package(LibXml2 2.9 REQUIRED QUIET) message(STATUS "LibXml2: ${LIBXML2_VERSION_STRING}") include_directories(${LIBXML2_INCLUDE_DIR}) list(APPEND COMMON_LIBRARIES ${LIBXML2_LIBRARIES}) find_package(FLEX REQUIRED QUIET) message(STATUS "Flex: ${FLEX_VERSION}") find_package(BISON REQUIRED QUIET) message(STATUS "Bison: ${BISON_VERSION}") if(NOT MSVC) find_package(Lib3MF REQUIRED QUIET) add_definitions(${LIB3MF_CFLAGS}) include_directories(${LIB3MF_INCLUDE_DIRS}) list(APPEND COMMON_LIBRARIES ${LIB3MF_LIBRARIES}) endif() # Output compilation database (compile_commands.json), so we can e.g. run clang-tidy or other tools separately set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") # Use clang-tidy if run with -DCLANG_TIDY=1 find_program(CLANG_TIDY_EXE NAMES clang-tidy) set(CLANG_TIDY ${CLANG_TIDY} CACHE BOOL "Enable clang-tidy") if(CLANG_TIDY AND CLANG_TIDY_EXE) include(RegexUtils) escape_string_as_regex(regex "${CMAKE_SOURCE_DIR}/src") set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-header-filter=${regex}") endif() set(CMAKE_INCLUDE_CURRENT_DIR ON) include_directories(src) FLEX_TARGET(openscad_lexer src/lexer.l ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lexer.cxx DEFINES_FILE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lexer.hxx COMPILE_FLAGS ${WINCOMPAT}) BISON_TARGET(openscad_parser src/parser.y ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/parser.cxx DEFINES_FILE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/parser.hxx COMPILE_FLAGS "-d -p parser") ADD_FLEX_BISON_DEPENDENCY(openscad_lexer openscad_parser) FLEX_TARGET(comment_lexer src/comment_lexer.l ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/comment_lexer.cxx DEFINES_FILE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/comment_lexer.hxx COMPILE_FLAGS ${WINCOMPAT}) BISON_TARGET(comment_parser src/comment_parser.y ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/comment_parser.cxx DEFINES_FILE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/comment_parser.hxx COMPILE_FLAGS "-d -p comment_parser") ADD_FLEX_BISON_DEPENDENCY(comment_lexer comment_parser) if(NOT HEADLESS) if (APPLE AND EXISTS /usr/local/opt/qt) list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/qt") endif() set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) find_package(Qt5 COMPONENTS Core Widgets Multimedia OpenGL Concurrent Network REQUIRED QUIET) message(STATUS "Qt5: ${Qt5_VERSION}") set(CMAKE_INCLUDE_CURRENT_DIR ON) if (Qt5_POSITION_INDEPENDENT_CODE) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() if (("${Qt5_VERSION}" VERSION_EQUAL "5.4") OR ("${Qt5_VERSION}" VERSION_GREATER "5.4")) add_definitions(-DUSE_QOPENGLWIDGET) endif() find_package(Qt5QScintilla 2.8.0 REQUIRED QUIET) message(STATUS "QScintilla: ${QT5QSCINTILLA_VERSION_STRING}") add_definitions(-DUSE_SCINTILLA_EDITOR) add_definitions(-DENABLE_MDI) find_package(Qt5DBus QUIET) if (Qt5DBus_FOUND) message(STATUS "DBus input driver enabled") add_definitions(-DENABLE_DBUS) set(INPUT_DRIVER_DBUS_SOURCES src/input/DBusInputDriver.cc) qt5_add_dbus_interface(INPUT_DRIVER_DBUS_SOURCES org.openscad.OpenSCAD.xml openscad_interface) qt5_add_dbus_adaptor(INPUT_DRIVER_DBUS_SOURCES org.openscad.OpenSCAD.xml input/DBusInputDriver.h DBusInputDriver openscad_adaptor) else() message(STATUS "DBus input driver disabled as the QtDBus module could not be found.") endif() find_package(Qt5Gamepad QUIET) if (Qt5Gamepad_FOUND) message(STATUS "Gamepad input driver enabled") set(GUI_SOURCES ${GUI_SOURCES} src/input/QGamepadInputDriver.cc) add_definitions(-DENABLE_QGAMEPAD) else() message(STATUS "Gamepad input driver disabled as the Qt5Gamepad module could not be found.") endif() # add_definitions(${Qt5Widgets_DEFINITIONS}) # add_definitions(${Qt5OpenGL_DEFINITIONS}) # add_definitions(${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}) # add_definitions(${Qt5OpenGL_EXECUTABLE_COMPILE_FLAGS}) endif() # Setup ccache (if available) to speed up recompiles. It's especially useful # when switching back and forth between branches where large numbers of files # would otherwise need to be re-compiled each time. find_program(CCACHE_PATH ccache) if (CCACHE_PATH) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PATH}) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_PATH}) endif() # # Version # string(TIMESTAMP VERSION "%Y.%m.%d") string(REPLACE "-" ";" SPLITVERSION ${VERSION}) list(GET SPLITVERSION 0 OPENSCAD_SHORTVERSION) string(REGEX MATCHALL "^[0-9]+|[0-9]+|[0-9]+$" VERSIONLIST "${OPENSCAD_SHORTVERSION}") list(GET VERSIONLIST 0 OPENSCAD_YEAR) list(GET VERSIONLIST 1 OPENSCAD_MONTH) math(EXPR OPENSCAD_MONTH ${OPENSCAD_MONTH}) # get rid of leading zero list(LENGTH VERSIONLIST VERSIONLEN) if (${VERSIONLEN} EQUAL 3) list(GET VERSIONLIST 2 OPENSCAD_DAY) math(EXPR OPENSCAD_DAY ${OPENSCAD_DAY}) # get rid of leading zero endif() add_definitions(-DOPENSCAD_VERSION=${VERSION} -DOPENSCAD_SHORTVERSION=${OPENSCAD_SHORTVERSION} -DOPENSCAD_YEAR=${OPENSCAD_YEAR} -DOPENSCAD_MONTH=${OPENSCAD_MONTH}) if (DEFINED OPENSCAD_DAY) add_definitions(-DOPENSCAD_DAY=${OPENSCAD_DAY}) endif() if(DEFINED OPENSCAD_COMMIT) add_definitions(-DOPENSCAD_COMMIT=${OPENSCAD_COMMIT}) endif() # # Platform specific settings # if(APPLE) message(STATUS "Offscreen OpenGL Context - using Apple CGL") set(PLATFORM_SOURCES src/PlatformUtils-mac.mm src/imageutils-macosx.cc src/CocoaUtils.mm) if(NOT HEADLESS) set(PLATFORM_SOURCES ${PLATFORM_SOURCES} src/AppleEvents.cc) endif() if(NULLGL) add_definitions(-DOPENSCAD_OS="Mac OS X") else() set(PLATFORM_SOURCES ${PLATFORM_SOURCES} src/OffscreenContextCGL.mm) endif() find_library(COCOA_LIBRARY Cocoa) set(PLATFORM_LIBS ${COCOA_LIBRARY}) elseif(UNIX) message(STATUS "Offscreen OpenGL Context - using Unix GLX on X11") set(PLATFORM_SOURCES src/imageutils-lodepng.cc src/PlatformUtils-posix.cc) if(NULLGL) add_definitions(-DOPENSCAD_OS="Unix") else() set(PLATFORM_SOURCES ${PLATFORM_SOURCES} src/OffscreenContextGLX.cc) find_library(X11_LIBRARY X11) set(PLATFORM_LIBS ${X11_LIBRARY}) endif() elseif(WIN32) add_definitions(-DNOGDI) message(STATUS "Offscreen OpenGL Context - using Microsoft WGL") set(PLATFORM_SOURCES src/imageutils-lodepng.cc src/PlatformUtils-win.cc) if(NULLGL) add_definitions(-DOPENSCAD_OS="Windows") else() set(PLATFORM_SOURCES ${PLATFORM_SOURCES} src/OffscreenContextWGL.cc) endif() endif() set(CORE_SOURCES src/parsersettings.cc src/linalg.cc src/colormap.cc src/Camera.cc src/handle_dep.cc src/value.cc src/calc.cc src/hash.cc src/expr.cc src/degree_trig.cc src/func.cc src/function.cc src/stackcheck.h src/localscope.cc src/module.cc src/FileModule.cc src/UserModule.cc src/GroupModule.cc src/AST.cc src/ModuleInstantiation.cc src/ModuleCache.cc src/StatCache.cc src/node.cc src/NodeVisitor.cc src/context.cc src/builtincontext.cc src/modcontext.cc src/evalcontext.cc src/version.cc src/feature.cc src/csgnode.cc src/CSGTreeNormalizer.cc src/Geometry.cc src/Polygon2d.cc src/csgops.cc src/transform.cc src/color.cc src/primitives.cc src/projection.cc src/cgaladv.cc src/surface.cc src/control.cc src/render.cc src/rendersettings.cc src/dxfdata.cc src/dxfdim.cc src/offset.cc src/linearextrude.cc src/rotateextrude.cc src/text.cc src/printutils.cc src/fileutils.cc src/progress.cc src/boost-utils.cc src/FontCache.cc src/DrawingCallback.cc src/FreetypeRenderer.cc src/ext/lodepng/lodepng.cpp src/PlatformUtils.cc src/libsvg/circle.cc src/libsvg/ellipse.cc src/libsvg/group.cc src/libsvg/libsvg.cc src/libsvg/line.cc src/libsvg/text.cc src/libsvg/tspan.cc src/libsvg/data.cc src/libsvg/path.cc src/libsvg/polygon.cc src/libsvg/polyline.cc src/libsvg/rect.cc src/libsvg/shape.cc src/libsvg/svgpage.cc src/libsvg/transformation.cc src/libsvg/util.cc src/clipper-utils.cc src/Assignment.cc src/annotation.cc src/ext/polyclipping/clipper.cpp ${PLATFORM_SOURCES} ${FLEX_openscad_lexer_OUTPUTS} ${BISON_openscad_parser_OUTPUTS} ${FLEX_comment_lexer_OUTPUTS} ${BISON_comment_parser_OUTPUTS}) set(NOCGAL_SOURCES src/builtin.cc src/import.cc src/import_3mf.cc src/import_stl.cc src/import_amf.cc src/import_off.cc src/import_svg.cc src/export.cc src/export_3mf.cc src/export_stl.cc src/export_amf.cc src/export_off.cc src/export_dxf.cc src/export_svg.cc src/LibraryInfo.cc src/polyset.cc src/polyset-gl.cc src/polyset-utils.cc src/GeometryUtils.cc) set(CGAL_SOURCES ${NOCGAL_SOURCES} src/CSGTreeEvaluator.cc src/CGAL_Nef_polyhedron.cc src/export_nef.cc src/import_nef.cc src/cgalutils.cc src/cgalutils-applyops.cc src/cgalutils-project.cc src/cgalutils-tess.cc src/cgalutils-polyhedron.cc src/CGALCache.cc src/Polygon2d-CGAL.cc src/svg.cc src/GeometryEvaluator.cc) include_directories("src/ext/libtess2/Include") set(COMMON_SOURCES src/nodedumper.cc src/GeometryCache.cc src/clipper-utils.cc src/Tree.cc src/comment.cpp src/parameter/parameterset.cpp src/ext/polyclipping/clipper.cpp src/ext/libtess2/Source/bucketalloc.c src/ext/libtess2/Source/dict.c src/ext/libtess2/Source/geom.c src/ext/libtess2/Source/mesh.c src/ext/libtess2/Source/priorityq.c src/ext/libtess2/Source/sweep.c src/ext/libtess2/Source/tess.c src/Tree.cc) # # Offscreen OpenGL context source code # if(NULLGL) message(STATUS "NULLGL is set. Overriding OpenGL(TM) settings") set(OFFSCREEN_SOURCES src/NULLGL.cc # contains several 'nullified' versions of above .cc files src/OffscreenView.cc src/OffscreenContextNULL.cc src/export_png.cc src/${OFFSCREEN_IMGUTILS_SOURCE} src/imageutils.cc src/renderer.cc src/render.cc) else() set(OFFSCREEN_SOURCES src/GLView.cc src/OffscreenView.cc src/imageutils.cc src/fbo.cc src/system-gl.cc src/export_png.cc src/CGALRenderer.cc src/ThrownTogetherRenderer.cc src/renderer.cc src/render.cc src/OpenCSGRenderer.cc) endif() if(UNIX AND (NOT APPLE) AND (NOT HEADLESS)) set(PLATFORM_INPUT_DRIVER_SOURCES src/input/JoystickInputDriver.cc) add_definitions(-DENABLE_JOYSTICK) endif() set(INPUT_DRIVER_SOURCES ${PLATFORM_INPUT_DRIVER_SOURCES} ${INPUT_DRIVER_DBUS_SOURCES}) set(GUI_SOURCES ${GUI_SOURCES} src/mainwin.cc src/OpenSCADApp.cc src/EventFilter.h src/WindowManager.cc src/settings.cc src/Preferences.cc src/SettingsWriter.cc src/FontListDialog.cc src/FontListTableView.cc src/OctoPrint.cc src/PrintInitDialog.cc src/PrintService.cc src/LibraryInfoDialog.cc src/OpenCSGWarningDialog.cc src/ProgressWidget.cc src/AutoUpdater.cc src/QGLView.cc src/Dock.cc src/Console.cc src/UIUtils.cc src/scadlexer.cpp src/highlighter.cc src/cgalworker.cc src/editor.cc src/legacyeditor.cc src/scintillaeditor.cpp src/launchingscreen.cc src/QWordSearchField.cc src/QSettingsCached.cc src/parameter/ParameterWidget.cc src/parameter/groupwidget.cpp src/parameter/ignoreWheelWhenNotFocused.cpp src/parameter/parametercheckbox.cpp src/parameter/parametercombobox.cpp src/parameter/parameterextractor.cpp src/parameter/parameterobject.cpp src/parameter/parameterslider.cpp src/parameter/parameterspinbox.cpp src/parameter/parametertext.cpp src/parameter/parametervector.cpp src/parameter/parametervirtualwidget.cpp src/input/AxisConfigWidget.cc src/input/ButtonConfigWidget.cc src/input/InputDriver.cc src/input/InputDriverManager.cc src/input/InputEventMapper.cc src/input/WheelIgnorer.cc ${INPUT_DRIVER_SOURCES} ) # header-only code set(GUI_HEADERS src/AboutDialog.h src/MainWindow.h src/Network.h src/NetworkSignal.h ) #file(GLOB Headers src/*.h src/*.hpp src/polyclipping/*.hpp) #list(REMOVE_ITEM Headers ${CMAKE_SOURCE_DIR}/src/SparkleAutoUpdater.h) file(GLOB UIs src/*.ui) file(GLOB Resources *.qrc) set(Sources src/openscad.cc ${CORE_SOURCES} ${COMMON_SOURCES} ${CGAL_SOURCES} ${OFFSCREEN_SOURCES} ${Resources}) if(HEADLESS) add_definitions(-DOPENSCAD_NOGUI) else() list(APPEND Sources ${GUI_SOURCES} ${GUI_HEADERS}) endif() if (SNAPSHOT) add_definitions(-DOPENSCAD_SNAPSHOT) set(RESOURCE_FILES icons/icon-nightly.icns) else() set(RESOURCE_FILES icons/OpenSCAD.icns) endif() if(ENABLE_SPNAV) add_definitions(-DENABLE_SPNAV) list(APPEND Sources src/input/SpaceNavInputDriver.cc) endif() add_executable(OpenSCAD ${Sources} ${RESOURCE_FILES}) if(APPLE) set_target_properties(OpenSCAD PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/Info.plist.in MACOSX_BUNDLE TRUE MACOSX_BUNDLE_ICON_FILE OpenSCAD.icns MACOSX_BUNDLE_BUNDLE_VERSION 2017.03 MACOSX_BUNDLE_SHORT_VERSION_STRING 2017.03 RESOURCE "${RESOURCE_FILES}" ) elseif(UNIX) set_target_properties(OpenSCAD PROPERTIES OUTPUT_NAME openscad ) elseif(MSVC) set_target_properties(OpenSCAD PROPERTIES LINK_FLAGS "-subsystem:windows -ENTRY:mainCRTStartup -stack:8388608" ) endif() if(ENABLE_SPNAV) target_link_libraries(OpenSCAD spnav) endif() target_link_libraries(OpenSCAD PRIVATE ${COMMON_LIBRARIES} ${PLATFORM_LIBS}) if(NOT HEADLESS) target_link_libraries(OpenSCAD PRIVATE Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::OpenGL Qt5::Concurrent Qt5::Network ${QT5QSCINTILLA_LIBRARY} ${Qt5DBus_LIBRARIES} ${Qt5Gamepad_LIBRARIES}) endif() if(INFO) include(info) endif() openscad-2019.05/CMakeSettings.json0000644000076500000240000000417713441031431017476 0ustar kintelstaff00000000000000{ "configurations": [ { "name": "x86-Debug", "generator": "Ninja", "configurationType": "Debug", "inheritEnvironments": [ "msvc_x86" ], "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\installDebug\\${name}", "cmakeCommandArgs": "--no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE=${env.VCPKG_PATH}\\scripts\\buildsystems\\vcpkg.cmake -DCMAKE_CXX_FLAGS=\"/we4316 /EHsc\"", "buildCommandArgs": "-v", "ctestCommandArgs": "" }, { "name": "x86-Release", "generator": "Ninja", "configurationType": "Release", "inheritEnvironments": [ "msvc_x86" ], "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\installRelease\\${name}", "cmakeCommandArgs": "--no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE=${env.VCPKG_PATH}\\scripts\\buildsystems\\vcpkg.cmake -DCMAKE_CXX_FLAGS=\"/we4316 /EHsc\"", "buildCommandArgs": "-v", "ctestCommandArgs": "" }, { "name": "x64-Debug", "generator": "Ninja", "configurationType": "Debug", "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", "cmakeCommandArgs": "--no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE=${env.VCPKG_PATH}\\scripts\\buildsystems\\vcpkg.cmake -DCMAKE_CXX_FLAGS=\"/we4316 /EHsc\"", "buildCommandArgs": "-v", "ctestCommandArgs": "" }, { "name": "x64-Release", "generator": "Ninja", "configurationType": "Release", "inheritEnvironments": [ "msvc_x64_x64" ], "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", "cmakeCommandArgs": "--no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE=${env.VCPKG_PATH}\\scripts\\buildsystems\\vcpkg.cmake -DCMAKE_CXX_FLAGS=\"/we4316 /EHsc\"", "buildCommandArgs": "-v", "ctestCommandArgs": "" } ] }openscad-2019.05/COPYING0000644000076500000240000004371613402025764015150 0ustar kintelstaff00000000000000 ********************************************************************* As a special exception, you have permission to link this program with the CGAL library and distribute executables, as long as you follow the requirements of the GNU GPL in regard to all of the software in the executable aside from CGAL. ********************************************************************* GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. openscad-2019.05/Info.plist0000644000076500000240000000546413423115164016060 0ustar kintelstaff00000000000000 CFBundleName OpenSCAD CFBundleIconFile @ICON@ CFBundlePackageType APPL CFBundleSignature ???? CFBundleExecutable OpenSCAD CFBundleIdentifier org.openscad.OpenSCAD CFBundleVersion @SHORT_VERSION@ CFBundleShortVersionString @SHORT_VERSION@ LSEnvironment GUI_LAUNCHED CFBundleDocumentTypes CFBundleTypeExtensions scad CFBundleTypeMIMETypes text/plain CFBundleTypeName OpenSCAD Design CFBundleTypeRole Editor CFBundleTypeIconFile SCAD.icns LSIsAppleDefaultForType CFBundleTypeExtensions stl CFBundleTypeName STL 3D file CFBundleTypeRole Viewer CFBundleTypeExtensions off CFBundleTypeName OFF 3D file CFBundleTypeRole Viewer CFBundleTypeExtensions dxf CFBundleTypeName DXF file CFBundleTypeRole Viewer CFBundleTypeExtensions svg CFBundleTypeName SVG file CFBundleTypeRole Viewer CFBundleTypeExtensions amf CFBundleTypeName AMF file CFBundleTypeRole Viewer CFBundleTypeExtensions 3mf CFBundleTypeName 3MF file CFBundleTypeRole Viewer NSAppleScriptEnabled NSPrincipalClass NSApplication OSAScriptingDefinition OpenSCAD.sdef SUPublicDSAKeyFile dsa_pub.pem SUFeedURL https://files.openscad.org/appcast.xml openscad-2019.05/Info.plist.in0000644000076500000240000000522613423115164016461 0ustar kintelstaff00000000000000 CFBundleName OpenSCAD CFBundleIconFile ${MACOSX_BUNDLE_ICON_FILE} CFBundlePackageType APPL CFBundleSignature ???? CFBundleExecutable OpenSCAD CFBundleIdentifier org.openscad.OpenSCAD CFBundleVersion ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleShortVersionString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} LSEnvironment GUI_LAUNCHED CFBundleDocumentTypes CFBundleTypeExtensions scad CFBundleTypeMIMETypes text/plain CFBundleTypeName OpenSCAD Design CFBundleTypeRole Editor CFBundleTypeIconFile SCAD.icns LSIsAppleDefaultForType CFBundleTypeExtensions stl CFBundleTypeName STL 3D file CFBundleTypeRole Viewer CFBundleTypeExtensions off CFBundleTypeName OFF 3D file CFBundleTypeRole Viewer CFBundleTypeExtensions dxf CFBundleTypeName DXF file CFBundleTypeRole Viewer CFBundleTypeExtensions svg CFBundleTypeName SVG file CFBundleTypeRole Viewer CFBundleTypeExtensions amf CFBundleTypeName AMF file CFBundleTypeRole Viewer NSAppleScriptEnabled NSPrincipalClass NSApplication OSAScriptingDefinition OpenSCAD.sdef SUPublicDSAKeyFile dsa_pub.pem SUFeedURL https://files.openscad.org/appcast.xml openscad-2019.05/OpenSCAD.sdef0000644000076500000240000000057213402025764016305 0ustar kintelstaff00000000000000 openscad-2019.05/README.md0000644000076500000240000002566413461460312015373 0ustar kintelstaff00000000000000[![Travis (master)](https://img.shields.io/travis/openscad/openscad/master.svg?logo=travis&logoColor=black&colorA=f9d72c&style=plastic)](https://travis-ci.org/openscad/openscad/) [![AppVeyor (master)](https://img.shields.io/appveyor/ci/kintel/openscad/master.svg?logo=appveyor&logoColor=black&colorA=f9d72c&style=plastic)](https://ci.appveyor.com/project/kintel/openscad) [![CircleCI (master)](https://img.shields.io/circleci/project/github/openscad/openscad/master.svg?logo=circleci&logoColor=black&colorA=f9d72c&style=plastic)](https://circleci.com/gh/openscad/openscad/tree/master) [![Coverity Scan](https://img.shields.io/coverity/scan/2510.svg?colorA=f9d72c&logoColor=black&style=plastic)](https://scan.coverity.com/projects/2510) [![Visit our IRC channel](https://kiwiirc.com/buttons/irc.freenode.net/openscad.png)](https://kiwiirc.com/client/irc.freenode.net/#openscad) # What is OpenSCAD? [![Flattr this git repo](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=openscad&url=http://openscad.org&title=OpenSCAD&language=&tags=github&category=software) OpenSCAD is a software for creating solid 3D CAD objects. It is free software and available for Linux/UNIX, MS Windows and Mac OS X. Unlike most free software for creating 3D models (such as the famous application Blender), OpenSCAD focuses on the CAD aspects rather than the artistic aspects of 3D modeling. Thus this might be the application you are looking for when you are planning to create 3D models of machine parts but probably not the tool for creating computer-animated movies. OpenSCAD is not an interactive modeler. Instead it is more like a 3D-compiler that reads a script file that describes the object and renders the 3D model from this script file (see examples below). This gives you, the designer, complete control over the modeling process and enables you to easily change any step in the modeling process or make designs that are defined by configurable parameters. OpenSCAD provides two main modeling techniques: First there is constructive solid geometry (aka CSG) and second there is extrusion of 2D outlines. As the data exchange format for these 2D outlines Autocad DXF files are used. In addition to 2D paths for extrusion it is also possible to read design parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D models in the STL and OFF file formats. # Contents - [Getting Started](#getting-started) - [Documentation](#documentation) - [Building OpenSCAD](#building-openscad) - [Prerequisites](#prerequisites) - [Getting the source code](#getting-the-source-code) - [Building for Mac OS X](#building-for-mac-os-x) - [Building for Linux/BSD](#building-for-linuxbsd) - [Building for Linux/BSD on systems with older or missing dependencies](#building-for-linuxbsd-on-systems-with-older-or-missing-dependencies) - [Building for Windows](#building-for-windows) - [Compilation](#compilation) # Getting started You can download the latest binaries of OpenSCAD at . Install binaries as you would any other software. When you open OpenSCAD, you'll see three frames within the window. The left frame is where you'll write code to model 3D objects. The right frame is where you'll see the 3D rendering of your model. Let's make a tree! Type the following code into the left frame: cylinder(h = 30, r = 8); Then render the 3D model by hitting F5. Now you can see a cylinder for the trunk in our tree. Now let's add the bushy/leafy part of the tree represented by a sphere. To do so, we will union a cylinder and a sphere. union() { cylinder(h = 30, r = 8); sphere(20); } But, it's not quite right! The bushy/leafy are around the base of the tree. We need to move the sphere up the z-axis. union() { cylinder(h = 30, r = 8); translate([0, 0, 40]) sphere(20); } And that's it! You made your first 3D model! There are other primitive shapes that you can combine with other set operations (union, intersection, difference) and transformations (rotate, scale, translate) to make complex models! Check out all the other language features in the [OpenSCAD Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual). # Documentation Have a look at the OpenSCAD Homepage (https://www.openscad.org/documentation.html) for documentation. ## Building OpenSCAD To build OpenSCAD from source, follow the instructions for the platform applicable to you below. ### Prerequisites To build OpenSCAD, you need some libraries and tools. The version numbers in brackets specify the versions which have been used for development. Other versions may or may not work as well. If you're using a newer version of Ubuntu, you can install these libraries from aptitude. If you're using Mac, or an older Linux/BSD, there are build scripts that download and compile the libraries from source. Follow the instructions for the platform you're compiling on below. * A C++ compiler supporting C++11 * [Qt (4.4 -> 5.x)](https://qt.io/) * [QScintilla2 (2.7 ->)](https://riverbankcomputing.com/software/qscintilla/) * [CGAL (3.6 ->)](https://www.cgal.org/) * [GMP (5.x)](https://gmplib.org/) * [MPFR (3.x)](https://www.mpfr.org/) * [cmake (2.8 ->, required by CGAL and the test framework)](https://cmake.org/) * [boost (1.35 ->)](https://www.boost.org/) * [OpenCSG (1.3.2 ->)](http://www.opencsg.org/) * [GLEW (1.5.4 ->)](http://glew.sourceforge.net/) * [Eigen (3.x)](https://eigen.tuxfamily.org/) * [glib2 (2.x)](https://developer.gnome.org/glib/) * [fontconfig (2.10 -> )](https://fontconfig.org/) * [freetype2 (2.4 -> )](https://freetype.org/) * [harfbuzz (0.9.19 -> )](https://www.freedesktop.org/wiki/Software/HarfBuzz/) * [libzip (0.10.1 -> )](https://libzip.org/) * [Bison (2.4 -> )](https://www.gnu.org/software/bison/) * [Flex (2.5.35 -> )](http://flex.sourceforge.net/) * [pkg-config (0.26 -> )](https://www.freedesktop.org/wiki/Software/pkg-config/) * [double-conversion (2.0.1 -> )](https://github.com/google/double-conversion/) ### Getting the source code Install git (https://git-scm.com/) onto your system. Then run a clone: git clone git://github.com/openscad/openscad.git This will download the latest sources into a directory named `openscad`. To pull the MCAD library (https://github.com/openscad/MCAD), do the following: cd openscad git submodule update --init ### Building for Mac OS X Prerequisites: * Xcode * cmake * pkg-config Install Dependencies: After building dependencies using one of the following three options, follow the instructions in the *Compilation* section. 1. **From source** Run the script that sets up the environment variables: source setenv_mac.sh Then run the script to compile all the dependencies: ./scripts/macosx-build-dependencies.sh 1. **Homebrew** (assumes [Homebrew](https://brew.sh/) is already installed) ./scripts/macosx-build-homebrew.sh 1. **MacPorts** (assumes [MacPorts](https://www.macports.org/) is already installed) For the adventurous, it might be possible to build OpenSCAD using _MacPorts_. The main challenge is that MacPorts have partially broken libraries, but that tends to change from time to time. NB! MacPorts currently doesn't support Qt5 very well, so using Qt4 is the only working option at the moment. However, MacPorts' Qt4 has a broken `moc` command, causing OpenSCAD compilation to    break. This may be fixed in MacPorts by the time you read this. ```        sudo port install opencsg qscintilla boost cgal pkgconfig eigen3 harfbuzz fontconfig ``` ### Building for Linux/BSD First, make sure that you have git installed (often packaged as 'git-core' or 'scmgit'). Once you've cloned this git repository, download and install the dependency packages listed above using your system's package manager. A convenience script is provided that can help with this process on some systems: sudo ./scripts/uni-get-dependencies.sh After installing dependencies, check their versions. You can run this script to help you: ./scripts/check-dependencies.sh Take care that you don't have old local copies anywhere (`/usr/local/`). If all dependencies are present and of a high enough version, skip ahead to the Compilation instructions. ### Building for Linux/BSD on systems with older or missing dependencies If some of your system dependency libraries are missing or old, then you can download and build newer versions into `$HOME/openscad_deps` by following this process. First, run the script that sets up the environment variables. source ./scripts/setenv-unibuild.sh Then run the script to compile all the prerequisite libraries above: ./scripts/uni-build-dependencies.sh Note that huge dependencies like gcc, qt, or glib2 are not included here, only the smaller ones (boost, CGAL, opencsg, etc). After the build, again check dependencies. ./scripts/check-dependencies.sh After that, follow the Compilation instructions below. ### Building for Windows OpenSCAD for Windows is usually cross-compiled from Linux. If you wish to attempt an MSVC build on Windows, please see this site: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Building_on_Windows To cross-build, first make sure that you have all necessary dependencies of the MXE project ( listed at https://mxe.cc/#requirements ). Don't install MXE itself, the scripts below will do that for you under `$HOME/openscad_deps/mxe` Then get your development tools installed to get GCC. Then after you've cloned this git repository, start a new clean bash shell and run the script that sets up the environment variables. source ./scripts/setenv-mingw-xbuild.sh 64 Then run the script to download & compile all the prerequisite libraries above: ./scripts/mingw-x-build-dependencies.sh 64 Note that this process can take several hours, and tens of gigabytes of disk space, as it uses the [https://mxe.cc](https://mxe.cc) system to cross-build many libraries. After it is complete, build OpenSCAD and package it to an installer: ./scripts/release-common.sh mingw64 If you wish you can only build the `openscad.exe` binary: cd mingw64 qmake ../openscad.pro CONFIG+=mingw-cross-env make For a 32-bit Windows cross-build, replace 64 with 32 in the above instructions. ### Compilation First, run `qmake openscad.pro` from Qt to generate a Makefile. On some systems, depending on which version(s) of Qt you have installed, you may need to specify which version you want to use, e.g. by running `qmake4`, `qmake-qt4`, `qmake -qt=qt5`, or something alike. Then run `make`. Finally you might run `make install` as root or simply copy the 'openscad' binary (`OpenSCAD.app` on Mac OS X) to the bin directory of your choice. If you had problems compiling from source, raise a new issue in the [issue tracker on the github page](https://github.com/openscad/openscad/issues). This site and it's subpages can also be helpful: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Building_OpenSCAD_from_Sources openscad-2019.05/RELEASE_NOTES.md0000644000076500000240000004065613465203575016476 0ustar kintelstaff00000000000000 # OpenSCAD 2019.05 **Language Features:** * New modules * assert() - stop script evaluation on failed constraints * let() - scoped assignment * New functions * ord() - convert from character to Unicode code point * echo() * assert() - stop script evaluation on failed constraints * Type testing functions: is_undef(), is_list(), is_num(), is_bool(), is_string() * New special variable: $preview variable which is set to true in preview mode * List comprehension updates * Added if/else condition * Added each keyword * Added C-style for loop * Now allows looping over characters of a string * rotate_extrude(): Added angle parameter to * import() now supports SVG, 3MF and AMF * color() now supports hex color codes * Removed glide() and subdiv() which were never implemented **Program Features:** * Customizer: Allow parametrizing design parameters with GUI customization * Support for using 3D-Mouse / Joystick / Gamepad input devices for controlling the 3D view * 3D Printing support: Purchase from a print service partner or print to Octoprint * New export file formats: SVG, 3MF, AMF * Quick-edit and preview of values using Alt-Arrows (Shift-Alt-Arrows on macOS) * Added --view cmd-line parameter * Play sound notification on render complete * Line numbers and filenames are now shown for many errors and warnings * Hardwarning preference: Stop on first warning * Hardwarning and assert now shows a stack trace * New warnings * Module call parameterns don't match module declaration * Argument value of of range * Duplicate passed argument * Children passed to module not accepting children * Reference to inknown $special_variables * Duplicate assigment * New translations: Ukrainian, Polish # OpenSCAD 2015.03 ## 2015.03-3 **OS X only: Auto-update vulnerability fix** ## 2015.03-2 **Bugfixes** * \#1483 - Fix Z-fighting in Ortho view * \#1479 - No check for infinite $fn * \#1472 - "nan" in list comprehension causes crash * \#452 - rands() fails when the seed is a floating point number * \#1407 - Recursive module crash * \#1425 - Animate Filename Generation - Duplicate/Missing Filenames * \#1420 - expression-evaluation-tests fails on arm64 * \#1410 - Crash when a polygon contains NaN * \#1378 - Linear extrude plus infinite twist causes crash instead of just an error * \#1358 - Add more detailed installer information including version number * \#1356 - Crash when multiplying matrices with undefined elements * \#1350 - Saving file when HD is full ends up in data loss * \#1342 - Syntax Highlighting Does Not Work on Linux Mint 17.1 * \#1337 - Simple detection of script and direction based on given text * \#1325 - Crash when polygons with > 3 indices turn out to be degenerate * \#1329 - version() returned ```[0,0,0]``` ## 2015.03-1 **Bugfixes** * \#1203 - Linux: Missing icons on Xfce * \#1258 - Occasional crash when exporting STL * \#1260 - Minimal window width too large * \#1264 - Replace All sometimes caused a hang * \#1274 - Fixed some preview bugs on Intel GPUs (OpenCSG 1.4.0) * \#1276 - Module recursion sometimes caused a crash * \#1277 - Automatic reload sometimes messed up camera position * \#1284 - Animation flicker eliminated * \#1294 - Support reproducible builds * \#1317 - Normals vectors in STL were sometimes 0 0 0 ## 2015.03 **Language Features:** * Added text() module for 2D text * Added offset() module for 2D offsets * Added list comprehensions and let() * Added concat() function * Added chr() function * surface() can now take PNG images as input * min() and max() can now take a vector argument * 2D minkowski can now handle polygons with holes * Variables can now be assigned in local blocks without using assign() **Program Features:** * Added Toolbar icons * New code editor based on QScintilla * Added Splash screen * Added SVG export * Added AMF export * Added --viewall and --autocenter cmd-line parameters * GUI is now translated into German, Czech, Spanish, French and Russian * MDI (Multiple Document Interface) is now available on all platforms * Color schemes for viewer and editor can be user-edited using JSON files * GUI components are now dockable * Added Tickmarks on axes **Bugfixes/improvements:** * Performance improvement: 2D (clipper), preview, hull, minkowski, surface * Performance improvement: Reduce duplicate evaluation of identical expressions * Better recursion behavior * STL export and import is now more robust * Internal cavities are better supported * New examples * Windows cmd-line behaves better * Better mirror() and scale() behavior when using negative factors **Deprecations:** * polyhedron() now takes a faces= argument rather than triangles= * assign() is no longer needed. Local variables can be created in any scope # OpenSCAD 2014.03 **Language Features:** * Added diameter argument: circle(d), cylinder(d, d1, d2) and sphere(d) * Added parent_module() and $parent_modules * Added children() as a replacement for child() * Unicode strings (using UTF-8) are now correctly handled * Ranges can have a negative step value * Added norm() and cross() functions **Program Features:** * Cmd-line: --info parameter prints system/library info * Cmd-line: --csglimit parameter to change CSG rendering limit * Cmd-line: Better handling of cmd-line arguments under Windows * GUI: Added Reset View * GUI: Added Search&Replace in editor * GUI: Syntax highlighting now has a dark background theme * GUI: We now create a backup file before rendering to allow for recovery if OpenSCAD crashes/freezes * GUI: Accessibility features enabled (e.g. screenreading) **Bugfixes/improvements:** * Reading empty STL files sometimes caused a crash * OPENSCADPATH now uses semicolon as path separator under Windows * polyhedron() is now much more robust handling almost planar polygons * Automatic reloads of large designs are more robust * Boolean logic in if() statements are now correctly short-circuited * rands() with zero range caused an infinite loop * resize(, auto=true) didn't work when shrinking objects * The $children variable sometimes misbehaved due to dynamic scoping * The --camera cmd-line option behaved differently then the corresponding GUI function * PNG export now doesn't leak transparency settings into the target image * Improved performance of 3D hull() operations * Some editor misbehaviors were fixed * Stability fixes of CGAL-related crashes * Windows cmd-line can now handle spaces in filenames * Default CSG rendering limit is now 100K elements * Fixed a crash reading DXF files using comma as decimal separator * Fixed a crash running the cmd-line without a HOME env. variable * Intersecting something with nothing now correctly results in an empty object **Deprecations:** * child() is no longer supported. Use children() instead. * polyhedron(triangles=[...]): Use polyhedron(faces=[...]) instead. **Misc:** * Test framework now shares more code with the GUI app * Test report can now be automatically uploaded to dinkypage.com * Better compatibility with BSD systems * Qt5 support # OpenSCAD 2013.06 **Language Features:** * linear_extrude now takes a scale parameter: linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) * Recursive use of modules is now supported (including cascading child() operations): https://github.com/openscad/openscad/blob/master/examples/example024.scad * Parameter list values can now depend on earlier values, e.g. for (i=[0:2], j=[0:i]) .. * value assignments in parameters can now depend on already declared parameters * Added resize() module: http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#resize **Program Features:** * Added basic syntax highlighting in the editor * There is now a built-in library path in user-space: http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries#Library_Locations * Commandline output to PNG, with various camera and rendering settings. Run openscad -h to see usage info or see the OpenSCAD wiki user manual. * Attempting to open dxf, off or stl files in the GUI will now create an import statement. * The preview operator (%) will now preserve any manually set color * The highlight operator (#) will now color the object in transparent red * Mac: Added document icon * Mac: Added auto-update check * Windows: Better cmd-line support using the openscad.com executable **Bugfixes:** * Importing files is now always relative to the importing script, also for libraries * We didn't always print a warning when CSG normalization created too many elements * Binary STLs can now be read on big endian architectures * Some binary STLs couldn't be read * Fixed some issues related to ARM builds * CGAL triangulation more lenient- enables partial rendering of 'bad' DXF data * The Automatic Reload feature is now more robust * If a file couldn't be saved it no longer fails silently * Fixed a number of crashes related to CGAL and OpenCSG rendering or complex models * The lookup() function had bad boundary condition behavior * The surface() module failed when the .dat file lacked a trailing newline * The hull() module could crash if any of the children were empty objects * Some problems using unicode filenames have been fixed **Misc:** * Build scripts have been further improved * Regression test now creates single monolithic .html file for easier uploading * Regression test auto-starts & stops Xvfb / Xvnc if on headless unix machine * The backend is finally independent of Qt * Windows: We now have a 64-bit version **Known Bugs:** * Linux: command-line png rendering on Gallium is flaky. Workaround: use CGAL --render or hardware rendering. # OpenSCAD 2013.01 **Features:** * Snappier GUI while performing CGAL computations (computations running in separate thread) * The size of the misc. caches can now be adjusted from Preferences * The limit for when to disable OpenCSG can now be adjusted from Preferences * Added Dot product operator: vec * vec * Added Matrix multiplication operator: vec * mat, mat * mat * Added search() function * Dependencies are now tracked - any changes in uses/included files will be detected and cause a recompile * The OPENSCADPATH environment variable is now implemented will have precedence when searching for libraries * .csg files can now be opened from the GUI * linear_extrude() will now assume that the first parameter means 'height' if it's a number **Bugfixes:** * use'ing an non-existing file sometimes crashed under Windows * Better font handling: Ensure a monospace font is chosen as default * Division by zero caused hang in some cases (e.g. sin(1/0)) * Larger minkowski operations sometimes caused a crash after a CGAL assert was thrown * Fixed crashes in shared_ptr.hpp (or similar places) due bugs in cache management and CSG normalization * scale() with a scale factor of zero could cause a crash * Fixed a number of issues related to use/include * Providing an unknown parameter on the cmd-line caused a crash * cmd-line overrides using -D now also work for USEd modules * Modifier characters can now be used in front of if statements * rotate() with a vector argument with less that 3 elements used uninitialized variables, ending up being non-deterministic. * .csg files will now have relative filenames whenever possible * Don't just ignore geometric nodes having zero volume/area - when doing difference/intersection, they tend to turn negative objects into positive ones. * Always use utf-8 file encoding, also under Windows * A lot of build script fixes * Some other crash bugs fixes **Deprecations:** * The old include syntax "" without the include keyword is no longer supported and will cause a syntax error. # OpenSCAD 2011.12 **Features:** * The MCAD library is now bundled with OpenSCAD * Added len() function. Takes one vector or string parameter and returns its length. * The index operator [] now works on strings * The version() function will return the OpenSCAD version as a vector, e.g. [2011, 09] * The version_num() function will return the OpenSCAD version as a number, e.g. 20110923 * hull() Now supports 3D objects * hull() with 2D object can now use for loops and boolean operations as children * New import() statement reads the correct file format based on the filename extension (.stl, .dxf and .off is supported) * The color() statement now supports an alpha parameter, e.g. color(c=[1,0,0], alpha=0.4) * The color() statement now supports specifying colors as strings, e.g. color("Red") * The color() statement now overrides colors specified further down in the tree * if()/else() and the ternary operator can now take any value type as parameter. false, 0, empty string and empty vector or illegal value type will evaluate as false, everything else as true. * Strings can now be lexographically compared using the <, <=, >, >= operators * Added PI constant. * Number literals in scientific notation are now accepted by the parser * Added import and export of the OFF file format * Now uses standard shortcuts for save, reload and quit on Linux and Windows. F2/F3 will still work but is deprecated. **Bugfixes:** * Complex CSG models sometimes took extremely long time to normalize before OpenCSG preview * square() crashed if any of the dimensions were zero * Flush Caches didn't flush cached USE'd modules * STL export should be a bit more robust * Dropping a file into the editor under Windows didn't work (double C:/C:/ problem) * On some platforms it was possible to insertion rich text in the editor, causing confusion. * Less crashes due to CGAL assertions * OpenCSG should now work on systems with OpenGL 1.x, given that the right extensions are available * include now searches librarydir * The $fs parameter yielded only half the number of segments it should have * surface(center=true) is now correctly centered in the XY plane **Deprecations:** * dxf_linear_extrude() and dxf_rotate_extrude() are now deprecated. Use linear_extrude() and rotate_extrude() instead. * The file, layer, origin and scale parameters to linear_extrude() and rotate_extrude() are now deprecated. Use an import() child instead. * import_dxf(), import_stl() and import_off() are now deprecated. Use import() instead. * When exporting geometry from the cmd-line, use the universal -o option. It will export to the correct file format based on the given suffix (dxf, stl, off). The -x and -s parameters are still working but deprecated. * F2 and F3 for Save and Reload is now deprecated # OpenSCAD 2011.06 * Added "Export as Image" menu. **Bugfixes:** * Cylinder tesselation broke existing models which are using cylinders for e.g. captured nut slots and are dependent on the orientation not changing. * DXF output couldn't be imported into e.g. AutoCAD and Solidworks after updating to using the AutoCAD 2000 (AC1015) format. Reverted to the old entity-only output, causing LWPOLYLINES to not exported allowed anymore. # OpenSCAD 2011.04 * Added hull() for convex hulls (2D object only) * minkowski() now supports 2D objects * Added functions: rands(), sign() * Now supports escaping of the following characters in strings: \n, \t, \r, \\, \" * Support nested includes * Improved parsing of numbers * DXF: output LWPOLYLINE instead of just LINE entities * Bugfixes: More robust DXF export, setting $fs/$fa to 0 caused a crash * Some bugs fixed, maybe some new bugs added # OpenSCAD 2010.05 * Added functions and statements * Added abs() function * Added exp(x), log(b, x), log(x) and ln(x) functions * Added minkowski() statement for 3d minkowski sums * Added 'include ' and 'use ' statements * Old implicit '' include statement is now obsolete * Some bugs fixed, maybe some new bugs added # OpenSCAD 2010.02 * Added functions and statements * Added sqrt() function * Added round(), ceil() and floor() functions * Added lookup() function for linear interpolation in value list * Added projection(cut = true/false) statement * Added child() statement for accessing child nodes of module instances * Added mirror() statement * Improved DXF import code (more entities and some bugs fixed) * Added feature for dumping animation as PNG files * Added a preferences dialog * Now using CGAL's delaunay tesselator * Now using eigen2 for linear algebra * Reorganisation of the source tree * Some bugs fixed, maybe some new bugs added # OpenSCAD 2010.01 * Added functions and statements * Added intersection_for() * Added str function * Added min and max function * Added color() statement * Added 2D Subsystem * New primitives: circle(), square() and polygon() * 2D->3D path: linear_extrude() and rotate_extrude() * Import of DXF to 2d subsystem: import_dxf() * Export of 2D data as DXF files * Some bugs fixed, maybe some new bugs added openscad-2019.05/appcast-snapshots.xml.in0000644000076500000240000000165713432700636020716 0ustar kintelstaff00000000000000 OpenSCAD Development Snapshots https://openscad.org/appcast-snapshots.xml en OpenSCAD @VERSION@ @VERSIONDATE@ https://raw.githubusercontent.com/openscad/openscad/master/releases/2015.XX.md 10.9.0 openscad-2019.05/appcast.xml.in0000644000076500000240000000163713432700636016674 0ustar kintelstaff00000000000000 OpenSCAD Updates https://openscad.org/appcast.xml en OpenSCAD @VERSION@ @VERSIONDATE@ https://raw.githubusercontent.com/openscad/openscad/openscad-@VERSION@/releases/@SHORTVERSION@.md 10.9.0 openscad-2019.05/appveyor.yml0000644000076500000240000000546713417146624016513 0ustar kintelstaff00000000000000skip_branch_with_pr: true branches: except: - coverity_scan - /^continuous.*/ image: - Visual Studio 2017 init: - ps: Get-Date -UFormat '### %Y-%m-%d %T init started' # Uncomment to enable RDP login at init time, this will not block job execution. # - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) install: - ps: Get-Date -UFormat '### %Y-%m-%d %T install started' - set PATH=c:\msys64\usr\bin - C:\msys64\usr\bin\bash -lc "echo 'export PATH=/mingw64/bin:/usr/bin' > ~/.bashrc" - C:\msys64\usr\bin\bash -lc /c/projects/openscad/scripts/msys2-install-dependencies.sh - ps: Get-Date -UFormat '### %Y-%m-%d %T install finished' build_script: - ps: Get-Date -UFormat '### %Y-%m-%d %T build started' - ps: Get-Date -UFormat '### %Y-%m-%d %T qmake' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad && qmake.exe openscad.pro CONFIG-=debug CONFIG+=experimental CONFIG+=snapshot CONFIG+=info" - ps: Get-Date -UFormat '### %Y-%m-%d %T make' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad && mingw32-make.exe -j2" - ps: Get-Date -UFormat '### %Y-%m-%d %T prepare test build' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad && git submodule update --init" - ps: Get-Date -UFormat '### %Y-%m-%d %T cmake' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad/tests && EIGENDIR=/mingw64/include/eigen3 /mingw64/bin/cmake.exe -G 'MSYS Makefiles' ." - ps: Get-Date -UFormat '### %Y-%m-%d %T make' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad/tests && mingw32-make.exe -j2" - ps: Get-Date -UFormat '### %Y-%m-%d %T build finished' test_script: - ps: Get-Date -UFormat '### %Y-%m-%d %T test started' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad/release && cp -v /mingw64/bin/opengl32.dll ." - ps: Get-Date -UFormat '### %Y-%m-%d %T ctest' - C:\msys64\usr\bin\bash -lc "cd /c/projects/openscad/tests && /mingw64/bin/ctest.exe -j2 -E 'opencsgtest_issue1165|opencsgtest_issue1215|throwntogethertest_issue1089|throwntogethertest_issue1215|openscad-nonascii|import_3mf|3mfpngtest|3mfexport'" - ps: Get-Date -UFormat '### %Y-%m-%d %T test finished' artifacts: - path: 'tests\Testing\Temporary\*_report.html' on_failure: - ps: Get-ChildItem c:\projects\openscad\tests\Testing\Temporary\*_report.html | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name } # Uncomment RDP login at job end with specical blocking flag to prevent the worker from exitting. Continue by deleting lock file on desktop. # Alternatively if RDP is already enabled earlier, just adding "pause" will block the worker till timeout (60 minutes). #on_finish: # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) # - pause openscad-2019.05/bison.pri0000644000076500000240000000072313402025764015732 0ustar kintelstaff00000000000000{ bison.name = Bison ${QMAKE_FILE_IN} bison.input = BISONSOURCES bison.output = $${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx bison.commands = bison -d -p ${QMAKE_FILE_BASE} -o $${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx --defines=$${OBJECTS_DIR}/${QMAKE_FILE_BASE}.hxx ${QMAKE_FILE_IN} bison.CONFIG += target_predeps bison.variable_out = GENERATED_SOURCES silent:bison.commands = @echo Bison ${QMAKE_FILE_IN} && $$bison.commands QMAKE_EXTRA_COMPILERS += bison } openscad-2019.05/c++11.pri0000644000076500000240000000242113402025764015327 0ustar kintelstaff00000000000000macx { # Mac needs special care to link against the correct C++ library # We attempt to auto-detect it by inspecting Boost dirs = $${BOOSTDIR} $${QMAKE_LIBDIR} for(dir, dirs) { system(otool -L $${dir}/libboost_thread* | grep libc++ >& /dev/null ) { message("Using libc++11") CONFIG += libc++ } else { message("Using libstdc++") CONFIG += libstdc++ c++11 { # libc++ is a requirement for using C++11 warning("Disabling C++11 since libstdc++ dependencies were found") CONFIG -= c++11 } } } libc++ { QMAKE_CXXFLAGS += -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++ QMAKE_OBJECTIVE_CFLAGS += -stdlib=libc++ } } c++11 { QMAKE_CXXFLAGS += -std=c++11 message("Using C++11") *clang*: { # 3rd party libraries will probably violate this for a long time CXX11_SUPPRESS_WARNINGS += -Wno-inconsistent-missing-override # boost/algorithm/string.hpp does this CXX11_SUPPRESS_WARNINGS += -Wno-unused-local-typedef # CGAL CXX11_SUPPRESS_WARNINGS += -Wno-deprecated-register QMAKE_CXXFLAGS_WARN_ON += $$CXX11_SUPPRESS_WARNINGS QMAKE_OBJECTIVE_CFLAGS_WARN_ON += $$CXX11_SUPPRESS_WARNINGS } } else { *clang* { QMAKE_CXXFLAGS_WARN_ON += -Wno-c++11-extensions } } openscad-2019.05/cgal/README.md0000644000076500000240000000033513402025764016270 0ustar kintelstaff00000000000000This folder contains some CGAL test programs to easier develop and debug CGAL-based components. ## polyhole-tessellator Tessellate an almost planar 3D polygon with holes into a vector of double precision 3D triangles. openscad-2019.05/cgal/data/collinear-axis-aligned.polygon0000644000076500000240000000035713402025764023652 0ustar kintelstaff00000000000000-76.547562539078825239,38.705110299157155396,5.353092412611622386 -76.547562541749158527,38.705110304107662955,5.3530924135499766692 -76.5475616455078125,38.705108642578125,0 -76.5475616455078125,38.705108642578125,0.020000000000000000416 openscad-2019.05/cgal/data/cubes.stl0000644000076500000240000000656613402025764017563 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal -1 0 0 outer loop vertex 0 10 0 vertex 0 0 0 vertex 0 0 10 endloop endfacet facet normal -1 -0 -0 outer loop vertex 0 10 10 vertex 0 10 0 vertex 0 0 10 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 0 10 vertex 0 0 0 vertex 10 0 0 endloop endfacet facet normal -0 -1 -0 outer loop vertex 10 0 10 vertex 0 0 10 vertex 10 0 0 endloop endfacet facet normal -0 0 -1 outer loop vertex 5 10 0 vertex 0 0 0 vertex 0 10 0 endloop endfacet facet normal 0 0 -1 outer loop vertex 5 15 0 vertex 15 15 0 vertex 5 10 0 endloop endfacet facet normal 0 -0 -1 outer loop vertex 5 10 0 vertex 10 5 0 vertex 0 0 0 endloop endfacet facet normal 0 -0 -1 outer loop vertex 15 15 0 vertex 15 5 0 vertex 10 5 0 endloop endfacet facet normal 0 -0 -1 outer loop vertex 10 5 0 vertex 10 0 0 vertex 0 0 0 endloop endfacet facet normal 0 0 -1 outer loop vertex 15 15 0 vertex 10 5 0 vertex 5 10 0 endloop endfacet facet normal 0 1 0 outer loop vertex 5 10 0 vertex 0 10 0 vertex 0 10 10 endloop endfacet facet normal 0 1 0 outer loop vertex 5 10 10 vertex 5 10 0 vertex 0 10 10 endloop endfacet facet normal 0 0 1 outer loop vertex 10 5 10 vertex 0 0 10 vertex 10 0 10 endloop endfacet facet normal 0 -0 1 outer loop vertex 15 5 10 vertex 15 15 10 vertex 10 5 10 endloop endfacet facet normal 0 0 1 outer loop vertex 10 5 10 vertex 5 10 10 vertex 0 0 10 endloop endfacet facet normal 0 0 1 outer loop vertex 15 15 10 vertex 5 15 10 vertex 5 10 10 endloop endfacet facet normal 0 0 1 outer loop vertex 5 10 10 vertex 0 10 10 vertex 0 0 10 endloop endfacet facet normal 0 0 1 outer loop vertex 15 15 10 vertex 5 10 10 vertex 10 5 10 endloop endfacet facet normal 1 0 0 outer loop vertex 10 0 10 vertex 10 0 0 vertex 10 5 0 endloop endfacet facet normal 1 0 0 outer loop vertex 10 5 10 vertex 10 0 10 vertex 10 5 0 endloop endfacet facet normal -1 0 0 outer loop vertex 5 15 0 vertex 5 10 0 vertex 5 10 10 endloop endfacet facet normal -1 -0 -0 outer loop vertex 5 15 10 vertex 5 15 0 vertex 5 10 10 endloop endfacet facet normal 0 -1 0 outer loop vertex 10 5 10 vertex 10 5 0 vertex 15 5 0 endloop endfacet facet normal -0 -1 -0 outer loop vertex 15 5 10 vertex 10 5 10 vertex 15 5 0 endloop endfacet facet normal 0 1 0 outer loop vertex 15 15 0 vertex 5 15 0 vertex 5 15 10 endloop endfacet facet normal 0 1 0 outer loop vertex 15 15 10 vertex 15 15 0 vertex 5 15 10 endloop endfacet facet normal 1 0 0 outer loop vertex 15 5 10 vertex 15 5 0 vertex 15 15 0 endloop endfacet facet normal 1 0 0 outer loop vertex 15 15 10 vertex 15 5 10 vertex 15 15 0 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/cgal/data/degenerate-L.polygon0000644000076500000240000000003013402025764021617 0ustar kintelstaff000000000000000,0,0 0,1,0 1,1,1 0,1,0 openscad-2019.05/cgal/data/degenerate-L2.polygon0000644000076500000240000000003013402025764021701 0ustar kintelstaff000000000000000,1,0 0,0,0 0,1,0 1,1,0 openscad-2019.05/cgal/data/duplicate-vertex.polygon0000644000076500000240000000003013402025764022610 0ustar kintelstaff000000000000000 0 0 1 0 0 1 1 0 1 1 0 openscad-2019.05/cgal/data/hourglass.polygon0000644000076500000240000000003013402025764021332 0ustar kintelstaff000000000000000 0 0 1 0 0 0 1 0 1 1 0 openscad-2019.05/cgal/data/issue1105.polygon0000644000076500000240000000022013402025764020763 0ustar kintelstaff000000000000006, -25, 29.285714285714285 6, -26.732050855686023, 29.020513307787397 6, -26.732050855686026, 29.020513307787397 6, -26, 29.132600433972414 openscad-2019.05/cgal/data/issue1105c.polygon0000644000076500000240000000077613402025764021146 0ustar kintelstaff0000000000000011.8244953852727654464160877978,-33.4423534623057960857295256574,28 11.8244953852727654464160877978,-34,28 11.8244953852727654464160877978,-36.5576465376941897034157591406,28 7.99999999999999911182158029987,-35.6847304231704427479598962236,23.516743531220182461538570351 8,-35,23.516743531220182461538570351 5.99999999999999911182158029987,-35,21.1722478437400596362749638502 6,-35,21.1722478437400596362749638502 5.8577590289166048265201425238,-34.8042220990505484223831444979,21.0055061720960587479112291476 openscad-2019.05/cgal/data/issue1210.polygon0000644000076500000240000000012413402025764020763 0ustar kintelstaff000000000000009.5,7.5,-0.5 9.5,2,-0.5 9.5,2,-0.4999999701976776123 9.5,7.5,-0.4999999701976776123 openscad-2019.05/cgal/data/issue1455.nef30000644000076500000240000001651213402025764020152 0ustar kintelstaff00000000000000Selective Nef Complex standard vertices 15 halfedges 42 facets 18 volumes 2 shalfedges 84 shalfloops 2 sfaces 30 0 { 0 2, 0 5, 0 1, -2 | 0 0 5 1 } 1 1 { 3 5, 6 11, 2 3, -2 | 5 0 5 1 } 1 2 { 6 8, 12 17, 4 5, -2 | 5 5 5 1 } 1 3 { 9 11, 18 23, 6 7, -2 | 0 5 0 1 } 1 4 { 12 14, 24 29, 8 9, -2 | 5 0 0 1 } 1 5 { 15 17, 30 35, 10 11, -2 | 5 5 0 1 } 1 6 { 18 20, 36 41, 12 13, -2 | 0 5 5 1 } 1 7 { 21 23, 42 47, 14 15, -2 | 0 0 3 1 } 0 8 { 24 26, 48 53, 16 17, -2 | 3 0 3 1 } 0 9 { 27 29, 54 59, 18 19, -2 | 3 3 3 1 } 0 10 { 30 32, 60 65, 20 21, -2 | 0 3 0 1 } 0 11 { 33 35, 66 71, 22 23, -2 | 3 0 0 1 } 0 12 { 36 38, 72 77, 24 25, -2 | 3 3 0 1 } 0 13 { 39 41, 78 83, 26 27, -2 | 0 3 3 1 } 0 14 { -2 -2, -2 -2, 28 29, 0 | 2 2 3 1 } 1 0 { 3, 0, 0 0 | 1 0 0 1 } 1 1 { 18, 0, 0 5 | 0 1 0 1 } 1 2 { 21, 0, 0 4 | 0 0 -1 1 } 1 3 { 0, 1, 0 6 | -1 0 0 1 } 1 4 { 6, 1, 0 7 | 0 1 0 1 } 1 5 { 13, 1, 0 10 | 0 0 -1 1 } 1 6 { 4, 2, 0 14 | 0 -1 0 1 } 1 7 { 19, 2, 0 13 | -1 0 0 1 } 1 8 { 17, 2, 0 16 | 0 0 -1 1 } 1 9 { 32, 3, 0 20 | 0 -1 0 1 } 1 10 { 20, 3, 0 22 | 0 0 1 1 } 1 11 { 16, 3, 0 21 | 1 0 0 1 } 1 12 { 34, 4, 0 26 | -1 0 0 1 } 1 13 { 5, 4, 0 28 | 0 0 1 1 } 1 14 { 15, 4, 0 25 | 0 1 0 1 } 1 15 { 14, 5, 0 30 | 0 -1 0 1 } 1 16 { 11, 5, 0 34 | -1 0 0 1 } 1 17 { 8, 5, 0 35 | 0 0 1 1 } 1 18 { 1, 6, 0 36 | 0 -1 0 1 } 1 19 { 7, 6, 0 40 | 1 0 0 1 } 1 20 { 10, 6, 0 41 | 0 0 -1 1 } 1 21 { 2, 7, 0 44 | 0 0 1 1 } 1 22 { 24, 7, 0 46 | 1 0 0 1 } 0 23 { 39, 7, 0 47 | 0 1 0 1 } 0 24 { 22, 8, 0 50 | -1 0 0 1 } 0 25 { 27, 8, 0 49 | 0 1 0 1 } 0 26 { 33, 8, 0 52 | 0 0 -1 1 } 0 27 { 25, 9, 0 56 | 0 -1 0 1 } 0 28 { 40, 9, 0 55 | -1 0 0 1 } 0 29 { 38, 9, 0 58 | 0 0 -1 1 } 0 30 { 41, 10, 0 62 | 0 0 1 1 } 0 31 { 37, 10, 0 64 | 1 0 0 1 } 0 32 { 9, 10, 0 65 | 0 1 0 1 } 1 33 { 26, 11, 0 68 | 0 0 1 1 } 0 34 { 12, 11, 0 70 | 1 0 0 1 } 1 35 { 36, 11, 0 71 | 0 1 0 1 } 0 36 { 35, 12, 0 74 | 0 -1 0 1 } 0 37 { 31, 12, 0 76 | -1 0 0 1 } 0 38 { 29, 12, 0 77 | 0 0 1 1 } 0 39 { 23, 13, 0 80 | 0 -1 0 1 } 0 40 { 28, 13, 0 82 | 1 0 0 1 } 0 41 { 30, 13, 0 79 | 0 0 -1 1 } 0 0 { 1, 79 , , 0 | -1 0 0 0 } 1 1 { 0, 78 , , 1 | 1 0 0 0 } 1 2 { 3, 37 , , 0 | 0 0 1 -5 } 1 3 { 2, 36 , , 1 | 0 0 -1 5 } 1 4 { 5, 9 , , 0 | 1 0 0 -5 } 1 5 { 4, 8 , , 1 | -1 0 0 5 } 1 6 { 7, 35 , , 0 | 0 1 0 -5 } 1 7 { 6, 34 , , 1 | 0 -1 0 5 } 1 8 { 9, 74 , , 0 | 0 0 -1 0 } 1 9 { 8, 75 , , 1 | 0 0 1 0 } 1 10 { 11, 2 , , 0 | 0 -1 0 0 } 1 11 { 10, 3 , , 1 | 0 1 0 0 } 1 12 { 13, 81 , 1 , 1 | 0 0 1 -3 } 0 13 { 12, 80 , 0 , 0 | 0 0 -1 3 } 0 14 { 15, 53 , , 1 | 1 0 0 -3 } 0 15 { 14, 52 , , 0 | -1 0 0 3 } 0 16 { 17, 77 , , 1 | 0 1 0 -3 } 0 17 { 16, 76 , , 0 | 0 -1 0 3 } 0 0 { 0 } 0 1 { 15 } 1 0 { 1, 3, 5, 0, 0, 7, 36, 3 | 0 0 1 0 } 1 1 { 0, 4, 2, 1, 1, 37, 6, 2 | 0 0 -1 0 } 1 2 { 3, 1, 4, 0, 1, 10, 44, 10 | 0 1 0 0 } 1 3 { 2, 5, 0, 2, 0, 45, 11, 11 | 0 -1 0 0 } 1 4 { 5, 2, 1, 2, 1, 43, 38, 0 | 1 0 0 0 } 1 5 { 4, 0, 3, 1, 0, 39, 42, 1 | -1 0 0 0 } 1 6 { 7, 10, 9, 3, 3, 1, 12, 2 | 0 0 -1 0 } 1 7 { 6, 8, 11, 4, 2, 13, 0, 3 | 0 0 1 0 } 1 8 { 9, 11, 7, 5, 2, 29, 14, 5 | 1 0 0 0 } 1 9 { 8, 6, 10, 4, 3, 15, 28, 4 | -1 0 0 0 } 1 10 { 11, 9, 6, 5, 3, 26, 2, 10 | 0 1 0 0 } 1 11 { 10, 7, 8, 3, 2, 3, 27, 11 | 0 -1 0 0 } 1 12 { 13, 15, 17, 6, 5, 6, 37, 2 | 0 0 -1 0 } 1 13 { 12, 16, 14, 7, 4, 36, 7, 3 | 0 0 1 0 } 1 14 { 15, 13, 16, 6, 4, 8, 33, 5 | 1 0 0 0 } 1 15 { 14, 17, 12, 8, 5, 32, 9, 4 | -1 0 0 0 } 1 16 { 17, 14, 13, 8, 4, 34, 40, 7 | 0 1 0 0 } 1 17 { 16, 12, 15, 7, 5, 41, 35, 6 | 0 -1 0 0 } 1 18 { 19, 21, 22, 9, 6, 60, 39, 1 | -1 0 0 0 } 1 19 { 18, 23, 20, 10, 7, 38, 61, 0 | 1 0 0 0 } 1 20 { 21, 19, 23, 9, 7, 64, 31, 8 | 0 0 1 0 } 1 21 { 20, 22, 18, 11, 6, 30, 65, 9 | 0 0 -1 0 } 1 22 { 23, 18, 21, 10, 6, 40, 34, 7 | 0 1 0 0 } 1 23 { 22, 20, 19, 11, 7, 35, 41, 6 | 0 -1 0 0 } 1 24 { 25, 27, 29, 12, 8, 71, 30, 9 | 0 0 -1 0 } 1 25 { 24, 28, 26, 14, 9, 31, 70, 8 | 0 0 1 0 } 1 26 { 27, 25, 28, 12, 9, 68, 10, 10 | 0 1 0 0 } 1 27 { 26, 29, 24, 13, 8, 11, 69, 11 | 0 -1 0 0 } 1 28 { 29, 26, 25, 13, 9, 9, 32, 4 | -1 0 0 0 } 1 29 { 28, 24, 27, 14, 8, 33, 8, 5 | 1 0 0 0 } 1 30 { 31, 33, 34, 15, 11, 24, 21, 9 | 0 0 -1 0 } 1 31 { 30, 35, 32, 16, 10, 20, 25, 8 | 0 0 1 0 } 1 32 { 33, 31, 35, 15, 10, 28, 15, 4 | -1 0 0 0 } 1 33 { 32, 34, 30, 17, 11, 14, 29, 5 | 1 0 0 0 } 1 34 { 35, 30, 33, 16, 11, 22, 16, 7 | 0 1 0 0 } 1 35 { 34, 32, 31, 17, 10, 17, 23, 6 | 0 -1 0 0 } 1 36 { 37, 39, 40, 18, 12, 0, 13, 3 | 0 0 1 0 } 1 37 { 36, 41, 38, 19, 13, 12, 1, 2 | 0 0 -1 0 } 1 38 { 39, 37, 41, 18, 13, 4, 19, 0 | 1 0 0 0 } 1 39 { 38, 40, 36, 20, 12, 18, 5, 1 | -1 0 0 0 } 1 40 { 41, 36, 39, 19, 12, 16, 22, 7 | 0 1 0 0 } 1 41 { 40, 38, 37, 20, 13, 23, 17, 6 | 0 -1 0 0 } 1 42 { 43, 45, 47, 21, 14, 5, 78, 1 | -1 0 0 0 } 1 43 { 42, 46, 44, 23, 15, 79, 4, 0 | 1 0 0 0 } 1 44 { 45, 43, 46, 21, 15, 2, 50, 10 | 0 1 0 0 } 1 45 { 44, 47, 42, 22, 14, 51, 3, 11 | 0 -1 0 0 } 1 46 { 47, 44, 43, 22, 15, 49, 80, 13 | 0 0 1 0 } 0 47 { 46, 42, 45, 23, 14, 81, 48, 12 | 0 0 -1 0 } 0 48 { 49, 51, 53, 24, 16, 47, 54, 12 | 0 0 -1 0 } 0 49 { 48, 52, 50, 25, 17, 55, 46, 13 | 0 0 1 0 } 0 50 { 51, 49, 52, 24, 17, 44, 68, 10 | 0 1 0 0 } 1 51 { 50, 53, 48, 26, 16, 69, 45, 11 | 0 -1 0 0 } 1 52 { 53, 50, 49, 26, 17, 67, 56, 15 | 1 0 0 0 } 0 53 { 52, 48, 51, 25, 16, 57, 66, 14 | -1 0 0 0 } 0 54 { 55, 57, 59, 27, 19, 48, 81, 12 | 0 0 -1 0 } 0 55 { 54, 58, 56, 28, 18, 80, 49, 13 | 0 0 1 0 } 0 56 { 57, 55, 58, 27, 18, 52, 73, 15 | 1 0 0 0 } 0 57 { 56, 59, 54, 29, 19, 72, 53, 14 | -1 0 0 0 } 0 58 { 59, 56, 55, 29, 18, 76, 82, 17 | 0 1 0 0 } 0 59 { 58, 54, 57, 28, 19, 83, 77, 16 | 0 -1 0 0 } 0 60 { 61, 63, 65, 30, 20, 78, 18, 1 | -1 0 0 0 } 1 61 { 60, 64, 62, 32, 21, 19, 79, 0 | 1 0 0 0 } 1 62 { 63, 61, 64, 30, 21, 82, 76, 17 | 0 1 0 0 } 0 63 { 62, 65, 60, 31, 20, 77, 83, 16 | 0 -1 0 0 } 0 64 { 65, 62, 61, 31, 21, 74, 20, 8 | 0 0 1 0 } 1 65 { 64, 60, 63, 32, 20, 21, 75, 9 | 0 0 -1 0 } 1 66 { 67, 69, 71, 33, 22, 53, 72, 14 | -1 0 0 0 } 0 67 { 66, 70, 68, 35, 23, 73, 52, 15 | 1 0 0 0 } 0 68 { 69, 67, 70, 33, 23, 50, 26, 10 | 0 1 0 0 } 1 69 { 68, 71, 66, 34, 22, 27, 51, 11 | 0 -1 0 0 } 1 70 { 71, 68, 67, 34, 23, 25, 74, 8 | 0 0 1 0 } 1 71 { 70, 66, 69, 35, 22, 75, 24, 9 | 0 0 -1 0 } 1 72 { 73, 75, 77, 36, 24, 66, 57, 14 | -1 0 0 0 } 0 73 { 72, 76, 74, 38, 25, 56, 67, 15 | 1 0 0 0 } 0 74 { 75, 73, 76, 36, 25, 70, 64, 8 | 0 0 1 0 } 1 75 { 74, 77, 72, 37, 24, 65, 71, 9 | 0 0 -1 0 } 1 76 { 77, 74, 73, 37, 25, 62, 58, 17 | 0 1 0 0 } 0 77 { 76, 72, 75, 38, 24, 59, 63, 16 | 0 -1 0 0 } 0 78 { 79, 81, 83, 39, 26, 42, 60, 1 | -1 0 0 0 } 1 79 { 78, 82, 80, 41, 27, 61, 43, 0 | 1 0 0 0 } 1 80 { 81, 79, 82, 39, 27, 46, 55, 13 | 0 0 1 0 } 0 81 { 80, 83, 78, 40, 26, 54, 47, 12 | 0 0 -1 0 } 0 82 { 83, 80, 79, 40, 27, 58, 62, 17 | 0 1 0 0 } 0 83 { 82, 78, 81, 41, 26, 63, 59, 16 | 0 -1 0 0 } 0 0 { 1, 28, 13 | 0 0 1 0 } 0 1 { 0, 29, 12 | 0 0 -1 0 } 0 0 { 0, 0 , , , 0 } 0 1 { 0, 1 , , , 1 } 1 2 { 1, 7 , , , 0 } 0 3 { 1, 6 , , , 1 } 1 4 { 2, 13 , , , 0 } 0 5 { 2, 12 , , , 1 } 1 6 { 3, 18 , , , 0 } 0 7 { 3, 19 , , , 1 } 1 8 { 4, 24 , , , 0 } 0 9 { 4, 25 , , , 1 } 1 10 { 5, 31 , , , 1 } 1 11 { 5, 30 , , , 0 } 0 12 { 6, 36 , , , 0 } 0 13 { 6, 37 , , , 1 } 1 14 { 7, 42 , , , 0 } 0 15 { 7, 43 , , , 1 } 1 16 { 8, 48 , , , 0 } 0 17 { 8, 49 , , , 1 } 1 18 { 9, 55 , , , 1 } 1 19 { 9, 54 , , , 0 } 0 20 { 10, 60 , , , 0 } 0 21 { 10, 61 , , , 1 } 1 22 { 11, 66 , , , 0 } 0 23 { 11, 67 , , , 1 } 1 24 { 12, 72 , , , 0 } 0 25 { 12, 73 , , , 1 } 1 26 { 13, 78 , , , 0 } 0 27 { 13, 79 , , , 1 } 1 28 { 14, , , 0, 1 } 1 29 { 14, , , 1, 0 } 0 /* end Selective Nef complex */ openscad-2019.05/cgal/data/out-of-range.polygon0000644000076500000240000000016713402025764021641 0ustar kintelstaff0000000000000050.9504,53.0377,9.35305 50.2251,53.0492,9.4122 50.9537,53.0376,9.35278 55.2851,53.5142,9.35278 50.9537,53.0376,9.35278 openscad-2019.05/cgal/data/out-of-range2.polygon0000644000076500000240000000050413402025764021716 0ustar kintelstaff0000000000000050.95040130615234375,53.037654876708984375,9.35305023193359375 50.225086212158203125,53.049152374267578125,9.4121952056884765625 50.953746795654296875,53.037601470947265625,9.3527774810791015625 55.285125732421875,53.514209747314453125,9.3527774810791015625 50.953746795654296875,53.037601470947265625,9.3527774810791015625 openscad-2019.05/cgal/data/quads.polygon0000644000076500000240000000010213402025764020440 0ustar kintelstaff000000000000000,0,0 2,0,0 2,2,0 0,2,0 0.5,0.5,0 1.5,0.5,0 1.5,1.5,0 0.5,1.5,0 openscad-2019.05/cgal/data/self-intersecting.polygon0000644000076500000240000000003413402025764022754 0ustar kintelstaff0000000000000010,10,0 0,10,0 0,0,0 -1,0,0 openscad-2019.05/cgal/data/tri.polygon0000644000076500000240000000002213402025764020122 0ustar kintelstaff000000000000000,0,0 2,0,0 2,2,0 openscad-2019.05/cgal/decompose.cpp0000644000076500000240000005327313437640540017507 0ustar kintelstaff00000000000000#include #include #include #include #include #include #include "cgalutils.h" #include "memory.h" #include "export.h" #include "polyset.h" #include "CGAL_Nef_polyhedron.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") using namespace CGALUtils; namespace fs = boost::filesystem; // Nef polyhedron are using CGAL_Kernel3 (Cartesian) // Triangulation will use Epick typedef CGAL::Epick K; typedef CGAL::Polyhedron_3 PolyhedronK; #include #include #include using namespace boost::assign; // bring 'operator+=()' into scope std::vector colors = boost::assign::list_of (Color4f(240, 248, 255)) (Color4f(250, 235, 215)) (Color4f(0, 255, 255)) (Color4f(127, 255, 212)) (Color4f(240, 255, 255)) (Color4f(245, 245, 220)) (Color4f(255, 228, 196)) (Color4f(0, 0, 0)) (Color4f(255, 235, 205)) (Color4f(0, 0, 255)) (Color4f(138, 43, 226)) (Color4f(165, 42, 42)) (Color4f(222, 184, 135)) (Color4f(95, 158, 160)) (Color4f(127, 255, 0)) (Color4f(210, 105, 30)) (Color4f(255, 127, 80)) (Color4f(100, 149, 237)) (Color4f(255, 248, 220)) (Color4f(220, 20, 60)) (Color4f(0, 255, 255)) (Color4f(0, 0, 139)) (Color4f(0, 139, 139)) (Color4f(184, 134, 11)) (Color4f(169, 169, 169)) (Color4f(0, 100, 0)) (Color4f(169, 169, 169)) (Color4f(189, 183, 107)) (Color4f(139, 0, 139)) (Color4f(85, 107, 47)) (Color4f(255, 140, 0)) (Color4f(153, 50, 204)) (Color4f(139, 0, 0)) (Color4f(233, 150, 122)) (Color4f(143, 188, 143)) (Color4f(72, 61, 139)) (Color4f(47, 79, 79)) (Color4f(47, 79, 79)) (Color4f(0, 206, 209)) (Color4f(148, 0, 211)) (Color4f(255, 20, 147)) (Color4f(0, 191, 255)) (Color4f(105, 105, 105)) (Color4f(105, 105, 105)) (Color4f(30, 144, 255)) (Color4f(178, 34, 34)) (Color4f(255, 250, 240)) (Color4f(34, 139, 34)) (Color4f(255, 0, 255)) (Color4f(220, 220, 220)) (Color4f(248, 248, 255)) (Color4f(255, 215, 0)) (Color4f(218, 165, 32)) (Color4f(128, 128, 128)) (Color4f(0, 128, 0)) (Color4f(173, 255, 47)) (Color4f(128, 128, 128)) (Color4f(240, 255, 240)) (Color4f(255, 105, 180)) (Color4f(205, 92, 92)) (Color4f(75, 0, 130)) (Color4f(255, 255, 240)) (Color4f(240, 230, 140)) (Color4f(230, 230, 250)) (Color4f(255, 240, 245)) (Color4f(124, 252, 0)) (Color4f(255, 250, 205)) (Color4f(173, 216, 230)) (Color4f(240, 128, 128)) (Color4f(224, 255, 255)) (Color4f(250, 250, 210)) (Color4f(211, 211, 211)) (Color4f(144, 238, 144)) (Color4f(211, 211, 211)) (Color4f(255, 182, 193)) (Color4f(255, 160, 122)) (Color4f(32, 178, 170)) (Color4f(135, 206, 250)) (Color4f(119, 136, 153)) (Color4f(119, 136, 153)) (Color4f(176, 196, 222)) (Color4f(255, 255, 224)) (Color4f(0, 255, 0)) (Color4f(50, 205, 50)) (Color4f(250, 240, 230)) (Color4f(255, 0, 255)) (Color4f(128, 0, 0)) (Color4f(102, 205, 170)) (Color4f(0, 0, 205)) (Color4f(186, 85, 211)) (Color4f(147, 112, 219)) (Color4f(60, 179, 113)) (Color4f(123, 104, 238)) (Color4f(0, 250, 154)) (Color4f(72, 209, 204)) (Color4f(199, 21, 133)) (Color4f(25, 25, 112)) (Color4f(245, 255, 250)) (Color4f(255, 228, 225)) (Color4f(255, 228, 181)) (Color4f(255, 222, 173)) (Color4f(0, 0, 128)) (Color4f(253, 245, 230)) (Color4f(128, 128, 0)) (Color4f(107, 142, 35)) (Color4f(255, 165, 0)) (Color4f(255, 69, 0)) (Color4f(218, 112, 214)) (Color4f(238, 232, 170)) (Color4f(152, 251, 152)) (Color4f(175, 238, 238)) (Color4f(219, 112, 147)) (Color4f(255, 239, 213)) (Color4f(255, 218, 185)) (Color4f(205, 133, 63)) (Color4f(255, 192, 203)) (Color4f(221, 160, 221)) (Color4f(176, 224, 230)) (Color4f(128, 0, 128)) (Color4f(255, 0, 0)) (Color4f(188, 143, 143)) (Color4f(65, 105, 225)) (Color4f(139, 69, 19)) (Color4f(250, 128, 114)) (Color4f(244, 164, 96)) (Color4f(46, 139, 87)) (Color4f(255, 245, 238)) (Color4f(160, 82, 45)) (Color4f(192, 192, 192)) (Color4f(135, 206, 235)) (Color4f(106, 90, 205)) (Color4f(112, 128, 144)) (Color4f(112, 128, 144)) (Color4f(255, 250, 250)) (Color4f(0, 255, 127)) (Color4f(70, 130, 180)) (Color4f(210, 180, 140)) (Color4f(0, 128, 128)) (Color4f(216, 191, 216)) (Color4f(255, 99, 71)) (Color4f(0, 0, 0, 0)) (Color4f(64, 224, 208)) (Color4f(238, 130, 238)) (Color4f(245, 222, 179)) (Color4f(255, 255, 255)) (Color4f(245, 245, 245)) (Color4f(255, 255, 0)) (Color4f(154, 205, 50)); #include #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") template bool is_weakly_convex(Polyhedron const& p) { for (typename Polyhedron::Edge_const_iterator i = p.edges_begin(); i != p.edges_end(); ++i) { typename Polyhedron::Plane_3 p(i->opposite()->vertex()->point(), i->vertex()->point(), i->next()->vertex()->point()); if (p.has_on_positive_side(i->opposite()->next()->vertex()->point()) && CGAL::squared_distance(p, i->opposite()->next()->vertex()->point()) > 1e-8) { return false; } } // Also make sure that there is only one shell: boost::unordered_set visited; // c++11 // visited.reserve(p.size_of_facets()); std::queue to_explore; to_explore.push(p.facets_begin()); // One arbitrary facet visited.insert(to_explore.front()); while (!to_explore.empty()) { typename Polyhedron::Facet_const_handle f = to_explore.front(); to_explore.pop(); typename Polyhedron::Facet::Halfedge_around_facet_const_circulator he, end; end = he = f->facet_begin(); CGAL_For_all(he,end) { typename Polyhedron::Facet_const_handle o = he->opposite()->facet(); if (!visited.count(o)) { visited.insert(o); to_explore.push(o); } } } return visited.size() == p.size_of_facets(); } class Shell_explorer { public: std::vector vertices; Shell_explorer() {} void visit(CGAL_Nef_polyhedron3::Vertex_const_handle v) { vertices.push_back(K::Point_3(to_double(v->point()[0]), to_double(v->point()[1]), to_double(v->point()[2]))); } void visit(CGAL_Nef_polyhedron3::Halfedge_const_handle ) {} void visit(CGAL_Nef_polyhedron3::Halffacet_const_handle ) {} void visit(CGAL_Nef_polyhedron3::SHalfedge_const_handle ) {} void visit(CGAL_Nef_polyhedron3::SHalfloop_const_handle ) {} void visit(CGAL_Nef_polyhedron3::SFace_const_handle ) {} }; template void decompose(const CGAL_Nef_polyhedron3 *N, Output out_iter) { int parts = 0; assert(N); CGAL_Polyhedron poly; if (N->is_simple()) { nefworkaround::convert_to_Polyhedron(*N, poly); } if (is_weakly_convex(poly)) { PRINTD("Minkowski: Object is convex and Nef"); PolyhedronK poly2; CGALUtils::copyPolyhedron(poly, poly2); *out_iter++ = poly2; return; } else { PRINTD("Minkowski: Object is nonconvex Nef, decomposing..."); CGAL_Nef_polyhedron3 decomposed_nef = *N; CGAL::convex_decomposition_3(decomposed_nef); // the first volume is the outer volume, which ignored in the decomposition CGAL_Nef_polyhedron3::Volume_const_iterator ci = ++decomposed_nef.volumes_begin(); // Convert each convex volume to a Polyhedron for(; ci != decomposed_nef.volumes_end(); ++ci) { if(ci->mark()) { // CGAL_Polyhedron poly; // decomposed_nef.convert_inner_shell_to_polyhedron(ci->shells_begin(), poly); // P.push_back(poly); auto s = CGAL_Nef_polyhedron3::SFace_const_handle(ci->shells_begin()); CGAL_Nef_polyhedron3::SFace_const_iterator sf = ci->shells_begin(); Shell_explorer SE; decomposed_nef.visit_shell_objects(CGAL_Nef_polyhedron3::SFace_const_handle(sf),SE); PolyhedronK poly; CGAL::convex_hull_3(SE.vertices.begin(), SE.vertices.end(), poly); *out_iter++ = poly; parts++; } } PRINTDB("Minkowski: decomposed into %d convex parts", parts); } } Geometry const * minkowskitest(const Geometry::Geometries &children) { CGAL::Timer t,t_tot; assert(children.size() >= 2); // Iterate over children, perform pairwise minkowski on children: // operands = [ch, ch+1] Geometry::Geometries::const_iterator minkowski_ch_it = children.begin(); t_tot.start(); Geometry const *operands[2] = {minkowski_ch_it->second.get(), NULL}; try { while (++minkowski_ch_it != children.end()) { operands[1] = minkowski_ch_it->second.get(); std::vector convexP[2]; // Stores decomposed operands std::list result_parts; for (int i = 0; i < 2; i++) { shared_ptr N; if (const PolySet *ps = dynamic_cast(operands[i])) { if (ps->is_convex()) { PRINTDB("Minkowski: child %d is convex and PolySet", i); PolyhedronK poly; CGALUtils::createPolyhedronFromPolySet(*ps, poly); convexP[i].push_back(poly); } else { PRINTDB("Minkowski: child %d is nonconvex PolySet, transforming to Nef", i); N.reset(createNefPolyhedronFromGeometry(*ps)); } } else if (const CGAL_Nef_polyhedron *n = dynamic_cast(operands[i])) { CGAL_Polyhedron poly; if (n->p3->is_simple()) { nefworkaround::convert_to_Polyhedron(*n->p3, poly); // FIXME: Can we calculate weakly_convex on a PolyhedronK instead? if (is_weakly_convex(poly)) { PRINTDB("Minkowski: child %d is convex and Nef", i); PolyhedronK poly2; CGALUtils::copyPolyhedron(poly, poly2); convexP[i].push_back(poly2); } else { PRINTDB("Minkowski: child %d is nonconvex Nef",i); N.reset(n); } } else throw 0; // We cannot handle this, fall back to CGAL's minkowski } // If not convex... if (N && N->p3) { PRINTD("Decomposing..."); decompose(N->p3.get(), std::back_inserter(convexP[i])); } PRINTD("Hulling convex parts..."); std::vector points[2]; std::vector minkowski_points; // For each permutation of convex operands.. BOOST_FOREACH(const PolyhedronK &p0, convexP[0]) { BOOST_FOREACH(const PolyhedronK &p1, convexP[1]) { t.start(); // Create minkowski pointcloud minkowski_points.clear(); minkowski_points.reserve(p0.size_of_vertices() * p0.size_of_vertices()); BOOST_FOREACH(const K::Point_3 &p0p, std::make_pair(p0.points_begin(), p0.points_end())) { BOOST_FOREACH(const K::Point_3 &p1p, std::make_pair(p1.points_begin(), p1.points_end())) { minkowski_points.push_back(p0p+(p1p-CGAL::ORIGIN)); } } t.stop(); // Ignore empty volumes if (minkowski_points.size() <= 3) continue; // Hull point cloud PolyhedronK result; PRINTDB("Minkowski: Point cloud creation (%d ⨉ %d -> %d) took %f ms", points[0].size() % points[1].size() % minkowski_points.size() % (t.time()*1000)); t.reset(); t.start(); CGAL::convex_hull_3(minkowski_points.begin(), minkowski_points.end(), result); std::vector strict_points; strict_points.reserve(minkowski_points.size()); for (PolyhedronK::Vertex_iterator i = result.vertices_begin(); i != result.vertices_end(); ++i) { K::Point_3 const &p = i->point(); PolyhedronK::Vertex::Halfedge_handle h,e; h = i->halfedge(); e = h; bool collinear = false; bool coplanar = true; do { K::Point_3 const& q = h->opposite()->vertex()->point(); if (coplanar && !CGAL::coplanar(p,q, h->next_on_vertex()->opposite()->vertex()->point(), h->next_on_vertex()->next_on_vertex()->opposite()->vertex()->point())) { coplanar = false; } for (PolyhedronK::Vertex::Halfedge_handle j = h->next_on_vertex(); j != h && !collinear && ! coplanar; j = j->next_on_vertex()) { K::Point_3 const& r = j->opposite()->vertex()->point(); if (CGAL::collinear(p,q,r)) { collinear = true; } } h = h->next_on_vertex(); } while (h != e && !collinear); if (!collinear && !coplanar) strict_points.push_back(p); } result.clear(); CGAL::convex_hull_3(strict_points.begin(), strict_points.end(), result); t.stop(); PRINTDB("Minkowski: Computing convex hull took %f s", t.time()); t.reset(); result_parts.push_back(result); } } } if (minkowski_ch_it != boost::next(children.begin())) delete operands[0]; if (result_parts.size() == 1) { PolySet *ps = new PolySet(3,true); createPolySetFromPolyhedron(*result_parts.begin(), *ps); operands[0] = ps; } else if (!result_parts.empty()) { t.start(); PRINTDB("Minkowski: Computing union of %d parts",result_parts.size()); Geometry::Geometries fake_children; for (const auto &polyhedron : result_parts) { PolySet ps(3,true); createPolySetFromPolyhedron(polyhedron, ps); fake_children.push_back(std::make_pair((const AbstractNode*)NULL, shared_ptr(createNefPolyhedronFromGeometry(ps)))); } CGAL_Nef_polyhedron *N = CGALUtils::applyOperator(fake_children, OPENSCAD_UNION); t.stop(); if (N) PRINTDB("Minkowski: Union done: %f s",t.time()); else PRINTDB("Minkowski: Union failed: %f s",t.time()); t.reset(); operands[0] = N; } else { operands[0] = new CGAL_Nef_polyhedron(); } } t_tot.stop(); PRINTDB("Minkowski: Total execution time %f s", t_tot.time()); t_tot.reset(); return operands[0]; } catch (...) { // If anything throws we simply fall back to Nef Minkowski PRINTD("Minkowski: Falling back to Nef Minkowski"); CGAL_Nef_polyhedron *N = applyOperator(children, OPENSCAD_MINKOWSKI); return N; } } #define STL_FACET_NUMBYTES 4*3*4+2 // as there is no 'float32_t' standard, we assume the systems 'float' // is a 'binary32' aka 'single' standard IEEE 32-bit floating point type union stl_facet { uint8_t data8[ STL_FACET_NUMBYTES ]; uint32_t data32[4*3]; struct facet_data { float i, j, k; float x1, y1, z1; float x2, y2, z2; float x3, y3, z3; uint16_t attribute_byte_count; } data; }; void uint32_byte_swap( uint32_t &x ) { #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 x = __builtin_bswap32( x ); #elif defined(__clang__) x = __builtin_bswap32( x ); #elif defined(_MSC_VER) x = _byteswap_ulong( x ); #else uint32_t b1 = ( 0x000000FF & x ) << 24; uint32_t b2 = ( 0x0000FF00 & x ) << 8; uint32_t b3 = ( 0x00FF0000 & x ) >> 8; uint32_t b4 = ( 0xFF000000 & x ) >> 24; x = b1 | b2 | b3 | b4; #endif } void read_stl_facet( std::ifstream &f, stl_facet &facet ) { f.read( (char*)facet.data8, STL_FACET_NUMBYTES ); #ifdef BOOST_BIG_ENDIAN for ( int i = 0; i < 12; i++ ) { uint32_byte_swap( facet.data32[ i ] ); } // we ignore attribute byte count #endif } PolySet *import_stl(const std::string &filename) { PolySet *p = new PolySet(3); // Open file and position at the end std::ifstream f(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate); if (!f.good()) { PRINTB("WARNING: Can't open import file '%s'.", filename); return NULL; } boost::regex ex_sfe("solid|facet|endloop"); boost::regex ex_outer("outer loop"); boost::regex ex_vertex("vertex"); boost::regex ex_vertices("\\s*vertex\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)"); bool binary = false; std::streampos file_size = f.tellg(); f.seekg(80); if (f.good() && !f.eof()) { uint32_t facenum = 0; f.read((char *)&facenum, sizeof(uint32_t)); #ifdef BOOST_BIG_ENDIAN uint32_byte_swap( facenum ); #endif if (file_size == static_cast(80 + 4 + 50*facenum)) { binary = true; } } f.seekg(0); char data[5]; f.read(data, 5); if (!binary && !f.eof() && f.good() && !memcmp(data, "solid", 5)) { int i = 0; double vdata[3][3]; std::string line; std::getline(f, line); while (!f.eof()) { std::getline(f, line); boost::trim(line); if (boost::regex_search(line, ex_sfe)) { continue; } if (boost::regex_search(line, ex_outer)) { i = 0; continue; } boost::smatch results; if (boost::regex_search(line, results, ex_vertices)) { try { for (int v=0;v<3;v++) { vdata[i][v] = boost::lexical_cast(results[v+1]); } } catch (const boost::bad_lexical_cast &blc) { PRINTB("WARNING: Can't parse vertex line '%s'.", line); i = 10; continue; } if (++i == 3) { p->append_poly(); p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]); p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]); p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]); } } } } else if (binary && !f.eof() && f.good()) { f.ignore(80-5+4); while (1) { stl_facet facet; read_stl_facet( f, facet ); if (f.eof()) break; p->append_poly(); p->append_vertex(facet.data.x1, facet.data.y1, facet.data.z1); p->append_vertex(facet.data.x2, facet.data.y2, facet.data.z2); p->append_vertex(facet.data.x3, facet.data.y3, facet.data.z3); } } return p; } /*! file format: 1. polygon coordinates (x,y,z) are comma separated (+/- spaces) and each coordinate is on a separate line 2. each polygon is separated by one or more blank lines */ bool import_polygon(PolyholeK &polyhole, const std::string &filename) { std::ifstream ifs(filename.c_str()); if (!ifs) return false; std::string line; PolygonK polygon; while (std::getline(ifs, line)) { std::stringstream ss(line); double X = 0.0, Y = 0.0, Z = 0.0; if (!(ss >> X)) { //ie blank lines => flag start of next polygon if (polygon.size() > 0) polyhole.push_back(polygon); polygon.clear(); continue; } char c = ss.peek(); while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces before comma if (c == ',') {ss.read(&c, 1); c = ss.peek();} //gobble comma while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces after comma if (!(ss >> Y)) { std::cerr << "Y error\n"; return false; } c = ss.peek(); while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces before comma if (c == ',') {ss.read(&c, 1); c = ss.peek();} //gobble comma while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces after comma if (!(ss >> Z)) { std::cerr << "Z error\n"; return false; } polygon.push_back(Vertex3K(X, Y, Z)); } if (polygon.size() > 0) polyhole.push_back(polygon); ifs.close(); return true; } //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { OpenSCAD::debug = "decompose"; PolySet *ps = NULL; CGAL_Nef_polyhedron *N = NULL; if (argc == 2) { std::string filename(argv[1]); std::string suffix = fs::path(filename).extension().generic_string(); if (suffix == ".stl") { if (!(ps = import_stl(filename))) { std::cerr << "Error importing STL " << filename << std::endl; exit(1); } std::cerr << "Imported " << ps->numPolygons() << " polygons" << std::endl; } else if (suffix == ".nef3") { N = new CGAL_Nef_polyhedron(new CGAL_Nef_polyhedron3); std::ifstream stream(filename.c_str()); stream >> *N->p3; std::cerr << "Imported Nef polyhedron" << std::endl; } } else { std::cerr << "Usage: " << argv[0] << " " << std::endl; exit(1); } if (ps && !N) N = createNefPolyhedronFromGeometry(*ps); std::vector result; decompose(N->p3.get(), std::back_inserter(result)); std::cerr << "Decomposed into " << result.size() << " convex parts" << std::endl; int idx = 0; BOOST_FOREACH(const PolyhedronK &P, result) { PolySet *result_ps = new PolySet(3); if (CGALUtils::createPolySetFromPolyhedron(P, *result_ps)) { std::cerr << "Error converting to PolySet\n"; } else { std::stringstream ss; ss << "out" << idx++ << ".stl"; exportFileByName(shared_ptr(result_ps), OPENSCAD_STL, ss.str().c_str(), ss.str().c_str()); std::cout << "color([" << colors[idx%147][0] << "," << colors[idx%147][1] << "," << colors[idx%147][2] << "]) " << "import(\"" << ss.str() << "\");\n"; } } std::cerr << "Done." << std::endl; } openscad-2019.05/cgal/decompose.pro0000644000076500000240000001040313402025764017506 0ustar kintelstaff00000000000000CONFIG += debug CONFIG -= qt debug: DEFINES += DEBUG TEMPLATE = app INCLUDEPATH += ../src ../src/libtess2/Include DEPENDPATH += ../src # Handle custom library location. # Used when manually installing 3rd party libraries isEmpty(OPENSCAD_LIBDIR) OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) macx:isEmpty(OPENSCAD_LIBDIR) { exists(/opt/local):exists(/usr/local/Cellar) { error("It seems you might have libraries in both /opt/local and /usr/local. Please specify which one to use with qmake OPENSCAD_LIBDIR=") } else { exists(/opt/local) { #Default to MacPorts on Mac OS X message("Automatically searching for libraries in /opt/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /opt/local } else:exists(/usr/local/Cellar) { message("Automatically searching for libraries in /usr/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /usr/local } } } !isEmpty(OPENSCAD_LIBDIR) { QMAKE_INCDIR = $$OPENSCAD_LIBDIR/include QMAKE_LIBDIR = $$OPENSCAD_LIBDIR/lib } TARGET = decompose mac { CONFIG -= app_bundle } macx { # Mac needs special care to link against the correct C++ library # We attempt to auto-detect it by inspecting Boost dirs = $${BOOSTDIR} $${QMAKE_LIBDIR} for(dir, dirs) { system(grep -q __112basic_string $${dir}/libboost_thread* >& /dev/null) { message("Detected libc++-linked boost in $${dir}") CONFIG += libc++ } } libc++ { QMAKE_CXXFLAGS += -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++ QMAKE_OBJECTIVE_CFLAGS += -stdlib=libc++ # libc++ on requires Mac OS X 10.7+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 } } *g++* { # See Dec 2011 OpenSCAD mailing list, re: CGAL/GCC bugs. QMAKE_CXXFLAGS *= -fno-strict-aliasing QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs # ignored before 4.8 # use of 'auto' QMAKE_CXXFLAGS += -std=c++11 } *clang* { # http://llvm.org/bugs/show_bug.cgi?id=9182 QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual # disable enormous amount of warnings about CGAL / boost / etc QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-variable QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-function QMAKE_CXXFLAGS_WARN_ON += -Wno-c++11-extensions # might want to actually turn this on once in a while QMAKE_CXXFLAGS_WARN_ON += -Wno-sign-compare } # Application configuration CONFIG += cgal CONFIG += boost CONFIG += eigen CONFIG += gettext mac: { LIBS += -framework OpenGL } else { LIBS += -lGL } include(../common.pri) HEADERS += ../src/cgal.h \ ../src/cgalutils.h \ ../src/linalg.h \ ../src/grid.h \ ../src/hash.h \ ../src/polyset.h \ ../src/polyset-utils.h \ ../src/printutils.h \ ../src/GeometryUtils.h \ ../src/libtess2/Include/tesselator.h \ ../src/libtess2/Source/bucketalloc.h \ ../src/libtess2/Source/dict.h \ ../src/libtess2/Source/geom.h \ ../src/libtess2/Source/mesh.h \ ../src/libtess2/Source/priorityq.h \ ../src/libtess2/Source/sweep.h \ ../src/libtess2/Source/tess.h SOURCES += decompose.cpp \ ../src/polygon2d.cc \ ../src/polygon2d-CGAL.cc \ ../src/CGAL_Nef_polyhedron.cc \ ../src/cgalutils.cc \ ../src/cgalutils-applyops.cc \ ../src/cgalutils-tess.cc \ ../src/cgalutils-polyhedron.cc \ ../src/polyset.cc \ ../src/polyset-gl.cc \ ../src/GeometryUtils.cc \ ../src/svg.cc \ ../src/hash.cc \ ../src/node.cc \ ../src/export.cc \ ../src/export_stl.cc \ ../src/export_amf.cc \ ../src/export_off.cc \ ../src/export_dxf.cc \ ../src/export_svg.cc \ ../src/export_nef.cc \ ../src/polyset-utils.cc \ ../src/progress.cc \ ../src/printutils.cc \ ../src/libtess2/Source/bucketalloc.c \ ../src/libtess2/Source/dict.c \ ../src/libtess2/Source/geom.c \ ../src/libtess2/Source/mesh.c \ ../src/libtess2/Source/priorityq.c \ ../src/libtess2/Source/sweep.c \ ../src/libtess2/Source/tess.c openscad-2019.05/cgal/export_nef.cpp0000644000076500000240000001153113437640540017671 0ustar kintelstaff00000000000000#include #include #include #include #include #include #include #include "cgalutils.h" #include "export.h" #include "polyset.h" #include "CGAL_Nef_polyhedron.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") using namespace CGALUtils; namespace fs=boost::fileystem; #define STL_FACET_NUMBYTES 4*3*4+2 // as there is no 'float32_t' standard, we assume the systems 'float' // is a 'binary32' aka 'single' standard IEEE 32-bit floating point type union stl_facet { uint8_t data8[ STL_FACET_NUMBYTES ]; uint32_t data32[4*3]; struct facet_data { float i, j, k; float x1, y1, z1; float x2, y2, z2; float x3, y3, z3; uint16_t attribute_byte_count; } data; }; void uint32_byte_swap( uint32_t &x ) { #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 x = __builtin_bswap32( x ); #elif defined(__clang__) x = __builtin_bswap32( x ); #elif defined(_MSC_VER) x = _byteswap_ulong( x ); #else uint32_t b1 = ( 0x000000FF & x ) << 24; uint32_t b2 = ( 0x0000FF00 & x ) << 8; uint32_t b3 = ( 0x00FF0000 & x ) >> 8; uint32_t b4 = ( 0xFF000000 & x ) >> 24; x = b1 | b2 | b3 | b4; #endif } void read_stl_facet( std::ifstream &f, stl_facet &facet ) { f.read( (char*)facet.data8, STL_FACET_NUMBYTES ); #ifdef BOOST_BIG_ENDIAN for ( int i = 0; i < 12; i++ ) { uint32_byte_swap( facet.data32[ i ] ); } // we ignore attribute byte count #endif } PolySet *import_stl(const std::string &filename) { PolySet *p = new PolySet(3); // Open file and position at the end std::ifstream f(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate); if (!f.good()) { PRINTB("WARNING: Can't open import file '%s'.", filename); return NULL; } boost::regex ex_sfe("solid|facet|endloop"); boost::regex ex_outer("outer loop"); boost::regex ex_vertex("vertex"); boost::regex ex_vertices("\\s*vertex\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)"); bool binary = false; std::streampos file_size = f.tellg(); f.seekg(80); if (f.good() && !f.eof()) { uint32_t facenum = 0; f.read((char *)&facenum, sizeof(uint32_t)); #ifdef BOOST_BIG_ENDIAN uint32_byte_swap( facenum ); #endif if (file_size == static_cast(80 + 4 + 50*facenum)) { binary = true; } } f.seekg(0); char data[5]; f.read(data, 5); if (!binary && !f.eof() && f.good() && !memcmp(data, "solid", 5)) { int i = 0; double vdata[3][3]; std::string line; std::getline(f, line); while (!f.eof()) { std::getline(f, line); boost::trim(line); if (boost::regex_search(line, ex_sfe)) { continue; } if (boost::regex_search(line, ex_outer)) { i = 0; continue; } boost::smatch results; if (boost::regex_search(line, results, ex_vertices)) { try { for (int v=0;v<3;v++) { vdata[i][v] = boost::lexical_cast(results[v+1]); } } catch (const boost::bad_lexical_cast &blc) { PRINTB("WARNING: Can't parse vertex line '%s'.", line); i = 10; continue; } if (++i == 3) { p->append_poly(); p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]); p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]); p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]); } } } } else if (binary && !f.eof() && f.good()) { f.ignore(80-5+4); while (1) { stl_facet facet; read_stl_facet( f, facet ); if (f.eof()) break; p->append_poly(); p->append_vertex(facet.data.x1, facet.data.y1, facet.data.z1); p->append_vertex(facet.data.x2, facet.data.y2, facet.data.z2); p->append_vertex(facet.data.x3, facet.data.y3, facet.data.z3); } } return p; } int main(int argc, char *argv[]) { OpenSCAD::debug = "export_nef"; CGAL_Nef_polyhedron *N = NULL; PolySet *ps = NULL; if (argc == 2) { std::string filename(argv[1]); std::string suffix = filename.extension().generic_string(); boost::algorithm::to_lower(suffix); if (suffix == ".stl") { if (!(ps = import_stl(filename))) { std::cerr << "Error importing STL " << argv[1] << std::endl; exit(1); } std::cerr << "Imported " << ps->numPolygons() << " polygons" << std::endl; } else if (suffix == ".nef3") { N = new CGAL_Nef_polyhedron(new CGAL_Nef_polyhedron3); std::ifstream stream(filename.c_str()); stream >> *N->p3; std::cerr << "Imported Nef polyhedron" << std::endl; } } else { std::cerr << "Usage: " << argv[0] << " " << std::endl; exit(1); } if (ps && !N) N = createNefPolyhedronFromGeometry(*ps); export_stl(N, std::cout); std::cerr << "Done." << std::endl; } openscad-2019.05/cgal/export_nef.pro0000644000076500000240000000766513402025764017721 0ustar kintelstaff00000000000000CONFIG += debug CONFIG -= qt debug: DEFINES += DEBUG TEMPLATE = app INCLUDEPATH += ../src ../src/libtess2/Include DEPENDPATH += ../src # Handle custom library location. # Used when manually installing 3rd party libraries isEmpty(OPENSCAD_LIBDIR) OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) macx:isEmpty(OPENSCAD_LIBDIR) { exists(/opt/local):exists(/usr/local/Cellar) { error("It seems you might have libraries in both /opt/local and /usr/local. Please specify which one to use with qmake OPENSCAD_LIBDIR=") } else { exists(/opt/local) { #Default to MacPorts on Mac OS X message("Automatically searching for libraries in /opt/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /opt/local } else:exists(/usr/local/Cellar) { message("Automatically searching for libraries in /usr/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /usr/local } } } !isEmpty(OPENSCAD_LIBDIR) { QMAKE_INCDIR = $$OPENSCAD_LIBDIR/include QMAKE_LIBDIR = $$OPENSCAD_LIBDIR/lib } TARGET = export_nef mac { CONFIG -= app_bundle } macx { # Mac needs special care to link against the correct C++ library # We attempt to auto-detect it by inspecting Boost dirs = $${BOOSTDIR} $${QMAKE_LIBDIR} for(dir, dirs) { system(grep -q __112basic_string $${dir}/libboost_thread* >& /dev/null) { message("Detected libc++-linked boost in $${dir}") CONFIG += libc++ } } libc++ { QMAKE_CXXFLAGS += -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++ QMAKE_OBJECTIVE_CFLAGS += -stdlib=libc++ # libc++ on requires Mac OS X 10.7+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 } } # See Dec 2011 OpenSCAD mailing list, re: CGAL/GCC bugs. *g++* { QMAKE_CXXFLAGS *= -fno-strict-aliasing QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs # ignored before 4.8 } *clang* { # http://llvm.org/bugs/show_bug.cgi?id=9182 QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual # disable enormous amount of warnings about CGAL / boost / etc QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-variable QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-function QMAKE_CXXFLAGS_WARN_ON += -Wno-c++11-extensions # might want to actually turn this on once in a while QMAKE_CXXFLAGS_WARN_ON += -Wno-sign-compare } # Application configuration CONFIG += cgal CONFIG += boost CONFIG += eigen CONFIG += gettext mac: { LIBS += -framework OpenGL } include(../common.pri) HEADERS += ../src/cgal.h \ ../src/cgalutils.h \ ../src/linalg.h \ ../src/grid.h \ ../src/polyset.h \ ../src/polyset-utils.h \ ../src/printutils.h \ ../src/GeometryUtils.h \ ../src/libtess2/Include/tesselator.h \ ../src/libtess2/Source/bucketalloc.h \ ../src/libtess2/Source/dict.h \ ../src/libtess2/Source/geom.h \ ../src/libtess2/Source/mesh.h \ ../src/libtess2/Source/priorityq.h \ ../src/libtess2/Source/sweep.h \ ../src/libtess2/Source/tess.h SOURCES += export_nef.cpp \ ../src/polygon2d.cc \ ../src/polygon2d-CGAL.cc \ ../src/CGAL_Nef_polyhedron.cc \ ../src/cgalutils.cc \ ../src/cgalutils-applyops.cc \ ../src/cgalutils-tess.cc \ ../src/cgalutils-polyhedron.cc \ ../src/polyset.cc \ ../src/polyset-gl.cc \ ../src/GeometryUtils.cc \ ../src/svg.cc \ ../src/node.cc \ ../src/export.cc \ ../src/polyset-utils.cc \ ../src/progress.cc \ ../src/printutils.cc \ ../src/libtess2/Source/bucketalloc.c \ ../src/libtess2/Source/dict.c \ ../src/libtess2/Source/geom.c \ ../src/libtess2/Source/mesh.c \ ../src/libtess2/Source/priorityq.c \ ../src/libtess2/Source/sweep.c \ ../src/libtess2/Source/tess.c openscad-2019.05/cgal/polyhole-tessellator-libtess2.cpp0000644000076500000240000001304013402025764023431 0ustar kintelstaff00000000000000#include #include #include #include #include #include #include #include "GeometryUtils.h" #include "Reindexer.h" #include "linalg.h" #include "grid.h" #include "printutils.h" static void export_stl(const IndexedTriangleMesh &trimesh, std::ostream &output) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output output << "solid OpenSCAD_Model\n"; const Vector3f *verts = &trimesh.vertices.front(); BOOST_FOREACH(const IndexedTriangle &t, trimesh.triangles) { assert(t[0] < trimesh.vertices.size()); assert(t[1] < trimesh.vertices.size()); assert(t[2] < trimesh.vertices.size()); Vector3f p[3]; p[0] = verts[t[0]]; p[1] = verts[t[1]]; p[2] = verts[t[2]]; std::stringstream stream; stream << p[0][0] << " " << p[0][1] << " " << p[0][2]; std::string vs1 = stream.str(); stream.str(""); stream << p[1][0] << " " << p[1][1] << " " << p[1][2]; std::string vs2 = stream.str(); stream.str(""); stream << p[2][0] << " " << p[2][1] << " " << p[2][2]; std::string vs3 = stream.str(); // if (vs1 != vs2 && vs1 != vs3 && vs2 != vs3) { // The above condition ensures that there are 3 distinct vertices, but // they may be collinear. If they are, the unit normal is meaningless // so the default value of "1 0 0" can be used. If the vertices are not // collinear then the unit normal must be calculated from the // components. Vector3f normal = (p[1] - p[0]).cross(p[2] - p[0]); normal.normalize(); output << " facet normal " << normal[0] << " " << normal[1] << " " << normal[2] << "\n"; output << " outer loop\n"; for (int i=0;i<3;i++) { output << " vertex " << p[i][0] << " " << p[i][1] << " " << p[i][2] << "\n"; } output << " endloop\n"; output << " endfacet\n"; // } } output << "endsolid OpenSCAD_Model\n"; setlocale(LC_NUMERIC, ""); // Set default locale } /*! file format: 1. polygon coordinates (x,y,z) are comma separated (+/- spaces) and each coordinate is on a separate line 2. each polygon is separated by one or more blank lines */ bool import_polygon(IndexedPolygons &polyhole, const std::string &filename) { Reindexer uniqueVertices; std::ifstream ifs(filename.c_str()); if (!ifs) return false; std::string line; IndexedFace polygon; while (std::getline(ifs, line)) { std::stringstream ss(line); double X = 0.0, Y = 0.0, Z = 0.0; if (!(ss >> X)) { //ie blank lines => flag start of next polygon if (polygon.size() > 0) polyhole.faces.push_back(polygon); polygon.clear(); continue; } char c = ss.peek(); while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces before comma if (c == ',') {ss.read(&c, 1); c = ss.peek();} //gobble comma while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces after comma if (!(ss >> Y)) { std::cerr << "Y error\n"; return false; } c = ss.peek(); while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces before comma if (c == ',') {ss.read(&c, 1); c = ss.peek();} //gobble comma while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces after comma if (!(ss >> Z)) { std::cerr << "Z error\n"; return false; } polygon.push_back(uniqueVertices.lookup(Vector3f(X, Y, Z))); } if (polygon.size() > 0) polyhole.faces.push_back(polygon); ifs.close(); uniqueVertices.copy(std::back_inserter(polyhole.vertices)); return true; } int main(int argc, char *argv[]) { OpenSCAD::debug = "GeometryUtils"; IndexedPolygons polyhole; Vector3f *normal = NULL; if (argc >= 2) { if (!import_polygon(polyhole, argv[1])) { std::cerr << "Error importing polygon" << std::endl; exit(1); } std::cerr << "Imported " << polyhole.faces.size() << " polygons" << std::endl; if (argc == 3) { std::vector strs; std::vector normalvec; std::string arg(argv[2]); boost::split(strs, arg, boost::is_any_of(",")); assert(strs.size() == 3); BOOST_FOREACH(const std::string &s, strs) normalvec.push_back(boost::lexical_cast(s)); normal = new Vector3f(normalvec[0], normalvec[1], normalvec[2]); } } else { //construct two non-intersecting nested polygons Reindexer uniqueVertices; IndexedFace polygon1; polygon1.push_back(uniqueVertices.lookup(Vector3f(0,0,0))); polygon1.push_back(uniqueVertices.lookup(Vector3f(2,0,0))); polygon1.push_back(uniqueVertices.lookup(Vector3f(2,2,0))); polygon1.push_back(uniqueVertices.lookup(Vector3f(0,2,0))); IndexedFace polygon2; polygon2.push_back(uniqueVertices.lookup(Vector3f(0.5,0.5,0))); polygon2.push_back(uniqueVertices.lookup(Vector3f(1.5,0.5,0))); polygon2.push_back(uniqueVertices.lookup(Vector3f(1.5,1.5,0))); polygon2.push_back(uniqueVertices.lookup(Vector3f(0.5,1.5,0))); polyhole.faces.push_back(polygon1); polyhole.faces.push_back(polygon2); uniqueVertices.copy(std::back_inserter(polyhole.vertices)); } std::vector triangles; bool ok = GeometryUtils::tessellatePolygonWithHoles(&polyhole.vertices.front(), polyhole.faces, triangles, normal); std::cerr << "Tessellated into " << triangles.size() << " triangles" << std::endl; IndexedTriangleMesh trimesh; trimesh.vertices = polyhole.vertices; trimesh.triangles = triangles; export_stl(trimesh, std::cout); } openscad-2019.05/cgal/polyhole-tessellator-libtess2.pro0000644000076500000240000000650313402025764023455 0ustar kintelstaff00000000000000debug: DEFINES += DEBUG TEMPLATE = app INCLUDEPATH += ../src ../src/libtess2/Include DEPENDPATH += ../src # Handle custom library location. # Used when manually installing 3rd party libraries isEmpty(OPENSCAD_LIBDIR) OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) macx:isEmpty(OPENSCAD_LIBDIR) { exists(/opt/local):exists(/usr/local/Cellar) { error("It seems you might have libraries in both /opt/local and /usr/local. Please specify which one to use with qmake OPENSCAD_LIBDIR=") } else { exists(/opt/local) { #Default to MacPorts on Mac OS X message("Automatically searching for libraries in /opt/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /opt/local } else:exists(/usr/local/Cellar) { message("Automatically searching for libraries in /usr/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /usr/local } } } !isEmpty(OPENSCAD_LIBDIR) { QMAKE_INCDIR = $$OPENSCAD_LIBDIR/include QMAKE_LIBDIR = $$OPENSCAD_LIBDIR/lib } TARGET = polyhole-tessellator-libtess2 CONFIG -= qt mac { CONFIG -= app_bundle } macx { # Mac needs special care to link against the correct C++ library # We attempt to auto-detect it by inspecting Boost dirs = $${BOOSTDIR} $${QMAKE_LIBDIR} for(dir, dirs) { system(grep -q __112basic_string $${dir}/libboost_thread* >& /dev/null) { message("Detected libc++-linked boost in $${dir}") CONFIG += libc++ } } libc++ { QMAKE_CXXFLAGS += -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++ QMAKE_OBJECTIVE_CFLAGS += -stdlib=libc++ # libc++ on requires Mac OS X 10.7+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 } } # See Dec 2011 OpenSCAD mailing list, re: CGAL/GCC bugs. *g++* { QMAKE_CXXFLAGS *= -fno-strict-aliasing QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs # ignored before 4.8 } *clang* { # http://llvm.org/bugs/show_bug.cgi?id=9182 QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual # disable enormous amount of warnings about CGAL / boost / etc QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-variable QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-function QMAKE_CXXFLAGS_WARN_ON += -Wno-c++11-extensions # might want to actually turn this on once in a while QMAKE_CXXFLAGS_WARN_ON += -Wno-format-security } # Application configuration CONFIG += cgal CONFIG += boost CONFIG += eigen CONFIG += gettext include(../common.pri) HEADERS += ../src/GeometryUtils.cc \ ../src/linalg.h \ ../src/printutils.h \ ../src/grid.h \ ../src/libtess2/Include/tesselator.h \ ../src/libtess2/Source/bucketalloc.h \ ../src/libtess2/Source/dict.h \ ../src/libtess2/Source/geom.h \ ../src/libtess2/Source/mesh.h \ ../src/libtess2/Source/priorityq.h \ ../src/libtess2/Source/sweep.h \ ../src/libtess2/Source/tess.h SOURCES += polyhole-tessellator-libtess2.cpp \ ../src/GeometryUtils.cc \ ../src/printutils.cc \ ../src/libtess2/Source/bucketalloc.c \ ../src/libtess2/Source/dict.c \ ../src/libtess2/Source/geom.c \ ../src/libtess2/Source/mesh.c \ ../src/libtess2/Source/priorityq.c \ ../src/libtess2/Source/sweep.c \ ../src/libtess2/Source/tess.c openscad-2019.05/cgal/polyhole-tessellator.cpp0000644000076500000240000001125413402025764021711 0ustar kintelstaff00000000000000#include #include #include #include #include #include "cgalutils.h" // Nef polyhedron are using CGAL_Kernel3 (Cartesian) // Triangulation will use Epick static void export_stl(const Polygons &triangles, std::ostream &output) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output output << "solid OpenSCAD_Model\n"; BOOST_FOREACH(const Polygon &p, triangles) { assert(p.size() == 3); // STL only allows triangles std::stringstream stream; stream << p[0][0] << " " << p[0][1] << " " << p[0][2]; std::string vs1 = stream.str(); stream.str(""); stream << p[1][0] << " " << p[1][1] << " " << p[1][2]; std::string vs2 = stream.str(); stream.str(""); stream << p[2][0] << " " << p[2][1] << " " << p[2][2]; std::string vs3 = stream.str(); if (vs1 != vs2 && vs1 != vs3 && vs2 != vs3) { // The above condition ensures that there are 3 distinct vertices, but // they may be collinear. If they are, the unit normal is meaningless // so the default value of "1 0 0" can be used. If the vertices are not // collinear then the unit normal must be calculated from the // components. Vector3d normal = (p[1] - p[0]).cross(p[2] - p[0]); normal.normalize(); output << " facet normal " << normal[0] << " " << normal[1] << " " << normal[2] << "\n"; output << " outer loop\n"; BOOST_FOREACH(const Vector3d &v, p) { output << " vertex " << v[0] << " " << v[1] << " " << v[2] << "\n"; } output << " endloop\n"; output << " endfacet\n"; } } output << "endsolid OpenSCAD_Model\n"; setlocale(LC_NUMERIC, ""); // Set default locale } /*! file format: 1. polygon coordinates (x,y,z) are comma separated (+/- spaces) and each coordinate is on a separate line 2. each polygon is separated by one or more blank lines */ bool import_polygon(PolyholeK &polyhole, const std::string &filename) { std::ifstream ifs(filename.c_str()); if (!ifs) return false; std::string line; PolygonK polygon; while (std::getline(ifs, line)) { std::stringstream ss(line); double X = 0.0, Y = 0.0, Z = 0.0; if (!(ss >> X)) { //ie blank lines => flag start of next polygon if (polygon.size() > 0) polyhole.push_back(polygon); polygon.clear(); continue; } char c = ss.peek(); while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces before comma if (c == ',') {ss.read(&c, 1); c = ss.peek();} //gobble comma while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces after comma if (!(ss >> Y)) { std::cerr << "Y error\n"; return false; } c = ss.peek(); while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces before comma if (c == ',') {ss.read(&c, 1); c = ss.peek();} //gobble comma while (c == ' ') {ss.read(&c, 1); c = ss.peek();} //gobble spaces after comma if (!(ss >> Z)) { std::cerr << "Z error\n"; return false; } polygon.push_back(Vertex3K(X, Y, Z)); } if (polygon.size() > 0) polyhole.push_back(polygon); ifs.close(); return true; } //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { PolyholeK polyhole; K::Vector_3 *normal = NULL; if (argc >= 2) { if (!import_polygon(polyhole, argv[1])) { std::cerr << "Error importing polygon" << std::endl; exit(1); } std::cerr << "Imported " << polyhole.size() << " polygons" << std::endl; if (argc == 3) { std::vector strs; std::vector normalvec; std::string arg(argv[2]); boost::split(strs, arg, boost::is_any_of(",")); assert(strs.size() == 3); BOOST_FOREACH(const std::string &s, strs) normalvec.push_back(boost::lexical_cast(s)); normal = new K::Vector_3(normalvec[0], normalvec[1], normalvec[2]); } } else { //construct two non-intersecting nested polygons PolygonK polygon1; polygon1.push_back(Vertex3K(0,0,0)); polygon1.push_back(Vertex3K(2,0,0)); polygon1.push_back(Vertex3K(2,2,0)); polygon1.push_back(Vertex3K(0,2,0)); PolygonK polygon2; polygon2.push_back(Vertex3K(0.5,0.5,0)); polygon2.push_back(Vertex3K(1.5,0.5,0)); polygon2.push_back(Vertex3K(1.5,1.5,0)); polygon2.push_back(Vertex3K(0.5,1.5,0)); polyhole.push_back(polygon1); polyhole.push_back(polygon2); } Polygons triangles; bool ok = CGALUtils::tessellatePolygonWithHoles(polyhole, triangles, normal); std::cerr << "Tessellated into " << triangles.size() << " triangles" << std::endl; export_stl(triangles, std::cout); } openscad-2019.05/cgal/polyhole-tessellator.pro0000644000076500000240000000514213402025764021726 0ustar kintelstaff00000000000000debug: DEFINES += DEBUG TEMPLATE = app INCLUDEPATH += ../src DEPENDPATH += ../src # Handle custom library location. # Used when manually installing 3rd party libraries isEmpty(OPENSCAD_LIBDIR) OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) macx:isEmpty(OPENSCAD_LIBDIR) { exists(/opt/local):exists(/usr/local/Cellar) { error("It seems you might have libraries in both /opt/local and /usr/local. Please specify which one to use with qmake OPENSCAD_LIBDIR=") } else { exists(/opt/local) { #Default to MacPorts on Mac OS X message("Automatically searching for libraries in /opt/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /opt/local } else:exists(/usr/local/Cellar) { message("Automatically searching for libraries in /usr/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /usr/local } } } !isEmpty(OPENSCAD_LIBDIR) { QMAKE_INCDIR = $$OPENSCAD_LIBDIR/include QMAKE_LIBDIR = $$OPENSCAD_LIBDIR/lib } TARGET = polyhole-tessellator mac { CONFIG -= app_bundle } macx { # Mac needs special care to link against the correct C++ library # We attempt to auto-detect it by inspecting Boost dirs = $${BOOSTDIR} $${QMAKE_LIBDIR} for(dir, dirs) { system(grep -q __112basic_string $${dir}/libboost_thread* >& /dev/null) { message("Detected libc++-linked boost in $${dir}") CONFIG += libc++ } } libc++ { QMAKE_CXXFLAGS += -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++ QMAKE_OBJECTIVE_CFLAGS += -stdlib=libc++ # libc++ on requires Mac OS X 10.7+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 } } # See Dec 2011 OpenSCAD mailing list, re: CGAL/GCC bugs. *g++* { QMAKE_CXXFLAGS *= -fno-strict-aliasing QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs # ignored before 4.8 } *clang* { # http://llvm.org/bugs/show_bug.cgi?id=9182 QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual # disable enormous amount of warnings about CGAL / boost / etc QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-variable QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-function QMAKE_CXXFLAGS_WARN_ON += -Wno-c++11-extensions # might want to actually turn this on once in a while QMAKE_CXXFLAGS_WARN_ON += -Wno-format-security } # Application configuration CONFIG += cgal CONFIG += boost CONFIG += eigen CONFIG += gettext include(../common.pri) HEADERS += ../src/cgal.h \ ../src/cgalutils.h \ ../src/linalg.h \ ../src/printutils.h SOURCES += polyhole-tessellator.cpp \ ../src/cgalutils-tess.cc \ ../src/printutils.cc openscad-2019.05/cmake/Modules/FindFontConfig.cmake0000644000076500000240000000543713402025764022442 0ustar kintelstaff00000000000000# - Try to find the Fontconfig # Once done this will define # # FONTCONFIG_FOUND - system has Fontconfig # FONTCONFIG_INCLUDE_DIR - The include directory to use for the fontconfig headers # FONTCONFIG_LIBRARIES - Link these to use FONTCONFIG # FONTCONFIG_DEFINITIONS - Compiler switches required for using FONTCONFIG # Copyright (c) 2006,2007 Laurent Montel, # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # if (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR) # in cache already set(FONTCONFIG_FOUND TRUE) else (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR) if (NOT WIN32) # use pkg-config to get the directories and then use these values # in the FIND_PATH() and FIND_LIBRARY() calls find_package(PkgConfig REQUIRED QUIET) pkg_check_modules(PC_FONTCONFIG QUIET fontconfig) set(FONTCONFIG_DEFINITIONS ${PC_FONTCONFIG_CFLAGS_OTHER}) endif (NOT WIN32) find_path(FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h PATHS ${PC_FONTCONFIG_INCLUDEDIR} ${PC_FONTCONFIG_INCLUDE_DIRS} /usr/X11/include ) find_library(FONTCONFIG_LIBRARIES NAMES fontconfig PATHS ${PC_FONTCONFIG_LIBDIR} ${PC_FONTCONFIG_LIBRARY_DIRS} ) set(FONTCONFIG_VERSION ${PC_FONTCONFIG_VERSION}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FontConfig DEFAULT_MSG FONTCONFIG_LIBRARIES FONTCONFIG_INCLUDE_DIR) mark_as_advanced(FONTCONFIG_LIBRARIES FONTCONFIG_INCLUDE_DIR) endif (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR) openscad-2019.05/cmake/Modules/FindGLEW.cmake0000644000076500000240000000352113452415427021140 0ustar kintelstaff00000000000000# # Try to find GLEW library and include path. # Once done this will define # # GLEW_FOUND # GLEW_INCLUDE_DIR # GLEW_LIBRARY # # a few lines of this file are based on the LGPL code found at # http://openlibraries.org/browser/trunk/FindGLEW.cmake?rev=1383 if (WIN32 AND MSVC) if (WIN32_STATIC_BUILD) # passed from caller set(GLEW_LIB_SEARCH_NAME glew32s.lib) # static, non-debug (Release) else () set(GLEW_LIB_SEARCH_NAME glew32.lib) # other. untested with OpenSCAD endif() else () # GCC set(GLEW_LIB_SEARCH_NAME "libglew32s.a") endif () if (WIN32) find_path(GLEW_INCLUDE_DIR GL/glew.h $ENV{PROGRAMFILES}/GLEW/include ${PROJECT_SOURCE_DIR}/src/nvgl/glew/include DOC "The directory where GL/glew.h resides") find_library(GLEW_LIBRARY NAMES ${GLEW_LIB_SEARCH_NAME} PATHS $ENV{PROGRAMFILES}/GLEW/lib ${PROJECT_SOURCE_DIR}/src/nvgl/glew/bin ${PROJECT_SOURCE_DIR}/src/nvgl/glew/lib DOC "The GLEW library") else() find_path(GLEW_INCLUDE_DIR GL/glew.h PATHS /usr/include /usr/local/include /usr/pkg/include DOC "The directory where GL/glew.h resides") find_library(GLEW_LIBRARY NAMES GLEW glew PATHS /usr/lib /usr/local/lib /usr/pkg/lib /lib /lib64 /usr/lib64 DOC "The GLEW library") endif() if (GLEW_INCLUDE_DIR AND GLEW_LIBRARY) set(GLEW_FOUND 1 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise") else() set(GLEW_FOUND 0 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise") endif() if (NOT GLEW_FOUND) find_package(PkgConfig REQUIRED) if (PKG_CONFIG_FOUND) message(STATUS "Doing pkg config glew check...") pkg_search_module(GLEW glew) if (GLEW_FOUND) set(GLEW_INCLUDE_DIR "${GLEW_INCLUDEDIR}") set(GLEW_LIBRARY "-L${GLEW_LIBRARY_DIRS} -l${GLEW_LIBRARIES}") endif() endif() endif() if (NOT GLEW_FOUND) message(FATAL_ERROR "GLEW not found") endif() openscad-2019.05/cmake/Modules/FindGLIB2.cmake0000644000076500000240000000423513427162620021200 0ustar kintelstaff00000000000000message(STATUS "running openscad/cmake/Modules/FindGLIB2.cmake ...") include(PkgConfigTools) save_pkg_config_env() # GLIB2 requires pkg-config to build. # If we are did an OPENSCAD_LIBRARIES dependency build of glib2, we need to # tell pkg-config to look under OPENSCAD_LIBRARIES dir. # Otherwise, we need to use the system's pkg-config to find system's glib2 if (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "") if (EXISTS "$ENV{OPENSCAD_LIBRARIES}/include/glib-2.0/glib.h") message(STATUS "found glib.h under OPENSCAD_LIBRARIES.") message(STATUS "redirecting pkg-config to look under OPENSCAD_LIBRARIES") set(ENV{PKG_CONFIG_PATH} "$ENV{OPENSCAD_LIBRARIES}/lib/pkgconfig") set(ENV{PKG_CONFIG_LIBDIR} "$ENV{OPENSCAD_LIBRARIES}/lib/pkgconfig") else() message(STATUS "attempting to find system glib2") endif() endif() find_package(PkgConfig REQUIRED) pkg_search_module(GLIB2 REQUIRED glib-2.0) message(STATUS "GLIB2_VERSION ${GLIB2_VERSION}") #message(STATUS "GLIB2_LIBRARIES ${GLIB2_LIBRARIES}") message(STATUS "GLIB2_LIBRARY_DIRS ${GLIB2_LIBRARY_DIRS}") #message(STATUS "GLIB2_LDFLAGS ${GLIB2_LDFLAGS}") #message(STATUS "GLIB2_LDFLAGS_OTHER ${GLIB2_LDFLAGS_OTHER}") #message(STATUS "GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS}") message(STATUS "GLIB2_INCLUDE_DIRS:") foreach(glib2incdir ${GLIB2_INCLUDE_DIRS}) message(STATUS " " ${glib2incdir}) endforeach() #message(STATUS "GLIB2_CFLAGS ${GLIB2_CFLAGS}") #message(STATUS "GLIB2_CFLAGS_OTHER ${GLIB2_CFLAGS_OTHER}") message(STATUS "GLIB2_LIBDIR ${GLIB2_LIBDIR}") set(GLIB2_DEFINITIONS ${GLIB2_CFLAGS_OTHER}) #message(STATUS "GLIB2_DEFINITIONS ${GLIB2_DEFINITIONS}") set(GLIB2_LIBRARY_NAMES ${GLIB2_LIBRARIES}) set(GLIB2_LIBRARIES "") foreach(GLIB2_LIB ${GLIB2_LIBRARY_NAMES}) # message(STATUS "lib: ${GLIB2_LIB}") set(TMP TMP-NOTFOUND) find_library(TMP NAMES ${GLIB2_LIB} PATHS ${GLIB2_LIBRARY_DIRS} PATHS ${GLIB2_LIBDIR} NO_DEFAULT_PATH) # message(STATUS "TMP: ${TMP}") list(APPEND GLIB2_LIBRARIES "${TMP}") endforeach() message(STATUS "GLIB2_LIBRARIES:") foreach(glib2libdir ${GLIB2_LIBRARIES}) message(STATUS " " ${glib2libdir}) endforeach() restore_pkg_config_env() openscad-2019.05/cmake/Modules/FindHarfBuzz.cmake0000644000076500000240000000431113402025764022127 0ustar kintelstaff00000000000000# Copyright (c) 2012, Intel Corporation # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of Intel Corporation nor the names of its contributors may # be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Try to find Harfbuzz include and library directories. # # After successful discovery, this will set for inclusion where needed: # HARFBUZZ_INCLUDE_DIRS - containg the HarfBuzz headers # HARFBUZZ_LIBRARIES - containg the HarfBuzz library find_package(PkgConfig REQUIRED QUIET) pkg_check_modules(PC_HARFBUZZ QUIET harfbuzz>=0.9.0) find_path(HARFBUZZ_INCLUDE_DIRS NAMES hb.h HINTS ${PC_HARFBUZZ_INCLUDE_DIRS} ${PC_HARFBUZZ_INCLUDEDIR} ) find_library(HARFBUZZ_LIBRARIES NAMES harfbuzz HINTS ${PC_HARFBUZZ_LIBRARY_DIRS} ${PC_HARFBUZZ_LIBDIR} ) set(HARFBUZZ_VERSION ${PC_HARFBUZZ_VERSION}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(harfbuzz DEFAULT_MSG HARFBUZZ_INCLUDE_DIRS HARFBUZZ_LIBRARIES) openscad-2019.05/cmake/Modules/FindLib3MF.cmake0000644000076500000240000000362513452415427021423 0ustar kintelstaff00000000000000# # Try to find 3MF library and include path. # Once done this will define # # LIB3MF_FOUND # LIB3MF_CFLAGS # LIB3MF_LIBDIR # LIB3MF_INCLUDE_DIRS # LIB3MF_LIBRARIES # message(STATUS "Searching for lib3mf.") # Don't specify REQUIRED here in case pkg-config fails. # We still fall back to the rest of detection code here. # Travis CI Ubuntu Trusty environment has some issue with pkg-config # not finding the version. pkg_check_modules(LIB3MF lib3MF>=1.8.1) if (LIB3MF_VERSION) message("lib3MF ${LIB3MF_VERSION} found: ${LIB3MF_INCLUDE_DIRS}") endif() if (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "") if (EXISTS "$ENV{OPENSCAD_LIBRARIES}/include/lib3mf/Model/COM/NMR_DLLInterfaces.h") message(STATUS "found lib3mf (NMR_DLLInterfaces.h) in OPENSCAD_LIBRARIES.") set(LIB3MF_INCLUDE_DIRS "$ENV{OPENSCAD_LIBRARIES}/include/lib3mf" "$ENV{OPENSCAD_LIBRARIES}/include/lib3mf/Model/COM") set(LIB3MF_LIBDIR "$ENV{OPENSCAD_LIBRARIES}/lib") endif() endif() if ("${LIB3MF_LIBDIR}" STREQUAL "") if (EXISTS "/opt/include/lib3mf/Model/COM/NMR_DLLInterfaces.h") set(LIB3MF_INCLUDE_DIRS "/opt/include/lib3mf" "/opt/include/lib3mf/Model/COM") set(LIB3MF_LIBDIR "/opt/lib") else() if (EXISTS "/usr/local/include/lib3mf/Model/COM/NMR_DLLInterfaces.h") set(LIB3MF_INCLUDE_DIRS "/usr/local/include/lib3mf" "/usr/local/include/lib3mf/Model/COM") set(LIB3MF_LIBDIR "/usr/local/lib") else() if (EXISTS "/usr/include/lib3mf/Model/COM/NMR_DLLInterfaces.h") set(LIB3MF_INCLUDE_DIRS "/usr/include/lib3mf" "/usr/include/lib3mf/Model/COM") set(LIB3MF_LIBDIR "/usr/lib") endif() endif() endif() endif() if (NOT ${LIB3MF_LIBDIR} STREQUAL "") set(LIB3MF_LIBRARIES "-L${LIB3MF_LIBDIR}" "-l3MF -lzip -lz") set(LIB3MF_CFLAGS "-D__GCC -DENABLE_LIB3MF") set(LIB3MF_FOUND TRUE) message(STATUS "Found lib3mf in ${LIB3MF_LIBDIR}.") else() message(STATUS "Could not find lib3mf.") endif() openscad-2019.05/cmake/Modules/FindLibZip.cmake0000644000076500000240000000172313402025764021571 0ustar kintelstaff00000000000000# Finds libzip. # # This module defines: # LIBZIP_INCLUDE_DIR_ZIP # LIBZIP_INCLUDE_DIR_ZIPCONF # LIBZIP_LIBRARY # LIBZIP_VERSION # find_package(PkgConfig) pkg_check_modules(PC_LIBZIP QUIET libzip) find_path(LIBZIP_INCLUDE_DIR_ZIP NAMES zip.h HINTS ${PC_LIBZIP_INCLUDE_DIRS}) find_path(LIBZIP_INCLUDE_DIR_ZIPCONF NAMES zipconf.h HINTS ${PC_LIBZIP_INCLUDE_DIRS}) find_library(LIBZIP_LIBRARY NAMES zip) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS( LIBZIP DEFAULT_MSG LIBZIP_LIBRARY LIBZIP_INCLUDE_DIR_ZIP LIBZIP_INCLUDE_DIR_ZIPCONF) set(LIBZIP_VERSION 0) if (LIBZIP_INCLUDE_DIR_ZIPCONF) FILE(READ "${LIBZIP_INCLUDE_DIR_ZIPCONF}/zipconf.h" _LIBZIP_VERSION_CONTENTS) if (_LIBZIP_VERSION_CONTENTS) STRING(REGEX REPLACE ".*#define LIBZIP_VERSION \"([0-9.]+)\".*" "\\1" LIBZIP_VERSION "${_LIBZIP_VERSION_CONTENTS}") endif () endif () set(LIBZIP_VERSION ${LIBZIP_VERSION} CACHE STRING "Version number of libzip") openscad-2019.05/cmake/Modules/FindOpenCSG.cmake0000644000076500000240000000213413402025764021633 0ustar kintelstaff00000000000000if (NOT $ENV{OPENCSGDIR} STREQUAL "") set(OPENCSG_DIR "$ENV{OPENCSGDIR}") elseif (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "") set(OPENCSG_DIR "$ENV{OPENSCAD_LIBRARIES}") endif() if (NOT OPENCSG_INCLUDE_DIR) message(STATUS "OPENCSG_DIR: " ${OPENCSG_DIR}) find_path(OPENCSG_INCLUDE_DIR opencsg.h HINTS ${OPENCSG_DIR}/include) find_library(OPENCSG_LIBRARY opencsg HINTS ${OPENCSG_DIR}/lib) if (NOT OPENCSG_INCLUDE_DIR OR NOT OPENCSG_LIBRARY) message(FATAL_ERROR "OpenCSG not found") else() set(OPENCSG_FOUND TRUE) message(STATUS "OpenCSG include found in " ${OPENCSG_INCLUDE_DIR}) message(STATUS "OpenCSG library found in " ${OPENCSG_LIBRARY}) # version set(_VERSION_FILE ${OPENCSG_INCLUDE_DIR}/opencsg.h) if(EXISTS ${_VERSION_FILE}) file(STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+OPENCSG_VERSION_STRING" ) if(_VERSION_LINE) string (REGEX REPLACE ".*define[ ]+OPENCSG_VERSION_STRING[ ]+\".*\ (.*)\".*" "\\1" OPENCSG_VERSION_STRING "${_VERSION_LINE}") endif() endif() endif() endif() openscad-2019.05/cmake/Modules/FindQt5QScintilla.cmake0000644000076500000240000001274013402025764023036 0ustar kintelstaff00000000000000# QScintilla is a port to Qt of Neil Hodgson's Scintilla C++ editor control # available at http://www.riverbankcomputing.com/software/qscintilla/ # # The module defines the following variables: # QT5QSCINTILLA_FOUND - the system has QScintilla # QT5QSCINTILLA_INCLUDE_DIR - where to find qsciscintilla.h # QT5QSCINTILLA_INCLUDE_DIRS - qscintilla includes # QT5QSCINTILLA_LIBRARY - where to find the QScintilla library # QT5QSCINTILLA_LIBRARIES - aditional libraries # QT5QSCINTILLA_MAJOR_VERSION - major version # QT5QSCINTILLA_MINOR_VERSION - minor version # QT5QSCINTILLA_PATCH_VERSION - patch version # QT5QSCINTILLA_VERSION_STRING - version (ex. 2.6.2) # QT5QSCINTILLA_ROOT_DIR - root dir (ex. /usr/local) #============================================================================= # Copyright 2010-2013, Julien Schueller # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # The views and conclusions contained in the software and documentation are those # of the authors and should not be interpreted as representing official policies, # either expressed or implied, of the FreeBSD Project. #============================================================================= find_path ( QT5QSCINTILLA_INCLUDE_DIR NAMES qsciscintilla.h HINTS ${Qt5Widgets_INCLUDE_DIRS} PATH_SUFFIXES qt5 Qsci ) set ( QT5QSCINTILLA_INCLUDE_DIRS ${QT5QSCINTILLA_INCLUDE_DIR} ) # version set ( _VERSION_FILE ${QT5QSCINTILLA_INCLUDE_DIR}/qsciglobal.h ) if ( EXISTS ${_VERSION_FILE} ) file ( STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+QSCINTILLA_VERSION_STR" ) if ( _VERSION_LINE ) string ( REGEX REPLACE ".*define[ ]+QSCINTILLA_VERSION_STR[ ]+\"(.*)\".*" "\\1" QT5QSCINTILLA_VERSION_STRING "${_VERSION_LINE}" ) string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" QT5QSCINTILLA_MAJOR_VERSION "${QT5QSCINTILLA_VERSION_STRING}" ) string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" QT5QSCINTILLA_MINOR_VERSION "${QT5QSCINTILLA_VERSION_STRING}" ) string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\3" QT5QSCINTILLA_PATCH_VERSION "${QT5QSCINTILLA_VERSION_STRING}" ) endif () endif () # check version set ( _QT5QSCINTILLA_VERSION_MATCH TRUE ) if ( QScintilla_FIND_VERSION AND QT5QSCINTILLA_VERSION_STRING ) if ( QScintilla_FIND_VERSION_EXACT ) if ( NOT QScintilla_FIND_VERSION VERSION_EQUAL QT5QSCINTILLA_VERSION_STRING ) set ( _QT5QSCINTILLA_VERSION_MATCH FALSE ) endif () else () if ( QT5QSCINTILLA_VERSION_STRING VERSION_LESS QScintilla_FIND_VERSION ) set ( _QT5QSCINTILLA_VERSION_MATCH FALSE ) endif () endif () endif () find_library ( QT5QSCINTILLA_LIBRARY NAMES qt5scintilla2 qscintilla2-qt5 qscintilla2 qscintilla2_qt5 HINTS ${Qt5Widgets_LIBRARIES} ) set ( QT5QSCINTILLA_LIBRARIES ${QT5QSCINTILLA_LIBRARY} ) IF( QT5QSCINTILLA_LIBRARY AND QT5QSCINTILLA_INCLUDE_DIR ) SET( QT5QSCINTILLA_FOUND TRUE ) ENDIF( QT5QSCINTILLA_LIBRARY AND QT5QSCINTILLA_INCLUDE_DIR ) #IF( QT5QSCINTILLA_FOUND ) # MESSAGE( STATUS "Found QScintilla-Qt5 header files in ${QT5QSCINTILLA_INCLUDE_DIR}") # MESSAGE( STATUS "Found QScintilla-Qt5 libraries: ${QT5QSCINTILLA_LIBRARY}") #ENDIF(QT5QSCINTILLA_FOUND) # try to guess root dir from include dir if ( QT5QSCINTILLA_INCLUDE_DIR ) string ( REGEX REPLACE "(.*)/include.*" "\\1" QT5QSCINTILLA_ROOT_DIR ${QT5QSCINTILLA_INCLUDE_DIR} ) # try to guess root dir from library dir elseif ( QT5QSCINTILLA_LIBRARY ) string ( REGEX REPLACE "(.*)/lib[/|32|64].*" "\\1" QT5QSCINTILLA_ROOT_DIR ${QT5QSCINTILLA_LIBRARY} ) endif () # handle the QUIETLY and REQUIRED arguments include ( FindPackageHandleStandardArgs ) if ( CMAKE_VERSION VERSION_LESS 2.8.3 ) find_package_handle_standard_args( Qt5QScintilla DEFAULT_MSG QT5QSCINTILLA_LIBRARY QT5QSCINTILLA_INCLUDE_DIR _QT5QSCINTILLA_VERSION_MATCH ) else () find_package_handle_standard_args( Qt5QScintilla REQUIRED_VARS QT5QSCINTILLA_LIBRARY QT5QSCINTILLA_INCLUDE_DIR _QT5QSCINTILLA_VERSION_MATCH VERSION_VAR QT5QSCINTILLA_VERSION_STRING ) endif () mark_as_advanced ( QT5QSCINTILLA_LIBRARY QT5QSCINTILLA_LIBRARIES QT5QSCINTILLA_INCLUDE_DIR QT5QSCINTILLA_INCLUDE_DIRS QT5QSCINTILLA_MAJOR_VERSION QT5QSCINTILLA_MINOR_VERSION QT5QSCINTILLA_PATCH_VERSION QT5QSCINTILLA_VERSION_STRING QT5QSCINTILLA_ROOT_DIR ) openscad-2019.05/cmake/Modules/PkgConfigTools.cmake0000644000076500000240000000152113402025764022463 0ustar kintelstaff00000000000000# Use this to save the existing pkg-config settings function(save_pkg_config_env) message(STATUS "saving pkg-config env") if (DEFINED ENV{PKG_CONFIG_PATH}) set(SAVED_PKG_CONFIG_PATH "$ENV{PKG_CONFIG_PATH}") endif() if (DEFINED ENV{PKG_CONFIG_LIBDIR}) set(SAVED_PKG_CONFIG_LIBDIR "$ENV{PKG_CONFIG_LIBDIR}") endif() endfunction() # Use this to restore to the original pkg-config settings function(restore_pkg_config_env) message(STATUS "restoring pkg-config env") if (SAVED_PKG_CONFIG_PATH) set(ENV{PKG_CONFIG_PATH} "${SAVED_PKG_CONFIG_PATH}") unset(SAVED_PKG_CONFIG_PATH) else() unset(ENV{PKG_CONFIG_PATH}) endif() if (SAVED_PKG_CONFIG_LIBDIR) set(ENV{PKG_CONFIG_LIBDIR} "${SAVED_PKG_CONFIG_LIBDIR}") unset(SAVED_PKG_CONFIG_LIBDIR) else() unset(ENV{PKG_CONFIG_LIBDIR}) endif() endfunction() openscad-2019.05/cmake/Modules/RegexUtils.cmake0000644000076500000240000000165013402025764021671 0ustar kintelstaff00000000000000function(escape_string_as_regex _str_out _str_in) STRING(REGEX REPLACE "\\\\" "\\\\\\\\" FILETEST2 "${_str_in}") STRING(REGEX REPLACE "([.$+*?|-])" "\\\\\\1" FILETEST2 "${FILETEST2}") STRING(REGEX REPLACE "\\^" "\\\\^" FILETEST2 "${FILETEST2}") STRING(REGEX REPLACE "\\(" "\\\\(" FILETEST2 "${FILETEST2}") STRING(REGEX REPLACE "\\)" "\\\\)" FILETEST2 "${FILETEST2}") STRING(REGEX REPLACE "\\[" "\\\\[" FILETEST2 "${FILETEST2}") STRING(REGEX REPLACE "\\]" "\\\\]" FILETEST2 "${FILETEST2}") SET(${_str_out} "${FILETEST2}" PARENT_SCOPE) endfunction() function(test_escape_string_as_regex) SET(test1 "\\.^$-+*()[]?|") escape_string_as_regex(test2 "${test1}") SET(testRef "\\\\\\.\\^\\$\\-\\+\\*\\(\\)\\[\\]\\?\\|") if(NOT test2 STREQUAL testRef) message("Error in the escape_string_for_regex function : \n ${test1} was escaped as ${test2}, should be ${testRef}") endif(NOT test2 STREQUAL testRef) endfunction()openscad-2019.05/cmake/Modules/info.cmake0000644000076500000240000000247213452415427020540 0ustar kintelstaff00000000000000get_directory_property(DEFINES COMPILE_DEFINITIONS) message("") message("Configuration") message("=============") message("") message("CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") if (CMAKE_PREFIX_PATH) message("CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") endif() if (OPENSCAD_LIBRARIES) message("OPENSCAD_LIBRARIES: $ENV{OPENSCAD_LIBRARIES}") endif() if(CMAKE_BUILD_TYPE MATCHES DEBUG) message("Debug mode: enabled") else() message("Debug mode: disabled") endif() message("Experimental Features: ${EXPERIMENTAL}") message("Snapshot build: ${SNAPSHOT}") message("Headless build: ${HEADLESS}") message("NULLGL build: ${NULLGL}") message("CSG node id-prefix: ${IDPREFIX}") message("") message("Input Drivers") if("ENABLE_HIDAPI" IN_LIST DEFINES) message("- HID API Driver (enabled)") else() message("- HID API Driver (disabled)") endif() if("ENABLE_SPNAV" IN_LIST DEFINES) message("- Space Navigator Library Driver (enabled)") else() message("- Space Navigator Library Driver (disabled)") endif() if("ENABLE_JOYSTICK" IN_LIST DEFINES) message("- Joystick Driver (enabled)") else() message("- Joystick Driver (disabled)") endif() if("ENABLE_DBUS" IN_LIST DEFINES) message("- DBus Remote Driver (enabled)") else() message("- DBus Remote Driver (disabled)") endif() message("") message("DEFINES = ${DEFINES}") message("") openscad-2019.05/color-schemes/editor/dark-background.json0000644000076500000240000000216213402025764024065 0ustar kintelstaff00000000000000{ "name" : "For Dark Background", "index" : 1100, "paper" : "#222222", "text" : "#e0e0e0", "caret" : { "width" : 2, "foreground" : "#ffff00", "line-background" : "#303030" }, "colors" : { "keyword1" : "#90ee90", "keyword2" : "#56dbf0", "keyword3" : "#add8e6", "comment" : "#808080", "commentline" : "#808080", "commentdoc" : "#808080", "commentdockeyword" : "#808080", "number" : "#ff0000", "string" : "#e6db74", "operator" : "#e8b609", "whitespace-foreground" : "#e0e0e0", "selection-foreground" : "#ffffff", "selection-background" : "#4a90d9", "margin-background" : "#272822", "margin-foreground" : "Gray", "matched-brace-background" : "#505050", "matched-brace-foreground" : "#ffffff", "unmatched-brace-background" : "#dc322f", "unmatched-brace-foreground" : "#fdf6e3", "error-marker" : "#ff0000", "error-indicator" : "#60ff0000", "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" } } openscad-2019.05/color-schemes/editor/light-background.json0000644000076500000240000000215713402025764024257 0ustar kintelstaff00000000000000{ "name" : "For Light Background", "index" : 1000, "paper" : "#ffffff", "text" : "#272822", "caret" : { "width" : 2, "foreground" : "#000000", "line-background" : "#f8f8f8" }, "colors" : { "keyword1" : "Green", "keyword2" : "Green", "keyword3" : "DarkBlue", "comment" : "DarkCyan", "commentline" : "DarkCyan", "commentdoc" : "DarkCyan", "commentdockeyword" : "DarkCyan", "number" : "DarkRed", "string" : "DarkMagenta", "operator" : "Blue", "whitespace-foreground" : "#272822", "selection-foreground" : "#ffffff", "selection-background" : "#4a90d9", "margin-background" : "#f8f8f8", "margin-foreground" : "Gray", "matched-brace-background" : "#c7f6cb", "matched-brace-foreground" : "Blue", "unmatched-brace-background" : "#ffcdcc", "unmatched-brace-foreground" : "Blue", "error-marker" : "#ff0000", "error-indicator" : "#60ff0000", "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" } } openscad-2019.05/color-schemes/editor/monokai.json0000644000076500000240000000215213402025764022463 0ustar kintelstaff00000000000000{ "name" : "Monokai", "index" : 1200, "paper" : "#272822", "text" : "#f8f8f2", "caret" : { "width" : 2, "foreground" : "#f8f8f2", "line-background" : "#49483e" }, "colors" : { "keyword1" : "#f92672", "keyword2" : "#a6e22e", "keyword3" : "#66d9ef", "comment" : "#75715e", "commentline" : "#75715e", "commentdoc" : "#75715e", "commentdockeyword" : "#7b9a3c", "number" : "#ae81ff", "string" : "#e6db74", "operator" : "#f8f8f2", "whitespace-foreground" : "#f8f8f2", "selection-foreground" : "#272822", "selection-background" : "#f8f8f2", "margin-background" : "#3e3d32", "margin-foreground" : "DarkGray", "matched-brace-background" : "#606060", "matched-brace-foreground" : "#ffff00", "unmatched-brace-background" : "#b06060", "unmatched-brace-foreground" : "#ffff00", "error-marker" : "#ff0000", "error-indicator" : "#80ffe0e0", "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" } } openscad-2019.05/color-schemes/editor/solarized-dark.json0000644000076500000240000000216113402025764023741 0ustar kintelstaff00000000000000{ "name" : "Solarized (dark)", "index" : 1310, "paper" : "#002b36", "text" : "#839496", "caret" : { "width" : 2, "foreground" : "#fff070", "line-background" : "#073642" }, "colors" : { "keyword1" : "#268ad1", "keyword2" : "#2aa198", "keyword3" : "#859900", "comment" : "#657b83", "commentline" : "#657b83", "commentdoc" : "#657b83", "commentdockeyword" : "#6c71c4", "number" : "#d33682", "string" : "#b58900", "operator" : "#cb4b16", "whitespace-foreground" : "#839496", "selection-foreground" : "#fdf6e3", "selection-background" : "#657b83", "margin-background" : "#002b36", "margin-foreground" : "#839496", "matched-brace-background" : "#0c4e22", "matched-brace-foreground" : "#fff070", "unmatched-brace-background" : "#92211f", "unmatched-brace-foreground" : "#fff070", "error-marker" : "#ff0000", "error-indicator" : "#90ff8080", "error-indicator-outline" : "#ff000000", "edge" : "#d33682" } }openscad-2019.05/color-schemes/editor/solarized-light.json0000644000076500000240000000216213402025764024130 0ustar kintelstaff00000000000000{ "name" : "Solarized (light)", "index" : 1300, "paper" : "#fdf6e3", "text" : "#657b83", "caret" : { "width" : 2, "foreground" : "#000000", "line-background" : "#eee8d5" }, "colors" : { "keyword1" : "#268ad1", "keyword2" : "#2aa198", "keyword3" : "#859900", "comment" : "#93a1a1", "commentline" : "#93a1a1", "commentdoc" : "#93a1a1", "commentdockeyword" : "#6c71c4", "number" : "#d33682", "string" : "#b58900", "operator" : "#cb4b16", "whitespace-foreground" : "#657b83", "selection-foreground" : "#fdf6e3", "selection-background" : "#657b83", "margin-background" : "#eee8d5", "margin-foreground" : "#657b83", "matched-brace-background" : "#c7f6cb", "matched-brace-foreground" : "#cb4b16", "unmatched-brace-background" : "#ffcdcc", "unmatched-brace-foreground" : "#cb4b16", "error-marker" : "#ff0000", "error-indicator" : "#80ff0000", "error-indicator-outline" : "#ff000000", "edge" : "#d33682" } }openscad-2019.05/color-schemes/editor/tomorrow-night.json0000644000076500000240000000216013402025764024024 0ustar kintelstaff00000000000000{ "name" : "Tomorrow Night", "index" : 1600, "paper" : "#1d1f21", "text" : "#c5c8c6", "caret" : { "width" : 2, "foreground" : "#ffffff", "line-background" : "#282a2e" }, "colors" : { "keyword1" : "#de935f", "keyword2" : "#b294bb", "keyword3" : "#81a2be", "comment" : "#969896", "commentline" : "#969896", "commentdoc" : "#969896", "commentdockeyword" : "#f0c674", "number" : "#cc6666", "string" : "#b5bd68", "operator" : "#8abeb7", "whitespace-foreground" : "#c5c8c6", "selection-foreground" : "#373b41", "selection-background" : "#c5c8c6", "margin-background" : "#1d1f21", "margin-foreground" : "#969896", "matched-brace-background" : "#50545c", "matched-brace-foreground" : "#e2e6e3", "unmatched-brace-background" : "#8a1111", "unmatched-brace-foreground" : "#e2e6e3", "error-marker" : "#ff0000", "error-indicator" : "#80ff0000", "error-indicator-outline" : "#ff000000", "edge" : "#d33682" } } openscad-2019.05/color-schemes/editor/tomorrow.json0000644000076500000240000000215213402025764022716 0ustar kintelstaff00000000000000{ "name" : "Tomorrow", "index" : 1500, "paper" : "#f8f8f8", "text" : "#4d4d4c", "caret" : { "width" : 2, "foreground" : "#000000", "line-background" : "#efefef" }, "colors" : { "keyword1" : "#f5871f", "keyword2" : "#8959a8", "keyword3" : "#4271ae", "comment" : "#8e908c", "commentline" : "#8e908c", "commentdoc" : "#8e908c", "commentdockeyword" : "#eab700", "number" : "#c82829", "string" : "#718c00", "operator" : "#3e999f", "whitespace-foreground" : "#4d4d4c", "selection-foreground" : "#4d4d4c", "selection-background" : "#d6d6d6", "margin-background" : "#f8f8f8", "margin-foreground" : "#4d4d4c", "matched-brace-background" : "#c7f6cb", "matched-brace-foreground" : "#4d4d4c", "unmatched-brace-background" : "#ffcdcc", "unmatched-brace-foreground" : "#4d4d4c", "error-marker" : "#ff0000", "error-indicator" : "#80ff0000", "error-indicator-outline" : "#ff000000", "edge" : "#d33682" } } openscad-2019.05/color-schemes/editor/visualstudio.json0000644000076500000240000000340313432700636023562 0ustar kintelstaff00000000000000{ "name" : "Visual Studio", "index" : 1400, "paper" : "#ffffff", "text" : "#101010", "caret" : { "width" : 2, "foreground" : "#000000", "line-background" : "#eeeeee" }, "colors" : { "keyword1" : "blue", "keyword2" : "blue", "keyword3" : "#2B91AF", "comment" : "DarkGreen", "commentline" : "DarkGreen", "commentdoc" : "#DarkGreen", "commentdockeyword" : "#DarkGreen", "number" : "DarkRed", "string" : "#A31515", "operator" : "Blue", "whitespace-foreground" : "#101010", "selection-foreground" : "black", "selection-background" : "lightblue", "margin-background" : "white", "margin-foreground" : "#2B91AF", "matched-brace-background" : "darkgrey", "matched-brace-foreground" : "black", "unmatched-brace-background" : "red", "unmatched-brace-foreground" : "#ffffff", "error-marker" : "#ff0000", "error-indicator" : "#60ff0000", "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" }, "keywords" : { "keyword-set1" : "if else let for module function true false undef include use", "keyword-set2" : "abs sign rands min max sin cos asin acos tan atan atan2 round ceil floor pow sqrt exp len log ln str chr ord concat is_undef is_list is_num is_bool is_string lookup search version version_num norm cross parent_module dxf_dim dxf_cross", "keyword-set3" : "cube sphere cylinder polyhedron square circle polygon text minkowski hull resize child echo union difference intersection linear_extrude rotate_extrude import group projection render surface scale rotate mirror translate multmatrix color offset children assert" } } openscad-2019.05/color-schemes/readme.txt0000644000076500000240000000165313402025764020650 0ustar kintelstaff00000000000000Color Schemes ============= Solarized --------- http://ethanschoonover.com/solarized Monokai ------- http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/ Tomorrow / Tomorrow Night ------------------------- https://github.com/chriskempson/tomorrow-theme Editor: keyword1 Orange keyword2 Purple keyword3 Blue comment Comment commentline Comment commentdoc Comment commentdockeyword Yellow number Red string Green operator Aqua selection-foreground Foreground selection-background Selection Render: opencsg-face-front Blue opencsg-face-back Orange cgal-face-front Aqua cgal-face-back Yellow cgal-face-2d Green cgal-edge-front Foreground cgal-edge-back Foreground cgal-edge-2d Red crosshair Purple openscad-2019.05/color-schemes/render/beforedawn.json0000644000076500000240000000106213402025764023132 0ustar kintelstaff00000000000000{ "name" : "BeforeDawn", "index" : 1400, "show-in-gui" : true, "colors" : { "background" : "#333333", "axes-color" : "#c1c1c1", "opencsg-face-front" : "#cccccc", "opencsg-face-back" : "#5563dd", "cgal-face-front" : "#cccccc", "cgal-face-back" : "#5563dd", "cgal-face-2d" : "#00bf99", "cgal-edge-front" : "#ff0000", "cgal-edge-back" : "#ff0000", "cgal-edge-2d" : "#ff0000", "crosshair" : "#f0f0f0" } } openscad-2019.05/color-schemes/render/deepocean.json0000644000076500000240000000106113402025764022740 0ustar kintelstaff00000000000000{ "name" : "DeepOcean", "index" : 1600, "show-in-gui" : true, "colors" : { "background" : "#333333", "axes-color" : "#c1c1c1", "opencsg-face-front" : "#eeeeee", "opencsg-face-back" : "#0babc8", "cgal-face-front" : "#eeeeee", "cgal-face-back" : "#0babc8", "cgal-face-2d" : "#9370db", "cgal-edge-front" : "#0000ff", "cgal-edge-back" : "#0000ff", "cgal-edge-2d" : "#ff00ff", "crosshair" : "#f0f0f0" } } openscad-2019.05/color-schemes/render/metallic.json0000644000076500000240000000106013402025764022606 0ustar kintelstaff00000000000000{ "name" : "Metallic", "index" : 1100, "show-in-gui" : true, "colors" : { "background" : "#aaaaff", "axes-color" : "#222233", "opencsg-face-front" : "#ddddff", "opencsg-face-back" : "#dd22dd", "cgal-face-front" : "#ddddff", "cgal-face-back" : "#dd22dd", "cgal-face-2d" : "#00bf99", "cgal-edge-front" : "#ff0000", "cgal-edge-back" : "#ff0000", "cgal-edge-2d" : "#ff0000", "crosshair" : "#800000" } } openscad-2019.05/color-schemes/render/monotone.json0000644000076500000240000000121513402025764022654 0ustar kintelstaff00000000000000{ "name" : "Monotone", "index" : 9999, "show-in-gui" : false, "description" : "Color scheme with no difference between 'back face' and 'front face'", "colors" : { "background" : "#ffffe5", "axes-color" : "#191916", "opencsg-face-front" : "#f9d72c", "opencsg-face-back" : "#f9d72c", "cgal-face-front" : "#f9d72c", "cgal-face-back" : "#f9d72c", "cgal-face-2d" : "#00bf99", "cgal-edge-front" : "#ff0000", "cgal-edge-back" : "#ff0000", "cgal-edge-2d" : "#ff0000", "crosshair" : "#800000" } } openscad-2019.05/color-schemes/render/nature.json0000644000076500000240000000105613402025764022317 0ustar kintelstaff00000000000000{ "name" : "Nature", "index" : 1500, "show-in-gui" : true, "colors" : { "background" : "#fafafa", "axes-color" : "#323232", "opencsg-face-front" : "#16a085", "opencsg-face-back" : "#dbf4da", "cgal-face-front" : "#16a085", "cgal-face-back" : "#dbf4da", "cgal-face-2d" : "#00bf99", "cgal-edge-front" : "#ff0000", "cgal-edge-back" : "#ff0000", "cgal-edge-2d" : "#ff0000", "crosshair" : "#111111" } } openscad-2019.05/color-schemes/render/solarized.json0000644000076500000240000000106113402025764023011 0ustar kintelstaff00000000000000{ "name" : "Solarized", "index" : 1700, "show-in-gui" : true, "colors" : { "background" : "#fdf6e3", "axes-color" : "#191816", "opencsg-face-front" : "#b58800", "opencsg-face-back" : "#882233", "cgal-face-front" : "#b58800", "cgal-face-back" : "#882233", "cgal-face-2d" : "#6c71c4", "cgal-edge-front" : "#b58800", "cgal-edge-back" : "#b58800", "cgal-edge-2d" : "#b58800", "crosshair" : "#800000" } } openscad-2019.05/color-schemes/render/starnight.json0000644000076500000240000000106113402025764023020 0ustar kintelstaff00000000000000{ "name" : "Starnight", "index" : 1300, "show-in-gui" : true, "colors" : { "background" : "#000000", "axes-color" : "#e5e5e5", "opencsg-face-front" : "#ffffe0", "opencsg-face-back" : "#00ffff", "cgal-face-front" : "#ffffe0", "cgal-face-back" : "#00ffff", "cgal-face-2d" : "#9370db", "cgal-edge-front" : "#0000ff", "cgal-edge-back" : "#0000ff", "cgal-edge-2d" : "#ff00ff", "crosshair" : "#f0f0f0" } } openscad-2019.05/color-schemes/render/sunset.json0000644000076500000240000000105613402025764022342 0ustar kintelstaff00000000000000{ "name" : "Sunset", "index" : 1200, "show-in-gui" : true, "colors" : { "background" : "#aa4444", "axes-color" : "#220d0d", "opencsg-face-front" : "#ffaaaa", "opencsg-face-back" : "#882233", "cgal-face-front" : "#ffaaaa", "cgal-face-back" : "#882233", "cgal-face-2d" : "#00bf99", "cgal-edge-front" : "#ff0000", "cgal-edge-back" : "#ff0000", "cgal-edge-2d" : "#ff0000", "crosshair" : "#800000" } } openscad-2019.05/color-schemes/render/tomorrow-night.json0000644000076500000240000000106613402025764024021 0ustar kintelstaff00000000000000{ "name" : "Tomorrow Night", "index" : 1900, "show-in-gui" : true, "colors" : { "background" : "#1d1f21", "axes-color" : "#e8e8e8", "opencsg-face-front" : "#81a2be", "opencsg-face-back" : "#de935f", "cgal-face-front" : "#8abeb7", "cgal-face-back" : "#f0c674", "cgal-face-2d" : "#b5bd68", "cgal-edge-front" : "#c5c8c6", "cgal-edge-back" : "#c5c8c6", "cgal-edge-2d" : "#cc6666", "crosshair" : "#b294bb" } } openscad-2019.05/color-schemes/render/tomorrow.json0000644000076500000240000000106013402025764022704 0ustar kintelstaff00000000000000{ "name" : "Tomorrow", "index" : 1800, "show-in-gui" : true, "colors" : { "background" : "#f8f8f8", "axes-color" : "#181818", "opencsg-face-front" : "#4271ae", "opencsg-face-back" : "#f5871f", "cgal-face-front" : "#3e999f", "cgal-face-back" : "#eab700", "cgal-face-2d" : "#718c00", "cgal-edge-front" : "#4d4d4c", "cgal-edge-back" : "#4d4d4c", "cgal-edge-2d" : "#c82829", "crosshair" : "#8959a8" } } openscad-2019.05/common.pri0000644000076500000240000000213113402025764016103 0ustar kintelstaff00000000000000OBJECTS_DIR = objects MOC_DIR = objects UI_DIR = objects RCC_DIR = objects # Handle custom library location. # Used when manually installing 3rd party libraries isEmpty(OPENSCAD_LIBDIR) OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) macx:isEmpty(OPENSCAD_LIBDIR) { exists(/opt/local):exists(/usr/local/Cellar) { error("It seems you might have libraries in both /opt/local and /usr/local. Please specify which one to use with qmake OPENSCAD_LIBDIR=") } else { exists(/opt/local) { #Default to MacPorts on Mac OS X message("Automatically searching for libraries in /opt/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /opt/local } else:exists(/usr/local/Cellar) { message("Automatically searching for libraries in /usr/local. To override, use qmake OPENSCAD_LIBDIR=") OPENSCAD_LIBDIR = /usr/local } } } !isEmpty(OPENSCAD_LIBDIR) { QMAKE_INCDIR = $$OPENSCAD_LIBDIR/include QMAKE_LIBDIR = $$OPENSCAD_LIBDIR/lib } include(qt.pri) include(win.pri) include(flex.pri) include(bison.pri) include(opengl.pri) include(c++11.pri) openscad-2019.05/contrib/BBEdit-TextWrangler.txt0000644000076500000240000000030113402025764022012 0ustar kintelstaff00000000000000BBEdit: Install OpenSCAD.plist into ~/Library/Application Support/BBEdit/Language Modules TextWrangler: Install OpenSCAD.plist into ~/Library/Application Support/TextWrangler/Language Modules openscad-2019.05/contrib/OpenSCAD.plist0000644000076500000240000001433313402025764020157 0ustar kintelstaff00000000000000 BBEditDocumentType CodelessLanguageModule BBLMCanSpellCheckCodeRuns BBLMColorsSyntax BBLMCommentLineDefault // BBLMCommentPrefixDefault /* BBLMCommentSuffixDefault */ BBLMIsCaseSensitive BBLMPredefinedNameList true false undef PI text auto center invert size points faces convexity file layer origin % # ! * $fa $fs $fn $t $vpr $vpt $vpd $children $preview BBLMKeywordList square circle polygon cube sphere cylinder polyhedron for intersection_for if else assign ? cos sin tan acos asin atan atan2 abs ceil cross exp floor ln len log lookup max min norm pow rands round sign sqrt let str scale rotate translate resize mirror multmatrix color minkowski hull offset union difference intersection linear_extrude module children function import include use dxf_cross echo render offset surface search version version_num parent_module $parent_modules concat chr BBLMLanguageCode Oscd BBLMLanguageDisplayName OpenSCAD BBLMScansFunctions BBLMSuffixMap BBLMLanguageSuffix .scad BBLMSupportsTextCompletion Language Features Close Block Comments */ Close Parameter Lists ) Close Statement Blocks } Close Strings 1 " Close Strings 2 ' End-of-line Ends Strings 1 End-of-line Ends Strings 2 Escape Char in Strings 1 Escape Char in Strings 2 Identifier and Keyword Characters !$%*0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz Open Block Comments /* Open Line Comments // Open Parameter Lists ( Open Statement Blocks { Open Strings 1 " Open Strings 2 ' Prefix for Functions function Prefix for Procedures module Terminator for Prototypes 1 Terminator for Prototypes 2 openscad-2019.05/contrib/OpenSCAD.xml0000644000076500000240000000550113402025764017621 0ustar kintelstaff00000000000000 000000 { } # % ( ) ; [ ] < > 1/* 2*/ 0// abs acos asin atan atan ceil cos exp floor ln log lookup max min pow rands round sign sin sqrt tan str scale rotate translate mirror multmatrix color minkowski hull union difference intersection render echo use include module builtin_dxf_cross for intersection_for if else assign surface let text offset concat chr sphere cylinder polyhedron cube openscad-2019.05/contrib/appdata.its0000644000076500000240000000047613402025764017704 0ustar kintelstaff00000000000000 openscad-2019.05/contrib/scad-mode.el0000644000076500000240000002126013454430436017724 0ustar kintelstaff00000000000000;;; scad-mode.el --- A major mode for editing OpenSCAD code ;; Author: Len Trigg, Łukasz Stelmach ;; Maintainer: Len Trigg ;; Created: March 2010 ;; Modified: 28 Mar 2015 ;; Keywords: languages ;; URL: https://raw.github.com/openscad/openscad/master/contrib/scad-mode.el ;; Version: 91.0 ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2 of the License, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; ;; This is a major-mode to implement the SCAD constructs and ;; font-locking for OpenSCAD ;; ;; If installing manually, insert the following into your emacs startup: ;; ;; (autoload 'scad-mode "scad-mode" "A major mode for editing OpenSCAD code." t) ;; (add-to-list 'auto-mode-alist '("\\.scad$" . scad-mode)) ;; ;; or ;; ;; install from marmalade: http://marmalade-repo.org/ ;; M-x install-package scad-mode ;;; To Do: ;; - Support for background/debug/root/disable modifiers ;; - Font lock of non-built-in function calls ;;; Code: ;;;###autoload (add-to-list 'auto-mode-alist '("\\.scad$" . scad-mode)) (require 'cc-mode) (defcustom scad-command '"openscad" "Path to openscad executable" :type 'string ) (defcustom scad-keywords '("return" "true" "false") "SCAD keywords." :type 'list :group 'scad-font-lock) (defcustom scad-functions '("cos" "acos" "sin" "asin" "tan" "atan" "atan2" ;;func.cc "abs" "sign" "rands" "min" "max" "round" "ceil" "floor" "pow" "sqrt" "exp" "log" "ln" "str" "lookup" "version" "version_num" "len" "search" "dxf_dim" "dxf_cross" ;;dxfdim.cc "norm" "cross" ;;2014.03 "concat" "chr" ;;2015.03 ) "SCAD functions." :type 'list :group 'scad-font-lock) (defcustom scad-modules '("children" "echo" "for" "intersection_for" "if" "else" ;;control.cc "cube" "sphere" "cylinder" "polyhedron" "square" "circle" "polygon" ;;primitives.cc "scale" "rotate" "translate" "mirror" "multmatrix" ;;transform.cc "union" "difference" "intersection" ;;csgops.cc "render" ;;render.cc "color" ;;color.cc "surface" ;;surface.cc "linear_extrude" ;;linearextrude.cc "rotate_extrude" ;;rotateextrude.cc "import" ;;import.cc "group" ;;builtin.cc "projection" ;;projection.cc "minkowski" "hull" "resize" ;;cgaladv.cc "parent_module" ;;2014.03 "let" "offset" "text" ;;2015.03 ) "SCAD modules." :type 'list :group 'scad-font-lock) (defcustom scad-deprecated '("child" "assign" "dxf_linear_extrude" "dxf_rotate_extrude" "import_stl" "import_off" "import_dxf") "SCAD deprecated modules and functions." :type 'list :group 'scad-font-lock) (defcustom scad-operators '("+" "-" "*" "/" "%" "&&" "||" "!" "<" "<=" "==" "!=" ">" ">=" "?" ":" "=") "SCAD operators." :type 'list :group 'scad-font-lock) (defvar scad-mode-map (let ((map (make-sparse-keymap))) (define-key map [(control c) (control o)] 'scad-open-current-buffer) (define-key map [return] 'newline-and-indent) ;;(define-key map [(control c) (control s)] 'c-show-syntactic-information) ;; Debugging info map) "Keymap for `scad-mode'.") (defvar scad-mode-syntax-table (let ((st (make-syntax-table))) ;; support comment style: “// ...” ;; support comment style: “/* ... */” (modify-syntax-entry ?\/ ". 124b" st) (modify-syntax-entry ?\n "> b" st) (modify-syntax-entry ?* ". 23" st) ;; Extra punctuation (modify-syntax-entry ?+ "." st) (modify-syntax-entry ?- "." st) (modify-syntax-entry ?% "." st) (modify-syntax-entry ?< "." st) (modify-syntax-entry ?> "." st) (modify-syntax-entry ?& "." st) (modify-syntax-entry ?: "." st) (modify-syntax-entry ?| "." st) (modify-syntax-entry ?= "." st) (modify-syntax-entry ?\; "." st) st) "Syntax table for `scad-mode'.") (defvar scad-keywords-regexp (regexp-opt scad-keywords 'words)) (defvar scad-modules-regexp (regexp-opt scad-modules 'words)) (defvar scad-functions-regexp (regexp-opt scad-functions 'words)) (defvar scad-deprecated-regexp (regexp-opt scad-deprecated 'words)) (defvar scad-operators-regexp (regexp-opt scad-operators)) (defvar scad-font-lock-keywords `( ("\\(module\\|function\\)[ \t]+\\(\\sw+\\)" (1 'font-lock-keyword-face nil) (2 'font-lock-function-name-face nil t)) ("\\(use\\|include\\)[ \t]*<\\([^>]+\\)>" (1 'font-lock-preprocessor-face nil) (2 'font-lock-type-face nil t)) ("<\\(\\sw+\\)>" (1 'font-lock-builtin-face nil)) ("$\\(\\sw+\\)" (1 'font-lock-builtin-face nil)) (,scad-keywords-regexp . font-lock-keyword-face) (,scad-modules-regexp . font-lock-builtin-face) (,scad-functions-regexp . font-lock-function-name-face) (,scad-deprecated-regexp . font-lock-warning-face) ;(,scad-operators-regexp . font-lock-operator-face) ;; This actually looks pretty ugly ;("\\(\\<\\S +\\>\\)\\s *(" 1 font-lock-function-name-face t) ;; Seems to override other stuff (e.g. in comments and builtins) ) "Keyword highlighting specification for `scad-mode'.") (defconst scad-font-lock-keywords-1 scad-font-lock-keywords) (defconst scad-font-lock-keywords-2 scad-font-lock-keywords) (defconst scad-font-lock-keywords-3 scad-font-lock-keywords) (defvar scad-indent-style nil "The style of indentation for scad-mode. Defaults to \"k&r\" if nil. If you want to set the style with file local variables use the `c-file-style' variable") (defvar scad-completions (append '("module" "function" "use" "include") scad-keywords scad-functions scad-modules) "List of known words for completion.") (put 'scad-mode 'c-mode-prefix "scad-") ;;;###autoload (define-derived-mode scad-mode prog-mode "SCAD" "Major mode for editing OpenSCAD code. To see what version of CC Mode you are running, enter `\\[c-version]'. The hook `c-mode-common-hook' is run with no args at mode initialization, then `scad-mode-hook'. Key bindings: \\{scad-mode-map}" (add-hook 'completion-at-point-functions 'scad-completion-at-point nil 'local) (c-initialize-cc-mode) ;; (setq local-abbrev-table scad-mode-abbrev-table ;; abbrev-mode t) (use-local-map scad-mode-map) (c-set-offset (quote cpp-macro) 0 nil) (c-basic-common-init 'scad-mode (or scad-indent-style "k&r")) (c-font-lock-init) (c-run-mode-hooks 'c-mode-common-hook 'scad-mode-hook) (c-update-modeline)) (defun scad-completion-at-point () "Completion at point function." (let ((bounds (bounds-of-thing-at-point 'word))) (when bounds (list (car bounds) (cdr bounds) scad-completions :exclusive "no")))) ;; From: http://stackoverflow.com/questions/14520073/add-words-for-dynamic-expansion-to-emacs-mode (defun scad-prime-dabbrev () "Makes a hidden scad-mode buffer containing all the scad keywords, so dabbrev expansion just works." (unless (get-buffer " *scad words*") (with-current-buffer (get-buffer-create " *scad words*") (scad-mode) (insert "module function use include") ; Explicitly add these -- they're not in the below vars (insert (mapconcat 'identity (append scad-keywords scad-functions scad-modules scad-deprecated) " "))))) (add-hook 'scad-mode-hook 'scad-prime-dabbrev) (defun scad-open-current-buffer () (interactive) (call-process scad-command nil 0 nil (buffer-file-name))) (provide 'scad-mode) ;;; scad-mode.el ends here openscad-2019.05/csgopnode.h0000644000076500000240000000065713402025764016244 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "visitor.h" #include "enums.h" class CsgNode : public AbstractNode { public: OpenSCADOperator type; CsgNode(const ModuleInstantiation *mi, OpenSCADOperator type) : AbstractNode(mi), type(type) { } virtual Response accept(class State &state, Visitor &visitor) const { return visitor.visit(state, *this); } virtual std::string toString() const; virtual std::string name() const; }; openscad-2019.05/defaults.pri0000644000076500000240000000002313402025764016420 0ustar kintelstaff00000000000000macx:CONFIG += mdi openscad-2019.05/doc/OpenSCAD-classes.graffle0000644000076500000240000002162313402025764021172 0ustar kintelstaff00000000000000]ksF<|ڭ~?LdY5-ǒqU*%L@~$A6ESlOM$x{Ϲ}owFQCfa{{AOa|_?}yGa^~tr|q݇ |}rAo?|頟sǃӏ̧ee~|0uN~旿)Op^24SiQ ~|pd5.JZj١0ɓ'Y>?uN)n|ͮi;_Ɵ{=׽ޟ(vGgraggI.Zrx~T6;?G욧_!.}=q\\^._=D2"W:s$-$l.*yf|ʉ_?7|3dyٰφT52c5 U/$N< z-Az Tz6&uj4Xd^i_%IGx}&ڿLxՇSAp},̗߮yyݭ8;S*g`Ǩ+xKvZ'XWM85wuTnޯ5''rF6B9ƌ3eK>JRCjm$eқQaf['O\?MP]ƪakZDlʞ,ek]MFטzzue6Hѵt}:e:¾M%BsE׎@:_+RjOh|&BxS=ňfF Ru E"6yFQ0z;*"/= ;f˭:h[Zi4G$8cY;ϻ Ӧxli2+фmC)HZ09qsVyQ;%$Kۣ5}dEp8/Z!n_Ymt50k!cDŽj*N;JbQRR@A`?ZM8/qs0|\/yă ]ii7పfEH;a/)G{*lB f5ўe"G,,7e/xܬy&hfGH*(l$ NFНIrCB$!y9I'Yd` |+ B 3^BzIpIh} fBA{D=b;-I-Bڥ cBZ|%$ A+י}R؅R!i1X!A< *C@Oҽ[3CLAiI6Rg^lv.3XzA%M^ nûT|Elk-:CӶj{=Egȍ,enxnx owa,f@ײܕ!wpgRzjƙ6Ucfcp&Ǩ0!$X|s(v(vp.*q}kPT4:!O"Y-d:l۩n &[ʔ f&ERO+"͎X|D1ơ"ٍ"]9Eɾ+'H6u<PXk>fӈBJR N(MU# gM=B8$ fAv6Eܴ2S5R^Ԯ2Љ+6dIw>z7#g`S-zBd! ZVuFʃw)Vrq$%H[MlL4D ̎$ܙN8 4$I~p 4n}"v)L^PJ-]u4Ȳ72ȭYR-38pLq0Sy6;Hv/ Q—>A%-2m%a"R 7 }D;](VPmnhu 4c,VA% VG@Dv+pYd4G_<tq;v`[||Jrsw)`K0'Nh_tiu_7j';$k&F۰l-r-[|KʷŘl S0ۢ8n{NMVa-=Cדy녹jo!GՒNTGHk[1+h#nBm%1c]`?|zp&Io`KUƻY ى;ōy^$ȏ?Z=du|Xe]B=VT 2ҹ6JHd>7k񤚇OMDJ!`&qQM\}-Qkrj,/Ÿ9w3Fy ~-mҀE.m崅zjIl i8AjOvqMXt#RRY ж.$ O?73gp^t{]]y zuaX3)x(BIS̉ 4-%,È@o!<ĥBcF4n=Hy2JeMV;}p(ʂiqo<5\Hs! 5GZ*L#y'ŔB,UiiLZRWƄ׈0*.Ȼ$Zj33]afxԭkk i.hJD[̜Lh>_bÌr H[oifGdY;ⴊ8Q[Y\jsոfJfW/MARA',JHȱV)%aR24:j3h\*UXm-hn}n[ҏ PY$(^ZmHбD"AqEܕTM]54-jYGPd歘\Dd9kgOԵ9#휁sv}D#XL"0bkElgDDad*n;CܜZK3? _%GzbӶS)(Tx2)B`Lh5!@)H1C:Rݺi/?i`U$rtS$Y#ZNx {&DY7{Zw25@;pOs@g0 $X@0!UF#YjOd2nH봕7rdJde PZ 3rI67VO_68auQu&G4qkւX̃е n&JDR(qs%#u_S VjsQ+u$AH ='joiZԼc|t;fZmؗprۺ]is1T)B3s kK* `\1)Z\vXy YIJ9Y5Gc 3Yzf/H="\Tf/HPm+%\ լin7n.=D[f6 e6] Wbk{zxq7 * ]?6/ dsVuٳEWG@]ZR?4|~XRS)OSH6u E'(\ #a\,'R!1#i1yZP%mnRO ,<dfqM83LQ#׶̀jgvGZVObQeqZhI )Ģ{a&(P.י'`CTCɴ)fpbC&8p(qMe[ZrYjEJOR4QO]R|IoD;66{:qmsGYYzC'&2^ 3 ׸uK)z2BI\ɗUobqxVؔ*a@Ev9]>R4ayl(o.dKWmlGT{w9'KiY.1<03^YphN5ӕT onpՇZLpe>d4M!N?M=8eC08o b̓[2[*^˃pd'I`~ځֿY~1X8kK2õ>354<̃W *惽!=b;8Вm\OIGT"Ƀo4 8ȳ:7?$}$f +N#xg٣$ϓ<,x(U=l` 2=ó$ 0!0^yu''okN c7zv,9`<5FC{pvٯ|x?͓ۛOç_`y (]q5=~%}9V6;G}䚛Օjb*`f!ט]x-,|./9K|o:>:> stream x՝[qSf{fzGHC֍`o($H YYZ gV*O_t8_Oݫÿ:|oNN7/m*|<餍7/~W|߼9=N~<|:Nv>cx𽟼=k̺pRB5Z'Z ](۸Yt22IÞC:kK2Wog9cLeyݼ>u:]rՆNGo)\ :ZX\|u.ʥڢ,Eޖ"+pj.xNf,r]ibPEON45bŲ_NXejcS2L' Ǫ7-ŢZ7/\ :% wmwO=\L6B/+~wZ抏Ykw޲ɻܐ4뭫wX!{v &S,xtMCf͆0YVI'w;OUPj48,4ެXoݫ4eZBq|(7?KK-8\mvw,Y?1⩻ݎ ѐ&*cL.V;H: NYq.KhH !Y" KBGkݬ  %M*k*Lr.kl !RƍV\V[E \ 5W[0ڙ6rbю hY5T3\d<{Şs>L73l`}-2Y8Uf22S9m[X;=c38h1Fc~]S2e2ȄZ&yY-eݪZ&yxLa4NDn è}C/R/4EDl8?}.=VeNcڼXi1J 61X)|XeK7߇0wbCkac2FXNAV43$b^K!d1$m'a"er7,6Єe c 23:4ŊJimLRΖ(ƨ0/09Z-bHY2v&k-5b[b(m4!SKivjcېbC Gxpyj4(K)lTn:KZj9 [UZc1zungi0:ƣ{d^q!ݱ\ٶ^LX[^ Ԛ }dlөQւy ÚiiP! r$vPu *b 7,+&GnMIkӠL M3+PsM'n6 H8Py1>܏ W=˟Pq\ Rzc!Ė9fETR_z˫Ͼ~߿}_J(t:ϐbMh9#o NH) 2akm(>W!r<|"Q |~fX*c}y2opv !t9E =L#8Ctd~#qh/ݼx9x}ӏ?9ӻOo pxrtы28 9 gm)HZ4.)cHZ ou~l*c(%f(N}cc Kw7D y9]flLj!I9n`hqV<{WԹcyw^JyR^a(Lz;˾ˏzxrEN"(O:I"=|A=L0`M:i7ؗ / 〰}WMrb䎽G=GttI$X/?.+.R{Ɗ&uz8]%|G dX^!|-(Xb8bq3Ӭsg = *R ՞m΄*#QhU/P?m]l{#iTc-g'Q(aDmE![#|6nH8"@aY.G):eF "z|9ZO;wm(R K{Wz3:M+C1{l%Ӛ~ [&DH&KlDt`cytzvC`m|{0L!ĢmLDTb^"RCשWKһUdͤ U__vӱG5uCB)$WDAd^i^{ (m^x( "%k^eDUSa9[ ‰C*.(m Q<I{TbP T$*v0/סڹLld^٬§(YRݛ\ E9ݦ %,,.jgs aaٰR'4M6G|z6FlBqG*)3]DQKtcX^6bxxij↞u'M*̱'MxR.uԹ~fZOS/1lak/~'_$Oܮ)\wcTV HuoC :|TktokI) ثuӈ9LU[Ci´LtH}Z}"*A1fa_EJo1_QK@XukuZQKN~ϧ:ĺj ~GjLtK}`Kڡ`~ZET8"# ݉Ǯ"sHX!R8Q TdbֶY|N~dz!)Z{~91Y4LG,xݔ>w_L0}C2{˜a,x+ o hqk(Ac6y`#ds\!-' ,un-L돷I.s>+S첛1[~[%||:#@Ȝ[ X^{S[݈} KO4R.u9I;: Z.u/}H=z7 9&>,z3sL=oW\qADA˂S7Q+d c_f[|>.Gl%i:?8:ݐr0Jԭ2J=Q2}jLOUhXճ(~i "ϭc_gH[ f ,ګmhlW3aR;q \);b\e/AźWv0 ]7=5NXߪ=A6FԷn؄6T"](v̆-չi H4Mf:x~[vdIJW3)kbw2` >Ȅ* Ql;`Mi!lUKw+r"uL|Ե#koε~1SYb: $ _ęF<Ս4Z_Փt7KM6]0;ㆼhViKAG".y8?%]XUY)8Fs@@wCZPBP TXY-: v/K=;`jq$p!zIXH=iFqSTq~+8 Wa(×FdGaY;zM! gY U$8eR0ȑ 6##CVw-[I]sa2,*1oiqN0U1Ma~*1~m֝Ó0!a_&6cnp&-e:s:{sa Lf\I0 W0 -H0,uڿ77P-9w%&,u5'(Y Xxe$bmݘ@\OZiy_g\,Î9>gDRB ea,Vm}N8ǃXK%N~C|}|:3k1ר[1*Z{yU&N[䎥A[\a ,^{c ?E2^o1@Ǒ ȲExe?F2ʙX[ص\FV6:Q6z3nLRbKӓhRmYk8&,=V*z0J0: a"  vlզ1\2G>1&iP,Ss꧞v׋`G,諠/EbB%L%G&[&C5Tj@N/ogArCTEҋ YMXb)25h& Q}q@&f`iVF@N25ߎ$n$T~nQ5w!_;3`͢\wa A.R%&w8sʲ:հ 1:Vt\.FF06fiѤ4 -ʼ\J`IYmZ${!4ADri K&U *4Sۗ~A_T-TRJL. Q0ӿq!'8KE2\ (!bdI8+}O}# ǣn0:tv)qHXվ#Hө6LrMiXm ; jҀ1s,YI,='OW"}JgH{l콍typrJ%FrɳIXx6;5+ݜ8T$ρs3 pFbD$v-{W| ޛ'1 <<+wXc4SMkSՑTj_N`qhTwڕ4s߶!Ay,,N IacW’$K-:K0Uc1Q.H4`4CNZ)gɨUWջC8#]9RLrAwYMj)ҳ$ȣݛaRr1LA/{_|$" 8AJƬca+AYqQYYj[Z0(2r(P-j B4tkZLR?tq]D{YAx{`T-aeav؏8:r!Y2H#fq (P.HFފxYΡr玽s.rEDnvu{A7Ri9&3g> ?Az ֛Nxd\#kv:꼩7--̓PE|(,f#-`~@ &I栠1 61 8,PP`~+8މAo'1f6K_KYkIHDT=.=7`RF.IA|Kk-A hE kEH.rWj=BK,¡Tw6 R s+bzֻzLaH9>)(z]l^U+ϔTq.Y9̡pɗ'MU0Y݃ި-[Ǒ#G98֮|7}&Z]ڼ{s_]`wq{O9ևRe 8>*?u)op ~ɾsZ1nXX=b?_~p^WGE^_)MXv71y̙#NIjN(FĦk>\8pe>=fIG$kXo~\ ^n 09aߧbhq3OU, ѡa15! ,jLS74X~u_ђ~ݡ~{󌁠~pFdl%g][ ><'yK: h" | IJZNڄqu,~aE|h(H0{+;;E3fH"=}V&|Ol7(ء|=W݄l[-<2֜/w,yIt.^7,:ސrT`ܹ~x3^'+x~O S*|epQcy.+; 孶\dj?LoYrm<,_ إ@6y%]? :\27r>W$ Uª:\Q⡩2zxy( K2/8ƁbCi;^7ۼ#R7FiÔ-IE,DaO|YMO״-<֚тŠeZDiQ811DOmE-i->F <:KZ@-uDg;iF?>*i1S7%˔Sp$Ǜe%$>[R[|2oP $|]ʷ)MWfF4lDV劔eRZ.EsJR˛Pڊ[[|mR',YTmBugMK 8 v$7ɝcXESBZ#!6NK t KkhֿGUT>v_δ1K7%pE)6Fx}S玥yt (ؒhڧohII]=9:0@J{oAkڪ򼺗qxܝ1ciq,ȝ[l[lDJys^o#Xt[΃f&rcNj)=$/ݓ$ s䶴=o/W?iAmKMb }L$ey(7[soM}rU\)'asyAsiӚTKt|Ƨ'V߼ջ_zw׶sؤuC*W,OȤKr,&[Z%;،#-&u.+r+NIfIO!J$ *L帆pT5M MZ6aezw/-ce,Lm2rގ+4 v!cNIPk}WtGl˝W<,8cZS -7t1"Wq?'IY~Ey\l5lK&ZfµCTwfeXty¡L:;$n"/ڿQmXmnUܜ3LNnK.dYm:{n7y~KoqXk9K2VdZ :cr.{Ho`8Lj5Om;$IgU,p(bV7c (%Wܱ7ɣ8yƩc97bR;\Si-YRQ8@ QN{7J{3~RP(IVJJ-y'[ԹcE4ZR` 7?ZLTZ/勦N -|TOC!_~xI͊ͤ>-rYu3T,_IMRJc͕  g-6}ݥl\Ӛn4EV9#,T&nMh99Ϯu lnqJS%?#n:w0Һϋ3=QQ2 #K T7zތlxlC%no@݅ҭ],uNybKinܺi5M`ڷ&B:qܛw8CTc|I:;ރrSI'H|R.3>uΕL$&^2!CTOyx%L{cәVj9O?$]DW}'4'uA;u,(H<;ǺG/hXj2ɵAY8:>IfA3*5_37k-fqJzۺV ;DF@7NLġ+|xiĈ]7y3iu+B: i!䎙2t-B"mE,f2jxxu>v׳\끚#e1̓ZZlS s <\S9ܖc3[ܣ#SVA/-1m@3o*F+3ڲf" *:4[0!aZ.tɱqLT79Į#o'9s&ⴼ!wԹվ#._N!r_X]홷cYx-G_ѭ,=}+(,ޕ+o ULh-:Z{J[ )s%k\hdu דTױ,4'oDdM $ JJZK4# K*h ;aTf8ZXjߕUN t5̼*~H?#g[ls ^Pյ 2Gk㦊-D~#hW<V9y\vF`33䵻vX%*FvK$H`%Ż,aN'[% `h1H` ^Fb3b͓+ɋ~O]Y,<,Q3*<-JyuOUx`K |'I#,1^Y5Z9ōPC>k D'kG݊qmbU$N;k:]9[c]V L0IJުYIqXm¸+7;^ dJxna}5,[[a ^;p[pFԹcs2v6k`3^cYW Pܪ[E֝JNuR3 Vw5I֣n $pN*AC yD%ke'If\x܅\qI>ӕJ9ܕ[TlI2n$_#nK)ab)Wӓ=6˝5&oldr'8xGsyu n1#37\<󮎥Gs&gxgt$ ޑarzgՐr`Q7ԹվY{'y-鯣ujE닶~sK).kè,?q|;a]6aM/ŷg3*w)M{orG.oDhț0`O0mԡ2cK_?8S/*_ DL'Asw^*<L^Ea&-Dn1iÕtD^Xh9әP~n~7_72`}#ڧǃYAf`ZXAtLLn3U4Ks2.5{Qc~zʥ:ҙ((Wx yR$“X}J88aЕpa֟C>>@bJCHXWLڎO]Ks.WLtcIwĜz?bܵ@+≃H2'Y c:fO {+>ےEm:%9tƉF1$]>f-oǙ$t,J4rI$:++yrf 鳯|}S431x&M-Y?Xo-lO Bw!;c<~AjPڪ\ H"(U4|e\s7b8!c$_x/›= A/0}yJIzLX.%_5amXf-̄\>,dᮤx(OuN*_)s{^< cp;`ТRv}ؗp5$ W !`6P*; 3Yz( rIWqT##',f3o+"'w~cUmP e"K^xa9hL 83 '! S혡Q׀!yj؜7؜c`]i=wux+Mb|&;~=<>QǪjkn⾔_vVy.e`"–8=sg?O?/aC}g6 ^2I}F#^DuV(*[YŀA{! և!1 VHiGuu{yPװl!%|N*%. oj҉7P|k4g07 O.OIJǍv>Szev_YR,0~b/ #.|c搼n$_ƠC"O _J#*Pb6X)ywJ?xg}TDX6j(AXﲥ})ꇒ#qxT[u66'S0!KDbʆ Ri s&Pj#+ pɪ8@dJbXuC?wRZH[#;շ#>}Wq^(0ciW{V7@F^MfckK7M1q-zbJXXlJ9w` 4ɮ74N9ZeMB>ΈЋ&_""B}o ]:-s.J#D>_+Oċ(:ίC)bV̍L ]/7.m)|޹C3Nc;^?K}cL)=tbop8ޒ=ZV.jqbGYfoߪ? ,v|E՝m ԬY ضvlY[xUZro\٫ ~W-+#.$o4r*#Y3ZEB7* pWJ4rm^DkZJO\tqFܶ9&g҆q)OˑTb(:W--QEd iȅb,V`"a(u˃8S`z+F+kia 'V p"O>CÕp:h Lo2 !V{~ 9!\DĨ8q&vP;bI)Q% JUy\9l`r1cYGo;?4̢vRVttf=YzzTW)I"@)3E 5ؕa!X?+J$KZ;M=E"CG\y /+<;A"ONsy%~|ȯTU >r((HU{b KIr,3Db֫'#A1<2߲XdkO8_<{oð1j}\zi yʫ58X&k= -K ;1(KN WEVW)dmK>ͱp& h1D@pm\ȓ>QNrh->c"%$ }"K)b@"PW5HRy)y%4a /8y)VC~3 Z']dlCxX?-yrd8Vx^Gge+"H5p7V؋rk81b@\R.u>q,'V<)t7^yd{r{/#rN9$I3#RJظ2 v2[ېVR7UN~GM)e҅A %'6C[rѳa}HX׉LQ'?3$EIͰ14ĕ˨A.~@LXQ+)bQֶYK^z H}JڵN@Owrr.3m^rAd'nο8{gJ|aFȨH3$1H&]!UP_ZRΎ8_QYXCp(SZGKoEt -BuyI[$FMݼ"˟^@X*D:5(P\M v׏UfJI1$NHEiԫ8GS4;#hew? ^^xH*/:w-I]{K< _2@'__֘?3ᭊJ:3e,ktg%a !daq!rZ|hi`ʈ eAӬA*sKGcҒ!uث1T#v5tJc萇u<`xi0ZI]"YxXB胤/js9SGIQ`Y9lņiyaS\6RQv BECt ]VЎYK6tbC׻vDH'ZZ2PN n0i\׿MbvncdC i'u /P'WaUcbVwdp此e]e%QWb+v]eyRֵڷaݫw[BCSDb): [k6l)ZNdPVZM4`ag @<0AYX;hׇuI0T6lw [bfJcUQ֪cեe}fX!u4zBZeкmI(&Ƭ5Hܸk6){SjOmUQa .&$a~*fp"(ںJuAH Eq)n$ZȵjgG;(X\jKEtR&zf|UKbÑ\ au̶>Lhτ<>08L){&Hn!b ca?3?*OHGܜ JU!c>) WÚdxo|}?yўgҵ7z0˩pMXk#;p0;4G} "|p!F׶|.͜#s=&;x_ļ_Ai 5$!,]HoI YwIsTrE\=a^F֊) E}ɃĐ?hg,yjk W4@ѕ뵷&'|J)nCvD6㷡O/H%yօ:App$ )Ç5t>^HC=? z펣 0]TS@ eRE`r,tdfa'xRٺ޲tX5V$ep2xSx0!"PʖK]<3Ր]xނYБ]AOiD,:h8-vydfo׉s\_yJew!Nó &OV˶0m*k)l=jfR2W+3D%A{zrj$AUa戮 l;d3>lK8qĆ_і;$)@ #_b%<~g5)УbOcc(K2iD/bEÿi{usbHtV~#o"}0R1'KN Bn*BR-,ѲYkBlcy0Fĵgd Ib5 2p){^],S@ :dPPKK9?+cc pT؋%^^8kz<RQ܂ #J}^> LX$DZU9#H11;Fu艿^7MܸU9jܣDqBwG•K(0j$pO0J&xvA*p\gYN@j8`'BKpŁ+rhc\A6vŧ$2mjy^n mEr%|jh ^aaCwa#`td>4,XEK K,ZCmXW<bK0l|3:0hv !V~Zw|_9УrgEΉd'v'Z}Nʉ #\$=NP46}@X74BkMpGZ3v=Ϙб81bi{L(e×t/OCh`*?Ee3]$ 6)X*) E#xI5a/ \@0Eڝa5aHQ1># e^SQ &9codiZ yL[!zX:pMvO?09vOhPiIM$\&MuNR0މ rP(LBB ϋbyXi$s ì!ymPM4X CɴT%kjF^Y|W_ؽ㓣M[> F$p F7hbZn'Q FJH~O]˦D׶;AkTɲ/'(A(ӣ ayV.cu/޼岚5m̬[Mu//Q Jslz;f ܓPru2})Aľ9;&X"̺;k^؛̓~ $T /K h # "g &M&1u3*򐛄BC NJT4VAxPѭry6B_rjTU}a9QiٺP='d}E%ـ3:} ! e|57({~*gI3#Οȸ\XL8?/˄S_iay!d-ץS^ g BkH fTB}RL[^41 VJ|̬UrcL5eÒKTGe+\Sjx?f?9pQv4{J^l;$(q br A[\d 8\}𝆧c;M.EHC)5%apfZeUvx~7h|_#JIX%J~*ɳ쳨BLԻ+RO:7dy%plwmWq؆U9\pámVúSHvjU j|k)䜞tH\á].55kț!!vY jc endstream endobj 5 0 obj 19736 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 2284 2454] >> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs2 266 0 R /Cs1 7 0 R >> /Font << /TT2 268 0 R /TT1 267 0 R >> /XObject << /Im44 94 0 R /Im118 242 0 R /Im97 200 0 R /Im90 186 0 R /Im43 92 0 R /Im65 136 0 R /Im93 192 0 R /Im12 30 0 R /Im22 50 0 R /Im74 154 0 R /Im105 216 0 R /Im55 116 0 R /Im82 170 0 R /Im56 118 0 R /Im102 210 0 R /Im99 204 0 R /Im64 134 0 R /Im1 8 0 R /Im117 240 0 R /Im73 152 0 R /Im119 244 0 R /Im122 250 0 R /Im77 160 0 R /Im48 102 0 R /Im81 168 0 R /Im49 104 0 R /Im114 234 0 R /Im26 58 0 R /Im104 214 0 R /Im100 206 0 R /Im63 132 0 R /Im126 258 0 R /Im46 98 0 R /Im72 150 0 R /Im19 44 0 R /Im129 264 0 R /Im47 100 0 R /Im80 166 0 R /Im51 108 0 R /Im50 106 0 R /Im106 218 0 R /Im85 176 0 R /Im88 182 0 R /Im28 62 0 R /Im13 32 0 R /Im62 130 0 R /Im91 188 0 R /Im7 20 0 R /Im110 226 0 R /Im94 194 0 R /Im71 148 0 R /Im109 224 0 R /Im128 262 0 R /Im37 80 0 R /Im127 260 0 R /Im41 88 0 R /Im16 38 0 R /Im79 164 0 R /Im101 208 0 R /Im98 202 0 R /Im2 10 0 R /Im30 66 0 R /Im15 36 0 R /Im35 76 0 R /Im61 128 0 R /Im116 238 0 R /Im54 114 0 R /Im20 46 0 R /Im70 146 0 R /Im34 74 0 R /Im40 86 0 R /Im78 162 0 R /Im14 34 0 R /Im112 230 0 R /Im123 252 0 R /Im121 248 0 R /Im96 198 0 R /Im24 54 0 R /Im29 64 0 R /Im6 18 0 R /Im27 60 0 R /Im69 144 0 R /Im4 14 0 R /Im115 236 0 R /Im17 40 0 R /Im31 68 0 R /Im86 178 0 R /Im60 126 0 R /Im89 184 0 R /Im92 190 0 R /Im113 232 0 R /Im68 142 0 R /Im95 196 0 R /Im38 82 0 R /Im39 84 0 R /Im125 256 0 R /Im42 90 0 R /Im8 22 0 R /Im11 28 0 R /Im59 124 0 R /Im120 246 0 R /Im5 16 0 R /Im67 140 0 R /Im108 222 0 R /Im3 12 0 R /Im76 158 0 R /Im21 48 0 R /Im33 72 0 R /Im103 212 0 R /Im84 174 0 R /Im111 228 0 R /Im58 122 0 R /Im45 96 0 R /Im66 138 0 R /Im32 70 0 R /Im25 56 0 R /Im23 52 0 R /Im75 156 0 R /Im36 78 0 R /Im107 220 0 R /Im124 254 0 R /Im18 42 0 R /Im52 110 0 R /Im83 172 0 R /Im10 26 0 R /Im53 112 0 R /Im57 120 0 R /Im87 180 0 R /Im9 24 0 R >> >> endobj 94 0 obj << /Length 95 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 270 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 95 0 obj 79 endobj 242 0 obj << /Length 243 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 272 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 243 0 obj 96 endobj 200 0 obj << /Length 201 0 R /Type /XObject /Subtype /Image /Width 132 /Height 48 /ColorSpace 269 0 R /SMask 274 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 040J@ endstream endobj 201 0 obj 106 endobj 186 0 obj << /Length 187 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 276 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 187 0 obj 100 endobj 92 0 obj << /Length 93 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 278 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 93 0 obj 79 endobj 136 0 obj << /Length 137 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 280 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 137 0 obj 83 endobj 192 0 obj << /Length 193 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 282 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 193 0 obj 100 endobj 30 0 obj << /Length 31 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 284 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 31 0 obj 100 endobj 50 0 obj << /Length 51 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 286 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 51 0 obj 129 endobj 154 0 obj << /Length 155 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 288 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 155 0 obj 87 endobj 216 0 obj << /Length 217 0 R /Type /XObject /Subtype /Image /Width 143 /Height 48 /ColorSpace 269 0 R /SMask 290 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`Pp endstream endobj 217 0 obj 113 endobj 116 0 obj << /Length 117 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 292 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 117 0 obj 83 endobj 170 0 obj << /Length 171 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 294 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 171 0 obj 129 endobj 118 0 obj << /Length 119 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 296 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 119 0 obj 79 endobj 210 0 obj << /Length 211 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 298 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 211 0 obj 100 endobj 204 0 obj << /Length 205 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 300 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 205 0 obj 96 endobj 134 0 obj << /Length 135 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 302 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 135 0 obj 83 endobj 8 0 obj << /Length 9 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 304 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 9 0 obj 96 endobj 240 0 obj << /Length 241 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 306 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 241 0 obj 96 endobj 152 0 obj << /Length 153 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 308 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 153 0 obj 87 endobj 244 0 obj << /Length 245 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 310 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 245 0 obj 96 endobj 250 0 obj << /Length 251 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 312 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 251 0 obj 96 endobj 160 0 obj << /Length 161 0 R /Type /XObject /Subtype /Image /Width 234 /Height 26 /ColorSpace 269 0 R /SMask 314 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0`GL endstream endobj 161 0 obj 103 endobj 102 0 obj << /Length 103 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 316 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 103 0 obj 79 endobj 168 0 obj << /Length 169 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 318 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 169 0 obj 96 endobj 104 0 obj << /Length 105 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 320 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 105 0 obj 79 endobj 234 0 obj << /Length 235 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 322 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 235 0 obj 96 endobj 58 0 obj << /Length 59 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 324 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 59 0 obj 96 endobj 214 0 obj << /Length 215 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 326 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 215 0 obj 100 endobj 206 0 obj << /Length 207 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 328 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 207 0 obj 100 endobj 132 0 obj << /Length 133 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 330 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 133 0 obj 83 endobj 258 0 obj << /Length 259 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 332 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 259 0 obj 129 endobj 98 0 obj << /Length 99 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 334 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 99 0 obj 79 endobj 150 0 obj << /Length 151 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 336 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 151 0 obj 87 endobj 44 0 obj << /Length 45 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 338 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 45 0 obj 129 endobj 264 0 obj << /Length 265 0 R /Type /XObject /Subtype /Image /Width 173 /Height 48 /ColorSpace 269 0 R /SMask 340 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` aP endstream endobj 265 0 obj 132 endobj 100 0 obj << /Length 101 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 342 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 101 0 obj 79 endobj 166 0 obj << /Length 167 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 344 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 167 0 obj 96 endobj 108 0 obj << /Length 109 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 346 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 109 0 obj 83 endobj 106 0 obj << /Length 107 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 348 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 107 0 obj 79 endobj 218 0 obj << /Length 219 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 350 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 219 0 obj 100 endobj 176 0 obj << /Length 177 0 R /Type /XObject /Subtype /Image /Width 173 /Height 48 /ColorSpace 269 0 R /SMask 352 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` aP endstream endobj 177 0 obj 132 endobj 182 0 obj << /Length 183 0 R /Type /XObject /Subtype /Image /Width 132 /Height 48 /ColorSpace 269 0 R /SMask 354 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 040J@ endstream endobj 183 0 obj 106 endobj 62 0 obj << /Length 63 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 356 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 63 0 obj 96 endobj 32 0 obj << /Length 33 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 358 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 33 0 obj 100 endobj 130 0 obj << /Length 131 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 360 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 131 0 obj 83 endobj 188 0 obj << /Length 189 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 362 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 189 0 obj 100 endobj 20 0 obj << /Length 21 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 364 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 21 0 obj 96 endobj 226 0 obj << /Length 227 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 366 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 227 0 obj 96 endobj 194 0 obj << /Length 195 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 368 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 195 0 obj 100 endobj 148 0 obj << /Length 149 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 370 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 149 0 obj 87 endobj 224 0 obj << /Length 225 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 372 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 225 0 obj 96 endobj 262 0 obj << /Length 263 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace 269 0 R /SMask 374 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om_@a 0` 0` 0` 0` 0` 0` 0` 0` 0` O endstream endobj 263 0 obj 113 endobj 80 0 obj << /Length 81 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 376 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 81 0 obj 96 endobj 260 0 obj << /Length 261 0 R /Type /XObject /Subtype /Image /Width 167 /Height 49 /Interpolate true /ColorSpace 269 0 R /SMask 378 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` \_ endstream endobj 261 0 obj 131 endobj 88 0 obj << /Length 89 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 380 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 89 0 obj 79 endobj 38 0 obj << /Length 39 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 382 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 39 0 obj 96 endobj 164 0 obj << /Length 165 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 384 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 165 0 obj 87 endobj 208 0 obj << /Length 209 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 386 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 209 0 obj 100 endobj 202 0 obj << /Length 203 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 388 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 203 0 obj 100 endobj 10 0 obj << /Length 11 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 390 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 11 0 obj 96 endobj 66 0 obj << /Length 67 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 392 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 67 0 obj 129 endobj 36 0 obj << /Length 37 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 394 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 37 0 obj 100 endobj 76 0 obj << /Length 77 0 R /Type /XObject /Subtype /Image /Width 167 /Height 49 /Interpolate true /ColorSpace 269 0 R /SMask 396 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` \_ endstream endobj 77 0 obj 131 endobj 128 0 obj << /Length 129 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 398 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 129 0 obj 79 endobj 238 0 obj << /Length 239 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 400 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 239 0 obj 96 endobj 114 0 obj << /Length 115 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 402 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 115 0 obj 83 endobj 46 0 obj << /Length 47 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 404 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 47 0 obj 129 endobj 146 0 obj << /Length 147 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 406 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 147 0 obj 87 endobj 74 0 obj << /Length 75 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 408 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 75 0 obj 96 endobj 86 0 obj << /Length 87 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 410 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 87 0 obj 79 endobj 162 0 obj << /Length 163 0 R /Type /XObject /Subtype /Image /Width 234 /Height 26 /ColorSpace 269 0 R /SMask 412 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0`GL endstream endobj 163 0 obj 103 endobj 34 0 obj << /Length 35 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 414 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 35 0 obj 100 endobj 230 0 obj << /Length 231 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 416 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 231 0 obj 96 endobj 252 0 obj << /Length 253 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 418 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 253 0 obj 96 endobj 248 0 obj << /Length 249 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 420 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 249 0 obj 96 endobj 198 0 obj << /Length 199 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 422 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 199 0 obj 100 endobj 54 0 obj << /Length 55 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 424 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 55 0 obj 100 endobj 64 0 obj << /Length 65 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 426 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 65 0 obj 129 endobj 18 0 obj << /Length 19 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 428 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 19 0 obj 96 endobj 60 0 obj << /Length 61 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 430 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 61 0 obj 129 endobj 144 0 obj << /Length 145 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 432 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 145 0 obj 87 endobj 14 0 obj << /Length 15 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace 269 0 R /SMask 434 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om_@a 0` 0` 0` 0` 0` 0` 0` 0` 0` O endstream endobj 15 0 obj 113 endobj 236 0 obj << /Length 237 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 436 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 237 0 obj 96 endobj 40 0 obj << /Length 41 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 438 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 41 0 obj 96 endobj 68 0 obj << /Length 69 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 440 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 69 0 obj 129 endobj 178 0 obj << /Length 179 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 442 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 179 0 obj 100 endobj 126 0 obj << /Length 127 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 444 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 127 0 obj 79 endobj 184 0 obj << /Length 185 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 446 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 185 0 obj 100 endobj 190 0 obj << /Length 191 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 448 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 191 0 obj 100 endobj 232 0 obj << /Length 233 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 450 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 233 0 obj 96 endobj 142 0 obj << /Length 143 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 452 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 143 0 obj 87 endobj 196 0 obj << /Length 197 0 R /Type /XObject /Subtype /Image /Width 132 /Height 48 /ColorSpace 269 0 R /SMask 454 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 040J@ endstream endobj 197 0 obj 106 endobj 82 0 obj << /Length 83 0 R /Type /XObject /Subtype /Image /Width 167 /Height 50 /ColorSpace 269 0 R /SMask 456 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0a endstream endobj 83 0 obj 133 endobj 84 0 obj << /Length 85 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 458 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 85 0 obj 129 endobj 256 0 obj << /Length 257 0 R /Type /XObject /Subtype /Image /Width 143 /Height 48 /ColorSpace 269 0 R /SMask 460 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`Pp endstream endobj 257 0 obj 113 endobj 90 0 obj << /Length 91 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 462 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 91 0 obj 79 endobj 22 0 obj << /Length 23 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace 269 0 R /SMask 464 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om_@a 0` 0` 0` 0` 0` 0` 0` 0` 0` O endstream endobj 23 0 obj 113 endobj 28 0 obj << /Length 29 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 466 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 29 0 obj 100 endobj 124 0 obj << /Length 125 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 468 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 125 0 obj 79 endobj 246 0 obj << /Length 247 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 470 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 247 0 obj 96 endobj 16 0 obj << /Length 17 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace 269 0 R /SMask 472 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om_@a 0` 0` 0` 0` 0` 0` 0` 0` 0` O endstream endobj 17 0 obj 113 endobj 140 0 obj << /Length 141 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 474 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 141 0 obj 87 endobj 222 0 obj << /Length 223 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 476 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 223 0 obj 96 endobj 12 0 obj << /Length 13 0 R /Type /XObject /Subtype /Image /Width 137 /Height 48 /ColorSpace 269 0 R /SMask 478 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0`M endstream endobj 13 0 obj 110 endobj 158 0 obj << /Length 159 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 480 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 159 0 obj 87 endobj 48 0 obj << /Length 49 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 482 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 49 0 obj 96 endobj 72 0 obj << /Length 73 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 484 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 73 0 obj 96 endobj 212 0 obj << /Length 213 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 486 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 213 0 obj 100 endobj 174 0 obj << /Length 175 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace 269 0 R /SMask 488 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`] endstream endobj 175 0 obj 129 endobj 228 0 obj << /Length 229 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 490 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 229 0 obj 96 endobj 122 0 obj << /Length 123 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 492 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 123 0 obj 79 endobj 96 0 obj << /Length 97 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 494 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 97 0 obj 79 endobj 138 0 obj << /Length 139 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 496 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 139 0 obj 87 endobj 70 0 obj << /Length 71 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 498 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 71 0 obj 96 endobj 56 0 obj << /Length 57 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 500 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 57 0 obj 96 endobj 52 0 obj << /Length 53 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 502 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 53 0 obj 96 endobj 156 0 obj << /Length 157 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace 269 0 R /SMask 504 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0`9H endstream endobj 157 0 obj 87 endobj 78 0 obj << /Length 79 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 506 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 79 0 obj 96 endobj 220 0 obj << /Length 221 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 508 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 221 0 obj 96 endobj 254 0 obj << /Length 255 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 510 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 255 0 obj 100 endobj 42 0 obj << /Length 43 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 512 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 43 0 obj 96 endobj 110 0 obj << /Length 111 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 514 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 111 0 obj 83 endobj 172 0 obj << /Length 173 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace 269 0 R /SMask 516 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` A@ endstream endobj 173 0 obj 96 endobj 26 0 obj << /Length 27 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 518 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 27 0 obj 100 endobj 112 0 obj << /Length 113 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace 269 0 R /SMask 520 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0`4 endstream endobj 113 0 obj 83 endobj 120 0 obj << /Length 121 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace 269 0 R /SMask 522 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 01 endstream endobj 121 0 obj 79 endobj 180 0 obj << /Length 181 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace 269 0 R /SMask 524 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0`?0D endstream endobj 181 0 obj 100 endobj 24 0 obj << /Length 25 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace 269 0 R /SMask 526 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om_@a 0` 0` 0` 0` 0` 0` 0` 0` 0` O endstream endobj 25 0 obj 113 endobj 450 0 obj << /Length 451 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x=PRիX"R"Y[6qs ]'}{"T@MYCBz%!;SxiLmv;e yl|^\ϝqD'[TNPFu [TNPFu [TNPFu [TNPFu [TNPmOFC|'7o؛72T{JvbEwEղ%!C|B?oہ endstream endobj 451 0 obj 250 endobj 316 0 obj << /Length 317 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 317 0 obj 203 endobj 364 0 obj << /Length 365 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xM @Eiհ>P+PPTt:$ae bٗ}ˌ$!mv1 Ui!n03 \]fY.WxۅCXmX&iYS${L?f 2=`&ft $ݢ[QD -ߍh݊[ 5G|7_>)Ϫ?fT{8UWm > stream xc`#'Y8!dgfF#|P'2 xx>j& F6)д}u!!R^=@Ua ĉ nUԖX:x E }4GC!@ 3"[Ze5څ]>6hЁŒ`#h*f1@?f04|@OE^d`|@ 211>r! c endstream endobj 495 0 obj 221 endobj 526 0 obj << /Length 527 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x9P#&.q (* c] hK8M W,U8_ 9|94F|ab辛.S/A2i;/7 N4M8LKA~>Bm'i;h9Vݝ/x'<pPG`7pnx| oO v7>npvwHi:JrX*oBw6dvstiۅf[V72DJd̼]h5M~QtE!Cx_JN endstream endobj 527 0 obj 263 endobj 374 0 obj << /Length 375 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x= @X!1m ZsumڬHZ X8`7kyW1PǢv'_ʤY!J֏[&LŮљ:I.̤tu#H.5Ai6n{y v7>n7' `7pG7MUy錶[%bsC7_7MmNcQQWAђD~6N endstream endobj 375 0 obj 237 endobj 290 0 obj << /Length 291 0 R /Type /XObject /Subtype /Image /Width 143 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK ag \b$\b\$ ,dAlו[V/uԜ$_䠪3)LbI裚jJ+ZN5&+i;c:ݜάBTԉˍ~\·7bav(Teʰء P;*v`2@eP Ε2pd=M!>-XiijeƊWqMT)kQNb[1?JR@QQ^eĉ_7po endstream endobj 291 0 obj 256 endobj 326 0 obj << /Length 327 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`nΌ"tLPY ,,Dء6sH[ Ć8(BÛK#^$#@Gj3_vM-@A46 <ڴLm)l4?2}׏6¨j4WQ;M7FSj6o4 T RL+ 9dlBSR\Ta,j.6FvIYyz9i.f3; l8 f(=C endstream endobj 327 0 obj 242 endobj 320 0 obj << /Length 321 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 321 0 obj 203 endobj 402 0 obj << /Length 403 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! &vnA xX)= Ա"!*2A\.m]0A~Z03ı iuG@˩^U?AmIciC!K@9! ! 8P .m?A^Z>m"4/A!9=;7' mR!0$B endstream endobj 403 0 obj 203 endobj 384 0 obj << /Length 385 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream xc`n̜"bt"P955%fr sfxE,> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 411 0 obj 203 endobj 352 0 obj << /Length 353 0 R /Type /XObject /Subtype /Image /Width 173 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x=k``Tъ& UiBDP[IKA]:tQQDU˝p ,.'ɒC)58HJ}U]#->Z*L{4݈z,k[1ʆQpQپ]~ EYgY6Jm,%YY6B,,a!FIAe$ K@FȲQE% l#d("u۽R\53d&8N>B*9Ϗ:M70 Yc]Oq y endstream endobj 353 0 obj 302 endobj 298 0 obj << /Length 299 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 DuB#xBs-' hؓmahΣ``(5Z^6a[FWf09b 6Gz;7p R %E,+A/s t endstream endobj 299 0 obj 199 endobj 292 0 obj << /Length 293 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! &6. x8Y)9Ա,N(B]&*`afHrȻU bP[m.q,[zU %1⣎A , lhȎ,0l2R5`o,:N!(2A`jr,7'+mR!0$B+c endstream endobj 293 0 obj 197 endobj 454 0 obj << /Length 455 0 R /Type /XObject /Subtype /Image /Width 132 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x AwmbIWX%ŖDR(RZ7)ޚrq===i <Q@ylR.f \{0gLv'ͤo,O:뺓~n`VsO Ox ~B=zm@A4Dz Y|xM-V܋|VvH7])`֯-Ȱ r. J* } c0H2*7 endstream endobj 455 0 obj 247 endobj 480 0 obj << /Length 481 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream x a]BEd]\D('Nuҋm0> stream xc`A LbR"lP[EMmh Y v2*;ZIs@ ,(NP$d^X[G{Pʍlg= Ѱ [JC`4 Q-Tf4l) AGwP*3 na;l( [JC[FAݠ ڃ4OehW929 1Zڷg`׶rp=7Sa00s KȈjYXaCQQrXlۀ endstream endobj 383 0 obj 251 endobj 430 0 obj << /Length 431 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x?PjⵄEC ī| IHbֆW]smN~ó,?lWyxʵ3U0ԡAʞnX%[IE5j:fȜѠnjz:n35p)T ߯&4'#$ ,> M#$ ,> M#$ '5.zg.7xs\ErZ߬^fv[35F:Yo8UUV[dZzlgG<v$L endstream endobj 431 0 obj 272 endobj 342 0 obj << /Length 343 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'Y8!dgfF#|P'2 xx>j& F6)д}u!!R^=@Ua ĉ nUԖX:x E }4GC!@ 3"[Ze5څ]>6hЁŒ`#h*f1@?f04|@OE^d`|@ 211>r! c endstream endobj 343 0 obj 221 endobj 300 0 obj << /Length 301 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`I l|"P[Y -UXvr+pCVN+)=(ɣW[G{P[Ïlg=AmA訝4 ѰQ Ѱ4F![hJeFÖĭ4lq 2aKi?ÆR[nUJڃ-XS><9 %I ַgְtt=pe%9#Dll,!oGw endstream endobj 301 0 obj 248 endobj 486 0 obj << /Length 487 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`tf6NvfFXy%٠63ș:yx X(3CfIȤH2`"nUXE7P U*^2Ecf:hhm&6FSC`4W*j)TFSh CM捦F4jR c-HuYDMBble%LNQta F15CS#M)n&Ș(݀thd=3| Q!4 endstream endobj 487 0 obj 251 endobj 310 0 obj << /Length 311 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x; Pq)4B2z@4 V- 5TPEg?um*I,+/ӊYw\9Ϫ5F GmGc{xP:kWM]nqZAzKu~nf\ktSl15.bj]d =0'Ԅz`Nd w-Sx/_Vþ?|{< hmvSkNI&7h^nJfX"2u}#_]z endstream endobj 311 0 obj 255 endobj 416 0 obj << /Length 417 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xػ Pp|PQEa BKE-ڔsZzCW!ηYIpP4ϱZ?nLSoώU@΁k3\Dϔޫd;{8yO8xkNTpEed 8PEed 8PEed 8PEed 8PEe6?O㟮w]Bao^>ov 잠Xp$ M$h"R2>'%H$ endstream endobj 417 0 obj 249 endobj 496 0 obj << /Length 497 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`!@z0pp % % J0sɚ{ f$ x>u祿r]n -:&_vFЂjyFN w9p wRC`PZ[7t@Mn:^eI/: ?] ֞ᒳB T ֎dUB@[M~gdJFC`ĄG# endstream endobj 497 0 obj 206 endobj 360 0 obj << /Length 361 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` FV Xg@JBZ&^y+ ̵%8a&n8AB$h93 3NʺA jKb,Y ! rlU U䌆hC`4&dn3 3UlqɃ$Ei2L F[Hš R2H s L,l 5(c4ڀc endstream endobj 361 0 obj 211 endobj 476 0 obj << /Length 477 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` FNnzN6&?XeT4D92(Zy9ꈰB<$럒Ge'Y$2]fiTqm=AUҨ ѰML Ѱ4F![hJeFÖĭ4lq 2aKi?ÆRAEu ^@Z~AN,ȫdJ{/ O``СR 0r3CvN!d< endstream endobj 477 0 obj 242 endobj 490 0 obj << /Length 491 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`I t0[Y ,h,Dء>吶􏉣= qPeXʥ\\J{P#[/ @@;sjij GU(-B~4lGÖMC na;l( [JCѰ6ʌ-![hJe:l=*i*rt}^Tڃ(UXߞEPхFW:. )'O{ '- !bdfc`G=J$ endstream endobj 491 0 obj 254 endobj 370 0 obj << /Length 371 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`L,C03_TBr >6FلU-4T`[>86n@k3JJ(NRᆸQ@/n耚udP7pP p'5Ia̮:> stream xM@`QQ]m8ցDD +-w_8xK3LmŐ0Le 2מ\ٯ_ʪ̵zlRmq-ZzL۟Hd.I5sFw@[u Mw4CJhH34 &4CJhH34 &4CʟԜ"o7ۧ Ȅ~Ikؔ"p ^!2uϵ\JhL< R# endstream endobj 287 0 obj 262 endobj 522 0 obj << /Length 523 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` &VXd|@BF&^yk,%8&n8@$9( 34[zeݠ%1,P9~ЁQ'R#JFCq40c4-R;9d} lF% :Ԍ6 mԑ5XyEd5iX_1F!0p!:wc endstream endobj 523 0 obj 199 endobj 396 0 obj << /Length 397 0 R /Type /XObject /Subtype /Image /Width 167 /Height 49 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xؽkPhŴ 0BtcPKPVǿ.³^+;p$C, 9WlQ߉t<dsMXοL5($T{o\f6]c_0n7݊f\Ac 4%4&+#$ ,> M#$ ,> M#$ 5u\SpioFt"2gjSAd:65Nߔ|)fiَ M,WH" endstream endobj 397 0 obj 289 endobj 322 0 obj << /Length 323 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`Il"tbLPKY -iLEءvrH[ą8(BCK#$3@Gj'_NMAmA4BvIP [Zl}h؎-!0( AGwP*3 na;l( [JCѰ6 tr){Ug B26!I)ɑ.=큣8l ]@BV@VJ>@NY=J>΀ endstream endobj 323 0 obj 251 endobj 426 0 obj << /Length 427 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#4X'`ef +2LPw2)9J`! u&Y@|ʠ \Pgr;'T JP u&GFUu!|ΤR܌&lhhhIQBD IQi M;D IQi M;D C54%G r;% JPԖ0I >N6'o`i3(lGDBjPI1~v#3 ,Y!hFNi#{ endstream endobj 427 0 obj 285 endobj 444 0 obj << /Length 445 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#&Y8y!bg J07rɚ{ :f$ F>u祿Ar]N -t&_DFЂAjyFHa">HHiT :P]4|R OtW\rV!{JZ::hIڋ\r@bh d endstream endobj 445 0 obj 206 endobj 458 0 obj << /Length 459 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xٿkP<| Dik_mt fA:n[fR]^Dn W~p AP--4-uWu :n=~ͣD᣶"s}c'*2t3}V"S>wcȔl`ٜeUAGBpjhrh/4&GBpjhrh/4&GBpo^>$2i|n0_"]nȄgSpqx6E5'# endstream endobj 459 0 obj 281 endobj 270 0 obj << /Length 271 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'Y8!dgfF#|P'2 xx>j& F6)д}u!!R^=@Ua ĉ nUԖX:x E }4GC!@ 3"[Ze5څ]>6hЁŒ`#h*f1@?f04|@OE^d`|@ 211>r! c endstream endobj 271 0 obj 221 endobj 504 0 obj << /Length 505 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 469 0 obj 203 endobj 348 0 obj << /Length 349 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 349 0 obj 203 endobj 278 0 obj << /Length 279 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 279 0 obj 203 endobj 434 0 obj << /Length 435 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x9 @bPuMQWmZ˜ZA;MEpv|M N4 ȀlVerI:|o\1 jN#ݴUmeqw- h淗_`7pCnht mN v7:nu 䍓d곽/5*!+gK[Bx.+~)g6i a^tf|cb iM endstream endobj 435 0 obj 244 endobj 358 0 obj << /Length 359 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`t&6vV&DdvsJ8 ؛*3ClftNNH b,b[^A/PY4^*Ssf:hhm&6FSC`4W*j)TFSh CM捦F4jZ +@b CKJ =w&~u簸xzh?S h5݀<tSPLn@B2X$YXaapG4 endstream endobj 359 0 obj 244 endobj 462 0 obj << /Length 463 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 463 0 obj 203 endobj 438 0 obj << /Length 439 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 f6NzvfF?Xx%ؠ2r˙8yX3C<$듐Al.E,4QjelIm=AeǨ4 ѰI  Ѱ4F![hJeFÖĭ4lq 2aKi?ÆR[qZڃ4yh_Y8$ /NePw 4ey8 Mhv2q p@RL,L!)գ,cL endstream endobj 439 0 obj 262 endobj 394 0 obj << /Length 395 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`tfvn^NF%54UeY6 {[sCmTp+O7ovM=@mafzn  nnQi㵅=iFShFU_?FSh v\E4jh Ma)<6P3qؐ&ÀAFa֒ endstream endobj 395 0 obj 191 endobj 472 0 obj << /Length 473 0 R /Type /XObject /Subtype /Image /Width 142 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`C(Y23ƒCPBFv'9l"-DaVtOJ@s Vy@X )@P[/8106X,86a;pˌѰeFh2f4lpnt36Ch ![f4ݐ6uPbW/lAif6|4K>$>aA||UXvl܏_LRj |m+ 5,F)Nr endstream endobj 473 0 obj 266 endobj 376 0 obj << /Length 377 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`Q>Ll> stream xc`~̌<""Bl0YtMLLY搱̭RD? G#0^ DzzڂQ7iFSh e-À-2il MaL_ew3Z22[/^*7HTpȤȈuU&kI/` SDVI^@INj3+'QzI endstream endobj 525 0 obj 238 endobj 328 0 obj << /Length 329 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` FVN^NVF؅ԴءV3 ٫3C<"fQ@7j*M6n> stream xc`4 f^~~f?yttiU$K{ATtI+=ȍuɭ]]K{P̉3:KkNh$XhRiĭ4lq 2aKi?ÆRѰ4q [aC̀O]J'SlNAv,&fH{+ 2q+k)rMظxVB;J z endstream endobj 429 0 obj 242 endobj 512 0 obj << /Length 513 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`a9DY8yX3ʨh@2 ɭ쑔_@ G=0 DfzڃڂQ;ịaK;aKi!JCѰ6ʌ-![hJeFÖĭ4lq 25t#\Jnyj~6k@ A4'-N, 7a`f`zsF!V endstream endobj 513 0 obj 235 endobj 338 0 obj << /Length 339 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xٽk`ccIEն8"~ŏBKՀ_}An '}%pIa SsY}&S~xyg9sm#3~-ƴO(2iL(21$2I`̴iI^Mhz H34 &4CJhH34 &4CJhH34 El'"soo$3_˖ʽz'3AmV]_0vϱ2JH8 # endstream endobj 339 0 obj 274 endobj 424 0 obj << /Length 425 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`nL"bt"\,09  V3 ;G yBlf5**ȋe"nS\SK/P^2mЦejMa1 ~40&f1FSC`UNS捦JabfUINrО;w|z@r$-kA7b" WBNn@AJ >"I? Qj# endstream endobj 425 0 obj 237 endobj 406 0 obj << /Length 407 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`L,C03_TBr >6FلU-4T`[>86n@k3JJ(NRᆸQ@/n耚udP7pP p'5Ia̮:> stream xc`Q)LYhYa2jk)B.eFk- K= Wj955zP;yskij GI@-Mlh؎-!0( AGwP*3 na;l( [JCѰ6 trfWT N19t |о= 'N&.1U5:%I^ Ll\0+G endstream endobj 307 0 obj 249 endobj 412 0 obj << /Length 413 0 R /Type /XObject /Subtype /Image /Width 234 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`3YX-`af pbP2[ [`)UVqc b\4 !_P:\AIv4r*U WP[m.SOӫ+-8^ h z9K*+ 7$S+HL-՗Ye+6|fVva Yi:0Jh wr endstream endobj 413 0 obj 228 endobj 478 0 obj << /Length 479 0 R /Type /XObject /Subtype /Image /Width 137 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`990†]@BV~3%,jlt9ᐱ MN q gZY`=ACUrjAC@0"Iq4DFC=id4DC?FFC=id4DC?FFC=id4DC?FHİGJq@ e@Le @c5v`#+ Q~@+#3 @&h (5By endstream endobj 479 0 obj 266 endobj 296 0 obj << /Length 297 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 297 0 obj 203 endobj 318 0 obj << /Length 319 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`Il<Bt\,0[ 5dx(zJCdK+(=OpU)dVXSK{P I &oNh(`ƎhRiĭ4lq 2aKi?ÆRѰ4q [aC-~h~u AU ˯ᕘC{ O1u=qe+F{"/ n%Qz endstream endobj 319 0 obj 254 endobj 366 0 obj << /Length 367 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 fv.znFG%5TXvxZrATtͣHɭSSK{PS'P5zڃ0}Q;iУaK`:aKi!JCѰ6ʌ-![hJeFÖĭ4lq 2j95uHO.%ڃM>h]3$ J6#C. O``b~M endstream endobj 367 0 obj 242 endobj 520 0 obj << /Length 521 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! &vnA xX)= Ա"!*2A\.m]0A~Z03ı iuG@˩^U?AmIciC!K@9! ! 8P .m?A^Z>m"4/A!9=;7' mR!0$B endstream endobj 521 0 obj 203 endobj 442 0 obj << /Length 443 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` FfvN.NvfFX$$X63*x +2Af5 HʤH 0e*iW\]E'P]g# n6iz${i6Gmyhڦm"Ma)l4Q;FshvB5o40Amh MaNS桤0IJZD;X/U""n 'Bsgv ub95 M49aR"t"P/> stream xc`4 fvN.:NvF?Xy%ؠ2ș:{zZ 0C<,듐Ib.E,,IjelIm=AeǨ4 ѰI  Ѱ4F![hJeFÖĭ4lq 2aKi?ÆR[qZڃ4yh_Y8$8/NeWw = 0ey8DU LhL4v2q  p@RLt0O",eQ9Z endstream endobj 345 0 obj 259 endobj 274 0 obj << /Length 275 0 R /Type /XObject /Subtype /Image /Width 132 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xM AwZ,mWXrqBJJ)mwׅYy}.{}zzwF? nDѕo-+UP̚1 є?a'!Ts? `7ƨnh$BLo{ ܕc wt_|"t@R-=5p>`[{`k|pwE8^&8u|-Y?oPINKK`} zY1{+Ś endstream endobj 275 0 obj 248 endobj 432 0 obj << /Length 433 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`!@z0pp % % J0sɚ{ f$ x>u祿r]n -:&_vFЂjyFN w9p wRC`PZ[7t@Mn:^eI/: ?] ֞ᒳB T ֎dUB@[M~gdJFC`ĄG# endstream endobj 433 0 obj 206 endobj 516 0 obj << /Length 517 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` FN>:^nvf?Xeմ4%ar[yA<ȯ囒_@{ S &Wb'Axam=AMߨ4 ѰQ Ѱ4F![hJeFÖĭ4lq 2aKi?ÆR[ҭ g3p[z"XeT54&!^z!8(=CsUP endstream endobj 517 0 obj 222 endobj 354 0 obj << /Length 355 0 R /Type /XObject /Subtype /Image /Width 132 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK Q 3"B˔Ͱ$",Ǝ(XD39ex,ߞ+&=ʮN 1 ސ~Ӊ\M׻-9y-Zܶ7Vg}}8m?6<> stream xc`~,\Bڣ)l4Q;FshvB5o40Amh MaNS捦"CNa\*ޙU53Ctf@v?fVQ]o_WS.8 *݀$/ f&VNn.vfţ@V endstream endobj 389 0 obj 245 endobj 312 0 obj << /Length 313 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`ILBtB0[9DT % 29F鉲Bd5 ,,=ȍa"nS\SK{P"S22UaNڄh&\AhRiĭ4lq 2aKi?ÆRѰ4q [aC@yTa5@Y,痔M{j!2țzxب NXUdaCD\4\,0+!!> stream xc`|BtLP$ uUD96G : @=&eSH7b,4SJE-@If9zz8+IVGmuhڦmMa)l4Q;FshvB5o40Amh MaNS!0vYǤz qhU<$-n @fPpPL1 ( (IC Y8YSp {W endstream endobj 423 0 obj 250 endobj 436 0 obj << /Length 437 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`ILl<B|0[م ht$ 2*BdL/(=ȍu,jUTSK{Pĉ*sNh(`ƎhRiĭ4lq 2aKi?ÆRѰ4q [aC@Idau AE"$뛔Ci+Opf'F"'"bdd@=;J "N endstream endobj 437 0 obj 253 endobj 460 0 obj << /Length 461 0 R /Type /XObject /Subtype /Image /Width 143 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x; `tA\HEr!&Z#^ނ,g9<ߙ^Ee@?i/U}jn4^!l;YMYG\rґ>4屸RV|zdv`2@eP ہa;C2lv(Teʰo 9\JVu1Mvb%C["]OBtF VUQ*0c|{)UXQߺ<%nVLo endstream endobj 461 0 obj 253 endobj 372 0 obj << /Length 373 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`ALt<0K94L,hx!29DJAd6 *)=(Lp)jUTKPĉ*sNh(`ƎhRiĭ4lq 2aKi?ÆRѰ4q [aC@QXnE%Ai$J{d!3pJ:8)C0Ed%#DLtlHRqQrv endstream endobj 373 0 obj 254 endobj 288 0 obj << /Length 289 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream xc`4 FfVvz6fF?$dd$8 ;88XjA䔳 KJ=HpTɭQ^A{PG#0 TNh$XhRiĭ4lq 2aKi?ÆRѰ4q [aC̠:drzf6Aqq! = 큵0l OTR@R6VJ:0JQ9 ā endstream endobj 325 0 obj 247 endobj 400 0 obj << /Length 401 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 &6vzVf7DdrJ89؛*C}$J{d!'QhnyAINQӨzڃLO%Q;iУaK`:aKi!JCѰ6ʌ-![hJeFÖĭ4lq 2 ljh2}AaÐRڃDgyh_9, Tڷg4=З烍0qI BjYXXaCpGTqu* endstream endobj 401 0 obj 255 endobj 500 0 obj << /Length 501 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` Fn:nVF?XTdء2*Zzxi@<,K{n%E<> stream xc`#'Y8!dgfF#|P'2 xx>j& F6)д}u!!R^=@Ua ĉ nUԖX:x E }4GC!@ 3"[Ze5څ]>6hЁŒ`#h*f1@?f04|@OE^d`|@ 211>r! c endstream endobj 335 0 obj 221 endobj 446 0 obj << /Length 447 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`tFvN.Nvf$yYV3 Zy 8q3BfIʤH7srY5@Ua( Ϝ n%16)GC{4m66¨j4WQ;M7FSj6o40j)TSkZE-@Mq.kWD7l$3`3rTg0qKi 諊r@džXEEء^L?d/4Cر endstream endobj 447 0 obj 250 endobj 498 0 obj << /Length 499 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 FfV6z&78%ehjؚ( @dUq OL=H)UVN{PI &O{Nh$XhRiĭ4lq 2aKi?ÆRѰ4q [aC̠:$2 ҿ '$ 1 [;cpF\yNcRHcRaQ!:ρM endstream endobj 499 0 obj 230 endobj 386 0 obj << /Length 387 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`tfv.n.vfy$%aVsH IC=ͭ➐K/ W3(~ 7Pj3VHA]=@]~&t M۴Mj)l40jhUNS捦"Ma)i <_K?y ${ 8e,}|,e8=w~yM}M9>͌\P#=QBf# endstream endobj 387 0 obj 228 endobj 302 0 obj << /Length 303 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! &VNA 9Y!"1Ա,BZxY+B]&2+o0}afHrȻVbPSm.q,[zU %1⣎A , lhȎ,0l2PpM5X-R .cS0Azm*:A m%;=/?7+mR!0$Bu[ endstream endobj 303 0 obj 210 endobj 408 0 obj << /Length 409 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`AL"0[EԌ, Y >eUv= )YRJ{PI &OzڃQ;iʣaK Ѱ4F![hJeFÖĭ4lq 2aKi?ÆR[FAݠJڃ4OehW%*% 9Fڷgױvr=p4Wa00s KJjX9hِ 0z endstream endobj 409 0 obj 256 endobj 418 0 obj << /Length 419 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` F.n:.F?XTeء2(Xxڪ 2C<,C{f)E<"(E|[ endstream endobj 419 0 obj 262 endobj 282 0 obj << /Length 283 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` ¢tP9 M 9!V3 iDE Dh A=*aSD7a! 3]bY-@Y4fz$QGC!0F3 6FSC`4W*j)TFSh CM捦JaR6qt%q6RО;Q@R&@r( īhI'j bRPP6#3;'';3tP wp endstream endobj 283 0 obj 240 endobj 314 0 obj << /Length 315 0 R /Type /XObject /Subtype /Image /Width 234 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`3YX-`af pbP2[ [`)UVqc b\4 !_P:\AIv4r*U WP[m.SOӫ+-8^ h z9K*+ 7$S+HL-՗Ye+6|fVva Yi:0Jh wr endstream endobj 315 0 obj 228 endobj 362 0 obj << /Length 363 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`n LB"t\,0ET 4yfS0gxI (^ /Qb3iTQM-@e'zzLQ5iFSh i-LGSh vۣi ռ6PSy)L8^> stream xc`A }/08 #ԩL\:zh@*:8 'ԙ1x@ɩ^Y;8A~̙JUh:ZQ3 I99&Ei`4 Q|hGC-@(⎆&Ey44"hhR|hGC-@(⎆&Ey44"hhR|hGC-@(TtK5yZMvȬA =T`,Hq@CCD^U}p%If3X9y'bQz4SD" endstream endobj 441 0 obj 284 endobj 398 0 obj << /Length 399 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'X98!`ga3Ҡ2œLP7rHۻ{ :f- u"kLzƠiP'TV :P q"^hAmyd endstream endobj 399 0 obj 222 endobj 488 0 obj << /Length 489 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`Ff ~ed@TN%}3A Ltx䔵 T LU 8 ί*K ̂A FI Me}hhhIQBD IQi M;D IQi M;D C04y+%(KuS r)8Eg Jj-eձssJM6)"88 ;|fspv+q?J w#p endstream endobj 489 0 obj 286 endobj 506 0 obj << /Length 507 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 &6N:6fF?Xx%٠v2r;8+3C,eOH 2zE,4QO ؒzڃ4WQ;iУaK`:aKi!JCѰ6ʌ-![hJeFÖĭ4lq 21%5i.о qhV1AI~ $M{i( 2rhK0Ad`=bZ YCRGYT M endstream endobj 507 0 obj 264 endobj 272 0 obj << /Length 273 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 &6vzVf7DdrJ89؛*C}$J{d!'QhnyAINQӨzڃLO%Q;iУaK`:aKi!JCѰ6ʌ-![hJeFÖĭ4lq 2 ljh2}AaÐRڃDgyh_9, Tڷg4=З烍0qI BjYXXaCpGTqu* endstream endobj 273 0 obj 255 endobj 380 0 obj << /Length 381 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`#'ع!beFlP': >kq#mTvi'r(U :P[m.q"[zU%1N0^FCk PFP !?kviȬAau4_J##"ܜ,V7e;J/d endstream endobj 381 0 obj 203 endobj 508 0 obj << /Length 509 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혻 0X8ةE݋tJ_R")oIp,' i/&=,P=%yO~;4Ѵ4uzpxf2sfT 0H3;nѭ|CVFne ѭ؍l[ݲi\;Zxfl%-+x3Mt7Q5á[x\E70] endstream endobj 509 0 obj 240 endobj 340 0 obj << /Length 341 0 R /Type /XObject /Subtype /Image /Width 173 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x Ab;6(G#\ 7V;+\6̧9HۀLg|n?,Y$db~tSLy$a3*yZv=)s^CǛ0벁aE̊fajfa6{VT 0 d `fmgE0k@ˍ0䩦zӅ0lo%攙:֭NjeJ)C G 0fvъ' endstream endobj 341 0 obj 264 endobj 448 0 obj << /Length 449 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`LtbB,09ԍ-tx!V39 DHAm6*.(Hp,jUTK7Pĉ^*sfzvhhGm6hF06¨hvB5o40Amr 1 ˫(MqUܙ4=bR- \RvtN*n19I6+;Pdd!, endstream endobj 449 0 obj 239 endobj 350 0 obj << /Length 351 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`tfv..vf%xYVK JsBmRrɥHṬ[SK/PY#0^ tfzvhhm&6FSC`4W*j)TFSh CM捦F4jJ ṢcVH*HQpH{XqA d5t4Y63p q2BmQtH֎2 endstream endobj 351 0 obj 228 endobj 280 0 obj << /Length 281 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! &VNA 9Y!"1Ա,BZxY+B]&2+o0}afHrȻVbPSm.q,[zU %1⣎A , lhȎ,0l2PpM5X-R .cS0Azm*:A m%;=/?7+mR!0$Bu[ endstream endobj 281 0 obj 210 endobj 308 0 obj << /Length 309 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream x p}0'Kiɯ丒48s_'[n/|.=9#JJYɤ.(:5V*uvF|_d:ZnlVzN5㉑>lYYl0o G-p7:n6@' `7pCnht| gNNѬdIdʃ`|2ttyiS-t鸕*U XFR>ԽqV[_6pN3 endstream endobj 465 0 obj 256 endobj 452 0 obj << /Length 453 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`!@F0rp%%32œLPsHۻ{ f- u;kLziPTV P q;^hAmy> stream xc` FV.^>fXeյT$ V3r+X AmM/ȍsV$d^X[G/PYds=@M*t M۴Mj)l40jhUNS捦"Ma)i <6`gFAJ^>@N> stream xc`nLbt,0E Lex V3:GE DxAm6,*ȏw,jUTSK/Pĉ^*sfzvhhGm6hF06¨hvB5o40Amr 1ϯ(KuUܙ<3RB!=w.#wz+5Af,> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream x1kP$J$/բC@4$Ÿ j.vjҺjBz^+;\8|/ WӴD4/N T(Z>uDojI՗ȬfETAd~k>t>i&2$s}LC 4gЄ&w,CFh24 k&,CFh24 k&,Ct89"s.~'?NdߣgG_^4~Ef9yi)B |OYaَ+4}nY# endstream endobj 379 0 obj 281 endobj 330 0 obj << /Length 331 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! &VNA 9Y!"1Ա,BZxY+B]&2+o0}afHrȻVbPSm.q,[zU %1⣎A , lhȎ,0l2PpM5X-R .cS0Azm*:A m%;=/?7+mR!0$Bu[ endstream endobj 331 0 obj 210 endobj 502 0 obj << /Length 503 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혱0!v(@DgOn4qtŘ~rEDH1 ;&̄ Mk?"0ۇ_4sOm:Mf³݇4=42&A/%jԠ@+jOnnr 5'~7oˊٯ}„]>AK7Y"3;G' endstream endobj 503 0 obj 213 endobj 482 0 obj << /Length 483 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 F6v:6V&78$edidiY:8؛ @dUqHJ=H )]^A{PI &O{Nh$XhRiĭ4lq 2aKi?ÆRѰ4q [aC̠:$2 fx(Aʎ qVо=-큵t C@L@R>VF{ʂ +"W endstream endobj 483 0 obj 256 endobj 414 0 obj << /Length 415 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`~Ll<Bt|0مt ԥ V3 BlfL/(ȍu,jUTSK/Pĉ^*sfzvhhGm6hF06¨hvB5o40Amr 1(HsSu|s2"ldء$n~Z,XTT9`Cb,\A)Ga, endstream endobj 415 0 obj 244 endobj 356 0 obj << /Length 357 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x @@ k4ki-> A *}Q[`fV܈ra6#I GRB&&QeU]כsmSΚ\!*uAp z:uCz ۙwi4BVL7[mmx'ؖ {۲N-oA>e|x<޹F8O|BY,: !p,]NIш^Rxe endstream endobj 357 0 obj 236 endobj 466 0 obj << /Length 467 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`tfvN.FXx%Ud8V3r˙x xj@<$㝘M/n#Y8^(EY$ endstream endobj 467 0 obj 244 endobj 294 0 obj << /Length 295 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xM@`QQQG@|HpN"YuF陵l&϶{ئR  ",xaWi7;44X?闳zL1Gg wZ^~xEz\zv2fV-$_@87Y>!i&adfhV Mi&adfhV Mi&a?]d>5pL߷9wf>tL}[l^'2]UL^K"STdJD <($ endstream endobj 295 0 obj 262 endobj 392 0 obj << /Length 393 0 R /Type /XObject /Subtype /Image /Width 167 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xٹ P 5 &jeF\_wEdڱ&L1a8Y7FG \zPe;a_dŽo+=fẸK1ps> stream xc`~ ̌l|t0YU٠搵  W̭VRJ/PG#0^ TzzQL ЦmbMa)l4Q;FshvB5o40Amh MaNS!0nU zxϝS>,9^ 9I 6Z*nD/h% ad‍J1020BIFo endstream endobj 519 0 obj 235 endobj 456 0 obj << /Length 457 0 R /Type /XObject /Subtype /Image /Width 167 /Height 50 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK`rTiDziz!7mҿ^oRBsoaW)4_'bfXdZMlzP?D}ް4MdfiUTOCdsn4Leŗl7@so?7&4d=xX|d5BGI@X#4Y|d5BGI@X#4Y|d5BGh<}핿a ~_"?v[l{7q2ío뚦+2QWi cZmq$o tx endstream endobj 457 0 obj 290 endobj 470 0 obj << /Length 471 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`ILl<B|0[م ht$ 2*BdL/(=ȍu,jUTSK{Pĉ*sNh(`ƎhRiĭ4lq 2aKi?ÆRѰ4q [aC@Idau AE"$뛔Ci+Opf'F"'"bdd@=;J "N endstream endobj 471 0 obj 253 endobj 336 0 obj << /Length 337 0 R /Type /XObject /Subtype /Image /Width 188 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`,C03Ê[X\r 1ANfxḓ0瀆pI3rN%CT䅛BlfCxh Bb|JCKsz|CIrCb3+;> stream xc`#3X9y'bg #jJ<0wk; Jf" Nv 4ͣ qGCC<hBw44) >4ͣ qGCC<hBw44) >4ͣ qbh*`-!}Lna)jbVQ}A |,e9ðL:zh@+ 8(+#̙@q$72GV##$ endstream endobj 405 0 obj 286 endobj 276 0 obj << /Length 277 0 R /Type /XObject /Subtype /Image /Width 122 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`nL"bt,09D Ltdy V39G DxAm6,ȏw,jUTSK/Pĉ^*sfzvhhGm6hF06¨hvB5o40Amr 1ϯ(KqUܙ<2RB!=w.iC7wzKUf,> stream xc`4 &VNzvV&?DeheD8aٻ{銲A=ʭA{W30 _j'vHA]=A]~&精4 ѰI  Ѱ4F![hJeFÖĭ4lq 2aKi?ÆRAy OZQ1AQ*7%gEo- UPIԌTOQj'#큨+#NFfff&pGT 'が endstream endobj 485 0 obj 250 endobj 304 0 obj << /Length 305 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 &VvNzV&?8eheEغy닳CwJϠ=HqUɭUYE{PG#0 TNh$XhRiĭ4lq 2aKi?ÆRѰ4q [aC`ۚZڃx_[+(W吱= yYLhLYv2  1Bd``dbf=`fFzAh endstream endobj 305 0 obj 257 endobj 492 0 obj << /Length 493 0 R /Type /XObject /Subtype /Image /Width 163 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` &VXd|@BF&^yk,%8&n8@$9( 34[zeݠ%1,P9~ЁQ'R#JFCq40c4-R;9d} lF% :Ԍ6 mԑ5XyEd5iX_1F!0p!:wc endstream endobj 493 0 obj 199 endobj 346 0 obj << /Length 347 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 F g@ \&nIu} tEءew  ^21d0CC5vhs1c9ҫ1-u, bh4di`#GCv4d!0dKJy ՅQfM*,='{$?=!hۀYPw07sh]HVYu0%)>Vh{{0.v ٣h έT endstream endobj 347 0 obj 219 endobj 514 0 obj << /Length 515 0 R /Type /XObject /Subtype /Image /Width 173 /Height 26 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! Ff6 8ؘq/)88 Եn8p1B\&i>AZ 4!p9%V bPa* M nUԖX:144T!;ɀC-vhs1h._2AqV3!*f3At:?!#cj1%(*>?23 Qz~ endstream endobj 515 0 obj 222 endobj 390 0 obj << /Length 391 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`4 &VvNzV&?8eheEغy닳CwJϠ=HqUɭUYE{PG#0 TNh$XhRiĭ4lq 2aKi?ÆRѰ4q [aC`ۚZڃx_[+(W吱= yYLhLYv2  1Bd``dbf=`fFzAh endstream endobj 391 0 obj 257 endobj 420 0 obj << /Length 421 0 R /Type /XObject /Subtype /Image /Width 116 /Height 48 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`IL"bt"\,PK9 2 ;DE{Bd5**=ȋa"nSRSK{P"S22UaNڄh&\AhRiĭ4lq 2aKi?ÆRѰ4q [aC@YdAeAi$A{l.2r;{X3Cd`SP`1qpp3ízw!o endstream endobj 421 0 obj 260 endobj 528 0 obj << /Length 529 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xU]hU>3;yCmK+u!aR&MMخ6Ut'3ٴ } oZWE|-jžT (XA ~gv;pg9;{eF4"_=}GiRpfg)ƮZS-7q޹-25+0Zj9G҉a!Q및 }?ЬVr/ =\KئƂV^vn519= r>W3?iLLJN3ٶ==TGfbFx(ب {t,毘AcmXEHf*0|%]x#Y/5Ia'r0?vȕ>c-orGysxuJ.ߴOFCQeG`n)CC Q`;|':OO/Vk!&rgXC`ERY)$?/:&||[xQۑޠVO>9C?EoDhF̄v|ky?pm͸ή> _:T;ҿY/ۙ5o(UYYTD{2jY}QVlxaui_2;;Kr5a}Xg |ǬV^]#w}M7] kt4iEZ>簮J[ԵOY 94)`6 `)+YK=VUՇ)uP=Rw1FԂ3;*qO6e7ΦHpV '݉83Grxvwۈc A6 oIdz'˖#r1|]8ӏܥʄ2dIS1eD98;TSbv ωd(Oh( >oҊ9<ES&Vm~D[Sۯ-1߶Q*u_{ endstream endobj 529 0 obj 1088 endobj 266 0 obj [ /ICCBased 528 0 R ] endobj 530 0 obj << /Length 531 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xUoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqx endstream endobj 531 0 obj 1047 endobj 7 0 obj [ /ICCBased 530 0 R ] endobj 532 0 obj << /Length 533 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 533 0 obj 2612 endobj 269 0 obj [ /ICCBased 532 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 534 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 267 0 obj << /Type /Font /Subtype /TrueType /BaseFont /GHMUID+Helvetica-Bold /FontDescriptor 535 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 278 0 0 0 0 0 0 0 333 333 0 0 0 0 0 0 0 0 556 556 0 0 0 0 0 0 333 0 584 0 584 0 0 722 722 722 722 667 611 778 722 278 0 0 611 833 722 778 667 778 722 667 611 722 667 944 0 0 0 0 0 0 0 556 0 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 0 389 556 333 611 556 778 556 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 ] >> endobj 535 0 obj << /Type /FontDescriptor /FontName /GHMUID+Helvetica-Bold /Flags 32 /FontBBox [-1018 -481 1436 1159] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 741 /StemV 0 /XHeight 549 /MaxWidth 1500 /FontFile2 536 0 R >> endobj 536 0 obj << /Length 537 0 R /Length1 18068 /Filter /FlateDecode >> stream x| tTE[{K^twξ鄄BؗI0* #  "8u!g|vmコu[ުǂ7(dԤֹӉWOxֹ5zԅ z?k3RF#MZX++  3j/ѻIl󙠖w T;ivESW\YVuXM_MϺCtP߇d`$ẊP"Am.P`ywp5hrOqHvSq[+lw?Q|Ujcj?D7vavx+Նuo$sW]MMOqO4w7gq!gmwtױHGEU#fwS#=$1n;|~wjwEznQ _g>XDYrm$x>MjHDjӀ3˽m!T Ct\0S^/O 9MNr'j,ƨ1htFNC43$J&HԼcypTÑa$$[m A!UӢVTe% ׍mܒؙ2= d*tݘ%,9=Wnt]8ѹbdzSZLֶ%Ӿ*1s}'1dBmU]cc}UFU׎5jY_55b}`}`} RȨ9YC$A$ |RelϷDhOXr4λd C@D!YKo59E"r y<3%NQXI gYϾH% {LchBNCqm$ҳ8p9_DNP3| QSJ֐-dRMW@86-== ܷ+ gMShH?{V܉ţmO_?r\+_ʿ'nj(yNiM~&a*At$]F 5s˹۹ܷ| k[]=B{=?DN`& tr-2YOOɧTGM4:^EK= =FӓK`ù9-Dpk.n'͛r~7 `ݸ>RT'VS>깻g#b'i$ 8'׀fYGEzR>#ߒX<./ͧ%t g9t0B]t9B\w-l1^>= $aL6@q8I+o3R.=!(5rAVhpd"yRw??e?LWHo7y'?i@q3QY nLH=a=f^K{]ץ+HIwbB|۬1)eY$7ә)jkX׊*Z:=r=\+3;33xNj򔑲LOy IVjn5׋<ՎUNpFGuKUV&b$; ={q'ܺʕ fwTw|U՝Nh㓫[uP]6fevS}S:3:q`9iikCA2Z:Na:KO8~)^U~Yc'G H!"WBI/jV}q/cUvD-'$'_~K3H֨}BJRѠ1L1cg="G&*X ˁ]̖اD#6x-AA(%D!9V(qj[q>\6cY)\Fe r`xAqσB˜dQ#44K QG$dm@```:`!6+D2'\3 .'D 9y1EdIH pf[#7xS`աks?WyKMki1͢x֫x6j,Q-mZg=oN%Μ KK-U'yb.~t֎9ѓw#RWQ)o O^q+f`K89: /$81S߹uSTO&g0^w  ƈz oٮwS85F&/];$0-8|ëG䣨:\pC7$23|j ̘`(3eu^yevTdjӦ\ܷsrk~]ISnKi).gist`t 5y4n_T 1Dux헏 4# ֌[εœ[&sʏWWq=s CX\.ӗ'μ~]q8g3V\3u|m#ZP;텐<F:uT>DA*DTďwx1q9; 2PyeD*\75X#$$YDQ9^,SQx*H"$%KCfw5l7trG} l/ W: 0f-BvaӹnKfs| JPB %cx" rp)KkXf ]HRԆq+@DЉ ^31UW"kkźji#N m6K!tT$hZ,r:]XQLM֤},:^\ .-!ٮsnX8t;Um@_ XnCB)mdT6q'd@^.m{z@R.. =K859t%[1IRWGAVXHc0ii nuHz*OhMbc 3=4m u$w|d2i.E흌961}TMIYKFU_) [yUU)]_^^ӸeyוEc?/|cSҺ~rFuNQ*7"& iuiƸ"F|&Kء{Mx](cǧq&{>F2TyRҺmvM;Qvy'Dލ\ 2.b\@z67(B3A y%1Ӧ]dY93{>7KUv(=ʞ۹l?cVQs*Oi7T>`" 59`h̲,n;~<ť[6ΪM.'M:lL +`!\ZY&KC%tB|Ճ-% Q·r˄=YgT,PP;'zEnd 6y /<2r(%|r w \\(^V^!ʭY e]N-N8FZH]z^u!!?{ǘUE󚽛k8k/Qw+a4xJqo |WHR1uFk= %ۘm*|nޢUصK%O"\ɕ,9!m\&Y@Ё9XT +WE,lB-zgYD&{ f_[&&NeÛN{ʳƚ]G꫰Ut3q}W/|QB{{thoIaEk4&YvEqd4DjgBM,/rYqA- <7|-DvShsmhA1p&K ^(bāPЌLPt@g%"[ *"I F5K怯$_)#Ll1śhw5Yq [KdF+m64Z9R,jʴ%Yͼ`^Cn3o$7̯sxQ4 [\Kgu2XrRNvctѰd5D4oɼL8Ă8Kt1atj;Mǎ9e&uA" %MhUPTE$feS s.3K{iN '2L?!`ƅ8c h!Vb`q$S9 RSt:*i2@Oiz"̺lMd}^fxO``ᧀ`q^$ $ -m_AU?"lgӵ%v^_c\gB}tzFg}--oufmfzȎG|W4-eOt:GI~;D?~h8hiU Ư%eӣ_`QF8-!pf[D]cщ9)l)ŊKAVGs<[-`LQF̺^ Fs[u _%xP9Tr:\NŹ\B&#Cs;lVb%N  JIp8Pkb*|l[|NW2Y}cπW*Gu>m_wvjn`GFڡǿ Xl;kFf\u᝕iíyFmSnI{;! LV1#+qM')F'I&W& $:32C4/ ň1IaF42pɼ̲bUsVfly6(hj̟sKf->^cT7JLթ=!,ovT8szKU+[FL6";giq(ũwF۽醶I'i4k+%Zi}znӶb~m$f}Ýl$'#pp|EN,/Tdhs#5E扤(ۙ!vF5źق;qa0 B]-a0C٢9), (fdXcaBJϩ9\d:/Pfv5Ivn4}-*G򡩁D_Fo-In02 L<7|RHŚͲII@t4K$!%×hj%̏@L8|)Zb6z MZܣ??Xx'`#?,6Ģwq6pY0km68N=!#$M@``SjP pgگn?*ҡ F{.,0l;.,Vt( E ȣ*`G ^' ba.vVGGfP8"~dxd!*+:"8,k4F-Kfb~P\(-4Ŀ$(IzCxM|MPx_|_R8) $a8Qhӥf=ie>?a>A/^Gf 紀0`,Q@&4׉%B3_?g/L*sei L2ep7>^y3JoZp?8ɹlLV*/?kj^U JRҽY<Ƥ<+=ȑe= {YTb NE<~Qo]Ź:wT@&m냝9kt,7GT5]V0~H\KF }w}L^%/_4'{aUF>3<5‚{ E" D V?`lPkuK,!1' Dl3 >T&EGSdw=gԅYT`갱aJV M"ʛ4ܶ 1mtnS~R`GZy%507-z[%?+ }IPyQn/L`)Y$KNo]1nULtoV_|ǢɖW`o1ӊl)D&0/E t#rzQSzdMm,aib=9~O4xawPyqѴǮ Fd]uPmv[V36>dkOr _&|91 CLŕ&au~#y1N'ye%3No$Ⱦ,)Űis%:}~t2lFxwN#>x3؈DNu /TDf@stGk1z.lZm(NS~VPX~pz+x2-?.u- L;؉"%;kb\##O@1Ǝ;45t֎;,-v(ǐ{qQ#8Ђ^c8Belߨ[ ?l [Y} _a?{q)yv)4`PϟB ׽1)Rϣ]IASG"5џ#[(Z=LGt.綸1UqYڢLg^e"QR-j`yw)vl#;SF!Jl$"2= Oү{c&z߯8#H5KQi!.{Ƃ='W}:Ό =x-MC*h¿h_;콫ŗ` k.dHt9cL3sxGNH9:R]TKdgI긛~0+V810g q?ICj|oxh]᳓NEd@0i8NH3o4I] " 3"Jbdע t) +ο*2}X/F! HގXzc4!d#9ωؤZJ|k`#VAny%_ iM <~ēaW'y0<Г]Anx; шŌ׈wiԾ*PTsLH)R,/R3(gJz~ E,oCk\u0yZX+0cF/j,8ӌ&lHV'N!䊢{^#9ո7,ԅSʌ`A.XڸXF4l3 `hx5sȬ\!xߨ,VLv.%R+Mw~^c2 :Xd\N3 ^I2s+'CvK{ɯ%wQS]S>Shz0ĭ=nYE[ (Kd:v& bgEꃩvj M===XY7 Wdw4Ef ]Zv#n eѭd^5Z~{C;}m˗/粕/p}Mca9il]O`PӶyGM(#AfLr qSؗ>ĥG=782o R-_>+T2'u0É?7f#&)k^_Vyjӎ$A'2+3" hΓ`OYr}+@ꣳH}3+237v"AA5vuմpzO$AL+9BԸsxL78a쫞9`L!;Ì?h%c ԵukĨcr9iL{N ; leK&mŠ#ٌQ:+Jp9xZpbyi)Vi<|P d0Ԓ飶{rZ/P9gLnW61elݓڹ&6<IӤ'?[4-'q=KG@.[Xl $thY2D"K5|siz4XHŕzJXP/#ƌC59aW E8 ?*Ͽ"T^8qy17=KF`<@}v)3昭Pwcv}j M6G>|6oyWxׅ15PŜ,.6B+JuPxQNx@EaKWxSpV C{ox1`:tzmm/ޡAjJ "8VN+Np<6C3I|o\)DZ״F fQngN kjǙXhza3k./]jMJo3K~0y@G, ]lۻXe#痹TΡe!ZOJ 75|MM׭=;F%)^6Geɞr^T,x$ vj}H/4Q`XdέpetV$Z2cܦX64 1jmV%?0 -?>E98QȮkW /˳xEF DX[] AK~Nt̾lz;go+ot[7آk7xX(Ѯj>D!EHBPC+ jվ(Ux_{\k_x@)ÈTZv Gd b<;!:WY" Z4LpP[.ˆn1Qr+| |+0O:^'܍ggk/!ù|k⛍momR)"d]&i@&:9`wˬp;~'eClx0uEj8t>^5?GR+ᢄؔ\Ů>,W.tt^GGEfKUÞjƈ_H5n5׵8YCjP|&^o~=H֣2N k#DBT^Ui 'FMmUm-95]F*p:@-0|88aT@ X X >4 P4fV66B} 8 (3zz؀/)2>~})W)W)eViSҧ\ӧ z\1)S٧N7O>})OSاeL+3Og)Sէ|M>e_vzrOyn>e|Iq oS^اOyq2\Wϫ endstream endobj 537 0 obj 11878 endobj 268 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PSHETD+Helvetica /FontDescriptor 538 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 0 0 722 0 0 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 278 0 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 0 500 ] >> endobj 538 0 obj << /Type /FontDescriptor /FontName /PSHETD+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 0 /XHeight 637 /MaxWidth 1500 /FontFile2 539 0 R >> endobj 539 0 obj << /Length 540 0 R /Length1 11024 /Filter /FlateDecode >> stream xz xTյ=3dޯdf2L"! B 4`b+(CZQ TK k+XJ Xslgm?ُ>{묵ӹbeC7P?c!W@#F둆wwub4 .]رhYP:-]5ַ.ML ۱ F1/|(F1]C+HY1ҮZڧ4:1ѱm=iDVxp/fz*2' J2}O3r/_6Ip{ H `jHF04ar @7?2'a  uFz%־xPܡ$/p< 5Jv ,u`ЍcB%9O rAG9鼚fH?a$ ΓXdQtN o Išԭ70 TyN\+-!bbhtFRKqR$1L^+w >(GX7;Fސ 8,q#dG?E%`}!A aXA'Gs\ah#!!D Un)׍זTWEe!) PDM-ÙvĪ)WXSjzrXA+\!2o~;M[BO@ܨꅴSyVh<0VV6W6oUA;[Aǚ'?7jfZ=Ljc ΓǢZP@'JjW(!4iƐ2LvaaJO?|7ظlpD?pgAYo L Nz1 sa;M="I,Խa*C ^p gk7oak@ pJ׍0=. 'L>bͅ~AT@=^Jᇰ~ $h{+z>[U ءGH?-{7gU+:2/!hi/QJƕ:Zq0 㪝3|_&v/ :b#y:r'YHQOȼ`13v,c_1l"Nfg>^dfxN$x[{q%xwZ( ׅB8U_| Wmٟ,sq$σ`>$`+N =(] zīRjv"pҺ  ,.a7W~cR4tiTϛIvPmVd4uZM|JDX@F8&ҞV,h_eW6!}nkĖ G ZGZ 23\UWW̞ֈ+=MЀ?wW"-PuW{OUKef9D8TqAE;GPڢ*dTVcj]XUv7aMo123Ox2ng k9!)Ĵо!2d~r8W-![S =ɞ00&0g15p{Vt D.,Bn e#K c¥#ކp\JCxmc#|#w A op!\-.#[+/hD6 Q0m›W_?J&W#my7r&랦M ?'̏~D (ݹ9ȅWÿ#̏n'y /o9j(jhqI50P58KHszOeHa|TޓL1|*LEe~͊կOYl:WD }0Mﲗw~_!QX׵8zuUx0WI佒Iph@r8DqU|>KlNfMr>^QqqGbW( f'(.JG[zZɬz 贠`.|d箇!= 9xF oS4&i j$?YCj8$K₫Iv;Y^$Z`4)`#STس-lG=<ڳ:fĻSv)%(tT^q}0הVeU~OV{WLQe7ųG䰆{5x8ţSsN4MNL$,@eTHcscdA`DU lb.-=Q77mt'+EͦdC G#X\ܼ`3r ;sc3TN~K;vo wsLWR=ko59,oKҕׅ@cE 27{X8+0`.S qAE66;ɲ`MD6񉩈ǁFZ@-S2﬚|}S_8Y L.L'8*Kě* /|EXs݋~.m $;Vh EW0ӡ{ϸu9ShW&r~'t][>woRh#oTyqj;{f&UrٵjaîJV3~-E;`MEv]>ݔ 'ƛ0"VX<'yZJldz]:yk*/Ƒw(rsǪ9~^]쁍R"9IcY|pgg}EDSKF*CR `ä _zYF3'f8 \ ?̆;:}ON`/\\Z੊}rH9f]LrڤGdqyiV#;g2W%s:gv,I5 3YAP]?0 e؛&Նze, ^o =oϘdpN𯞽i?;̓Uza6*G1g6;zg3r8786l8g`z`[ ƒhW+AW,ł.v2H2ްʋ?.ܢ };nQܓQHpU^RlYJo^3f d?=X2}LKa__xi\ڌo`>ϣ?pـ:UAA;.󻡗?mrxiR$Z OMю~t ]\9̲t a5$AX\8டX]QB~jaAlF-P^Vn. YP6+]SwV%S ze9:s<|oI`IɨyQ6/+H>$~&dd%}s;Dcd{ חZ1춰`u5F"AA)vo7n3m3BISSoJ-yņل>1NԘʷh m1g᩽bI|3hȳf[0ѴLg6[xBX@9-'r> endobj xref 0 546 0000000000 65535 f 0000143675 00000 n 0000019853 00000 n 0000122561 00000 n 0000000022 00000 n 0000019832 00000 n 0000019959 00000 n 0000119746 00000 n 0000027043 00000 n 0000027321 00000 n 0000040092 00000 n 0000040372 00000 n 0000053610 00000 n 0000053904 00000 n 0000046853 00000 n 0000047150 00000 n 0000052698 00000 n 0000052995 00000 n 0000045928 00000 n 0000046208 00000 n 0000036126 00000 n 0000036406 00000 n 0000051490 00000 n 0000051787 00000 n 0000060793 00000 n 0000061090 00000 n 0000059608 00000 n 0000059892 00000 n 0000051807 00000 n 0000052091 00000 n 0000023985 00000 n 0000024269 00000 n 0000035226 00000 n 0000035510 00000 n 0000043774 00000 n 0000044058 00000 n 0000040724 00000 n 0000041008 00000 n 0000038886 00000 n 0000039166 00000 n 0000047472 00000 n 0000047752 00000 n 0000058718 00000 n 0000058998 00000 n 0000032135 00000 n 0000032448 00000 n 0000042257 00000 n 0000042570 00000 n 0000054217 00000 n 0000054497 00000 n 0000024289 00000 n 0000024602 00000 n 0000057218 00000 n 0000057498 00000 n 0000045291 00000 n 0000045575 00000 n 0000056919 00000 n 0000057199 00000 n 0000030022 00000 n 0000030302 00000 n 0000046227 00000 n 0000046540 00000 n 0000034927 00000 n 0000035207 00000 n 0000045595 00000 n 0000045908 00000 n 0000040391 00000 n 0000040704 00000 n 0000047771 00000 n 0000048084 00000 n 0000056620 00000 n 0000056900 00000 n 0000054516 00000 n 0000054796 00000 n 0000042883 00000 n 0000043163 00000 n 0000041028 00000 n 0000041361 00000 n 0000057810 00000 n 0000058090 00000 n 0000037949 00000 n 0000038229 00000 n 0000050218 00000 n 0000050535 00000 n 0000050555 00000 n 0000050868 00000 n 0000043182 00000 n 0000043445 00000 n 0000038604 00000 n 0000038867 00000 n 0000051208 00000 n 0000051471 00000 n 0000023107 00000 n 0000023370 00000 n 0000021903 00000 n 0000022166 00000 n 0000056045 00000 n 0000056308 00000 n 0000031560 00000 n 0000031823 00000 n 0000032807 00000 n 0000033072 00000 n 0000028848 00000 n 0000029113 00000 n 0000029435 00000 n 0000029700 00000 n 0000033683 00000 n 0000033948 00000 n 0000033394 00000 n 0000033663 00000 n 0000059017 00000 n 0000059286 00000 n 0000059912 00000 n 0000060181 00000 n 0000041968 00000 n 0000042237 00000 n 0000025235 00000 n 0000025504 00000 n 0000025860 00000 n 0000026125 00000 n 0000060201 00000 n 0000060466 00000 n 0000055760 00000 n 0000056025 00000 n 0000052111 00000 n 0000052376 00000 n 0000048411 00000 n 0000048676 00000 n 0000041381 00000 n 0000041646 00000 n 0000035530 00000 n 0000035799 00000 n 0000030935 00000 n 0000031204 00000 n 0000026754 00000 n 0000027023 00000 n 0000023389 00000 n 0000023658 00000 n 0000056327 00000 n 0000056600 00000 n 0000053015 00000 n 0000053288 00000 n 0000049612 00000 n 0000049885 00000 n 0000046560 00000 n 0000046833 00000 n 0000042590 00000 n 0000042863 00000 n 0000037034 00000 n 0000037307 00000 n 0000031842 00000 n 0000032115 00000 n 0000027641 00000 n 0000027914 00000 n 0000024622 00000 n 0000024895 00000 n 0000057517 00000 n 0000057790 00000 n 0000053924 00000 n 0000054197 00000 n 0000028538 00000 n 0000028827 00000 n 0000043464 00000 n 0000043753 00000 n 0000039185 00000 n 0000039458 00000 n 0000033092 00000 n 0000033374 00000 n 0000029133 00000 n 0000029415 00000 n 0000025524 00000 n 0000025839 00000 n 0000059306 00000 n 0000059588 00000 n 0000055122 00000 n 0000055437 00000 n 0000034275 00000 n 0000034593 00000 n 0000048104 00000 n 0000048390 00000 n 0000060486 00000 n 0000060772 00000 n 0000034614 00000 n 0000034906 00000 n 0000048696 00000 n 0000048982 00000 n 0000022800 00000 n 0000023086 00000 n 0000035819 00000 n 0000036105 00000 n 0000049003 00000 n 0000049289 00000 n 0000023678 00000 n 0000023964 00000 n 0000036727 00000 n 0000037013 00000 n 0000049905 00000 n 0000050197 00000 n 0000044984 00000 n 0000045270 00000 n 0000022487 00000 n 0000022779 00000 n 0000039785 00000 n 0000040071 00000 n 0000026452 00000 n 0000026734 00000 n 0000030628 00000 n 0000030914 00000 n 0000039478 00000 n 0000039764 00000 n 0000026145 00000 n 0000026431 00000 n 0000054815 00000 n 0000055101 00000 n 0000030321 00000 n 0000030607 00000 n 0000024915 00000 n 0000025214 00000 n 0000033968 00000 n 0000034254 00000 n 0000058109 00000 n 0000058391 00000 n 0000053308 00000 n 0000053590 00000 n 0000037327 00000 n 0000037609 00000 n 0000036425 00000 n 0000036707 00000 n 0000055458 00000 n 0000055740 00000 n 0000044078 00000 n 0000044360 00000 n 0000049310 00000 n 0000049592 00000 n 0000029720 00000 n 0000030002 00000 n 0000047170 00000 n 0000047452 00000 n 0000041666 00000 n 0000041948 00000 n 0000027339 00000 n 0000027621 00000 n 0000022185 00000 n 0000022467 00000 n 0000027934 00000 n 0000028216 00000 n 0000052396 00000 n 0000052678 00000 n 0000044682 00000 n 0000044964 00000 n 0000028236 00000 n 0000028518 00000 n 0000044380 00000 n 0000044662 00000 n 0000058411 00000 n 0000058697 00000 n 0000050888 00000 n 0000051187 00000 n 0000031224 00000 n 0000031539 00000 n 0000038248 00000 n 0000038583 00000 n 0000037629 00000 n 0000037928 00000 n 0000032468 00000 n 0000032786 00000 n 0000118533 00000 n 0000122709 00000 n 0000135609 00000 n 0000122522 00000 n 0000077665 00000 n 0000078061 00000 n 0000101990 00000 n 0000102420 00000 n 0000089664 00000 n 0000090087 00000 n 0000113844 00000 n 0000114260 00000 n 0000079300 00000 n 0000079678 00000 n 0000104595 00000 n 0000104980 00000 n 0000098853 00000 n 0000099268 00000 n 0000106716 00000 n 0000107134 00000 n 0000074502 00000 n 0000074939 00000 n 0000094062 00000 n 0000094461 00000 n 0000063705 00000 n 0000064136 00000 n 0000067549 00000 n 0000067921 00000 n 0000110649 00000 n 0000111086 00000 n 0000087081 00000 n 0000087459 00000 n 0000067154 00000 n 0000067528 00000 n 0000070603 00000 n 0000071026 00000 n 0000097537 00000 n 0000097922 00000 n 0000114727 00000 n 0000115159 00000 n 0000085750 00000 n 0000086174 00000 n 0000105001 00000 n 0000105400 00000 n 0000071494 00000 n 0000071924 00000 n 0000091813 00000 n 0000092247 00000 n 0000099289 00000 n 0000099692 00000 n 0000061556 00000 n 0000061934 00000 n 0000087480 00000 n 0000087909 00000 n 0000064595 00000 n 0000064973 00000 n 0000075858 00000 n 0000076284 00000 n 0000094482 00000 n 0000094904 00000 n 0000064157 00000 n 0000064574 00000 n 0000083169 00000 n 0000083542 00000 n 0000108070 00000 n 0000108455 00000 n 0000068805 00000 n 0000069250 00000 n 0000095824 00000 n 0000096220 00000 n 0000112942 00000 n 0000113341 00000 n 0000084432 00000 n 0000084881 00000 n 0000103276 00000 n 0000103715 00000 n 0000070186 00000 n 0000070582 00000 n 0000089209 00000 n 0000089643 00000 n 0000115575 00000 n 0000115969 00000 n 0000078901 00000 n 0000079279 00000 n 0000104171 00000 n 0000104574 00000 n 0000066656 00000 n 0000067133 00000 n 0000090928 00000 n 0000091351 00000 n 0000109777 00000 n 0000110188 00000 n 0000080139 00000 n 0000080558 00000 n 0000072792 00000 n 0000073178 00000 n 0000099713 00000 n 0000100129 00000 n 0000061955 00000 n 0000062375 00000 n 0000087930 00000 n 0000088347 00000 n 0000106293 00000 n 0000106695 00000 n 0000074087 00000 n 0000074481 00000 n 0000093612 00000 n 0000094041 00000 n 0000063272 00000 n 0000063684 00000 n 0000082285 00000 n 0000082714 00000 n 0000107575 00000 n 0000108049 00000 n 0000102441 00000 n 0000102819 00000 n 0000069271 00000 n 0000069697 00000 n 0000065393 00000 n 0000065792 00000 n 0000097113 00000 n 0000097516 00000 n 0000091372 00000 n 0000091792 00000 n 0000116408 00000 n 0000116840 00000 n 0000111107 00000 n 0000111555 00000 n 0000081436 00000 n 0000081802 00000 n 0000075355 00000 n 0000075837 00000 n 0000100630 00000 n 0000101027 00000 n 0000094925 00000 n 0000095355 00000 n 0000064994 00000 n 0000065372 00000 n 0000113362 00000 n 0000113823 00000 n 0000085335 00000 n 0000085729 00000 n 0000097943 00000 n 0000098374 00000 n 0000066257 00000 n 0000066635 00000 n 0000086195 00000 n 0000086598 00000 n 0000109337 00000 n 0000109756 00000 n 0000071945 00000 n 0000072369 00000 n 0000098395 00000 n 0000098832 00000 n 0000116861 00000 n 0000117296 00000 n 0000092268 00000 n 0000092693 00000 n 0000084902 00000 n 0000085314 00000 n 0000076305 00000 n 0000076765 00000 n 0000083563 00000 n 0000083980 00000 n 0000069718 00000 n 0000070165 00000 n 0000090108 00000 n 0000090489 00000 n 0000079699 00000 n 0000080118 00000 n 0000092714 00000 n 0000093142 00000 n 0000080978 00000 n 0000081415 00000 n 0000100150 00000 n 0000100609 00000 n 0000088767 00000 n 0000089188 00000 n 0000076786 00000 n 0000077167 00000 n 0000096241 00000 n 0000096666 00000 n 0000103736 00000 n 0000104150 00000 n 0000061110 00000 n 0000061535 00000 n 0000105873 00000 n 0000106272 00000 n 0000067942 00000 n 0000068364 00000 n 0000112007 00000 n 0000112472 00000 n 0000077188 00000 n 0000077644 00000 n 0000093163 00000 n 0000093591 00000 n 0000080579 00000 n 0000080957 00000 n 0000105421 00000 n 0000105852 00000 n 0000110209 00000 n 0000110628 00000 n 0000078502 00000 n 0000078880 00000 n 0000112493 00000 n 0000112921 00000 n 0000081823 00000 n 0000082264 00000 n 0000107155 00000 n 0000107554 00000 n 0000073199 00000 n 0000073616 00000 n 0000086619 00000 n 0000087060 00000 n 0000068385 00000 n 0000068784 00000 n 0000108885 00000 n 0000109316 00000 n 0000114281 00000 n 0000114706 00000 n 0000071047 00000 n 0000071473 00000 n 0000101048 00000 n 0000101509 00000 n 0000073637 00000 n 0000074066 00000 n 0000115180 00000 n 0000115554 00000 n 0000062396 00000 n 0000062792 00000 n 0000072390 00000 n 0000072771 00000 n 0000096687 00000 n 0000097092 00000 n 0000095376 00000 n 0000095803 00000 n 0000108476 00000 n 0000108864 00000 n 0000078082 00000 n 0000078481 00000 n 0000101530 00000 n 0000101969 00000 n 0000102840 00000 n 0000103255 00000 n 0000065813 00000 n 0000066236 00000 n 0000084001 00000 n 0000084411 00000 n 0000115990 00000 n 0000116387 00000 n 0000090510 00000 n 0000090907 00000 n 0000111576 00000 n 0000111986 00000 n 0000088368 00000 n 0000088746 00000 n 0000074960 00000 n 0000075334 00000 n 0000082735 00000 n 0000083148 00000 n 0000062813 00000 n 0000063251 00000 n 0000117317 00000 n 0000118511 00000 n 0000118572 00000 n 0000119724 00000 n 0000119783 00000 n 0000122500 00000 n 0000122644 00000 n 0000123382 00000 n 0000123615 00000 n 0000135586 00000 n 0000136011 00000 n 0000136238 00000 n 0000143444 00000 n 0000143466 00000 n 0000143510 00000 n 0000143564 00000 n 0000143597 00000 n 0000143632 00000 n trailer << /Size 546 /Root 534 0 R /Info 1 0 R /ID [ <57f08e6a3c7540bca64f4858734f081f> <57f08e6a3c7540bca64f4858734f081f> ] >> startxref 143801 %%EOF openscad-2019.05/doc/OpenSCAD-compile.graffle0000644000076500000240000001141113402025764021157 0ustar kintelstaff00000000000000]mw N>g" DӳҤ/49Mޙ뻺cN0t_ l8 vK5kVGBH[[[6p,m`Gaw귝ο^l?_g넑r񡲳0lH9;9>Px(;(>߿Q-a@g?dAt{3 nIr*ыŁ9_ىu˂c˾=+'N{;,?&9 [(PszzX˞-r*B+'&7EA?0Jo#?~hy_w 5?kbp39dv8WN|c`W?I%n `+nN|w4\+6,vb}>l~|51"ZȊX@$ ԟL/7Pz IWg*ҹ4GN8tG԰bQLơ0hI5R;`@ޤǏZa6{Zc|HLҼeV7$0z|]5([*RB*arN.{i; Ԉ1y;T!v&TN6ytayR+ 3* QZȱW?E,Vv4Ņ帵75HmD6npͨk_y鏼nVB7E*E?v܏e֠o Y5s*Gr[T_SLuUyeU X^+Q߱}۷%K85l|/.NtzݷE@yܯŨM\yKw' ۉ!DNB8@|hZl Ʊ  O->t7vxV4 ,7mo'EGX=(T,Ŷ>S KX_9~K)=?Px~)OJw4yZbsW!DbB>(cf=#˻"֏igW5K٠3HC0|ϸ b]h 0Xէ0l/¯_+88t= \HCם&ߝ֎c}ѷS"S4ɻ%f2Ol|?3W'HnT`P]%g<sH&L^LpiSu?;21ƺS0%H*X/*;W}> G``踬KT ׀ TH)K޼^ϯGԮ*@?p]v *$",I;]ﻳRZ>яV9x(T3TH5`T35BnJ>:Qnk*:O)%~Gߋ!b]I}W-^36mH:BU'v7ԡdO8K^mbTY򦚮 6oLA*vRHe Tm(7,80CF`!ˈb1TC 5Un!VKC'jt=Q~hpgWI?P2[$udpW *ulV0pFꦊoG>gVwX+XiLxcBT?܅nZb|ؼ>X1'`>oHNuH@۷s!U*B<4"RIiT/_l/0ց.#kQc q ?Xe(-fJg`W:%WD!5|nfhC S:;CSPJ")[Ŭy Bk4VdcYtz]ꍵM 5׿pf- u5ǭ**יjәJ UkTjHKL5Rgc]t}5iHepw_^pdL@Ý\}/t"O<Љ=r[%úddA mBJ偏yX$x/P8imGj ֳ8 wUڷ#^]"=%`K%l7 "t[8hlD#ׂeG)`ە(k4d.w0۪[KMyWBk?*},t QpXJhr q$P:Ǫg/{p?`߬ecXVDn`;;|* ѥEM6 ,"P4,]}+p<~d+KZq*׸>8Le^T=URC㽈T'({8/ljJ005!tLK'.HF VWY{T8# o+4;C-i pYմX[-y'klr2 Г cVMݑ˖HHXEK%OE|ݤnj|hzJ1""?y7 L`Se4PBDfTXT<ѠGzq$z#n *5X7=ĂL̋MbUQjiV޾O EehMVc/Z5rbR?5ړݳ>xNKϭ&'q^{'56@ҺI'I6Ci3I餖3ɇmTd.1LiB"Hl", "*f|,Q5kdXyCΕw(t܁>erp]zu;ݸ7&?u/5]ęT "Hq{g{7>d'Ӟt*)]e_Arq*JVpOO[$9 cUlk\$Oy[2>x26ے 4Nms ]b4Nܓ[wD)K( "r*H% =$.0h6iN74~zutYx,rU柳e+Txhά+lD&89HJlY."vw`lxVS8q Y, #6H,Y ozߑn4C/?pxu[رN{}ϲT>xV\ǜU US"S=gFNCjb3{ui\9^3SY)@d~]^+ .,вMkzGN8tbi&΃c8SU7~l2nUWb]=*0c) i=U\2MQ*9e+̧Rn(tŠ,{:`E;.K+ 1]8QUi*Hl|J_UsYCQGVyD=`iPP~Ag*DL@D5&֜)yxꠓt^/y_6q/+qpҏ"++9fm]! o_ `O!=_뇯ߟށOοpiIObJ}ƧTlB¼Iv,wy\װr.:㵘=ۻ{gLʔ_">aez>(.ƀ[2]J=(%NUdǘO!d ~"y+z<|nM:=Xpa]fhn$@nC r*R[xu:)x޳DY|F߾?(2gCY#+&openscad-2019.05/doc/OpenSCAD-compile.pdf0000644000076500000240000044534413402025764020342 0ustar kintelstaff00000000000000%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x՝[,qSti̳O[d IpyA$Bw/U=3;0p;򯬬?O>tӇk?<' ӹ=wS+{]o㺯nhcU>UsuTzvSu{;[@sxŷ;u]W3Z_swM5栯95RVs 5CaZjk͇]{zʧO>կ|j?W)kԞ<=On?/0D>EB`N&0[ƉVfZΧ}zng-_M-vhg^u}~><Ͼ}oo7xNݻwo޴~o>San^ap/|o~#<:⾿h7O>?oi_g_Ɲx|/_z=lrLƛ>,/q|A K}!eG䊬c_3{A,|hQW1|S/Ĭ-f\ 'bϛ|!ݿ2x{{ӺA\m0~: xC/E7+ozXm{|ԦK|{^[')\dNނ z d|vAמ D9Xuj%[OB0yy&jҸ5,{qT*Ο^MY_(TF\T :'uۀ#_wv<` qv+D {$oŝ߾iN>Rxʇpk7󴙽"48k *F%G Iw-ogÏ˹#XkO&s;!?QTtE9M[>r>uyO=F`؝:CiOQLz -#GT1>^qgةmV~ȱ] S' #-4L˸0ZcK/422IѸQh:AE qֳ57Awf%W ^ e>~B~~i 蜒~Cq*B{UBw:>1흼,1PPc)(4NU%!L7%iުrRrWqJ٤$EJl!Gs9R*sHR@/#$J ,o&ĔS'Cp&]paQ$19CNn}\兘 e{NgNduhި6G!Ʃ[[:!F, kض%*U .(8LGV#ER=7խWG|U(skwBە]JgjLWٴJ;ޖGL(V0l(vpF/f lwpR[I>"[Hk$-H\9g&1Yc9O4[N1O+h| fT7/۷e݇Oj#Vvr: iJu 8^ q0gN\9E jhG}@.F#B],>;۩QLM hHR.q{q*x@]z, "R&L^j'G70  NP"S>¤5U )^V2 YX(j7ʖpaSrl.|911SͩYIBX%i q% HQ˛yuaszB"r2\.Ʒ[60谹Yh>mw6ָv67݌umVt6ׅmn\˰wn J[uznsO)Je;Ne7 `i &z} 51q[d{!`ns4ܬ'6mܐ!]6׈bs\lK'6 XB5zUnBy 㙀\DAGI bO"MQ{HTxeȢ@|CwDЙRl$NȦ? yrARVoو5xnD':z'L#b~k_t2zFev ӊX@ayuJxSD,'^ۡ :Ѡ\A1pkw^[Bb0Zk8+ ^#׷% sl1g*KgN3T ݩk~>iU2 'Y жhW͉ZgBNٱeФذyYCz}5+3}TqE MXWe/u,v^Y>Z&ʉ,ZG+lx(/ B2z&ObP-R |Hˉ5,d%!~TX}\ą:R?jGTgD1YA"5Ǣm$*^f>E󍓈o0`KC+!,9)/my['~lf`o9*&]# BiPd@&fʼ&y'ys33O EUN+iMo9zEVr&U'UA[$+ʪ^CDR;_z/?krw 2ۻTن/B c^+xBM)}hhH gA]SgF|T&y:( vqT5϶dz DaQ t2ڡ3#y#o"u %"lK袓7L,BTƩc#Cģ* m~&TVEKEF jCsךgl1;\ vj> mz>n@5TP#t{ӂU a@$ *d_dDI*A8ܚ.I IcFWFЋ{:9M5mbTٳΫ,T +FB&@ZҡXnIgr5&"?0=#D:4@lഄQcF4S(ֹӼ-©'^}sμ /pdKvV#nCDTI2>T~?IJP_r쁑PQEұ5klҸQ;7ZdFf4 )Wڙ7%o/YXƕ5 v :U؏|U&y,$0Ǿ ^l.}n+kCt.j?0|;1&>E0\M1 G/ˬT5hZށM[N?buX.qYk%"AKe8Qɟ&VL6 "R6in7E+ ٍM_w$֢^'2adB*i^$3IAה+,|#oDINɕ!)/\[M i`@x ~ &#&asJ@}/\dtx݋E|h3+2f_@l,-8`X*IL8Ŝ dۿLz*nVw~NY[;$\眥+aD?2x_wgzl~f̹I)):3OLl.Z7g Al- ?4enJ~}fn=uI:2ӥhE)u9%JX{mg #bDW2l$9QjN)H|(۔`RV OѬ 6 Hl fgj5K6F{?b?#c@vʻ+w} c~zc+_e'~xIyOx(ePQ^-.dd~Vo RWld \Xɪ(W{| &o׏Q.zd-pA^2dgϛձ\Gj\]X%HnZ!MP"̧Cѵ'̏iC#)BT,7ڮ^yw!W0<+#;+Yy3O>ek~::4'j-ӚAjqAܟ,֜M[%XHknD(WUJ`&ђSދ+sJ [Jܥ#&9(ҩrS`dW*v% AB K Q8F Eܣvʻ %P\ {@P^ $'ϫ> Ցv*&[Ӑ9~u{eø &Z{R"*UCKf8!2Hg,D?FJ@,,q{+1uNI T$sf ;U?4R[rJzAPrJEe?Uu1[ǀ i%Gt$G6DfDY& R _!XBH c҃^kze}Dž Mim;\ Y`G&v߽Bs^΂NFzDA1pVUGoBṴ{Dx^%jad+wʅ)̦TT1V]µG"0vVVK.J5"ʭ}e)a3adv%.{%pʭK]jIw[;&־YО.S4fH[J> |^ I1<4A˛-%8rơ8~vY+eMb5+$,xט &8I.^bEKy kQ r[6c'C&ޫDKLz%G2#'%.RGoFtqO h'|3z&oLTﳆtU0'#vʸ4*ޒ^{&wd{FyoFEz$Qи 6>+lMr⠰3$(oC}ޗT{ybARxvJs(بR5.fY+n$VYJE'k:\JհrJ;."ʲ/Pmt{G d.Oψ~jڔEJBRe OhJi*UW^"4{Kz](QXfEdUźUьoR'1нGqW6)Eh!Hwl\es)ӫW+ 5lL8ed@Қ]Ii®5XmUt!C.K1+i8E. aVs>;-wuWkDp5>jvY Tr+jɺg_z;lA: W%'Kg:r;XlWdlWX()DvρmC v4l'o;ɪNp8.}HS&ZKH*|;.V]'^bR%¡7$[%,$`]۽Mz DG޹;ķ7>n ^ɀaCx]@{l ymcu`NǸ&q'u1nj2p-_0nHCU|{#M#jF9:jfU]4*E٩#v(E!]uM~"{c], %:bAvcԨOk}'M5qJm9x`$: 6ut*0 taQ"^H5uL,부R^N[jI^ʙ/Jv ^C?5O{`= +8.w ]_f_caU/*q''SȼJu(cLiMԵNS0fX OaLoW _֫LTMq V詑>3j49NTY%IHكfr[ ?`^z 3%և|ĥfY 4XQvxQvY3!ɥ39v:.G8L=q3dgf`ww8hK4]h:Є;A{4ڑ+S)FҬv{Q`*f,wʿ̓㸪,%\"W;E]VtWKM=G|MHcM3ِ|Ӳ BHm|D/5N9],w=Ɯ̾foFH=s`zf=zƁD=I:3/Pe*S-cv'VȜhg*-%mriNr{iN5rӐIsl$቏[O쩔[qQ1t]uǞҴ6BĘЮ13YO)M+gI |oHψ%Ik[$ x ʭ3;? 28 x>lu(_) a,vHDV씧Q+Y ެCYg\DKFE SAXnG@l EyH[syDw> [rRx>hؖ};_<w][_1U>>ZkvvsF{|-i[9K_[95k˯0oųPqb•W\dE ފ-a{حA9$H4V#/aIyt^2E S j,ų"o67 R9/}kTB_d%Eμ$|tN8u)V$MݟðD%%=x7^ DH"'Hғ3J`*Z%.Xγ(بz{:H(g?.s|}v‘7zJ_Qy9P#3JRUA)Iݿmu >돳X@ (aQڻC2Jʐz&SaIw{= "c槕\g~Ͻj>8u&S az^rhVq^K[7.v{g^)lHxFg{8F;R_]'X'1hZ[+q1וqw腑g^7(=ͭyfgc(~*R.r!D 5zGf9&j\0>/<"iIyhFOҖ8*:BZa*sF}ϑ-r ]ఴ-=E tcߔHzL\!+€,u3LH^P ck⼬%^lF)N%FG P3jR3F/0A쇏vXNȭ{ЋE'+[ $ 9jnn׏^نuEEl_עs"@?Q[ ~/Ico= )9K7]( hbl:@8*h2|4qږ(`"JȶNVCHD.R杼nE|b|`n7dKei6H_WJ!1 A(m"fY'1rǑsTivL.&x5Wy:o9P{"Kj.zwd妟YU7-+f%nz 3Uo9 P(Ltq #߬L=IY_e9#J(_3kCFДO:ߗ""˹Dٲ+{̀(l>>{/crOgl/GOf`妋5o.K%]ȽHe:!wKz໑ęE+p,s’ K`e3_`|:6DlK?rSFr1 0(CzPQk9,NǸ̻cIcdR'EmES^5IłjN_Uq3RBy[{F؟o;@Q~4<`/MN<)矲8ڼ}l Xl K1#Yid.Xvj5iY?df5Nvkw4C񮴏<((`l>%g2V샡, s%v}S221^Y2fr=J0y+_w| bDE^7z9T̺<IG}MIo8 ưgyl[cx!hyz]gCr ;3K8 E9Qw DN-Jo:ߍ+ȷ45#GUjh;a `E(R:L)G^izk>SmPOY#VX|&$]FnK 3.Nv)=~Q@/^*NuIM*Lg0߻~6qHa*Q*q<+G}UetLTeX@C |})m-IEvy'լp3ιZv;7ްb_xkZL5R)2!;'ήgk4D~dd=~+Hr7(c^$9 y5yf=+ -|C7qJ@3;}(. dJZNGSc49۷0=LX"!j)S?'YfWM ns 9?1'8;/_癣ʲy\FZ|Ow2۬b^ÌC^ʚw %F",2i7SEW@P ѽugǂ֢/VW㶕Yt,?3{HN|k9}_|aB}G>/sEfJD`,eJD$Ҥ0rCZO1g( v㏥0'dHECu >בj^B={TJ ϵWWȞm88$rgB;"PPBG i62<`ҷ7I:E+qCR\eC#Iع<>L%f;ykW7qc,qXKb3U7Y=}DŽ?ȣ;|& CA2+=w!YM2?S,;h6 X&MPjK کϭJv- W rb~i}QU$qagq endstream endobj 5 0 obj 10973 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 1358 815] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R /Cs2 113 0 R >> /Font << /F1.0 114 0 R /F2.0 115 0 R >> /XObject << /Fm6 23 0 R /Fm24 77 0 R /Fm13 44 0 R /Fm32 101 0 R /Fm23 74 0 R /Fm21 68 0 R /Fm31 98 0 R /Fm4 17 0 R /Fm9 32 0 R /Fm5 20 0 R /Fm3 14 0 R /Fm18 59 0 R /Fm19 62 0 R /Fm25 80 0 R /Fm34 107 0 R /Fm8 29 0 R /Fm28 89 0 R /Fm20 65 0 R /Fm35 110 0 R /Fm10 35 0 R /Fm26 83 0 R /Fm2 11 0 R /Fm1 8 0 R /Fm11 38 0 R /Fm17 56 0 R /Fm12 41 0 R /Fm14 47 0 R /Fm15 50 0 R /Fm7 26 0 R /Fm33 104 0 R /Fm22 71 0 R /Fm30 95 0 R /Fm29 92 0 R /Fm27 86 0 R /Fm16 53 0 R >> >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [553 0 643 57] /Resources 25 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T055V0P4P05W(JUWSH-JN-()MQ(*ֳ4s=s \  endstream endobj 24 0 obj 75 endobj 25 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im1 116 0 R >> >> endobj 77 0 obj << /Length 78 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1084 292 1223 349] /Resources 79 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T040Q04R04T05W(JUWSH-JN-()MQ(J!P \KrgK>Ш@#6 endstream endobj 78 0 obj 74 endobj 79 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im2 118 0 R >> >> endobj 44 0 obj << /Length 45 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [299 180 466 238] /Resources 46 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T0T00P043W0P(JUWSH-JN-()MQ(*343S0BSs= &=##\}\c.|qv: endstream endobj 45 0 obj 84 endobj 46 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im3 120 0 R >> >> endobj 101 0 obj << /Length 102 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [598 718 737 776] /Resources 103 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T0P07P04T0P(JUWSH-JN-()MQ(*34P0BSs=K#&=C3Cs\.}\|& endstream endobj 102 0 obj 86 endobj 103 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im4 122 0 R >> >> endobj 74 0 obj << /Length 75 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [943 180 1082 238] /Resources 76 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T41V00P04T0P(JUWSH-JN-()MQ(*I9LBrg)K>Ь@9 endstream endobj 75 0 obj 77 endobj 76 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im5 124 0 R >> >> endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [943 292 1082 349] /Resources 70 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T41V04R04T05W(JUWSH-JN-()MQ(*I!P LGrgK>WB V endstream endobj 69 0 obj 74 endobj 70 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im6 126 0 R >> >> endobj 98 0 obj << /Length 99 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [600 533 730 590] /Resources 100 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T030P056V04 E y Eɩ%9 E@e i*HU5Wp TD- endstream endobj 99 0 obj 72 endobj 100 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im7 128 0 R >> >> endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [473 0 563 57] /Resources 19 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T017V0P4P05W(JUWSH-JN-()MQ(*31s=s-\; endstream endobj 18 0 obj 75 endobj 19 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im8 130 0 R >> >> endobj 32 0 obj << /Length 33 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [211 252 318 309] /Resources 34 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T024T025R040W05W(JUWSH-JN-()MQ(*340S0B= \}\K.|Y3> endstream endobj 33 0 obj 80 endobj 34 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im9 132 0 R >> >> endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [553 48 643 106] /Resources 22 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T055V0P4P0P(JUWSH-JN-()MQ(*T0BSsr=K#=# c\}\C.|q{~ endstream endobj 21 0 obj 85 endobj 22 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im10 134 0 R >> >> endobj 14 0 obj << /Length 15 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [473 48 563 106] /Resources 16 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T017V0P4P0P(JUWSH-JN-()MQ(*T0BSsr=#=# c\}\CC.|q{p| endstream endobj 15 0 obj 85 endobj 16 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im11 136 0 R >> >> endobj 59 0 obj << /Length 60 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [802 292 941 349] /Resources 61 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T00R04R04T05W(JUWSH-JN-()MQ(*I!P LGrgK>WB w endstream endobj 60 0 obj 75 endobj 61 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im12 138 0 R >> >> endobj 62 0 obj << /Length 63 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [802 236 941 294] /Resources 64 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T00R026S04T0P(JUWSH-JN-()MQ(*I9LBrg1K>а@K endstream endobj 63 0 obj 78 endobj 64 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im13 140 0 R >> >> endobj 80 0 obj << /Length 81 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1084 236 1223 294] /Resources 82 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T040Q026S04T0P(JUWSH-JN-()MQ(J9\Brg K>и@p'l endstream endobj 81 0 obj 79 endobj 82 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im14 142 0 R >> >> endobj 107 0 obj << /Length 108 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1107 689 1238 790] /Resources 109 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T0440W0T046T040T(JUWSH-JN-()MQ()C5+$r{* ;$ endstream endobj 108 0 obj 84 endobj 109 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im15 144 0 R >> >> endobj 29 0 obj << /Length 30 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [634 0 724 57] /Resources 31 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T036Q0P4P05W(JUWSH-JN-()MQ(*31s=s \a endstream endobj 30 0 obj 76 endobj 31 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im16 146 0 R >> >> endobj 89 0 obj << /Length 90 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [536 476 666 533] /Resources 91 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T056S017S046P05W(JUWSH-JN-()MQ(*I P LGrgK>WB Az endstream endobj 90 0 obj 74 endobj 91 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im17 148 0 R >> >> endobj 65 0 obj << /Length 66 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [802 180 941 238] /Resources 67 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T00R00P04T0P(JUWSH-JN-()MQ(*I9LBrgK>а@K1 endstream endobj 66 0 obj 78 endobj 67 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im18 150 0 R >> >> endobj 110 0 obj << /Length 111 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1179 532 1358 663] /Resources 112 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T044T056RцƆ E y Eɩ%9 E @y 44b&=C \.}\CK| endstream endobj 111 0 obj 79 endobj 112 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im19 152 0 R >> >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [141 169 258 227] /Resources 37 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T041T04T044W0P(JUWSH-JN-()MQ()J9LBrgK>Ь@7B endstream endobj 36 0 obj 77 endobj 37 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im20 154 0 R >> >> endobj 83 0 obj << /Length 84 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1084 180 1223 238] /Resources 85 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T040Q00P04T0P(JUWSH-JN-()MQ(J9\Brg!K>и@oh endstream endobj 84 0 obj 79 endobj 85 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im21 156 0 R >> >> endobj 11 0 obj << /Length 12 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [400 48 482 106] /Resources 13 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T010P0P0R0P(JUWSH-JN-()MQ(*0T0BSsr=K#=# c\}\##.|qvh endstream endobj 12 0 obj 85 endobj 13 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im22 158 0 R >> >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [515 118 682 175] /Resources 10 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T054U04P043W05W(JUWSH-JN-()MQ(*343S0B=K#\}\#c.|aLs endstream endobj 9 0 obj 81 endobj 10 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im23 160 0 R >> >> endobj 38 0 obj << /Length 39 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [267 114 384 172] /Resources 40 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T023W044bsS Tp<ԢԂL2t*$*{p Jw endstream endobj 39 0 obj 77 endobj 40 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im24 162 0 R >> >> endobj 56 0 obj << /Length 57 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [670 292 800 349] /Resources 58 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T037P04R046P05W(JUWSH-JN-()MQ(*I P LGrgK>WB o endstream endobj 57 0 obj 74 endobj 58 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im25 164 0 R >> >> endobj 41 0 obj << /Length 42 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [377 114 495 172] /Resources 43 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T067W044b S Tp<ԢԂL2CCs 453i32UHU52r{ endstream endobj 42 0 obj 84 endobj 43 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im26 166 0 R >> >> endobj 47 0 obj << /Length 48 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [876 476 1006 533] /Resources 49 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T07S0bCcSsTp<ԢԂL24t$*{+s* endstream endobj 48 0 obj 73 endobj 49 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im27 168 0 R >> >> endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [876 417 1006 474] /Resources 52 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T07S014W046P05W(JUWSH-JN-()MQ(*I P LGrgK>WB : endstream endobj 51 0 obj 74 endobj 52 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im28 170 0 R >> >> endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [634 48 724 106] /Resources 28 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T036Q0P4P0P(JUWSH-JN-()MQ(*T0BSsr=#=# c\}\#K.|q{P endstream endobj 27 0 obj 85 endobj 28 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im29 172 0 R >> >> endobj 104 0 obj << /Length 105 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [670 618 800 676] /Resources 106 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T037P03P046P0P(JUWSH-JN-()MQ(*I9LBrgK>д@^< endstream endobj 105 0 obj 78 endobj 106 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im30 174 0 R >> >> endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [943 236 1082 294] /Resources 73 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T41V026S04T0P(JUWSH-JN-()MQ(*I9LBrg!K>а@M endstream endobj 72 0 obj 78 endobj 73 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im31 176 0 R >> >> endobj 95 0 obj << /Length 96 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [528 618 667 676] /Resources 97 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T05P03P04T0P(JUWSH-JN-()MQ(*34P0BSs=K#&=S C\.}\c#|i endstream endobj 96 0 obj 86 endobj 97 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im32 178 0 R >> >> endobj 92 0 obj << /Length 93 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [467 533 605 590] /Resources 94 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T013W056V04P05W(JUWSH-JN-()MQ(*I!P LGrg.PK>WB E endstream endobj 93 0 obj 74 endobj 94 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im33 180 0 R >> >> endobj 86 0 obj << /Length 87 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [408 476 538 533] /Resources 88 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T01P017S046P05W(JUWSH-JN-()MQ(*I P LGrgK>WB yu endstream endobj 87 0 obj 74 endobj 88 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im34 182 0 R >> >> endobj 53 0 obj << /Length 54 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [876 358 1006 415] /Resources 55 0 R /Group << /S /Transparency /CS 113 0 R /I true /K false >> >> stream x+TT(T07S06P046P05W(JUWSH-JN-()MQ(*I P LGrgK>WB  endstream endobj 54 0 obj 74 endobj 55 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im35 184 0 R >> >> endobj 148 0 obj << /Length 149 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 186 0 R /SMask 187 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 149 0 obj 121 endobj 118 0 obj << /Length 119 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 186 0 R /SMask 189 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 119 0 obj 127 endobj 158 0 obj << /Length 159 0 R /Type /XObject /Subtype /Image /Width 81 /Height 57 /ColorSpace 186 0 R /SMask 191 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0`g6 endstream endobj 159 0 obj 84 endobj 156 0 obj << /Length 157 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 186 0 R /SMask 193 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 157 0 obj 127 endobj 132 0 obj << /Length 133 0 R /Type /XObject /Subtype /Image /Width 106 /Height 57 /ColorSpace 186 0 R /SMask 195 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om_@a 0` 0` 0` 0` 0` 0` 0` 0`ށF endstream endobj 133 0 obj 103 endobj 120 0 obj << /Length 121 0 R /Type /XObject /Subtype /Image /Width 166 /Height 57 /ColorSpace 186 0 R /SMask 197 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  O( 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`n endstream endobj 121 0 obj 147 endobj 176 0 obj << /Length 177 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 186 0 R /SMask 199 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 177 0 obj 127 endobj 170 0 obj << /Length 171 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 186 0 R /SMask 201 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 171 0 obj 121 endobj 144 0 obj << /Length 145 0 R /Type /XObject /Subtype /Image /Width 131 /Height 100 /ColorSpace 186 0 R /SMask 203 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om O@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`   endstream endobj 145 0 obj 195 endobj 164 0 obj << /Length 165 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 186 0 R /SMask 205 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 165 0 obj 121 endobj 180 0 obj << /Length 181 0 R /Type /XObject /Subtype /Image /Width 138 /Height 57 /ColorSpace 186 0 R /SMask 207 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`g`\. endstream endobj 181 0 obj 126 endobj 138 0 obj << /Length 139 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 186 0 R /SMask 209 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 139 0 obj 127 endobj 130 0 obj << /Length 131 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace 186 0 R /SMask 211 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0`z`;s endstream endobj 131 0 obj 88 endobj 160 0 obj << /Length 161 0 R /Type /XObject /Subtype /Image /Width 166 /Height 57 /ColorSpace 213 0 R /SMask 214 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  O( 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`n endstream endobj 161 0 obj 147 endobj 136 0 obj << /Length 137 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace 213 0 R /SMask 216 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0`z`;s endstream endobj 137 0 obj 88 endobj 140 0 obj << /Length 141 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 213 0 R /SMask 218 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 141 0 obj 127 endobj 124 0 obj << /Length 125 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 213 0 R /SMask 220 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 125 0 obj 127 endobj 126 0 obj << /Length 127 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 213 0 R /SMask 222 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 127 0 obj 127 endobj 184 0 obj << /Length 185 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 213 0 R /SMask 224 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 185 0 obj 121 endobj 174 0 obj << /Length 175 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 186 0 R /SMask 226 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 175 0 obj 121 endobj 168 0 obj << /Length 169 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 213 0 R /SMask 228 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 169 0 obj 121 endobj 152 0 obj << /Length 153 0 R /Type /XObject /Subtype /Image /Width 179 /Height 130 /ColorSpace 213 0 R /SMask 230 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` endstream endobj 153 0 obj 328 endobj 154 0 obj << /Length 155 0 R /Type /XObject /Subtype /Image /Width 117 /Height 57 /ColorSpace 213 0 R /SMask 232 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0`GN' endstream endobj 155 0 obj 111 endobj 166 0 obj << /Length 167 0 R /Type /XObject /Subtype /Image /Width 117 /Height 57 /ColorSpace 213 0 R /SMask 234 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0`GN' endstream endobj 167 0 obj 111 endobj 128 0 obj << /Length 129 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 186 0 R /SMask 236 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 129 0 obj 121 endobj 178 0 obj << /Length 179 0 R /Type /XObject /Subtype /Image /Width 138 /Height 57 /ColorSpace 213 0 R /SMask 238 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`g`\. endstream endobj 179 0 obj 126 endobj 172 0 obj << /Length 173 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace 186 0 R /SMask 240 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0`z`;s endstream endobj 173 0 obj 88 endobj 134 0 obj << /Length 135 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace 186 0 R /SMask 242 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0`z`;s endstream endobj 135 0 obj 88 endobj 162 0 obj << /Length 163 0 R /Type /XObject /Subtype /Image /Width 117 /Height 57 /ColorSpace 186 0 R /SMask 244 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0`GN' endstream endobj 163 0 obj 111 endobj 142 0 obj << /Length 143 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 213 0 R /SMask 246 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 143 0 obj 127 endobj 150 0 obj << /Length 151 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace 186 0 R /SMask 248 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`30\ endstream endobj 151 0 obj 127 endobj 116 0 obj << /Length 117 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace 213 0 R /SMask 250 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0`z`;s endstream endobj 117 0 obj 88 endobj 122 0 obj << /Length 123 0 R /Type /XObject /Subtype /Image /Width 138 /Height 57 /ColorSpace 213 0 R /SMask 252 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`g`\. endstream endobj 123 0 obj 126 endobj 146 0 obj << /Length 147 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace 213 0 R /SMask 254 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0`z`;s endstream endobj 147 0 obj 88 endobj 182 0 obj << /Length 183 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 213 0 R /SMask 256 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 183 0 obj 121 endobj 203 0 obj << /Length 204 0 R /Type /XObject /Subtype /Image /Width 131 /Height 100 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xKpݯ5LBQD0Txi$C@k1/dxIf úhUa˅nLxƵ@b0ekF<9ūίe3Z$(g(NRTPkuUF}Z hreX=«=[(細WD0h*_kKf4ëƾڭZ> l2!׋u۳o'^ͦ[5E=,ql '?OֱQJ_D94ghxūtdlBQIp> stream x\W] B -  ^5A4D:AJ0H@0;_{s&oQnٹ3wgonOYzj팞F hVcSS3s17355622nkh,,I6d-U- dia "`F&lkGspr#qsӝhT[2AljneMsp3}XAA,Vӝ`gk n@M-Hd;G|'{% r;S-̌n> `30$ˋOJ}OHOIqC.4[k S0L< =?^@Ʀd;gwV(~LXexA~tdnCaLLLL+9'0,2.5#'7uYQm]}CCCZQueYqa~nNx^8lG43A~ҊD8Db k3#vdQދJѻ-m]nwʒg9IQA>nTkhI6= f~ŚyB|1GlfIsŕM:|t dTixhO& .)d$ݻ;P)hN. //o//ّF%,͑U,7Sp V6T'wf(/9YquC60,_X\T(f'FQic~`&Íh>LV;$ۡ!l3B Q8 7$7+ݝ5R1?56 =1pԴ̬G9O>~~L;nLjv~Y]ldr~Ypxt|| lm*G;ŢB))Gťee_{O c3E1`s0[?v'1!(jYRm`߾n)?Z꫊ _WoH$M uWOQ`= F_4lE:2X!w" %&܇!((N̯l^?wTyQ-H;ZD'dabtQHŦܼ&={0eqYM2E!AjlGm$.YЧϓH>O_n4Ԕo cy`Ì9giEUۺ0խ'5xjH @?3%%ebanpITB uw [A_6=!ܸYO +q%-mm]=yīcZ[QMZg/67T+ˋvD(5*"b"qbR E .Yo048 djê̇;*Prnm7<88<<<8 -/LqX '[үcF((%=+kn443 2U m?0#߱ E<̷oׯLJ{;k+3ݒ#_gɓuۋ:Ig$Pmlፈoĸ? }p Fڗ瑦זg2IGIwyj08/ɅmH#8[G8,`w]9 0 `$+N|VAusϧi{/h{; aaW ӣC'4&CX)4\zKӾGh0<3"m(}eۓQ53ރ& {b ;ϩ חk|S%$=.~1aK{0mL tꛐhLY0si:>pkefԻL:\g4 ;% {jc>U}rZ`Tz/|: JFw_j+~?[_/Ylle~XN*_=J_fu]1.k(Ίf{؟+4qwbic)^ȍY1J30%;'U L+oP`H=jМBgF<9)% xwmaT[ʊL{Q%_۽)F:qYtM?=(]ZI^nfrjY*B,QdԠW@hwmq\T8 *nj[vы ^5;kc2qyn I*E@Y kMPGmaVlL~0njK5xg,7;+o%c"_ޠÐTsKI_gnu$P =KM߄ ceVL#䋁+? L)of!!/M)Ȉf8ؘ7%eQN9fK[2s? I3rteu̩vo5J**NgAf\gկJ7y+N{& cO. c uwhܣOsƐ!ZD9I8c;ˬobeWJzWw[ׄA d?g>4C3el ԑ}ˀمo Y7h ryu;a%G[aiS03.I|iAޝ*(T@G_RPgCt5(0ҩfsWpTڳƮIv8.p'㛀y@Ό-يJ V@ 3A=A@[mQN_36/ۻs _%Yuf`0dy{uqOR-L53 2-\q`MzTX#8:)WE$0cEۆ9 (1{ vTBcG :! jƖqtZhu K#\C1|̹ll$\ nƠ pb 6 Ϡԧ ґٕMub^j3NȚJrBK2a"x]52s#T¼Mu3nAZ%kY>E˿.z77H2OT&Ayq0‰U(\#:p ū}ς.rsj'vNeȸ.lΟ, Cӳ W=xebo#%C LDSܧ-jRDy K%w}D/%>MkWX1CD\D%gj$ů1aߎ6Ӄm#A 6i1ٯ4Gcֳ-CX*HjKe ! yoؒ~uw bl=u՝+Az肺$|F 9quVw!, ^CǛ+q`(@}t ]*IrSuM1`"276> 󅹧; LQuCªZ0U^w͈:2 rY mFRn,8hQs6~S,Ԑ,(.~w4H|zٟŬkKh˵q 7(Rl^𧗒?Kd;`c$ll)|r4=o3oDNOķpSj]L.yLBH/4PR >0|Іwڱ&~L-QSmj aʈ0(=%ǁSfac#?/7| R,6gw  H%oKg&`* 쩧+k#:.S;8j?>0powgؗ@"藲ֆBAZ,"Q 1v~co? yk E6j vbo*>p": _ǚZQ./mjB>TS"N{8R~.s(0oG?U;S U-$Sh@,Ay{~T;;359 *~|D"9 [By9uFTNE!,/b@(3gcV(m*'Ã}RC"BEDes3^U7 'glڗŹM͠ _jq@vJ js5-\J\cKj[}㓳 KJ꺚[ B0ĥɱ>ຏO/E<9[k˳C=m =μF-53P.ʊbԧM5eEybgS" Ń qĵr0 %?x(~,<1>xR־w~"2b.gN"džiΘ 9A?51>&>ba_(4`kht-x]!h 6r__GYwW{/y@.6thvb6 E1{ fCJ؁~] U@^ﴟ8@AaؔGEo޾kh77okkJ>x sO>XY%1QQg]YԘ!L Mamm b(4h$7y^..|!} #34>ZD$(`h D0_f$rC]nae?ַnC\ⓠ!C_$;+#~r|47<$( `K+~."QA \.ϹhG!A#\$D LupAMsءwBTLl􈈍E e2ܡM/ T$8il@&fQ@Az7 L|{۽`斸53 %bzyBk"*BxK(onO #Вz N72½~gWdD h@ ,0g\N; :oYl\}£3Weյ "7thH@֗hveOXlȶ !Tb ? 1=$~ًW%U"ڷꪊR诓X]nڟ Ԩ;49cEt`³@}htƍIHM{o rPCqAG1>#p>Q$ccu5ZT+84Am'%A(uOg V|O@S>S,p}bicKsr9hu7 qs',Htq : }ĈN+fI Zøy0? mϼ#?.w zs[O4hBHG]يZq]n?pv/16G-B&X#W{^[IA'),f(Ÿ?p5YuB{Ai? AG endstream endobj 231 0 obj 6505 endobj 189 0 obj << /Length 190 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYORmÇ z5_b6SG4dVTf״ȥ8?(b_{s?}k="^?}.~~B &ȈCB!L\!tK \π >"6TFx|A(_pA e <ͤ. If%y¢b,XE<8KNJc9"4GZ(+ʕWT*p"TW P28l€ L47_vY^nJ{VS],E3yR1X, &+ëko4M3,LML%ɄL4Hݺcnou=~;lm;t5jEQ*.tY\XZRQ5mڟ>y.z<{j L,L…J2*ͦ6[jLxFr:l5r ~G :NL|?{oj;:鴚 uRL,h $&V[ g|gxX^^ZZ8=yjS˥hr\@zxUp y}+@k0 5X,.bSx)J}ks396["m+ f&=ΎVFY$"*GW6鹕@h+~ht'XpWgD̑כڻ]y0H?E"u7 Ww{d('}o'@$? &XՄ,DtD fVǁcCr ̌*D$2DerEK6X:_ M|H %X4T^qmkH4#! E#Yk5eK![ )u&{z8x9{405k7b/:"̽TYo9%:ߤ.]KBYP*U{c3ۤ(0?},)@==Q,8W)jO_6wZಳӸXD\FL7 +4Zo&Q'82,J6V &*$@>>pҦVh%WzcK$maAC> IytdHyav?\ endstream endobj 190 0 obj 1463 endobj 201 0 obj << /Length 202 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 202 0 obj 1401 endobj 232 0 obj << /Length 233 0 R /Type /XObject /Subtype /Image /Width 117 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xX[YeCE@epK"M,37 \hr( 2-7L)7,4A_} ԇ3||{9X,PA>1֝QE|qD*[$Ww O-x}>{XRnǀXh}`ܱ]R~ݜ>mZ~c& #:z޽DAU'YMvU)|t91I9m%/V=Ovsm_SN3 |H\"fs{w:Q2m/{c}-w**Y/1q27V} mF3 Zu9N ')C%6  Yq0݃j=?3|8I`lmeSuX~Յٗ=kRcyM"E`w;_L;ttOgs4?MʣʎI>vx`=&>-7H @zX&Ej\tkӭm[s{szgo$vF=c{3^˞G23nD}~erÃ@;,9&X9Hr!T倌a~`iv(L@#itS EZ u>gy~vI_ةjbe) ПPX ^rΎ t6WivA Dcݫ.aly6<9;v(J@nxxl(P)bw^0_9go-=Wo!y ĎsNu* Ofv+|˰q 9F^mt<.}rbpw[sme:K~hTڲ{^>-aASKje۵a)?sꭺ-!8bHwtZ͍O*cS$؉3"";|IEUu흆F?PX_gY+7 bǀH49XJ)CWZTU/'JsbYrR!AR 89sDd:4gg Hp7Z/OI'W Wi( Ivb8҉!etH:$&aS'BZ;JdH$rX Z}NЂ5 kN #@Œ*_bf" )3 =KGBxyz`8 9 endstream endobj 233 0 obj 1858 endobj 220 0 obj << /Length 221 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYWRV #4C%+ eP T6,nt<d^i%J;h팻0t6XqJU5>TUUUV^Y]hr _Hd*/gjueU֛]?x84<‹_{{KÕ3LyE=$ :Q\^tsۓɩ7fLO=yn5-LʷBй,DIzg؄gnϽm5Uϔ\:%2DdK(IW45lvaiϷ>o=1e(ҦK,9bKGrM;cӞec`}cc+66kԣnXsDgDp*?>onuoi=e[H&?I_{{l?@)X{7~tRMKDecC[(!2`>/M`,Ȗl^ƒ<2W_=8YZ@ފADE4em31RU&{Ka Y _`ߓ)j%gٿ ` _6˞v%:e?B$ŧ_ ?s׿a-a"$vREq9bq LA(<lY[|1l7]8 ArV[)Q}|j,`Jc efHw۔/_Bl|7 b.? qaW K@I@T&dK0~nrRQ)E$; RIz?/<)Ge?_?HU\@.pt TRc7WtAr)Cc/_yzKGTf`e&yI'_m}+ ueGmWϟHuewCݡ7+C^X@,+ہ7SCwW5GW[EՅ:_-7}9Jq|R/VQ:vfH2Sk mB["!n WO,RCW6\\]?*!$)^_]|xTYⳗ11$*Ko}ݝѽ8aZ_N9ZM(nEU\ :%*5ŗNkV#Tۮz_O("J~"Ys5͝}ӳK+Ph}TcAɿ,Nu6ל;%#*-bjsMAn=οt٭j8hI] QjtƫVsh홇ӡou͏kKp:rvZuDa )I3Eƺ{'3pf_xo5pX͐8o b8{zr: =]NwHSP(LnQUL= ǟHU*il$zP[۷EH L! $"K$Rq*9.^p8l4yPțД fdT*hLȄ CF<O& endstream endobj 221 0 obj 2163 endobj 226 0 obj << /Length 227 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYWREP  !%QS#-j]&D-K3QZ$U1"ݵ9c?v\s=W\?^ r}9 `8pX B" BRC!x$ۣ1;5Fg$3,6+l̠)$<S!H4O.?=#P;s|n +)J"`1Hϑ߁'s¬2~  *y1✢wiply:9&]_)V, w+emU*iITQ" P82=E$/ԵF&Zt=[^XXt߼SUrQJ'E@b ,vKDžeφwǷbdmog"Y+%H+oL/'g;@{-ҧQ\)IcPD$`Դ>zaYxwa7DL|=:: ϳ֑5%slZH,&:'>8=޽_c=8燉AND csdz2.Զm=H_ Þwuf6Ֆ3X\D`ԬkM̺6|@8CL gRA"%!3x֞Q?oUс˼mPcWGe 4 yb6 _n\`RqDi);[+[@ aka}XA""@KR^=y; =\!Wߎ<]Wfhb"WCc-xvp9D!Y{7D":HfǦk2֜c[l.1G|Ox/ NA!Q 枖|IThb{3\ 2nY( 84pC%^crT+$$D3`-aK? +rPs{1;/`^uo$q{FbHtF5&ԜC.Ay.撘K'w&^T-Ӌm 8C} lQ-:E!;>ް#q$@ Dq@"2cF;κkHHA[c\ uѷ?pڣ<=<חoG{שI@|J10fs<^~ exL^q9lMLU'>9k{ vw}ScsU\ȉ $+5->\v{7`ǽ윳O-5jˠDK>\ʫ5s Ngt.ڧ^0=\UfQ_ &|5hlTXL٦>Ƅ }62۠V+6|?ު7)qH4HJZ;G+X`G;ZoiKN")tINQyu~Gף&S_?,3?긯o./ʑ)L d'].6w{w[Zm<ǢO!RP ђSbBUVVUÄJ暺D i 2K"XPXX#,:;mZH`LD*D)R2{@3L`dsRi<xiTɠQܟ϶2O$z"#艴x*u Dh D" Fx7B9 Phph8b9e?+)?` endstream endobj 227 0 obj 2181 endobj 214 0 obj << /Length 215 0 R /Type /XObject /Subtype /Image /Width 166 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xSYǹr)x u ż2kiH:n`cx RIDIӿEArqkv?!H`߳zvח^Z" O9Of e]#,6;@ qL{٨U^$vv W6,;>xaXh063+2ٔ*BYmclsCd ? [k k)O:z1_l^Zwyō8QBώ}qjϵҡ#J.{ 3]L3< u/Mv7)KL{ Hɂ{}oVnj*-q2r D=g0~D {Gr%z8|+W?΃>.q3W?QĹY]f&V D8+_K=]3zCqmt@Dph'DD= cP(ɚXK)mp/J|{{(諃IQ$ yxߓ=09;ys3t9~MrXǤ>}IĖ endstream endobj 215 0 obj 1537 endobj 205 0 obj << /Length 206 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 206 0 obj 1401 endobj 191 0 obj << /Length 192 0 R /Type /XObject /Subtype /Image /Width 81 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xX[i: r@@BG4L(ˢTtMuqIVռFEvq%-7tLf^mgg^99;GA`0Y=d0FP.{a\(DqX( &b+T)ju*jJ,KFB>+ӴdNo>[GW+Cf3hPjHCl9J\x$ϘH}Idj2d)>]Z^QC|TVVΔ+kUQbYDk9es8/(lpDL!DŒJ'"R/;hjiroP}h.Jpّ&Y QE׹=(svowAs"Md1ZcsWѨw|ƞmw՞-2hd"^t&*HR lox'gf1;3|tĔ&e˵UΎWK>?%|sSއ}V#0 @x3oW>Qamuoa MRD4cUƦ߼_[ܢ;TX ҙuWF&k[[W|sC=Oj>E厎饏abb7?_|dZ#`X\㳾Ս}1Bvrzu"?D*=Q{x&$ }-_hƚ|1f7LT C:djÎDZ'0j-LUa$Jv•{3ƭo ֝6e$`j0JWXu;a،xWGہ*RejE6۝=^h& 2vQZv zsE#yη5RGH eP±!?QTC;H 3OHcˀoBBWbr}T9ʯ/Q@ u5J1 ^T^lʃ@L$2 2ywlw I84W mmw`JZ-uEJa"6o_.Z~7?9{Cvk ?X\3/N^ Aq9iDBe3T.ڃ cåWEjnYTSп&ƥt@н!f"^cӁ*+ρr$% \p8yBcV:;G߭~v|lmm[ors:1B`23Vwgjq\> 1pB!| mK>{J0bBtwr39 *3yWñW/Pa~ѡvgä#{084s_;<b /&ܻXk+Ч¨1`2bc+?xtx`u05,j>&rI)dls/.z{{n^hqW,ӕ9@g"P%/_Ϳ6:N3T|0X(`LI7'lU5Q]]UQf+6J0)Eb*Z Miɉ`Oa}a p0bB\7)!h<FcAGjS웻`஧LIMhLJFNQ zA` lR< }>Q\c-}r1,!A@>\0C m¡ l6\óU d&"y=eK endstream endobj 192 0 obj 1795 endobj 222 0 obj << /Length 223 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYORmÇ z5_b6SG4dVTf״ȥ8?(b_{s?}k="^?}.~~B &ȈCB!L\!tK \π >"6TFx|A(_pA e <ͤ. If%y¢b,XE<8KNJc9"4GZ(+ʕWT*p"TW P28l€ L47_vY^nJ{VS],E3yR1X, &+ëko4M3,LML%ɄL4Hݺcnou=~;lm;t5jEQ*.tY\XZRQ5mڟ>y.z<{j L,L…J2*ͦ6[jLxFr:l5r ~G :NL|?{oj;:鴚 uRL,h $&V[ g|gxX^^ZZ8=yjS˥hr\@zxUp y}+@k0 5X,.bSx)J}ks396["m+ f&=ΎVFY$"*GW6鹕@h+~ht'XpWgD̑כڻ]y0H?E"u7 Ww{d('}o'@$? &XՄ,DtD fVǁcCr ̌*D$2DerEK6X:_ M|H %X4T^qmkH4#! E#Yk5eK![ )u&{z8x9{405k7b/:"̽TYo9%:ߤ.]KBYP*U{c3ۤ(0?},)@==Q,8W)jO_6wZಳӸXD\FL7 +4Zo&Q'82,J6V &*$@>>pҦVh%WzcK$maAC> IytdHyav?\ endstream endobj 223 0 obj 1463 endobj 244 0 obj << /Length 245 0 R /Type /XObject /Subtype /Image /Width 117 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xX?[YMDHܢ!▢!#TKTR+ )ZT)&7 !a~-1fs|ss>k' _ܵN"H-5O (TAQ)d K^H,6q9A@:L ZJg"bqHQxa1 ퟈2ɴ@/L OLR`BRF) Z䫖'Q,^XTVb@ZJU$Ċ|NլGH*nAQq5z}Iq|mnfMST30:e4 f- DiAK0@ UV7l]aĪuɡ:\,`HR$ZP$v殁٥ 7c-m̈T/R|Bx^j`н?e\+!H/̀B 9ݹ=>>+ ue#y i%a\7KD(Z8WJrb~Y%\VAqвb=B~z߶E&Y*`Ow*,UXI_,%2R*`/).:X."΍|C}H.z5rAy)**DbPj(צ(t/_S{gmaR绦D'BW1`Y>^ BOT, 9^5Hjt_>um}y>p~TVht<ٶk)`ptk_ k n6sFJfD)r |5468V}7#.C;*Jȼ_[$ :<:ٝ{ojuYJƦ)oGk]ێby($uqJރIʥ= F8wֹўJ]:87">CWlwXD+"3maMG]qB"`Q/fPm\]T;6g܆ x [řM 8"8>q08".Mbneή G=řnCu$ɥebyf~yuݾqbζþi[~ZSI fp2#*nT6{GgYƶkUҼebZfnaL^DR]Pnz~2;ya >}y|J%Q) G5)Tc߽5w6<~U%Ht> CDYwT6L=>}m~'CCu!x~ɅZ`EtQUmCӏ-s047={R/Ra\N':'Wdλ{X->73E#@OA!%\V]$>Q|E4[i1b!/W~Et YK`b%*P*$,:frNL3Z  $Ri4jHRHx DRL+P!|qA,_cRie ߿{!/XۈM&SL8, ?7F8V\oo} endstream endobj 245 0 obj 2061 endobj 209 0 obj << /Length 210 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYORm÷!8~aqLifҐM|[bRi \r"Jn gJF}Hl{tp;yn T4 # @g0XpAdAt/<Lpy<>_|>E l4: q*p@4 %yI4$._) brLs2TlY\,S]QqV_Q)Y6*p̔€ 4'O~Y\nJwF[U),A3xR1XAU57 Mfssc*Mi1&rXd&\![Toݱ޷?ǏvV˝[j0r,H"+.Ou?} =ϻ=uZF}ey1&%B%` fc~5vh&Co^{ojqɅ~|k#` M ML|g`75162YL"h DS;>anaqyye<,//.}yeo1j2T+8X]c;݃cUz 5 `W|cCnjUy)I UZCK;96["m+ g'VU("*GW,vg@h+n4O;햺J eddm]n?Dw'";iQ˳3BcQU޷ xOYl󓃽O*BV"CT:"պף#Ly!WgG=M:\*D2%W/}K_ M|X %X W\smkۜBh,;BAߏFBkscT(/hlכ=S_=N}Hh`ìNjBvX(REodS0K0uI]v#O3#}ֺK9"YP*{]kۤ(0?}")h=Q,8W)M7wN[ಳT\FL7+6\o&3 /LqX!, PHP9!)?UH*݀JuH%}TM JƲ|_I.xbMA?b'sed! 8 SG9+#]vqxoK6+coWOȒ& Jvך{ n!~vH9;'8P5Zlݧ$R; DӃ)3WZS+" pFNw:Ÿg7/ p(,.՜C C t9m׷%&gfk=iw}O>C > IytdHyavx?C endstream endobj 210 0 obj 1458 endobj 199 0 obj << /Length 200 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xY;[&~-DwēƘQԵz<͸6ѸBv !霮plOw߷C@RxC ીAPp00dpPY &xt&; DXX(fЩd">d ℅ ظ8!2DaPN!? .O0ءXl(YT*BɤIĉ,˦S5@CԴB%MD s2h~(!PIZV~e?!CEV{LSR}BaPU `B2C䴜e5u M-L}3G,pT5\ V(U,oy67V'MUy?J ےpx2+<.5Wk2ZVkߍ{]þj3v5Թq<O ŕVcw}9::F#ϡ{oanj 1ƥE+k3/۝{㓓?Kqs/~-W#ehܨluU[Ȍ?<:'$~piΌ~ d^_kJOb9lA{O΁WO+2a|zGEM>L %5T컇_[T} KMI $hj;\oD`$S`)JK.PKe'qʔMU*dv8F_}MI8M>E'ڜ rގ?R p;{_Y;[W wueއw~$-qp*φgïxWCצufYV)Xmqx*7J7N =u^&'sQ_#R}}ؙQF7_WC@"p7> stream xX;[i}_ B4Hi/cB>A[Ujm>ڕa,ERTl!5ڼ^ܿȹ.Ϲ<{ˁI O <AR K-$'Q$tLn9w#n}҄ieN\xVJ[\bpLz##z~o[ n_o(@  5sM)B?I/JAMAM?n9FPPOM{VfDž{oje9ޡ.wwcg}XUm%N5W .NGLMtU:!#Sgj? Y[3/jKRW;|mqpvu^ @@ I\)l X`oP.G0pf[L#98sUp /+uZM (`F#V4w ͬOWUnc}ci4#VϦ\ I1mѹ݃S0 fc$< ~Xj W/g:,cs+`E'Cd]n.֨dI ϛ;ݽ},۵o~\6?{Rgx]fp@*7@J)hwg|ް,Όju9 R?pE Heᱚ}s»٩APMTsW Ợ\i0YF'&&~C81>62c|P-dPx"+K*j~1=1zP]^q_)!wbϝrœh,AL-.XSb0>EVqՊos`V4Bu/%3H[r-r]iIAnFr2> stream xYWRV #4C%+ eP T6,nt<d^i%J;h팻0t6XqJU5>TUUUV^Y]hr _Hd*/gjueU֛]?x84<‹_{{KÕ3LyE=$ :Q\^tsۓɩ7fLO=yn5-LʷBй,DIzg؄gnϽm5Uϔ\:%2DdK(IW45lvaiϷ>o=1e(ҦK,9bKGrM;cӞec`}cc+66kԣnXsDgDp*?>onuoi=e[H&?I_{{l?@)X{7~tRMKDecC[(!2`>/M`,Ȗl^ƒ<2W_=8YZ@ފADE4em31RU&{Ka Y _`ߓ)j%gٿ ` _6˞v%:e?B$ŧ_ ?s׿a-a"$vREq9bq LA(<lY[|1l7]8 ArV[)Q}|j,`Jc efHw۔/_Bl|7 b.? qaW K@I@T&dK0~nrRQ)E$; RIz?/<)Ge?_?HU\@.pt TRc7WtAr)Cc/_yzKGTf`e&yI'_m}+ ueGmWϟHuewCݡ7+C^X@,+ہ7SCwW5GW[EՅ:_-7}9Jq|R/VQ:vfH2Sk mB["!n WO,RCW6\\]?*!$)^_]|xTYⳗ11$*Ko}ݝѽ8aZ_N9ZM(nEU\ :%*5ŗNkV#Tۮz_O("J~"Ys5͝}ӳK+Ph}TcAɿ,Nu6ל;%#*-bjsMAn=οt٭j8hI] QjtƫVsh홇ӡou͏kKp:rvZuDa )I3Eƺ{'3pf_xo5pX͐8o b8{zr: =]NwHSP(LnQUL= ǟHU*il$zP[۷EH L! $"K$Rq*9.^p8l4yPțД fdT*hLȄ CF<O& endstream endobj 249 0 obj 2163 endobj 250 0 obj << /Length 251 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xXSRY\xyEV6C-Ib6h>St4lii _9X'$NڞBzQ/|== L g8PP0L:R8Fg0,`2tJE('sZ*Jg< '!a<IGud0Al.&RTFRT"NI 0. P~4/LeJJ>jJgHE&SԴLUf~AaaV49*L$hg7HdƄlmAd*H2cAKKl$AXrZPL-M Uw r2a< Em)(3>)M+2V֛_Xz n}\fɄ5f I@@+j\Xp6Xrl1c4b> =vF+E^O.ڿnw=ıv/X߾h,s-\2JgݯXXw=^!Qx=ߜkڪ~]M`QWo?~E>׳X~h*Tl81H \kjm]x{>)νĥsS|2X=> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 237 0 obj 1401 endobj 216 0 obj << /Length 217 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xXk[ZW]n(Jڢ(JHCb6 ) ^*$Z/$yщF/&h~/~`\w?*Ph  a+A2D"1X<PLV:E 'b`}5K QhL?#K$HrA"g.ωD9J( TgaSf"JSCZVUZ)2afHJr5cK ZZ3ureςIxp`@oFNa6vuZLF] Dܙl`pD%UnatjbL8#A !&PbrCj1ԕEt DpzLgtOxfh{>`^Ӓ2i[^Y5V^NݷYhp m6O_o([sXMrDk]xtC})W CR¥plj(LyEˤwmg?F#6,_$x%R9be7~~8;:5bP`sׅۇNHwcǴ~ty67Ԫrx4qdP^,oD&?Foqz`@I1BMsλHB0:^ a><~lnǕL=@̑kVwm76N]MQ609d,˽3ن}pqwbjK8'$df˳,> 8E[t%O5bdcu?]?@,NH&m^-ӉXb@#Ty>Hn#ɼa!PV?HʂֲgN4O1݇W7bw=#<ח{xpzHtA~z8_K|q*9n0Gf^n|a CMu.Qy9:mhr} y'5JCjXYss|nDH 1~ngud6%Y1x [ƽDRn Sw_JE>p Y$㗬ǡx z,ؽ\=N0!W:P)'Fm MHK47>x߸:8^zF{AWd?ynͶ7!pKa4Z}촚yƩG$5酵h+"ppoz'Gz:j] $ouyV7v} xZBTfS4YlǦ_,66Pas÷nnGP̥A;dмyZC/.-ҢwmKSJqF08"y`t?x/H endstream endobj 217 0 obj 1825 endobj 254 0 obj << /Length 255 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xݘSWƗ嶺\/D@cAKnAc j4fFꨱ8QU'(eF7No3>_7/yw? Ʃ5#S@4Rg $Lёhe0@(CcXzpy|P(%PqLA` - cʼnLC2T(%arV$,(ALT_*(#]HċbXtir&RUYw5E%@ ,*.*U+8ENA <=R[N!^#mE&G"qP:>90rE;Yjꛟ;:qhhmyQ+F>1)yXb7 ©nBVD0a ĩ9%5Mz_|mƥ)W#FmQol|Xˍ>^2ERU~USileceVŹY耡Wr0%(r Y}Xv:]8tno}Zw,ڦFZue%K$M/i5Oۗ׷wܸud w(%&hHhnHX7ɃF]qT8aǦd7v,X#+sSCu$Xљ?>0t6XqJU5>TUUUV^Y]hr _Hd*/gjueU֛]?x84<‹_{{KÕ3LyE=$ :Q\^tsۓɩ7fLO=yn5-LʷBй,DIzg؄gnϽm5Uϔ\:%2DdK(IW45lvaiϷ>o=1e(ҦK,9bKGrM;cӞec`}cc+66kԣnXsDgDp*?>onuoi=e[H&?I_{{l?@)X{7~tRMKDecC[(!2`>/M`,Ȗl^ƒ<2W_=8YZ@ފADE4em31RU&{Ka Y _`ߓ)j%gٿ ` _6˞v%:e?B$ŧ_ ?s׿a-a"$vREq9bq LA(<lY[|1l7]8 ArV[)Q}|j,`Jc efHw۔/_Bl|7 b.? qaW K@I@T&dK0~nrRQ)E$; RIz?/<)Ge?_?HU\@.pt TRc7WtAr)Cc/_yzKGTf`e&yI'_m}+ ueGmWϟHuewCݡ7+C^X@,+ہ7SCwW5GW[EՅ:_-7}9Jq|R/VQ:vfH2Sk mB["!n WO,RCW6\\]?*!$)^_]|xTYⳗ11$*Ko}ݝѽ8aZ_N9ZM(nEU\ :%*5ŗNkV#Tۮz_O("J~"Ys5͝}ӳK+Ph}TcAɿ,Nu6ל;%#*-bjsMAn=οt٭j8hI] QjtƫVsh홇ӡou͏kKp:rvZuDa )I3Eƺ{'3pf_xo5pX͐8o b8{zr: =]NwHSP(LnQUL= ǟHU*il$zP[۷EH L! $"K$Rq*9.^p8l4yPțД fdT*hLȄ CF<O& endstream endobj 194 0 obj 2163 endobj 211 0 obj << /Length 212 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xݘSWƗ嶺\/D@cAKnAc j4fFꨱ8QU'(eF7No3>_7/yw? Ʃ5#S@4Rg $Lёhe0@(CcXzpy|P(%PqLA` - cʼnLC2T(%arV$,(ALT_*(#]HċbXtir&RUYw5E%@ ,*.*U+8ENA <=R[N!^#mE&G"qP:>90rE;Yjꛟ;:qhhmyQ+F>1)yXb7 ©nBVD0a ĩ9%5Mz_|mƥ)W#FmQol|Xˍ>^2ERU~USileceVŹY耡Wr0%(r Y}Xv:]8tno}Zw,ڦFZue%K$M/i5Oۗ׷wܸud w(%&hHhnHX7ɃF]qT8aǦd7v,X#+sSCu$Xљ?>`^Ӓ2i[^Y5V^NݷYhp m6O_o([sXMrDk]xtC})W CR¥plj(LyEˤwmg?F#6,_$x%R9be7~~8;:5bP`sׅۇNHwcǴ~ty67Ԫrx4qdP^,oD&?Foqz`@I1BMsλHB0:^ a><~lnǕL=@̑kVwm76N]MQ609d,˽3ن}pqwbjK8'$df˳,> 8E[t%O5bdcu?]?@,NH&m^-ӉXb@#Ty>Hn#ɼa!PV?HʂֲgN4O1݇W7bw=#<ח{xpzHtA~z8_K|q*9n0Gf^n|a CMu.Qy9:mhr} y'5JCjXYss|nDH 1~ngud6%Y1x [ƽDRn Sw_JE>p Y$㗬ǡx z,ؽ\=N0!W:P)'Fm MHK47>x߸:8^zF{AWd?ynͶ7!pKa4Z}촚yƩG$5酵h+"ppoz'Gz:j] $ouyV7v} xZBTfS4YlǦ_,66Pas÷nnGP̥A;dмyZC/.-ҢwmKSJqF08"y`t?x/H endstream endobj 241 0 obj 1825 endobj 195 0 obj << /Length 196 0 R /Type /XObject /Subtype /Image /Width 106 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x7[iƓ'FnT$-3D fQf2V!:"%kH%:N/y&QA;wKB$2("$"GD)05 衈FC*Iϱ`:pb _!0# /A(N͐HelΖI%BA,V0 1y TIXyKR&p▲X&bԈ`("B℩Ry;5ju]]=6թյ5w+J$>;:Q`:/JYV]ߨiiӵwtbUG 5JDP<nT}uBѠQwۚBYJ; 0Yet=Qqra}oF]%YHIDJ ?<4ka~l2~PH  قtyZ=|lY.le[YNzZof&r 'i\p: pWI~Iލ$8#(*;ӫsӵM;-mi8TU,MSDO-k{rzBҾgr[2=5ScE3w'V]ρ_/wYF~nVf HQM+Q 3on(CZҼOG$G1+~\ma~¼^Hww 3,cyxHDQ`G|ێ9 ?Od'v =W#սK<)ĞW@-jO 'n\~}hﲽk@~3GK8ٗO^/7ߗa5|̬A8;?agfB~s.0sfw>(\v,+F( ]h}:^;KLx@װ`) '_׎y endstream endobj 196 0 obj 1272 endobj 187 0 obj << /Length 188 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 188 0 obj 1401 endobj 197 0 obj << /Length 198 0 R /Type /XObject /Subtype /Image /Width 166 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xWeQAAE1 E"4448&0-rQS$(N ^_;8٭}Yq=}* FcX\b@LԯD,O  5 P(dA_!"*=dC0PFF!R_sBdZp(|~,AbyQVN!)tFxd_ ,JI@)"QrPqa!TDc c(ÏOJdJe9ryn͕ȑI3%8^$3JcH<`qBDz#NUuMM-S^V\+'GG2)DwI ә|aJfNAi]euӓfIѿEy%ABRB£[ꛟk;t^#Wm3AuY+|Ne U/zC C7k֖f\&|:`奵5k;?~0~2BS__>/[B8!I'0gWxO chtbj̃=8&Oˢ L,"-}Տ_u|}nX5:?}P^qGĜ͹ ]p.kUe 9D4Sr`Ҳ@K[ț {k۶DN%Pr4 C@i֕\K0(N^‘yvx|/LVur{;{һp\ed0?{0p_+k{;>pKZ[CϮj2y(sC L(|6Y;2LC@Hz9S-^+έQ۶b#Ⱦӷ̎뵪rY2/xA(L`~7jw:{{goAq|8 &̫;ǘ\7=n}if\^_)Og"!QղLJg"x ^1O t6/v%Ã@f͚?FMM{٭8`smW̓[U@+GbœѩS@?g8&{.c}NLY~l:Nm܍}\ȷE@QQ㧬#HirZ˴ya 6667ksn_gnqX 6P9(ݫoy;0eѺ8nxQMLe+< Ӳ[u=F'So3۴ĘaMw05΋O_V[~axdh 1G C@R^YU,HiA a͉Mn*7i:t]{z{TooOΗ aSA}j9_I Q &;ˋ xDy:K!'HЃAM7@R0ޚ.kg筏Si4zDz TGIO x<q 609gd/z endstream endobj 198 0 obj 2358 endobj 207 0 obj << /Length 208 0 R /Type /XObject /Subtype /Image /Width 138 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xSRYyEWQ|J1^4l5%),um-WKMQt(E3f=PRqޙOpsιyG}|T4*N`@98\0t` q\ I EI(LLD\ `6qqև5ߊvS}UqN)**M}6˽8k= }wד^ c̈X,SVzGl? >mfO z{P[Ք構)[ˇ)nh~88f!8"O'CMqo˕Y)0S"> qE2bcǓW.O$OaJ瞟y˅<ˤn|IVQ{temA,+ˎ3P0{򂱽̾GR-n_0P(f?j-V 0=2Q(L(Cћf9;a(շ_kAz9 ZzF_.x%;{ؕi>htJ%q)Ke%+m}/^-| [ȻBaўd!O_] % l|.zsY`F-@;N8}! Vc}mW~$$$ 0ekZBg⬝X>o(I=9 ذ==8r]pրpnjp h1]5`ҎDR],QA t_`!Fs=s_)x-!v C!F7 j"cAL5@!L>B |!`qf p ?_R^ endstream endobj 208 0 obj 1421 endobj 252 0 obj << /Length 253 0 R /Type /XObject /Subtype /Image /Width 138 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x7YMMBBTB*u mA)%M'ZNF˔M_"!kDR_fYyY߽moCi.=>#Hh $8@ "ɏOP4FR(d2 ) z 3csPZp0 b14 ُ',Bgbn8/-@eWㆰY Z7Y|A\+-'&%I$RD&  |^Ƅ,+DP'Y׳J D\)+) " A.J]_я 22OUQ)))Ee%%u G&qX4E(L ňeYyEڇM謩IX_[}T]̐=DJ+U7<::ZgG_Z>Ԩ 1+Up? ɮJz _^WIBOğ]|$J 'SW?z7a4QڔޗjJ BF'A8?=8R$jj5f>-..--Ņy`OJ!D%I__MV޾z83iٲZ6T|mY,+ fXAPL2)  $){GMs[=j۵,k e`iQ$tvd|Fawtzajw:Pۡyݶ}4<}ɑ X@% hF7l{Σ㯚Cn]3l8+1DNˋ:h8W!Xv7ڻ)W(D(Иk9mOgAܯ}q˫ ekyfiͭ>!)A&Ctm.M* \xɋjp9\z<1T˄<{μZ/. ɡckij,W*x+Z 3K_O@|>v7?}ood'E< ΏH%ڎ0y.W$^3koe#0f#Q18vgܼ K\!-7ScØ}cSokl<ÓS:r p{} A4HwZ{fW^ijw}eqj~<>z^x8f;nwc#p|,|$7Y|m'0D V kV "trpCsB2cY6Ou4Wb> ((Լz}܊fw=!8٭].;sDapA2.<{vmkce~fKWM0I൘ō(~ c& [եƑ'%b>%KܢiXP^g`Ìy܋fm?h 2\Q@xEgJ5ͭ]=c)Ղ)Ӥq|t㩶ǼDuQ';  (j5ՔH AE }%<&!5NEEiUEs丨A(t%+ nTPPWSU)S$ #CX@I ,8]aĊ Y4YHy]/ ( O 8|PtRFSvqW#  Nh#,T }$/,1ysGTw3i720AwU.8%5x`{tT@99iz!zZ^@ 34™.'2 endstream endobj 253 0 obj 2186 endobj 238 0 obj << /Length 239 0 R /Type /XObject /Subtype /Image /Width 138 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x[R~) b$54M޲Uʎ״(ҤL[Q[C)̅v|QYsͱelЩE M~@nH nL賌N;Wk-/H[W/5R!F|m -*ʪ[LwsK.Ϧ a' usv|$G>,Z Gf%9Wtͦ ?ݝp8{W'{US WKQfaE}{urѽn!/* ~p9&,݆TȢ+,+Z @]W9n8X{YW|! @lQfM](BDq!)2L26V ;뱾_C1pg(AەErQ" >PrReyi/ Ga l7IbcɑZ'<~P#(;!G S@zdlDH *m1>zg~b (󞮎{+ Ϣr`nPŲtM:a38젡3,#.  L #48X$E$;߉i NG^l4# endstream endobj 239 0 obj 2255 endobj 228 0 obj << /Length 229 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 229 0 obj 1401 endobj 242 0 obj << /Length 243 0 R /Type /XObject /Subtype /Image /Width 89 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xݘ[9AWA ApQ)EcxH,mxNMTi^!Z(sm?/řvmx]z |? DP$"@GTd0d2h4 _ـ%ShLv 1 |n4ŠU $rx1B8A*&b,/h"~BJKWcTz*%'8ᲾI.3 I*M/yzLrʤ!CfŒ'.e_3Lf,2ʌni3"C''Uu7͕u`0^rY%G84Y $+4U涧ϭ.lvv?j4">J '()#P~YπmdlF\K 3%FU7*,mݶWso Xel3iS$1)e'gݩ7:v/O u?-˿qa%I(L/y;6t1v97זfnfi0d&B&ܻ ׮g<{;N+[GL(9egk^p{ޣc,uޯ{.d[uIJ(\Ih"{ܾ|9.{ٹ:?pF.'St7nzO>G˓]erAc2Kږqs_l=Y[{I,5=  d{>jm0eDXU|z'w>.m($ЂGs/(ǃ>}E ^n~,(:{$_]Rt5Xw"5yIAcAf"UncdkGڜi]Iv iCiyt d׳6?qvNjN+k+]G:KsT `,GX0sA>=8 9fw3ؼTqcl^*v=b[d^ATko'}#Tb8CȼV? gH>ێʼn\ 8rջtCŮ^-9i!Уg{/0QpŃOjx2oU7vF21ǎŗ͕\z?.bVs7Cr~z?;a19/y8z*d/th]D_kA""ԥq2mAmfűA_{vUMR\8xܪj]Ũm7zzel4R%zzxa&6m|\_]y3eT^H:sq$E{\:8}qԘ 3;^+5M=ck^N IcuY6U*n mX|<]WdW׏A}}gmM+K *YLY!^7*k465`Qs տoT2M;3)O$9HoMw+pMS4φ&>Vy %?fdrbSA>LR.@d2ōI?341IP YB 4Ƌr< rYDl4a#@E.M~2}`0YlfL&F{j4X U LB_XwV(=YO  endstream endobj 243 0 obj 1862 endobj 246 0 obj << /Length 247 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xY;[&~-DwēƘQԵz<͸6ѸBv !霮plOw߷C@RxC ીAPp00dpPY &xt&; DXX(fЩd">d ℅ ظ8!2DaPN!? .O0ءXl(YT*BɤIĉ,˦S5@CԴB%MD s2h~(!PIZV~e?!CEV{LSR}BaPU `B2C䴜e5u M-L}3G,pT5\ V(U,oy67V'MUy?J ےpx2+<.5Wk2ZVkߍ{]þj3v5Թq<O ŕVcw}9::F#ϡ{oanj 1ƥE+k3/۝{㓓?Kqs/~-W#ehܨluU[Ȍ?<:'$~piΌ~ d^_kJOb9lA{O΁WO+2a|zGEM>L %5T컇_[T} KMI $hj;\oD`$S`)JK.PKe'qʔMU*dv8F_}MI8M>E'ڜ rގ?R p;{_Y;[W wueއw~$-qp*φgïxWCצufYV)Xmqx*7J7N =u^&'sQ_#R}}ؙQF7_WC@"p7> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 225 0 obj 1401 endobj 218 0 obj << /Length 219 0 R /Type /XObject /Subtype /Image /Width 139 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xY;[&~-DwēƘQԵz<͸6ѸBv !霮plOw߷C@RxC ીAPp00dpPY &xt&; DXX(fЩd">d ℅ ظ8!2DaPN!? .O0ءXl(YT*BɤIĉ,˦S5@CԴB%MD s2h~(!PIZV~e?!CEV{LSR}BaPU `B2C䴜e5u M-L}3G,pT5\ V(U,oy67V'MUy?J ےpx2+<.5Wk2ZVkߍ{]þj3v5Թq<O ŕVcw}9::F#ϡ{oanj 1ƥE+k3/۝{㓓?Kqs/~-W#ehܨluU[Ȍ?<:'$~piΌ~ d^_kJOb9lA{O΁WO+2a|zGEM>L %5T컇_[T} KMI $hj;\oD`$S`)JK.PKe'qʔMU*dv8F_}MI8M>E'ڜ rގ?R p;{_Y;[W wueއw~$-qp*φgïxWCצufYV)Xmqx*7J7N =u^&'sQ_#R}}ؙQF7_WC@"p7> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 257 0 obj 1401 endobj 258 0 obj << /Length 259 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xYgXͲM%Er$HHZҒsJR ""`D `}>ϝ}ݪکw`[v  2=ȋ{(0!I7RX) *$w}W #Y jw0R됂C@#` 1 /woa .V(B "rH7⇠!Ѓ 5H>n#6{vqEŏ`77}y'29,-׏&?^7 3]p3AΜw;W3=fWEp.FnaGk`jD^snƻ9A͡VDpwX>cSFm`rXHLvc@Ƃ  "m @i%pC4. @z!}N$y#G^@Bl#hȘ$%wCFBNg̿,vF^zQz믘hYZ@^43Hhm&Z ѩW"bT|wK ~Yor_DŽ}y;sQ i^Yi]cw_kY@#dd>:#s? @$r#.D_IwO@hE,Pj@ c`lpF2CAGA:'iP*@ p``̃%Mp"Bl$I@2CBP C)P@:*݁B#3hZ>C?`L 3\0,+ڰ l8Nsb ߄8< /PG1P(e.BQBT% u5F-6X4͋D~-A'%ZMtz =^AocNFc9Da1 ]8f2cEJX/6=mvcGso8 'SǙptem(nNࡐ0pH(DE1JbRRҜ҃221<&=: /Qb+Tw^R}x%?/7g ԺN9Q!-#!C#4D4F44I447iFi>R j:^}LLGI'LKFHWJF7IH/CoN@M!AA!a" u$b x8ψea4bebl`b\ab`gcf*edfF1 313273O0`bfd`2ʲɚ:M͏-;]ݒ=.2##9')iY9ː+ W/273/ww"GSs=/6?o1o '~|C|" zVy >R*/&,"l/|LExAUH$V^(ATS4DRVLYOذ8, #^*XP Kك٣'pOIIjImHzə{M&mQJPQ*OԶt cdvϲ$R'r9$VUy yOr D z~**)*^Q\TTrU*STfTPV~QQIRPPUT WmV&vIma>}ϫOkjjӘtӬԜЪz-}YN 5]Un=^ސ>~Aaa~~y'HFuF+J }&&&%&⦡Nxi&dhb̍Oe,|k%couߚhb}M [Q;Z;':5{=|R8;Zqv5:}hI)iٝ;]h]\b\]/nU}s7r/s_!钊HKZԽսOy/h,u%Uk~~v(\F%ӃCTCNքAaZшH(kсу111b b/ġHq=|Gg'B=IIIG :wQtr~T#sii4ԎUG'ʐ8ٟ%UM?!sNWPbnIyysY[Y釅ETEEŦŭgϜ|KWt 8*_nVћ}1G[zfk>-m;wu _ ^\N@럴> \_ ]ů_{Y|}s-smvCy6p[?~ol v u,BZ vwM)W v^h >rF cŸ` +J}*E^2 +}ib 356k([/w:IY!c"OJ,KﭒږqmgWVWSQ]g~N㇖ =Fq]-X&9+zku4svu>xƹk[3Cɓߋ=On-K'X*ԇ&̉r[GWN&%V$9*̘BJFNwp29{lѓy=mT>SSRw&$يs+W*W>UfB훺Ks WtZn^A"ުЦnt˺ý3t/.=Jtdy"W SaMcGgfd6ܛ/xNuab%eW?~Y6|.rwZ? 6mʿ;P,E6?-^Z F#D+J'E`@c dJebc]b$sp) \|/,!#Z+$!'T iM 9J#*DU }XMMHZzx}UwÌFƋ3s9 UKU+9kAof::ZRrp9ipjoiB"b3T%蒭үeKg'+F |]T^HSV'xI~e+MWk]ҵ28ܕ~NCOuɾ6d_}Y*Y)?̍>k~R40A4y*9'/o::~:xo6`.M|ۼw ޷/.?jo_~nUn;?'tPh&]uRtєӞKe$00%0䲞ekdx#ȫʟ"P%xWhQFTFVdY?P@F~t+8zRTo0˽w[ ,M%B~ @e@JCaCM)0.!p E^d!s:]zY`}˂'ۏ AP9h@W0("[s$STxt,Ks|mNϑdi2rr~XI}tC{ws [wx{3n<{$8kdɁg/6f^M]\_X"Zkwwś:[SۡPB{@FXӠ;z?k4iljwl̂*ɺfN>`#搅S.Ʈn?I:['<p/+82d,L>(b+%+5.0^@RdߔWiǕ2KrXr+T?'䩦ss ;]sq˫[]Tݼ=}<(oz1ttIg<643&mBj>W>Y]nb=l̏G[Ew:@!`Aܟ!O *LO'Ֆϯ,6Z?mܼŸEkbbxNNnüdwwQ ap٬Y;n+v^vkjД endstream endobj 259 0 obj 5953 endobj 186 0 obj [ /ICCBased 258 0 R ] endobj 260 0 obj << /Length 261 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xROHQ6Axw )vuYm[Ңgߺ3ӛ5œ]`鲙}v*b{a[QÓ'a?dy֭S{=5ڊ^-CT#hsM9s1F9 1w7;aYf ]%{w;ћ9 \Ir< X}I<>Uw(gRVzWOelπ~v{|u׶>UEP>,l%KTn)=J+vp,ZSk9xw"zmMWzmʨ)(ͳDf[xf8:罊ZIE?9Z*UVPog~~\?A< =ѯ tIsQIi!3NTc)[d@f endstream endobj 261 0 obj 704 endobj 7 0 obj [ /ICCBased 260 0 R ] endobj 262 0 obj << /Length 263 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 263 0 obj 2612 endobj 213 0 obj [ /ICCBased 262 0 R ] endobj 264 0 obj << /Length 265 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoE endstream endobj 265 0 obj 737 endobj 113 0 obj [ /ICCBased 264 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 1358 815] /Count 1 /Kids [ 2 0 R ] >> endobj 266 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 267 0 obj << /Length 268 0 R /Length1 14580 /Filter /FlateDecode >> stream x{ tUU]]w%t'tw:${ (QT6GAGDE W\d:O6??n8#29nu@ygy]|fݕW#ڌh$,Yٷ?}/$/XH@Hd+eU!fۥX6܈2:ijT˸R)u#>p%޹q({[__ի֮(BzqB׊m߉1Ch H(SG+AٕkN&RPL_}IzݩޣB|JQԯz ϲ/]h߃(4*#(_90~x,tcsbYAdN)k / 6Qr?dp^!rz"6QIev hԬUP j$b(u CF3Df!* P%7%2E%^к_]qqZܸrWȃv1Axԟy<=M+x NǝNucSCL RJå'KחJ O]gSoMU;U}TS՗LU{;~ġiwiwjww턺*a/$ܑh=oGCsq7`f('q^+axmPCj8 CP[34gIcVY>p'4 Eu7pp(!6(!HCsН9 c<.l!,ذjNdže.gwdƝlE]𗭹$Ih%{sήa|u04, $T>О'P;ơR(LMn)v(-G ۻpkn0 tabhe#]ŕW8DK+yq 8P"] J@D9ZlUl%6/9Vl[l ?I]ցoyo[!w ,7/xOy]uբk!fv`Aƿ0 υfiABcm@<ـ>CId>nA-g$MG#?OB! m䅷^R4΀vz܊A{G&QmV Q\VrjV݋^Dax2jE9t)ZV+Ѝ3QӆNtʣ7_Ǘ@`+]߰9?8>s5#Q&<'(<]=? 5zɽu O шf٨-X_&}h?DvcS4 Lf_GQ8 sRvIҕ"z70Nf)~n+,),- /<>~G`5^X 9h v&'x VvKx^B/ߡSsrVD,nuj <g>}xހ7<}0~ s ?(b)+SAJOZF-VR:H ӈn>x#7d:]r f.3OjfǤch`<黿%h='HM:{ d/p@qG53T e ! yv9%vb6 zըUJ\J jRo䃽yI<>NEoUm{=yɿ= =1ɢly{x0^0 nO~Twb^ y^Zך6:ڷ495WvGe 862:yv`V]]=vKw hq/]ԕT/C[\ros~1OtR%[Nl+oőEk/(+}`27?,'a5$Aۗ׍a\-G pgi0zѯ_7Q# pi$y#@E->]{(< RxQ0*%<oC!2/ʢ6Xu97v)K{<%1q Z'BƁWnaU15+9Wr@#]#] 8RH7,N9k./xqA7۷1gwK(1 ab.UNx[B*x/eu` @ U o&`U"A8@8oA8}a߃p 9M @yy)M>B lPq*$PCB=&B>ɏ Z>:D߆!!_ i)ԗB^}K!2 .hH?<[M6Þi=h@WA!9HS1[ h&D /t :rd!h%9!kZ@>@"<Q|9):I$o0~1 (@W?V4+~VW=9nZ]w] fa}F f@v d MSvM&6L?Nd;,j̎eSUV$t^]>O/ ӟ#hQNj *8Tj JMb[,v{D\O 3 cDSZԲZ)̰&dZ,cSc_%8qIQ,, )BiE&Moq:ÞIkgohۯ™+';W]1^݇05T³& %hicm,҈aDm3FLWZ'c4HƉ[Y{$p @10&|fCqi2MWN[k9>Gs((2R (JSy]-xsS$xϨ8+z -DSJlg32/2O >SئNZT(hkG,{v<~gif?`l GA8 |T_чKDW$Qdҽ.F׬)b}b=SܙQ8{iY/ *h #$AEDD%1ҦI"lH^"MbZo ^Ӄzz]u}dz~,:.JP6 /67\UM^7Ÿ L^{3_xdL8F _Yy`0lƔR-}Y~?CF :$2#cUV8W/Tj28A<ne:Nç# 3tFM|R6HPcGOg*N(8\*' -w Gi=8 RjQhF6`DdFjS(RAN[m:U(LØ-Qt/^&&8]#~wװ1&J9v^9 *7\c%%fL0yu:P35M@&Nv0V.Bf1kvC57*2XC .tˈ^/~Z. &(s0@ ~^y;J$< ɢlܓ2'RI. "X^8L@_᪵FRF1wp%~SaǦm3yj-.t;waFZ.S23KsXwfM\icUN`KtX/ǸcaMLfZmӌ,0b LXe{#UlC:#ܥ\phGxu@aLt4}2)* bFU",rK!a4|ŜܾД&rj}jC!޺u5w+7 ŲWlK#=LO+%C7,<7qkTj-{I'?F@fM?2ˍo\ZrXV(3/w{ 1rA~upGK1Ry{JOi?=FB7$.ꑱZX%J $ގ 4G tDq p[o`gO3WxOvܯ2 FFHǵZdt^~J]P嶍Y@h ^X\eM*ia&^4|8fU~O".̭&sc5LѠeM,{WMLMoVqfM&)#8ŧ ?3+C<~V0 #z|`4ࡦ@K[O8tI ~ҳ}o-A1pA I)G'iS忐xűʯhe6QB)UT2U QfLXCJ)kW6M7 eT0E5T5Kr|li&$zj DO$XD "y*l.HHu |ʂY*J Hmoq!\8TJPc22҅."GD)1a"zM5t*$u+4踠Fn6)=4Aj_۾3h^_@w\ FeXL09+{րL@MmZ8kF* ƺ,8f.^:{I\՘u6XXUkiJC`W}'Ak”d#uZ;bV< rrkMך2Up+eXQ'`wɡfm.&'>Ch̸:L̬ NZ*`8 x!R\ zAQs(%#4(S׾!y+|e3cL+of*bIk.4WwMg~KfETlFעO>]N/R2v}lG3gc/F^9{x5:2-L21I¡ܩsy,Nk".H|8oZ\lmC(U$q}H` l:Pǃ:a=D;#XN;HBM$"[h2L)DHuׄk-`-h +DAhN"jq()(Ed^d-@bJU`PVY) [һc?]ۻywEzLPhIeW1jyf}ݹ_6UcKUɯc. n?y?—} 7Br *kUtL4g깲Kdɛ%'erJ\AKAu`-u88 .RJڤV:R{'5 3F'[γH'LSS4EnR.l2::1DT<Q/- l3 fq=%?vÿϟz4 eIrzkMcᷱJjʮ)KAgj!V`ܦ0t#r?{x fnkBLd`@A<# 8q6< wuBS==ݓD/+*꣄;ˬ܈h=:>ۉDljl:q-<I׎ ̩}Jg2i]E_yl/mm۸QNhb`n5o,Xn[(+(7K u> pyH#ϓkD¼]GKCΤE[w~>nBLJ,CwB,I0=H$KP֠kr((i*kآτ6ag%5J:K5Vv]hrZawU-Lr(뮠$iʯ\؞ɾW |7L kT _( Q >!ȫ*G=87/n 9؀_Gy7r{>CqCkQ29wkߢCMRICycl4R_f7_V#V(MU+ؙTCzVH^?m%&T+k>=]PÙ݂ѫIjNNBK,f rP q p5T0e=Jck Kgyf6f[TgUƳ3'XX&Qi5|H٪=󤆚:=nL8¯=:@+q,`49{ZGO7:!.{z+f9 *'|&o! ]WF5Pɤbji{LS/y$nU6.oEFeB)fjLVuNٺ-oԽI !Kb"t͜CMغvqKjiNhΕ~nmT 6{ڭyB܉^ cw:<*rEfzmҲ*GQVjIN)}(i H$HȒZLbr/@]`HLȐBV{5eH=kލwO&eT:AoK_T=}N\aZa^]/%q`(X*pL̚Q>!SL9~Dӂ7HRψ1[#FEPamYhS3 k%q }AD;;, t؛o`ɹڥܾz]l(1l?TCs*KpH^hסSw!"'Տ}2EHZUVNd%pWfb\,(wT rx* hEH;aQGl`vA "E/Z.jRK fIBTI @@qMsM(ĵ 4Orz CEb}]~˧^[xuQ"P3# \o党j^UЭkт|in }dZ4M7ɥ[=5_}TS8E  Fۄi#.awj [m!lU4]tf'8+n'D7۱=bM v8:g!} ;@pBi!g4M^E@«\cJp*3IgOUvזe$^c`Upu/kd Z(`PǖRoU*L ^2`3VgTUT˪pT wB Dp)0UpA* šPڤnSwB7R9#]]ob\܋wL'm΅ۢ jr\P~'vX\XT9X W1Tp].~U98|]z2oc'k's,T2'2") nRP4!J'iޔ+}>.=$P*BOabRHeUXkFRg;t"-U$u:ݔ:ҷN'-JpI}e67z[I-sl1&DH2. XȲ+V ~p FTB"p6Pp|" 9\i 5I|,L:"uʲ nNt22[pYj\ ֹ^v8;P?L!^{mr륒_ qc:q:ǾJQn7 {WkK0Dvup*r gӁUpz|L ),9:eF'UzJ=,$YbT5 Z\z&WGh 8e=>#J8v [ϧP?/3(9g$—U>>%wNsP|j^ﱞ;Ҿ-|e[^w~Ѧ|G iZچ1&21|  `{:\hx7 08#M#KcV;tq%RK*io amNlj .-&DJڴ^XL1*f6wjY5 bᖐ\uͧ l,o ^W%~zۍ8, 2ҔKbasr8#9ף9aCF6> endobj 270 0 obj [ 250 0 0 0 0 0 0 0 333 333 500 0 250 0 250 278 500 500 500 0 0 500 0 0 0 500 0 278 0 564 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 333 0 500 0 444 0 444 500 444 333 0 500 278 0 0 278 778 500 500 500 0 333 389 278 500 0 0 500 500 444 480 0 480 ] endobj 114 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FEGAOG+Times-Roman /FontDescriptor 269 0 R /Widths 270 0 R /FirstChar 32 /LastChar 125 /Encoding /MacRomanEncoding >> endobj 271 0 obj << /Length 272 0 R /Length1 17052 /Filter /FlateDecode >> stream x{y|TEpUݵt;}! YY KY0QA$2 ." 8 "::3|@;u;盟ͩ[]N:u,\iP#bЈqMCo`Bl9pZ8;a7sI1͛>'O#tMyYΨ45֎:7.pΉ3,\ mpx)3iIOS`1}`a O[P}?yh.R1! J75U޸^{o޸ΐ)_pAs?=a)C{9(v4  %j;ѓ/0h&~-X [x++FȁFT.cS<c9'a;ޗުA;<<` A4K=oT`1<Dn1+s-VP; _yNkM}agkgomwcxi =䙚%Nz }LD+yr]W=vI'ۼ@Dq6xCUp P29 U!M'eHM@x'>欰RGCR$!(x$DբREo->TlwPEcU⫇EV$"M]_bdjtC\c^xXZcu(D E-WoIrd620ggr]§di^WQח]+"L)FIy%U8aN||;p6߉9|7eZ~ 0DAJd4LFiddf(3i,sd9ȚJvZa±Ͷs@5rkw_[Z.5?'~4h< 5tMŏ桤 d4~Һ-GkhG^t $e6bK 0)>"pR(H'j1NV)s,C0J-Wy[u-l?xp¤[.TT~O>7 n3wNsg$vgNTo2Y_k-rJ?)5PomFy[*f4ו#`2-*RAE-Yyuhc哦YS^54:D>AhmfRm ҧXe-el?=4@ŤH\QlZkɪښJ, Y?iV0iuDmA#jZ(Aݑv=l+b?> z8e:[SZ)'bLgP a-\`Ȥ=d(W7UawFku~o`~eR>F:н҂' @g36c V~)k(-&0#j|-ZdvQsukU;*sw"4RQY$-.$ꭀ/WPY6yLmVxg0 M5't|1R[ɠGZxì7Y2S25#kZ["e0 'FԴɭz)ϴuӜ 4g%C{N-4+j;G}-'|Ў-q< '/^dR(=z'<!Y.6E8<6{Gz"j#2KCs8\8\Km)+8<6K79 *sxU??wRzGwR8" _qcbq@ 5h {{fhN:ЎF4@0_V3h%5y k%@m:@ x#U^=k=9)5DJoEh@NI1E ф)TAlHeOCgD&/!dg;C|碗܀{J@~9(Bp- "dqd`(<, r ɕj!JF%L"y]ȱ4n/w_oO #BbQqVqESSWI Z_WnทuN:݇6khn|xŴG ByLI,&f :@q3W .\AGe^I9 oИ̬O(e׵w;~cP;[ur9p(f>@DgY0Æ|CjzU(*)geb/d{gk;m#)讓&IG02# ^aX1FׄG:Qv!{UvTח}JJ3D:Oǡ`(3fTްt}EPtHzO/+f?{8pQcz(/hzqFJ&?|%BѐׅL[جx J;EG8o%þ>-?xއɩ̎z1 3Gu::# eedڃH] $2b2 ;$ؒ0$PP} LS?O`InxM͟ n-?&_~/@PbB~l:0Π[ʃ\k~l)!l=x-Knyx oe/;֑r\$:Fb3PӠQLț9Aܡ$TwZ`vl}o҈ W9=̫t$a e WPMBz_.ГW\^t-yr~i5'0:}Vz҆!/Jik1:ǩ@_]a'ÂAM洆! GqBM4%ՊZ}N % aL'deP^y\6Z4Wolk|vv)WV/NdqpA "S}KM|\q!XY0<n ]k IA J$px-fXI q& acJXE0[qmDiD^d8vG qsJZ÷v"mnF2e6Tb-.)SAN_0Fvnd;-Zj&bMwXւ 6`?cYU_cϿK$ 0Sn `.sk:)6Ma[cF̣.w1fv&"nxwfM6պ`ie :.Q#5` jAE4&]66t01iU(aCA'6+\VpO H3靟'k[V|~֍ON~"}<0}ұYԅ^(LI)/$>ͳǷ W@n4NxV7Hr䶊bv㢯aM5<@%ђ  /p+08^(U6Lʦ#4؄ :I aL߱ph#Iϟ%qƮ5ۤG{͡z~s gtRRlzՑDͲ* K ѭTjV$E ȮѶcAƞQ~*jI1X螑ٌ݀ LJG̃7OKۤҽ>-J^@0bT(e/_fewɅhCѩTLŅxQ0.k\DcF7DzB,z hN6 fc5 ?6)2mO}&QٔD^y|pB%!5އ΀ u$l29Vd#Gn!w'?x_v?B.ON'aҟ1R?1wo8}5 1y/ !^_>O1;x=tQ0# HFf|sѰgʊaD!`} TV_jZ@oQ~|9^fxfao"ex(X`,\œ;*^=0OUՔG ;l&$L( 4d,i B`FIJm`xQFXX(=1j<0 pS}i\R}tw#=IJ+l| #A3jq 7jZ‰chlG):|"cp{LN3s[LlАp#"^pH/zfOd͌w` '/6lfl~C0%Xw cLH&SV˦ԁ`pvfP buwrK Lgsޟ3yXN`TJ5.0y-tKJ#kbtw+L>c̊6O>bJ2Rdb8.󴹾2D}Mk Z FퟐdXQSFFa(2R+Ϭ<#mVqL!5:]-;:2(\K} MQ]W] q})HJg(gnbN( j-$*\:(A'p3`u&#\*U NNޝv  |o87n &Wz^0xKTd$NH>mYx 8/·lnp,^P>!ꃁrm~qCf˫܁zЛhoւi1 Jr@Wi}(N\ APic`)'Ĺ$Kb[ ƫ"Ej㬢Uk !PcTUj@pJZ>ե;QB Wa%cͭBtUwz8w8&Qnx\ Xr,@^ kXXbaGx޴]mlƖ;$Vu|}#>ETdc:@:̟ ˛_(p&51tI!ަR: vdw3)1mK Ѹ|KWh@k1(}θ:"+sE$< - 'z~tL.Ο}.u%Ijȟѓ-&3WNKxV^ɤ/.vTvn7P#^2XR5z0` DPeTғ P4PSAuPp-ԁp r0M#7K}*sW6mz 6wJLĆ? qMlw,} aTz t>Qt7k!0Ge%Iש.k]NUlD%xpBݟe98G xg۵AX>=.ncc&8'&ٙip~@c(=8$^u̢qcS>8v's`ݐbO7ݛAd=A=3 1AM>SɲZQG BꕢÈχc;.3Ǡl@.SS`Ӻ~Ek_tT90o2yAt ]C0gG(Pl61m1oI<_224&qlhZRRRmaNT#Ʀoui8LH AdS.ҷ2VGpxl[:0)(YZOH7Y.Av0J244C çC> p-dao\1`@ 飙X[0WMbB/Ǐhɹ[Seg.'߉S =Ě;~z "{g,O^|t'wFqcSoB򐇶n܌ٕՑdѕZ?y dQp@;z]-/00YNNo}cW0&0&nJ3"NDFɁ 6dʰZp0%o*/*~\I1X>L?_aߍ> QhKo6:.D G=Yyw=3j A'$?Hz)> ft~5 &" )grk3YN@fiwk@˶G3d!UH̓_x  p="frS/iAc_|ѽI X- p/tW)eȥ EaH]CsiЏ-,R{ ,jW`XWf*f ! jj썬d*`q0DiW)!ss*4aXj ʥUBJI%bc&YE}? 3*XհNTA 6aO) mj08,w*Vv d(F~2*n.`E v <1 5 ,Goۚu-ȤRCG1V떟q=SWhyœxK{6ܱ˿;&X +s ,glXʒy`4w&ۃawF.;C J ߅E6ckҴ6^|YlӉl5ÔWr8_\c DW5ā;>NOrAn݌Lޱ5P>*@ ?Fw%8 n4E5;;F,xa2~vC™S&wP|-@'<N(oijX `?\p 0A.o:Ij'@*@1pX `?\b35 Bu}>xR<OS}>xV<{n?޿~G|P^W!}>xu|D|T|t>}{To})}}py"/O/?__o///p endstream endobj 272 0 obj 11526 endobj 273 0 obj << /Type /FontDescriptor /Ascent 770 /CapHeight 717 /Descent -230 /Flags 32 /FontBBox [-951 -481 1445 1122] /FontName /JBBYHV+Helvetica /ItalicAngle 0 /StemV 0 /AvgWidth -441 /MaxWidth 1500 /XHeight 523 /FontFile2 271 0 R >> endobj 274 0 obj [ 278 0 355 0 0 0 0 0 333 333 389 584 278 0 278 0 556 556 0 556 556 0 0 556 0 0 278 0 0 0 0 0 0 667 0 722 722 667 611 778 0 278 0 0 556 833 722 0 667 0 722 667 611 722 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 0 500 222 833 556 556 556 0 333 500 278 556 500 722 500 500 ] endobj 115 0 obj << /Type /Font /Subtype /TrueType /BaseFont /JBBYHV+Helvetica /FontDescriptor 273 0 R /Widths 274 0 R /FirstChar 32 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 275 0 obj (Mac OS X 10.6.8 Quartz PDFContext) endobj 276 0 obj (D:20110902220055Z00'00') endobj 1 0 obj << /Producer 275 0 R /CreationDate 276 0 R /ModDate 276 0 R >> endobj xref 0 277 0000000000 65535 f 0000144092 00000 n 0000011090 00000 n 0000119880 00000 n 0000000022 00000 n 0000011069 00000 n 0000011195 00000 n 0000116163 00000 n 0000020807 00000 n 0000021105 00000 n 0000021123 00000 n 0000020392 00000 n 0000020695 00000 n 0000020714 00000 n 0000015873 00000 n 0000016176 00000 n 0000016195 00000 n 0000014646 00000 n 0000014937 00000 n 0000014956 00000 n 0000015458 00000 n 0000015761 00000 n 0000015780 00000 n 0000011786 00000 n 0000012077 00000 n 0000012096 00000 n 0000023255 00000 n 0000023558 00000 n 0000023577 00000 n 0000017937 00000 n 0000018229 00000 n 0000018248 00000 n 0000015048 00000 n 0000015347 00000 n 0000015366 00000 n 0000019572 00000 n 0000019868 00000 n 0000019887 00000 n 0000021216 00000 n 0000021512 00000 n 0000021531 00000 n 0000022029 00000 n 0000022332 00000 n 0000022351 00000 n 0000012594 00000 n 0000012897 00000 n 0000012916 00000 n 0000022444 00000 n 0000022737 00000 n 0000022756 00000 n 0000022849 00000 n 0000023143 00000 n 0000023162 00000 n 0000025721 00000 n 0000026015 00000 n 0000026034 00000 n 0000021624 00000 n 0000021917 00000 n 0000021936 00000 n 0000016288 00000 n 0000016582 00000 n 0000016601 00000 n 0000016694 00000 n 0000016991 00000 n 0000017010 00000 n 0000018746 00000 n 0000019043 00000 n 0000019062 00000 n 0000013837 00000 n 0000014131 00000 n 0000014150 00000 n 0000024084 00000 n 0000024382 00000 n 0000024401 00000 n 0000013429 00000 n 0000013726 00000 n 0000013745 00000 n 0000012188 00000 n 0000012483 00000 n 0000012502 00000 n 0000017103 00000 n 0000017403 00000 n 0000017422 00000 n 0000019980 00000 n 0000020280 00000 n 0000020299 00000 n 0000025316 00000 n 0000025609 00000 n 0000025628 00000 n 0000018341 00000 n 0000018634 00000 n 0000018653 00000 n 0000024911 00000 n 0000025204 00000 n 0000025223 00000 n 0000024494 00000 n 0000024799 00000 n 0000024818 00000 n 0000014242 00000 n 0000014534 00000 n 0000014553 00000 n 0000013008 00000 n 0000013316 00000 n 0000013336 00000 n 0000023670 00000 n 0000023970 00000 n 0000023990 00000 n 0000017515 00000 n 0000017823 00000 n 0000017843 00000 n 0000019155 00000 n 0000019458 00000 n 0000019478 00000 n 0000119841 00000 n 0000131447 00000 n 0000143818 00000 n 0000036467 00000 n 0000036740 00000 n 0000026455 00000 n 0000026768 00000 n 0000027722 00000 n 0000028055 00000 n 0000036760 00000 n 0000037072 00000 n 0000031410 00000 n 0000031723 00000 n 0000031744 00000 n 0000032057 00000 n 0000034234 00000 n 0000034541 00000 n 0000030136 00000 n 0000030409 00000 n 0000027412 00000 n 0000027701 00000 n 0000035188 00000 n 0000035461 00000 n 0000030783 00000 n 0000031056 00000 n 0000029802 00000 n 0000030115 00000 n 0000031076 00000 n 0000031389 00000 n 0000035799 00000 n 0000036112 00000 n 0000028738 00000 n 0000029120 00000 n 0000037093 00000 n 0000037366 00000 n 0000026127 00000 n 0000026434 00000 n 0000036133 00000 n 0000036446 00000 n 0000033062 00000 n 0000033577 00000 n 0000033598 00000 n 0000033895 00000 n 0000027078 00000 n 0000027391 00000 n 0000026789 00000 n 0000027058 00000 n 0000030429 00000 n 0000030762 00000 n 0000035481 00000 n 0000035778 00000 n 0000029141 00000 n 0000029448 00000 n 0000033916 00000 n 0000034213 00000 n 0000032734 00000 n 0000033041 00000 n 0000028410 00000 n 0000028717 00000 n 0000034895 00000 n 0000035168 00000 n 0000032406 00000 n 0000032713 00000 n 0000028076 00000 n 0000028389 00000 n 0000034562 00000 n 0000034874 00000 n 0000029469 00000 n 0000029781 00000 n 0000037386 00000 n 0000037693 00000 n 0000032078 00000 n 0000032385 00000 n 0000115293 00000 n 0000087017 00000 n 0000088593 00000 n 0000045333 00000 n 0000046971 00000 n 0000058716 00000 n 0000060685 00000 n 0000079735 00000 n 0000082073 00000 n 0000085548 00000 n 0000086995 00000 n 0000088615 00000 n 0000091148 00000 n 0000066280 00000 n 0000068627 00000 n 0000046993 00000 n 0000048569 00000 n 0000037714 00000 n 0000038609 00000 n 0000057118 00000 n 0000058694 00000 n 0000091170 00000 n 0000092766 00000 n 0000064625 00000 n 0000066258 00000 n 0000082095 00000 n 0000083505 00000 n 0000118939 00000 n 0000055384 00000 n 0000057096 00000 n 0000076282 00000 n 0000078281 00000 n 0000105246 00000 n 0000107593 00000 n 0000050646 00000 n 0000052984 00000 n 0000060707 00000 n 0000062345 00000 n 0000103648 00000 n 0000105224 00000 n 0000053006 00000 n 0000055362 00000 n 0000097623 00000 n 0000099199 00000 n 0000038630 00000 n 0000045311 00000 n 0000048591 00000 n 0000050624 00000 n 0000068649 00000 n 0000070848 00000 n 0000074684 00000 n 0000076260 00000 n 0000095171 00000 n 0000097601 00000 n 0000083527 00000 n 0000085526 00000 n 0000099221 00000 n 0000101257 00000 n 0000062367 00000 n 0000064603 00000 n 0000101279 00000 n 0000103626 00000 n 0000070870 00000 n 0000073208 00000 n 0000073230 00000 n 0000074662 00000 n 0000092788 00000 n 0000095149 00000 n 0000078303 00000 n 0000079713 00000 n 0000107615 00000 n 0000109191 00000 n 0000109213 00000 n 0000115271 00000 n 0000115332 00000 n 0000116142 00000 n 0000116200 00000 n 0000118917 00000 n 0000118978 00000 n 0000119820 00000 n 0000119964 00000 n 0000120029 00000 n 0000130910 00000 n 0000130933 00000 n 0000131162 00000 n 0000131627 00000 n 0000143246 00000 n 0000143269 00000 n 0000143511 00000 n 0000143996 00000 n 0000144049 00000 n trailer << /Size 277 /Root 266 0 R /Info 1 0 R /ID [ <4bbafb38cc346fab9c1c11f3374e5162> <4bbafb38cc346fab9c1c11f3374e5162> ] >> startxref 144170 %%EOF 1 0 obj <> endobj xref 1 1 0000149872 00000 n trailer < <4bbafb38cc346fab9c1c11f3374e5162>] /Info 1 0 R /Prev 144170 /Root 266 0 R /Size 277>> startxref 150055 %%EOF openscad-2019.05/doc/OpenSCAD-csg.graffle0000644000076500000240000000514613402025764020313 0ustar kintelstaff00000000000000][W۸~‡y9#2+JP`g,a+Nm)N⫒X~'ӾhK{w߅"g^v>ԍwsxuq$\'$IKح7ōaP8=iwZFqt+m4&hCF6.rwJ M]ZM\z9W۱Nm7-|ǧ'5د4`5fgYhݎ-*.y bj{! hi E9s8@S1LQR){Yqc7!WH1n[–`ט`292S[z`$ރ7xHgMr-z7`JwC:}0ڰ01u{,ZU\YLY9D,KշV҄ B/X!~F3?X|C'. Px/G>hp[!HJaP #esyvEa8yNOI#1#;e^`zr&J4dKsɅOJ7z޹$?dP) rt&w;N8 fѼ5ųtsܼ 憙ܹK}zYŕUQ14++ *J W\)W꺸ҁ)jDqL.t MqT+hXc.ɢCKo{(կ*Eq@I*RTR/"g?Ԥ݀`yF}(R-$ p|Cع|^8q°۳(1G~DŽ(tPJ`[Rn?cn1OJ:C3CaD6#EHT.0fEE;8@NbIV#Gߑ;f^~=x\[ ǟtIQEbM30XKBΩ #DAQ+9yXSK*IIKy~0D/O=Z$!I& IIH?9 IIpDAem?jׁYJcʱ⯣v 0뮌Le#\nH> $,SιT ;goF:ejQ?rQozxZ+B9;??\ړd~F}/5eT<Ӛչ0MՋECK2RI_qkJ =bN$]%^¾A-; ٿPM&]ަVdpH/\΁JUre-ޘۖ\ok&j:44vVxΜmoiySo0/QiڦZ)7hoMYe]9Q9J&$!hPTrv6prRkJ(mCξ J ذNMp0|12CDX+gW /!k zrgGeXbl;w՚4<d* 4T(kRebn jLiw-أFuG9::8ß"<`D~ȨnT^澼Y5ޗޞ+_+W~ ˠyCGYlJX5c{WrV^xM_Íc\G *OmR_LՎOަ|zx8<[l# g:7ŀYk7@}B#K'CJآ p'r1)F.6G?ṇ0dfc2)аdEDH~AypRRh 1cny[){y}H'=ct,^@'$|]ȸ&%\ .u"khB7bQV^P- ^GCɨF,˾j hkeLfI cR.qo?e,&QJy~XN (DQc3sx8Q9m /1+=bEMs]zη1^YoZ <.ٷ5*:0@$jU` ިpL(A%!攫^tCNmj,}`{3$oͬM5ד~SϓѠ98*Zn_¯WnNGh\5(͇[w: <}{Z!A;r]t̏%Pb-_^No}w˗{/0,4Ev?>VŠk{HѨ0++(3ըlG˘ G3~WBrXֵ[ y9)h3Ir\;6$yYթ0ŝ0e5c3Ք"*LRL]R!R0ԋOѫwJIkopenscad-2019.05/doc/OpenSCAD-csg.pdf0000644000076500000240000016167413402025764017467 0ustar kintelstaff00000000000000%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x[F)8uqٖ, R@B&Y6a].nw !6U::.5?_??{O{~G7ǩW|_P~768˗>i7we7^˸7~p{nOeڒ={N;_'}eøH:HTຯX}h߿[׿]qi;=ړ;4=fM? $HOSmX)|AZ7P~Û8 |Soyqm˛W|[UN dhj$تUP#w' Q*wu:h?=/5]b[saǪ˦̣UU MUxRVwT5cUCZCx.u窇f Om,u7E]gvvN|2n nƛG q"Y03NR춍H˱6y+>,RN $M*үo3!w!Hn=R:&$5u).Ø@?:!u )1|a'7Mm Jm)t0,ERXBh7]?WG=|? 洟?5rN9> SCH}螫-SP@H&?8>pp۝ma_D^ 9ǡ~zIV⠥,غ,D8U8°,׌qw<~FN <qޯ)sZ8,iYq.}<}O!̢,S[ikUs>wsLwff8EX6&SL :7, eJsT։-!Ft0 nl/ Ih3_}!sG1L^(fTvL}D6ggnEJJJ ng0f|+c %cmRr]dYSl̝E_ ź~"O g1zCph xJH2ڒuBFM"1G=x`yEJWX.BlQ~ehK/e]8_J߬"¬q-AVb$ۖj~T(MޒkcF`$̧p[,nUZY쥞>,RN,'a[+p7+7q56VLeʏV='bfCUt':t B蠁{F }+]:yU;f^[#UBó<,YU!a`i"i(C'cҏ*vqƥpV2L?].њ!ovS 4Y'>ʃb*^ r.Snp~.S_)e_s?IB mcfDnBIHK1cK iŭZW)W{ZG*WY@vi{N[Φ>{%bsER7PO$lS zeX^^ؕX_\Dz:s+3=+fH"#oTuj4N־FXI6YMQhf.h'jش2@zDռ5 HÅHԽ /ƃJ\W} mOH{?]yl%iˍjeoOx8NTcnyxrԸw`HM3Ib8݊j.b>hG$42^-uĽByJi)NcxŗR[a R"E s蹹nưWM)7`gĈ!~XH 44e8燥TZvY;UL#eZP oAVIa9rE~./m4/ևPԉ3O,\fF)JLm~K@s(2a DHNƸG@zY|_E endstream endobj 5 0 obj 3339 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 745 389] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R /Cs2 59 0 R >> /Font << /F1.0 60 0 R >> /XObject << /Fm7 26 0 R /Fm3 14 0 R /Fm10 35 0 R /Fm4 17 0 R /Fm5 20 0 R /Fm15 50 0 R /Fm16 53 0 R /Fm14 47 0 R /Fm2 11 0 R /Fm9 32 0 R /Fm12 41 0 R /Fm17 56 0 R /Fm8 29 0 R /Fm6 23 0 R /Fm1 8 0 R /Fm11 38 0 R /Fm13 44 0 R >> >> endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [457 313 587 389] /Resources 28 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T015W064V046P07S(JUWSH-JN-()MQ(*I)LBrg!K>Ш@" endstream endobj 27 0 obj 75 endobj 28 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im1 61 0 R >> >> endobj 14 0 obj << /Length 15 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [299 278 432 316] /Resources 16 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T0T02P046V0P(JUWSH-JN-()MQ(*I!P LGrgK>WB T endstream endobj 15 0 obj 74 endobj 16 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im2 63 0 R >> >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [612 204 742 242] /Resources 37 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T034R020Q046P0P(JUWSH-JN-()MQ(*I P LGrgK>WB 1# endstream endobj 36 0 obj 73 endobj 37 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im3 65 0 R >> >> endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1 305 131 362] /Resources 19 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T0T060U046P05W(JUWSH-JN-()MQ()J P D}rgK>А@Lp endstream endobj 18 0 obj 70 endobj 19 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im4 67 0 R >> >> endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [144 295 282 370] /Resources 22 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T041Q04U04P07U(JUWSH-JN-()MQ()J!P LGrgK>WB K endstream endobj 21 0 obj 74 endobj 22 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im5 69 0 R >> >> endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [300 203 431 238] /Resources 52 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T060P020V046T06U(JUWSH-JN-()MQ(*346PA=S\}\3.|Qv endstream endobj 51 0 obj 78 endobj 52 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im6 71 0 R >> >> endobj 53 0 obj << /Length 54 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [437 207 568 242] /Resources 55 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T016W020W046T06U(JUWSH-JN-()MQ(*346PA=sS\}\s.|Y4 endstream endobj 54 0 obj 79 endobj 55 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im7 73 0 R >> >> endobj 47 0 obj << /Length 48 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [300 186 431 224] /Resources 49 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T060P00S046T0P(JUWSH-JN-()MQ(*346PA=S\}\ .|Q Z endstream endobj 48 0 obj 78 endobj 49 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im8 75 0 R >> >> endobj 11 0 obj << /Length 12 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [299 305 432 343] /Resources 13 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T0T060U046V0P(JUWSH-JN-()MQ(*I!P LGrgK>WB I endstream endobj 12 0 obj 74 endobj 13 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im9 77 0 R >> >> endobj 32 0 obj << /Length 33 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [612 168 742 225] /Resources 34 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T034R04P046P05W(JUWSH-JN-()MQ(*I P LGrgK>WB e endstream endobj 33 0 obj 74 endobj 34 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im10 79 0 R >> >> endobj 41 0 obj << /Length 42 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [300 150 431 207] /Resources 43 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T060P04bcCSsTp<ԢԂL2Cc*3IU54r0 endstream endobj 42 0 obj 78 endobj 43 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im11 81 0 R >> >> endobj 56 0 obj << /Length 57 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [410 0 568 76] /Resources 58 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T014P0P04P07S(JUWSH-JN-()MQ(*245*2P07RzF斖 ɹ\F .@` endstream endobj 57 0 obj 87 endobj 58 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im12 83 0 R >> >> endobj 29 0 obj << /Length 30 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [612 332 745 370] /Resources 31 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T034R066R046V0P(JUWSH-JN-()MQ(*I!P LGrgK>WB ^ endstream endobj 30 0 obj 75 endobj 31 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im13 85 0 R >> >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [171 349 247 387] /Resources 25 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T047T06T07S0P(JUWSH-JN-()MQ(27U0B z=S\}\C|@@:} endstream endobj 24 0 obj 79 endobj 25 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im14 87 0 R >> >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [299 332 432 370] /Resources 10 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T0T066R046V0P(JUWSH-JN-()MQ(*I!P LGrgK>WB v endstream endobj 9 0 obj 75 endobj 10 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im15 89 0 R >> >> endobj 38 0 obj << /Length 39 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [437 154 568 211] /Resources 40 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T016W045Q046T05W(JUWSH-JN-()MQ(*346PA=sS\}\C3.|aJ0 endstream endobj 39 0 obj 80 endobj 40 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im16 91 0 R >> >> endobj 44 0 obj << /Length 45 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [437 190 568 228] /Resources 46 0 R /Group << /S /Transparency /CS 59 0 R /I true /K false >> >> stream x+TT(T016W04P046T0P(JUWSH-JN-()MQ(*346PA=sS\}\Cs.|aI endstream endobj 45 0 obj 80 endobj 46 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im17 93 0 R >> >> endobj 75 0 obj << /Length 76 0 R /Type /XObject /Subtype /Image /Width 130 /Height 38 /ColorSpace 95 0 R /SMask 96 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om /@a 0` 0` 0` 0` 0` 0` 09 endstream endobj 76 0 obj 88 endobj 67 0 obj << /Length 68 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 95 0 R /SMask 98 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 68 0 obj 121 endobj 69 0 obj << /Length 70 0 R /Type /XObject /Subtype /Image /Width 138 /Height 75 /ColorSpace 100 0 R /SMask 101 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om ?@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` x yJ endstream endobj 70 0 obj 159 endobj 85 0 obj << /Length 86 0 R /Type /XObject /Subtype /Image /Width 133 /Height 38 /ColorSpace 100 0 R /SMask 103 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` < ;: endstream endobj 86 0 obj 89 endobj 89 0 obj << /Length 90 0 R /Type /XObject /Subtype /Image /Width 133 /Height 38 /ColorSpace 100 0 R /SMask 105 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` < ;: endstream endobj 90 0 obj 89 endobj 61 0 obj << /Length 62 0 R /Type /XObject /Subtype /Image /Width 130 /Height 75 /ColorSpace 95 0 R /SMask 107 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om ?@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0rB endstream endobj 62 0 obj 151 endobj 71 0 obj << /Length 72 0 R /Type /XObject /Subtype /Image /Width 130 /Height 35 /ColorSpace 100 0 R /SMask 109 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0`5R endstream endobj 72 0 obj 82 endobj 79 0 obj << /Length 80 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 95 0 R /SMask 111 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 80 0 obj 121 endobj 77 0 obj << /Length 78 0 R /Type /XObject /Subtype /Image /Width 133 /Height 38 /ColorSpace 95 0 R /SMask 113 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` < ;: endstream endobj 78 0 obj 89 endobj 93 0 obj << /Length 94 0 R /Type /XObject /Subtype /Image /Width 130 /Height 38 /ColorSpace 100 0 R /SMask 115 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om /@a 0` 0` 0` 0` 0` 0` 09 endstream endobj 94 0 obj 88 endobj 65 0 obj << /Length 66 0 R /Type /XObject /Subtype /Image /Width 130 /Height 38 /ColorSpace 100 0 R /SMask 117 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om /@a 0` 0` 0` 0` 0` 0` 09 endstream endobj 66 0 obj 88 endobj 63 0 obj << /Length 64 0 R /Type /XObject /Subtype /Image /Width 133 /Height 38 /ColorSpace 100 0 R /SMask 119 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` < ;: endstream endobj 64 0 obj 89 endobj 83 0 obj << /Length 84 0 R /Type /XObject /Subtype /Image /Width 157 /Height 75 /ColorSpace 95 0 R /SMask 121 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 8 endstream endobj 84 0 obj 176 endobj 91 0 obj << /Length 92 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 95 0 R /SMask 123 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 92 0 obj 121 endobj 73 0 obj << /Length 74 0 R /Type /XObject /Subtype /Image /Width 130 /Height 35 /ColorSpace 100 0 R /SMask 125 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0`5R endstream endobj 74 0 obj 82 endobj 81 0 obj << /Length 82 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace 100 0 R /SMask 127 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàS_Pa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`ށV endstream endobj 82 0 obj 121 endobj 87 0 obj << /Length 88 0 R /Type /XObject /Subtype /Image /Width 75 /Height 38 /ColorSpace 100 0 R /SMask 129 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0!f endstream endobj 88 0 obj 61 endobj 125 0 obj << /Length 126 0 R /Type /XObject /Subtype /Image /Width 130 /Height 35 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`H!L4`k263-aeafbbDv~VvNnn^nn.v#n`dbfe-`eA8n>!1IiYE%e%E9)qa~n6&x:@@DJ^Y]KG@_W[CEAZL2ʚ&v6*@`bV5u  % t3WbFOHtBJz&MAFjbL/3$!0si8G%gUUT(s\/gVPCST]oo*% I,RjNI5mg̜EK0cjG]qZ07\B3-Y`ɂY:j⼭tEx`.Ӷo蝱ph ֮\<$NOQ  " :6~I%-_yM NH r0PCrri6l۱`ۦ5wUe8``煁/9LzaƁo |Nd2N>6FH{q`7P endstream endobj 126 0 obj 584 endobj 105 0 obj << /Length 106 0 R /Type /XObject /Subtype /Image /Width 133 /Height 38 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혽kP1IC&DC~.`)CKNE )_Z,t>ϒ<=lQlWZ IX$wKͰ,824NS[$l$It;Oyq(@Kr(&~YڲDDht[bR8nKɺEhV(m.0 W A߆B013z &vI_G endstream endobj 106 0 obj 608 endobj 115 0 obj << /Length 116 0 R /Type /XObject /Subtype /Image /Width 130 /Height 38 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`H!L4`k263-aeafbbDv~VvNnn^nn.v#n`dbfe-`eA8n>!1IiYE%e%E9)qa~n6&x:@@DJ^Y]KG@_W[CEAZL2ʚ&v6*@`bV5u  % t3WbFOHtBJz&MAFjbL/3$!0si8G%gUUT(s\/gVPCST]oo*% I,RjNI5mg̜EK0cjG]qZ07\B3-Y`ɂY:j⼭tEx`.Ӷo蝱ph ֮\<$NOQ  " :6~I%-_yM NH r0PCrm@jyǴEk6ص`uKgTg:]#oV5cɺm!ػgÜT$E4.8qK/9fy[(J*#00=0=W`y{V`@0BIFm endstream endobj 116 0 obj 636 endobj 103 0 obj << /Length 104 0 R /Type /XObject /Subtype /Image /Width 133 /Height 38 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혽kP1IC&DC~.`)CKNE )_Z,t>ϒ<=lQlWZ IX$wKͰ,824NS[$l$It;Oyq(@Kr(&~YڲDDht[bR8nKɺEhV(m.0 W A߆B013z &vI_G endstream endobj 104 0 obj 608 endobj 98 0 obj << /Length 99 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 99 0 obj 1401 endobj 107 0 obj << /Length 108 0 R /Type /XObject /Subtype /Image /Width 130 /Height 75 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOifa * H@16ؒR* hER6bj1ۆ,&j6mmiLM{՛ww/wA;Os#I@\(PBvPIR (@ǀsIVjF (fU4E65t$ r.-g0.-P1_4 9F(Yd_Kvɠe6AJVgqz TmԱJj9NtF F]A%vH(s F[&Go&'ғSPLO$oNႆVJoqO<*@уpâWӀ`dR3X||& .;iSjLʫoPZ)oG{MeKN,ӥPڬ.= 8-:?W7.Vֶ@eVY|8u#x[Qp'|krύ}4>x[]~2{+8ۼ{+k>};8OV%6/rgXY~'TWsw">{[\2}#㹅͝1T; >Ѡ:KdQsA:tG]Yz_ޙ%$ $~~œdN 8Ãyb2A'&Jdk@eZY&1䵝Muiŧ wP}Td[]tXnlwRިtle=SԚh*SxY~S[߄zMe!f5[(QlaTBR.-x'E,/t&_x^\Jy!I'.gM %ITzn6ݙt* zDidrb9Kg |5O$ǡLcW R'Fj"P$2Hd(4D ;gz'5gD y.(85IFUEmlu,Mh{.C@`5Z=> stream x혽kP1IC&DC~.`)CKNE )_Z,t>ϒ<=lQlWZ IX$wKͰ,824NS[$l$It;Oyq(@Kr(&~YڲDDht[bR8nKɺEhV(m.0 W A߆B013z &vI_G endstream endobj 120 0 obj 608 endobj 117 0 obj << /Length 118 0 R /Type /XObject /Subtype /Image /Width 130 /Height 38 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혽kPm&TMDQ",*J]":ei!%NZtp E(" )HySߒlɹ?'Cg$ՉL$ :N$p;pⓀX)@:`8(/<>QP$91 ^)јXTgiGo ĠD*J:P?IIB\JTgS"IËdx]&Tuv]%/"πAqޠj-lCż[Z*E yIVsպntn*cjN%`$#tQM׷C ~2uVC=x2'e4Bek r>> stream xK"QgΌ| SLc[D0 .}B`+RB(E^Da,HERFdElDs\{y_ Ogs2AZL(4j8W fX!c8) #@R4 S镡#9Ehc+k%Yu5 z4K%Z-,c@" dZɶS;72"X+Dh43 8IDECxb~1 "KD<5EdMñZf3Hv3u,(Ρsl~*|v=5 j'ڥQ#/9+7R ct@[ h^'V ǧ7\V&[ ZPdf|}XAx]>$!EfzS˹sDOWTث3;J'D__NzL#3] "oa>=cw'@} {п#!12|_L w&3꽱9 ݝ;ܿx endstream endobj 110 0 obj 592 endobj 101 0 obj << /Length 102 0 R /Type /XObject /Subtype /Image /Width 138 /Height 75 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x횽kPi&&EQ",*8Dt҂E -U:8DZ E(RAZJݴwùg8xz<ޡqM,` a,43/E$gf'H?.TU wdI ‹r@ EbZ<#!bEލA xɧ5=i2Եx%f9ѧFu#/*$T+b>cQ'rF Y úhlr!Udl0ٶO=$tOYO1Z 3߱2b_HϖMkGx3],gO`?7 l#|ݱ/ sawڵ|2$b0fV\;$,kgзE#hyd.'$o#,$TSgxx\?#a:F%W/'VlZ"eZf5P7I-ﮞ;h׷_x{}~ {L {I{&N\!}B 6WH'B8 ' l>!N`p q+O{{.nlި .2`3`33g^ 6|O()}n:౻Y!wQ endstream endobj 102 0 obj 694 endobj 127 0 obj << /Length 128 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYSW P aQ"TASIH| 8X'6>bjQ1j46Ä`cS AQk` K3\ݳs@) a%S4ڢYbw.*`BX,b24*oIIdbs<. 006 HOς0W #HPPDƀrbLT*0QYYˤBA^ĠQR@$QLv@TTPinԧ 5RQZ$䲙tjR  %e*uYo7::KC^׬S*$<HF%?`]VSS!(YI(D #ڶ}Ƒ)_0C؈fj OFDCpD^]y{iefo`۝urI )SHAp>"ihe3g ťe&X^Z/[g̦[m 5rI> ȧ$W7{N>~n;V7N5pUƚrEMHadsEz}jõݴq N<>`h,=%+ԭݣ6Pv~1pͥўVeɱR}ǏOܻ(+i~ZC)N;*dcaHv{tںbMÇ8=au($I4ZvgrEH=(p^Si@M[` >WCзPgcUI~#dG(UiF+Q wxokJp<(Ypa1ϝ݃HُBD{wޖZ(IE bmKOO^yFgLD/XujEqy"Zw{ܲ nL)ލ?MisO@aI؟MA|d]g!Y>D(Isb8Jo OBJr7S$x3:OD8U'Q'FjeDjaVvfVTV%@(ӌ =gLegLn{s{& d}#!;K2;S΄Lϝ RJBH=9Ru9!BYZD3U+6utLw, L'$+6 endstream endobj 128 0 obj 1414 endobj 129 0 obj << /Length 130 0 R /Type /XObject /Subtype /Image /Width 75 /Height 38 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc` lH 3P5#vY9yxxnn.vVVfl bDE9ٱ4_XLRZV^AQII7PRRT0I2 *Z:zPN_OGKCEAF\,I.ֆ @ؘቂOLN3$.-?(-I 7֔d9GXZ'"9lk-M7Ra9_\Q3"w3ffΘ>uROkMQjYLB&Ʌuf[de%KΛ909TCF C&v^Qy+s\v7@ukWX2wrguN/;(>qe ٰy6B` kΙR`, IFΡ޴m݄6^4*3DMJ9L\#jzf.]u={!`?&ٽs뺥{r"ԥib> stream xOia``K/XEm^)#6x5j-f jjhiQ#xXk2[8}gshV~Auk?2`&$c !@zB.xq$CQ.B!H$09'EBAq {bIT*E-$S"θ 0>a3!tf!h|.syJ0JyL'ţX1\~".f)UO?ƓʊrU2/K*\`C$ tivAɣ:FԤ5G-QQU=*)Ȗ  < ϐVkt-m]=}$E(͗g/B ESNg`hd0I7 =.ʑDB`6f*Jw&s Iܬqj0񼡪DlAgP,%Sն O͚Whlli֔*$8Wv#'sKk}[\زZwvvIΎòû\q2 7#qQVqՀhZfݷ;rtxhߵ|[3 Y"A1XLYL?`^Zُ_n<>س/M^5JY* 3@BL޸i9\3{NϙY7Z)B>r kF>.nZsϠB>߹y`\8TPnĎ?'ne( yabPP'ıC{5} "+3cݺ{DE9*uic4@V~ l&ߴU9D O(yP5lNμ!xϜ/Nm .y jm.F` io&M{wr-vmexY_,OK@ҳUj־؆.Ϝ[SCz*; `n(qE,B,m{CY( gYL endstream endobj 112 0 obj 1401 endobj 123 0 obj << /Length 124 0 R /Type /XObject /Subtype /Image /Width 130 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xYSYAQQQE#^F,-t=1qb 5QctDc#ך`@EP(!REfqCcSsK4756hK sX"q0*!-WS^kgwOoJxYP S %/z>Ꮖߺ[t21rO< qB%̂&gPܟ3L?}TV&l/0$(v-O u6VS,ѵ@xo>-n \кi{VI 0Ȯ-@ G)W6v}6Z!ϥN Gv `Ǔ<H M+̙l$-} SE0^=)$+tNX\u_Z۱#öeW܋ a\ H H]x7ٲwx;FGtJE< HT4t6[H\ (v/OeƇq"9e?wd;&`,u芳d"<  3+>G㖛 ]qLe\`p{hq0_ 8y*v/p"=1='b.`6X8iD9=ʦ\q]P'.uģkDg,Z~M~a~wgt{=3ol+70qp3лxJ #qnt p+gil0;^3S)`> stream x혽kP1IC&DC~.`)CKNE )_Z,t>ϒ<=lQlWZ IX$wKͰ,824NS[$l$It;Oyq(@Kr(&~YڲDDht[bR8nKɺEhV(m.0 W A߆B013z &vI_G endstream endobj 114 0 obj 608 endobj 96 0 obj << /Length 97 0 R /Type /XObject /Subtype /Image /Width 130 /Height 38 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK"awq>td&-eLE$х0 P !(B.HB l 0"Ae׏ub<;B2Wܷ*RLai`WͰZ524E*qЯAR,A*=X$襀$-OZ̢I0F T DMtL;]qN;&%Ut"!МhO> "uO-F=GBJ- -.GW@d% ܒȫ)ӌrZ,yZ"JC$LEdr^$3;Fj(*F,wt,5Pi #Pls8/!r^gw6c!ĈAP`u-ŷ3g2DnoJgҜ*pT1W0< R}.Ѡk̨voyW'ccp^L|πޅEހs|]_ڇxK3~Ty7!lԟ*~<<# F'JA ͷe DC);ۈDOe˄|BA?TȧuE|kS) \e{{P@^ɥ endstream endobj 97 0 obj 639 endobj 121 0 obj << /Length 122 0 R /Type /XObject /Subtype /Image /Width 157 /Height 75 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOi0p RY)5 4 jHMi*6am5ش6Xk֨'֪mSu'^|7y/~<0|*o3b.fYgA0PE|q KdeR1ASyd60Pk4ZPh4DRQ-F2]dd6 vh0/-`2t*T@u,LfS54gnb1j(-#ʼn1 ^ "_Z͍B"*`Tv #C1P Eoݸ:z\:OM-oIP$'Fˎf .Apךۺw3P>}`lxmӫd&eF{gvb*yLP&BV V_8L/o@}93ufT TI<ʬllۭՅ'.FB1gp< >XMBk.> cvioG8e3SK6]%`K>ߎOqt6,HZ:BI2߀8B{>=b90h,2(Bh9ڪ(9#c*"c"ȘȘ=2h,2(Bh9ڪ(9#c*"c"ȘȘ=2h,N~Wp(9q;oV3щo?}>KsýKҜ\|v]~;sk/рr0:yՍ6(l-ΥI[ zGR3 KkxbD,s }+"Q,.'3̥S#xzSA {?9ɉD,h~ *y`,> p4ڭ:Ll/-+݁P_?(z~pWPi o:]K^`xmɠeP*tZMd젰,dI[D|S[`9"::VCTȇ+U*V!@$ɱWkL*"jJ <[2BT(D$DQ>be`Bi~|R)pi$5o endstream endobj 122 0 obj 1158 endobj 131 0 obj << /Length 132 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xROHQ6Axw )vuYm[Ңgߺ3ӛ5œ]`鲙}v*b{a[QÓ'a?dy֭S{=5ڊ^-CT#hsM9s1F9 1w7;aYf ]%{w;ћ9 \Ir< X}I<>Uw(gRVzWOelπ~v{|u׶>UEP>,l%KTn)=J+vp,ZSk9xw"zmMWzmʨ)(ͳDf[xf8:罊ZIE?9Z*UVPog~~\?A< =ѯ tIsQIi!3NTc)[d@f endstream endobj 132 0 obj 704 endobj 7 0 obj [ /ICCBased 131 0 R ] endobj 133 0 obj << /Length 134 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoE endstream endobj 134 0 obj 737 endobj 59 0 obj [ /ICCBased 133 0 R ] endobj 135 0 obj << /Length 136 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xYgXͲM%Er$HHZҒsJR ""`D `}>ϝ}ݪکw`[v  2=ȋ{(0!I7RX) *$w}W #Y jw0R됂C@#` 1 /woa .V(B "rH7⇠!Ѓ 5H>n#6{vqEŏ`77}y'29,-׏&?^7 3]p3AΜw;W3=fWEp.FnaGk`jD^snƻ9A͡VDpwX>cSFm`rXHLvc@Ƃ  "m @i%pC4. @z!}N$y#G^@Bl#hȘ$%wCFBNg̿,vF^zQz믘hYZ@^43Hhm&Z ѩW"bT|wK ~Yor_DŽ}y;sQ i^Yi]cw_kY@#dd>:#s? @$r#.D_IwO@hE,Pj@ c`lpF2CAGA:'iP*@ p``̃%Mp"Bl$I@2CBP C)P@:*݁B#3hZ>C?`L 3\0,+ڰ l8Nsb ߄8< /PG1P(e.BQBT% u5F-6X4͋D~-A'%ZMtz =^AocNFc9Da1 ]8f2cEJX/6=mvcGso8 'SǙptem(nNࡐ0pH(DE1JbRRҜ҃221<&=: /Qb+Tw^R}x%?/7g ԺN9Q!-#!C#4D4F44I447iFi>R j:^}LLGI'LKFHWJF7IH/CoN@M!AA!a" u$b x8ψea4bebl`b\ab`gcf*edfF1 313273O0`bfd`2ʲɚ:M͏-;]ݒ=.2##9')iY9ː+ W/273/ww"GSs=/6?o1o '~|C|" zVy >R*/&,"l/|LExAUH$V^(ATS4DRVLYOذ8, #^*XP Kك٣'pOIIjImHzə{M&mQJPQ*OԶt cdvϲ$R'r9$VUy yOr D z~**)*^Q\TTrU*STfTPV~QQIRPPUT WmV&vIma>}ϫOkjjӘtӬԜЪz-}YN 5]Un=^ސ>~Aaa~~y'HFuF+J }&&&%&⦡Nxi&dhb̍Oe,|k%couߚhb}M [Q;Z;':5{=|R8;Zqv5:}hI)iٝ;]h]\b\]/nU}s7r/s_!钊HKZԽսOy/h,u%Uk~~v(\F%ӃCTCNքAaZшH(kсу111b b/ġHq=|Gg'B=IIIG :wQtr~T#sii4ԎUG'ʐ8ٟ%UM?!sNWPbnIyysY[Y釅ETEEŦŭgϜ|KWt 8*_nVћ}1G[zfk>-m;wu _ ^\N@럴> \_ ]ů_{Y|}s-smvCy6p[?~ol v u,BZ vwM)W v^h >rF cŸ` +J}*E^2 +}ib 356k([/w:IY!c"OJ,KﭒږqmgWVWSQ]g~N㇖ =Fq]-X&9+zku4svu>xƹk[3Cɓߋ=On-K'X*ԇ&̉r[GWN&%V$9*̘BJFNwp29{lѓy=mT>SSRw&$يs+W*W>UfB훺Ks WtZn^A"ުЦnt˺ý3t/.=Jtdy"W SaMcGgfd6ܛ/xNuab%eW?~Y6|.rwZ? 6mʿ;P,E6?-^Z F#D+J'E`@c dJebc]b$sp) \|/,!#Z+$!'T iM 9J#*DU }XMMHZzx}UwÌFƋ3s9 UKU+9kAof::ZRrp9ipjoiB"b3T%蒭үeKg'+F |]T^HSV'xI~e+MWk]ҵ28ܕ~NCOuɾ6d_}Y*Y)?̍>k~R40A4y*9'/o::~:xo6`.M|ۼw ޷/.?jo_~nUn;?'tPh&]uRtєӞKe$00%0䲞ekdx#ȫʟ"P%xWhQFTFVdY?P@F~t+8zRTo0˽w[ ,M%B~ @e@JCaCM)0.!p E^d!s:]zY`}˂'ۏ AP9h@W0("[s$STxt,Ks|mNϑdi2rr~XI}tC{ws [wx{3n<{$8kdɁg/6f^M]\_X"Zkwwś:[SۡPB{@FXӠ;z?k4iljwl̂*ɺfN>`#搅S.Ʈn?I:['<p/+82d,L>(b+%+5.0^@RdߔWiǕ2KrXr+T?'䩦ss ;]sq˫[]Tݼ=}<(oz1ttIg<643&mBj>W>Y]nb=l̏G[Ew:@!`Aܟ!O *LO'Ֆϯ,6Z?mܼŸEkbbxNNnüdwwQ ap٬Y;n+v^vkjД endstream endobj 136 0 obj 5953 endobj 100 0 obj [ /ICCBased 135 0 R ] endobj 137 0 obj << /Length 138 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 138 0 obj 2612 endobj 95 0 obj [ /ICCBased 137 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 745 389] /Count 1 /Kids [ 2 0 R ] >> endobj 139 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 140 0 obj << /Length 141 0 R /Length1 13360 /Filter /FlateDecode >> stream x{y|T]6K&3̾e23 BC6@4P1Q@DEV\X !—Ru)]RZ 3s߄k~:/s9s}YV:EuZF/o3Bd- oپiYK!t̙~!֖Y~t6h0S,y(^@b}3C|ACGByK O]x,_Y  ߻C݇^$"p5!$^Q:~2UI, $~OriP Y.A{Uz DP}F(qu(DKV< vA0~BGRdC*u2+U"Xy-t' mJ!\5jw5C.)ƻ88 ]r}!u2 jD Njvq]]#uzе 5+O1BtJH*q w\r"zc+=T᡾eww."0 (ލt7u0#7FT"Pau`u+(O9+o 1M&$4ZRJ$Fݥ.(ރJ,{HG;ʍ{ID$$"@x12DCpPKB=orqZʐ@V&KctE,i{ngƎ ݎp>+7oij-Ș0yfWz+'ny Y;L3f5Z-wo=u{w4j-nWx[([t˻Vkq?xW{b}Cĺgw5w5w͐&_1% I P߁\r!"ˣw.g6 WZ L=̀DKK ڊ!r6sxQ;Q6^ED3]@ѫ0~ :6H ,@F]} "2JE#*E];݉v=pOb?]B\=bce2T+qcmȌ6cgccQ5#;k'b/%P:GuTk/"n%o jʫ)KbZ ?B`l&Nœbⱸ/ $Iȃ!rһR ~_oTѯbGcgb rbfwGW5LYvŸ Oo%6|<ٍ?_'jb$d YO:nЯ1<_>wbűƾ+S4EB4 b/\kitN>vԋ* Vkŷx.~브ADGLN tHt:N:K?u8#WōCks;n]S~5/ ˅B?'k;@f é}>  .Yxk!J5崊4Gi݂n-1ݍ>I@;27wC EW(L }TfMFC^MP Ix2+9YmA Ͱ[DŽedF22T?/#xڤ(?Umt{r\~F.'@rw7+•m]Ypȡd#Ta4e(X4[aG}-u*mO#AxGV0Tz2B3Y0mi f,]F-mfb͠0UvUCOqYZ@mBKV66~$Sn|O5s2o[׼f .m YeFu ݖEde6//gݖuˋ=;rSA>a0wvϔ_dGu$9F Ӝ  q-hǑkWޭXM7wiG` vfoomio|گd0nYngff1<\14 6O `MfN E]~6Fple;JݙL (eg+͕LV]qܕ6&'՘o:;F@q<'=n]yO\nAR]äpG-*o.kmlQyqҡ ]:]] ^ODWx=ІPC!QBdx@tM_Spos`[(Sx俉E߅£0%s1BMހmmHpٿc ˿+0•spշPxܿ xM.N}[(\8(JC"Y|aHX kK%5<ڄ$lfco i# Gq:BsaݟD뗟?yG1/^?/}7z:uW~pl` RN NSQ'SD&HKV |Ȓ`φq0\b60&y]?}\΍4'?-Wx̌}b%(yх^I'jA79c2.H^Lu )Z3I7RQJeUxKR.k}IV2iIy oc^& MEM*6Aj>M @" .s*GB>R|H 2)9i$pfzo23@/oe߽.c itYّZoq??ٶwע~k7r쾌NjL@q.2#"b*@x[C&X"% @TĂD({j dQ_ǩǖ3pel_ZEVuyN` t^ /\>d4nkgK+Dy evFz)qT"vby4,Ce\aQLG`5|#@I+@ɤ6$EiG:/y1ʌ SN+ p-bѠPngwn=δ)?]~7l_\I|c<^KbILݫtXͱa9㊆^P3SX`^ɬ1HM;*5RRS0dG(7*CKIJՙ}q/͚!_%/%ϼ [%ׁ>ƘWдHbMZ΅$',i&@YrƧKؑ@69[8@*T8bɐjh4= 1ɦd s?>, 3zMS18jF`ͼ _>Ikأyw] oV| D_n_\V{K2}oj/ݹ9)sN]}o͓E9O YD"$w:>.X$j\qUU[>3;ս]_^ʖ=ꌵ®DGQn]2)T&B*42=+*(UӊE^|1UЪ$;X|Z=B^%**KJ13:O &?7~-K}Vi/I&"M{{ԙdaI+aLAÅdvLv<ؓF:L $:[7ʬ58Z4B&wQcpA>]gA e ##fq==m f1F?UQʱL>SoJOVx ǎlzwZvA`ϙK欻'׿zs&{ +B7T=U^M—~5OD C4EJt:ӡRmf ҁ 9$%y"O֐L=>YP& ?+!1&?NR8@,PJl$):)`Ɖ$/}ů6#h;nS?:ɟSͤhoj4.֬^v_i~yS z}ټSm%VaMLڀYʀbZgoՒޢ"R*!S~I,mdF6R%'6Da6ۈ&@TRQā~.ɇi/}|g>n]\m\ҶOW?i\pTFבB`(J3Ue}$:Hr8$%qT|vR6[]tuz >0x(ofB06`nvH&a2waVz&޲ FzLlΦ|e۶?j;=W>:ӟ@lـORY'>-$=oᢼ$Fh4! ~},}WuFwFOxOjdGj ]T:U>q}ΗZio fx߳=. '{34 '7/YZ*<%8B<'k-'})T?x?v:&яTF'hV4Hf-$M=nZIH/jB K FmTtNpd^{KMOݑk/ޞ7ymFͿ.U䱗Iǿªuuv-9"eQCh1=wH8#N0CD jb0kbAYV+RV;6-bW} nCaqT]N=w]<] e;8eVfJH.hn߻,p8 {D-2 l6jO~)mJHg/40GI,zEX$h)F Jw3`m$:Ǣ J|a-$R2!T 3T$T=Pd$@Z6<>[;k7܈WX{a Nܾqs7\3/#q=ڣwr>KB&&:0aWhHlMUE $ZТMJ,g'os~dɐ`ƏI<#fW2+23d|l?S[%oU9Z40tF-ٲtrnq_q<2u;ݿv\ZI0Ǘ739WuL5COA8N#iFSCR&af[!>)+`a-A)=w Yd1L%W1z/ovhmUR9\[ܷG 7zzb3Qaqs z*=UU)SS&,մ{.-owL`rY\vm&٘eNKT͕B$($[vG9drDFKDɱiL_ Y4v d[r$P!H %6ݢH=uq*%OYoܣqy>[{ %lS<ȓIJJ=*$NbFE g D$,IC 6[kHHP̢ O2VY8Ȑ}5 {T%L 16G ,,W|x57}=w؜_gl_a;h_xqtO^M> AG.=.ç1AsPisNn$|G*j wƥݟ"ju Fb {`ws!J &}!V8!RJPJY̬>?CSf_)^YƄIKC>dG/(Lny83xsOEmA\EI G SODfvPyAIݡUnWTKZ|o礷T8OA %> endobj 143 0 obj [ 584 0 584 0 0 667 0 722 0 667 0 778 0 0 0 0 0 0 722 778 0 0 0 667 611 0 0 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 0 556 556 222 0 500 222 833 556 556 556 0 333 500 278 556 500 722 0 0 500 ] endobj 60 0 obj << /Type /Font /Subtype /TrueType /BaseFont /QPGNYP+Helvetica /FontDescriptor 142 0 R /Widths 143 0 R /FirstChar 60 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 144 0 obj (Mac OS X 10.6.8 Quartz PDFContext) endobj 145 0 obj (D:20110902220048Z00'00') endobj 1 0 obj << /Producer 144 0 R /CreationDate 145 0 R /ModDate 145 0 R >> endobj xref 0 146 0000000000 65535 f 0000054775 00000 n 0000003455 00000 n 0000044903 00000 n 0000000022 00000 n 0000003435 00000 n 0000003559 00000 n 0000035069 00000 n 0000009556 00000 n 0000009847 00000 n 0000009865 00000 n 0000007119 00000 n 0000007411 00000 n 0000007430 00000 n 0000004299 00000 n 0000004591 00000 n 0000004610 00000 n 0000005102 00000 n 0000005388 00000 n 0000005407 00000 n 0000005498 00000 n 0000005790 00000 n 0000005809 00000 n 0000009148 00000 n 0000009445 00000 n 0000009464 00000 n 0000003896 00000 n 0000004189 00000 n 0000004208 00000 n 0000008744 00000 n 0000009037 00000 n 0000009056 00000 n 0000007521 00000 n 0000007813 00000 n 0000007832 00000 n 0000004701 00000 n 0000004992 00000 n 0000005011 00000 n 0000009957 00000 n 0000010255 00000 n 0000010274 00000 n 0000007924 00000 n 0000008220 00000 n 0000008239 00000 n 0000010366 00000 n 0000010664 00000 n 0000010683 00000 n 0000006713 00000 n 0000007009 00000 n 0000007028 00000 n 0000005900 00000 n 0000006196 00000 n 0000006215 00000 n 0000006306 00000 n 0000006603 00000 n 0000006622 00000 n 0000008331 00000 n 0000008633 00000 n 0000008652 00000 n 0000035969 00000 n 0000054502 00000 n 0000012334 00000 n 0000012668 00000 n 0000014170 00000 n 0000014443 00000 n 0000013879 00000 n 0000014151 00000 n 0000011064 00000 n 0000011367 00000 n 0000011387 00000 n 0000011730 00000 n 0000012688 00000 n 0000012954 00000 n 0000015165 00000 n 0000015431 00000 n 0000010775 00000 n 0000011045 00000 n 0000013297 00000 n 0000013569 00000 n 0000012973 00000 n 0000013277 00000 n 0000015450 00000 n 0000015755 00000 n 0000014462 00000 n 0000014821 00000 n 0000011750 00000 n 0000012023 00000 n 0000015775 00000 n 0000016019 00000 n 0000012042 00000 n 0000012315 00000 n 0000014841 00000 n 0000015145 00000 n 0000013588 00000 n 0000013860 00000 n 0000044865 00000 n 0000032051 00000 n 0000032863 00000 n 0000019258 00000 n 0000020832 00000 n 0000042087 00000 n 0000024542 00000 n 0000025411 00000 n 0000018454 00000 n 0000019237 00000 n 0000016818 00000 n 0000017601 00000 n 0000020853 00000 n 0000022130 00000 n 0000023754 00000 n 0000024521 00000 n 0000028039 00000 n 0000029615 00000 n 0000031247 00000 n 0000032030 00000 n 0000017622 00000 n 0000018433 00000 n 0000022956 00000 n 0000023733 00000 n 0000022152 00000 n 0000022935 00000 n 0000032883 00000 n 0000034216 00000 n 0000029637 00000 n 0000031225 00000 n 0000016038 00000 n 0000016797 00000 n 0000025432 00000 n 0000027021 00000 n 0000027043 00000 n 0000028018 00000 n 0000034238 00000 n 0000035048 00000 n 0000035106 00000 n 0000035948 00000 n 0000036007 00000 n 0000042065 00000 n 0000042126 00000 n 0000044843 00000 n 0000044986 00000 n 0000045051 00000 n 0000054027 00000 n 0000054049 00000 n 0000054291 00000 n 0000054679 00000 n 0000054732 00000 n trailer << /Size 146 /Root 139 0 R /Info 1 0 R /ID [ ] >> startxref 54853 %%EOF 1 0 obj <> endobj xref 1 1 0000057934 00000 n trailer < ] /Info 1 0 R /Prev 54853 /Root 139 0 R /Size 146>> startxref 58113 %%EOF openscad-2019.05/doc/OpenSCAD-polygons.graffle0000644000076500000240000001667613402025764021423 0ustar kintelstaff00000000000000]ksFp+G~dْ%cZNR &! k`@Џ=@ ZU6)aӧ>_;dŃ>d>섃n܋}ه9~u_vhv^Ga?<88~{yˇi:ӧO$H7 Gx&pGЁCKEz!a7>//a| ??> `uuN̳NA˟C_$+, ~|pd5S0jaBSOnaƇGi2ǟ\nxugͮo1KЯu ZFw #ZHn¨_ş=~r]O7_|f'~8o9}A8ea~tq|^Zx׳462y8\CV`*ΣL_s9Ǘ~t>(ϟ>]8Ŭ}Xe~2{aV8ee0=ss3IAGGa?r O{kg=Lf2y˹ %*,<2; ,IA|p9Z>>iitR p9) S0MD dLD) zlA_4VP.vZcFnR1鈖2,r0P\hEZ(}ͽYo+ WʌVPQ[}Y}‹}$q(CLσgA! ꯼jYˏ?MuC{xIiowҺjkZ+YZKNJj@y zKwLhT:Tۍ-CmGmmږ)(s &+T祹NQkwn6#_op=@{+E0 {,`[?FVi({ ˑcG8QpzaI/ޒ5Wk0qg4qOq7!=}3}􌞞>EY"HFaJ;3Wh Mr=y}':I44(rf!&eM̚(5C6ğ7JA:N&we{F;Q/pZ@_/݊]ؤm3,4nE&j7a7 ^a԰vE5EKF unX w^]R渣$vu="-K&!z]O޾hmu#piɸU[mu~p3dS6QzzRҺh89tix:X2xuv UGqj$E43%x0 ]bJo4I~eV҆&'t$. ?h_h4|wt76޿.*"D-[sꤼs.݂ѭbcű'6VT>dcel̇9O7k}2=Z:W!W-*`u5<^я8lE6UUv}8yAB2<{7iݛVwδל0`Z:939g1k 6BiE_bY{wM J*刑JK;iV㚔SGIֲ PHT1NQc 5NZc+5ܳ-Q,ͽQ+ ot6*txw9Gƒ{0ji6^8;P w^0^6]_#*1/bL6c&si SHkK ঱m]qdW;L:%E~Ź&i(eᢂW1~E_!B~ S5éN6ʩ8UD1@yƄRV#U<\Dmy%VrȢB!Bݪ4 Q9-p2]J u k6kbm­$~0;!شڄNX0?YꤑR_ I0S4|wxx,B ż)jQLYb: XX.r'3WU9)%cYj[j$a,r sk*G|+0&0*b VT)%TQnqko~ bB2g*/V{~9>r,ZcqBc)/gR%R!0^ T)ph)NLe O4PPQ9ll'p 4n>۞w7 l1DQv 1X!sBj́.d:evV9IJ! TX! zZ!HI{ml!N[:|VD7Mk[TZϥ0Kc,'C%0;E5Drm$|ќeZʳ&ǹ Il?9Ӎ/kL_Fr I kh:]JYֵSf ӕ\<ٌ*J(SFkXNbK;;MKMb[10vBk ` tlirF`R4kc`5x%er -0V=XLSA]cCwȺ3Ț"0#l6ѭ %ވ|lˍ^a;37?jx*JF2NN+rvUQT8ӝ1;(9 J0]WLe\{ZEhu-[rc_+f!Vp]?KOǖ ?rxga!5'oMhj.b*3,=MMr3wnl[>},菶(t_i !2PHIX'WcӜ/C;bU n܋O0 o{?<{+~5M\h5DFjbZt%_H Ft/mԅ7ܮ\[P{c f S~ %ۮRdmg! " Zr%)%%`.a:a=T4K6?}M[E(5N"9$=Ec B55a=L%qN Ya8YΔi;^s1ڕ%M š qD3Dgms]uY1D:[@})N`rl%Nv"T*N⼋N}iU[DidK-.tfJ'aNa1R*g0Wep )jDLDG`y!t/~ӿt-%޶輦v DlR J24icUB )QVڣV*rrOBp3dLޖ:4 AC*mם;{}ikB5R-uq:dVYwaŸ |{eטChn^pMV,ݪ*nάT?)D1}ex^$/ϯ>%̹]G16H=,47C\c\s5]M0ѿc*?az R/ͤR;Isg2Y LhLZVxVY O?q9UvqeGWgw]3϶83me}G^_vwIGA"3$Ǹ#V=of ޔ1PjĀ6+է :aa9,ߺ>8d CWH oyf"j̢9ƺzpB/^ز8ZhS\g+ZՎ]$=+_+eԫޘxmfS~3loI|斦(j\+gЋSxSo*r@ KYEjEݗ5&6Yb(\YWG4I|y>w5̘ͫ&WSUR,Up!\\{_7i6C0#k[Dh8×\9c|HU )7F~PIZ,'o*RnC֢ ANR)xZkjYrԥݩ($re ca`( );} TMt)*tE4K&;SKm0Z+\F dU,W r_)du(RtLjn-onmF䇴5N.q+]|.mKʃʳg/Z֗)f:TP}P},1."jO>+Nv^;UX^*} 3V` X"$V՘Ynf[\%p7*Ͷoz ls85Q鵉 uXSW>P yw-X砓v9z%QrɳeU;חF^CFܳ$ۃnta_gYIdoRY[]QE}mQItpD=H:kQ =JBwS6sn3:s qk?{rẒ6uꊎ)tL"C:x|֋.c+ [&6Q)박̱92J4-UܐUpa bn.l2- [Pyvsv(T."Bֵ~cU(:bI#Zpc]75GUI.k+-ikapĎq3sX;aY{X|:ӱw>Nza-h#v}40anjR`K)pNt.WZ.ӖXrSb@8a6İ@4ǎ d>maTfg̫4ě<3R̶4$}ff3c7s~ :-lͬX4rSW7FViSF jam`Z+QO(tÀ02 T޺Z] A1cAbWKdjm&dG1uiw6EM4D(.֛4<{zZ PTV\HpSEi })Z(r ]4~Ëpp^O4Y;K}<;UX+[$"\Iq/:7;=)L>S*{_?YZىAGx;pyD`.h/h\!\Bi'h /'::h ӑ)j~y$N^\p|g8H;cesK1Oq'x{ ZzeW=oHK0O刺?S|(=?yzqxW/k=Uoo/ߞm~tw^,ȒkL>J/G\K3Ze(LͲV"(e18).Ak1TQpz-x|~` K4kMt~q65 WЛM/77khz2 @_5J9lMj@QZGc0Zr&=.nlpv:Vw02sFs2 (Y~SB9i=?Y8o@0O ̟?^xs2\HNdHwWsɒ=B+QX~~5[  z EɃ]!|J͉2ܫ+2޹ok$jT%TDTr?-ڛY?< ]`7openscad-2019.05/doc/OpenSCAD-polygons.pdf0000644000076500000240000034075613402025764020565 0ustar kintelstaff00000000000000%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xݜ[uS 9rHC;!%ȟ_?G 9p4\{p\w.w/^}t놿kk秹~~_򃫿= CWy(y*\?gWvb8eNWapRv]I3 5_R]U_ߗZI/)hK rڒ-֖%mIA[A(h.C}' .r_zeC.nz/<4ǁ~f/Ԫk׌ssx#}}nht$bz,H2XQ@#Ʉ_ԯ_c.4^AkOMJ]ڦsLQ.g\/ 3veejgP&5 [ 2/U?Nݼ|gs?Uk P!2Zk^Ň~;p; '=_Z z_ZL5Q}_o<)7}Z~py|. mMŋesÿ}o-p|nYjG'CYiru7DjPlyo`m˜M@'6 ˕ފ ;B} ( H+/O]nQa`-i' tQ%.țF2DX! Z4"|PmW{u}ջj_g? SyZ%!_(@6hφvkߚaY3-¤om?"=FގOCEi3Dv]{A_#GG|#)G3z*΂=9f\Bt}{%1t5O|뗾 (o}*OoS ~a|TmՑ Vp͹ibvQI-zP tzJ:& 1jAcI%]>= +X?DV% SZC>~̏M>^ 9_{AuCu`Rdt)jS?ezEz&}Oeo<M<_/yަߪOvX OՈZ=YR9Am1oLt\u̅DAXL|di;$7\V`iɅ [$G|CqRgil-OvotLG5%٨A/q'6x?2-/.ЎwRKs2iaGZƺ2/}_ =h&p?kܘh[bBg$u- TM>x"mU\T$+0Fg;Nrlz8H;"VϠi ^oʩ "YĀp@kw;{l.]7b^ˁ=Ƀټ0]1[=enF/AG)xhMC akeY ; $#a?#glB0{*c}*DP;{<ʡYv1f`<#̣5,͗ Qx9p#>=1S,=ܰm !@+b9ZV'S. 6)oYyvfwh:)*ĵt)<dUXP tEWȖq=w1[VY>b mJ-{Twښ.m=XU; RrkP`fiY h=ʶ CmF6 *q馢!0Mibd}%")Jj۽2/~-b;ٗg,xz~ŞP;,GW|*U߁ۆ/!7%tl1U`ʈ/m 9PY/Pws069kάBE)TLDi{?'soi%Է a/%ꢓV땥fIF̡lɭC[j[osLh.*R+]Q*'f 3}Ҥ_CzUWSR\u9e ^l7l&}=Q0ϬhIMU -8Ia%p`P$]|'ieiR #0q2A#|, }@"[$|)AaJx\ϧqۚ2f<"s7O\vBxo <~8Qs@ <^| 6Bm x/ _![L@ e97Zfϑb||b[˟kqoXU&^01Mz,*̻ę07޳-@GUɷdbi0X"Y?on,D@=y`8=aaHQrYA|o>sbI<#VVaܵͨ AFEϗrՀy/j@C=H;f,)Пm؃:ڑ֧AyyAޛRp4d{ ŒQozS3iRՍpYJ}HFckox޵lJ {@lǞg6? %募Ns[q#nVL&e'oc>KVVZ,pmV uBfDipv12'y E<q'AZY\(heb@,%m)H?}Pˑn'b1ϻ󯞽&)ѳDO0smbTv6>S&_diA ("+Ҳ,jkO\2. NTQJ5pRlYרMTb+҈,3vx*QMsqZ:9?GJOR*K"~M7 F/Zz(&8;VdkB/7 fAceaf&`M/\肛q6](U4m-)U9hvJ_Ri>7Ӕ]hb5b~lhdt r].sxx"'&PpϦ2evuR%R 'JTޥk'C+r}٤-jֵ7X{Vy:X]r:REIʰ1`XM nNC.LU2A6"JM-y{9T@*㬖}rZbzW J@GgіsjD]pىʌgTI >[B@neFj- gj !i2E4e;w%\8+⃥T mBY8 )!i킧Uw^K$%TU93&q؅r'uLI8ua8J ͂Qٯ֐xp܎wDQ< Gw3 ]#b6}my2ğ q~Ȭx1vV(m,4qsʱ<3%2GWET|~jrjϋ5l1 /Eoa\4 >ഷ. w}O}`2m\# c9tvS ci"?čK$#f{8w,1 q6?809 ^pVsCHs=\Tİży}uC ]ȵ2 *XI[uHH='1w .Ra>n (u|~9Q2w&/&ڹX {3@$3VxZUͧ8 C8幯uy[j1n{'c t3c# ~K)%oc %k"p`v0"}DODq tS'60 rP:[!4U_}H~?Cp endstream endobj 5 0 obj 6054 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 943 1289] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 122 0 R /Cs1 7 0 R >> /Font << /F1.0 123 0 R /F2.0 124 0 R >> /XObject << /Fm35 110 0 R /Fm24 77 0 R /Fm13 44 0 R /Fm29 92 0 R /Fm15 50 0 R /Fm34 107 0 R /Fm20 65 0 R /Fm2 11 0 R /Fm7 26 0 R /Fm37 116 0 R /Fm26 83 0 R /Fm31 98 0 R /Fm17 56 0 R /Fm1 8 0 R /Fm4 17 0 R /Fm10 35 0 R /Fm3 14 0 R /Fm23 74 0 R /Fm28 89 0 R /Fm19 62 0 R /Fm22 71 0 R /Fm11 38 0 R /Fm33 104 0 R /Fm36 113 0 R /Fm25 80 0 R /Fm30 95 0 R /Fm16 53 0 R /Fm5 20 0 R /Fm9 32 0 R /Fm12 41 0 R /Fm14 47 0 R /Fm38 119 0 R /Fm27 86 0 R /Fm21 68 0 R /Fm6 23 0 R /Fm18 59 0 R /Fm8 29 0 R /Fm32 101 0 R >> >> endobj 110 0 obj << /Length 111 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [192 1086 304 1144] /Resources 112 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T04R040S044R0P(JUWSH-JN-()MQ(34T0BSs=KS6=SC\.}\C|0 endstream endobj 111 0 obj 84 endobj 112 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im1 125 0 R >> >> endobj 77 0 obj << /Length 78 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [469 71 593 129] /Resources 79 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T01T07T042Q0P(JUWSH-JN-()MQ(242V0BSs=K3=c3sK#\.}\#|y endstream endobj 78 0 obj 86 endobj 79 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im2 127 0 R >> >> endobj 44 0 obj << /Length 45 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [117 404 270 462] /Resources 46 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T044W010Q045V0P(JUWSH-JN-()MQ()35R0BSs=Csc.=c3sK\.}\c| endstream endobj 45 0 obj 86 endobj 46 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im3 129 0 R >> >> endobj 92 0 obj << /Length 93 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [187 686 299 744] /Resources 94 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T00W00S044R0P(JUWSH-JN-()MQ()34T0BSs=S3#.=KCK\.}\| endstream endobj 93 0 obj 86 endobj 94 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im4 131 0 R >> >> endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [121 330 274 388] /Resources 52 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T042T066P045V0P(JUWSH-JN-()MQ()35R0BSs=c3.=c3sK\.}\S| endstream endobj 51 0 obj 86 endobj 52 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im5 133 0 R >> >> endobj 107 0 obj << /Length 108 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [181 1157 315 1198] /Resources 109 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T00T0445W046Q01T(JUWSH-JN-()MQ(36V0B=KS#6=sS\.}\3|! endstream endobj 108 0 obj 85 endobj 109 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im6 135 0 R >> >> endobj 65 0 obj << /Length 66 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [303 71 427 129] /Resources 67 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T060V07T042Q0P(JUWSH-JN-()MQ(242V0BSs=3S&=c3sK#\.}\s|q endstream endobj 66 0 obj 87 endobj 67 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im7 137 0 R >> >> endobj 11 0 obj << /Length 12 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [377 686 500 744] /Resources 13 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T067W00S042V0P(JUWSH-JN-()MQ(*I9LBrgK>д@b` endstream endobj 12 0 obj 79 endobj 13 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im8 139 0 R >> >> endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [21 827 173 885] /Resources 28 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T02T02W045R0P(JUWSH-JN-()MQ(I9TBrg%K>Ь@: endstream endobj 27 0 obj 78 endobj 28 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im9 141 0 R >> >> endobj 116 0 obj << /Length 117 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1 1213 134 1288] /Resources 118 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T0T0424V046V07U(JUWSH-JN-()MQ(J!P TCrgK>WB o endstream endobj 117 0 obj 74 endobj 118 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im10 143 0 R >> >> endobj 83 0 obj << /Length 84 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [132 598 285 656] /Resources 85 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T046R0P045V0P(JUWSH-JN-()MQ()35R0BSs= 3.=#3C\.}\CC| endstream endobj 84 0 obj 86 endobj 85 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im11 145 0 R >> >> endobj 98 0 obj << /Length 99 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [819 0 943 58] /Resources 100 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x1 W C Q!LED 2VKn)ϻh{GMG ^" #A΅4< endstream endobj 99 0 obj 88 endobj 100 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im12 147 0 R >> >> endobj 56 0 obj << /Length 57 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [121 245 274 303] /Resources 58 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x1 vON~.l29`"*D/kۂRe<&l Tczo?Q` 핰f> >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [55 908 130 984] /Resources 10 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T05U4P07U07S(JUWSH-JN-()MQ(*!(34THU54r/M endstream endobj 9 0 obj 78 endobj 10 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im14 151 0 R >> >> endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [368 917 480 975] /Resources 19 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x1 vON| .l29`"*D/kۂ=[82 5a~z4lz!xҽʱC̃ݖ-M endstream endobj 18 0 obj 87 endobj 19 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im15 153 0 R >> >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [127 497 279 555] /Resources 37 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T042W04W045R0P(JUWSH-JN-()MQ()J)P%D)PWrgK>д@auS endstream endobj 36 0 obj 79 endobj 37 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im16 155 0 R >> >> endobj 14 0 obj << /Length 15 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [183 917 295 975] /Resources 16 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T00V44W044R0P(JUWSH-JN-()MQ()34T0BSJ c=s C.=KSK\.}\.@#ÃI endstream endobj 15 0 obj 87 endobj 16 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im17 157 0 R >> >> endobj 74 0 obj << /Length 75 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [128 0 281 58] /Resources 76 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x; SYN*kC(LD~2J{GMpA~n{1:dyKV9 endstream endobj 75 0 obj 88 endobj 76 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im18 159 0 R >> >> endobj 89 0 obj << /Length 90 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [132 643 285 701] /Resources 91 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T046R031V045V0P(JUWSH-JN-()MQ()35R0BSs= 3.=C3\.}\CK| endstream endobj 90 0 obj 86 endobj 91 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im19 161 0 R >> >> endobj 62 0 obj << /Length 63 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [128 156 281 214] /Resources 64 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T04P045bcS Tp<ԢԂL2S# 45337363TH52Pp9C endstream endobj 63 0 obj 86 endobj 64 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im20 163 0 R >> >> endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [305 0 429 58] /Resources 73 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x1 SHKKM&gCLD9*܀YR~@b+ }/փzb?"2% endstream endobj 72 0 obj 88 endobj 73 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im21 165 0 R >> >> endobj 38 0 obj << /Length 39 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [441 497 594 555] /Resources 40 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T011T04W045V0P(JUWSH-JN-()MQ(*345R0BSs=&=S\.}\##|? endstream endobj 39 0 obj 85 endobj 40 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im22 167 0 R >> >> endobj 104 0 obj << /Length 105 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [181 1176 315 1252] /Resources 106 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T00T0447S046QRE y Eɩ%9 E u @hn Ңgij֦'r{+ k; endstream endobj 105 0 obj 84 endobj 106 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im23 169 0 R >> >> endobj 113 0 obj << /Length 114 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [17 1095 118 1171] /Resources 115 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T04W044 f E y Eɩ%9 E e hTiRnig Ԑkd4/ endstream endobj 114 0 obj 82 endobj 115 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im24 171 0 R >> >> endobj 80 0 obj << /Length 81 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [377 598 500 656] /Resources 82 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T067W0P042V0P(JUWSH-JN-()MQ(*I9LBrg)K>д@cWU endstream endobj 81 0 obj 79 endobj 82 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im25 173 0 R >> >> endobj 95 0 obj << /Length 96 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [469 0 622 58] /Resources 97 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x; Sm줲6DT_'SQA.@Ah+N%#ͦ#A } T90]} endstream endobj 96 0 obj 87 endobj 97 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im26 175 0 R >> >> endobj 53 0 obj << /Length 54 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [298 245 421 303] /Resources 55 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T0P021U042V0P(JUWSH-JN-()MQ(*I9LBrg9K>и@t endstream endobj 54 0 obj 80 endobj 55 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im27 177 0 R >> >> endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [606 917 758 975] /Resources 22 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T030S44W045R0P(JUWSH-JN-()MQ(*I9LBrgK>и@t endstream endobj 21 0 obj 80 endobj 22 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im28 179 0 R >> >> endobj 32 0 obj << /Length 33 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [303 497 427 555] /Resources 34 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T060V04W042Q0P(JUWSH-JN-()MQ(*342V0BSs=3S.=S\.}\#K| endstream endobj 33 0 obj 86 endobj 34 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im29 181 0 R >> >> endobj 41 0 obj << /Length 42 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [293 404 417 462] /Resources 43 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x1 vON ?.n29`"*D/kۂ -5iXSyD=!btd{5d=bĒYb2I? endstream endobj 42 0 obj 87 endobj 43 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im30 183 0 R >> >> endobj 47 0 obj << /Length 48 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [298 330 421 388] /Resources 49 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T0P066P042V0P(JUWSH-JN-()MQ(*I9LBrg!K>и@rv endstream endobj 48 0 obj 80 endobj 49 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im31 185 0 R >> >> endobj 119 0 obj << /Length 120 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [1 1194 134 1234] /Resources 121 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T0T044Q046V01P(JUWSH-JN-()MQ(J!P TCrgK>WB  endstream endobj 120 0 obj 74 endobj 121 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im32 187 0 R >> >> endobj 86 0 obj << /Length 87 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [378 643 502 701] /Resources 88 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T06P031V042Q0P(JUWSH-JN-()MQ(*342V0BSs=c#3.=C3\.}\cc| endstream endobj 87 0 obj 87 endobj 88 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im33 189 0 R >> >> endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [128 71 281 129] /Resources 70 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T04P07T045V0P(JUWSH-JN-()MQ(25R0BSs=3sc&=c3sK#\.}\c|, endstream endobj 69 0 obj 87 endobj 70 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im34 191 0 R >> >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [370 869 482 927] /Resources 25 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x1 {_/Nr6vRYBa"*D/dڙ)(OQ6\k1=﷟Gӈz2‚d˘ ?đM endstream endobj 24 0 obj 87 endobj 25 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im35 193 0 R >> >> endobj 59 0 obj << /Length 60 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [305 156 429 214] /Resources 61 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x; {ONo]ކN*kC(LDL;3-j† rM5h6` AJu3bdm~< endstream endobj 60 0 obj 87 endobj 61 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im36 195 0 R >> >> endobj 29 0 obj << /Length 30 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [12 686 165 744] /Resources 31 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T04R00S045V0P(JUWSH-JN-()MQ(25R0BSs==KCK\}\cs.|y endstream endobj 30 0 obj 85 endobj 31 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im37 197 0 R >> >> endobj 101 0 obj << /Length 102 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [643 0 795 58] /Resources 103 0 R /Group << /S /Transparency /CS 122 0 R /I true /K false >> >> stream x+TT(T031V0P045R0P(JUWSH-JN-()MQ(*I9DBrgK>и@v"p endstream endobj 102 0 obj 82 endobj 103 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im38 199 0 R >> >> endobj 127 0 obj << /Length 128 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 202 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 128 0 obj 115 endobj 147 0 obj << /Length 148 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 204 0 R /SMask 205 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 148 0 obj 115 endobj 141 0 obj << /Length 142 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 207 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 142 0 obj 137 endobj 133 0 obj << /Length 134 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 209 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 134 0 obj 137 endobj 189 0 obj << /Length 190 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 204 0 R /SMask 211 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 190 0 obj 115 endobj 183 0 obj << /Length 184 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 213 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 184 0 obj 115 endobj 157 0 obj << /Length 158 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace 204 0 R /SMask 215 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0p70J% endstream endobj 158 0 obj 106 endobj 151 0 obj << /Length 152 0 R /Type /XObject /Subtype /Image /Width 75 /Height 75 /ColorSpace 201 0 R /SMask 217 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om /@a 0` 0` 0` 0` 0` 0` 0` 0pA endstream endobj 152 0 obj 97 endobj 177 0 obj << /Length 178 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 219 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 178 0 obj 115 endobj 171 0 obj << /Length 172 0 R /Type /XObject /Subtype /Image /Width 100 /Height 75 /ColorSpace 201 0 R /SMask 221 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Omo@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` <W endstream endobj 172 0 obj 122 endobj 163 0 obj << /Length 164 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 223 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 164 0 obj 137 endobj 193 0 obj << /Length 194 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace 201 0 R /SMask 225 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0p70J% endstream endobj 194 0 obj 106 endobj 199 0 obj << /Length 200 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 201 0 R /SMask 227 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 200 0 obj 137 endobj 137 0 obj << /Length 138 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 229 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 138 0 obj 115 endobj 145 0 obj << /Length 146 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 201 0 R /SMask 231 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 146 0 obj 137 endobj 149 0 obj << /Length 150 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 233 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 150 0 obj 137 endobj 187 0 obj << /Length 188 0 R /Type /XObject /Subtype /Image /Width 133 /Height 40 /ColorSpace 201 0 R /SMask 235 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` 0`y`>X endstream endobj 188 0 obj 92 endobj 181 0 obj << /Length 182 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 204 0 R /SMask 237 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 182 0 obj 115 endobj 175 0 obj << /Length 176 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 239 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 176 0 obj 137 endobj 169 0 obj << /Length 170 0 R /Type /XObject /Subtype /Image /Width 133 /Height 75 /ColorSpace 201 0 R /SMask 241 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`t endstream endobj 170 0 obj 153 endobj 139 0 obj << /Length 140 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 204 0 R /SMask 243 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 140 0 obj 115 endobj 161 0 obj << /Length 162 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 245 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 162 0 obj 137 endobj 155 0 obj << /Length 156 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 201 0 R /SMask 247 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 156 0 obj 137 endobj 197 0 obj << /Length 198 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 201 0 R /SMask 249 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 198 0 obj 137 endobj 135 0 obj << /Length 136 0 R /Type /XObject /Subtype /Image /Width 133 /Height 40 /ColorSpace 204 0 R /SMask 251 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om( 0` 0` 0` 0` 0` 0` 0` 0`y`>X endstream endobj 136 0 obj 92 endobj 143 0 obj << /Length 144 0 R /Type /XObject /Subtype /Image /Width 133 /Height 75 /ColorSpace 204 0 R /SMask 253 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xЁàSPa 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`t endstream endobj 144 0 obj 153 endobj 165 0 obj << /Length 166 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 255 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 166 0 obj 115 endobj 125 0 obj << /Length 126 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace 204 0 R /SMask 257 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0p70J% endstream endobj 126 0 obj 106 endobj 131 0 obj << /Length 132 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace 201 0 R /SMask 259 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0p70J% endstream endobj 132 0 obj 106 endobj 129 0 obj << /Length 130 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 261 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 130 0 obj 137 endobj 185 0 obj << /Length 186 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 263 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 186 0 obj 115 endobj 159 0 obj << /Length 160 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 265 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 160 0 obj 137 endobj 173 0 obj << /Length 174 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 204 0 R /SMask 267 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 174 0 obj 115 endobj 167 0 obj << /Length 168 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 269 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 168 0 obj 137 endobj 153 0 obj << /Length 154 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace 204 0 R /SMask 271 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0p70J% endstream endobj 154 0 obj 106 endobj 179 0 obj << /Length 180 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 273 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 180 0 obj 137 endobj 191 0 obj << /Length 192 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace 204 0 R /SMask 275 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x  Om7@a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0` 0`e endstream endobj 192 0 obj 137 endobj 195 0 obj << /Length 196 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace 201 0 R /SMask 277 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x1 Om @a 0` 0` 0` 0` 0` 0` 0` 0` 0` 0p10R) endstream endobj 196 0 obj 115 endobj 251 0 obj << /Length 252 0 R /Type /XObject /Subtype /Image /Width 133 /Height 40 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOjǷݥ[n;F22&S qpcЅ( b ( ۀHp dGYe.??'}"J+ !|T@$|_bKc*ACbD R, cbBE:=Ta:R)[  U4c0g UfCH #ARz[eN_q:y5)@PPt5=^ش{M.P@ @0Jo]m@o6_m֫XAB"%F+7PtRTBɰ5spxr6p𜫆eĮQkij%lRO uV%CK5 g{"#Wo`3Ujt$sI# Ԝ JN.,feiav"y+yB} 6df~y-Mfmy~5ݗ uběk`]fa䢛ԑJcuGac3|t#;/H gS󟳹ಽ~JuqrOR b,䋹Or?a3܋`@O%xO0|h5 sD?xzF6__?p4ko]36^ZK;W} h'; 'gҋW`q1=3xҬrx=KOϾKx26?n?0T>X|Yj6gcX玨 rp5x7c n F@c ޾H6o3hLMMwΙhxEP)P댜wkT3@Z,?@E,\aS۪9VG$Pjte+aòBQ {k H0 (Քui-Vd-r! @9@ E!%E>#9s!)Ea# endstream endobj 252 0 obj 1038 endobj 259 0 obj << /Length 260 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혱k`Ԙ4R& JjBHt$xS&!)Z uA)q%iq8w7d~O( A;@q oEp APt ( 18u5î`q(".0Fl:+bI!bAȦYt[Ʌ!#hērVW΀k(M`0~{nq8yo-|;oJE,bd2-H; 5TI[u3).+VԦntޥ ˞5Z// +nZvcm5ER4{~PVۆuG o+hBf?@o/B k;@&{ꍪ3ćJ2GŚֱƏhCP=.՛FNf30dft̮$e^ F/t40[rY˴oϯ?xz֙vwF% &7''`TQq;<!|zw|FoekM>gڧ[M+ * (@kLZM͋(#+Ƀq_c!zǀ-\h#`0[Ɛ6Է[b ߖzֻV endstream endobj 260 0 obj 696 endobj 241 0 obj << /Length 242 0 R /Type /XObject /Subtype /Image /Width 133 /Height 75 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xZSWu] aߢmTZ$ƈb:1Q6v1A;5Edk˲x~a/=oX\ Az8x<Pp`p( B$@ 8(D+WT8x+HgY 2:AG& I`0:Z%s,8F@&Mfs.DM9DmLB \T œ)FsaI&,奅_eh! b:1#jomZ[m u7\"@).F' ,u{]=ξGR_UmPD|F Kƶ}O\0lLJ֯z4,%b)fKcc`lr=7?? ֳS??r`KMXX,ks ML/,oagǝ,R%ţ &s`½&<o^ v5W&K~j?>Ãn/Lܫ/ɼ!# B3l|rCDy]MeY.vL{pt|B w>9:zVfFR&!Rs,vǨ{ų~߷[r""e] 'Mbul1]"&e_r+!*5P|O#?p27.߽`B'&pt.cF-^|݁ w{kmW[򶣂.3k偋_*7Y-yt@;'߬ś /ҟTOC_fP1r54\$? x(L<{a)6B&D`o~nLt?n$Lә P.n.olvhٚnߪ,3&%E@0J%ĺLS^QIYyyDRyʕ!%ݘYƌ$Rr=5 Uĩ7HCI괚xzj,j$8?!p!+'@sR4P>.Y BIꯓ顆j"535 `(^/) endstream endobj 242 0 obj 1350 endobj 277 0 obj << /Length 278 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xS[YveecuyF!IJ`\4-)#fRp;ePmktVͮs`羹|^9{*X~:$0 A !{QHp &} m1BJѴ))m+f hU65Zueh xnݐňF7-V 6ܨW+CeC7+fqvz%û#M1Ju`trVQP|٥`kzG0=õ 4!UU"k&ǣS~ESKaNFdd"uI%&/GNzF Cv^6t[\~Źp@讚-mbso`ȿfc,j9QQ3ZދWg U0 KW/i5/߮~\շ/LJf]-Y38wl˧wGCP '͍o-&\KE-IY&|𼰶o0|X+<;TVf檮fT埫6W͵Un}YsA(#mBc3+WWgBm zG{Hޓ|qmO0O%F03?𾸒ܾ~)NzN\(/B>hąfOP> stream xS[YveecuyF!IJ`\4-)#fRp;ePmktVͮs`羹|^9{*X~:$0 A !{QHp &} m1BJѴ))m+f hU65Zueh xnݐňF7-V 6ܨW+CeC7+fqvz%û#M1Ju`trVQP|٥`kzG0=õ 4!UU"k&ǣS~ESKaNFdd"uI%&/GNzF Cv^6t[\~Źp@讚-mbso`ȿfc,j9QQ3ZދWg U0 KW/i5/߮~\շ/LJf]-Y38wl˧wGCP '͍o-&\KE-IY&|𼰶o0|X+<;TVf檮fT埫6W͵Un}YsA(#mBc3+WWgBm zG{Hޓ|qmO0O%F03?𾸒ܾ~)NzN\(/B>hąfOP> stream xZOg;88@ /|1JՂ6/&#i-JVg8YQRT6pSl3Y3vwP~{?B.𼟻#P -0*0!"9**E!%I.d2R*!D8(RKHERMi:j(JTȤCb"Pi&Zkj- :R.,Rg^n;.\.PGjYRowz:n|.X`v^B R-P f֝@0P0xvw{RHp@Ie~ >xP6gQ-'D0B57^FǠbԣ@N+@ 'Uz(d.Rry"c͖+&J&:;T,Xpdz!V &6~ZD:NA)$*5n_`Br}U:مLˍ@wsRI`rpt.kzo =l6{mc)hj4ߙ.U=w'Ww=ѻݗk}m(')t87OlX7go?Sa[ NZ#Jȴ%chؿ.~fA˪- auBL#CDIԼ&q !qO*VR Ip7tkt{%QHN>' PT'x%=+ ^ |OJ@zoQi @NeH*/9 Ω@SO©y)DC;gQ<+8:c>_rX7?^6L m_M~*+`mC}Kϗċxywy_O.,HXY sFmm_#S ͭmy"w7L4Թ}s'?q6'? nx$:Y V!Ti[7P4Qk(Hl.\.ꇜ.E&!Vu%Mb*drRddN Fo455H~~:@ &&Ie$a`& E<u endstream endobj 254 0 obj 1176 endobj 255 0 obj << /Length 256 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홿k@͏k&&DC,*J]":ei"S*"-uH;HA Rͫ}{CY݇rq=퇃vT$ 89:I8M1 (aYe @1t 聃( n1 f]Ba{EҦ{?h!$9D$%hU6NRC J< E8L*Rl08seRZQ˗t< ث sEIk77Z]-]d&h^t5] ΝnhRZDީ1qxDN՚zgp\B:r`鏤J`< G8OƃިRլ;dZc<9fiktͪWzqXa2~Wj6*Ԝ+[c8}{_zF% W՜NhX}lZFf{5~bbL >7|2jŤ챟l0昖ښn-o沚x(:nx6Fwgn\n6t a0AB!L m2Rdt+.D7`} endstream endobj 256 0 obj 640 endobj 223 0 obj << /Length 224 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xSRYǹ{Opy DHE0-H\Y&7҆p2#ʌƉLׇ5+173-'þ9w>9/2G |A30 AAL($)H( N iT rTLSA0"Qiu,xuZQJi O#I 7%1 tjDƝ$\e6{<KMzMN"5Y'gWo)`hEu5ξkiLѭ+V}nR.Er>o~dž7VTs9<7/67Hɶ B)[R?|9_X}7{e3͕ҪIRKŬjRnd}Ԓv1+Y_)]J&FWJ-iS!T=t٥O߶v靃\:sڗ 471:,/Lz?r푪SE&f/\H8pOzoRMQg`٫wy;?=uC|OHՆc]ׇ7S5k)W 3tt$[ޜ DJy Νp_aѫ$7T/nwv_ Hqn ,p:{ +bc$G[h \ir6,EJ.¹1&Pcr[&ZEz]&E GqJ`t`|*Q_\%Z>'E"UR1RAR,o''(Eck_D]jg (|S%g\ $ endstream endobj 224 0 obj 1131 endobj 227 0 obj << /Length 228 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홽kP1IUDC~D(uq蔥NZtp PDA* k7W-{{s3Yp~y 9pg/pHlS!Hy4I8}u3H@ r.Hp, a8(=>A ss }d^ K hD giSl*1М[HrL'S'H%JLg`8In1$+t6W( P,"D7KpB8ɟUjZU33`EP7 'NjCl!кj4!ElyQR2zUEyz녑/{}c0S͐+o׮N#saۭm/kyyYKZ_v^VmUee-k_cyFu><y*hT;L1$}v~{K'$k endstream endobj 228 0 obj 664 endobj 211 0 obj << /Length 212 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홿k@͏k&&DC,*J]":ei"S*"-uH;HA Rͫ}{CY݇rq=퇃vT$ 89:I8M1 (aYe @1t 聃( n1 f]Ba{EҦ{?h!$9D$%hU6NRC J< E8L*Rl08seRZQ˗t< ث sEIk77Z]-]d&h^t5] ΝnhRZDީ1qxDN՚zgp\B:r`鏤J`< G8OƃިRլ;dZc<9fiktͪWzqXa2~Wj6*Ԝ+[c8}{_zF% W՜NhX}lZFf{5~bbL >7|2jŤ챟l0昖ښn-o沚x(:nx6Fwgn\n6t a0AB!L m2Rdt+.D7`} endstream endobj 212 0 obj 640 endobj 237 0 obj << /Length 238 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOaǹos (#+1$[&t~)ˬ:7S,isjtaNN֕ں/{syAP ph_G H\ HE@Q14:I3DUeDe@ ҤpiZZ.UNJHC#C)9tc yƜ,VЀA g5:jAvR`T Ïf5zYS{ W]WCp4J gݍ;^8t{n6/Y2ζJ.Rnnz;0b>Yp4`W{pdlb /|zDžlgP,1̛;(rM:1EΖ{C˫4zQWnP'H )yvwۣQp6.N u]d#t.;0 {ȃj!!OM wLW6C{P^_ysY7W6?}=<~hc)0qr"A2 MgֶNNapr|uynf'T5s#L\3q RK*?; *N ]|DZGSrga` WcF\Ј8p,iitW͆(#UJ@e'y<)glJv:r_@D̸ }?oo endstream endobj 238 0 obj 760 endobj 202 0 obj << /Length 203 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xS[YveecuyF!IJ`\4-)#fRp;ePmktVͮs`羹|^9{*X~:$0 A !{QHp &} m1BJѴ))m+f hU65Zueh xnݐňF7-V 6ܨW+CeC7+fqvz%û#M1Ju`trVQP|٥`kzG0=õ 4!UU"k&ǣS~ESKaNFdd"uI%&/GNzF Cv^6t[\~Źp@讚-mbso`ȿfc,j9QQ3ZދWg U0 KW/i5/߮~\շ/LJf]-Y38wl˧wGCP '͍o-&\KE-IY&|𼰶o0|X+<;TVf檮fT埫6W͵Un}YsA(#mBc3+WWgBm zG{Hޓ|qmO0O%F03?𾸒ܾ~)NzN\(/B>hąfOP> stream xOR{99<8pHM$es10,J4[#{hV&3fOˤ5M筼kK޻//g^}?oHKb RN$bPdr'eHhd,F2\&+%J\&EX* f Ta,fCN1>XVTVZ<(,' HqjOZmq6NXNK%Ya0"SR&^~ ;RogMRr:B}(x"}sFkh6S뱻QƮ z%&LJ$2!k]OSI>Ǣ}{H-zA4v3soRy373 t{I9ͅk;/ N̦ާ~)5;1:|YsQwLjy:x>.fo]5*Ur\ OK/޻*uD?yѩ+ͯ;Yy;5 z#<ij_!O]>*hy{(1qc{/lo|\N urb**CJ):|RPURMс૨j_E<|TSt *?[`h.CuStf۟I\ ;\{ޭmlw&G?h_y4OfmeaSɹ*xˋsΓ5=\c:p'22|z~<_$F"=4}DFunxN>~x{0wY dv%4S: Goމ'߹ ϸj:/h;C]t4sV1E0"W՜Pz<`8INWOrګ4c^AzSesNoq:91Ib#Tm03,kV2fM C"o0BER:=MW:T)G}T(˃۫ZEm˿6\NχK?UVD endstream endobj 232 0 obj 1102 endobj 261 0 obj << /Length 262 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xO}9B IKF0eP[i~aKm292*zZ=cY>d{z{=۳/gl>H$ @)i Ab1 # a~P0p&ھcr+@T4%'b2^ )aUNVSb1^l$F1Qj uf4JB0Z*:x}z܇]AŋIڻ=tws&IP|KhozG09ŵ؍54!1Jkm G&Ŧ61 7[UL49'×'w.IӤT` Bq[\yŹP[=/Rcm<[N̋t\gUSIhūKWrW٫uLы7zb_]ko_> UdYmtr>}O^O9{F.4_|66?y qE/DΚ\3ozxeb?VzoSjGUJ5W6v^_zoSjGUJ5W6v^_7.y $}~^[} ~w28[{=7~z.poӰN#trz57ϭo_9m<'.Zxd@6~pk MP<7rc6J tj%9{cA}"U֞h,1\ZRr>U,%B0ɛOHoN:v=KaH~{td8zeWÑǽj1EbWZ φ> t=.Uh#iVkv4}\۱k|&Y$GC0*Ӭh55ᐫf6jXZ.C sHT :3LZ(HK$x1aZ5QFV34ԐxQ}8ART ($|bbJR R~(";Wug Mn›, ! endstream endobj 262 0 obj 1107 endobj 249 0 obj << /Length 250 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK"Qg/ykrT@0$CDf$Q[I" Elƒm쿶c /> p| AFD$l_2PL,qT* f[1Y..Z f.%!Mgmc0I FO}&5HFJ1Ȕ6`h>``$5J}2`.M Ԡ٠UĢ+`85X('= OPxr"8N;)AKX "{,Ė_EfB>eQ-_" 3 Sx" 7Sxt2Q\EFL6w@lfg}u!*}~`T6݁aJ\m7e-_\kP,+T_Z9)Mr&יG[BZ @WjZum_ M.n~sqV:M╗:揬5Z?f~ '3wz2 d+M+zl/+ŃT4'AٰM^lT^l&/6*k/n6l57 z_M|玦/xzkܤ3̙L\ʗ\ P3%["wܷkk:99_{XA0= j|*p=bez~TyG! endstream endobj 250 0 obj 766 endobj 265 0 obj << /Length 266 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOgǹN;8rD\A-ĩTV#1jյenŚZFͭkvZfý~{'yy]r["@rha) R (8!jPVP֪5ZJu-IeB$E1TS:db2t$0Vgb՛N6ٝ jeq WazJUV~')}qwz>t{=np L5X CA z;F#E( %z;tDl8谿 YA2ejn?wq$7sI%n~4 w9i]-`R̙D`m#%xo?ˮ,܈}tDpy]X]Ͻx4XKM Yu$К['O|&˭Lmӑ_ef^&R;CʝFm(^ojuUu_E _<;.DZ ųBE _<;.DZ ų&+7{ǡ}v3aǷ;~xN%c\6ڻ>ۼ--n Dnks#8Y|e* )V-,?^dɤܻd/ρ1n9= pZ"9;=_pBCi6/}rb^XGry!*3&@3G/yZm )4z;?^Ol)c9 [wIm=̴ux{noW{jd{K`Dn<( .l5? "Fer7,BC|\?$amJ]NP} }W[7[RN,l5Z)L(`]n8-Ϳq endstream endobj 266 0 obj 1070 endobj 235 0 obj << /Length 236 0 R /Type /XObject /Subtype /Image /Width 133 /Height 40 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혽kP1IUQT@RNYZJHKA]"RAT-.Ggɖ{X, ~6~Է XY$ Ǿ $he9!X)@~pP ǟ:\(a#qs }3L坢!6yD'Ҧ`89"JXW+pb_Vbt&/&ˤ1Ev"w h*{QR˕*l*etMEπAqN=/5фMJur]͋*zKmw`Ӿ[u\L)[ d9U>lzF745=vL, 8|dVp Ѹb2s (jOtdd[Z)\^BdK0z~/`3y=tK5c0y}[`|{ z9 W'81Wwt|_}9{wJ>wj|WٸiV mnտp̷Q:ք)HLLvQ '+$ΘHȢGOf@~b~S 迏#w/$/ endstream endobj 236 0 obj 621 endobj 273 0 obj << /Length 274 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홽kP1IUDC~D(uq蔥NZtp PDA* k7W-{{s3Yp~y 9pg/pHlS!Hy4I8}u3H@ r.Hp, a8(=>A ss }d^ K hD giSl*1М[HrL'S'H%JLg`8In1$+t6W( P,"D7KpB8ɟUjZU33`EP7 'NjCl!кj4!ElyQR2zUEyz녑/{}c0S͐+o׮N#saۭm/kyyYKZ_v^VmUee-k_cyFu><y*hT;L1$}v~{K'$k endstream endobj 274 0 obj 664 endobj 267 0 obj << /Length 268 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOKv^v7nA+-*ȥTbb Ǡ QĘQ o"REbM =*{3#>_f?퓙;y7?,1PF$a^b)qCo/!X%\I)J RJ9.#Š7c\M cØ:Jc8m Jgb6{&tw ĸRgM']m.0;\'^ŢaD" Cw()Q\cH yoթpbrak708|#v/C^`b=c}$C,ŧ`H=Ǣ|{H)6HIfoH,9=6 sH"E56o<Ϭ|ȂJf~:1~Qck]=5Y] /뫙W|6* s]ͭ6?zvZ3kҬ &r[vm+.=m &/~Z 'GCGY 2uK.}vN!ii69Ҳ_gJM][mmV+ivEU]jU+R9#ux3};ͤ^Vzy0F~_0l7޿y[SuF.㉫{Lz73 ˫u0dWf7ýMTe8rf 21zfq o^&'"gZTHB,?` 4~ endstream endobj 268 0 obj 1054 endobj 243 0 obj << /Length 244 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xKpǷMԖ$QdXAdFBJQq@%\`Wq$D,t=^OG7}k$"aA$ ~u>E1)N$ILCW`S.ZM_KIIΆ '*Z }F0V)HԍLI3O0 aۀ2m K2FodN7}ǹvvФ(eRIs4z3)0&'㜃555Fruu{3Rl hx&u\ڌ8MEb0lo&Ȕ5dR(bN:=C6Y_]yF@7Fej[H掋_P<6V.A-kFcr^pR|C|R%A5jK՘\kL/oeJ;R><1i .nj?P8+gvNѪZmR] R.Y_E[D:Z i>;hDJ1@$yP(_ꏿX] HP/1Z||c&66{j-'6\bs=]Oj.St Y؈cX@Gq3r򁣽=C qYqh?P^y%ڢXTZފJH@= V-!nT> stream xS[YveeseayRDҒ!aL2L2|`&GSZ9= &F eͮs C;|9{D}  Q0T*AQw!1J0 )E8&A]nHH0+%VZ*J"0 2R4: ZAQ1 RƻKLNZV:Cz٨ei K-F0f9kñV0s,MbBbW tCg#}` ;c8ZqXJ2}ѡؕ10\ EN6iR '(VowG&n&S!91nw,![j:WKw,M/,a!=[\ujZl3hi1^dC61v<'.ݚ{߁!>5v1ĎZ/]].|뗂>~GM* ΖĽ'`X[-K 8 JRT啯+OS#!QP%r %<ϯ?W$cg.+lS~U,{ors\v\ tk[M?{q}c ۗgݾz}>`t]N/d^ +`(_e^:j>J\lrf1"r/23sVm kM၉0<^6khᤉ` =rX j ėͻUZCj;`Y-7E 0 c8E3F`q5ٰ3iBN|8 J|0'I> stream xK"a?FI2aXIԋ +HB)*"1.DB6!$d"%!m2mۛ}j.^ywaAPՅ#0\DX,W$ q fXJJRN\5ɺaFpB,SNg^֪21C0B"W~u령_O{kFEZgbl~'u9l̐QKDhT:cg'Sip NM'X;cҩ(oJĸ)< gP|u3@0.p4 ; ; < dDžNZڼNZ$$ Q@ODHP@t :-!0ƁHe ]cןrHP8$Ik endstream endobj 258 0 obj 737 endobj 215 0 obj << /Length 216 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`! fbfVVV6,LLV-cae.`وO@HDDLL@LTDHa6n>!1IiYE%e%E9)qa~n6&hx22mWV7000PQ`e'#3;7#Հ 7{@H+:{P yؙɊsBC[HJY'$:!%=z #51&Z_UZyr&QEeUUŹ1An: ,0%l|" *ۺzڛ2c UX!iSPJ)8w򌙳fL+N w3הZ%$iY?cޒ˨,5&/JG^fw\~C׮@5v%vzbldQбK*i4oۨlXpjGEZ8uzټcn[-SdGTQ>(kƒuvO-w ge9H9?jn40Fs40-TG Bȴ2TTU@ ?ѵIV4}t1sеG+ty G;&@?}u2zDDZhÎo endstream endobj 216 0 obj 666 endobj 217 0 obj << /Length 218 0 R /Type /XObject /Subtype /Image /Width 75 /Height 75 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xSW) (BMh[-j$b21M(Q JGT!FjQ*__]>>fawsG9YY|A%ATomo}pv{y=zO\N6mT!E e3yR\zx}C/GID~A~jom5WhR3b`Q18zãɩ`p. / `pvfzj?:ͨOPLdwzC뱽3)ýzh㴛B&*HQnw LGvGͧ?3C8JD':r4ӛFy)a(ogSHe u{.B4 jpb\<ɤP_\kCm8|@\p}\$H`yc/.@S^t90r֋B|u%fa95A>(T^FJu ȀJFuYYb!BkFɦAL6+(@O/I%BfBlh3]`a ( `NjTkRC;SڹC>K{wBFXq<{g0=[ endstream endobj 218 0 obj 1963 endobj 225 0 obj << /Length 226 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x혿k`͏I4X5E%DbiH`)CKNE R]-{9|,/I'`?9$;pqv$IDZJGFfXۃ Dz M @1 ( >1 hHL'dx$R, <6:a9}uقG̬aZ9xy͋ӫfm]v\ZYs$#oH֊ٴ=?Gui59eH2ֵ};M1Vg.@LWvǾOgsx̦;6+y%`tR`Zb gㄸZ6.iq:/ՒqbB+ךWlz~j17:|g/(gNZd\eOQF`ɜ}m.~*.rl\ن2(7˶aI嚿0?|WқC{dHoшg΃vz 7{ĭm'A9>}S!mk?*]? endstream endobj 226 0 obj 649 endobj 221 0 obj << /Length 222 0 R /Type /XObject /Subtype /Image /Width 100 /Height 75 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xWRkEI@%AEQ1 SQR9izBQˡ,,ySq3ԜV~x {}_<ϖӿD8Le=77C=x<@r9zK"x#pe5ǣ$2JPA4N3. PFg)p X $h m 7&fs8.9;b1taV`pI>;Jg0Y.)\ E"oX,H/G""@q9lAR.D"s 3lC%Hd z:(_W(2_[xM㰙 +H肃5)t;_ Ƀ!a7QMLwۦ8xDGEފPTsg)dXRpx%~r24\#9^jZz^ʶ)++3SHOKKJDR Da$™ • 7]Jj>~n~AaQqPZf4+**m(/RYaIqQaܜ,}zjrRB|l:48@*$8t_K=,5V>yRWZZX_imMգ 0?7[/)>:\/dDBpx*/FI/6VV76x]gWWw&8DwoMo:^67VUg܍(`q&2x"yXYgM/;L]=}CFFF,H6!|6zghomzVm,Nֆ|7 ѶY$*[$M}G,SӟffgA"V4qjr2:b27rS2/'3A9'~җյusBQ}mmueeŅٙ1sOru 1A[:! M+iL/.- IWlO殶'q~@k;9卦MhM:>?<-Z^4w6?KT˅T(l\+i̭l@oĮ~t01(%J͡sZڤ45c#a_&jT荕9K tvve da7٥&}ѭC:fj˱PiαAScEn/8GI-j6 LhC [l8 . }c ۖtדJ g:W$W'dT7utO~πL4Y]bHlRXɗ%0dj2:>{:M*u_J%"T y%^6D X#cV(FCz;^lkixVSQQ W;IT&_եV<WUq!׍9x뎎ZU?*7g!">ꂷQ~Ј;{YYTb0Ry=`EmjllښGe@ g$D~B>SKcrbY2Lw4}&Ѽ? K--`%rs33%b"7~bY. !d*|dxU#5x&$&!ȋ(/`^ºip'6`>"͠"lG &$ ,_-JoZjQQ^We~R˓aDId w|D%R 1w +[;Bc=PXvX$xr@+°-8pcx !=FCo Pf8(5pc@@86@ q|+e (A) X-@i ?P?=`Q4L(R( GAeLX&el EQchdfmz; X*O endstream endobj 222 0 obj 2580 endobj 275 0 obj << /Length 276 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xSRYǹ{Opy DHE0-H\Y&7҆p2#ʌƉLׇ5+173-'þ9w>9/2G |A30 AAL($)H( N iT rTLSA0"Qiu,xuZQJi O#I 7%1 tjDƝ$\e6{<KMzMN"5Y'gWo)`hEu5ξkiLѭ+V}nR.Er>o~dž7VTs9<7/67Hɶ B)[R?|9_X}7{e3͕ҪIRKŬjRnd}Ԓv1+Y_)]J&FWJ-iS!T=t٥O߶v靃\:sڗ 471:,/Lz?r푪SE&f/\H8pOzoRMQg`٫wy;?=uC|OHՆc]ׇ7S5k)W 3tt$[ޜ DJy Νp_aѫ$7T/nwv_ Hqn ,p:{ +bc$G[h \ir6,EJ.¹1&Pcr[&ZEz]&E GqJ`t`|*Q_\%Z>'E"UR1RAR,o''(Eck_D]jg (|S%g\ $ endstream endobj 276 0 obj 1131 endobj 239 0 obj << /Length 240 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홽kP1IUDC~D(S,"8eh) .BiiA(RZ˅{s3Yp~y 9gO}xd$pf[|Dz Mb8~;Dq>(1R&00uMo4еAٍ <6^#rf_Zq  r`͋RPu3OO^Ղ"<?,ʚ1Ckt5C+䰟!> DSy6ϭd:7-5Ƌ ŕb|b>=^T!.irzszfz94RZ lEoX>:ilB>d蜍&>Ob2:4½y.fˇWؼ,gn'o߽`[^Bwrrjܼ%/7/g 8vYΪP! #B|y/BUTѨQwxyPݧbHڷ .}% endstream endobj 240 0 obj 666 endobj 205 0 obj << /Length 206 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xc`hc1FfV `Ĉl=bV6Nnn^nn.vH31sr  rq fdfUPPR PRTdC_DRNYMSGO&@_W[CUAF\l\"RJ&ֶ4V:r<L4PpM@P7jnA EsG਄Lڀp7C5Y>H3Ȫ8F$eUVTU[*IpBfWԱHɯhh jo)Ɍ p4VY) b_;yY43w֗fDxXhɉ@ kxFyKߌy. Xpκx?[=1^h:c4ɫ랶`h֮Z2{bKYj8;$p i[$5O|m[6Z8:3HEa_Riԅ7oߵ&`fDJBfdQеO.x]{ݳc㊹ n&jRG pڧd6P&d6hJ kی{Z@>s1\Os8:pc)74f 7Z0c 720 f:#00s# =U endstream endobj 206 0 obj 667 endobj 245 0 obj << /Length 246 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홽kP1IUDC~D(S,"8eh) .BiiA(RZ˅{s3Yp~y 9gO}xd$pf[|Dz Mb8~;Dq>(1R&00uMo4еAٍ <6^#rf_Zq  r`͋RPu3OO^Ղ"<?,ʚ1Ckt5C+䰟!> DSy6ϭd:7-5Ƌ ŕb|b>=^T!.irzszfz94RZ lEoX>:ilB>d蜍&>Ob2:4½y.fˇWؼ,gn'o߽`[^Bwrrjܼ%/7/g 8vYΪP! #B|y/BUTѨQwxyPݧbHڷ .}% endstream endobj 246 0 obj 666 endobj 209 0 obj << /Length 210 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xO}9B IKF0eP[i~aKm292*zZ=cY>d{z{=۳/gl>H$ @)i Ab1 # a~P0p&ھcr+@T4%'b2^ )aUNVSb1^l$F1Qj uf4JB0Z*:x}z܇]AŋIڻ=tws&IP|KhozG09ŵ؍54!1Jkm G&Ŧ61 7[UL49'×'w.IӤT` Bq[\yŹP[=/Rcm<[N̋t\gUSIhūKWrW٫uLы7zb_]ko_> UdYmtr>}O^O9{F.4_|66?y qE/DΚ\3ozxeb?VzoSjGUJ5W6v^_zoSjGUJ5W6v^_7.y $}~^[} ~w28[{=7~z.poӰN#trz57ϭo_9m<'.Zxd@6~pk MP<7rc6J tj%9{cA}"U֞h,1\ZRr>U,%B0ɛOHoN:v=KaH~{td8zeWÑǽj1EbWZ φ> t=.Uh#iVkv4}\۱k|&Y$GC0*Ӭh55ᐫf6jXZ.C sHT :3LZ(HK$x1aZ5QFV34ԐxQ}8ART ($|bbJR R~(";Wug Mn›, ! endstream endobj 210 0 obj 1107 endobj 207 0 obj << /Length 208 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream x홽kP1IUDC~D(uq蔥NZtp PDA* k7W-{{s3Yp~y 9pg/pHlS!Hy4I8}u3H@ r.Hp, a8(=>A ss }d^ K hD giSl*1М[HrL'S'H%JLg`8In1$+t6W( P,"D7KpB8ɟUjZU33`EP7 'NjCl!кj4!ElyQR2zUEyz녑/{}c0S͐+o׮N#saۭm/kyyYKZ_v^VmUee-k_cyFu><y*hT;L1$}v~{K'$k endstream endobj 208 0 obj 664 endobj 229 0 obj << /Length 230 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xSRi97 ǃ\N"$(.^0-X)brIgpKɌJ*3'2]/kVcnfZ:- N/{^-7y.7D9 |}!@t  AB!Д=+aTLPFPP)2&q ɺ!I i5ZDʝ6䴂l)j=\l*kX$N/9IF fkY2Q' 4=m%J^ث'?muUtj0F98rζS[Q+%+Vk9 "ף@\}t*prl`kqpȽ} vFIc77ƒ#O=Brb|txӢcfh"#S @|[W*I{ :D |arf ^$Dz4 9Oi?Zcm#>M>qnϪYbޭml}/LJ/w4Ujz|z* w6;FBi'z;a{stv9ìuN[o|r,sYò+)|혉P:u#u#/@X}=ցkZoݝYZ] ?'džzE{8>yJl|r5 ./NOFCglA)U'/ftr,q !SѶDi LMN ԖԒt2u|h`΃Ƣ`Vira\[ܧȍm [\6#ҭ=,cYM>0m- z5C #Vk9=3s@l?kq*-B#{R8Ϧ"ir%0<ǩUtg"Ѯ[LD02`0<+ߕé1q1H:3BoCFL% endstream endobj 230 0 obj 1081 endobj 269 0 obj << /Length 270 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK"aggX;-_HP՟~굫r0 8(w.|q.xq#mZ/7ܦxq#mZ/7ܦv_0&㻣ዧ4k47L)9S}|\i 5rߞfFoO'mNN^j0V=}񵷂=_Ϟbe{~T! endstream endobj 270 0 obj 750 endobj 271 0 obj << /Length 272 0 R /Type /XObject /Subtype /Image /Width 111 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xK"Q8·Zm)e*%.REEa,Rv!}@R`KH-k;~-Eg.<> stream xK"aggX;-_HP՟~굫r0 8(w.|q.xq#mZ/7ܦxq#mZ/7ܦv_0&㻣ዧ4k47L)9S}|\i 5rߞfFoO'mNN^j0V=}񵷂=_Ϟbe{~T! endstream endobj 248 0 obj 750 endobj 233 0 obj << /Length 234 0 R /Type /XObject /Subtype /Image /Width 152 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xOR{9spɣgbHR2 3M0&2|`Km]i=j5cQJu_'C_7ko>c|J9'AQXB,( { !0 ) E8&B=baEW3N:9[T]1NKBR34`irFFJ8!`T"YhirrᐣbԫXZ*A"Ijvb3Yʁ Q\ƪM+<@l0w;LjV?$,&ecHDG"{ ) (VkuuǦn& 956tY,!%/ЊFG[`4O-OƢmF-AJ#7fS˙Kd3˩G*-&n-< >Z5qۢf]/tv:R'>V/6Y=Vj!^|ͮ%yf_pl&t4535^B58g7l~__?; TTc[q_{U:We T/>5?_|^%Pk~*K5_Z;Bgo?ol`cgОeGg޼u_??=w!ΫF?|i ^= z5;#hG{.^]ʼ(_gf^9jDu.:=μ܋Lzn:zլ޹Ot[\~ŹPXO9&잓˓䝻 {'>2l%1FmvO#bqĮMG§N¶BA魭a EuZ::OButz[Ca{4*F3]nf)*B\ .0NL5 VԠS9-.rƵiN W5ZhԪzqZܪ)Es iruھOբ\)IpQ-U.hlalA <[@*K_! endstream endobj 234 0 obj 1092 endobj 263 0 obj << /Length 264 0 R /Type /XObject /Subtype /Image /Width 123 /Height 57 /ColorSpace /DeviceGray /BitsPerComponent 8 /Filter /FlateDecode >> stream xS[YveecuyF!IJ`\4-)#fRp;ePmktVͮs`羹|^9{*X~:$0 A !{QHp &} m1BJѴ))m+f hU65Zueh xnݐňF7-V 6ܨW+CeC7+fqvz%û#M1Ju`trVQP|٥`kzG0=õ 4!UU"k&ǣS~ESKaNFdd"uI%&/GNzF Cv^6t[\~Źp@讚-mbso`ȿfc,j9QQ3ZދWg U0 KW/i5/߮~\շ/LJf]-Y38wl˧wGCP '͍o-&\KE-IY&|𼰶o0|X+<;TVf檮fT埫6W͵Un}YsA(#mBc3+WWgBm zG{Hޓ|qmO0O%F03?𾸒ܾ~)NzN\(/B>hąfOP> stream xYgXͲM%Er$HHZҒsJR ""`D `}>ϝ}ݪکw`[v  2=ȋ{(0!I7RX) *$w}W #Y jw0R됂C@#` 1 /woa .V(B "rH7⇠!Ѓ 5H>n#6{vqEŏ`77}y'29,-׏&?^7 3]p3AΜw;W3=fWEp.FnaGk`jD^snƻ9A͡VDpwX>cSFm`rXHLvc@Ƃ  "m @i%pC4. @z!}N$y#G^@Bl#hȘ$%wCFBNg̿,vF^zQz믘hYZ@^43Hhm&Z ѩW"bT|wK ~Yor_DŽ}y;sQ i^Yi]cw_kY@#dd>:#s? @$r#.D_IwO@hE,Pj@ c`lpF2CAGA:'iP*@ p``̃%Mp"Bl$I@2CBP C)P@:*݁B#3hZ>C?`L 3\0,+ڰ l8Nsb ߄8< /PG1P(e.BQBT% u5F-6X4͋D~-A'%ZMtz =^AocNFc9Da1 ]8f2cEJX/6=mvcGso8 'SǙptem(nNࡐ0pH(DE1JbRRҜ҃221<&=: /Qb+Tw^R}x%?/7g ԺN9Q!-#!C#4D4F44I447iFi>R j:^}LLGI'LKFHWJF7IH/CoN@M!AA!a" u$b x8ψea4bebl`b\ab`gcf*edfF1 313273O0`bfd`2ʲɚ:M͏-;]ݒ=.2##9')iY9ː+ W/273/ww"GSs=/6?o1o '~|C|" zVy >R*/&,"l/|LExAUH$V^(ATS4DRVLYOذ8, #^*XP Kك٣'pOIIjImHzə{M&mQJPQ*OԶt cdvϲ$R'r9$VUy yOr D z~**)*^Q\TTrU*STfTPV~QQIRPPUT WmV&vIma>}ϫOkjjӘtӬԜЪz-}YN 5]Un=^ސ>~Aaa~~y'HFuF+J }&&&%&⦡Nxi&dhb̍Oe,|k%couߚhb}M [Q;Z;':5{=|R8;Zqv5:}hI)iٝ;]h]\b\]/nU}s7r/s_!钊HKZԽսOy/h,u%Uk~~v(\F%ӃCTCNքAaZшH(kсу111b b/ġHq=|Gg'B=IIIG :wQtr~T#sii4ԎUG'ʐ8ٟ%UM?!sNWPbnIyysY[Y釅ETEEŦŭgϜ|KWt 8*_nVћ}1G[zfk>-m;wu _ ^\N@럴> \_ ]ů_{Y|}s-smvCy6p[?~ol v u,BZ vwM)W v^h >rF cŸ` +J}*E^2 +}ib 356k([/w:IY!c"OJ,KﭒږqmgWVWSQ]g~N㇖ =Fq]-X&9+zku4svu>xƹk[3Cɓߋ=On-K'X*ԇ&̉r[GWN&%V$9*̘BJFNwp29{lѓy=mT>SSRw&$يs+W*W>UfB훺Ks WtZn^A"ުЦnt˺ý3t/.=Jtdy"W SaMcGgfd6ܛ/xNuab%eW?~Y6|.rwZ? 6mʿ;P,E6?-^Z F#D+J'E`@c dJebc]b$sp) \|/,!#Z+$!'T iM 9J#*DU }XMMHZzx}UwÌFƋ3s9 UKU+9kAof::ZRrp9ipjoiB"b3T%蒭үeKg'+F |]T^HSV'xI~e+MWk]ҵ28ܕ~NCOuɾ6d_}Y*Y)?̍>k~R40A4y*9'/o::~:xo6`.M|ۼw ޷/.?jo_~nUn;?'tPh&]uRtєӞKe$00%0䲞ekdx#ȫʟ"P%xWhQFTFVdY?P@F~t+8zRTo0˽w[ ,M%B~ @e@JCaCM)0.!p E^d!s:]zY`}˂'ۏ AP9h@W0("[s$STxt,Ks|mNϑdi2rr~XI}tC{ws [wx{3n<{$8kdɁg/6f^M]\_X"Zkwwś:[SۡPB{@FXӠ;z?k4iljwl̂*ɺfN>`#搅S.Ʈn?I:['<p/+82d,L>(b+%+5.0^@RdߔWiǕ2KrXr+T?'䩦ss ;]sq˫[]Tݼ=}<(oz1ttIg<643&mBj>W>Y]nb=l̏G[Ew:@!`Aܟ!O *LO'Ֆϯ,6Z?mܼŸEkbbxNNnüdwwQ ap٬Y;n+v^vkjД endstream endobj 280 0 obj 5953 endobj 204 0 obj [ /ICCBased 279 0 R ] endobj 281 0 obj << /Length 282 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xROHQ6Axw )vuYm[Ңgߺ3ӛ5œ]`鲙}v*b{a[QÓ'a?dy֭S{=5ڊ^-CT#hsM9s1F9 1w7;aYf ]%{w;ћ9 \Ir< X}I<>Uw(gRVzWOelπ~v{|u׶>UEP>,l%KTn)=J+vp,ZSk9xw"zmMWzmʨ)(ͳDf[xf8:罊ZIE?9Z*UVPog~~\?A< =ѯ tIsQIi!3NTc)[d@f endstream endobj 282 0 obj 704 endobj 7 0 obj [ /ICCBased 281 0 R ] endobj 283 0 obj << /Length 284 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 284 0 obj 2612 endobj 201 0 obj [ /ICCBased 283 0 R ] endobj 285 0 obj << /Length 286 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoE endstream endobj 286 0 obj 737 endobj 122 0 obj [ /ICCBased 285 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 943 1289] /Count 1 /Kids [ 2 0 R ] >> endobj 287 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 288 0 obj << /Length 289 0 R /Length1 15532 /Filter /FlateDecode >> stream x{y|չ9]gf23 d YYT$!FETeUV5C0p)E[[**.Պ.m?\ };INsg;'jE1h *@Y3kE !uVG/U2EsF =o?uT? yi4xm IՍ=,cV_6O]8㞾ьrd,cI;- T{-n7~o! @#_ BEK᚝pkdm ?ץW}z5zL4(9NRcU=6#?In MʎU%7 = ROP;fa9񘈊dvxJ{~`v}A?Cx2 ӡk7ZSww{p  "x_0FpD(Bs":qt؛;xwx7xbngKewޅمr1[DT2[D \8oV᯼ 惗"˽; <0#xކa(pmYeQãB8o \ AJVH2 iY4zQ+E(B ]ཨ Ȳwȋ\ ADs,)0/Fۣ%(/O5zBː@ VY;U-.e汓{"ZHo׼.j;qEԶkk[GhGW_D;|Q&8}6h.Dk|:uϡ}hNMMDZk;"5gV/n[k|l1LAj3ZZfFfߢ7zI;pvX_4sRt)MQߌ5w!8sGQ&9|E(y'nN~ɝBߘ CHGm h34ڞz9AyhY4=hڇBd8\ggQ*C 7;z'%})rxJ9BFxh]s>ن{ mG?Gd[#y&$-=3}(TP"eW 9xhŷvo"aWqDFRy P:"vFϴ3%KX%I+j1<.#xoěoH4=K,e~.auV^:y$y*.!7-FN3x po#v|WGBI;@73wtg$ugdNU_US&4A/+rYeI|_OF::kC 27 RGAڨ_Su }Lv M5i m4 3/ xճE4cjS% Q&j[jv5QYLKim:גUMQ | }Q9:MlvFMݎCW!ސ{+$}>Ns}'?|`Jh3%ȖѤ u*:ՌaQ<\`Ihդ>[pJީ3ίA[O}-|@5tx%g; 6:Bo4&)k&sƐb|>7prU ո6 s(ͫC%7$(uW|ѳ;}u6`&6 ٜtB7#ia|xnl7{rS~n*e7MhIFja}omn 0ϳ\8fAq-`W4wvwNjK㝝it17DbBI+ó4y$h5S(5K'2M.!(\1u+(Qxu HFd W(qi6jy8]^9Ca#8k0g n,Vbb>n>Z2Q GA7d%üYpf0[حʘ"3aDT( Q"0Jemf cJ簊`x psDa^d85{JZ]Z7 v4^7;4a$*:AʗYg,xc({yux60lwRq҂Z cfo{W}F,7ŏM(Bff]cQ25$swr_ ME*Ҹ-x3x}֚I"`܌zE!)$Bӧ(t89}QMH*Z6 lSPH "1닰Ѡ .q)˜Ү.B:#$/, W+!T"b>:2ECK+JPP."X/g%:A>7xLFEXD0O~c=2PzY5w4u"VfyFrSyKߒ9!'MBjWu8\Gl& Ǫܚ" E#C3O1Ta@C~1_n߽f_bjEAkNy%OoH:q6q9qp/Gy v, #&pr"0 pۤRlkԃiB `du)r{6x 2\ǂ Ɗ{3acV'&!CUZa'-2eL&D( cR^-6E4J/jL/L&0wā^p\*/?uʦ$lӨcxOnB\C޲8j.w-w$vǐPbon?GDk)1 {HfVrK?r:sYPy(. 5/B7Ml}@0`T2J%E{cjE P`:+Tg1 -zkt P~ O|yq12 <}ʭlգwtY ) rZ|Cɏ-tL0A".X8=ByP(BN , E Z"E)BICɦaġL+B.d /8-R/>`Db1%v'/xi1JSo[lr_\EL$}<gK2q*֥>n*þ:(yyƥeFvf^ffcXV)ިffs! \-"\`lY@|`0ZLR(L**-"N'S̊{$vrG?>b2=4̛`?Je70O_L B`T["giP.ڵiֶi3Jt%ú] ;,[Q@Zѐ,(0b Y F@i~`4- KŔ!@G/nS<$H> 29%fcɛ,l\6)BlP<( aHS~RQW B\ y٢8uaLM_??οm|7nMm5)T7JB& D s(CCd. G41=Jq,+\Qyz\4LZpl8XA*FPÝB<q*JYgpH Be#^[ roF}Z='DTU/p0%L м޼^ r3KZvpNBvy n:J$t$l ߳eK̖ñn:k..4&,]pi[:Ԅok,-Y8 \H}юlǐlɲ*MGo|kJY\Vʟ9ܩeMz}ۨQ[[\ JW#濲f&|ʒ'l;q*Z!tbEܜ`Pz*9$:}<}#-JY8 ~L=+9JH,-M O^0$()3)`gQywtUH}NΪH Z^gmZ.$@ČrܢRJP6 0&e&,&Cng퍀 8B1z/-}[$@xn> tG4߹1'09;{7f ʨeS7%o~G1rdaاߢ3# pMO| YMv=XNDy9ܻ}R"7a\߳u- dێW"1ei=x'?m&?KyiflyYvZޝ{4RUܬKܡm/0.FCp8,$s)B3-`Mi5`IlUU&Hv b%N%YDXhB"~}z=c-6'hV`tU/lnUl=ߎu;6Ox{|`>/`FБ еekwHs"xۥJגݙKP j BGctY A㬐`6<&yX_jΨVS ' >R4U۟\:go^1uߑO;yo`n3:1U H05CzՊzUHР&Lm"0bVJ] j: $}ހ2<;gwkrta1kq|+]XM8/2Vn V,>3#*-Cs2jj;Ϯ晐Ӓfs-Lj H ]dM]nV (_wzV{6"3(2ZoH? ~+C<>t,RRn8Kp%WB 8֏ %v tҵ1p0PB@cpIOyTMyg@f~Ƨ1-Y ^˚C~?0N05foZ7x﷏${'̫lD>ꔀS &O6,o}uE,ɝS'g>xxɖ() &SXkJ5p#֢c aZaGl>bOtW +ju#K޽AKc 7Ǹ)w7kL*L+6pEsXtȰ(Lar3@#NDFɁ v;,yʰZt0E~m@e'TUI"3)DFP`!˜ZCCnbR.NO2}ה핳OϺ鉉kN>!͇$W_Em˯fp;."uRˎbrӜ8:sI&Jƒz1AYhx xx~!DU0 ygcVtaLqH}i߮U®oU@BʲNX 0l( \{9uqSo}6~( a~-x.؉ʴ]9 J3(P =@10<=ΐOO-p$ MiئcLJ-x闉o x)Xr+@Ʋ$F65=_uZweQ&\nnay+jbbۅvYXK [ýΑvٸLnYNU: ԚAieػ?}'50% @ibdžxy0łօFaL'A/r&BiNpa#g@daQBҡ#P>Hά~jS'?K_Fhob/f&KĜ^|^KvqcS11PjVrGDat ^'q^ 4ԾrHU@{!߻Kg{z_q] 'Kv;9U)q<nʧ,Y8%G aB|ՠZT'h*$72ft P3GT0Wy85'm=uAGkY3'Koy\:E;@&@(&6{l8 >E`"  `@@=kx"w@ P0 d2FAux~zS_<7?PhP}ؠ p  ToToTqP}Auu6NZT5>{P]^{Π0}oޠAuvy1hP}Aury];T_z},!x endstream endobj 289 0 obj 10275 endobj 290 0 obj << /Type /FontDescriptor /Ascent 770 /CapHeight 717 /Descent -230 /Flags 32 /FontBBox [-951 -481 1445 1122] /FontName /YWKYGI+Helvetica /ItalicAngle 0 /StemV 0 /AvgWidth -441 /MaxWidth 1500 /XHeight 523 /FontFile2 288 0 R >> endobj 291 0 obj [ 278 0 0 0 0 0 0 0 333 333 0 584 0 0 278 278 0 0 556 0 0 0 0 0 0 0 278 0 0 0 0 0 0 667 0 722 722 667 611 778 0 0 0 0 556 833 722 778 667 0 0 667 0 0 0 0 667 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 556 0 333 500 278 556 500 0 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ] endobj 123 0 obj << /Type /Font /Subtype /TrueType /BaseFont /YWKYGI+Helvetica /FontDescriptor 290 0 R /Widths 291 0 R /FirstChar 32 /LastChar 223 /Encoding /MacRomanEncoding >> endobj 292 0 obj << /Length 293 0 R /Length1 10124 /Filter /FlateDecode >> stream xZ xTյ^{眙$d!93LBC2 yA@ $@@AF)A Vu"K >P)E9sי"~='k^{sZ{Iʛ!Mz ry ,ZM.Z\Þ.b@rwٚO ]pӒ^,dn\7aPku8ㆮ{1_iSX{ҊZ`)h`@Aw;kzܖ$>y/ysΧtW{i" |T2t6R֪%AG*GW "O CE~$ϯ͢>yƍ,Ԁ;V|dR4C)ȁ_SC +A/?/!}?sʯbWJX?$ğ ]}idDyȋeCJL˻Ko#RˬH;Hv ~y7D;"ݸ/ܰ/H//w AerL]$!Q}l<{\nPюJo/vG$6}PΈd{y>92+Hy>#]ッ$H.FPTMn&o2ckEx/a;#c83p >Of*;>r`0Ť Kco4RF9 8֙uF|5p [H[b\2da[0YhT9 LTg]yt?Vpog1q9#;]NMŴ aX.,Ai#~K&}#'HzQ *¾“C#\1"7 Gi+"W~KW}'#G$ZE?pu{ȍBNEiDnMnFO:gUsϼQ(-s s­#^pܪ"QO(c)$DRDy)kq&`15!%͸g^GL's+ʮtJi4o~1Q| %TrS0Nf$MajB \C}!tF}O‚"E>r;Uym;U.p=PNKːzWZ-mf7;v~+>H $sR2) HDh$y&rLjuHZ yp6bk%$qHPLK6]+٫/ZCeeg(@9k>TX|>, e7`(NG mlzO@*, AZ܈9q#$4 >Jک -}УmKnMao!wrMbcמo'c}/ $Z.v]0JFN*r`w&ωq5h(>1 Q%N%LҨ91hliIÛn ~$ʱٿz_%_&SJX9?w.-Tڱ㤛wh5x:?#Dյײw1q;n|YfMV5|n#j >gsl0!u0PQ1|uDǥJp IF^XH'cNk?8~ՃPh]R檇?Z0+)(:k[oqOpA|l7 -~ef gf|v$ $NY F%3FQh\&O+9#&ܞ >kR?)_5ከjBz,ŢIEcУbP/N KՎ^UXֵyZ/~sQsLnuHy}TiV3o9U>U}|~솗IoOJT}{2 @i%'2vz A2UhtsP(,09q;wqO#K<gQt.e$ԕB4T/R/gסmhlZags i pfˉQ~`09Q٨nF&"+BV> Q,U9k1 }D16X6JXj8O-$)Xf':w]ؒb` fY3sjrƖ!)+M7KDs2}MJdܑ3"شOq8TaR1OmZ[iIu-I;g3 ̧ͯ7OUҗ `ЦYeEkYkމl1 [ɷޗo˰%Pg+( T4ūb= s8 2NurH1Kɥ:q|fY<p1-I26DPL̆˫oyu+qdLM9}e?I;ߚnJ75nR[M=sfxI{}I u #nZOUMbAwcDZ\Iؓ$e}芏Dds%6=/=/K-`iI9d!KN05Bcބtޘ+6&&6pB=&z3gx8bjQg' 'w zKn-M'c\C%X<qi&nrijgMם*)ÚĴoʌ'1Z~GFxT.)^:h'w=M 4]Gc7w#H9/%d^f]Rk`40bZt@ENĕz(2FLΕ޺8vQLțO]޼[ְs[W+)X'œq{iv6Ԋ' 9{W!ٔ0 KLc1%,ⴤi)vcB;NQ5s9b&RJZZƍFJĒ@6C7t,6‘dVgFSeTN[VS2g*-lX¶=J^[bf{=USNÂngX"66K5'DAZ"-bfɪ}#"*5_ YQ+a w$΋zwd5fB y'ʇxB1/޽wC=ʣyʯ?~r2C[uT$Jc6imb5DoOdٜi۝MWgEu6bNL ߆GبNQW7]"EAeo ݾ[֥:aN~r-Hw4e:^JwMCuSv2ێ3k`H>[:$:A 2f."1}Φ9z"bd(* DYujTGhMYqMtbl*lZ϶fh_%2^ͩ9 .XO'I//eI>g* ߙOp.\KRca0o'{ƥ4Y2)P^y9tx78B`hT`M]bͦYR [&հSM/=>!=>%/IoKgKe,x 54VIQVIO  <;RFI#p!RsAݟܑ~}l[ݏ6[bȋAeh_>0` lqMom?ksk:n@o EL&N;WvCd?͠V(C:R-@;K}^i#mvKK?=$?RR'RzD .k$Oz> U_76>Go(~(kq\#_ϨQQ Gu#v> endobj 295 0 obj [ 722 0 722 722 0 0 778 0 0 0 0 611 0 722 0 667 0 0 667 0 0 0 0 0 0 0 0 0 0 0 556 0 556 0 0 611 556 333 0 611 0 0 0 278 0 611 611 611 0 389 0 333 0 0 0 556 556 ] endobj 124 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ARVDTP+Helvetica-Bold /FontDescriptor 294 0 R /Widths 295 0 R /FirstChar 65 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 296 0 obj (Mac OS X 10.6.8 Quartz PDFContext) endobj 297 0 obj (D:20111226105955Z00'00') endobj 1 0 obj << /Producer 296 0 R /CreationDate 297 0 R /ModDate 297 0 R >> endobj xref 0 298 0000000000 65535 f 0000108609 00000 n 0000006170 00000 n 0000089733 00000 n 0000000022 00000 n 0000006150 00000 n 0000006275 00000 n 0000086016 00000 n 0000012308 00000 n 0000012602 00000 n 0000012620 00000 n 0000009830 00000 n 0000010128 00000 n 0000010147 00000 n 0000013541 00000 n 0000013847 00000 n 0000013866 00000 n 0000012713 00000 n 0000013019 00000 n 0000013038 00000 n 0000018118 00000 n 0000018417 00000 n 0000018436 00000 n 0000021020 00000 n 0000021326 00000 n 0000021345 00000 n 0000010239 00000 n 0000010535 00000 n 0000010554 00000 n 0000021856 00000 n 0000022159 00000 n 0000022178 00000 n 0000018529 00000 n 0000018834 00000 n 0000018853 00000 n 0000013131 00000 n 0000013429 00000 n 0000013448 00000 n 0000015625 00000 n 0000015929 00000 n 0000015948 00000 n 0000018946 00000 n 0000019252 00000 n 0000019271 00000 n 0000007744 00000 n 0000008049 00000 n 0000008068 00000 n 0000019364 00000 n 0000019663 00000 n 0000019682 00000 n 0000008576 00000 n 0000008881 00000 n 0000008900 00000 n 0000017707 00000 n 0000018006 00000 n 0000018025 00000 n 0000011891 00000 n 0000012196 00000 n 0000012215 00000 n 0000021438 00000 n 0000021744 00000 n 0000021763 00000 n 0000014792 00000 n 0000015097 00000 n 0000015116 00000 n 0000009414 00000 n 0000009719 00000 n 0000009738 00000 n 0000020603 00000 n 0000020908 00000 n 0000020927 00000 n 0000015209 00000 n 0000015513 00000 n 0000015532 00000 n 0000013959 00000 n 0000014263 00000 n 0000014282 00000 n 0000007329 00000 n 0000007633 00000 n 0000007652 00000 n 0000016882 00000 n 0000017180 00000 n 0000017199 00000 n 0000011056 00000 n 0000011361 00000 n 0000011380 00000 n 0000020185 00000 n 0000020491 00000 n 0000020510 00000 n 0000014375 00000 n 0000014680 00000 n 0000014699 00000 n 0000008160 00000 n 0000008465 00000 n 0000008484 00000 n 0000017292 00000 n 0000017595 00000 n 0000017614 00000 n 0000011473 00000 n 0000011778 00000 n 0000011797 00000 n 0000022271 00000 n 0000022572 00000 n 0000022592 00000 n 0000016041 00000 n 0000016349 00000 n 0000016369 00000 n 0000008992 00000 n 0000009301 00000 n 0000009321 00000 n 0000006908 00000 n 0000007216 00000 n 0000007236 00000 n 0000016463 00000 n 0000016768 00000 n 0000016788 00000 n 0000010646 00000 n 0000010942 00000 n 0000010962 00000 n 0000019775 00000 n 0000020071 00000 n 0000020091 00000 n 0000089694 00000 n 0000101008 00000 n 0000108330 00000 n 0000031597 00000 n 0000031889 00000 n 0000022686 00000 n 0000022987 00000 n 0000032223 00000 n 0000032546 00000 n 0000031910 00000 n 0000032202 00000 n 0000023674 00000 n 0000023997 00000 n 0000030617 00000 n 0000030895 00000 n 0000026929 00000 n 0000027230 00000 n 0000029263 00000 n 0000029564 00000 n 0000023330 00000 n 0000023653 00000 n 0000030915 00000 n 0000031254 00000 n 0000027251 00000 n 0000027574 00000 n 0000023008 00000 n 0000023309 00000 n 0000027595 00000 n 0000027918 00000 n 0000024975 00000 n 0000025257 00000 n 0000033899 00000 n 0000034191 00000 n 0000029929 00000 n 0000030252 00000 n 0000024662 00000 n 0000024954 00000 n 0000032889 00000 n 0000033212 00000 n 0000029585 00000 n 0000029908 00000 n 0000025928 00000 n 0000026251 00000 n 0000031275 00000 n 0000031576 00000 n 0000033555 00000 n 0000033878 00000 n 0000028903 00000 n 0000029242 00000 n 0000025599 00000 n 0000025907 00000 n 0000033233 00000 n 0000033534 00000 n 0000028559 00000 n 0000028882 00000 n 0000025277 00000 n 0000025578 00000 n 0000034212 00000 n 0000034535 00000 n 0000028237 00000 n 0000028538 00000 n 0000024340 00000 n 0000024641 00000 n 0000032567 00000 n 0000032868 00000 n 0000027939 00000 n 0000028217 00000 n 0000024018 00000 n 0000024319 00000 n 0000034556 00000 n 0000034879 00000 n 0000026272 00000 n 0000026564 00000 n 0000034900 00000 n 0000035201 00000 n 0000030273 00000 n 0000030596 00000 n 0000026585 00000 n 0000026908 00000 n 0000088792 00000 n 0000047609 00000 n 0000048849 00000 n 0000085146 00000 n 0000068589 00000 n 0000069431 00000 n 0000071618 00000 n 0000072457 00000 n 0000070314 00000 n 0000071596 00000 n 0000045817 00000 n 0000046632 00000 n 0000040158 00000 n 0000041398 00000 n 0000059756 00000 n 0000060597 00000 n 0000060618 00000 n 0000062755 00000 n 0000057554 00000 n 0000058801 00000 n 0000063622 00000 n 0000066377 00000 n 0000043629 00000 n 0000044935 00000 n 0000062777 00000 n 0000063601 00000 n 0000044957 00000 n 0000045796 00000 n 0000072478 00000 n 0000073734 00000 n 0000048871 00000 n 0000050148 00000 n 0000076515 00000 n 0000077782 00000 n 0000053703 00000 n 0000054499 00000 n 0000046653 00000 n 0000047588 00000 n 0000067727 00000 n 0000068568 00000 n 0000037349 00000 n 0000038874 00000 n 0000056631 00000 n 0000057533 00000 n 0000069452 00000 n 0000070293 00000 n 0000075569 00000 n 0000076494 00000 n 0000051474 00000 n 0000052415 00000 n 0000035222 00000 n 0000036435 00000 n 0000041420 00000 n 0000042771 00000 n 0000042793 00000 n 0000043608 00000 n 0000058823 00000 n 0000059735 00000 n 0000036457 00000 n 0000037328 00000 n 0000050170 00000 n 0000051452 00000 n 0000077804 00000 n 0000079044 00000 n 0000052436 00000 n 0000053681 00000 n 0000055380 00000 n 0000056609 00000 n 0000073756 00000 n 0000074681 00000 n 0000074702 00000 n 0000075548 00000 n 0000054520 00000 n 0000055359 00000 n 0000066399 00000 n 0000067705 00000 n 0000038896 00000 n 0000040136 00000 n 0000079066 00000 n 0000085124 00000 n 0000085185 00000 n 0000085995 00000 n 0000086053 00000 n 0000088770 00000 n 0000088831 00000 n 0000089673 00000 n 0000089817 00000 n 0000089882 00000 n 0000100250 00000 n 0000100273 00000 n 0000100515 00000 n 0000101186 00000 n 0000107881 00000 n 0000107903 00000 n 0000108151 00000 n 0000108513 00000 n 0000108566 00000 n trailer << /Size 298 /Root 287 0 R /Info 1 0 R /ID [ <233605d85d57dc9549d112a8222a650d> <233605d85d57dc9549d112a8222a650d> ] >> startxref 108687 %%EOF 1 0 obj <> endobj xref 1 1 0000114809 00000 n trailer < <233605d85d57dc9549d112a8222a650d>] /Info 1 0 R /Prev 108687 /Root 287 0 R /Size 298>> startxref 114993 %%EOF openscad-2019.05/doc/Python-LICENSE.txt0000644000076500000240000003112413402025764017752 0ustar kintelstaff00000000000000Part of OpenSCAD is copied from Python (linalg.cc/hash_floating_point()), so the python license is included below. ---- A. HISTORY OF THE SOFTWARE ========================== Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands as a successor of a language called ABC. Guido remains Python's principal author, although it includes many contributions from others. In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software. In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation, see http://www.zope.com). In 2001, the Python Software Foundation (PSF, see http://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF. All Python releases are Open Source (see http://www.opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases. Release Derived Year Owner GPL- from compatible? (1) 0.9.0 thru 1.2 1991-1995 CWI yes 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes 1.6 1.5.2 2000 CNRI no 2.0 1.6 2000 BeOpen.com no 1.6.1 1.6 2001 CNRI yes (2) 2.1 2.0+1.6.1 2001 PSF no 2.0.1 2.0+1.6.1 2001 PSF yes 2.1.1 2.1+2.0.1 2001 PSF yes 2.1.2 2.1.1 2002 PSF yes 2.1.3 2.1.2 2002 PSF yes 2.2 and above 2.1.1 2001-now PSF yes Footnotes: (1) GPL-compatible doesn't mean that we're distributing Python under the GPL. All Python licenses, unlike the GPL, let you distribute a modified version without making your changes open source. The GPL-compatible licenses make it possible to combine Python with other software that is released under the GPL; the others don't. (2) According to Richard Stallman, 1.6.1 is not GPL-compatible, because its license has a choice of law clause. According to CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 is "not incompatible" with the GPL. Thanks to the many outside volunteers who have worked under Guido's direction to make these releases possible. B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON =============================================================== PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python. 4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By copying, installing or otherwise using Python, Licensee agrees to be bound by the terms and conditions of this License Agreement. BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 ------------------------------------------- BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software"). 2. Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that the BeOpen Python License is retained in the Software, alone or in any derivative version prepared by Licensee. 3. BeOpen is making the Software available to Licensee on an "AS IS" basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 5. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 6. This License Agreement shall be governed by and interpreted in all respects by the law of the State of California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. As an exception, the "BeOpen Python" logos available at http://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page. 7. By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and conditions of this License Agreement. CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 --------------------------------------- 1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6.1 software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 1995-2001 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1013". 3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 1.6.1. 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 7. This License Agreement shall be governed by the federal intellectual property law of the United States, including without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply, by the law of the Commonwealth of Virginia, excluding Virginia's conflict of law provisions. Notwithstanding the foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable material that was previously distributed under the GNU General Public License (GPL), the law of the Commonwealth of Virginia shall govern this License Agreement only as to issues arising under or with respect to Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and conditions of this License Agreement. ACCEPT CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 -------------------------------------------------- Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. openscad-2019.05/doc/TODO.txt0000644000076500000240000002666513402025764016174 0ustar kintelstaff00000000000000 BUGS (FIXME: Verify and move these to github) --------------------------------------------- o Some invalid DXF data gets pass the import checks and breaks the tessing code o Tesselation via GLU sometimes produces strange results o Export STL: Exports existing CGAL model even though the current model is changed, but not CGAL rendered o Look into the polygon winding and rotate_extrude() problem reported by Britton o CGAL Aff_transformation_3 doesn't support non-affine transformations (non-aff-matrix.scad) o 2D union of polygons with a touching vertex doesn't work. see testdata/scad/bugs/polygon-touch.scad STL Import BUGS (FIXME: Verify and move these to github) -------------------------------------------------------- Using STL-imported models is tricky and triggers multiple issues: (these all fail with the usual "Illegal polygonal object" error) 1) null-faces causes F6 rendering to fail while F5 rendering succeeds. (null-faces are exported by OpenSCAD). Example: adns2610_dev_circuit_inv.stl by Andrew Plumb 2) Even very simple imported STL models don't render correctly with F5 when taking a difference(), though F6 looks correct. Example: test_cube.stl by Andrew Plumb with this scad file: difference() { import_stl("test_cube.stl"); translate([2,2,2]) cylinder(h=10); } 3) More complex STL models with something simple unioned or subtracted fails rendering using F6 even though F5 works. Example: adns2610_dev_circuit_inv.stl by Andrew Plumb with the three null-faces removed by MeshLab with this scad file: union() { import_stl("adns2610_dev_circuit_inv_4.stl"); sphere(r=5); } 4) More complex STL models cannot be projected (both F5 and F6). Example: adns2610_dev_circuit_inv.stl by Andrew Plumb with the three null-faces removed by MeshLab and this scad file: projection(cut=true) { import_stl("adns2610_dev_circuit_inv.stl"); } USER INTERFACE -------------- o Preferences - Beautify color schemes - Color schemes read from file - Color scheme editor - wireframe width - pointsize - OpenGL params - Default language feature settings - Make the library search path configurable? - Turn on/off caching (advanced) o MDI - Think about how to do MDI the right way - Ctrl-W should close the current dialog, not the current main window -> implement as for Preferences? - Menu bar handling: Mac: share menubar among all top-level windows? - currentPath is global but is used by each document, e.g. parser and handle_dep. o 3D View - Improve mouse rotation/zoom/pan - Add modifier key combos to handle pan and zoom on 1 mouse button systems - Show grid - Measurement ticks on the axes that look like rulers that one can turn off and on. - 4 x split view w/orthogonal cameras? - Quick highlighting of object under the cursor in the editor - View All - Allow specifying viewpoint in the scad file - overlay indicator displaying current view mode - Use OpenGL picking to facilitate ray-tracing like features like measuring thicknesses, distances, slot thicknesses etc. - Add option to change lights, e.g. add an optional camera light - 2D objects are rendered at z = -0.1 - why? - Rewrite to use VBOs or smth. - avoid inline calculations - Rewrite to a higher-level library (e.g. OSG)? - Make navigation (e.g. zoom) available through menu entries (requested by disabled user) o Editor wishlist - More infrastructure for external editor (allow communication from the outside) - Preferences GUI for the features below - line numbers - tear-off/maximize options? - Save somehow uses current dir, even if the file is already saved earlier - Code completion/hints for builtin (and user-defined) functions/modules - builtin quick function reference/help - Drawer/popup with all modules/functions listed which can be inserted into the editor by clicking or drag&drop -> icons in toolbar? -> This would be moving in the direction of a traditional CAD GUI and needs a fair bit of thinking. - Display some kind of line wrap indicator - Couple the source code to the AST to allow highlighting selected elements in the source code in the 3D view - Tabbed editor for designs including other files - C-c/C-v should work on the focused widget, not always in the editor - Auto-indent on enter and on tab o Error reporting/debugging - Provide better error messages when polygon ordering causes CGAL errors: o Detect common error: self-intersecting polyhedron() o Supply syntax highlighting of the exact polygon indices which are reported to be wrong o Provide some interaction for debug walk-through? - Provide visual highlighting of geometry corresponding to code -> could aid debugging a lot - Optionally output console log to a file - Common error: detect and report (and ignore?) duplicate line segments in DXF o Computation - Multi-threaded computation (mostly important for CGAL) - Progress: Call progresswidget more often to improve feedback o Misc - Save: Ask for confirmation if file has been externally changed - Rename OpenCSG and CGAL to smth. not specific to the underlying libraries (e.g Preview, Render) - If trying to export STL/DXF but source is newer than the CGAL rendering, ask for confirmation. - Go through keyboard shortcuts and make them more conformant to platform standards - Show design info/stats (sizes, caches etc.) - Support Voice Over and related technologies for vision-impaired users o Cmd-line - Add verbose option (PRINT command from mainwin.cc and progress output) OpenCSG-related --------------- o OpenCSG rendering: Coincident surfaces causes z-buffer fighting. Is this somehow avoidable tuning the depth tests in OpenCSG? o When specifying a transparency with the color() statement, the object is not sorted and will be rendered wrongly. See issue #310 for some good test models. o Bug: Using the background operator (%) on the only object in a scene triggers a CSG error: No top level object found CGAL-related ------------ o Hollow donut problem When extruding a 2D CSG tree (e.g. a polygon with a hole), the hole information is lost when performing the extrusion. For linear extrusions, this has only a minor visual impact, but for rotate extrusion, the resulting CGAL models will lose the hole. The OpenCSG rendering keeps the hole, but renders slightly incorrect. o CGAL issues - CGAL doesn't handle almost planar polygons. Consider splitting into triangles ourselves. See WillamAdams/dodec.scad o Look at the EPEC kernel for improved performance (suggested by Giles) o Look at performance: Is CGAL doing proper bounding box calculation before testing all primitives? LANGUAGE && BUILTINS -------------------- o Primitives - Springs, spirals (requested by Cathal Garvey) - (TTF) Text - Image-based height field like http://www.thingiverse.com/thing:2078 - mesh (coordinates and indices) o 2D Subsystem - Performance: Is it necessary to union children before extrusion when compiling? Can this be postponed to CGAL evaluation time? - Add inset() operation o Built-in modules - extrude*: Allow the base 2D primitive to have a Z value - rotate_extrude(): Allow for specification of start/stop/sweep angle? o Advanced Transformations - Add statement for intersections in cartesian product of childs o Function-Module-Interface - Pass a module instanciation to a function (e.g. for a volume() function) - Pass a function to a module instanciation (e.g. for dynamic extrusion paths) o Language Frontend - Allow local variables and functions everywhere (not only on module level) - Rethink for vs. intersection_for vs. group. Should for loops generate child lists instead, and make these passable to other modules or accessible by child()? o Misc - center as default: Very often, center=true is used everywhere. Make a global variable ($center?) control this to beautify code and the avoid typical errors when forgetting to specify center - Go through default values of parameters (e.g. cube() has x,y,z=1 while linear_extrude() has height=100) - Add support for symbolic names to child() statement - Add 'lines' object type for non-solid 2d drawings - Is there a reason why modules like echo, empty if, empty for loop returns an empty AbstractNode instead of being ignored? - Dependency tracking of libraries (USE'd modules) isn't implemented. See Mail from nophead 20110823. o Grammar/Parser - dim->name -> dim->label - A random(seed) function - linear_extrude()/rotate_extrude(): Cumbersome names? -> (extrude, revolve, lathe, sweep ?) - If a compile error occurs in an included file, line numbers are global and doesn't say in which file the error occurred. INFRASTRUCTURE -------------- o DXF Import/Export - Use dxflib from RibbonSoft for import/export? -> investigate - Import - Support for POLYLINE entity - Support for SPLINE entity - Support for LEADER entity - Support for MTEXT entity ? - idea: DXF inline - convert from dxf to OpenSCAD syntax -> parametrize dxf content - Progress when exporting large STLs o Mesh optimization on STL export - Remove super small triangles (all sides are short) - Replace super thin triangles (one h is short) o Use a logging framework to get debugging/info output more under control? (check log4j, google project) o Export to other file formats - IGES: Should support CSG so it might be possible to keep some structure IDEAS FOR LANGUAGE CHANGES -------------------------- o More strict checking of module parameters to make e.g. this fail: module test(a,b) { a=1; b=2; echo(a,b,c); } test(c=3); (also for built-in modules) CODE ---- o Refactor from MainWindow: - Put all application-global data in one place (QApplication subtype?) - Fix current_win hack - CSG data structure (compiled model) - CGAL data structure (compiled model) o C++-ify - Use static_cast/dynamic_cast instead of C-style casts o dxflinextrude and dxfrotextrude could share code o Consider decoupling DXF-specific functionality from the 2D subsystem o Visitation refactoring - Make AbstractNode members private/protected? DOCUMENTATION ------------- o Auto-generate API documentation instead of, in addition to or combined with, the wikibooks docs. o Clarify include/use better in the wikibook docs (e.g. that use'd modules have to be self-contained) TESTING ------- o Caching and MDI looks suspicious when the code relies on external resources which might be loaded from difference locations in different documents -> we might get a false cache hit o Collect "all" available OpenSCAD scripts from the internets and run the integration tests on them all MISSING TESTS: -------------- o cmd-line -D variable override o OPENSCADPATH env.variable o all functions o mirror o scale o open polyline from dxf using new method o linear_extrude DXF o rotate_extrude DXF o import_stl o import_off o import_* - open polylines o include: test subdirs under librarydir (e.g. include ) o variants of module transparent() { %child(); } o define modules o define functions o built-in variables and constants (builtin-tests.scad) o Caching - Test that caching is actually performed (speedup + same results) - Test the modifier characters correctly influence the cache (also when added/removed) - Test the individual caches - PolySetCache - CGALCache - nodecache - ModuleCache o other tests - export - cmd-line tests - leaf nodes having children, e.g. cube() cylinder(); - dependency tracking (use and include) openscad-2019.05/doc/contributor_copyright.txt0000644000076500000240000000044613402025764022056 0ustar kintelstaff00000000000000WE the undersigned contributors, grant perpetual license for the original authors of OpenSCAD, Marius Kintel and Clifford Wolf, to change the license under which the code we have contributed to OpenSCAD is released, in future versions of OpenSCAD. Don Bright 2012 openscad-2019.05/doc/hacking.md0000644000076500000240000000247413423115164016601 0ustar kintelstaff00000000000000# Coding Style The OpenSCAD coding style is encoded in `.uncrustify.cfg`. Coding style highlights: * Use 2 spaces for indentation * Use C++11 functionality where applicable. Please read Scott Meyer's Effective Modern C++ for a good primer on modern C++ style and features: https://shop.oreilly.com/product/0636920033707.do ## Beautifying code Code to be committed can be beautified by installing `uncrustify` (https://github.com/uncrustify/uncrustify) and running `scripts/beautify.sh`. This will, by default, beautify all files that are currently changed. Alternatively, it's possible to beautify the entire codebase by running `scripts/beautify.sh --all`. This is not recommended except in special cases like: * We're upgrading uncrustify to fix rules globally * You're bringing an old branch to life and want to minimize conflict cause by the large coding style update Note: Uncrustify is in heavy development and tends to introduce breaking changes from time to time. OpenSCAD has been tested against uncrustify commit a05edf605a5b1ea69ac36918de563d4acf7f31fb (Dec 24 2017). # Regression Tests See `testing.txt` # How to add new function/module * Implement * Add test * Modules: Add example * Document: * wikibooks * cheatsheet * Modules: tooltips (editor.cc) * External editor modes * Add to RELEASE_NOTES.md openscad-2019.05/doc/openscad.10000644000076500000240000001175313465203575016543 0ustar kintelstaff00000000000000.TH OPENSCAD 1 "2019.05" .\" Please adjust this date whenever revising the manpage. .SH NAME openscad \- script file based graphical CAD environment .SH SYNOPSIS .B openscad .RI [ options ] .RI [ file ] .SH DESCRIPTION This manual page documents briefly the \fBopenscad\fP command. .PP \fBopenscad\fP is a software for creating solid 3D CAD objects. It focuses on CAD aspects rather than artistic ones. OpenSCAD will start as a graphical program unless export options are given (see below). For the usage of the GUI and a description of the OpenSCAD language see the OpenSCAD user manual at https://en.wikibooks.org/wiki/OpenSCAD_User_Manual. .SH OPTIONS .TP \fB-o\fP \fIoutputfile\fP Export the given file to \fIoutputfile\fP in STL, OFF, AMF, 3MF, DXF, SVG, or PNG format, depending on file extension of \fIoutputfile\fP. If this option is given, the GUI will not be started. Additional formats, which are mainly used for debugging and testing (but can also be used in automation), are AST (the input file as parsed and serialized again), CSG (an OpenSCAD language representation of the input file with calculations done and module calls applied), TERM (the constructive solid geometry expression passed to OpenCSG). If \fIoutputfile\fP is \fBnull\fP, no output file will be written, but the file will still be evaluated and all \fBecho\fP commands will be written to the standard error output. (The rendering process will still take place if the \fB\-\-render\fP option is given.) .TP \fB\-q Quiet mode (don't print anything except errors) .TP \fB\-d\fP \fIfile.deps\fP If the \fB-d\fP option is given, all files accessed while exporting are written to the given deps file in the syntax of a Makefile. .TP \fB-m\fP \fImake_command\fP If a nonexisting file is accessed during OpenSCAD's operation, it will try to invoke \fImake_command missing_file\fP to create the missing file, and then read it again. .TP \fB-D\fP \fIvar=val\fP This option can be used to assign constant values to OpenSCAD variables. The variable's value is an expression, so if this mechanism is used to assign strings, care has to be taken that the shell does not consume quotation marks. More than one \fB-D\fP option can be given. .TP .B \-\-render If exporting an image, render the model fully. (Default is preview) .TP .B \-\-preview[=throwntogether] If exporting an image, use an OpenCSG preview (optionally in throwntogether mode for quicker rendering). .TP .B \-\-view[=axes|crosshairs|edges|scales|wireframe] View options .TP .B \-\-csglimit=limit If exporting an image as an OpenCSG preview, stop rendering after encountering \fIlimit\fP elements to avoid runaway resource usage. .TP .B \-\-camera=transx,transy,transz,rotx,roty,rotz,distance If exporting an image, use a Gimbal camera with the given parameters. Rot is rotation around the x, y, and z axis, trans is the distance to move the object in the x, y, and z directions, and distance is the distance between the camera and the center of the object. .TP .B \-\-camera=eyex,eyey,eyez,centerx,centery,centerz If exporting an image, use a Vector camera with the given parameters. The first three are for the Eye position, while the next three are for the Center (or target) that the camera will look at. The 'up' vector is not currently supported. .TP .B \-\-viewall If exporting an image, adjust camera distance to fit the whole design in the frame .TP .B \-\-autocenter If exporting an image, center the design in the frame .TP .B \-\-imgsize=width,height If exporting an image, specify the pixel width and height .TP .B \-\-projection=[o|ortho|p|perspective] If exporting an image, specify whether to use orthographic or perspective projection .TP .B \-\-colorscheme=\fIscheme If exporting an image, use the specified color scheme for the rendering. \fIscheme\fP can be any of \fBCornfield\fP, \fBSunset\fP, \fBMetallic\fP, \fBStarnight\fP, \fBBeforeDawn\fP, \fBNature\fP or \fBDeepOcean\fP. .TP .B \-v, \-\-hardwarnings Stop on the first warning .TP .B \-\-check-parameters=[true|false] Configure the parameter check for user modules and functions .TP .B \-\-check-parameter-ranges=[true|false] Configure the parameter range check for builtin modules .TP .B \-\-info Show which versions of libraries were used to compile the program, and which OpenGL details are discovered. .SH COMMAND LINE EXAMPLES .PP Render example001.scad into the .stl format (raw triangle data): .PP .B openscad -o example001.stl examples/example001.scad .PP Compile a 2d image using a camera rotated 25 degrees in x and 35 in z, distance 500, with orthographic projection: .PP .B openscad -o o.png o.scad --camera=0,0,0,25,0,35,500 --projection=ortho .PP Set the 'mode' variable in example017 so that it will render only the parts of the shape. Export to a .dxf file. .PP .B openscad -o example017.dxf -D'mode="parts"' examples/example017.scad .SH AUTHOR OpenSCAD was written by Clifford Wolf, Marius Kintel, and others. .PP This manual page was written by chrysn , for the Debian project (and may be used by others). Updated by the OpenSCAD team. openscad-2019.05/doc/patchlevel-checklist.txt0000644000076500000240000000235413402025764021512 0ustar kintelstaff00000000000000Given: VERSION (e.g. 2015.03-1) o Make sure we have a $VERSION branch. If not, create one o Update releases/$VERSION.md o scripts/makereleasenotes.sh o Update VERSION and VERSIONDATE in openscad.pro scripts/publish-macosx.sh scripts/release-common.sh scripts/publish-mingw-x.sh tests/CMakeLists.txt o git tag "openscad-$VERSION" o ./scripts/git-archive-all.py --prefix=openscad-$VERSION/ openscad-$VERSION.src.tar.gz o git push --tags o Upload Source package $ scp openscad-$VERSION.src.tar.gz openscad@files.openscad.org:www o Revert VERSION and VERSIONDATE in openscad.pro scripts/publish-macosx.sh scripts/release-common.sh scripts/publish-mingw-x.sh tests/CMakeLists.txt o Announce: - Write short release email to mailing list - Tweet as OpenSCAD - Notify package managers - Debian/Ubuntu: https://launchpad.net/~chrysn - Ubuntu PPA: https://github.com/hyperair - Fedora: Miro Hrončok or - OpenSUSE: Pavol Rusnak - Arch Linux: Kyle Keen - MacPorts: https://svn.macports.org/repository/macports/trunk/dports/science/openscad/Portfile - Homebrew: https://github.com/caskroom/homebrew-cask/blob/master/Casks/openscad.rb openscad-2019.05/doc/release-checklist.txt0000644000076500000240000000570013465203103020773 0ustar kintelstaff00000000000000OpenSCAD Release Checklist -------------------------- o Pre-release preparations - Update translations: - Send emails to translation managers, see .po files: https://github.com/openscad/openscad/tree/master/locale - Update src/AboutDialog.html with new contributors etc. - Merge MCAD o In MCAD clone: $ git fetch upstream $ git merge upstream/master $ git push o In OpenSCAD: $ cd libraries/MCAD $ git pull $ cd ../.. $ git commit -m "Updated MCAD" libraries/MCAD $ git push (See bottom of this file for how to build release binaries) o Update manpage: doc/openscad.1 o Update releases/$VERSION.md o scripts/makereleasenotes.sh o Update version number in doc/openscad.1 o Update copyright year in AboutDialog.html and mainwin.cc o Add VERSION and VERSIONDATE in openscad.pro, scripts/publish-macosx.sh, scripts/release-common.sh tests/CMakeLists.txt o Add VERSION in tests/CMakeLists.txt, scripts/publish-mingw-x.sh o Tag release git tag "openscad-$VERSION" o Revert VERSION and VERSIONDATE in openscad.pro scripts/publish-macosx.sh scripts/release-common.sh scripts/publish-mingw-x.sh tests/CMakeLists.txt o build source package scripts/git-archive-all.py --prefix=openscad-$VERSION/ openscad-$VERSION.src.tar.gz o Sanity check; build a binary or two and manually run some tests o git push --tags master o Upload Source package $ scp openscad-$VERSION.src.tar.gz openscad@files.openscad.org:www o Build binaries for all platforms and wait for upload o Announce: o ./scripts/github-release.sh $VERSION o Write release email/blog entry o Update web page - news.html - inc/src_release_links.js o Update external resources: - https://en.wikipedia.org/wiki/OpenSCAD o Write to mailing list o Tweet as OpenSCAD o Notify package managers - Debian/Ubuntu: https://launchpad.net/~chrysn - Ubuntu PPA: https://github.com/hyperair - Fedora: Miro Hrončok or - OpenSUSE: Pavol Rusnak - Arch Linux: Kyle Keen - MacPorts: https://svn.macports.org/repository/macports/trunk/dports/science/openscad/Portfile - Homebrew: https://github.com/caskroom/homebrew-cask/blob/master/Casks/openscad.rb o Update dev version to release version in documentation - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual Build and Upload Release Binaries --------------------------------- $ tar xzf openscad-$VERSION.src.tar.gz $ cd openscad-$VERSION Mac OS X: $ ./scripts/publish-macosx.sh -> OpenSCAD-$VERSION.dmg Linux: 32-bit: run on a 32-bit machine or VM 64-bit: run on a 64-bit machine or VM $ ./scripts/release-common.sh -> openscad-$VERSION.x86-ARCH.tar.gz (where ARCH will be detected and set to 32 or 64) $ scp openscad-$VERSION.x86-ARCH.tar.gz openscad@files.openscad.org:www o Update web page with download links Windows mingw cross-build: FIXME: Adapt scripts/builder.sh to build release binaries openscad-2019.05/doc/testing.txt0000644000076500000240000001622513432700636017074 0ustar kintelstaff00000000000000Running regression tests: ------------------------- 0) Prerequisites Install the prerequisite helper programs on your system: cmake, python3 (not 2), ImageMagick 6.5.9.3 or newer, diff There are binary installer packages of these tools available for Mac, Win, Linux, BSD, and other systems. (except maybe diff for Win) Next, get a working qmake GUI build of the main openscad binary working. For Windows(TM) this means get a cross-build working from within linux. See README.md for how to do this. Then, install MCAD under openscad/libraries. $ cd openscad $ git submodule update --init A) Building test environment Linux, Mac: $ cd tests $ cmake . $ make Windows(TM): Cross-build from within linux: 64-bit: $ ./scripts/release-common.sh mingw64 tests $ # result is .zip file under ./mingw64/ 32-bit: $ ./scripts/release-common.sh mingw32 tests $ # result is .zip file under ./mingw32/ B) Running tests Linux, Mac: $ ctest Runs tests enabled by default $ ctest -R Runs only matching tests, e.g. ctest -R dxf $ ctest -C Adds extended tests belonging to configs. Valid configs: Default - Run default tests Heavy - Run more time consuming tests (> ~10 seconds) Examples - test all examples Bugs - test known bugs (tests will fail) All - test everything Win: Unzip the OpenSCAD-Tests-YYYY.MM.DD file onto a Windows(TM) machine. There will be a script called OpenSCAD-Test-Console.py in the parent folder. Double-click it, and it will open a console, from which you can type the ctest commands listed above. C) Automatically upload test results (experimental) It's possible to automatically upload tests results to an external server. This is good for CI, as well as being able to easily report bugs. To enable this feature, add '-DOPENSCAD_UPLOAD_TESTS=1' to the cmake cmd-line, e.g.: cmake -DOPENSCAD_UPLOAD_TESTS=1 . Adding a new test: ------------------ 1) create a test file at an appropriate location under testdata/ 2) if the test is non-obvious, create a human readable description as comments in the test (or in another file in the same directory in case the file isn't human readable) 3) if a new test app was written, this must be added to tests/CMakeLists.txt 4) Add the tests to the test apps for which you want them to run (in tests/CMakeLists.txt) 5) rebuild the test environment 6) run the test with the environment variable TEST_GENERATE=1, e.g.: $ TEST_GENERATE=1 ctest -R mytest (this will generate a mytest-expected.txt file which is used for regression testing) 7) manually verify that the output is correct (tests/regression//mytest-expected.) 8) run the test normally and verify that it passes: $ ctest -R mytest Adding a new example: --------------------- This is almost the same as adding a new regression test: 1) Create the example under examples/ 2) run the test with the environment variable TEST_GENERATE=1, e.g.: $ TEST_GENERATE=1 ctest -C Examples -R exampleNNN (this will generate a exampleNNN-expected.txt file which is used for regression testing) 3) manually verify that the output is correct (tests/regression//exampleNNN.) 4) run the test normally and verify that it passes: $ ctest -C Examples -R exampleNNN Troubleshooting: ------------------------------ 0. Headless unix servers If you are attempting to run the tests on a unix-like system but only have shell-console access, you may be able to run the tests by using a virtual framebuffer program like Xvnc or Xvfb. For example: $ Xvfb :5 -screen 0 800x600x24 & $ DISPLAY=:5 ctest or $ xvfb-run ctest Some versions of Xvfb may fail, however. 1. Trouble finding libraries on unix To help CMAKE find eigen, OpenCSG, CGAL, Boost, and GLEW, you can use environment variables, just like for the main qmake & openscad.pro. Examples: OPENSCAD_LIBRARIES=$HOME cmake . CGALDIR=$HOME/CGAL-3.9 BOOSTDIR=$HOME/boost-1.47.0 cmake . Valid variables are as follows: BOOSTDIR, CGALDIR, EIGENDIR, GLEWDIR, OPENCSGDIR, OPENSCAD_LIBRARIES When running, this might help find your locally built libraries (assuming you installed into $HOME) Linux: export LD_LIBRARY_PATH=$HOME/lib:$HOME/lib64 Mac: export DYLD_LIBRARY_PATH=$HOME/lib 2. Location of logs Logs of test runs are found in tests/build/Testing/Temporary A pretty-printed index.html is in a subdir of tests/build/Testing/Temporary Expected results are found in tests/regression/* Actual results are found in tests/build/testname-output/* 3. Image-based tests takes a long time, they fail, and the log says 'return -11' Imagemagick may have crashed while comparing the expected images to the test-run generated (actual) images. You can try using the alternate ImageMagick comparison method by by erasing CMakeCache, and re-running cmake with -DCOMPARATOR=ncc. This will enable the Normalized Cross Comparison method which is less accurate but won't usually crash. 4. Testing images fails with 'morphology not found" for ImageMagick in the log Your version of imagemagick is old. Upgrade, or pass -DCOMPARATOR=old to cmake. The comparison will be of lowered reliability. 5. Locale errors "terminate called after throwing an instance of 'std::runtime_error' what(): locale::facet::_S_create_c_locale name not valid" Is a boost/libstdc++ bug. Fix like so before running: $ export LC_MESSAGES= 6. I want to build without OpenGL There is an unsupported way to do this, by defining NULLGL to Cmake: mkdir nullglbin cd nullglbin && cmake .. -DNULLGL=1 && make The resulting openscad_nogui binary will fail most tests, but may be useful for debugging and outputting 3d-formats like STL on systems without GL. This option may break in the future and require tweaking to get working again. 7. Proprietary GL driver issues There are sporadic reports of problems running on remote machines with proprietary GL drivers. Try doing a web search for your exact error message to see solutions and workarounds that others have found. 8. Windows + MSVC: The MSVC build was last tested circa 2012. The last time it worked, these were the necessary commands to run. > Start the 'QT command prompt' > cd \where\you\installed\openscad > cd tests > cmake . -DCMAKE_BUILD_TYPE=Release > sed -i s/\/MD/\/MT/ CMakeCache.txt > cmake . > nmake -f Makefile 9. Other issues The OpenSCAD User Manual Wiki has a section on buildling. Please check there for possible updates and workarounds: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual Please report build errors (after double checking the instructions) in the github issue tracker https://github.com/openscad/openscad/issues 10. Migration away from dedicated regression tests: In 2013 the test programs underwent a major change. The following notes are leftover. "This test still needs an intermediate script that mangles away timestamps and near-zero floating point numbers: * cgalstlsanitytest Some tests are yet to be converted: * csgtexttest -- verify whether this is not redundant with dumptest These look like tests, but are not actually in use: * modulecachetest * cgalcachetest " openscad-2019.05/doc/translation.txt0000644000076500000240000000772013423115164017751 0ustar kintelstaff00000000000000OpenSCAD human language translation =================================== We use the GNU gettext system, both for c++ code as well as QT's .ui files. The latter is accomplished by the '-tr' feature of QT's uic to insert a gettext wrapper into the ui_xxxxx.h files. For somewhat similar designs, see the source code of projects like celestia, stellarium, licq, merkaartor, etc (although they typically use cmake). Currently the build system does not auto-update anything. The .mo files must be generated by running the gettext tools: xgettext, msgmerge, and msgfmt. There is a script included, translation-update.sh, that automates this process. File layout: ============ ./locale/*.po - .po files, one per language ./locale/openscad.pot - .pot template, generated by xgettext ./locale/POTFILES - list of source files with translatable strings (generated) ./locale/LINGUAS - list of language codes for which .po files exist ./src/qtgettext.h - wrapper code between QT and GNU gettext ./scripts/translation-update.sh - simple unix helper script ./locale/xx/LC_MESSAGES/openscad.mo - 'binaries' of .po files, built by script To translate the strings: ========================= Use a text editor or special program (poedit or lokalize) to edit the .po file. ( See https://en.opensuse.org/SDB:Localization_work_with_po_files ) Then submit your new .po file as an OpenSCAD github issue or pull request: https://github.com/openscad/openscad/issues/ In the future there might be a site to allow translations in a browser: https://translations.launchpad.net/openscad If all else fails, email the OpenSCAD mailing list with your new .po file attached. To make source code changes: ============================ In .cc files, #include "printutils.h" and change each "text" into _("text"). You can also use ngettext if need be. In .ui files, #include "qtgettext.h" first in the .h file (see MainWindow.h). $ make clean && qmake CONFIG+=experimental && make Then run the script to scan the source files, and regenerate .pot & .po files. You'll need itstool (http://itstool.org/) installed. $ ./scripts/translation-update.sh This will create new .po files with any new untranslated strings you added to the source code. These .po files can be distributed to translators for translation. After the translated .po file is obtained, overwrite the old .po and run the same script to update the .mo files. $ ./scripts/translation-update.sh Message Context: ================ Some messages need a different translation, depending on the context of the message. To enable translators to use different translation for the same english message, context can be used. Typically short messages tend to need context more often then long messages. There is no need to add a context preemptively, please wait until a specific need arises. Please note that message context should follow some constrains: - message context comes at some perfomance penalty - Keep the context name short - try to pick a context name that is unlikely to change (changing the context name requires the translates to update the translation) - do not abuse the message context as a comment The first paramater of _(msgid, msgctxt) and q_(msgid, msgctxt) is the message itself. The second parameter of _(msgid, msgctxt) and q_(msgid, msgctxt) respectivly is the message context. Note that msgid and msgctxt are swapped compared to pgettext. To add a new language: ====================== First add the language code to file ./locale/LINGUAS. Then run msginit, replacing $LANGCODE with the language code you want. $ msginit -l $LANGCODE -o ./locale/$LANGCODE.po -i ./locale/openscad.pot You will now have a new ./locale/xx.po file to edit and translate Testing: ======== On unix, set the locale related environment variables. For example in French, run this: $ LANGUAGE=fr ./openscad Linux system trace tools can help find errors. To show open()s on .mo files: $ LANGUAGE=fr strace -f ./openscad 2>&1 | grep LC_MESSAGES openscad-2019.05/doc/visitor-changes.txt0000644000076500000240000000072613402025764020522 0ustar kintelstaff00000000000000Changes in visitor branch: o import_dxf(): layername="" imports all layers. Importing a single layer with a zero-length name is no longer supported. FIXME: The same prob. goes for dims o cylinder(): the r parameter will now always be used in place of a missing r1 or r2 o for(): - with scalar argument now works, e.g.: for (i=23) echo(i) - empty for loop is not evaluated, e.g. for () echo(i) - for loop with illegal value is not evaluated, e.g. for ([0:true:2]) openscad-2019.05/dsa_pub.pem0000644000076500000240000000121613402025764016222 0ustar kintelstaff00000000000000-----BEGIN PUBLIC KEY----- MIIBtjCCASsGByqGSM44BAEwggEeAoGBAMP6y57wSCnUvfwehhit5K8EU4W3uf6s zCFUGWIxWaweWjkezHIZLz7pTv0dLm5Va0vKTIWgrNseTtdTaJ491lyGAHWlu9sP LAe/vG+UpIA6uNZX3gB7dDxunRUenTczYgnVoQWSIVRhZUEjci9WgbJJrguTPQvi cCfuI6Hox6cDAhUA3duJXWi3eaOIMqCfm6RpEt/fRC8CgYApHNQB5Ar/SIPobxtJ Ox05xhhgm/YOJbGUcSZjsMgEP6rj+269vCBnYG+eE3nelXfOA5SXbOfY6Ju6+RBS OdPeNbWZah88QJK8bqBH7KS/EkMaiEXerPEIEIC5xOjKjYXs1z8AtNGUGORwWwjm 85et2nY/WXvIJkUQtET/bWEYPQOBhAACgYB7hBLdC5rXpV0nqEmI4QYYt63OdP4D Lf2XISyKi9H1F+6mwoeU4It7fMdGC1MBXyx/3sv8U1YbYIeDHB+lDy6QN2UxSBTN VI9UPUqdcoYZwQiaHHgqWcoyPDqzEVsFtHi3/pXLckuszA19NT8980o+7noiKxUm 3pDa4C+oANPFCQ== -----END PUBLIC KEY----- openscad-2019.05/examples/Advanced/GEB.scad0000644000076500000240000000341113402025764020655 0ustar kintelstaff00000000000000font = "Liberation Sans"; // Nicer, but not generally installed: // font = "Bank Gothic"; module G() offset(0.3) text("G", size=10, halign="center", valign="center", font = font); module E() offset(0.3) text("E", size=10, halign="center", valign="center", font = font); module B() offset(0.5) text("B", size=10, halign="center", valign="center", font = font); $fn=64; module GEB() { intersection() { linear_extrude(height = 20, convexity = 3, center=true) B(); rotate([90, 0, 0]) linear_extrude(height = 20, convexity = 3, center=true) E(); rotate([90, 0, 90]) linear_extrude(height = 20, convexity = 3, center=true) G(); } } color("Ivory") GEB(); color("MediumOrchid") translate([0,0,-20]) linear_extrude(1) difference() { square(40, center=true); projection() GEB(); } color("DarkMagenta") rotate([90,0,0]) translate([0,0,-20]) linear_extrude(1) difference() { translate([0,0.5]) square([40,39], center=true); projection() rotate([-90,0,0]) GEB(); } color("MediumSlateBlue") rotate([90,0,90]) translate([0,0,-20]) linear_extrude(1) difference() { translate([-0.5,0.5]) square([39,39], center=true); projection() rotate([0,-90,-90]) GEB(); } echo(version=version()); // Written in 2015 by Marius Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/animation.scad0000644000076500000240000000611113402025764022237 0ustar kintelstaff00000000000000// animation.scad - Demo of animation usage // The animation funtionality is based simply on a variable $t // that is changed automatically by OpenSCAD while repeatedly // showing the model. // To activate animation, select "View->Animation" from the // menu and enter values into the appearing FPS and Steps input // fields (e.g. 5 FPS and 200 Steps for this animation). // This is not intended to directly produce real-time animations // but the image sequence can be exported to generate videos of // the animation. // Length of the 2 arm segments, change to see the effects on // the arm movements. //length of the red arm arm1_length = 70; //length of the green arm arm2_length = 50; r = 2; $fn = 30; plate(); pos = position($t); arm(pos[0], pos[1], arm1_length, arm2_length); // Function describing the X/Y position that should be traced // by the arm over time. // The $t variable will be used as parameter for this function // so the range for t is [0..1]. function position(t) = t < 0.5 ? [ 200 * t - 50, 30 * sin(5 * 360 * t) + 60 ] : [ 50 * cos(360 * (t - 0.5)), 100 * -sin(360 * (t- 0.5)) + 60 ]; // Inverse kinematics functions for a scara style arm // See http://forums.reprap.org/read.php?185,283327 function sq(x, y) = x * x + y * y; function angB(x, y, l1, l2) = 180 - acos((l2 * l2 + l1 * l1 - sq(x, y)) / (2 * l1 * l2)); function ang2(x, y, l1, l2) = 90 - acos((l2 * l2 - l1 * l1 + sq(x, y)) / (2 * l2 * sqrt(sq(x, y)))) - atan2(x, y); function ang1(x, y, l1, l2) = ang2(x, y, l1, l2) + angB(x, y, l1, l2); // Draw an arm segment with the given color and length. module segment(col, l) { color(col) { hull() { sphere(r); translate([l, 0, 0]) sphere(r); } } } // Draw the whole 2 segmented arm trying to reach position x/y. // Parameters l1 and l2 are the length of the two arm segments. module arm(x, y, l1, l2) { a1 = ang1(x, y, l1, l2); a2 = ang2(x, y, l1, l2); sphere(r = 2 * r); cylinder(r = 2, h = 6 * r, center = true); rotate([0, 0, a1]) segment("red", l1); translate(l1 * [cos(a1), sin(a1), 0]) { sphere(r = 2 * r); rotate([0, 0, a2]) segment("green", l2); } translate([x, y, -r/2]) cylinder(r1 = 0, r2 = r, h = 4 * r, center = true); } module curve() polygon([for (a = [ 0 : 0.004 : 1]) position(a)]); // Draws the plate and the traced function using small black cubes. module plate() { %translate([0, 0, -3*r]) { translate([0,25,0]) cube([150, 150, 0.1], center = true); color("Black") linear_extrude(0.1) difference() { curve(); offset(-1) curve(); } } } echo(version=version()); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/assert.scad0000644000076500000240000000213513402025764021563 0ustar kintelstaff00000000000000echo(version=version()); function size(x) = assert(x % 2 == 0, "Size must be an even number") x; module ring(r = 10, cnt = 3, s = 6) { assert(r >= 10, "Parameter r must be >= 10"); assert(cnt >= 3 && cnt <= 20, "Parameter cnt must be between 3 and 20 (inclusive"); for (a = [0 : cnt - 1]) { rotate(a * 360 / cnt) translate([r, 0, 0]) cube(size(s), center = true); } } // ring(5, 5, 4); // trigger assertion for parameter r // ring(10, 2, 4); // trigger assertion for parameter cnt // ring(10, 3, 5); // trigger assertion in function size() color("red") ring(10, 3, 4); color("green") ring(25, 9, 6); color("blue") ring(40, 20, 8); // Written in 2018 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/children.scad0000644000076500000240000000300513402025764022047 0ustar kintelstaff00000000000000// children.scad - Usage of children() // The use of children() allows to write generic modules that // modify child modules regardless of how the child geometry // is created. color("red") make_ring_of(radius = 15, count = 6) cube(8, center = true); color("green") make_ring_of(radius = 30, count = 12) difference() { sphere(5); cylinder(r = 2, h = 12, center = true); } color("cyan") make_ring_of(radius = 50, count = 4) something(); module make_ring_of(radius, count) { for (a = [0 : count - 1]) { angle = a * 360 / count; translate(radius * [sin(angle), -cos(angle), 0]) rotate([0, 0, angle]) children(); } } module something() { cube(10, center = true); cylinder(r = 2, h = 12, $fn = 40); translate([0, 0, 12]) rotate([90, 0, 0]) linear_extrude(height = 2, center = true) text("SCAD", 8, halign = "center"); translate([0, 0, 12]) cube([22, 1.6, 0.4], center = true); } echo(version=version()); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/children_indexed.scad0000644000076500000240000000353713402025764023561 0ustar kintelstaff00000000000000// children_indexed.scad - Usage of indexed children() // children() with a parameter allows access to a specific child // object with children(0) being the first one. In addition the // $children variable is automatically set to the number of child // objects. color("red") translate([-100, -20, 0]) align_in_grid_and_add_text(); color("yellow") translate([-50, -20, 0]) align_in_grid_and_add_text() { cube(5, center = true); } color("cyan") translate([0, -20, 0]) align_in_grid_and_add_text() { cube(5, center = true); sphere(4); } color("green") translate([50, -20, 0]) align_in_grid_and_add_text() { cube(5, center = true); sphere(4); cylinder(r = 4, h = 5); } module align_in_grid_and_add_text() { if ($children == 0) { linear_extrude(height = 1, center = true) text("Nothing...", 6, halign = "center"); } else { t = $children == 1 ? "one object" : str($children, " objects "); linear_extrude(height = 1, center = true) text(t, 6, halign = "center"); for (y = [0 : $children - 1]) for (x = [0 : $children - 1]) translate([15 * (x - ($children - 1) / 2), 20 * y + 40, 0]) scale(1 + x / $children) children(y); } } echo(version=version()); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/module_recursion.scad0000644000076500000240000000413113402025764023636 0ustar kintelstaff00000000000000// Recursive calls of modules can generate complex geometry, especially // fractal style objects. // The example uses a recursive module to generate a random tree as // described in http://natureofcode.com/book/chapter-8-fractals/ // number of levels for the recursion levels = 10; // [1:1:14] // length of the first segment len = 100; // [10:10:200] // thickness of the first segment thickness = 5; //[1:1:20] // the identity matrix identity = [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ]; // random generator, to generate always the same output for the example, // this uses a seed for rands() and stores the array of random values in // the random variable. To generate different output, remove the seed or // replace the function rnd() to just call rands(s, e, 1)[0]. rcnt = 1000; random = rands(0, 1, rcnt, 18); function rnd(s, e, r) = random[r % rcnt] * (e - s) + s; // generate 4x4 translation matrix function mt(x, y) = [ [ 1, 0, 0, x ], [ 0, 1, 0, y ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ]; // generate 4x4 rotation matrix around Z axis function mr(a) = [ [ cos(a), -sin(a), 0, 0 ], [ sin(a), cos(a), 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ]; module tree(length, thickness, count, m = identity, r = 1) { color([0, 1 - (0.8 / levels * count), 0]) multmatrix(m) square([thickness, length]); if (count > 0) { tree(rnd(0.6, 0.8, r) * length, 0.8 * thickness, count - 1, m * mt(0, length) * mr(rnd(20, 35, r + 1)), 8 * r); tree(rnd(0.6, 0.8, r + 1) * length, 0.8 * thickness, count - 1, m * mt(0, length) * mr(-rnd(20, 35, r + 3)), 8 * r + 4); } } tree(len, thickness, levels); echo(version=version()); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/offset.scad0000644000076500000240000000202413402025764021545 0ustar kintelstaff00000000000000// offset.scad - Example for offset() usage in OpenSCAD $fn = 40; foot_height = 20; echo(version=version()); module outline(wall = 1) { difference() { offset(wall / 2) children(); offset(-wall / 2) children(); } } // offsetting with a positive value allows to create rounded corners easily linear_extrude(height = foot_height, scale = 0.5) { offset(10) { square(50, center = true); } } translate([0, 0, foot_height]) { linear_extrude(height = 20) { outline(wall = 2) circle(15); } } %cylinder(r = 14, h = 100); %translate([0, 0, 100]) sphere(r = 30); // Written in 2014 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Advanced/surface_image.png0000644000076500000240000000643013402025764022730 0ustar kintelstaff00000000000000PNG  IHDR22] pHYs  tIME|b IDATX͙ٯǕw_Zg<4$ؑd-W+vI6{y %YvKLD5Skѐ! \<uq=!R 'XRb[Hַ3h v?wveK*Egۨ1?r^o6l;ͦdl -y9ڒƽOCt`:-QXJlh6=hͭ~5s|' Rl_~gg1RE8zxNw“ٳ_嗳Y 3hq>FpMlb[ucb:=nj`)ܸ{wug |M9iyrh($A U`APcwκ+~l+ aA-pv,Cn+=ЂTH ^z踇/_F9.,<kܼܹijF=6467v:fCF;<rm#D6L#$7O_fwcn*I L!Blܻn{QQ!7 kX f˃|?^GJu߬P2.-XW*7LGnupa m^zr1b28" ՆNg4@ 8ւZ WR ]K)G[4o8XA-3GƜjN8tЃmâei+eG"Ihcϣ*Sa\А wwoayvI-Q[5 ZtlJa|hЃ)58Z9_m3./[JJH$,ɋE4?=曳~0 ww׍Σy$$1Y.?꫓o[BjEYQ5E΂]׋$OQ}}tt5hg:I2#>.7T 7G_̸./^i%yYfRҿ/.xAA*2 /K(*Jt1Pb6CW+,0u0qG,-8\XXcr1 `Y+0` Yb,TK1T%EI Xo70 H,04e֫,?`φ̣e3XFc*SKK! 2Hޑizm~Jm`Ysb}'b? "j+V,%͌ê?29HIENDB`openscad-2019.05/examples/Advanced/surface_image.scad0000644000076500000240000000166013402025764023056 0ustar kintelstaff00000000000000echo(version=version()); // surface() can import images, the pixel values are converted // to grayscale and converted to values between 0 and 100. // The example takes 3 cuts from the height map and displays // those as 3 stacked layers. for (a = [1, 2, 3]) color([a/6 + 0.5, 0, 0]) linear_extrude(height = 2 * a, convexity = 10) projection(cut = true) translate([0, 0, -30 * a]) surface("surface_image.png", center = true); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/CSG-modules.scad0000644000076500000240000000470213402025764022045 0ustar kintelstaff00000000000000// CSG-modules.scad - Basic usage of modules, if, color, $fs/$fa // Change this to false to remove the helper geometry debug = true; // Global resolution $fs = 0.1; // Don't generate smaller facets than 0.1 mm $fa = 5; // Don't generate larger angles than 5 degrees // Main geometry difference() { intersection() { body(); intersector(); } holes(); } // Helpers if (debug) helpers(); // Core geometric primitives. // These can be modified to create variations of the final object module body() { color("Blue") sphere(10); } module intersector() { color("Red") cube(15, center=true); } module holeObject() { color("Lime") cylinder(h=20, r=5, center=true); } // Various modules for visualizing intermediate components module intersected() { intersection() { body(); intersector(); } } module holeA() rotate([0,90,0]) holeObject(); module holeB() rotate([90,0,0]) holeObject(); module holeC() holeObject(); module holes() { union() { holeA(); holeB(); holeC(); } } module helpers() { // Inner module since it's only needed inside helpers module line() color("Black") cylinder(r=1, h=10, center=true); scale(0.5) { translate([-30,0,-40]) { intersected(); translate([-15,0,-35]) body(); translate([15,0,-35]) intersector(); translate([-7.5,0,-17.5]) rotate([0,30,0]) line(); translate([7.5,0,-17.5]) rotate([0,-30,0]) line(); } translate([30,0,-40]) { holes(); translate([-10,0,-35]) holeA(); translate([10,0,-35]) holeB(); translate([30,0,-35]) holeC(); translate([5,0,-17.5]) rotate([0,-20,0]) line(); translate([-5,0,-17.5]) rotate([0,30,0]) line(); translate([15,0,-17.5]) rotate([0,-45,0]) line(); } translate([-20,0,-22.5]) rotate([0,45,0]) line(); translate([20,0,-22.5]) rotate([0,-45,0]) line(); } } echo(version=version()); // Written by Marius Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/CSG.scad0000644000076500000240000000140613402025764020375 0ustar kintelstaff00000000000000// CSG.scad - Basic example of CSG usage translate([-24,0,0]) { union() { cube(15, center=true); sphere(10); } } intersection() { cube(15, center=true); sphere(10); } translate([24,0,0]) { difference() { cube(15, center=true); sphere(10); } } echo(version=version()); // Written by Marius Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/LetterBlock.scad0000644000076500000240000000226213402025764022174 0ustar kintelstaff00000000000000// LetterBlock.scad - Basic usage of text() and linear_extrude() // Module instantiation LetterBlock("M"); // Module definition. // size=30 defines an optional parameter with a default value. module LetterBlock(letter, size=30) { difference() { translate([0,0,size/4]) cube([size,size,size/2], center=true); translate([0,0,size/6]) { // convexity is needed for correct preview // since characters can be highly concave linear_extrude(height=size, convexity=4) text(letter, size=size*22/30, font="Bitstream Vera Sans", halign="center", valign="center"); } } } echo(version=version()); // Written by Marius Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/linear_extrude.scad0000644000076500000240000000237213402025764022776 0ustar kintelstaff00000000000000echo(version=version()); // simple 2D -> 3D extrusion of a rectangle color("red") translate([0, -30, 0]) linear_extrude(height = 20) square([20, 10], center = true); // using the scale parameter a frustum can be constructed color("green") translate([-30, 0, 0]) linear_extrude(height = 20, scale = 0.2) square([20, 10], center = true); // with twist the extruded shape will rotate around the Z axis color("cyan") translate([30, 0, 0]) linear_extrude(height = 20, twist = 90) square([20, 10], center = true); // combining both relatively complex shapes can be created color("gray") translate([0, 30, 0]) linear_extrude(height = 40, twist = -360, scale = 0, center = true, slices = 200) square([20, 10], center = true); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/logo.scad0000644000076500000240000000233413402025764020722 0ustar kintelstaff00000000000000// logo.scad - Basic example of module, top-level variable and $fn usage Logo(50); // The $fn parameter will influence all objects inside this module // It can, optionally, be overridden when instantiating the module module Logo(size=50, $fn=100) { // Temporary variables hole = size/2; cylinderHeight = size * 1.25; // One positive object (sphere) and three negative objects (cylinders) difference() { sphere(d=size); cylinder(d=hole, h=cylinderHeight, center=true); // The '#' operator highlights the object #rotate([90, 0, 0]) cylinder(d=hole, h=cylinderHeight, center=true); rotate([0, 90, 0]) cylinder(d=hole, h=cylinderHeight, center=true); } } echo(version=version()); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/logo_and_text.scad0000644000076500000240000000257713402025764022621 0ustar kintelstaff00000000000000// logo_and_text.scad - Example for use<> and text() use // Imports the Logo() module from logo.scad into this namespace // Set the initial viewport parameters $vpr = [90, 0, 0]; $vpt = [250, 0, 80]; $vpd = 500; logosize = 120; translate([110, 0, 80]) { translate([0, 0, 30]) rotate([25, 25, -40]) Logo(logosize); translate([100, 0, 40]) green() t("Open", 42, ":style=Bold"); translate([247, 0, 40]) black() t("SCAD", 42, ":style=Bold"); translate([100, 0, 0]) black() t("The Programmers"); translate([160, 0, -30]) black() t("Solid 3D CAD Modeller"); } // Helper to create 3D text with correct font and orientation module t(t, s = 18, style = "") { rotate([90, 0, 0]) linear_extrude(height = 1) text(t, size = s, font = str("Liberation Sans", style), $fn = 16); } // Color helpers module green() color([81/255, 142/255, 4/255]) children(); module black() color([0, 0, 0]) children(); echo(version=version()); // Written in 2014 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/projection.scad0000644000076500000240000000373413402025764022143 0ustar kintelstaff00000000000000echo(version=version()); %import("projection.stl"); // projection() without the cut = true parameter will project // the outline of the object onto the X/Y plane. The result is // a 2D shape. color("red") translate([0, 0, -20]) linear_extrude(height = 2, center = true) difference() { square(30, center = true); projection() import("projection.stl"); } color("green") rotate([0, 90, 0]) translate([0, 0, -20]) linear_extrude(height = 2, center = true) difference() { square(30, center = true); projection() rotate([0, 90, 0]) import("projection.stl"); } color("cyan") rotate([-90, 0, 0]) translate([0, 0, 20]) linear_extrude(height = 2, center = true) difference() { square(30, center = true); projection() rotate([90, 0, 0]) import("projection.stl"); } // Including the cut = true uses the outline of the cut at // the X/Y plane.at Z = 0. This can make internal features // of the model visible. color("yellow", 0.5) translate([0, 0, 20]) linear_extrude(height = 2, center = true) difference() { square(30, center = true); projection(cut = true) import("projection.stl"); } // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/projection.stl0000644000076500000240000262661313402025764022044 0ustar kintelstaff00000000000000solid Exported from Blender-2.72 (sub 0) facet normal 0.336843 -0.016546 0.941415 outer loop vertex -0.870852 0.000000 -2.870821 vertex -0.866659 0.085359 -2.870821 vertex -1.142520 0.112529 -2.771639 endloop endfacet facet normal 0.336841 -0.016550 0.941416 outer loop vertex -1.142520 0.112529 -2.771639 vertex -1.148049 0.000000 -2.771639 vertex -0.870852 0.000000 -2.870821 endloop endfacet facet normal 0.988010 -0.048541 0.146560 outer loop vertex -2.942356 0.000000 -0.585272 vertex -2.928187 0.288402 -0.585272 vertex -2.971178 0.292636 -0.294052 endloop endfacet facet normal 0.988011 -0.048537 0.146556 outer loop vertex -2.971178 0.292636 -0.294052 vertex -2.985554 0.000000 -0.294052 vertex -2.942356 0.000000 -0.585272 endloop endfacet facet normal 0.595443 -0.029251 -0.802865 outer loop vertex -1.903180 0.000000 2.319032 vertex -1.894016 0.186544 2.319032 vertex -1.658685 0.163366 2.494409 endloop endfacet facet normal 0.595444 -0.029254 -0.802864 outer loop vertex -1.658685 0.163366 2.494409 vertex -1.666711 0.000000 2.494409 vertex -1.903180 0.000000 2.319032 endloop endfacet facet normal 0.513936 -0.025249 0.857457 outer loop vertex -1.414189 0.000000 -2.645764 vertex -1.407379 0.138615 -2.645764 vertex -1.658684 0.163366 -2.494410 endloop endfacet facet normal 0.513937 -0.025246 0.857456 outer loop vertex -1.658684 0.163366 -2.494410 vertex -1.666709 0.000000 -2.494410 vertex -1.414189 0.000000 -2.645764 endloop endfacet facet normal 0.427464 -0.020998 -0.903789 outer loop vertex -1.414190 0.000000 2.645763 vertex -1.407381 0.138615 2.645763 vertex -1.142522 0.112529 2.771639 endloop endfacet facet normal 0.427464 -0.020999 -0.903788 outer loop vertex -1.142522 0.112529 2.771639 vertex -1.148050 0.000000 2.771639 vertex -1.414190 0.000000 2.645763 endloop endfacet facet normal 0.997595 -0.049009 -0.049007 outer loop vertex -3.000000 0.000000 -0.000001 vertex -2.985554 0.294052 -0.000001 vertex -2.971178 0.292636 0.294051 endloop endfacet facet normal 0.997595 -0.049007 -0.049009 outer loop vertex -2.971178 0.292636 0.294051 vertex -2.985554 0.000000 0.294051 vertex -3.000000 0.000000 -0.000001 endloop endfacet facet normal 0.671194 -0.032976 0.740548 outer loop vertex -1.903179 0.000000 -2.319033 vertex -1.894014 0.186544 -2.319033 vertex -2.111104 0.207926 -2.121322 endloop endfacet facet normal 0.671195 -0.032975 0.740548 outer loop vertex -2.111104 0.207926 -2.121322 vertex -2.121319 0.000000 -2.121322 vertex -1.903179 0.000000 -2.319033 endloop endfacet facet normal 0.242964 -0.011935 -0.969962 outer loop vertex -0.870854 0.000000 2.870821 vertex -0.866661 0.085359 2.870821 vertex -0.582453 0.057367 2.942356 endloop endfacet facet normal 0.242964 -0.011935 -0.969962 outer loop vertex -0.582453 0.057367 2.942356 vertex -0.585271 0.000000 2.942356 vertex -0.870854 0.000000 2.870821 endloop endfacet facet normal 0.968931 -0.047600 -0.242708 outer loop vertex -2.942356 0.000000 0.585271 vertex -2.928188 0.288402 0.585271 vertex -2.856997 0.281390 0.870853 endloop endfacet facet normal 0.968931 -0.047601 -0.242706 outer loop vertex -2.856997 0.281390 0.870853 vertex -2.870821 0.000000 0.870853 vertex -2.942356 0.000000 0.585271 endloop endfacet facet normal 0.802582 -0.039429 0.595237 outer loop vertex -2.319031 0.000000 -1.903181 vertex -2.307864 0.227305 -1.903181 vertex -2.482397 0.244495 -1.666712 endloop endfacet facet normal 0.802584 -0.039427 0.595235 outer loop vertex -2.482397 0.244495 -1.666712 vertex -2.494408 0.000000 -1.666712 vertex -2.319031 0.000000 -1.903181 endloop endfacet facet normal 0.903100 -0.044366 -0.427132 outer loop vertex -2.771638 0.000000 1.148050 vertex -2.758292 0.271668 1.148050 vertex -2.633024 0.259330 1.414190 endloop endfacet facet normal 0.903101 -0.044367 -0.427131 outer loop vertex -2.633024 0.259330 1.414190 vertex -2.645764 0.000000 1.414190 vertex -2.771638 0.000000 1.148050 endloop endfacet facet normal 0.903099 -0.044366 0.427135 outer loop vertex -2.645763 0.000000 -1.414191 vertex -2.633023 0.259330 -1.414191 vertex -2.758292 0.271668 -1.148051 endloop endfacet facet normal 0.903099 -0.044366 0.427135 outer loop vertex -2.758292 0.271668 -1.148051 vertex -2.771638 0.000000 -1.148051 vertex -2.645763 0.000000 -1.414191 endloop endfacet facet normal 0.242964 -0.011935 0.969962 outer loop vertex -0.585269 0.000000 -2.942356 vertex -0.582451 0.057367 -2.942356 vertex -0.866659 0.085359 -2.870821 endloop endfacet facet normal 0.242964 -0.011935 0.969962 outer loop vertex -0.866659 0.085359 -2.870821 vertex -0.870852 0.000000 -2.870821 vertex -0.585269 0.000000 -2.942356 endloop endfacet facet normal 0.968932 -0.047601 0.242703 outer loop vertex -2.870821 0.000000 -0.870855 vertex -2.856997 0.281390 -0.870855 vertex -2.928187 0.288402 -0.585272 endloop endfacet facet normal 0.968931 -0.047604 0.242706 outer loop vertex -2.928187 0.288402 -0.585272 vertex -2.942356 0.000000 -0.585272 vertex -2.870821 0.000000 -0.870855 endloop endfacet facet normal 0.671196 -0.032975 -0.740547 outer loop vertex -2.121320 0.000000 2.121321 vertex -2.111105 0.207926 2.121321 vertex -1.894016 0.186544 2.319032 endloop endfacet facet normal 0.671195 -0.032972 -0.740547 outer loop vertex -1.894016 0.186544 2.319032 vertex -1.903180 0.000000 2.319032 vertex -2.121320 0.000000 2.121321 endloop endfacet facet normal 0.427460 -0.021003 0.903790 outer loop vertex -1.148049 0.000000 -2.771639 vertex -1.142520 0.112529 -2.771639 vertex -1.407379 0.138615 -2.645764 endloop endfacet facet normal 0.427461 -0.021001 0.903790 outer loop vertex -1.407379 0.138615 -2.645764 vertex -1.414189 0.000000 -2.645764 vertex -1.148049 0.000000 -2.771639 endloop endfacet facet normal 0.997595 -0.049007 0.049008 outer loop vertex -2.985554 0.000000 -0.294052 vertex -2.971178 0.292636 -0.294052 vertex -2.985554 0.294052 -0.000001 endloop endfacet facet normal 0.997595 -0.049009 0.049009 outer loop vertex -2.985554 0.294052 -0.000001 vertex -3.000000 0.000000 -0.000001 vertex -2.985554 0.000000 -0.294052 endloop endfacet facet normal 0.513937 -0.025249 -0.857456 outer loop vertex -1.666711 0.000000 2.494409 vertex -1.658685 0.163366 2.494409 vertex -1.407381 0.138615 2.645763 endloop endfacet facet normal 0.513935 -0.025245 -0.857457 outer loop vertex -1.407381 0.138615 2.645763 vertex -1.414190 0.000000 2.645763 vertex -1.666711 0.000000 2.494409 endloop endfacet facet normal 0.595445 -0.029250 0.802864 outer loop vertex -1.666709 0.000000 -2.494410 vertex -1.658684 0.163366 -2.494410 vertex -1.894014 0.186544 -2.319033 endloop endfacet facet normal 0.595442 -0.029255 0.802865 outer loop vertex -1.894014 0.186544 -2.319033 vertex -1.903179 0.000000 -2.319033 vertex -1.666709 0.000000 -2.494410 endloop endfacet facet normal 0.336843 -0.016547 -0.941415 outer loop vertex -1.148050 0.000000 2.771639 vertex -1.142522 0.112529 2.771639 vertex -0.866661 0.085359 2.870821 endloop endfacet facet normal 0.336843 -0.016546 -0.941416 outer loop vertex -0.866661 0.085359 2.870821 vertex -0.870854 0.000000 2.870821 vertex -1.148050 0.000000 2.771639 endloop endfacet facet normal 0.988011 -0.048537 -0.146556 outer loop vertex -2.985554 0.000000 0.294051 vertex -2.971178 0.292636 0.294051 vertex -2.928188 0.288402 0.585271 endloop endfacet facet normal 0.988011 -0.048537 -0.146556 outer loop vertex -2.928188 0.288402 0.585271 vertex -2.942356 0.000000 0.585271 vertex -2.985554 0.000000 0.294051 endloop endfacet facet normal 0.740460 -0.036378 0.671116 outer loop vertex -2.121319 0.000000 -2.121322 vertex -2.111104 0.207926 -2.121322 vertex -2.307864 0.227305 -1.903181 endloop endfacet facet normal 0.740460 -0.036377 0.671115 outer loop vertex -2.307864 0.227305 -1.903181 vertex -2.319031 0.000000 -1.903181 vertex -2.121319 0.000000 -2.121322 endloop endfacet facet normal 0.146725 -0.007208 -0.989151 outer loop vertex -0.292635 0.028822 2.985554 vertex -0.294051 0.000000 2.985554 vertex -0.585271 0.000000 2.942356 endloop endfacet facet normal 0.146725 -0.007207 -0.989151 outer loop vertex -0.585271 0.000000 2.942356 vertex -0.582453 0.057367 2.942356 vertex -0.292635 0.028822 2.985554 endloop endfacet facet normal 0.940538 -0.046206 -0.336530 outer loop vertex -2.870821 0.000000 0.870853 vertex -2.856997 0.281390 0.870853 vertex -2.758292 0.271668 1.148050 endloop endfacet facet normal 0.940538 -0.046205 -0.336531 outer loop vertex -2.758292 0.271668 1.148050 vertex -2.771638 0.000000 1.148050 vertex -2.870821 0.000000 0.870853 endloop endfacet facet normal 0.856969 -0.042099 0.513646 outer loop vertex -2.494408 0.000000 -1.666712 vertex -2.482397 0.244495 -1.666712 vertex -2.633023 0.259330 -1.414191 endloop endfacet facet normal 0.856969 -0.042100 0.513646 outer loop vertex -2.633023 0.259330 -1.414191 vertex -2.645763 0.000000 -1.414191 vertex -2.494408 0.000000 -1.666712 endloop endfacet facet normal 0.856969 -0.042100 -0.513646 outer loop vertex -2.645764 0.000000 1.414190 vertex -2.633024 0.259330 1.414190 vertex -2.482398 0.244495 1.666711 endloop endfacet facet normal 0.856968 -0.042099 -0.513646 outer loop vertex -2.482398 0.244495 1.666711 vertex -2.494409 0.000000 1.666711 vertex -2.645764 0.000000 1.414190 endloop endfacet facet normal 0.146725 -0.007208 0.989151 outer loop vertex -0.294049 0.000000 -2.985554 vertex -0.292633 0.028822 -2.985554 vertex -0.582451 0.057367 -2.942356 endloop endfacet facet normal 0.146725 -0.007207 0.989151 outer loop vertex -0.582451 0.057367 -2.942356 vertex -0.585269 0.000000 -2.942356 vertex -0.294049 0.000000 -2.985554 endloop endfacet facet normal 0.940538 -0.046205 0.336531 outer loop vertex -2.771638 0.000000 -1.148051 vertex -2.758292 0.271668 -1.148051 vertex -2.856997 0.281390 -0.870855 endloop endfacet facet normal 0.940538 -0.046206 0.336532 outer loop vertex -2.856997 0.281390 -0.870855 vertex -2.870821 0.000000 -0.870855 vertex -2.771638 0.000000 -1.148051 endloop endfacet facet normal 0.240623 -0.035695 0.969962 outer loop vertex -0.582451 0.057367 -2.942356 vertex -0.574023 0.114181 -2.942356 vertex -0.854119 0.169895 -2.870821 endloop endfacet facet normal 0.240624 -0.035694 0.969962 outer loop vertex -0.854119 0.169895 -2.870821 vertex -0.866659 0.085359 -2.870821 vertex -0.582451 0.057367 -2.942356 endloop endfacet facet normal 0.959601 -0.142342 0.242704 outer loop vertex -2.856997 0.281390 -0.870855 vertex -2.815659 0.560070 -0.870855 vertex -2.885819 0.574026 -0.585272 endloop endfacet facet normal 0.959601 -0.142342 0.242703 outer loop vertex -2.885819 0.574026 -0.585272 vertex -2.928187 0.288402 -0.585272 vertex -2.856997 0.281390 -0.870855 endloop endfacet facet normal 0.664730 -0.098600 -0.740548 outer loop vertex -2.111105 0.207926 2.121321 vertex -2.080560 0.413850 2.121321 vertex -1.866611 0.371292 2.319032 endloop endfacet facet normal 0.664731 -0.098604 -0.740547 outer loop vertex -1.866611 0.371292 2.319032 vertex -1.894016 0.186544 2.319032 vertex -2.111105 0.207926 2.121321 endloop endfacet facet normal 0.423345 -0.062796 0.903790 outer loop vertex -1.142520 0.112529 -2.771639 vertex -1.125989 0.223974 -2.771639 vertex -1.387015 0.275895 -2.645764 endloop endfacet facet normal 0.423344 -0.062799 0.903790 outer loop vertex -1.387015 0.275895 -2.645764 vertex -1.407379 0.138615 -2.645764 vertex -1.142520 0.112529 -2.771639 endloop endfacet facet normal 0.987988 -0.146553 0.049008 outer loop vertex -2.971178 0.292636 -0.294052 vertex -2.928188 0.582453 -0.294052 vertex -2.942356 0.585271 -0.000001 endloop endfacet facet normal 0.987988 -0.146553 0.049008 outer loop vertex -2.942356 0.585271 -0.000001 vertex -2.985554 0.294052 -0.000001 vertex -2.971178 0.292636 -0.294052 endloop endfacet facet normal 0.508987 -0.075501 -0.857457 outer loop vertex -1.658685 0.163366 2.494409 vertex -1.634685 0.325160 2.494409 vertex -1.387017 0.275895 2.645763 endloop endfacet facet normal 0.508987 -0.075503 -0.857456 outer loop vertex -1.387017 0.275895 2.645763 vertex -1.407381 0.138615 2.645763 vertex -1.658685 0.163366 2.494409 endloop endfacet facet normal 0.589710 -0.087476 0.802864 outer loop vertex -1.658684 0.163366 -2.494410 vertex -1.634684 0.325159 -2.494410 vertex -1.866609 0.371292 -2.319033 endloop endfacet facet normal 0.589710 -0.087476 0.802864 outer loop vertex -1.866609 0.371292 -2.319033 vertex -1.894014 0.186544 -2.319033 vertex -1.658684 0.163366 -2.494410 endloop endfacet facet normal 0.333598 -0.049484 -0.941416 outer loop vertex -1.142522 0.112529 2.771639 vertex -1.125991 0.223974 2.771639 vertex -0.854121 0.169896 2.870821 endloop endfacet facet normal 0.333599 -0.049485 -0.941415 outer loop vertex -0.854121 0.169896 2.870821 vertex -0.866661 0.085359 2.870821 vertex -1.142522 0.112529 2.771639 endloop endfacet facet normal 0.978495 -0.145145 -0.146560 outer loop vertex -2.971178 0.292636 0.294051 vertex -2.928188 0.582453 0.294051 vertex -2.885819 0.574026 0.585271 endloop endfacet facet normal 0.978495 -0.145149 -0.146556 outer loop vertex -2.885819 0.574026 0.585271 vertex -2.928188 0.288402 0.585271 vertex -2.971178 0.292636 0.294051 endloop endfacet facet normal 0.733331 -0.108777 0.671114 outer loop vertex -2.111104 0.207926 -2.121322 vertex -2.080559 0.413849 -2.121322 vertex -2.274471 0.452421 -1.903181 endloop endfacet facet normal 0.733329 -0.108779 0.671115 outer loop vertex -2.274471 0.452421 -1.903181 vertex -2.307864 0.227305 -1.903181 vertex -2.111104 0.207926 -2.121322 endloop endfacet facet normal 0.145312 -0.021556 -0.989151 outer loop vertex -0.582453 0.057367 2.942356 vertex -0.574025 0.114181 2.942356 vertex -0.288401 0.057367 2.985554 endloop endfacet facet normal 0.145312 -0.021554 -0.989151 outer loop vertex -0.288401 0.057367 2.985554 vertex -0.292635 0.028822 2.985554 vertex -0.582453 0.057367 2.942356 endloop endfacet facet normal 0.931480 -0.138171 -0.336531 outer loop vertex -2.856997 0.281390 0.870853 vertex -2.815659 0.560070 0.870853 vertex -2.718382 0.540720 1.148050 endloop endfacet facet normal 0.931481 -0.138172 -0.336530 outer loop vertex -2.718382 0.540720 1.148050 vertex -2.758292 0.271668 1.148050 vertex -2.856997 0.281390 0.870853 endloop endfacet facet normal 0.848715 -0.125895 0.513647 outer loop vertex -2.482397 0.244495 -1.666712 vertex -2.446479 0.486635 -1.666712 vertex -2.594926 0.516163 -1.414191 endloop endfacet facet normal 0.848716 -0.125893 0.513646 outer loop vertex -2.594926 0.516163 -1.414191 vertex -2.633023 0.259330 -1.414191 vertex -2.482397 0.244495 -1.666712 endloop endfacet facet normal 0.848716 -0.125896 -0.513644 outer loop vertex -2.633024 0.259330 1.414190 vertex -2.594926 0.516163 1.414190 vertex -2.446480 0.486636 1.666711 endloop endfacet facet normal 0.848716 -0.125894 -0.513646 outer loop vertex -2.446480 0.486636 1.666711 vertex -2.482398 0.244495 1.666711 vertex -2.633024 0.259330 1.414190 endloop endfacet facet normal 0.145312 -0.021554 0.989151 outer loop vertex -0.292633 0.028822 -2.985554 vertex -0.288399 0.057367 -2.985554 vertex -0.574023 0.114181 -2.942356 endloop endfacet facet normal 0.145312 -0.021556 0.989151 outer loop vertex -0.574023 0.114181 -2.942356 vertex -0.582451 0.057367 -2.942356 vertex -0.292633 0.028822 -2.985554 endloop endfacet facet normal 0.931480 -0.138172 0.336532 outer loop vertex -2.758292 0.271668 -1.148051 vertex -2.718382 0.540720 -1.148051 vertex -2.815659 0.560070 -0.870855 endloop endfacet facet normal 0.931480 -0.138171 0.336531 outer loop vertex -2.815659 0.560070 -0.870855 vertex -2.856997 0.281390 -0.870855 vertex -2.758292 0.271668 -1.148051 endloop endfacet facet normal 0.733331 -0.108777 -0.671113 outer loop vertex -2.307864 0.227305 1.903180 vertex -2.274472 0.452421 1.903180 vertex -2.080560 0.413850 2.121321 endloop endfacet facet normal 0.733331 -0.108776 -0.671114 outer loop vertex -2.080560 0.413850 2.121321 vertex -2.111105 0.207926 2.121321 vertex -2.307864 0.227305 1.903180 endloop endfacet facet normal 0.333598 -0.049486 0.941416 outer loop vertex -0.866659 0.085359 -2.870821 vertex -0.854119 0.169895 -2.870821 vertex -1.125989 0.223974 -2.771639 endloop endfacet facet normal 0.333599 -0.049484 0.941416 outer loop vertex -1.125989 0.223974 -2.771639 vertex -1.142520 0.112529 -2.771639 vertex -0.866659 0.085359 -2.870821 endloop endfacet facet normal 0.978495 -0.145145 0.146560 outer loop vertex -2.928187 0.288402 -0.585272 vertex -2.885819 0.574026 -0.585272 vertex -2.928188 0.582453 -0.294052 endloop endfacet facet normal 0.978495 -0.145145 0.146560 outer loop vertex -2.928188 0.582453 -0.294052 vertex -2.971178 0.292636 -0.294052 vertex -2.928187 0.288402 -0.585272 endloop endfacet facet normal 0.589708 -0.087476 -0.802865 outer loop vertex -1.894016 0.186544 2.319032 vertex -1.866611 0.371292 2.319032 vertex -1.634685 0.325160 2.494409 endloop endfacet facet normal 0.589708 -0.087475 -0.802865 outer loop vertex -1.634685 0.325160 2.494409 vertex -1.658685 0.163366 2.494409 vertex -1.894016 0.186544 2.319032 endloop endfacet facet normal 0.508986 -0.075503 0.857457 outer loop vertex -1.407379 0.138615 -2.645764 vertex -1.387015 0.275895 -2.645764 vertex -1.634684 0.325159 -2.494410 endloop endfacet facet normal 0.508986 -0.075502 0.857457 outer loop vertex -1.634684 0.325159 -2.494410 vertex -1.658684 0.163366 -2.494410 vertex -1.407379 0.138615 -2.645764 endloop endfacet facet normal 0.423348 -0.062799 -0.903788 outer loop vertex -1.407381 0.138615 2.645763 vertex -1.387017 0.275895 2.645763 vertex -1.125991 0.223974 2.771639 endloop endfacet facet normal 0.423347 -0.062796 -0.903789 outer loop vertex -1.125991 0.223974 2.771639 vertex -1.142522 0.112529 2.771639 vertex -1.407381 0.138615 2.645763 endloop endfacet facet normal 0.987988 -0.146553 -0.049008 outer loop vertex -2.985554 0.294052 -0.000001 vertex -2.942356 0.585271 -0.000001 vertex -2.928188 0.582453 0.294051 endloop endfacet facet normal 0.987988 -0.146553 -0.049008 outer loop vertex -2.928188 0.582453 0.294051 vertex -2.971178 0.292636 0.294051 vertex -2.985554 0.294052 -0.000001 endloop endfacet facet normal 0.664728 -0.098604 0.740550 outer loop vertex -1.894014 0.186544 -2.319033 vertex -1.866609 0.371292 -2.319033 vertex -2.080559 0.413849 -2.121322 endloop endfacet facet normal 0.664730 -0.098601 0.740548 outer loop vertex -2.080559 0.413849 -2.121322 vertex -2.111104 0.207926 -2.121322 vertex -1.894014 0.186544 -2.319033 endloop endfacet facet normal 0.240623 -0.035693 -0.969962 outer loop vertex -0.866661 0.085359 2.870821 vertex -0.854121 0.169896 2.870821 vertex -0.574025 0.114181 2.942356 endloop endfacet facet normal 0.240624 -0.035695 -0.969962 outer loop vertex -0.574025 0.114181 2.942356 vertex -0.582453 0.057367 2.942356 vertex -0.866661 0.085359 2.870821 endloop endfacet facet normal 0.959600 -0.142346 -0.242704 outer loop vertex -2.928188 0.288402 0.585271 vertex -2.885819 0.574026 0.585271 vertex -2.815659 0.560070 0.870853 endloop endfacet facet normal 0.959600 -0.142342 -0.242708 outer loop vertex -2.815659 0.560070 0.870853 vertex -2.856997 0.281390 0.870853 vertex -2.928188 0.288402 0.585271 endloop endfacet facet normal 0.794853 -0.117906 0.595237 outer loop vertex -2.307864 0.227305 -1.903181 vertex -2.274471 0.452421 -1.903181 vertex -2.446479 0.486635 -1.666712 endloop endfacet facet normal 0.794853 -0.117905 0.595237 outer loop vertex -2.446479 0.486635 -1.666712 vertex -2.482397 0.244495 -1.666712 vertex -2.307864 0.227305 -1.903181 endloop endfacet facet normal 0.894402 -0.132672 -0.427133 outer loop vertex -2.758292 0.271668 1.148050 vertex -2.718382 0.540720 1.148050 vertex -2.594926 0.516163 1.414190 endloop endfacet facet normal 0.894403 -0.132673 -0.427132 outer loop vertex -2.594926 0.516163 1.414190 vertex -2.633024 0.259330 1.414190 vertex -2.758292 0.271668 1.148050 endloop endfacet facet normal 0.894403 -0.132670 0.427133 outer loop vertex -2.633023 0.259330 -1.414191 vertex -2.594926 0.516163 -1.414191 vertex -2.718382 0.540720 -1.148051 endloop endfacet facet normal 0.894402 -0.132672 0.427135 outer loop vertex -2.718382 0.540720 -1.148051 vertex -2.758292 0.271668 -1.148051 vertex -2.633023 0.259330 -1.414191 endloop endfacet facet normal 0.794853 -0.117905 -0.595237 outer loop vertex -2.482398 0.244495 1.666711 vertex -2.446480 0.486636 1.666711 vertex -2.274472 0.452421 1.903180 endloop endfacet facet normal 0.794852 -0.117902 -0.595239 outer loop vertex -2.274472 0.452421 1.903180 vertex -2.307864 0.227305 1.903180 vertex -2.482398 0.244495 1.666711 endloop endfacet facet normal 0.142499 -0.035696 0.989151 outer loop vertex -0.288399 0.057367 -2.985554 vertex -0.281387 0.085359 -2.985554 vertex -0.560067 0.169895 -2.942356 endloop endfacet facet normal 0.142499 -0.035695 0.989151 outer loop vertex -0.560067 0.169895 -2.942356 vertex -0.574023 0.114181 -2.942356 vertex -0.288399 0.057367 -2.985554 endloop endfacet facet normal 0.913451 -0.228808 0.336531 outer loop vertex -2.718382 0.540720 -1.148051 vertex -2.652292 0.804565 -1.148051 vertex -2.747204 0.833356 -0.870855 endloop endfacet facet normal 0.913451 -0.228809 0.336532 outer loop vertex -2.747204 0.833356 -0.870855 vertex -2.815659 0.560070 -0.870855 vertex -2.718382 0.540720 -1.148051 endloop endfacet facet normal 0.719137 -0.180133 -0.671114 outer loop vertex -2.274472 0.452421 1.903180 vertex -2.219175 0.673180 1.903180 vertex -2.029977 0.615788 2.121321 endloop endfacet facet normal 0.719137 -0.180135 -0.671113 outer loop vertex -2.029977 0.615788 2.121321 vertex -2.080560 0.413850 2.121321 vertex -2.274472 0.452421 1.903180 endloop endfacet facet normal 0.327140 -0.081946 0.941416 outer loop vertex -0.854119 0.169895 -2.870821 vertex -0.833353 0.252796 -2.870821 vertex -1.098614 0.333262 -2.771639 endloop endfacet facet normal 0.327142 -0.081944 0.941416 outer loop vertex -1.098614 0.333262 -2.771639 vertex -1.125989 0.223974 -2.771639 vertex -0.854119 0.169895 -2.870821 endloop endfacet facet normal 0.959557 -0.240356 0.146557 outer loop vertex -2.885819 0.574026 -0.585272 vertex -2.815659 0.854121 -0.585272 vertex -2.856997 0.866661 -0.294052 endloop endfacet facet normal 0.959556 -0.240359 0.146560 outer loop vertex -2.856997 0.866661 -0.294052 vertex -2.928188 0.582453 -0.294052 vertex -2.885819 0.574026 -0.585272 endloop endfacet facet normal 0.578296 -0.144857 -0.802864 outer loop vertex -1.866611 0.371292 2.319032 vertex -1.821229 0.552465 2.319032 vertex -1.594943 0.483821 2.494409 endloop endfacet facet normal 0.578295 -0.144854 -0.802865 outer loop vertex -1.594943 0.483821 2.494409 vertex -1.634685 0.325160 2.494409 vertex -1.866611 0.371292 2.319032 endloop endfacet facet normal 0.499136 -0.125026 0.857457 outer loop vertex -1.387015 0.275895 -2.645764 vertex -1.353294 0.410518 -2.645764 vertex -1.594941 0.483821 -2.494410 endloop endfacet facet normal 0.499135 -0.125027 0.857457 outer loop vertex -1.594941 0.483821 -2.494410 vertex -1.634684 0.325159 -2.494410 vertex -1.387015 0.275895 -2.645764 endloop endfacet facet normal 0.415155 -0.103990 -0.903788 outer loop vertex -1.387017 0.275895 2.645763 vertex -1.353296 0.410518 2.645763 vertex -1.098616 0.333262 2.771639 endloop endfacet facet normal 0.415155 -0.103990 -0.903788 outer loop vertex -1.098616 0.333262 2.771639 vertex -1.125991 0.223974 2.771639 vertex -1.387017 0.275895 2.645763 endloop endfacet facet normal 0.968866 -0.242688 -0.049010 outer loop vertex -2.942356 0.585271 -0.000001 vertex -2.870821 0.870855 -0.000001 vertex -2.856997 0.866661 0.294051 endloop endfacet facet normal 0.968865 -0.242690 -0.049008 outer loop vertex -2.856997 0.866661 0.294051 vertex -2.928188 0.582453 0.294051 vertex -2.942356 0.585271 -0.000001 endloop endfacet facet normal 0.651864 -0.163282 0.740549 outer loop vertex -1.866609 0.371292 -2.319033 vertex -1.821228 0.552464 -2.319033 vertex -2.029976 0.615787 -2.121322 endloop endfacet facet normal 0.651862 -0.163284 0.740550 outer loop vertex -2.029976 0.615787 -2.121322 vertex -2.080559 0.413849 -2.121322 vertex -1.866609 0.371292 -2.319033 endloop endfacet facet normal 0.235966 -0.059108 -0.969962 outer loop vertex -0.854121 0.169896 2.870821 vertex -0.833355 0.252796 2.870821 vertex -0.560069 0.169896 2.942356 endloop endfacet facet normal 0.235966 -0.059107 -0.969962 outer loop vertex -0.560069 0.169896 2.942356 vertex -0.574025 0.114181 2.942356 vertex -0.854121 0.169896 2.870821 endloop endfacet facet normal 0.941028 -0.235714 -0.242704 outer loop vertex -2.885819 0.574026 0.585271 vertex -2.815659 0.854122 0.585271 vertex -2.747205 0.833356 0.870853 endloop endfacet facet normal 0.941028 -0.235713 -0.242705 outer loop vertex -2.747205 0.833356 0.870853 vertex -2.815659 0.560070 0.870853 vertex -2.885819 0.574026 0.585271 endloop endfacet facet normal 0.779469 -0.195246 0.595237 outer loop vertex -2.274471 0.452421 -1.903181 vertex -2.219174 0.673180 -1.903181 vertex -2.387000 0.724089 -1.666712 endloop endfacet facet normal 0.779469 -0.195246 0.595237 outer loop vertex -2.387000 0.724089 -1.666712 vertex -2.446479 0.486635 -1.666712 vertex -2.274471 0.452421 -1.903181 endloop endfacet facet normal 0.877091 -0.219700 -0.427133 outer loop vertex -2.718382 0.540720 1.148050 vertex -2.652292 0.804565 1.148050 vertex -2.531838 0.768025 1.414190 endloop endfacet facet normal 0.877091 -0.219700 -0.427133 outer loop vertex -2.531838 0.768025 1.414190 vertex -2.594926 0.516163 1.414190 vertex -2.718382 0.540720 1.148050 endloop endfacet facet normal 0.877090 -0.219703 0.427135 outer loop vertex -2.594926 0.516163 -1.414191 vertex -2.531837 0.768025 -1.414191 vertex -2.652292 0.804565 -1.148051 endloop endfacet facet normal 0.877091 -0.219700 0.427133 outer loop vertex -2.652292 0.804565 -1.148051 vertex -2.718382 0.540720 -1.148051 vertex -2.594926 0.516163 -1.414191 endloop endfacet facet normal 0.779470 -0.195251 -0.595235 outer loop vertex -2.446480 0.486636 1.666711 vertex -2.387000 0.724089 1.666711 vertex -2.219175 0.673180 1.903180 endloop endfacet facet normal 0.779469 -0.195246 -0.595237 outer loop vertex -2.219175 0.673180 1.903180 vertex -2.274472 0.452421 1.903180 vertex -2.446480 0.486636 1.666711 endloop endfacet facet normal 0.235966 -0.059108 0.969962 outer loop vertex -0.574023 0.114181 -2.942356 vertex -0.560067 0.169895 -2.942356 vertex -0.833353 0.252796 -2.870821 endloop endfacet facet normal 0.235966 -0.059108 0.969962 outer loop vertex -0.833353 0.252796 -2.870821 vertex -0.854119 0.169895 -2.870821 vertex -0.574023 0.114181 -2.942356 endloop endfacet facet normal 0.941027 -0.235716 0.242706 outer loop vertex -2.815659 0.560070 -0.870855 vertex -2.747204 0.833356 -0.870855 vertex -2.815659 0.854121 -0.585272 endloop endfacet facet normal 0.941028 -0.235714 0.242704 outer loop vertex -2.815659 0.854121 -0.585272 vertex -2.885819 0.574026 -0.585272 vertex -2.815659 0.560070 -0.870855 endloop endfacet facet normal 0.651863 -0.163283 -0.740549 outer loop vertex -2.080560 0.413850 2.121321 vertex -2.029977 0.615788 2.121321 vertex -1.821229 0.552465 2.319032 endloop endfacet facet normal 0.651863 -0.163285 -0.740549 outer loop vertex -1.821229 0.552465 2.319032 vertex -1.866611 0.371292 2.319032 vertex -2.080560 0.413850 2.121321 endloop endfacet facet normal 0.415151 -0.103989 0.903790 outer loop vertex -1.125989 0.223974 -2.771639 vertex -1.098614 0.333262 -2.771639 vertex -1.353294 0.410518 -2.645764 endloop endfacet facet normal 0.415151 -0.103989 0.903790 outer loop vertex -1.353294 0.410518 -2.645764 vertex -1.387015 0.275895 -2.645764 vertex -1.125989 0.223974 -2.771639 endloop endfacet facet normal 0.968865 -0.242690 0.049010 outer loop vertex -2.928188 0.582453 -0.294052 vertex -2.856997 0.866661 -0.294052 vertex -2.870821 0.870855 -0.000001 endloop endfacet facet normal 0.968866 -0.242688 0.049008 outer loop vertex -2.870821 0.870855 -0.000001 vertex -2.942356 0.585271 -0.000001 vertex -2.928188 0.582453 -0.294052 endloop endfacet facet normal 0.499136 -0.125025 -0.857457 outer loop vertex -1.634685 0.325160 2.494409 vertex -1.594943 0.483821 2.494409 vertex -1.353296 0.410518 2.645763 endloop endfacet facet normal 0.499136 -0.125026 -0.857457 outer loop vertex -1.353296 0.410518 2.645763 vertex -1.387017 0.275895 2.645763 vertex -1.634685 0.325160 2.494409 endloop endfacet facet normal 0.578295 -0.144856 0.802864 outer loop vertex -1.634684 0.325159 -2.494410 vertex -1.594941 0.483821 -2.494410 vertex -1.821228 0.552464 -2.319033 endloop endfacet facet normal 0.578296 -0.144855 0.802864 outer loop vertex -1.821228 0.552464 -2.319033 vertex -1.866609 0.371292 -2.319033 vertex -1.634684 0.325159 -2.494410 endloop endfacet facet normal 0.327141 -0.081944 -0.941416 outer loop vertex -1.125991 0.223974 2.771639 vertex -1.098616 0.333262 2.771639 vertex -0.833355 0.252796 2.870821 endloop endfacet facet normal 0.327141 -0.081947 -0.941416 outer loop vertex -0.833355 0.252796 2.870821 vertex -0.854121 0.169896 2.870821 vertex -1.125991 0.223974 2.771639 endloop endfacet facet normal 0.959557 -0.240359 -0.146556 outer loop vertex -2.928188 0.582453 0.294051 vertex -2.856997 0.866661 0.294051 vertex -2.815659 0.854122 0.585271 endloop endfacet facet normal 0.959557 -0.240355 -0.146560 outer loop vertex -2.815659 0.854122 0.585271 vertex -2.885819 0.574026 0.585271 vertex -2.928188 0.582453 0.294051 endloop endfacet facet normal 0.719136 -0.180135 0.671115 outer loop vertex -2.080559 0.413849 -2.121322 vertex -2.029976 0.615787 -2.121322 vertex -2.219174 0.673180 -1.903181 endloop endfacet facet normal 0.719137 -0.180134 0.671114 outer loop vertex -2.219174 0.673180 -1.903181 vertex -2.274471 0.452421 -1.903181 vertex -2.080559 0.413849 -2.121322 endloop endfacet facet normal 0.142500 -0.035695 -0.989151 outer loop vertex -0.574025 0.114181 2.942356 vertex -0.560069 0.169896 2.942356 vertex -0.281390 0.085359 2.985554 endloop endfacet facet normal 0.142500 -0.035691 -0.989151 outer loop vertex -0.281390 0.085359 2.985554 vertex -0.288401 0.057367 2.985554 vertex -0.574025 0.114181 2.942356 endloop endfacet facet normal 0.913451 -0.228806 -0.336533 outer loop vertex -2.815659 0.560070 0.870853 vertex -2.747205 0.833356 0.870853 vertex -2.652292 0.804565 1.148050 endloop endfacet facet normal 0.913451 -0.228808 -0.336531 outer loop vertex -2.652292 0.804565 1.148050 vertex -2.718382 0.540720 1.148050 vertex -2.815659 0.560070 0.870853 endloop endfacet facet normal 0.832290 -0.208477 0.513644 outer loop vertex -2.446479 0.486635 -1.666712 vertex -2.387000 0.724089 -1.666712 vertex -2.531837 0.768025 -1.414191 endloop endfacet facet normal 0.832288 -0.208480 0.513647 outer loop vertex -2.531837 0.768025 -1.414191 vertex -2.594926 0.516163 -1.414191 vertex -2.446479 0.486635 -1.666712 endloop endfacet facet normal 0.832289 -0.208478 -0.513647 outer loop vertex -2.594926 0.516163 1.414190 vertex -2.531838 0.768025 1.414190 vertex -2.387000 0.724089 1.666711 endloop endfacet facet normal 0.832289 -0.208481 -0.513644 outer loop vertex -2.387000 0.724089 1.666711 vertex -2.446480 0.486636 1.666711 vertex -2.594926 0.516163 1.414190 endloop endfacet facet normal 0.851334 -0.304611 0.427133 outer loop vertex -2.531837 0.768025 -1.414191 vertex -2.444366 1.012491 -1.414191 vertex -2.560659 1.060661 -1.148051 endloop endfacet facet normal 0.851332 -0.304613 0.427135 outer loop vertex -2.560659 1.060661 -1.148051 vertex -2.652292 0.804565 -1.148051 vertex -2.531837 0.768025 -1.414191 endloop endfacet facet normal 0.756580 -0.270707 -0.595235 outer loop vertex -2.387000 0.724089 1.666711 vertex -2.304533 0.954570 1.666711 vertex -2.142506 0.887456 1.903180 endloop endfacet facet normal 0.756580 -0.270709 -0.595234 outer loop vertex -2.142506 0.887456 1.903180 vertex -2.219175 0.673180 1.903180 vertex -2.387000 0.724089 1.666711 endloop endfacet facet normal 0.229038 -0.081948 0.969962 outer loop vertex -0.560067 0.169895 -2.942356 vertex -0.540718 0.223974 -2.942356 vertex -0.804562 0.333262 -2.870821 endloop endfacet facet normal 0.229037 -0.081950 0.969962 outer loop vertex -0.804562 0.333262 -2.870821 vertex -0.833353 0.252796 -2.870821 vertex -0.560067 0.169895 -2.942356 endloop endfacet facet normal 0.913392 -0.326817 0.242705 outer loop vertex -2.747204 0.833356 -0.870855 vertex -2.652292 1.098617 -0.870855 vertex -2.718382 1.125992 -0.585272 endloop endfacet facet normal 0.913392 -0.326817 0.242706 outer loop vertex -2.718382 1.125992 -0.585272 vertex -2.815659 0.854121 -0.585272 vertex -2.747204 0.833356 -0.870855 endloop endfacet facet normal 0.632721 -0.226393 -0.740548 outer loop vertex -2.029977 0.615788 2.121321 vertex -1.959844 0.811795 2.121321 vertex -1.758309 0.728316 2.319032 endloop endfacet facet normal 0.632720 -0.226389 -0.740549 outer loop vertex -1.758309 0.728316 2.319032 vertex -1.821229 0.552465 2.319032 vertex -2.029977 0.615788 2.121321 endloop endfacet facet normal 0.402957 -0.144183 0.903790 outer loop vertex -1.098614 0.333262 -2.771639 vertex -1.060658 0.439340 -2.771639 vertex -1.306540 0.541188 -2.645764 endloop endfacet facet normal 0.402960 -0.144180 0.903790 outer loop vertex -1.306540 0.541188 -2.645764 vertex -1.353294 0.410518 -2.645764 vertex -1.098614 0.333262 -2.771639 endloop endfacet facet normal 0.940413 -0.336485 0.049012 outer loop vertex -2.856997 0.866661 -0.294052 vertex -2.758292 1.142523 -0.294052 vertex -2.771639 1.148051 -0.000001 endloop endfacet facet normal 0.940413 -0.336484 0.049010 outer loop vertex -2.771639 1.148051 -0.000001 vertex -2.870821 0.870855 -0.000001 vertex -2.856997 0.866661 -0.294052 endloop endfacet facet normal 0.484476 -0.173348 -0.857457 outer loop vertex -1.594943 0.483821 2.494409 vertex -1.539840 0.637824 2.494409 vertex -1.306541 0.541188 2.645763 endloop endfacet facet normal 0.484476 -0.173351 -0.857457 outer loop vertex -1.306541 0.541188 2.645763 vertex -1.353296 0.410518 2.645763 vertex -1.594943 0.483821 2.494409 endloop endfacet facet normal 0.561312 -0.200842 0.802864 outer loop vertex -1.594941 0.483821 -2.494410 vertex -1.539838 0.637823 -2.494410 vertex -1.758307 0.728316 -2.319033 endloop endfacet facet normal 0.561312 -0.200841 0.802864 outer loop vertex -1.758307 0.728316 -2.319033 vertex -1.821228 0.552464 -2.319033 vertex -1.594941 0.483821 -2.494410 endloop endfacet facet normal 0.317534 -0.113616 -0.941416 outer loop vertex -1.098616 0.333262 2.771639 vertex -1.060660 0.439341 2.771639 vertex -0.804564 0.333262 2.870821 endloop endfacet facet normal 0.317534 -0.113615 -0.941416 outer loop vertex -0.804564 0.333262 2.870821 vertex -0.833355 0.252796 2.870821 vertex -1.098616 0.333262 2.771639 endloop endfacet facet normal 0.931377 -0.333252 -0.146557 outer loop vertex -2.856997 0.866661 0.294051 vertex -2.758292 1.142523 0.294051 vertex -2.718382 1.125992 0.585271 endloop endfacet facet normal 0.931377 -0.333254 -0.146556 outer loop vertex -2.718382 1.125992 0.585271 vertex -2.815659 0.854122 0.585271 vertex -2.856997 0.866661 0.294051 endloop endfacet facet normal 0.698016 -0.249755 0.671115 outer loop vertex -2.029976 0.615787 -2.121322 vertex -1.959843 0.811795 -2.121322 vertex -2.142505 0.887456 -1.903181 endloop endfacet facet normal 0.698017 -0.249754 0.671115 outer loop vertex -2.142505 0.887456 -1.903181 vertex -2.219174 0.673180 -1.903181 vertex -2.029976 0.615787 -2.121322 endloop endfacet facet normal 0.138315 -0.049489 -0.989151 outer loop vertex -0.560069 0.169896 2.942356 vertex -0.540720 0.223974 2.942356 vertex -0.271668 0.112530 2.985554 endloop endfacet facet normal 0.138315 -0.049490 -0.989151 outer loop vertex -0.271668 0.112530 2.985554 vertex -0.281390 0.085359 2.985554 vertex -0.560069 0.169896 2.942356 endloop endfacet facet normal 0.886625 -0.317240 -0.336534 outer loop vertex -2.747205 0.833356 0.870853 vertex -2.652293 1.098617 0.870853 vertex -2.560659 1.060661 1.148050 endloop endfacet facet normal 0.886625 -0.317241 -0.336533 outer loop vertex -2.560659 1.060661 1.148050 vertex -2.652292 0.804565 1.148050 vertex -2.747205 0.833356 0.870853 endloop endfacet facet normal 0.807848 -0.289052 0.513644 outer loop vertex -2.387000 0.724089 -1.666712 vertex -2.304533 0.954570 -1.666712 vertex -2.444366 1.012491 -1.414191 endloop endfacet facet normal 0.807848 -0.289052 0.513644 outer loop vertex -2.444366 1.012491 -1.414191 vertex -2.531837 0.768025 -1.414191 vertex -2.387000 0.724089 -1.666712 endloop endfacet facet normal 0.807847 -0.289054 -0.513644 outer loop vertex -2.531838 0.768025 1.414190 vertex -2.444366 1.012491 1.414190 vertex -2.304533 0.954570 1.666711 endloop endfacet facet normal 0.807847 -0.289051 -0.513647 outer loop vertex -2.304533 0.954570 1.666711 vertex -2.387000 0.724089 1.666711 vertex -2.531838 0.768025 1.414190 endloop endfacet facet normal 0.138316 -0.049487 0.989151 outer loop vertex -0.281387 0.085359 -2.985554 vertex -0.271666 0.112529 -2.985554 vertex -0.540718 0.223974 -2.942356 endloop endfacet facet normal 0.138315 -0.049488 0.989151 outer loop vertex -0.540718 0.223974 -2.942356 vertex -0.560067 0.169895 -2.942356 vertex -0.281387 0.085359 -2.985554 endloop endfacet facet normal 0.886625 -0.317241 0.336532 outer loop vertex -2.652292 0.804565 -1.148051 vertex -2.560659 1.060661 -1.148051 vertex -2.652292 1.098617 -0.870855 endloop endfacet facet normal 0.886626 -0.317240 0.336531 outer loop vertex -2.652292 1.098617 -0.870855 vertex -2.747204 0.833356 -0.870855 vertex -2.652292 0.804565 -1.148051 endloop endfacet facet normal 0.698017 -0.249754 -0.671115 outer loop vertex -2.219175 0.673180 1.903180 vertex -2.142506 0.887456 1.903180 vertex -1.959844 0.811795 2.121321 endloop endfacet facet normal 0.698017 -0.249757 -0.671114 outer loop vertex -1.959844 0.811795 2.121321 vertex -2.029977 0.615788 2.121321 vertex -2.219175 0.673180 1.903180 endloop endfacet facet normal 0.317535 -0.113615 0.941416 outer loop vertex -0.833353 0.252796 -2.870821 vertex -0.804562 0.333262 -2.870821 vertex -1.060658 0.439340 -2.771639 endloop endfacet facet normal 0.317533 -0.113617 0.941416 outer loop vertex -1.060658 0.439340 -2.771639 vertex -1.098614 0.333262 -2.771639 vertex -0.833353 0.252796 -2.870821 endloop endfacet facet normal 0.931377 -0.333253 0.146557 outer loop vertex -2.815659 0.854121 -0.585272 vertex -2.718382 1.125992 -0.585272 vertex -2.758292 1.142523 -0.294052 endloop endfacet facet normal 0.931377 -0.333252 0.146557 outer loop vertex -2.758292 1.142523 -0.294052 vertex -2.856997 0.866661 -0.294052 vertex -2.815659 0.854121 -0.585272 endloop endfacet facet normal 0.561314 -0.200840 -0.802864 outer loop vertex -1.821229 0.552465 2.319032 vertex -1.758309 0.728316 2.319032 vertex -1.539840 0.637824 2.494409 endloop endfacet facet normal 0.561314 -0.200841 -0.802864 outer loop vertex -1.539840 0.637824 2.494409 vertex -1.594943 0.483821 2.494409 vertex -1.821229 0.552465 2.319032 endloop endfacet facet normal 0.484479 -0.173348 0.857456 outer loop vertex -1.353294 0.410518 -2.645764 vertex -1.306540 0.541188 -2.645764 vertex -1.539838 0.637823 -2.494410 endloop endfacet facet normal 0.484477 -0.173350 0.857457 outer loop vertex -1.539838 0.637823 -2.494410 vertex -1.594941 0.483821 -2.494410 vertex -1.353294 0.410518 -2.645764 endloop endfacet facet normal 0.402962 -0.144184 -0.903788 outer loop vertex -1.353296 0.410518 2.645763 vertex -1.306541 0.541188 2.645763 vertex -1.060660 0.439341 2.771639 endloop endfacet facet normal 0.402962 -0.144183 -0.903788 outer loop vertex -1.060660 0.439341 2.771639 vertex -1.098616 0.333262 2.771639 vertex -1.353296 0.410518 2.645763 endloop endfacet facet normal 0.940413 -0.336484 -0.049011 outer loop vertex -2.870821 0.870855 -0.000001 vertex -2.771639 1.148051 -0.000001 vertex -2.758292 1.142523 0.294051 endloop endfacet facet normal 0.940413 -0.336485 -0.049010 outer loop vertex -2.758292 1.142523 0.294051 vertex -2.856997 0.866661 0.294051 vertex -2.870821 0.870855 -0.000001 endloop endfacet facet normal 0.632720 -0.226391 0.740549 outer loop vertex -1.821228 0.552464 -2.319033 vertex -1.758307 0.728316 -2.319033 vertex -1.959843 0.811795 -2.121322 endloop endfacet facet normal 0.632720 -0.226391 0.740549 outer loop vertex -1.959843 0.811795 -2.121322 vertex -2.029976 0.615787 -2.121322 vertex -1.821228 0.552464 -2.319033 endloop endfacet facet normal 0.229037 -0.081950 -0.969962 outer loop vertex -0.833355 0.252796 2.870821 vertex -0.804564 0.333262 2.870821 vertex -0.540720 0.223974 2.942356 endloop endfacet facet normal 0.229037 -0.081949 -0.969962 outer loop vertex -0.540720 0.223974 2.942356 vertex -0.560069 0.169896 2.942356 vertex -0.833355 0.252796 2.870821 endloop endfacet facet normal 0.913392 -0.326819 -0.242703 outer loop vertex -2.815659 0.854122 0.585271 vertex -2.718382 1.125992 0.585271 vertex -2.652293 1.098617 0.870853 endloop endfacet facet normal 0.913392 -0.326817 -0.242704 outer loop vertex -2.652293 1.098617 0.870853 vertex -2.747205 0.833356 0.870853 vertex -2.815659 0.854122 0.585271 endloop endfacet facet normal 0.756578 -0.270707 0.595237 outer loop vertex -2.219174 0.673180 -1.903181 vertex -2.142505 0.887456 -1.903181 vertex -2.304533 0.954570 -1.666712 endloop endfacet facet normal 0.756578 -0.270707 0.595237 outer loop vertex -2.304533 0.954570 -1.666712 vertex -2.387000 0.724089 -1.666712 vertex -2.219174 0.673180 -1.903181 endloop endfacet facet normal 0.851333 -0.304613 -0.427133 outer loop vertex -2.652292 0.804565 1.148050 vertex -2.560659 1.060661 1.148050 vertex -2.444366 1.012491 1.414190 endloop endfacet facet normal 0.851333 -0.304614 -0.427133 outer loop vertex -2.444366 1.012491 1.414190 vertex -2.531838 0.768025 1.414190 vertex -2.652292 0.804565 1.148050 endloop endfacet facet normal 0.775624 -0.366846 0.513646 outer loop vertex -2.304533 0.954570 -1.666712 vertex -2.199871 1.175857 -1.666712 vertex -2.333354 1.247205 -1.414191 endloop endfacet facet normal 0.775625 -0.366845 0.513644 outer loop vertex -2.333354 1.247205 -1.414191 vertex -2.444366 1.012491 -1.414191 vertex -2.304533 0.954570 -1.666712 endloop endfacet facet normal 0.775626 -0.366842 -0.513646 outer loop vertex -2.444366 1.012491 1.414190 vertex -2.333355 1.247205 1.414190 vertex -2.199872 1.175857 1.666711 endloop endfacet facet normal 0.775625 -0.366844 -0.513644 outer loop vertex -2.199872 1.175857 1.666711 vertex -2.304533 0.954570 1.666711 vertex -2.444366 1.012491 1.414190 endloop endfacet facet normal 0.132797 -0.062810 0.989151 outer loop vertex -0.271666 0.112529 -2.985554 vertex -0.259328 0.138615 -2.985554 vertex -0.516161 0.275895 -2.942356 endloop endfacet facet normal 0.132798 -0.062809 0.989151 outer loop vertex -0.516161 0.275895 -2.942356 vertex -0.540718 0.223974 -2.942356 vertex -0.271666 0.112529 -2.985554 endloop endfacet facet normal 0.851261 -0.402616 0.336534 outer loop vertex -2.560659 1.060661 -1.148051 vertex -2.444366 1.306542 -1.148051 vertex -2.531838 1.353297 -0.870855 endloop endfacet facet normal 0.851262 -0.402615 0.336532 outer loop vertex -2.531838 1.353297 -0.870855 vertex -2.652292 1.098617 -0.870855 vertex -2.560659 1.060661 -1.148051 endloop endfacet facet normal 0.670176 -0.316971 -0.671114 outer loop vertex -2.142506 0.887456 1.903180 vertex -2.045203 1.093185 1.903180 vertex -1.870837 0.999985 2.121321 endloop endfacet facet normal 0.670176 -0.316969 -0.671115 outer loop vertex -1.870837 0.999985 2.121321 vertex -1.959844 0.811795 2.121321 vertex -2.142506 0.887456 1.903180 endloop endfacet facet normal 0.304870 -0.144191 0.941416 outer loop vertex -0.804562 0.333262 -2.870821 vertex -0.768023 0.410518 -2.870821 vertex -1.012488 0.541188 -2.771639 endloop endfacet facet normal 0.304870 -0.144191 0.941416 outer loop vertex -1.012488 0.541188 -2.771639 vertex -1.060658 0.439340 -2.771639 vertex -0.804562 0.333262 -2.870821 endloop endfacet facet normal 0.894229 -0.422937 0.146556 outer loop vertex -2.718382 1.125992 -0.585272 vertex -2.594926 1.387018 -0.585272 vertex -2.633023 1.407382 -0.294052 endloop endfacet facet normal 0.894228 -0.422938 0.146557 outer loop vertex -2.633023 1.407382 -0.294052 vertex -2.758292 1.142523 -0.294052 vertex -2.718382 1.125992 -0.585272 endloop endfacet facet normal 0.538923 -0.254893 -0.802864 outer loop vertex -1.758309 0.728316 2.319032 vertex -1.678454 0.897154 2.319032 vertex -1.469907 0.785683 2.494409 endloop endfacet facet normal 0.538923 -0.254895 -0.802864 outer loop vertex -1.469907 0.785683 2.494409 vertex -1.539840 0.637824 2.494409 vertex -1.758309 0.728316 2.319032 endloop endfacet facet normal 0.465154 -0.220002 0.857456 outer loop vertex -1.306540 0.541188 -2.645764 vertex -1.247203 0.666645 -2.645764 vertex -1.469906 0.785682 -2.494410 endloop endfacet facet normal 0.465155 -0.220001 0.857456 outer loop vertex -1.469906 0.785682 -2.494410 vertex -1.539838 0.637823 -2.494410 vertex -1.306540 0.541188 -2.645764 endloop endfacet facet normal 0.386890 -0.182985 -0.903788 outer loop vertex -1.306541 0.541188 2.645763 vertex -1.247204 0.666646 2.645763 vertex -1.012490 0.541188 2.771639 endloop endfacet facet normal 0.386890 -0.182985 -0.903788 outer loop vertex -1.012490 0.541188 2.771639 vertex -1.060660 0.439341 2.771639 vertex -1.306541 0.541188 2.645763 endloop endfacet facet normal 0.902903 -0.427042 -0.049011 outer loop vertex -2.771639 1.148051 -0.000001 vertex -2.645764 1.414191 -0.000001 vertex -2.633023 1.407382 0.294051 endloop endfacet facet normal 0.902903 -0.427041 -0.049011 outer loop vertex -2.633023 1.407382 0.294051 vertex -2.758292 1.142523 0.294051 vertex -2.771639 1.148051 -0.000001 endloop endfacet facet normal 0.607483 -0.287318 0.740549 outer loop vertex -1.758307 0.728316 -2.319033 vertex -1.678453 0.897153 -2.319033 vertex -1.870836 0.999984 -2.121322 endloop endfacet facet normal 0.607483 -0.287319 0.740549 outer loop vertex -1.870836 0.999984 -2.121322 vertex -1.959843 0.811795 -2.121322 vertex -1.758307 0.728316 -2.319033 endloop endfacet facet normal 0.219902 -0.104006 -0.969962 outer loop vertex -0.804564 0.333262 2.870821 vertex -0.768024 0.410519 2.870821 vertex -0.516163 0.275896 2.942356 endloop endfacet facet normal 0.219902 -0.104005 -0.969962 outer loop vertex -0.516163 0.275896 2.942356 vertex -0.540720 0.223974 2.942356 vertex -0.804564 0.333262 2.870821 endloop endfacet facet normal 0.876961 -0.414770 -0.242705 outer loop vertex -2.718382 1.125992 0.585271 vertex -2.594926 1.387018 0.585271 vertex -2.531838 1.353297 0.870853 endloop endfacet facet normal 0.876960 -0.414772 -0.242703 outer loop vertex -2.531838 1.353297 0.870853 vertex -2.652293 1.098617 0.870853 vertex -2.718382 1.125992 0.585271 endloop endfacet facet normal 0.726401 -0.343563 0.595236 outer loop vertex -2.142505 0.887456 -1.903181 vertex -2.045202 1.093185 -1.903181 vertex -2.199871 1.175857 -1.666712 endloop endfacet facet normal 0.726399 -0.343565 0.595237 outer loop vertex -2.199871 1.175857 -1.666712 vertex -2.304533 0.954570 -1.666712 vertex -2.142505 0.887456 -1.903181 endloop endfacet facet normal 0.817378 -0.386590 -0.427132 outer loop vertex -2.560659 1.060661 1.148050 vertex -2.444366 1.306542 1.148050 vertex -2.333355 1.247205 1.414190 endloop endfacet facet normal 0.817378 -0.386589 -0.427133 outer loop vertex -2.333355 1.247205 1.414190 vertex -2.444366 1.012491 1.414190 vertex -2.560659 1.060661 1.148050 endloop endfacet facet normal 0.817376 -0.386592 0.427135 outer loop vertex -2.444366 1.012491 -1.414191 vertex -2.333354 1.247205 -1.414191 vertex -2.444366 1.306542 -1.148051 endloop endfacet facet normal 0.817377 -0.386590 0.427133 outer loop vertex -2.444366 1.306542 -1.148051 vertex -2.560659 1.060661 -1.148051 vertex -2.444366 1.012491 -1.414191 endloop endfacet facet normal 0.726401 -0.343562 -0.595236 outer loop vertex -2.304533 0.954570 1.666711 vertex -2.199872 1.175857 1.666711 vertex -2.045203 1.093185 1.903180 endloop endfacet facet normal 0.726402 -0.343564 -0.595235 outer loop vertex -2.045203 1.093185 1.903180 vertex -2.142506 0.887456 1.903180 vertex -2.304533 0.954570 1.666711 endloop endfacet facet normal 0.219901 -0.104006 0.969962 outer loop vertex -0.540718 0.223974 -2.942356 vertex -0.516161 0.275895 -2.942356 vertex -0.768023 0.410518 -2.870821 endloop endfacet facet normal 0.219902 -0.104005 0.969962 outer loop vertex -0.768023 0.410518 -2.870821 vertex -0.804562 0.333262 -2.870821 vertex -0.540718 0.223974 -2.942356 endloop endfacet facet normal 0.876961 -0.414770 0.242705 outer loop vertex -2.652292 1.098617 -0.870855 vertex -2.531838 1.353297 -0.870855 vertex -2.594926 1.387018 -0.585272 endloop endfacet facet normal 0.876961 -0.414770 0.242705 outer loop vertex -2.594926 1.387018 -0.585272 vertex -2.718382 1.125992 -0.585272 vertex -2.652292 1.098617 -0.870855 endloop endfacet facet normal 0.607484 -0.287318 -0.740549 outer loop vertex -1.959844 0.811795 2.121321 vertex -1.870837 0.999985 2.121321 vertex -1.678454 0.897154 2.319032 endloop endfacet facet normal 0.607484 -0.287320 -0.740548 outer loop vertex -1.678454 0.897154 2.319032 vertex -1.758309 0.728316 2.319032 vertex -1.959844 0.811795 2.121321 endloop endfacet facet normal 0.386887 -0.182982 0.903790 outer loop vertex -1.060658 0.439340 -2.771639 vertex -1.012488 0.541188 -2.771639 vertex -1.247203 0.666645 -2.645764 endloop endfacet facet normal 0.386885 -0.182984 0.903790 outer loop vertex -1.247203 0.666645 -2.645764 vertex -1.306540 0.541188 -2.645764 vertex -1.060658 0.439340 -2.771639 endloop endfacet facet normal 0.902903 -0.427041 0.049011 outer loop vertex -2.758292 1.142523 -0.294052 vertex -2.633023 1.407382 -0.294052 vertex -2.645764 1.414191 -0.000001 endloop endfacet facet normal 0.902903 -0.427042 0.049011 outer loop vertex -2.645764 1.414191 -0.000001 vertex -2.771639 1.148051 -0.000001 vertex -2.758292 1.142523 -0.294052 endloop endfacet facet normal 0.465152 -0.220003 -0.857457 outer loop vertex -1.539840 0.637824 2.494409 vertex -1.469907 0.785683 2.494409 vertex -1.247204 0.666646 2.645763 endloop endfacet facet normal 0.465152 -0.220000 -0.857458 outer loop vertex -1.247204 0.666646 2.645763 vertex -1.306541 0.541188 2.645763 vertex -1.539840 0.637824 2.494409 endloop endfacet facet normal 0.538924 -0.254892 0.802864 outer loop vertex -1.539838 0.637823 -2.494410 vertex -1.469906 0.785682 -2.494410 vertex -1.678453 0.897153 -2.319033 endloop endfacet facet normal 0.538924 -0.254892 0.802864 outer loop vertex -1.678453 0.897153 -2.319033 vertex -1.758307 0.728316 -2.319033 vertex -1.539838 0.637823 -2.494410 endloop endfacet facet normal 0.304869 -0.144192 -0.941416 outer loop vertex -1.060660 0.439341 2.771639 vertex -1.012490 0.541188 2.771639 vertex -0.768024 0.410519 2.870821 endloop endfacet facet normal 0.304868 -0.144193 -0.941416 outer loop vertex -0.768024 0.410519 2.870821 vertex -0.804564 0.333262 2.870821 vertex -1.060660 0.439341 2.771639 endloop endfacet facet normal 0.894228 -0.422938 -0.146556 outer loop vertex -2.758292 1.142523 0.294051 vertex -2.633023 1.407382 0.294051 vertex -2.594926 1.387018 0.585271 endloop endfacet facet normal 0.894229 -0.422937 -0.146557 outer loop vertex -2.594926 1.387018 0.585271 vertex -2.718382 1.125992 0.585271 vertex -2.758292 1.142523 0.294051 endloop endfacet facet normal 0.670175 -0.316970 0.671115 outer loop vertex -1.959843 0.811795 -2.121322 vertex -1.870836 0.999984 -2.121322 vertex -2.045202 1.093185 -1.903181 endloop endfacet facet normal 0.670175 -0.316970 0.671115 outer loop vertex -2.045202 1.093185 -1.903181 vertex -2.142505 0.887456 -1.903181 vertex -1.959843 0.811795 -2.121322 endloop endfacet facet normal 0.132798 -0.062808 -0.989151 outer loop vertex -0.540720 0.223974 2.942356 vertex -0.516163 0.275896 2.942356 vertex -0.259330 0.138616 2.985554 endloop endfacet facet normal 0.132798 -0.062810 -0.989151 outer loop vertex -0.259330 0.138616 2.985554 vertex -0.271668 0.112530 2.985554 vertex -0.540720 0.223974 2.942356 endloop endfacet facet normal 0.851261 -0.402618 -0.336533 outer loop vertex -2.652293 1.098617 0.870853 vertex -2.531838 1.353297 0.870853 vertex -2.444366 1.306542 1.148050 endloop endfacet facet normal 0.851261 -0.402616 -0.336534 outer loop vertex -2.444366 1.306542 1.148050 vertex -2.560659 1.060661 1.148050 vertex -2.652293 1.098617 0.870853 endloop endfacet facet normal 0.689229 -0.413108 0.595236 outer loop vertex -2.045202 1.093185 -1.903181 vertex -1.928203 1.288386 -1.903181 vertex -2.074024 1.385820 -1.666712 endloop endfacet facet normal 0.689229 -0.413108 0.595236 outer loop vertex -2.074024 1.385820 -1.666712 vertex -2.199871 1.175857 -1.666712 vertex -2.045202 1.093185 -1.903181 endloop endfacet facet normal 0.775550 -0.464843 -0.427133 outer loop vertex -2.444366 1.306542 1.148050 vertex -2.304533 1.539841 1.148050 vertex -2.199872 1.469909 1.414190 endloop endfacet facet normal 0.775550 -0.464844 -0.427132 outer loop vertex -2.199872 1.469909 1.414190 vertex -2.333355 1.247205 1.414190 vertex -2.444366 1.306542 1.148050 endloop endfacet facet normal 0.775549 -0.464844 0.427136 outer loop vertex -2.333354 1.247205 -1.414191 vertex -2.199871 1.469909 -1.414191 vertex -2.304533 1.539841 -1.148051 endloop endfacet facet normal 0.775549 -0.464843 0.427135 outer loop vertex -2.304533 1.539841 -1.148051 vertex -2.444366 1.306542 -1.148051 vertex -2.333354 1.247205 -1.414191 endloop endfacet facet normal 0.689229 -0.413106 -0.595236 outer loop vertex -2.199872 1.175857 1.666711 vertex -2.074025 1.385821 1.666711 vertex -1.928204 1.288386 1.903180 endloop endfacet facet normal 0.689229 -0.413108 -0.595236 outer loop vertex -1.928204 1.288386 1.903180 vertex -2.045203 1.093185 1.903180 vertex -2.199872 1.175857 1.666711 endloop endfacet facet normal 0.208647 -0.125060 0.969962 outer loop vertex -0.516161 0.275895 -2.942356 vertex -0.486633 0.325159 -2.942356 vertex -0.724087 0.483821 -2.870821 endloop endfacet facet normal 0.208648 -0.125059 0.969962 outer loop vertex -0.724087 0.483821 -2.870821 vertex -0.768023 0.410518 -2.870821 vertex -0.516161 0.275895 -2.942356 endloop endfacet facet normal 0.832083 -0.498732 0.242704 outer loop vertex -2.531838 1.353297 -0.870855 vertex -2.387000 1.594944 -0.870855 vertex -2.446479 1.634686 -0.585272 endloop endfacet facet normal 0.832082 -0.498733 0.242705 outer loop vertex -2.446479 1.634686 -0.585272 vertex -2.594926 1.387018 -0.585272 vertex -2.531838 1.353297 -0.870855 endloop endfacet facet normal 0.576397 -0.345478 -0.740548 outer loop vertex -1.870837 0.999985 2.121321 vertex -1.763813 1.178544 2.121321 vertex -1.582436 1.057352 2.319032 endloop endfacet facet normal 0.576397 -0.345476 -0.740549 outer loop vertex -1.582436 1.057352 2.319032 vertex -1.678454 0.897154 2.319032 vertex -1.870837 0.999985 2.121321 endloop endfacet facet normal 0.367087 -0.220024 0.903790 outer loop vertex -1.012488 0.541188 -2.771639 vertex -0.954567 0.637823 -2.771639 vertex -1.175855 0.785683 -2.645764 endloop endfacet facet normal 0.367089 -0.220022 0.903790 outer loop vertex -1.175855 0.785683 -2.645764 vertex -1.247203 0.666645 -2.645764 vertex -1.012488 0.541188 -2.771639 endloop endfacet facet normal 0.856698 -0.513485 0.049012 outer loop vertex -2.633023 1.407382 -0.294052 vertex -2.482397 1.658686 -0.294052 vertex -2.494409 1.666712 -0.000001 endloop endfacet facet normal 0.856698 -0.513484 0.049010 outer loop vertex -2.494409 1.666712 -0.000001 vertex -2.645764 1.414191 -0.000001 vertex -2.633023 1.407382 -0.294052 endloop endfacet facet normal 0.441350 -0.264534 -0.857457 outer loop vertex -1.469907 0.785683 2.494409 vertex -1.385819 0.925976 2.494409 vertex -1.175856 0.785683 2.645763 endloop endfacet facet normal 0.441350 -0.264535 -0.857457 outer loop vertex -1.175856 0.785683 2.645763 vertex -1.247204 0.666646 2.645763 vertex -1.469907 0.785683 2.494409 endloop endfacet facet normal 0.511345 -0.306487 0.802865 outer loop vertex -1.469906 0.785682 -2.494410 vertex -1.385818 0.925975 -2.494410 vertex -1.582435 1.057351 -2.319033 endloop endfacet facet normal 0.511346 -0.306486 0.802864 outer loop vertex -1.582435 1.057351 -2.319033 vertex -1.678453 0.897153 -2.319033 vertex -1.469906 0.785682 -2.494410 endloop endfacet facet normal 0.289268 -0.173379 -0.941416 outer loop vertex -1.012490 0.541188 2.771639 vertex -0.954569 0.637824 2.771639 vertex -0.724088 0.483822 2.870821 endloop endfacet facet normal 0.289267 -0.173380 -0.941416 outer loop vertex -0.724088 0.483822 2.870821 vertex -0.768024 0.410519 2.870821 vertex -1.012490 0.541188 2.771639 endloop endfacet facet normal 0.848467 -0.508552 -0.146558 outer loop vertex -2.633023 1.407382 0.294051 vertex -2.482397 1.658686 0.294051 vertex -2.446479 1.634686 0.585271 endloop endfacet facet normal 0.848466 -0.508553 -0.146556 outer loop vertex -2.446479 1.634686 0.585271 vertex -2.594926 1.387018 0.585271 vertex -2.633023 1.407382 0.294051 endloop endfacet facet normal 0.635880 -0.381132 0.671115 outer loop vertex -1.870836 0.999984 -2.121322 vertex -1.763812 1.178543 -2.121322 vertex -1.928203 1.288386 -1.903181 endloop endfacet facet normal 0.635880 -0.381132 0.671115 outer loop vertex -1.928203 1.288386 -1.903181 vertex -2.045202 1.093185 -1.903181 vertex -1.870836 0.999984 -2.121322 endloop endfacet facet normal 0.126002 -0.075523 -0.989151 outer loop vertex -0.516163 0.275896 2.942356 vertex -0.486635 0.325160 2.942356 vertex -0.244494 0.163368 2.985554 endloop endfacet facet normal 0.126002 -0.075524 -0.989151 outer loop vertex -0.244494 0.163368 2.985554 vertex -0.259330 0.138616 2.985554 vertex -0.516163 0.275896 2.942356 endloop endfacet facet normal 0.807700 -0.484117 -0.336529 outer loop vertex -2.531838 1.353297 0.870853 vertex -2.387000 1.594944 0.870853 vertex -2.304533 1.539841 1.148050 endloop endfacet facet normal 0.807700 -0.484113 -0.336533 outer loop vertex -2.304533 1.539841 1.148050 vertex -2.444366 1.306542 1.148050 vertex -2.531838 1.353297 0.870853 endloop endfacet facet normal 0.735932 -0.441101 0.513647 outer loop vertex -2.199871 1.175857 -1.666712 vertex -2.074024 1.385820 -1.666712 vertex -2.199871 1.469909 -1.414191 endloop endfacet facet normal 0.735934 -0.441100 0.513645 outer loop vertex -2.199871 1.469909 -1.414191 vertex -2.333354 1.247205 -1.414191 vertex -2.199871 1.175857 -1.666712 endloop endfacet facet normal 0.735934 -0.441100 -0.513646 outer loop vertex -2.333355 1.247205 1.414190 vertex -2.199872 1.469909 1.414190 vertex -2.074025 1.385821 1.666711 endloop endfacet facet normal 0.735934 -0.441100 -0.513646 outer loop vertex -2.074025 1.385821 1.666711 vertex -2.199872 1.175857 1.666711 vertex -2.333355 1.247205 1.414190 endloop endfacet facet normal 0.126003 -0.075522 0.989151 outer loop vertex -0.259328 0.138615 -2.985554 vertex -0.244493 0.163366 -2.985554 vertex -0.486633 0.325159 -2.942356 endloop endfacet facet normal 0.126002 -0.075523 0.989151 outer loop vertex -0.486633 0.325159 -2.942356 vertex -0.516161 0.275895 -2.942356 vertex -0.259328 0.138615 -2.985554 endloop endfacet facet normal 0.807701 -0.484114 0.336530 outer loop vertex -2.444366 1.306542 -1.148051 vertex -2.304533 1.539841 -1.148051 vertex -2.387000 1.594944 -0.870855 endloop endfacet facet normal 0.807698 -0.484116 0.336534 outer loop vertex -2.387000 1.594944 -0.870855 vertex -2.531838 1.353297 -0.870855 vertex -2.444366 1.306542 -1.148051 endloop endfacet facet normal 0.635881 -0.381132 -0.671114 outer loop vertex -2.045203 1.093185 1.903180 vertex -1.928204 1.288386 1.903180 vertex -1.763813 1.178544 2.121321 endloop endfacet facet normal 0.635881 -0.381132 -0.671114 outer loop vertex -1.763813 1.178544 2.121321 vertex -1.870837 0.999985 2.121321 vertex -2.045203 1.093185 1.903180 endloop endfacet facet normal 0.289268 -0.173380 0.941416 outer loop vertex -0.768023 0.410518 -2.870821 vertex -0.724087 0.483821 -2.870821 vertex -0.954567 0.637823 -2.771639 endloop endfacet facet normal 0.289267 -0.173381 0.941416 outer loop vertex -0.954567 0.637823 -2.771639 vertex -1.012488 0.541188 -2.771639 vertex -0.768023 0.410518 -2.870821 endloop endfacet facet normal 0.848466 -0.508553 0.146558 outer loop vertex -2.594926 1.387018 -0.585272 vertex -2.446479 1.634686 -0.585272 vertex -2.482397 1.658686 -0.294052 endloop endfacet facet normal 0.848467 -0.508552 0.146556 outer loop vertex -2.482397 1.658686 -0.294052 vertex -2.633023 1.407382 -0.294052 vertex -2.594926 1.387018 -0.585272 endloop endfacet facet normal 0.511346 -0.306486 -0.802865 outer loop vertex -1.678454 0.897154 2.319032 vertex -1.582436 1.057352 2.319032 vertex -1.385819 0.925976 2.494409 endloop endfacet facet normal 0.511346 -0.306488 -0.802864 outer loop vertex -1.385819 0.925976 2.494409 vertex -1.469907 0.785683 2.494409 vertex -1.678454 0.897154 2.319032 endloop endfacet facet normal 0.441352 -0.264534 0.857456 outer loop vertex -1.247203 0.666645 -2.645764 vertex -1.175855 0.785683 -2.645764 vertex -1.385818 0.925975 -2.494410 endloop endfacet facet normal 0.441351 -0.264534 0.857456 outer loop vertex -1.385818 0.925975 -2.494410 vertex -1.469906 0.785682 -2.494410 vertex -1.247203 0.666645 -2.645764 endloop endfacet facet normal 0.367091 -0.220026 -0.903788 outer loop vertex -1.247204 0.666646 2.645763 vertex -1.175856 0.785683 2.645763 vertex -0.954569 0.637824 2.771639 endloop endfacet facet normal 0.367092 -0.220025 -0.903788 outer loop vertex -0.954569 0.637824 2.771639 vertex -1.012490 0.541188 2.771639 vertex -1.247204 0.666646 2.645763 endloop endfacet facet normal 0.856698 -0.513484 -0.049011 outer loop vertex -2.645764 1.414191 -0.000001 vertex -2.494409 1.666712 -0.000001 vertex -2.482397 1.658686 0.294051 endloop endfacet facet normal 0.856698 -0.513485 -0.049010 outer loop vertex -2.482397 1.658686 0.294051 vertex -2.633023 1.407382 0.294051 vertex -2.645764 1.414191 -0.000001 endloop endfacet facet normal 0.576399 -0.345476 0.740548 outer loop vertex -1.678453 0.897153 -2.319033 vertex -1.582435 1.057351 -2.319033 vertex -1.763812 1.178543 -2.121322 endloop endfacet facet normal 0.576396 -0.345478 0.740549 outer loop vertex -1.763812 1.178543 -2.121322 vertex -1.870836 0.999984 -2.121322 vertex -1.678453 0.897153 -2.319033 endloop endfacet facet normal 0.208649 -0.125059 -0.969962 outer loop vertex -0.768024 0.410519 2.870821 vertex -0.724088 0.483822 2.870821 vertex -0.486635 0.325160 2.942356 endloop endfacet facet normal 0.208648 -0.125060 -0.969962 outer loop vertex -0.486635 0.325160 2.942356 vertex -0.516163 0.275896 2.942356 vertex -0.768024 0.410519 2.870821 endloop endfacet facet normal 0.832082 -0.498733 -0.242704 outer loop vertex -2.594926 1.387018 0.585271 vertex -2.446479 1.634686 0.585271 vertex -2.387000 1.594944 0.870853 endloop endfacet facet normal 0.832082 -0.498732 -0.242705 outer loop vertex -2.387000 1.594944 0.870853 vertex -2.531838 1.353297 0.870853 vertex -2.594926 1.387018 0.585271 endloop endfacet facet normal 0.595459 -0.441624 0.671116 outer loop vertex -1.763812 1.178543 -2.121322 vertex -1.639801 1.345752 -2.121322 vertex -1.792635 1.471179 -1.903181 endloop endfacet facet normal 0.595461 -0.441623 0.671115 outer loop vertex -1.792635 1.471179 -1.903181 vertex -1.928203 1.288386 -1.903181 vertex -1.763812 1.178543 -2.121322 endloop endfacet facet normal 0.117993 -0.087509 -0.989151 outer loop vertex -0.486635 0.325160 2.942356 vertex -0.452420 0.371294 2.942356 vertex -0.227304 0.186546 2.985554 endloop endfacet facet normal 0.117993 -0.087510 -0.989151 outer loop vertex -0.227304 0.186546 2.985554 vertex -0.244494 0.163368 2.985554 vertex -0.486635 0.325160 2.942356 endloop endfacet facet normal 0.756358 -0.560955 -0.336530 outer loop vertex -2.387000 1.594944 0.870853 vertex -2.219174 1.821231 0.870853 vertex -2.142505 1.758310 1.148050 endloop endfacet facet normal 0.756358 -0.560955 -0.336529 outer loop vertex -2.142505 1.758310 1.148050 vertex -2.304533 1.539841 1.148050 vertex -2.387000 1.594944 0.870853 endloop endfacet facet normal 0.689154 -0.511111 0.513647 outer loop vertex -2.074024 1.385820 -1.666712 vertex -1.928203 1.582437 -1.666712 vertex -2.045202 1.678456 -1.414191 endloop endfacet facet normal 0.689153 -0.511111 0.513647 outer loop vertex -2.045202 1.678456 -1.414191 vertex -2.199871 1.469909 -1.414191 vertex -2.074024 1.385820 -1.666712 endloop endfacet facet normal 0.689152 -0.511114 -0.513646 outer loop vertex -2.199872 1.469909 1.414190 vertex -2.045202 1.678456 1.414190 vertex -1.928203 1.582438 1.666711 endloop endfacet facet normal 0.689153 -0.511113 -0.513646 outer loop vertex -1.928203 1.582438 1.666711 vertex -2.074025 1.385821 1.666711 vertex -2.199872 1.469909 1.414190 endloop endfacet facet normal 0.117993 -0.087509 0.989151 outer loop vertex -0.244493 0.163366 -2.985554 vertex -0.227303 0.186544 -2.985554 vertex -0.452419 0.371292 -2.942356 endloop endfacet facet normal 0.117994 -0.087509 0.989151 outer loop vertex -0.452419 0.371292 -2.942356 vertex -0.486633 0.325159 -2.942356 vertex -0.244493 0.163366 -2.985554 endloop endfacet facet normal 0.756358 -0.560955 0.336531 outer loop vertex -2.304533 1.539841 -1.148051 vertex -2.142505 1.758310 -1.148051 vertex -2.219174 1.821231 -0.870855 endloop endfacet facet normal 0.756358 -0.560954 0.336530 outer loop vertex -2.219174 1.821231 -0.870855 vertex -2.387000 1.594944 -0.870855 vertex -2.304533 1.539841 -1.148051 endloop endfacet facet normal 0.595461 -0.441625 -0.671114 outer loop vertex -1.928204 1.288386 1.903180 vertex -1.792635 1.471179 1.903180 vertex -1.639802 1.345753 2.121321 endloop endfacet facet normal 0.595461 -0.441625 -0.671114 outer loop vertex -1.639802 1.345753 2.121321 vertex -1.763813 1.178544 2.121321 vertex -1.928204 1.288386 1.903180 endloop endfacet facet normal 0.270878 -0.200900 0.941416 outer loop vertex -0.724087 0.483821 -2.870821 vertex -0.673177 0.552464 -2.870821 vertex -0.887453 0.728316 -2.771639 endloop endfacet facet normal 0.270881 -0.200898 0.941416 outer loop vertex -0.887453 0.728316 -2.771639 vertex -0.954567 0.637823 -2.771639 vertex -0.724087 0.483821 -2.870821 endloop endfacet facet normal 0.794534 -0.589267 0.146558 outer loop vertex -2.446479 1.634686 -0.585272 vertex -2.274471 1.866612 -0.585272 vertex -2.307864 1.894017 -0.294052 endloop endfacet facet normal 0.794535 -0.589267 0.146558 outer loop vertex -2.307864 1.894017 -0.294052 vertex -2.482397 1.658686 -0.294052 vertex -2.446479 1.634686 -0.585272 endloop endfacet facet normal 0.478840 -0.355135 -0.802864 outer loop vertex -1.582436 1.057352 2.319032 vertex -1.471177 1.207366 2.319032 vertex -1.288384 1.057352 2.494409 endloop endfacet facet normal 0.478841 -0.355133 -0.802865 outer loop vertex -1.288384 1.057352 2.494409 vertex -1.385819 0.925976 2.494409 vertex -1.582436 1.057352 2.319032 endloop endfacet facet normal 0.413293 -0.306523 0.857457 outer loop vertex -1.175855 0.785683 -2.645764 vertex -1.093182 0.897153 -2.645764 vertex -1.288383 1.057351 -2.494410 endloop endfacet facet normal 0.413296 -0.306521 0.857456 outer loop vertex -1.288383 1.057351 -2.494410 vertex -1.385818 0.925975 -2.494410 vertex -1.175855 0.785683 -2.645764 endloop endfacet facet normal 0.343756 -0.254948 -0.903788 outer loop vertex -1.175856 0.785683 2.645763 vertex -1.093183 0.897154 2.645763 vertex -0.887454 0.728317 2.771639 endloop endfacet facet normal 0.343756 -0.254950 -0.903788 outer loop vertex -0.887454 0.728317 2.771639 vertex -0.954569 0.637824 2.771639 vertex -1.175856 0.785683 2.645763 endloop endfacet facet normal 0.802241 -0.594985 -0.049009 outer loop vertex -2.494409 1.666712 -0.000001 vertex -2.319031 1.903181 -0.000001 vertex -2.307864 1.894017 0.294051 endloop endfacet facet normal 0.802243 -0.594983 -0.049011 outer loop vertex -2.307864 1.894017 0.294051 vertex -2.482397 1.658686 0.294051 vertex -2.494409 1.666712 -0.000001 endloop endfacet facet normal 0.539756 -0.400314 0.740549 outer loop vertex -1.582435 1.057351 -2.319033 vertex -1.471176 1.207365 -2.319033 vertex -1.639801 1.345752 -2.121322 endloop endfacet facet normal 0.539758 -0.400313 0.740548 outer loop vertex -1.639801 1.345752 -2.121322 vertex -1.763812 1.178543 -2.121322 vertex -1.582435 1.057351 -2.319033 endloop endfacet facet normal 0.195386 -0.144908 -0.969962 outer loop vertex -0.724088 0.483822 2.870821 vertex -0.673179 0.552465 2.870821 vertex -0.452420 0.371294 2.942356 endloop endfacet facet normal 0.195386 -0.144907 -0.969962 outer loop vertex -0.452420 0.371294 2.942356 vertex -0.486635 0.325160 2.942356 vertex -0.724088 0.483822 2.870821 endloop endfacet facet normal 0.779192 -0.577888 -0.242705 outer loop vertex -2.446479 1.634686 0.585271 vertex -2.274471 1.866612 0.585271 vertex -2.219174 1.821231 0.870853 endloop endfacet facet normal 0.779191 -0.577889 -0.242704 outer loop vertex -2.219174 1.821231 0.870853 vertex -2.387000 1.594944 0.870853 vertex -2.446479 1.634686 0.585271 endloop endfacet facet normal 0.645420 -0.478674 0.595235 outer loop vertex -1.928203 1.288386 -1.903181 vertex -1.792635 1.471179 -1.903181 vertex -1.928203 1.582437 -1.666712 endloop endfacet facet normal 0.645419 -0.478675 0.595236 outer loop vertex -1.928203 1.582437 -1.666712 vertex -2.074024 1.385820 -1.666712 vertex -1.928203 1.288386 -1.903181 endloop endfacet facet normal 0.726250 -0.538625 -0.427135 outer loop vertex -2.304533 1.539841 1.148050 vertex -2.142505 1.758310 1.148050 vertex -2.045202 1.678456 1.414190 endloop endfacet facet normal 0.726250 -0.538627 -0.427133 outer loop vertex -2.045202 1.678456 1.414190 vertex -2.199872 1.469909 1.414190 vertex -2.304533 1.539841 1.148050 endloop endfacet facet normal 0.726251 -0.538624 0.427135 outer loop vertex -2.199871 1.469909 -1.414191 vertex -2.045202 1.678456 -1.414191 vertex -2.142505 1.758310 -1.148051 endloop endfacet facet normal 0.726249 -0.538625 0.427136 outer loop vertex -2.142505 1.758310 -1.148051 vertex -2.304533 1.539841 -1.148051 vertex -2.199871 1.469909 -1.414191 endloop endfacet facet normal 0.645417 -0.478676 -0.595236 outer loop vertex -2.074025 1.385821 1.666711 vertex -1.928203 1.582438 1.666711 vertex -1.792635 1.471179 1.903180 endloop endfacet facet normal 0.645417 -0.478676 -0.595237 outer loop vertex -1.792635 1.471179 1.903180 vertex -1.928204 1.288386 1.903180 vertex -2.074025 1.385821 1.666711 endloop endfacet facet normal 0.195387 -0.144907 0.969962 outer loop vertex -0.486633 0.325159 -2.942356 vertex -0.452419 0.371292 -2.942356 vertex -0.673177 0.552464 -2.870821 endloop endfacet facet normal 0.195384 -0.144909 0.969962 outer loop vertex -0.673177 0.552464 -2.870821 vertex -0.724087 0.483821 -2.870821 vertex -0.486633 0.325159 -2.942356 endloop endfacet facet normal 0.779191 -0.577889 0.242704 outer loop vertex -2.387000 1.594944 -0.870855 vertex -2.219174 1.821231 -0.870855 vertex -2.274471 1.866612 -0.585272 endloop endfacet facet normal 0.779192 -0.577888 0.242704 outer loop vertex -2.274471 1.866612 -0.585272 vertex -2.446479 1.634686 -0.585272 vertex -2.387000 1.594944 -0.870855 endloop endfacet facet normal 0.539757 -0.400313 -0.740549 outer loop vertex -1.763813 1.178544 2.121321 vertex -1.639802 1.345753 2.121321 vertex -1.471177 1.207366 2.319032 endloop endfacet facet normal 0.539757 -0.400314 -0.740548 outer loop vertex -1.471177 1.207366 2.319032 vertex -1.582436 1.057352 2.319032 vertex -1.763813 1.178544 2.121321 endloop endfacet facet normal 0.343755 -0.254945 0.903790 outer loop vertex -0.954567 0.637823 -2.771639 vertex -0.887453 0.728316 -2.771639 vertex -1.093182 0.897153 -2.645764 endloop endfacet facet normal 0.343751 -0.254947 0.903790 outer loop vertex -1.093182 0.897153 -2.645764 vertex -1.175855 0.785683 -2.645764 vertex -0.954567 0.637823 -2.771639 endloop endfacet facet normal 0.802243 -0.594983 0.049009 outer loop vertex -2.482397 1.658686 -0.294052 vertex -2.307864 1.894017 -0.294052 vertex -2.319031 1.903181 -0.000001 endloop endfacet facet normal 0.802241 -0.594985 0.049011 outer loop vertex -2.319031 1.903181 -0.000001 vertex -2.494409 1.666712 -0.000001 vertex -2.482397 1.658686 -0.294052 endloop endfacet facet normal 0.413295 -0.306520 -0.857457 outer loop vertex -1.385819 0.925976 2.494409 vertex -1.288384 1.057352 2.494409 vertex -1.093183 0.897154 2.645763 endloop endfacet facet normal 0.413294 -0.306522 -0.857457 outer loop vertex -1.093183 0.897154 2.645763 vertex -1.175856 0.785683 2.645763 vertex -1.385819 0.925976 2.494409 endloop endfacet facet normal 0.478842 -0.355133 0.802864 outer loop vertex -1.385818 0.925975 -2.494410 vertex -1.288383 1.057351 -2.494410 vertex -1.471176 1.207365 -2.319033 endloop endfacet facet normal 0.478839 -0.355135 0.802865 outer loop vertex -1.471176 1.207365 -2.319033 vertex -1.582435 1.057351 -2.319033 vertex -1.385818 0.925975 -2.494410 endloop endfacet facet normal 0.270879 -0.200900 -0.941416 outer loop vertex -0.954569 0.637824 2.771639 vertex -0.887454 0.728317 2.771639 vertex -0.673179 0.552465 2.870821 endloop endfacet facet normal 0.270880 -0.200898 -0.941416 outer loop vertex -0.673179 0.552465 2.870821 vertex -0.724088 0.483822 2.870821 vertex -0.954569 0.637824 2.771639 endloop endfacet facet normal 0.794535 -0.589267 -0.146558 outer loop vertex -2.482397 1.658686 0.294051 vertex -2.307864 1.894017 0.294051 vertex -2.274471 1.866612 0.585271 endloop endfacet facet normal 0.794535 -0.589267 -0.146558 outer loop vertex -2.274471 1.866612 0.585271 vertex -2.446479 1.634686 0.585271 vertex -2.482397 1.658686 0.294051 endloop endfacet facet normal 0.497923 -0.451289 0.740548 outer loop vertex -1.471176 1.207365 -2.319033 vertex -1.345750 1.345752 -2.319033 vertex -1.499998 1.500001 -2.121322 endloop endfacet facet normal 0.497921 -0.451289 0.740548 outer loop vertex -1.499998 1.500001 -2.121322 vertex -1.639801 1.345752 -2.121322 vertex -1.471176 1.207365 -2.319033 endloop endfacet facet normal 0.180242 -0.163360 -0.969962 outer loop vertex -0.673179 0.552465 2.870821 vertex -0.615786 0.615789 2.870821 vertex -0.413848 0.413851 2.942356 endloop endfacet facet normal 0.180240 -0.163363 -0.969962 outer loop vertex -0.413848 0.413851 2.942356 vertex -0.452420 0.371294 2.942356 vertex -0.673179 0.552465 2.870821 endloop endfacet facet normal 0.718797 -0.651479 -0.242705 outer loop vertex -2.274471 1.866612 0.585271 vertex -2.080559 2.080561 0.585271 vertex -2.029976 2.029979 0.870853 endloop endfacet facet normal 0.718797 -0.651479 -0.242705 outer loop vertex -2.029976 2.029979 0.870853 vertex -2.219174 1.821231 0.870853 vertex -2.274471 1.866612 0.585271 endloop endfacet facet normal 0.595392 -0.539632 0.595236 outer loop vertex -1.792635 1.471179 -1.903181 vertex -1.639802 1.639804 -1.903181 vertex -1.763812 1.763815 -1.666712 endloop endfacet facet normal 0.595393 -0.539632 0.595235 outer loop vertex -1.763812 1.763815 -1.666712 vertex -1.928203 1.582437 -1.666712 vertex -1.792635 1.471179 -1.903181 endloop endfacet facet normal 0.669960 -0.607217 -0.427132 outer loop vertex -2.142505 1.758310 1.148050 vertex -1.959843 1.959846 1.148050 vertex -1.870837 1.870839 1.414190 endloop endfacet facet normal 0.669961 -0.607214 -0.427134 outer loop vertex -1.870837 1.870839 1.414190 vertex -2.045202 1.678456 1.414190 vertex -2.142505 1.758310 1.148050 endloop endfacet facet normal 0.669959 -0.607216 0.427134 outer loop vertex -2.045202 1.678456 -1.414191 vertex -1.870836 1.870839 -1.414191 vertex -1.959843 1.959846 -1.148051 endloop endfacet facet normal 0.669959 -0.607216 0.427135 outer loop vertex -1.959843 1.959846 -1.148051 vertex -2.142505 1.758310 -1.148051 vertex -2.045202 1.678456 -1.414191 endloop endfacet facet normal 0.595392 -0.539633 -0.595235 outer loop vertex -1.928203 1.582438 1.666711 vertex -1.763812 1.763815 1.666711 vertex -1.639802 1.639805 1.903180 endloop endfacet facet normal 0.595393 -0.539630 -0.595236 outer loop vertex -1.639802 1.639805 1.903180 vertex -1.792635 1.471179 1.903180 vertex -1.928203 1.582438 1.666711 endloop endfacet facet normal 0.180240 -0.163362 0.969962 outer loop vertex -0.452419 0.371292 -2.942356 vertex -0.413847 0.413849 -2.942356 vertex -0.615785 0.615787 -2.870821 endloop endfacet facet normal 0.180243 -0.163360 0.969962 outer loop vertex -0.615785 0.615787 -2.870821 vertex -0.673177 0.552464 -2.870821 vertex -0.452419 0.371292 -2.942356 endloop endfacet facet normal 0.718797 -0.651479 0.242704 outer loop vertex -2.219174 1.821231 -0.870855 vertex -2.029976 2.029979 -0.870855 vertex -2.080559 2.080561 -0.585272 endloop endfacet facet normal 0.718797 -0.651480 0.242704 outer loop vertex -2.080559 2.080561 -0.585272 vertex -2.274471 1.866612 -0.585272 vertex -2.219174 1.821231 -0.870855 endloop endfacet facet normal 0.497921 -0.451289 -0.740549 outer loop vertex -1.639802 1.345753 2.121321 vertex -1.499999 1.500002 2.121321 vertex -1.345750 1.345753 2.319032 endloop endfacet facet normal 0.497921 -0.451290 -0.740548 outer loop vertex -1.345750 1.345753 2.319032 vertex -1.471177 1.207366 2.319032 vertex -1.639802 1.345753 2.121321 endloop endfacet facet normal 0.317110 -0.287412 0.903790 outer loop vertex -0.887453 0.728316 -2.771639 vertex -0.811792 0.811795 -2.771639 vertex -0.999982 0.999984 -2.645764 endloop endfacet facet normal 0.317111 -0.287411 0.903790 outer loop vertex -0.999982 0.999984 -2.645764 vertex -1.093182 0.897153 -2.645764 vertex -0.887453 0.728316 -2.771639 endloop endfacet facet normal 0.740061 -0.670752 0.049010 outer loop vertex -2.307864 1.894017 -0.294052 vertex -2.111105 2.111107 -0.294052 vertex -2.121320 2.121322 -0.000001 endloop endfacet facet normal 0.740062 -0.670751 0.049009 outer loop vertex -2.121320 2.121322 -0.000001 vertex -2.319031 1.903181 -0.000001 vertex -2.307864 1.894017 -0.294052 endloop endfacet facet normal 0.381261 -0.345554 -0.857457 outer loop vertex -1.288384 1.057352 2.494409 vertex -1.178542 1.178544 2.494409 vertex -0.999983 0.999985 2.645763 endloop endfacet facet normal 0.381261 -0.345553 -0.857457 outer loop vertex -0.999983 0.999985 2.645763 vertex -1.093183 0.897154 2.645763 vertex -1.288384 1.057352 2.494409 endloop endfacet facet normal 0.441726 -0.400358 0.802864 outer loop vertex -1.288383 1.057351 -2.494410 vertex -1.178541 1.178543 -2.494410 vertex -1.345750 1.345752 -2.319033 endloop endfacet facet normal 0.441728 -0.400357 0.802864 outer loop vertex -1.345750 1.345752 -2.319033 vertex -1.471176 1.207365 -2.319033 vertex -1.288383 1.057351 -2.494410 endloop endfacet facet normal 0.249885 -0.226483 -0.941415 outer loop vertex -0.887454 0.728317 2.771639 vertex -0.811793 0.811796 2.771639 vertex -0.615786 0.615789 2.870821 endloop endfacet facet normal 0.249886 -0.226481 -0.941416 outer loop vertex -0.615786 0.615789 2.870821 vertex -0.673179 0.552465 2.870821 vertex -0.887454 0.728317 2.771639 endloop endfacet facet normal 0.732950 -0.664307 -0.146558 outer loop vertex -2.307864 1.894017 0.294051 vertex -2.111105 2.111107 0.294051 vertex -2.080559 2.080561 0.585271 endloop endfacet facet normal 0.732950 -0.664307 -0.146558 outer loop vertex -2.080559 2.080561 0.585271 vertex -2.274471 1.866612 0.585271 vertex -2.307864 1.894017 0.294051 endloop endfacet facet normal 0.549306 -0.497862 0.671116 outer loop vertex -1.639801 1.345752 -2.121322 vertex -1.499998 1.500001 -2.121322 vertex -1.639802 1.639804 -1.903181 endloop endfacet facet normal 0.549305 -0.497862 0.671116 outer loop vertex -1.639802 1.639804 -1.903181 vertex -1.792635 1.471179 -1.903181 vertex -1.639801 1.345752 -2.121322 endloop endfacet facet normal 0.108847 -0.098654 -0.989151 outer loop vertex -0.452420 0.371294 2.942356 vertex -0.413848 0.413851 2.942356 vertex -0.207925 0.207928 2.985554 endloop endfacet facet normal 0.108848 -0.098652 -0.989151 outer loop vertex -0.207925 0.207928 2.985554 vertex -0.227304 0.186546 2.985554 vertex -0.452420 0.371294 2.942356 endloop endfacet facet normal 0.697734 -0.632388 -0.336531 outer loop vertex -2.219174 1.821231 0.870853 vertex -2.029976 2.029979 0.870853 vertex -1.959843 1.959846 1.148050 endloop endfacet facet normal 0.697733 -0.632389 -0.336530 outer loop vertex -1.959843 1.959846 1.148050 vertex -2.142505 1.758310 1.148050 vertex -2.219174 1.821231 0.870853 endloop endfacet facet normal 0.635738 -0.576198 0.513646 outer loop vertex -1.928203 1.582437 -1.666712 vertex -1.763812 1.763815 -1.666712 vertex -1.870836 1.870839 -1.414191 endloop endfacet facet normal 0.635737 -0.576199 0.513647 outer loop vertex -1.870836 1.870839 -1.414191 vertex -2.045202 1.678456 -1.414191 vertex -1.928203 1.582437 -1.666712 endloop endfacet facet normal 0.635738 -0.576197 -0.513648 outer loop vertex -2.045202 1.678456 1.414190 vertex -1.870837 1.870839 1.414190 vertex -1.763812 1.763815 1.666711 endloop endfacet facet normal 0.635737 -0.576200 -0.513645 outer loop vertex -1.763812 1.763815 1.666711 vertex -1.928203 1.582438 1.666711 vertex -2.045202 1.678456 1.414190 endloop endfacet facet normal 0.108846 -0.098655 0.989151 outer loop vertex -0.227303 0.186544 -2.985554 vertex -0.207923 0.207926 -2.985554 vertex -0.413847 0.413849 -2.942356 endloop endfacet facet normal 0.108846 -0.098654 0.989151 outer loop vertex -0.413847 0.413849 -2.942356 vertex -0.452419 0.371292 -2.942356 vertex -0.227303 0.186544 -2.985554 endloop endfacet facet normal 0.697733 -0.632389 0.336532 outer loop vertex -2.142505 1.758310 -1.148051 vertex -1.959843 1.959846 -1.148051 vertex -2.029976 2.029979 -0.870855 endloop endfacet facet normal 0.697733 -0.632388 0.336531 outer loop vertex -2.029976 2.029979 -0.870855 vertex -2.219174 1.821231 -0.870855 vertex -2.142505 1.758310 -1.148051 endloop endfacet facet normal 0.549308 -0.497862 -0.671114 outer loop vertex -1.792635 1.471179 1.903180 vertex -1.639802 1.639805 1.903180 vertex -1.499999 1.500002 2.121321 endloop endfacet facet normal 0.549308 -0.497863 -0.671114 outer loop vertex -1.499999 1.500002 2.121321 vertex -1.639802 1.345753 2.121321 vertex -1.792635 1.471179 1.903180 endloop endfacet facet normal 0.249886 -0.226481 0.941416 outer loop vertex -0.673177 0.552464 -2.870821 vertex -0.615785 0.615787 -2.870821 vertex -0.811792 0.811795 -2.771639 endloop endfacet facet normal 0.249884 -0.226482 0.941416 outer loop vertex -0.811792 0.811795 -2.771639 vertex -0.887453 0.728316 -2.771639 vertex -0.673177 0.552464 -2.870821 endloop endfacet facet normal 0.732950 -0.664307 0.146558 outer loop vertex -2.274471 1.866612 -0.585272 vertex -2.080559 2.080561 -0.585272 vertex -2.111105 2.111107 -0.294052 endloop endfacet facet normal 0.732950 -0.664307 0.146558 outer loop vertex -2.111105 2.111107 -0.294052 vertex -2.307864 1.894017 -0.294052 vertex -2.274471 1.866612 -0.585272 endloop endfacet facet normal 0.441727 -0.400359 -0.802864 outer loop vertex -1.471177 1.207366 2.319032 vertex -1.345750 1.345753 2.319032 vertex -1.178542 1.178544 2.494409 endloop endfacet facet normal 0.441727 -0.400358 -0.802864 outer loop vertex -1.178542 1.178544 2.494409 vertex -1.288384 1.057352 2.494409 vertex -1.471177 1.207366 2.319032 endloop endfacet facet normal 0.381262 -0.345554 0.857456 outer loop vertex -1.093182 0.897153 -2.645764 vertex -0.999982 0.999984 -2.645764 vertex -1.178541 1.178543 -2.494410 endloop endfacet facet normal 0.381261 -0.345555 0.857457 outer loop vertex -1.178541 1.178543 -2.494410 vertex -1.288383 1.057351 -2.494410 vertex -1.093182 0.897153 -2.645764 endloop endfacet facet normal 0.317113 -0.287413 -0.903788 outer loop vertex -1.093183 0.897154 2.645763 vertex -0.999983 0.999985 2.645763 vertex -0.811793 0.811796 2.771639 endloop endfacet facet normal 0.317113 -0.287414 -0.903788 outer loop vertex -0.811793 0.811796 2.771639 vertex -0.887454 0.728317 2.771639 vertex -1.093183 0.897154 2.645763 endloop endfacet facet normal 0.740061 -0.670751 -0.049010 outer loop vertex -2.319031 1.903181 -0.000001 vertex -2.121320 2.121322 -0.000001 vertex -2.111105 2.111107 0.294051 endloop endfacet facet normal 0.740061 -0.670752 -0.049009 outer loop vertex -2.111105 2.111107 0.294051 vertex -2.307864 1.894017 0.294051 vertex -2.319031 1.903181 -0.000001 endloop endfacet facet normal 0.400358 -0.441726 0.802865 outer loop vertex -1.178541 1.178543 -2.494410 vertex -1.057348 1.288386 -2.494410 vertex -1.207363 1.471179 -2.319033 endloop endfacet facet normal 0.400358 -0.441726 0.802864 outer loop vertex -1.207363 1.471179 -2.319033 vertex -1.345750 1.345752 -2.319033 vertex -1.178541 1.178543 -2.494410 endloop endfacet facet normal 0.226483 -0.249883 -0.941416 outer loop vertex -0.811793 0.811796 2.771639 vertex -0.728315 0.887457 2.771639 vertex -0.552463 0.673181 2.870821 endloop endfacet facet normal 0.226481 -0.249886 -0.941416 outer loop vertex -0.552463 0.673181 2.870821 vertex -0.615786 0.615789 2.870821 vertex -0.811793 0.811796 2.771639 endloop endfacet facet normal 0.664308 -0.732950 -0.146559 outer loop vertex -2.111105 2.111107 0.294051 vertex -1.894015 2.307866 0.294051 vertex -1.866610 2.274473 0.585271 endloop endfacet facet normal 0.664307 -0.732950 -0.146558 outer loop vertex -1.866610 2.274473 0.585271 vertex -2.080559 2.080561 0.585271 vertex -2.111105 2.111107 0.294051 endloop endfacet facet normal 0.497864 -0.549305 0.671115 outer loop vertex -1.499998 1.500001 -2.121322 vertex -1.345750 1.639804 -2.121322 vertex -1.471177 1.792637 -1.903181 endloop endfacet facet normal 0.497862 -0.549306 0.671116 outer loop vertex -1.471177 1.792637 -1.903181 vertex -1.639802 1.639804 -1.903181 vertex -1.499998 1.500001 -2.121322 endloop endfacet facet normal 0.098653 -0.108848 -0.989151 outer loop vertex -0.413848 0.413851 2.942356 vertex -0.371291 0.452422 2.942356 vertex -0.186543 0.227307 2.985554 endloop endfacet facet normal 0.098652 -0.108849 -0.989151 outer loop vertex -0.186543 0.227307 2.985554 vertex -0.207925 0.207928 2.985554 vertex -0.413848 0.413851 2.942356 endloop endfacet facet normal 0.632390 -0.697732 -0.336532 outer loop vertex -2.029976 2.029979 0.870853 vertex -1.821229 2.219177 0.870853 vertex -1.758308 2.142507 1.148050 endloop endfacet facet normal 0.632389 -0.697733 -0.336531 outer loop vertex -1.758308 2.142507 1.148050 vertex -1.959843 1.959846 1.148050 vertex -2.029976 2.029979 0.870853 endloop endfacet facet normal 0.576198 -0.635738 0.513647 outer loop vertex -1.763812 1.763815 -1.666712 vertex -1.582435 1.928205 -1.666712 vertex -1.678454 2.045204 -1.414191 endloop endfacet facet normal 0.576199 -0.635738 0.513646 outer loop vertex -1.678454 2.045204 -1.414191 vertex -1.870836 1.870839 -1.414191 vertex -1.763812 1.763815 -1.666712 endloop endfacet facet normal 0.576199 -0.635736 -0.513647 outer loop vertex -1.870837 1.870839 1.414190 vertex -1.678454 2.045205 1.414190 vertex -1.582435 1.928206 1.666711 endloop endfacet facet normal 0.576199 -0.635736 -0.513648 outer loop vertex -1.582435 1.928206 1.666711 vertex -1.763812 1.763815 1.666711 vertex -1.870837 1.870839 1.414190 endloop endfacet facet normal 0.098654 -0.108846 0.989151 outer loop vertex -0.207923 0.207926 -2.985554 vertex -0.186542 0.227305 -2.985554 vertex -0.371290 0.452421 -2.942356 endloop endfacet facet normal 0.098654 -0.108846 0.989151 outer loop vertex -0.371290 0.452421 -2.942356 vertex -0.413847 0.413849 -2.942356 vertex -0.207923 0.207926 -2.985554 endloop endfacet facet normal 0.632389 -0.697732 0.336533 outer loop vertex -1.959843 1.959846 -1.148051 vertex -1.758308 2.142507 -1.148051 vertex -1.821229 2.219177 -0.870855 endloop endfacet facet normal 0.632390 -0.697732 0.336532 outer loop vertex -1.821229 2.219177 -0.870855 vertex -2.029976 2.029979 -0.870855 vertex -1.959843 1.959846 -1.148051 endloop endfacet facet normal 0.497861 -0.549308 -0.671115 outer loop vertex -1.639802 1.639805 1.903180 vertex -1.471177 1.792637 1.903180 vertex -1.345750 1.639804 2.121321 endloop endfacet facet normal 0.497861 -0.549309 -0.671114 outer loop vertex -1.345750 1.639804 2.121321 vertex -1.499999 1.500002 2.121321 vertex -1.639802 1.639805 1.903180 endloop endfacet facet normal 0.226483 -0.249885 0.941415 outer loop vertex -0.615785 0.615787 -2.870821 vertex -0.552462 0.673180 -2.870821 vertex -0.728313 0.887455 -2.771639 endloop endfacet facet normal 0.226481 -0.249886 0.941416 outer loop vertex -0.728313 0.887455 -2.771639 vertex -0.811792 0.811795 -2.771639 vertex -0.615785 0.615787 -2.870821 endloop endfacet facet normal 0.664307 -0.732950 0.146559 outer loop vertex -2.080559 2.080561 -0.585272 vertex -1.866610 2.274473 -0.585272 vertex -1.894015 2.307866 -0.294052 endloop endfacet facet normal 0.664308 -0.732950 0.146558 outer loop vertex -1.894015 2.307866 -0.294052 vertex -2.111105 2.111107 -0.294052 vertex -2.080559 2.080561 -0.585272 endloop endfacet facet normal 0.400359 -0.441727 -0.802864 outer loop vertex -1.345750 1.345753 2.319032 vertex -1.207363 1.471180 2.319032 vertex -1.057349 1.288387 2.494409 endloop endfacet facet normal 0.400358 -0.441728 -0.802864 outer loop vertex -1.057349 1.288387 2.494409 vertex -1.178542 1.178544 2.494409 vertex -1.345750 1.345753 2.319032 endloop endfacet facet normal 0.345556 -0.381261 0.857456 outer loop vertex -0.999982 0.999984 -2.645764 vertex -0.897151 1.093185 -2.645764 vertex -1.057348 1.288386 -2.494410 endloop endfacet facet normal 0.345555 -0.381261 0.857457 outer loop vertex -1.057348 1.288386 -2.494410 vertex -1.178541 1.178543 -2.494410 vertex -0.999982 0.999984 -2.645764 endloop endfacet facet normal 0.287415 -0.317112 -0.903788 outer loop vertex -0.999983 0.999985 2.645763 vertex -0.897152 1.093186 2.645763 vertex -0.728315 0.887457 2.771639 endloop endfacet facet normal 0.287416 -0.317110 -0.903788 outer loop vertex -0.728315 0.887457 2.771639 vertex -0.811793 0.811796 2.771639 vertex -0.999983 0.999985 2.645763 endloop endfacet facet normal 0.670751 -0.740062 -0.049008 outer loop vertex -2.121320 2.121322 -0.000001 vertex -1.903179 2.319033 -0.000001 vertex -1.894015 2.307866 0.294051 endloop endfacet facet normal 0.670752 -0.740061 -0.049009 outer loop vertex -1.894015 2.307866 0.294051 vertex -2.111105 2.111107 0.294051 vertex -2.121320 2.121322 -0.000001 endloop endfacet facet normal 0.451290 -0.497921 0.740548 outer loop vertex -1.345750 1.345752 -2.319033 vertex -1.207363 1.471179 -2.319033 vertex -1.345750 1.639804 -2.121322 endloop endfacet facet normal 0.451291 -0.497920 0.740548 outer loop vertex -1.345750 1.639804 -2.121322 vertex -1.499998 1.500001 -2.121322 vertex -1.345750 1.345752 -2.319033 endloop endfacet facet normal 0.163360 -0.180242 -0.969962 outer loop vertex -0.615786 0.615789 2.870821 vertex -0.552463 0.673181 2.870821 vertex -0.371291 0.452422 2.942356 endloop endfacet facet normal 0.163360 -0.180242 -0.969962 outer loop vertex -0.371291 0.452422 2.942356 vertex -0.413848 0.413851 2.942356 vertex -0.615786 0.615789 2.870821 endloop endfacet facet normal 0.651480 -0.718797 -0.242702 outer loop vertex -2.080559 2.080561 0.585271 vertex -1.866610 2.274473 0.585271 vertex -1.821229 2.219177 0.870853 endloop endfacet facet normal 0.651481 -0.718795 -0.242704 outer loop vertex -1.821229 2.219177 0.870853 vertex -2.029976 2.029979 0.870853 vertex -2.080559 2.080561 0.585271 endloop endfacet facet normal 0.539633 -0.595392 0.595235 outer loop vertex -1.639802 1.639804 -1.903181 vertex -1.471177 1.792637 -1.903181 vertex -1.582435 1.928205 -1.666712 endloop endfacet facet normal 0.539631 -0.595393 0.595236 outer loop vertex -1.582435 1.928205 -1.666712 vertex -1.763812 1.763815 -1.666712 vertex -1.639802 1.639804 -1.903181 endloop endfacet facet normal 0.607217 -0.669959 -0.427132 outer loop vertex -1.959843 1.959846 1.148050 vertex -1.758308 2.142507 1.148050 vertex -1.678454 2.045205 1.414190 endloop endfacet facet normal 0.607217 -0.669959 -0.427132 outer loop vertex -1.678454 2.045205 1.414190 vertex -1.870837 1.870839 1.414190 vertex -1.959843 1.959846 1.148050 endloop endfacet facet normal 0.607216 -0.669959 0.427135 outer loop vertex -1.870836 1.870839 -1.414191 vertex -1.678454 2.045204 -1.414191 vertex -1.758308 2.142507 -1.148051 endloop endfacet facet normal 0.607216 -0.669959 0.427134 outer loop vertex -1.758308 2.142507 -1.148051 vertex -1.959843 1.959846 -1.148051 vertex -1.870836 1.870839 -1.414191 endloop endfacet facet normal 0.539632 -0.595391 -0.595236 outer loop vertex -1.763812 1.763815 1.666711 vertex -1.582435 1.928206 1.666711 vertex -1.471177 1.792637 1.903180 endloop endfacet facet normal 0.539631 -0.595394 -0.595234 outer loop vertex -1.471177 1.792637 1.903180 vertex -1.639802 1.639805 1.903180 vertex -1.763812 1.763815 1.666711 endloop endfacet facet normal 0.163363 -0.180240 0.969962 outer loop vertex -0.413847 0.413849 -2.942356 vertex -0.371290 0.452421 -2.942356 vertex -0.552462 0.673180 -2.870821 endloop endfacet facet normal 0.163361 -0.180241 0.969962 outer loop vertex -0.552462 0.673180 -2.870821 vertex -0.615785 0.615787 -2.870821 vertex -0.413847 0.413849 -2.942356 endloop endfacet facet normal 0.651482 -0.718796 0.242702 outer loop vertex -2.029976 2.029979 -0.870855 vertex -1.821229 2.219177 -0.870855 vertex -1.866610 2.274473 -0.585272 endloop endfacet facet normal 0.651480 -0.718797 0.242704 outer loop vertex -1.866610 2.274473 -0.585272 vertex -2.080559 2.080561 -0.585272 vertex -2.029976 2.029979 -0.870855 endloop endfacet facet normal 0.451288 -0.497924 -0.740547 outer loop vertex -1.499999 1.500002 2.121321 vertex -1.345750 1.639804 2.121321 vertex -1.207363 1.471180 2.319032 endloop endfacet facet normal 0.451290 -0.497920 -0.740549 outer loop vertex -1.207363 1.471180 2.319032 vertex -1.345750 1.345753 2.319032 vertex -1.499999 1.500002 2.121321 endloop endfacet facet normal 0.287409 -0.317111 0.903790 outer loop vertex -0.811792 0.811795 -2.771639 vertex -0.728313 0.887455 -2.771639 vertex -0.897151 1.093185 -2.645764 endloop endfacet facet normal 0.287412 -0.317109 0.903790 outer loop vertex -0.897151 1.093185 -2.645764 vertex -0.999982 0.999984 -2.645764 vertex -0.811792 0.811795 -2.771639 endloop endfacet facet normal 0.670752 -0.740061 0.049008 outer loop vertex -2.111105 2.111107 -0.294052 vertex -1.894015 2.307866 -0.294052 vertex -1.903179 2.319033 -0.000001 endloop endfacet facet normal 0.670751 -0.740062 0.049010 outer loop vertex -1.903179 2.319033 -0.000001 vertex -2.121320 2.121322 -0.000001 vertex -2.111105 2.111107 -0.294052 endloop endfacet facet normal 0.345555 -0.381261 -0.857457 outer loop vertex -1.178542 1.178544 2.494409 vertex -1.057349 1.288387 2.494409 vertex -0.897152 1.093186 2.645763 endloop endfacet facet normal 0.345555 -0.381260 -0.857457 outer loop vertex -0.897152 1.093186 2.645763 vertex -0.999983 0.999985 2.645763 vertex -1.178542 1.178544 2.494409 endloop endfacet facet normal 0.306520 -0.413296 0.857457 outer loop vertex -0.897151 1.093185 -2.645764 vertex -0.785680 1.175857 -2.645764 vertex -0.925973 1.385820 -2.494410 endloop endfacet facet normal 0.306520 -0.413296 0.857456 outer loop vertex -0.925973 1.385820 -2.494410 vertex -1.057348 1.288386 -2.494410 vertex -0.897151 1.093185 -2.645764 endloop endfacet facet normal 0.254947 -0.343758 -0.903788 outer loop vertex -0.897152 1.093186 2.645763 vertex -0.785681 1.175858 2.645763 vertex -0.637822 0.954571 2.771639 endloop endfacet facet normal 0.254947 -0.343757 -0.903788 outer loop vertex -0.637822 0.954571 2.771639 vertex -0.728315 0.887457 2.771639 vertex -0.897152 1.093186 2.645763 endloop endfacet facet normal 0.594985 -0.802241 -0.049011 outer loop vertex -1.903179 2.319033 -0.000001 vertex -1.666710 2.494411 -0.000001 vertex -1.658684 2.482399 0.294051 endloop endfacet facet normal 0.594983 -0.802243 -0.049008 outer loop vertex -1.658684 2.482399 0.294051 vertex -1.894015 2.307866 0.294051 vertex -1.903179 2.319033 -0.000001 endloop endfacet facet normal 0.400309 -0.539758 0.740550 outer loop vertex -1.207363 1.471179 -2.319033 vertex -1.057348 1.582437 -2.319033 vertex -1.178541 1.763815 -2.121322 endloop endfacet facet normal 0.400312 -0.539757 0.740548 outer loop vertex -1.178541 1.763815 -2.121322 vertex -1.345750 1.639804 -2.121322 vertex -1.207363 1.471179 -2.319033 endloop endfacet facet normal 0.144908 -0.195385 -0.969962 outer loop vertex -0.552463 0.673181 2.870821 vertex -0.483819 0.724091 2.870821 vertex -0.325158 0.486637 2.942356 endloop endfacet facet normal 0.144909 -0.195385 -0.969962 outer loop vertex -0.325158 0.486637 2.942356 vertex -0.371291 0.452422 2.942356 vertex -0.552463 0.673181 2.870821 endloop endfacet facet normal 0.577888 -0.779192 -0.242702 outer loop vertex -1.866610 2.274473 0.585271 vertex -1.634684 2.446481 0.585271 vertex -1.594942 2.387003 0.870853 endloop endfacet facet normal 0.577889 -0.779192 -0.242702 outer loop vertex -1.594942 2.387003 0.870853 vertex -1.821229 2.219177 0.870853 vertex -1.866610 2.274473 0.585271 endloop endfacet facet normal 0.478674 -0.645418 0.595237 outer loop vertex -1.471177 1.792637 -1.903181 vertex -1.288383 1.928206 -1.903181 vertex -1.385818 2.074027 -1.666712 endloop endfacet facet normal 0.478677 -0.645417 0.595235 outer loop vertex -1.385818 2.074027 -1.666712 vertex -1.582435 1.928205 -1.666712 vertex -1.471177 1.792637 -1.903181 endloop endfacet facet normal 0.538623 -0.726252 -0.427133 outer loop vertex -1.758308 2.142507 1.148050 vertex -1.539838 2.304535 1.148050 vertex -1.469906 2.199874 1.414190 endloop endfacet facet normal 0.538623 -0.726253 -0.427132 outer loop vertex -1.469906 2.199874 1.414190 vertex -1.678454 2.045205 1.414190 vertex -1.758308 2.142507 1.148050 endloop endfacet facet normal 0.538626 -0.726252 0.427131 outer loop vertex -1.678454 2.045204 -1.414191 vertex -1.469906 2.199874 -1.414191 vertex -1.539838 2.304534 -1.148051 endloop endfacet facet normal 0.538621 -0.726253 0.427135 outer loop vertex -1.539838 2.304534 -1.148051 vertex -1.758308 2.142507 -1.148051 vertex -1.678454 2.045204 -1.414191 endloop endfacet facet normal 0.478675 -0.645418 -0.595236 outer loop vertex -1.582435 1.928206 1.666711 vertex -1.385818 2.074027 1.666711 vertex -1.288384 1.928206 1.903180 endloop endfacet facet normal 0.478675 -0.645417 -0.595237 outer loop vertex -1.288384 1.928206 1.903180 vertex -1.471177 1.792637 1.903180 vertex -1.582435 1.928206 1.666711 endloop endfacet facet normal 0.144906 -0.195386 0.969962 outer loop vertex -0.371290 0.452421 -2.942356 vertex -0.325157 0.486635 -2.942356 vertex -0.483819 0.724089 -2.870821 endloop endfacet facet normal 0.144908 -0.195386 0.969962 outer loop vertex -0.483819 0.724089 -2.870821 vertex -0.552462 0.673180 -2.870821 vertex -0.371290 0.452421 -2.942356 endloop endfacet facet normal 0.577884 -0.779194 0.242705 outer loop vertex -1.821229 2.219177 -0.870855 vertex -1.594941 2.387002 -0.870855 vertex -1.634684 2.446481 -0.585272 endloop endfacet facet normal 0.577888 -0.779193 0.242701 outer loop vertex -1.634684 2.446481 -0.585272 vertex -1.866610 2.274473 -0.585272 vertex -1.821229 2.219177 -0.870855 endloop endfacet facet normal 0.400313 -0.539758 -0.740548 outer loop vertex -1.345750 1.639804 2.121321 vertex -1.178541 1.763815 2.121321 vertex -1.057349 1.582438 2.319032 endloop endfacet facet normal 0.400313 -0.539759 -0.740547 outer loop vertex -1.057349 1.582438 2.319032 vertex -1.207363 1.471180 2.319032 vertex -1.345750 1.639804 2.121321 endloop endfacet facet normal 0.254950 -0.343752 0.903789 outer loop vertex -0.728313 0.887455 -2.771639 vertex -0.637821 0.954570 -2.771639 vertex -0.785680 1.175857 -2.645764 endloop endfacet facet normal 0.254944 -0.343754 0.903790 outer loop vertex -0.785680 1.175857 -2.645764 vertex -0.897151 1.093185 -2.645764 vertex -0.728313 0.887455 -2.771639 endloop endfacet facet normal 0.594983 -0.802243 0.049011 outer loop vertex -1.894015 2.307866 -0.294052 vertex -1.658684 2.482399 -0.294052 vertex -1.666710 2.494411 -0.000001 endloop endfacet facet normal 0.594985 -0.802241 0.049008 outer loop vertex -1.666710 2.494411 -0.000001 vertex -1.903179 2.319033 -0.000001 vertex -1.894015 2.307866 -0.294052 endloop endfacet facet normal 0.306520 -0.413296 -0.857457 outer loop vertex -1.057349 1.288387 2.494409 vertex -0.925974 1.385821 2.494409 vertex -0.785681 1.175858 2.645763 endloop endfacet facet normal 0.306520 -0.413296 -0.857457 outer loop vertex -0.785681 1.175858 2.645763 vertex -0.897152 1.093186 2.645763 vertex -1.057349 1.288387 2.494409 endloop endfacet facet normal 0.355132 -0.478842 0.802864 outer loop vertex -1.057348 1.288386 -2.494410 vertex -0.925973 1.385820 -2.494410 vertex -1.057348 1.582437 -2.319033 endloop endfacet facet normal 0.355131 -0.478842 0.802865 outer loop vertex -1.057348 1.582437 -2.319033 vertex -1.207363 1.471179 -2.319033 vertex -1.057348 1.288386 -2.494410 endloop endfacet facet normal 0.200898 -0.270880 -0.941416 outer loop vertex -0.728315 0.887457 2.771639 vertex -0.637822 0.954571 2.771639 vertex -0.483819 0.724091 2.870821 endloop endfacet facet normal 0.200899 -0.270880 -0.941416 outer loop vertex -0.483819 0.724091 2.870821 vertex -0.552463 0.673181 2.870821 vertex -0.728315 0.887457 2.771639 endloop endfacet facet normal 0.589266 -0.794535 -0.146558 outer loop vertex -1.894015 2.307866 0.294051 vertex -1.658684 2.482399 0.294051 vertex -1.634684 2.446481 0.585271 endloop endfacet facet normal 0.589267 -0.794535 -0.146559 outer loop vertex -1.634684 2.446481 0.585271 vertex -1.866610 2.274473 0.585271 vertex -1.894015 2.307866 0.294051 endloop endfacet facet normal 0.441625 -0.595461 0.671114 outer loop vertex -1.345750 1.639804 -2.121322 vertex -1.178541 1.763815 -2.121322 vertex -1.288383 1.928206 -1.903181 endloop endfacet facet normal 0.441623 -0.595461 0.671115 outer loop vertex -1.288383 1.928206 -1.903181 vertex -1.471177 1.792637 -1.903181 vertex -1.345750 1.639804 -2.121322 endloop endfacet facet normal 0.087510 -0.117992 -0.989151 outer loop vertex -0.371291 0.452422 2.942356 vertex -0.325158 0.486637 2.942356 vertex -0.163365 0.244497 2.985554 endloop endfacet facet normal 0.087510 -0.117993 -0.989151 outer loop vertex -0.163365 0.244497 2.985554 vertex -0.186543 0.227307 2.985554 vertex -0.371291 0.452422 2.942356 endloop endfacet facet normal 0.560953 -0.756357 -0.336534 outer loop vertex -1.821229 2.219177 0.870853 vertex -1.594942 2.387003 0.870853 vertex -1.539838 2.304535 1.148050 endloop endfacet facet normal 0.560952 -0.756359 -0.336532 outer loop vertex -1.539838 2.304535 1.148050 vertex -1.758308 2.142507 1.148050 vertex -1.821229 2.219177 0.870853 endloop endfacet facet normal 0.511114 -0.689153 0.513645 outer loop vertex -1.582435 1.928205 -1.666712 vertex -1.385818 2.074027 -1.666712 vertex -1.469906 2.199874 -1.414191 endloop endfacet facet normal 0.511112 -0.689153 0.513647 outer loop vertex -1.469906 2.199874 -1.414191 vertex -1.678454 2.045204 -1.414191 vertex -1.582435 1.928205 -1.666712 endloop endfacet facet normal 0.511109 -0.689156 -0.513646 outer loop vertex -1.678454 2.045205 1.414190 vertex -1.469906 2.199874 1.414190 vertex -1.385818 2.074027 1.666711 endloop endfacet facet normal 0.511111 -0.689153 -0.513647 outer loop vertex -1.385818 2.074027 1.666711 vertex -1.582435 1.928206 1.666711 vertex -1.678454 2.045205 1.414190 endloop endfacet facet normal 0.087510 -0.117993 0.989151 outer loop vertex -0.186542 0.227305 -2.985554 vertex -0.163364 0.244495 -2.985554 vertex -0.325157 0.486635 -2.942356 endloop endfacet facet normal 0.087508 -0.117993 0.989151 outer loop vertex -0.325157 0.486635 -2.942356 vertex -0.371290 0.452421 -2.942356 vertex -0.186542 0.227305 -2.985554 endloop endfacet facet normal 0.560950 -0.756361 0.336533 outer loop vertex -1.758308 2.142507 -1.148051 vertex -1.539838 2.304534 -1.148051 vertex -1.594941 2.387002 -0.870855 endloop endfacet facet normal 0.560950 -0.756360 0.336533 outer loop vertex -1.594941 2.387002 -0.870855 vertex -1.821229 2.219177 -0.870855 vertex -1.758308 2.142507 -1.148051 endloop endfacet facet normal 0.441625 -0.595460 -0.671115 outer loop vertex -1.471177 1.792637 1.903180 vertex -1.288384 1.928206 1.903180 vertex -1.178541 1.763815 2.121321 endloop endfacet facet normal 0.441625 -0.595460 -0.671115 outer loop vertex -1.178541 1.763815 2.121321 vertex -1.345750 1.639804 2.121321 vertex -1.471177 1.792637 1.903180 endloop endfacet facet normal 0.200898 -0.270880 0.941416 outer loop vertex -0.552462 0.673180 -2.870821 vertex -0.483819 0.724089 -2.870821 vertex -0.637821 0.954570 -2.771639 endloop endfacet facet normal 0.200902 -0.270879 0.941415 outer loop vertex -0.637821 0.954570 -2.771639 vertex -0.728313 0.887455 -2.771639 vertex -0.552462 0.673180 -2.870821 endloop endfacet facet normal 0.589267 -0.794535 0.146558 outer loop vertex -1.866610 2.274473 -0.585272 vertex -1.634684 2.446481 -0.585272 vertex -1.658684 2.482399 -0.294052 endloop endfacet facet normal 0.589266 -0.794535 0.146559 outer loop vertex -1.658684 2.482399 -0.294052 vertex -1.894015 2.307866 -0.294052 vertex -1.866610 2.274473 -0.585272 endloop endfacet facet normal 0.355133 -0.478842 -0.802864 outer loop vertex -1.207363 1.471180 2.319032 vertex -1.057349 1.582438 2.319032 vertex -0.925974 1.385821 2.494409 endloop endfacet facet normal 0.355133 -0.478842 -0.802864 outer loop vertex -0.925974 1.385821 2.494409 vertex -1.057349 1.288387 2.494409 vertex -1.207363 1.471180 2.319032 endloop endfacet facet normal 0.220023 -0.367089 0.903790 outer loop vertex -0.637821 0.954570 -2.771639 vertex -0.541185 1.012491 -2.771639 vertex -0.666643 1.247205 -2.645764 endloop endfacet facet normal 0.220025 -0.367088 0.903789 outer loop vertex -0.666643 1.247205 -2.645764 vertex -0.785680 1.175857 -2.645764 vertex -0.637821 0.954570 -2.771639 endloop endfacet facet normal 0.513486 -0.856697 0.049009 outer loop vertex -1.658684 2.482399 -0.294052 vertex -1.407379 2.633026 -0.294052 vertex -1.414189 2.645766 -0.000001 endloop endfacet facet normal 0.513484 -0.856698 0.049012 outer loop vertex -1.414189 2.645766 -0.000001 vertex -1.666710 2.494411 -0.000001 vertex -1.658684 2.482399 -0.294052 endloop endfacet facet normal 0.264536 -0.441348 -0.857457 outer loop vertex -0.925974 1.385821 2.494409 vertex -0.785681 1.469910 2.494409 vertex -0.666643 1.247207 2.645763 endloop endfacet facet normal 0.264536 -0.441349 -0.857457 outer loop vertex -0.666643 1.247207 2.645763 vertex -0.785681 1.175858 2.645763 vertex -0.925974 1.385821 2.494409 endloop endfacet facet normal 0.306490 -0.511344 0.802864 outer loop vertex -0.925973 1.385820 -2.494410 vertex -0.785680 1.469909 -2.494410 vertex -0.897151 1.678456 -2.319033 endloop endfacet facet normal 0.306490 -0.511344 0.802864 outer loop vertex -0.897151 1.678456 -2.319033 vertex -1.057348 1.582437 -2.319033 vertex -0.925973 1.385820 -2.494410 endloop endfacet facet normal 0.173379 -0.289268 -0.941416 outer loop vertex -0.637822 0.954571 2.771639 vertex -0.541186 1.012492 2.771639 vertex -0.410516 0.768027 2.870821 endloop endfacet facet normal 0.173380 -0.289268 -0.941416 outer loop vertex -0.410516 0.768027 2.870821 vertex -0.483819 0.724091 2.870821 vertex -0.637822 0.954571 2.771639 endloop endfacet facet normal 0.508553 -0.848466 -0.146557 outer loop vertex -1.658684 2.482399 0.294051 vertex -1.407379 2.633026 0.294051 vertex -1.387016 2.594928 0.585271 endloop endfacet facet normal 0.508553 -0.848466 -0.146558 outer loop vertex -1.387016 2.594928 0.585271 vertex -1.634684 2.446481 0.585271 vertex -1.658684 2.482399 0.294051 endloop endfacet facet normal 0.381132 -0.635881 0.671114 outer loop vertex -1.178541 1.763815 -2.121322 vertex -0.999982 1.870839 -2.121322 vertex -1.093182 2.045205 -1.903181 endloop endfacet facet normal 0.381133 -0.635881 0.671114 outer loop vertex -1.093182 2.045205 -1.903181 vertex -1.288383 1.928206 -1.903181 vertex -1.178541 1.763815 -2.121322 endloop endfacet facet normal 0.075523 -0.126002 -0.989151 outer loop vertex -0.325158 0.486637 2.942356 vertex -0.275894 0.516165 2.942356 vertex -0.138614 0.259332 2.985554 endloop endfacet facet normal 0.075522 -0.126003 -0.989151 outer loop vertex -0.138614 0.259332 2.985554 vertex -0.163365 0.244497 2.985554 vertex -0.325158 0.486637 2.942356 endloop endfacet facet normal 0.484114 -0.807702 -0.336529 outer loop vertex -1.594942 2.387003 0.870853 vertex -1.353294 2.531840 0.870853 vertex -1.306540 2.444369 1.148050 endloop endfacet facet normal 0.484118 -0.807697 -0.336533 outer loop vertex -1.306540 2.444369 1.148050 vertex -1.539838 2.304535 1.148050 vertex -1.594942 2.387003 0.870853 endloop endfacet facet normal 0.441101 -0.735933 0.513646 outer loop vertex -1.385818 2.074027 -1.666712 vertex -1.175855 2.199874 -1.666712 vertex -1.247203 2.333357 -1.414191 endloop endfacet facet normal 0.441102 -0.735933 0.513645 outer loop vertex -1.247203 2.333357 -1.414191 vertex -1.469906 2.199874 -1.414191 vertex -1.385818 2.074027 -1.666712 endloop endfacet facet normal 0.441102 -0.735933 -0.513646 outer loop vertex -1.469906 2.199874 1.414190 vertex -1.247203 2.333357 1.414190 vertex -1.175855 2.199874 1.666711 endloop endfacet facet normal 0.441101 -0.735933 -0.513645 outer loop vertex -1.175855 2.199874 1.666711 vertex -1.385818 2.074027 1.666711 vertex -1.469906 2.199874 1.414190 endloop endfacet facet normal 0.075520 -0.126003 0.989151 outer loop vertex -0.163364 0.244495 -2.985554 vertex -0.138612 0.259330 -2.985554 vertex -0.275893 0.516163 -2.942356 endloop endfacet facet normal 0.075523 -0.126002 0.989151 outer loop vertex -0.275893 0.516163 -2.942356 vertex -0.325157 0.486635 -2.942356 vertex -0.163364 0.244495 -2.985554 endloop endfacet facet normal 0.484117 -0.807698 0.336533 outer loop vertex -1.539838 2.304534 -1.148051 vertex -1.306540 2.444368 -1.148051 vertex -1.353294 2.531840 -0.870855 endloop endfacet facet normal 0.484117 -0.807698 0.336533 outer loop vertex -1.353294 2.531840 -0.870855 vertex -1.594941 2.387002 -0.870855 vertex -1.539838 2.304534 -1.148051 endloop endfacet facet normal 0.381132 -0.635879 -0.671115 outer loop vertex -1.288384 1.928206 1.903180 vertex -1.093183 2.045205 1.903180 vertex -0.999982 1.870839 2.121321 endloop endfacet facet normal 0.381132 -0.635880 -0.671115 outer loop vertex -0.999982 1.870839 2.121321 vertex -1.178541 1.763815 2.121321 vertex -1.288384 1.928206 1.903180 endloop endfacet facet normal 0.173380 -0.289268 0.941416 outer loop vertex -0.483819 0.724089 -2.870821 vertex -0.410516 0.768025 -2.870821 vertex -0.541185 1.012491 -2.771639 endloop endfacet facet normal 0.173379 -0.289268 0.941416 outer loop vertex -0.541185 1.012491 -2.771639 vertex -0.637821 0.954570 -2.771639 vertex -0.483819 0.724089 -2.870821 endloop endfacet facet normal 0.508551 -0.848467 0.146559 outer loop vertex -1.634684 2.446481 -0.585272 vertex -1.387015 2.594928 -0.585272 vertex -1.407379 2.633026 -0.294052 endloop endfacet facet normal 0.508553 -0.848466 0.146558 outer loop vertex -1.407379 2.633026 -0.294052 vertex -1.658684 2.482399 -0.294052 vertex -1.634684 2.446481 -0.585272 endloop endfacet facet normal 0.306489 -0.511346 -0.802864 outer loop vertex -1.057349 1.582438 2.319032 vertex -0.897151 1.678457 2.319032 vertex -0.785681 1.469910 2.494409 endloop endfacet facet normal 0.306490 -0.511344 -0.802864 outer loop vertex -0.785681 1.469910 2.494409 vertex -0.925974 1.385821 2.494409 vertex -1.057349 1.582438 2.319032 endloop endfacet facet normal 0.264535 -0.441349 0.857457 outer loop vertex -0.785680 1.175857 -2.645764 vertex -0.666643 1.247205 -2.645764 vertex -0.785680 1.469909 -2.494410 endloop endfacet facet normal 0.264536 -0.441349 0.857457 outer loop vertex -0.785680 1.469909 -2.494410 vertex -0.925973 1.385820 -2.494410 vertex -0.785680 1.175857 -2.645764 endloop endfacet facet normal 0.220026 -0.367090 -0.903788 outer loop vertex -0.785681 1.175858 2.645763 vertex -0.666643 1.247207 2.645763 vertex -0.541186 1.012492 2.771639 endloop endfacet facet normal 0.220025 -0.367092 -0.903788 outer loop vertex -0.541186 1.012492 2.771639 vertex -0.637822 0.954571 2.771639 vertex -0.785681 1.175858 2.645763 endloop endfacet facet normal 0.513484 -0.856698 -0.049009 outer loop vertex -1.666710 2.494411 -0.000001 vertex -1.414189 2.645766 -0.000001 vertex -1.407379 2.633026 0.294051 endloop endfacet facet normal 0.513486 -0.856697 -0.049011 outer loop vertex -1.407379 2.633026 0.294051 vertex -1.658684 2.482399 0.294051 vertex -1.666710 2.494411 -0.000001 endloop endfacet facet normal 0.345480 -0.576395 0.740549 outer loop vertex -1.057348 1.582437 -2.319033 vertex -0.897151 1.678456 -2.319033 vertex -0.999982 1.870839 -2.121322 endloop endfacet facet normal 0.345477 -0.576395 0.740550 outer loop vertex -0.999982 1.870839 -2.121322 vertex -1.178541 1.763815 -2.121322 vertex -1.057348 1.582437 -2.319033 endloop endfacet facet normal 0.125059 -0.208649 -0.969962 outer loop vertex -0.483819 0.724091 2.870821 vertex -0.410516 0.768027 2.870821 vertex -0.275894 0.516165 2.942356 endloop endfacet facet normal 0.125060 -0.208648 -0.969962 outer loop vertex -0.275894 0.516165 2.942356 vertex -0.325158 0.486637 2.942356 vertex -0.483819 0.724091 2.870821 endloop endfacet facet normal 0.498732 -0.832081 -0.242706 outer loop vertex -1.634684 2.446481 0.585271 vertex -1.387016 2.594928 0.585271 vertex -1.353294 2.531840 0.870853 endloop endfacet facet normal 0.498729 -0.832085 -0.242702 outer loop vertex -1.353294 2.531840 0.870853 vertex -1.594942 2.387003 0.870853 vertex -1.634684 2.446481 0.585271 endloop endfacet facet normal 0.413108 -0.689228 0.595237 outer loop vertex -1.288383 1.928206 -1.903181 vertex -1.093182 2.045205 -1.903181 vertex -1.175855 2.199874 -1.666712 endloop endfacet facet normal 0.413107 -0.689228 0.595237 outer loop vertex -1.175855 2.199874 -1.666712 vertex -1.385818 2.074027 -1.666712 vertex -1.288383 1.928206 -1.903181 endloop endfacet facet normal 0.464847 -0.775547 -0.427135 outer loop vertex -1.539838 2.304535 1.148050 vertex -1.306540 2.444369 1.148050 vertex -1.247203 2.333357 1.414190 endloop endfacet facet normal 0.464846 -0.775548 -0.427133 outer loop vertex -1.247203 2.333357 1.414190 vertex -1.469906 2.199874 1.414190 vertex -1.539838 2.304535 1.148050 endloop endfacet facet normal 0.464847 -0.775549 0.427132 outer loop vertex -1.469906 2.199874 -1.414191 vertex -1.247203 2.333357 -1.414191 vertex -1.306540 2.444368 -1.148051 endloop endfacet facet normal 0.464848 -0.775549 0.427131 outer loop vertex -1.306540 2.444368 -1.148051 vertex -1.539838 2.304534 -1.148051 vertex -1.469906 2.199874 -1.414191 endloop endfacet facet normal 0.413108 -0.689229 -0.595235 outer loop vertex -1.385818 2.074027 1.666711 vertex -1.175855 2.199874 1.666711 vertex -1.093183 2.045205 1.903180 endloop endfacet facet normal 0.413108 -0.689228 -0.595236 outer loop vertex -1.093183 2.045205 1.903180 vertex -1.288384 1.928206 1.903180 vertex -1.385818 2.074027 1.666711 endloop endfacet facet normal 0.125060 -0.208648 0.969962 outer loop vertex -0.325157 0.486635 -2.942356 vertex -0.275893 0.516163 -2.942356 vertex -0.410516 0.768025 -2.870821 endloop endfacet facet normal 0.125058 -0.208648 0.969962 outer loop vertex -0.410516 0.768025 -2.870821 vertex -0.483819 0.724089 -2.870821 vertex -0.325157 0.486635 -2.942356 endloop endfacet facet normal 0.498732 -0.832082 0.242704 outer loop vertex -1.594941 2.387002 -0.870855 vertex -1.353294 2.531840 -0.870855 vertex -1.387015 2.594928 -0.585272 endloop endfacet facet normal 0.498731 -0.832083 0.242705 outer loop vertex -1.387015 2.594928 -0.585272 vertex -1.634684 2.446481 -0.585272 vertex -1.594941 2.387002 -0.870855 endloop endfacet facet normal 0.345479 -0.576397 -0.740547 outer loop vertex -1.178541 1.763815 2.121321 vertex -0.999982 1.870839 2.121321 vertex -0.897151 1.678457 2.319032 endloop endfacet facet normal 0.345479 -0.576397 -0.740548 outer loop vertex -0.897151 1.678457 2.319032 vertex -1.057349 1.582438 2.319032 vertex -1.178541 1.763815 2.121321 endloop endfacet facet normal 0.144193 -0.304868 0.941416 outer loop vertex -0.410516 0.768025 -2.870821 vertex -0.333259 0.804565 -2.870821 vertex -0.439338 1.060661 -2.771639 endloop endfacet facet normal 0.144192 -0.304869 0.941416 outer loop vertex -0.439338 1.060661 -2.771639 vertex -0.541185 1.012491 -2.771639 vertex -0.410516 0.768025 -2.870821 endloop endfacet facet normal 0.422938 -0.894228 0.146558 outer loop vertex -1.387015 2.594928 -0.585272 vertex -1.125989 2.718384 -0.585272 vertex -1.142521 2.758294 -0.294052 endloop endfacet facet normal 0.422938 -0.894228 0.146559 outer loop vertex -1.142521 2.758294 -0.294052 vertex -1.407379 2.633026 -0.294052 vertex -1.387015 2.594928 -0.585272 endloop endfacet facet normal 0.254892 -0.538924 -0.802864 outer loop vertex -0.897151 1.678457 2.319032 vertex -0.728314 1.758311 2.319032 vertex -0.637821 1.539842 2.494409 endloop endfacet facet normal 0.254891 -0.538925 -0.802864 outer loop vertex -0.637821 1.539842 2.494409 vertex -0.785681 1.469910 2.494409 vertex -0.897151 1.678457 2.319032 endloop endfacet facet normal 0.220000 -0.465153 0.857457 outer loop vertex -0.666643 1.247205 -2.645764 vertex -0.541185 1.306542 -2.645764 vertex -0.637820 1.539841 -2.494410 endloop endfacet facet normal 0.220000 -0.465153 0.857457 outer loop vertex -0.637820 1.539841 -2.494410 vertex -0.785680 1.469909 -2.494410 vertex -0.666643 1.247205 -2.645764 endloop endfacet facet normal 0.182985 -0.386888 -0.903789 outer loop vertex -0.666643 1.247207 2.645763 vertex -0.541186 1.306544 2.645763 vertex -0.439338 1.060662 2.771639 endloop endfacet facet normal 0.182984 -0.386890 -0.903788 outer loop vertex -0.439338 1.060662 2.771639 vertex -0.541186 1.012492 2.771639 vertex -0.666643 1.247207 2.645763 endloop endfacet facet normal 0.427042 -0.902903 -0.049011 outer loop vertex -1.414189 2.645766 -0.000001 vertex -1.148049 2.771641 -0.000001 vertex -1.142521 2.758294 0.294051 endloop endfacet facet normal 0.427041 -0.902903 -0.049009 outer loop vertex -1.142521 2.758294 0.294051 vertex -1.407379 2.633026 0.294051 vertex -1.414189 2.645766 -0.000001 endloop endfacet facet normal 0.287317 -0.607483 0.740549 outer loop vertex -0.897151 1.678456 -2.319033 vertex -0.728313 1.758310 -2.319033 vertex -0.811792 1.959846 -2.121322 endloop endfacet facet normal 0.287318 -0.607483 0.740549 outer loop vertex -0.811792 1.959846 -2.121322 vertex -0.999982 1.870839 -2.121322 vertex -0.897151 1.678456 -2.319033 endloop endfacet facet normal 0.104005 -0.219902 -0.969962 outer loop vertex -0.410516 0.768027 2.870821 vertex -0.333260 0.804566 2.870821 vertex -0.223972 0.540722 2.942356 endloop endfacet facet normal 0.104005 -0.219902 -0.969962 outer loop vertex -0.223972 0.540722 2.942356 vertex -0.275894 0.516165 2.942356 vertex -0.410516 0.768027 2.870821 endloop endfacet facet normal 0.414770 -0.876961 -0.242703 outer loop vertex -1.387016 2.594928 0.585271 vertex -1.125989 2.718384 0.585271 vertex -1.098614 2.652295 0.870853 endloop endfacet facet normal 0.414772 -0.876959 -0.242706 outer loop vertex -1.098614 2.652295 0.870853 vertex -1.353294 2.531840 0.870853 vertex -1.387016 2.594928 0.585271 endloop endfacet facet normal 0.343560 -0.726402 0.595237 outer loop vertex -1.093182 2.045205 -1.903181 vertex -0.887453 2.142507 -1.903181 vertex -0.954567 2.304535 -1.666712 endloop endfacet facet normal 0.343561 -0.726402 0.595236 outer loop vertex -0.954567 2.304535 -1.666712 vertex -1.175855 2.199874 -1.666712 vertex -1.093182 2.045205 -1.903181 endloop endfacet facet normal 0.386589 -0.817378 -0.427133 outer loop vertex -1.306540 2.444369 1.148050 vertex -1.060658 2.560662 1.148050 vertex -1.012488 2.444369 1.414190 endloop endfacet facet normal 0.386590 -0.817376 -0.427135 outer loop vertex -1.012488 2.444369 1.414190 vertex -1.247203 2.333357 1.414190 vertex -1.306540 2.444369 1.148050 endloop endfacet facet normal 0.386591 -0.817377 0.427133 outer loop vertex -1.247203 2.333357 -1.414191 vertex -1.012488 2.444369 -1.414191 vertex -1.060658 2.560662 -1.148051 endloop endfacet facet normal 0.386592 -0.817377 0.427132 outer loop vertex -1.060658 2.560662 -1.148051 vertex -1.306540 2.444368 -1.148051 vertex -1.247203 2.333357 -1.414191 endloop endfacet facet normal 0.343562 -0.726403 -0.595234 outer loop vertex -1.175855 2.199874 1.666711 vertex -0.954567 2.304535 1.666711 vertex -0.887454 2.142508 1.903180 endloop endfacet facet normal 0.343563 -0.726401 -0.595235 outer loop vertex -0.887454 2.142508 1.903180 vertex -1.093183 2.045205 1.903180 vertex -1.175855 2.199874 1.666711 endloop endfacet facet normal 0.104004 -0.219901 0.969962 outer loop vertex -0.275893 0.516163 -2.942356 vertex -0.223971 0.540720 -2.942356 vertex -0.333259 0.804565 -2.870821 endloop endfacet facet normal 0.104006 -0.219901 0.969962 outer loop vertex -0.333259 0.804565 -2.870821 vertex -0.410516 0.768025 -2.870821 vertex -0.275893 0.516163 -2.942356 endloop endfacet facet normal 0.414773 -0.876960 0.242703 outer loop vertex -1.353294 2.531840 -0.870855 vertex -1.098614 2.652295 -0.870855 vertex -1.125989 2.718384 -0.585272 endloop endfacet facet normal 0.414771 -0.876961 0.242704 outer loop vertex -1.125989 2.718384 -0.585272 vertex -1.387015 2.594928 -0.585272 vertex -1.353294 2.531840 -0.870855 endloop endfacet facet normal 0.287319 -0.607484 -0.740548 outer loop vertex -0.999982 1.870839 2.121321 vertex -0.811793 1.959846 2.121321 vertex -0.728314 1.758311 2.319032 endloop endfacet facet normal 0.287319 -0.607485 -0.740547 outer loop vertex -0.728314 1.758311 2.319032 vertex -0.897151 1.678457 2.319032 vertex -0.999982 1.870839 2.121321 endloop endfacet facet normal 0.182984 -0.386887 0.903790 outer loop vertex -0.541185 1.012491 -2.771639 vertex -0.439338 1.060661 -2.771639 vertex -0.541185 1.306542 -2.645764 endloop endfacet facet normal 0.182983 -0.386887 0.903790 outer loop vertex -0.541185 1.306542 -2.645764 vertex -0.666643 1.247205 -2.645764 vertex -0.541185 1.012491 -2.771639 endloop endfacet facet normal 0.427040 -0.902903 0.049011 outer loop vertex -1.407379 2.633026 -0.294052 vertex -1.142521 2.758294 -0.294052 vertex -1.148049 2.771641 -0.000001 endloop endfacet facet normal 0.427042 -0.902903 0.049009 outer loop vertex -1.148049 2.771641 -0.000001 vertex -1.414189 2.645766 -0.000001 vertex -1.407379 2.633026 -0.294052 endloop endfacet facet normal 0.220000 -0.465154 -0.857456 outer loop vertex -0.785681 1.469910 2.494409 vertex -0.637821 1.539842 2.494409 vertex -0.541186 1.306544 2.645763 endloop endfacet facet normal 0.220001 -0.465153 -0.857457 outer loop vertex -0.541186 1.306544 2.645763 vertex -0.666643 1.247207 2.645763 vertex -0.785681 1.469910 2.494409 endloop endfacet facet normal 0.254891 -0.538924 0.802864 outer loop vertex -0.785680 1.469909 -2.494410 vertex -0.637820 1.539841 -2.494410 vertex -0.728313 1.758310 -2.319033 endloop endfacet facet normal 0.254891 -0.538924 0.802864 outer loop vertex -0.728313 1.758310 -2.319033 vertex -0.897151 1.678456 -2.319033 vertex -0.785680 1.469909 -2.494410 endloop endfacet facet normal 0.144191 -0.304869 -0.941416 outer loop vertex -0.541186 1.012492 2.771639 vertex -0.439338 1.060662 2.771639 vertex -0.333260 0.804566 2.870821 endloop endfacet facet normal 0.144191 -0.304870 -0.941416 outer loop vertex -0.333260 0.804566 2.870821 vertex -0.410516 0.768027 2.870821 vertex -0.541186 1.012492 2.771639 endloop endfacet facet normal 0.422938 -0.894228 -0.146558 outer loop vertex -1.407379 2.633026 0.294051 vertex -1.142521 2.758294 0.294051 vertex -1.125989 2.718384 0.585271 endloop endfacet facet normal 0.422937 -0.894229 -0.146557 outer loop vertex -1.125989 2.718384 0.585271 vertex -1.387016 2.594928 0.585271 vertex -1.407379 2.633026 0.294051 endloop endfacet facet normal 0.316969 -0.670177 0.671114 outer loop vertex -0.999982 1.870839 -2.121322 vertex -0.811792 1.959846 -2.121322 vertex -0.887453 2.142507 -1.903181 endloop endfacet facet normal 0.316968 -0.670177 0.671114 outer loop vertex -0.887453 2.142507 -1.903181 vertex -1.093182 2.045205 -1.903181 vertex -0.999982 1.870839 -2.121322 endloop endfacet facet normal 0.062808 -0.132798 -0.989151 outer loop vertex -0.275894 0.516165 2.942356 vertex -0.223972 0.540722 2.942356 vertex -0.112527 0.271670 2.985554 endloop endfacet facet normal 0.062808 -0.132798 -0.989151 outer loop vertex -0.112527 0.271670 2.985554 vertex -0.138614 0.259332 2.985554 vertex -0.275894 0.516165 2.942356 endloop endfacet facet normal 0.402618 -0.851261 -0.336531 outer loop vertex -1.353294 2.531840 0.870853 vertex -1.098614 2.652295 0.870853 vertex -1.060658 2.560662 1.148050 endloop endfacet facet normal 0.402616 -0.851263 -0.336529 outer loop vertex -1.060658 2.560662 1.148050 vertex -1.306540 2.444369 1.148050 vertex -1.353294 2.531840 0.870853 endloop endfacet facet normal 0.366842 -0.775625 0.513647 outer loop vertex -1.175855 2.199874 -1.666712 vertex -0.954567 2.304535 -1.666712 vertex -1.012488 2.444369 -1.414191 endloop endfacet facet normal 0.366843 -0.775625 0.513646 outer loop vertex -1.012488 2.444369 -1.414191 vertex -1.247203 2.333357 -1.414191 vertex -1.175855 2.199874 -1.666712 endloop endfacet facet normal 0.366843 -0.775624 -0.513647 outer loop vertex -1.247203 2.333357 1.414190 vertex -1.012488 2.444369 1.414190 vertex -0.954567 2.304535 1.666711 endloop endfacet facet normal 0.366842 -0.775625 -0.513646 outer loop vertex -0.954567 2.304535 1.666711 vertex -1.175855 2.199874 1.666711 vertex -1.247203 2.333357 1.414190 endloop endfacet facet normal 0.062810 -0.132797 0.989151 outer loop vertex -0.138612 0.259330 -2.985554 vertex -0.112526 0.271668 -2.985554 vertex -0.223971 0.540720 -2.942356 endloop endfacet facet normal 0.062808 -0.132798 0.989151 outer loop vertex -0.223971 0.540720 -2.942356 vertex -0.275893 0.516163 -2.942356 vertex -0.138612 0.259330 -2.985554 endloop endfacet facet normal 0.402618 -0.851261 0.336532 outer loop vertex -1.306540 2.444368 -1.148051 vertex -1.060658 2.560662 -1.148051 vertex -1.098614 2.652295 -0.870855 endloop endfacet facet normal 0.402617 -0.851261 0.336533 outer loop vertex -1.098614 2.652295 -0.870855 vertex -1.353294 2.531840 -0.870855 vertex -1.306540 2.444368 -1.148051 endloop endfacet facet normal 0.316970 -0.670175 -0.671115 outer loop vertex -1.093183 2.045205 1.903180 vertex -0.887454 2.142508 1.903180 vertex -0.811793 1.959846 2.121321 endloop endfacet facet normal 0.316970 -0.670175 -0.671115 outer loop vertex -0.811793 1.959846 2.121321 vertex -0.999982 1.870839 2.121321 vertex -1.093183 2.045205 1.903180 endloop endfacet facet normal 0.081953 -0.229036 0.969962 outer loop vertex -0.223971 0.540720 -2.942356 vertex -0.169893 0.560070 -2.942356 vertex -0.252793 0.833356 -2.870821 endloop endfacet facet normal 0.081950 -0.229037 0.969962 outer loop vertex -0.252793 0.833356 -2.870821 vertex -0.333259 0.804565 -2.870821 vertex -0.223971 0.540720 -2.942356 endloop endfacet facet normal 0.326814 -0.913393 0.242707 outer loop vertex -1.098614 2.652295 -0.870855 vertex -0.833353 2.747206 -0.870855 vertex -0.854119 2.815661 -0.585272 endloop endfacet facet normal 0.326818 -0.913392 0.242703 outer loop vertex -0.854119 2.815661 -0.585272 vertex -1.125989 2.718384 -0.585272 vertex -1.098614 2.652295 -0.870855 endloop endfacet facet normal 0.226392 -0.632721 -0.740548 outer loop vertex -0.811793 1.959846 2.121321 vertex -0.615785 2.029979 2.121321 vertex -0.552462 1.821232 2.319032 endloop endfacet facet normal 0.226392 -0.632721 -0.740548 outer loop vertex -0.552462 1.821232 2.319032 vertex -0.728314 1.758311 2.319032 vertex -0.811793 1.959846 2.121321 endloop endfacet facet normal 0.144178 -0.402958 0.903790 outer loop vertex -0.439338 1.060661 -2.771639 vertex -0.333259 1.098616 -2.771639 vertex -0.410516 1.353297 -2.645764 endloop endfacet facet normal 0.144183 -0.402958 0.903790 outer loop vertex -0.410516 1.353297 -2.645764 vertex -0.541185 1.306542 -2.645764 vertex -0.439338 1.060661 -2.771639 endloop endfacet facet normal 0.336484 -0.940413 0.049009 outer loop vertex -1.142521 2.758294 -0.294052 vertex -0.866659 2.856999 -0.294052 vertex -0.870852 2.870823 -0.000001 endloop endfacet facet normal 0.336483 -0.940413 0.049011 outer loop vertex -0.870852 2.870823 -0.000001 vertex -1.148049 2.771641 -0.000001 vertex -1.142521 2.758294 -0.294052 endloop endfacet facet normal 0.173349 -0.484477 -0.857457 outer loop vertex -0.637821 1.539842 2.494409 vertex -0.483819 1.594945 2.494409 vertex -0.410516 1.353298 2.645763 endloop endfacet facet normal 0.173347 -0.484478 -0.857456 outer loop vertex -0.410516 1.353298 2.645763 vertex -0.541186 1.306544 2.645763 vertex -0.637821 1.539842 2.494409 endloop endfacet facet normal 0.200841 -0.561312 0.802865 outer loop vertex -0.637820 1.539841 -2.494410 vertex -0.483818 1.594944 -2.494410 vertex -0.552462 1.821231 -2.319033 endloop endfacet facet normal 0.200842 -0.561312 0.802864 outer loop vertex -0.552462 1.821231 -2.319033 vertex -0.728313 1.758310 -2.319033 vertex -0.637820 1.539841 -2.494410 endloop endfacet facet normal 0.113617 -0.317534 -0.941416 outer loop vertex -0.439338 1.060662 2.771639 vertex -0.333260 1.098618 2.771639 vertex -0.252794 0.833358 2.870821 endloop endfacet facet normal 0.113618 -0.317533 -0.941416 outer loop vertex -0.252794 0.833358 2.870821 vertex -0.333260 0.804566 2.870821 vertex -0.439338 1.060662 2.771639 endloop endfacet facet normal 0.333252 -0.931378 -0.146557 outer loop vertex -1.142521 2.758294 0.294051 vertex -0.866659 2.856999 0.294051 vertex -0.854119 2.815661 0.585271 endloop endfacet facet normal 0.333253 -0.931377 -0.146558 outer loop vertex -0.854119 2.815661 0.585271 vertex -1.125989 2.718384 0.585271 vertex -1.142521 2.758294 0.294051 endloop endfacet facet normal 0.249753 -0.698017 0.671115 outer loop vertex -0.811792 1.959846 -2.121322 vertex -0.615785 2.029978 -2.121322 vertex -0.673178 2.219176 -1.903181 endloop endfacet facet normal 0.249755 -0.698018 0.671114 outer loop vertex -0.673178 2.219176 -1.903181 vertex -0.887453 2.142507 -1.903181 vertex -0.811792 1.959846 -2.121322 endloop endfacet facet normal 0.049491 -0.138314 -0.989151 outer loop vertex -0.223972 0.540722 2.942356 vertex -0.169894 0.560072 2.942356 vertex -0.085357 0.281392 2.985554 endloop endfacet facet normal 0.049492 -0.138314 -0.989151 outer loop vertex -0.085357 0.281392 2.985554 vertex -0.112527 0.271670 2.985554 vertex -0.223972 0.540722 2.942356 endloop endfacet facet normal 0.317240 -0.886625 -0.336534 outer loop vertex -1.098614 2.652295 0.870853 vertex -0.833354 2.747207 0.870853 vertex -0.804562 2.652294 1.148050 endloop endfacet facet normal 0.317238 -0.886627 -0.336531 outer loop vertex -0.804562 2.652294 1.148050 vertex -1.060658 2.560662 1.148050 vertex -1.098614 2.652295 0.870853 endloop endfacet facet normal 0.289052 -0.807846 0.513647 outer loop vertex -0.954567 2.304535 -1.666712 vertex -0.724087 2.387002 -1.666712 vertex -0.768023 2.531840 -1.414191 endloop endfacet facet normal 0.289052 -0.807846 0.513647 outer loop vertex -0.768023 2.531840 -1.414191 vertex -1.012488 2.444369 -1.414191 vertex -0.954567 2.304535 -1.666712 endloop endfacet facet normal 0.289053 -0.807847 -0.513645 outer loop vertex -1.012488 2.444369 1.414190 vertex -0.768023 2.531840 1.414190 vertex -0.724087 2.387003 1.666711 endloop endfacet facet normal 0.289055 -0.807845 -0.513647 outer loop vertex -0.724087 2.387003 1.666711 vertex -0.954567 2.304535 1.666711 vertex -1.012488 2.444369 1.414190 endloop endfacet facet normal 0.049492 -0.138314 0.989151 outer loop vertex -0.112526 0.271668 -2.985554 vertex -0.085356 0.281390 -2.985554 vertex -0.169893 0.560070 -2.942356 endloop endfacet facet normal 0.049491 -0.138314 0.989151 outer loop vertex -0.169893 0.560070 -2.942356 vertex -0.223971 0.540720 -2.942356 vertex -0.112526 0.271668 -2.985554 endloop endfacet facet normal 0.317238 -0.886627 0.336531 outer loop vertex -1.060658 2.560662 -1.148051 vertex -0.804562 2.652294 -1.148051 vertex -0.833353 2.747206 -0.870855 endloop endfacet facet normal 0.317237 -0.886627 0.336532 outer loop vertex -0.833353 2.747206 -0.870855 vertex -1.098614 2.652295 -0.870855 vertex -1.060658 2.560662 -1.148051 endloop endfacet facet normal 0.249754 -0.698017 -0.671115 outer loop vertex -0.887454 2.142508 1.903180 vertex -0.673178 2.219177 1.903180 vertex -0.615785 2.029979 2.121321 endloop endfacet facet normal 0.249755 -0.698016 -0.671115 outer loop vertex -0.615785 2.029979 2.121321 vertex -0.811793 1.959846 2.121321 vertex -0.887454 2.142508 1.903180 endloop endfacet facet normal 0.113615 -0.317535 0.941416 outer loop vertex -0.333259 0.804565 -2.870821 vertex -0.252793 0.833356 -2.870821 vertex -0.333259 1.098616 -2.771639 endloop endfacet facet normal 0.113614 -0.317535 0.941416 outer loop vertex -0.333259 1.098616 -2.771639 vertex -0.439338 1.060661 -2.771639 vertex -0.333259 0.804565 -2.870821 endloop endfacet facet normal 0.333253 -0.931377 0.146557 outer loop vertex -1.125989 2.718384 -0.585272 vertex -0.854119 2.815661 -0.585272 vertex -0.866659 2.856999 -0.294052 endloop endfacet facet normal 0.333252 -0.931377 0.146558 outer loop vertex -0.866659 2.856999 -0.294052 vertex -1.142521 2.758294 -0.294052 vertex -1.125989 2.718384 -0.585272 endloop endfacet facet normal 0.200841 -0.561312 -0.802864 outer loop vertex -0.728314 1.758311 2.319032 vertex -0.552462 1.821232 2.319032 vertex -0.483819 1.594945 2.494409 endloop endfacet facet normal 0.200841 -0.561312 -0.802864 outer loop vertex -0.483819 1.594945 2.494409 vertex -0.637821 1.539842 2.494409 vertex -0.728314 1.758311 2.319032 endloop endfacet facet normal 0.173352 -0.484477 0.857456 outer loop vertex -0.541185 1.306542 -2.645764 vertex -0.410516 1.353297 -2.645764 vertex -0.483818 1.594944 -2.494410 endloop endfacet facet normal 0.173349 -0.484477 0.857457 outer loop vertex -0.483818 1.594944 -2.494410 vertex -0.637820 1.539841 -2.494410 vertex -0.541185 1.306542 -2.645764 endloop endfacet facet normal 0.144181 -0.402963 -0.903788 outer loop vertex -0.541186 1.306544 2.645763 vertex -0.410516 1.353298 2.645763 vertex -0.333260 1.098618 2.771639 endloop endfacet facet normal 0.144184 -0.402960 -0.903789 outer loop vertex -0.333260 1.098618 2.771639 vertex -0.439338 1.060662 2.771639 vertex -0.541186 1.306544 2.645763 endloop endfacet facet normal 0.336483 -0.940413 -0.049009 outer loop vertex -1.148049 2.771641 -0.000001 vertex -0.870852 2.870823 -0.000001 vertex -0.866659 2.856999 0.294051 endloop endfacet facet normal 0.336484 -0.940413 -0.049011 outer loop vertex -0.866659 2.856999 0.294051 vertex -1.142521 2.758294 0.294051 vertex -1.148049 2.771641 -0.000001 endloop endfacet facet normal 0.226393 -0.632721 0.740548 outer loop vertex -0.728313 1.758310 -2.319033 vertex -0.552462 1.821231 -2.319033 vertex -0.615785 2.029978 -2.121322 endloop endfacet facet normal 0.226390 -0.632720 0.740549 outer loop vertex -0.615785 2.029978 -2.121322 vertex -0.811792 1.959846 -2.121322 vertex -0.728313 1.758310 -2.319033 endloop endfacet facet normal 0.081953 -0.229036 -0.969962 outer loop vertex -0.333260 0.804566 2.870821 vertex -0.252794 0.833358 2.870821 vertex -0.169894 0.560072 2.942356 endloop endfacet facet normal 0.081953 -0.229036 -0.969962 outer loop vertex -0.169894 0.560072 2.942356 vertex -0.223972 0.540722 2.942356 vertex -0.333260 0.804566 2.870821 endloop endfacet facet normal 0.326818 -0.913392 -0.242703 outer loop vertex -1.125989 2.718384 0.585271 vertex -0.854119 2.815661 0.585271 vertex -0.833354 2.747207 0.870853 endloop endfacet facet normal 0.326818 -0.913392 -0.242703 outer loop vertex -0.833354 2.747207 0.870853 vertex -1.098614 2.652295 0.870853 vertex -1.125989 2.718384 0.585271 endloop endfacet facet normal 0.270709 -0.756578 0.595236 outer loop vertex -0.887453 2.142507 -1.903181 vertex -0.673178 2.219176 -1.903181 vertex -0.724087 2.387002 -1.666712 endloop endfacet facet normal 0.270708 -0.756578 0.595237 outer loop vertex -0.724087 2.387002 -1.666712 vertex -0.954567 2.304535 -1.666712 vertex -0.887453 2.142507 -1.903181 endloop endfacet facet normal 0.304610 -0.851335 -0.427131 outer loop vertex -1.060658 2.560662 1.148050 vertex -0.804562 2.652294 1.148050 vertex -0.768023 2.531840 1.414190 endloop endfacet facet normal 0.304612 -0.851333 -0.427133 outer loop vertex -0.768023 2.531840 1.414190 vertex -1.012488 2.444369 1.414190 vertex -1.060658 2.560662 1.148050 endloop endfacet facet normal 0.304612 -0.851334 0.427131 outer loop vertex -1.012488 2.444369 -1.414191 vertex -0.768023 2.531840 -1.414191 vertex -0.804562 2.652294 -1.148051 endloop endfacet facet normal 0.304610 -0.851334 0.427133 outer loop vertex -0.804562 2.652294 -1.148051 vertex -1.060658 2.560662 -1.148051 vertex -1.012488 2.444369 -1.414191 endloop endfacet facet normal 0.270711 -0.756577 -0.595236 outer loop vertex -0.954567 2.304535 1.666711 vertex -0.724087 2.387003 1.666711 vertex -0.673178 2.219177 1.903180 endloop endfacet facet normal 0.270708 -0.756580 -0.595234 outer loop vertex -0.673178 2.219177 1.903180 vertex -0.887454 2.142508 1.903180 vertex -0.954567 2.304535 1.666711 endloop endfacet facet normal 0.035691 -0.142500 0.989151 outer loop vertex -0.085356 0.281390 -2.985554 vertex -0.057364 0.288401 -2.985554 vertex -0.114178 0.574026 -2.942356 endloop endfacet facet normal 0.035695 -0.142499 0.989151 outer loop vertex -0.114178 0.574026 -2.942356 vertex -0.169893 0.560070 -2.942356 vertex -0.085356 0.281390 -2.985554 endloop endfacet facet normal 0.228810 -0.913451 0.336531 outer loop vertex -0.804562 2.652294 -1.148051 vertex -0.540718 2.718384 -1.148051 vertex -0.560067 2.815661 -0.870855 endloop endfacet facet normal 0.228809 -0.913451 0.336531 outer loop vertex -0.560067 2.815661 -0.870855 vertex -0.833353 2.747206 -0.870855 vertex -0.804562 2.652294 -1.148051 endloop endfacet facet normal 0.180133 -0.719137 -0.671113 outer loop vertex -0.673178 2.219177 1.903180 vertex -0.452419 2.274474 1.903180 vertex -0.413847 2.080562 2.121321 endloop endfacet facet normal 0.180135 -0.719136 -0.671115 outer loop vertex -0.413847 2.080562 2.121321 vertex -0.615785 2.029979 2.121321 vertex -0.673178 2.219177 1.903180 endloop endfacet facet normal 0.081943 -0.327141 0.941416 outer loop vertex -0.252793 0.833356 -2.870821 vertex -0.169893 0.854121 -2.870821 vertex -0.223971 1.125992 -2.771639 endloop endfacet facet normal 0.081947 -0.327141 0.941416 outer loop vertex -0.223971 1.125992 -2.771639 vertex -0.333259 1.098616 -2.771639 vertex -0.252793 0.833356 -2.870821 endloop endfacet facet normal 0.240356 -0.959557 0.146560 outer loop vertex -0.854119 2.815661 -0.585272 vertex -0.574023 2.885821 -0.585272 vertex -0.582451 2.928190 -0.294052 endloop endfacet facet normal 0.240359 -0.959557 0.146557 outer loop vertex -0.582451 2.928190 -0.294052 vertex -0.866659 2.856999 -0.294052 vertex -0.854119 2.815661 -0.585272 endloop endfacet facet normal 0.144855 -0.578296 -0.802864 outer loop vertex -0.552462 1.821232 2.319032 vertex -0.371290 1.866613 2.319032 vertex -0.325157 1.634688 2.494409 endloop endfacet facet normal 0.144856 -0.578295 -0.802864 outer loop vertex -0.325157 1.634688 2.494409 vertex -0.483819 1.594945 2.494409 vertex -0.552462 1.821232 2.319032 endloop endfacet facet normal 0.125026 -0.499137 0.857456 outer loop vertex -0.410516 1.353297 -2.645764 vertex -0.275893 1.387018 -2.645764 vertex -0.325157 1.634686 -2.494410 endloop endfacet facet normal 0.125026 -0.499137 0.857456 outer loop vertex -0.325157 1.634686 -2.494410 vertex -0.483818 1.594944 -2.494410 vertex -0.410516 1.353297 -2.645764 endloop endfacet facet normal 0.103990 -0.415154 -0.903788 outer loop vertex -0.410516 1.353298 2.645763 vertex -0.275893 1.387019 2.645763 vertex -0.223972 1.125993 2.771639 endloop endfacet facet normal 0.103990 -0.415155 -0.903788 outer loop vertex -0.223972 1.125993 2.771639 vertex -0.333260 1.098618 2.771639 vertex -0.410516 1.353298 2.645763 endloop endfacet facet normal 0.242689 -0.968865 -0.049008 outer loop vertex -0.870852 2.870823 -0.000001 vertex -0.585269 2.942358 -0.000001 vertex -0.582451 2.928190 0.294051 endloop endfacet facet normal 0.242690 -0.968865 -0.049009 outer loop vertex -0.582451 2.928190 0.294051 vertex -0.866659 2.856999 0.294051 vertex -0.870852 2.870823 -0.000001 endloop endfacet facet normal 0.163283 -0.651864 0.740548 outer loop vertex -0.552462 1.821231 -2.319033 vertex -0.371290 1.866612 -2.319033 vertex -0.413847 2.080561 -2.121322 endloop endfacet facet normal 0.163284 -0.651865 0.740548 outer loop vertex -0.413847 2.080561 -2.121322 vertex -0.615785 2.029978 -2.121322 vertex -0.552462 1.821231 -2.319033 endloop endfacet facet normal 0.059105 -0.235968 -0.969962 outer loop vertex -0.252794 0.833358 2.870821 vertex -0.169893 0.854123 2.870821 vertex -0.114179 0.574028 2.942356 endloop endfacet facet normal 0.059107 -0.235967 -0.969962 outer loop vertex -0.114179 0.574028 2.942356 vertex -0.169894 0.560072 2.942356 vertex -0.252794 0.833358 2.870821 endloop endfacet facet normal 0.235714 -0.941028 -0.242705 outer loop vertex -0.854119 2.815661 0.585271 vertex -0.574023 2.885821 0.585271 vertex -0.560067 2.815661 0.870853 endloop endfacet facet normal 0.235713 -0.941028 -0.242703 outer loop vertex -0.560067 2.815661 0.870853 vertex -0.833354 2.747207 0.870853 vertex -0.854119 2.815661 0.585271 endloop endfacet facet normal 0.195249 -0.779470 0.595235 outer loop vertex -0.673178 2.219176 -1.903181 vertex -0.452419 2.274474 -1.903181 vertex -0.486633 2.446481 -1.666712 endloop endfacet facet normal 0.195246 -0.779469 0.595237 outer loop vertex -0.486633 2.446481 -1.666712 vertex -0.724087 2.387002 -1.666712 vertex -0.673178 2.219176 -1.903181 endloop endfacet facet normal 0.219702 -0.877092 -0.427131 outer loop vertex -0.804562 2.652294 1.148050 vertex -0.540718 2.718384 1.148050 vertex -0.516161 2.594929 1.414190 endloop endfacet facet normal 0.219703 -0.877092 -0.427131 outer loop vertex -0.516161 2.594929 1.414190 vertex -0.768023 2.531840 1.414190 vertex -0.804562 2.652294 1.148050 endloop endfacet facet normal 0.219699 -0.877091 0.427134 outer loop vertex -0.768023 2.531840 -1.414191 vertex -0.516161 2.594928 -1.414191 vertex -0.540718 2.718384 -1.148051 endloop endfacet facet normal 0.219702 -0.877092 0.427131 outer loop vertex -0.540718 2.718384 -1.148051 vertex -0.804562 2.652294 -1.148051 vertex -0.768023 2.531840 -1.414191 endloop endfacet facet normal 0.195246 -0.779469 -0.595237 outer loop vertex -0.724087 2.387003 1.666711 vertex -0.486633 2.446482 1.666711 vertex -0.452419 2.274474 1.903180 endloop endfacet facet normal 0.195246 -0.779469 -0.595236 outer loop vertex -0.452419 2.274474 1.903180 vertex -0.673178 2.219177 1.903180 vertex -0.724087 2.387003 1.666711 endloop endfacet facet normal 0.059107 -0.235967 0.969962 outer loop vertex -0.169893 0.560070 -2.942356 vertex -0.114178 0.574026 -2.942356 vertex -0.169893 0.854121 -2.870821 endloop endfacet facet normal 0.059106 -0.235967 0.969962 outer loop vertex -0.169893 0.854121 -2.870821 vertex -0.252793 0.833356 -2.870821 vertex -0.169893 0.560070 -2.942356 endloop endfacet facet normal 0.235716 -0.941027 0.242705 outer loop vertex -0.833353 2.747206 -0.870855 vertex -0.560067 2.815661 -0.870855 vertex -0.574023 2.885821 -0.585272 endloop endfacet facet normal 0.235714 -0.941027 0.242707 outer loop vertex -0.574023 2.885821 -0.585272 vertex -0.854119 2.815661 -0.585272 vertex -0.833353 2.747206 -0.870855 endloop endfacet facet normal 0.163284 -0.651864 -0.740548 outer loop vertex -0.615785 2.029979 2.121321 vertex -0.413847 2.080562 2.121321 vertex -0.371290 1.866613 2.319032 endloop endfacet facet normal 0.163283 -0.651865 -0.740548 outer loop vertex -0.371290 1.866613 2.319032 vertex -0.552462 1.821232 2.319032 vertex -0.615785 2.029979 2.121321 endloop endfacet facet normal 0.103992 -0.415150 0.903790 outer loop vertex -0.333259 1.098616 -2.771639 vertex -0.223971 1.125992 -2.771639 vertex -0.275893 1.387018 -2.645764 endloop endfacet facet normal 0.103989 -0.415150 0.903790 outer loop vertex -0.275893 1.387018 -2.645764 vertex -0.410516 1.353297 -2.645764 vertex -0.333259 1.098616 -2.771639 endloop endfacet facet normal 0.242690 -0.968865 0.049008 outer loop vertex -0.866659 2.856999 -0.294052 vertex -0.582451 2.928190 -0.294052 vertex -0.585269 2.942358 -0.000001 endloop endfacet facet normal 0.242689 -0.968865 0.049009 outer loop vertex -0.585269 2.942358 -0.000001 vertex -0.870852 2.870823 -0.000001 vertex -0.866659 2.856999 -0.294052 endloop endfacet facet normal 0.125028 -0.499134 -0.857457 outer loop vertex -0.483819 1.594945 2.494409 vertex -0.325157 1.634688 2.494409 vertex -0.275893 1.387019 2.645763 endloop endfacet facet normal 0.125026 -0.499135 -0.857457 outer loop vertex -0.275893 1.387019 2.645763 vertex -0.410516 1.353298 2.645763 vertex -0.483819 1.594945 2.494409 endloop endfacet facet normal 0.144853 -0.578295 0.802865 outer loop vertex -0.483818 1.594944 -2.494410 vertex -0.325157 1.634686 -2.494410 vertex -0.371290 1.866612 -2.319033 endloop endfacet facet normal 0.144855 -0.578295 0.802865 outer loop vertex -0.371290 1.866612 -2.319033 vertex -0.552462 1.821231 -2.319033 vertex -0.483818 1.594944 -2.494410 endloop endfacet facet normal 0.081944 -0.327141 -0.941416 outer loop vertex -0.333260 1.098618 2.771639 vertex -0.223972 1.125993 2.771639 vertex -0.169893 0.854123 2.870821 endloop endfacet facet normal 0.081942 -0.327142 -0.941416 outer loop vertex -0.169893 0.854123 2.870821 vertex -0.252794 0.833358 2.870821 vertex -0.333260 1.098618 2.771639 endloop endfacet facet normal 0.240359 -0.959556 -0.146560 outer loop vertex -0.866659 2.856999 0.294051 vertex -0.582451 2.928190 0.294051 vertex -0.574023 2.885821 0.585271 endloop endfacet facet normal 0.240356 -0.959557 -0.146557 outer loop vertex -0.574023 2.885821 0.585271 vertex -0.854119 2.815661 0.585271 vertex -0.866659 2.856999 0.294051 endloop endfacet facet normal 0.180134 -0.719135 0.671116 outer loop vertex -0.615785 2.029978 -2.121322 vertex -0.413847 2.080561 -2.121322 vertex -0.452419 2.274474 -1.903181 endloop endfacet facet normal 0.180136 -0.719136 0.671115 outer loop vertex -0.452419 2.274474 -1.903181 vertex -0.673178 2.219176 -1.903181 vertex -0.615785 2.029978 -2.121322 endloop endfacet facet normal 0.035695 -0.142499 -0.989151 outer loop vertex -0.169894 0.560072 2.942356 vertex -0.114179 0.574028 2.942356 vertex -0.057365 0.288404 2.985554 endloop endfacet facet normal 0.035696 -0.142499 -0.989151 outer loop vertex -0.057365 0.288404 2.985554 vertex -0.085357 0.281392 2.985554 vertex -0.169894 0.560072 2.942356 endloop endfacet facet normal 0.228805 -0.913453 -0.336530 outer loop vertex -0.833354 2.747207 0.870853 vertex -0.560067 2.815661 0.870853 vertex -0.540718 2.718384 1.148050 endloop endfacet facet normal 0.228810 -0.913450 -0.336534 outer loop vertex -0.540718 2.718384 1.148050 vertex -0.804562 2.652294 1.148050 vertex -0.833354 2.747207 0.870853 endloop endfacet facet normal 0.208477 -0.832289 0.513647 outer loop vertex -0.724087 2.387002 -1.666712 vertex -0.486633 2.446481 -1.666712 vertex -0.516161 2.594928 -1.414191 endloop endfacet facet normal 0.208477 -0.832288 0.513647 outer loop vertex -0.516161 2.594928 -1.414191 vertex -0.768023 2.531840 -1.414191 vertex -0.724087 2.387002 -1.666712 endloop endfacet facet normal 0.208480 -0.832288 -0.513647 outer loop vertex -0.768023 2.531840 1.414190 vertex -0.516161 2.594929 1.414190 vertex -0.486633 2.446482 1.666711 endloop endfacet facet normal 0.208477 -0.832290 -0.513645 outer loop vertex -0.486633 2.446482 1.666711 vertex -0.724087 2.387003 1.666711 vertex -0.768023 2.531840 1.414190 endloop endfacet facet normal 0.132673 -0.894402 0.427133 outer loop vertex -0.516161 2.594928 -1.414191 vertex -0.259328 2.633026 -1.414191 vertex -0.271666 2.758294 -1.148051 endloop endfacet facet normal 0.132672 -0.894402 0.427134 outer loop vertex -0.271666 2.758294 -1.148051 vertex -0.540718 2.718384 -1.148051 vertex -0.516161 2.594928 -1.414191 endloop endfacet facet normal 0.117905 -0.794854 -0.595236 outer loop vertex -0.486633 2.446482 1.666711 vertex -0.244492 2.482400 1.666711 vertex -0.227303 2.307867 1.903180 endloop endfacet facet normal 0.117906 -0.794853 -0.595237 outer loop vertex -0.227303 2.307867 1.903180 vertex -0.452419 2.274474 1.903180 vertex -0.486633 2.446482 1.666711 endloop endfacet facet normal 0.035691 -0.240624 0.969962 outer loop vertex -0.114178 0.574026 -2.942356 vertex -0.057364 0.582453 -2.942356 vertex -0.085356 0.866661 -2.870821 endloop endfacet facet normal 0.035694 -0.240624 0.969962 outer loop vertex -0.085356 0.866661 -2.870821 vertex -0.169893 0.854121 -2.870821 vertex -0.114178 0.574026 -2.942356 endloop endfacet facet normal 0.142342 -0.959600 0.242707 outer loop vertex -0.560067 2.815661 -0.870855 vertex -0.281387 2.856999 -0.870855 vertex -0.288399 2.928190 -0.585272 endloop endfacet facet normal 0.142345 -0.959600 0.242704 outer loop vertex -0.288399 2.928190 -0.585272 vertex -0.574023 2.885821 -0.585272 vertex -0.560067 2.815661 -0.870855 endloop endfacet facet normal 0.098604 -0.664730 -0.740548 outer loop vertex -0.413847 2.080562 2.121321 vertex -0.207924 2.111108 2.121321 vertex -0.186542 1.894018 2.319032 endloop endfacet facet normal 0.098604 -0.664729 -0.740548 outer loop vertex -0.186542 1.894018 2.319032 vertex -0.371290 1.866613 2.319032 vertex -0.413847 2.080562 2.121321 endloop endfacet facet normal 0.062797 -0.423345 0.903789 outer loop vertex -0.223971 1.125992 -2.771639 vertex -0.112526 1.142523 -2.771639 vertex -0.138612 1.407381 -2.645764 endloop endfacet facet normal 0.062795 -0.423345 0.903790 outer loop vertex -0.138612 1.407381 -2.645764 vertex -0.275893 1.387018 -2.645764 vertex -0.223971 1.125992 -2.771639 endloop endfacet facet normal 0.146553 -0.987988 0.049012 outer loop vertex -0.582451 2.928190 -0.294052 vertex -0.292633 2.971180 -0.294052 vertex -0.294049 2.985557 -0.000001 endloop endfacet facet normal 0.146556 -0.987988 0.049008 outer loop vertex -0.294049 2.985557 -0.000001 vertex -0.585269 2.942358 -0.000001 vertex -0.582451 2.928190 -0.294052 endloop endfacet facet normal 0.075499 -0.508988 -0.857456 outer loop vertex -0.325157 1.634688 2.494409 vertex -0.163364 1.658687 2.494409 vertex -0.138613 1.407383 2.645763 endloop endfacet facet normal 0.075502 -0.508986 -0.857457 outer loop vertex -0.138613 1.407383 2.645763 vertex -0.275893 1.387019 2.645763 vertex -0.325157 1.634688 2.494409 endloop endfacet facet normal 0.087476 -0.589708 0.802865 outer loop vertex -0.325157 1.634686 -2.494410 vertex -0.163364 1.658686 -2.494410 vertex -0.186542 1.894017 -2.319033 endloop endfacet facet normal 0.087476 -0.589708 0.802865 outer loop vertex -0.186542 1.894017 -2.319033 vertex -0.371290 1.866612 -2.319033 vertex -0.325157 1.634686 -2.494410 endloop endfacet facet normal 0.049484 -0.333599 -0.941416 outer loop vertex -0.223972 1.125993 2.771639 vertex -0.112527 1.142524 2.771639 vertex -0.085356 0.866663 2.870821 endloop endfacet facet normal 0.049485 -0.333598 -0.941416 outer loop vertex -0.085356 0.866663 2.870821 vertex -0.169893 0.854123 2.870821 vertex -0.223972 1.125993 2.771639 endloop endfacet facet normal 0.145145 -0.978496 -0.146556 outer loop vertex -0.582451 2.928190 0.294051 vertex -0.292633 2.971180 0.294051 vertex -0.288399 2.928190 0.585271 endloop endfacet facet normal 0.145148 -0.978495 -0.146559 outer loop vertex -0.288399 2.928190 0.585271 vertex -0.574023 2.885821 0.585271 vertex -0.582451 2.928190 0.294051 endloop endfacet facet normal 0.108780 -0.733329 0.671116 outer loop vertex -0.413847 2.080561 -2.121322 vertex -0.207923 2.111107 -2.121322 vertex -0.227303 2.307867 -1.903181 endloop endfacet facet normal 0.108780 -0.733329 0.671116 outer loop vertex -0.227303 2.307867 -1.903181 vertex -0.452419 2.274474 -1.903181 vertex -0.413847 2.080561 -2.121322 endloop endfacet facet normal 0.021553 -0.145312 -0.989151 outer loop vertex -0.114179 0.574028 2.942356 vertex -0.057364 0.582455 2.942356 vertex -0.028820 0.292638 2.985554 endloop endfacet facet normal 0.021554 -0.145312 -0.989151 outer loop vertex -0.028820 0.292638 2.985554 vertex -0.057365 0.288404 2.985554 vertex -0.114179 0.574028 2.942356 endloop endfacet facet normal 0.138172 -0.931481 -0.336529 outer loop vertex -0.560067 2.815661 0.870853 vertex -0.281388 2.856999 0.870853 vertex -0.271666 2.758294 1.148050 endloop endfacet facet normal 0.138172 -0.931481 -0.336530 outer loop vertex -0.271666 2.758294 1.148050 vertex -0.540718 2.718384 1.148050 vertex -0.560067 2.815661 0.870853 endloop endfacet facet normal 0.125894 -0.848714 0.513648 outer loop vertex -0.486633 2.446481 -1.666712 vertex -0.244492 2.482399 -1.666712 vertex -0.259328 2.633026 -1.414191 endloop endfacet facet normal 0.125896 -0.848715 0.513647 outer loop vertex -0.259328 2.633026 -1.414191 vertex -0.516161 2.594928 -1.414191 vertex -0.486633 2.446481 -1.666712 endloop endfacet facet normal 0.125893 -0.848716 -0.513646 outer loop vertex -0.516161 2.594929 1.414190 vertex -0.259328 2.633026 1.414190 vertex -0.244492 2.482400 1.666711 endloop endfacet facet normal 0.125894 -0.848715 -0.513647 outer loop vertex -0.244492 2.482400 1.666711 vertex -0.486633 2.446482 1.666711 vertex -0.516161 2.594929 1.414190 endloop endfacet facet normal 0.021560 -0.145312 0.989151 outer loop vertex -0.057364 0.288401 -2.985554 vertex -0.028820 0.292636 -2.985554 vertex -0.057364 0.582453 -2.942356 endloop endfacet facet normal 0.021554 -0.145312 0.989151 outer loop vertex -0.057364 0.582453 -2.942356 vertex -0.114178 0.574026 -2.942356 vertex -0.057364 0.288401 -2.985554 endloop endfacet facet normal 0.138172 -0.931481 0.336530 outer loop vertex -0.540718 2.718384 -1.148051 vertex -0.271666 2.758294 -1.148051 vertex -0.281387 2.856999 -0.870855 endloop endfacet facet normal 0.138171 -0.931480 0.336531 outer loop vertex -0.281387 2.856999 -0.870855 vertex -0.560067 2.815661 -0.870855 vertex -0.540718 2.718384 -1.148051 endloop endfacet facet normal 0.108780 -0.733330 -0.671114 outer loop vertex -0.452419 2.274474 1.903180 vertex -0.227303 2.307867 1.903180 vertex -0.207924 2.111108 2.121321 endloop endfacet facet normal 0.108780 -0.733331 -0.671113 outer loop vertex -0.207924 2.111108 2.121321 vertex -0.413847 2.080562 2.121321 vertex -0.452419 2.274474 1.903180 endloop endfacet facet normal 0.049485 -0.333598 0.941416 outer loop vertex -0.169893 0.854121 -2.870821 vertex -0.085356 0.866661 -2.870821 vertex -0.112526 1.142523 -2.771639 endloop endfacet facet normal 0.049484 -0.333597 0.941416 outer loop vertex -0.112526 1.142523 -2.771639 vertex -0.223971 1.125992 -2.771639 vertex -0.169893 0.854121 -2.870821 endloop endfacet facet normal 0.145148 -0.978495 0.146556 outer loop vertex -0.574023 2.885821 -0.585272 vertex -0.288399 2.928190 -0.585272 vertex -0.292633 2.971180 -0.294052 endloop endfacet facet normal 0.145145 -0.978495 0.146559 outer loop vertex -0.292633 2.971180 -0.294052 vertex -0.582451 2.928190 -0.294052 vertex -0.574023 2.885821 -0.585272 endloop endfacet facet normal 0.087476 -0.589708 -0.802865 outer loop vertex -0.371290 1.866613 2.319032 vertex -0.186542 1.894018 2.319032 vertex -0.163364 1.658687 2.494409 endloop endfacet facet normal 0.087473 -0.589710 -0.802864 outer loop vertex -0.163364 1.658687 2.494409 vertex -0.325157 1.634688 2.494409 vertex -0.371290 1.866613 2.319032 endloop endfacet facet normal 0.075499 -0.508987 0.857457 outer loop vertex -0.275893 1.387018 -2.645764 vertex -0.138612 1.407381 -2.645764 vertex -0.163364 1.658686 -2.494410 endloop endfacet facet normal 0.075502 -0.508988 0.857456 outer loop vertex -0.163364 1.658686 -2.494410 vertex -0.325157 1.634686 -2.494410 vertex -0.275893 1.387018 -2.645764 endloop endfacet facet normal 0.062799 -0.423347 -0.903788 outer loop vertex -0.275893 1.387019 2.645763 vertex -0.138613 1.407383 2.645763 vertex -0.112527 1.142524 2.771639 endloop endfacet facet normal 0.062797 -0.423348 -0.903788 outer loop vertex -0.112527 1.142524 2.771639 vertex -0.223972 1.125993 2.771639 vertex -0.275893 1.387019 2.645763 endloop endfacet facet normal 0.146556 -0.987987 -0.049012 outer loop vertex -0.585269 2.942358 -0.000001 vertex -0.294049 2.985557 -0.000001 vertex -0.292633 2.971180 0.294051 endloop endfacet facet normal 0.146553 -0.987988 -0.049008 outer loop vertex -0.292633 2.971180 0.294051 vertex -0.582451 2.928190 0.294051 vertex -0.585269 2.942358 -0.000001 endloop endfacet facet normal 0.098604 -0.664730 0.740548 outer loop vertex -0.371290 1.866612 -2.319033 vertex -0.186542 1.894017 -2.319033 vertex -0.207923 2.111107 -2.121322 endloop endfacet facet normal 0.098604 -0.664730 0.740548 outer loop vertex -0.207923 2.111107 -2.121322 vertex -0.413847 2.080561 -2.121322 vertex -0.371290 1.866612 -2.319033 endloop endfacet facet normal 0.035693 -0.240624 -0.969962 outer loop vertex -0.169893 0.854123 2.870821 vertex -0.085356 0.866663 2.870821 vertex -0.057364 0.582455 2.942356 endloop endfacet facet normal 0.035690 -0.240625 -0.969962 outer loop vertex -0.057364 0.582455 2.942356 vertex -0.114179 0.574028 2.942356 vertex -0.169893 0.854123 2.870821 endloop endfacet facet normal 0.142345 -0.959599 -0.242707 outer loop vertex -0.574023 2.885821 0.585271 vertex -0.288399 2.928190 0.585271 vertex -0.281388 2.856999 0.870853 endloop endfacet facet normal 0.142343 -0.959600 -0.242705 outer loop vertex -0.281388 2.856999 0.870853 vertex -0.560067 2.815661 0.870853 vertex -0.574023 2.885821 0.585271 endloop endfacet facet normal 0.117907 -0.794855 0.595234 outer loop vertex -0.452419 2.274474 -1.903181 vertex -0.227303 2.307867 -1.903181 vertex -0.244492 2.482399 -1.666712 endloop endfacet facet normal 0.117905 -0.794854 0.595235 outer loop vertex -0.244492 2.482399 -1.666712 vertex -0.486633 2.446481 -1.666712 vertex -0.452419 2.274474 -1.903181 endloop endfacet facet normal 0.132672 -0.894403 -0.427133 outer loop vertex -0.540718 2.718384 1.148050 vertex -0.271666 2.758294 1.148050 vertex -0.259328 2.633026 1.414190 endloop endfacet facet normal 0.132670 -0.894404 -0.427131 outer loop vertex -0.259328 2.633026 1.414190 vertex -0.516161 2.594929 1.414190 vertex -0.540718 2.718384 1.148050 endloop endfacet facet normal 0.042103 -0.856968 0.513646 outer loop vertex -0.244492 2.482399 -1.666712 vertex 0.000003 2.494411 -1.666712 vertex 0.000002 2.645766 -1.414191 endloop endfacet facet normal 0.042100 -0.856967 0.513648 outer loop vertex 0.000002 2.645766 -1.414191 vertex -0.259328 2.633026 -1.414191 vertex -0.244492 2.482399 -1.666712 endloop endfacet facet normal 0.042100 -0.856968 -0.513646 outer loop vertex -0.259328 2.633026 1.414190 vertex 0.000003 2.645766 1.414190 vertex 0.000003 2.494411 1.666711 endloop endfacet facet normal 0.042099 -0.856969 -0.513646 outer loop vertex 0.000003 2.494411 1.666711 vertex -0.244492 2.482400 1.666711 vertex -0.259328 2.633026 1.414190 endloop endfacet facet normal 0.007208 -0.146725 0.989151 outer loop vertex -0.028820 0.292636 -2.985554 vertex 0.000002 0.294052 -2.985554 vertex 0.000002 0.585271 -2.942356 endloop endfacet facet normal 0.007208 -0.146725 0.989151 outer loop vertex 0.000002 0.585271 -2.942356 vertex -0.057364 0.582453 -2.942356 vertex -0.028820 0.292636 -2.985554 endloop endfacet facet normal 0.046205 -0.940538 0.336532 outer loop vertex -0.271666 2.758294 -1.148051 vertex 0.000002 2.771640 -1.148051 vertex 0.000002 2.870823 -0.870855 endloop endfacet facet normal 0.046206 -0.940538 0.336530 outer loop vertex 0.000002 2.870823 -0.870855 vertex -0.281387 2.856999 -0.870855 vertex -0.271666 2.758294 -1.148051 endloop endfacet facet normal 0.036377 -0.740459 -0.671116 outer loop vertex -0.227303 2.307867 1.903180 vertex 0.000002 2.319034 1.903180 vertex 0.000002 2.121322 2.121321 endloop endfacet facet normal 0.036373 -0.740462 -0.671114 outer loop vertex 0.000002 2.121322 2.121321 vertex -0.207924 2.111108 2.121321 vertex -0.227303 2.307867 1.903180 endloop endfacet facet normal 0.016550 -0.336842 0.941416 outer loop vertex -0.085356 0.866661 -2.870821 vertex 0.000002 0.870855 -2.870821 vertex 0.000002 1.148051 -2.771639 endloop endfacet facet normal 0.016547 -0.336842 0.941416 outer loop vertex 0.000002 1.148051 -2.771639 vertex -0.112526 1.142523 -2.771639 vertex -0.085356 0.866661 -2.870821 endloop endfacet facet normal 0.048537 -0.988011 0.146556 outer loop vertex -0.288399 2.928190 -0.585272 vertex 0.000003 2.942358 -0.585272 vertex 0.000002 2.985556 -0.294052 endloop endfacet facet normal 0.048537 -0.988011 0.146556 outer loop vertex 0.000002 2.985556 -0.294052 vertex -0.292633 2.971180 -0.294052 vertex -0.288399 2.928190 -0.585272 endloop endfacet facet normal 0.029251 -0.595444 -0.802864 outer loop vertex -0.186542 1.894018 2.319032 vertex 0.000003 1.903182 2.319032 vertex 0.000002 1.666713 2.494409 endloop endfacet facet normal 0.029253 -0.595443 -0.802865 outer loop vertex 0.000002 1.666713 2.494409 vertex -0.163364 1.658687 2.494409 vertex -0.186542 1.894018 2.319032 endloop endfacet facet normal 0.025249 -0.513936 0.857457 outer loop vertex -0.138612 1.407381 -2.645764 vertex 0.000002 1.414191 -2.645764 vertex 0.000003 1.666712 -2.494410 endloop endfacet facet normal 0.025249 -0.513936 0.857457 outer loop vertex 0.000003 1.666712 -2.494410 vertex -0.163364 1.658686 -2.494410 vertex -0.138612 1.407381 -2.645764 endloop endfacet facet normal 0.021001 -0.427463 -0.903789 outer loop vertex -0.138613 1.407383 2.645763 vertex 0.000003 1.414193 2.645763 vertex 0.000002 1.148052 2.771639 endloop endfacet facet normal 0.020999 -0.427464 -0.903788 outer loop vertex 0.000002 1.148052 2.771639 vertex -0.112527 1.142524 2.771639 vertex -0.138613 1.407383 2.645763 endloop endfacet facet normal 0.049005 -0.997595 -0.049009 outer loop vertex -0.294049 2.985557 -0.000001 vertex 0.000002 3.000002 -0.000001 vertex 0.000002 2.985556 0.294051 endloop endfacet facet normal 0.049008 -0.997595 -0.049012 outer loop vertex 0.000002 2.985556 0.294051 vertex -0.292633 2.971180 0.294051 vertex -0.294049 2.985557 -0.000001 endloop endfacet facet normal 0.032972 -0.671195 0.740547 outer loop vertex -0.186542 1.894017 -2.319033 vertex 0.000002 1.903181 -2.319033 vertex 0.000002 2.121321 -2.121322 endloop endfacet facet normal 0.032971 -0.671194 0.740548 outer loop vertex 0.000002 2.121321 -2.121322 vertex -0.207923 2.111107 -2.121322 vertex -0.186542 1.894017 -2.319033 endloop endfacet facet normal 0.011935 -0.242964 -0.969962 outer loop vertex -0.085356 0.866663 2.870821 vertex 0.000002 0.870856 2.870821 vertex 0.000002 0.585273 2.942356 endloop endfacet facet normal 0.011935 -0.242964 -0.969962 outer loop vertex 0.000002 0.585273 2.942356 vertex -0.057364 0.582455 2.942356 vertex -0.085356 0.866663 2.870821 endloop endfacet facet normal 0.047600 -0.968931 -0.242706 outer loop vertex -0.288399 2.928190 0.585271 vertex 0.000002 2.942358 0.585271 vertex 0.000002 2.870823 0.870853 endloop endfacet facet normal 0.047601 -0.968931 -0.242708 outer loop vertex 0.000002 2.870823 0.870853 vertex -0.281388 2.856999 0.870853 vertex -0.288399 2.928190 0.585271 endloop endfacet facet normal 0.039425 -0.802582 0.595238 outer loop vertex -0.227303 2.307867 -1.903181 vertex 0.000002 2.319033 -1.903181 vertex 0.000003 2.494411 -1.666712 endloop endfacet facet normal 0.039431 -0.802584 0.595234 outer loop vertex 0.000003 2.494411 -1.666712 vertex -0.244492 2.482399 -1.666712 vertex -0.227303 2.307867 -1.903181 endloop endfacet facet normal 0.044366 -0.903100 -0.427132 outer loop vertex -0.271666 2.758294 1.148050 vertex 0.000002 2.771640 1.148050 vertex 0.000003 2.645766 1.414190 endloop endfacet facet normal 0.044367 -0.903100 -0.427133 outer loop vertex 0.000003 2.645766 1.414190 vertex -0.259328 2.633026 1.414190 vertex -0.271666 2.758294 1.148050 endloop endfacet facet normal 0.044367 -0.903100 0.427132 outer loop vertex -0.259328 2.633026 -1.414191 vertex 0.000002 2.645766 -1.414191 vertex 0.000002 2.771640 -1.148051 endloop endfacet facet normal 0.044366 -0.903100 0.427133 outer loop vertex 0.000002 2.771640 -1.148051 vertex -0.271666 2.758294 -1.148051 vertex -0.259328 2.633026 -1.414191 endloop endfacet facet normal 0.039428 -0.802584 -0.595235 outer loop vertex -0.244492 2.482400 1.666711 vertex 0.000003 2.494411 1.666711 vertex 0.000002 2.319034 1.903180 endloop endfacet facet normal 0.039429 -0.802583 -0.595236 outer loop vertex 0.000002 2.319034 1.903180 vertex -0.227303 2.307867 1.903180 vertex -0.244492 2.482400 1.666711 endloop endfacet facet normal 0.011935 -0.242963 0.969962 outer loop vertex -0.057364 0.582453 -2.942356 vertex 0.000002 0.585271 -2.942356 vertex 0.000002 0.870855 -2.870821 endloop endfacet facet normal 0.011938 -0.242964 0.969962 outer loop vertex 0.000002 0.870855 -2.870821 vertex -0.085356 0.866661 -2.870821 vertex -0.057364 0.582453 -2.942356 endloop endfacet facet normal 0.047601 -0.968931 0.242706 outer loop vertex -0.281387 2.856999 -0.870855 vertex 0.000002 2.870823 -0.870855 vertex 0.000003 2.942358 -0.585272 endloop endfacet facet normal 0.047600 -0.968931 0.242707 outer loop vertex 0.000003 2.942358 -0.585272 vertex -0.288399 2.928190 -0.585272 vertex -0.281387 2.856999 -0.870855 endloop endfacet facet normal 0.032971 -0.671195 -0.740548 outer loop vertex -0.207924 2.111108 2.121321 vertex 0.000002 2.121322 2.121321 vertex 0.000003 1.903182 2.319032 endloop endfacet facet normal 0.032972 -0.671194 -0.740548 outer loop vertex 0.000003 1.903182 2.319032 vertex -0.186542 1.894018 2.319032 vertex -0.207924 2.111108 2.121321 endloop endfacet facet normal 0.020999 -0.427461 0.903790 outer loop vertex -0.112526 1.142523 -2.771639 vertex 0.000002 1.148051 -2.771639 vertex 0.000002 1.414191 -2.645764 endloop endfacet facet normal 0.021001 -0.427462 0.903790 outer loop vertex 0.000002 1.414191 -2.645764 vertex -0.138612 1.407381 -2.645764 vertex -0.112526 1.142523 -2.771639 endloop endfacet facet normal 0.049008 -0.997595 0.049009 outer loop vertex -0.292633 2.971180 -0.294052 vertex 0.000002 2.985556 -0.294052 vertex 0.000002 3.000002 -0.000001 endloop endfacet facet normal 0.049005 -0.997595 0.049012 outer loop vertex 0.000002 3.000002 -0.000001 vertex -0.294049 2.985557 -0.000001 vertex -0.292633 2.971180 -0.294052 endloop endfacet facet normal 0.025249 -0.513937 -0.857456 outer loop vertex -0.163364 1.658687 2.494409 vertex 0.000002 1.666713 2.494409 vertex 0.000003 1.414193 2.645763 endloop endfacet facet normal 0.025249 -0.513937 -0.857456 outer loop vertex 0.000003 1.414193 2.645763 vertex -0.138613 1.407383 2.645763 vertex -0.163364 1.658687 2.494409 endloop endfacet facet normal 0.029253 -0.595444 0.802864 outer loop vertex -0.163364 1.658686 -2.494410 vertex 0.000003 1.666712 -2.494410 vertex 0.000002 1.903181 -2.319033 endloop endfacet facet normal 0.029251 -0.595443 0.802865 outer loop vertex 0.000002 1.903181 -2.319033 vertex -0.186542 1.894017 -2.319033 vertex -0.163364 1.658686 -2.494410 endloop endfacet facet normal 0.016547 -0.336842 -0.941416 outer loop vertex -0.112527 1.142524 2.771639 vertex 0.000002 1.148052 2.771639 vertex 0.000002 0.870856 2.870821 endloop endfacet facet normal 0.016547 -0.336843 -0.941415 outer loop vertex 0.000002 0.870856 2.870821 vertex -0.085356 0.866663 2.870821 vertex -0.112527 1.142524 2.771639 endloop endfacet facet normal 0.048537 -0.988011 -0.146556 outer loop vertex -0.292633 2.971180 0.294051 vertex 0.000002 2.985556 0.294051 vertex 0.000002 2.942358 0.585271 endloop endfacet facet normal 0.048537 -0.988011 -0.146556 outer loop vertex 0.000002 2.942358 0.585271 vertex -0.288399 2.928190 0.585271 vertex -0.292633 2.971180 0.294051 endloop endfacet facet normal 0.036373 -0.740460 0.671115 outer loop vertex -0.207923 2.111107 -2.121322 vertex 0.000002 2.121321 -2.121322 vertex 0.000002 2.319033 -1.903181 endloop endfacet facet normal 0.036373 -0.740460 0.671116 outer loop vertex 0.000002 2.319033 -1.903181 vertex -0.227303 2.307867 -1.903181 vertex -0.207923 2.111107 -2.121322 endloop endfacet facet normal 0.007208 -0.146725 -0.989151 outer loop vertex -0.057364 0.582455 2.942356 vertex 0.000002 0.585273 2.942356 vertex 0.000002 0.294054 2.985554 endloop endfacet facet normal 0.007208 -0.146725 -0.989151 outer loop vertex 0.000002 0.294054 2.985554 vertex -0.028820 0.292638 2.985554 vertex -0.057364 0.582455 2.942356 endloop endfacet facet normal 0.046206 -0.940538 -0.336531 outer loop vertex -0.281388 2.856999 0.870853 vertex 0.000002 2.870823 0.870853 vertex 0.000002 2.771640 1.148050 endloop endfacet facet normal 0.046205 -0.940539 -0.336529 outer loop vertex 0.000002 2.771640 1.148050 vertex -0.271666 2.758294 1.148050 vertex -0.281388 2.856999 0.870853 endloop endfacet facet normal -0.039425 -0.802585 0.595234 outer loop vertex 0.000002 2.319033 -1.903181 vertex 0.227307 2.307867 -1.903181 vertex 0.244498 2.482399 -1.666712 endloop endfacet facet normal -0.039431 -0.802581 0.595238 outer loop vertex 0.244498 2.482399 -1.666712 vertex 0.000003 2.494411 -1.666712 vertex 0.000002 2.319033 -1.903181 endloop endfacet facet normal -0.044366 -0.903100 -0.427133 outer loop vertex 0.000002 2.771640 1.148050 vertex 0.271671 2.758294 1.148050 vertex 0.259333 2.633026 1.414190 endloop endfacet facet normal -0.044367 -0.903100 -0.427132 outer loop vertex 0.259333 2.633026 1.414190 vertex 0.000003 2.645766 1.414190 vertex 0.000002 2.771640 1.148050 endloop endfacet facet normal -0.044367 -0.903100 0.427133 outer loop vertex 0.000002 2.645766 -1.414191 vertex 0.259333 2.633026 -1.414191 vertex 0.271671 2.758294 -1.148051 endloop endfacet facet normal -0.044366 -0.903100 0.427132 outer loop vertex 0.271671 2.758294 -1.148051 vertex 0.000002 2.771640 -1.148051 vertex 0.000002 2.645766 -1.414191 endloop endfacet facet normal -0.039428 -0.802583 -0.595236 outer loop vertex 0.000003 2.494411 1.666711 vertex 0.244498 2.482400 1.666711 vertex 0.227307 2.307867 1.903180 endloop endfacet facet normal -0.039429 -0.802584 -0.595235 outer loop vertex 0.227307 2.307867 1.903180 vertex 0.000002 2.319034 1.903180 vertex 0.000003 2.494411 1.666711 endloop endfacet facet normal -0.011935 -0.242964 0.969962 outer loop vertex 0.000002 0.585271 -2.942356 vertex 0.057369 0.582453 -2.942356 vertex 0.085361 0.866661 -2.870821 endloop endfacet facet normal -0.011938 -0.242963 0.969962 outer loop vertex 0.085361 0.866661 -2.870821 vertex 0.000002 0.870855 -2.870821 vertex 0.000002 0.585271 -2.942356 endloop endfacet facet normal -0.047601 -0.968931 0.242707 outer loop vertex 0.000002 2.870823 -0.870855 vertex 0.281392 2.856999 -0.870855 vertex 0.288404 2.928190 -0.585272 endloop endfacet facet normal -0.047600 -0.968931 0.242706 outer loop vertex 0.288404 2.928190 -0.585272 vertex 0.000003 2.942358 -0.585272 vertex 0.000002 2.870823 -0.870855 endloop endfacet facet normal -0.032971 -0.671194 -0.740548 outer loop vertex 0.000002 2.121322 2.121321 vertex 0.207928 2.111108 2.121321 vertex 0.186547 1.894018 2.319032 endloop endfacet facet normal -0.032972 -0.671195 -0.740547 outer loop vertex 0.186547 1.894018 2.319032 vertex 0.000003 1.903182 2.319032 vertex 0.000002 2.121322 2.121321 endloop endfacet facet normal -0.020999 -0.427462 0.903789 outer loop vertex 0.000002 1.148051 -2.771639 vertex 0.112531 1.142523 -2.771639 vertex 0.138617 1.407381 -2.645764 endloop endfacet facet normal -0.021001 -0.427461 0.903790 outer loop vertex 0.138617 1.407381 -2.645764 vertex 0.000002 1.414191 -2.645764 vertex 0.000002 1.148051 -2.771639 endloop endfacet facet normal -0.049007 -0.997595 0.049012 outer loop vertex 0.000002 2.985556 -0.294052 vertex 0.292638 2.971180 -0.294052 vertex 0.294054 2.985557 -0.000001 endloop endfacet facet normal -0.049005 -0.997595 0.049009 outer loop vertex 0.294054 2.985557 -0.000001 vertex 0.000002 3.000002 -0.000001 vertex 0.000002 2.985556 -0.294052 endloop endfacet facet normal -0.025249 -0.513937 -0.857456 outer loop vertex 0.000002 1.666713 2.494409 vertex 0.163369 1.658687 2.494409 vertex 0.138618 1.407383 2.645763 endloop endfacet facet normal -0.025249 -0.513937 -0.857456 outer loop vertex 0.138618 1.407383 2.645763 vertex 0.000003 1.414193 2.645763 vertex 0.000002 1.666713 2.494409 endloop endfacet facet normal -0.029253 -0.595443 0.802865 outer loop vertex 0.000003 1.666712 -2.494410 vertex 0.163369 1.658686 -2.494410 vertex 0.186547 1.894017 -2.319033 endloop endfacet facet normal -0.029251 -0.595444 0.802864 outer loop vertex 0.186547 1.894017 -2.319033 vertex 0.000002 1.903181 -2.319033 vertex 0.000003 1.666712 -2.494410 endloop endfacet facet normal -0.016547 -0.336843 -0.941416 outer loop vertex 0.000002 1.148052 2.771639 vertex 0.112531 1.142524 2.771639 vertex 0.085361 0.866663 2.870821 endloop endfacet facet normal -0.016546 -0.336842 -0.941416 outer loop vertex 0.085361 0.866663 2.870821 vertex 0.000002 0.870856 2.870821 vertex 0.000002 1.148052 2.771639 endloop endfacet facet normal -0.048537 -0.988011 -0.146556 outer loop vertex 0.000002 2.985556 0.294051 vertex 0.292638 2.971180 0.294051 vertex 0.288404 2.928190 0.585271 endloop endfacet facet normal -0.048537 -0.988011 -0.146556 outer loop vertex 0.288404 2.928190 0.585271 vertex 0.000002 2.942358 0.585271 vertex 0.000002 2.985556 0.294051 endloop endfacet facet normal -0.036373 -0.740460 0.671115 outer loop vertex 0.000002 2.121321 -2.121322 vertex 0.207928 2.111107 -2.121322 vertex 0.227307 2.307867 -1.903181 endloop endfacet facet normal -0.036373 -0.740460 0.671116 outer loop vertex 0.227307 2.307867 -1.903181 vertex 0.000002 2.319033 -1.903181 vertex 0.000002 2.121321 -2.121322 endloop endfacet facet normal -0.007208 -0.146725 -0.989151 outer loop vertex 0.000002 0.585273 2.942356 vertex 0.057369 0.582455 2.942356 vertex 0.028825 0.292638 2.985554 endloop endfacet facet normal -0.007208 -0.146725 -0.989151 outer loop vertex 0.028825 0.292638 2.985554 vertex 0.000002 0.294054 2.985554 vertex 0.000002 0.585273 2.942356 endloop endfacet facet normal -0.046206 -0.940539 -0.336529 outer loop vertex 0.000002 2.870823 0.870853 vertex 0.281392 2.856999 0.870853 vertex 0.271671 2.758294 1.148050 endloop endfacet facet normal -0.046205 -0.940538 -0.336531 outer loop vertex 0.271671 2.758294 1.148050 vertex 0.000002 2.771640 1.148050 vertex 0.000002 2.870823 0.870853 endloop endfacet facet normal -0.042103 -0.856967 0.513648 outer loop vertex 0.000003 2.494411 -1.666712 vertex 0.244498 2.482399 -1.666712 vertex 0.259333 2.633026 -1.414191 endloop endfacet facet normal -0.042100 -0.856969 0.513646 outer loop vertex 0.259333 2.633026 -1.414191 vertex 0.000002 2.645766 -1.414191 vertex 0.000003 2.494411 -1.666712 endloop endfacet facet normal -0.042100 -0.856969 -0.513646 outer loop vertex 0.000003 2.645766 1.414190 vertex 0.259333 2.633026 1.414190 vertex 0.244498 2.482400 1.666711 endloop endfacet facet normal -0.042099 -0.856968 -0.513646 outer loop vertex 0.244498 2.482400 1.666711 vertex 0.000003 2.494411 1.666711 vertex 0.000003 2.645766 1.414190 endloop endfacet facet normal -0.007208 -0.146725 0.989151 outer loop vertex 0.000002 0.294052 -2.985554 vertex 0.028825 0.292636 -2.985554 vertex 0.057369 0.582453 -2.942356 endloop endfacet facet normal -0.007207 -0.146725 0.989151 outer loop vertex 0.057369 0.582453 -2.942356 vertex 0.000002 0.585271 -2.942356 vertex 0.000002 0.294052 -2.985554 endloop endfacet facet normal -0.046205 -0.940538 0.336530 outer loop vertex 0.000002 2.771640 -1.148051 vertex 0.271671 2.758294 -1.148051 vertex 0.281392 2.856999 -0.870855 endloop endfacet facet normal -0.046206 -0.940538 0.336532 outer loop vertex 0.281392 2.856999 -0.870855 vertex 0.000002 2.870823 -0.870855 vertex 0.000002 2.771640 -1.148051 endloop endfacet facet normal -0.036377 -0.740461 -0.671114 outer loop vertex 0.000002 2.319034 1.903180 vertex 0.227307 2.307867 1.903180 vertex 0.207928 2.111108 2.121321 endloop endfacet facet normal -0.036373 -0.740460 -0.671116 outer loop vertex 0.207928 2.111108 2.121321 vertex 0.000002 2.121322 2.121321 vertex 0.000002 2.319034 1.903180 endloop endfacet facet normal -0.016550 -0.336841 0.941416 outer loop vertex 0.000002 0.870855 -2.870821 vertex 0.085361 0.866661 -2.870821 vertex 0.112531 1.142523 -2.771639 endloop endfacet facet normal -0.016547 -0.336842 0.941416 outer loop vertex 0.112531 1.142523 -2.771639 vertex 0.000002 1.148051 -2.771639 vertex 0.000002 0.870855 -2.870821 endloop endfacet facet normal -0.048537 -0.988011 0.146556 outer loop vertex 0.000003 2.942358 -0.585272 vertex 0.288404 2.928190 -0.585272 vertex 0.292638 2.971180 -0.294052 endloop endfacet facet normal -0.048537 -0.988011 0.146556 outer loop vertex 0.292638 2.971180 -0.294052 vertex 0.000002 2.985556 -0.294052 vertex 0.000003 2.942358 -0.585272 endloop endfacet facet normal -0.029251 -0.595443 -0.802865 outer loop vertex 0.000003 1.903182 2.319032 vertex 0.186547 1.894018 2.319032 vertex 0.163369 1.658687 2.494409 endloop endfacet facet normal -0.029253 -0.595444 -0.802864 outer loop vertex 0.163369 1.658687 2.494409 vertex 0.000002 1.666713 2.494409 vertex 0.000003 1.903182 2.319032 endloop endfacet facet normal -0.025249 -0.513936 0.857457 outer loop vertex 0.000002 1.414191 -2.645764 vertex 0.138617 1.407381 -2.645764 vertex 0.163369 1.658686 -2.494410 endloop endfacet facet normal -0.025249 -0.513936 0.857457 outer loop vertex 0.163369 1.658686 -2.494410 vertex 0.000003 1.666712 -2.494410 vertex 0.000002 1.414191 -2.645764 endloop endfacet facet normal -0.021001 -0.427464 -0.903789 outer loop vertex 0.000003 1.414193 2.645763 vertex 0.138618 1.407383 2.645763 vertex 0.112531 1.142524 2.771639 endloop endfacet facet normal -0.020999 -0.427463 -0.903789 outer loop vertex 0.112531 1.142524 2.771639 vertex 0.000002 1.148052 2.771639 vertex 0.000003 1.414193 2.645763 endloop endfacet facet normal -0.049005 -0.997595 -0.049012 outer loop vertex 0.000002 3.000002 -0.000001 vertex 0.294054 2.985557 -0.000001 vertex 0.292638 2.971180 0.294051 endloop endfacet facet normal -0.049007 -0.997595 -0.049009 outer loop vertex 0.292638 2.971180 0.294051 vertex 0.000002 2.985556 0.294051 vertex 0.000002 3.000002 -0.000001 endloop endfacet facet normal -0.032972 -0.671194 0.740548 outer loop vertex 0.000002 1.903181 -2.319033 vertex 0.186547 1.894017 -2.319033 vertex 0.207928 2.111107 -2.121322 endloop endfacet facet normal -0.032971 -0.671195 0.740548 outer loop vertex 0.207928 2.111107 -2.121322 vertex 0.000002 2.121321 -2.121322 vertex 0.000002 1.903181 -2.319033 endloop endfacet facet normal -0.011935 -0.242964 -0.969962 outer loop vertex 0.000002 0.870856 2.870821 vertex 0.085361 0.866663 2.870821 vertex 0.057369 0.582455 2.942356 endloop endfacet facet normal -0.011935 -0.242964 -0.969962 outer loop vertex 0.057369 0.582455 2.942356 vertex 0.000002 0.585273 2.942356 vertex 0.000002 0.870856 2.870821 endloop endfacet facet normal -0.047600 -0.968931 -0.242708 outer loop vertex 0.000002 2.942358 0.585271 vertex 0.288404 2.928190 0.585271 vertex 0.281392 2.856999 0.870853 endloop endfacet facet normal -0.047601 -0.968931 -0.242706 outer loop vertex 0.281392 2.856999 0.870853 vertex 0.000002 2.870823 0.870853 vertex 0.000002 2.942358 0.585271 endloop endfacet facet normal -0.108780 -0.733329 0.671115 outer loop vertex 0.207928 2.111107 -2.121322 vertex 0.413852 2.080561 -2.121322 vertex 0.452423 2.274474 -1.903181 endloop endfacet facet normal -0.108780 -0.733329 0.671115 outer loop vertex 0.452423 2.274474 -1.903181 vertex 0.227307 2.307867 -1.903181 vertex 0.207928 2.111107 -2.121322 endloop endfacet facet normal -0.021553 -0.145312 -0.989151 outer loop vertex 0.057369 0.582455 2.942356 vertex 0.114184 0.574028 2.942356 vertex 0.057369 0.288404 2.985554 endloop endfacet facet normal -0.021555 -0.145312 -0.989151 outer loop vertex 0.057369 0.288404 2.985554 vertex 0.028825 0.292638 2.985554 vertex 0.057369 0.582455 2.942356 endloop endfacet facet normal -0.138171 -0.931481 -0.336530 outer loop vertex 0.281392 2.856999 0.870853 vertex 0.560072 2.815661 0.870853 vertex 0.540723 2.718384 1.148050 endloop endfacet facet normal -0.138172 -0.931481 -0.336529 outer loop vertex 0.540723 2.718384 1.148050 vertex 0.271671 2.758294 1.148050 vertex 0.281392 2.856999 0.870853 endloop endfacet facet normal -0.125895 -0.848715 0.513647 outer loop vertex 0.244498 2.482399 -1.666712 vertex 0.486638 2.446481 -1.666712 vertex 0.516166 2.594928 -1.414191 endloop endfacet facet normal -0.125896 -0.848714 0.513648 outer loop vertex 0.516166 2.594928 -1.414191 vertex 0.259333 2.633026 -1.414191 vertex 0.244498 2.482399 -1.666712 endloop endfacet facet normal -0.125896 -0.848716 -0.513645 outer loop vertex 0.259333 2.633026 1.414190 vertex 0.516166 2.594928 1.414190 vertex 0.486638 2.446482 1.666711 endloop endfacet facet normal -0.125895 -0.848716 -0.513646 outer loop vertex 0.486638 2.446482 1.666711 vertex 0.244498 2.482400 1.666711 vertex 0.259333 2.633026 1.414190 endloop endfacet facet normal -0.021559 -0.145311 0.989151 outer loop vertex 0.028825 0.292636 -2.985554 vertex 0.057369 0.288401 -2.985554 vertex 0.114183 0.574026 -2.942356 endloop endfacet facet normal -0.021554 -0.145312 0.989151 outer loop vertex 0.114183 0.574026 -2.942356 vertex 0.057369 0.582453 -2.942356 vertex 0.028825 0.292636 -2.985554 endloop endfacet facet normal -0.138172 -0.931480 0.336531 outer loop vertex 0.271671 2.758294 -1.148051 vertex 0.540722 2.718384 -1.148051 vertex 0.560072 2.815661 -0.870855 endloop endfacet facet normal -0.138171 -0.931481 0.336530 outer loop vertex 0.560072 2.815661 -0.870855 vertex 0.281392 2.856999 -0.870855 vertex 0.271671 2.758294 -1.148051 endloop endfacet facet normal -0.108780 -0.733331 -0.671113 outer loop vertex 0.227307 2.307867 1.903180 vertex 0.452423 2.274474 1.903180 vertex 0.413852 2.080562 2.121321 endloop endfacet facet normal -0.108779 -0.733330 -0.671114 outer loop vertex 0.413852 2.080562 2.121321 vertex 0.207928 2.111108 2.121321 vertex 0.227307 2.307867 1.903180 endloop endfacet facet normal -0.049485 -0.333597 0.941416 outer loop vertex 0.085361 0.866661 -2.870821 vertex 0.169898 0.854121 -2.870821 vertex 0.223976 1.125992 -2.771639 endloop endfacet facet normal -0.049484 -0.333598 0.941416 outer loop vertex 0.223976 1.125992 -2.771639 vertex 0.112531 1.142523 -2.771639 vertex 0.085361 0.866661 -2.870821 endloop endfacet facet normal -0.145148 -0.978495 0.146559 outer loop vertex 0.288404 2.928190 -0.585272 vertex 0.574028 2.885821 -0.585272 vertex 0.582455 2.928190 -0.294052 endloop endfacet facet normal -0.145145 -0.978496 0.146556 outer loop vertex 0.582455 2.928190 -0.294052 vertex 0.292638 2.971180 -0.294052 vertex 0.288404 2.928190 -0.585272 endloop endfacet facet normal -0.087476 -0.589710 -0.802864 outer loop vertex 0.186547 1.894018 2.319032 vertex 0.371295 1.866613 2.319032 vertex 0.325162 1.634688 2.494409 endloop endfacet facet normal -0.087472 -0.589709 -0.802865 outer loop vertex 0.325162 1.634688 2.494409 vertex 0.163369 1.658687 2.494409 vertex 0.186547 1.894018 2.319032 endloop endfacet facet normal -0.075499 -0.508988 0.857456 outer loop vertex 0.138617 1.407381 -2.645764 vertex 0.275897 1.387018 -2.645764 vertex 0.325162 1.634686 -2.494410 endloop endfacet facet normal -0.075502 -0.508986 0.857457 outer loop vertex 0.325162 1.634686 -2.494410 vertex 0.163369 1.658686 -2.494410 vertex 0.138617 1.407381 -2.645764 endloop endfacet facet normal -0.062799 -0.423348 -0.903788 outer loop vertex 0.138618 1.407383 2.645763 vertex 0.275898 1.387019 2.645763 vertex 0.223976 1.125993 2.771639 endloop endfacet facet normal -0.062796 -0.423347 -0.903789 outer loop vertex 0.223976 1.125993 2.771639 vertex 0.112531 1.142524 2.771639 vertex 0.138618 1.407383 2.645763 endloop endfacet facet normal -0.146556 -0.987988 -0.049008 outer loop vertex 0.294054 2.985557 -0.000001 vertex 0.585274 2.942358 -0.000001 vertex 0.582455 2.928190 0.294051 endloop endfacet facet normal -0.146553 -0.987988 -0.049012 outer loop vertex 0.582455 2.928190 0.294051 vertex 0.292638 2.971180 0.294051 vertex 0.294054 2.985557 -0.000001 endloop endfacet facet normal -0.098604 -0.664730 0.740548 outer loop vertex 0.186547 1.894017 -2.319033 vertex 0.371295 1.866612 -2.319033 vertex 0.413852 2.080561 -2.121322 endloop endfacet facet normal -0.098604 -0.664730 0.740548 outer loop vertex 0.413852 2.080561 -2.121322 vertex 0.207928 2.111107 -2.121322 vertex 0.186547 1.894017 -2.319033 endloop endfacet facet normal -0.035694 -0.240624 -0.969962 outer loop vertex 0.085361 0.866663 2.870821 vertex 0.169898 0.854123 2.870821 vertex 0.114184 0.574028 2.942356 endloop endfacet facet normal -0.035690 -0.240624 -0.969962 outer loop vertex 0.114184 0.574028 2.942356 vertex 0.057369 0.582455 2.942356 vertex 0.085361 0.866663 2.870821 endloop endfacet facet normal -0.142345 -0.959600 -0.242705 outer loop vertex 0.288404 2.928190 0.585271 vertex 0.574028 2.885821 0.585271 vertex 0.560072 2.815661 0.870853 endloop endfacet facet normal -0.142342 -0.959600 -0.242708 outer loop vertex 0.560072 2.815661 0.870853 vertex 0.281392 2.856999 0.870853 vertex 0.288404 2.928190 0.585271 endloop endfacet facet normal -0.117907 -0.794854 0.595235 outer loop vertex 0.227307 2.307867 -1.903181 vertex 0.452423 2.274474 -1.903181 vertex 0.486638 2.446481 -1.666712 endloop endfacet facet normal -0.117905 -0.794855 0.595235 outer loop vertex 0.486638 2.446481 -1.666712 vertex 0.244498 2.482399 -1.666712 vertex 0.227307 2.307867 -1.903181 endloop endfacet facet normal -0.132672 -0.894402 -0.427134 outer loop vertex 0.271671 2.758294 1.148050 vertex 0.540723 2.718384 1.148050 vertex 0.516166 2.594928 1.414190 endloop endfacet facet normal -0.132673 -0.894402 -0.427133 outer loop vertex 0.516166 2.594928 1.414190 vertex 0.259333 2.633026 1.414190 vertex 0.271671 2.758294 1.148050 endloop endfacet facet normal -0.132673 -0.894402 0.427133 outer loop vertex 0.259333 2.633026 -1.414191 vertex 0.516166 2.594928 -1.414191 vertex 0.540722 2.718384 -1.148051 endloop endfacet facet normal -0.132673 -0.894402 0.427133 outer loop vertex 0.540722 2.718384 -1.148051 vertex 0.271671 2.758294 -1.148051 vertex 0.259333 2.633026 -1.414191 endloop endfacet facet normal -0.117905 -0.794853 -0.595237 outer loop vertex 0.244498 2.482400 1.666711 vertex 0.486638 2.446482 1.666711 vertex 0.452423 2.274474 1.903180 endloop endfacet facet normal -0.117907 -0.794853 -0.595236 outer loop vertex 0.452423 2.274474 1.903180 vertex 0.227307 2.307867 1.903180 vertex 0.244498 2.482400 1.666711 endloop endfacet facet normal -0.035691 -0.240625 0.969962 outer loop vertex 0.057369 0.582453 -2.942356 vertex 0.114183 0.574026 -2.942356 vertex 0.169898 0.854121 -2.870821 endloop endfacet facet normal -0.035693 -0.240624 0.969962 outer loop vertex 0.169898 0.854121 -2.870821 vertex 0.085361 0.866661 -2.870821 vertex 0.057369 0.582453 -2.942356 endloop endfacet facet normal -0.142342 -0.959601 0.242704 outer loop vertex 0.281392 2.856999 -0.870855 vertex 0.560072 2.815661 -0.870855 vertex 0.574028 2.885821 -0.585272 endloop endfacet facet normal -0.142345 -0.959599 0.242707 outer loop vertex 0.574028 2.885821 -0.585272 vertex 0.288404 2.928190 -0.585272 vertex 0.281392 2.856999 -0.870855 endloop endfacet facet normal -0.098603 -0.664730 -0.740548 outer loop vertex 0.207928 2.111108 2.121321 vertex 0.413852 2.080562 2.121321 vertex 0.371295 1.866613 2.319032 endloop endfacet facet normal -0.098604 -0.664730 -0.740548 outer loop vertex 0.371295 1.866613 2.319032 vertex 0.186547 1.894018 2.319032 vertex 0.207928 2.111108 2.121321 endloop endfacet facet normal -0.062797 -0.423345 0.903790 outer loop vertex 0.112531 1.142523 -2.771639 vertex 0.223976 1.125992 -2.771639 vertex 0.275897 1.387018 -2.645764 endloop endfacet facet normal -0.062796 -0.423345 0.903790 outer loop vertex 0.275897 1.387018 -2.645764 vertex 0.138617 1.407381 -2.645764 vertex 0.112531 1.142523 -2.771639 endloop endfacet facet normal -0.146553 -0.987988 0.049008 outer loop vertex 0.292638 2.971180 -0.294052 vertex 0.582455 2.928190 -0.294052 vertex 0.585274 2.942358 -0.000001 endloop endfacet facet normal -0.146556 -0.987987 0.049012 outer loop vertex 0.585274 2.942358 -0.000001 vertex 0.294054 2.985557 -0.000001 vertex 0.292638 2.971180 -0.294052 endloop endfacet facet normal -0.075499 -0.508986 -0.857457 outer loop vertex 0.163369 1.658687 2.494409 vertex 0.325162 1.634688 2.494409 vertex 0.275898 1.387019 2.645763 endloop endfacet facet normal -0.075502 -0.508987 -0.857456 outer loop vertex 0.275898 1.387019 2.645763 vertex 0.138618 1.407383 2.645763 vertex 0.163369 1.658687 2.494409 endloop endfacet facet normal -0.087476 -0.589708 0.802865 outer loop vertex 0.163369 1.658686 -2.494410 vertex 0.325162 1.634686 -2.494410 vertex 0.371295 1.866612 -2.319033 endloop endfacet facet normal -0.087476 -0.589708 0.802865 outer loop vertex 0.371295 1.866612 -2.319033 vertex 0.186547 1.894017 -2.319033 vertex 0.163369 1.658686 -2.494410 endloop endfacet facet normal -0.049484 -0.333598 -0.941416 outer loop vertex 0.112531 1.142524 2.771639 vertex 0.223976 1.125993 2.771639 vertex 0.169898 0.854123 2.870821 endloop endfacet facet normal -0.049485 -0.333599 -0.941416 outer loop vertex 0.169898 0.854123 2.870821 vertex 0.085361 0.866663 2.870821 vertex 0.112531 1.142524 2.771639 endloop endfacet facet normal -0.145145 -0.978495 -0.146559 outer loop vertex 0.292638 2.971180 0.294051 vertex 0.582455 2.928190 0.294051 vertex 0.574028 2.885821 0.585271 endloop endfacet facet normal -0.145148 -0.978496 -0.146556 outer loop vertex 0.574028 2.885821 0.585271 vertex 0.288404 2.928190 0.585271 vertex 0.292638 2.971180 0.294051 endloop endfacet facet normal -0.163286 -0.651863 0.740549 outer loop vertex 0.371295 1.866612 -2.319033 vertex 0.552467 1.821230 -2.319033 vertex 0.615789 2.029978 -2.121322 endloop endfacet facet normal -0.163284 -0.651864 0.740548 outer loop vertex 0.615789 2.029978 -2.121322 vertex 0.413852 2.080561 -2.121322 vertex 0.371295 1.866612 -2.319033 endloop endfacet facet normal -0.059105 -0.235967 -0.969962 outer loop vertex 0.169898 0.854123 2.870821 vertex 0.252799 0.833358 2.870821 vertex 0.169898 0.560072 2.942356 endloop endfacet facet normal -0.059108 -0.235967 -0.969962 outer loop vertex 0.169898 0.560072 2.942356 vertex 0.114184 0.574028 2.942356 vertex 0.169898 0.854123 2.870821 endloop endfacet facet normal -0.235714 -0.941028 -0.242704 outer loop vertex 0.574028 2.885821 0.585271 vertex 0.854124 2.815661 0.585271 vertex 0.833358 2.747207 0.870853 endloop endfacet facet normal -0.235713 -0.941028 -0.242705 outer loop vertex 0.833358 2.747207 0.870853 vertex 0.560072 2.815661 0.870853 vertex 0.574028 2.885821 0.585271 endloop endfacet facet normal -0.195246 -0.779471 0.595235 outer loop vertex 0.452423 2.274474 -1.903181 vertex 0.673182 2.219177 -1.903181 vertex 0.724092 2.387002 -1.666712 endloop endfacet facet normal -0.195247 -0.779470 0.595236 outer loop vertex 0.724092 2.387002 -1.666712 vertex 0.486638 2.446481 -1.666712 vertex 0.452423 2.274474 -1.903181 endloop endfacet facet normal -0.219702 -0.877092 -0.427131 outer loop vertex 0.540723 2.718384 1.148050 vertex 0.804567 2.652294 1.148050 vertex 0.768028 2.531840 1.414190 endloop endfacet facet normal -0.219699 -0.877091 -0.427134 outer loop vertex 0.768028 2.531840 1.414190 vertex 0.516166 2.594928 1.414190 vertex 0.540723 2.718384 1.148050 endloop endfacet facet normal -0.219699 -0.877092 0.427131 outer loop vertex 0.516166 2.594928 -1.414191 vertex 0.768028 2.531840 -1.414191 vertex 0.804567 2.652294 -1.148051 endloop endfacet facet normal -0.219701 -0.877091 0.427133 outer loop vertex 0.804567 2.652294 -1.148051 vertex 0.540722 2.718384 -1.148051 vertex 0.516166 2.594928 -1.414191 endloop endfacet facet normal -0.195250 -0.779470 -0.595235 outer loop vertex 0.486638 2.446482 1.666711 vertex 0.724092 2.387002 1.666711 vertex 0.673182 2.219177 1.903180 endloop endfacet facet normal -0.195246 -0.779469 -0.595237 outer loop vertex 0.673182 2.219177 1.903180 vertex 0.452423 2.274474 1.903180 vertex 0.486638 2.446482 1.666711 endloop endfacet facet normal -0.059107 -0.235967 0.969962 outer loop vertex 0.114183 0.574026 -2.942356 vertex 0.169898 0.560070 -2.942356 vertex 0.252798 0.833356 -2.870821 endloop endfacet facet normal -0.059106 -0.235967 0.969962 outer loop vertex 0.252798 0.833356 -2.870821 vertex 0.169898 0.854121 -2.870821 vertex 0.114183 0.574026 -2.942356 endloop endfacet facet normal -0.235716 -0.941027 0.242707 outer loop vertex 0.560072 2.815661 -0.870855 vertex 0.833358 2.747206 -0.870855 vertex 0.854124 2.815661 -0.585272 endloop endfacet facet normal -0.235714 -0.941028 0.242705 outer loop vertex 0.854124 2.815661 -0.585272 vertex 0.574028 2.885821 -0.585272 vertex 0.560072 2.815661 -0.870855 endloop endfacet facet normal -0.163284 -0.651864 -0.740548 outer loop vertex 0.413852 2.080562 2.121321 vertex 0.615790 2.029979 2.121321 vertex 0.552467 1.821232 2.319032 endloop endfacet facet normal -0.163283 -0.651864 -0.740548 outer loop vertex 0.552467 1.821232 2.319032 vertex 0.371295 1.866613 2.319032 vertex 0.413852 2.080562 2.121321 endloop endfacet facet normal -0.103992 -0.415150 0.903790 outer loop vertex 0.223976 1.125992 -2.771639 vertex 0.333264 1.098616 -2.771639 vertex 0.410520 1.353296 -2.645764 endloop endfacet facet normal -0.103992 -0.415151 0.903790 outer loop vertex 0.410520 1.353296 -2.645764 vertex 0.275897 1.387018 -2.645764 vertex 0.223976 1.125992 -2.771639 endloop endfacet facet normal -0.242690 -0.968865 0.049010 outer loop vertex 0.582455 2.928190 -0.294052 vertex 0.866663 2.856999 -0.294052 vertex 0.870857 2.870823 -0.000001 endloop endfacet facet normal -0.242689 -0.968865 0.049009 outer loop vertex 0.870857 2.870823 -0.000001 vertex 0.585274 2.942358 -0.000001 vertex 0.582455 2.928190 -0.294052 endloop endfacet facet normal -0.125028 -0.499135 -0.857457 outer loop vertex 0.325162 1.634688 2.494409 vertex 0.483824 1.594945 2.494409 vertex 0.410521 1.353298 2.645763 endloop endfacet facet normal -0.125026 -0.499135 -0.857457 outer loop vertex 0.410521 1.353298 2.645763 vertex 0.275898 1.387019 2.645763 vertex 0.325162 1.634688 2.494409 endloop endfacet facet normal -0.144854 -0.578297 0.802864 outer loop vertex 0.325162 1.634686 -2.494410 vertex 0.483823 1.594944 -2.494410 vertex 0.552467 1.821230 -2.319033 endloop endfacet facet normal -0.144857 -0.578294 0.802865 outer loop vertex 0.552467 1.821230 -2.319033 vertex 0.371295 1.866612 -2.319033 vertex 0.325162 1.634686 -2.494410 endloop endfacet facet normal -0.081944 -0.327142 -0.941416 outer loop vertex 0.223976 1.125993 2.771639 vertex 0.333264 1.098618 2.771639 vertex 0.252799 0.833358 2.870821 endloop endfacet facet normal -0.081942 -0.327142 -0.941416 outer loop vertex 0.252799 0.833358 2.870821 vertex 0.169898 0.854123 2.870821 vertex 0.223976 1.125993 2.771639 endloop endfacet facet normal -0.240359 -0.959557 -0.146556 outer loop vertex 0.582455 2.928190 0.294051 vertex 0.866663 2.856999 0.294051 vertex 0.854124 2.815661 0.585271 endloop endfacet facet normal -0.240356 -0.959557 -0.146559 outer loop vertex 0.854124 2.815661 0.585271 vertex 0.574028 2.885821 0.585271 vertex 0.582455 2.928190 0.294051 endloop endfacet facet normal -0.180135 -0.719134 0.671116 outer loop vertex 0.413852 2.080561 -2.121322 vertex 0.615789 2.029978 -2.121322 vertex 0.673182 2.219177 -1.903181 endloop endfacet facet normal -0.180133 -0.719136 0.671115 outer loop vertex 0.673182 2.219177 -1.903181 vertex 0.452423 2.274474 -1.903181 vertex 0.413852 2.080561 -2.121322 endloop endfacet facet normal -0.035695 -0.142499 -0.989151 outer loop vertex 0.114184 0.574028 2.942356 vertex 0.169898 0.560072 2.942356 vertex 0.085362 0.281392 2.985554 endloop endfacet facet normal -0.035695 -0.142499 -0.989151 outer loop vertex 0.085362 0.281392 2.985554 vertex 0.057369 0.288404 2.985554 vertex 0.114184 0.574028 2.942356 endloop endfacet facet normal -0.228806 -0.913451 -0.336533 outer loop vertex 0.560072 2.815661 0.870853 vertex 0.833358 2.747207 0.870853 vertex 0.804567 2.652294 1.148050 endloop endfacet facet normal -0.228810 -0.913452 -0.336530 outer loop vertex 0.804567 2.652294 1.148050 vertex 0.540723 2.718384 1.148050 vertex 0.560072 2.815661 0.870853 endloop endfacet facet normal -0.208477 -0.832288 0.513647 outer loop vertex 0.486638 2.446481 -1.666712 vertex 0.724092 2.387002 -1.666712 vertex 0.768028 2.531840 -1.414191 endloop endfacet facet normal -0.208477 -0.832289 0.513647 outer loop vertex 0.768028 2.531840 -1.414191 vertex 0.516166 2.594928 -1.414191 vertex 0.486638 2.446481 -1.666712 endloop endfacet facet normal -0.208477 -0.832288 -0.513647 outer loop vertex 0.516166 2.594928 1.414190 vertex 0.768028 2.531840 1.414190 vertex 0.724092 2.387002 1.666711 endloop endfacet facet normal -0.208480 -0.832289 -0.513645 outer loop vertex 0.724092 2.387002 1.666711 vertex 0.486638 2.446482 1.666711 vertex 0.516166 2.594928 1.414190 endloop endfacet facet normal -0.035691 -0.142500 0.989151 outer loop vertex 0.057369 0.288401 -2.985554 vertex 0.085361 0.281390 -2.985554 vertex 0.169898 0.560070 -2.942356 endloop endfacet facet normal -0.035694 -0.142499 0.989151 outer loop vertex 0.169898 0.560070 -2.942356 vertex 0.114183 0.574026 -2.942356 vertex 0.057369 0.288401 -2.985554 endloop endfacet facet normal -0.228809 -0.913451 0.336531 outer loop vertex 0.540722 2.718384 -1.148051 vertex 0.804567 2.652294 -1.148051 vertex 0.833358 2.747206 -0.870855 endloop endfacet facet normal -0.228809 -0.913451 0.336531 outer loop vertex 0.833358 2.747206 -0.870855 vertex 0.560072 2.815661 -0.870855 vertex 0.540722 2.718384 -1.148051 endloop endfacet facet normal -0.180133 -0.719137 -0.671114 outer loop vertex 0.452423 2.274474 1.903180 vertex 0.673182 2.219177 1.903180 vertex 0.615790 2.029979 2.121321 endloop endfacet facet normal -0.180136 -0.719137 -0.671113 outer loop vertex 0.615790 2.029979 2.121321 vertex 0.413852 2.080562 2.121321 vertex 0.452423 2.274474 1.903180 endloop endfacet facet normal -0.081943 -0.327142 0.941416 outer loop vertex 0.169898 0.854121 -2.870821 vertex 0.252798 0.833356 -2.870821 vertex 0.333264 1.098616 -2.771639 endloop endfacet facet normal -0.081947 -0.327140 0.941416 outer loop vertex 0.333264 1.098616 -2.771639 vertex 0.223976 1.125992 -2.771639 vertex 0.169898 0.854121 -2.870821 endloop endfacet facet normal -0.240356 -0.959558 0.146556 outer loop vertex 0.574028 2.885821 -0.585272 vertex 0.854124 2.815661 -0.585272 vertex 0.866663 2.856999 -0.294052 endloop endfacet facet normal -0.240359 -0.959556 0.146559 outer loop vertex 0.866663 2.856999 -0.294052 vertex 0.582455 2.928190 -0.294052 vertex 0.574028 2.885821 -0.585272 endloop endfacet facet normal -0.144855 -0.578296 -0.802864 outer loop vertex 0.371295 1.866613 2.319032 vertex 0.552467 1.821232 2.319032 vertex 0.483824 1.594945 2.494409 endloop endfacet facet normal -0.144857 -0.578296 -0.802864 outer loop vertex 0.483824 1.594945 2.494409 vertex 0.325162 1.634688 2.494409 vertex 0.371295 1.866613 2.319032 endloop endfacet facet normal -0.125029 -0.499134 0.857457 outer loop vertex 0.275897 1.387018 -2.645764 vertex 0.410520 1.353296 -2.645764 vertex 0.483823 1.594944 -2.494410 endloop endfacet facet normal -0.125026 -0.499136 0.857456 outer loop vertex 0.483823 1.594944 -2.494410 vertex 0.325162 1.634686 -2.494410 vertex 0.275897 1.387018 -2.645764 endloop endfacet facet normal -0.103990 -0.415154 -0.903788 outer loop vertex 0.275898 1.387019 2.645763 vertex 0.410521 1.353298 2.645763 vertex 0.333264 1.098618 2.771639 endloop endfacet facet normal -0.103990 -0.415154 -0.903788 outer loop vertex 0.333264 1.098618 2.771639 vertex 0.223976 1.125993 2.771639 vertex 0.275898 1.387019 2.645763 endloop endfacet facet normal -0.242689 -0.968865 -0.049010 outer loop vertex 0.585274 2.942358 -0.000001 vertex 0.870857 2.870823 -0.000001 vertex 0.866663 2.856999 0.294051 endloop endfacet facet normal -0.242690 -0.968865 -0.049009 outer loop vertex 0.866663 2.856999 0.294051 vertex 0.582455 2.928190 0.294051 vertex 0.585274 2.942358 -0.000001 endloop endfacet facet normal -0.200840 -0.561313 0.802864 outer loop vertex 0.483823 1.594944 -2.494410 vertex 0.637826 1.539841 -2.494410 vertex 0.728318 1.758310 -2.319033 endloop endfacet facet normal -0.200840 -0.561314 0.802864 outer loop vertex 0.728318 1.758310 -2.319033 vertex 0.552467 1.821230 -2.319033 vertex 0.483823 1.594944 -2.494410 endloop endfacet facet normal -0.113616 -0.317534 -0.941416 outer loop vertex 0.333264 1.098618 2.771639 vertex 0.439343 1.060662 2.771639 vertex 0.333265 0.804566 2.870821 endloop endfacet facet normal -0.113618 -0.317534 -0.941415 outer loop vertex 0.333265 0.804566 2.870821 vertex 0.252799 0.833358 2.870821 vertex 0.333264 1.098618 2.771639 endloop endfacet facet normal -0.333252 -0.931378 -0.146557 outer loop vertex 0.866663 2.856999 0.294051 vertex 1.142525 2.758294 0.294051 vertex 1.125994 2.718384 0.585271 endloop endfacet facet normal -0.333253 -0.931377 -0.146556 outer loop vertex 1.125994 2.718384 0.585271 vertex 0.854124 2.815661 0.585271 vertex 0.866663 2.856999 0.294051 endloop endfacet facet normal -0.249755 -0.698014 0.671117 outer loop vertex 0.615789 2.029978 -2.121322 vertex 0.811797 1.959845 -2.121322 vertex 0.887458 2.142508 -1.903181 endloop endfacet facet normal -0.249753 -0.698016 0.671116 outer loop vertex 0.887458 2.142508 -1.903181 vertex 0.673182 2.219177 -1.903181 vertex 0.615789 2.029978 -2.121322 endloop endfacet facet normal -0.049490 -0.138314 -0.989151 outer loop vertex 0.169898 0.560072 2.942356 vertex 0.223977 0.540722 2.942356 vertex 0.112532 0.271670 2.985554 endloop endfacet facet normal -0.049492 -0.138314 -0.989151 outer loop vertex 0.112532 0.271670 2.985554 vertex 0.085362 0.281392 2.985554 vertex 0.169898 0.560072 2.942356 endloop endfacet facet normal -0.317239 -0.886625 -0.336534 outer loop vertex 0.833358 2.747207 0.870853 vertex 1.098619 2.652295 0.870853 vertex 1.060663 2.560661 1.148050 endloop endfacet facet normal -0.317240 -0.886625 -0.336533 outer loop vertex 1.060663 2.560661 1.148050 vertex 0.804567 2.652294 1.148050 vertex 0.833358 2.747207 0.870853 endloop endfacet facet normal -0.289052 -0.807846 0.513647 outer loop vertex 0.724092 2.387002 -1.666712 vertex 0.954572 2.304535 -1.666712 vertex 1.012493 2.444369 -1.414191 endloop endfacet facet normal -0.289052 -0.807846 0.513647 outer loop vertex 1.012493 2.444369 -1.414191 vertex 0.768028 2.531840 -1.414191 vertex 0.724092 2.387002 -1.666712 endloop endfacet facet normal -0.289052 -0.807846 -0.513647 outer loop vertex 0.768028 2.531840 1.414190 vertex 1.012493 2.444369 1.414190 vertex 0.954572 2.304535 1.666711 endloop endfacet facet normal -0.289052 -0.807846 -0.513647 outer loop vertex 0.954572 2.304535 1.666711 vertex 0.724092 2.387002 1.666711 vertex 0.768028 2.531840 1.414190 endloop endfacet facet normal -0.049492 -0.138314 0.989151 outer loop vertex 0.085361 0.281390 -2.985554 vertex 0.112531 0.271668 -2.985554 vertex 0.223976 0.540720 -2.942356 endloop endfacet facet normal -0.049491 -0.138314 0.989151 outer loop vertex 0.223976 0.540720 -2.942356 vertex 0.169898 0.560070 -2.942356 vertex 0.085361 0.281390 -2.985554 endloop endfacet facet normal -0.317238 -0.886627 0.336532 outer loop vertex 0.804567 2.652294 -1.148051 vertex 1.060663 2.560662 -1.148051 vertex 1.098619 2.652295 -0.870855 endloop endfacet facet normal -0.317237 -0.886627 0.336531 outer loop vertex 1.098619 2.652295 -0.870855 vertex 0.833358 2.747206 -0.870855 vertex 0.804567 2.652294 -1.148051 endloop endfacet facet normal -0.249754 -0.698017 -0.671115 outer loop vertex 0.673182 2.219177 1.903180 vertex 0.887458 2.142508 1.903180 vertex 0.811797 1.959846 2.121321 endloop endfacet facet normal -0.249756 -0.698017 -0.671114 outer loop vertex 0.811797 1.959846 2.121321 vertex 0.615790 2.029979 2.121321 vertex 0.673182 2.219177 1.903180 endloop endfacet facet normal -0.113615 -0.317534 0.941416 outer loop vertex 0.252798 0.833356 -2.870821 vertex 0.333264 0.804565 -2.870821 vertex 0.439343 1.060661 -2.771639 endloop endfacet facet normal -0.113614 -0.317535 0.941416 outer loop vertex 0.439343 1.060661 -2.771639 vertex 0.333264 1.098616 -2.771639 vertex 0.252798 0.833356 -2.870821 endloop endfacet facet normal -0.333253 -0.931377 0.146557 outer loop vertex 0.854124 2.815661 -0.585272 vertex 1.125994 2.718384 -0.585272 vertex 1.142525 2.758294 -0.294052 endloop endfacet facet normal -0.333252 -0.931378 0.146556 outer loop vertex 1.142525 2.758294 -0.294052 vertex 0.866663 2.856999 -0.294052 vertex 0.854124 2.815661 -0.585272 endloop endfacet facet normal -0.200841 -0.561312 -0.802864 outer loop vertex 0.552467 1.821232 2.319032 vertex 0.728319 1.758311 2.319032 vertex 0.637826 1.539842 2.494409 endloop endfacet facet normal -0.200841 -0.561312 -0.802864 outer loop vertex 0.637826 1.539842 2.494409 vertex 0.483824 1.594945 2.494409 vertex 0.552467 1.821232 2.319032 endloop endfacet facet normal -0.173347 -0.484477 0.857457 outer loop vertex 0.410520 1.353296 -2.645764 vertex 0.541190 1.306542 -2.645764 vertex 0.637826 1.539841 -2.494410 endloop endfacet facet normal -0.173348 -0.484476 0.857457 outer loop vertex 0.637826 1.539841 -2.494410 vertex 0.483823 1.594944 -2.494410 vertex 0.410520 1.353296 -2.645764 endloop endfacet facet normal -0.144184 -0.402962 -0.903788 outer loop vertex 0.410521 1.353298 2.645763 vertex 0.541191 1.306543 2.645763 vertex 0.439343 1.060662 2.771639 endloop endfacet facet normal -0.144183 -0.402962 -0.903788 outer loop vertex 0.439343 1.060662 2.771639 vertex 0.333264 1.098618 2.771639 vertex 0.410521 1.353298 2.645763 endloop endfacet facet normal -0.336484 -0.940413 -0.049011 outer loop vertex 0.870857 2.870823 -0.000001 vertex 1.148053 2.771641 -0.000001 vertex 1.142525 2.758294 0.294051 endloop endfacet facet normal -0.336484 -0.940413 -0.049010 outer loop vertex 1.142525 2.758294 0.294051 vertex 0.866663 2.856999 0.294051 vertex 0.870857 2.870823 -0.000001 endloop endfacet facet normal -0.226390 -0.632722 0.740548 outer loop vertex 0.552467 1.821230 -2.319033 vertex 0.728318 1.758310 -2.319033 vertex 0.811797 1.959845 -2.121322 endloop endfacet facet normal -0.226392 -0.632720 0.740549 outer loop vertex 0.811797 1.959845 -2.121322 vertex 0.615789 2.029978 -2.121322 vertex 0.552467 1.821230 -2.319033 endloop endfacet facet normal -0.081953 -0.229036 -0.969962 outer loop vertex 0.252799 0.833358 2.870821 vertex 0.333265 0.804566 2.870821 vertex 0.223977 0.540722 2.942356 endloop endfacet facet normal -0.081951 -0.229037 -0.969962 outer loop vertex 0.223977 0.540722 2.942356 vertex 0.169898 0.560072 2.942356 vertex 0.252799 0.833358 2.870821 endloop endfacet facet normal -0.326818 -0.913392 -0.242703 outer loop vertex 0.854124 2.815661 0.585271 vertex 1.125994 2.718384 0.585271 vertex 1.098619 2.652295 0.870853 endloop endfacet facet normal -0.326817 -0.913392 -0.242705 outer loop vertex 1.098619 2.652295 0.870853 vertex 0.833358 2.747207 0.870853 vertex 0.854124 2.815661 0.585271 endloop endfacet facet normal -0.270708 -0.756580 0.595235 outer loop vertex 0.673182 2.219177 -1.903181 vertex 0.887458 2.142508 -1.903181 vertex 0.954572 2.304535 -1.666712 endloop endfacet facet normal -0.270708 -0.756579 0.595235 outer loop vertex 0.954572 2.304535 -1.666712 vertex 0.724092 2.387002 -1.666712 vertex 0.673182 2.219177 -1.903181 endloop endfacet facet normal -0.304613 -0.851334 -0.427131 outer loop vertex 0.804567 2.652294 1.148050 vertex 1.060663 2.560661 1.148050 vertex 1.012493 2.444369 1.414190 endloop endfacet facet normal -0.304612 -0.851334 -0.427131 outer loop vertex 1.012493 2.444369 1.414190 vertex 0.768028 2.531840 1.414190 vertex 0.804567 2.652294 1.148050 endloop endfacet facet normal -0.304612 -0.851333 0.427133 outer loop vertex 0.768028 2.531840 -1.414191 vertex 1.012493 2.444369 -1.414191 vertex 1.060663 2.560662 -1.148051 endloop endfacet facet normal -0.304610 -0.851335 0.427131 outer loop vertex 1.060663 2.560662 -1.148051 vertex 0.804567 2.652294 -1.148051 vertex 0.768028 2.531840 -1.414191 endloop endfacet facet normal -0.270709 -0.756580 -0.595235 outer loop vertex 0.724092 2.387002 1.666711 vertex 0.954572 2.304535 1.666711 vertex 0.887458 2.142508 1.903180 endloop endfacet facet normal -0.270708 -0.756580 -0.595235 outer loop vertex 0.887458 2.142508 1.903180 vertex 0.673182 2.219177 1.903180 vertex 0.724092 2.387002 1.666711 endloop endfacet facet normal -0.081953 -0.229036 0.969962 outer loop vertex 0.169898 0.560070 -2.942356 vertex 0.223976 0.540720 -2.942356 vertex 0.333264 0.804565 -2.870821 endloop endfacet facet normal -0.081950 -0.229037 0.969962 outer loop vertex 0.333264 0.804565 -2.870821 vertex 0.252798 0.833356 -2.870821 vertex 0.169898 0.560070 -2.942356 endloop endfacet facet normal -0.326814 -0.913394 0.242703 outer loop vertex 0.833358 2.747206 -0.870855 vertex 1.098619 2.652295 -0.870855 vertex 1.125994 2.718384 -0.585272 endloop endfacet facet normal -0.326818 -0.913391 0.242707 outer loop vertex 1.125994 2.718384 -0.585272 vertex 0.854124 2.815661 -0.585272 vertex 0.833358 2.747206 -0.870855 endloop endfacet facet normal -0.226393 -0.632721 -0.740547 outer loop vertex 0.615790 2.029979 2.121321 vertex 0.811797 1.959846 2.121321 vertex 0.728319 1.758311 2.319032 endloop endfacet facet normal -0.226391 -0.632721 -0.740548 outer loop vertex 0.728319 1.758311 2.319032 vertex 0.552467 1.821232 2.319032 vertex 0.615790 2.029979 2.121321 endloop endfacet facet normal -0.144179 -0.402960 0.903789 outer loop vertex 0.333264 1.098616 -2.771639 vertex 0.439343 1.060661 -2.771639 vertex 0.541190 1.306542 -2.645764 endloop endfacet facet normal -0.144180 -0.402960 0.903790 outer loop vertex 0.541190 1.306542 -2.645764 vertex 0.410520 1.353296 -2.645764 vertex 0.333264 1.098616 -2.771639 endloop endfacet facet normal -0.336484 -0.940413 0.049011 outer loop vertex 0.866663 2.856999 -0.294052 vertex 1.142525 2.758294 -0.294052 vertex 1.148053 2.771641 -0.000001 endloop endfacet facet normal -0.336484 -0.940413 0.049010 outer loop vertex 1.148053 2.771641 -0.000001 vertex 0.870857 2.870823 -0.000001 vertex 0.866663 2.856999 -0.294052 endloop endfacet facet normal -0.173349 -0.484476 -0.857457 outer loop vertex 0.483824 1.594945 2.494409 vertex 0.637826 1.539842 2.494409 vertex 0.541191 1.306543 2.645763 endloop endfacet facet normal -0.173350 -0.484476 -0.857457 outer loop vertex 0.541191 1.306543 2.645763 vertex 0.410521 1.353298 2.645763 vertex 0.483824 1.594945 2.494409 endloop endfacet facet normal -0.220002 -0.465153 0.857457 outer loop vertex 0.541190 1.306542 -2.645764 vertex 0.666647 1.247205 -2.645764 vertex 0.785685 1.469908 -2.494410 endloop endfacet facet normal -0.220003 -0.465152 0.857457 outer loop vertex 0.785685 1.469908 -2.494410 vertex 0.637826 1.539841 -2.494410 vertex 0.541190 1.306542 -2.645764 endloop endfacet facet normal -0.182986 -0.386889 -0.903788 outer loop vertex 0.541191 1.306543 2.645763 vertex 0.666648 1.247206 2.645763 vertex 0.541190 1.012492 2.771639 endloop endfacet facet normal -0.182985 -0.386889 -0.903788 outer loop vertex 0.541190 1.012492 2.771639 vertex 0.439343 1.060662 2.771639 vertex 0.541191 1.306543 2.645763 endloop endfacet facet normal -0.427040 -0.902903 -0.049014 outer loop vertex 1.148053 2.771641 -0.000001 vertex 1.414194 2.645766 -0.000001 vertex 1.407383 2.633025 0.294051 endloop endfacet facet normal -0.427043 -0.902902 -0.049011 outer loop vertex 1.407383 2.633025 0.294051 vertex 1.142525 2.758294 0.294051 vertex 1.148053 2.771641 -0.000001 endloop endfacet facet normal -0.287318 -0.607486 0.740547 outer loop vertex 0.728318 1.758310 -2.319033 vertex 0.897156 1.678456 -2.319033 vertex 0.999986 1.870838 -2.121322 endloop endfacet facet normal -0.287319 -0.607484 0.740548 outer loop vertex 0.999986 1.870838 -2.121322 vertex 0.811797 1.959845 -2.121322 vertex 0.728318 1.758310 -2.319033 endloop endfacet facet normal -0.104005 -0.219902 -0.969962 outer loop vertex 0.333265 0.804566 2.870821 vertex 0.410521 0.768027 2.870821 vertex 0.275898 0.516165 2.942356 endloop endfacet facet normal -0.104006 -0.219901 -0.969962 outer loop vertex 0.275898 0.516165 2.942356 vertex 0.223977 0.540722 2.942356 vertex 0.333265 0.804566 2.870821 endloop endfacet facet normal -0.414771 -0.876960 -0.242705 outer loop vertex 1.125994 2.718384 0.585271 vertex 1.387020 2.594928 0.585271 vertex 1.353299 2.531840 0.870853 endloop endfacet facet normal -0.414772 -0.876960 -0.242703 outer loop vertex 1.353299 2.531840 0.870853 vertex 1.098619 2.652295 0.870853 vertex 1.125994 2.718384 0.585271 endloop endfacet facet normal -0.343563 -0.726401 0.595237 outer loop vertex 0.887458 2.142508 -1.903181 vertex 1.093187 2.045205 -1.903181 vertex 1.175860 2.199874 -1.666712 endloop endfacet facet normal -0.343561 -0.726403 0.595235 outer loop vertex 1.175860 2.199874 -1.666712 vertex 0.954572 2.304535 -1.666712 vertex 0.887458 2.142508 -1.903181 endloop endfacet facet normal -0.386591 -0.817378 -0.427130 outer loop vertex 1.060663 2.560661 1.148050 vertex 1.306544 2.444368 1.148050 vertex 1.247208 2.333357 1.414190 endloop endfacet facet normal -0.386591 -0.817378 -0.427131 outer loop vertex 1.247208 2.333357 1.414190 vertex 1.012493 2.444369 1.414190 vertex 1.060663 2.560661 1.148050 endloop endfacet facet normal -0.386591 -0.817378 0.427131 outer loop vertex 1.012493 2.444369 -1.414191 vertex 1.247208 2.333357 -1.414191 vertex 1.306544 2.444368 -1.148051 endloop endfacet facet normal -0.386594 -0.817376 0.427133 outer loop vertex 1.306544 2.444368 -1.148051 vertex 1.060663 2.560662 -1.148051 vertex 1.012493 2.444369 -1.414191 endloop endfacet facet normal -0.343562 -0.726403 -0.595234 outer loop vertex 0.954572 2.304535 1.666711 vertex 1.175860 2.199874 1.666711 vertex 1.093187 2.045206 1.903180 endloop endfacet facet normal -0.343561 -0.726403 -0.595235 outer loop vertex 1.093187 2.045206 1.903180 vertex 0.887458 2.142508 1.903180 vertex 0.954572 2.304535 1.666711 endloop endfacet facet normal -0.104006 -0.219901 0.969962 outer loop vertex 0.223976 0.540720 -2.942356 vertex 0.275897 0.516163 -2.942356 vertex 0.410520 0.768025 -2.870821 endloop endfacet facet normal -0.104007 -0.219900 0.969962 outer loop vertex 0.410520 0.768025 -2.870821 vertex 0.333264 0.804565 -2.870821 vertex 0.223976 0.540720 -2.942356 endloop endfacet facet normal -0.414772 -0.876960 0.242704 outer loop vertex 1.098619 2.652295 -0.870855 vertex 1.353299 2.531840 -0.870855 vertex 1.387020 2.594928 -0.585272 endloop endfacet facet normal -0.414771 -0.876961 0.242703 outer loop vertex 1.387020 2.594928 -0.585272 vertex 1.125994 2.718384 -0.585272 vertex 1.098619 2.652295 -0.870855 endloop endfacet facet normal -0.287318 -0.607485 -0.740547 outer loop vertex 0.811797 1.959846 2.121321 vertex 0.999987 1.870839 2.121321 vertex 0.897156 1.678457 2.319032 endloop endfacet facet normal -0.287319 -0.607485 -0.740547 outer loop vertex 0.897156 1.678457 2.319032 vertex 0.728319 1.758311 2.319032 vertex 0.811797 1.959846 2.121321 endloop endfacet facet normal -0.182984 -0.386887 0.903789 outer loop vertex 0.439343 1.060661 -2.771639 vertex 0.541190 1.012491 -2.771639 vertex 0.666647 1.247205 -2.645764 endloop endfacet facet normal -0.182985 -0.386887 0.903790 outer loop vertex 0.666647 1.247205 -2.645764 vertex 0.541190 1.306542 -2.645764 vertex 0.439343 1.060661 -2.771639 endloop endfacet facet normal -0.427043 -0.902902 0.049014 outer loop vertex 1.142525 2.758294 -0.294052 vertex 1.407383 2.633025 -0.294052 vertex 1.414194 2.645766 -0.000001 endloop endfacet facet normal -0.427040 -0.902903 0.049011 outer loop vertex 1.414194 2.645766 -0.000001 vertex 1.148053 2.771641 -0.000001 vertex 1.142525 2.758294 -0.294052 endloop endfacet facet normal -0.220000 -0.465152 -0.857457 outer loop vertex 0.637826 1.539842 2.494409 vertex 0.785685 1.469910 2.494409 vertex 0.666648 1.247206 2.645763 endloop endfacet facet normal -0.220002 -0.465152 -0.857457 outer loop vertex 0.666648 1.247206 2.645763 vertex 0.541191 1.306543 2.645763 vertex 0.637826 1.539842 2.494409 endloop endfacet facet normal -0.254894 -0.538921 0.802865 outer loop vertex 0.637826 1.539841 -2.494410 vertex 0.785685 1.469908 -2.494410 vertex 0.897156 1.678456 -2.319033 endloop endfacet facet normal -0.254891 -0.538925 0.802864 outer loop vertex 0.897156 1.678456 -2.319033 vertex 0.728318 1.758310 -2.319033 vertex 0.637826 1.539841 -2.494410 endloop endfacet facet normal -0.144193 -0.304869 -0.941416 outer loop vertex 0.439343 1.060662 2.771639 vertex 0.541190 1.012492 2.771639 vertex 0.410521 0.768027 2.870821 endloop endfacet facet normal -0.144191 -0.304870 -0.941416 outer loop vertex 0.410521 0.768027 2.870821 vertex 0.333265 0.804566 2.870821 vertex 0.439343 1.060662 2.771639 endloop endfacet facet normal -0.422940 -0.894228 -0.146555 outer loop vertex 1.142525 2.758294 0.294051 vertex 1.407383 2.633025 0.294051 vertex 1.387020 2.594928 0.585271 endloop endfacet facet normal -0.422938 -0.894228 -0.146557 outer loop vertex 1.387020 2.594928 0.585271 vertex 1.125994 2.718384 0.585271 vertex 1.142525 2.758294 0.294051 endloop endfacet facet normal -0.316969 -0.670174 0.671117 outer loop vertex 0.811797 1.959845 -2.121322 vertex 0.999986 1.870838 -2.121322 vertex 1.093187 2.045205 -1.903181 endloop endfacet facet normal -0.316970 -0.670173 0.671117 outer loop vertex 1.093187 2.045205 -1.903181 vertex 0.887458 2.142508 -1.903181 vertex 0.811797 1.959845 -2.121322 endloop endfacet facet normal -0.062809 -0.132798 -0.989151 outer loop vertex 0.223977 0.540722 2.942356 vertex 0.275898 0.516165 2.942356 vertex 0.138618 0.259332 2.985554 endloop endfacet facet normal -0.062810 -0.132797 -0.989151 outer loop vertex 0.138618 0.259332 2.985554 vertex 0.112532 0.271670 2.985554 vertex 0.223977 0.540722 2.942356 endloop endfacet facet normal -0.402617 -0.851261 -0.336533 outer loop vertex 1.098619 2.652295 0.870853 vertex 1.353299 2.531840 0.870853 vertex 1.306544 2.444368 1.148050 endloop endfacet facet normal -0.402617 -0.851261 -0.336534 outer loop vertex 1.306544 2.444368 1.148050 vertex 1.060663 2.560661 1.148050 vertex 1.098619 2.652295 0.870853 endloop endfacet facet normal -0.366842 -0.775626 0.513646 outer loop vertex 0.954572 2.304535 -1.666712 vertex 1.175860 2.199874 -1.666712 vertex 1.247208 2.333357 -1.414191 endloop endfacet facet normal -0.366843 -0.775624 0.513647 outer loop vertex 1.247208 2.333357 -1.414191 vertex 1.012493 2.444369 -1.414191 vertex 0.954572 2.304535 -1.666712 endloop endfacet facet normal -0.366843 -0.775625 -0.513646 outer loop vertex 1.012493 2.444369 1.414190 vertex 1.247208 2.333357 1.414190 vertex 1.175860 2.199874 1.666711 endloop endfacet facet normal -0.366842 -0.775625 -0.513647 outer loop vertex 1.175860 2.199874 1.666711 vertex 0.954572 2.304535 1.666711 vertex 1.012493 2.444369 1.414190 endloop endfacet facet normal -0.062810 -0.132797 0.989151 outer loop vertex 0.112531 0.271668 -2.985554 vertex 0.138617 0.259330 -2.985554 vertex 0.275897 0.516163 -2.942356 endloop endfacet facet normal -0.062809 -0.132798 0.989151 outer loop vertex 0.275897 0.516163 -2.942356 vertex 0.223976 0.540720 -2.942356 vertex 0.112531 0.271668 -2.985554 endloop endfacet facet normal -0.402619 -0.851259 0.336534 outer loop vertex 1.060663 2.560662 -1.148051 vertex 1.306544 2.444368 -1.148051 vertex 1.353299 2.531840 -0.870855 endloop endfacet facet normal -0.402618 -0.851261 0.336532 outer loop vertex 1.353299 2.531840 -0.870855 vertex 1.098619 2.652295 -0.870855 vertex 1.060663 2.560662 -1.148051 endloop endfacet facet normal -0.316967 -0.670175 -0.671116 outer loop vertex 0.887458 2.142508 1.903180 vertex 1.093187 2.045206 1.903180 vertex 0.999987 1.870839 2.121321 endloop endfacet facet normal -0.316969 -0.670175 -0.671115 outer loop vertex 0.999987 1.870839 2.121321 vertex 0.811797 1.959846 2.121321 vertex 0.887458 2.142508 1.903180 endloop endfacet facet normal -0.144194 -0.304867 0.941416 outer loop vertex 0.333264 0.804565 -2.870821 vertex 0.410520 0.768025 -2.870821 vertex 0.541190 1.012491 -2.771639 endloop endfacet facet normal -0.144192 -0.304869 0.941416 outer loop vertex 0.541190 1.012491 -2.771639 vertex 0.439343 1.060661 -2.771639 vertex 0.333264 0.804565 -2.870821 endloop endfacet facet normal -0.422938 -0.894229 0.146555 outer loop vertex 1.125994 2.718384 -0.585272 vertex 1.387020 2.594928 -0.585272 vertex 1.407383 2.633025 -0.294052 endloop endfacet facet normal -0.422940 -0.894227 0.146557 outer loop vertex 1.407383 2.633025 -0.294052 vertex 1.142525 2.758294 -0.294052 vertex 1.125994 2.718384 -0.585272 endloop endfacet facet normal -0.254892 -0.538924 -0.802864 outer loop vertex 0.728319 1.758311 2.319032 vertex 0.897156 1.678457 2.319032 vertex 0.785685 1.469910 2.494409 endloop endfacet facet normal -0.254892 -0.538924 -0.802865 outer loop vertex 0.785685 1.469910 2.494409 vertex 0.637826 1.539842 2.494409 vertex 0.728319 1.758311 2.319032 endloop endfacet facet normal -0.220025 -0.367088 0.903790 outer loop vertex 0.541190 1.012491 -2.771639 vertex 0.637825 0.954570 -2.771639 vertex 0.785685 1.175857 -2.645764 endloop endfacet facet normal -0.220023 -0.367089 0.903789 outer loop vertex 0.785685 1.175857 -2.645764 vertex 0.666647 1.247205 -2.645764 vertex 0.541190 1.012491 -2.771639 endloop endfacet facet normal -0.513484 -0.856699 0.049012 outer loop vertex 1.407383 2.633025 -0.294052 vertex 1.658688 2.482399 -0.294052 vertex 1.666714 2.494411 -0.000001 endloop endfacet facet normal -0.513486 -0.856697 0.049014 outer loop vertex 1.666714 2.494411 -0.000001 vertex 1.414194 2.645766 -0.000001 vertex 1.407383 2.633025 -0.294052 endloop endfacet facet normal -0.264537 -0.441349 -0.857456 outer loop vertex 0.785685 1.469910 2.494409 vertex 0.925978 1.385821 2.494409 vertex 0.785686 1.175858 2.645763 endloop endfacet facet normal -0.264532 -0.441350 -0.857458 outer loop vertex 0.785686 1.175858 2.645763 vertex 0.666648 1.247206 2.645763 vertex 0.785685 1.469910 2.494409 endloop endfacet facet normal -0.306487 -0.511346 0.802864 outer loop vertex 0.785685 1.469908 -2.494410 vertex 0.925978 1.385820 -2.494410 vertex 1.057353 1.582437 -2.319033 endloop endfacet facet normal -0.306489 -0.511343 0.802865 outer loop vertex 1.057353 1.582437 -2.319033 vertex 0.897156 1.678456 -2.319033 vertex 0.785685 1.469908 -2.494410 endloop endfacet facet normal -0.173379 -0.289268 -0.941416 outer loop vertex 0.541190 1.012492 2.771639 vertex 0.637826 0.954571 2.771639 vertex 0.483824 0.724091 2.870821 endloop endfacet facet normal -0.173380 -0.289268 -0.941416 outer loop vertex 0.483824 0.724091 2.870821 vertex 0.410521 0.768027 2.870821 vertex 0.541190 1.012492 2.771639 endloop endfacet facet normal -0.508550 -0.848468 -0.146557 outer loop vertex 1.407383 2.633025 0.294051 vertex 1.658688 2.482399 0.294051 vertex 1.634688 2.446481 0.585271 endloop endfacet facet normal -0.508553 -0.848467 -0.146555 outer loop vertex 1.634688 2.446481 0.585271 vertex 1.387020 2.594928 0.585271 vertex 1.407383 2.633025 0.294051 endloop endfacet facet normal -0.381131 -0.635879 0.671116 outer loop vertex 0.999986 1.870838 -2.121322 vertex 1.178545 1.763814 -2.121322 vertex 1.288388 1.928206 -1.903181 endloop endfacet facet normal -0.381131 -0.635878 0.671117 outer loop vertex 1.288388 1.928206 -1.903181 vertex 1.093187 2.045205 -1.903181 vertex 0.999986 1.870838 -2.121322 endloop endfacet facet normal -0.075522 -0.126002 -0.989151 outer loop vertex 0.275898 0.516165 2.942356 vertex 0.325163 0.486637 2.942356 vertex 0.163370 0.244497 2.985554 endloop endfacet facet normal -0.075520 -0.126004 -0.989151 outer loop vertex 0.163370 0.244497 2.985554 vertex 0.138618 0.259332 2.985554 vertex 0.275898 0.516165 2.942356 endloop endfacet facet normal -0.484117 -0.807698 -0.336532 outer loop vertex 1.353299 2.531840 0.870853 vertex 1.594946 2.387002 0.870853 vertex 1.539843 2.304534 1.148050 endloop endfacet facet normal -0.484116 -0.807699 -0.336533 outer loop vertex 1.539843 2.304534 1.148050 vertex 1.306544 2.444368 1.148050 vertex 1.353299 2.531840 0.870853 endloop endfacet facet normal -0.441101 -0.735934 0.513645 outer loop vertex 1.175860 2.199874 -1.666712 vertex 1.385823 2.074027 -1.666712 vertex 1.469911 2.199874 -1.414191 endloop endfacet facet normal -0.441102 -0.735933 0.513646 outer loop vertex 1.469911 2.199874 -1.414191 vertex 1.247208 2.333357 -1.414191 vertex 1.175860 2.199874 -1.666712 endloop endfacet facet normal -0.441102 -0.735933 -0.513645 outer loop vertex 1.247208 2.333357 1.414190 vertex 1.469911 2.199874 1.414190 vertex 1.385823 2.074027 1.666711 endloop endfacet facet normal -0.441101 -0.735933 -0.513646 outer loop vertex 1.385823 2.074027 1.666711 vertex 1.175860 2.199874 1.666711 vertex 1.247208 2.333357 1.414190 endloop endfacet facet normal -0.075520 -0.126004 0.989151 outer loop vertex 0.138617 0.259330 -2.985554 vertex 0.163369 0.244495 -2.985554 vertex 0.325162 0.486635 -2.942356 endloop endfacet facet normal -0.075522 -0.126002 0.989151 outer loop vertex 0.325162 0.486635 -2.942356 vertex 0.275897 0.516163 -2.942356 vertex 0.138617 0.259330 -2.985554 endloop endfacet facet normal -0.484114 -0.807701 0.336530 outer loop vertex 1.306544 2.444368 -1.148051 vertex 1.539843 2.304535 -1.148051 vertex 1.594946 2.387002 -0.870855 endloop endfacet facet normal -0.484117 -0.807698 0.336534 outer loop vertex 1.594946 2.387002 -0.870855 vertex 1.353299 2.531840 -0.870855 vertex 1.306544 2.444368 -1.148051 endloop endfacet facet normal -0.381135 -0.635879 -0.671114 outer loop vertex 1.093187 2.045206 1.903180 vertex 1.288388 1.928206 1.903180 vertex 1.178546 1.763815 2.121321 endloop endfacet facet normal -0.381131 -0.635880 -0.671116 outer loop vertex 1.178546 1.763815 2.121321 vertex 0.999987 1.870839 2.121321 vertex 1.093187 2.045206 1.903180 endloop endfacet facet normal -0.173379 -0.289267 0.941416 outer loop vertex 0.410520 0.768025 -2.870821 vertex 0.483823 0.724089 -2.870821 vertex 0.637825 0.954570 -2.771639 endloop endfacet facet normal -0.173380 -0.289266 0.941416 outer loop vertex 0.637825 0.954570 -2.771639 vertex 0.541190 1.012491 -2.771639 vertex 0.410520 0.768025 -2.870821 endloop endfacet facet normal -0.508552 -0.848467 0.146556 outer loop vertex 1.387020 2.594928 -0.585272 vertex 1.634689 2.446481 -0.585272 vertex 1.658688 2.482399 -0.294052 endloop endfacet facet normal -0.508551 -0.848468 0.146555 outer loop vertex 1.658688 2.482399 -0.294052 vertex 1.407383 2.633025 -0.294052 vertex 1.387020 2.594928 -0.585272 endloop endfacet facet normal -0.306488 -0.511344 -0.802865 outer loop vertex 0.897156 1.678457 2.319032 vertex 1.057354 1.582438 2.319032 vertex 0.925978 1.385821 2.494409 endloop endfacet facet normal -0.306490 -0.511344 -0.802864 outer loop vertex 0.925978 1.385821 2.494409 vertex 0.785685 1.469910 2.494409 vertex 0.897156 1.678457 2.319032 endloop endfacet facet normal -0.264533 -0.441351 0.857456 outer loop vertex 0.666647 1.247205 -2.645764 vertex 0.785685 1.175857 -2.645764 vertex 0.925978 1.385820 -2.494410 endloop endfacet facet normal -0.264534 -0.441350 0.857457 outer loop vertex 0.925978 1.385820 -2.494410 vertex 0.785685 1.469908 -2.494410 vertex 0.666647 1.247205 -2.645764 endloop endfacet facet normal -0.220024 -0.367092 -0.903788 outer loop vertex 0.666648 1.247206 2.645763 vertex 0.785686 1.175858 2.645763 vertex 0.637826 0.954571 2.771639 endloop endfacet facet normal -0.220025 -0.367092 -0.903788 outer loop vertex 0.637826 0.954571 2.771639 vertex 0.541190 1.012492 2.771639 vertex 0.666648 1.247206 2.645763 endloop endfacet facet normal -0.513486 -0.856697 -0.049011 outer loop vertex 1.414194 2.645766 -0.000001 vertex 1.666714 2.494411 -0.000001 vertex 1.658688 2.482399 0.294051 endloop endfacet facet normal -0.513484 -0.856698 -0.049014 outer loop vertex 1.658688 2.482399 0.294051 vertex 1.407383 2.633025 0.294051 vertex 1.414194 2.645766 -0.000001 endloop endfacet facet normal -0.345480 -0.576396 0.740548 outer loop vertex 0.897156 1.678456 -2.319033 vertex 1.057353 1.582437 -2.319033 vertex 1.178545 1.763814 -2.121322 endloop endfacet facet normal -0.345479 -0.576398 0.740547 outer loop vertex 1.178545 1.763814 -2.121322 vertex 0.999986 1.870838 -2.121322 vertex 0.897156 1.678456 -2.319033 endloop endfacet facet normal -0.125059 -0.208648 -0.969962 outer loop vertex 0.410521 0.768027 2.870821 vertex 0.483824 0.724091 2.870821 vertex 0.325163 0.486637 2.942356 endloop endfacet facet normal -0.125058 -0.208649 -0.969962 outer loop vertex 0.325163 0.486637 2.942356 vertex 0.275898 0.516165 2.942356 vertex 0.410521 0.768027 2.870821 endloop endfacet facet normal -0.498733 -0.832082 -0.242704 outer loop vertex 1.387020 2.594928 0.585271 vertex 1.634688 2.446481 0.585271 vertex 1.594946 2.387002 0.870853 endloop endfacet facet normal -0.498732 -0.832082 -0.242705 outer loop vertex 1.594946 2.387002 0.870853 vertex 1.353299 2.531840 0.870853 vertex 1.387020 2.594928 0.585271 endloop endfacet facet normal -0.413108 -0.689228 0.595237 outer loop vertex 1.093187 2.045205 -1.903181 vertex 1.288388 1.928206 -1.903181 vertex 1.385823 2.074027 -1.666712 endloop endfacet facet normal -0.413107 -0.689228 0.595237 outer loop vertex 1.385823 2.074027 -1.666712 vertex 1.175860 2.199874 -1.666712 vertex 1.093187 2.045205 -1.903181 endloop endfacet facet normal -0.464846 -0.775550 -0.427131 outer loop vertex 1.306544 2.444368 1.148050 vertex 1.539843 2.304534 1.148050 vertex 1.469911 2.199874 1.414190 endloop endfacet facet normal -0.464847 -0.775549 -0.427130 outer loop vertex 1.469911 2.199874 1.414190 vertex 1.247208 2.333357 1.414190 vertex 1.306544 2.444368 1.148050 endloop endfacet facet normal -0.464846 -0.775548 0.427133 outer loop vertex 1.247208 2.333357 -1.414191 vertex 1.469911 2.199874 -1.414191 vertex 1.539843 2.304535 -1.148051 endloop endfacet facet normal -0.464844 -0.775551 0.427131 outer loop vertex 1.539843 2.304535 -1.148051 vertex 1.306544 2.444368 -1.148051 vertex 1.247208 2.333357 -1.414191 endloop endfacet facet normal -0.413107 -0.689228 -0.595237 outer loop vertex 1.175860 2.199874 1.666711 vertex 1.385823 2.074027 1.666711 vertex 1.288388 1.928206 1.903180 endloop endfacet facet normal -0.413111 -0.689228 -0.595235 outer loop vertex 1.288388 1.928206 1.903180 vertex 1.093187 2.045206 1.903180 vertex 1.175860 2.199874 1.666711 endloop endfacet facet normal -0.125058 -0.208649 0.969962 outer loop vertex 0.275897 0.516163 -2.942356 vertex 0.325162 0.486635 -2.942356 vertex 0.483823 0.724089 -2.870821 endloop endfacet facet normal -0.125058 -0.208648 0.969962 outer loop vertex 0.483823 0.724089 -2.870821 vertex 0.410520 0.768025 -2.870821 vertex 0.275897 0.516163 -2.942356 endloop endfacet facet normal -0.498732 -0.832082 0.242705 outer loop vertex 1.353299 2.531840 -0.870855 vertex 1.594946 2.387002 -0.870855 vertex 1.634689 2.446481 -0.585272 endloop endfacet facet normal -0.498731 -0.832083 0.242704 outer loop vertex 1.634689 2.446481 -0.585272 vertex 1.387020 2.594928 -0.585272 vertex 1.353299 2.531840 -0.870855 endloop endfacet facet normal -0.345479 -0.576397 -0.740548 outer loop vertex 0.999987 1.870839 2.121321 vertex 1.178546 1.763815 2.121321 vertex 1.057354 1.582438 2.319032 endloop endfacet facet normal -0.345479 -0.576397 -0.740547 outer loop vertex 1.057354 1.582438 2.319032 vertex 0.897156 1.678457 2.319032 vertex 0.999987 1.870839 2.121321 endloop endfacet facet normal -0.200897 -0.270883 0.941415 outer loop vertex 0.483823 0.724089 -2.870821 vertex 0.552467 0.673180 -2.870821 vertex 0.728318 0.887455 -2.771639 endloop endfacet facet normal -0.200900 -0.270879 0.941416 outer loop vertex 0.728318 0.887455 -2.771639 vertex 0.637825 0.954570 -2.771639 vertex 0.483823 0.724089 -2.870821 endloop endfacet facet normal -0.589269 -0.794533 0.146559 outer loop vertex 1.634689 2.446481 -0.585272 vertex 1.866614 2.274473 -0.585272 vertex 1.894019 2.307866 -0.294052 endloop endfacet facet normal -0.589266 -0.794536 0.146556 outer loop vertex 1.894019 2.307866 -0.294052 vertex 1.658688 2.482399 -0.294052 vertex 1.634689 2.446481 -0.585272 endloop endfacet facet normal -0.355136 -0.478841 -0.802863 outer loop vertex 1.057354 1.582438 2.319032 vertex 1.207368 1.471179 2.319032 vertex 1.057354 1.288387 2.494409 endloop endfacet facet normal -0.355130 -0.478843 -0.802865 outer loop vertex 1.057354 1.288387 2.494409 vertex 0.925978 1.385821 2.494409 vertex 1.057354 1.582438 2.319032 endloop endfacet facet normal -0.306522 -0.413295 0.857456 outer loop vertex 0.785685 1.175857 -2.645764 vertex 0.897156 1.093184 -2.645764 vertex 1.057353 1.288385 -2.494410 endloop endfacet facet normal -0.306522 -0.413295 0.857456 outer loop vertex 1.057353 1.288385 -2.494410 vertex 0.925978 1.385820 -2.494410 vertex 0.785685 1.175857 -2.645764 endloop endfacet facet normal -0.254946 -0.343757 -0.903788 outer loop vertex 0.785686 1.175858 2.645763 vertex 0.897157 1.093186 2.645763 vertex 0.728319 0.887457 2.771639 endloop endfacet facet normal -0.254947 -0.343757 -0.903788 outer loop vertex 0.728319 0.887457 2.771639 vertex 0.637826 0.954571 2.771639 vertex 0.785686 1.175858 2.645763 endloop endfacet facet normal -0.594983 -0.802242 -0.049010 outer loop vertex 1.666714 2.494411 -0.000001 vertex 1.903184 2.319033 -0.000001 vertex 1.894019 2.307866 0.294051 endloop endfacet facet normal -0.594982 -0.802243 -0.049011 outer loop vertex 1.894019 2.307866 0.294051 vertex 1.658688 2.482399 0.294051 vertex 1.666714 2.494411 -0.000001 endloop endfacet facet normal -0.400312 -0.539757 0.740549 outer loop vertex 1.057353 1.582437 -2.319033 vertex 1.207367 1.471179 -2.319033 vertex 1.345754 1.639804 -2.121322 endloop endfacet facet normal -0.400311 -0.539760 0.740548 outer loop vertex 1.345754 1.639804 -2.121322 vertex 1.178545 1.763814 -2.121322 vertex 1.057353 1.582437 -2.319033 endloop endfacet facet normal -0.144908 -0.195385 -0.969962 outer loop vertex 0.483824 0.724091 2.870821 vertex 0.552468 0.673181 2.870821 vertex 0.371296 0.452422 2.942356 endloop endfacet facet normal -0.144909 -0.195385 -0.969962 outer loop vertex 0.371296 0.452422 2.942356 vertex 0.325163 0.486637 2.942356 vertex 0.483824 0.724091 2.870821 endloop endfacet facet normal -0.577888 -0.779192 -0.242704 outer loop vertex 1.634688 2.446481 0.585271 vertex 1.866614 2.274473 0.585271 vertex 1.821233 2.219176 0.870853 endloop endfacet facet normal -0.577888 -0.779192 -0.242704 outer loop vertex 1.821233 2.219176 0.870853 vertex 1.594946 2.387002 0.870853 vertex 1.634688 2.446481 0.585271 endloop endfacet facet normal -0.478676 -0.645417 0.595236 outer loop vertex 1.288388 1.928206 -1.903181 vertex 1.471181 1.792637 -1.903181 vertex 1.582440 1.928205 -1.666712 endloop endfacet facet normal -0.478676 -0.645416 0.595237 outer loop vertex 1.582440 1.928205 -1.666712 vertex 1.385823 2.074027 -1.666712 vertex 1.288388 1.928206 -1.903181 endloop endfacet facet normal -0.538627 -0.726253 -0.427128 outer loop vertex 1.539843 2.304534 1.148050 vertex 1.758312 2.142506 1.148050 vertex 1.678459 2.045205 1.414190 endloop endfacet facet normal -0.538623 -0.726254 -0.427131 outer loop vertex 1.678459 2.045205 1.414190 vertex 1.469911 2.199874 1.414190 vertex 1.539843 2.304534 1.148050 endloop endfacet facet normal -0.538626 -0.726249 0.427135 outer loop vertex 1.469911 2.199874 -1.414191 vertex 1.678458 2.045204 -1.414191 vertex 1.758312 2.142507 -1.148051 endloop endfacet facet normal -0.538625 -0.726251 0.427133 outer loop vertex 1.758312 2.142507 -1.148051 vertex 1.539843 2.304535 -1.148051 vertex 1.469911 2.199874 -1.414191 endloop endfacet facet normal -0.478678 -0.645418 -0.595233 outer loop vertex 1.385823 2.074027 1.666711 vertex 1.582440 1.928205 1.666711 vertex 1.471182 1.792638 1.903180 endloop endfacet facet normal -0.478671 -0.645420 -0.595237 outer loop vertex 1.471182 1.792638 1.903180 vertex 1.288388 1.928206 1.903180 vertex 1.385823 2.074027 1.666711 endloop endfacet facet normal -0.144906 -0.195387 0.969962 outer loop vertex 0.325162 0.486635 -2.942356 vertex 0.371295 0.452421 -2.942356 vertex 0.552467 0.673180 -2.870821 endloop endfacet facet normal -0.144906 -0.195387 0.969962 outer loop vertex 0.552467 0.673180 -2.870821 vertex 0.483823 0.724089 -2.870821 vertex 0.325162 0.486635 -2.942356 endloop endfacet facet normal -0.577888 -0.779192 0.242704 outer loop vertex 1.594946 2.387002 -0.870855 vertex 1.821233 2.219176 -0.870855 vertex 1.866614 2.274473 -0.585272 endloop endfacet facet normal -0.577890 -0.779190 0.242705 outer loop vertex 1.866614 2.274473 -0.585272 vertex 1.634689 2.446481 -0.585272 vertex 1.594946 2.387002 -0.870855 endloop endfacet facet normal -0.400312 -0.539757 -0.740548 outer loop vertex 1.178546 1.763815 2.121321 vertex 1.345755 1.639804 2.121321 vertex 1.207368 1.471179 2.319032 endloop endfacet facet normal -0.400315 -0.539757 -0.740548 outer loop vertex 1.207368 1.471179 2.319032 vertex 1.057354 1.582438 2.319032 vertex 1.178546 1.763815 2.121321 endloop endfacet facet normal -0.254947 -0.343752 0.903790 outer loop vertex 0.637825 0.954570 -2.771639 vertex 0.728318 0.887455 -2.771639 vertex 0.897156 1.093184 -2.645764 endloop endfacet facet normal -0.254946 -0.343754 0.903790 outer loop vertex 0.897156 1.093184 -2.645764 vertex 0.785685 1.175857 -2.645764 vertex 0.637825 0.954570 -2.771639 endloop endfacet facet normal -0.594982 -0.802243 0.049010 outer loop vertex 1.658688 2.482399 -0.294052 vertex 1.894019 2.307866 -0.294052 vertex 1.903184 2.319033 -0.000001 endloop endfacet facet normal -0.594983 -0.802242 0.049011 outer loop vertex 1.903184 2.319033 -0.000001 vertex 1.666714 2.494411 -0.000001 vertex 1.658688 2.482399 -0.294052 endloop endfacet facet normal -0.306519 -0.413297 -0.857457 outer loop vertex 0.925978 1.385821 2.494409 vertex 1.057354 1.288387 2.494409 vertex 0.897157 1.093186 2.645763 endloop endfacet facet normal -0.306520 -0.413297 -0.857456 outer loop vertex 0.897157 1.093186 2.645763 vertex 0.785686 1.175858 2.645763 vertex 0.925978 1.385821 2.494409 endloop endfacet facet normal -0.355134 -0.478840 0.802865 outer loop vertex 0.925978 1.385820 -2.494410 vertex 1.057353 1.288385 -2.494410 vertex 1.207367 1.471179 -2.319033 endloop endfacet facet normal -0.355133 -0.478841 0.802864 outer loop vertex 1.207367 1.471179 -2.319033 vertex 1.057353 1.582437 -2.319033 vertex 0.925978 1.385820 -2.494410 endloop endfacet facet normal -0.200898 -0.270881 -0.941416 outer loop vertex 0.637826 0.954571 2.771639 vertex 0.728319 0.887457 2.771639 vertex 0.552468 0.673181 2.870821 endloop endfacet facet normal -0.200899 -0.270880 -0.941416 outer loop vertex 0.552468 0.673181 2.870821 vertex 0.483824 0.724091 2.870821 vertex 0.637826 0.954571 2.771639 endloop endfacet facet normal -0.589266 -0.794535 -0.146559 outer loop vertex 1.658688 2.482399 0.294051 vertex 1.894019 2.307866 0.294051 vertex 1.866614 2.274473 0.585271 endloop endfacet facet normal -0.589267 -0.794535 -0.146557 outer loop vertex 1.866614 2.274473 0.585271 vertex 1.634688 2.446481 0.585271 vertex 1.658688 2.482399 0.294051 endloop endfacet facet normal -0.441622 -0.595462 0.671115 outer loop vertex 1.178545 1.763814 -2.121322 vertex 1.345754 1.639804 -2.121322 vertex 1.471181 1.792637 -1.903181 endloop endfacet facet normal -0.441624 -0.595459 0.671116 outer loop vertex 1.471181 1.792637 -1.903181 vertex 1.288388 1.928206 -1.903181 vertex 1.178545 1.763814 -2.121322 endloop endfacet facet normal -0.087510 -0.117992 -0.989151 outer loop vertex 0.325163 0.486637 2.942356 vertex 0.371296 0.452422 2.942356 vertex 0.186548 0.227307 2.985554 endloop endfacet facet normal -0.087510 -0.117993 -0.989151 outer loop vertex 0.186548 0.227307 2.985554 vertex 0.163370 0.244497 2.985554 vertex 0.325163 0.486637 2.942356 endloop endfacet facet normal -0.560953 -0.756358 -0.336533 outer loop vertex 1.594946 2.387002 0.870853 vertex 1.821233 2.219176 0.870853 vertex 1.758312 2.142506 1.148050 endloop endfacet facet normal -0.560954 -0.756357 -0.336532 outer loop vertex 1.758312 2.142506 1.148050 vertex 1.539843 2.304534 1.148050 vertex 1.594946 2.387002 0.870853 endloop endfacet facet normal -0.511114 -0.689153 0.513645 outer loop vertex 1.385823 2.074027 -1.666712 vertex 1.582440 1.928205 -1.666712 vertex 1.678458 2.045204 -1.414191 endloop endfacet facet normal -0.511114 -0.689153 0.513645 outer loop vertex 1.678458 2.045204 -1.414191 vertex 1.469911 2.199874 -1.414191 vertex 1.385823 2.074027 -1.666712 endloop endfacet facet normal -0.511108 -0.689154 -0.513649 outer loop vertex 1.469911 2.199874 1.414190 vertex 1.678459 2.045205 1.414190 vertex 1.582440 1.928205 1.666711 endloop endfacet facet normal -0.511114 -0.689153 -0.513645 outer loop vertex 1.582440 1.928205 1.666711 vertex 1.385823 2.074027 1.666711 vertex 1.469911 2.199874 1.414190 endloop endfacet facet normal -0.087509 -0.117993 0.989151 outer loop vertex 0.163369 0.244495 -2.985554 vertex 0.186547 0.227305 -2.985554 vertex 0.371295 0.452421 -2.942356 endloop endfacet facet normal -0.087508 -0.117994 0.989151 outer loop vertex 0.371295 0.452421 -2.942356 vertex 0.325162 0.486635 -2.942356 vertex 0.163369 0.244495 -2.985554 endloop endfacet facet normal -0.560954 -0.756358 0.336531 outer loop vertex 1.539843 2.304535 -1.148051 vertex 1.758312 2.142507 -1.148051 vertex 1.821233 2.219176 -0.870855 endloop endfacet facet normal -0.560954 -0.756358 0.336531 outer loop vertex 1.821233 2.219176 -0.870855 vertex 1.594946 2.387002 -0.870855 vertex 1.539843 2.304535 -1.148051 endloop endfacet facet normal -0.441620 -0.595462 -0.671116 outer loop vertex 1.288388 1.928206 1.903180 vertex 1.471182 1.792638 1.903180 vertex 1.345755 1.639804 2.121321 endloop endfacet facet normal -0.441625 -0.595461 -0.671114 outer loop vertex 1.345755 1.639804 2.121321 vertex 1.178546 1.763815 2.121321 vertex 1.288388 1.928206 1.903180 endloop endfacet facet normal -0.163362 -0.180240 0.969962 outer loop vertex 0.371295 0.452421 -2.942356 vertex 0.413852 0.413849 -2.942356 vertex 0.615790 0.615787 -2.870821 endloop endfacet facet normal -0.163362 -0.180241 0.969962 outer loop vertex 0.615790 0.615787 -2.870821 vertex 0.552467 0.673180 -2.870821 vertex 0.371295 0.452421 -2.942356 endloop endfacet facet normal -0.651480 -0.718797 0.242704 outer loop vertex 1.821233 2.219176 -0.870855 vertex 2.029981 2.029978 -0.870855 vertex 2.080563 2.080561 -0.585272 endloop endfacet facet normal -0.651479 -0.718797 0.242704 outer loop vertex 2.080563 2.080561 -0.585272 vertex 1.866614 2.274473 -0.585272 vertex 1.821233 2.219176 -0.870855 endloop endfacet facet normal -0.451292 -0.497921 -0.740547 outer loop vertex 1.345755 1.639804 2.121321 vertex 1.500003 1.500001 2.121321 vertex 1.345755 1.345753 2.319032 endloop endfacet facet normal -0.451288 -0.497922 -0.740549 outer loop vertex 1.345755 1.345753 2.319032 vertex 1.207368 1.471179 2.319032 vertex 1.345755 1.639804 2.121321 endloop endfacet facet normal -0.287410 -0.317112 0.903789 outer loop vertex 0.728318 0.887455 -2.771639 vertex 0.811797 0.811795 -2.771639 vertex 0.999986 0.999984 -2.645764 endloop endfacet facet normal -0.287412 -0.317109 0.903790 outer loop vertex 0.999986 0.999984 -2.645764 vertex 0.897156 1.093184 -2.645764 vertex 0.728318 0.887455 -2.771639 endloop endfacet facet normal -0.670752 -0.740061 0.049010 outer loop vertex 1.894019 2.307866 -0.294052 vertex 2.111109 2.111107 -0.294052 vertex 2.121324 2.121322 -0.000001 endloop endfacet facet normal -0.670753 -0.740060 0.049011 outer loop vertex 2.121324 2.121322 -0.000001 vertex 1.903184 2.319033 -0.000001 vertex 1.894019 2.307866 -0.294052 endloop endfacet facet normal -0.345556 -0.381259 -0.857457 outer loop vertex 1.057354 1.288387 2.494409 vertex 1.178546 1.178544 2.494409 vertex 0.999987 0.999985 2.645763 endloop endfacet facet normal -0.345558 -0.381259 -0.857457 outer loop vertex 0.999987 0.999985 2.645763 vertex 0.897157 1.093186 2.645763 vertex 1.057354 1.288387 2.494409 endloop endfacet facet normal -0.400357 -0.441729 0.802864 outer loop vertex 1.057353 1.288385 -2.494410 vertex 1.178546 1.178543 -2.494410 vertex 1.345754 1.345752 -2.319033 endloop endfacet facet normal -0.400358 -0.441726 0.802865 outer loop vertex 1.345754 1.345752 -2.319033 vertex 1.207367 1.471179 -2.319033 vertex 1.057353 1.288385 -2.494410 endloop endfacet facet normal -0.226482 -0.249884 -0.941416 outer loop vertex 0.728319 0.887457 2.771639 vertex 0.811798 0.811796 2.771639 vertex 0.615791 0.615788 2.870821 endloop endfacet facet normal -0.226483 -0.249884 -0.941416 outer loop vertex 0.615791 0.615788 2.870821 vertex 0.552468 0.673181 2.870821 vertex 0.728319 0.887457 2.771639 endloop endfacet facet normal -0.664308 -0.732950 -0.146558 outer loop vertex 1.894019 2.307866 0.294051 vertex 2.111109 2.111107 0.294051 vertex 2.080563 2.080561 0.585271 endloop endfacet facet normal -0.664307 -0.732951 -0.146559 outer loop vertex 2.080563 2.080561 0.585271 vertex 1.866614 2.274473 0.585271 vertex 1.894019 2.307866 0.294051 endloop endfacet facet normal -0.497861 -0.549305 0.671117 outer loop vertex 1.345754 1.639804 -2.121322 vertex 1.500003 1.500001 -2.121322 vertex 1.639807 1.639805 -1.903181 endloop endfacet facet normal -0.497860 -0.549309 0.671115 outer loop vertex 1.639807 1.639805 -1.903181 vertex 1.471181 1.792637 -1.903181 vertex 1.345754 1.639804 -2.121322 endloop endfacet facet normal -0.098653 -0.108848 -0.989151 outer loop vertex 0.371296 0.452422 2.942356 vertex 0.413853 0.413851 2.942356 vertex 0.207930 0.207927 2.985554 endloop endfacet facet normal -0.098655 -0.108846 -0.989151 outer loop vertex 0.207930 0.207927 2.985554 vertex 0.186548 0.227307 2.985554 vertex 0.371296 0.452422 2.942356 endloop endfacet facet normal -0.632386 -0.697734 -0.336533 outer loop vertex 1.821233 2.219176 0.870853 vertex 2.029981 2.029979 0.870853 vertex 1.959848 1.959845 1.148050 endloop endfacet facet normal -0.632387 -0.697734 -0.336533 outer loop vertex 1.959848 1.959845 1.148050 vertex 1.758312 2.142506 1.148050 vertex 1.821233 2.219176 0.870853 endloop endfacet facet normal -0.576198 -0.635739 0.513646 outer loop vertex 1.582440 1.928205 -1.666712 vertex 1.763817 1.763815 -1.666712 vertex 1.870841 1.870839 -1.414191 endloop endfacet facet normal -0.576198 -0.635740 0.513645 outer loop vertex 1.870841 1.870839 -1.414191 vertex 1.678458 2.045204 -1.414191 vertex 1.582440 1.928205 -1.666712 endloop endfacet facet normal -0.576199 -0.635736 -0.513648 outer loop vertex 1.678459 2.045205 1.414190 vertex 1.870842 1.870839 1.414190 vertex 1.763817 1.763815 1.666711 endloop endfacet facet normal -0.576197 -0.635737 -0.513649 outer loop vertex 1.763817 1.763815 1.666711 vertex 1.582440 1.928205 1.666711 vertex 1.678459 2.045205 1.414190 endloop endfacet facet normal -0.098654 -0.108846 0.989151 outer loop vertex 0.186547 0.227305 -2.985554 vertex 0.207928 0.207926 -2.985554 vertex 0.413852 0.413849 -2.942356 endloop endfacet facet normal -0.098654 -0.108846 0.989151 outer loop vertex 0.413852 0.413849 -2.942356 vertex 0.371295 0.452421 -2.942356 vertex 0.186547 0.227305 -2.985554 endloop endfacet facet normal -0.632388 -0.697735 0.336530 outer loop vertex 1.758312 2.142507 -1.148051 vertex 1.959848 1.959846 -1.148051 vertex 2.029981 2.029978 -0.870855 endloop endfacet facet normal -0.632388 -0.697733 0.336531 outer loop vertex 2.029981 2.029978 -0.870855 vertex 1.821233 2.219176 -0.870855 vertex 1.758312 2.142507 -1.148051 endloop endfacet facet normal -0.497862 -0.549305 -0.671117 outer loop vertex 1.471182 1.792638 1.903180 vertex 1.639807 1.639805 1.903180 vertex 1.500003 1.500001 2.121321 endloop endfacet facet normal -0.497863 -0.549304 -0.671116 outer loop vertex 1.500003 1.500001 2.121321 vertex 1.345755 1.639804 2.121321 vertex 1.471182 1.792638 1.903180 endloop endfacet facet normal -0.226483 -0.249884 0.941416 outer loop vertex 0.552467 0.673180 -2.870821 vertex 0.615790 0.615787 -2.870821 vertex 0.811797 0.811795 -2.771639 endloop endfacet facet normal -0.226481 -0.249887 0.941415 outer loop vertex 0.811797 0.811795 -2.771639 vertex 0.728318 0.887455 -2.771639 vertex 0.552467 0.673180 -2.870821 endloop endfacet facet normal -0.664307 -0.732951 0.146558 outer loop vertex 1.866614 2.274473 -0.585272 vertex 2.080563 2.080561 -0.585272 vertex 2.111109 2.111107 -0.294052 endloop endfacet facet normal -0.664308 -0.732950 0.146559 outer loop vertex 2.111109 2.111107 -0.294052 vertex 1.894019 2.307866 -0.294052 vertex 1.866614 2.274473 -0.585272 endloop endfacet facet normal -0.400357 -0.441728 -0.802864 outer loop vertex 1.207368 1.471179 2.319032 vertex 1.345755 1.345753 2.319032 vertex 1.178546 1.178544 2.494409 endloop endfacet facet normal -0.400361 -0.441726 -0.802863 outer loop vertex 1.178546 1.178544 2.494409 vertex 1.057354 1.288387 2.494409 vertex 1.207368 1.471179 2.319032 endloop endfacet facet normal -0.345555 -0.381260 0.857457 outer loop vertex 0.897156 1.093184 -2.645764 vertex 0.999986 0.999984 -2.645764 vertex 1.178546 1.178543 -2.494410 endloop endfacet facet normal -0.345554 -0.381263 0.857456 outer loop vertex 1.178546 1.178543 -2.494410 vertex 1.057353 1.288385 -2.494410 vertex 0.897156 1.093184 -2.645764 endloop endfacet facet normal -0.287417 -0.317111 -0.903788 outer loop vertex 0.897157 1.093186 2.645763 vertex 0.999987 0.999985 2.645763 vertex 0.811798 0.811796 2.771639 endloop endfacet facet normal -0.287414 -0.317112 -0.903788 outer loop vertex 0.811798 0.811796 2.771639 vertex 0.728319 0.887457 2.771639 vertex 0.897157 1.093186 2.645763 endloop endfacet facet normal -0.670753 -0.740060 -0.049009 outer loop vertex 1.903184 2.319033 -0.000001 vertex 2.121324 2.121322 -0.000001 vertex 2.111109 2.111107 0.294051 endloop endfacet facet normal -0.670752 -0.740061 -0.049010 outer loop vertex 2.111109 2.111107 0.294051 vertex 1.894019 2.307866 0.294051 vertex 1.903184 2.319033 -0.000001 endloop endfacet facet normal -0.451290 -0.497920 0.740549 outer loop vertex 1.207367 1.471179 -2.319033 vertex 1.345754 1.345752 -2.319033 vertex 1.500003 1.500001 -2.121322 endloop endfacet facet normal -0.451289 -0.497921 0.740549 outer loop vertex 1.500003 1.500001 -2.121322 vertex 1.345754 1.639804 -2.121322 vertex 1.207367 1.471179 -2.319033 endloop endfacet facet normal -0.163362 -0.180241 -0.969962 outer loop vertex 0.552468 0.673181 2.870821 vertex 0.615791 0.615788 2.870821 vertex 0.413853 0.413851 2.942356 endloop endfacet facet normal -0.163360 -0.180242 -0.969962 outer loop vertex 0.413853 0.413851 2.942356 vertex 0.371296 0.452422 2.942356 vertex 0.552468 0.673181 2.870821 endloop endfacet facet normal -0.651480 -0.718797 -0.242702 outer loop vertex 1.866614 2.274473 0.585271 vertex 2.080563 2.080561 0.585271 vertex 2.029981 2.029979 0.870853 endloop endfacet facet normal -0.651478 -0.718799 -0.242704 outer loop vertex 2.029981 2.029979 0.870853 vertex 1.821233 2.219176 0.870853 vertex 1.866614 2.274473 0.585271 endloop endfacet facet normal -0.539629 -0.595396 0.595235 outer loop vertex 1.471181 1.792637 -1.903181 vertex 1.639807 1.639805 -1.903181 vertex 1.763817 1.763815 -1.666712 endloop endfacet facet normal -0.539631 -0.595392 0.595237 outer loop vertex 1.763817 1.763815 -1.666712 vertex 1.582440 1.928205 -1.666712 vertex 1.471181 1.792637 -1.903181 endloop endfacet facet normal -0.607216 -0.669962 -0.427130 outer loop vertex 1.758312 2.142506 1.148050 vertex 1.959848 1.959845 1.148050 vertex 1.870842 1.870839 1.414190 endloop endfacet facet normal -0.607218 -0.669961 -0.427128 outer loop vertex 1.870842 1.870839 1.414190 vertex 1.678459 2.045205 1.414190 vertex 1.758312 2.142506 1.148050 endloop endfacet facet normal -0.607214 -0.669961 0.427134 outer loop vertex 1.678458 2.045204 -1.414191 vertex 1.870841 1.870839 -1.414191 vertex 1.959848 1.959846 -1.148051 endloop endfacet facet normal -0.607214 -0.669960 0.427135 outer loop vertex 1.959848 1.959846 -1.148051 vertex 1.758312 2.142507 -1.148051 vertex 1.678458 2.045204 -1.414191 endloop endfacet facet normal -0.539632 -0.595394 -0.595234 outer loop vertex 1.582440 1.928205 1.666711 vertex 1.763817 1.763815 1.666711 vertex 1.639807 1.639805 1.903180 endloop endfacet facet normal -0.539633 -0.595393 -0.595233 outer loop vertex 1.639807 1.639805 1.903180 vertex 1.471182 1.792638 1.903180 vertex 1.582440 1.928205 1.666711 endloop endfacet facet normal -0.108848 -0.098652 0.989151 outer loop vertex 0.207928 0.207926 -2.985554 vertex 0.227307 0.186544 -2.985554 vertex 0.452423 0.371292 -2.942356 endloop endfacet facet normal -0.108848 -0.098653 0.989151 outer loop vertex 0.452423 0.371292 -2.942356 vertex 0.413852 0.413849 -2.942356 vertex 0.207928 0.207926 -2.985554 endloop endfacet facet normal -0.697734 -0.632387 0.336531 outer loop vertex 1.959848 1.959846 -1.148051 vertex 2.142509 1.758310 -1.148051 vertex 2.219178 1.821231 -0.870855 endloop endfacet facet normal -0.697734 -0.632388 0.336530 outer loop vertex 2.219178 1.821231 -0.870855 vertex 2.029981 2.029978 -0.870855 vertex 1.959848 1.959846 -1.148051 endloop endfacet facet normal -0.549308 -0.497861 -0.671115 outer loop vertex 1.639807 1.639805 1.903180 vertex 1.792639 1.471180 1.903180 vertex 1.639806 1.345753 2.121321 endloop endfacet facet normal -0.549304 -0.497863 -0.671117 outer loop vertex 1.639806 1.345753 2.121321 vertex 1.500003 1.500001 2.121321 vertex 1.639807 1.639805 1.903180 endloop endfacet facet normal -0.249885 -0.226480 0.941416 outer loop vertex 0.615790 0.615787 -2.870821 vertex 0.673182 0.552464 -2.870821 vertex 0.887458 0.728316 -2.771639 endloop endfacet facet normal -0.249884 -0.226482 0.941416 outer loop vertex 0.887458 0.728316 -2.771639 vertex 0.811797 0.811795 -2.771639 vertex 0.615790 0.615787 -2.870821 endloop endfacet facet normal -0.732952 -0.664306 0.146560 outer loop vertex 2.080563 2.080561 -0.585272 vertex 2.274475 1.866611 -0.585272 vertex 2.307868 1.894017 -0.294052 endloop endfacet facet normal -0.732950 -0.664307 0.146558 outer loop vertex 2.307868 1.894017 -0.294052 vertex 2.111109 2.111107 -0.294052 vertex 2.080563 2.080561 -0.585272 endloop endfacet facet normal -0.441727 -0.400359 -0.802864 outer loop vertex 1.345755 1.345753 2.319032 vertex 1.471182 1.207366 2.319032 vertex 1.288389 1.057352 2.494409 endloop endfacet facet normal -0.441725 -0.400359 -0.802864 outer loop vertex 1.288389 1.057352 2.494409 vertex 1.178546 1.178544 2.494409 vertex 1.345755 1.345753 2.319032 endloop endfacet facet normal -0.381260 -0.345555 0.857457 outer loop vertex 0.999986 0.999984 -2.645764 vertex 1.093187 0.897153 -2.645764 vertex 1.288388 1.057351 -2.494410 endloop endfacet facet normal -0.381260 -0.345554 0.857457 outer loop vertex 1.288388 1.057351 -2.494410 vertex 1.178546 1.178543 -2.494410 vertex 0.999986 0.999984 -2.645764 endloop endfacet facet normal -0.317112 -0.287415 -0.903788 outer loop vertex 0.999987 0.999985 2.645763 vertex 1.093188 0.897154 2.645763 vertex 0.887459 0.728317 2.771639 endloop endfacet facet normal -0.317113 -0.287414 -0.903788 outer loop vertex 0.887459 0.728317 2.771639 vertex 0.811798 0.811796 2.771639 vertex 0.999987 0.999985 2.645763 endloop endfacet facet normal -0.740060 -0.670753 -0.049011 outer loop vertex 2.121324 2.121322 -0.000001 vertex 2.319036 1.903181 -0.000001 vertex 2.307868 1.894017 0.294051 endloop endfacet facet normal -0.740061 -0.670752 -0.049010 outer loop vertex 2.307868 1.894017 0.294051 vertex 2.111109 2.111107 0.294051 vertex 2.121324 2.121322 -0.000001 endloop endfacet facet normal -0.497921 -0.451290 0.740548 outer loop vertex 1.345754 1.345752 -2.319033 vertex 1.471181 1.207365 -2.319033 vertex 1.639806 1.345752 -2.121322 endloop endfacet facet normal -0.497921 -0.451289 0.740549 outer loop vertex 1.639806 1.345752 -2.121322 vertex 1.500003 1.500001 -2.121322 vertex 1.345754 1.345752 -2.319033 endloop endfacet facet normal -0.180241 -0.163362 -0.969962 outer loop vertex 0.615791 0.615788 2.870821 vertex 0.673184 0.552465 2.870821 vertex 0.452425 0.371294 2.942356 endloop endfacet facet normal -0.180240 -0.163363 -0.969962 outer loop vertex 0.452425 0.371294 2.942356 vertex 0.413853 0.413851 2.942356 vertex 0.615791 0.615788 2.870821 endloop endfacet facet normal -0.718797 -0.651480 -0.242703 outer loop vertex 2.080563 2.080561 0.585271 vertex 2.274475 1.866612 0.585271 vertex 2.219179 1.821231 0.870853 endloop endfacet facet normal -0.718798 -0.651480 -0.242702 outer loop vertex 2.219179 1.821231 0.870853 vertex 2.029981 2.029979 0.870853 vertex 2.080563 2.080561 0.585271 endloop endfacet facet normal -0.595394 -0.539631 0.595235 outer loop vertex 1.639807 1.639805 -1.903181 vertex 1.792639 1.471180 -1.903181 vertex 1.928208 1.582437 -1.666712 endloop endfacet facet normal -0.595393 -0.539632 0.595235 outer loop vertex 1.928208 1.582437 -1.666712 vertex 1.763817 1.763815 -1.666712 vertex 1.639807 1.639805 -1.903181 endloop endfacet facet normal -0.669962 -0.607216 -0.427131 outer loop vertex 1.959848 1.959845 1.148050 vertex 2.142509 1.758309 1.148050 vertex 2.045207 1.678456 1.414190 endloop endfacet facet normal -0.669962 -0.607216 -0.427130 outer loop vertex 2.045207 1.678456 1.414190 vertex 1.870842 1.870839 1.414190 vertex 1.959848 1.959845 1.148050 endloop endfacet facet normal -0.669960 -0.607217 0.427133 outer loop vertex 1.870841 1.870839 -1.414191 vertex 2.045207 1.678456 -1.414191 vertex 2.142509 1.758310 -1.148051 endloop endfacet facet normal -0.669960 -0.607214 0.427134 outer loop vertex 2.142509 1.758310 -1.148051 vertex 1.959848 1.959846 -1.148051 vertex 1.870841 1.870839 -1.414191 endloop endfacet facet normal -0.595393 -0.539632 -0.595235 outer loop vertex 1.763817 1.763815 1.666711 vertex 1.928208 1.582437 1.666711 vertex 1.792639 1.471180 1.903180 endloop endfacet facet normal -0.595394 -0.539631 -0.595234 outer loop vertex 1.792639 1.471180 1.903180 vertex 1.639807 1.639805 1.903180 vertex 1.763817 1.763815 1.666711 endloop endfacet facet normal -0.180242 -0.163360 0.969962 outer loop vertex 0.413852 0.413849 -2.942356 vertex 0.452423 0.371292 -2.942356 vertex 0.673182 0.552464 -2.870821 endloop endfacet facet normal -0.180242 -0.163360 0.969962 outer loop vertex 0.673182 0.552464 -2.870821 vertex 0.615790 0.615787 -2.870821 vertex 0.413852 0.413849 -2.942356 endloop endfacet facet normal -0.718798 -0.651479 0.242702 outer loop vertex 2.029981 2.029978 -0.870855 vertex 2.219178 1.821231 -0.870855 vertex 2.274475 1.866611 -0.585272 endloop endfacet facet normal -0.718799 -0.651478 0.242704 outer loop vertex 2.274475 1.866611 -0.585272 vertex 2.080563 2.080561 -0.585272 vertex 2.029981 2.029978 -0.870855 endloop endfacet facet normal -0.497921 -0.451292 -0.740547 outer loop vertex 1.500003 1.500001 2.121321 vertex 1.639806 1.345753 2.121321 vertex 1.471182 1.207366 2.319032 endloop endfacet facet normal -0.497922 -0.451292 -0.740547 outer loop vertex 1.471182 1.207366 2.319032 vertex 1.345755 1.345753 2.319032 vertex 1.500003 1.500001 2.121321 endloop endfacet facet normal -0.317110 -0.287412 0.903789 outer loop vertex 0.811797 0.811795 -2.771639 vertex 0.887458 0.728316 -2.771639 vertex 1.093187 0.897153 -2.645764 endloop endfacet facet normal -0.317110 -0.287413 0.903789 outer loop vertex 1.093187 0.897153 -2.645764 vertex 0.999986 0.999984 -2.645764 vertex 0.811797 0.811795 -2.771639 endloop endfacet facet normal -0.740061 -0.670752 0.049011 outer loop vertex 2.111109 2.111107 -0.294052 vertex 2.307868 1.894017 -0.294052 vertex 2.319036 1.903181 -0.000001 endloop endfacet facet normal -0.740060 -0.670753 0.049010 outer loop vertex 2.319036 1.903181 -0.000001 vertex 2.121324 2.121322 -0.000001 vertex 2.111109 2.111107 -0.294052 endloop endfacet facet normal -0.381259 -0.345556 -0.857457 outer loop vertex 1.178546 1.178544 2.494409 vertex 1.288389 1.057352 2.494409 vertex 1.093188 0.897154 2.645763 endloop endfacet facet normal -0.381260 -0.345555 -0.857457 outer loop vertex 1.093188 0.897154 2.645763 vertex 0.999987 0.999985 2.645763 vertex 1.178546 1.178544 2.494409 endloop endfacet facet normal -0.441727 -0.400358 0.802864 outer loop vertex 1.178546 1.178543 -2.494410 vertex 1.288388 1.057351 -2.494410 vertex 1.471181 1.207365 -2.319033 endloop endfacet facet normal -0.441727 -0.400359 0.802864 outer loop vertex 1.471181 1.207365 -2.319033 vertex 1.345754 1.345752 -2.319033 vertex 1.178546 1.178543 -2.494410 endloop endfacet facet normal -0.249885 -0.226482 -0.941416 outer loop vertex 0.811798 0.811796 2.771639 vertex 0.887459 0.728317 2.771639 vertex 0.673184 0.552465 2.870821 endloop endfacet facet normal -0.249884 -0.226483 -0.941416 outer loop vertex 0.673184 0.552465 2.870821 vertex 0.615791 0.615788 2.870821 vertex 0.811798 0.811796 2.771639 endloop endfacet facet normal -0.732950 -0.664307 -0.146558 outer loop vertex 2.111109 2.111107 0.294051 vertex 2.307868 1.894017 0.294051 vertex 2.274475 1.866612 0.585271 endloop endfacet facet normal -0.732950 -0.664307 -0.146558 outer loop vertex 2.274475 1.866612 0.585271 vertex 2.080563 2.080561 0.585271 vertex 2.111109 2.111107 0.294051 endloop endfacet facet normal -0.549306 -0.497862 0.671116 outer loop vertex 1.500003 1.500001 -2.121322 vertex 1.639806 1.345752 -2.121322 vertex 1.792639 1.471180 -1.903181 endloop endfacet facet normal -0.549307 -0.497860 0.671117 outer loop vertex 1.792639 1.471180 -1.903181 vertex 1.639807 1.639805 -1.903181 vertex 1.500003 1.500001 -2.121322 endloop endfacet facet normal -0.108846 -0.098654 -0.989151 outer loop vertex 0.413853 0.413851 2.942356 vertex 0.452425 0.371294 2.942356 vertex 0.227309 0.186546 2.985554 endloop endfacet facet normal -0.108846 -0.098654 -0.989151 outer loop vertex 0.227309 0.186546 2.985554 vertex 0.207930 0.207927 2.985554 vertex 0.413853 0.413851 2.942356 endloop endfacet facet normal -0.697733 -0.632388 -0.336534 outer loop vertex 2.029981 2.029979 0.870853 vertex 2.219179 1.821231 0.870853 vertex 2.142509 1.758309 1.148050 endloop endfacet facet normal -0.697734 -0.632387 -0.336533 outer loop vertex 2.142509 1.758309 1.148050 vertex 1.959848 1.959845 1.148050 vertex 2.029981 2.029979 0.870853 endloop endfacet facet normal -0.635738 -0.576198 0.513647 outer loop vertex 1.763817 1.763815 -1.666712 vertex 1.928208 1.582437 -1.666712 vertex 2.045207 1.678456 -1.414191 endloop endfacet facet normal -0.635738 -0.576199 0.513646 outer loop vertex 2.045207 1.678456 -1.414191 vertex 1.870841 1.870839 -1.414191 vertex 1.763817 1.763815 -1.666712 endloop endfacet facet normal -0.635738 -0.576197 -0.513647 outer loop vertex 1.870842 1.870839 1.414190 vertex 2.045207 1.678456 1.414190 vertex 1.928208 1.582437 1.666711 endloop endfacet facet normal -0.635738 -0.576198 -0.513648 outer loop vertex 1.928208 1.582437 1.666711 vertex 1.763817 1.763815 1.666711 vertex 1.870842 1.870839 1.414190 endloop endfacet facet normal -0.726251 -0.538625 0.427133 outer loop vertex 2.045207 1.678456 -1.414191 vertex 2.199876 1.469909 -1.414191 vertex 2.304537 1.539841 -1.148051 endloop endfacet facet normal -0.726251 -0.538626 0.427133 outer loop vertex 2.304537 1.539841 -1.148051 vertex 2.142509 1.758310 -1.148051 vertex 2.045207 1.678456 -1.414191 endloop endfacet facet normal -0.645419 -0.478675 -0.595234 outer loop vertex 1.928208 1.582437 1.666711 vertex 2.074029 1.385820 1.666711 vertex 1.928208 1.288387 1.903180 endloop endfacet facet normal -0.645418 -0.478676 -0.595235 outer loop vertex 1.928208 1.288387 1.903180 vertex 1.792639 1.471180 1.903180 vertex 1.928208 1.582437 1.666711 endloop endfacet facet normal -0.195385 -0.144909 0.969962 outer loop vertex 0.452423 0.371292 -2.942356 vertex 0.486638 0.325159 -2.942356 vertex 0.724091 0.483821 -2.870821 endloop endfacet facet normal -0.195386 -0.144908 0.969962 outer loop vertex 0.724091 0.483821 -2.870821 vertex 0.673182 0.552464 -2.870821 vertex 0.452423 0.371292 -2.942356 endloop endfacet facet normal -0.779192 -0.577888 0.242704 outer loop vertex 2.219178 1.821231 -0.870855 vertex 2.387004 1.594944 -0.870855 vertex 2.446483 1.634686 -0.585272 endloop endfacet facet normal -0.779191 -0.577889 0.242702 outer loop vertex 2.446483 1.634686 -0.585272 vertex 2.274475 1.866611 -0.585272 vertex 2.219178 1.821231 -0.870855 endloop endfacet facet normal -0.539759 -0.400311 -0.740548 outer loop vertex 1.639806 1.345753 2.121321 vertex 1.763817 1.178543 2.121321 vertex 1.582440 1.057351 2.319032 endloop endfacet facet normal -0.539760 -0.400311 -0.740547 outer loop vertex 1.582440 1.057351 2.319032 vertex 1.471182 1.207366 2.319032 vertex 1.639806 1.345753 2.121321 endloop endfacet facet normal -0.343755 -0.254945 0.903789 outer loop vertex 0.887458 0.728316 -2.771639 vertex 0.954572 0.637823 -2.771639 vertex 1.175859 0.785682 -2.645764 endloop endfacet facet normal -0.343755 -0.254945 0.903790 outer loop vertex 1.175859 0.785682 -2.645764 vertex 1.093187 0.897153 -2.645764 vertex 0.887458 0.728316 -2.771639 endloop endfacet facet normal -0.802243 -0.594983 0.049011 outer loop vertex 2.307868 1.894017 -0.294052 vertex 2.482401 1.658686 -0.294052 vertex 2.494413 1.666712 -0.000001 endloop endfacet facet normal -0.802243 -0.594983 0.049011 outer loop vertex 2.494413 1.666712 -0.000001 vertex 2.319036 1.903181 -0.000001 vertex 2.307868 1.894017 -0.294052 endloop endfacet facet normal -0.413297 -0.306518 -0.857457 outer loop vertex 1.288389 1.057352 2.494409 vertex 1.385823 0.925976 2.494409 vertex 1.175860 0.785683 2.645763 endloop endfacet facet normal -0.413296 -0.306519 -0.857457 outer loop vertex 1.175860 0.785683 2.645763 vertex 1.093188 0.897154 2.645763 vertex 1.288389 1.057352 2.494409 endloop endfacet facet normal -0.478843 -0.355134 0.802863 outer loop vertex 1.288388 1.057351 -2.494410 vertex 1.385823 0.925975 -2.494410 vertex 1.582439 1.057350 -2.319033 endloop endfacet facet normal -0.478843 -0.355132 0.802864 outer loop vertex 1.582439 1.057350 -2.319033 vertex 1.471181 1.207365 -2.319033 vertex 1.288388 1.057351 -2.494410 endloop endfacet facet normal -0.270881 -0.200898 -0.941416 outer loop vertex 0.887459 0.728317 2.771639 vertex 0.954573 0.637824 2.771639 vertex 0.724093 0.483822 2.870821 endloop endfacet facet normal -0.270881 -0.200898 -0.941416 outer loop vertex 0.724093 0.483822 2.870821 vertex 0.673184 0.552465 2.870821 vertex 0.887459 0.728317 2.771639 endloop endfacet facet normal -0.794535 -0.589266 -0.146558 outer loop vertex 2.307868 1.894017 0.294051 vertex 2.482401 1.658686 0.294051 vertex 2.446483 1.634686 0.585271 endloop endfacet facet normal -0.794535 -0.589266 -0.146558 outer loop vertex 2.446483 1.634686 0.585271 vertex 2.274475 1.866612 0.585271 vertex 2.307868 1.894017 0.294051 endloop endfacet facet normal -0.595461 -0.441621 0.671116 outer loop vertex 1.639806 1.345752 -2.121322 vertex 1.763816 1.178543 -2.121322 vertex 1.928208 1.288386 -1.903181 endloop endfacet facet normal -0.595460 -0.441623 0.671116 outer loop vertex 1.928208 1.288386 -1.903181 vertex 1.792639 1.471180 -1.903181 vertex 1.639806 1.345752 -2.121322 endloop endfacet facet normal -0.117994 -0.087509 -0.989151 outer loop vertex 0.452425 0.371294 2.942356 vertex 0.486639 0.325161 2.942356 vertex 0.244499 0.163368 2.985554 endloop endfacet facet normal -0.117993 -0.087509 -0.989151 outer loop vertex 0.244499 0.163368 2.985554 vertex 0.227309 0.186546 2.985554 vertex 0.452425 0.371294 2.942356 endloop endfacet facet normal -0.756356 -0.560953 -0.336536 outer loop vertex 2.219179 1.821231 0.870853 vertex 2.387005 1.594944 0.870853 vertex 2.304536 1.539840 1.148050 endloop endfacet facet normal -0.756358 -0.560952 -0.336534 outer loop vertex 2.304536 1.539840 1.148050 vertex 2.142509 1.758309 1.148050 vertex 2.219179 1.821231 0.870853 endloop endfacet facet normal -0.689153 -0.511111 0.513647 outer loop vertex 1.928208 1.582437 -1.666712 vertex 2.074029 1.385820 -1.666712 vertex 2.199876 1.469909 -1.414191 endloop endfacet facet normal -0.689153 -0.511111 0.513647 outer loop vertex 2.199876 1.469909 -1.414191 vertex 2.045207 1.678456 -1.414191 vertex 1.928208 1.582437 -1.666712 endloop endfacet facet normal -0.689153 -0.511111 -0.513647 outer loop vertex 2.045207 1.678456 1.414190 vertex 2.199876 1.469909 1.414190 vertex 2.074029 1.385820 1.666711 endloop endfacet facet normal -0.689154 -0.511111 -0.513647 outer loop vertex 2.074029 1.385820 1.666711 vertex 1.928208 1.582437 1.666711 vertex 2.045207 1.678456 1.414190 endloop endfacet facet normal -0.117993 -0.087509 0.989151 outer loop vertex 0.227307 0.186544 -2.985554 vertex 0.244497 0.163366 -2.985554 vertex 0.486638 0.325159 -2.942356 endloop endfacet facet normal -0.117992 -0.087510 0.989151 outer loop vertex 0.486638 0.325159 -2.942356 vertex 0.452423 0.371292 -2.942356 vertex 0.227307 0.186544 -2.985554 endloop endfacet facet normal -0.756358 -0.560955 0.336530 outer loop vertex 2.142509 1.758310 -1.148051 vertex 2.304537 1.539841 -1.148051 vertex 2.387004 1.594944 -0.870855 endloop endfacet facet normal -0.756358 -0.560954 0.336531 outer loop vertex 2.387004 1.594944 -0.870855 vertex 2.219178 1.821231 -0.870855 vertex 2.142509 1.758310 -1.148051 endloop endfacet facet normal -0.595459 -0.441624 -0.671116 outer loop vertex 1.792639 1.471180 1.903180 vertex 1.928208 1.288387 1.903180 vertex 1.763817 1.178543 2.121321 endloop endfacet facet normal -0.595462 -0.441623 -0.671115 outer loop vertex 1.763817 1.178543 2.121321 vertex 1.639806 1.345753 2.121321 vertex 1.792639 1.471180 1.903180 endloop endfacet facet normal -0.270880 -0.200898 0.941416 outer loop vertex 0.673182 0.552464 -2.870821 vertex 0.724091 0.483821 -2.870821 vertex 0.954572 0.637823 -2.771639 endloop endfacet facet normal -0.270880 -0.200898 0.941416 outer loop vertex 0.954572 0.637823 -2.771639 vertex 0.887458 0.728316 -2.771639 vertex 0.673182 0.552464 -2.870821 endloop endfacet facet normal -0.794534 -0.589268 0.146558 outer loop vertex 2.274475 1.866611 -0.585272 vertex 2.446483 1.634686 -0.585272 vertex 2.482401 1.658686 -0.294052 endloop endfacet facet normal -0.794535 -0.589266 0.146560 outer loop vertex 2.482401 1.658686 -0.294052 vertex 2.307868 1.894017 -0.294052 vertex 2.274475 1.866611 -0.585272 endloop endfacet facet normal -0.478843 -0.355132 -0.802864 outer loop vertex 1.471182 1.207366 2.319032 vertex 1.582440 1.057351 2.319032 vertex 1.385823 0.925976 2.494409 endloop endfacet facet normal -0.478844 -0.355131 -0.802864 outer loop vertex 1.385823 0.925976 2.494409 vertex 1.288389 1.057352 2.494409 vertex 1.471182 1.207366 2.319032 endloop endfacet facet normal -0.413296 -0.306519 0.857457 outer loop vertex 1.093187 0.897153 -2.645764 vertex 1.175859 0.785682 -2.645764 vertex 1.385823 0.925975 -2.494410 endloop endfacet facet normal -0.413295 -0.306520 0.857457 outer loop vertex 1.385823 0.925975 -2.494410 vertex 1.288388 1.057351 -2.494410 vertex 1.093187 0.897153 -2.645764 endloop endfacet facet normal -0.343758 -0.254947 -0.903788 outer loop vertex 1.093188 0.897154 2.645763 vertex 1.175860 0.785683 2.645763 vertex 0.954573 0.637824 2.771639 endloop endfacet facet normal -0.343757 -0.254947 -0.903788 outer loop vertex 0.954573 0.637824 2.771639 vertex 0.887459 0.728317 2.771639 vertex 1.093188 0.897154 2.645763 endloop endfacet facet normal -0.802243 -0.594983 -0.049011 outer loop vertex 2.319036 1.903181 -0.000001 vertex 2.494413 1.666712 -0.000001 vertex 2.482401 1.658686 0.294051 endloop endfacet facet normal -0.802243 -0.594982 -0.049011 outer loop vertex 2.482401 1.658686 0.294051 vertex 2.307868 1.894017 0.294051 vertex 2.319036 1.903181 -0.000001 endloop endfacet facet normal -0.539759 -0.400310 0.740549 outer loop vertex 1.471181 1.207365 -2.319033 vertex 1.582439 1.057350 -2.319033 vertex 1.763816 1.178543 -2.121322 endloop endfacet facet normal -0.539759 -0.400310 0.740548 outer loop vertex 1.763816 1.178543 -2.121322 vertex 1.639806 1.345752 -2.121322 vertex 1.471181 1.207365 -2.319033 endloop endfacet facet normal -0.195386 -0.144908 -0.969962 outer loop vertex 0.673184 0.552465 2.870821 vertex 0.724093 0.483822 2.870821 vertex 0.486639 0.325161 2.942356 endloop endfacet facet normal -0.195387 -0.144907 -0.969962 outer loop vertex 0.486639 0.325161 2.942356 vertex 0.452425 0.371294 2.942356 vertex 0.673184 0.552465 2.870821 endloop endfacet facet normal -0.779193 -0.577888 -0.242701 outer loop vertex 2.274475 1.866612 0.585271 vertex 2.446483 1.634686 0.585271 vertex 2.387005 1.594944 0.870853 endloop endfacet facet normal -0.779192 -0.577889 -0.242703 outer loop vertex 2.387005 1.594944 0.870853 vertex 2.219179 1.821231 0.870853 vertex 2.274475 1.866612 0.585271 endloop endfacet facet normal -0.645419 -0.478674 0.595236 outer loop vertex 1.792639 1.471180 -1.903181 vertex 1.928208 1.288386 -1.903181 vertex 2.074029 1.385820 -1.666712 endloop endfacet facet normal -0.645419 -0.478675 0.595236 outer loop vertex 2.074029 1.385820 -1.666712 vertex 1.928208 1.582437 -1.666712 vertex 1.792639 1.471180 -1.903181 endloop endfacet facet normal -0.726254 -0.538624 -0.427129 outer loop vertex 2.142509 1.758309 1.148050 vertex 2.304536 1.539840 1.148050 vertex 2.199876 1.469909 1.414190 endloop endfacet facet normal -0.726252 -0.538625 -0.427131 outer loop vertex 2.199876 1.469909 1.414190 vertex 2.045207 1.678456 1.414190 vertex 2.142509 1.758309 1.148050 endloop endfacet facet normal -0.367088 -0.220025 0.903789 outer loop vertex 0.954572 0.637823 -2.771639 vertex 1.012493 0.541188 -2.771639 vertex 1.247207 0.666645 -2.645764 endloop endfacet facet normal -0.367088 -0.220024 0.903789 outer loop vertex 1.247207 0.666645 -2.645764 vertex 1.175859 0.785682 -2.645764 vertex 0.954572 0.637823 -2.771639 endloop endfacet facet normal -0.856697 -0.513486 0.049010 outer loop vertex 2.482401 1.658686 -0.294052 vertex 2.633027 1.407382 -0.294052 vertex 2.645768 1.414191 -0.000001 endloop endfacet facet normal -0.856698 -0.513484 0.049012 outer loop vertex 2.645768 1.414191 -0.000001 vertex 2.494413 1.666712 -0.000001 vertex 2.482401 1.658686 -0.294052 endloop endfacet facet normal -0.441349 -0.264536 -0.857457 outer loop vertex 1.385823 0.925976 2.494409 vertex 1.469912 0.785683 2.494409 vertex 1.247209 0.666646 2.645763 endloop endfacet facet normal -0.441348 -0.264537 -0.857457 outer loop vertex 1.247209 0.666646 2.645763 vertex 1.175860 0.785683 2.645763 vertex 1.385823 0.925976 2.494409 endloop endfacet facet normal -0.511346 -0.306487 0.802864 outer loop vertex 1.385823 0.925975 -2.494410 vertex 1.469911 0.785682 -2.494410 vertex 1.678458 0.897153 -2.319033 endloop endfacet facet normal -0.511345 -0.306491 0.802863 outer loop vertex 1.678458 0.897153 -2.319033 vertex 1.582439 1.057350 -2.319033 vertex 1.385823 0.925975 -2.494410 endloop endfacet facet normal -0.289268 -0.173380 -0.941415 outer loop vertex 0.954573 0.637824 2.771639 vertex 1.012494 0.541188 2.771639 vertex 0.768029 0.410519 2.870821 endloop endfacet facet normal -0.289268 -0.173380 -0.941416 outer loop vertex 0.768029 0.410519 2.870821 vertex 0.724093 0.483822 2.870821 vertex 0.954573 0.637824 2.771639 endloop endfacet facet normal -0.848467 -0.508552 -0.146557 outer loop vertex 2.482401 1.658686 0.294051 vertex 2.633027 1.407382 0.294051 vertex 2.594930 1.387018 0.585271 endloop endfacet facet normal -0.848466 -0.508553 -0.146558 outer loop vertex 2.594930 1.387018 0.585271 vertex 2.446483 1.634686 0.585271 vertex 2.482401 1.658686 0.294051 endloop endfacet facet normal -0.635879 -0.381131 0.671117 outer loop vertex 1.763816 1.178543 -2.121322 vertex 1.870840 0.999984 -2.121322 vertex 2.045207 1.093185 -1.903181 endloop endfacet facet normal -0.635879 -0.381131 0.671116 outer loop vertex 2.045207 1.093185 -1.903181 vertex 1.928208 1.288386 -1.903181 vertex 1.763816 1.178543 -2.121322 endloop endfacet facet normal -0.126003 -0.075522 -0.989151 outer loop vertex 0.486639 0.325161 2.942356 vertex 0.516167 0.275896 2.942356 vertex 0.259335 0.138616 2.985554 endloop endfacet facet normal -0.126002 -0.075524 -0.989151 outer loop vertex 0.259335 0.138616 2.985554 vertex 0.244499 0.163368 2.985554 vertex 0.486639 0.325161 2.942356 endloop endfacet facet normal -0.807700 -0.484114 -0.336533 outer loop vertex 2.387005 1.594944 0.870853 vertex 2.531842 1.353297 0.870853 vertex 2.444370 1.306542 1.148050 endloop endfacet facet normal -0.807697 -0.484117 -0.336536 outer loop vertex 2.444370 1.306542 1.148050 vertex 2.304536 1.539840 1.148050 vertex 2.387005 1.594944 0.870853 endloop endfacet facet normal -0.735933 -0.441102 0.513645 outer loop vertex 2.074029 1.385820 -1.666712 vertex 2.199876 1.175857 -1.666712 vertex 2.333359 1.247205 -1.414191 endloop endfacet facet normal -0.735933 -0.441099 0.513647 outer loop vertex 2.333359 1.247205 -1.414191 vertex 2.199876 1.469909 -1.414191 vertex 2.074029 1.385820 -1.666712 endloop endfacet facet normal -0.735935 -0.441100 -0.513644 outer loop vertex 2.199876 1.469909 1.414190 vertex 2.333359 1.247205 1.414190 vertex 2.199877 1.175857 1.666711 endloop endfacet facet normal -0.735931 -0.441104 -0.513647 outer loop vertex 2.199877 1.175857 1.666711 vertex 2.074029 1.385820 1.666711 vertex 2.199876 1.469909 1.414190 endloop endfacet facet normal -0.126000 -0.075526 0.989151 outer loop vertex 0.244497 0.163366 -2.985554 vertex 0.259333 0.138615 -2.985554 vertex 0.516166 0.275895 -2.942356 endloop endfacet facet normal -0.126001 -0.075523 0.989151 outer loop vertex 0.516166 0.275895 -2.942356 vertex 0.486638 0.325159 -2.942356 vertex 0.244497 0.163366 -2.985554 endloop endfacet facet normal -0.807699 -0.484116 0.336531 outer loop vertex 2.304537 1.539841 -1.148051 vertex 2.444371 1.306542 -1.148051 vertex 2.531842 1.353297 -0.870855 endloop endfacet facet normal -0.807699 -0.484118 0.336530 outer loop vertex 2.531842 1.353297 -0.870855 vertex 2.387004 1.594944 -0.870855 vertex 2.304537 1.539841 -1.148051 endloop endfacet facet normal -0.635881 -0.381130 -0.671115 outer loop vertex 1.928208 1.288387 1.903180 vertex 2.045207 1.093185 1.903180 vertex 1.870841 0.999984 2.121321 endloop endfacet facet normal -0.635879 -0.381131 -0.671116 outer loop vertex 1.870841 0.999984 2.121321 vertex 1.763817 1.178543 2.121321 vertex 1.928208 1.288387 1.903180 endloop endfacet facet normal -0.289266 -0.173383 0.941416 outer loop vertex 0.724091 0.483821 -2.870821 vertex 0.768028 0.410518 -2.870821 vertex 1.012493 0.541188 -2.771639 endloop endfacet facet normal -0.289267 -0.173380 0.941416 outer loop vertex 1.012493 0.541188 -2.771639 vertex 0.954572 0.637823 -2.771639 vertex 0.724091 0.483821 -2.870821 endloop endfacet facet normal -0.848468 -0.508549 0.146561 outer loop vertex 2.446483 1.634686 -0.585272 vertex 2.594929 1.387017 -0.585272 vertex 2.633027 1.407382 -0.294052 endloop endfacet facet normal -0.848466 -0.508552 0.146558 outer loop vertex 2.633027 1.407382 -0.294052 vertex 2.482401 1.658686 -0.294052 vertex 2.446483 1.634686 -0.585272 endloop endfacet facet normal -0.511344 -0.306490 -0.802864 outer loop vertex 1.582440 1.057351 2.319032 vertex 1.678459 0.897154 2.319032 vertex 1.469912 0.785683 2.494409 endloop endfacet facet normal -0.511344 -0.306490 -0.802864 outer loop vertex 1.469912 0.785683 2.494409 vertex 1.385823 0.925976 2.494409 vertex 1.582440 1.057351 2.319032 endloop endfacet facet normal -0.441349 -0.264535 0.857457 outer loop vertex 1.175859 0.785682 -2.645764 vertex 1.247207 0.666645 -2.645764 vertex 1.469911 0.785682 -2.494410 endloop endfacet facet normal -0.441349 -0.264533 0.857457 outer loop vertex 1.469911 0.785682 -2.494410 vertex 1.385823 0.925975 -2.494410 vertex 1.175859 0.785682 -2.645764 endloop endfacet facet normal -0.367089 -0.220027 -0.903789 outer loop vertex 1.175860 0.785683 2.645763 vertex 1.247209 0.666646 2.645763 vertex 1.012494 0.541188 2.771639 endloop endfacet facet normal -0.367092 -0.220025 -0.903788 outer loop vertex 1.012494 0.541188 2.771639 vertex 0.954573 0.637824 2.771639 vertex 1.175860 0.785683 2.645763 endloop endfacet facet normal -0.856698 -0.513484 -0.049010 outer loop vertex 2.494413 1.666712 -0.000001 vertex 2.645768 1.414191 -0.000001 vertex 2.633027 1.407382 0.294051 endloop endfacet facet normal -0.856697 -0.513486 -0.049011 outer loop vertex 2.633027 1.407382 0.294051 vertex 2.482401 1.658686 0.294051 vertex 2.494413 1.666712 -0.000001 endloop endfacet facet normal -0.576396 -0.345481 0.740547 outer loop vertex 1.582439 1.057350 -2.319033 vertex 1.678458 0.897153 -2.319033 vertex 1.870840 0.999984 -2.121322 endloop endfacet facet normal -0.576396 -0.345478 0.740548 outer loop vertex 1.870840 0.999984 -2.121322 vertex 1.763816 1.178543 -2.121322 vertex 1.582439 1.057350 -2.319033 endloop endfacet facet normal -0.208648 -0.125059 -0.969962 outer loop vertex 0.724093 0.483822 2.870821 vertex 0.768029 0.410519 2.870821 vertex 0.516167 0.275896 2.942356 endloop endfacet facet normal -0.208649 -0.125058 -0.969962 outer loop vertex 0.516167 0.275896 2.942356 vertex 0.486639 0.325161 2.942356 vertex 0.724093 0.483822 2.870821 endloop endfacet facet normal -0.832082 -0.498733 -0.242705 outer loop vertex 2.446483 1.634686 0.585271 vertex 2.594930 1.387018 0.585271 vertex 2.531842 1.353297 0.870853 endloop endfacet facet normal -0.832085 -0.498730 -0.242701 outer loop vertex 2.531842 1.353297 0.870853 vertex 2.387005 1.594944 0.870853 vertex 2.446483 1.634686 0.585271 endloop endfacet facet normal -0.689229 -0.413108 0.595236 outer loop vertex 1.928208 1.288386 -1.903181 vertex 2.045207 1.093185 -1.903181 vertex 2.199876 1.175857 -1.666712 endloop endfacet facet normal -0.689229 -0.413108 0.595236 outer loop vertex 2.199876 1.175857 -1.666712 vertex 2.074029 1.385820 -1.666712 vertex 1.928208 1.288386 -1.903181 endloop endfacet facet normal -0.775548 -0.464847 -0.427132 outer loop vertex 2.304536 1.539840 1.148050 vertex 2.444370 1.306542 1.148050 vertex 2.333359 1.247205 1.414190 endloop endfacet facet normal -0.775551 -0.464845 -0.427130 outer loop vertex 2.333359 1.247205 1.414190 vertex 2.199876 1.469909 1.414190 vertex 2.304536 1.539840 1.148050 endloop endfacet facet normal -0.775549 -0.464844 0.427135 outer loop vertex 2.199876 1.469909 -1.414191 vertex 2.333359 1.247205 -1.414191 vertex 2.444371 1.306542 -1.148051 endloop endfacet facet normal -0.775549 -0.464846 0.427134 outer loop vertex 2.444371 1.306542 -1.148051 vertex 2.304537 1.539841 -1.148051 vertex 2.199876 1.469909 -1.414191 endloop endfacet facet normal -0.689226 -0.413110 -0.595237 outer loop vertex 2.074029 1.385820 1.666711 vertex 2.199877 1.175857 1.666711 vertex 2.045207 1.093185 1.903180 endloop endfacet facet normal -0.689230 -0.413107 -0.595235 outer loop vertex 2.045207 1.093185 1.903180 vertex 1.928208 1.288387 1.903180 vertex 2.074029 1.385820 1.666711 endloop endfacet facet normal -0.208648 -0.125060 0.969962 outer loop vertex 0.486638 0.325159 -2.942356 vertex 0.516166 0.275895 -2.942356 vertex 0.768028 0.410518 -2.870821 endloop endfacet facet normal -0.208647 -0.125061 0.969962 outer loop vertex 0.768028 0.410518 -2.870821 vertex 0.724091 0.483821 -2.870821 vertex 0.486638 0.325159 -2.942356 endloop endfacet facet normal -0.832083 -0.498733 0.242700 outer loop vertex 2.387004 1.594944 -0.870855 vertex 2.531842 1.353297 -0.870855 vertex 2.594929 1.387017 -0.585272 endloop endfacet facet normal -0.832084 -0.498729 0.242704 outer loop vertex 2.594929 1.387017 -0.585272 vertex 2.446483 1.634686 -0.585272 vertex 2.387004 1.594944 -0.870855 endloop endfacet facet normal -0.576398 -0.345479 -0.740547 outer loop vertex 1.763817 1.178543 2.121321 vertex 1.870841 0.999984 2.121321 vertex 1.678459 0.897154 2.319032 endloop endfacet facet normal -0.576396 -0.345481 -0.740548 outer loop vertex 1.678459 0.897154 2.319032 vertex 1.582440 1.057351 2.319032 vertex 1.763817 1.178543 2.121321 endloop endfacet facet normal -0.304870 -0.144191 0.941416 outer loop vertex 0.768028 0.410518 -2.870821 vertex 0.804567 0.333262 -2.870821 vertex 1.060663 0.439340 -2.771639 endloop endfacet facet normal -0.304870 -0.144191 0.941416 outer loop vertex 1.060663 0.439340 -2.771639 vertex 1.012493 0.541188 -2.771639 vertex 0.768028 0.410518 -2.870821 endloop endfacet facet normal -0.894227 -0.422941 0.146558 outer loop vertex 2.594929 1.387017 -0.585272 vertex 2.718386 1.125991 -0.585272 vertex 2.758296 1.142523 -0.294052 endloop endfacet facet normal -0.894228 -0.422938 0.146561 outer loop vertex 2.758296 1.142523 -0.294052 vertex 2.633027 1.407382 -0.294052 vertex 2.594929 1.387017 -0.585272 endloop endfacet facet normal -0.538925 -0.254891 -0.802864 outer loop vertex 1.678459 0.897154 2.319032 vertex 1.758313 0.728316 2.319032 vertex 1.539844 0.637824 2.494409 endloop endfacet facet normal -0.538924 -0.254892 -0.802864 outer loop vertex 1.539844 0.637824 2.494409 vertex 1.469912 0.785683 2.494409 vertex 1.678459 0.897154 2.319032 endloop endfacet facet normal -0.465153 -0.220000 0.857457 outer loop vertex 1.247207 0.666645 -2.645764 vertex 1.306544 0.541187 -2.645764 vertex 1.539843 0.637823 -2.494410 endloop endfacet facet normal -0.465153 -0.220001 0.857457 outer loop vertex 1.539843 0.637823 -2.494410 vertex 1.469911 0.785682 -2.494410 vertex 1.247207 0.666645 -2.645764 endloop endfacet facet normal -0.386889 -0.182984 -0.903788 outer loop vertex 1.247209 0.666646 2.645763 vertex 1.306546 0.541188 2.645763 vertex 1.060664 0.439341 2.771639 endloop endfacet facet normal -0.386889 -0.182985 -0.903789 outer loop vertex 1.060664 0.439341 2.771639 vertex 1.012494 0.541188 2.771639 vertex 1.247209 0.666646 2.645763 endloop endfacet facet normal -0.902903 -0.427042 -0.049011 outer loop vertex 2.645768 1.414191 -0.000001 vertex 2.771643 1.148051 -0.000001 vertex 2.758296 1.142523 0.294051 endloop endfacet facet normal -0.902903 -0.427041 -0.049010 outer loop vertex 2.758296 1.142523 0.294051 vertex 2.633027 1.407382 0.294051 vertex 2.645768 1.414191 -0.000001 endloop endfacet facet normal -0.607484 -0.287319 0.740548 outer loop vertex 1.678458 0.897153 -2.319033 vertex 1.758312 0.728316 -2.319033 vertex 1.959847 0.811795 -2.121322 endloop endfacet facet normal -0.607484 -0.287319 0.740547 outer loop vertex 1.959847 0.811795 -2.121322 vertex 1.870840 0.999984 -2.121322 vertex 1.678458 0.897153 -2.319033 endloop endfacet facet normal -0.219901 -0.104006 -0.969962 outer loop vertex 0.768029 0.410519 2.870821 vertex 0.804569 0.333262 2.870821 vertex 0.540724 0.223974 2.942356 endloop endfacet facet normal -0.219902 -0.104005 -0.969962 outer loop vertex 0.540724 0.223974 2.942356 vertex 0.516167 0.275896 2.942356 vertex 0.768029 0.410519 2.870821 endloop endfacet facet normal -0.876961 -0.414770 -0.242703 outer loop vertex 2.594930 1.387018 0.585271 vertex 2.718386 1.125991 0.585271 vertex 2.652297 1.098616 0.870853 endloop endfacet facet normal -0.876960 -0.414771 -0.242705 outer loop vertex 2.652297 1.098616 0.870853 vertex 2.531842 1.353297 0.870853 vertex 2.594930 1.387018 0.585271 endloop endfacet facet normal -0.726401 -0.343560 0.595237 outer loop vertex 2.045207 1.093185 -1.903181 vertex 2.142509 0.887456 -1.903181 vertex 2.304537 0.954570 -1.666712 endloop endfacet facet normal -0.726401 -0.343562 0.595236 outer loop vertex 2.304537 0.954570 -1.666712 vertex 2.199876 1.175857 -1.666712 vertex 2.045207 1.093185 -1.903181 endloop endfacet facet normal -0.817379 -0.386590 -0.427130 outer loop vertex 2.444370 1.306542 1.148050 vertex 2.560663 1.060660 1.148050 vertex 2.444371 1.012491 1.414190 endloop endfacet facet normal -0.817377 -0.386592 -0.427132 outer loop vertex 2.444371 1.012491 1.414190 vertex 2.333359 1.247205 1.414190 vertex 2.444370 1.306542 1.148050 endloop endfacet facet normal -0.817376 -0.386592 0.427133 outer loop vertex 2.333359 1.247205 -1.414191 vertex 2.444371 1.012491 -1.414191 vertex 2.560664 1.060661 -1.148051 endloop endfacet facet normal -0.817376 -0.386590 0.427135 outer loop vertex 2.560664 1.060661 -1.148051 vertex 2.444371 1.306542 -1.148051 vertex 2.333359 1.247205 -1.414191 endloop endfacet facet normal -0.726402 -0.343561 -0.595236 outer loop vertex 2.199877 1.175857 1.666711 vertex 2.304538 0.954569 1.666711 vertex 2.142510 0.887456 1.903180 endloop endfacet facet normal -0.726400 -0.343563 -0.595238 outer loop vertex 2.142510 0.887456 1.903180 vertex 2.045207 1.093185 1.903180 vertex 2.199877 1.175857 1.666711 endloop endfacet facet normal -0.219901 -0.104007 0.969962 outer loop vertex 0.516166 0.275895 -2.942356 vertex 0.540723 0.223974 -2.942356 vertex 0.804567 0.333262 -2.870821 endloop endfacet facet normal -0.219902 -0.104005 0.969962 outer loop vertex 0.804567 0.333262 -2.870821 vertex 0.768028 0.410518 -2.870821 vertex 0.516166 0.275895 -2.942356 endloop endfacet facet normal -0.876961 -0.414771 0.242703 outer loop vertex 2.531842 1.353297 -0.870855 vertex 2.652297 1.098616 -0.870855 vertex 2.718386 1.125991 -0.585272 endloop endfacet facet normal -0.876960 -0.414774 0.242700 outer loop vertex 2.718386 1.125991 -0.585272 vertex 2.594929 1.387017 -0.585272 vertex 2.531842 1.353297 -0.870855 endloop endfacet facet normal -0.607484 -0.287319 -0.740548 outer loop vertex 1.870841 0.999984 2.121321 vertex 1.959848 0.811795 2.121321 vertex 1.758313 0.728316 2.319032 endloop endfacet facet normal -0.607486 -0.287318 -0.740547 outer loop vertex 1.758313 0.728316 2.319032 vertex 1.678459 0.897154 2.319032 vertex 1.870841 0.999984 2.121321 endloop endfacet facet normal -0.386888 -0.182982 0.903789 outer loop vertex 1.012493 0.541188 -2.771639 vertex 1.060663 0.439340 -2.771639 vertex 1.306544 0.541187 -2.645764 endloop endfacet facet normal -0.386888 -0.182983 0.903789 outer loop vertex 1.306544 0.541187 -2.645764 vertex 1.247207 0.666645 -2.645764 vertex 1.012493 0.541188 -2.771639 endloop endfacet facet normal -0.902903 -0.427041 0.049011 outer loop vertex 2.633027 1.407382 -0.294052 vertex 2.758296 1.142523 -0.294052 vertex 2.771643 1.148051 -0.000001 endloop endfacet facet normal -0.902903 -0.427042 0.049010 outer loop vertex 2.771643 1.148051 -0.000001 vertex 2.645768 1.414191 -0.000001 vertex 2.633027 1.407382 -0.294052 endloop endfacet facet normal -0.465153 -0.220001 -0.857457 outer loop vertex 1.469912 0.785683 2.494409 vertex 1.539844 0.637824 2.494409 vertex 1.306546 0.541188 2.645763 endloop endfacet facet normal -0.465154 -0.220001 -0.857457 outer loop vertex 1.306546 0.541188 2.645763 vertex 1.247209 0.666646 2.645763 vertex 1.469912 0.785683 2.494409 endloop endfacet facet normal -0.538924 -0.254891 0.802864 outer loop vertex 1.469911 0.785682 -2.494410 vertex 1.539843 0.637823 -2.494410 vertex 1.758312 0.728316 -2.319033 endloop endfacet facet normal -0.538924 -0.254892 0.802864 outer loop vertex 1.758312 0.728316 -2.319033 vertex 1.678458 0.897153 -2.319033 vertex 1.469911 0.785682 -2.494410 endloop endfacet facet normal -0.304869 -0.144193 -0.941415 outer loop vertex 1.012494 0.541188 2.771639 vertex 1.060664 0.439341 2.771639 vertex 0.804569 0.333262 2.870821 endloop endfacet facet normal -0.304869 -0.144193 -0.941416 outer loop vertex 0.804569 0.333262 2.870821 vertex 0.768029 0.410519 2.870821 vertex 1.012494 0.541188 2.771639 endloop endfacet facet normal -0.894228 -0.422938 -0.146558 outer loop vertex 2.633027 1.407382 0.294051 vertex 2.758296 1.142523 0.294051 vertex 2.718386 1.125991 0.585271 endloop endfacet facet normal -0.894229 -0.422937 -0.146557 outer loop vertex 2.718386 1.125991 0.585271 vertex 2.594930 1.387018 0.585271 vertex 2.633027 1.407382 0.294051 endloop endfacet facet normal -0.670175 -0.316970 0.671115 outer loop vertex 1.870840 0.999984 -2.121322 vertex 1.959847 0.811795 -2.121322 vertex 2.142509 0.887456 -1.903181 endloop endfacet facet normal -0.670175 -0.316967 0.671117 outer loop vertex 2.142509 0.887456 -1.903181 vertex 2.045207 1.093185 -1.903181 vertex 1.870840 0.999984 -2.121322 endloop endfacet facet normal -0.132799 -0.062808 -0.989151 outer loop vertex 0.516167 0.275896 2.942356 vertex 0.540724 0.223974 2.942356 vertex 0.271673 0.112530 2.985554 endloop endfacet facet normal -0.132798 -0.062810 -0.989151 outer loop vertex 0.271673 0.112530 2.985554 vertex 0.259335 0.138616 2.985554 vertex 0.516167 0.275896 2.942356 endloop endfacet facet normal -0.851261 -0.402616 -0.336534 outer loop vertex 2.531842 1.353297 0.870853 vertex 2.652297 1.098616 0.870853 vertex 2.560663 1.060660 1.148050 endloop endfacet facet normal -0.851262 -0.402615 -0.336533 outer loop vertex 2.560663 1.060660 1.148050 vertex 2.444370 1.306542 1.148050 vertex 2.531842 1.353297 0.870853 endloop endfacet facet normal -0.775625 -0.366843 0.513646 outer loop vertex 2.199876 1.175857 -1.666712 vertex 2.304537 0.954570 -1.666712 vertex 2.444371 1.012491 -1.414191 endloop endfacet facet normal -0.775624 -0.366845 0.513645 outer loop vertex 2.444371 1.012491 -1.414191 vertex 2.333359 1.247205 -1.414191 vertex 2.199876 1.175857 -1.666712 endloop endfacet facet normal -0.775624 -0.366845 -0.513646 outer loop vertex 2.333359 1.247205 1.414190 vertex 2.444371 1.012491 1.414190 vertex 2.304538 0.954569 1.666711 endloop endfacet facet normal -0.775627 -0.366843 -0.513643 outer loop vertex 2.304538 0.954569 1.666711 vertex 2.199877 1.175857 1.666711 vertex 2.333359 1.247205 1.414190 endloop endfacet facet normal -0.132797 -0.062810 0.989151 outer loop vertex 0.259333 0.138615 -2.985554 vertex 0.271671 0.112529 -2.985554 vertex 0.540723 0.223974 -2.942356 endloop endfacet facet normal -0.132798 -0.062809 0.989151 outer loop vertex 0.540723 0.223974 -2.942356 vertex 0.516166 0.275895 -2.942356 vertex 0.259333 0.138615 -2.985554 endloop endfacet facet normal -0.851262 -0.402616 0.336531 outer loop vertex 2.444371 1.306542 -1.148051 vertex 2.560664 1.060661 -1.148051 vertex 2.652297 1.098616 -0.870855 endloop endfacet facet normal -0.851262 -0.402617 0.336531 outer loop vertex 2.652297 1.098616 -0.870855 vertex 2.531842 1.353297 -0.870855 vertex 2.444371 1.306542 -1.148051 endloop endfacet facet normal -0.670175 -0.316970 -0.671115 outer loop vertex 2.045207 1.093185 1.903180 vertex 2.142510 0.887456 1.903180 vertex 1.959848 0.811795 2.121321 endloop endfacet facet normal -0.670175 -0.316970 -0.671115 outer loop vertex 1.959848 0.811795 2.121321 vertex 1.870841 0.999984 2.121321 vertex 2.045207 1.093185 1.903180 endloop endfacet facet normal -0.229038 -0.081948 0.969962 outer loop vertex 0.540723 0.223974 -2.942356 vertex 0.560072 0.169895 -2.942356 vertex 0.833358 0.252796 -2.870821 endloop endfacet facet normal -0.229037 -0.081950 0.969962 outer loop vertex 0.833358 0.252796 -2.870821 vertex 0.804567 0.333262 -2.870821 vertex 0.540723 0.223974 -2.942356 endloop endfacet facet normal -0.913393 -0.326816 0.242702 outer loop vertex 2.652297 1.098616 -0.870855 vertex 2.747208 0.833356 -0.870855 vertex 2.815662 0.854121 -0.585272 endloop endfacet facet normal -0.913393 -0.326815 0.242703 outer loop vertex 2.815662 0.854121 -0.585272 vertex 2.718386 1.125991 -0.585272 vertex 2.652297 1.098616 -0.870855 endloop endfacet facet normal -0.632721 -0.226392 -0.740548 outer loop vertex 1.959848 0.811795 2.121321 vertex 2.029981 0.615787 2.121321 vertex 1.821234 0.552464 2.319032 endloop endfacet facet normal -0.632721 -0.226392 -0.740548 outer loop vertex 1.821234 0.552464 2.319032 vertex 1.758313 0.728316 2.319032 vertex 1.959848 0.811795 2.121321 endloop endfacet facet normal -0.402958 -0.144183 0.903790 outer loop vertex 1.060663 0.439340 -2.771639 vertex 1.098619 0.333262 -2.771639 vertex 1.353299 0.410518 -2.645764 endloop endfacet facet normal -0.402958 -0.144184 0.903790 outer loop vertex 1.353299 0.410518 -2.645764 vertex 1.306544 0.541187 -2.645764 vertex 1.060663 0.439340 -2.771639 endloop endfacet facet normal -0.940412 -0.336485 0.049013 outer loop vertex 2.758296 1.142523 -0.294052 vertex 2.857001 0.866661 -0.294052 vertex 2.870826 0.870855 -0.000001 endloop endfacet facet normal -0.940412 -0.336487 0.049011 outer loop vertex 2.870826 0.870855 -0.000001 vertex 2.771643 1.148051 -0.000001 vertex 2.758296 1.142523 -0.294052 endloop endfacet facet normal -0.484477 -0.173348 -0.857457 outer loop vertex 1.539844 0.637824 2.494409 vertex 1.594947 0.483821 2.494409 vertex 1.353300 0.410518 2.645763 endloop endfacet facet normal -0.484478 -0.173347 -0.857457 outer loop vertex 1.353300 0.410518 2.645763 vertex 1.306546 0.541188 2.645763 vertex 1.539844 0.637824 2.494409 endloop endfacet facet normal -0.561312 -0.200842 0.802864 outer loop vertex 1.539843 0.637823 -2.494410 vertex 1.594946 0.483821 -2.494410 vertex 1.821233 0.552464 -2.319033 endloop endfacet facet normal -0.561312 -0.200841 0.802864 outer loop vertex 1.821233 0.552464 -2.319033 vertex 1.758312 0.728316 -2.319033 vertex 1.539843 0.637823 -2.494410 endloop endfacet facet normal -0.317534 -0.113616 -0.941416 outer loop vertex 1.060664 0.439341 2.771639 vertex 1.098620 0.333262 2.771639 vertex 0.833360 0.252796 2.870821 endloop endfacet facet normal -0.317535 -0.113615 -0.941415 outer loop vertex 0.833360 0.252796 2.870821 vertex 0.804569 0.333262 2.870821 vertex 1.060664 0.439341 2.771639 endloop endfacet facet normal -0.931377 -0.333252 -0.146557 outer loop vertex 2.758296 1.142523 0.294051 vertex 2.857001 0.866661 0.294051 vertex 2.815663 0.854121 0.585271 endloop endfacet facet normal -0.931377 -0.333254 -0.146558 outer loop vertex 2.815663 0.854121 0.585271 vertex 2.718386 1.125991 0.585271 vertex 2.758296 1.142523 0.294051 endloop endfacet facet normal -0.698017 -0.249755 0.671115 outer loop vertex 1.959847 0.811795 -2.121322 vertex 2.029980 0.615787 -2.121322 vertex 2.219178 0.673180 -1.903181 endloop endfacet facet normal -0.698017 -0.249754 0.671115 outer loop vertex 2.219178 0.673180 -1.903181 vertex 2.142509 0.887456 -1.903181 vertex 1.959847 0.811795 -2.121322 endloop endfacet facet normal -0.138314 -0.049491 -0.989151 outer loop vertex 0.540724 0.223974 2.942356 vertex 0.560074 0.169896 2.942356 vertex 0.281394 0.085359 2.985554 endloop endfacet facet normal -0.138317 -0.049486 -0.989151 outer loop vertex 0.281394 0.085359 2.985554 vertex 0.271673 0.112530 2.985554 vertex 0.540724 0.223974 2.942356 endloop endfacet facet normal -0.886624 -0.317241 -0.336534 outer loop vertex 2.652297 1.098616 0.870853 vertex 2.747209 0.833356 0.870853 vertex 2.652296 0.804564 1.148050 endloop endfacet facet normal -0.886625 -0.317241 -0.336534 outer loop vertex 2.652296 0.804564 1.148050 vertex 2.560663 1.060660 1.148050 vertex 2.652297 1.098616 0.870853 endloop endfacet facet normal -0.807847 -0.289055 0.513644 outer loop vertex 2.304537 0.954570 -1.666712 vertex 2.387005 0.724089 -1.666712 vertex 2.531842 0.768025 -1.414191 endloop endfacet facet normal -0.807847 -0.289051 0.513646 outer loop vertex 2.531842 0.768025 -1.414191 vertex 2.444371 1.012491 -1.414191 vertex 2.304537 0.954570 -1.666712 endloop endfacet facet normal -0.807848 -0.289052 -0.513644 outer loop vertex 2.444371 1.012491 1.414190 vertex 2.531842 0.768025 1.414190 vertex 2.387005 0.724089 1.666711 endloop endfacet facet normal -0.807847 -0.289052 -0.513645 outer loop vertex 2.387005 0.724089 1.666711 vertex 2.304538 0.954569 1.666711 vertex 2.444371 1.012491 1.414190 endloop endfacet facet normal -0.138316 -0.049487 0.989151 outer loop vertex 0.271671 0.112529 -2.985554 vertex 0.281392 0.085359 -2.985554 vertex 0.560072 0.169895 -2.942356 endloop endfacet facet normal -0.138315 -0.049488 0.989151 outer loop vertex 0.560072 0.169895 -2.942356 vertex 0.540723 0.223974 -2.942356 vertex 0.271671 0.112529 -2.985554 endloop endfacet facet normal -0.886626 -0.317238 0.336531 outer loop vertex 2.560664 1.060661 -1.148051 vertex 2.652296 0.804565 -1.148051 vertex 2.747208 0.833356 -0.870855 endloop endfacet facet normal -0.886626 -0.317239 0.336531 outer loop vertex 2.747208 0.833356 -0.870855 vertex 2.652297 1.098616 -0.870855 vertex 2.560664 1.060661 -1.148051 endloop endfacet facet normal -0.698017 -0.249754 -0.671115 outer loop vertex 2.142510 0.887456 1.903180 vertex 2.219179 0.673180 1.903180 vertex 2.029981 0.615787 2.121321 endloop endfacet facet normal -0.698016 -0.249755 -0.671115 outer loop vertex 2.029981 0.615787 2.121321 vertex 1.959848 0.811795 2.121321 vertex 2.142510 0.887456 1.903180 endloop endfacet facet normal -0.317534 -0.113615 0.941416 outer loop vertex 0.804567 0.333262 -2.870821 vertex 0.833358 0.252796 -2.870821 vertex 1.098619 0.333262 -2.771639 endloop endfacet facet normal -0.317534 -0.113617 0.941416 outer loop vertex 1.098619 0.333262 -2.771639 vertex 1.060663 0.439340 -2.771639 vertex 0.804567 0.333262 -2.870821 endloop endfacet facet normal -0.931378 -0.333250 0.146560 outer loop vertex 2.718386 1.125991 -0.585272 vertex 2.815662 0.854121 -0.585272 vertex 2.857001 0.866661 -0.294052 endloop endfacet facet normal -0.931377 -0.333252 0.146558 outer loop vertex 2.857001 0.866661 -0.294052 vertex 2.758296 1.142523 -0.294052 vertex 2.718386 1.125991 -0.585272 endloop endfacet facet normal -0.561312 -0.200841 -0.802864 outer loop vertex 1.758313 0.728316 2.319032 vertex 1.821234 0.552464 2.319032 vertex 1.594947 0.483821 2.494409 endloop endfacet facet normal -0.561313 -0.200840 -0.802864 outer loop vertex 1.594947 0.483821 2.494409 vertex 1.539844 0.637824 2.494409 vertex 1.758313 0.728316 2.319032 endloop endfacet facet normal -0.484476 -0.173352 0.857456 outer loop vertex 1.306544 0.541187 -2.645764 vertex 1.353299 0.410518 -2.645764 vertex 1.594946 0.483821 -2.494410 endloop endfacet facet normal -0.484476 -0.173349 0.857457 outer loop vertex 1.594946 0.483821 -2.494410 vertex 1.539843 0.637823 -2.494410 vertex 1.306544 0.541187 -2.645764 endloop endfacet facet normal -0.402963 -0.144181 -0.903788 outer loop vertex 1.306546 0.541188 2.645763 vertex 1.353300 0.410518 2.645763 vertex 1.098620 0.333262 2.771639 endloop endfacet facet normal -0.402961 -0.144183 -0.903788 outer loop vertex 1.098620 0.333262 2.771639 vertex 1.060664 0.439341 2.771639 vertex 1.306546 0.541188 2.645763 endloop endfacet facet normal -0.940412 -0.336487 -0.049013 outer loop vertex 2.771643 1.148051 -0.000001 vertex 2.870826 0.870855 -0.000001 vertex 2.857001 0.866661 0.294051 endloop endfacet facet normal -0.940412 -0.336485 -0.049011 outer loop vertex 2.857001 0.866661 0.294051 vertex 2.758296 1.142523 0.294051 vertex 2.771643 1.148051 -0.000001 endloop endfacet facet normal -0.632721 -0.226392 0.740548 outer loop vertex 1.758312 0.728316 -2.319033 vertex 1.821233 0.552464 -2.319033 vertex 2.029980 0.615787 -2.121322 endloop endfacet facet normal -0.632721 -0.226392 0.740548 outer loop vertex 2.029980 0.615787 -2.121322 vertex 1.959847 0.811795 -2.121322 vertex 1.758312 0.728316 -2.319033 endloop endfacet facet normal -0.229037 -0.081950 -0.969962 outer loop vertex 0.804569 0.333262 2.870821 vertex 0.833360 0.252796 2.870821 vertex 0.560074 0.169896 2.942356 endloop endfacet facet normal -0.229036 -0.081953 -0.969962 outer loop vertex 0.560074 0.169896 2.942356 vertex 0.540724 0.223974 2.942356 vertex 0.804569 0.333262 2.870821 endloop endfacet facet normal -0.913392 -0.326819 -0.242703 outer loop vertex 2.718386 1.125991 0.585271 vertex 2.815663 0.854121 0.585271 vertex 2.747209 0.833356 0.870853 endloop endfacet facet normal -0.913392 -0.326819 -0.242703 outer loop vertex 2.747209 0.833356 0.870853 vertex 2.652297 1.098616 0.870853 vertex 2.718386 1.125991 0.585271 endloop endfacet facet normal -0.756577 -0.270707 0.595239 outer loop vertex 2.142509 0.887456 -1.903181 vertex 2.219178 0.673180 -1.903181 vertex 2.387005 0.724089 -1.666712 endloop endfacet facet normal -0.756577 -0.270710 0.595237 outer loop vertex 2.387005 0.724089 -1.666712 vertex 2.304537 0.954570 -1.666712 vertex 2.142509 0.887456 -1.903181 endloop endfacet facet normal -0.851334 -0.304614 -0.427132 outer loop vertex 2.560663 1.060660 1.148050 vertex 2.652296 0.804564 1.148050 vertex 2.531842 0.768025 1.414190 endloop endfacet facet normal -0.851335 -0.304612 -0.427130 outer loop vertex 2.531842 0.768025 1.414190 vertex 2.444371 1.012491 1.414190 vertex 2.560663 1.060660 1.148050 endloop endfacet facet normal -0.851334 -0.304611 0.427133 outer loop vertex 2.444371 1.012491 -1.414191 vertex 2.531842 0.768025 -1.414191 vertex 2.652296 0.804565 -1.148051 endloop endfacet facet normal -0.851334 -0.304611 0.427133 outer loop vertex 2.652296 0.804565 -1.148051 vertex 2.560664 1.060661 -1.148051 vertex 2.444371 1.012491 -1.414191 endloop endfacet facet normal -0.756578 -0.270708 -0.595237 outer loop vertex 2.304538 0.954569 1.666711 vertex 2.387005 0.724089 1.666711 vertex 2.219179 0.673180 1.903180 endloop endfacet facet normal -0.756579 -0.270707 -0.595236 outer loop vertex 2.219179 0.673180 1.903180 vertex 2.142510 0.887456 1.903180 vertex 2.304538 0.954569 1.666711 endloop endfacet facet normal -0.142499 -0.035696 0.989151 outer loop vertex 0.281392 0.085359 -2.985554 vertex 0.288404 0.057367 -2.985554 vertex 0.574028 0.114181 -2.942356 endloop endfacet facet normal -0.142499 -0.035695 0.989151 outer loop vertex 0.574028 0.114181 -2.942356 vertex 0.560072 0.169895 -2.942356 vertex 0.281392 0.085359 -2.985554 endloop endfacet facet normal -0.913451 -0.228808 0.336532 outer loop vertex 2.652296 0.804565 -1.148051 vertex 2.718386 0.540720 -1.148051 vertex 2.815663 0.560070 -0.870855 endloop endfacet facet normal -0.913451 -0.228809 0.336531 outer loop vertex 2.815663 0.560070 -0.870855 vertex 2.747208 0.833356 -0.870855 vertex 2.652296 0.804565 -1.148051 endloop endfacet facet normal -0.719137 -0.180135 -0.671114 outer loop vertex 2.219179 0.673180 1.903180 vertex 2.274476 0.452422 1.903180 vertex 2.080564 0.413850 2.121321 endloop endfacet facet normal -0.719136 -0.180136 -0.671115 outer loop vertex 2.080564 0.413850 2.121321 vertex 2.029981 0.615787 2.121321 vertex 2.219179 0.673180 1.903180 endloop endfacet facet normal -0.327141 -0.081947 0.941416 outer loop vertex 0.833358 0.252796 -2.870821 vertex 0.854124 0.169896 -2.870821 vertex 1.125994 0.223974 -2.771639 endloop endfacet facet normal -0.327141 -0.081944 0.941416 outer loop vertex 1.125994 0.223974 -2.771639 vertex 1.098619 0.333262 -2.771639 vertex 0.833358 0.252796 -2.870821 endloop endfacet facet normal -0.959557 -0.240359 0.146556 outer loop vertex 2.815662 0.854121 -0.585272 vertex 2.885823 0.574025 -0.585272 vertex 2.928191 0.582453 -0.294052 endloop endfacet facet normal -0.959557 -0.240355 0.146560 outer loop vertex 2.928191 0.582453 -0.294052 vertex 2.857001 0.866661 -0.294052 vertex 2.815662 0.854121 -0.585272 endloop endfacet facet normal -0.578297 -0.144855 -0.802864 outer loop vertex 1.821234 0.552464 2.319032 vertex 1.866615 0.371292 2.319032 vertex 1.634690 0.325160 2.494409 endloop endfacet facet normal -0.578295 -0.144857 -0.802864 outer loop vertex 1.634690 0.325160 2.494409 vertex 1.594947 0.483821 2.494409 vertex 1.821234 0.552464 2.319032 endloop endfacet facet normal -0.499137 -0.125026 0.857456 outer loop vertex 1.353299 0.410518 -2.645764 vertex 1.387020 0.275895 -2.645764 vertex 1.634688 0.325159 -2.494410 endloop endfacet facet normal -0.499137 -0.125025 0.857456 outer loop vertex 1.634688 0.325159 -2.494410 vertex 1.594946 0.483821 -2.494410 vertex 1.353299 0.410518 -2.645764 endloop endfacet facet normal -0.415155 -0.103990 -0.903788 outer loop vertex 1.353300 0.410518 2.645763 vertex 1.387021 0.275895 2.645763 vertex 1.125995 0.223974 2.771639 endloop endfacet facet normal -0.415155 -0.103990 -0.903788 outer loop vertex 1.125995 0.223974 2.771639 vertex 1.098620 0.333262 2.771639 vertex 1.353300 0.410518 2.645763 endloop endfacet facet normal -0.968866 -0.242685 -0.049011 outer loop vertex 2.870826 0.870855 -0.000001 vertex 2.942360 0.585271 -0.000001 vertex 2.928191 0.582453 0.294051 endloop endfacet facet normal -0.968866 -0.242687 -0.049013 outer loop vertex 2.928191 0.582453 0.294051 vertex 2.857001 0.866661 0.294051 vertex 2.870826 0.870855 -0.000001 endloop endfacet facet normal -0.651864 -0.163282 0.740549 outer loop vertex 1.821233 0.552464 -2.319033 vertex 1.866614 0.371292 -2.319033 vertex 2.080563 0.413850 -2.121322 endloop endfacet facet normal -0.651864 -0.163285 0.740548 outer loop vertex 2.080563 0.413850 -2.121322 vertex 2.029980 0.615787 -2.121322 vertex 1.821233 0.552464 -2.319033 endloop endfacet facet normal -0.235967 -0.059106 -0.969962 outer loop vertex 0.833360 0.252796 2.870821 vertex 0.854125 0.169896 2.870821 vertex 0.574030 0.114181 2.942356 endloop endfacet facet normal -0.235967 -0.059107 -0.969962 outer loop vertex 0.574030 0.114181 2.942356 vertex 0.560074 0.169896 2.942356 vertex 0.833360 0.252796 2.870821 endloop endfacet facet normal -0.941028 -0.235714 -0.242704 outer loop vertex 2.815663 0.854121 0.585271 vertex 2.885823 0.574025 0.585271 vertex 2.815663 0.560070 0.870853 endloop endfacet facet normal -0.941028 -0.235713 -0.242704 outer loop vertex 2.815663 0.560070 0.870853 vertex 2.747209 0.833356 0.870853 vertex 2.815663 0.854121 0.585271 endloop endfacet facet normal -0.779468 -0.195250 0.595236 outer loop vertex 2.219178 0.673180 -1.903181 vertex 2.274476 0.452422 -1.903181 vertex 2.446484 0.486635 -1.666712 endloop endfacet facet normal -0.779467 -0.195246 0.595239 outer loop vertex 2.446484 0.486635 -1.666712 vertex 2.387005 0.724089 -1.666712 vertex 2.219178 0.673180 -1.903181 endloop endfacet facet normal -0.877094 -0.219699 -0.427128 outer loop vertex 2.652296 0.804564 1.148050 vertex 2.718385 0.540720 1.148050 vertex 2.594931 0.516163 1.414190 endloop endfacet facet normal -0.877091 -0.219703 -0.427132 outer loop vertex 2.594931 0.516163 1.414190 vertex 2.531842 0.768025 1.414190 vertex 2.652296 0.804564 1.148050 endloop endfacet facet normal -0.877091 -0.219699 0.427134 outer loop vertex 2.531842 0.768025 -1.414191 vertex 2.594930 0.516163 -1.414191 vertex 2.718386 0.540720 -1.148051 endloop endfacet facet normal -0.877091 -0.219700 0.427133 outer loop vertex 2.718386 0.540720 -1.148051 vertex 2.652296 0.804565 -1.148051 vertex 2.531842 0.768025 -1.414191 endloop endfacet facet normal -0.779469 -0.195246 -0.595236 outer loop vertex 2.387005 0.724089 1.666711 vertex 2.446484 0.486635 1.666711 vertex 2.274476 0.452422 1.903180 endloop endfacet facet normal -0.779469 -0.195247 -0.595237 outer loop vertex 2.274476 0.452422 1.903180 vertex 2.219179 0.673180 1.903180 vertex 2.387005 0.724089 1.666711 endloop endfacet facet normal -0.235966 -0.059108 0.969962 outer loop vertex 0.560072 0.169895 -2.942356 vertex 0.574028 0.114181 -2.942356 vertex 0.854124 0.169896 -2.870821 endloop endfacet facet normal -0.235966 -0.059108 0.969962 outer loop vertex 0.854124 0.169896 -2.870821 vertex 0.833358 0.252796 -2.870821 vertex 0.560072 0.169895 -2.942356 endloop endfacet facet normal -0.941028 -0.235717 0.242703 outer loop vertex 2.747208 0.833356 -0.870855 vertex 2.815663 0.560070 -0.870855 vertex 2.885823 0.574025 -0.585272 endloop endfacet facet normal -0.941028 -0.235717 0.242702 outer loop vertex 2.885823 0.574025 -0.585272 vertex 2.815662 0.854121 -0.585272 vertex 2.747208 0.833356 -0.870855 endloop endfacet facet normal -0.651863 -0.163285 -0.740548 outer loop vertex 2.029981 0.615787 2.121321 vertex 2.080564 0.413850 2.121321 vertex 1.866615 0.371292 2.319032 endloop endfacet facet normal -0.651865 -0.163283 -0.740548 outer loop vertex 1.866615 0.371292 2.319032 vertex 1.821234 0.552464 2.319032 vertex 2.029981 0.615787 2.121321 endloop endfacet facet normal -0.415151 -0.103989 0.903790 outer loop vertex 1.098619 0.333262 -2.771639 vertex 1.125994 0.223974 -2.771639 vertex 1.387020 0.275895 -2.645764 endloop endfacet facet normal -0.415151 -0.103989 0.903790 outer loop vertex 1.387020 0.275895 -2.645764 vertex 1.353299 0.410518 -2.645764 vertex 1.098619 0.333262 -2.771639 endloop endfacet facet normal -0.968866 -0.242687 0.049011 outer loop vertex 2.857001 0.866661 -0.294052 vertex 2.928191 0.582453 -0.294052 vertex 2.942360 0.585271 -0.000001 endloop endfacet facet normal -0.968866 -0.242684 0.049013 outer loop vertex 2.942360 0.585271 -0.000001 vertex 2.870826 0.870855 -0.000001 vertex 2.857001 0.866661 -0.294052 endloop endfacet facet normal -0.499134 -0.125028 -0.857458 outer loop vertex 1.594947 0.483821 2.494409 vertex 1.634690 0.325160 2.494409 vertex 1.387021 0.275895 2.645763 endloop endfacet facet normal -0.499136 -0.125026 -0.857457 outer loop vertex 1.387021 0.275895 2.645763 vertex 1.353300 0.410518 2.645763 vertex 1.594947 0.483821 2.494409 endloop endfacet facet normal -0.578295 -0.144853 0.802865 outer loop vertex 1.594946 0.483821 -2.494410 vertex 1.634688 0.325159 -2.494410 vertex 1.866614 0.371292 -2.319033 endloop endfacet facet normal -0.578296 -0.144855 0.802864 outer loop vertex 1.866614 0.371292 -2.319033 vertex 1.821233 0.552464 -2.319033 vertex 1.594946 0.483821 -2.494410 endloop endfacet facet normal -0.327142 -0.081944 -0.941416 outer loop vertex 1.098620 0.333262 2.771639 vertex 1.125995 0.223974 2.771639 vertex 0.854125 0.169896 2.870821 endloop endfacet facet normal -0.327142 -0.081943 -0.941416 outer loop vertex 0.854125 0.169896 2.870821 vertex 0.833360 0.252796 2.870821 vertex 1.098620 0.333262 2.771639 endloop endfacet facet normal -0.959558 -0.240355 -0.146557 outer loop vertex 2.857001 0.866661 0.294051 vertex 2.928191 0.582453 0.294051 vertex 2.885823 0.574025 0.585271 endloop endfacet facet normal -0.959557 -0.240355 -0.146557 outer loop vertex 2.885823 0.574025 0.585271 vertex 2.815663 0.854121 0.585271 vertex 2.857001 0.866661 0.294051 endloop endfacet facet normal -0.719135 -0.180136 0.671116 outer loop vertex 2.029980 0.615787 -2.121322 vertex 2.080563 0.413850 -2.121322 vertex 2.274476 0.452422 -1.903181 endloop endfacet facet normal -0.719135 -0.180138 0.671115 outer loop vertex 2.274476 0.452422 -1.903181 vertex 2.219178 0.673180 -1.903181 vertex 2.029980 0.615787 -2.121322 endloop endfacet facet normal -0.142499 -0.035695 -0.989151 outer loop vertex 0.560074 0.169896 2.942356 vertex 0.574030 0.114181 2.942356 vertex 0.288406 0.057367 2.985554 endloop endfacet facet normal -0.142499 -0.035696 -0.989151 outer loop vertex 0.288406 0.057367 2.985554 vertex 0.281394 0.085359 2.985554 vertex 0.560074 0.169896 2.942356 endloop endfacet facet normal -0.913451 -0.228806 -0.336534 outer loop vertex 2.747209 0.833356 0.870853 vertex 2.815663 0.560070 0.870853 vertex 2.718385 0.540720 1.148050 endloop endfacet facet normal -0.913451 -0.228806 -0.336534 outer loop vertex 2.718385 0.540720 1.148050 vertex 2.652296 0.804564 1.148050 vertex 2.747209 0.833356 0.870853 endloop endfacet facet normal -0.832290 -0.208477 0.513644 outer loop vertex 2.387005 0.724089 -1.666712 vertex 2.446484 0.486635 -1.666712 vertex 2.594930 0.516163 -1.414191 endloop endfacet facet normal -0.832290 -0.208477 0.513644 outer loop vertex 2.594930 0.516163 -1.414191 vertex 2.531842 0.768025 -1.414191 vertex 2.387005 0.724089 -1.666712 endloop endfacet facet normal -0.832288 -0.208480 -0.513646 outer loop vertex 2.531842 0.768025 1.414190 vertex 2.594931 0.516163 1.414190 vertex 2.446484 0.486635 1.666711 endloop endfacet facet normal -0.832290 -0.208477 -0.513644 outer loop vertex 2.446484 0.486635 1.666711 vertex 2.387005 0.724089 1.666711 vertex 2.531842 0.768025 1.414190 endloop endfacet facet normal -0.894403 -0.132674 0.427132 outer loop vertex 2.594930 0.516163 -1.414191 vertex 2.633028 0.259330 -1.414191 vertex 2.758296 0.271668 -1.148051 endloop endfacet facet normal -0.894402 -0.132672 0.427134 outer loop vertex 2.758296 0.271668 -1.148051 vertex 2.718386 0.540720 -1.148051 vertex 2.594930 0.516163 -1.414191 endloop endfacet facet normal -0.794854 -0.117905 -0.595236 outer loop vertex 2.446484 0.486635 1.666711 vertex 2.482402 0.244494 1.666711 vertex 2.307869 0.227306 1.903180 endloop endfacet facet normal -0.794853 -0.117906 -0.595237 outer loop vertex 2.307869 0.227306 1.903180 vertex 2.274476 0.452422 1.903180 vertex 2.446484 0.486635 1.666711 endloop endfacet facet normal -0.240623 -0.035691 0.969962 outer loop vertex 0.574028 0.114181 -2.942356 vertex 0.582455 0.057367 -2.942356 vertex 0.866664 0.085359 -2.870821 endloop endfacet facet normal -0.240624 -0.035693 0.969962 outer loop vertex 0.866664 0.085359 -2.870821 vertex 0.854124 0.169896 -2.870821 vertex 0.574028 0.114181 -2.942356 endloop endfacet facet normal -0.959601 -0.142342 0.242703 outer loop vertex 2.815663 0.560070 -0.870855 vertex 2.857001 0.281390 -0.870855 vertex 2.928191 0.288401 -0.585272 endloop endfacet facet normal -0.959601 -0.142342 0.242703 outer loop vertex 2.928191 0.288401 -0.585272 vertex 2.885823 0.574025 -0.585272 vertex 2.815663 0.560070 -0.870855 endloop endfacet facet normal -0.664732 -0.098601 -0.740547 outer loop vertex 2.080564 0.413850 2.121321 vertex 2.111109 0.207926 2.121321 vertex 1.894020 0.186544 2.319032 endloop endfacet facet normal -0.664729 -0.098604 -0.740548 outer loop vertex 1.894020 0.186544 2.319032 vertex 1.866615 0.371292 2.319032 vertex 2.080564 0.413850 2.121321 endloop endfacet facet normal -0.423345 -0.062796 0.903789 outer loop vertex 1.125994 0.223974 -2.771639 vertex 1.142525 0.112529 -2.771639 vertex 1.407383 0.138615 -2.645764 endloop endfacet facet normal -0.423345 -0.062795 0.903790 outer loop vertex 1.407383 0.138615 -2.645764 vertex 1.387020 0.275895 -2.645764 vertex 1.125994 0.223974 -2.771639 endloop endfacet facet normal -0.987987 -0.146557 0.049011 outer loop vertex 2.928191 0.582453 -0.294052 vertex 2.971182 0.292636 -0.294052 vertex 2.985559 0.294052 -0.000001 endloop endfacet facet normal -0.987987 -0.146557 0.049011 outer loop vertex 2.985559 0.294052 -0.000001 vertex 2.942360 0.585271 -0.000001 vertex 2.928191 0.582453 -0.294052 endloop endfacet facet normal -0.508987 -0.075499 -0.857457 outer loop vertex 1.634690 0.325160 2.494409 vertex 1.658689 0.163367 2.494409 vertex 1.407385 0.138615 2.645763 endloop endfacet facet normal -0.508985 -0.075503 -0.857458 outer loop vertex 1.407385 0.138615 2.645763 vertex 1.387021 0.275895 2.645763 vertex 1.634690 0.325160 2.494409 endloop endfacet facet normal -0.589708 -0.087476 0.802865 outer loop vertex 1.634688 0.325159 -2.494410 vertex 1.658688 0.163366 -2.494410 vertex 1.894019 0.186544 -2.319033 endloop endfacet facet normal -0.589708 -0.087476 0.802865 outer loop vertex 1.894019 0.186544 -2.319033 vertex 1.866614 0.371292 -2.319033 vertex 1.634688 0.325159 -2.494410 endloop endfacet facet normal -0.333599 -0.049484 -0.941416 outer loop vertex 1.125995 0.223974 2.771639 vertex 1.142526 0.112529 2.771639 vertex 0.866665 0.085359 2.870821 endloop endfacet facet normal -0.333598 -0.049485 -0.941416 outer loop vertex 0.866665 0.085359 2.870821 vertex 0.854125 0.169896 2.870821 vertex 1.125995 0.223974 2.771639 endloop endfacet facet normal -0.978495 -0.145149 -0.146560 outer loop vertex 2.928191 0.582453 0.294051 vertex 2.971182 0.292636 0.294051 vertex 2.928191 0.288401 0.585271 endloop endfacet facet normal -0.978496 -0.145145 -0.146556 outer loop vertex 2.928191 0.288401 0.585271 vertex 2.885823 0.574025 0.585271 vertex 2.928191 0.582453 0.294051 endloop endfacet facet normal -0.733329 -0.108779 0.671116 outer loop vertex 2.080563 0.413850 -2.121322 vertex 2.111109 0.207926 -2.121322 vertex 2.307869 0.227306 -1.903181 endloop endfacet facet normal -0.733329 -0.108779 0.671116 outer loop vertex 2.307869 0.227306 -1.903181 vertex 2.274476 0.452422 -1.903181 vertex 2.080563 0.413850 -2.121322 endloop endfacet facet normal -0.145312 -0.021554 -0.989151 outer loop vertex 0.574030 0.114181 2.942356 vertex 0.582457 0.057367 2.942356 vertex 0.292640 0.028822 2.985554 endloop endfacet facet normal -0.145312 -0.021554 -0.989151 outer loop vertex 0.292640 0.028822 2.985554 vertex 0.288406 0.057367 2.985554 vertex 0.574030 0.114181 2.942356 endloop endfacet facet normal -0.931480 -0.138171 -0.336533 outer loop vertex 2.815663 0.560070 0.870853 vertex 2.857001 0.281390 0.870853 vertex 2.758295 0.271668 1.148050 endloop endfacet facet normal -0.931479 -0.138172 -0.336534 outer loop vertex 2.758295 0.271668 1.148050 vertex 2.718385 0.540720 1.148050 vertex 2.815663 0.560070 0.870853 endloop endfacet facet normal -0.848716 -0.125895 0.513646 outer loop vertex 2.446484 0.486635 -1.666712 vertex 2.482402 0.244495 -1.666712 vertex 2.633028 0.259330 -1.414191 endloop endfacet facet normal -0.848717 -0.125897 0.513644 outer loop vertex 2.633028 0.259330 -1.414191 vertex 2.594930 0.516163 -1.414191 vertex 2.446484 0.486635 -1.666712 endloop endfacet facet normal -0.848716 -0.125894 -0.513646 outer loop vertex 2.594931 0.516163 1.414190 vertex 2.633028 0.259330 1.414190 vertex 2.482402 0.244494 1.666711 endloop endfacet facet normal -0.848715 -0.125894 -0.513647 outer loop vertex 2.482402 0.244494 1.666711 vertex 2.446484 0.486635 1.666711 vertex 2.594931 0.516163 1.414190 endloop endfacet facet normal -0.145312 -0.021554 0.989151 outer loop vertex 0.288404 0.057367 -2.985554 vertex 0.292638 0.028822 -2.985554 vertex 0.582455 0.057367 -2.942356 endloop endfacet facet normal -0.145312 -0.021554 0.989151 outer loop vertex 0.582455 0.057367 -2.942356 vertex 0.574028 0.114181 -2.942356 vertex 0.288404 0.057367 -2.985554 endloop endfacet facet normal -0.931480 -0.138172 0.336531 outer loop vertex 2.718386 0.540720 -1.148051 vertex 2.758296 0.271668 -1.148051 vertex 2.857001 0.281390 -0.870855 endloop endfacet facet normal -0.931480 -0.138171 0.336532 outer loop vertex 2.857001 0.281390 -0.870855 vertex 2.815663 0.560070 -0.870855 vertex 2.718386 0.540720 -1.148051 endloop endfacet facet normal -0.733329 -0.108779 -0.671116 outer loop vertex 2.274476 0.452422 1.903180 vertex 2.307869 0.227306 1.903180 vertex 2.111109 0.207926 2.121321 endloop endfacet facet normal -0.733331 -0.108776 -0.671114 outer loop vertex 2.111109 0.207926 2.121321 vertex 2.080564 0.413850 2.121321 vertex 2.274476 0.452422 1.903180 endloop endfacet facet normal -0.333599 -0.049485 0.941415 outer loop vertex 0.854124 0.169896 -2.870821 vertex 0.866664 0.085359 -2.870821 vertex 1.142525 0.112529 -2.771639 endloop endfacet facet normal -0.333598 -0.049484 0.941416 outer loop vertex 1.142525 0.112529 -2.771639 vertex 1.125994 0.223974 -2.771639 vertex 0.854124 0.169896 -2.870821 endloop endfacet facet normal -0.978495 -0.145145 0.146560 outer loop vertex 2.885823 0.574025 -0.585272 vertex 2.928191 0.288401 -0.585272 vertex 2.971182 0.292636 -0.294052 endloop endfacet facet normal -0.978495 -0.145149 0.146556 outer loop vertex 2.971182 0.292636 -0.294052 vertex 2.928191 0.582453 -0.294052 vertex 2.885823 0.574025 -0.585272 endloop endfacet facet normal -0.589709 -0.087475 -0.802865 outer loop vertex 1.866615 0.371292 2.319032 vertex 1.894020 0.186544 2.319032 vertex 1.658689 0.163367 2.494409 endloop endfacet facet normal -0.589711 -0.087473 -0.802864 outer loop vertex 1.658689 0.163367 2.494409 vertex 1.634690 0.325160 2.494409 vertex 1.866615 0.371292 2.319032 endloop endfacet facet normal -0.508987 -0.075499 0.857457 outer loop vertex 1.387020 0.275895 -2.645764 vertex 1.407383 0.138615 -2.645764 vertex 1.658688 0.163366 -2.494410 endloop endfacet facet normal -0.508988 -0.075502 0.857456 outer loop vertex 1.658688 0.163366 -2.494410 vertex 1.634688 0.325159 -2.494410 vertex 1.387020 0.275895 -2.645764 endloop endfacet facet normal -0.423347 -0.062799 -0.903788 outer loop vertex 1.387021 0.275895 2.645763 vertex 1.407385 0.138615 2.645763 vertex 1.142526 0.112529 2.771639 endloop endfacet facet normal -0.423348 -0.062797 -0.903788 outer loop vertex 1.142526 0.112529 2.771639 vertex 1.125995 0.223974 2.771639 vertex 1.387021 0.275895 2.645763 endloop endfacet facet normal -0.987987 -0.146557 -0.049011 outer loop vertex 2.942360 0.585271 -0.000001 vertex 2.985559 0.294052 -0.000001 vertex 2.971182 0.292636 0.294051 endloop endfacet facet normal -0.987987 -0.146557 -0.049011 outer loop vertex 2.971182 0.292636 0.294051 vertex 2.928191 0.582453 0.294051 vertex 2.942360 0.585271 -0.000001 endloop endfacet facet normal -0.664730 -0.098604 0.740548 outer loop vertex 1.866614 0.371292 -2.319033 vertex 1.894019 0.186544 -2.319033 vertex 2.111109 0.207926 -2.121322 endloop endfacet facet normal -0.664729 -0.098603 0.740549 outer loop vertex 2.111109 0.207926 -2.121322 vertex 2.080563 0.413850 -2.121322 vertex 1.866614 0.371292 -2.319033 endloop endfacet facet normal -0.240624 -0.035693 -0.969962 outer loop vertex 0.854125 0.169896 2.870821 vertex 0.866665 0.085359 2.870821 vertex 0.582457 0.057367 2.942356 endloop endfacet facet normal -0.240625 -0.035691 -0.969962 outer loop vertex 0.582457 0.057367 2.942356 vertex 0.574030 0.114181 2.942356 vertex 0.854125 0.169896 2.870821 endloop endfacet facet normal -0.959601 -0.142342 -0.242704 outer loop vertex 2.885823 0.574025 0.585271 vertex 2.928191 0.288401 0.585271 vertex 2.857001 0.281390 0.870853 endloop endfacet facet normal -0.959601 -0.142342 -0.242704 outer loop vertex 2.857001 0.281390 0.870853 vertex 2.815663 0.560070 0.870853 vertex 2.885823 0.574025 0.585271 endloop endfacet facet normal -0.794853 -0.117906 0.595236 outer loop vertex 2.274476 0.452422 -1.903181 vertex 2.307869 0.227306 -1.903181 vertex 2.482402 0.244495 -1.666712 endloop endfacet facet normal -0.794853 -0.117905 0.595237 outer loop vertex 2.482402 0.244495 -1.666712 vertex 2.446484 0.486635 -1.666712 vertex 2.274476 0.452422 -1.903181 endloop endfacet facet normal -0.894404 -0.132672 -0.427129 outer loop vertex 2.718385 0.540720 1.148050 vertex 2.758295 0.271668 1.148050 vertex 2.633028 0.259330 1.414190 endloop endfacet facet normal -0.894405 -0.132671 -0.427128 outer loop vertex 2.633028 0.259330 1.414190 vertex 2.594931 0.516163 1.414190 vertex 2.718385 0.540720 1.148050 endloop endfacet facet normal -0.856969 -0.042099 0.513646 outer loop vertex 2.482402 0.244495 -1.666712 vertex 2.494413 0.000000 -1.666712 vertex 2.645768 0.000000 -1.414191 endloop endfacet facet normal -0.856969 -0.042100 0.513646 outer loop vertex 2.645768 0.000000 -1.414191 vertex 2.633028 0.259330 -1.414191 vertex 2.482402 0.244495 -1.666712 endloop endfacet facet normal -0.856968 -0.042100 -0.513647 outer loop vertex 2.633028 0.259330 1.414190 vertex 2.645768 0.000000 1.414190 vertex 2.494413 -0.000001 1.666711 endloop endfacet facet normal -0.856969 -0.042099 -0.513646 outer loop vertex 2.494413 -0.000001 1.666711 vertex 2.482402 0.244494 1.666711 vertex 2.633028 0.259330 1.414190 endloop endfacet facet normal -0.146725 -0.007208 0.989151 outer loop vertex 0.292638 0.028822 -2.985554 vertex 0.294054 0.000000 -2.985554 vertex 0.585274 0.000000 -2.942356 endloop endfacet facet normal -0.146725 -0.007210 0.989151 outer loop vertex 0.585274 0.000000 -2.942356 vertex 0.582455 0.057367 -2.942356 vertex 0.292638 0.028822 -2.985554 endloop endfacet facet normal -0.940538 -0.046205 0.336532 outer loop vertex 2.758296 0.271668 -1.148051 vertex 2.771642 0.000000 -1.148051 vertex 2.870825 0.000000 -0.870855 endloop endfacet facet normal -0.940538 -0.046206 0.336531 outer loop vertex 2.870825 0.000000 -0.870855 vertex 2.857001 0.281390 -0.870855 vertex 2.758296 0.271668 -1.148051 endloop endfacet facet normal -0.740460 -0.036377 -0.671115 outer loop vertex 2.307869 0.227306 1.903180 vertex 2.319036 0.000001 1.903180 vertex 2.121324 0.000000 2.121321 endloop endfacet facet normal -0.740460 -0.036377 -0.671116 outer loop vertex 2.121324 0.000000 2.121321 vertex 2.111109 0.207926 2.121321 vertex 2.307869 0.227306 1.903180 endloop endfacet facet normal -0.336842 -0.016546 0.941416 outer loop vertex 0.866664 0.085359 -2.870821 vertex 0.870857 0.000000 -2.870821 vertex 1.148053 0.000000 -2.771639 endloop endfacet facet normal -0.336843 -0.016548 0.941415 outer loop vertex 1.148053 0.000000 -2.771639 vertex 1.142525 0.112529 -2.771639 vertex 0.866664 0.085359 -2.870821 endloop endfacet facet normal -0.988010 -0.048537 0.146560 outer loop vertex 2.928191 0.288401 -0.585272 vertex 2.942359 0.000000 -0.585272 vertex 2.985558 0.000001 -0.294052 endloop endfacet facet normal -0.988010 -0.048537 0.146560 outer loop vertex 2.985558 0.000001 -0.294052 vertex 2.971182 0.292636 -0.294052 vertex 2.928191 0.288401 -0.585272 endloop endfacet facet normal -0.595444 -0.029252 -0.802864 outer loop vertex 1.894020 0.186544 2.319032 vertex 1.903184 0.000000 2.319032 vertex 1.666715 0.000000 2.494409 endloop endfacet facet normal -0.595443 -0.029253 -0.802865 outer loop vertex 1.666715 0.000000 2.494409 vertex 1.658689 0.163367 2.494409 vertex 1.894020 0.186544 2.319032 endloop endfacet facet normal -0.513936 -0.025249 0.857457 outer loop vertex 1.407383 0.138615 -2.645764 vertex 1.414193 0.000000 -2.645764 vertex 1.666714 0.000000 -2.494410 endloop endfacet facet normal -0.513936 -0.025249 0.857457 outer loop vertex 1.666714 0.000000 -2.494410 vertex 1.658688 0.163366 -2.494410 vertex 1.407383 0.138615 -2.645764 endloop endfacet facet normal -0.427463 -0.021001 -0.903789 outer loop vertex 1.407385 0.138615 2.645763 vertex 1.414195 0.000000 2.645763 vertex 1.148054 0.000000 2.771639 endloop endfacet facet normal -0.427464 -0.020999 -0.903789 outer loop vertex 1.148054 0.000000 2.771639 vertex 1.142526 0.112529 2.771639 vertex 1.407385 0.138615 2.645763 endloop endfacet facet normal -0.997595 -0.049009 -0.049012 outer loop vertex 2.985559 0.294052 -0.000001 vertex 3.000005 0.000000 -0.000001 vertex 2.985558 0.000001 0.294051 endloop endfacet facet normal -0.997595 -0.049008 -0.049011 outer loop vertex 2.985558 0.000001 0.294051 vertex 2.971182 0.292636 0.294051 vertex 2.985559 0.294052 -0.000001 endloop endfacet facet normal -0.671194 -0.032972 0.740548 outer loop vertex 1.894019 0.186544 -2.319033 vertex 1.903183 0.000000 -2.319033 vertex 2.121323 0.000000 -2.121322 endloop endfacet facet normal -0.671194 -0.032972 0.740548 outer loop vertex 2.121323 0.000000 -2.121322 vertex 2.111109 0.207926 -2.121322 vertex 1.894019 0.186544 -2.319033 endloop endfacet facet normal -0.242964 -0.011938 -0.969962 outer loop vertex 0.866665 0.085359 2.870821 vertex 0.870859 0.000000 2.870821 vertex 0.585276 0.000000 2.942356 endloop endfacet facet normal -0.242963 -0.011939 -0.969962 outer loop vertex 0.585276 0.000000 2.942356 vertex 0.582457 0.057367 2.942356 vertex 0.866665 0.085359 2.870821 endloop endfacet facet normal -0.968931 -0.047603 -0.242706 outer loop vertex 2.928191 0.288401 0.585271 vertex 2.942360 0.000000 0.585271 vertex 2.870825 0.000000 0.870853 endloop endfacet facet normal -0.968932 -0.047601 -0.242704 outer loop vertex 2.870825 0.000000 0.870853 vertex 2.857001 0.281390 0.870853 vertex 2.928191 0.288401 0.585271 endloop endfacet facet normal -0.802584 -0.039429 0.595235 outer loop vertex 2.307869 0.227306 -1.903181 vertex 2.319036 0.000001 -1.903181 vertex 2.494413 0.000000 -1.666712 endloop endfacet facet normal -0.802583 -0.039427 0.595237 outer loop vertex 2.494413 0.000000 -1.666712 vertex 2.482402 0.244495 -1.666712 vertex 2.307869 0.227306 -1.903181 endloop endfacet facet normal -0.903102 -0.044366 -0.427129 outer loop vertex 2.758295 0.271668 1.148050 vertex 2.771641 0.000000 1.148050 vertex 2.645768 0.000000 1.414190 endloop endfacet facet normal -0.903101 -0.044366 -0.427129 outer loop vertex 2.645768 0.000000 1.414190 vertex 2.633028 0.259330 1.414190 vertex 2.758295 0.271668 1.148050 endloop endfacet facet normal -0.903100 -0.044366 0.427132 outer loop vertex 2.633028 0.259330 -1.414191 vertex 2.645768 0.000000 -1.414191 vertex 2.771642 0.000000 -1.148051 endloop endfacet facet normal -0.903100 -0.044366 0.427132 outer loop vertex 2.771642 0.000000 -1.148051 vertex 2.758296 0.271668 -1.148051 vertex 2.633028 0.259330 -1.414191 endloop endfacet facet normal -0.802584 -0.039427 -0.595235 outer loop vertex 2.482402 0.244494 1.666711 vertex 2.494413 -0.000001 1.666711 vertex 2.319036 0.000001 1.903180 endloop endfacet facet normal -0.802583 -0.039429 -0.595236 outer loop vertex 2.319036 0.000001 1.903180 vertex 2.307869 0.227306 1.903180 vertex 2.482402 0.244494 1.666711 endloop endfacet facet normal -0.242964 -0.011939 0.969962 outer loop vertex 0.582455 0.057367 -2.942356 vertex 0.585274 0.000000 -2.942356 vertex 0.870857 0.000000 -2.870821 endloop endfacet facet normal -0.242963 -0.011935 0.969962 outer loop vertex 0.870857 0.000000 -2.870821 vertex 0.866664 0.085359 -2.870821 vertex 0.582455 0.057367 -2.942356 endloop endfacet facet normal -0.968932 -0.047601 0.242702 outer loop vertex 2.857001 0.281390 -0.870855 vertex 2.870825 0.000000 -0.870855 vertex 2.942359 0.000000 -0.585272 endloop endfacet facet normal -0.968932 -0.047600 0.242703 outer loop vertex 2.942359 0.000000 -0.585272 vertex 2.928191 0.288401 -0.585272 vertex 2.857001 0.281390 -0.870855 endloop endfacet facet normal -0.671195 -0.032975 -0.740548 outer loop vertex 2.111109 0.207926 2.121321 vertex 2.121324 0.000000 2.121321 vertex 1.903184 0.000000 2.319032 endloop endfacet facet normal -0.671196 -0.032973 -0.740547 outer loop vertex 1.903184 0.000000 2.319032 vertex 1.894020 0.186544 2.319032 vertex 2.111109 0.207926 2.121321 endloop endfacet facet normal -0.427461 -0.020999 0.903790 outer loop vertex 1.142525 0.112529 -2.771639 vertex 1.148053 0.000000 -2.771639 vertex 1.414193 0.000000 -2.645764 endloop endfacet facet normal -0.427462 -0.021001 0.903790 outer loop vertex 1.414193 0.000000 -2.645764 vertex 1.407383 0.138615 -2.645764 vertex 1.142525 0.112529 -2.771639 endloop endfacet facet normal -0.997595 -0.049008 0.049013 outer loop vertex 2.971182 0.292636 -0.294052 vertex 2.985558 0.000001 -0.294052 vertex 3.000005 0.000000 -0.000001 endloop endfacet facet normal -0.997595 -0.049009 0.049011 outer loop vertex 3.000005 0.000000 -0.000001 vertex 2.985559 0.294052 -0.000001 vertex 2.971182 0.292636 -0.294052 endloop endfacet facet normal -0.513937 -0.025249 -0.857457 outer loop vertex 1.658689 0.163367 2.494409 vertex 1.666715 0.000000 2.494409 vertex 1.414195 0.000000 2.645763 endloop endfacet facet normal -0.513937 -0.025249 -0.857456 outer loop vertex 1.414195 0.000000 2.645763 vertex 1.407385 0.138615 2.645763 vertex 1.658689 0.163367 2.494409 endloop endfacet facet normal -0.595444 -0.029254 0.802864 outer loop vertex 1.658688 0.163366 -2.494410 vertex 1.666714 0.000000 -2.494410 vertex 1.903183 0.000000 -2.319033 endloop endfacet facet normal -0.595443 -0.029251 0.802865 outer loop vertex 1.903183 0.000000 -2.319033 vertex 1.894019 0.186544 -2.319033 vertex 1.658688 0.163366 -2.494410 endloop endfacet facet normal -0.336844 -0.016547 -0.941415 outer loop vertex 1.142526 0.112529 2.771639 vertex 1.148054 0.000000 2.771639 vertex 0.870859 0.000000 2.870821 endloop endfacet facet normal -0.336842 -0.016550 -0.941415 outer loop vertex 0.870859 0.000000 2.870821 vertex 0.866665 0.085359 2.870821 vertex 1.142526 0.112529 2.771639 endloop endfacet facet normal -0.988011 -0.048537 -0.146557 outer loop vertex 2.971182 0.292636 0.294051 vertex 2.985558 0.000001 0.294051 vertex 2.942360 0.000000 0.585271 endloop endfacet facet normal -0.988010 -0.048540 -0.146560 outer loop vertex 2.942360 0.000000 0.585271 vertex 2.928191 0.288401 0.585271 vertex 2.971182 0.292636 0.294051 endloop endfacet facet normal -0.740458 -0.036374 0.671117 outer loop vertex 2.111109 0.207926 -2.121322 vertex 2.121323 0.000000 -2.121322 vertex 2.319036 0.000001 -1.903181 endloop endfacet facet normal -0.740460 -0.036377 0.671116 outer loop vertex 2.319036 0.000001 -1.903181 vertex 2.307869 0.227306 -1.903181 vertex 2.111109 0.207926 -2.121322 endloop endfacet facet normal -0.146725 -0.007210 -0.989151 outer loop vertex 0.582457 0.057367 2.942356 vertex 0.585276 0.000000 2.942356 vertex 0.294056 0.000000 2.985554 endloop endfacet facet normal -0.146725 -0.007208 -0.989151 outer loop vertex 0.294056 0.000000 2.985554 vertex 0.292640 0.028822 2.985554 vertex 0.582457 0.057367 2.942356 endloop endfacet facet normal -0.940537 -0.046206 -0.336534 outer loop vertex 2.857001 0.281390 0.870853 vertex 2.870825 0.000000 0.870853 vertex 2.771641 0.000000 1.148050 endloop endfacet facet normal -0.940537 -0.046205 -0.336533 outer loop vertex 2.771641 0.000000 1.148050 vertex 2.758295 0.271668 1.148050 vertex 2.857001 0.281390 0.870853 endloop endfacet facet normal -0.802582 0.039429 0.595237 outer loop vertex 2.319036 0.000001 -1.903181 vertex 2.307869 -0.227304 -1.903181 vertex 2.482402 -0.244495 -1.666712 endloop endfacet facet normal -0.802584 0.039427 0.595235 outer loop vertex 2.482402 -0.244495 -1.666712 vertex 2.494413 0.000000 -1.666712 vertex 2.319036 0.000001 -1.903181 endloop endfacet facet normal -0.903102 0.044366 -0.427129 outer loop vertex 2.771641 0.000000 1.148050 vertex 2.758295 -0.271668 1.148050 vertex 2.633028 -0.259330 1.414190 endloop endfacet facet normal -0.903102 0.044366 -0.427129 outer loop vertex 2.633028 -0.259330 1.414190 vertex 2.645768 0.000000 1.414190 vertex 2.771641 0.000000 1.148050 endloop endfacet facet normal -0.903100 0.044366 0.427132 outer loop vertex 2.645768 0.000000 -1.414191 vertex 2.633028 -0.259330 -1.414191 vertex 2.758296 -0.271668 -1.148051 endloop endfacet facet normal -0.903100 0.044366 0.427132 outer loop vertex 2.758296 -0.271668 -1.148051 vertex 2.771642 0.000000 -1.148051 vertex 2.645768 0.000000 -1.414191 endloop endfacet facet normal -0.802583 0.039427 -0.595237 outer loop vertex 2.494413 -0.000001 1.666711 vertex 2.482402 -0.244496 1.666711 vertex 2.307869 -0.227305 1.903180 endloop endfacet facet normal -0.802584 0.039429 -0.595235 outer loop vertex 2.307869 -0.227305 1.903180 vertex 2.319036 0.000001 1.903180 vertex 2.494413 -0.000001 1.666711 endloop endfacet facet normal -0.242963 0.011939 0.969962 outer loop vertex 0.585274 0.000000 -2.942356 vertex 0.582455 -0.057367 -2.942356 vertex 0.866664 -0.085358 -2.870821 endloop endfacet facet normal -0.242964 0.011935 0.969962 outer loop vertex 0.866664 -0.085358 -2.870821 vertex 0.870857 0.000000 -2.870821 vertex 0.585274 0.000000 -2.942356 endloop endfacet facet normal -0.968932 0.047601 0.242703 outer loop vertex 2.870825 0.000000 -0.870855 vertex 2.857001 -0.281390 -0.870855 vertex 2.928191 -0.288401 -0.585272 endloop endfacet facet normal -0.968932 0.047600 0.242702 outer loop vertex 2.928191 -0.288401 -0.585272 vertex 2.942359 0.000000 -0.585272 vertex 2.870825 0.000000 -0.870855 endloop endfacet facet normal -0.671195 0.032975 -0.740547 outer loop vertex 2.121324 0.000000 2.121321 vertex 2.111109 -0.207926 2.121321 vertex 1.894020 -0.186544 2.319032 endloop endfacet facet normal -0.671195 0.032973 -0.740547 outer loop vertex 1.894020 -0.186544 2.319032 vertex 1.903184 0.000000 2.319032 vertex 2.121324 0.000000 2.121321 endloop endfacet facet normal -0.427462 0.021000 0.903790 outer loop vertex 1.148053 0.000000 -2.771639 vertex 1.142525 -0.112528 -2.771639 vertex 1.407383 -0.138615 -2.645764 endloop endfacet facet normal -0.427461 0.021001 0.903790 outer loop vertex 1.407383 -0.138615 -2.645764 vertex 1.414193 0.000000 -2.645764 vertex 1.148053 0.000000 -2.771639 endloop endfacet facet normal -0.997595 0.049007 0.049011 outer loop vertex 2.985558 0.000001 -0.294052 vertex 2.971182 -0.292635 -0.294052 vertex 2.985559 -0.294052 -0.000001 endloop endfacet facet normal -0.997595 0.049009 0.049013 outer loop vertex 2.985559 -0.294052 -0.000001 vertex 3.000005 0.000000 -0.000001 vertex 2.985558 0.000001 -0.294052 endloop endfacet facet normal -0.513936 0.025246 -0.857457 outer loop vertex 1.666715 0.000000 2.494409 vertex 1.658690 -0.163366 2.494409 vertex 1.407385 -0.138615 2.645763 endloop endfacet facet normal -0.513937 0.025249 -0.857456 outer loop vertex 1.407385 -0.138615 2.645763 vertex 1.414195 0.000000 2.645763 vertex 1.666715 0.000000 2.494409 endloop endfacet facet normal -0.595443 0.029253 0.802865 outer loop vertex 1.666714 0.000000 -2.494410 vertex 1.658688 -0.163366 -2.494410 vertex 1.894019 -0.186544 -2.319033 endloop endfacet facet normal -0.595444 0.029251 0.802864 outer loop vertex 1.894019 -0.186544 -2.319033 vertex 1.903183 0.000000 -2.319033 vertex 1.666714 0.000000 -2.494410 endloop endfacet facet normal -0.336843 0.016547 -0.941416 outer loop vertex 1.148054 0.000000 2.771639 vertex 1.142526 -0.112529 2.771639 vertex 0.866665 -0.085359 2.870821 endloop endfacet facet normal -0.336844 0.016550 -0.941415 outer loop vertex 0.866665 -0.085359 2.870821 vertex 0.870859 0.000000 2.870821 vertex 1.148054 0.000000 2.771639 endloop endfacet facet normal -0.988010 0.048537 -0.146560 outer loop vertex 2.985558 0.000001 0.294051 vertex 2.971182 -0.292635 0.294051 vertex 2.928191 -0.288402 0.585271 endloop endfacet facet normal -0.988011 0.048540 -0.146556 outer loop vertex 2.928191 -0.288402 0.585271 vertex 2.942360 0.000000 0.585271 vertex 2.985558 0.000001 0.294051 endloop endfacet facet normal -0.740458 0.036378 0.671117 outer loop vertex 2.121323 0.000000 -2.121322 vertex 2.111108 -0.207925 -2.121322 vertex 2.307869 -0.227304 -1.903181 endloop endfacet facet normal -0.740458 0.036377 0.671117 outer loop vertex 2.307869 -0.227304 -1.903181 vertex 2.319036 0.000001 -1.903181 vertex 2.121323 0.000000 -2.121322 endloop endfacet facet normal -0.146725 0.007210 -0.989151 outer loop vertex 0.585276 0.000000 2.942356 vertex 0.582457 -0.057367 2.942356 vertex 0.292640 -0.028822 2.985554 endloop endfacet facet normal -0.146725 0.007208 -0.989151 outer loop vertex 0.292640 -0.028822 2.985554 vertex 0.294056 0.000000 2.985554 vertex 0.585276 0.000000 2.942356 endloop endfacet facet normal -0.940537 0.046206 -0.336533 outer loop vertex 2.870825 0.000000 0.870853 vertex 2.857001 -0.281390 0.870853 vertex 2.758295 -0.271668 1.148050 endloop endfacet facet normal -0.940537 0.046205 -0.336534 outer loop vertex 2.758295 -0.271668 1.148050 vertex 2.771641 0.000000 1.148050 vertex 2.870825 0.000000 0.870853 endloop endfacet facet normal -0.856969 0.042099 0.513646 outer loop vertex 2.494413 0.000000 -1.666712 vertex 2.482402 -0.244495 -1.666712 vertex 2.633028 -0.259330 -1.414191 endloop endfacet facet normal -0.856969 0.042100 0.513646 outer loop vertex 2.633028 -0.259330 -1.414191 vertex 2.645768 0.000000 -1.414191 vertex 2.494413 0.000000 -1.666712 endloop endfacet facet normal -0.856969 0.042100 -0.513646 outer loop vertex 2.645768 0.000000 1.414190 vertex 2.633028 -0.259330 1.414190 vertex 2.482402 -0.244496 1.666711 endloop endfacet facet normal -0.856969 0.042099 -0.513646 outer loop vertex 2.482402 -0.244496 1.666711 vertex 2.494413 -0.000001 1.666711 vertex 2.645768 0.000000 1.414190 endloop endfacet facet normal -0.146725 0.007208 0.989151 outer loop vertex 0.294054 0.000000 -2.985554 vertex 0.292638 -0.028822 -2.985554 vertex 0.582455 -0.057367 -2.942356 endloop endfacet facet normal -0.146725 0.007210 0.989151 outer loop vertex 0.582455 -0.057367 -2.942356 vertex 0.585274 0.000000 -2.942356 vertex 0.294054 0.000000 -2.985554 endloop endfacet facet normal -0.940538 0.046205 0.336531 outer loop vertex 2.771642 0.000000 -1.148051 vertex 2.758296 -0.271668 -1.148051 vertex 2.857001 -0.281390 -0.870855 endloop endfacet facet normal -0.940538 0.046206 0.336532 outer loop vertex 2.857001 -0.281390 -0.870855 vertex 2.870825 0.000000 -0.870855 vertex 2.771642 0.000000 -1.148051 endloop endfacet facet normal -0.740460 0.036377 -0.671116 outer loop vertex 2.319036 0.000001 1.903180 vertex 2.307869 -0.227305 1.903180 vertex 2.111109 -0.207926 2.121321 endloop endfacet facet normal -0.740460 0.036378 -0.671115 outer loop vertex 2.111109 -0.207926 2.121321 vertex 2.121324 0.000000 2.121321 vertex 2.319036 0.000001 1.903180 endloop endfacet facet normal -0.336843 0.016547 0.941415 outer loop vertex 0.870857 0.000000 -2.870821 vertex 0.866664 -0.085358 -2.870821 vertex 1.142525 -0.112528 -2.771639 endloop endfacet facet normal -0.336842 0.016548 0.941416 outer loop vertex 1.142525 -0.112528 -2.771639 vertex 1.148053 0.000000 -2.771639 vertex 0.870857 0.000000 -2.870821 endloop endfacet facet normal -0.988010 0.048537 0.146560 outer loop vertex 2.942359 0.000000 -0.585272 vertex 2.928191 -0.288401 -0.585272 vertex 2.971182 -0.292635 -0.294052 endloop endfacet facet normal -0.988010 0.048537 0.146560 outer loop vertex 2.971182 -0.292635 -0.294052 vertex 2.985558 0.000001 -0.294052 vertex 2.942359 0.000000 -0.585272 endloop endfacet facet normal -0.595445 0.029252 -0.802864 outer loop vertex 1.903184 0.000000 2.319032 vertex 1.894020 -0.186544 2.319032 vertex 1.658690 -0.163366 2.494409 endloop endfacet facet normal -0.595444 0.029250 -0.802864 outer loop vertex 1.658690 -0.163366 2.494409 vertex 1.666715 0.000000 2.494409 vertex 1.903184 0.000000 2.319032 endloop endfacet facet normal -0.513936 0.025249 0.857457 outer loop vertex 1.414193 0.000000 -2.645764 vertex 1.407383 -0.138615 -2.645764 vertex 1.658688 -0.163366 -2.494410 endloop endfacet facet normal -0.513936 0.025249 0.857457 outer loop vertex 1.658688 -0.163366 -2.494410 vertex 1.666714 0.000000 -2.494410 vertex 1.414193 0.000000 -2.645764 endloop endfacet facet normal -0.427464 0.021001 -0.903789 outer loop vertex 1.414195 0.000000 2.645763 vertex 1.407385 -0.138615 2.645763 vertex 1.142526 -0.112529 2.771639 endloop endfacet facet normal -0.427463 0.020999 -0.903789 outer loop vertex 1.142526 -0.112529 2.771639 vertex 1.148054 0.000000 2.771639 vertex 1.414195 0.000000 2.645763 endloop endfacet facet normal -0.997595 0.049009 -0.049011 outer loop vertex 3.000005 0.000000 -0.000001 vertex 2.985559 -0.294052 -0.000001 vertex 2.971182 -0.292635 0.294051 endloop endfacet facet normal -0.997595 0.049007 -0.049013 outer loop vertex 2.971182 -0.292635 0.294051 vertex 2.985558 0.000001 0.294051 vertex 3.000005 0.000000 -0.000001 endloop endfacet facet normal -0.671196 0.032972 0.740547 outer loop vertex 1.903183 0.000000 -2.319033 vertex 1.894019 -0.186544 -2.319033 vertex 2.111108 -0.207925 -2.121322 endloop endfacet facet normal -0.671194 0.032975 0.740548 outer loop vertex 2.111108 -0.207925 -2.121322 vertex 2.121323 0.000000 -2.121322 vertex 1.903183 0.000000 -2.319033 endloop endfacet facet normal -0.242964 0.011938 -0.969962 outer loop vertex 0.870859 0.000000 2.870821 vertex 0.866665 -0.085359 2.870821 vertex 0.582457 -0.057367 2.942356 endloop endfacet facet normal -0.242964 0.011939 -0.969962 outer loop vertex 0.582457 -0.057367 2.942356 vertex 0.585276 0.000000 2.942356 vertex 0.870859 0.000000 2.870821 endloop endfacet facet normal -0.968932 0.047603 -0.242704 outer loop vertex 2.942360 0.000000 0.585271 vertex 2.928191 -0.288402 0.585271 vertex 2.857001 -0.281390 0.870853 endloop endfacet facet normal -0.968931 0.047601 -0.242706 outer loop vertex 2.857001 -0.281390 0.870853 vertex 2.870825 0.000000 0.870853 vertex 2.942360 0.000000 0.585271 endloop endfacet facet normal -0.733327 0.108779 0.671117 outer loop vertex 2.111108 -0.207925 -2.121322 vertex 2.080562 -0.413849 -2.121322 vertex 2.274476 -0.452420 -1.903181 endloop endfacet facet normal -0.733327 0.108779 0.671117 outer loop vertex 2.274476 -0.452420 -1.903181 vertex 2.307869 -0.227304 -1.903181 vertex 2.111108 -0.207925 -2.121322 endloop endfacet facet normal -0.145312 0.021554 -0.989151 outer loop vertex 0.582457 -0.057367 2.942356 vertex 0.574030 -0.114181 2.942356 vertex 0.288406 -0.057367 2.985554 endloop endfacet facet normal -0.145312 0.021554 -0.989151 outer loop vertex 0.288406 -0.057367 2.985554 vertex 0.292640 -0.028822 2.985554 vertex 0.582457 -0.057367 2.942356 endloop endfacet facet normal -0.931479 0.138171 -0.336534 outer loop vertex 2.857001 -0.281390 0.870853 vertex 2.815663 -0.560070 0.870853 vertex 2.718385 -0.540720 1.148050 endloop endfacet facet normal -0.931480 0.138172 -0.336533 outer loop vertex 2.718385 -0.540720 1.148050 vertex 2.758295 -0.271668 1.148050 vertex 2.857001 -0.281390 0.870853 endloop endfacet facet normal -0.848717 0.125895 0.513644 outer loop vertex 2.482402 -0.244495 -1.666712 vertex 2.446484 -0.486635 -1.666712 vertex 2.594930 -0.516163 -1.414191 endloop endfacet facet normal -0.848716 0.125897 0.513645 outer loop vertex 2.594930 -0.516163 -1.414191 vertex 2.633028 -0.259330 -1.414191 vertex 2.482402 -0.244495 -1.666712 endloop endfacet facet normal -0.848717 0.125897 -0.513644 outer loop vertex 2.633028 -0.259330 1.414190 vertex 2.594930 -0.516163 1.414190 vertex 2.446484 -0.486636 1.666711 endloop endfacet facet normal -0.848716 0.125895 -0.513645 outer loop vertex 2.446484 -0.486636 1.666711 vertex 2.482402 -0.244496 1.666711 vertex 2.633028 -0.259330 1.414190 endloop endfacet facet normal -0.145312 0.021554 0.989151 outer loop vertex 0.292638 -0.028822 -2.985554 vertex 0.288404 -0.057367 -2.985554 vertex 0.574028 -0.114181 -2.942356 endloop endfacet facet normal -0.145312 0.021554 0.989151 outer loop vertex 0.574028 -0.114181 -2.942356 vertex 0.582455 -0.057367 -2.942356 vertex 0.292638 -0.028822 -2.985554 endloop endfacet facet normal -0.931480 0.138172 0.336532 outer loop vertex 2.758296 -0.271668 -1.148051 vertex 2.718386 -0.540720 -1.148051 vertex 2.815663 -0.560070 -0.870855 endloop endfacet facet normal -0.931480 0.138171 0.336531 outer loop vertex 2.815663 -0.560070 -0.870855 vertex 2.857001 -0.281390 -0.870855 vertex 2.758296 -0.271668 -1.148051 endloop endfacet facet normal -0.733328 0.108777 -0.671117 outer loop vertex 2.307869 -0.227305 1.903180 vertex 2.274477 -0.452420 1.903180 vertex 2.080563 -0.413849 2.121321 endloop endfacet facet normal -0.733329 0.108780 -0.671115 outer loop vertex 2.080563 -0.413849 2.121321 vertex 2.111109 -0.207926 2.121321 vertex 2.307869 -0.227305 1.903180 endloop endfacet facet normal -0.333598 0.049485 0.941416 outer loop vertex 0.866664 -0.085358 -2.870821 vertex 0.854124 -0.169895 -2.870821 vertex 1.125994 -0.223973 -2.771639 endloop endfacet facet normal -0.333599 0.049484 0.941416 outer loop vertex 1.125994 -0.223973 -2.771639 vertex 1.142525 -0.112528 -2.771639 vertex 0.866664 -0.085358 -2.870821 endloop endfacet facet normal -0.978496 0.145145 0.146556 outer loop vertex 2.928191 -0.288401 -0.585272 vertex 2.885823 -0.574025 -0.585272 vertex 2.928191 -0.582452 -0.294052 endloop endfacet facet normal -0.978495 0.145149 0.146560 outer loop vertex 2.928191 -0.582452 -0.294052 vertex 2.971182 -0.292635 -0.294052 vertex 2.928191 -0.288401 -0.585272 endloop endfacet facet normal -0.589710 0.087476 -0.802864 outer loop vertex 1.894020 -0.186544 2.319032 vertex 1.866615 -0.371292 2.319032 vertex 1.634690 -0.325159 2.494409 endloop endfacet facet normal -0.589710 0.087476 -0.802864 outer loop vertex 1.634690 -0.325159 2.494409 vertex 1.658690 -0.163366 2.494409 vertex 1.894020 -0.186544 2.319032 endloop endfacet facet normal -0.508988 0.075499 0.857456 outer loop vertex 1.407383 -0.138615 -2.645764 vertex 1.387020 -0.275895 -2.645764 vertex 1.634688 -0.325159 -2.494410 endloop endfacet facet normal -0.508986 0.075502 0.857457 outer loop vertex 1.634688 -0.325159 -2.494410 vertex 1.658688 -0.163366 -2.494410 vertex 1.407383 -0.138615 -2.645764 endloop endfacet facet normal -0.423348 0.062799 -0.903788 outer loop vertex 1.407385 -0.138615 2.645763 vertex 1.387021 -0.275895 2.645763 vertex 1.125995 -0.223974 2.771639 endloop endfacet facet normal -0.423347 0.062796 -0.903789 outer loop vertex 1.125995 -0.223974 2.771639 vertex 1.142526 -0.112529 2.771639 vertex 1.407385 -0.138615 2.645763 endloop endfacet facet normal -0.987987 0.146557 -0.049011 outer loop vertex 2.985559 -0.294052 -0.000001 vertex 2.942360 -0.585271 -0.000001 vertex 2.928191 -0.582452 0.294051 endloop endfacet facet normal -0.987987 0.146557 -0.049011 outer loop vertex 2.928191 -0.582452 0.294051 vertex 2.971182 -0.292635 0.294051 vertex 2.985559 -0.294052 -0.000001 endloop endfacet facet normal -0.664731 0.098604 0.740547 outer loop vertex 1.894019 -0.186544 -2.319033 vertex 1.866614 -0.371292 -2.319033 vertex 2.080562 -0.413849 -2.121322 endloop endfacet facet normal -0.664732 0.098604 0.740547 outer loop vertex 2.080562 -0.413849 -2.121322 vertex 2.111108 -0.207925 -2.121322 vertex 1.894019 -0.186544 -2.319033 endloop endfacet facet normal -0.240624 0.035694 -0.969962 outer loop vertex 0.866665 -0.085359 2.870821 vertex 0.854125 -0.169896 2.870821 vertex 0.574030 -0.114181 2.942356 endloop endfacet facet normal -0.240624 0.035691 -0.969962 outer loop vertex 0.574030 -0.114181 2.942356 vertex 0.582457 -0.057367 2.942356 vertex 0.866665 -0.085359 2.870821 endloop endfacet facet normal -0.959601 0.142342 -0.242704 outer loop vertex 2.928191 -0.288402 0.585271 vertex 2.885823 -0.574026 0.585271 vertex 2.815663 -0.560070 0.870853 endloop endfacet facet normal -0.959601 0.142342 -0.242704 outer loop vertex 2.815663 -0.560070 0.870853 vertex 2.857001 -0.281390 0.870853 vertex 2.928191 -0.288402 0.585271 endloop endfacet facet normal -0.794852 0.117906 0.595238 outer loop vertex 2.307869 -0.227304 -1.903181 vertex 2.274476 -0.452420 -1.903181 vertex 2.446484 -0.486635 -1.666712 endloop endfacet facet normal -0.794853 0.117905 0.595237 outer loop vertex 2.446484 -0.486635 -1.666712 vertex 2.482402 -0.244495 -1.666712 vertex 2.307869 -0.227304 -1.903181 endloop endfacet facet normal -0.894403 0.132672 -0.427131 outer loop vertex 2.758295 -0.271668 1.148050 vertex 2.718385 -0.540720 1.148050 vertex 2.594930 -0.516163 1.414190 endloop endfacet facet normal -0.894404 0.132674 -0.427129 outer loop vertex 2.594930 -0.516163 1.414190 vertex 2.633028 -0.259330 1.414190 vertex 2.758295 -0.271668 1.148050 endloop endfacet facet normal -0.894402 0.132674 0.427134 outer loop vertex 2.633028 -0.259330 -1.414191 vertex 2.594930 -0.516163 -1.414191 vertex 2.718386 -0.540720 -1.148051 endloop endfacet facet normal -0.894403 0.132672 0.427132 outer loop vertex 2.718386 -0.540720 -1.148051 vertex 2.758296 -0.271668 -1.148051 vertex 2.633028 -0.259330 -1.414191 endloop endfacet facet normal -0.794854 0.117905 -0.595236 outer loop vertex 2.482402 -0.244496 1.666711 vertex 2.446484 -0.486636 1.666711 vertex 2.274477 -0.452420 1.903180 endloop endfacet facet normal -0.794853 0.117903 -0.595237 outer loop vertex 2.274477 -0.452420 1.903180 vertex 2.307869 -0.227305 1.903180 vertex 2.482402 -0.244496 1.666711 endloop endfacet facet normal -0.240624 0.035691 0.969962 outer loop vertex 0.582455 -0.057367 -2.942356 vertex 0.574028 -0.114181 -2.942356 vertex 0.854124 -0.169895 -2.870821 endloop endfacet facet normal -0.240623 0.035693 0.969962 outer loop vertex 0.854124 -0.169895 -2.870821 vertex 0.866664 -0.085358 -2.870821 vertex 0.582455 -0.057367 -2.942356 endloop endfacet facet normal -0.959601 0.142342 0.242703 outer loop vertex 2.857001 -0.281390 -0.870855 vertex 2.815663 -0.560070 -0.870855 vertex 2.885823 -0.574025 -0.585272 endloop endfacet facet normal -0.959601 0.142342 0.242703 outer loop vertex 2.885823 -0.574025 -0.585272 vertex 2.928191 -0.288401 -0.585272 vertex 2.857001 -0.281390 -0.870855 endloop endfacet facet normal -0.664731 0.098604 -0.740547 outer loop vertex 2.111109 -0.207926 2.121321 vertex 2.080563 -0.413849 2.121321 vertex 1.866615 -0.371292 2.319032 endloop endfacet facet normal -0.664731 0.098604 -0.740547 outer loop vertex 1.866615 -0.371292 2.319032 vertex 1.894020 -0.186544 2.319032 vertex 2.111109 -0.207926 2.121321 endloop endfacet facet normal -0.423345 0.062796 0.903790 outer loop vertex 1.142525 -0.112528 -2.771639 vertex 1.125994 -0.223973 -2.771639 vertex 1.387020 -0.275895 -2.645764 endloop endfacet facet normal -0.423345 0.062796 0.903790 outer loop vertex 1.387020 -0.275895 -2.645764 vertex 1.407383 -0.138615 -2.645764 vertex 1.142525 -0.112528 -2.771639 endloop endfacet facet normal -0.987987 0.146557 0.049012 outer loop vertex 2.971182 -0.292635 -0.294052 vertex 2.928191 -0.582452 -0.294052 vertex 2.942360 -0.585271 -0.000001 endloop endfacet facet normal -0.987987 0.146557 0.049011 outer loop vertex 2.942360 -0.585271 -0.000001 vertex 2.985559 -0.294052 -0.000001 vertex 2.971182 -0.292635 -0.294052 endloop endfacet facet normal -0.508985 0.075502 -0.857457 outer loop vertex 1.658690 -0.163366 2.494409 vertex 1.634690 -0.325159 2.494409 vertex 1.387021 -0.275895 2.645763 endloop endfacet facet normal -0.508986 0.075503 -0.857457 outer loop vertex 1.387021 -0.275895 2.645763 vertex 1.407385 -0.138615 2.645763 vertex 1.658690 -0.163366 2.494409 endloop endfacet facet normal -0.589708 0.087476 0.802865 outer loop vertex 1.658688 -0.163366 -2.494410 vertex 1.634688 -0.325159 -2.494410 vertex 1.866614 -0.371292 -2.319033 endloop endfacet facet normal -0.589708 0.087476 0.802865 outer loop vertex 1.866614 -0.371292 -2.319033 vertex 1.894019 -0.186544 -2.319033 vertex 1.658688 -0.163366 -2.494410 endloop endfacet facet normal -0.333598 0.049484 -0.941416 outer loop vertex 1.142526 -0.112529 2.771639 vertex 1.125995 -0.223974 2.771639 vertex 0.854125 -0.169896 2.870821 endloop endfacet facet normal -0.333599 0.049485 -0.941416 outer loop vertex 0.854125 -0.169896 2.870821 vertex 0.866665 -0.085359 2.870821 vertex 1.142526 -0.112529 2.771639 endloop endfacet facet normal -0.978495 0.145149 -0.146555 outer loop vertex 2.971182 -0.292635 0.294051 vertex 2.928191 -0.582452 0.294051 vertex 2.885823 -0.574026 0.585271 endloop endfacet facet normal -0.978495 0.145145 -0.146559 outer loop vertex 2.885823 -0.574026 0.585271 vertex 2.928191 -0.288402 0.585271 vertex 2.971182 -0.292635 0.294051 endloop endfacet facet normal -0.651867 0.163283 0.740546 outer loop vertex 1.866614 -0.371292 -2.319033 vertex 1.821233 -0.552464 -2.319033 vertex 2.029979 -0.615786 -2.121322 endloop endfacet facet normal -0.651865 0.163285 0.740547 outer loop vertex 2.029979 -0.615786 -2.121322 vertex 2.080562 -0.413849 -2.121322 vertex 1.866614 -0.371292 -2.319033 endloop endfacet facet normal -0.235967 0.059106 -0.969962 outer loop vertex 0.854125 -0.169896 2.870821 vertex 0.833360 -0.252796 2.870821 vertex 0.560074 -0.169896 2.942356 endloop endfacet facet normal -0.235967 0.059107 -0.969962 outer loop vertex 0.560074 -0.169896 2.942356 vertex 0.574030 -0.114181 2.942356 vertex 0.854125 -0.169896 2.870821 endloop endfacet facet normal -0.941028 0.235714 -0.242704 outer loop vertex 2.885823 -0.574026 0.585271 vertex 2.815663 -0.854121 0.585271 vertex 2.747209 -0.833356 0.870853 endloop endfacet facet normal -0.941028 0.235713 -0.242705 outer loop vertex 2.747209 -0.833356 0.870853 vertex 2.815663 -0.560070 0.870853 vertex 2.885823 -0.574026 0.585271 endloop endfacet facet normal -0.779470 0.195247 0.595235 outer loop vertex 2.274476 -0.452420 -1.903181 vertex 2.219179 -0.673179 -1.903181 vertex 2.387004 -0.724089 -1.666712 endloop endfacet facet normal -0.779468 0.195250 0.595238 outer loop vertex 2.387004 -0.724089 -1.666712 vertex 2.446484 -0.486635 -1.666712 vertex 2.274476 -0.452420 -1.903181 endloop endfacet facet normal -0.877093 0.219702 -0.427129 outer loop vertex 2.718385 -0.540720 1.148050 vertex 2.652295 -0.804564 1.148050 vertex 2.531842 -0.768025 1.414190 endloop endfacet facet normal -0.877092 0.219700 -0.427131 outer loop vertex 2.531842 -0.768025 1.414190 vertex 2.594930 -0.516163 1.414190 vertex 2.718385 -0.540720 1.148050 endloop endfacet facet normal -0.877092 0.219699 0.427132 outer loop vertex 2.594930 -0.516163 -1.414191 vertex 2.531842 -0.768025 -1.414191 vertex 2.652296 -0.804564 -1.148051 endloop endfacet facet normal -0.877091 0.219701 0.427134 outer loop vertex 2.652296 -0.804564 -1.148051 vertex 2.718386 -0.540720 -1.148051 vertex 2.594930 -0.516163 -1.414191 endloop endfacet facet normal -0.779468 0.195246 -0.595238 outer loop vertex 2.446484 -0.486636 1.666711 vertex 2.387005 -0.724090 1.666711 vertex 2.219179 -0.673179 1.903180 endloop endfacet facet normal -0.779469 0.195250 -0.595236 outer loop vertex 2.219179 -0.673179 1.903180 vertex 2.274477 -0.452420 1.903180 vertex 2.446484 -0.486636 1.666711 endloop endfacet facet normal -0.235966 0.059108 0.969962 outer loop vertex 0.574028 -0.114181 -2.942356 vertex 0.560072 -0.169895 -2.942356 vertex 0.833358 -0.252795 -2.870821 endloop endfacet facet normal -0.235966 0.059108 0.969962 outer loop vertex 0.833358 -0.252795 -2.870821 vertex 0.854124 -0.169895 -2.870821 vertex 0.574028 -0.114181 -2.942356 endloop endfacet facet normal -0.941028 0.235717 0.242702 outer loop vertex 2.815663 -0.560070 -0.870855 vertex 2.747208 -0.833356 -0.870855 vertex 2.815662 -0.854121 -0.585272 endloop endfacet facet normal -0.941027 0.235717 0.242703 outer loop vertex 2.815662 -0.854121 -0.585272 vertex 2.885823 -0.574025 -0.585272 vertex 2.815663 -0.560070 -0.870855 endloop endfacet facet normal -0.651866 0.163285 -0.740546 outer loop vertex 2.080563 -0.413849 2.121321 vertex 2.029980 -0.615787 2.121321 vertex 1.821234 -0.552464 2.319032 endloop endfacet facet normal -0.651866 0.163283 -0.740547 outer loop vertex 1.821234 -0.552464 2.319032 vertex 1.866615 -0.371292 2.319032 vertex 2.080563 -0.413849 2.121321 endloop endfacet facet normal -0.415149 0.103992 0.903790 outer loop vertex 1.125994 -0.223973 -2.771639 vertex 1.098618 -0.333261 -2.771639 vertex 1.353299 -0.410518 -2.645764 endloop endfacet facet normal -0.415151 0.103989 0.903790 outer loop vertex 1.353299 -0.410518 -2.645764 vertex 1.387020 -0.275895 -2.645764 vertex 1.125994 -0.223973 -2.771639 endloop endfacet facet normal -0.968866 0.242687 0.049011 outer loop vertex 2.928191 -0.582452 -0.294052 vertex 2.857001 -0.866660 -0.294052 vertex 2.870825 -0.870855 -0.000001 endloop endfacet facet normal -0.968866 0.242688 0.049012 outer loop vertex 2.870825 -0.870855 -0.000001 vertex 2.942360 -0.585271 -0.000001 vertex 2.928191 -0.582452 -0.294052 endloop endfacet facet normal -0.499135 0.125028 -0.857457 outer loop vertex 1.634690 -0.325159 2.494409 vertex 1.594947 -0.483821 2.494409 vertex 1.353300 -0.410518 2.645763 endloop endfacet facet normal -0.499135 0.125025 -0.857457 outer loop vertex 1.353300 -0.410518 2.645763 vertex 1.387021 -0.275895 2.645763 vertex 1.634690 -0.325159 2.494409 endloop endfacet facet normal -0.578296 0.144853 0.802864 outer loop vertex 1.634688 -0.325159 -2.494410 vertex 1.594946 -0.483821 -2.494410 vertex 1.821233 -0.552464 -2.319033 endloop endfacet facet normal -0.578295 0.144854 0.802865 outer loop vertex 1.821233 -0.552464 -2.319033 vertex 1.866614 -0.371292 -2.319033 vertex 1.634688 -0.325159 -2.494410 endloop endfacet facet normal -0.327142 0.081944 -0.941416 outer loop vertex 1.125995 -0.223974 2.771639 vertex 1.098620 -0.333262 2.771639 vertex 0.833360 -0.252796 2.870821 endloop endfacet facet normal -0.327142 0.081943 -0.941416 outer loop vertex 0.833360 -0.252796 2.870821 vertex 0.854125 -0.169896 2.870821 vertex 1.125995 -0.223974 2.771639 endloop endfacet facet normal -0.959558 0.240355 -0.146556 outer loop vertex 2.928191 -0.582452 0.294051 vertex 2.857001 -0.866660 0.294051 vertex 2.815663 -0.854121 0.585271 endloop endfacet facet normal -0.959558 0.240356 -0.146555 outer loop vertex 2.815663 -0.854121 0.585271 vertex 2.885823 -0.574026 0.585271 vertex 2.928191 -0.582452 0.294051 endloop endfacet facet normal -0.719133 0.180135 0.671118 outer loop vertex 2.080562 -0.413849 -2.121322 vertex 2.029979 -0.615786 -2.121322 vertex 2.219179 -0.673179 -1.903181 endloop endfacet facet normal -0.719134 0.180133 0.671117 outer loop vertex 2.219179 -0.673179 -1.903181 vertex 2.274476 -0.452420 -1.903181 vertex 2.080562 -0.413849 -2.121322 endloop endfacet facet normal -0.142499 0.035695 -0.989151 outer loop vertex 0.574030 -0.114181 2.942356 vertex 0.560074 -0.169896 2.942356 vertex 0.281394 -0.085359 2.985554 endloop endfacet facet normal -0.142499 0.035696 -0.989151 outer loop vertex 0.281394 -0.085359 2.985554 vertex 0.288406 -0.057367 2.985554 vertex 0.574030 -0.114181 2.942356 endloop endfacet facet normal -0.913450 0.228805 -0.336537 outer loop vertex 2.815663 -0.560070 0.870853 vertex 2.747209 -0.833356 0.870853 vertex 2.652295 -0.804564 1.148050 endloop endfacet facet normal -0.913450 0.228809 -0.336534 outer loop vertex 2.652295 -0.804564 1.148050 vertex 2.718385 -0.540720 1.148050 vertex 2.815663 -0.560070 0.870853 endloop endfacet facet normal -0.832287 0.208481 0.513647 outer loop vertex 2.446484 -0.486635 -1.666712 vertex 2.387004 -0.724089 -1.666712 vertex 2.531842 -0.768025 -1.414191 endloop endfacet facet normal -0.832290 0.208477 0.513644 outer loop vertex 2.531842 -0.768025 -1.414191 vertex 2.594930 -0.516163 -1.414191 vertex 2.446484 -0.486635 -1.666712 endloop endfacet facet normal -0.832290 0.208477 -0.513644 outer loop vertex 2.594930 -0.516163 1.414190 vertex 2.531842 -0.768025 1.414190 vertex 2.387005 -0.724090 1.666711 endloop endfacet facet normal -0.832290 0.208477 -0.513644 outer loop vertex 2.387005 -0.724090 1.666711 vertex 2.446484 -0.486636 1.666711 vertex 2.594930 -0.516163 1.414190 endloop endfacet facet normal -0.142499 0.035696 0.989151 outer loop vertex 0.288404 -0.057367 -2.985554 vertex 0.281392 -0.085359 -2.985554 vertex 0.560072 -0.169895 -2.942356 endloop endfacet facet normal -0.142499 0.035695 0.989151 outer loop vertex 0.560072 -0.169895 -2.942356 vertex 0.574028 -0.114181 -2.942356 vertex 0.288404 -0.057367 -2.985554 endloop endfacet facet normal -0.913451 0.228809 0.336532 outer loop vertex 2.718386 -0.540720 -1.148051 vertex 2.652296 -0.804564 -1.148051 vertex 2.747208 -0.833356 -0.870855 endloop endfacet facet normal -0.913451 0.228809 0.336532 outer loop vertex 2.747208 -0.833356 -0.870855 vertex 2.815663 -0.560070 -0.870855 vertex 2.718386 -0.540720 -1.148051 endloop endfacet facet normal -0.719134 0.180137 -0.671116 outer loop vertex 2.274477 -0.452420 1.903180 vertex 2.219179 -0.673179 1.903180 vertex 2.029980 -0.615787 2.121321 endloop endfacet facet normal -0.719134 0.180135 -0.671117 outer loop vertex 2.029980 -0.615787 2.121321 vertex 2.080563 -0.413849 2.121321 vertex 2.274477 -0.452420 1.903180 endloop endfacet facet normal -0.327141 0.081947 0.941416 outer loop vertex 0.854124 -0.169895 -2.870821 vertex 0.833358 -0.252795 -2.870821 vertex 1.098618 -0.333261 -2.771639 endloop endfacet facet normal -0.327141 0.081947 0.941416 outer loop vertex 1.098618 -0.333261 -2.771639 vertex 1.125994 -0.223973 -2.771639 vertex 0.854124 -0.169895 -2.870821 endloop endfacet facet normal -0.959556 0.240359 0.146560 outer loop vertex 2.885823 -0.574025 -0.585272 vertex 2.815662 -0.854121 -0.585272 vertex 2.857001 -0.866660 -0.294052 endloop endfacet facet normal -0.959558 0.240355 0.146556 outer loop vertex 2.857001 -0.866660 -0.294052 vertex 2.928191 -0.582452 -0.294052 vertex 2.885823 -0.574025 -0.585272 endloop endfacet facet normal -0.578296 0.144855 -0.802864 outer loop vertex 1.866615 -0.371292 2.319032 vertex 1.821234 -0.552464 2.319032 vertex 1.594947 -0.483821 2.494409 endloop endfacet facet normal -0.578296 0.144857 -0.802864 outer loop vertex 1.594947 -0.483821 2.494409 vertex 1.634690 -0.325159 2.494409 vertex 1.866615 -0.371292 2.319032 endloop endfacet facet normal -0.499136 0.125026 0.857457 outer loop vertex 1.387020 -0.275895 -2.645764 vertex 1.353299 -0.410518 -2.645764 vertex 1.594946 -0.483821 -2.494410 endloop endfacet facet normal -0.499137 0.125025 0.857456 outer loop vertex 1.594946 -0.483821 -2.494410 vertex 1.634688 -0.325159 -2.494410 vertex 1.387020 -0.275895 -2.645764 endloop endfacet facet normal -0.415155 0.103990 -0.903788 outer loop vertex 1.387021 -0.275895 2.645763 vertex 1.353300 -0.410518 2.645763 vertex 1.098620 -0.333262 2.771639 endloop endfacet facet normal -0.415155 0.103990 -0.903788 outer loop vertex 1.098620 -0.333262 2.771639 vertex 1.125995 -0.223974 2.771639 vertex 1.387021 -0.275895 2.645763 endloop endfacet facet normal -0.968866 0.242688 -0.049011 outer loop vertex 2.942360 -0.585271 -0.000001 vertex 2.870825 -0.870855 -0.000001 vertex 2.857001 -0.866660 0.294051 endloop endfacet facet normal -0.968866 0.242687 -0.049012 outer loop vertex 2.857001 -0.866660 0.294051 vertex 2.928191 -0.582452 0.294051 vertex 2.942360 -0.585271 -0.000001 endloop endfacet facet normal -0.561312 0.200842 0.802864 outer loop vertex 1.594946 -0.483821 -2.494410 vertex 1.539843 -0.637823 -2.494410 vertex 1.758312 -0.728316 -2.319033 endloop endfacet facet normal -0.561312 0.200841 0.802864 outer loop vertex 1.758312 -0.728316 -2.319033 vertex 1.821233 -0.552464 -2.319033 vertex 1.594946 -0.483821 -2.494410 endloop endfacet facet normal -0.317535 0.113618 -0.941415 outer loop vertex 1.098620 -0.333262 2.771639 vertex 1.060664 -0.439340 2.771639 vertex 0.804569 -0.333262 2.870821 endloop endfacet facet normal -0.317535 0.113615 -0.941416 outer loop vertex 0.804569 -0.333262 2.870821 vertex 0.833360 -0.252796 2.870821 vertex 1.098620 -0.333262 2.771639 endloop endfacet facet normal -0.931377 0.333252 -0.146557 outer loop vertex 2.857001 -0.866660 0.294051 vertex 2.758296 -1.142522 0.294051 vertex 2.718386 -1.125991 0.585271 endloop endfacet facet normal -0.931377 0.333254 -0.146555 outer loop vertex 2.718386 -1.125991 0.585271 vertex 2.815663 -0.854121 0.585271 vertex 2.857001 -0.866660 0.294051 endloop endfacet facet normal -0.698016 0.249751 0.671117 outer loop vertex 2.029979 -0.615786 -2.121322 vertex 1.959847 -0.811794 -2.121322 vertex 2.142510 -0.887455 -1.903181 endloop endfacet facet normal -0.698014 0.249753 0.671118 outer loop vertex 2.142510 -0.887455 -1.903181 vertex 2.219179 -0.673179 -1.903181 vertex 2.029979 -0.615786 -2.121322 endloop endfacet facet normal -0.138315 0.049491 -0.989151 outer loop vertex 0.560074 -0.169896 2.942356 vertex 0.540724 -0.223974 2.942356 vertex 0.271673 -0.112530 2.985554 endloop endfacet facet normal -0.138316 0.049485 -0.989151 outer loop vertex 0.271673 -0.112530 2.985554 vertex 0.281394 -0.085359 2.985554 vertex 0.560074 -0.169896 2.942356 endloop endfacet facet normal -0.886625 0.317241 -0.336534 outer loop vertex 2.747209 -0.833356 0.870853 vertex 2.652297 -1.098616 0.870853 vertex 2.560663 -1.060660 1.148050 endloop endfacet facet normal -0.886625 0.317238 -0.336537 outer loop vertex 2.560663 -1.060660 1.148050 vertex 2.652295 -0.804564 1.148050 vertex 2.747209 -0.833356 0.870853 endloop endfacet facet normal -0.807847 0.289050 0.513646 outer loop vertex 2.387004 -0.724089 -1.666712 vertex 2.304537 -0.954570 -1.666712 vertex 2.444371 -1.012491 -1.414191 endloop endfacet facet normal -0.807847 0.289051 0.513647 outer loop vertex 2.444371 -1.012491 -1.414191 vertex 2.531842 -0.768025 -1.414191 vertex 2.387004 -0.724089 -1.666712 endloop endfacet facet normal -0.807847 0.289051 -0.513647 outer loop vertex 2.531842 -0.768025 1.414190 vertex 2.444371 -1.012491 1.414190 vertex 2.304537 -0.954570 1.666711 endloop endfacet facet normal -0.807847 0.289056 -0.513644 outer loop vertex 2.304537 -0.954570 1.666711 vertex 2.387005 -0.724090 1.666711 vertex 2.531842 -0.768025 1.414190 endloop endfacet facet normal -0.138314 0.049492 0.989151 outer loop vertex 0.281392 -0.085359 -2.985554 vertex 0.271670 -0.112529 -2.985554 vertex 0.540722 -0.223973 -2.942356 endloop endfacet facet normal -0.138314 0.049491 0.989151 outer loop vertex 0.540722 -0.223973 -2.942356 vertex 0.560072 -0.169895 -2.942356 vertex 0.281392 -0.085359 -2.985554 endloop endfacet facet normal -0.886626 0.317238 0.336532 outer loop vertex 2.652296 -0.804564 -1.148051 vertex 2.560664 -1.060660 -1.148051 vertex 2.652297 -1.098616 -0.870855 endloop endfacet facet normal -0.886626 0.317238 0.336532 outer loop vertex 2.652297 -1.098616 -0.870855 vertex 2.747208 -0.833356 -0.870855 vertex 2.652296 -0.804564 -1.148051 endloop endfacet facet normal -0.698017 0.249754 -0.671115 outer loop vertex 2.219179 -0.673179 1.903180 vertex 2.142510 -0.887455 1.903180 vertex 1.959848 -0.811794 2.121321 endloop endfacet facet normal -0.698017 0.249753 -0.671116 outer loop vertex 1.959848 -0.811794 2.121321 vertex 2.029980 -0.615787 2.121321 vertex 2.219179 -0.673179 1.903180 endloop endfacet facet normal -0.317534 0.113615 0.941416 outer loop vertex 0.833358 -0.252795 -2.870821 vertex 0.804567 -0.333261 -2.870821 vertex 1.060663 -0.439340 -2.771639 endloop endfacet facet normal -0.317535 0.113614 0.941416 outer loop vertex 1.060663 -0.439340 -2.771639 vertex 1.098618 -0.333261 -2.771639 vertex 0.833358 -0.252795 -2.870821 endloop endfacet facet normal -0.931377 0.333253 0.146560 outer loop vertex 2.815662 -0.854121 -0.585272 vertex 2.718385 -1.125991 -0.585272 vertex 2.758296 -1.142522 -0.294052 endloop endfacet facet normal -0.931377 0.333252 0.146559 outer loop vertex 2.758296 -1.142522 -0.294052 vertex 2.857001 -0.866660 -0.294052 vertex 2.815662 -0.854121 -0.585272 endloop endfacet facet normal -0.561312 0.200841 -0.802864 outer loop vertex 1.821234 -0.552464 2.319032 vertex 1.758313 -0.728316 2.319032 vertex 1.539844 -0.637823 2.494409 endloop endfacet facet normal -0.561312 0.200841 -0.802864 outer loop vertex 1.539844 -0.637823 2.494409 vertex 1.594947 -0.483821 2.494409 vertex 1.821234 -0.552464 2.319032 endloop endfacet facet normal -0.484475 0.173352 0.857457 outer loop vertex 1.353299 -0.410518 -2.645764 vertex 1.306544 -0.541187 -2.645764 vertex 1.539843 -0.637823 -2.494410 endloop endfacet facet normal -0.484477 0.173350 0.857457 outer loop vertex 1.539843 -0.637823 -2.494410 vertex 1.594946 -0.483821 -2.494410 vertex 1.353299 -0.410518 -2.645764 endloop endfacet facet normal -0.402962 0.144181 -0.903789 outer loop vertex 1.353300 -0.410518 2.645763 vertex 1.306546 -0.541188 2.645763 vertex 1.060664 -0.439340 2.771639 endloop endfacet facet normal -0.402962 0.144185 -0.903788 outer loop vertex 1.060664 -0.439340 2.771639 vertex 1.098620 -0.333262 2.771639 vertex 1.353300 -0.410518 2.645763 endloop endfacet facet normal -0.940413 0.336484 -0.049012 outer loop vertex 2.870825 -0.870855 -0.000001 vertex 2.771643 -1.148051 -0.000001 vertex 2.758296 -1.142522 0.294051 endloop endfacet facet normal -0.940413 0.336485 -0.049011 outer loop vertex 2.758296 -1.142522 0.294051 vertex 2.857001 -0.866660 0.294051 vertex 2.870825 -0.870855 -0.000001 endloop endfacet facet normal -0.632722 0.226392 0.740547 outer loop vertex 1.821233 -0.552464 -2.319033 vertex 1.758312 -0.728316 -2.319033 vertex 1.959847 -0.811794 -2.121322 endloop endfacet facet normal -0.632724 0.226390 0.740546 outer loop vertex 1.959847 -0.811794 -2.121322 vertex 2.029979 -0.615786 -2.121322 vertex 1.821233 -0.552464 -2.319033 endloop endfacet facet normal -0.229037 0.081950 -0.969962 outer loop vertex 0.833360 -0.252796 2.870821 vertex 0.804569 -0.333262 2.870821 vertex 0.540724 -0.223974 2.942356 endloop endfacet facet normal -0.229036 0.081953 -0.969962 outer loop vertex 0.540724 -0.223974 2.942356 vertex 0.560074 -0.169896 2.942356 vertex 0.833360 -0.252796 2.870821 endloop endfacet facet normal -0.913392 0.326819 -0.242703 outer loop vertex 2.815663 -0.854121 0.585271 vertex 2.718386 -1.125991 0.585271 vertex 2.652297 -1.098616 0.870853 endloop endfacet facet normal -0.913392 0.326819 -0.242703 outer loop vertex 2.652297 -1.098616 0.870853 vertex 2.747209 -0.833356 0.870853 vertex 2.815663 -0.854121 0.585271 endloop endfacet facet normal -0.756579 0.270707 0.595236 outer loop vertex 2.219179 -0.673179 -1.903181 vertex 2.142510 -0.887455 -1.903181 vertex 2.304537 -0.954570 -1.666712 endloop endfacet facet normal -0.756580 0.270707 0.595235 outer loop vertex 2.304537 -0.954570 -1.666712 vertex 2.387004 -0.724089 -1.666712 vertex 2.219179 -0.673179 -1.903181 endloop endfacet facet normal -0.851336 0.304611 -0.427130 outer loop vertex 2.652295 -0.804564 1.148050 vertex 2.560663 -1.060660 1.148050 vertex 2.444371 -1.012491 1.414190 endloop endfacet facet normal -0.851336 0.304612 -0.427129 outer loop vertex 2.444371 -1.012491 1.414190 vertex 2.531842 -0.768025 1.414190 vertex 2.652295 -0.804564 1.148050 endloop endfacet facet normal -0.851334 0.304611 0.427132 outer loop vertex 2.531842 -0.768025 -1.414191 vertex 2.444371 -1.012491 -1.414191 vertex 2.560664 -1.060660 -1.148051 endloop endfacet facet normal -0.851335 0.304611 0.427132 outer loop vertex 2.560664 -1.060660 -1.148051 vertex 2.652296 -0.804564 -1.148051 vertex 2.531842 -0.768025 -1.414191 endloop endfacet facet normal -0.756578 0.270711 -0.595236 outer loop vertex 2.387005 -0.724090 1.666711 vertex 2.304537 -0.954570 1.666711 vertex 2.142510 -0.887455 1.903180 endloop endfacet facet normal -0.756577 0.270707 -0.595238 outer loop vertex 2.142510 -0.887455 1.903180 vertex 2.219179 -0.673179 1.903180 vertex 2.387005 -0.724090 1.666711 endloop endfacet facet normal -0.229036 0.081953 0.969962 outer loop vertex 0.560072 -0.169895 -2.942356 vertex 0.540722 -0.223973 -2.942356 vertex 0.804567 -0.333261 -2.870821 endloop endfacet facet normal -0.229037 0.081950 0.969962 outer loop vertex 0.804567 -0.333261 -2.870821 vertex 0.833358 -0.252795 -2.870821 vertex 0.560072 -0.169895 -2.942356 endloop endfacet facet normal -0.913394 0.326816 0.242700 outer loop vertex 2.747208 -0.833356 -0.870855 vertex 2.652297 -1.098616 -0.870855 vertex 2.718385 -1.125991 -0.585272 endloop endfacet facet normal -0.913392 0.326818 0.242702 outer loop vertex 2.718385 -1.125991 -0.585272 vertex 2.815662 -0.854121 -0.585272 vertex 2.747208 -0.833356 -0.870855 endloop endfacet facet normal -0.632722 0.226390 -0.740547 outer loop vertex 2.029980 -0.615787 2.121321 vertex 1.959848 -0.811794 2.121321 vertex 1.758313 -0.728316 2.319032 endloop endfacet facet normal -0.632723 0.226392 -0.740546 outer loop vertex 1.758313 -0.728316 2.319032 vertex 1.821234 -0.552464 2.319032 vertex 2.029980 -0.615787 2.121321 endloop endfacet facet normal -0.402960 0.144179 0.903789 outer loop vertex 1.098618 -0.333261 -2.771639 vertex 1.060663 -0.439340 -2.771639 vertex 1.306544 -0.541187 -2.645764 endloop endfacet facet normal -0.402957 0.144183 0.903790 outer loop vertex 1.306544 -0.541187 -2.645764 vertex 1.353299 -0.410518 -2.645764 vertex 1.098618 -0.333261 -2.771639 endloop endfacet facet normal -0.940412 0.336485 0.049012 outer loop vertex 2.857001 -0.866660 -0.294052 vertex 2.758296 -1.142522 -0.294052 vertex 2.771643 -1.148051 -0.000001 endloop endfacet facet normal -0.940413 0.336484 0.049011 outer loop vertex 2.771643 -1.148051 -0.000001 vertex 2.870825 -0.870855 -0.000001 vertex 2.857001 -0.866660 -0.294052 endloop endfacet facet normal -0.484478 0.173349 -0.857456 outer loop vertex 1.594947 -0.483821 2.494409 vertex 1.539844 -0.637823 2.494409 vertex 1.306546 -0.541188 2.645763 endloop endfacet facet normal -0.484478 0.173347 -0.857457 outer loop vertex 1.306546 -0.541188 2.645763 vertex 1.353300 -0.410518 2.645763 vertex 1.594947 -0.483821 2.494409 endloop endfacet facet normal -0.465153 0.220000 0.857457 outer loop vertex 1.306544 -0.541187 -2.645764 vertex 1.247207 -0.666645 -2.645764 vertex 1.469911 -0.785682 -2.494410 endloop endfacet facet normal -0.465153 0.220000 0.857457 outer loop vertex 1.469911 -0.785682 -2.494410 vertex 1.539843 -0.637823 -2.494410 vertex 1.306544 -0.541187 -2.645764 endloop endfacet facet normal -0.386889 0.182986 -0.903788 outer loop vertex 1.306546 -0.541188 2.645763 vertex 1.247209 -0.666645 2.645763 vertex 1.012494 -0.541188 2.771639 endloop endfacet facet normal -0.386889 0.182983 -0.903789 outer loop vertex 1.012494 -0.541188 2.771639 vertex 1.060664 -0.439340 2.771639 vertex 1.306546 -0.541188 2.645763 endloop endfacet facet normal -0.902903 0.427042 -0.049008 outer loop vertex 2.771643 -1.148051 -0.000001 vertex 2.645768 -1.414191 -0.000001 vertex 2.633028 -1.407381 0.294051 endloop endfacet facet normal -0.902904 0.427038 -0.049012 outer loop vertex 2.633028 -1.407381 0.294051 vertex 2.758296 -1.142522 0.294051 vertex 2.771643 -1.148051 -0.000001 endloop endfacet facet normal -0.607485 0.287319 0.740547 outer loop vertex 1.758312 -0.728316 -2.319033 vertex 1.678458 -0.897153 -2.319033 vertex 1.870840 -0.999983 -2.121322 endloop endfacet facet normal -0.607485 0.287320 0.740547 outer loop vertex 1.870840 -0.999983 -2.121322 vertex 1.959847 -0.811794 -2.121322 vertex 1.758312 -0.728316 -2.319033 endloop endfacet facet normal -0.219901 0.104006 -0.969962 outer loop vertex 0.804569 -0.333262 2.870821 vertex 0.768029 -0.410519 2.870821 vertex 0.516167 -0.275896 2.942356 endloop endfacet facet normal -0.219901 0.104004 -0.969962 outer loop vertex 0.516167 -0.275896 2.942356 vertex 0.540724 -0.223974 2.942356 vertex 0.804569 -0.333262 2.870821 endloop endfacet facet normal -0.876961 0.414770 -0.242706 outer loop vertex 2.718386 -1.125991 0.585271 vertex 2.594930 -1.387018 0.585271 vertex 2.531842 -1.353296 0.870853 endloop endfacet facet normal -0.876960 0.414772 -0.242703 outer loop vertex 2.531842 -1.353296 0.870853 vertex 2.652297 -1.098616 0.870853 vertex 2.718386 -1.125991 0.585271 endloop endfacet facet normal -0.726400 0.343563 0.595237 outer loop vertex 2.142510 -0.887455 -1.903181 vertex 2.045207 -1.093184 -1.903181 vertex 2.199876 -1.175857 -1.666712 endloop endfacet facet normal -0.726401 0.343562 0.595236 outer loop vertex 2.199876 -1.175857 -1.666712 vertex 2.304537 -0.954570 -1.666712 vertex 2.142510 -0.887455 -1.903181 endloop endfacet facet normal -0.817378 0.386591 -0.427131 outer loop vertex 2.560663 -1.060660 1.148050 vertex 2.444370 -1.306541 1.148050 vertex 2.333359 -1.247205 1.414190 endloop endfacet facet normal -0.817378 0.386593 -0.427130 outer loop vertex 2.333359 -1.247205 1.414190 vertex 2.444371 -1.012491 1.414190 vertex 2.560663 -1.060660 1.148050 endloop endfacet facet normal -0.817376 0.386592 0.427135 outer loop vertex 2.444371 -1.012491 -1.414191 vertex 2.333359 -1.247205 -1.414191 vertex 2.444371 -1.306542 -1.148051 endloop endfacet facet normal -0.817378 0.386589 0.427132 outer loop vertex 2.444371 -1.306542 -1.148051 vertex 2.560664 -1.060660 -1.148051 vertex 2.444371 -1.012491 -1.414191 endloop endfacet facet normal -0.726402 0.343561 -0.595236 outer loop vertex 2.304537 -0.954570 1.666711 vertex 2.199876 -1.175858 1.666711 vertex 2.045208 -1.093184 1.903180 endloop endfacet facet normal -0.726402 0.343560 -0.595236 outer loop vertex 2.045208 -1.093184 1.903180 vertex 2.142510 -0.887455 1.903180 vertex 2.304537 -0.954570 1.666711 endloop endfacet facet normal -0.219901 0.104004 0.969962 outer loop vertex 0.540722 -0.223973 -2.942356 vertex 0.516165 -0.275895 -2.942356 vertex 0.768028 -0.410518 -2.870821 endloop endfacet facet normal -0.219902 0.104003 0.969962 outer loop vertex 0.768028 -0.410518 -2.870821 vertex 0.804567 -0.333261 -2.870821 vertex 0.540722 -0.223973 -2.942356 endloop endfacet facet normal -0.876961 0.414773 0.242701 outer loop vertex 2.652297 -1.098616 -0.870855 vertex 2.531842 -1.353296 -0.870855 vertex 2.594929 -1.387017 -0.585272 endloop endfacet facet normal -0.876961 0.414771 0.242700 outer loop vertex 2.594929 -1.387017 -0.585272 vertex 2.718385 -1.125991 -0.585272 vertex 2.652297 -1.098616 -0.870855 endloop endfacet facet normal -0.607485 0.287318 -0.740547 outer loop vertex 1.959848 -0.811794 2.121321 vertex 1.870841 -0.999984 2.121321 vertex 1.678459 -0.897154 2.319032 endloop endfacet facet normal -0.607485 0.287317 -0.740547 outer loop vertex 1.678459 -0.897154 2.319032 vertex 1.758313 -0.728316 2.319032 vertex 1.959848 -0.811794 2.121321 endloop endfacet facet normal -0.386887 0.182984 0.903790 outer loop vertex 1.060663 -0.439340 -2.771639 vertex 1.012493 -0.541187 -2.771639 vertex 1.247207 -0.666645 -2.645764 endloop endfacet facet normal -0.386887 0.182983 0.903790 outer loop vertex 1.247207 -0.666645 -2.645764 vertex 1.306544 -0.541187 -2.645764 vertex 1.060663 -0.439340 -2.771639 endloop endfacet facet normal -0.902904 0.427038 0.049009 outer loop vertex 2.758296 -1.142522 -0.294052 vertex 2.633028 -1.407381 -0.294052 vertex 2.645768 -1.414191 -0.000001 endloop endfacet facet normal -0.902903 0.427042 0.049012 outer loop vertex 2.645768 -1.414191 -0.000001 vertex 2.771643 -1.148051 -0.000001 vertex 2.758296 -1.142522 -0.294052 endloop endfacet facet normal -0.465153 0.219999 -0.857457 outer loop vertex 1.539844 -0.637823 2.494409 vertex 1.469912 -0.785683 2.494409 vertex 1.247209 -0.666645 2.645763 endloop endfacet facet normal -0.465153 0.220002 -0.857456 outer loop vertex 1.247209 -0.666645 2.645763 vertex 1.306546 -0.541188 2.645763 vertex 1.539844 -0.637823 2.494409 endloop endfacet facet normal -0.538924 0.254892 0.802864 outer loop vertex 1.539843 -0.637823 -2.494410 vertex 1.469911 -0.785682 -2.494410 vertex 1.678458 -0.897153 -2.319033 endloop endfacet facet normal -0.538924 0.254892 0.802864 outer loop vertex 1.678458 -0.897153 -2.319033 vertex 1.758312 -0.728316 -2.319033 vertex 1.539843 -0.637823 -2.494410 endloop endfacet facet normal -0.304870 0.144191 -0.941415 outer loop vertex 1.060664 -0.439340 2.771639 vertex 1.012494 -0.541188 2.771639 vertex 0.768029 -0.410519 2.870821 endloop endfacet facet normal -0.304870 0.144193 -0.941415 outer loop vertex 0.768029 -0.410519 2.870821 vertex 0.804569 -0.333262 2.870821 vertex 1.060664 -0.439340 2.771639 endloop endfacet facet normal -0.894229 0.422936 -0.146558 outer loop vertex 2.758296 -1.142522 0.294051 vertex 2.633028 -1.407381 0.294051 vertex 2.594930 -1.387018 0.585271 endloop endfacet facet normal -0.894229 0.422937 -0.146557 outer loop vertex 2.594930 -1.387018 0.585271 vertex 2.718386 -1.125991 0.585271 vertex 2.758296 -1.142522 0.294051 endloop endfacet facet normal -0.670174 0.316969 0.671117 outer loop vertex 1.959847 -0.811794 -2.121322 vertex 1.870840 -0.999983 -2.121322 vertex 2.045207 -1.093184 -1.903181 endloop endfacet facet normal -0.670173 0.316970 0.671117 outer loop vertex 2.045207 -1.093184 -1.903181 vertex 2.142510 -0.887455 -1.903181 vertex 1.959847 -0.811794 -2.121322 endloop endfacet facet normal -0.132798 0.062808 -0.989151 outer loop vertex 0.540724 -0.223974 2.942356 vertex 0.516167 -0.275896 2.942356 vertex 0.259335 -0.138616 2.985554 endloop endfacet facet normal -0.132798 0.062810 -0.989151 outer loop vertex 0.259335 -0.138616 2.985554 vertex 0.271673 -0.112530 2.985554 vertex 0.540724 -0.223974 2.942356 endloop endfacet facet normal -0.851261 0.402617 -0.336533 outer loop vertex 2.652297 -1.098616 0.870853 vertex 2.531842 -1.353296 0.870853 vertex 2.444370 -1.306541 1.148050 endloop endfacet facet normal -0.851261 0.402616 -0.336534 outer loop vertex 2.444370 -1.306541 1.148050 vertex 2.560663 -1.060660 1.148050 vertex 2.652297 -1.098616 0.870853 endloop endfacet facet normal -0.775625 0.366844 0.513645 outer loop vertex 2.304537 -0.954570 -1.666712 vertex 2.199876 -1.175857 -1.666712 vertex 2.333359 -1.247205 -1.414191 endloop endfacet facet normal -0.775624 0.366844 0.513646 outer loop vertex 2.333359 -1.247205 -1.414191 vertex 2.444371 -1.012491 -1.414191 vertex 2.304537 -0.954570 -1.666712 endloop endfacet facet normal -0.775625 0.366845 -0.513644 outer loop vertex 2.444371 -1.012491 1.414190 vertex 2.333359 -1.247205 1.414190 vertex 2.199876 -1.175858 1.666711 endloop endfacet facet normal -0.775625 0.366842 -0.513647 outer loop vertex 2.199876 -1.175858 1.666711 vertex 2.304537 -0.954570 1.666711 vertex 2.444371 -1.012491 1.414190 endloop endfacet facet normal -0.132800 0.062806 0.989151 outer loop vertex 0.271670 -0.112529 -2.985554 vertex 0.259333 -0.138615 -2.985554 vertex 0.516165 -0.275895 -2.942356 endloop endfacet facet normal -0.132798 0.062808 0.989151 outer loop vertex 0.516165 -0.275895 -2.942356 vertex 0.540722 -0.223973 -2.942356 vertex 0.271670 -0.112529 -2.985554 endloop endfacet facet normal -0.851263 0.402615 0.336530 outer loop vertex 2.560664 -1.060660 -1.148051 vertex 2.444371 -1.306542 -1.148051 vertex 2.531842 -1.353296 -0.870855 endloop endfacet facet normal -0.851261 0.402618 0.336532 outer loop vertex 2.531842 -1.353296 -0.870855 vertex 2.652297 -1.098616 -0.870855 vertex 2.560664 -1.060660 -1.148051 endloop endfacet facet normal -0.670176 0.316967 -0.671116 outer loop vertex 2.142510 -0.887455 1.903180 vertex 2.045208 -1.093184 1.903180 vertex 1.870841 -0.999984 2.121321 endloop endfacet facet normal -0.670176 0.316969 -0.671115 outer loop vertex 1.870841 -0.999984 2.121321 vertex 1.959848 -0.811794 2.121321 vertex 2.142510 -0.887455 1.903180 endloop endfacet facet normal -0.304871 0.144190 0.941415 outer loop vertex 0.804567 -0.333261 -2.870821 vertex 0.768028 -0.410518 -2.870821 vertex 1.012493 -0.541187 -2.771639 endloop endfacet facet normal -0.304869 0.144192 0.941416 outer loop vertex 1.012493 -0.541187 -2.771639 vertex 1.060663 -0.439340 -2.771639 vertex 0.804567 -0.333261 -2.870821 endloop endfacet facet normal -0.894228 0.422938 0.146563 outer loop vertex 2.718385 -1.125991 -0.585272 vertex 2.594929 -1.387017 -0.585272 vertex 2.633028 -1.407381 -0.294052 endloop endfacet facet normal -0.894229 0.422935 0.146560 outer loop vertex 2.633028 -1.407381 -0.294052 vertex 2.758296 -1.142522 -0.294052 vertex 2.718385 -1.125991 -0.585272 endloop endfacet facet normal -0.538925 0.254891 -0.802864 outer loop vertex 1.758313 -0.728316 2.319032 vertex 1.678459 -0.897154 2.319032 vertex 1.469912 -0.785683 2.494409 endloop endfacet facet normal -0.538925 0.254890 -0.802864 outer loop vertex 1.469912 -0.785683 2.494409 vertex 1.539844 -0.637823 2.494409 vertex 1.758313 -0.728316 2.319032 endloop endfacet facet normal -0.367089 0.220023 0.903789 outer loop vertex 1.012493 -0.541187 -2.771639 vertex 0.954572 -0.637823 -2.771639 vertex 1.175859 -0.785682 -2.645764 endloop endfacet facet normal -0.367088 0.220024 0.903790 outer loop vertex 1.175859 -0.785682 -2.645764 vertex 1.247207 -0.666645 -2.645764 vertex 1.012493 -0.541187 -2.771639 endloop endfacet facet normal -0.856696 0.513488 0.049013 outer loop vertex 2.633028 -1.407381 -0.294052 vertex 2.482401 -1.658685 -0.294052 vertex 2.494413 -1.666712 -0.000001 endloop endfacet facet normal -0.856698 0.513484 0.049009 outer loop vertex 2.494413 -1.666712 -0.000001 vertex 2.645768 -1.414191 -0.000001 vertex 2.633028 -1.407381 -0.294052 endloop endfacet facet normal -0.441348 0.264536 -0.857457 outer loop vertex 1.469912 -0.785683 2.494409 vertex 1.385823 -0.925976 2.494409 vertex 1.175860 -0.785683 2.645763 endloop endfacet facet normal -0.441349 0.264535 -0.857457 outer loop vertex 1.175860 -0.785683 2.645763 vertex 1.247209 -0.666645 2.645763 vertex 1.469912 -0.785683 2.494409 endloop endfacet facet normal -0.511344 0.306490 0.802864 outer loop vertex 1.469911 -0.785682 -2.494410 vertex 1.385822 -0.925975 -2.494410 vertex 1.582439 -1.057350 -2.319033 endloop endfacet facet normal -0.511344 0.306490 0.802864 outer loop vertex 1.582439 -1.057350 -2.319033 vertex 1.678458 -0.897153 -2.319033 vertex 1.469911 -0.785682 -2.494410 endloop endfacet facet normal -0.289268 0.173381 -0.941415 outer loop vertex 1.012494 -0.541188 2.771639 vertex 0.954573 -0.637823 2.771639 vertex 0.724093 -0.483822 2.870821 endloop endfacet facet normal -0.289268 0.173380 -0.941415 outer loop vertex 0.724093 -0.483822 2.870821 vertex 0.768029 -0.410519 2.870821 vertex 1.012494 -0.541188 2.771639 endloop endfacet facet normal -0.848465 0.508555 -0.146556 outer loop vertex 2.633028 -1.407381 0.294051 vertex 2.482401 -1.658685 0.294051 vertex 2.446483 -1.634686 0.585271 endloop endfacet facet normal -0.848466 0.508553 -0.146558 outer loop vertex 2.446483 -1.634686 0.585271 vertex 2.594930 -1.387018 0.585271 vertex 2.633028 -1.407381 0.294051 endloop endfacet facet normal -0.635879 0.381131 0.671116 outer loop vertex 1.870840 -0.999983 -2.121322 vertex 1.763816 -1.178542 -2.121322 vertex 1.928208 -1.288385 -1.903181 endloop endfacet facet normal -0.635879 0.381131 0.671117 outer loop vertex 1.928208 -1.288385 -1.903181 vertex 2.045207 -1.093184 -1.903181 vertex 1.870840 -0.999983 -2.121322 endloop endfacet facet normal -0.126002 0.075523 -0.989151 outer loop vertex 0.516167 -0.275896 2.942356 vertex 0.486639 -0.325160 2.942356 vertex 0.244499 -0.163368 2.985554 endloop endfacet facet normal -0.126002 0.075524 -0.989151 outer loop vertex 0.244499 -0.163368 2.985554 vertex 0.259335 -0.138616 2.985554 vertex 0.516167 -0.275896 2.942356 endloop endfacet facet normal -0.807699 0.484116 -0.336533 outer loop vertex 2.531842 -1.353296 0.870853 vertex 2.387004 -1.594944 0.870853 vertex 2.304536 -1.539840 1.148050 endloop endfacet facet normal -0.807699 0.484116 -0.336533 outer loop vertex 2.304536 -1.539840 1.148050 vertex 2.444370 -1.306541 1.148050 vertex 2.531842 -1.353296 0.870853 endloop endfacet facet normal -0.735932 0.441101 0.513647 outer loop vertex 2.199876 -1.175857 -1.666712 vertex 2.074029 -1.385820 -1.666712 vertex 2.199876 -1.469909 -1.414191 endloop endfacet facet normal -0.735934 0.441100 0.513645 outer loop vertex 2.199876 -1.469909 -1.414191 vertex 2.333359 -1.247205 -1.414191 vertex 2.199876 -1.175857 -1.666712 endloop endfacet facet normal -0.735934 0.441100 -0.513646 outer loop vertex 2.333359 -1.247205 1.414190 vertex 2.199876 -1.469909 1.414190 vertex 2.074029 -1.385821 1.666711 endloop endfacet facet normal -0.735934 0.441102 -0.513644 outer loop vertex 2.074029 -1.385821 1.666711 vertex 2.199876 -1.175858 1.666711 vertex 2.333359 -1.247205 1.414190 endloop endfacet facet normal -0.126000 0.075526 0.989151 outer loop vertex 0.259333 -0.138615 -2.985554 vertex 0.244497 -0.163366 -2.985554 vertex 0.486638 -0.325159 -2.942356 endloop endfacet facet normal -0.126003 0.075522 0.989151 outer loop vertex 0.486638 -0.325159 -2.942356 vertex 0.516165 -0.275895 -2.942356 vertex 0.259333 -0.138615 -2.985554 endloop endfacet facet normal -0.807698 0.484118 0.336531 outer loop vertex 2.444371 -1.306542 -1.148051 vertex 2.304537 -1.539840 -1.148051 vertex 2.387004 -1.594944 -0.870855 endloop endfacet facet normal -0.807700 0.484116 0.336530 outer loop vertex 2.387004 -1.594944 -0.870855 vertex 2.531842 -1.353296 -0.870855 vertex 2.444371 -1.306542 -1.148051 endloop endfacet facet normal -0.635880 0.381130 -0.671116 outer loop vertex 2.045208 -1.093184 1.903180 vertex 1.928209 -1.288386 1.903180 vertex 1.763817 -1.178543 2.121321 endloop endfacet facet normal -0.635879 0.381131 -0.671116 outer loop vertex 1.763817 -1.178543 2.121321 vertex 1.870841 -0.999984 2.121321 vertex 2.045208 -1.093184 1.903180 endloop endfacet facet normal -0.289265 0.173383 0.941416 outer loop vertex 0.768028 -0.410518 -2.870821 vertex 0.724091 -0.483821 -2.870821 vertex 0.954572 -0.637823 -2.771639 endloop endfacet facet normal -0.289268 0.173380 0.941415 outer loop vertex 0.954572 -0.637823 -2.771639 vertex 1.012493 -0.541187 -2.771639 vertex 0.768028 -0.410518 -2.870821 endloop endfacet facet normal -0.848467 0.508551 0.146558 outer loop vertex 2.594929 -1.387017 -0.585272 vertex 2.446482 -1.634686 -0.585272 vertex 2.482401 -1.658685 -0.294052 endloop endfacet facet normal -0.848464 0.508555 0.146562 outer loop vertex 2.482401 -1.658685 -0.294052 vertex 2.633028 -1.407381 -0.294052 vertex 2.594929 -1.387017 -0.585272 endloop endfacet facet normal -0.511344 0.306490 -0.802864 outer loop vertex 1.678459 -0.897154 2.319032 vertex 1.582440 -1.057351 2.319032 vertex 1.385823 -0.925976 2.494409 endloop endfacet facet normal -0.511344 0.306490 -0.802864 outer loop vertex 1.385823 -0.925976 2.494409 vertex 1.469912 -0.785683 2.494409 vertex 1.678459 -0.897154 2.319032 endloop endfacet facet normal -0.441350 0.264535 0.857457 outer loop vertex 1.247207 -0.666645 -2.645764 vertex 1.175859 -0.785682 -2.645764 vertex 1.385822 -0.925975 -2.494410 endloop endfacet facet normal -0.441348 0.264536 0.857457 outer loop vertex 1.385822 -0.925975 -2.494410 vertex 1.469911 -0.785682 -2.494410 vertex 1.247207 -0.666645 -2.645764 endloop endfacet facet normal -0.367090 0.220026 -0.903788 outer loop vertex 1.247209 -0.666645 2.645763 vertex 1.175860 -0.785683 2.645763 vertex 0.954573 -0.637823 2.771639 endloop endfacet facet normal -0.367090 0.220026 -0.903788 outer loop vertex 0.954573 -0.637823 2.771639 vertex 1.012494 -0.541188 2.771639 vertex 1.247209 -0.666645 2.645763 endloop endfacet facet normal -0.856698 0.513484 -0.049013 outer loop vertex 2.645768 -1.414191 -0.000001 vertex 2.494413 -1.666712 -0.000001 vertex 2.482401 -1.658685 0.294051 endloop endfacet facet normal -0.856696 0.513488 -0.049009 outer loop vertex 2.482401 -1.658685 0.294051 vertex 2.633028 -1.407381 0.294051 vertex 2.645768 -1.414191 -0.000001 endloop endfacet facet normal -0.576396 0.345481 0.740548 outer loop vertex 1.678458 -0.897153 -2.319033 vertex 1.582439 -1.057350 -2.319033 vertex 1.763816 -1.178542 -2.121322 endloop endfacet facet normal -0.576398 0.345479 0.740547 outer loop vertex 1.763816 -1.178542 -2.121322 vertex 1.870840 -0.999983 -2.121322 vertex 1.678458 -0.897153 -2.319033 endloop endfacet facet normal -0.208648 0.125058 -0.969962 outer loop vertex 0.768029 -0.410519 2.870821 vertex 0.724093 -0.483822 2.870821 vertex 0.486639 -0.325160 2.942356 endloop endfacet facet normal -0.208648 0.125060 -0.969962 outer loop vertex 0.486639 -0.325160 2.942356 vertex 0.516167 -0.275896 2.942356 vertex 0.768029 -0.410519 2.870821 endloop endfacet facet normal -0.832082 0.498733 -0.242704 outer loop vertex 2.594930 -1.387018 0.585271 vertex 2.446483 -1.634686 0.585271 vertex 2.387004 -1.594944 0.870853 endloop endfacet facet normal -0.832083 0.498731 -0.242706 outer loop vertex 2.387004 -1.594944 0.870853 vertex 2.531842 -1.353296 0.870853 vertex 2.594930 -1.387018 0.585271 endloop endfacet facet normal -0.689228 0.413107 0.595237 outer loop vertex 2.045207 -1.093184 -1.903181 vertex 1.928208 -1.288385 -1.903181 vertex 2.074029 -1.385820 -1.666712 endloop endfacet facet normal -0.689228 0.413108 0.595237 outer loop vertex 2.074029 -1.385820 -1.666712 vertex 2.199876 -1.175857 -1.666712 vertex 2.045207 -1.093184 -1.903181 endloop endfacet facet normal -0.775550 0.464846 -0.427130 outer loop vertex 2.444370 -1.306541 1.148050 vertex 2.304536 -1.539840 1.148050 vertex 2.199876 -1.469909 1.414190 endloop endfacet facet normal -0.775550 0.464845 -0.427131 outer loop vertex 2.199876 -1.469909 1.414190 vertex 2.333359 -1.247205 1.414190 vertex 2.444370 -1.306541 1.148050 endloop endfacet facet normal -0.775550 0.464845 0.427132 outer loop vertex 2.333359 -1.247205 -1.414191 vertex 2.199876 -1.469909 -1.414191 vertex 2.304537 -1.539840 -1.148051 endloop endfacet facet normal -0.775547 0.464847 0.427135 outer loop vertex 2.304537 -1.539840 -1.148051 vertex 2.444371 -1.306542 -1.148051 vertex 2.333359 -1.247205 -1.414191 endloop endfacet facet normal -0.689229 0.413108 -0.595235 outer loop vertex 2.199876 -1.175858 1.666711 vertex 2.074029 -1.385821 1.666711 vertex 1.928209 -1.288386 1.903180 endloop endfacet facet normal -0.689229 0.413106 -0.595236 outer loop vertex 1.928209 -1.288386 1.903180 vertex 2.045208 -1.093184 1.903180 vertex 2.199876 -1.175858 1.666711 endloop endfacet facet normal -0.208650 0.125057 0.969962 outer loop vertex 0.516165 -0.275895 -2.942356 vertex 0.486638 -0.325159 -2.942356 vertex 0.724091 -0.483821 -2.870821 endloop endfacet facet normal -0.208647 0.125060 0.969962 outer loop vertex 0.724091 -0.483821 -2.870821 vertex 0.768028 -0.410518 -2.870821 vertex 0.516165 -0.275895 -2.942356 endloop endfacet facet normal -0.832084 0.498731 0.242701 outer loop vertex 2.531842 -1.353296 -0.870855 vertex 2.387004 -1.594944 -0.870855 vertex 2.446482 -1.634686 -0.585272 endloop endfacet facet normal -0.832083 0.498732 0.242701 outer loop vertex 2.446482 -1.634686 -0.585272 vertex 2.594929 -1.387017 -0.585272 vertex 2.531842 -1.353296 -0.870855 endloop endfacet facet normal -0.576397 0.345479 -0.740548 outer loop vertex 1.870841 -0.999984 2.121321 vertex 1.763817 -1.178543 2.121321 vertex 1.582440 -1.057351 2.319032 endloop endfacet facet normal -0.576397 0.345481 -0.740547 outer loop vertex 1.582440 -1.057351 2.319032 vertex 1.678459 -0.897154 2.319032 vertex 1.870841 -0.999984 2.121321 endloop endfacet facet normal -0.270881 0.200898 0.941416 outer loop vertex 0.724091 -0.483821 -2.870821 vertex 0.673182 -0.552464 -2.870821 vertex 0.887458 -0.728315 -2.771639 endloop endfacet facet normal -0.270879 0.200899 0.941416 outer loop vertex 0.887458 -0.728315 -2.771639 vertex 0.954572 -0.637823 -2.771639 vertex 0.724091 -0.483821 -2.870821 endloop endfacet facet normal -0.794535 0.589266 0.146558 outer loop vertex 2.446482 -1.634686 -0.585272 vertex 2.274475 -1.866611 -0.585272 vertex 2.307868 -1.894016 -0.294052 endloop endfacet facet normal -0.794535 0.589266 0.146558 outer loop vertex 2.307868 -1.894016 -0.294052 vertex 2.482401 -1.658685 -0.294052 vertex 2.446482 -1.634686 -0.585272 endloop endfacet facet normal -0.478842 0.355131 -0.802865 outer loop vertex 1.582440 -1.057351 2.319032 vertex 1.471182 -1.207366 2.319032 vertex 1.288389 -1.057351 2.494409 endloop endfacet facet normal -0.478842 0.355132 -0.802864 outer loop vertex 1.288389 -1.057351 2.494409 vertex 1.385823 -0.925976 2.494409 vertex 1.582440 -1.057351 2.319032 endloop endfacet facet normal -0.413296 0.306519 0.857457 outer loop vertex 1.175859 -0.785682 -2.645764 vertex 1.093187 -0.897153 -2.645764 vertex 1.288388 -1.057351 -2.494410 endloop endfacet facet normal -0.413297 0.306519 0.857457 outer loop vertex 1.288388 -1.057351 -2.494410 vertex 1.385822 -0.925975 -2.494410 vertex 1.175859 -0.785682 -2.645764 endloop endfacet facet normal -0.343757 0.254946 -0.903788 outer loop vertex 1.175860 -0.785683 2.645763 vertex 1.093188 -0.897154 2.645763 vertex 0.887459 -0.728316 2.771639 endloop endfacet facet normal -0.343757 0.254947 -0.903788 outer loop vertex 0.887459 -0.728316 2.771639 vertex 0.954573 -0.637823 2.771639 vertex 1.175860 -0.785683 2.645763 endloop endfacet facet normal -0.802243 0.594982 -0.049013 outer loop vertex 2.494413 -1.666712 -0.000001 vertex 2.319036 -1.903181 -0.000001 vertex 2.307868 -1.894016 0.294051 endloop endfacet facet normal -0.802243 0.594982 -0.049013 outer loop vertex 2.307868 -1.894016 0.294051 vertex 2.482401 -1.658685 0.294051 vertex 2.494413 -1.666712 -0.000001 endloop endfacet facet normal -0.539761 0.400311 0.740546 outer loop vertex 1.582439 -1.057350 -2.319033 vertex 1.471181 -1.207365 -2.319033 vertex 1.639805 -1.345751 -2.121322 endloop endfacet facet normal -0.539758 0.400313 0.740548 outer loop vertex 1.639805 -1.345751 -2.121322 vertex 1.763816 -1.178542 -2.121322 vertex 1.582439 -1.057350 -2.319033 endloop endfacet facet normal -0.195385 0.144910 -0.969962 outer loop vertex 0.724093 -0.483822 2.870821 vertex 0.673183 -0.552465 2.870821 vertex 0.452425 -0.371293 2.942356 endloop endfacet facet normal -0.195386 0.144906 -0.969962 outer loop vertex 0.452425 -0.371293 2.942356 vertex 0.486639 -0.325160 2.942356 vertex 0.724093 -0.483822 2.870821 endloop endfacet facet normal -0.779192 0.577887 -0.242705 outer loop vertex 2.446483 -1.634686 0.585271 vertex 2.274475 -1.866612 0.585271 vertex 2.219178 -1.821231 0.870853 endloop endfacet facet normal -0.779192 0.577888 -0.242704 outer loop vertex 2.219178 -1.821231 0.870853 vertex 2.387004 -1.594944 0.870853 vertex 2.446483 -1.634686 0.585271 endloop endfacet facet normal -0.645416 0.478675 0.595238 outer loop vertex 1.928208 -1.288385 -1.903181 vertex 1.792639 -1.471178 -1.903181 vertex 1.928208 -1.582437 -1.666712 endloop endfacet facet normal -0.645418 0.478674 0.595237 outer loop vertex 1.928208 -1.582437 -1.666712 vertex 2.074029 -1.385820 -1.666712 vertex 1.928208 -1.288385 -1.903181 endloop endfacet facet normal -0.726252 0.538627 -0.427129 outer loop vertex 2.304536 -1.539840 1.148050 vertex 2.142508 -1.758309 1.148050 vertex 2.045207 -1.678456 1.414190 endloop endfacet facet normal -0.726252 0.538626 -0.427129 outer loop vertex 2.045207 -1.678456 1.414190 vertex 2.199876 -1.469909 1.414190 vertex 2.304536 -1.539840 1.148050 endloop endfacet facet normal -0.726252 0.538625 0.427131 outer loop vertex 2.199876 -1.469909 -1.414191 vertex 2.045207 -1.678456 -1.414191 vertex 2.142509 -1.758309 -1.148051 endloop endfacet facet normal -0.726251 0.538626 0.427132 outer loop vertex 2.142509 -1.758309 -1.148051 vertex 2.304537 -1.539840 -1.148051 vertex 2.199876 -1.469909 -1.414191 endloop endfacet facet normal -0.645418 0.478674 -0.595236 outer loop vertex 2.074029 -1.385821 1.666711 vertex 1.928208 -1.582438 1.666711 vertex 1.792640 -1.471179 1.903180 endloop endfacet facet normal -0.645418 0.478676 -0.595235 outer loop vertex 1.792640 -1.471179 1.903180 vertex 1.928209 -1.288386 1.903180 vertex 2.074029 -1.385821 1.666711 endloop endfacet facet normal -0.195385 0.144909 0.969962 outer loop vertex 0.486638 -0.325159 -2.942356 vertex 0.452423 -0.371292 -2.942356 vertex 0.673182 -0.552464 -2.870821 endloop endfacet facet normal -0.195386 0.144908 0.969962 outer loop vertex 0.673182 -0.552464 -2.870821 vertex 0.724091 -0.483821 -2.870821 vertex 0.486638 -0.325159 -2.942356 endloop endfacet facet normal -0.779192 0.577889 0.242702 outer loop vertex 2.387004 -1.594944 -0.870855 vertex 2.219178 -1.821231 -0.870855 vertex 2.274475 -1.866611 -0.585272 endloop endfacet facet normal -0.779193 0.577888 0.242701 outer loop vertex 2.274475 -1.866611 -0.585272 vertex 2.446482 -1.634686 -0.585272 vertex 2.387004 -1.594944 -0.870855 endloop endfacet facet normal -0.539759 0.400314 -0.740546 outer loop vertex 1.763817 -1.178543 2.121321 vertex 1.639806 -1.345752 2.121321 vertex 1.471182 -1.207366 2.319032 endloop endfacet facet normal -0.539760 0.400311 -0.740548 outer loop vertex 1.471182 -1.207366 2.319032 vertex 1.582440 -1.057351 2.319032 vertex 1.763817 -1.178543 2.121321 endloop endfacet facet normal -0.343753 0.254947 0.903790 outer loop vertex 0.954572 -0.637823 -2.771639 vertex 0.887458 -0.728315 -2.771639 vertex 1.093187 -0.897153 -2.645764 endloop endfacet facet normal -0.343755 0.254945 0.903789 outer loop vertex 1.093187 -0.897153 -2.645764 vertex 1.175859 -0.785682 -2.645764 vertex 0.954572 -0.637823 -2.771639 endloop endfacet facet normal -0.802243 0.594982 0.049013 outer loop vertex 2.482401 -1.658685 -0.294052 vertex 2.307868 -1.894016 -0.294052 vertex 2.319036 -1.903181 -0.000001 endloop endfacet facet normal -0.802243 0.594982 0.049014 outer loop vertex 2.319036 -1.903181 -0.000001 vertex 2.494413 -1.666712 -0.000001 vertex 2.482401 -1.658685 -0.294052 endloop endfacet facet normal -0.413296 0.306520 -0.857457 outer loop vertex 1.385823 -0.925976 2.494409 vertex 1.288389 -1.057351 2.494409 vertex 1.093188 -0.897154 2.645763 endloop endfacet facet normal -0.413296 0.306519 -0.857457 outer loop vertex 1.093188 -0.897154 2.645763 vertex 1.175860 -0.785683 2.645763 vertex 1.385823 -0.925976 2.494409 endloop endfacet facet normal -0.478844 0.355131 0.802864 outer loop vertex 1.385822 -0.925975 -2.494410 vertex 1.288388 -1.057351 -2.494410 vertex 1.471181 -1.207365 -2.319033 endloop endfacet facet normal -0.478843 0.355132 0.802864 outer loop vertex 1.471181 -1.207365 -2.319033 vertex 1.582439 -1.057350 -2.319033 vertex 1.385822 -0.925975 -2.494410 endloop endfacet facet normal -0.270881 0.200898 -0.941416 outer loop vertex 0.954573 -0.637823 2.771639 vertex 0.887459 -0.728316 2.771639 vertex 0.673183 -0.552465 2.870821 endloop endfacet facet normal -0.270880 0.200901 -0.941415 outer loop vertex 0.673183 -0.552465 2.870821 vertex 0.724093 -0.483822 2.870821 vertex 0.954573 -0.637823 2.771639 endloop endfacet facet normal -0.794536 0.589266 -0.146556 outer loop vertex 2.482401 -1.658685 0.294051 vertex 2.307868 -1.894016 0.294051 vertex 2.274475 -1.866612 0.585271 endloop endfacet facet normal -0.794535 0.589267 -0.146556 outer loop vertex 2.274475 -1.866612 0.585271 vertex 2.446483 -1.634686 0.585271 vertex 2.482401 -1.658685 0.294051 endloop endfacet facet normal -0.595459 0.441624 0.671116 outer loop vertex 1.763816 -1.178542 -2.121322 vertex 1.639805 -1.345751 -2.121322 vertex 1.792639 -1.471178 -1.903181 endloop endfacet facet normal -0.595459 0.441624 0.671116 outer loop vertex 1.792639 -1.471178 -1.903181 vertex 1.928208 -1.288385 -1.903181 vertex 1.763816 -1.178542 -2.121322 endloop endfacet facet normal -0.117994 0.087509 -0.989151 outer loop vertex 0.486639 -0.325160 2.942356 vertex 0.452425 -0.371293 2.942356 vertex 0.227309 -0.186546 2.985554 endloop endfacet facet normal -0.117993 0.087510 -0.989151 outer loop vertex 0.227309 -0.186546 2.985554 vertex 0.244499 -0.163368 2.985554 vertex 0.486639 -0.325160 2.942356 endloop endfacet facet normal -0.756357 0.560953 -0.336534 outer loop vertex 2.387004 -1.594944 0.870853 vertex 2.219178 -1.821231 0.870853 vertex 2.142508 -1.758309 1.148050 endloop endfacet facet normal -0.756357 0.560954 -0.336533 outer loop vertex 2.142508 -1.758309 1.148050 vertex 2.304536 -1.539840 1.148050 vertex 2.387004 -1.594944 0.870853 endloop endfacet facet normal -0.689154 0.511111 0.513647 outer loop vertex 2.074029 -1.385820 -1.666712 vertex 1.928208 -1.582437 -1.666712 vertex 2.045207 -1.678456 -1.414191 endloop endfacet facet normal -0.689153 0.511111 0.513647 outer loop vertex 2.045207 -1.678456 -1.414191 vertex 2.199876 -1.469909 -1.414191 vertex 2.074029 -1.385820 -1.666712 endloop endfacet facet normal -0.689154 0.511112 -0.513646 outer loop vertex 2.199876 -1.469909 1.414190 vertex 2.045207 -1.678456 1.414190 vertex 1.928208 -1.582438 1.666711 endloop endfacet facet normal -0.689154 0.511111 -0.513646 outer loop vertex 1.928208 -1.582438 1.666711 vertex 2.074029 -1.385821 1.666711 vertex 2.199876 -1.469909 1.414190 endloop endfacet facet normal -0.117993 0.087509 0.989151 outer loop vertex 0.244497 -0.163366 -2.985554 vertex 0.227307 -0.186544 -2.985554 vertex 0.452423 -0.371292 -2.942356 endloop endfacet facet normal -0.117992 0.087510 0.989151 outer loop vertex 0.452423 -0.371292 -2.942356 vertex 0.486638 -0.325159 -2.942356 vertex 0.244497 -0.163366 -2.985554 endloop endfacet facet normal -0.756357 0.560954 0.336533 outer loop vertex 2.304537 -1.539840 -1.148051 vertex 2.142509 -1.758309 -1.148051 vertex 2.219178 -1.821231 -0.870855 endloop endfacet facet normal -0.756358 0.560954 0.336532 outer loop vertex 2.219178 -1.821231 -0.870855 vertex 2.387004 -1.594944 -0.870855 vertex 2.304537 -1.539840 -1.148051 endloop endfacet facet normal -0.595459 0.441624 -0.671116 outer loop vertex 1.928209 -1.288386 1.903180 vertex 1.792640 -1.471179 1.903180 vertex 1.639806 -1.345752 2.121321 endloop endfacet facet normal -0.595459 0.441624 -0.671116 outer loop vertex 1.639806 -1.345752 2.121321 vertex 1.763817 -1.178543 2.121321 vertex 1.928209 -1.288386 1.903180 endloop endfacet facet normal -0.180242 0.163360 0.969962 outer loop vertex 0.452423 -0.371292 -2.942356 vertex 0.413852 -0.413849 -2.942356 vertex 0.615790 -0.615787 -2.870821 endloop endfacet facet normal -0.180242 0.163360 0.969962 outer loop vertex 0.615790 -0.615787 -2.870821 vertex 0.673182 -0.552464 -2.870821 vertex 0.452423 -0.371292 -2.942356 endloop endfacet facet normal -0.718796 0.651481 0.242704 outer loop vertex 2.219178 -1.821231 -0.870855 vertex 2.029980 -2.029978 -0.870855 vertex 2.080563 -2.080560 -0.585272 endloop endfacet facet normal -0.718797 0.651480 0.242702 outer loop vertex 2.080563 -2.080560 -0.585272 vertex 2.274475 -1.866611 -0.585272 vertex 2.219178 -1.821231 -0.870855 endloop endfacet facet normal -0.497922 0.451293 -0.740546 outer loop vertex 1.639806 -1.345752 2.121321 vertex 1.500003 -1.500000 2.121321 vertex 1.345755 -1.345753 2.319032 endloop endfacet facet normal -0.497922 0.451292 -0.740546 outer loop vertex 1.345755 -1.345753 2.319032 vertex 1.471182 -1.207366 2.319032 vertex 1.639806 -1.345752 2.121321 endloop endfacet facet normal -0.317110 0.287412 0.903790 outer loop vertex 0.887458 -0.728315 -2.771639 vertex 0.811797 -0.811794 -2.771639 vertex 0.999986 -0.999984 -2.645764 endloop endfacet facet normal -0.317109 0.287412 0.903790 outer loop vertex 0.999986 -0.999984 -2.645764 vertex 1.093187 -0.897153 -2.645764 vertex 0.887458 -0.728315 -2.771639 endloop endfacet facet normal -0.740060 0.670752 0.049012 outer loop vertex 2.307868 -1.894016 -0.294052 vertex 2.111109 -2.111106 -0.294052 vertex 2.121324 -2.121322 -0.000001 endloop endfacet facet normal -0.740060 0.670753 0.049013 outer loop vertex 2.121324 -2.121322 -0.000001 vertex 2.319036 -1.903181 -0.000001 vertex 2.307868 -1.894016 -0.294052 endloop endfacet facet normal -0.381261 0.345555 -0.857457 outer loop vertex 1.288389 -1.057351 2.494409 vertex 1.178546 -1.178544 2.494409 vertex 0.999987 -0.999985 2.645763 endloop endfacet facet normal -0.381260 0.345556 -0.857457 outer loop vertex 0.999987 -0.999985 2.645763 vertex 1.093188 -0.897154 2.645763 vertex 1.288389 -1.057351 2.494409 endloop endfacet facet normal -0.441725 0.400360 0.802865 outer loop vertex 1.288388 -1.057351 -2.494410 vertex 1.178545 -1.178543 -2.494410 vertex 1.345754 -1.345752 -2.319033 endloop endfacet facet normal -0.441727 0.400359 0.802864 outer loop vertex 1.345754 -1.345752 -2.319033 vertex 1.471181 -1.207365 -2.319033 vertex 1.288388 -1.057351 -2.494410 endloop endfacet facet normal -0.249885 0.226483 -0.941415 outer loop vertex 0.887459 -0.728316 2.771639 vertex 0.811798 -0.811795 2.771639 vertex 0.615791 -0.615788 2.870821 endloop endfacet facet normal -0.249886 0.226481 -0.941416 outer loop vertex 0.615791 -0.615788 2.870821 vertex 0.673183 -0.552465 2.870821 vertex 0.887459 -0.728316 2.771639 endloop endfacet facet normal -0.732950 0.664308 -0.146556 outer loop vertex 2.307868 -1.894016 0.294051 vertex 2.111109 -2.111106 0.294051 vertex 2.080563 -2.080561 0.585271 endloop endfacet facet normal -0.732951 0.664308 -0.146556 outer loop vertex 2.080563 -2.080561 0.585271 vertex 2.274475 -1.866612 0.585271 vertex 2.307868 -1.894016 0.294051 endloop endfacet facet normal -0.549305 0.497861 0.671117 outer loop vertex 1.639805 -1.345751 -2.121322 vertex 1.500002 -1.500000 -2.121322 vertex 1.639807 -1.639803 -1.903181 endloop endfacet facet normal -0.549307 0.497860 0.671116 outer loop vertex 1.639807 -1.639803 -1.903181 vertex 1.792639 -1.471178 -1.903181 vertex 1.639805 -1.345751 -2.121322 endloop endfacet facet normal -0.108848 0.098653 -0.989151 outer loop vertex 0.452425 -0.371293 2.942356 vertex 0.413853 -0.413851 2.942356 vertex 0.207930 -0.207927 2.985554 endloop endfacet facet normal -0.108846 0.098655 -0.989151 outer loop vertex 0.207930 -0.207927 2.985554 vertex 0.227309 -0.186546 2.985554 vertex 0.452425 -0.371293 2.942356 endloop endfacet facet normal -0.697731 0.632389 -0.336533 outer loop vertex 2.219178 -1.821231 0.870853 vertex 2.029980 -2.029978 0.870853 vertex 1.959847 -1.959844 1.148050 endloop endfacet facet normal -0.697732 0.632389 -0.336534 outer loop vertex 1.959847 -1.959844 1.148050 vertex 2.142508 -1.758309 1.148050 vertex 2.219178 -1.821231 0.870853 endloop endfacet facet normal -0.635738 0.576198 0.513646 outer loop vertex 1.928208 -1.582437 -1.666712 vertex 1.763817 -1.763815 -1.666712 vertex 1.870841 -1.870839 -1.414191 endloop endfacet facet normal -0.635737 0.576199 0.513647 outer loop vertex 1.870841 -1.870839 -1.414191 vertex 2.045207 -1.678456 -1.414191 vertex 1.928208 -1.582437 -1.666712 endloop endfacet facet normal -0.635737 0.576199 -0.513646 outer loop vertex 2.045207 -1.678456 1.414190 vertex 1.870841 -1.870839 1.414190 vertex 1.763817 -1.763815 1.666711 endloop endfacet facet normal -0.635737 0.576200 -0.513645 outer loop vertex 1.763817 -1.763815 1.666711 vertex 1.928208 -1.582438 1.666711 vertex 2.045207 -1.678456 1.414190 endloop endfacet facet normal -0.108848 0.098652 0.989151 outer loop vertex 0.227307 -0.186544 -2.985554 vertex 0.207928 -0.207926 -2.985554 vertex 0.413852 -0.413849 -2.942356 endloop endfacet facet normal -0.108848 0.098653 0.989151 outer loop vertex 0.413852 -0.413849 -2.942356 vertex 0.452423 -0.371292 -2.942356 vertex 0.227307 -0.186544 -2.985554 endloop endfacet facet normal -0.697735 0.632388 0.336530 outer loop vertex 2.142509 -1.758309 -1.148051 vertex 1.959848 -1.959845 -1.148051 vertex 2.029980 -2.029978 -0.870855 endloop endfacet facet normal -0.697731 0.632389 0.336533 outer loop vertex 2.029980 -2.029978 -0.870855 vertex 2.219178 -1.821231 -0.870855 vertex 2.142509 -1.758309 -1.148051 endloop endfacet facet normal -0.549305 0.497862 -0.671117 outer loop vertex 1.792640 -1.471179 1.903180 vertex 1.639807 -1.639804 1.903180 vertex 1.500003 -1.500000 2.121321 endloop endfacet facet normal -0.549304 0.497863 -0.671116 outer loop vertex 1.500003 -1.500000 2.121321 vertex 1.639806 -1.345752 2.121321 vertex 1.792640 -1.471179 1.903180 endloop endfacet facet normal -0.249886 0.226481 0.941415 outer loop vertex 0.673182 -0.552464 -2.870821 vertex 0.615790 -0.615787 -2.870821 vertex 0.811797 -0.811794 -2.771639 endloop endfacet facet normal -0.249885 0.226482 0.941416 outer loop vertex 0.811797 -0.811794 -2.771639 vertex 0.887458 -0.728315 -2.771639 vertex 0.673182 -0.552464 -2.870821 endloop endfacet facet normal -0.732950 0.664308 0.146558 outer loop vertex 2.274475 -1.866611 -0.585272 vertex 2.080563 -2.080560 -0.585272 vertex 2.111109 -2.111106 -0.294052 endloop endfacet facet normal -0.732950 0.664308 0.146558 outer loop vertex 2.111109 -2.111106 -0.294052 vertex 2.307868 -1.894016 -0.294052 vertex 2.274475 -1.866611 -0.585272 endloop endfacet facet normal -0.441726 0.400358 -0.802864 outer loop vertex 1.471182 -1.207366 2.319032 vertex 1.345755 -1.345753 2.319032 vertex 1.178546 -1.178544 2.494409 endloop endfacet facet normal -0.441726 0.400357 -0.802865 outer loop vertex 1.178546 -1.178544 2.494409 vertex 1.288389 -1.057351 2.494409 vertex 1.471182 -1.207366 2.319032 endloop endfacet facet normal -0.381260 0.345556 0.857457 outer loop vertex 1.093187 -0.897153 -2.645764 vertex 0.999986 -0.999984 -2.645764 vertex 1.178545 -1.178543 -2.494410 endloop endfacet facet normal -0.381259 0.345556 0.857457 outer loop vertex 1.178545 -1.178543 -2.494410 vertex 1.288388 -1.057351 -2.494410 vertex 1.093187 -0.897153 -2.645764 endloop endfacet facet normal -0.317111 0.287414 -0.903788 outer loop vertex 1.093188 -0.897154 2.645763 vertex 0.999987 -0.999985 2.645763 vertex 0.811798 -0.811795 2.771639 endloop endfacet facet normal -0.317112 0.287414 -0.903788 outer loop vertex 0.811798 -0.811795 2.771639 vertex 0.887459 -0.728316 2.771639 vertex 1.093188 -0.897154 2.645763 endloop endfacet facet normal -0.740060 0.670753 -0.049012 outer loop vertex 2.319036 -1.903181 -0.000001 vertex 2.121324 -2.121322 -0.000001 vertex 2.111109 -2.111106 0.294051 endloop endfacet facet normal -0.740060 0.670752 -0.049013 outer loop vertex 2.111109 -2.111106 0.294051 vertex 2.307868 -1.894016 0.294051 vertex 2.319036 -1.903181 -0.000001 endloop endfacet facet normal -0.497922 0.451292 0.740547 outer loop vertex 1.471181 -1.207365 -2.319033 vertex 1.345754 -1.345752 -2.319033 vertex 1.500002 -1.500000 -2.121322 endloop endfacet facet normal -0.497923 0.451291 0.740546 outer loop vertex 1.500002 -1.500000 -2.121322 vertex 1.639805 -1.345751 -2.121322 vertex 1.471181 -1.207365 -2.319033 endloop endfacet facet normal -0.180242 0.163361 -0.969962 outer loop vertex 0.673183 -0.552465 2.870821 vertex 0.615791 -0.615788 2.870821 vertex 0.413853 -0.413851 2.942356 endloop endfacet facet normal -0.180242 0.163361 -0.969962 outer loop vertex 0.413853 -0.413851 2.942356 vertex 0.452425 -0.371293 2.942356 vertex 0.673183 -0.552465 2.870821 endloop endfacet facet normal -0.718797 0.651479 -0.242707 outer loop vertex 2.274475 -1.866612 0.585271 vertex 2.080563 -2.080561 0.585271 vertex 2.029980 -2.029978 0.870853 endloop endfacet facet normal -0.718796 0.651481 -0.242705 outer loop vertex 2.029980 -2.029978 0.870853 vertex 2.219178 -1.821231 0.870853 vertex 2.274475 -1.866612 0.585271 endloop endfacet facet normal -0.595393 0.539630 0.595237 outer loop vertex 1.792639 -1.471178 -1.903181 vertex 1.639807 -1.639803 -1.903181 vertex 1.763817 -1.763815 -1.666712 endloop endfacet facet normal -0.595391 0.539630 0.595238 outer loop vertex 1.763817 -1.763815 -1.666712 vertex 1.928208 -1.582437 -1.666712 vertex 1.792639 -1.471178 -1.903181 endloop endfacet facet normal -0.669961 0.607218 -0.427128 outer loop vertex 2.142508 -1.758309 1.148050 vertex 1.959847 -1.959844 1.148050 vertex 1.870841 -1.870839 1.414190 endloop endfacet facet normal -0.669961 0.607218 -0.427129 outer loop vertex 1.870841 -1.870839 1.414190 vertex 2.045207 -1.678456 1.414190 vertex 2.142508 -1.758309 1.148050 endloop endfacet facet normal -0.669960 0.607217 0.427132 outer loop vertex 2.045207 -1.678456 -1.414191 vertex 1.870841 -1.870839 -1.414191 vertex 1.959848 -1.959845 -1.148051 endloop endfacet facet normal -0.669961 0.607216 0.427131 outer loop vertex 1.959848 -1.959845 -1.148051 vertex 2.142509 -1.758309 -1.148051 vertex 2.045207 -1.678456 -1.414191 endloop endfacet facet normal -0.595391 0.539633 -0.595236 outer loop vertex 1.928208 -1.582438 1.666711 vertex 1.763817 -1.763815 1.666711 vertex 1.639807 -1.639804 1.903180 endloop endfacet facet normal -0.595392 0.539632 -0.595236 outer loop vertex 1.639807 -1.639804 1.903180 vertex 1.792640 -1.471179 1.903180 vertex 1.928208 -1.582438 1.666711 endloop endfacet facet normal -0.098655 0.108846 0.989151 outer loop vertex 0.207928 -0.207926 -2.985554 vertex 0.186547 -0.227305 -2.985554 vertex 0.371294 -0.452421 -2.942356 endloop endfacet facet normal -0.098653 0.108848 0.989151 outer loop vertex 0.371294 -0.452421 -2.942356 vertex 0.413852 -0.413849 -2.942356 vertex 0.207928 -0.207926 -2.985554 endloop endfacet facet normal -0.632387 0.697734 0.336534 outer loop vertex 1.959848 -1.959845 -1.148051 vertex 1.758312 -2.142506 -1.148051 vertex 1.821233 -2.219176 -0.870855 endloop endfacet facet normal -0.632390 0.697732 0.336530 outer loop vertex 1.821233 -2.219176 -0.870855 vertex 2.029980 -2.029978 -0.870855 vertex 1.959848 -1.959845 -1.148051 endloop endfacet facet normal -0.497861 0.549305 -0.671117 outer loop vertex 1.639807 -1.639804 1.903180 vertex 1.471182 -1.792637 1.903180 vertex 1.345754 -1.639803 2.121321 endloop endfacet facet normal -0.497861 0.549305 -0.671117 outer loop vertex 1.345754 -1.639803 2.121321 vertex 1.500003 -1.500000 2.121321 vertex 1.639807 -1.639804 1.903180 endloop endfacet facet normal -0.226481 0.249886 0.941416 outer loop vertex 0.615790 -0.615787 -2.870821 vertex 0.552467 -0.673179 -2.870821 vertex 0.728318 -0.887455 -2.771639 endloop endfacet facet normal -0.226483 0.249885 0.941416 outer loop vertex 0.728318 -0.887455 -2.771639 vertex 0.811797 -0.811794 -2.771639 vertex 0.615790 -0.615787 -2.870821 endloop endfacet facet normal -0.664305 0.732952 0.146560 outer loop vertex 2.080563 -2.080560 -0.585272 vertex 1.866613 -2.274472 -0.585272 vertex 1.894019 -2.307865 -0.294052 endloop endfacet facet normal -0.664308 0.732950 0.146558 outer loop vertex 1.894019 -2.307865 -0.294052 vertex 2.111109 -2.111106 -0.294052 vertex 2.080563 -2.080560 -0.585272 endloop endfacet facet normal -0.400357 0.441728 -0.802864 outer loop vertex 1.345755 -1.345753 2.319032 vertex 1.207368 -1.471179 2.319032 vertex 1.057354 -1.288386 2.494409 endloop endfacet facet normal -0.400358 0.441727 -0.802864 outer loop vertex 1.057354 -1.288386 2.494409 vertex 1.178546 -1.178544 2.494409 vertex 1.345755 -1.345753 2.319032 endloop endfacet facet normal -0.345552 0.381261 0.857458 outer loop vertex 0.999986 -0.999984 -2.645764 vertex 0.897155 -1.093184 -2.645764 vertex 1.057353 -1.288386 -2.494410 endloop endfacet facet normal -0.345557 0.381260 0.857457 outer loop vertex 1.057353 -1.288386 -2.494410 vertex 1.178545 -1.178543 -2.494410 vertex 0.999986 -0.999984 -2.645764 endloop endfacet facet normal -0.287413 0.317114 -0.903788 outer loop vertex 0.999987 -0.999985 2.645763 vertex 0.897156 -1.093185 2.645763 vertex 0.728319 -0.887456 2.771639 endloop endfacet facet normal -0.287414 0.317112 -0.903788 outer loop vertex 0.728319 -0.887456 2.771639 vertex 0.811798 -0.811795 2.771639 vertex 0.999987 -0.999985 2.645763 endloop endfacet facet normal -0.670753 0.740060 -0.049013 outer loop vertex 2.121324 -2.121322 -0.000001 vertex 1.903184 -2.319033 -0.000001 vertex 1.894019 -2.307865 0.294051 endloop endfacet facet normal -0.670752 0.740061 -0.049012 outer loop vertex 1.894019 -2.307865 0.294051 vertex 2.111109 -2.111106 0.294051 vertex 2.121324 -2.121322 -0.000001 endloop endfacet facet normal -0.451288 0.497922 0.740549 outer loop vertex 1.345754 -1.345752 -2.319033 vertex 1.207367 -1.471178 -2.319033 vertex 1.345754 -1.639803 -2.121322 endloop endfacet facet normal -0.451292 0.497921 0.740547 outer loop vertex 1.345754 -1.639803 -2.121322 vertex 1.500002 -1.500000 -2.121322 vertex 1.345754 -1.345752 -2.319033 endloop endfacet facet normal -0.163362 0.180241 -0.969962 outer loop vertex 0.615791 -0.615788 2.870821 vertex 0.552468 -0.673181 2.870821 vertex 0.371296 -0.452422 2.942356 endloop endfacet facet normal -0.163360 0.180242 -0.969962 outer loop vertex 0.371296 -0.452422 2.942356 vertex 0.413853 -0.413851 2.942356 vertex 0.615791 -0.615788 2.870821 endloop endfacet facet normal -0.651479 0.718797 -0.242704 outer loop vertex 2.080563 -2.080561 0.585271 vertex 1.866614 -2.274473 0.585271 vertex 1.821233 -2.219176 0.870853 endloop endfacet facet normal -0.651481 0.718795 -0.242707 outer loop vertex 1.821233 -2.219176 0.870853 vertex 2.029980 -2.029978 0.870853 vertex 2.080563 -2.080561 0.585271 endloop endfacet facet normal -0.539633 0.595392 0.595235 outer loop vertex 1.639807 -1.639803 -1.903181 vertex 1.471182 -1.792636 -1.903181 vertex 1.582439 -1.928205 -1.666712 endloop endfacet facet normal -0.539628 0.595393 0.595238 outer loop vertex 1.582439 -1.928205 -1.666712 vertex 1.763817 -1.763815 -1.666712 vertex 1.639807 -1.639803 -1.903181 endloop endfacet facet normal -0.607217 0.669960 -0.427131 outer loop vertex 1.959847 -1.959844 1.148050 vertex 1.758311 -2.142506 1.148050 vertex 1.678458 -2.045204 1.414190 endloop endfacet facet normal -0.607216 0.669963 -0.427128 outer loop vertex 1.678458 -2.045204 1.414190 vertex 1.870841 -1.870839 1.414190 vertex 1.959847 -1.959844 1.148050 endloop endfacet facet normal -0.607214 0.669961 0.427133 outer loop vertex 1.870841 -1.870839 -1.414191 vertex 1.678458 -2.045204 -1.414191 vertex 1.758312 -2.142506 -1.148051 endloop endfacet facet normal -0.607215 0.669961 0.427132 outer loop vertex 1.758312 -2.142506 -1.148051 vertex 1.959848 -1.959845 -1.148051 vertex 1.870841 -1.870839 -1.414191 endloop endfacet facet normal -0.539631 0.595393 -0.595235 outer loop vertex 1.763817 -1.763815 1.666711 vertex 1.582439 -1.928206 1.666711 vertex 1.471182 -1.792637 1.903180 endloop endfacet facet normal -0.539632 0.595392 -0.595236 outer loop vertex 1.471182 -1.792637 1.903180 vertex 1.639807 -1.639804 1.903180 vertex 1.763817 -1.763815 1.666711 endloop endfacet facet normal -0.163360 0.180242 0.969962 outer loop vertex 0.413852 -0.413849 -2.942356 vertex 0.371294 -0.452421 -2.942356 vertex 0.552467 -0.673179 -2.870821 endloop endfacet facet normal -0.163360 0.180242 0.969962 outer loop vertex 0.552467 -0.673179 -2.870821 vertex 0.615790 -0.615787 -2.870821 vertex 0.413852 -0.413849 -2.942356 endloop endfacet facet normal -0.651482 0.718796 0.242699 outer loop vertex 2.029980 -2.029978 -0.870855 vertex 1.821233 -2.219176 -0.870855 vertex 1.866613 -2.274472 -0.585272 endloop endfacet facet normal -0.651478 0.718799 0.242704 outer loop vertex 1.866613 -2.274472 -0.585272 vertex 2.080563 -2.080560 -0.585272 vertex 2.029980 -2.029978 -0.870855 endloop endfacet facet normal -0.451291 0.497923 -0.740546 outer loop vertex 1.500003 -1.500000 2.121321 vertex 1.345754 -1.639803 2.121321 vertex 1.207368 -1.471179 2.319032 endloop endfacet facet normal -0.451290 0.497925 -0.740546 outer loop vertex 1.207368 -1.471179 2.319032 vertex 1.345755 -1.345753 2.319032 vertex 1.500003 -1.500000 2.121321 endloop endfacet facet normal -0.287412 0.317110 0.903790 outer loop vertex 0.811797 -0.811794 -2.771639 vertex 0.728318 -0.887455 -2.771639 vertex 0.897155 -1.093184 -2.645764 endloop endfacet facet normal -0.287410 0.317111 0.903790 outer loop vertex 0.897155 -1.093184 -2.645764 vertex 0.999986 -0.999984 -2.645764 vertex 0.811797 -0.811794 -2.771639 endloop endfacet facet normal -0.670752 0.740061 0.049014 outer loop vertex 2.111109 -2.111106 -0.294052 vertex 1.894019 -2.307865 -0.294052 vertex 1.903184 -2.319033 -0.000001 endloop endfacet facet normal -0.670753 0.740060 0.049013 outer loop vertex 1.903184 -2.319033 -0.000001 vertex 2.121324 -2.121322 -0.000001 vertex 2.111109 -2.111106 -0.294052 endloop endfacet facet normal -0.345554 0.381260 -0.857457 outer loop vertex 1.178546 -1.178544 2.494409 vertex 1.057354 -1.288386 2.494409 vertex 0.897156 -1.093185 2.645763 endloop endfacet facet normal -0.345553 0.381262 -0.857457 outer loop vertex 0.897156 -1.093185 2.645763 vertex 0.999987 -0.999985 2.645763 vertex 1.178546 -1.178544 2.494409 endloop endfacet facet normal -0.400361 0.441726 0.802863 outer loop vertex 1.178545 -1.178543 -2.494410 vertex 1.057353 -1.288386 -2.494410 vertex 1.207367 -1.471178 -2.319033 endloop endfacet facet normal -0.400356 0.441728 0.802864 outer loop vertex 1.207367 -1.471178 -2.319033 vertex 1.345754 -1.345752 -2.319033 vertex 1.178545 -1.178543 -2.494410 endloop endfacet facet normal -0.226483 0.249885 -0.941415 outer loop vertex 0.811798 -0.811795 2.771639 vertex 0.728319 -0.887456 2.771639 vertex 0.552468 -0.673181 2.870821 endloop endfacet facet normal -0.226483 0.249884 -0.941415 outer loop vertex 0.552468 -0.673181 2.870821 vertex 0.615791 -0.615788 2.870821 vertex 0.811798 -0.811795 2.771639 endloop endfacet facet normal -0.664308 0.732950 -0.146556 outer loop vertex 2.111109 -2.111106 0.294051 vertex 1.894019 -2.307865 0.294051 vertex 1.866614 -2.274473 0.585271 endloop endfacet facet normal -0.664308 0.732951 -0.146555 outer loop vertex 1.866614 -2.274473 0.585271 vertex 2.080563 -2.080561 0.585271 vertex 2.111109 -2.111106 0.294051 endloop endfacet facet normal -0.497864 0.549304 0.671116 outer loop vertex 1.500002 -1.500000 -2.121322 vertex 1.345754 -1.639803 -2.121322 vertex 1.471182 -1.792636 -1.903181 endloop endfacet facet normal -0.497862 0.549305 0.671117 outer loop vertex 1.471182 -1.792636 -1.903181 vertex 1.639807 -1.639803 -1.903181 vertex 1.500002 -1.500000 -2.121322 endloop endfacet facet normal -0.098653 0.108848 -0.989151 outer loop vertex 0.413853 -0.413851 2.942356 vertex 0.371296 -0.452422 2.942356 vertex 0.186548 -0.227307 2.985554 endloop endfacet facet normal -0.098655 0.108846 -0.989151 outer loop vertex 0.186548 -0.227307 2.985554 vertex 0.207930 -0.207927 2.985554 vertex 0.413853 -0.413851 2.942356 endloop endfacet facet normal -0.632389 0.697731 -0.336535 outer loop vertex 2.029980 -2.029978 0.870853 vertex 1.821233 -2.219176 0.870853 vertex 1.758311 -2.142506 1.148050 endloop endfacet facet normal -0.632389 0.697732 -0.336533 outer loop vertex 1.758311 -2.142506 1.148050 vertex 1.959847 -1.959844 1.148050 vertex 2.029980 -2.029978 0.870853 endloop endfacet facet normal -0.576196 0.635740 0.513647 outer loop vertex 1.763817 -1.763815 -1.666712 vertex 1.582439 -1.928205 -1.666712 vertex 1.678458 -2.045204 -1.414191 endloop endfacet facet normal -0.576198 0.635739 0.513646 outer loop vertex 1.678458 -2.045204 -1.414191 vertex 1.870841 -1.870839 -1.414191 vertex 1.763817 -1.763815 -1.666712 endloop endfacet facet normal -0.576198 0.635740 -0.513645 outer loop vertex 1.870841 -1.870839 1.414190 vertex 1.678458 -2.045204 1.414190 vertex 1.582439 -1.928206 1.666711 endloop endfacet facet normal -0.576198 0.635739 -0.513646 outer loop vertex 1.582439 -1.928206 1.666711 vertex 1.763817 -1.763815 1.666711 vertex 1.870841 -1.870839 1.414190 endloop endfacet facet normal -0.538625 0.726251 0.427133 outer loop vertex 1.678458 -2.045204 -1.414191 vertex 1.469911 -2.199873 -1.414191 vertex 1.539843 -2.304534 -1.148051 endloop endfacet facet normal -0.538626 0.726251 0.427133 outer loop vertex 1.539843 -2.304534 -1.148051 vertex 1.758312 -2.142506 -1.148051 vertex 1.678458 -2.045204 -1.414191 endloop endfacet facet normal -0.478675 0.645418 -0.595236 outer loop vertex 1.582439 -1.928206 1.666711 vertex 1.385822 -2.074027 1.666711 vertex 1.288389 -1.928205 1.903180 endloop endfacet facet normal -0.478674 0.645420 -0.595235 outer loop vertex 1.288389 -1.928205 1.903180 vertex 1.471182 -1.792637 1.903180 vertex 1.582439 -1.928206 1.666711 endloop endfacet facet normal -0.144908 0.195385 0.969962 outer loop vertex 0.371294 -0.452421 -2.942356 vertex 0.325162 -0.486635 -2.942356 vertex 0.483823 -0.724089 -2.870821 endloop endfacet facet normal -0.144908 0.195385 0.969962 outer loop vertex 0.483823 -0.724089 -2.870821 vertex 0.552467 -0.673179 -2.870821 vertex 0.371294 -0.452421 -2.942356 endloop endfacet facet normal -0.577889 0.779192 0.242701 outer loop vertex 1.821233 -2.219176 -0.870855 vertex 1.594946 -2.387002 -0.870855 vertex 1.634688 -2.446480 -0.585272 endloop endfacet facet normal -0.577890 0.779192 0.242699 outer loop vertex 1.634688 -2.446480 -0.585272 vertex 1.866613 -2.274472 -0.585272 vertex 1.821233 -2.219176 -0.870855 endloop endfacet facet normal -0.400314 0.539759 -0.740546 outer loop vertex 1.345754 -1.639803 2.121321 vertex 1.178545 -1.763814 2.121321 vertex 1.057353 -1.582438 2.319032 endloop endfacet facet normal -0.400314 0.539759 -0.740546 outer loop vertex 1.057353 -1.582438 2.319032 vertex 1.207368 -1.471179 2.319032 vertex 1.345754 -1.639803 2.121321 endloop endfacet facet normal -0.254944 0.343754 0.903790 outer loop vertex 0.728318 -0.887455 -2.771639 vertex 0.637825 -0.954569 -2.771639 vertex 0.785685 -1.175857 -2.645764 endloop endfacet facet normal -0.254948 0.343753 0.903790 outer loop vertex 0.785685 -1.175857 -2.645764 vertex 0.897155 -1.093184 -2.645764 vertex 0.728318 -0.887455 -2.771639 endloop endfacet facet normal -0.594987 0.802240 0.049009 outer loop vertex 1.894019 -2.307865 -0.294052 vertex 1.658689 -2.482399 -0.294052 vertex 1.666714 -2.494411 -0.000001 endloop endfacet facet normal -0.594983 0.802242 0.049014 outer loop vertex 1.666714 -2.494411 -0.000001 vertex 1.903184 -2.319033 -0.000001 vertex 1.894019 -2.307865 -0.294052 endloop endfacet facet normal -0.306520 0.413295 -0.857457 outer loop vertex 1.057354 -1.288386 2.494409 vertex 0.925978 -1.385821 2.494409 vertex 0.785685 -1.175858 2.645763 endloop endfacet facet normal -0.306521 0.413294 -0.857457 outer loop vertex 0.785685 -1.175858 2.645763 vertex 0.897156 -1.093185 2.645763 vertex 1.057354 -1.288386 2.494409 endloop endfacet facet normal -0.355130 0.478843 0.802865 outer loop vertex 1.057353 -1.288386 -2.494410 vertex 0.925977 -1.385820 -2.494410 vertex 1.057353 -1.582437 -2.319033 endloop endfacet facet normal -0.355136 0.478841 0.802863 outer loop vertex 1.057353 -1.582437 -2.319033 vertex 1.207367 -1.471178 -2.319033 vertex 1.057353 -1.288386 -2.494410 endloop endfacet facet normal -0.200898 0.270881 -0.941416 outer loop vertex 0.728319 -0.887456 2.771639 vertex 0.637826 -0.954570 2.771639 vertex 0.483824 -0.724090 2.870821 endloop endfacet facet normal -0.200897 0.270883 -0.941415 outer loop vertex 0.483824 -0.724090 2.870821 vertex 0.552468 -0.673181 2.870821 vertex 0.728319 -0.887456 2.771639 endloop endfacet facet normal -0.589270 0.794532 -0.146562 outer loop vertex 1.894019 -2.307865 0.294051 vertex 1.658689 -2.482399 0.294051 vertex 1.634688 -2.446480 0.585271 endloop endfacet facet normal -0.589265 0.794536 -0.146556 outer loop vertex 1.634688 -2.446480 0.585271 vertex 1.866614 -2.274473 0.585271 vertex 1.894019 -2.307865 0.294051 endloop endfacet facet normal -0.441621 0.595461 0.671116 outer loop vertex 1.345754 -1.639803 -2.121322 vertex 1.178545 -1.763813 -2.121322 vertex 1.288388 -1.928205 -1.903181 endloop endfacet facet normal -0.441623 0.595460 0.671116 outer loop vertex 1.288388 -1.928205 -1.903181 vertex 1.471182 -1.792636 -1.903181 vertex 1.345754 -1.639803 -2.121322 endloop endfacet facet normal -0.087510 0.117992 -0.989151 outer loop vertex 0.371296 -0.452422 2.942356 vertex 0.325163 -0.486637 2.942356 vertex 0.163370 -0.244497 2.985554 endloop endfacet facet normal -0.087510 0.117993 -0.989151 outer loop vertex 0.163370 -0.244497 2.985554 vertex 0.186548 -0.227307 2.985554 vertex 0.371296 -0.452422 2.942356 endloop endfacet facet normal -0.560953 0.756357 -0.336536 outer loop vertex 1.821233 -2.219176 0.870853 vertex 1.594946 -2.387002 0.870853 vertex 1.539842 -2.304533 1.148050 endloop endfacet facet normal -0.560952 0.756358 -0.336534 outer loop vertex 1.539842 -2.304533 1.148050 vertex 1.758311 -2.142506 1.148050 vertex 1.821233 -2.219176 0.870853 endloop endfacet facet normal -0.511111 0.689153 0.513647 outer loop vertex 1.582439 -1.928205 -1.666712 vertex 1.385822 -2.074026 -1.666712 vertex 1.469911 -2.199873 -1.414191 endloop endfacet facet normal -0.511111 0.689153 0.513647 outer loop vertex 1.469911 -2.199873 -1.414191 vertex 1.678458 -2.045204 -1.414191 vertex 1.582439 -1.928205 -1.666712 endloop endfacet facet normal -0.511112 0.689154 -0.513645 outer loop vertex 1.678458 -2.045204 1.414190 vertex 1.469911 -2.199873 1.414190 vertex 1.385822 -2.074027 1.666711 endloop endfacet facet normal -0.511112 0.689154 -0.513645 outer loop vertex 1.385822 -2.074027 1.666711 vertex 1.582439 -1.928206 1.666711 vertex 1.678458 -2.045204 1.414190 endloop endfacet facet normal -0.087510 0.117993 0.989151 outer loop vertex 0.186547 -0.227305 -2.985554 vertex 0.163369 -0.244495 -2.985554 vertex 0.325162 -0.486635 -2.942356 endloop endfacet facet normal -0.087510 0.117993 0.989151 outer loop vertex 0.325162 -0.486635 -2.942356 vertex 0.371294 -0.452421 -2.942356 vertex 0.186547 -0.227305 -2.985554 endloop endfacet facet normal -0.560954 0.756357 0.336533 outer loop vertex 1.758312 -2.142506 -1.148051 vertex 1.539843 -2.304534 -1.148051 vertex 1.594946 -2.387002 -0.870855 endloop endfacet facet normal -0.560953 0.756357 0.336534 outer loop vertex 1.594946 -2.387002 -0.870855 vertex 1.821233 -2.219176 -0.870855 vertex 1.758312 -2.142506 -1.148051 endloop endfacet facet normal -0.441622 0.595461 -0.671116 outer loop vertex 1.471182 -1.792637 1.903180 vertex 1.288389 -1.928205 1.903180 vertex 1.178545 -1.763814 2.121321 endloop endfacet facet normal -0.441623 0.595459 -0.671117 outer loop vertex 1.178545 -1.763814 2.121321 vertex 1.345754 -1.639803 2.121321 vertex 1.471182 -1.792637 1.903180 endloop endfacet facet normal -0.200899 0.270880 0.941416 outer loop vertex 0.552467 -0.673179 -2.870821 vertex 0.483823 -0.724089 -2.870821 vertex 0.637825 -0.954569 -2.771639 endloop endfacet facet normal -0.200898 0.270881 0.941416 outer loop vertex 0.637825 -0.954569 -2.771639 vertex 0.728318 -0.887455 -2.771639 vertex 0.552467 -0.673179 -2.870821 endloop endfacet facet normal -0.589268 0.794533 0.146562 outer loop vertex 1.866613 -2.274472 -0.585272 vertex 1.634688 -2.446480 -0.585272 vertex 1.658689 -2.482399 -0.294052 endloop endfacet facet normal -0.589270 0.794532 0.146560 outer loop vertex 1.658689 -2.482399 -0.294052 vertex 1.894019 -2.307865 -0.294052 vertex 1.866613 -2.274472 -0.585272 endloop endfacet facet normal -0.355134 0.478841 -0.802864 outer loop vertex 1.207368 -1.471179 2.319032 vertex 1.057353 -1.582438 2.319032 vertex 0.925978 -1.385821 2.494409 endloop endfacet facet normal -0.355133 0.478842 -0.802864 outer loop vertex 0.925978 -1.385821 2.494409 vertex 1.057354 -1.288386 2.494409 vertex 1.207368 -1.471179 2.319032 endloop endfacet facet normal -0.306524 0.413294 0.857456 outer loop vertex 0.897155 -1.093184 -2.645764 vertex 0.785685 -1.175857 -2.645764 vertex 0.925977 -1.385820 -2.494410 endloop endfacet facet normal -0.306518 0.413296 0.857458 outer loop vertex 0.925977 -1.385820 -2.494410 vertex 1.057353 -1.288386 -2.494410 vertex 0.897155 -1.093184 -2.645764 endloop endfacet facet normal -0.254948 0.343756 -0.903788 outer loop vertex 0.897156 -1.093185 2.645763 vertex 0.785685 -1.175858 2.645763 vertex 0.637826 -0.954570 2.771639 endloop endfacet facet normal -0.254947 0.343757 -0.903788 outer loop vertex 0.637826 -0.954570 2.771639 vertex 0.728319 -0.887456 2.771639 vertex 0.897156 -1.093185 2.645763 endloop endfacet facet normal -0.594983 0.802243 -0.049009 outer loop vertex 1.903184 -2.319033 -0.000001 vertex 1.666714 -2.494411 -0.000001 vertex 1.658689 -2.482399 0.294051 endloop endfacet facet normal -0.594987 0.802240 -0.049013 outer loop vertex 1.658689 -2.482399 0.294051 vertex 1.894019 -2.307865 0.294051 vertex 1.903184 -2.319033 -0.000001 endloop endfacet facet normal -0.400316 0.539758 0.740546 outer loop vertex 1.207367 -1.471178 -2.319033 vertex 1.057353 -1.582437 -2.319033 vertex 1.178545 -1.763813 -2.121322 endloop endfacet facet normal -0.400310 0.539759 0.740548 outer loop vertex 1.178545 -1.763813 -2.121322 vertex 1.345754 -1.639803 -2.121322 vertex 1.207367 -1.471178 -2.319033 endloop endfacet facet normal -0.144907 0.195387 -0.969962 outer loop vertex 0.552468 -0.673181 2.870821 vertex 0.483824 -0.724090 2.870821 vertex 0.325163 -0.486637 2.942356 endloop endfacet facet normal -0.144909 0.195385 -0.969962 outer loop vertex 0.325163 -0.486637 2.942356 vertex 0.371296 -0.452422 2.942356 vertex 0.552468 -0.673181 2.870821 endloop endfacet facet normal -0.577886 0.779194 -0.242702 outer loop vertex 1.866614 -2.274473 0.585271 vertex 1.634688 -2.446480 0.585271 vertex 1.594946 -2.387002 0.870853 endloop endfacet facet normal -0.577888 0.779192 -0.242704 outer loop vertex 1.594946 -2.387002 0.870853 vertex 1.821233 -2.219176 0.870853 vertex 1.866614 -2.274473 0.585271 endloop endfacet facet normal -0.478674 0.645419 0.595236 outer loop vertex 1.471182 -1.792636 -1.903181 vertex 1.288388 -1.928205 -1.903181 vertex 1.385822 -2.074026 -1.666712 endloop endfacet facet normal -0.478675 0.645418 0.595235 outer loop vertex 1.385822 -2.074026 -1.666712 vertex 1.582439 -1.928205 -1.666712 vertex 1.471182 -1.792636 -1.903181 endloop endfacet facet normal -0.538624 0.726254 -0.427129 outer loop vertex 1.758311 -2.142506 1.148050 vertex 1.539842 -2.304533 1.148050 vertex 1.469911 -2.199873 1.414190 endloop endfacet facet normal -0.538625 0.726252 -0.427131 outer loop vertex 1.469911 -2.199873 1.414190 vertex 1.678458 -2.045204 1.414190 vertex 1.758311 -2.142506 1.148050 endloop endfacet facet normal -0.441100 0.735932 0.513648 outer loop vertex 1.385822 -2.074026 -1.666712 vertex 1.175859 -2.199873 -1.666712 vertex 1.247207 -2.333357 -1.414191 endloop endfacet facet normal -0.441102 0.735932 0.513646 outer loop vertex 1.247207 -2.333357 -1.414191 vertex 1.469911 -2.199873 -1.414191 vertex 1.385822 -2.074026 -1.666712 endloop endfacet facet normal -0.441103 0.735932 -0.513646 outer loop vertex 1.469911 -2.199873 1.414190 vertex 1.247207 -2.333357 1.414190 vertex 1.175859 -2.199874 1.666711 endloop endfacet facet normal -0.441101 0.735934 -0.513645 outer loop vertex 1.175859 -2.199874 1.666711 vertex 1.385822 -2.074027 1.666711 vertex 1.469911 -2.199873 1.414190 endloop endfacet facet normal -0.075520 0.126004 0.989151 outer loop vertex 0.163369 -0.244495 -2.985554 vertex 0.138617 -0.259330 -2.985554 vertex 0.275897 -0.516163 -2.942356 endloop endfacet facet normal -0.075522 0.126003 0.989151 outer loop vertex 0.275897 -0.516163 -2.942356 vertex 0.325162 -0.486635 -2.942356 vertex 0.163369 -0.244495 -2.985554 endloop endfacet facet normal -0.484118 0.807699 0.336528 outer loop vertex 1.539843 -2.304534 -1.148051 vertex 1.306545 -2.444368 -1.148051 vertex 1.353298 -2.531839 -0.870855 endloop endfacet facet normal -0.484113 0.807701 0.336533 outer loop vertex 1.353298 -2.531839 -0.870855 vertex 1.594946 -2.387002 -0.870855 vertex 1.539843 -2.304534 -1.148051 endloop endfacet facet normal -0.381132 0.635878 -0.671117 outer loop vertex 1.288389 -1.928205 1.903180 vertex 1.093187 -2.045205 1.903180 vertex 0.999986 -1.870838 2.121321 endloop endfacet facet normal -0.381131 0.635879 -0.671116 outer loop vertex 0.999986 -1.870838 2.121321 vertex 1.178545 -1.763814 2.121321 vertex 1.288389 -1.928205 1.903180 endloop endfacet facet normal -0.173380 0.289268 0.941416 outer loop vertex 0.483823 -0.724089 -2.870821 vertex 0.410520 -0.768025 -2.870821 vertex 0.541190 -1.012490 -2.771639 endloop endfacet facet normal -0.173381 0.289267 0.941416 outer loop vertex 0.541190 -1.012490 -2.771639 vertex 0.637825 -0.954569 -2.771639 vertex 0.483823 -0.724089 -2.870821 endloop endfacet facet normal -0.508551 0.848467 0.146561 outer loop vertex 1.634688 -2.446480 -0.585272 vertex 1.387019 -2.594927 -0.585272 vertex 1.407384 -2.633025 -0.294052 endloop endfacet facet normal -0.508550 0.848467 0.146562 outer loop vertex 1.407384 -2.633025 -0.294052 vertex 1.658689 -2.482399 -0.294052 vertex 1.634688 -2.446480 -0.585272 endloop endfacet facet normal -0.306487 0.511346 -0.802864 outer loop vertex 1.057353 -1.582438 2.319032 vertex 0.897156 -1.678456 2.319032 vertex 0.785685 -1.469909 2.494409 endloop endfacet facet normal -0.306487 0.511346 -0.802864 outer loop vertex 0.785685 -1.469909 2.494409 vertex 0.925978 -1.385821 2.494409 vertex 1.057353 -1.582438 2.319032 endloop endfacet facet normal -0.264534 0.441351 0.857456 outer loop vertex 0.785685 -1.175857 -2.645764 vertex 0.666647 -1.247205 -2.645764 vertex 0.785684 -1.469908 -2.494410 endloop endfacet facet normal -0.264534 0.441351 0.857456 outer loop vertex 0.785684 -1.469908 -2.494410 vertex 0.925977 -1.385820 -2.494410 vertex 0.785685 -1.175857 -2.645764 endloop endfacet facet normal -0.220025 0.367090 -0.903789 outer loop vertex 0.785685 -1.175858 2.645763 vertex 0.666648 -1.247206 2.645763 vertex 0.541190 -1.012491 2.771639 endloop endfacet facet normal -0.220024 0.367091 -0.903788 outer loop vertex 0.541190 -1.012491 2.771639 vertex 0.637826 -0.954570 2.771639 vertex 0.785685 -1.175858 2.645763 endloop endfacet facet normal -0.513486 0.856697 -0.049012 outer loop vertex 1.666714 -2.494411 -0.000001 vertex 1.414194 -2.645766 -0.000001 vertex 1.407384 -2.633025 0.294051 endloop endfacet facet normal -0.513484 0.856699 -0.049009 outer loop vertex 1.407384 -2.633025 0.294051 vertex 1.658689 -2.482399 0.294051 vertex 1.666714 -2.494411 -0.000001 endloop endfacet facet normal -0.345476 0.576399 0.740548 outer loop vertex 1.057353 -1.582437 -2.319033 vertex 0.897155 -1.678455 -2.319033 vertex 0.999986 -1.870837 -2.121322 endloop endfacet facet normal -0.345479 0.576398 0.740546 outer loop vertex 0.999986 -1.870837 -2.121322 vertex 1.178545 -1.763813 -2.121322 vertex 1.057353 -1.582437 -2.319033 endloop endfacet facet normal -0.125061 0.208647 -0.969962 outer loop vertex 0.483824 -0.724090 2.870821 vertex 0.410521 -0.768027 2.870821 vertex 0.275898 -0.516165 2.942356 endloop endfacet facet normal -0.125058 0.208649 -0.969962 outer loop vertex 0.275898 -0.516165 2.942356 vertex 0.325163 -0.486637 2.942356 vertex 0.483824 -0.724090 2.870821 endloop endfacet facet normal -0.498733 0.832082 -0.242702 outer loop vertex 1.634688 -2.446480 0.585271 vertex 1.387020 -2.594927 0.585271 vertex 1.353299 -2.531840 0.870853 endloop endfacet facet normal -0.498733 0.832083 -0.242702 outer loop vertex 1.353299 -2.531840 0.870853 vertex 1.594946 -2.387002 0.870853 vertex 1.634688 -2.446480 0.585271 endloop endfacet facet normal -0.413108 0.689229 0.595236 outer loop vertex 1.288388 -1.928205 -1.903181 vertex 1.093187 -2.045204 -1.903181 vertex 1.175859 -2.199873 -1.666712 endloop endfacet facet normal -0.413107 0.689229 0.595236 outer loop vertex 1.175859 -2.199873 -1.666712 vertex 1.385822 -2.074026 -1.666712 vertex 1.288388 -1.928205 -1.903181 endloop endfacet facet normal -0.464848 0.775549 -0.427129 outer loop vertex 1.539842 -2.304533 1.148050 vertex 1.306544 -2.444367 1.148050 vertex 1.247207 -2.333357 1.414190 endloop endfacet facet normal -0.464848 0.775549 -0.427130 outer loop vertex 1.247207 -2.333357 1.414190 vertex 1.469911 -2.199873 1.414190 vertex 1.539842 -2.304533 1.148050 endloop endfacet facet normal -0.464847 0.775548 0.427133 outer loop vertex 1.469911 -2.199873 -1.414191 vertex 1.247207 -2.333357 -1.414191 vertex 1.306545 -2.444368 -1.148051 endloop endfacet facet normal -0.464847 0.775548 0.427133 outer loop vertex 1.306545 -2.444368 -1.148051 vertex 1.539843 -2.304534 -1.148051 vertex 1.469911 -2.199873 -1.414191 endloop endfacet facet normal -0.413108 0.689229 -0.595235 outer loop vertex 1.385822 -2.074027 1.666711 vertex 1.175859 -2.199874 1.666711 vertex 1.093187 -2.045205 1.903180 endloop endfacet facet normal -0.413109 0.689227 -0.595237 outer loop vertex 1.093187 -2.045205 1.903180 vertex 1.288389 -1.928205 1.903180 vertex 1.385822 -2.074027 1.666711 endloop endfacet facet normal -0.125058 0.208649 0.969962 outer loop vertex 0.325162 -0.486635 -2.942356 vertex 0.275897 -0.516163 -2.942356 vertex 0.410520 -0.768025 -2.870821 endloop endfacet facet normal -0.125059 0.208648 0.969962 outer loop vertex 0.410520 -0.768025 -2.870821 vertex 0.483823 -0.724089 -2.870821 vertex 0.325162 -0.486635 -2.942356 endloop endfacet facet normal -0.498728 0.832085 0.242705 outer loop vertex 1.594946 -2.387002 -0.870855 vertex 1.353298 -2.531839 -0.870855 vertex 1.387019 -2.594927 -0.585272 endloop endfacet facet normal -0.498732 0.832084 0.242701 outer loop vertex 1.387019 -2.594927 -0.585272 vertex 1.634688 -2.446480 -0.585272 vertex 1.594946 -2.387002 -0.870855 endloop endfacet facet normal -0.345479 0.576398 -0.740547 outer loop vertex 1.178545 -1.763814 2.121321 vertex 0.999986 -1.870838 2.121321 vertex 0.897156 -1.678456 2.319032 endloop endfacet facet normal -0.345479 0.576399 -0.740546 outer loop vertex 0.897156 -1.678456 2.319032 vertex 1.057353 -1.582438 2.319032 vertex 1.178545 -1.763814 2.121321 endloop endfacet facet normal -0.220025 0.367087 0.903790 outer loop vertex 0.637825 -0.954569 -2.771639 vertex 0.541190 -1.012490 -2.771639 vertex 0.666647 -1.247205 -2.645764 endloop endfacet facet normal -0.220022 0.367088 0.903790 outer loop vertex 0.666647 -1.247205 -2.645764 vertex 0.785685 -1.175857 -2.645764 vertex 0.637825 -0.954569 -2.771639 endloop endfacet facet normal -0.513484 0.856698 0.049012 outer loop vertex 1.658689 -2.482399 -0.294052 vertex 1.407384 -2.633025 -0.294052 vertex 1.414194 -2.645766 -0.000001 endloop endfacet facet normal -0.513486 0.856697 0.049010 outer loop vertex 1.414194 -2.645766 -0.000001 vertex 1.666714 -2.494411 -0.000001 vertex 1.658689 -2.482399 -0.294052 endloop endfacet facet normal -0.264534 0.441350 -0.857457 outer loop vertex 0.925978 -1.385821 2.494409 vertex 0.785685 -1.469909 2.494409 vertex 0.666648 -1.247206 2.645763 endloop endfacet facet normal -0.264534 0.441350 -0.857457 outer loop vertex 0.666648 -1.247206 2.645763 vertex 0.785685 -1.175858 2.645763 vertex 0.925978 -1.385821 2.494409 endloop endfacet facet normal -0.306487 0.511346 0.802864 outer loop vertex 0.925977 -1.385820 -2.494410 vertex 0.785684 -1.469908 -2.494410 vertex 0.897155 -1.678455 -2.319033 endloop endfacet facet normal -0.306486 0.511346 0.802865 outer loop vertex 0.897155 -1.678455 -2.319033 vertex 1.057353 -1.582437 -2.319033 vertex 0.925977 -1.385820 -2.494410 endloop endfacet facet normal -0.173380 0.289269 -0.941415 outer loop vertex 0.637826 -0.954570 2.771639 vertex 0.541190 -1.012491 2.771639 vertex 0.410521 -0.768027 2.870821 endloop endfacet facet normal -0.173383 0.289266 -0.941416 outer loop vertex 0.410521 -0.768027 2.870821 vertex 0.483824 -0.724090 2.870821 vertex 0.637826 -0.954570 2.771639 endloop endfacet facet normal -0.508550 0.848467 -0.146559 outer loop vertex 1.658689 -2.482399 0.294051 vertex 1.407384 -2.633025 0.294051 vertex 1.387020 -2.594927 0.585271 endloop endfacet facet normal -0.508553 0.848466 -0.146562 outer loop vertex 1.387020 -2.594927 0.585271 vertex 1.634688 -2.446480 0.585271 vertex 1.658689 -2.482399 0.294051 endloop endfacet facet normal -0.381130 0.635879 0.671117 outer loop vertex 1.178545 -1.763813 -2.121322 vertex 0.999986 -1.870837 -2.121322 vertex 1.093187 -2.045204 -1.903181 endloop endfacet facet normal -0.381131 0.635879 0.671116 outer loop vertex 1.093187 -2.045204 -1.903181 vertex 1.288388 -1.928205 -1.903181 vertex 1.178545 -1.763813 -2.121322 endloop endfacet facet normal -0.075522 0.126002 -0.989151 outer loop vertex 0.325163 -0.486637 2.942356 vertex 0.275898 -0.516165 2.942356 vertex 0.138618 -0.259332 2.985554 endloop endfacet facet normal -0.075520 0.126004 -0.989151 outer loop vertex 0.138618 -0.259332 2.985554 vertex 0.163370 -0.244497 2.985554 vertex 0.325163 -0.486637 2.942356 endloop endfacet facet normal -0.484117 0.807697 -0.336536 outer loop vertex 1.594946 -2.387002 0.870853 vertex 1.353299 -2.531840 0.870853 vertex 1.306544 -2.444367 1.148050 endloop endfacet facet normal -0.484117 0.807697 -0.336536 outer loop vertex 1.306544 -2.444367 1.148050 vertex 1.539842 -2.304533 1.148050 vertex 1.594946 -2.387002 0.870853 endloop endfacet facet normal -0.343564 0.726401 0.595235 outer loop vertex 1.093187 -2.045204 -1.903181 vertex 0.887458 -2.142507 -1.903181 vertex 0.954572 -2.304534 -1.666712 endloop endfacet facet normal -0.343562 0.726401 0.595236 outer loop vertex 0.954572 -2.304534 -1.666712 vertex 1.175859 -2.199873 -1.666712 vertex 1.093187 -2.045204 -1.903181 endloop endfacet facet normal -0.386591 0.817378 -0.427131 outer loop vertex 1.306544 -2.444367 1.148050 vertex 1.060663 -2.560660 1.148050 vertex 1.012493 -2.444368 1.414190 endloop endfacet facet normal -0.386589 0.817380 -0.427129 outer loop vertex 1.012493 -2.444368 1.414190 vertex 1.247207 -2.333357 1.414190 vertex 1.306544 -2.444367 1.148050 endloop endfacet facet normal -0.386588 0.817378 0.427134 outer loop vertex 1.247207 -2.333357 -1.414191 vertex 1.012493 -2.444368 -1.414191 vertex 1.060663 -2.560661 -1.148051 endloop endfacet facet normal -0.386590 0.817377 0.427133 outer loop vertex 1.060663 -2.560661 -1.148051 vertex 1.306545 -2.444368 -1.148051 vertex 1.247207 -2.333357 -1.414191 endloop endfacet facet normal -0.343562 0.726401 -0.595237 outer loop vertex 1.175859 -2.199874 1.666711 vertex 0.954572 -2.304535 1.666711 vertex 0.887458 -2.142507 1.903180 endloop endfacet facet normal -0.343561 0.726403 -0.595235 outer loop vertex 0.887458 -2.142507 1.903180 vertex 1.093187 -2.045205 1.903180 vertex 1.175859 -2.199874 1.666711 endloop endfacet facet normal -0.104006 0.219901 0.969962 outer loop vertex 0.275897 -0.516163 -2.942356 vertex 0.223976 -0.540720 -2.942356 vertex 0.333264 -0.804564 -2.870821 endloop endfacet facet normal -0.104005 0.219902 0.969962 outer loop vertex 0.333264 -0.804564 -2.870821 vertex 0.410520 -0.768025 -2.870821 vertex 0.275897 -0.516163 -2.942356 endloop endfacet facet normal -0.414773 0.876960 0.242703 outer loop vertex 1.353298 -2.531839 -0.870855 vertex 1.098618 -2.652294 -0.870855 vertex 1.125993 -2.718383 -0.585272 endloop endfacet facet normal -0.414771 0.876960 0.242705 outer loop vertex 1.125993 -2.718383 -0.585272 vertex 1.387019 -2.594927 -0.585272 vertex 1.353298 -2.531839 -0.870855 endloop endfacet facet normal -0.287319 0.607484 -0.740548 outer loop vertex 0.999986 -1.870838 2.121321 vertex 0.811797 -1.959845 2.121321 vertex 0.728318 -1.758310 2.319032 endloop endfacet facet normal -0.287318 0.607486 -0.740547 outer loop vertex 0.728318 -1.758310 2.319032 vertex 0.897156 -1.678456 2.319032 vertex 0.999986 -1.870838 2.121321 endloop endfacet facet normal -0.182981 0.386886 0.903790 outer loop vertex 0.541190 -1.012490 -2.771639 vertex 0.439342 -1.060660 -2.771639 vertex 0.541190 -1.306542 -2.645764 endloop endfacet facet normal -0.182984 0.386886 0.903790 outer loop vertex 0.541190 -1.306542 -2.645764 vertex 0.666647 -1.247205 -2.645764 vertex 0.541190 -1.012490 -2.771639 endloop endfacet facet normal -0.427043 0.902902 0.049008 outer loop vertex 1.407384 -2.633025 -0.294052 vertex 1.142526 -2.758294 -0.294052 vertex 1.148054 -2.771640 -0.000001 endloop endfacet facet normal -0.427039 0.902904 0.049012 outer loop vertex 1.148054 -2.771640 -0.000001 vertex 1.414194 -2.645766 -0.000001 vertex 1.407384 -2.633025 -0.294052 endloop endfacet facet normal -0.220003 0.465151 -0.857457 outer loop vertex 0.785685 -1.469909 2.494409 vertex 0.637826 -1.539842 2.494409 vertex 0.541190 -1.306543 2.645763 endloop endfacet facet normal -0.220001 0.465154 -0.857457 outer loop vertex 0.541190 -1.306543 2.645763 vertex 0.666648 -1.247206 2.645763 vertex 0.785685 -1.469909 2.494409 endloop endfacet facet normal -0.254896 0.538924 0.802863 outer loop vertex 0.785684 -1.469908 -2.494410 vertex 0.637825 -1.539841 -2.494410 vertex 0.728318 -1.758309 -2.319033 endloop endfacet facet normal -0.254892 0.538924 0.802864 outer loop vertex 0.728318 -1.758309 -2.319033 vertex 0.897155 -1.678455 -2.319033 vertex 0.785684 -1.469908 -2.494410 endloop endfacet facet normal -0.144195 0.304868 -0.941416 outer loop vertex 0.541190 -1.012491 2.771639 vertex 0.439343 -1.060662 2.771639 vertex 0.333265 -0.804566 2.870821 endloop endfacet facet normal -0.144192 0.304871 -0.941415 outer loop vertex 0.333265 -0.804566 2.870821 vertex 0.410521 -0.768027 2.870821 vertex 0.541190 -1.012491 2.771639 endloop endfacet facet normal -0.422940 0.894227 -0.146563 outer loop vertex 1.407384 -2.633025 0.294051 vertex 1.142526 -2.758294 0.294051 vertex 1.125993 -2.718383 0.585271 endloop endfacet facet normal -0.422937 0.894229 -0.146559 outer loop vertex 1.125993 -2.718383 0.585271 vertex 1.387020 -2.594927 0.585271 vertex 1.407384 -2.633025 0.294051 endloop endfacet facet normal -0.316968 0.670173 0.671118 outer loop vertex 0.999986 -1.870837 -2.121322 vertex 0.811796 -1.959844 -2.121322 vertex 0.887458 -2.142507 -1.903181 endloop endfacet facet normal -0.316970 0.670173 0.671117 outer loop vertex 0.887458 -2.142507 -1.903181 vertex 1.093187 -2.045204 -1.903181 vertex 0.999986 -1.870837 -2.121322 endloop endfacet facet normal -0.062809 0.132798 -0.989151 outer loop vertex 0.275898 -0.516165 2.942356 vertex 0.223977 -0.540722 2.942356 vertex 0.112532 -0.271670 2.985554 endloop endfacet facet normal -0.062810 0.132797 -0.989151 outer loop vertex 0.112532 -0.271670 2.985554 vertex 0.138618 -0.259332 2.985554 vertex 0.275898 -0.516165 2.942356 endloop endfacet facet normal -0.402614 0.851262 -0.336534 outer loop vertex 1.353299 -2.531840 0.870853 vertex 1.098619 -2.652294 0.870853 vertex 1.060663 -2.560660 1.148050 endloop endfacet facet normal -0.402616 0.851260 -0.336536 outer loop vertex 1.060663 -2.560660 1.148050 vertex 1.306544 -2.444367 1.148050 vertex 1.353299 -2.531840 0.870853 endloop endfacet facet normal -0.366843 0.775625 0.513646 outer loop vertex 1.175859 -2.199873 -1.666712 vertex 0.954572 -2.304534 -1.666712 vertex 1.012493 -2.444368 -1.414191 endloop endfacet facet normal -0.366841 0.775625 0.513648 outer loop vertex 1.012493 -2.444368 -1.414191 vertex 1.247207 -2.333357 -1.414191 vertex 1.175859 -2.199873 -1.666712 endloop endfacet facet normal -0.366842 0.775626 -0.513645 outer loop vertex 1.247207 -2.333357 1.414190 vertex 1.012493 -2.444368 1.414190 vertex 0.954572 -2.304535 1.666711 endloop endfacet facet normal -0.366843 0.775625 -0.513646 outer loop vertex 0.954572 -2.304535 1.666711 vertex 1.175859 -2.199874 1.666711 vertex 1.247207 -2.333357 1.414190 endloop endfacet facet normal -0.062810 0.132797 0.989151 outer loop vertex 0.138617 -0.259330 -2.985554 vertex 0.112531 -0.271668 -2.985554 vertex 0.223976 -0.540720 -2.942356 endloop endfacet facet normal -0.062809 0.132798 0.989151 outer loop vertex 0.223976 -0.540720 -2.942356 vertex 0.275897 -0.516163 -2.942356 vertex 0.138617 -0.259330 -2.985554 endloop endfacet facet normal -0.402616 0.851262 0.336530 outer loop vertex 1.306545 -2.444368 -1.148051 vertex 1.060663 -2.560661 -1.148051 vertex 1.098618 -2.652294 -0.870855 endloop endfacet facet normal -0.402618 0.851262 0.336528 outer loop vertex 1.098618 -2.652294 -0.870855 vertex 1.353298 -2.531839 -0.870855 vertex 1.306545 -2.444368 -1.148051 endloop endfacet facet normal -0.316968 0.670176 -0.671116 outer loop vertex 1.093187 -2.045205 1.903180 vertex 0.887458 -2.142507 1.903180 vertex 0.811797 -1.959845 2.121321 endloop endfacet facet normal -0.316969 0.670174 -0.671117 outer loop vertex 0.811797 -1.959845 2.121321 vertex 0.999986 -1.870838 2.121321 vertex 1.093187 -2.045205 1.903180 endloop endfacet facet normal -0.144191 0.304870 0.941416 outer loop vertex 0.410520 -0.768025 -2.870821 vertex 0.333264 -0.804564 -2.870821 vertex 0.439342 -1.060660 -2.771639 endloop endfacet facet normal -0.144191 0.304870 0.941416 outer loop vertex 0.439342 -1.060660 -2.771639 vertex 0.541190 -1.012490 -2.771639 vertex 0.410520 -0.768025 -2.870821 endloop endfacet facet normal -0.422938 0.894228 0.146563 outer loop vertex 1.387019 -2.594927 -0.585272 vertex 1.125993 -2.718383 -0.585272 vertex 1.142526 -2.758294 -0.294052 endloop endfacet facet normal -0.422940 0.894227 0.146560 outer loop vertex 1.142526 -2.758294 -0.294052 vertex 1.407384 -2.633025 -0.294052 vertex 1.387019 -2.594927 -0.585272 endloop endfacet facet normal -0.254892 0.538926 -0.802863 outer loop vertex 0.897156 -1.678456 2.319032 vertex 0.728318 -1.758310 2.319032 vertex 0.637826 -1.539842 2.494409 endloop endfacet facet normal -0.254895 0.538922 -0.802864 outer loop vertex 0.637826 -1.539842 2.494409 vertex 0.785685 -1.469909 2.494409 vertex 0.897156 -1.678456 2.319032 endloop endfacet facet normal -0.220002 0.465153 0.857457 outer loop vertex 0.666647 -1.247205 -2.645764 vertex 0.541190 -1.306542 -2.645764 vertex 0.637825 -1.539841 -2.494410 endloop endfacet facet normal -0.220004 0.465153 0.857456 outer loop vertex 0.637825 -1.539841 -2.494410 vertex 0.785684 -1.469908 -2.494410 vertex 0.666647 -1.247205 -2.645764 endloop endfacet facet normal -0.182985 0.386890 -0.903788 outer loop vertex 0.666648 -1.247206 2.645763 vertex 0.541190 -1.306543 2.645763 vertex 0.439343 -1.060662 2.771639 endloop endfacet facet normal -0.182988 0.386887 -0.903789 outer loop vertex 0.439343 -1.060662 2.771639 vertex 0.541190 -1.012491 2.771639 vertex 0.666648 -1.247206 2.645763 endloop endfacet facet normal -0.427039 0.902904 -0.049008 outer loop vertex 1.414194 -2.645766 -0.000001 vertex 1.148054 -2.771640 -0.000001 vertex 1.142526 -2.758294 0.294051 endloop endfacet facet normal -0.427043 0.902902 -0.049012 outer loop vertex 1.142526 -2.758294 0.294051 vertex 1.407384 -2.633025 0.294051 vertex 1.414194 -2.645766 -0.000001 endloop endfacet facet normal -0.287319 0.607485 0.740547 outer loop vertex 0.897155 -1.678455 -2.319033 vertex 0.728318 -1.758309 -2.319033 vertex 0.811796 -1.959844 -2.121322 endloop endfacet facet normal -0.287318 0.607485 0.740547 outer loop vertex 0.811796 -1.959844 -2.121322 vertex 0.999986 -1.870837 -2.121322 vertex 0.897155 -1.678455 -2.319033 endloop endfacet facet normal -0.104005 0.219902 -0.969962 outer loop vertex 0.410521 -0.768027 2.870821 vertex 0.333265 -0.804566 2.870821 vertex 0.223977 -0.540722 2.942356 endloop endfacet facet normal -0.104006 0.219901 -0.969962 outer loop vertex 0.223977 -0.540722 2.942356 vertex 0.275898 -0.516165 2.942356 vertex 0.410521 -0.768027 2.870821 endloop endfacet facet normal -0.414770 0.876961 -0.242703 outer loop vertex 1.387020 -2.594927 0.585271 vertex 1.125993 -2.718383 0.585271 vertex 1.098619 -2.652294 0.870853 endloop endfacet facet normal -0.414769 0.876962 -0.242702 outer loop vertex 1.098619 -2.652294 0.870853 vertex 1.353299 -2.531840 0.870853 vertex 1.387020 -2.594927 0.585271 endloop endfacet facet normal -0.249756 0.698014 0.671117 outer loop vertex 0.811796 -1.959844 -2.121322 vertex 0.615789 -2.029977 -2.121322 vertex 0.673183 -2.219176 -1.903181 endloop endfacet facet normal -0.249754 0.698014 0.671118 outer loop vertex 0.673183 -2.219176 -1.903181 vertex 0.887458 -2.142507 -1.903181 vertex 0.811796 -1.959844 -2.121322 endloop endfacet facet normal -0.049488 0.138316 -0.989151 outer loop vertex 0.223977 -0.540722 2.942356 vertex 0.169898 -0.560071 2.942356 vertex 0.085362 -0.281392 2.985554 endloop endfacet facet normal -0.049492 0.138314 -0.989151 outer loop vertex 0.085362 -0.281392 2.985554 vertex 0.112532 -0.271670 2.985554 vertex 0.223977 -0.540722 2.942356 endloop endfacet facet normal -0.317240 0.886625 -0.336533 outer loop vertex 1.098619 -2.652294 0.870853 vertex 0.833358 -2.747206 0.870853 vertex 0.804567 -2.652293 1.148050 endloop endfacet facet normal -0.317241 0.886625 -0.336534 outer loop vertex 0.804567 -2.652293 1.148050 vertex 1.060663 -2.560660 1.148050 vertex 1.098619 -2.652294 0.870853 endloop endfacet facet normal -0.289054 0.807846 0.513647 outer loop vertex 0.954572 -2.304534 -1.666712 vertex 0.724091 -2.387002 -1.666712 vertex 0.768027 -2.531840 -1.414191 endloop endfacet facet normal -0.289055 0.807846 0.513647 outer loop vertex 0.768027 -2.531840 -1.414191 vertex 1.012493 -2.444368 -1.414191 vertex 0.954572 -2.304534 -1.666712 endloop endfacet facet normal -0.289055 0.807845 -0.513647 outer loop vertex 1.012493 -2.444368 1.414190 vertex 0.768027 -2.531840 1.414190 vertex 0.724091 -2.387002 1.666711 endloop endfacet facet normal -0.289051 0.807848 -0.513644 outer loop vertex 0.724091 -2.387002 1.666711 vertex 0.954572 -2.304535 1.666711 vertex 1.012493 -2.444368 1.414190 endloop endfacet facet normal -0.049492 0.138314 0.989151 outer loop vertex 0.112531 -0.271668 -2.985554 vertex 0.085361 -0.281390 -2.985554 vertex 0.169898 -0.560070 -2.942356 endloop endfacet facet normal -0.049491 0.138314 0.989151 outer loop vertex 0.169898 -0.560070 -2.942356 vertex 0.223976 -0.540720 -2.942356 vertex 0.112531 -0.271668 -2.985554 endloop endfacet facet normal -0.317241 0.886627 0.336529 outer loop vertex 1.060663 -2.560661 -1.148051 vertex 0.804567 -2.652294 -1.148051 vertex 0.833358 -2.747205 -0.870855 endloop endfacet facet normal -0.317239 0.886627 0.336531 outer loop vertex 0.833358 -2.747205 -0.870855 vertex 1.098618 -2.652294 -0.870855 vertex 1.060663 -2.560661 -1.148051 endloop endfacet facet normal -0.249755 0.698016 -0.671115 outer loop vertex 0.887458 -2.142507 1.903180 vertex 0.673183 -2.219176 1.903180 vertex 0.615789 -2.029978 2.121321 endloop endfacet facet normal -0.249755 0.698016 -0.671116 outer loop vertex 0.615789 -2.029978 2.121321 vertex 0.811797 -1.959845 2.121321 vertex 0.887458 -2.142507 1.903180 endloop endfacet facet normal -0.113619 0.317534 0.941416 outer loop vertex 0.333264 -0.804564 -2.870821 vertex 0.252798 -0.833356 -2.870821 vertex 0.333264 -1.098616 -2.771639 endloop endfacet facet normal -0.113617 0.317534 0.941416 outer loop vertex 0.333264 -1.098616 -2.771639 vertex 0.439342 -1.060660 -2.771639 vertex 0.333264 -0.804564 -2.870821 endloop endfacet facet normal -0.333253 0.931377 0.146558 outer loop vertex 1.125993 -2.718383 -0.585272 vertex 0.854123 -2.815660 -0.585272 vertex 0.866664 -2.856998 -0.294052 endloop endfacet facet normal -0.333248 0.931378 0.146562 outer loop vertex 0.866664 -2.856998 -0.294052 vertex 1.142526 -2.758294 -0.294052 vertex 1.125993 -2.718383 -0.585272 endloop endfacet facet normal -0.200842 0.561311 -0.802865 outer loop vertex 0.728318 -1.758310 2.319032 vertex 0.552467 -1.821231 2.319032 vertex 0.483823 -1.594944 2.494409 endloop endfacet facet normal -0.200838 0.561316 -0.802863 outer loop vertex 0.483823 -1.594944 2.494409 vertex 0.637826 -1.539842 2.494409 vertex 0.728318 -1.758310 2.319032 endloop endfacet facet normal -0.173347 0.484478 0.857457 outer loop vertex 0.541190 -1.306542 -2.645764 vertex 0.410520 -1.353296 -2.645764 vertex 0.483823 -1.594943 -2.494410 endloop endfacet facet normal -0.173346 0.484478 0.857457 outer loop vertex 0.483823 -1.594943 -2.494410 vertex 0.637825 -1.539841 -2.494410 vertex 0.541190 -1.306542 -2.645764 endloop endfacet facet normal -0.144182 0.402962 -0.903788 outer loop vertex 0.541190 -1.306543 2.645763 vertex 0.410521 -1.353297 2.645763 vertex 0.333264 -1.098617 2.771639 endloop endfacet facet normal -0.144180 0.402964 -0.903788 outer loop vertex 0.333264 -1.098617 2.771639 vertex 0.439343 -1.060662 2.771639 vertex 0.541190 -1.306543 2.645763 endloop endfacet facet normal -0.336486 0.940412 -0.049012 outer loop vertex 1.148054 -2.771640 -0.000001 vertex 0.870857 -2.870823 -0.000001 vertex 0.866664 -2.856998 0.294051 endloop endfacet facet normal -0.336482 0.940414 -0.049008 outer loop vertex 0.866664 -2.856998 0.294051 vertex 1.142526 -2.758294 0.294051 vertex 1.148054 -2.771640 -0.000001 endloop endfacet facet normal -0.226392 0.632721 0.740548 outer loop vertex 0.728318 -1.758309 -2.319033 vertex 0.552466 -1.821230 -2.319033 vertex 0.615789 -2.029977 -2.121322 endloop endfacet facet normal -0.226393 0.632721 0.740547 outer loop vertex 0.615789 -2.029977 -2.121322 vertex 0.811796 -1.959844 -2.121322 vertex 0.728318 -1.758309 -2.319033 endloop endfacet facet normal -0.081949 0.229038 -0.969962 outer loop vertex 0.333265 -0.804566 2.870821 vertex 0.252798 -0.833357 2.870821 vertex 0.169898 -0.560071 2.942356 endloop endfacet facet normal -0.081948 0.229038 -0.969962 outer loop vertex 0.169898 -0.560071 2.942356 vertex 0.223977 -0.540722 2.942356 vertex 0.333265 -0.804566 2.870821 endloop endfacet facet normal -0.326818 0.913392 -0.242703 outer loop vertex 1.125993 -2.718383 0.585271 vertex 0.854123 -2.815660 0.585271 vertex 0.833358 -2.747206 0.870853 endloop endfacet facet normal -0.326818 0.913392 -0.242703 outer loop vertex 0.833358 -2.747206 0.870853 vertex 1.098619 -2.652294 0.870853 vertex 1.125993 -2.718383 0.585271 endloop endfacet facet normal -0.270709 0.756579 0.595236 outer loop vertex 0.887458 -2.142507 -1.903181 vertex 0.673183 -2.219176 -1.903181 vertex 0.724091 -2.387002 -1.666712 endloop endfacet facet normal -0.270710 0.756579 0.595235 outer loop vertex 0.724091 -2.387002 -1.666712 vertex 0.954572 -2.304534 -1.666712 vertex 0.887458 -2.142507 -1.903181 endloop endfacet facet normal -0.304614 0.851335 -0.427129 outer loop vertex 1.060663 -2.560660 1.148050 vertex 0.804567 -2.652293 1.148050 vertex 0.768027 -2.531840 1.414190 endloop endfacet facet normal -0.304615 0.851334 -0.427131 outer loop vertex 0.768027 -2.531840 1.414190 vertex 1.012493 -2.444368 1.414190 vertex 1.060663 -2.560660 1.148050 endloop endfacet facet normal -0.304615 0.851333 0.427132 outer loop vertex 1.012493 -2.444368 -1.414191 vertex 0.768027 -2.531840 -1.414191 vertex 0.804567 -2.652294 -1.148051 endloop endfacet facet normal -0.304613 0.851333 0.427134 outer loop vertex 0.804567 -2.652294 -1.148051 vertex 1.060663 -2.560661 -1.148051 vertex 1.012493 -2.444368 -1.414191 endloop endfacet facet normal -0.270707 0.756579 -0.595236 outer loop vertex 0.954572 -2.304535 1.666711 vertex 0.724091 -2.387002 1.666711 vertex 0.673183 -2.219176 1.903180 endloop endfacet facet normal -0.270708 0.756578 -0.595237 outer loop vertex 0.673183 -2.219176 1.903180 vertex 0.887458 -2.142507 1.903180 vertex 0.954572 -2.304535 1.666711 endloop endfacet facet normal -0.081953 0.229036 0.969962 outer loop vertex 0.223976 -0.540720 -2.942356 vertex 0.169898 -0.560070 -2.942356 vertex 0.252798 -0.833356 -2.870821 endloop endfacet facet normal -0.081953 0.229036 0.969962 outer loop vertex 0.252798 -0.833356 -2.870821 vertex 0.333264 -0.804564 -2.870821 vertex 0.223976 -0.540720 -2.942356 endloop endfacet facet normal -0.326815 0.913392 0.242706 outer loop vertex 1.098618 -2.652294 -0.870855 vertex 0.833358 -2.747205 -0.870855 vertex 0.854123 -2.815660 -0.585272 endloop endfacet facet normal -0.326818 0.913392 0.242703 outer loop vertex 0.854123 -2.815660 -0.585272 vertex 1.125993 -2.718383 -0.585272 vertex 1.098618 -2.652294 -0.870855 endloop endfacet facet normal -0.226392 0.632721 -0.740547 outer loop vertex 0.811797 -1.959845 2.121321 vertex 0.615789 -2.029978 2.121321 vertex 0.552467 -1.821231 2.319032 endloop endfacet facet normal -0.226393 0.632721 -0.740548 outer loop vertex 0.552467 -1.821231 2.319032 vertex 0.728318 -1.758310 2.319032 vertex 0.811797 -1.959845 2.121321 endloop endfacet facet normal -0.144183 0.402958 0.903790 outer loop vertex 0.439342 -1.060660 -2.771639 vertex 0.333264 -1.098616 -2.771639 vertex 0.410520 -1.353296 -2.645764 endloop endfacet facet normal -0.144179 0.402958 0.903790 outer loop vertex 0.410520 -1.353296 -2.645764 vertex 0.541190 -1.306542 -2.645764 vertex 0.439342 -1.060660 -2.771639 endloop endfacet facet normal -0.336481 0.940414 0.049012 outer loop vertex 1.142526 -2.758294 -0.294052 vertex 0.866664 -2.856998 -0.294052 vertex 0.870857 -2.870823 -0.000001 endloop endfacet facet normal -0.336486 0.940412 0.049008 outer loop vertex 0.870857 -2.870823 -0.000001 vertex 1.148054 -2.771640 -0.000001 vertex 1.142526 -2.758294 -0.294052 endloop endfacet facet normal -0.173346 0.484479 -0.857457 outer loop vertex 0.637826 -1.539842 2.494409 vertex 0.483823 -1.594944 2.494409 vertex 0.410521 -1.353297 2.645763 endloop endfacet facet normal -0.173348 0.484476 -0.857457 outer loop vertex 0.410521 -1.353297 2.645763 vertex 0.541190 -1.306543 2.645763 vertex 0.637826 -1.539842 2.494409 endloop endfacet facet normal -0.200838 0.561313 0.802864 outer loop vertex 0.637825 -1.539841 -2.494410 vertex 0.483823 -1.594943 -2.494410 vertex 0.552466 -1.821230 -2.319033 endloop endfacet facet normal -0.200842 0.561314 0.802863 outer loop vertex 0.552466 -1.821230 -2.319033 vertex 0.728318 -1.758309 -2.319033 vertex 0.637825 -1.539841 -2.494410 endloop endfacet facet normal -0.113614 0.317535 -0.941416 outer loop vertex 0.439343 -1.060662 2.771639 vertex 0.333264 -1.098617 2.771639 vertex 0.252798 -0.833357 2.870821 endloop endfacet facet normal -0.113614 0.317535 -0.941416 outer loop vertex 0.252798 -0.833357 2.870821 vertex 0.333265 -0.804566 2.870821 vertex 0.439343 -1.060662 2.771639 endloop endfacet facet normal -0.333249 0.931379 -0.146558 outer loop vertex 1.142526 -2.758294 0.294051 vertex 0.866664 -2.856998 0.294051 vertex 0.854123 -2.815660 0.585271 endloop endfacet facet normal -0.333253 0.931376 -0.146562 outer loop vertex 0.854123 -2.815660 0.585271 vertex 1.125993 -2.718383 0.585271 vertex 1.142526 -2.758294 0.294051 endloop endfacet facet normal -0.163283 0.651866 0.740547 outer loop vertex 0.552466 -1.821230 -2.319033 vertex 0.371294 -1.866611 -2.319033 vertex 0.413851 -2.080559 -2.121322 endloop endfacet facet normal -0.163281 0.651865 0.740548 outer loop vertex 0.413851 -2.080559 -2.121322 vertex 0.615789 -2.029977 -2.121322 vertex 0.552466 -1.821230 -2.319033 endloop endfacet facet normal -0.059108 0.235966 -0.969962 outer loop vertex 0.252798 -0.833357 2.870821 vertex 0.169898 -0.854123 2.870821 vertex 0.114183 -0.574027 2.942356 endloop endfacet facet normal -0.059107 0.235967 -0.969962 outer loop vertex 0.114183 -0.574027 2.942356 vertex 0.169898 -0.560071 2.942356 vertex 0.252798 -0.833357 2.870821 endloop endfacet facet normal -0.235714 0.941028 -0.242704 outer loop vertex 0.854123 -2.815660 0.585271 vertex 0.574027 -2.885820 0.585271 vertex 0.560072 -2.815660 0.870853 endloop endfacet facet normal -0.235713 0.941028 -0.242704 outer loop vertex 0.560072 -2.815660 0.870853 vertex 0.833358 -2.747206 0.870853 vertex 0.854123 -2.815660 0.585271 endloop endfacet facet normal -0.195246 0.779469 0.595237 outer loop vertex 0.673183 -2.219176 -1.903181 vertex 0.452424 -2.274473 -1.903181 vertex 0.486638 -2.446481 -1.666712 endloop endfacet facet normal -0.195247 0.779469 0.595236 outer loop vertex 0.486638 -2.446481 -1.666712 vertex 0.724091 -2.387002 -1.666712 vertex 0.673183 -2.219176 -1.903181 endloop endfacet facet normal -0.219698 0.877095 -0.427128 outer loop vertex 0.804567 -2.652293 1.148050 vertex 0.540722 -2.718382 1.148050 vertex 0.516165 -2.594928 1.414190 endloop endfacet facet normal -0.219700 0.877093 -0.427129 outer loop vertex 0.516165 -2.594928 1.414190 vertex 0.768027 -2.531840 1.414190 vertex 0.804567 -2.652293 1.148050 endloop endfacet facet normal -0.219699 0.877092 0.427132 outer loop vertex 0.768027 -2.531840 -1.414191 vertex 0.516165 -2.594928 -1.414191 vertex 0.540723 -2.718383 -1.148051 endloop endfacet facet normal -0.219699 0.877092 0.427132 outer loop vertex 0.540723 -2.718383 -1.148051 vertex 0.804567 -2.652294 -1.148051 vertex 0.768027 -2.531840 -1.414191 endloop endfacet facet normal -0.195247 0.779471 -0.595234 outer loop vertex 0.724091 -2.387002 1.666711 vertex 0.486637 -2.446481 1.666711 vertex 0.452424 -2.274474 1.903180 endloop endfacet facet normal -0.195249 0.779469 -0.595236 outer loop vertex 0.452424 -2.274474 1.903180 vertex 0.673183 -2.219176 1.903180 vertex 0.724091 -2.387002 1.666711 endloop endfacet facet normal -0.059103 0.235967 0.969962 outer loop vertex 0.169898 -0.560070 -2.942356 vertex 0.114183 -0.574025 -2.942356 vertex 0.169898 -0.854121 -2.870821 endloop endfacet facet normal -0.059106 0.235967 0.969962 outer loop vertex 0.169898 -0.854121 -2.870821 vertex 0.252798 -0.833356 -2.870821 vertex 0.169898 -0.560070 -2.942356 endloop endfacet facet normal -0.235717 0.941028 0.242703 outer loop vertex 0.833358 -2.747205 -0.870855 vertex 0.560072 -2.815660 -0.870855 vertex 0.574027 -2.885820 -0.585272 endloop endfacet facet normal -0.235714 0.941028 0.242706 outer loop vertex 0.574027 -2.885820 -0.585272 vertex 0.854123 -2.815660 -0.585272 vertex 0.833358 -2.747205 -0.870855 endloop endfacet facet normal -0.163282 0.651866 -0.740547 outer loop vertex 0.615789 -2.029978 2.121321 vertex 0.413852 -2.080560 2.121321 vertex 0.371295 -1.866612 2.319032 endloop endfacet facet normal -0.163283 0.651865 -0.740547 outer loop vertex 0.371295 -1.866612 2.319032 vertex 0.552467 -1.821231 2.319032 vertex 0.615789 -2.029978 2.121321 endloop endfacet facet normal -0.103989 0.415151 0.903790 outer loop vertex 0.333264 -1.098616 -2.771639 vertex 0.223976 -1.125991 -2.771639 vertex 0.275897 -1.387017 -2.645764 endloop endfacet facet normal -0.103989 0.415151 0.903790 outer loop vertex 0.275897 -1.387017 -2.645764 vertex 0.410520 -1.353296 -2.645764 vertex 0.333264 -1.098616 -2.771639 endloop endfacet facet normal -0.242690 0.968865 0.049011 outer loop vertex 0.866664 -2.856998 -0.294052 vertex 0.582456 -2.928189 -0.294052 vertex 0.585274 -2.942358 -0.000001 endloop endfacet facet normal -0.242689 0.968865 0.049012 outer loop vertex 0.585274 -2.942358 -0.000001 vertex 0.870857 -2.870823 -0.000001 vertex 0.866664 -2.856998 -0.294052 endloop endfacet facet normal -0.125028 0.499136 -0.857456 outer loop vertex 0.483823 -1.594944 2.494409 vertex 0.325162 -1.634687 2.494409 vertex 0.275898 -1.387019 2.645763 endloop endfacet facet normal -0.125030 0.499135 -0.857457 outer loop vertex 0.275898 -1.387019 2.645763 vertex 0.410521 -1.353297 2.645763 vertex 0.483823 -1.594944 2.494409 endloop endfacet facet normal -0.144856 0.578296 0.802864 outer loop vertex 0.483823 -1.594943 -2.494410 vertex 0.325161 -1.634686 -2.494410 vertex 0.371294 -1.866611 -2.319033 endloop endfacet facet normal -0.144855 0.578296 0.802864 outer loop vertex 0.371294 -1.866611 -2.319033 vertex 0.552466 -1.821230 -2.319033 vertex 0.483823 -1.594943 -2.494410 endloop endfacet facet normal -0.081944 0.327143 -0.941415 outer loop vertex 0.333264 -1.098617 2.771639 vertex 0.223976 -1.125992 2.771639 vertex 0.169898 -0.854123 2.870821 endloop endfacet facet normal -0.081947 0.327141 -0.941416 outer loop vertex 0.169898 -0.854123 2.870821 vertex 0.252798 -0.833357 2.870821 vertex 0.333264 -1.098617 2.771639 endloop endfacet facet normal -0.240359 0.959556 -0.146561 outer loop vertex 0.866664 -2.856998 0.294051 vertex 0.582456 -2.928189 0.294051 vertex 0.574027 -2.885820 0.585271 endloop endfacet facet normal -0.240355 0.959557 -0.146557 outer loop vertex 0.574027 -2.885820 0.585271 vertex 0.854123 -2.815660 0.585271 vertex 0.866664 -2.856998 0.294051 endloop endfacet facet normal -0.180130 0.719134 0.671118 outer loop vertex 0.615789 -2.029977 -2.121322 vertex 0.413851 -2.080559 -2.121322 vertex 0.452424 -2.274473 -1.903181 endloop endfacet facet normal -0.180133 0.719135 0.671117 outer loop vertex 0.452424 -2.274473 -1.903181 vertex 0.673183 -2.219176 -1.903181 vertex 0.615789 -2.029977 -2.121322 endloop endfacet facet normal -0.035695 0.142500 -0.989151 outer loop vertex 0.169898 -0.560071 2.942356 vertex 0.114183 -0.574027 2.942356 vertex 0.057369 -0.288404 2.985554 endloop endfacet facet normal -0.035695 0.142500 -0.989151 outer loop vertex 0.057369 -0.288404 2.985554 vertex 0.085362 -0.281392 2.985554 vertex 0.169898 -0.560071 2.942356 endloop endfacet facet normal -0.228806 0.913451 -0.336534 outer loop vertex 0.833358 -2.747206 0.870853 vertex 0.560072 -2.815660 0.870853 vertex 0.540722 -2.718382 1.148050 endloop endfacet facet normal -0.228805 0.913452 -0.336533 outer loop vertex 0.540722 -2.718382 1.148050 vertex 0.804567 -2.652293 1.148050 vertex 0.833358 -2.747206 0.870853 endloop endfacet facet normal -0.208478 0.832289 0.513646 outer loop vertex 0.724091 -2.387002 -1.666712 vertex 0.486638 -2.446481 -1.666712 vertex 0.516165 -2.594928 -1.414191 endloop endfacet facet normal -0.208477 0.832288 0.513647 outer loop vertex 0.516165 -2.594928 -1.414191 vertex 0.768027 -2.531840 -1.414191 vertex 0.724091 -2.387002 -1.666712 endloop endfacet facet normal -0.208477 0.832288 -0.513647 outer loop vertex 0.768027 -2.531840 1.414190 vertex 0.516165 -2.594928 1.414190 vertex 0.486637 -2.446481 1.666711 endloop endfacet facet normal -0.208477 0.832288 -0.513647 outer loop vertex 0.486637 -2.446481 1.666711 vertex 0.724091 -2.387002 1.666711 vertex 0.768027 -2.531840 1.414190 endloop endfacet facet normal -0.035691 0.142500 0.989151 outer loop vertex 0.085361 -0.281390 -2.985554 vertex 0.057369 -0.288401 -2.985554 vertex 0.114183 -0.574025 -2.942356 endloop endfacet facet normal -0.035692 0.142500 0.989151 outer loop vertex 0.114183 -0.574025 -2.942356 vertex 0.169898 -0.560070 -2.942356 vertex 0.085361 -0.281390 -2.985554 endloop endfacet facet normal -0.228807 0.913452 0.336531 outer loop vertex 0.804567 -2.652294 -1.148051 vertex 0.540723 -2.718383 -1.148051 vertex 0.560072 -2.815660 -0.870855 endloop endfacet facet normal -0.228809 0.913452 0.336529 outer loop vertex 0.560072 -2.815660 -0.870855 vertex 0.833358 -2.747205 -0.870855 vertex 0.804567 -2.652294 -1.148051 endloop endfacet facet normal -0.180135 0.719133 -0.671117 outer loop vertex 0.673183 -2.219176 1.903180 vertex 0.452424 -2.274474 1.903180 vertex 0.413852 -2.080560 2.121321 endloop endfacet facet normal -0.180132 0.719136 -0.671115 outer loop vertex 0.413852 -2.080560 2.121321 vertex 0.615789 -2.029978 2.121321 vertex 0.673183 -2.219176 1.903180 endloop endfacet facet normal -0.081943 0.327142 0.941416 outer loop vertex 0.252798 -0.833356 -2.870821 vertex 0.169898 -0.854121 -2.870821 vertex 0.223976 -1.125991 -2.771639 endloop endfacet facet normal -0.081944 0.327142 0.941416 outer loop vertex 0.223976 -1.125991 -2.771639 vertex 0.333264 -1.098616 -2.771639 vertex 0.252798 -0.833356 -2.870821 endloop endfacet facet normal -0.240355 0.959557 0.146561 outer loop vertex 0.854123 -2.815660 -0.585272 vertex 0.574027 -2.885820 -0.585272 vertex 0.582456 -2.928189 -0.294052 endloop endfacet facet normal -0.240359 0.959557 0.146557 outer loop vertex 0.582456 -2.928189 -0.294052 vertex 0.866664 -2.856998 -0.294052 vertex 0.854123 -2.815660 -0.585272 endloop endfacet facet normal -0.144855 0.578296 -0.802864 outer loop vertex 0.552467 -1.821231 2.319032 vertex 0.371295 -1.866612 2.319032 vertex 0.325162 -1.634687 2.494409 endloop endfacet facet normal -0.144857 0.578295 -0.802865 outer loop vertex 0.325162 -1.634687 2.494409 vertex 0.483823 -1.594944 2.494409 vertex 0.552467 -1.821231 2.319032 endloop endfacet facet normal -0.125026 0.499135 0.857457 outer loop vertex 0.410520 -1.353296 -2.645764 vertex 0.275897 -1.387017 -2.645764 vertex 0.325161 -1.634686 -2.494410 endloop endfacet facet normal -0.125028 0.499136 0.857457 outer loop vertex 0.325161 -1.634686 -2.494410 vertex 0.483823 -1.594943 -2.494410 vertex 0.410520 -1.353296 -2.645764 endloop endfacet facet normal -0.103992 0.415152 -0.903789 outer loop vertex 0.410521 -1.353297 2.645763 vertex 0.275898 -1.387019 2.645763 vertex 0.223976 -1.125992 2.771639 endloop endfacet facet normal -0.103990 0.415154 -0.903788 outer loop vertex 0.223976 -1.125992 2.771639 vertex 0.333264 -1.098617 2.771639 vertex 0.410521 -1.353297 2.645763 endloop endfacet facet normal -0.242689 0.968865 -0.049011 outer loop vertex 0.870857 -2.870823 -0.000001 vertex 0.585274 -2.942358 -0.000001 vertex 0.582456 -2.928189 0.294051 endloop endfacet facet normal -0.242690 0.968865 -0.049012 outer loop vertex 0.582456 -2.928189 0.294051 vertex 0.866664 -2.856998 0.294051 vertex 0.870857 -2.870823 -0.000001 endloop endfacet facet normal -0.087476 0.589710 0.802864 outer loop vertex 0.325161 -1.634686 -2.494410 vertex 0.163368 -1.658686 -2.494410 vertex 0.186547 -1.894016 -2.319033 endloop endfacet facet normal -0.087476 0.589710 0.802864 outer loop vertex 0.186547 -1.894016 -2.319033 vertex 0.371294 -1.866611 -2.319033 vertex 0.325161 -1.634686 -2.494410 endloop endfacet facet normal -0.049487 0.333598 -0.941416 outer loop vertex 0.223976 -1.125992 2.771639 vertex 0.112531 -1.142524 2.771639 vertex 0.085361 -0.866663 2.870821 endloop endfacet facet normal -0.049485 0.333599 -0.941415 outer loop vertex 0.085361 -0.866663 2.870821 vertex 0.169898 -0.854123 2.870821 vertex 0.223976 -1.125992 2.771639 endloop endfacet facet normal -0.145145 0.978496 -0.146557 outer loop vertex 0.582456 -2.928189 0.294051 vertex 0.292638 -2.971179 0.294051 vertex 0.288403 -2.928189 0.585271 endloop endfacet facet normal -0.145149 0.978495 -0.146561 outer loop vertex 0.288403 -2.928189 0.585271 vertex 0.574027 -2.885820 0.585271 vertex 0.582456 -2.928189 0.294051 endloop endfacet facet normal -0.108779 0.733327 0.671118 outer loop vertex 0.413851 -2.080559 -2.121322 vertex 0.207928 -2.111105 -2.121322 vertex 0.227308 -2.307866 -1.903181 endloop endfacet facet normal -0.108780 0.733327 0.671118 outer loop vertex 0.227308 -2.307866 -1.903181 vertex 0.452424 -2.274473 -1.903181 vertex 0.413851 -2.080559 -2.121322 endloop endfacet facet normal -0.021556 0.145312 -0.989151 outer loop vertex 0.114183 -0.574027 2.942356 vertex 0.057369 -0.582455 2.942356 vertex 0.028825 -0.292638 2.985554 endloop endfacet facet normal -0.021555 0.145313 -0.989151 outer loop vertex 0.028825 -0.292638 2.985554 vertex 0.057369 -0.288404 2.985554 vertex 0.114183 -0.574027 2.942356 endloop endfacet facet normal -0.138174 0.931478 -0.336536 outer loop vertex 0.560072 -2.815660 0.870853 vertex 0.281392 -2.856999 0.870853 vertex 0.271670 -2.758292 1.148050 endloop endfacet facet normal -0.138172 0.931479 -0.336534 outer loop vertex 0.271670 -2.758292 1.148050 vertex 0.540722 -2.718382 1.148050 vertex 0.560072 -2.815660 0.870853 endloop endfacet facet normal -0.125894 0.848716 0.513646 outer loop vertex 0.486638 -2.446481 -1.666712 vertex 0.244497 -2.482399 -1.666712 vertex 0.259332 -2.633025 -1.414191 endloop endfacet facet normal -0.125893 0.848716 0.513647 outer loop vertex 0.259332 -2.633025 -1.414191 vertex 0.516165 -2.594928 -1.414191 vertex 0.486638 -2.446481 -1.666712 endloop endfacet facet normal -0.125893 0.848716 -0.513646 outer loop vertex 0.516165 -2.594928 1.414190 vertex 0.259333 -2.633025 1.414190 vertex 0.244497 -2.482399 1.666711 endloop endfacet facet normal -0.125895 0.848715 -0.513647 outer loop vertex 0.244497 -2.482399 1.666711 vertex 0.486637 -2.446481 1.666711 vertex 0.516165 -2.594928 1.414190 endloop endfacet facet normal -0.021554 0.145312 0.989151 outer loop vertex 0.057369 -0.288401 -2.985554 vertex 0.028824 -0.292635 -2.985554 vertex 0.057369 -0.582453 -2.942356 endloop endfacet facet normal -0.021556 0.145312 0.989151 outer loop vertex 0.057369 -0.582453 -2.942356 vertex 0.114183 -0.574025 -2.942356 vertex 0.057369 -0.288401 -2.985554 endloop endfacet facet normal -0.138171 0.931480 0.336531 outer loop vertex 0.540723 -2.718383 -1.148051 vertex 0.271671 -2.758293 -1.148051 vertex 0.281392 -2.856998 -0.870855 endloop endfacet facet normal -0.138171 0.931480 0.336531 outer loop vertex 0.281392 -2.856998 -0.870855 vertex 0.560072 -2.815660 -0.870855 vertex 0.540723 -2.718383 -1.148051 endloop endfacet facet normal -0.108780 0.733326 -0.671118 outer loop vertex 0.452424 -2.274474 1.903180 vertex 0.227308 -2.307867 1.903180 vertex 0.207928 -2.111106 2.121321 endloop endfacet facet normal -0.108779 0.733327 -0.671117 outer loop vertex 0.207928 -2.111106 2.121321 vertex 0.413852 -2.080560 2.121321 vertex 0.452424 -2.274474 1.903180 endloop endfacet facet normal -0.049485 0.333599 0.941415 outer loop vertex 0.169898 -0.854121 -2.870821 vertex 0.085361 -0.866661 -2.870821 vertex 0.112531 -1.142522 -2.771639 endloop endfacet facet normal -0.049484 0.333598 0.941416 outer loop vertex 0.112531 -1.142522 -2.771639 vertex 0.223976 -1.125991 -2.771639 vertex 0.169898 -0.854121 -2.870821 endloop endfacet facet normal -0.145146 0.978495 0.146560 outer loop vertex 0.574027 -2.885820 -0.585272 vertex 0.288403 -2.928188 -0.585272 vertex 0.292638 -2.971179 -0.294052 endloop endfacet facet normal -0.145144 0.978495 0.146561 outer loop vertex 0.292638 -2.971179 -0.294052 vertex 0.582456 -2.928189 -0.294052 vertex 0.574027 -2.885820 -0.585272 endloop endfacet facet normal -0.087476 0.589710 -0.802864 outer loop vertex 0.371295 -1.866612 2.319032 vertex 0.186547 -1.894017 2.319032 vertex 0.163369 -1.658687 2.494409 endloop endfacet facet normal -0.087476 0.589710 -0.802864 outer loop vertex 0.163369 -1.658687 2.494409 vertex 0.325162 -1.634687 2.494409 vertex 0.371295 -1.866612 2.319032 endloop endfacet facet normal -0.075503 0.508986 0.857457 outer loop vertex 0.275897 -1.387017 -2.645764 vertex 0.138617 -1.407381 -2.645764 vertex 0.163368 -1.658686 -2.494410 endloop endfacet facet normal -0.075502 0.508986 0.857457 outer loop vertex 0.163368 -1.658686 -2.494410 vertex 0.325161 -1.634686 -2.494410 vertex 0.275897 -1.387017 -2.645764 endloop endfacet facet normal -0.062796 0.423349 -0.903788 outer loop vertex 0.275898 -1.387019 2.645763 vertex 0.138617 -1.407382 2.645763 vertex 0.112531 -1.142524 2.771639 endloop endfacet facet normal -0.062800 0.423346 -0.903789 outer loop vertex 0.112531 -1.142524 2.771639 vertex 0.223976 -1.125992 2.771639 vertex 0.275898 -1.387019 2.645763 endloop endfacet facet normal -0.146552 0.987988 -0.049011 outer loop vertex 0.585274 -2.942358 -0.000001 vertex 0.294054 -2.985556 -0.000001 vertex 0.292638 -2.971179 0.294051 endloop endfacet facet normal -0.146553 0.987988 -0.049011 outer loop vertex 0.292638 -2.971179 0.294051 vertex 0.582456 -2.928189 0.294051 vertex 0.585274 -2.942358 -0.000001 endloop endfacet facet normal -0.098605 0.664732 0.740546 outer loop vertex 0.371294 -1.866611 -2.319033 vertex 0.186547 -1.894016 -2.319033 vertex 0.207928 -2.111105 -2.121322 endloop endfacet facet normal -0.098604 0.664731 0.740547 outer loop vertex 0.207928 -2.111105 -2.121322 vertex 0.413851 -2.080559 -2.121322 vertex 0.371294 -1.866611 -2.319033 endloop endfacet facet normal -0.035693 0.240624 -0.969962 outer loop vertex 0.169898 -0.854123 2.870821 vertex 0.085361 -0.866663 2.870821 vertex 0.057369 -0.582455 2.942356 endloop endfacet facet normal -0.035695 0.240623 -0.969962 outer loop vertex 0.057369 -0.582455 2.942356 vertex 0.114183 -0.574027 2.942356 vertex 0.169898 -0.854123 2.870821 endloop endfacet facet normal -0.142346 0.959600 -0.242704 outer loop vertex 0.574027 -2.885820 0.585271 vertex 0.288403 -2.928189 0.585271 vertex 0.281392 -2.856999 0.870853 endloop endfacet facet normal -0.142345 0.959600 -0.242704 outer loop vertex 0.281392 -2.856999 0.870853 vertex 0.560072 -2.815660 0.870853 vertex 0.574027 -2.885820 0.585271 endloop endfacet facet normal -0.117907 0.794854 0.595236 outer loop vertex 0.452424 -2.274473 -1.903181 vertex 0.227308 -2.307866 -1.903181 vertex 0.244497 -2.482399 -1.666712 endloop endfacet facet normal -0.117905 0.794853 0.595237 outer loop vertex 0.244497 -2.482399 -1.666712 vertex 0.486638 -2.446481 -1.666712 vertex 0.452424 -2.274473 -1.903181 endloop endfacet facet normal -0.132672 0.894404 -0.427129 outer loop vertex 0.540722 -2.718382 1.148050 vertex 0.271670 -2.758292 1.148050 vertex 0.259333 -2.633025 1.414190 endloop endfacet facet normal -0.132671 0.894405 -0.427128 outer loop vertex 0.259333 -2.633025 1.414190 vertex 0.516165 -2.594928 1.414190 vertex 0.540722 -2.718382 1.148050 endloop endfacet facet normal -0.132670 0.894403 0.427133 outer loop vertex 0.516165 -2.594928 -1.414191 vertex 0.259332 -2.633025 -1.414191 vertex 0.271671 -2.758293 -1.148051 endloop endfacet facet normal -0.132671 0.894403 0.427131 outer loop vertex 0.271671 -2.758293 -1.148051 vertex 0.540723 -2.718383 -1.148051 vertex 0.516165 -2.594928 -1.414191 endloop endfacet facet normal -0.117905 0.794855 -0.595234 outer loop vertex 0.486637 -2.446481 1.666711 vertex 0.244497 -2.482399 1.666711 vertex 0.227308 -2.307867 1.903180 endloop endfacet facet normal -0.117907 0.794855 -0.595235 outer loop vertex 0.227308 -2.307867 1.903180 vertex 0.452424 -2.274474 1.903180 vertex 0.486637 -2.446481 1.666711 endloop endfacet facet normal -0.035695 0.240624 0.969962 outer loop vertex 0.114183 -0.574025 -2.942356 vertex 0.057369 -0.582453 -2.942356 vertex 0.085361 -0.866661 -2.870821 endloop endfacet facet normal -0.035693 0.240623 0.969962 outer loop vertex 0.085361 -0.866661 -2.870821 vertex 0.169898 -0.854121 -2.870821 vertex 0.114183 -0.574025 -2.942356 endloop endfacet facet normal -0.142342 0.959601 0.242704 outer loop vertex 0.560072 -2.815660 -0.870855 vertex 0.281392 -2.856998 -0.870855 vertex 0.288403 -2.928188 -0.585272 endloop endfacet facet normal -0.142343 0.959601 0.242703 outer loop vertex 0.288403 -2.928188 -0.585272 vertex 0.574027 -2.885820 -0.585272 vertex 0.560072 -2.815660 -0.870855 endloop endfacet facet normal -0.098604 0.664732 -0.740546 outer loop vertex 0.413852 -2.080560 2.121321 vertex 0.207928 -2.111106 2.121321 vertex 0.186547 -1.894017 2.319032 endloop endfacet facet normal -0.098604 0.664731 -0.740547 outer loop vertex 0.186547 -1.894017 2.319032 vertex 0.371295 -1.866612 2.319032 vertex 0.413852 -2.080560 2.121321 endloop endfacet facet normal -0.062796 0.423344 0.903790 outer loop vertex 0.223976 -1.125991 -2.771639 vertex 0.112531 -1.142522 -2.771639 vertex 0.138617 -1.407381 -2.645764 endloop endfacet facet normal -0.062799 0.423345 0.903790 outer loop vertex 0.138617 -1.407381 -2.645764 vertex 0.275897 -1.387017 -2.645764 vertex 0.223976 -1.125991 -2.771639 endloop endfacet facet normal -0.146553 0.987988 0.049011 outer loop vertex 0.582456 -2.928189 -0.294052 vertex 0.292638 -2.971179 -0.294052 vertex 0.294054 -2.985556 -0.000001 endloop endfacet facet normal -0.146552 0.987988 0.049011 outer loop vertex 0.294054 -2.985556 -0.000001 vertex 0.585274 -2.942358 -0.000001 vertex 0.582456 -2.928189 -0.294052 endloop endfacet facet normal -0.075502 0.508986 -0.857457 outer loop vertex 0.325162 -1.634687 2.494409 vertex 0.163369 -1.658687 2.494409 vertex 0.138617 -1.407382 2.645763 endloop endfacet facet normal -0.075498 0.508988 -0.857456 outer loop vertex 0.138617 -1.407382 2.645763 vertex 0.275898 -1.387019 2.645763 vertex 0.325162 -1.634687 2.494409 endloop endfacet facet normal -0.025249 0.513937 0.857456 outer loop vertex 0.138617 -1.407381 -2.645764 vertex 0.000002 -1.414191 -2.645764 vertex 0.000002 -1.666711 -2.494410 endloop endfacet facet normal -0.025246 0.513936 0.857457 outer loop vertex 0.000002 -1.666711 -2.494410 vertex 0.163368 -1.658686 -2.494410 vertex 0.138617 -1.407381 -2.645764 endloop endfacet facet normal -0.021001 0.427465 -0.903788 outer loop vertex 0.138617 -1.407382 2.645763 vertex 0.000002 -1.414192 2.645763 vertex 0.000003 -1.148052 2.771639 endloop endfacet facet normal -0.020999 0.427465 -0.903788 outer loop vertex 0.000003 -1.148052 2.771639 vertex 0.112531 -1.142524 2.771639 vertex 0.138617 -1.407382 2.645763 endloop endfacet facet normal -0.049009 0.997595 -0.049009 outer loop vertex 0.294054 -2.985556 -0.000001 vertex 0.000002 -3.000002 -0.000001 vertex 0.000003 -2.985556 0.294051 endloop endfacet facet normal -0.049011 0.997595 -0.049011 outer loop vertex 0.000003 -2.985556 0.294051 vertex 0.292638 -2.971179 0.294051 vertex 0.294054 -2.985556 -0.000001 endloop endfacet facet normal -0.032972 0.671195 0.740548 outer loop vertex 0.186547 -1.894016 -2.319033 vertex 0.000002 -1.903180 -2.319033 vertex 0.000002 -2.121320 -2.121322 endloop endfacet facet normal -0.032975 0.671196 0.740546 outer loop vertex 0.000002 -2.121320 -2.121322 vertex 0.207928 -2.111105 -2.121322 vertex 0.186547 -1.894016 -2.319033 endloop endfacet facet normal -0.011935 0.242964 -0.969962 outer loop vertex 0.085361 -0.866663 2.870821 vertex 0.000002 -0.870856 2.870821 vertex 0.000002 -0.585273 2.942356 endloop endfacet facet normal -0.011935 0.242964 -0.969962 outer loop vertex 0.000002 -0.585273 2.942356 vertex 0.057369 -0.582455 2.942356 vertex 0.085361 -0.866663 2.870821 endloop endfacet facet normal -0.047600 0.968931 -0.242706 outer loop vertex 0.288403 -2.928189 0.585271 vertex 0.000002 -2.942357 0.585271 vertex 0.000002 -2.870822 0.870853 endloop endfacet facet normal -0.047598 0.968932 -0.242705 outer loop vertex 0.000002 -2.870822 0.870853 vertex 0.281392 -2.856999 0.870853 vertex 0.288403 -2.928189 0.585271 endloop endfacet facet normal -0.039429 0.802583 0.595236 outer loop vertex 0.227308 -2.307866 -1.903181 vertex 0.000003 -2.319033 -1.903181 vertex 0.000002 -2.494410 -1.666712 endloop endfacet facet normal -0.039428 0.802583 0.595236 outer loop vertex 0.000002 -2.494410 -1.666712 vertex 0.244497 -2.482399 -1.666712 vertex 0.227308 -2.307866 -1.903181 endloop endfacet facet normal -0.044366 0.903102 -0.427128 outer loop vertex 0.271670 -2.758292 1.148050 vertex 0.000002 -2.771638 1.148050 vertex 0.000002 -2.645765 1.414190 endloop endfacet facet normal -0.044367 0.903102 -0.427129 outer loop vertex 0.000002 -2.645765 1.414190 vertex 0.259333 -2.633025 1.414190 vertex 0.271670 -2.758292 1.148050 endloop endfacet facet normal -0.044367 0.903099 0.427135 outer loop vertex 0.259332 -2.633025 -1.414191 vertex 0.000002 -2.645765 -1.414191 vertex 0.000003 -2.771640 -1.148051 endloop endfacet facet normal -0.044370 0.903100 0.427132 outer loop vertex 0.000003 -2.771640 -1.148051 vertex 0.271671 -2.758293 -1.148051 vertex 0.259332 -2.633025 -1.414191 endloop endfacet facet normal -0.039428 0.802584 -0.595236 outer loop vertex 0.244497 -2.482399 1.666711 vertex 0.000002 -2.494410 1.666711 vertex 0.000003 -2.319033 1.903180 endloop endfacet facet normal -0.039425 0.802585 -0.595234 outer loop vertex 0.000003 -2.319033 1.903180 vertex 0.227308 -2.307867 1.903180 vertex 0.244497 -2.482399 1.666711 endloop endfacet facet normal -0.011935 0.242964 0.969962 outer loop vertex 0.057369 -0.582453 -2.942356 vertex 0.000002 -0.585271 -2.942356 vertex 0.000003 -0.870854 -2.870821 endloop endfacet facet normal -0.011935 0.242964 0.969962 outer loop vertex 0.000003 -0.870854 -2.870821 vertex 0.085361 -0.866661 -2.870821 vertex 0.057369 -0.582453 -2.942356 endloop endfacet facet normal -0.047601 0.968932 0.242703 outer loop vertex 0.281392 -2.856998 -0.870855 vertex 0.000002 -2.870822 -0.870855 vertex 0.000002 -2.942356 -0.585272 endloop endfacet facet normal -0.047600 0.968932 0.242704 outer loop vertex 0.000002 -2.942356 -0.585272 vertex 0.288403 -2.928188 -0.585272 vertex 0.281392 -2.856998 -0.870855 endloop endfacet facet normal -0.032975 0.671195 -0.740548 outer loop vertex 0.207928 -2.111106 2.121321 vertex 0.000002 -2.121321 2.121321 vertex 0.000002 -1.903181 2.319032 endloop endfacet facet normal -0.032972 0.671196 -0.740546 outer loop vertex 0.000002 -1.903181 2.319032 vertex 0.186547 -1.894017 2.319032 vertex 0.207928 -2.111106 2.121321 endloop endfacet facet normal -0.020999 0.427460 0.903790 outer loop vertex 0.112531 -1.142522 -2.771639 vertex 0.000002 -1.148050 -2.771639 vertex 0.000002 -1.414191 -2.645764 endloop endfacet facet normal -0.021000 0.427460 0.903790 outer loop vertex 0.000002 -1.414191 -2.645764 vertex 0.138617 -1.407381 -2.645764 vertex 0.112531 -1.142522 -2.771639 endloop endfacet facet normal -0.049011 0.997595 0.049009 outer loop vertex 0.292638 -2.971179 -0.294052 vertex 0.000003 -2.985556 -0.294052 vertex 0.000002 -3.000002 -0.000001 endloop endfacet facet normal -0.049009 0.997595 0.049011 outer loop vertex 0.000002 -3.000002 -0.000001 vertex 0.294054 -2.985556 -0.000001 vertex 0.292638 -2.971179 -0.294052 endloop endfacet facet normal -0.025246 0.513937 -0.857457 outer loop vertex 0.163369 -1.658687 2.494409 vertex 0.000002 -1.666712 2.494409 vertex 0.000002 -1.414192 2.645763 endloop endfacet facet normal -0.025249 0.513935 -0.857457 outer loop vertex 0.000002 -1.414192 2.645763 vertex 0.138617 -1.407382 2.645763 vertex 0.163369 -1.658687 2.494409 endloop endfacet facet normal -0.029250 0.595444 0.802864 outer loop vertex 0.163368 -1.658686 -2.494410 vertex 0.000002 -1.666711 -2.494410 vertex 0.000002 -1.903180 -2.319033 endloop endfacet facet normal -0.029251 0.595445 0.802864 outer loop vertex 0.000002 -1.903180 -2.319033 vertex 0.186547 -1.894016 -2.319033 vertex 0.163368 -1.658686 -2.494410 endloop endfacet facet normal -0.016547 0.336842 -0.941416 outer loop vertex 0.112531 -1.142524 2.771639 vertex 0.000003 -1.148052 2.771639 vertex 0.000002 -0.870856 2.870821 endloop endfacet facet normal -0.016546 0.336843 -0.941416 outer loop vertex 0.000002 -0.870856 2.870821 vertex 0.085361 -0.866663 2.870821 vertex 0.112531 -1.142524 2.771639 endloop endfacet facet normal -0.048540 0.988010 -0.146559 outer loop vertex 0.292638 -2.971179 0.294051 vertex 0.000003 -2.985556 0.294051 vertex 0.000002 -2.942357 0.585271 endloop endfacet facet normal -0.048537 0.988011 -0.146556 outer loop vertex 0.000002 -2.942357 0.585271 vertex 0.288403 -2.928189 0.585271 vertex 0.292638 -2.971179 0.294051 endloop endfacet facet normal -0.036377 0.740458 0.671117 outer loop vertex 0.207928 -2.111105 -2.121322 vertex 0.000002 -2.121320 -2.121322 vertex 0.000003 -2.319033 -1.903181 endloop endfacet facet normal -0.036376 0.740458 0.671118 outer loop vertex 0.000003 -2.319033 -1.903181 vertex 0.227308 -2.307866 -1.903181 vertex 0.207928 -2.111105 -2.121322 endloop endfacet facet normal -0.007208 0.146725 -0.989151 outer loop vertex 0.057369 -0.582455 2.942356 vertex 0.000002 -0.585273 2.942356 vertex 0.000002 -0.294054 2.985554 endloop endfacet facet normal -0.007208 0.146725 -0.989151 outer loop vertex 0.000002 -0.294054 2.985554 vertex 0.028825 -0.292638 2.985554 vertex 0.057369 -0.582455 2.942356 endloop endfacet facet normal -0.046203 0.940537 -0.336534 outer loop vertex 0.281392 -2.856999 0.870853 vertex 0.000002 -2.870822 0.870853 vertex 0.000002 -2.771638 1.148050 endloop endfacet facet normal -0.046205 0.940536 -0.336536 outer loop vertex 0.000002 -2.771638 1.148050 vertex 0.271670 -2.758292 1.148050 vertex 0.281392 -2.856999 0.870853 endloop endfacet facet normal -0.042099 0.856969 0.513646 outer loop vertex 0.244497 -2.482399 -1.666712 vertex 0.000002 -2.494410 -1.666712 vertex 0.000002 -2.645765 -1.414191 endloop endfacet facet normal -0.042100 0.856969 0.513646 outer loop vertex 0.000002 -2.645765 -1.414191 vertex 0.259332 -2.633025 -1.414191 vertex 0.244497 -2.482399 -1.666712 endloop endfacet facet normal -0.042100 0.856968 -0.513646 outer loop vertex 0.259333 -2.633025 1.414190 vertex 0.000002 -2.645765 1.414190 vertex 0.000002 -2.494410 1.666711 endloop endfacet facet normal -0.042099 0.856969 -0.513646 outer loop vertex 0.000002 -2.494410 1.666711 vertex 0.244497 -2.482399 1.666711 vertex 0.259333 -2.633025 1.414190 endloop endfacet facet normal -0.007208 0.146725 0.989151 outer loop vertex 0.028824 -0.292635 -2.985554 vertex 0.000002 -0.294051 -2.985554 vertex 0.000002 -0.585271 -2.942356 endloop endfacet facet normal -0.007207 0.146725 0.989151 outer loop vertex 0.000002 -0.585271 -2.942356 vertex 0.057369 -0.582453 -2.942356 vertex 0.028824 -0.292635 -2.985554 endloop endfacet facet normal -0.046209 0.940539 0.336528 outer loop vertex 0.271671 -2.758293 -1.148051 vertex 0.000003 -2.771640 -1.148051 vertex 0.000002 -2.870822 -0.870855 endloop endfacet facet normal -0.046206 0.940538 0.336531 outer loop vertex 0.000002 -2.870822 -0.870855 vertex 0.281392 -2.856998 -0.870855 vertex 0.271671 -2.758293 -1.148051 endloop endfacet facet normal -0.036373 0.740460 -0.671116 outer loop vertex 0.227308 -2.307867 1.903180 vertex 0.000003 -2.319033 1.903180 vertex 0.000002 -2.121321 2.121321 endloop endfacet facet normal -0.036377 0.740458 -0.671118 outer loop vertex 0.000002 -2.121321 2.121321 vertex 0.207928 -2.111106 2.121321 vertex 0.227308 -2.307867 1.903180 endloop endfacet facet normal -0.016547 0.336843 0.941416 outer loop vertex 0.085361 -0.866661 -2.870821 vertex 0.000003 -0.870854 -2.870821 vertex 0.000002 -1.148050 -2.771639 endloop endfacet facet normal -0.016547 0.336843 0.941415 outer loop vertex 0.000002 -1.148050 -2.771639 vertex 0.112531 -1.142522 -2.771639 vertex 0.085361 -0.866661 -2.870821 endloop endfacet facet normal -0.048537 0.988010 0.146562 outer loop vertex 0.288403 -2.928188 -0.585272 vertex 0.000002 -2.942356 -0.585272 vertex 0.000003 -2.985556 -0.294052 endloop endfacet facet normal -0.048540 0.988010 0.146559 outer loop vertex 0.000003 -2.985556 -0.294052 vertex 0.292638 -2.971179 -0.294052 vertex 0.288403 -2.928188 -0.585272 endloop endfacet facet normal -0.029251 0.595444 -0.802864 outer loop vertex 0.186547 -1.894017 2.319032 vertex 0.000002 -1.903181 2.319032 vertex 0.000002 -1.666712 2.494409 endloop endfacet facet normal -0.029250 0.595445 -0.802864 outer loop vertex 0.000002 -1.666712 2.494409 vertex 0.163369 -1.658687 2.494409 vertex 0.186547 -1.894017 2.319032 endloop endfacet facet normal 0.020999 0.427460 0.903790 outer loop vertex 0.000002 -1.148050 -2.771639 vertex -0.112526 -1.142522 -2.771639 vertex -0.138613 -1.407381 -2.645764 endloop endfacet facet normal 0.021000 0.427460 0.903790 outer loop vertex -0.138613 -1.407381 -2.645764 vertex 0.000002 -1.414191 -2.645764 vertex 0.000002 -1.148050 -2.771639 endloop endfacet facet normal 0.049011 0.997595 0.049011 outer loop vertex 0.000003 -2.985556 -0.294052 vertex -0.292633 -2.971179 -0.294052 vertex -0.294049 -2.985556 -0.000001 endloop endfacet facet normal 0.049009 0.997595 0.049010 outer loop vertex -0.294049 -2.985556 -0.000001 vertex 0.000002 -3.000002 -0.000001 vertex 0.000003 -2.985556 -0.294052 endloop endfacet facet normal 0.025246 0.513936 -0.857457 outer loop vertex 0.000002 -1.666712 2.494409 vertex -0.163364 -1.658687 2.494409 vertex -0.138613 -1.407382 2.645763 endloop endfacet facet normal 0.025249 0.513937 -0.857456 outer loop vertex -0.138613 -1.407382 2.645763 vertex 0.000002 -1.414192 2.645763 vertex 0.000002 -1.666712 2.494409 endloop endfacet facet normal 0.029250 0.595445 0.802864 outer loop vertex 0.000002 -1.666711 -2.494410 vertex -0.163364 -1.658686 -2.494410 vertex -0.186542 -1.894016 -2.319033 endloop endfacet facet normal 0.029251 0.595444 0.802864 outer loop vertex -0.186542 -1.894016 -2.319033 vertex 0.000002 -1.903180 -2.319033 vertex 0.000002 -1.666711 -2.494410 endloop endfacet facet normal 0.016550 0.336844 -0.941415 outer loop vertex 0.000003 -1.148052 2.771639 vertex -0.112526 -1.142523 2.771639 vertex -0.085357 -0.866663 2.870821 endloop endfacet facet normal 0.016546 0.336842 -0.941416 outer loop vertex -0.085357 -0.866663 2.870821 vertex 0.000002 -0.870856 2.870821 vertex 0.000003 -1.148052 2.771639 endloop endfacet facet normal 0.048540 0.988011 -0.146556 outer loop vertex 0.000003 -2.985556 0.294051 vertex -0.292633 -2.971179 0.294051 vertex -0.288399 -2.928189 0.585271 endloop endfacet facet normal 0.048537 0.988010 -0.146559 outer loop vertex -0.288399 -2.928189 0.585271 vertex 0.000002 -2.942357 0.585271 vertex 0.000003 -2.985556 0.294051 endloop endfacet facet normal 0.036378 0.740458 0.671118 outer loop vertex 0.000002 -2.121320 -2.121322 vertex -0.207923 -2.111105 -2.121322 vertex -0.227302 -2.307866 -1.903181 endloop endfacet facet normal 0.036376 0.740458 0.671117 outer loop vertex -0.227302 -2.307866 -1.903181 vertex 0.000003 -2.319033 -1.903181 vertex 0.000002 -2.121320 -2.121322 endloop endfacet facet normal 0.007208 0.146725 -0.989151 outer loop vertex 0.000002 -0.585273 2.942356 vertex -0.057364 -0.582455 2.942356 vertex -0.028820 -0.292638 2.985554 endloop endfacet facet normal 0.007208 0.146725 -0.989151 outer loop vertex -0.028820 -0.292638 2.985554 vertex 0.000002 -0.294054 2.985554 vertex 0.000002 -0.585273 2.942356 endloop endfacet facet normal 0.046203 0.940536 -0.336536 outer loop vertex 0.000002 -2.870822 0.870853 vertex -0.281388 -2.856999 0.870853 vertex -0.271666 -2.758292 1.148050 endloop endfacet facet normal 0.046205 0.940537 -0.336534 outer loop vertex -0.271666 -2.758292 1.148050 vertex 0.000002 -2.771638 1.148050 vertex 0.000002 -2.870822 0.870853 endloop endfacet facet normal 0.042099 0.856969 0.513646 outer loop vertex 0.000002 -2.494410 -1.666712 vertex -0.244493 -2.482399 -1.666712 vertex -0.259328 -2.633025 -1.414191 endloop endfacet facet normal 0.042100 0.856969 0.513646 outer loop vertex -0.259328 -2.633025 -1.414191 vertex 0.000002 -2.645765 -1.414191 vertex 0.000002 -2.494410 -1.666712 endloop endfacet facet normal 0.042100 0.856969 -0.513646 outer loop vertex 0.000002 -2.645765 1.414190 vertex -0.259328 -2.633025 1.414190 vertex -0.244493 -2.482399 1.666711 endloop endfacet facet normal 0.042099 0.856968 -0.513646 outer loop vertex -0.244493 -2.482399 1.666711 vertex 0.000002 -2.494410 1.666711 vertex 0.000002 -2.645765 1.414190 endloop endfacet facet normal 0.007208 0.146725 0.989151 outer loop vertex 0.000002 -0.294051 -2.985554 vertex -0.028820 -0.292635 -2.985554 vertex -0.057364 -0.582453 -2.942356 endloop endfacet facet normal 0.007208 0.146725 0.989151 outer loop vertex -0.057364 -0.582453 -2.942356 vertex 0.000002 -0.585271 -2.942356 vertex 0.000002 -0.294051 -2.985554 endloop endfacet facet normal 0.046209 0.940538 0.336531 outer loop vertex 0.000003 -2.771640 -1.148051 vertex -0.271666 -2.758293 -1.148051 vertex -0.281388 -2.856998 -0.870855 endloop endfacet facet normal 0.046206 0.940539 0.336529 outer loop vertex -0.281388 -2.856998 -0.870855 vertex 0.000002 -2.870822 -0.870855 vertex 0.000003 -2.771640 -1.148051 endloop endfacet facet normal 0.036373 0.740458 -0.671118 outer loop vertex 0.000003 -2.319033 1.903180 vertex -0.227302 -2.307867 1.903180 vertex -0.207923 -2.111106 2.121321 endloop endfacet facet normal 0.036378 0.740460 -0.671115 outer loop vertex -0.207923 -2.111106 2.121321 vertex 0.000002 -2.121321 2.121321 vertex 0.000003 -2.319033 1.903180 endloop endfacet facet normal 0.016546 0.336843 0.941415 outer loop vertex 0.000003 -0.870854 -2.870821 vertex -0.085356 -0.866661 -2.870821 vertex -0.112526 -1.142522 -2.771639 endloop endfacet facet normal 0.016547 0.336842 0.941416 outer loop vertex -0.112526 -1.142522 -2.771639 vertex 0.000002 -1.148050 -2.771639 vertex 0.000003 -0.870854 -2.870821 endloop endfacet facet normal 0.048537 0.988010 0.146559 outer loop vertex 0.000002 -2.942356 -0.585272 vertex -0.288399 -2.928188 -0.585272 vertex -0.292633 -2.971179 -0.294052 endloop endfacet facet normal 0.048540 0.988010 0.146562 outer loop vertex -0.292633 -2.971179 -0.294052 vertex 0.000003 -2.985556 -0.294052 vertex 0.000002 -2.942356 -0.585272 endloop endfacet facet normal 0.029251 0.595445 -0.802864 outer loop vertex 0.000002 -1.903181 2.319032 vertex -0.186542 -1.894017 2.319032 vertex -0.163364 -1.658687 2.494409 endloop endfacet facet normal 0.029250 0.595444 -0.802864 outer loop vertex -0.163364 -1.658687 2.494409 vertex 0.000002 -1.666712 2.494409 vertex 0.000002 -1.903181 2.319032 endloop endfacet facet normal 0.025249 0.513936 0.857457 outer loop vertex 0.000002 -1.414191 -2.645764 vertex -0.138613 -1.407381 -2.645764 vertex -0.163364 -1.658686 -2.494410 endloop endfacet facet normal 0.025246 0.513937 0.857456 outer loop vertex -0.163364 -1.658686 -2.494410 vertex 0.000002 -1.666711 -2.494410 vertex 0.000002 -1.414191 -2.645764 endloop endfacet facet normal 0.021001 0.427464 -0.903789 outer loop vertex 0.000002 -1.414192 2.645763 vertex -0.138613 -1.407382 2.645763 vertex -0.112526 -1.142523 2.771639 endloop endfacet facet normal 0.021003 0.427464 -0.903788 outer loop vertex -0.112526 -1.142523 2.771639 vertex 0.000003 -1.148052 2.771639 vertex 0.000002 -1.414192 2.645763 endloop endfacet facet normal 0.049009 0.997595 -0.049011 outer loop vertex 0.000002 -3.000002 -0.000001 vertex -0.294049 -2.985556 -0.000001 vertex -0.292633 -2.971179 0.294051 endloop endfacet facet normal 0.049011 0.997595 -0.049009 outer loop vertex -0.292633 -2.971179 0.294051 vertex 0.000003 -2.985556 0.294051 vertex 0.000002 -3.000002 -0.000001 endloop endfacet facet normal 0.032972 0.671196 0.740546 outer loop vertex 0.000002 -1.903180 -2.319033 vertex -0.186542 -1.894016 -2.319033 vertex -0.207923 -2.111105 -2.121322 endloop endfacet facet normal 0.032975 0.671194 0.740547 outer loop vertex -0.207923 -2.111105 -2.121322 vertex 0.000002 -2.121320 -2.121322 vertex 0.000002 -1.903180 -2.319033 endloop endfacet facet normal 0.011935 0.242964 -0.969962 outer loop vertex 0.000002 -0.870856 2.870821 vertex -0.085357 -0.866663 2.870821 vertex -0.057364 -0.582455 2.942356 endloop endfacet facet normal 0.011935 0.242964 -0.969962 outer loop vertex -0.057364 -0.582455 2.942356 vertex 0.000002 -0.585273 2.942356 vertex 0.000002 -0.870856 2.870821 endloop endfacet facet normal 0.047600 0.968932 -0.242705 outer loop vertex 0.000002 -2.942357 0.585271 vertex -0.288399 -2.928189 0.585271 vertex -0.281388 -2.856999 0.870853 endloop endfacet facet normal 0.047598 0.968931 -0.242707 outer loop vertex -0.281388 -2.856999 0.870853 vertex 0.000002 -2.870822 0.870853 vertex 0.000002 -2.942357 0.585271 endloop endfacet facet normal 0.039428 0.802583 0.595236 outer loop vertex 0.000003 -2.319033 -1.903181 vertex -0.227302 -2.307866 -1.903181 vertex -0.244493 -2.482399 -1.666712 endloop endfacet facet normal 0.039428 0.802583 0.595236 outer loop vertex -0.244493 -2.482399 -1.666712 vertex 0.000002 -2.494410 -1.666712 vertex 0.000003 -2.319033 -1.903181 endloop endfacet facet normal 0.044366 0.903102 -0.427129 outer loop vertex 0.000002 -2.771638 1.148050 vertex -0.271666 -2.758292 1.148050 vertex -0.259328 -2.633025 1.414190 endloop endfacet facet normal 0.044367 0.903102 -0.427128 outer loop vertex -0.259328 -2.633025 1.414190 vertex 0.000002 -2.645765 1.414190 vertex 0.000002 -2.771638 1.148050 endloop endfacet facet normal 0.044367 0.903100 0.427132 outer loop vertex 0.000002 -2.645765 -1.414191 vertex -0.259328 -2.633025 -1.414191 vertex -0.271666 -2.758293 -1.148051 endloop endfacet facet normal 0.044369 0.903099 0.427134 outer loop vertex -0.271666 -2.758293 -1.148051 vertex 0.000003 -2.771640 -1.148051 vertex 0.000002 -2.645765 -1.414191 endloop endfacet facet normal 0.039428 0.802585 -0.595234 outer loop vertex 0.000002 -2.494410 1.666711 vertex -0.244493 -2.482399 1.666711 vertex -0.227302 -2.307867 1.903180 endloop endfacet facet normal 0.039425 0.802583 -0.595236 outer loop vertex -0.227302 -2.307867 1.903180 vertex 0.000003 -2.319033 1.903180 vertex 0.000002 -2.494410 1.666711 endloop endfacet facet normal 0.011935 0.242964 0.969962 outer loop vertex 0.000002 -0.585271 -2.942356 vertex -0.057364 -0.582453 -2.942356 vertex -0.085356 -0.866661 -2.870821 endloop endfacet facet normal 0.011935 0.242964 0.969962 outer loop vertex -0.085356 -0.866661 -2.870821 vertex 0.000003 -0.870854 -2.870821 vertex 0.000002 -0.585271 -2.942356 endloop endfacet facet normal 0.047601 0.968932 0.242704 outer loop vertex 0.000002 -2.870822 -0.870855 vertex -0.281388 -2.856998 -0.870855 vertex -0.288399 -2.928188 -0.585272 endloop endfacet facet normal 0.047600 0.968932 0.242703 outer loop vertex -0.288399 -2.928188 -0.585272 vertex 0.000002 -2.942356 -0.585272 vertex 0.000002 -2.870822 -0.870855 endloop endfacet facet normal 0.032975 0.671196 -0.740547 outer loop vertex 0.000002 -2.121321 2.121321 vertex -0.207923 -2.111106 2.121321 vertex -0.186542 -1.894017 2.319032 endloop endfacet facet normal 0.032972 0.671195 -0.740547 outer loop vertex -0.186542 -1.894017 2.319032 vertex 0.000002 -1.903181 2.319032 vertex 0.000002 -2.121321 2.121321 endloop endfacet facet normal 0.049485 0.333598 0.941416 outer loop vertex -0.085356 -0.866661 -2.870821 vertex -0.169893 -0.854121 -2.870821 vertex -0.223971 -1.125991 -2.771639 endloop endfacet facet normal 0.049484 0.333599 0.941415 outer loop vertex -0.223971 -1.125991 -2.771639 vertex -0.112526 -1.142522 -2.771639 vertex -0.085356 -0.866661 -2.870821 endloop endfacet facet normal 0.145146 0.978495 0.146560 outer loop vertex -0.288399 -2.928188 -0.585272 vertex -0.574023 -2.885820 -0.585272 vertex -0.582450 -2.928189 -0.294052 endloop endfacet facet normal 0.145145 0.978495 0.146559 outer loop vertex -0.582450 -2.928189 -0.294052 vertex -0.292633 -2.971179 -0.294052 vertex -0.288399 -2.928188 -0.585272 endloop endfacet facet normal 0.087476 0.589710 -0.802864 outer loop vertex -0.186542 -1.894017 2.319032 vertex -0.371290 -1.866612 2.319032 vertex -0.325157 -1.634687 2.494409 endloop endfacet facet normal 0.087476 0.589710 -0.802864 outer loop vertex -0.325157 -1.634687 2.494409 vertex -0.163364 -1.658687 2.494409 vertex -0.186542 -1.894017 2.319032 endloop endfacet facet normal 0.075503 0.508986 0.857457 outer loop vertex -0.138613 -1.407381 -2.645764 vertex -0.275893 -1.387017 -2.645764 vertex -0.325157 -1.634686 -2.494410 endloop endfacet facet normal 0.075502 0.508986 0.857457 outer loop vertex -0.325157 -1.634686 -2.494410 vertex -0.163364 -1.658686 -2.494410 vertex -0.138613 -1.407381 -2.645764 endloop endfacet facet normal 0.062796 0.423347 -0.903789 outer loop vertex -0.138613 -1.407382 2.645763 vertex -0.275893 -1.387019 2.645763 vertex -0.223971 -1.125992 2.771639 endloop endfacet facet normal 0.062797 0.423347 -0.903789 outer loop vertex -0.223971 -1.125992 2.771639 vertex -0.112526 -1.142523 2.771639 vertex -0.138613 -1.407382 2.645763 endloop endfacet facet normal 0.146552 0.987988 -0.049011 outer loop vertex -0.294049 -2.985556 -0.000001 vertex -0.585269 -2.942358 -0.000001 vertex -0.582450 -2.928189 0.294051 endloop endfacet facet normal 0.146553 0.987988 -0.049011 outer loop vertex -0.582450 -2.928189 0.294051 vertex -0.292633 -2.971179 0.294051 vertex -0.294049 -2.985556 -0.000001 endloop endfacet facet normal 0.098604 0.664731 0.740547 outer loop vertex -0.186542 -1.894016 -2.319033 vertex -0.371290 -1.866611 -2.319033 vertex -0.413847 -2.080559 -2.121322 endloop endfacet facet normal 0.098604 0.664732 0.740546 outer loop vertex -0.413847 -2.080559 -2.121322 vertex -0.207923 -2.111105 -2.121322 vertex -0.186542 -1.894016 -2.319033 endloop endfacet facet normal 0.035694 0.240624 -0.969962 outer loop vertex -0.085357 -0.866663 2.870821 vertex -0.169893 -0.854123 2.870821 vertex -0.114179 -0.574027 2.942356 endloop endfacet facet normal 0.035694 0.240624 -0.969962 outer loop vertex -0.114179 -0.574027 2.942356 vertex -0.057364 -0.582455 2.942356 vertex -0.085357 -0.866663 2.870821 endloop endfacet facet normal 0.142346 0.959600 -0.242704 outer loop vertex -0.288399 -2.928189 0.585271 vertex -0.574023 -2.885820 0.585271 vertex -0.560067 -2.815660 0.870853 endloop endfacet facet normal 0.142346 0.959600 -0.242704 outer loop vertex -0.560067 -2.815660 0.870853 vertex -0.281388 -2.856999 0.870853 vertex -0.288399 -2.928189 0.585271 endloop endfacet facet normal 0.117906 0.794852 0.595238 outer loop vertex -0.227302 -2.307866 -1.903181 vertex -0.452418 -2.274473 -1.903181 vertex -0.486633 -2.446481 -1.666712 endloop endfacet facet normal 0.117905 0.794853 0.595237 outer loop vertex -0.486633 -2.446481 -1.666712 vertex -0.244493 -2.482399 -1.666712 vertex -0.227302 -2.307866 -1.903181 endloop endfacet facet normal 0.132673 0.894405 -0.427127 outer loop vertex -0.271666 -2.758292 1.148050 vertex -0.540717 -2.718382 1.148050 vertex -0.516161 -2.594928 1.414190 endloop endfacet facet normal 0.132670 0.894404 -0.427129 outer loop vertex -0.516161 -2.594928 1.414190 vertex -0.259328 -2.633025 1.414190 vertex -0.271666 -2.758292 1.148050 endloop endfacet facet normal 0.132673 0.894402 0.427133 outer loop vertex -0.259328 -2.633025 -1.414191 vertex -0.516161 -2.594927 -1.414191 vertex -0.540717 -2.718383 -1.148051 endloop endfacet facet normal 0.132672 0.894403 0.427132 outer loop vertex -0.540717 -2.718383 -1.148051 vertex -0.271666 -2.758293 -1.148051 vertex -0.259328 -2.633025 -1.414191 endloop endfacet facet normal 0.117905 0.794854 -0.595235 outer loop vertex -0.244493 -2.482399 1.666711 vertex -0.486633 -2.446481 1.666711 vertex -0.452418 -2.274474 1.903180 endloop endfacet facet normal 0.117907 0.794855 -0.595234 outer loop vertex -0.452418 -2.274474 1.903180 vertex -0.227302 -2.307867 1.903180 vertex -0.244493 -2.482399 1.666711 endloop endfacet facet normal 0.035695 0.240623 0.969962 outer loop vertex -0.057364 -0.582453 -2.942356 vertex -0.114178 -0.574025 -2.942356 vertex -0.169893 -0.854121 -2.870821 endloop endfacet facet normal 0.035693 0.240624 0.969962 outer loop vertex -0.169893 -0.854121 -2.870821 vertex -0.085356 -0.866661 -2.870821 vertex -0.057364 -0.582453 -2.942356 endloop endfacet facet normal 0.142342 0.959601 0.242703 outer loop vertex -0.281388 -2.856998 -0.870855 vertex -0.560068 -2.815660 -0.870855 vertex -0.574023 -2.885820 -0.585272 endloop endfacet facet normal 0.142343 0.959601 0.242704 outer loop vertex -0.574023 -2.885820 -0.585272 vertex -0.288399 -2.928188 -0.585272 vertex -0.281388 -2.856998 -0.870855 endloop endfacet facet normal 0.098604 0.664731 -0.740547 outer loop vertex -0.207923 -2.111106 2.121321 vertex -0.413847 -2.080560 2.121321 vertex -0.371290 -1.866612 2.319032 endloop endfacet facet normal 0.098605 0.664732 -0.740546 outer loop vertex -0.371290 -1.866612 2.319032 vertex -0.186542 -1.894017 2.319032 vertex -0.207923 -2.111106 2.121321 endloop endfacet facet normal 0.062796 0.423345 0.903790 outer loop vertex -0.112526 -1.142522 -2.771639 vertex -0.223971 -1.125991 -2.771639 vertex -0.275893 -1.387017 -2.645764 endloop endfacet facet normal 0.062799 0.423343 0.903790 outer loop vertex -0.275893 -1.387017 -2.645764 vertex -0.138613 -1.407381 -2.645764 vertex -0.112526 -1.142522 -2.771639 endloop endfacet facet normal 0.146553 0.987988 0.049012 outer loop vertex -0.292633 -2.971179 -0.294052 vertex -0.582450 -2.928189 -0.294052 vertex -0.585269 -2.942358 -0.000001 endloop endfacet facet normal 0.146552 0.987988 0.049011 outer loop vertex -0.585269 -2.942358 -0.000001 vertex -0.294049 -2.985556 -0.000001 vertex -0.292633 -2.971179 -0.294052 endloop endfacet facet normal 0.075502 0.508987 -0.857456 outer loop vertex -0.163364 -1.658687 2.494409 vertex -0.325157 -1.634687 2.494409 vertex -0.275893 -1.387019 2.645763 endloop endfacet facet normal 0.075499 0.508986 -0.857457 outer loop vertex -0.275893 -1.387019 2.645763 vertex -0.138613 -1.407382 2.645763 vertex -0.163364 -1.658687 2.494409 endloop endfacet facet normal 0.087476 0.589710 0.802864 outer loop vertex -0.163364 -1.658686 -2.494410 vertex -0.325157 -1.634686 -2.494410 vertex -0.371290 -1.866611 -2.319033 endloop endfacet facet normal 0.087476 0.589710 0.802864 outer loop vertex -0.371290 -1.866611 -2.319033 vertex -0.186542 -1.894016 -2.319033 vertex -0.163364 -1.658686 -2.494410 endloop endfacet facet normal 0.049484 0.333600 -0.941415 outer loop vertex -0.112526 -1.142523 2.771639 vertex -0.223971 -1.125992 2.771639 vertex -0.169893 -0.854123 2.870821 endloop endfacet facet normal 0.049486 0.333600 -0.941415 outer loop vertex -0.169893 -0.854123 2.870821 vertex -0.085357 -0.866663 2.870821 vertex -0.112526 -1.142523 2.771639 endloop endfacet facet normal 0.145145 0.978495 -0.146560 outer loop vertex -0.292633 -2.971179 0.294051 vertex -0.582450 -2.928189 0.294051 vertex -0.574023 -2.885820 0.585271 endloop endfacet facet normal 0.145149 0.978495 -0.146556 outer loop vertex -0.574023 -2.885820 0.585271 vertex -0.288399 -2.928189 0.585271 vertex -0.292633 -2.971179 0.294051 endloop endfacet facet normal 0.108779 0.733327 0.671117 outer loop vertex -0.207923 -2.111105 -2.121322 vertex -0.413847 -2.080559 -2.121322 vertex -0.452418 -2.274473 -1.903181 endloop endfacet facet normal 0.108780 0.733327 0.671118 outer loop vertex -0.452418 -2.274473 -1.903181 vertex -0.227302 -2.307866 -1.903181 vertex -0.207923 -2.111105 -2.121322 endloop endfacet facet normal 0.021556 0.145312 -0.989151 outer loop vertex -0.057364 -0.582455 2.942356 vertex -0.114179 -0.574027 2.942356 vertex -0.057365 -0.288404 2.985554 endloop endfacet facet normal 0.021554 0.145312 -0.989151 outer loop vertex -0.057365 -0.288404 2.985554 vertex -0.028820 -0.292638 2.985554 vertex -0.057364 -0.582455 2.942356 endloop endfacet facet normal 0.138175 0.931479 -0.336534 outer loop vertex -0.281388 -2.856999 0.870853 vertex -0.560067 -2.815660 0.870853 vertex -0.540717 -2.718382 1.148050 endloop endfacet facet normal 0.138172 0.931478 -0.336536 outer loop vertex -0.540717 -2.718382 1.148050 vertex -0.271666 -2.758292 1.148050 vertex -0.281388 -2.856999 0.870853 endloop endfacet facet normal 0.125895 0.848716 0.513645 outer loop vertex -0.244493 -2.482399 -1.666712 vertex -0.486633 -2.446481 -1.666712 vertex -0.516161 -2.594927 -1.414191 endloop endfacet facet normal 0.125896 0.848716 0.513645 outer loop vertex -0.516161 -2.594927 -1.414191 vertex -0.259328 -2.633025 -1.414191 vertex -0.244493 -2.482399 -1.666712 endloop endfacet facet normal 0.125893 0.848715 -0.513647 outer loop vertex -0.259328 -2.633025 1.414190 vertex -0.516161 -2.594928 1.414190 vertex -0.486633 -2.446481 1.666711 endloop endfacet facet normal 0.125895 0.848716 -0.513646 outer loop vertex -0.486633 -2.446481 1.666711 vertex -0.244493 -2.482399 1.666711 vertex -0.259328 -2.633025 1.414190 endloop endfacet facet normal 0.021554 0.145312 0.989151 outer loop vertex -0.028820 -0.292635 -2.985554 vertex -0.057364 -0.288401 -2.985554 vertex -0.114178 -0.574025 -2.942356 endloop endfacet facet normal 0.021556 0.145312 0.989151 outer loop vertex -0.114178 -0.574025 -2.942356 vertex -0.057364 -0.582453 -2.942356 vertex -0.028820 -0.292635 -2.985554 endloop endfacet facet normal 0.138172 0.931480 0.336532 outer loop vertex -0.271666 -2.758293 -1.148051 vertex -0.540717 -2.718383 -1.148051 vertex -0.560068 -2.815660 -0.870855 endloop endfacet facet normal 0.138171 0.931480 0.336531 outer loop vertex -0.560068 -2.815660 -0.870855 vertex -0.281388 -2.856998 -0.870855 vertex -0.271666 -2.758293 -1.148051 endloop endfacet facet normal 0.108780 0.733327 -0.671117 outer loop vertex -0.227302 -2.307867 1.903180 vertex -0.452418 -2.274474 1.903180 vertex -0.413847 -2.080560 2.121321 endloop endfacet facet normal 0.108779 0.733327 -0.671118 outer loop vertex -0.413847 -2.080560 2.121321 vertex -0.207923 -2.111106 2.121321 vertex -0.227302 -2.307867 1.903180 endloop endfacet facet normal 0.059107 0.235966 0.969962 outer loop vertex -0.114178 -0.574025 -2.942356 vertex -0.169893 -0.560069 -2.942356 vertex -0.252793 -0.833356 -2.870821 endloop endfacet facet normal 0.059105 0.235966 0.969962 outer loop vertex -0.252793 -0.833356 -2.870821 vertex -0.169893 -0.854121 -2.870821 vertex -0.114178 -0.574025 -2.942356 endloop endfacet facet normal 0.235717 0.941028 0.242703 outer loop vertex -0.560068 -2.815660 -0.870855 vertex -0.833354 -2.747205 -0.870855 vertex -0.854119 -2.815659 -0.585272 endloop endfacet facet normal 0.235717 0.941028 0.242703 outer loop vertex -0.854119 -2.815659 -0.585272 vertex -0.574023 -2.885820 -0.585272 vertex -0.560068 -2.815660 -0.870855 endloop endfacet facet normal 0.163285 0.651866 -0.740546 outer loop vertex -0.413847 -2.080560 2.121321 vertex -0.615784 -2.029977 2.121321 vertex -0.552462 -1.821231 2.319032 endloop endfacet facet normal 0.163283 0.651866 -0.740547 outer loop vertex -0.552462 -1.821231 2.319032 vertex -0.371290 -1.866612 2.319032 vertex -0.413847 -2.080560 2.121321 endloop endfacet facet normal 0.103989 0.415151 0.903790 outer loop vertex -0.223971 -1.125991 -2.771639 vertex -0.333259 -1.098616 -2.771639 vertex -0.410516 -1.353296 -2.645764 endloop endfacet facet normal 0.103989 0.415151 0.903790 outer loop vertex -0.410516 -1.353296 -2.645764 vertex -0.275893 -1.387017 -2.645764 vertex -0.223971 -1.125991 -2.771639 endloop endfacet facet normal 0.242687 0.968866 0.049010 outer loop vertex -0.582450 -2.928189 -0.294052 vertex -0.866658 -2.856999 -0.294052 vertex -0.870852 -2.870823 -0.000001 endloop endfacet facet normal 0.242689 0.968865 0.049012 outer loop vertex -0.870852 -2.870823 -0.000001 vertex -0.585269 -2.942358 -0.000001 vertex -0.582450 -2.928189 -0.294052 endloop endfacet facet normal 0.125027 0.499135 -0.857457 outer loop vertex -0.325157 -1.634687 2.494409 vertex -0.483819 -1.594944 2.494409 vertex -0.410516 -1.353297 2.645763 endloop endfacet facet normal 0.125030 0.499136 -0.857456 outer loop vertex -0.410516 -1.353297 2.645763 vertex -0.275893 -1.387019 2.645763 vertex -0.325157 -1.634687 2.494409 endloop endfacet facet normal 0.144856 0.578295 0.802864 outer loop vertex -0.325157 -1.634686 -2.494410 vertex -0.483819 -1.594943 -2.494410 vertex -0.552462 -1.821230 -2.319033 endloop endfacet facet normal 0.144855 0.578296 0.802864 outer loop vertex -0.552462 -1.821230 -2.319033 vertex -0.371290 -1.866611 -2.319033 vertex -0.325157 -1.634686 -2.494410 endloop endfacet facet normal 0.081944 0.327142 -0.941415 outer loop vertex -0.223971 -1.125992 2.771639 vertex -0.333259 -1.098617 2.771639 vertex -0.252794 -0.833357 2.870821 endloop endfacet facet normal 0.081946 0.327142 -0.941415 outer loop vertex -0.252794 -0.833357 2.870821 vertex -0.169893 -0.854123 2.870821 vertex -0.223971 -1.125992 2.771639 endloop endfacet facet normal 0.240356 0.959557 -0.146559 outer loop vertex -0.582450 -2.928189 0.294051 vertex -0.866658 -2.856999 0.294051 vertex -0.854119 -2.815660 0.585271 endloop endfacet facet normal 0.240355 0.959557 -0.146560 outer loop vertex -0.854119 -2.815660 0.585271 vertex -0.574023 -2.885820 0.585271 vertex -0.582450 -2.928189 0.294051 endloop endfacet facet normal 0.180132 0.719135 0.671116 outer loop vertex -0.413847 -2.080559 -2.121322 vertex -0.615784 -2.029977 -2.121322 vertex -0.673177 -2.219176 -1.903181 endloop endfacet facet normal 0.180133 0.719134 0.671117 outer loop vertex -0.673177 -2.219176 -1.903181 vertex -0.452418 -2.274473 -1.903181 vertex -0.413847 -2.080559 -2.121322 endloop endfacet facet normal 0.035695 0.142500 -0.989151 outer loop vertex -0.114179 -0.574027 2.942356 vertex -0.169893 -0.560071 2.942356 vertex -0.085357 -0.281392 2.985554 endloop endfacet facet normal 0.035696 0.142500 -0.989151 outer loop vertex -0.085357 -0.281392 2.985554 vertex -0.057365 -0.288404 2.985554 vertex -0.114179 -0.574027 2.942356 endloop endfacet facet normal 0.228805 0.913450 -0.336537 outer loop vertex -0.560067 -2.815660 0.870853 vertex -0.833354 -2.747206 0.870853 vertex -0.804562 -2.652292 1.148050 endloop endfacet facet normal 0.228808 0.913450 -0.336534 outer loop vertex -0.804562 -2.652292 1.148050 vertex -0.540717 -2.718382 1.148050 vertex -0.560067 -2.815660 0.870853 endloop endfacet facet normal 0.208477 0.832290 0.513644 outer loop vertex -0.486633 -2.446481 -1.666712 vertex -0.724087 -2.387002 -1.666712 vertex -0.768023 -2.531839 -1.414191 endloop endfacet facet normal 0.208478 0.832290 0.513645 outer loop vertex -0.768023 -2.531839 -1.414191 vertex -0.516161 -2.594927 -1.414191 vertex -0.486633 -2.446481 -1.666712 endloop endfacet facet normal 0.208481 0.832289 -0.513645 outer loop vertex -0.516161 -2.594928 1.414190 vertex -0.768023 -2.531839 1.414190 vertex -0.724087 -2.387002 1.666711 endloop endfacet facet normal 0.208477 0.832288 -0.513647 outer loop vertex -0.724087 -2.387002 1.666711 vertex -0.486633 -2.446481 1.666711 vertex -0.516161 -2.594928 1.414190 endloop endfacet facet normal 0.035691 0.142501 0.989151 outer loop vertex -0.057364 -0.288401 -2.985554 vertex -0.085356 -0.281390 -2.985554 vertex -0.169893 -0.560069 -2.942356 endloop endfacet facet normal 0.035694 0.142500 0.989151 outer loop vertex -0.169893 -0.560069 -2.942356 vertex -0.114178 -0.574025 -2.942356 vertex -0.057364 -0.288401 -2.985554 endloop endfacet facet normal 0.228806 0.913453 0.336529 outer loop vertex -0.540717 -2.718383 -1.148051 vertex -0.804562 -2.652294 -1.148051 vertex -0.833354 -2.747205 -0.870855 endloop endfacet facet normal 0.228809 0.913451 0.336532 outer loop vertex -0.833354 -2.747205 -0.870855 vertex -0.560068 -2.815660 -0.870855 vertex -0.540717 -2.718383 -1.148051 endloop endfacet facet normal 0.180132 0.719133 -0.671118 outer loop vertex -0.452418 -2.274474 1.903180 vertex -0.673177 -2.219177 1.903180 vertex -0.615784 -2.029977 2.121321 endloop endfacet facet normal 0.180135 0.719134 -0.671117 outer loop vertex -0.615784 -2.029977 2.121321 vertex -0.413847 -2.080560 2.121321 vertex -0.452418 -2.274474 1.903180 endloop endfacet facet normal 0.081943 0.327142 0.941416 outer loop vertex -0.169893 -0.854121 -2.870821 vertex -0.252793 -0.833356 -2.870821 vertex -0.333259 -1.098616 -2.771639 endloop endfacet facet normal 0.081944 0.327142 0.941416 outer loop vertex -0.333259 -1.098616 -2.771639 vertex -0.223971 -1.125991 -2.771639 vertex -0.169893 -0.854121 -2.870821 endloop endfacet facet normal 0.240358 0.959556 0.146562 outer loop vertex -0.574023 -2.885820 -0.585272 vertex -0.854119 -2.815659 -0.585272 vertex -0.866658 -2.856999 -0.294052 endloop endfacet facet normal 0.240356 0.959557 0.146560 outer loop vertex -0.866658 -2.856999 -0.294052 vertex -0.582450 -2.928189 -0.294052 vertex -0.574023 -2.885820 -0.585272 endloop endfacet facet normal 0.144855 0.578296 -0.802864 outer loop vertex -0.371290 -1.866612 2.319032 vertex -0.552462 -1.821231 2.319032 vertex -0.483819 -1.594944 2.494409 endloop endfacet facet normal 0.144856 0.578296 -0.802864 outer loop vertex -0.483819 -1.594944 2.494409 vertex -0.325157 -1.634687 2.494409 vertex -0.371290 -1.866612 2.319032 endloop endfacet facet normal 0.125026 0.499136 0.857457 outer loop vertex -0.275893 -1.387017 -2.645764 vertex -0.410516 -1.353296 -2.645764 vertex -0.483819 -1.594943 -2.494410 endloop endfacet facet normal 0.125027 0.499135 0.857457 outer loop vertex -0.483819 -1.594943 -2.494410 vertex -0.325157 -1.634686 -2.494410 vertex -0.275893 -1.387017 -2.645764 endloop endfacet facet normal 0.103993 0.415153 -0.903788 outer loop vertex -0.275893 -1.387019 2.645763 vertex -0.410516 -1.353297 2.645763 vertex -0.333259 -1.098617 2.771639 endloop endfacet facet normal 0.103989 0.415153 -0.903789 outer loop vertex -0.333259 -1.098617 2.771639 vertex -0.223971 -1.125992 2.771639 vertex -0.275893 -1.387019 2.645763 endloop endfacet facet normal 0.242689 0.968865 -0.049010 outer loop vertex -0.585269 -2.942358 -0.000001 vertex -0.870852 -2.870823 -0.000001 vertex -0.866658 -2.856999 0.294051 endloop endfacet facet normal 0.242687 0.968866 -0.049012 outer loop vertex -0.866658 -2.856999 0.294051 vertex -0.582450 -2.928189 0.294051 vertex -0.585269 -2.942358 -0.000001 endloop endfacet facet normal 0.163283 0.651865 0.740547 outer loop vertex -0.371290 -1.866611 -2.319033 vertex -0.552462 -1.821230 -2.319033 vertex -0.615784 -2.029977 -2.121322 endloop endfacet facet normal 0.163282 0.651866 0.740547 outer loop vertex -0.615784 -2.029977 -2.121322 vertex -0.413847 -2.080559 -2.121322 vertex -0.371290 -1.866611 -2.319033 endloop endfacet facet normal 0.059108 0.235966 -0.969962 outer loop vertex -0.169893 -0.854123 2.870821 vertex -0.252794 -0.833357 2.870821 vertex -0.169893 -0.560071 2.942356 endloop endfacet facet normal 0.059108 0.235966 -0.969962 outer loop vertex -0.169893 -0.560071 2.942356 vertex -0.114179 -0.574027 2.942356 vertex -0.169893 -0.854123 2.870821 endloop endfacet facet normal 0.235714 0.941028 -0.242704 outer loop vertex -0.574023 -2.885820 0.585271 vertex -0.854119 -2.815660 0.585271 vertex -0.833354 -2.747206 0.870853 endloop endfacet facet normal 0.235713 0.941028 -0.242705 outer loop vertex -0.833354 -2.747206 0.870853 vertex -0.560067 -2.815660 0.870853 vertex -0.574023 -2.885820 0.585271 endloop endfacet facet normal 0.195246 0.779469 0.595237 outer loop vertex -0.452418 -2.274473 -1.903181 vertex -0.673177 -2.219176 -1.903181 vertex -0.724087 -2.387002 -1.666712 endloop endfacet facet normal 0.195246 0.779468 0.595238 outer loop vertex -0.724087 -2.387002 -1.666712 vertex -0.486633 -2.446481 -1.666712 vertex -0.452418 -2.274473 -1.903181 endloop endfacet facet normal 0.219701 0.877093 -0.427129 outer loop vertex -0.540717 -2.718382 1.148050 vertex -0.804562 -2.652292 1.148050 vertex -0.768023 -2.531839 1.414190 endloop endfacet facet normal 0.219704 0.877093 -0.427127 outer loop vertex -0.768023 -2.531839 1.414190 vertex -0.516161 -2.594928 1.414190 vertex -0.540717 -2.718382 1.148050 endloop endfacet facet normal 0.219700 0.877091 0.427135 outer loop vertex -0.516161 -2.594927 -1.414191 vertex -0.768023 -2.531839 -1.414191 vertex -0.804562 -2.652294 -1.148051 endloop endfacet facet normal 0.219698 0.877092 0.427133 outer loop vertex -0.804562 -2.652294 -1.148051 vertex -0.540717 -2.718383 -1.148051 vertex -0.516161 -2.594927 -1.414191 endloop endfacet facet normal 0.195247 0.779470 -0.595235 outer loop vertex -0.486633 -2.446481 1.666711 vertex -0.724087 -2.387002 1.666711 vertex -0.673177 -2.219177 1.903180 endloop endfacet facet normal 0.195246 0.779470 -0.595235 outer loop vertex -0.673177 -2.219177 1.903180 vertex -0.452418 -2.274474 1.903180 vertex -0.486633 -2.446481 1.666711 endloop endfacet facet normal 0.113619 0.317533 0.941416 outer loop vertex -0.252793 -0.833356 -2.870821 vertex -0.333259 -0.804564 -2.870821 vertex -0.439337 -1.060660 -2.771639 endloop endfacet facet normal 0.113618 0.317534 0.941416 outer loop vertex -0.439337 -1.060660 -2.771639 vertex -0.333259 -1.098616 -2.771639 vertex -0.252793 -0.833356 -2.870821 endloop endfacet facet normal 0.333250 0.931378 0.146560 outer loop vertex -0.854119 -2.815659 -0.585272 vertex -1.125989 -2.718383 -0.585272 vertex -1.142520 -2.758294 -0.294052 endloop endfacet facet normal 0.333251 0.931377 0.146562 outer loop vertex -1.142520 -2.758294 -0.294052 vertex -0.866658 -2.856999 -0.294052 vertex -0.854119 -2.815659 -0.585272 endloop endfacet facet normal 0.200842 0.561314 -0.802863 outer loop vertex -0.552462 -1.821231 2.319032 vertex -0.728314 -1.758310 2.319032 vertex -0.637821 -1.539842 2.494409 endloop endfacet facet normal 0.200838 0.561313 -0.802864 outer loop vertex -0.637821 -1.539842 2.494409 vertex -0.483819 -1.594944 2.494409 vertex -0.552462 -1.821231 2.319032 endloop endfacet facet normal 0.173349 0.484478 0.857456 outer loop vertex -0.410516 -1.353296 -2.645764 vertex -0.541185 -1.306542 -2.645764 vertex -0.637821 -1.539840 -2.494410 endloop endfacet facet normal 0.173350 0.484477 0.857457 outer loop vertex -0.637821 -1.539840 -2.494410 vertex -0.483819 -1.594943 -2.494410 vertex -0.410516 -1.353296 -2.645764 endloop endfacet facet normal 0.144182 0.402962 -0.903789 outer loop vertex -0.410516 -1.353297 2.645763 vertex -0.541185 -1.306543 2.645763 vertex -0.439338 -1.060661 2.771639 endloop endfacet facet normal 0.144183 0.402962 -0.903788 outer loop vertex -0.439338 -1.060661 2.771639 vertex -0.333259 -1.098617 2.771639 vertex -0.410516 -1.353297 2.645763 endloop endfacet facet normal 0.336486 0.940412 -0.049009 outer loop vertex -0.870852 -2.870823 -0.000001 vertex -1.148049 -2.771640 -0.000001 vertex -1.142520 -2.758294 0.294051 endloop endfacet facet normal 0.336484 0.940413 -0.049010 outer loop vertex -1.142520 -2.758294 0.294051 vertex -0.866658 -2.856999 0.294051 vertex -0.870852 -2.870823 -0.000001 endloop endfacet facet normal 0.226393 0.632721 0.740548 outer loop vertex -0.552462 -1.821230 -2.319033 vertex -0.728313 -1.758309 -2.319033 vertex -0.811792 -1.959844 -2.121322 endloop endfacet facet normal 0.226392 0.632721 0.740547 outer loop vertex -0.811792 -1.959844 -2.121322 vertex -0.615784 -2.029977 -2.121322 vertex -0.552462 -1.821230 -2.319033 endloop endfacet facet normal 0.081950 0.229037 -0.969962 outer loop vertex -0.252794 -0.833357 2.870821 vertex -0.333260 -0.804566 2.870821 vertex -0.223972 -0.540722 2.942356 endloop endfacet facet normal 0.081948 0.229038 -0.969962 outer loop vertex -0.223972 -0.540722 2.942356 vertex -0.169893 -0.560071 2.942356 vertex -0.252794 -0.833357 2.870821 endloop endfacet facet normal 0.326818 0.913392 -0.242704 outer loop vertex -0.854119 -2.815660 0.585271 vertex -1.125989 -2.718383 0.585271 vertex -1.098614 -2.652294 0.870853 endloop endfacet facet normal 0.326819 0.913392 -0.242703 outer loop vertex -1.098614 -2.652294 0.870853 vertex -0.833354 -2.747206 0.870853 vertex -0.854119 -2.815660 0.585271 endloop endfacet facet normal 0.270709 0.756579 0.595236 outer loop vertex -0.673177 -2.219176 -1.903181 vertex -0.887452 -2.142507 -1.903181 vertex -0.954567 -2.304534 -1.666712 endloop endfacet facet normal 0.270711 0.756577 0.595237 outer loop vertex -0.954567 -2.304534 -1.666712 vertex -0.724087 -2.387002 -1.666712 vertex -0.673177 -2.219176 -1.903181 endloop endfacet facet normal 0.304611 0.851335 -0.427131 outer loop vertex -0.804562 -2.652292 1.148050 vertex -1.060658 -2.560660 1.148050 vertex -1.012488 -2.444368 1.414190 endloop endfacet facet normal 0.304613 0.851335 -0.427129 outer loop vertex -1.012488 -2.444368 1.414190 vertex -0.768023 -2.531839 1.414190 vertex -0.804562 -2.652292 1.148050 endloop endfacet facet normal 0.304611 0.851334 0.427133 outer loop vertex -0.768023 -2.531839 -1.414191 vertex -1.012489 -2.444368 -1.414191 vertex -1.060658 -2.560661 -1.148051 endloop endfacet facet normal 0.304612 0.851333 0.427134 outer loop vertex -1.060658 -2.560661 -1.148051 vertex -0.804562 -2.652294 -1.148051 vertex -0.768023 -2.531839 -1.414191 endloop endfacet facet normal 0.270711 0.756580 -0.595234 outer loop vertex -0.724087 -2.387002 1.666711 vertex -0.954568 -2.304534 1.666711 vertex -0.887453 -2.142508 1.903180 endloop endfacet facet normal 0.270708 0.756580 -0.595235 outer loop vertex -0.887453 -2.142508 1.903180 vertex -0.673177 -2.219177 1.903180 vertex -0.724087 -2.387002 1.666711 endloop endfacet facet normal 0.081949 0.229038 0.969962 outer loop vertex -0.169893 -0.560069 -2.942356 vertex -0.223971 -0.540720 -2.942356 vertex -0.333259 -0.804564 -2.870821 endloop endfacet facet normal 0.081953 0.229036 0.969962 outer loop vertex -0.333259 -0.804564 -2.870821 vertex -0.252793 -0.833356 -2.870821 vertex -0.169893 -0.560069 -2.942356 endloop endfacet facet normal 0.326816 0.913393 0.242703 outer loop vertex -0.833354 -2.747205 -0.870855 vertex -1.098614 -2.652294 -0.870855 vertex -1.125989 -2.718383 -0.585272 endloop endfacet facet normal 0.326815 0.913393 0.242703 outer loop vertex -1.125989 -2.718383 -0.585272 vertex -0.854119 -2.815659 -0.585272 vertex -0.833354 -2.747205 -0.870855 endloop endfacet facet normal 0.226390 0.632723 -0.740547 outer loop vertex -0.615784 -2.029977 2.121321 vertex -0.811792 -1.959845 2.121321 vertex -0.728314 -1.758310 2.319032 endloop endfacet facet normal 0.226393 0.632723 -0.740546 outer loop vertex -0.728314 -1.758310 2.319032 vertex -0.552462 -1.821231 2.319032 vertex -0.615784 -2.029977 2.121321 endloop endfacet facet normal 0.144183 0.402957 0.903790 outer loop vertex -0.333259 -1.098616 -2.771639 vertex -0.439337 -1.060660 -2.771639 vertex -0.541185 -1.306542 -2.645764 endloop endfacet facet normal 0.144181 0.402959 0.903790 outer loop vertex -0.541185 -1.306542 -2.645764 vertex -0.410516 -1.353296 -2.645764 vertex -0.333259 -1.098616 -2.771639 endloop endfacet facet normal 0.336484 0.940413 0.049009 outer loop vertex -0.866658 -2.856999 -0.294052 vertex -1.142520 -2.758294 -0.294052 vertex -1.148049 -2.771640 -0.000001 endloop endfacet facet normal 0.336486 0.940412 0.049010 outer loop vertex -1.148049 -2.771640 -0.000001 vertex -0.870852 -2.870823 -0.000001 vertex -0.866658 -2.856999 -0.294052 endloop endfacet facet normal 0.173346 0.484477 -0.857457 outer loop vertex -0.483819 -1.594944 2.494409 vertex -0.637821 -1.539842 2.494409 vertex -0.541185 -1.306543 2.645763 endloop endfacet facet normal 0.173348 0.484477 -0.857457 outer loop vertex -0.541185 -1.306543 2.645763 vertex -0.410516 -1.353297 2.645763 vertex -0.483819 -1.594944 2.494409 endloop endfacet facet normal 0.200842 0.561313 0.802864 outer loop vertex -0.483819 -1.594943 -2.494410 vertex -0.637821 -1.539840 -2.494410 vertex -0.728313 -1.758309 -2.319033 endloop endfacet facet normal 0.200842 0.561312 0.802864 outer loop vertex -0.728313 -1.758309 -2.319033 vertex -0.552462 -1.821230 -2.319033 vertex -0.483819 -1.594943 -2.494410 endloop endfacet facet normal 0.113617 0.317535 -0.941415 outer loop vertex -0.333259 -1.098617 2.771639 vertex -0.439338 -1.060661 2.771639 vertex -0.333260 -0.804566 2.870821 endloop endfacet facet normal 0.113615 0.317535 -0.941415 outer loop vertex -0.333260 -0.804566 2.870821 vertex -0.252794 -0.833357 2.870821 vertex -0.333259 -1.098617 2.771639 endloop endfacet facet normal 0.333252 0.931377 -0.146560 outer loop vertex -0.866658 -2.856999 0.294051 vertex -1.142520 -2.758294 0.294051 vertex -1.125989 -2.718383 0.585271 endloop endfacet facet normal 0.333253 0.931377 -0.146558 outer loop vertex -1.125989 -2.718383 0.585271 vertex -0.854119 -2.815660 0.585271 vertex -0.866658 -2.856999 0.294051 endloop endfacet facet normal 0.249755 0.698015 0.671117 outer loop vertex -0.615784 -2.029977 -2.121322 vertex -0.811792 -1.959844 -2.121322 vertex -0.887452 -2.142507 -1.903181 endloop endfacet facet normal 0.249754 0.698015 0.671116 outer loop vertex -0.887452 -2.142507 -1.903181 vertex -0.673177 -2.219176 -1.903181 vertex -0.615784 -2.029977 -2.121322 endloop endfacet facet normal 0.049488 0.138315 -0.989151 outer loop vertex -0.169893 -0.560071 2.942356 vertex -0.223972 -0.540722 2.942356 vertex -0.112527 -0.271670 2.985554 endloop endfacet facet normal 0.049492 0.138315 -0.989151 outer loop vertex -0.112527 -0.271670 2.985554 vertex -0.085357 -0.281392 2.985554 vertex -0.169893 -0.560071 2.942356 endloop endfacet facet normal 0.317241 0.886625 -0.336534 outer loop vertex -0.833354 -2.747206 0.870853 vertex -1.098614 -2.652294 0.870853 vertex -1.060658 -2.560660 1.148050 endloop endfacet facet normal 0.317238 0.886625 -0.336537 outer loop vertex -1.060658 -2.560660 1.148050 vertex -0.804562 -2.652292 1.148050 vertex -0.833354 -2.747206 0.870853 endloop endfacet facet normal 0.289055 0.807845 0.513647 outer loop vertex -0.724087 -2.387002 -1.666712 vertex -0.954567 -2.304534 -1.666712 vertex -1.012489 -2.444368 -1.414191 endloop endfacet facet normal 0.289052 0.807848 0.513644 outer loop vertex -1.012489 -2.444368 -1.414191 vertex -0.768023 -2.531839 -1.414191 vertex -0.724087 -2.387002 -1.666712 endloop endfacet facet normal 0.289052 0.807847 -0.513646 outer loop vertex -0.768023 -2.531839 1.414190 vertex -1.012488 -2.444368 1.414190 vertex -0.954568 -2.304534 1.666711 endloop endfacet facet normal 0.289054 0.807847 -0.513644 outer loop vertex -0.954568 -2.304534 1.666711 vertex -0.724087 -2.387002 1.666711 vertex -0.768023 -2.531839 1.414190 endloop endfacet facet normal 0.049492 0.138314 0.989151 outer loop vertex -0.085356 -0.281390 -2.985554 vertex -0.112526 -0.271668 -2.985554 vertex -0.223971 -0.540720 -2.942356 endloop endfacet facet normal 0.049489 0.138315 0.989151 outer loop vertex -0.223971 -0.540720 -2.942356 vertex -0.169893 -0.560069 -2.942356 vertex -0.085356 -0.281390 -2.985554 endloop endfacet facet normal 0.317241 0.886626 0.336532 outer loop vertex -0.804562 -2.652294 -1.148051 vertex -1.060658 -2.560661 -1.148051 vertex -1.098614 -2.652294 -0.870855 endloop endfacet facet normal 0.317239 0.886627 0.336530 outer loop vertex -1.098614 -2.652294 -0.870855 vertex -0.833354 -2.747205 -0.870855 vertex -0.804562 -2.652294 -1.148051 endloop endfacet facet normal 0.249753 0.698015 -0.671117 outer loop vertex -0.673177 -2.219177 1.903180 vertex -0.887453 -2.142508 1.903180 vertex -0.811792 -1.959845 2.121321 endloop endfacet facet normal 0.249751 0.698015 -0.671118 outer loop vertex -0.811792 -1.959845 2.121321 vertex -0.615784 -2.029977 2.121321 vertex -0.673177 -2.219177 1.903180 endloop endfacet facet normal 0.104006 0.219901 0.969962 outer loop vertex -0.223971 -0.540720 -2.942356 vertex -0.275892 -0.516163 -2.942356 vertex -0.410515 -0.768025 -2.870821 endloop endfacet facet normal 0.104005 0.219902 0.969962 outer loop vertex -0.410515 -0.768025 -2.870821 vertex -0.333259 -0.804564 -2.870821 vertex -0.223971 -0.540720 -2.942356 endloop endfacet facet normal 0.414772 0.876960 0.242705 outer loop vertex -1.098614 -2.652294 -0.870855 vertex -1.353294 -2.531839 -0.870855 vertex -1.387015 -2.594927 -0.585272 endloop endfacet facet normal 0.414771 0.876961 0.242703 outer loop vertex -1.387015 -2.594927 -0.585272 vertex -1.125989 -2.718383 -0.585272 vertex -1.098614 -2.652294 -0.870855 endloop endfacet facet normal 0.287319 0.607485 -0.740547 outer loop vertex -0.811792 -1.959845 2.121321 vertex -0.999981 -1.870838 2.121321 vertex -0.897151 -1.678456 2.319032 endloop endfacet facet normal 0.287319 0.607485 -0.740547 outer loop vertex -0.897151 -1.678456 2.319032 vertex -0.728314 -1.758310 2.319032 vertex -0.811792 -1.959845 2.121321 endloop endfacet facet normal 0.182982 0.386887 0.903790 outer loop vertex -0.439337 -1.060660 -2.771639 vertex -0.541185 -1.012490 -2.771639 vertex -0.666643 -1.247205 -2.645764 endloop endfacet facet normal 0.182983 0.386885 0.903790 outer loop vertex -0.666643 -1.247205 -2.645764 vertex -0.541185 -1.306542 -2.645764 vertex -0.439337 -1.060660 -2.771639 endloop endfacet facet normal 0.427043 0.902902 0.049014 outer loop vertex -1.142520 -2.758294 -0.294052 vertex -1.407378 -2.633025 -0.294052 vertex -1.414189 -2.645766 -0.000001 endloop endfacet facet normal 0.427039 0.902904 0.049009 outer loop vertex -1.414189 -2.645766 -0.000001 vertex -1.148049 -2.771640 -0.000001 vertex -1.142520 -2.758294 -0.294052 endloop endfacet facet normal 0.220004 0.465152 -0.857457 outer loop vertex -0.637821 -1.539842 2.494409 vertex -0.785680 -1.469909 2.494409 vertex -0.666643 -1.247206 2.645763 endloop endfacet facet normal 0.220000 0.465152 -0.857458 outer loop vertex -0.666643 -1.247206 2.645763 vertex -0.541185 -1.306543 2.645763 vertex -0.637821 -1.539842 2.494409 endloop endfacet facet normal 0.254892 0.538924 0.802864 outer loop vertex -0.637821 -1.539840 -2.494410 vertex -0.785680 -1.469908 -2.494410 vertex -0.897151 -1.678455 -2.319033 endloop endfacet facet normal 0.254891 0.538925 0.802864 outer loop vertex -0.897151 -1.678455 -2.319033 vertex -0.728313 -1.758309 -2.319033 vertex -0.637821 -1.539840 -2.494410 endloop endfacet facet normal 0.144192 0.304869 -0.941415 outer loop vertex -0.439338 -1.060661 2.771639 vertex -0.541185 -1.012491 2.771639 vertex -0.410516 -0.768026 2.870821 endloop endfacet facet normal 0.144195 0.304869 -0.941415 outer loop vertex -0.410516 -0.768026 2.870821 vertex -0.333260 -0.804566 2.870821 vertex -0.439338 -1.060661 2.771639 endloop endfacet facet normal 0.422940 0.894227 -0.146557 outer loop vertex -1.142520 -2.758294 0.294051 vertex -1.407378 -2.633025 0.294051 vertex -1.387015 -2.594927 0.585271 endloop endfacet facet normal 0.422938 0.894228 -0.146560 outer loop vertex -1.387015 -2.594927 0.585271 vertex -1.125989 -2.718383 0.585271 vertex -1.142520 -2.758294 0.294051 endloop endfacet facet normal 0.316970 0.670174 0.671117 outer loop vertex -0.811792 -1.959844 -2.121322 vertex -0.999981 -1.870837 -2.121322 vertex -1.093182 -2.045204 -1.903181 endloop endfacet facet normal 0.316969 0.670174 0.671116 outer loop vertex -1.093182 -2.045204 -1.903181 vertex -0.887452 -2.142507 -1.903181 vertex -0.811792 -1.959844 -2.121322 endloop endfacet facet normal 0.062809 0.132798 -0.989151 outer loop vertex -0.223972 -0.540722 2.942356 vertex -0.275893 -0.516165 2.942356 vertex -0.138614 -0.259332 2.985554 endloop endfacet facet normal 0.062808 0.132798 -0.989151 outer loop vertex -0.138614 -0.259332 2.985554 vertex -0.112527 -0.271670 2.985554 vertex -0.223972 -0.540722 2.942356 endloop endfacet facet normal 0.402618 0.851261 -0.336533 outer loop vertex -1.098614 -2.652294 0.870853 vertex -1.353294 -2.531839 0.870853 vertex -1.306539 -2.444367 1.148050 endloop endfacet facet normal 0.402616 0.851261 -0.336534 outer loop vertex -1.306539 -2.444367 1.148050 vertex -1.060658 -2.560660 1.148050 vertex -1.098614 -2.652294 0.870853 endloop endfacet facet normal 0.366842 0.775626 0.513645 outer loop vertex -0.954567 -2.304534 -1.666712 vertex -1.175855 -2.199873 -1.666712 vertex -1.247203 -2.333356 -1.414191 endloop endfacet facet normal 0.366844 0.775623 0.513647 outer loop vertex -1.247203 -2.333356 -1.414191 vertex -1.012489 -2.444368 -1.414191 vertex -0.954567 -2.304534 -1.666712 endloop endfacet facet normal 0.366844 0.775625 -0.513645 outer loop vertex -1.012488 -2.444368 1.414190 vertex -1.247203 -2.333356 1.414190 vertex -1.175855 -2.199873 1.666711 endloop endfacet facet normal 0.366843 0.775625 -0.513646 outer loop vertex -1.175855 -2.199873 1.666711 vertex -0.954568 -2.304534 1.666711 vertex -1.012488 -2.444368 1.414190 endloop endfacet facet normal 0.062810 0.132797 0.989151 outer loop vertex -0.112526 -0.271668 -2.985554 vertex -0.138612 -0.259330 -2.985554 vertex -0.275892 -0.516163 -2.942356 endloop endfacet facet normal 0.062809 0.132798 0.989151 outer loop vertex -0.275892 -0.516163 -2.942356 vertex -0.223971 -0.540720 -2.942356 vertex -0.112526 -0.271668 -2.985554 endloop endfacet facet normal 0.402617 0.851262 0.336531 outer loop vertex -1.060658 -2.560661 -1.148051 vertex -1.306539 -2.444368 -1.148051 vertex -1.353294 -2.531839 -0.870855 endloop endfacet facet normal 0.402618 0.851261 0.336532 outer loop vertex -1.353294 -2.531839 -0.870855 vertex -1.098614 -2.652294 -0.870855 vertex -1.060658 -2.560661 -1.148051 endloop endfacet facet normal 0.316970 0.670173 -0.671117 outer loop vertex -0.887453 -2.142508 1.903180 vertex -1.093182 -2.045205 1.903180 vertex -0.999981 -1.870838 2.121321 endloop endfacet facet normal 0.316969 0.670173 -0.671117 outer loop vertex -0.999981 -1.870838 2.121321 vertex -0.811792 -1.959845 2.121321 vertex -0.887453 -2.142508 1.903180 endloop endfacet facet normal 0.144191 0.304869 0.941416 outer loop vertex -0.333259 -0.804564 -2.870821 vertex -0.410515 -0.768025 -2.870821 vertex -0.541185 -1.012490 -2.771639 endloop endfacet facet normal 0.144191 0.304870 0.941416 outer loop vertex -0.541185 -1.012490 -2.771639 vertex -0.439337 -1.060660 -2.771639 vertex -0.333259 -0.804564 -2.870821 endloop endfacet facet normal 0.422938 0.894228 0.146557 outer loop vertex -1.125989 -2.718383 -0.585272 vertex -1.387015 -2.594927 -0.585272 vertex -1.407378 -2.633025 -0.294052 endloop endfacet facet normal 0.422940 0.894227 0.146560 outer loop vertex -1.407378 -2.633025 -0.294052 vertex -1.142520 -2.758294 -0.294052 vertex -1.125989 -2.718383 -0.585272 endloop endfacet facet normal 0.254892 0.538924 -0.802864 outer loop vertex -0.728314 -1.758310 2.319032 vertex -0.897151 -1.678456 2.319032 vertex -0.785680 -1.469909 2.494409 endloop endfacet facet normal 0.254896 0.538924 -0.802863 outer loop vertex -0.785680 -1.469909 2.494409 vertex -0.637821 -1.539842 2.494409 vertex -0.728314 -1.758310 2.319032 endloop endfacet facet normal 0.220001 0.465154 0.857456 outer loop vertex -0.541185 -1.306542 -2.645764 vertex -0.666643 -1.247205 -2.645764 vertex -0.785680 -1.469908 -2.494410 endloop endfacet facet normal 0.220001 0.465154 0.857456 outer loop vertex -0.785680 -1.469908 -2.494410 vertex -0.637821 -1.539840 -2.494410 vertex -0.541185 -1.306542 -2.645764 endloop endfacet facet normal 0.182984 0.386889 -0.903789 outer loop vertex -0.541185 -1.306543 2.645763 vertex -0.666643 -1.247206 2.645763 vertex -0.541185 -1.012491 2.771639 endloop endfacet facet normal 0.182985 0.386889 -0.903789 outer loop vertex -0.541185 -1.012491 2.771639 vertex -0.439338 -1.060661 2.771639 vertex -0.541185 -1.306543 2.645763 endloop endfacet facet normal 0.427039 0.902904 -0.049014 outer loop vertex -1.148049 -2.771640 -0.000001 vertex -1.414189 -2.645766 -0.000001 vertex -1.407378 -2.633025 0.294051 endloop endfacet facet normal 0.427043 0.902902 -0.049009 outer loop vertex -1.407378 -2.633025 0.294051 vertex -1.142520 -2.758294 0.294051 vertex -1.148049 -2.771640 -0.000001 endloop endfacet facet normal 0.287318 0.607486 0.740547 outer loop vertex -0.728313 -1.758309 -2.319033 vertex -0.897151 -1.678455 -2.319033 vertex -0.999981 -1.870837 -2.121322 endloop endfacet facet normal 0.287319 0.607484 0.740548 outer loop vertex -0.999981 -1.870837 -2.121322 vertex -0.811792 -1.959844 -2.121322 vertex -0.728313 -1.758309 -2.319033 endloop endfacet facet normal 0.104007 0.219901 -0.969962 outer loop vertex -0.333260 -0.804566 2.870821 vertex -0.410516 -0.768026 2.870821 vertex -0.275893 -0.516165 2.942356 endloop endfacet facet normal 0.104006 0.219901 -0.969962 outer loop vertex -0.275893 -0.516165 2.942356 vertex -0.223972 -0.540722 2.942356 vertex -0.333260 -0.804566 2.870821 endloop endfacet facet normal 0.414771 0.876960 -0.242705 outer loop vertex -1.125989 -2.718383 0.585271 vertex -1.387015 -2.594927 0.585271 vertex -1.353294 -2.531839 0.870853 endloop endfacet facet normal 0.414772 0.876960 -0.242704 outer loop vertex -1.353294 -2.531839 0.870853 vertex -1.098614 -2.652294 0.870853 vertex -1.125989 -2.718383 0.585271 endloop endfacet facet normal 0.343562 0.726401 0.595237 outer loop vertex -0.887452 -2.142507 -1.903181 vertex -1.093182 -2.045204 -1.903181 vertex -1.175855 -2.199873 -1.666712 endloop endfacet facet normal 0.343561 0.726402 0.595236 outer loop vertex -1.175855 -2.199873 -1.666712 vertex -0.954567 -2.304534 -1.666712 vertex -0.887452 -2.142507 -1.903181 endloop endfacet facet normal 0.386591 0.817378 -0.427131 outer loop vertex -1.060658 -2.560660 1.148050 vertex -1.306539 -2.444367 1.148050 vertex -1.247203 -2.333356 1.414190 endloop endfacet facet normal 0.386591 0.817378 -0.427131 outer loop vertex -1.247203 -2.333356 1.414190 vertex -1.012488 -2.444368 1.414190 vertex -1.060658 -2.560660 1.148050 endloop endfacet facet normal 0.386592 0.817376 0.427134 outer loop vertex -1.012489 -2.444368 -1.414191 vertex -1.247203 -2.333356 -1.414191 vertex -1.306539 -2.444368 -1.148051 endloop endfacet facet normal 0.386591 0.817377 0.427133 outer loop vertex -1.306539 -2.444368 -1.148051 vertex -1.060658 -2.560661 -1.148051 vertex -1.012489 -2.444368 -1.414191 endloop endfacet facet normal 0.343563 0.726402 -0.595234 outer loop vertex -0.954568 -2.304534 1.666711 vertex -1.175855 -2.199873 1.666711 vertex -1.093182 -2.045205 1.903180 endloop endfacet facet normal 0.343564 0.726402 -0.595234 outer loop vertex -1.093182 -2.045205 1.903180 vertex -0.887453 -2.142508 1.903180 vertex -0.954568 -2.304534 1.666711 endloop endfacet facet normal 0.075520 0.126004 0.989151 outer loop vertex -0.138612 -0.259330 -2.985554 vertex -0.163364 -0.244495 -2.985554 vertex -0.325157 -0.486635 -2.942356 endloop endfacet facet normal 0.075522 0.126002 0.989151 outer loop vertex -0.325157 -0.486635 -2.942356 vertex -0.275892 -0.516163 -2.942356 vertex -0.138612 -0.259330 -2.985554 endloop endfacet facet normal 0.484116 0.807700 0.336531 outer loop vertex -1.306539 -2.444368 -1.148051 vertex -1.539838 -2.304534 -1.148051 vertex -1.594941 -2.387001 -0.870855 endloop endfacet facet normal 0.484117 0.807699 0.336531 outer loop vertex -1.594941 -2.387001 -0.870855 vertex -1.353294 -2.531839 -0.870855 vertex -1.306539 -2.444368 -1.148051 endloop endfacet facet normal 0.381131 0.635877 -0.671118 outer loop vertex -1.093182 -2.045205 1.903180 vertex -1.288383 -1.928206 1.903180 vertex -1.178540 -1.763813 2.121321 endloop endfacet facet normal 0.381133 0.635877 -0.671117 outer loop vertex -1.178540 -1.763813 2.121321 vertex -0.999981 -1.870838 2.121321 vertex -1.093182 -2.045205 1.903180 endloop endfacet facet normal 0.173380 0.289268 0.941416 outer loop vertex -0.410515 -0.768025 -2.870821 vertex -0.483818 -0.724089 -2.870821 vertex -0.637820 -0.954569 -2.771639 endloop endfacet facet normal 0.173381 0.289267 0.941416 outer loop vertex -0.637820 -0.954569 -2.771639 vertex -0.541185 -1.012490 -2.771639 vertex -0.410515 -0.768025 -2.870821 endloop endfacet facet normal 0.508551 0.848467 0.146558 outer loop vertex -1.387015 -2.594927 -0.585272 vertex -1.634684 -2.446480 -0.585272 vertex -1.658683 -2.482399 -0.294052 endloop endfacet facet normal 0.508550 0.848468 0.146557 outer loop vertex -1.658683 -2.482399 -0.294052 vertex -1.407378 -2.633025 -0.294052 vertex -1.387015 -2.594927 -0.585272 endloop endfacet facet normal 0.306489 0.511346 -0.802864 outer loop vertex -0.897151 -1.678456 2.319032 vertex -1.057349 -1.582437 2.319032 vertex -0.925973 -1.385821 2.494409 endloop endfacet facet normal 0.306487 0.511346 -0.802864 outer loop vertex -0.925973 -1.385821 2.494409 vertex -0.785680 -1.469909 2.494409 vertex -0.897151 -1.678456 2.319032 endloop endfacet facet normal 0.264536 0.441351 0.857456 outer loop vertex -0.666643 -1.247205 -2.645764 vertex -0.785680 -1.175857 -2.645764 vertex -0.925973 -1.385819 -2.494410 endloop endfacet facet normal 0.264537 0.441349 0.857456 outer loop vertex -0.925973 -1.385819 -2.494410 vertex -0.785680 -1.469908 -2.494410 vertex -0.666643 -1.247205 -2.645764 endloop endfacet facet normal 0.220024 0.367091 -0.903789 outer loop vertex -0.666643 -1.247206 2.645763 vertex -0.785681 -1.175858 2.645763 vertex -0.637821 -0.954570 2.771639 endloop endfacet facet normal 0.220024 0.367091 -0.903789 outer loop vertex -0.637821 -0.954570 2.771639 vertex -0.541185 -1.012491 2.771639 vertex -0.666643 -1.247206 2.645763 endloop endfacet facet normal 0.513486 0.856697 -0.049011 outer loop vertex -1.414189 -2.645766 -0.000001 vertex -1.666709 -2.494411 -0.000001 vertex -1.658683 -2.482399 0.294051 endloop endfacet facet normal 0.513484 0.856698 -0.049014 outer loop vertex -1.658683 -2.482399 0.294051 vertex -1.407378 -2.633025 0.294051 vertex -1.414189 -2.645766 -0.000001 endloop endfacet facet normal 0.345481 0.576396 0.740548 outer loop vertex -0.897151 -1.678455 -2.319033 vertex -1.057348 -1.582436 -2.319033 vertex -1.178540 -1.763813 -2.121322 endloop endfacet facet normal 0.345479 0.576398 0.740547 outer loop vertex -1.178540 -1.763813 -2.121322 vertex -0.999981 -1.870837 -2.121322 vertex -0.897151 -1.678455 -2.319033 endloop endfacet facet normal 0.125059 0.208649 -0.969962 outer loop vertex -0.410516 -0.768026 2.870821 vertex -0.483819 -0.724090 2.870821 vertex -0.325158 -0.486637 2.942356 endloop endfacet facet normal 0.125058 0.208649 -0.969962 outer loop vertex -0.325158 -0.486637 2.942356 vertex -0.275893 -0.516165 2.942356 vertex -0.410516 -0.768026 2.870821 endloop endfacet facet normal 0.498731 0.832083 -0.242703 outer loop vertex -1.387015 -2.594927 0.585271 vertex -1.634684 -2.446480 0.585271 vertex -1.594941 -2.387002 0.870853 endloop endfacet facet normal 0.498729 0.832084 -0.242705 outer loop vertex -1.594941 -2.387002 0.870853 vertex -1.353294 -2.531839 0.870853 vertex -1.387015 -2.594927 0.585271 endloop endfacet facet normal 0.413107 0.689228 0.595237 outer loop vertex -1.093182 -2.045204 -1.903181 vertex -1.288383 -1.928205 -1.903181 vertex -1.385818 -2.074026 -1.666712 endloop endfacet facet normal 0.413107 0.689228 0.595237 outer loop vertex -1.385818 -2.074026 -1.666712 vertex -1.175855 -2.199873 -1.666712 vertex -1.093182 -2.045204 -1.903181 endloop endfacet facet normal 0.464848 0.775549 -0.427130 outer loop vertex -1.306539 -2.444367 1.148050 vertex -1.539837 -2.304533 1.148050 vertex -1.469906 -2.199873 1.414190 endloop endfacet facet normal 0.464846 0.775550 -0.427131 outer loop vertex -1.469906 -2.199873 1.414190 vertex -1.247203 -2.333356 1.414190 vertex -1.306539 -2.444367 1.148050 endloop endfacet facet normal 0.464846 0.775549 0.427133 outer loop vertex -1.247203 -2.333356 -1.414191 vertex -1.469906 -2.199873 -1.414191 vertex -1.539838 -2.304534 -1.148051 endloop endfacet facet normal 0.464846 0.775549 0.427133 outer loop vertex -1.539838 -2.304534 -1.148051 vertex -1.306539 -2.444368 -1.148051 vertex -1.247203 -2.333356 -1.414191 endloop endfacet facet normal 0.413108 0.689229 -0.595235 outer loop vertex -1.175855 -2.199873 1.666711 vertex -1.385818 -2.074026 1.666711 vertex -1.288383 -1.928206 1.903180 endloop endfacet facet normal 0.413109 0.689229 -0.595235 outer loop vertex -1.288383 -1.928206 1.903180 vertex -1.093182 -2.045205 1.903180 vertex -1.175855 -2.199873 1.666711 endloop endfacet facet normal 0.125058 0.208649 0.969962 outer loop vertex -0.275892 -0.516163 -2.942356 vertex -0.325157 -0.486635 -2.942356 vertex -0.483818 -0.724089 -2.870821 endloop endfacet facet normal 0.125059 0.208648 0.969962 outer loop vertex -0.483818 -0.724089 -2.870821 vertex -0.410515 -0.768025 -2.870821 vertex -0.275892 -0.516163 -2.942356 endloop endfacet facet normal 0.498732 0.832082 0.242705 outer loop vertex -1.353294 -2.531839 -0.870855 vertex -1.594941 -2.387001 -0.870855 vertex -1.634684 -2.446480 -0.585272 endloop endfacet facet normal 0.498731 0.832083 0.242705 outer loop vertex -1.634684 -2.446480 -0.585272 vertex -1.387015 -2.594927 -0.585272 vertex -1.353294 -2.531839 -0.870855 endloop endfacet facet normal 0.345482 0.576398 -0.740546 outer loop vertex -0.999981 -1.870838 2.121321 vertex -1.178540 -1.763813 2.121321 vertex -1.057349 -1.582437 2.319032 endloop endfacet facet normal 0.345479 0.576398 -0.740547 outer loop vertex -1.057349 -1.582437 2.319032 vertex -0.897151 -1.678456 2.319032 vertex -0.999981 -1.870838 2.121321 endloop endfacet facet normal 0.220024 0.367086 0.903790 outer loop vertex -0.541185 -1.012490 -2.771639 vertex -0.637820 -0.954569 -2.771639 vertex -0.785680 -1.175857 -2.645764 endloop endfacet facet normal 0.220024 0.367087 0.903790 outer loop vertex -0.785680 -1.175857 -2.645764 vertex -0.666643 -1.247205 -2.645764 vertex -0.541185 -1.012490 -2.771639 endloop endfacet facet normal 0.513484 0.856699 0.049012 outer loop vertex -1.407378 -2.633025 -0.294052 vertex -1.658683 -2.482399 -0.294052 vertex -1.666709 -2.494411 -0.000001 endloop endfacet facet normal 0.513486 0.856697 0.049014 outer loop vertex -1.666709 -2.494411 -0.000001 vertex -1.414189 -2.645766 -0.000001 vertex -1.407378 -2.633025 -0.294052 endloop endfacet facet normal 0.264534 0.441351 -0.857456 outer loop vertex -0.785680 -1.469909 2.494409 vertex -0.925973 -1.385821 2.494409 vertex -0.785681 -1.175858 2.645763 endloop endfacet facet normal 0.264533 0.441351 -0.857457 outer loop vertex -0.785681 -1.175858 2.645763 vertex -0.666643 -1.247206 2.645763 vertex -0.785680 -1.469909 2.494409 endloop endfacet facet normal 0.306490 0.511344 0.802864 outer loop vertex -0.785680 -1.469908 -2.494410 vertex -0.925973 -1.385819 -2.494410 vertex -1.057348 -1.582436 -2.319033 endloop endfacet facet normal 0.306490 0.511344 0.802864 outer loop vertex -1.057348 -1.582436 -2.319033 vertex -0.897151 -1.678455 -2.319033 vertex -0.785680 -1.469908 -2.494410 endloop endfacet facet normal 0.173380 0.289268 -0.941416 outer loop vertex -0.541185 -1.012491 2.771639 vertex -0.637821 -0.954570 2.771639 vertex -0.483819 -0.724090 2.870821 endloop endfacet facet normal 0.173380 0.289268 -0.941416 outer loop vertex -0.483819 -0.724090 2.870821 vertex -0.410516 -0.768026 2.870821 vertex -0.541185 -1.012491 2.771639 endloop endfacet facet normal 0.508550 0.848468 -0.146558 outer loop vertex -1.407378 -2.633025 0.294051 vertex -1.658683 -2.482399 0.294051 vertex -1.634684 -2.446480 0.585271 endloop endfacet facet normal 0.508551 0.848467 -0.146557 outer loop vertex -1.634684 -2.446480 0.585271 vertex -1.387015 -2.594927 0.585271 vertex -1.407378 -2.633025 0.294051 endloop endfacet facet normal 0.381131 0.635879 0.671116 outer loop vertex -0.999981 -1.870837 -2.121322 vertex -1.178540 -1.763813 -2.121322 vertex -1.288383 -1.928205 -1.903181 endloop endfacet facet normal 0.381131 0.635879 0.671117 outer loop vertex -1.288383 -1.928205 -1.903181 vertex -1.093182 -2.045204 -1.903181 vertex -0.999981 -1.870837 -2.121322 endloop endfacet facet normal 0.075522 0.126003 -0.989151 outer loop vertex -0.275893 -0.516165 2.942356 vertex -0.325158 -0.486637 2.942356 vertex -0.163365 -0.244497 2.985554 endloop endfacet facet normal 0.075522 0.126003 -0.989151 outer loop vertex -0.163365 -0.244497 2.985554 vertex -0.138614 -0.259332 2.985554 vertex -0.275893 -0.516165 2.942356 endloop endfacet facet normal 0.484114 0.807699 -0.336536 outer loop vertex -1.353294 -2.531839 0.870853 vertex -1.594941 -2.387002 0.870853 vertex -1.539837 -2.304533 1.148050 endloop endfacet facet normal 0.484117 0.807698 -0.336533 outer loop vertex -1.539837 -2.304533 1.148050 vertex -1.306539 -2.444367 1.148050 vertex -1.353294 -2.531839 0.870853 endloop endfacet facet normal 0.441101 0.735934 0.513645 outer loop vertex -1.175855 -2.199873 -1.666712 vertex -1.385818 -2.074026 -1.666712 vertex -1.469906 -2.199873 -1.414191 endloop endfacet facet normal 0.441101 0.735934 0.513645 outer loop vertex -1.469906 -2.199873 -1.414191 vertex -1.247203 -2.333356 -1.414191 vertex -1.175855 -2.199873 -1.666712 endloop endfacet facet normal 0.441101 0.735933 -0.513645 outer loop vertex -1.247203 -2.333356 1.414190 vertex -1.469906 -2.199873 1.414190 vertex -1.385818 -2.074026 1.666711 endloop endfacet facet normal 0.441101 0.735933 -0.513645 outer loop vertex -1.385818 -2.074026 1.666711 vertex -1.175855 -2.199873 1.666711 vertex -1.247203 -2.333356 1.414190 endloop endfacet facet normal 0.538623 0.726252 0.427133 outer loop vertex -1.469906 -2.199873 -1.414191 vertex -1.678454 -2.045204 -1.414191 vertex -1.758307 -2.142507 -1.148051 endloop endfacet facet normal 0.538623 0.726252 0.427133 outer loop vertex -1.758307 -2.142507 -1.148051 vertex -1.539838 -2.304534 -1.148051 vertex -1.469906 -2.199873 -1.414191 endloop endfacet facet normal 0.478675 0.645419 -0.595235 outer loop vertex -1.385818 -2.074026 1.666711 vertex -1.582435 -1.928205 1.666711 vertex -1.471177 -1.792637 1.903180 endloop endfacet facet normal 0.478674 0.645419 -0.595235 outer loop vertex -1.471177 -1.792637 1.903180 vertex -1.288383 -1.928206 1.903180 vertex -1.385818 -2.074026 1.666711 endloop endfacet facet normal 0.144906 0.195387 0.969962 outer loop vertex -0.325157 -0.486635 -2.942356 vertex -0.371290 -0.452421 -2.942356 vertex -0.552462 -0.673180 -2.870821 endloop endfacet facet normal 0.144906 0.195387 0.969962 outer loop vertex -0.552462 -0.673180 -2.870821 vertex -0.483818 -0.724089 -2.870821 vertex -0.325157 -0.486635 -2.942356 endloop endfacet facet normal 0.577888 0.779192 0.242704 outer loop vertex -1.594941 -2.387001 -0.870855 vertex -1.821228 -2.219175 -0.870855 vertex -1.866609 -2.274472 -0.585272 endloop endfacet facet normal 0.577890 0.779190 0.242705 outer loop vertex -1.866609 -2.274472 -0.585272 vertex -1.634684 -2.446480 -0.585272 vertex -1.594941 -2.387001 -0.870855 endloop endfacet facet normal 0.400312 0.539761 -0.740546 outer loop vertex -1.178540 -1.763813 2.121321 vertex -1.345749 -1.639803 2.121321 vertex -1.207363 -1.471179 2.319032 endloop endfacet facet normal 0.400314 0.539760 -0.740546 outer loop vertex -1.207363 -1.471179 2.319032 vertex -1.057349 -1.582437 2.319032 vertex -1.178540 -1.763813 2.121321 endloop endfacet facet normal 0.254945 0.343754 0.903790 outer loop vertex -0.637820 -0.954569 -2.771639 vertex -0.728313 -0.887455 -2.771639 vertex -0.897151 -1.093184 -2.645764 endloop endfacet facet normal 0.254946 0.343753 0.903790 outer loop vertex -0.897151 -1.093184 -2.645764 vertex -0.785680 -1.175857 -2.645764 vertex -0.637820 -0.954569 -2.771639 endloop endfacet facet normal 0.594982 0.802243 0.049010 outer loop vertex -1.658683 -2.482399 -0.294052 vertex -1.894014 -2.307866 -0.294052 vertex -1.903179 -2.319033 -0.000001 endloop endfacet facet normal 0.594983 0.802242 0.049011 outer loop vertex -1.903179 -2.319033 -0.000001 vertex -1.666709 -2.494411 -0.000001 vertex -1.658683 -2.482399 -0.294052 endloop endfacet facet normal 0.306520 0.413295 -0.857457 outer loop vertex -0.925973 -1.385821 2.494409 vertex -1.057349 -1.288386 2.494409 vertex -0.897151 -1.093185 2.645763 endloop endfacet facet normal 0.306524 0.413294 -0.857456 outer loop vertex -0.897151 -1.093185 2.645763 vertex -0.785681 -1.175858 2.645763 vertex -0.925973 -1.385821 2.494409 endloop endfacet facet normal 0.355132 0.478843 0.802864 outer loop vertex -0.925973 -1.385819 -2.494410 vertex -1.057348 -1.288385 -2.494410 vertex -1.207362 -1.471178 -2.319033 endloop endfacet facet normal 0.355133 0.478842 0.802864 outer loop vertex -1.207362 -1.471178 -2.319033 vertex -1.057348 -1.582436 -2.319033 vertex -0.925973 -1.385819 -2.494410 endloop endfacet facet normal 0.200899 0.270881 -0.941415 outer loop vertex -0.637821 -0.954570 2.771639 vertex -0.728314 -0.887456 2.771639 vertex -0.552463 -0.673181 2.870821 endloop endfacet facet normal 0.200896 0.270882 -0.941416 outer loop vertex -0.552463 -0.673181 2.870821 vertex -0.483819 -0.724090 2.870821 vertex -0.637821 -0.954570 2.771639 endloop endfacet facet normal 0.589266 0.794535 -0.146561 outer loop vertex -1.658683 -2.482399 0.294051 vertex -1.894014 -2.307866 0.294051 vertex -1.866609 -2.274472 0.585271 endloop endfacet facet normal 0.589269 0.794533 -0.146558 outer loop vertex -1.866609 -2.274472 0.585271 vertex -1.634684 -2.446480 0.585271 vertex -1.658683 -2.482399 0.294051 endloop endfacet facet normal 0.441623 0.595458 0.671118 outer loop vertex -1.178540 -1.763813 -2.121322 vertex -1.345749 -1.639802 -2.121322 vertex -1.471176 -1.792637 -1.903181 endloop endfacet facet normal 0.441622 0.595460 0.671116 outer loop vertex -1.471176 -1.792637 -1.903181 vertex -1.288383 -1.928205 -1.903181 vertex -1.178540 -1.763813 -2.121322 endloop endfacet facet normal 0.087510 0.117992 -0.989151 outer loop vertex -0.325158 -0.486637 2.942356 vertex -0.371291 -0.452422 2.942356 vertex -0.186543 -0.227307 2.985554 endloop endfacet facet normal 0.087510 0.117993 -0.989151 outer loop vertex -0.186543 -0.227307 2.985554 vertex -0.163365 -0.244497 2.985554 vertex -0.325158 -0.486637 2.942356 endloop endfacet facet normal 0.560952 0.756357 -0.336537 outer loop vertex -1.594941 -2.387002 0.870853 vertex -1.821228 -2.219176 0.870853 vertex -1.758306 -2.142505 1.148050 endloop endfacet facet normal 0.560953 0.756356 -0.336536 outer loop vertex -1.758306 -2.142505 1.148050 vertex -1.539837 -2.304533 1.148050 vertex -1.594941 -2.387002 0.870853 endloop endfacet facet normal 0.511111 0.689153 0.513647 outer loop vertex -1.385818 -2.074026 -1.666712 vertex -1.582435 -1.928205 -1.666712 vertex -1.678454 -2.045204 -1.414191 endloop endfacet facet normal 0.511110 0.689155 0.513645 outer loop vertex -1.678454 -2.045204 -1.414191 vertex -1.469906 -2.199873 -1.414191 vertex -1.385818 -2.074026 -1.666712 endloop endfacet facet normal 0.511109 0.689155 -0.513647 outer loop vertex -1.469906 -2.199873 1.414190 vertex -1.678454 -2.045204 1.414190 vertex -1.582435 -1.928205 1.666711 endloop endfacet facet normal 0.511111 0.689154 -0.513645 outer loop vertex -1.582435 -1.928205 1.666711 vertex -1.385818 -2.074026 1.666711 vertex -1.469906 -2.199873 1.414190 endloop endfacet facet normal 0.087509 0.117993 0.989151 outer loop vertex -0.163364 -0.244495 -2.985554 vertex -0.186542 -0.227305 -2.985554 vertex -0.371290 -0.452421 -2.942356 endloop endfacet facet normal 0.087508 0.117994 0.989151 outer loop vertex -0.371290 -0.452421 -2.942356 vertex -0.325157 -0.486635 -2.942356 vertex -0.163364 -0.244495 -2.985554 endloop endfacet facet normal 0.560952 0.756360 0.336528 outer loop vertex -1.539838 -2.304534 -1.148051 vertex -1.758307 -2.142507 -1.148051 vertex -1.821228 -2.219175 -0.870855 endloop endfacet facet normal 0.560954 0.756358 0.336531 outer loop vertex -1.821228 -2.219175 -0.870855 vertex -1.594941 -2.387001 -0.870855 vertex -1.539838 -2.304534 -1.148051 endloop endfacet facet normal 0.441622 0.595459 -0.671117 outer loop vertex -1.288383 -1.928206 1.903180 vertex -1.471177 -1.792637 1.903180 vertex -1.345749 -1.639803 2.121321 endloop endfacet facet normal 0.441620 0.595460 -0.671118 outer loop vertex -1.345749 -1.639803 2.121321 vertex -1.178540 -1.763813 2.121321 vertex -1.288383 -1.928206 1.903180 endloop endfacet facet normal 0.200897 0.270883 0.941415 outer loop vertex -0.483818 -0.724089 -2.870821 vertex -0.552462 -0.673180 -2.870821 vertex -0.728313 -0.887455 -2.771639 endloop endfacet facet normal 0.200898 0.270881 0.941416 outer loop vertex -0.728313 -0.887455 -2.771639 vertex -0.637820 -0.954569 -2.771639 vertex -0.483818 -0.724089 -2.870821 endloop endfacet facet normal 0.589268 0.794533 0.146561 outer loop vertex -1.634684 -2.446480 -0.585272 vertex -1.866609 -2.274472 -0.585272 vertex -1.894014 -2.307866 -0.294052 endloop endfacet facet normal 0.589266 0.794535 0.146558 outer loop vertex -1.894014 -2.307866 -0.294052 vertex -1.658683 -2.482399 -0.294052 vertex -1.634684 -2.446480 -0.585272 endloop endfacet facet normal 0.355134 0.478842 -0.802864 outer loop vertex -1.057349 -1.582437 2.319032 vertex -1.207363 -1.471179 2.319032 vertex -1.057349 -1.288386 2.494409 endloop endfacet facet normal 0.355133 0.478842 -0.802864 outer loop vertex -1.057349 -1.288386 2.494409 vertex -0.925973 -1.385821 2.494409 vertex -1.057349 -1.582437 2.319032 endloop endfacet facet normal 0.306522 0.413295 0.857456 outer loop vertex -0.785680 -1.175857 -2.645764 vertex -0.897151 -1.093184 -2.645764 vertex -1.057348 -1.288385 -2.494410 endloop endfacet facet normal 0.306521 0.413297 0.857456 outer loop vertex -1.057348 -1.288385 -2.494410 vertex -0.925973 -1.385819 -2.494410 vertex -0.785680 -1.175857 -2.645764 endloop endfacet facet normal 0.254950 0.343755 -0.903788 outer loop vertex -0.785681 -1.175858 2.645763 vertex -0.897151 -1.093185 2.645763 vertex -0.728314 -0.887456 2.771639 endloop endfacet facet normal 0.254946 0.343756 -0.903789 outer loop vertex -0.728314 -0.887456 2.771639 vertex -0.637821 -0.954570 2.771639 vertex -0.785681 -1.175858 2.645763 endloop endfacet facet normal 0.594983 0.802242 -0.049010 outer loop vertex -1.666709 -2.494411 -0.000001 vertex -1.903179 -2.319033 -0.000001 vertex -1.894014 -2.307866 0.294051 endloop endfacet facet normal 0.594982 0.802243 -0.049011 outer loop vertex -1.894014 -2.307866 0.294051 vertex -1.658683 -2.482399 0.294051 vertex -1.666709 -2.494411 -0.000001 endloop endfacet facet normal 0.400312 0.539759 0.740547 outer loop vertex -1.057348 -1.582436 -2.319033 vertex -1.207362 -1.471178 -2.319033 vertex -1.345749 -1.639802 -2.121322 endloop endfacet facet normal 0.400313 0.539758 0.740548 outer loop vertex -1.345749 -1.639802 -2.121322 vertex -1.178540 -1.763813 -2.121322 vertex -1.057348 -1.582436 -2.319033 endloop endfacet facet normal 0.144906 0.195387 -0.969962 outer loop vertex -0.483819 -0.724090 2.870821 vertex -0.552463 -0.673181 2.870821 vertex -0.371291 -0.452422 2.942356 endloop endfacet facet normal 0.144909 0.195385 -0.969962 outer loop vertex -0.371291 -0.452422 2.942356 vertex -0.325158 -0.486637 2.942356 vertex -0.483819 -0.724090 2.870821 endloop endfacet facet normal 0.577890 0.779191 -0.242702 outer loop vertex -1.634684 -2.446480 0.585271 vertex -1.866609 -2.274472 0.585271 vertex -1.821228 -2.219176 0.870853 endloop endfacet facet normal 0.577888 0.779192 -0.242704 outer loop vertex -1.821228 -2.219176 0.870853 vertex -1.594941 -2.387002 0.870853 vertex -1.634684 -2.446480 0.585271 endloop endfacet facet normal 0.478673 0.645419 0.595236 outer loop vertex -1.288383 -1.928205 -1.903181 vertex -1.471176 -1.792637 -1.903181 vertex -1.582435 -1.928205 -1.666712 endloop endfacet facet normal 0.478674 0.645417 0.595237 outer loop vertex -1.582435 -1.928205 -1.666712 vertex -1.385818 -2.074026 -1.666712 vertex -1.288383 -1.928205 -1.903181 endloop endfacet facet normal 0.538627 0.726253 -0.427127 outer loop vertex -1.539837 -2.304533 1.148050 vertex -1.758306 -2.142505 1.148050 vertex -1.678454 -2.045204 1.414190 endloop endfacet facet normal 0.538624 0.726254 -0.427129 outer loop vertex -1.678454 -2.045204 1.414190 vertex -1.469906 -2.199873 1.414190 vertex -1.539837 -2.304533 1.148050 endloop endfacet facet normal 0.576200 0.635737 0.513646 outer loop vertex -1.582435 -1.928205 -1.666712 vertex -1.763812 -1.763814 -1.666712 vertex -1.870836 -1.870838 -1.414191 endloop endfacet facet normal 0.576201 0.635736 0.513647 outer loop vertex -1.870836 -1.870838 -1.414191 vertex -1.678454 -2.045204 -1.414191 vertex -1.582435 -1.928205 -1.666712 endloop endfacet facet normal 0.576201 0.635736 -0.513646 outer loop vertex -1.678454 -2.045204 1.414190 vertex -1.870836 -1.870838 1.414190 vertex -1.763812 -1.763814 1.666711 endloop endfacet facet normal 0.576200 0.635736 -0.513647 outer loop vertex -1.763812 -1.763814 1.666711 vertex -1.582435 -1.928205 1.666711 vertex -1.678454 -2.045204 1.414190 endloop endfacet facet normal 0.098654 0.108846 0.989151 outer loop vertex -0.186542 -0.227305 -2.985554 vertex -0.207923 -0.207926 -2.985554 vertex -0.413847 -0.413849 -2.942356 endloop endfacet facet normal 0.098654 0.108846 0.989151 outer loop vertex -0.413847 -0.413849 -2.942356 vertex -0.371290 -0.452421 -2.942356 vertex -0.186542 -0.227305 -2.985554 endloop endfacet facet normal 0.632390 0.697733 0.336530 outer loop vertex -1.758307 -2.142507 -1.148051 vertex -1.959843 -1.959845 -1.148051 vertex -2.029976 -2.029977 -0.870855 endloop endfacet facet normal 0.632389 0.697734 0.336529 outer loop vertex -2.029976 -2.029977 -0.870855 vertex -1.821228 -2.219175 -0.870855 vertex -1.758307 -2.142507 -1.148051 endloop endfacet facet normal 0.497859 0.549306 -0.671118 outer loop vertex -1.471177 -1.792637 1.903180 vertex -1.639802 -1.639805 1.903180 vertex -1.499998 -1.500000 2.121321 endloop endfacet facet normal 0.497861 0.549305 -0.671117 outer loop vertex -1.499998 -1.500000 2.121321 vertex -1.345749 -1.639803 2.121321 vertex -1.471177 -1.792637 1.903180 endloop endfacet facet normal 0.226485 0.249882 0.941416 outer loop vertex -0.552462 -0.673180 -2.870821 vertex -0.615784 -0.615787 -2.870821 vertex -0.811792 -0.811794 -2.771639 endloop endfacet facet normal 0.226483 0.249885 0.941415 outer loop vertex -0.811792 -0.811794 -2.771639 vertex -0.728313 -0.887455 -2.771639 vertex -0.552462 -0.673180 -2.870821 endloop endfacet facet normal 0.664307 0.732950 0.146561 outer loop vertex -1.866609 -2.274472 -0.585272 vertex -2.080558 -2.080560 -0.585272 vertex -2.111104 -2.111107 -0.294052 endloop endfacet facet normal 0.664307 0.732950 0.146561 outer loop vertex -2.111104 -2.111107 -0.294052 vertex -1.894014 -2.307866 -0.294052 vertex -1.866609 -2.274472 -0.585272 endloop endfacet facet normal 0.400359 0.441727 -0.802864 outer loop vertex -1.207363 -1.471179 2.319032 vertex -1.345750 -1.345752 2.319032 vertex -1.178541 -1.178544 2.494409 endloop endfacet facet normal 0.400358 0.441727 -0.802864 outer loop vertex -1.178541 -1.178544 2.494409 vertex -1.057349 -1.288386 2.494409 vertex -1.207363 -1.471179 2.319032 endloop endfacet facet normal 0.345555 0.381264 0.857455 outer loop vertex -0.897151 -1.093184 -2.645764 vertex -0.999982 -0.999984 -2.645764 vertex -1.178540 -1.178542 -2.494410 endloop endfacet facet normal 0.345557 0.381260 0.857456 outer loop vertex -1.178540 -1.178542 -2.494410 vertex -1.057348 -1.288385 -2.494410 vertex -0.897151 -1.093184 -2.645764 endloop endfacet facet normal 0.287413 0.317113 -0.903788 outer loop vertex -0.897151 -1.093185 2.645763 vertex -0.999982 -0.999985 2.645763 vertex -0.811793 -0.811795 2.771639 endloop endfacet facet normal 0.287414 0.317113 -0.903788 outer loop vertex -0.811793 -0.811795 2.771639 vertex -0.728314 -0.887456 2.771639 vertex -0.897151 -1.093185 2.645763 endloop endfacet facet normal 0.670753 0.740060 -0.049009 outer loop vertex -1.903179 -2.319033 -0.000001 vertex -2.121319 -2.121322 -0.000001 vertex -2.111104 -2.111107 0.294051 endloop endfacet facet normal 0.670752 0.740061 -0.049010 outer loop vertex -2.111104 -2.111107 0.294051 vertex -1.894014 -2.307866 0.294051 vertex -1.903179 -2.319033 -0.000001 endloop endfacet facet normal 0.451290 0.497925 0.740546 outer loop vertex -1.207362 -1.471178 -2.319033 vertex -1.345749 -1.345752 -2.319033 vertex -1.499997 -1.499999 -2.121322 endloop endfacet facet normal 0.451292 0.497921 0.740547 outer loop vertex -1.499997 -1.499999 -2.121322 vertex -1.345749 -1.639802 -2.121322 vertex -1.207362 -1.471178 -2.319033 endloop endfacet facet normal 0.163362 0.180241 -0.969962 outer loop vertex -0.552463 -0.673181 2.870821 vertex -0.615786 -0.615788 2.870821 vertex -0.413848 -0.413850 2.942356 endloop endfacet facet normal 0.163363 0.180240 -0.969962 outer loop vertex -0.413848 -0.413850 2.942356 vertex -0.371291 -0.452422 2.942356 vertex -0.552463 -0.673181 2.870821 endloop endfacet facet normal 0.651480 0.718797 -0.242702 outer loop vertex -1.866609 -2.274472 0.585271 vertex -2.080558 -2.080560 0.585271 vertex -2.029976 -2.029978 0.870853 endloop endfacet facet normal 0.651480 0.718797 -0.242702 outer loop vertex -2.029976 -2.029978 0.870853 vertex -1.821228 -2.219176 0.870853 vertex -1.866609 -2.274472 0.585271 endloop endfacet facet normal 0.539632 0.595392 0.595236 outer loop vertex -1.471176 -1.792637 -1.903181 vertex -1.639801 -1.639804 -1.903181 vertex -1.763812 -1.763814 -1.666712 endloop endfacet facet normal 0.539633 0.595391 0.595237 outer loop vertex -1.763812 -1.763814 -1.666712 vertex -1.582435 -1.928205 -1.666712 vertex -1.471176 -1.792637 -1.903181 endloop endfacet facet normal 0.607216 0.669962 -0.427130 outer loop vertex -1.758306 -2.142505 1.148050 vertex -1.959842 -1.959844 1.148050 vertex -1.870836 -1.870838 1.414190 endloop endfacet facet normal 0.607220 0.669960 -0.427127 outer loop vertex -1.870836 -1.870838 1.414190 vertex -1.678454 -2.045204 1.414190 vertex -1.758306 -2.142505 1.148050 endloop endfacet facet normal 0.607218 0.669958 0.427134 outer loop vertex -1.678454 -2.045204 -1.414191 vertex -1.870836 -1.870838 -1.414191 vertex -1.959843 -1.959845 -1.148051 endloop endfacet facet normal 0.607217 0.669959 0.427133 outer loop vertex -1.959843 -1.959845 -1.148051 vertex -1.758307 -2.142507 -1.148051 vertex -1.678454 -2.045204 -1.414191 endloop endfacet facet normal 0.539634 0.595393 -0.595233 outer loop vertex -1.582435 -1.928205 1.666711 vertex -1.763812 -1.763814 1.666711 vertex -1.639802 -1.639805 1.903180 endloop endfacet facet normal 0.539631 0.595394 -0.595235 outer loop vertex -1.639802 -1.639805 1.903180 vertex -1.471177 -1.792637 1.903180 vertex -1.582435 -1.928205 1.666711 endloop endfacet facet normal 0.163363 0.180240 0.969962 outer loop vertex -0.371290 -0.452421 -2.942356 vertex -0.413847 -0.413849 -2.942356 vertex -0.615784 -0.615787 -2.870821 endloop endfacet facet normal 0.163363 0.180240 0.969962 outer loop vertex -0.615784 -0.615787 -2.870821 vertex -0.552462 -0.673180 -2.870821 vertex -0.371290 -0.452421 -2.942356 endloop endfacet facet normal 0.651480 0.718797 0.242704 outer loop vertex -1.821228 -2.219175 -0.870855 vertex -2.029976 -2.029977 -0.870855 vertex -2.080558 -2.080560 -0.585272 endloop endfacet facet normal 0.651479 0.718797 0.242704 outer loop vertex -2.080558 -2.080560 -0.585272 vertex -1.866609 -2.274472 -0.585272 vertex -1.821228 -2.219175 -0.870855 endloop endfacet facet normal 0.451291 0.497923 -0.740547 outer loop vertex -1.345749 -1.639803 2.121321 vertex -1.499998 -1.500000 2.121321 vertex -1.345750 -1.345752 2.319032 endloop endfacet facet normal 0.451292 0.497922 -0.740546 outer loop vertex -1.345750 -1.345752 2.319032 vertex -1.207363 -1.471179 2.319032 vertex -1.345749 -1.639803 2.121321 endloop endfacet facet normal 0.287411 0.317109 0.903790 outer loop vertex -0.728313 -0.887455 -2.771639 vertex -0.811792 -0.811794 -2.771639 vertex -0.999982 -0.999984 -2.645764 endloop endfacet facet normal 0.287410 0.317110 0.903790 outer loop vertex -0.999982 -0.999984 -2.645764 vertex -0.897151 -1.093184 -2.645764 vertex -0.728313 -0.887455 -2.771639 endloop endfacet facet normal 0.670752 0.740061 0.049010 outer loop vertex -1.894014 -2.307866 -0.294052 vertex -2.111104 -2.111107 -0.294052 vertex -2.121319 -2.121322 -0.000001 endloop endfacet facet normal 0.670753 0.740060 0.049011 outer loop vertex -2.121319 -2.121322 -0.000001 vertex -1.903179 -2.319033 -0.000001 vertex -1.894014 -2.307866 -0.294052 endloop endfacet facet normal 0.345554 0.381261 -0.857457 outer loop vertex -1.057349 -1.288386 2.494409 vertex -1.178541 -1.178544 2.494409 vertex -0.999982 -0.999985 2.645763 endloop endfacet facet normal 0.345553 0.381261 -0.857457 outer loop vertex -0.999982 -0.999985 2.645763 vertex -0.897151 -1.093185 2.645763 vertex -1.057349 -1.288386 2.494409 endloop endfacet facet normal 0.400359 0.441724 0.802866 outer loop vertex -1.057348 -1.288385 -2.494410 vertex -1.178540 -1.178542 -2.494410 vertex -1.345749 -1.345752 -2.319033 endloop endfacet facet normal 0.400357 0.441728 0.802864 outer loop vertex -1.345749 -1.345752 -2.319033 vertex -1.207362 -1.471178 -2.319033 vertex -1.057348 -1.288385 -2.494410 endloop endfacet facet normal 0.226483 0.249885 -0.941416 outer loop vertex -0.728314 -0.887456 2.771639 vertex -0.811793 -0.811795 2.771639 vertex -0.615786 -0.615788 2.870821 endloop endfacet facet normal 0.226484 0.249884 -0.941415 outer loop vertex -0.615786 -0.615788 2.870821 vertex -0.552463 -0.673181 2.870821 vertex -0.728314 -0.887456 2.771639 endloop endfacet facet normal 0.664307 0.732950 -0.146561 outer loop vertex -1.894014 -2.307866 0.294051 vertex -2.111104 -2.111107 0.294051 vertex -2.080558 -2.080560 0.585271 endloop endfacet facet normal 0.664307 0.732950 -0.146561 outer loop vertex -2.080558 -2.080560 0.585271 vertex -1.866609 -2.274472 0.585271 vertex -1.894014 -2.307866 0.294051 endloop endfacet facet normal 0.497862 0.549303 0.671118 outer loop vertex -1.345749 -1.639802 -2.121322 vertex -1.499997 -1.499999 -2.121322 vertex -1.639801 -1.639804 -1.903181 endloop endfacet facet normal 0.497861 0.549305 0.671117 outer loop vertex -1.639801 -1.639804 -1.903181 vertex -1.471176 -1.792637 -1.903181 vertex -1.345749 -1.639802 -2.121322 endloop endfacet facet normal 0.098654 0.108847 -0.989151 outer loop vertex -0.371291 -0.452422 2.942356 vertex -0.413848 -0.413850 2.942356 vertex -0.207925 -0.207927 2.985554 endloop endfacet facet normal 0.098655 0.108846 -0.989151 outer loop vertex -0.207925 -0.207927 2.985554 vertex -0.186543 -0.227307 2.985554 vertex -0.371291 -0.452422 2.942356 endloop endfacet facet normal 0.632387 0.697732 -0.336535 outer loop vertex -1.821228 -2.219176 0.870853 vertex -2.029976 -2.029978 0.870853 vertex -1.959842 -1.959844 1.148050 endloop endfacet facet normal 0.632386 0.697733 -0.336537 outer loop vertex -1.959842 -1.959844 1.148050 vertex -1.758306 -2.142505 1.148050 vertex -1.821228 -2.219176 0.870853 endloop endfacet facet normal 0.595391 0.539632 0.595237 outer loop vertex -1.639801 -1.639804 -1.903181 vertex -1.792634 -1.471179 -1.903181 vertex -1.928203 -1.582437 -1.666712 endloop endfacet facet normal 0.595391 0.539633 0.595236 outer loop vertex -1.928203 -1.582437 -1.666712 vertex -1.763812 -1.763814 -1.666712 vertex -1.639801 -1.639804 -1.903181 endloop endfacet facet normal 0.669960 0.607218 -0.427130 outer loop vertex -1.959842 -1.959844 1.148050 vertex -2.142503 -1.758309 1.148050 vertex -2.045202 -1.678455 1.414190 endloop endfacet facet normal 0.669960 0.607217 -0.427130 outer loop vertex -2.045202 -1.678455 1.414190 vertex -1.870836 -1.870838 1.414190 vertex -1.959842 -1.959844 1.148050 endloop endfacet facet normal 0.669959 0.607216 0.427134 outer loop vertex -1.870836 -1.870838 -1.414191 vertex -2.045202 -1.678455 -1.414191 vertex -2.142504 -1.758310 -1.148051 endloop endfacet facet normal 0.669959 0.607216 0.427134 outer loop vertex -2.142504 -1.758310 -1.148051 vertex -1.959843 -1.959845 -1.148051 vertex -1.870836 -1.870838 -1.414191 endloop endfacet facet normal 0.595392 0.539634 -0.595234 outer loop vertex -1.763812 -1.763814 1.666711 vertex -1.928203 -1.582437 1.666711 vertex -1.792635 -1.471180 1.903180 endloop endfacet facet normal 0.595393 0.539634 -0.595233 outer loop vertex -1.792635 -1.471180 1.903180 vertex -1.639802 -1.639805 1.903180 vertex -1.763812 -1.763814 1.666711 endloop endfacet facet normal 0.180242 0.163360 0.969962 outer loop vertex -0.413847 -0.413849 -2.942356 vertex -0.452418 -0.371292 -2.942356 vertex -0.673177 -0.552464 -2.870821 endloop endfacet facet normal 0.180241 0.163362 0.969962 outer loop vertex -0.673177 -0.552464 -2.870821 vertex -0.615784 -0.615787 -2.870821 vertex -0.413847 -0.413849 -2.942356 endloop endfacet facet normal 0.718797 0.651479 0.242704 outer loop vertex -2.029976 -2.029977 -0.870855 vertex -2.219173 -1.821230 -0.870855 vertex -2.274470 -1.866611 -0.585272 endloop endfacet facet normal 0.718797 0.651480 0.242704 outer loop vertex -2.274470 -1.866611 -0.585272 vertex -2.080558 -2.080560 -0.585272 vertex -2.029976 -2.029977 -0.870855 endloop endfacet facet normal 0.497923 0.451291 -0.740546 outer loop vertex -1.499998 -1.500000 2.121321 vertex -1.639801 -1.345751 2.121321 vertex -1.471177 -1.207365 2.319032 endloop endfacet facet normal 0.497922 0.451292 -0.740547 outer loop vertex -1.471177 -1.207365 2.319032 vertex -1.345750 -1.345752 2.319032 vertex -1.499998 -1.500000 2.121321 endloop endfacet facet normal 0.317111 0.287409 0.903791 outer loop vertex -0.811792 -0.811794 -2.771639 vertex -0.887452 -0.728315 -2.771639 vertex -1.093182 -0.897153 -2.645764 endloop endfacet facet normal 0.317110 0.287410 0.903790 outer loop vertex -1.093182 -0.897153 -2.645764 vertex -0.999982 -0.999984 -2.645764 vertex -0.811792 -0.811794 -2.771639 endloop endfacet facet normal 0.740061 0.670752 0.049009 outer loop vertex -2.111104 -2.111107 -0.294052 vertex -2.307863 -1.894017 -0.294052 vertex -2.319030 -1.903181 -0.000001 endloop endfacet facet normal 0.740061 0.670751 0.049010 outer loop vertex -2.319030 -1.903181 -0.000001 vertex -2.121319 -2.121322 -0.000001 vertex -2.111104 -2.111107 -0.294052 endloop endfacet facet normal 0.381261 0.345555 -0.857457 outer loop vertex -1.178541 -1.178544 2.494409 vertex -1.288384 -1.057351 2.494409 vertex -1.093183 -0.897154 2.645763 endloop endfacet facet normal 0.381260 0.345555 -0.857457 outer loop vertex -1.093183 -0.897154 2.645763 vertex -0.999982 -0.999985 2.645763 vertex -1.178541 -1.178544 2.494409 endloop endfacet facet normal 0.441725 0.400359 0.802865 outer loop vertex -1.178540 -1.178542 -2.494410 vertex -1.288383 -1.057350 -2.494410 vertex -1.471176 -1.207365 -2.319033 endloop endfacet facet normal 0.441725 0.400358 0.802865 outer loop vertex -1.471176 -1.207365 -2.319033 vertex -1.345749 -1.345752 -2.319033 vertex -1.178540 -1.178542 -2.494410 endloop endfacet facet normal 0.249887 0.226482 -0.941415 outer loop vertex -0.811793 -0.811795 2.771639 vertex -0.887453 -0.728316 2.771639 vertex -0.673179 -0.552465 2.870821 endloop endfacet facet normal 0.249884 0.226483 -0.941415 outer loop vertex -0.673179 -0.552465 2.870821 vertex -0.615786 -0.615788 2.870821 vertex -0.811793 -0.811795 2.771639 endloop endfacet facet normal 0.732950 0.664307 -0.146560 outer loop vertex -2.111104 -2.111107 0.294051 vertex -2.307863 -1.894017 0.294051 vertex -2.274470 -1.866611 0.585271 endloop endfacet facet normal 0.732950 0.664307 -0.146560 outer loop vertex -2.274470 -1.866611 0.585271 vertex -2.080558 -2.080560 0.585271 vertex -2.111104 -2.111107 0.294051 endloop endfacet facet normal 0.549304 0.497862 0.671117 outer loop vertex -1.499997 -1.499999 -2.121322 vertex -1.639800 -1.345751 -2.121322 vertex -1.792634 -1.471179 -1.903181 endloop endfacet facet normal 0.549304 0.497861 0.671118 outer loop vertex -1.792634 -1.471179 -1.903181 vertex -1.639801 -1.639804 -1.903181 vertex -1.499997 -1.499999 -2.121322 endloop endfacet facet normal 0.108847 0.098654 -0.989151 outer loop vertex -0.413848 -0.413850 2.942356 vertex -0.452420 -0.371293 2.942356 vertex -0.227304 -0.186546 2.985554 endloop endfacet facet normal 0.108846 0.098655 -0.989151 outer loop vertex -0.227304 -0.186546 2.985554 vertex -0.207925 -0.207927 2.985554 vertex -0.413848 -0.413850 2.942356 endloop endfacet facet normal 0.697733 0.632388 -0.336534 outer loop vertex -2.029976 -2.029978 0.870853 vertex -2.219174 -1.821230 0.870853 vertex -2.142503 -1.758309 1.148050 endloop endfacet facet normal 0.697731 0.632388 -0.336535 outer loop vertex -2.142503 -1.758309 1.148050 vertex -1.959842 -1.959844 1.148050 vertex -2.029976 -2.029978 0.870853 endloop endfacet facet normal 0.635737 0.576200 0.513645 outer loop vertex -1.763812 -1.763814 -1.666712 vertex -1.928203 -1.582437 -1.666712 vertex -2.045202 -1.678455 -1.414191 endloop endfacet facet normal 0.635737 0.576199 0.513646 outer loop vertex -2.045202 -1.678455 -1.414191 vertex -1.870836 -1.870838 -1.414191 vertex -1.763812 -1.763814 -1.666712 endloop endfacet facet normal 0.635738 0.576200 -0.513645 outer loop vertex -1.870836 -1.870838 1.414190 vertex -2.045202 -1.678455 1.414190 vertex -1.928203 -1.582437 1.666711 endloop endfacet facet normal 0.635737 0.576200 -0.513646 outer loop vertex -1.928203 -1.582437 1.666711 vertex -1.763812 -1.763814 1.666711 vertex -1.870836 -1.870838 1.414190 endloop endfacet facet normal 0.108848 0.098652 0.989151 outer loop vertex -0.207923 -0.207926 -2.985554 vertex -0.227302 -0.186544 -2.985554 vertex -0.452418 -0.371292 -2.942356 endloop endfacet facet normal 0.108848 0.098653 0.989151 outer loop vertex -0.452418 -0.371292 -2.942356 vertex -0.413847 -0.413849 -2.942356 vertex -0.207923 -0.207926 -2.985554 endloop endfacet facet normal 0.697733 0.632389 0.336529 outer loop vertex -1.959843 -1.959845 -1.148051 vertex -2.142504 -1.758310 -1.148051 vertex -2.219173 -1.821230 -0.870855 endloop endfacet facet normal 0.697734 0.632388 0.336530 outer loop vertex -2.219173 -1.821230 -0.870855 vertex -2.029976 -2.029977 -0.870855 vertex -1.959843 -1.959845 -1.148051 endloop endfacet facet normal 0.549304 0.497861 -0.671118 outer loop vertex -1.639802 -1.639805 1.903180 vertex -1.792635 -1.471180 1.903180 vertex -1.639801 -1.345751 2.121321 endloop endfacet facet normal 0.549305 0.497860 -0.671118 outer loop vertex -1.639801 -1.345751 2.121321 vertex -1.499998 -1.500000 2.121321 vertex -1.639802 -1.639805 1.903180 endloop endfacet facet normal 0.249884 0.226484 0.941415 outer loop vertex -0.615784 -0.615787 -2.870821 vertex -0.673177 -0.552464 -2.870821 vertex -0.887452 -0.728315 -2.771639 endloop endfacet facet normal 0.249886 0.226481 0.941416 outer loop vertex -0.887452 -0.728315 -2.771639 vertex -0.811792 -0.811794 -2.771639 vertex -0.615784 -0.615787 -2.870821 endloop endfacet facet normal 0.732950 0.664307 0.146560 outer loop vertex -2.080558 -2.080560 -0.585272 vertex -2.274470 -1.866611 -0.585272 vertex -2.307863 -1.894017 -0.294052 endloop endfacet facet normal 0.732950 0.664307 0.146560 outer loop vertex -2.307863 -1.894017 -0.294052 vertex -2.111104 -2.111107 -0.294052 vertex -2.080558 -2.080560 -0.585272 endloop endfacet facet normal 0.441727 0.400359 -0.802864 outer loop vertex -1.345750 -1.345752 2.319032 vertex -1.471177 -1.207365 2.319032 vertex -1.288384 -1.057351 2.494409 endloop endfacet facet normal 0.441727 0.400358 -0.802864 outer loop vertex -1.288384 -1.057351 2.494409 vertex -1.178541 -1.178544 2.494409 vertex -1.345750 -1.345752 2.319032 endloop endfacet facet normal 0.381262 0.345554 0.857457 outer loop vertex -0.999982 -0.999984 -2.645764 vertex -1.093182 -0.897153 -2.645764 vertex -1.288383 -1.057350 -2.494410 endloop endfacet facet normal 0.381261 0.345558 0.857455 outer loop vertex -1.288383 -1.057350 -2.494410 vertex -1.178540 -1.178542 -2.494410 vertex -0.999982 -0.999984 -2.645764 endloop endfacet facet normal 0.317111 0.287414 -0.903789 outer loop vertex -0.999982 -0.999985 2.645763 vertex -1.093183 -0.897154 2.645763 vertex -0.887453 -0.728316 2.771639 endloop endfacet facet normal 0.317114 0.287412 -0.903788 outer loop vertex -0.887453 -0.728316 2.771639 vertex -0.811793 -0.811795 2.771639 vertex -0.999982 -0.999985 2.645763 endloop endfacet facet normal 0.740061 0.670751 -0.049009 outer loop vertex -2.121319 -2.121322 -0.000001 vertex -2.319030 -1.903181 -0.000001 vertex -2.307863 -1.894017 0.294051 endloop endfacet facet normal 0.740061 0.670752 -0.049010 outer loop vertex -2.307863 -1.894017 0.294051 vertex -2.111104 -2.111107 0.294051 vertex -2.121319 -2.121322 -0.000001 endloop endfacet facet normal 0.497922 0.451292 0.740546 outer loop vertex -1.345749 -1.345752 -2.319033 vertex -1.471176 -1.207365 -2.319033 vertex -1.639800 -1.345751 -2.121322 endloop endfacet facet normal 0.497922 0.451293 0.740546 outer loop vertex -1.639800 -1.345751 -2.121322 vertex -1.499997 -1.499999 -2.121322 vertex -1.345749 -1.345752 -2.319033 endloop endfacet facet normal 0.180241 0.163362 -0.969962 outer loop vertex -0.615786 -0.615788 2.870821 vertex -0.673179 -0.552465 2.870821 vertex -0.452420 -0.371293 2.942356 endloop endfacet facet normal 0.180240 0.163362 -0.969962 outer loop vertex -0.452420 -0.371293 2.942356 vertex -0.413848 -0.413850 2.942356 vertex -0.615786 -0.615788 2.870821 endloop endfacet facet normal 0.718797 0.651480 -0.242703 outer loop vertex -2.080558 -2.080560 0.585271 vertex -2.274470 -1.866611 0.585271 vertex -2.219174 -1.821230 0.870853 endloop endfacet facet normal 0.718798 0.651480 -0.242702 outer loop vertex -2.219174 -1.821230 0.870853 vertex -2.029976 -2.029978 0.870853 vertex -2.080558 -2.080560 0.585271 endloop endfacet facet normal 0.595458 0.441623 0.671117 outer loop vertex -1.639800 -1.345751 -2.121322 vertex -1.763811 -1.178542 -2.121322 vertex -1.928203 -1.288386 -1.903181 endloop endfacet facet normal 0.595458 0.441623 0.671117 outer loop vertex -1.928203 -1.288386 -1.903181 vertex -1.792634 -1.471179 -1.903181 vertex -1.639800 -1.345751 -2.121322 endloop endfacet facet normal 0.117994 0.087508 -0.989151 outer loop vertex -0.452420 -0.371293 2.942356 vertex -0.486634 -0.325160 2.942356 vertex -0.244494 -0.163367 2.985554 endloop endfacet facet normal 0.117995 0.087507 -0.989151 outer loop vertex -0.244494 -0.163367 2.985554 vertex -0.227304 -0.186546 2.985554 vertex -0.452420 -0.371293 2.942356 endloop endfacet facet normal 0.756357 0.560953 -0.336534 outer loop vertex -2.219174 -1.821230 0.870853 vertex -2.387000 -1.594943 0.870853 vertex -2.304531 -1.539840 1.148050 endloop endfacet facet normal 0.756357 0.560954 -0.336534 outer loop vertex -2.304531 -1.539840 1.148050 vertex -2.142503 -1.758309 1.148050 vertex -2.219174 -1.821230 0.870853 endloop endfacet facet normal 0.689154 0.511111 0.513646 outer loop vertex -1.928203 -1.582437 -1.666712 vertex -2.074024 -1.385820 -1.666712 vertex -2.199871 -1.469908 -1.414191 endloop endfacet facet normal 0.689154 0.511112 0.513645 outer loop vertex -2.199871 -1.469908 -1.414191 vertex -2.045202 -1.678455 -1.414191 vertex -1.928203 -1.582437 -1.666712 endloop endfacet facet normal 0.689154 0.511111 -0.513646 outer loop vertex -2.045202 -1.678455 1.414190 vertex -2.199871 -1.469908 1.414190 vertex -2.074024 -1.385820 1.666711 endloop endfacet facet normal 0.689154 0.511111 -0.513645 outer loop vertex -2.074024 -1.385820 1.666711 vertex -1.928203 -1.582437 1.666711 vertex -2.045202 -1.678455 1.414190 endloop endfacet facet normal 0.117993 0.087509 0.989151 outer loop vertex -0.227302 -0.186544 -2.985554 vertex -0.244492 -0.163366 -2.985554 vertex -0.486633 -0.325159 -2.942356 endloop endfacet facet normal 0.117992 0.087510 0.989151 outer loop vertex -0.486633 -0.325159 -2.942356 vertex -0.452418 -0.371292 -2.942356 vertex -0.227302 -0.186544 -2.985554 endloop endfacet facet normal 0.756358 0.560955 0.336528 outer loop vertex -2.142504 -1.758310 -1.148051 vertex -2.304532 -1.539841 -1.148051 vertex -2.386999 -1.594943 -0.870855 endloop endfacet facet normal 0.756359 0.560954 0.336529 outer loop vertex -2.386999 -1.594943 -0.870855 vertex -2.219173 -1.821230 -0.870855 vertex -2.142504 -1.758310 -1.148051 endloop endfacet facet normal 0.595461 0.441620 -0.671117 outer loop vertex -1.792635 -1.471180 1.903180 vertex -1.928203 -1.288386 1.903180 vertex -1.763811 -1.178542 2.121321 endloop endfacet facet normal 0.595459 0.441620 -0.671118 outer loop vertex -1.763811 -1.178542 2.121321 vertex -1.639801 -1.345751 2.121321 vertex -1.792635 -1.471180 1.903180 endloop endfacet facet normal 0.270881 0.200898 0.941416 outer loop vertex -0.673177 -0.552464 -2.870821 vertex -0.724086 -0.483821 -2.870821 vertex -0.954566 -0.637823 -2.771639 endloop endfacet facet normal 0.270880 0.200900 0.941415 outer loop vertex -0.954566 -0.637823 -2.771639 vertex -0.887452 -0.728315 -2.771639 vertex -0.673177 -0.552464 -2.870821 endloop endfacet facet normal 0.794535 0.589266 0.146560 outer loop vertex -2.274470 -1.866611 -0.585272 vertex -2.446478 -1.634685 -0.585272 vertex -2.482396 -1.658686 -0.294052 endloop endfacet facet normal 0.794535 0.589266 0.146560 outer loop vertex -2.482396 -1.658686 -0.294052 vertex -2.307863 -1.894017 -0.294052 vertex -2.274470 -1.866611 -0.585272 endloop endfacet facet normal 0.478842 0.355133 -0.802864 outer loop vertex -1.471177 -1.207365 2.319032 vertex -1.582435 -1.057351 2.319032 vertex -1.385818 -0.925976 2.494409 endloop endfacet facet normal 0.478843 0.355133 -0.802864 outer loop vertex -1.385818 -0.925976 2.494409 vertex -1.288384 -1.057351 2.494409 vertex -1.471177 -1.207365 2.319032 endloop endfacet facet normal 0.413296 0.306520 0.857457 outer loop vertex -1.093182 -0.897153 -2.645764 vertex -1.175854 -0.785682 -2.645764 vertex -1.385817 -0.925975 -2.494410 endloop endfacet facet normal 0.413296 0.306520 0.857456 outer loop vertex -1.385817 -0.925975 -2.494410 vertex -1.288383 -1.057350 -2.494410 vertex -1.093182 -0.897153 -2.645764 endloop endfacet facet normal 0.343757 0.254946 -0.903789 outer loop vertex -1.093183 -0.897154 2.645763 vertex -1.175855 -0.785683 2.645763 vertex -0.954567 -0.637823 2.771639 endloop endfacet facet normal 0.343756 0.254946 -0.903789 outer loop vertex -0.954567 -0.637823 2.771639 vertex -0.887453 -0.728316 2.771639 vertex -1.093183 -0.897154 2.645763 endloop endfacet facet normal 0.802241 0.594985 -0.049011 outer loop vertex -2.319030 -1.903181 -0.000001 vertex -2.494408 -1.666712 -0.000001 vertex -2.482396 -1.658686 0.294051 endloop endfacet facet normal 0.802243 0.594983 -0.049009 outer loop vertex -2.482396 -1.658686 0.294051 vertex -2.307863 -1.894017 0.294051 vertex -2.319030 -1.903181 -0.000001 endloop endfacet facet normal 0.539760 0.400311 0.740548 outer loop vertex -1.471176 -1.207365 -2.319033 vertex -1.582434 -1.057350 -2.319033 vertex -1.763811 -1.178542 -2.121322 endloop endfacet facet normal 0.539759 0.400314 0.740546 outer loop vertex -1.763811 -1.178542 -2.121322 vertex -1.639800 -1.345751 -2.121322 vertex -1.471176 -1.207365 -2.319033 endloop endfacet facet normal 0.195385 0.144907 -0.969962 outer loop vertex -0.673179 -0.552465 2.870821 vertex -0.724088 -0.483822 2.870821 vertex -0.486634 -0.325160 2.942356 endloop endfacet facet normal 0.195387 0.144906 -0.969962 outer loop vertex -0.486634 -0.325160 2.942356 vertex -0.452420 -0.371293 2.942356 vertex -0.673179 -0.552465 2.870821 endloop endfacet facet normal 0.779193 0.577888 -0.242701 outer loop vertex -2.274470 -1.866611 0.585271 vertex -2.446478 -1.634685 0.585271 vertex -2.387000 -1.594943 0.870853 endloop endfacet facet normal 0.779192 0.577889 -0.242703 outer loop vertex -2.387000 -1.594943 0.870853 vertex -2.219174 -1.821230 0.870853 vertex -2.274470 -1.866611 0.585271 endloop endfacet facet normal 0.645418 0.478676 0.595236 outer loop vertex -1.792634 -1.471179 -1.903181 vertex -1.928203 -1.288386 -1.903181 vertex -2.074024 -1.385820 -1.666712 endloop endfacet facet normal 0.645418 0.478674 0.595237 outer loop vertex -2.074024 -1.385820 -1.666712 vertex -1.928203 -1.582437 -1.666712 vertex -1.792634 -1.471179 -1.903181 endloop endfacet facet normal 0.726251 0.538626 -0.427131 outer loop vertex -2.142503 -1.758309 1.148050 vertex -2.304531 -1.539840 1.148050 vertex -2.199871 -1.469908 1.414190 endloop endfacet facet normal 0.726252 0.538626 -0.427130 outer loop vertex -2.199871 -1.469908 1.414190 vertex -2.045202 -1.678455 1.414190 vertex -2.142503 -1.758309 1.148050 endloop endfacet facet normal 0.726250 0.538624 0.427135 outer loop vertex -2.045202 -1.678455 -1.414191 vertex -2.199871 -1.469908 -1.414191 vertex -2.304532 -1.539841 -1.148051 endloop endfacet facet normal 0.726250 0.538625 0.427134 outer loop vertex -2.304532 -1.539841 -1.148051 vertex -2.142504 -1.758310 -1.148051 vertex -2.045202 -1.678455 -1.414191 endloop endfacet facet normal 0.645419 0.478675 -0.595236 outer loop vertex -1.928203 -1.582437 1.666711 vertex -2.074024 -1.385820 1.666711 vertex -1.928203 -1.288386 1.903180 endloop endfacet facet normal 0.645422 0.478673 -0.595234 outer loop vertex -1.928203 -1.288386 1.903180 vertex -1.792635 -1.471180 1.903180 vertex -1.928203 -1.582437 1.666711 endloop endfacet facet normal 0.195385 0.144909 0.969962 outer loop vertex -0.452418 -0.371292 -2.942356 vertex -0.486633 -0.325159 -2.942356 vertex -0.724086 -0.483821 -2.870821 endloop endfacet facet normal 0.195386 0.144908 0.969962 outer loop vertex -0.724086 -0.483821 -2.870821 vertex -0.673177 -0.552464 -2.870821 vertex -0.452418 -0.371292 -2.942356 endloop endfacet facet normal 0.779192 0.577888 0.242704 outer loop vertex -2.219173 -1.821230 -0.870855 vertex -2.386999 -1.594943 -0.870855 vertex -2.446478 -1.634685 -0.585272 endloop endfacet facet normal 0.779192 0.577888 0.242704 outer loop vertex -2.446478 -1.634685 -0.585272 vertex -2.274470 -1.866611 -0.585272 vertex -2.219173 -1.821230 -0.870855 endloop endfacet facet normal 0.539761 0.400312 -0.740546 outer loop vertex -1.639801 -1.345751 2.121321 vertex -1.763811 -1.178542 2.121321 vertex -1.582435 -1.057351 2.319032 endloop endfacet facet normal 0.539760 0.400313 -0.740547 outer loop vertex -1.582435 -1.057351 2.319032 vertex -1.471177 -1.207365 2.319032 vertex -1.639801 -1.345751 2.121321 endloop endfacet facet normal 0.343753 0.254947 0.903790 outer loop vertex -0.887452 -0.728315 -2.771639 vertex -0.954566 -0.637823 -2.771639 vertex -1.175854 -0.785682 -2.645764 endloop endfacet facet normal 0.343754 0.254944 0.903790 outer loop vertex -1.175854 -0.785682 -2.645764 vertex -1.093182 -0.897153 -2.645764 vertex -0.887452 -0.728315 -2.771639 endloop endfacet facet normal 0.802243 0.594983 0.049011 outer loop vertex -2.307863 -1.894017 -0.294052 vertex -2.482396 -1.658686 -0.294052 vertex -2.494408 -1.666712 -0.000001 endloop endfacet facet normal 0.802241 0.594985 0.049009 outer loop vertex -2.494408 -1.666712 -0.000001 vertex -2.319030 -1.903181 -0.000001 vertex -2.307863 -1.894017 -0.294052 endloop endfacet facet normal 0.413296 0.306520 -0.857457 outer loop vertex -1.288384 -1.057351 2.494409 vertex -1.385818 -0.925976 2.494409 vertex -1.175855 -0.785683 2.645763 endloop endfacet facet normal 0.413296 0.306519 -0.857457 outer loop vertex -1.175855 -0.785683 2.645763 vertex -1.093183 -0.897154 2.645763 vertex -1.288384 -1.057351 2.494409 endloop endfacet facet normal 0.478842 0.355132 0.802864 outer loop vertex -1.288383 -1.057350 -2.494410 vertex -1.385817 -0.925975 -2.494410 vertex -1.582434 -1.057350 -2.319033 endloop endfacet facet normal 0.478842 0.355131 0.802865 outer loop vertex -1.582434 -1.057350 -2.319033 vertex -1.471176 -1.207365 -2.319033 vertex -1.288383 -1.057350 -2.494410 endloop endfacet facet normal 0.270882 0.200899 -0.941415 outer loop vertex -0.887453 -0.728316 2.771639 vertex -0.954567 -0.637823 2.771639 vertex -0.724088 -0.483822 2.870821 endloop endfacet facet normal 0.270882 0.200899 -0.941415 outer loop vertex -0.724088 -0.483822 2.870821 vertex -0.673179 -0.552465 2.870821 vertex -0.887453 -0.728316 2.771639 endloop endfacet facet normal 0.794535 0.589266 -0.146560 outer loop vertex -2.307863 -1.894017 0.294051 vertex -2.482396 -1.658686 0.294051 vertex -2.446478 -1.634685 0.585271 endloop endfacet facet normal 0.794535 0.589266 -0.146560 outer loop vertex -2.446478 -1.634685 0.585271 vertex -2.274470 -1.866611 0.585271 vertex -2.307863 -1.894017 0.294051 endloop endfacet facet normal 0.576397 0.345481 0.740547 outer loop vertex -1.582434 -1.057350 -2.319033 vertex -1.678453 -0.897153 -2.319033 vertex -1.870835 -0.999983 -2.121322 endloop endfacet facet normal 0.576397 0.345479 0.740548 outer loop vertex -1.870835 -0.999983 -2.121322 vertex -1.763811 -1.178542 -2.121322 vertex -1.582434 -1.057350 -2.319033 endloop endfacet facet normal 0.208648 0.125059 -0.969962 outer loop vertex -0.724088 -0.483822 2.870821 vertex -0.768024 -0.410519 2.870821 vertex -0.516162 -0.275896 2.942356 endloop endfacet facet normal 0.208647 0.125060 -0.969962 outer loop vertex -0.516162 -0.275896 2.942356 vertex -0.486634 -0.325160 2.942356 vertex -0.724088 -0.483822 2.870821 endloop endfacet facet normal 0.832085 0.498729 -0.242701 outer loop vertex -2.446478 -1.634685 0.585271 vertex -2.594924 -1.387016 0.585271 vertex -2.531837 -1.353296 0.870853 endloop endfacet facet normal 0.832085 0.498730 -0.242701 outer loop vertex -2.531837 -1.353296 0.870853 vertex -2.387000 -1.594943 0.870853 vertex -2.446478 -1.634685 0.585271 endloop endfacet facet normal 0.689229 0.413108 0.595235 outer loop vertex -1.928203 -1.288386 -1.903181 vertex -2.045202 -1.093185 -1.903181 vertex -2.199871 -1.175856 -1.666712 endloop endfacet facet normal 0.689229 0.413107 0.595236 outer loop vertex -2.199871 -1.175856 -1.666712 vertex -2.074024 -1.385820 -1.666712 vertex -1.928203 -1.288386 -1.903181 endloop endfacet facet normal 0.775552 0.464844 -0.427129 outer loop vertex -2.304531 -1.539840 1.148050 vertex -2.444364 -1.306541 1.148050 vertex -2.333354 -1.247205 1.414190 endloop endfacet facet normal 0.775550 0.464846 -0.427131 outer loop vertex -2.333354 -1.247205 1.414190 vertex -2.199871 -1.469908 1.414190 vertex -2.304531 -1.539840 1.148050 endloop endfacet facet normal 0.775548 0.464845 0.427135 outer loop vertex -2.199871 -1.469908 -1.414191 vertex -2.333354 -1.247205 -1.414191 vertex -2.444366 -1.306542 -1.148051 endloop endfacet facet normal 0.775548 0.464845 0.427135 outer loop vertex -2.444366 -1.306542 -1.148051 vertex -2.304532 -1.539841 -1.148051 vertex -2.199871 -1.469908 -1.414191 endloop endfacet facet normal 0.689230 0.413107 -0.595235 outer loop vertex -2.074024 -1.385820 1.666711 vertex -2.199871 -1.175856 1.666711 vertex -2.045202 -1.093185 1.903180 endloop endfacet facet normal 0.689229 0.413108 -0.595236 outer loop vertex -2.045202 -1.093185 1.903180 vertex -1.928203 -1.288386 1.903180 vertex -2.074024 -1.385820 1.666711 endloop endfacet facet normal 0.208648 0.125060 0.969962 outer loop vertex -0.486633 -0.325159 -2.942356 vertex -0.516161 -0.275895 -2.942356 vertex -0.768022 -0.410518 -2.870821 endloop endfacet facet normal 0.208649 0.125059 0.969962 outer loop vertex -0.768022 -0.410518 -2.870821 vertex -0.724086 -0.483821 -2.870821 vertex -0.486633 -0.325159 -2.942356 endloop endfacet facet normal 0.832083 0.498733 0.242700 outer loop vertex -2.386999 -1.594943 -0.870855 vertex -2.531837 -1.353296 -0.870855 vertex -2.594924 -1.387016 -0.585272 endloop endfacet facet normal 0.832084 0.498729 0.242704 outer loop vertex -2.594924 -1.387016 -0.585272 vertex -2.446478 -1.634685 -0.585272 vertex -2.386999 -1.594943 -0.870855 endloop endfacet facet normal 0.576400 0.345480 -0.740545 outer loop vertex -1.763811 -1.178542 2.121321 vertex -1.870835 -0.999983 2.121321 vertex -1.678454 -0.897153 2.319032 endloop endfacet facet normal 0.576399 0.345480 -0.740546 outer loop vertex -1.678454 -0.897153 2.319032 vertex -1.582435 -1.057351 2.319032 vertex -1.763811 -1.178542 2.121321 endloop endfacet facet normal 0.367086 0.220025 0.903790 outer loop vertex -0.954566 -0.637823 -2.771639 vertex -1.012488 -0.541187 -2.771639 vertex -1.247203 -0.666645 -2.645764 endloop endfacet facet normal 0.367086 0.220026 0.903790 outer loop vertex -1.247203 -0.666645 -2.645764 vertex -1.175854 -0.785682 -2.645764 vertex -0.954566 -0.637823 -2.771639 endloop endfacet facet normal 0.856697 0.513487 0.049009 outer loop vertex -2.482396 -1.658686 -0.294052 vertex -2.633023 -1.407381 -0.294052 vertex -2.645763 -1.414191 -0.000001 endloop endfacet facet normal 0.856698 0.513484 0.049012 outer loop vertex -2.645763 -1.414191 -0.000001 vertex -2.494408 -1.666712 -0.000001 vertex -2.482396 -1.658686 -0.294052 endloop endfacet facet normal 0.441347 0.264535 -0.857458 outer loop vertex -1.385818 -0.925976 2.494409 vertex -1.469907 -0.785683 2.494409 vertex -1.247203 -0.666645 2.645763 endloop endfacet facet normal 0.441351 0.264533 -0.857457 outer loop vertex -1.247203 -0.666645 2.645763 vertex -1.175855 -0.785683 2.645763 vertex -1.385818 -0.925976 2.494409 endloop endfacet facet normal 0.511344 0.306490 0.802864 outer loop vertex -1.385817 -0.925975 -2.494410 vertex -1.469906 -0.785682 -2.494410 vertex -1.678453 -0.897153 -2.319033 endloop endfacet facet normal 0.511344 0.306490 0.802864 outer loop vertex -1.678453 -0.897153 -2.319033 vertex -1.582434 -1.057350 -2.319033 vertex -1.385817 -0.925975 -2.494410 endloop endfacet facet normal 0.289267 0.173383 -0.941415 outer loop vertex -0.954567 -0.637823 2.771639 vertex -1.012489 -0.541188 2.771639 vertex -0.768024 -0.410519 2.870821 endloop endfacet facet normal 0.289269 0.173381 -0.941415 outer loop vertex -0.768024 -0.410519 2.870821 vertex -0.724088 -0.483822 2.870821 vertex -0.954567 -0.637823 2.771639 endloop endfacet facet normal 0.848465 0.508553 -0.146564 outer loop vertex -2.482396 -1.658686 0.294051 vertex -2.633023 -1.407381 0.294051 vertex -2.594924 -1.387016 0.585271 endloop endfacet facet normal 0.848468 0.508549 -0.146559 outer loop vertex -2.594924 -1.387016 0.585271 vertex -2.446478 -1.634685 0.585271 vertex -2.482396 -1.658686 0.294051 endloop endfacet facet normal 0.635878 0.381130 0.671118 outer loop vertex -1.763811 -1.178542 -2.121322 vertex -1.870835 -0.999983 -2.121322 vertex -2.045202 -1.093185 -1.903181 endloop endfacet facet normal 0.635878 0.381131 0.671117 outer loop vertex -2.045202 -1.093185 -1.903181 vertex -1.928203 -1.288386 -1.903181 vertex -1.763811 -1.178542 -2.121322 endloop endfacet facet normal 0.126002 0.075523 -0.989151 outer loop vertex -0.486634 -0.325160 2.942356 vertex -0.516162 -0.275896 2.942356 vertex -0.259330 -0.138616 2.985554 endloop endfacet facet normal 0.126000 0.075526 -0.989151 outer loop vertex -0.259330 -0.138616 2.985554 vertex -0.244494 -0.163367 2.985554 vertex -0.486634 -0.325160 2.942356 endloop endfacet facet normal 0.807699 0.484114 -0.336535 outer loop vertex -2.387000 -1.594943 0.870853 vertex -2.531837 -1.353296 0.870853 vertex -2.444364 -1.306541 1.148050 endloop endfacet facet normal 0.807700 0.484113 -0.336534 outer loop vertex -2.444364 -1.306541 1.148050 vertex -2.304531 -1.539840 1.148050 vertex -2.387000 -1.594943 0.870853 endloop endfacet facet normal 0.735933 0.441100 0.513647 outer loop vertex -2.074024 -1.385820 -1.666712 vertex -2.199871 -1.175856 -1.666712 vertex -2.333354 -1.247205 -1.414191 endloop endfacet facet normal 0.735933 0.441101 0.513646 outer loop vertex -2.333354 -1.247205 -1.414191 vertex -2.199871 -1.469908 -1.414191 vertex -2.074024 -1.385820 -1.666712 endloop endfacet facet normal 0.735933 0.441101 -0.513647 outer loop vertex -2.199871 -1.469908 1.414190 vertex -2.333354 -1.247205 1.414190 vertex -2.199871 -1.175856 1.666711 endloop endfacet facet normal 0.735934 0.441100 -0.513646 outer loop vertex -2.199871 -1.175856 1.666711 vertex -2.074024 -1.385820 1.666711 vertex -2.199871 -1.469908 1.414190 endloop endfacet facet normal 0.126000 0.075526 0.989151 outer loop vertex -0.244492 -0.163366 -2.985554 vertex -0.259328 -0.138615 -2.985554 vertex -0.516161 -0.275895 -2.942356 endloop endfacet facet normal 0.126001 0.075523 0.989151 outer loop vertex -0.516161 -0.275895 -2.942356 vertex -0.486633 -0.325159 -2.942356 vertex -0.244492 -0.163366 -2.985554 endloop endfacet facet normal 0.807700 0.484116 0.336530 outer loop vertex -2.304532 -1.539841 -1.148051 vertex -2.444366 -1.306542 -1.148051 vertex -2.531837 -1.353296 -0.870855 endloop endfacet facet normal 0.807700 0.484118 0.336528 outer loop vertex -2.531837 -1.353296 -0.870855 vertex -2.386999 -1.594943 -0.870855 vertex -2.304532 -1.539841 -1.148051 endloop endfacet facet normal 0.635878 0.381131 -0.671118 outer loop vertex -1.928203 -1.288386 1.903180 vertex -2.045202 -1.093185 1.903180 vertex -1.870835 -0.999983 2.121321 endloop endfacet facet normal 0.635878 0.381130 -0.671117 outer loop vertex -1.870835 -0.999983 2.121321 vertex -1.763811 -1.178542 2.121321 vertex -1.928203 -1.288386 1.903180 endloop endfacet facet normal 0.289267 0.173380 0.941416 outer loop vertex -0.724086 -0.483821 -2.870821 vertex -0.768022 -0.410518 -2.870821 vertex -1.012488 -0.541187 -2.771639 endloop endfacet facet normal 0.289267 0.173382 0.941416 outer loop vertex -1.012488 -0.541187 -2.771639 vertex -0.954566 -0.637823 -2.771639 vertex -0.724086 -0.483821 -2.870821 endloop endfacet facet normal 0.848468 0.508549 0.146564 outer loop vertex -2.446478 -1.634685 -0.585272 vertex -2.594924 -1.387016 -0.585272 vertex -2.633023 -1.407381 -0.294052 endloop endfacet facet normal 0.848466 0.508553 0.146559 outer loop vertex -2.633023 -1.407381 -0.294052 vertex -2.482396 -1.658686 -0.294052 vertex -2.446478 -1.634685 -0.585272 endloop endfacet facet normal 0.511346 0.306489 -0.802864 outer loop vertex -1.582435 -1.057351 2.319032 vertex -1.678454 -0.897153 2.319032 vertex -1.469907 -0.785683 2.494409 endloop endfacet facet normal 0.511344 0.306490 -0.802864 outer loop vertex -1.469907 -0.785683 2.494409 vertex -1.385818 -0.925976 2.494409 vertex -1.582435 -1.057351 2.319032 endloop endfacet facet normal 0.441349 0.264538 0.857456 outer loop vertex -1.175854 -0.785682 -2.645764 vertex -1.247203 -0.666645 -2.645764 vertex -1.469906 -0.785682 -2.494410 endloop endfacet facet normal 0.441349 0.264536 0.857457 outer loop vertex -1.469906 -0.785682 -2.494410 vertex -1.385817 -0.925975 -2.494410 vertex -1.175854 -0.785682 -2.645764 endloop endfacet facet normal 0.367092 0.220025 -0.903788 outer loop vertex -1.175855 -0.785683 2.645763 vertex -1.247203 -0.666645 2.645763 vertex -1.012489 -0.541188 2.771639 endloop endfacet facet normal 0.367088 0.220028 -0.903789 outer loop vertex -1.012489 -0.541188 2.771639 vertex -0.954567 -0.637823 2.771639 vertex -1.175855 -0.785683 2.645763 endloop endfacet facet normal 0.856698 0.513484 -0.049009 outer loop vertex -2.494408 -1.666712 -0.000001 vertex -2.645763 -1.414191 -0.000001 vertex -2.633023 -1.407381 0.294051 endloop endfacet facet normal 0.856697 0.513487 -0.049011 outer loop vertex -2.633023 -1.407381 0.294051 vertex -2.482396 -1.658686 0.294051 vertex -2.494408 -1.666712 -0.000001 endloop endfacet facet normal 0.538924 0.254890 0.802865 outer loop vertex -1.469906 -0.785682 -2.494410 vertex -1.539838 -0.637822 -2.494410 vertex -1.758307 -0.728315 -2.319033 endloop endfacet facet normal 0.538925 0.254891 0.802864 outer loop vertex -1.758307 -0.728315 -2.319033 vertex -1.678453 -0.897153 -2.319033 vertex -1.469906 -0.785682 -2.494410 endloop endfacet facet normal 0.304870 0.144192 -0.941415 outer loop vertex -1.012489 -0.541188 2.771639 vertex -1.060659 -0.439340 2.771639 vertex -0.804564 -0.333262 2.870821 endloop endfacet facet normal 0.304869 0.144193 -0.941416 outer loop vertex -0.804564 -0.333262 2.870821 vertex -0.768024 -0.410519 2.870821 vertex -1.012489 -0.541188 2.771639 endloop endfacet facet normal 0.894228 0.422937 -0.146563 outer loop vertex -2.633023 -1.407381 0.294051 vertex -2.758291 -1.142523 0.294051 vertex -2.718380 -1.125990 0.585271 endloop endfacet facet normal 0.894227 0.422938 -0.146564 outer loop vertex -2.718380 -1.125990 0.585271 vertex -2.594924 -1.387016 0.585271 vertex -2.633023 -1.407381 0.294051 endloop endfacet facet normal 0.670174 0.316970 0.671116 outer loop vertex -1.870835 -0.999983 -2.121322 vertex -1.959842 -0.811794 -2.121322 vertex -2.142504 -0.887456 -1.903181 endloop endfacet facet normal 0.670174 0.316967 0.671117 outer loop vertex -2.142504 -0.887456 -1.903181 vertex -2.045202 -1.093185 -1.903181 vertex -1.870835 -0.999983 -2.121322 endloop endfacet facet normal 0.132797 0.062810 -0.989151 outer loop vertex -0.516162 -0.275896 2.942356 vertex -0.540720 -0.223974 2.942356 vertex -0.271668 -0.112529 2.985554 endloop endfacet facet normal 0.132799 0.062808 -0.989151 outer loop vertex -0.271668 -0.112529 2.985554 vertex -0.259330 -0.138616 2.985554 vertex -0.516162 -0.275896 2.942356 endloop endfacet facet normal 0.851260 0.402617 -0.336534 outer loop vertex -2.531837 -1.353296 0.870853 vertex -2.652292 -1.098616 0.870853 vertex -2.560658 -1.060660 1.148050 endloop endfacet facet normal 0.851259 0.402619 -0.336535 outer loop vertex -2.560658 -1.060660 1.148050 vertex -2.444364 -1.306541 1.148050 vertex -2.531837 -1.353296 0.870853 endloop endfacet facet normal 0.775624 0.366843 0.513647 outer loop vertex -2.199871 -1.175856 -1.666712 vertex -2.304532 -0.954569 -1.666712 vertex -2.444366 -1.012490 -1.414191 endloop endfacet facet normal 0.775625 0.366843 0.513646 outer loop vertex -2.444366 -1.012490 -1.414191 vertex -2.333354 -1.247205 -1.414191 vertex -2.199871 -1.175856 -1.666712 endloop endfacet facet normal 0.775624 0.366843 -0.513647 outer loop vertex -2.333354 -1.247205 1.414190 vertex -2.444366 -1.012490 1.414190 vertex -2.304532 -0.954569 1.666711 endloop endfacet facet normal 0.775624 0.366843 -0.513647 outer loop vertex -2.304532 -0.954569 1.666711 vertex -2.199871 -1.175856 1.666711 vertex -2.333354 -1.247205 1.414190 endloop endfacet facet normal 0.132797 0.062810 0.989151 outer loop vertex -0.259328 -0.138615 -2.985554 vertex -0.271666 -0.112529 -2.985554 vertex -0.540718 -0.223974 -2.942356 endloop endfacet facet normal 0.132798 0.062809 0.989151 outer loop vertex -0.540718 -0.223974 -2.942356 vertex -0.516161 -0.275895 -2.942356 vertex -0.259328 -0.138615 -2.985554 endloop endfacet facet normal 0.851263 0.402617 0.336528 outer loop vertex -2.444366 -1.306542 -1.148051 vertex -2.560659 -1.060661 -1.148051 vertex -2.652291 -1.098616 -0.870855 endloop endfacet facet normal 0.851263 0.402615 0.336530 outer loop vertex -2.652291 -1.098616 -0.870855 vertex -2.531837 -1.353296 -0.870855 vertex -2.444366 -1.306542 -1.148051 endloop endfacet facet normal 0.670173 0.316969 -0.671118 outer loop vertex -2.045202 -1.093185 1.903180 vertex -2.142505 -0.887456 1.903180 vertex -1.959842 -0.811794 2.121321 endloop endfacet facet normal 0.670173 0.316969 -0.671118 outer loop vertex -1.959842 -0.811794 2.121321 vertex -1.870835 -0.999983 2.121321 vertex -2.045202 -1.093185 1.903180 endloop endfacet facet normal 0.304868 0.144194 0.941416 outer loop vertex -0.768022 -0.410518 -2.870821 vertex -0.804562 -0.333262 -2.870821 vertex -1.060658 -0.439340 -2.771639 endloop endfacet facet normal 0.304869 0.144192 0.941416 outer loop vertex -1.060658 -0.439340 -2.771639 vertex -1.012488 -0.541187 -2.771639 vertex -0.768022 -0.410518 -2.870821 endloop endfacet facet normal 0.894228 0.422938 0.146563 outer loop vertex -2.594924 -1.387016 -0.585272 vertex -2.718380 -1.125990 -0.585272 vertex -2.758291 -1.142523 -0.294052 endloop endfacet facet normal 0.894228 0.422937 0.146564 outer loop vertex -2.758291 -1.142523 -0.294052 vertex -2.633023 -1.407381 -0.294052 vertex -2.594924 -1.387016 -0.585272 endloop endfacet facet normal 0.538924 0.254892 -0.802864 outer loop vertex -1.678454 -0.897153 2.319032 vertex -1.758308 -0.728316 2.319032 vertex -1.539839 -0.637823 2.494409 endloop endfacet facet normal 0.538925 0.254891 -0.802864 outer loop vertex -1.539839 -0.637823 2.494409 vertex -1.469907 -0.785683 2.494409 vertex -1.678454 -0.897153 2.319032 endloop endfacet facet normal 0.465155 0.220001 0.857456 outer loop vertex -1.247203 -0.666645 -2.645764 vertex -1.306540 -0.541187 -2.645764 vertex -1.539838 -0.637822 -2.494410 endloop endfacet facet normal 0.465155 0.220000 0.857456 outer loop vertex -1.539838 -0.637822 -2.494410 vertex -1.469906 -0.785682 -2.494410 vertex -1.247203 -0.666645 -2.645764 endloop endfacet facet normal 0.386889 0.182986 -0.903788 outer loop vertex -1.247203 -0.666645 2.645763 vertex -1.306540 -0.541188 2.645763 vertex -1.060659 -0.439340 2.771639 endloop endfacet facet normal 0.386891 0.182984 -0.903788 outer loop vertex -1.060659 -0.439340 2.771639 vertex -1.012489 -0.541188 2.771639 vertex -1.247203 -0.666645 2.645763 endloop endfacet facet normal 0.902903 0.427042 -0.049011 outer loop vertex -2.645763 -1.414191 -0.000001 vertex -2.771638 -1.148051 -0.000001 vertex -2.758291 -1.142523 0.294051 endloop endfacet facet normal 0.902904 0.427040 -0.049008 outer loop vertex -2.758291 -1.142523 0.294051 vertex -2.633023 -1.407381 0.294051 vertex -2.645763 -1.414191 -0.000001 endloop endfacet facet normal 0.607485 0.287317 0.740548 outer loop vertex -1.678453 -0.897153 -2.319033 vertex -1.758307 -0.728315 -2.319033 vertex -1.959842 -0.811794 -2.121322 endloop endfacet facet normal 0.607485 0.287320 0.740547 outer loop vertex -1.959842 -0.811794 -2.121322 vertex -1.870835 -0.999983 -2.121322 vertex -1.678453 -0.897153 -2.319033 endloop endfacet facet normal 0.219902 0.104006 -0.969962 outer loop vertex -0.768024 -0.410519 2.870821 vertex -0.804564 -0.333262 2.870821 vertex -0.540720 -0.223974 2.942356 endloop endfacet facet normal 0.219900 0.104008 -0.969962 outer loop vertex -0.540720 -0.223974 2.942356 vertex -0.516162 -0.275896 2.942356 vertex -0.768024 -0.410519 2.870821 endloop endfacet facet normal 0.876962 0.414772 -0.242699 outer loop vertex -2.594924 -1.387016 0.585271 vertex -2.718380 -1.125990 0.585271 vertex -2.652292 -1.098616 0.870853 endloop endfacet facet normal 0.876961 0.414773 -0.242701 outer loop vertex -2.652292 -1.098616 0.870853 vertex -2.531837 -1.353296 0.870853 vertex -2.594924 -1.387016 0.585271 endloop endfacet facet normal 0.726402 0.343560 0.595236 outer loop vertex -2.045202 -1.093185 -1.903181 vertex -2.142504 -0.887456 -1.903181 vertex -2.304532 -0.954569 -1.666712 endloop endfacet facet normal 0.726402 0.343563 0.595235 outer loop vertex -2.304532 -0.954569 -1.666712 vertex -2.199871 -1.175856 -1.666712 vertex -2.045202 -1.093185 -1.903181 endloop endfacet facet normal 0.817377 0.386593 -0.427131 outer loop vertex -2.444364 -1.306541 1.148050 vertex -2.560658 -1.060660 1.148050 vertex -2.444366 -1.012490 1.414190 endloop endfacet facet normal 0.817379 0.386592 -0.427129 outer loop vertex -2.444366 -1.012490 1.414190 vertex -2.333354 -1.247205 1.414190 vertex -2.444364 -1.306541 1.148050 endloop endfacet facet normal 0.817376 0.386590 0.427134 outer loop vertex -2.333354 -1.247205 -1.414191 vertex -2.444366 -1.012490 -1.414191 vertex -2.560659 -1.060661 -1.148051 endloop endfacet facet normal 0.817376 0.386590 0.427135 outer loop vertex -2.560659 -1.060661 -1.148051 vertex -2.444366 -1.306542 -1.148051 vertex -2.333354 -1.247205 -1.414191 endloop endfacet facet normal 0.726403 0.343563 -0.595234 outer loop vertex -2.199871 -1.175856 1.666711 vertex -2.304532 -0.954569 1.666711 vertex -2.142505 -0.887456 1.903180 endloop endfacet facet normal 0.726402 0.343564 -0.595235 outer loop vertex -2.142505 -0.887456 1.903180 vertex -2.045202 -1.093185 1.903180 vertex -2.199871 -1.175856 1.666711 endloop endfacet facet normal 0.219901 0.104006 0.969962 outer loop vertex -0.516161 -0.275895 -2.942356 vertex -0.540718 -0.223974 -2.942356 vertex -0.804562 -0.333262 -2.870821 endloop endfacet facet normal 0.219901 0.104007 0.969962 outer loop vertex -0.804562 -0.333262 -2.870821 vertex -0.768022 -0.410518 -2.870821 vertex -0.516161 -0.275895 -2.942356 endloop endfacet facet normal 0.876962 0.414770 0.242701 outer loop vertex -2.531837 -1.353296 -0.870855 vertex -2.652291 -1.098616 -0.870855 vertex -2.718380 -1.125990 -0.585272 endloop endfacet facet normal 0.876961 0.414771 0.242700 outer loop vertex -2.718380 -1.125990 -0.585272 vertex -2.594924 -1.387016 -0.585272 vertex -2.531837 -1.353296 -0.870855 endloop endfacet facet normal 0.607486 0.287320 -0.740545 outer loop vertex -1.870835 -0.999983 2.121321 vertex -1.959842 -0.811794 2.121321 vertex -1.758308 -0.728316 2.319032 endloop endfacet facet normal 0.607487 0.287320 -0.740545 outer loop vertex -1.758308 -0.728316 2.319032 vertex -1.678454 -0.897153 2.319032 vertex -1.870835 -0.999983 2.121321 endloop endfacet facet normal 0.386886 0.182983 0.903790 outer loop vertex -1.012488 -0.541187 -2.771639 vertex -1.060658 -0.439340 -2.771639 vertex -1.306540 -0.541187 -2.645764 endloop endfacet facet normal 0.386886 0.182983 0.903790 outer loop vertex -1.306540 -0.541187 -2.645764 vertex -1.247203 -0.666645 -2.645764 vertex -1.012488 -0.541187 -2.771639 endloop endfacet facet normal 0.902904 0.427040 0.049011 outer loop vertex -2.633023 -1.407381 -0.294052 vertex -2.758291 -1.142523 -0.294052 vertex -2.771638 -1.148051 -0.000001 endloop endfacet facet normal 0.902903 0.427042 0.049009 outer loop vertex -2.771638 -1.148051 -0.000001 vertex -2.645763 -1.414191 -0.000001 vertex -2.633023 -1.407381 -0.294052 endloop endfacet facet normal 0.465153 0.219999 -0.857457 outer loop vertex -1.469907 -0.785683 2.494409 vertex -1.539839 -0.637823 2.494409 vertex -1.306540 -0.541188 2.645763 endloop endfacet facet normal 0.465151 0.220001 -0.857458 outer loop vertex -1.306540 -0.541188 2.645763 vertex -1.247203 -0.666645 2.645763 vertex -1.469907 -0.785683 2.494409 endloop endfacet facet normal 0.484478 0.173349 0.857456 outer loop vertex -1.306540 -0.541187 -2.645764 vertex -1.353294 -0.410518 -2.645764 vertex -1.594941 -0.483820 -2.494410 endloop endfacet facet normal 0.484478 0.173350 0.857456 outer loop vertex -1.594941 -0.483820 -2.494410 vertex -1.539838 -0.637822 -2.494410 vertex -1.306540 -0.541187 -2.645764 endloop endfacet facet normal 0.402961 0.144183 -0.903789 outer loop vertex -1.306540 -0.541188 2.645763 vertex -1.353295 -0.410518 2.645763 vertex -1.098614 -0.333262 2.771639 endloop endfacet facet normal 0.402963 0.144181 -0.903788 outer loop vertex -1.098614 -0.333262 2.771639 vertex -1.060659 -0.439340 2.771639 vertex -1.306540 -0.541188 2.645763 endloop endfacet facet normal 0.940413 0.336483 -0.049009 outer loop vertex -2.771638 -1.148051 -0.000001 vertex -2.870820 -0.870854 -0.000001 vertex -2.856996 -0.866661 0.294051 endloop endfacet facet normal 0.940412 0.336485 -0.049011 outer loop vertex -2.856996 -0.866661 0.294051 vertex -2.758291 -1.142523 0.294051 vertex -2.771638 -1.148051 -0.000001 endloop endfacet facet normal 0.632722 0.226390 0.740547 outer loop vertex -1.758307 -0.728315 -2.319033 vertex -1.821227 -0.552464 -2.319033 vertex -2.029974 -0.615786 -2.121322 endloop endfacet facet normal 0.632722 0.226389 0.740548 outer loop vertex -2.029974 -0.615786 -2.121322 vertex -1.959842 -0.811794 -2.121322 vertex -1.758307 -0.728315 -2.319033 endloop endfacet facet normal 0.229037 0.081950 -0.969962 outer loop vertex -0.804564 -0.333262 2.870821 vertex -0.833355 -0.252796 2.870821 vertex -0.560069 -0.169896 2.942356 endloop endfacet facet normal 0.229038 0.081949 -0.969962 outer loop vertex -0.560069 -0.169896 2.942356 vertex -0.540720 -0.223974 2.942356 vertex -0.804564 -0.333262 2.870821 endloop endfacet facet normal 0.913392 0.326818 -0.242703 outer loop vertex -2.718380 -1.125990 0.585271 vertex -2.815657 -0.854120 0.585271 vertex -2.747203 -0.833355 0.870853 endloop endfacet facet normal 0.913394 0.326815 -0.242699 outer loop vertex -2.747203 -0.833355 0.870853 vertex -2.652292 -1.098616 0.870853 vertex -2.718380 -1.125990 0.585271 endloop endfacet facet normal 0.756578 0.270707 0.595237 outer loop vertex -2.142504 -0.887456 -1.903181 vertex -2.219173 -0.673180 -1.903181 vertex -2.386999 -0.724089 -1.666712 endloop endfacet facet normal 0.756578 0.270707 0.595237 outer loop vertex -2.386999 -0.724089 -1.666712 vertex -2.304532 -0.954569 -1.666712 vertex -2.142504 -0.887456 -1.903181 endloop endfacet facet normal 0.851336 0.304611 -0.427129 outer loop vertex -2.560658 -1.060660 1.148050 vertex -2.652290 -0.804564 1.148050 vertex -2.531837 -0.768025 1.414190 endloop endfacet facet normal 0.851335 0.304612 -0.427131 outer loop vertex -2.531837 -0.768025 1.414190 vertex -2.444366 -1.012490 1.414190 vertex -2.560658 -1.060660 1.148050 endloop endfacet facet normal 0.851334 0.304612 0.427133 outer loop vertex -2.444366 -1.012490 -1.414191 vertex -2.531837 -0.768025 -1.414191 vertex -2.652291 -0.804565 -1.148051 endloop endfacet facet normal 0.851334 0.304610 0.427134 outer loop vertex -2.652291 -0.804565 -1.148051 vertex -2.560659 -1.060661 -1.148051 vertex -2.444366 -1.012490 -1.414191 endloop endfacet facet normal 0.756580 0.270708 -0.595234 outer loop vertex -2.304532 -0.954569 1.666711 vertex -2.386999 -0.724089 1.666711 vertex -2.219174 -0.673180 1.903180 endloop endfacet facet normal 0.756580 0.270708 -0.595234 outer loop vertex -2.219174 -0.673180 1.903180 vertex -2.142505 -0.887456 1.903180 vertex -2.304532 -0.954569 1.666711 endloop endfacet facet normal 0.229038 0.081948 0.969962 outer loop vertex -0.540718 -0.223974 -2.942356 vertex -0.560067 -0.169895 -2.942356 vertex -0.833353 -0.252796 -2.870821 endloop endfacet facet normal 0.229037 0.081950 0.969962 outer loop vertex -0.833353 -0.252796 -2.870821 vertex -0.804562 -0.333262 -2.870821 vertex -0.540718 -0.223974 -2.942356 endloop endfacet facet normal 0.913393 0.326818 0.242702 outer loop vertex -2.652291 -1.098616 -0.870855 vertex -2.747203 -0.833355 -0.870855 vertex -2.815657 -0.854120 -0.585272 endloop endfacet facet normal 0.913392 0.326818 0.242702 outer loop vertex -2.815657 -0.854120 -0.585272 vertex -2.718380 -1.125990 -0.585272 vertex -2.652291 -1.098616 -0.870855 endloop endfacet facet normal 0.632722 0.226393 -0.740546 outer loop vertex -1.959842 -0.811794 2.121321 vertex -2.029975 -0.615787 2.121321 vertex -1.821229 -0.552464 2.319032 endloop endfacet facet normal 0.632723 0.226392 -0.740546 outer loop vertex -1.821229 -0.552464 2.319032 vertex -1.758308 -0.728316 2.319032 vertex -1.959842 -0.811794 2.121321 endloop endfacet facet normal 0.402958 0.144178 0.903790 outer loop vertex -1.060658 -0.439340 -2.771639 vertex -1.098613 -0.333261 -2.771639 vertex -1.353294 -0.410518 -2.645764 endloop endfacet facet normal 0.402958 0.144180 0.903790 outer loop vertex -1.353294 -0.410518 -2.645764 vertex -1.306540 -0.541187 -2.645764 vertex -1.060658 -0.439340 -2.771639 endloop endfacet facet normal 0.940413 0.336485 0.049009 outer loop vertex -2.758291 -1.142523 -0.294052 vertex -2.856996 -0.866661 -0.294052 vertex -2.870820 -0.870854 -0.000001 endloop endfacet facet normal 0.940413 0.336483 0.049011 outer loop vertex -2.870820 -0.870854 -0.000001 vertex -2.771638 -1.148051 -0.000001 vertex -2.758291 -1.142523 -0.294052 endloop endfacet facet normal 0.484477 0.173349 -0.857457 outer loop vertex -1.539839 -0.637823 2.494409 vertex -1.594942 -0.483821 2.494409 vertex -1.353295 -0.410518 2.645763 endloop endfacet facet normal 0.484476 0.173350 -0.857457 outer loop vertex -1.353295 -0.410518 2.645763 vertex -1.306540 -0.541188 2.645763 vertex -1.539839 -0.637823 2.494409 endloop endfacet facet normal 0.561313 0.200842 0.802864 outer loop vertex -1.539838 -0.637822 -2.494410 vertex -1.594941 -0.483820 -2.494410 vertex -1.821227 -0.552464 -2.319033 endloop endfacet facet normal 0.561313 0.200839 0.802864 outer loop vertex -1.821227 -0.552464 -2.319033 vertex -1.758307 -0.728315 -2.319033 vertex -1.539838 -0.637822 -2.494410 endloop endfacet facet normal 0.317536 0.113615 -0.941415 outer loop vertex -1.060659 -0.439340 2.771639 vertex -1.098614 -0.333262 2.771639 vertex -0.833355 -0.252796 2.870821 endloop endfacet facet normal 0.317535 0.113615 -0.941415 outer loop vertex -0.833355 -0.252796 2.870821 vertex -0.804564 -0.333262 2.870821 vertex -1.060659 -0.439340 2.771639 endloop endfacet facet normal 0.931377 0.333252 -0.146562 outer loop vertex -2.758291 -1.142523 0.294051 vertex -2.856996 -0.866661 0.294051 vertex -2.815657 -0.854120 0.585271 endloop endfacet facet normal 0.931376 0.333253 -0.146562 outer loop vertex -2.815657 -0.854120 0.585271 vertex -2.718380 -1.125990 0.585271 vertex -2.758291 -1.142523 0.294051 endloop endfacet facet normal 0.698016 0.249751 0.671117 outer loop vertex -1.959842 -0.811794 -2.121322 vertex -2.029974 -0.615786 -2.121322 vertex -2.219173 -0.673180 -1.903181 endloop endfacet facet normal 0.698016 0.249754 0.671116 outer loop vertex -2.219173 -0.673180 -1.903181 vertex -2.142504 -0.887456 -1.903181 vertex -1.959842 -0.811794 -2.121322 endloop endfacet facet normal 0.138315 0.049489 -0.989151 outer loop vertex -0.540720 -0.223974 2.942356 vertex -0.560069 -0.169896 2.942356 vertex -0.281389 -0.085359 2.985554 endloop endfacet facet normal 0.138316 0.049487 -0.989151 outer loop vertex -0.281389 -0.085359 2.985554 vertex -0.271668 -0.112529 2.985554 vertex -0.540720 -0.223974 2.942356 endloop endfacet facet normal 0.886626 0.317237 -0.336533 outer loop vertex -2.652292 -1.098616 0.870853 vertex -2.747203 -0.833355 0.870853 vertex -2.652290 -0.804564 1.148050 endloop endfacet facet normal 0.886626 0.317238 -0.336534 outer loop vertex -2.652290 -0.804564 1.148050 vertex -2.560658 -1.060660 1.148050 vertex -2.652292 -1.098616 0.870853 endloop endfacet facet normal 0.807847 0.289051 0.513647 outer loop vertex -2.304532 -0.954569 -1.666712 vertex -2.386999 -0.724089 -1.666712 vertex -2.531837 -0.768025 -1.414191 endloop endfacet facet normal 0.807847 0.289052 0.513647 outer loop vertex -2.531837 -0.768025 -1.414191 vertex -2.444366 -1.012490 -1.414191 vertex -2.304532 -0.954569 -1.666712 endloop endfacet facet normal 0.807846 0.289052 -0.513647 outer loop vertex -2.444366 -1.012490 1.414190 vertex -2.531837 -0.768025 1.414190 vertex -2.386999 -0.724089 1.666711 endloop endfacet facet normal 0.807847 0.289051 -0.513647 outer loop vertex -2.386999 -0.724089 1.666711 vertex -2.304532 -0.954569 1.666711 vertex -2.444366 -1.012490 1.414190 endloop endfacet facet normal 0.138316 0.049487 0.989151 outer loop vertex -0.271666 -0.112529 -2.985554 vertex -0.281387 -0.085359 -2.985554 vertex -0.560067 -0.169895 -2.942356 endloop endfacet facet normal 0.138315 0.049488 0.989151 outer loop vertex -0.560067 -0.169895 -2.942356 vertex -0.540718 -0.223974 -2.942356 vertex -0.271666 -0.112529 -2.985554 endloop endfacet facet normal 0.886627 0.317239 0.336530 outer loop vertex -2.560659 -1.060661 -1.148051 vertex -2.652291 -0.804565 -1.148051 vertex -2.747203 -0.833355 -0.870855 endloop endfacet facet normal 0.886627 0.317241 0.336528 outer loop vertex -2.747203 -0.833355 -0.870855 vertex -2.652291 -1.098616 -0.870855 vertex -2.560659 -1.060661 -1.148051 endloop endfacet facet normal 0.698016 0.249753 -0.671116 outer loop vertex -2.142505 -0.887456 1.903180 vertex -2.219174 -0.673180 1.903180 vertex -2.029975 -0.615787 2.121321 endloop endfacet facet normal 0.698014 0.249755 -0.671118 outer loop vertex -2.029975 -0.615787 2.121321 vertex -1.959842 -0.811794 2.121321 vertex -2.142505 -0.887456 1.903180 endloop endfacet facet normal 0.317535 0.113615 0.941416 outer loop vertex -0.804562 -0.333262 -2.870821 vertex -0.833353 -0.252796 -2.870821 vertex -1.098613 -0.333261 -2.771639 endloop endfacet facet normal 0.317535 0.113614 0.941416 outer loop vertex -1.098613 -0.333261 -2.771639 vertex -1.060658 -0.439340 -2.771639 vertex -0.804562 -0.333262 -2.870821 endloop endfacet facet normal 0.931377 0.333253 0.146562 outer loop vertex -2.718380 -1.125990 -0.585272 vertex -2.815657 -0.854120 -0.585272 vertex -2.856996 -0.866661 -0.294052 endloop endfacet facet normal 0.931377 0.333252 0.146562 outer loop vertex -2.856996 -0.866661 -0.294052 vertex -2.758291 -1.142523 -0.294052 vertex -2.718380 -1.125990 -0.585272 endloop endfacet facet normal 0.561312 0.200841 -0.802864 outer loop vertex -1.758308 -0.728316 2.319032 vertex -1.821229 -0.552464 2.319032 vertex -1.594942 -0.483821 2.494409 endloop endfacet facet normal 0.561312 0.200841 -0.802864 outer loop vertex -1.594942 -0.483821 2.494409 vertex -1.539839 -0.637823 2.494409 vertex -1.758308 -0.728316 2.319032 endloop endfacet facet normal 0.415150 0.103989 0.903790 outer loop vertex -1.098613 -0.333261 -2.771639 vertex -1.125988 -0.223973 -2.771639 vertex -1.387015 -0.275895 -2.645764 endloop endfacet facet normal 0.415150 0.103989 0.903790 outer loop vertex -1.387015 -0.275895 -2.645764 vertex -1.353294 -0.410518 -2.645764 vertex -1.098613 -0.333261 -2.771639 endloop endfacet facet normal 0.968865 0.242690 0.049008 outer loop vertex -2.856996 -0.866661 -0.294052 vertex -2.928187 -0.582453 -0.294052 vertex -2.942355 -0.585271 -0.000001 endloop endfacet facet normal 0.968866 0.242688 0.049009 outer loop vertex -2.942355 -0.585271 -0.000001 vertex -2.870820 -0.870854 -0.000001 vertex -2.856996 -0.866661 -0.294052 endloop endfacet facet normal 0.499134 0.125028 -0.857457 outer loop vertex -1.594942 -0.483821 2.494409 vertex -1.634685 -0.325159 2.494409 vertex -1.387016 -0.275895 2.645763 endloop endfacet facet normal 0.499135 0.125026 -0.857457 outer loop vertex -1.387016 -0.275895 2.645763 vertex -1.353295 -0.410518 2.645763 vertex -1.594942 -0.483821 2.494409 endloop endfacet facet normal 0.578295 0.144853 0.802865 outer loop vertex -1.594941 -0.483820 -2.494410 vertex -1.634683 -0.325159 -2.494410 vertex -1.866609 -0.371292 -2.319033 endloop endfacet facet normal 0.578296 0.144858 0.802864 outer loop vertex -1.866609 -0.371292 -2.319033 vertex -1.821227 -0.552464 -2.319033 vertex -1.594941 -0.483820 -2.494410 endloop endfacet facet normal 0.327142 0.081947 -0.941415 outer loop vertex -1.098614 -0.333262 2.771639 vertex -1.125990 -0.223974 2.771639 vertex -0.854121 -0.169895 2.870821 endloop endfacet facet normal 0.327142 0.081946 -0.941415 outer loop vertex -0.854121 -0.169895 2.870821 vertex -0.833355 -0.252796 2.870821 vertex -1.098614 -0.333262 2.771639 endloop endfacet facet normal 0.959556 0.240358 -0.146563 outer loop vertex -2.856996 -0.866661 0.294051 vertex -2.928187 -0.582453 0.294051 vertex -2.885817 -0.574024 0.585271 endloop endfacet facet normal 0.959557 0.240356 -0.146561 outer loop vertex -2.885817 -0.574024 0.585271 vertex -2.815657 -0.854120 0.585271 vertex -2.856996 -0.866661 0.294051 endloop endfacet facet normal 0.719133 0.180135 0.671117 outer loop vertex -2.029974 -0.615786 -2.121322 vertex -2.080557 -0.413849 -2.121322 vertex -2.274471 -0.452421 -1.903181 endloop endfacet facet normal 0.719134 0.180136 0.671117 outer loop vertex -2.274471 -0.452421 -1.903181 vertex -2.219173 -0.673180 -1.903181 vertex -2.029974 -0.615786 -2.121322 endloop endfacet facet normal 0.142500 0.035694 -0.989151 outer loop vertex -0.560069 -0.169896 2.942356 vertex -0.574025 -0.114181 2.942356 vertex -0.288401 -0.057367 2.985554 endloop endfacet facet normal 0.142499 0.035696 -0.989151 outer loop vertex -0.288401 -0.057367 2.985554 vertex -0.281389 -0.085359 2.985554 vertex -0.560069 -0.169896 2.942356 endloop endfacet facet normal 0.913449 0.228808 -0.336537 outer loop vertex -2.747203 -0.833355 0.870853 vertex -2.815658 -0.560069 0.870853 vertex -2.718379 -0.540719 1.148050 endloop endfacet facet normal 0.913452 0.228805 -0.336533 outer loop vertex -2.718379 -0.540719 1.148050 vertex -2.652290 -0.804564 1.148050 vertex -2.747203 -0.833355 0.870853 endloop endfacet facet normal 0.832289 0.208477 0.513647 outer loop vertex -2.386999 -0.724089 -1.666712 vertex -2.446478 -0.486635 -1.666712 vertex -2.594925 -0.516163 -1.414191 endloop endfacet facet normal 0.832288 0.208477 0.513647 outer loop vertex -2.594925 -0.516163 -1.414191 vertex -2.531837 -0.768025 -1.414191 vertex -2.386999 -0.724089 -1.666712 endloop endfacet facet normal 0.832288 0.208477 -0.513647 outer loop vertex -2.531837 -0.768025 1.414190 vertex -2.594925 -0.516163 1.414190 vertex -2.446478 -0.486635 1.666711 endloop endfacet facet normal 0.832288 0.208477 -0.513647 outer loop vertex -2.446478 -0.486635 1.666711 vertex -2.386999 -0.724089 1.666711 vertex -2.531837 -0.768025 1.414190 endloop endfacet facet normal 0.142499 0.035695 0.989151 outer loop vertex -0.281387 -0.085359 -2.985554 vertex -0.288399 -0.057366 -2.985554 vertex -0.574023 -0.114181 -2.942356 endloop endfacet facet normal 0.142499 0.035695 0.989151 outer loop vertex -0.574023 -0.114181 -2.942356 vertex -0.560067 -0.169895 -2.942356 vertex -0.281387 -0.085359 -2.985554 endloop endfacet facet normal 0.913453 0.228808 0.336528 outer loop vertex -2.652291 -0.804565 -1.148051 vertex -2.718381 -0.540720 -1.148051 vertex -2.815657 -0.560069 -0.870855 endloop endfacet facet normal 0.913452 0.228805 0.336531 outer loop vertex -2.815657 -0.560069 -0.870855 vertex -2.747203 -0.833355 -0.870855 vertex -2.652291 -0.804565 -1.148051 endloop endfacet facet normal 0.719133 0.180136 -0.671117 outer loop vertex -2.219174 -0.673180 1.903180 vertex -2.274472 -0.452421 1.903180 vertex -2.080558 -0.413849 2.121321 endloop endfacet facet normal 0.719134 0.180135 -0.671116 outer loop vertex -2.080558 -0.413849 2.121321 vertex -2.029975 -0.615787 2.121321 vertex -2.219174 -0.673180 1.903180 endloop endfacet facet normal 0.327142 0.081946 0.941415 outer loop vertex -0.833353 -0.252796 -2.870821 vertex -0.854119 -0.169895 -2.870821 vertex -1.125988 -0.223973 -2.771639 endloop endfacet facet normal 0.327142 0.081944 0.941415 outer loop vertex -1.125988 -0.223973 -2.771639 vertex -1.098613 -0.333261 -2.771639 vertex -0.833353 -0.252796 -2.870821 endloop endfacet facet normal 0.959556 0.240356 0.146563 outer loop vertex -2.815657 -0.854120 -0.585272 vertex -2.885817 -0.574024 -0.585272 vertex -2.928187 -0.582453 -0.294052 endloop endfacet facet normal 0.959556 0.240358 0.146561 outer loop vertex -2.928187 -0.582453 -0.294052 vertex -2.856996 -0.866661 -0.294052 vertex -2.815657 -0.854120 -0.585272 endloop endfacet facet normal 0.578296 0.144855 -0.802864 outer loop vertex -1.821229 -0.552464 2.319032 vertex -1.866610 -0.371292 2.319032 vertex -1.634685 -0.325159 2.494409 endloop endfacet facet normal 0.578295 0.144856 -0.802864 outer loop vertex -1.634685 -0.325159 2.494409 vertex -1.594942 -0.483821 2.494409 vertex -1.821229 -0.552464 2.319032 endloop endfacet facet normal 0.499137 0.125026 0.857456 outer loop vertex -1.353294 -0.410518 -2.645764 vertex -1.387015 -0.275895 -2.645764 vertex -1.634683 -0.325159 -2.494410 endloop endfacet facet normal 0.499137 0.125026 0.857456 outer loop vertex -1.634683 -0.325159 -2.494410 vertex -1.594941 -0.483820 -2.494410 vertex -1.353294 -0.410518 -2.645764 endloop endfacet facet normal 0.415154 0.103990 -0.903788 outer loop vertex -1.353295 -0.410518 2.645763 vertex -1.387016 -0.275895 2.645763 vertex -1.125990 -0.223974 2.771639 endloop endfacet facet normal 0.415152 0.103993 -0.903789 outer loop vertex -1.125990 -0.223974 2.771639 vertex -1.098614 -0.333262 2.771639 vertex -1.353295 -0.410518 2.645763 endloop endfacet facet normal 0.968866 0.242688 -0.049008 outer loop vertex -2.870820 -0.870854 -0.000001 vertex -2.942355 -0.585271 -0.000001 vertex -2.928187 -0.582453 0.294051 endloop endfacet facet normal 0.968865 0.242690 -0.049009 outer loop vertex -2.928187 -0.582453 0.294051 vertex -2.856996 -0.866661 0.294051 vertex -2.870820 -0.870854 -0.000001 endloop endfacet facet normal 0.651865 0.163287 0.740547 outer loop vertex -1.821227 -0.552464 -2.319033 vertex -1.866609 -0.371292 -2.319033 vertex -2.080557 -0.413849 -2.121322 endloop endfacet facet normal 0.651865 0.163285 0.740547 outer loop vertex -2.080557 -0.413849 -2.121322 vertex -2.029974 -0.615786 -2.121322 vertex -1.821227 -0.552464 -2.319033 endloop endfacet facet normal 0.235966 0.059108 -0.969962 outer loop vertex -0.833355 -0.252796 2.870821 vertex -0.854121 -0.169895 2.870821 vertex -0.574025 -0.114181 2.942356 endloop endfacet facet normal 0.235967 0.059107 -0.969962 outer loop vertex -0.574025 -0.114181 2.942356 vertex -0.560069 -0.169896 2.942356 vertex -0.833355 -0.252796 2.870821 endloop endfacet facet normal 0.941029 0.235715 -0.242701 outer loop vertex -2.815657 -0.854120 0.585271 vertex -2.885817 -0.574024 0.585271 vertex -2.815658 -0.560069 0.870853 endloop endfacet facet normal 0.941028 0.235717 -0.242703 outer loop vertex -2.815658 -0.560069 0.870853 vertex -2.747203 -0.833355 0.870853 vertex -2.815657 -0.854120 0.585271 endloop endfacet facet normal 0.779470 0.195250 0.595234 outer loop vertex -2.219173 -0.673180 -1.903181 vertex -2.274471 -0.452421 -1.903181 vertex -2.446478 -0.486635 -1.666712 endloop endfacet facet normal 0.779469 0.195246 0.595237 outer loop vertex -2.446478 -0.486635 -1.666712 vertex -2.386999 -0.724089 -1.666712 vertex -2.219173 -0.673180 -1.903181 endloop endfacet facet normal 0.877095 0.219698 -0.427128 outer loop vertex -2.652290 -0.804564 1.148050 vertex -2.718379 -0.540719 1.148050 vertex -2.594925 -0.516163 1.414190 endloop endfacet facet normal 0.877093 0.219700 -0.427129 outer loop vertex -2.594925 -0.516163 1.414190 vertex -2.531837 -0.768025 1.414190 vertex -2.652290 -0.804564 1.148050 endloop endfacet facet normal 0.877091 0.219699 0.427134 outer loop vertex -2.531837 -0.768025 -1.414191 vertex -2.594925 -0.516163 -1.414191 vertex -2.718381 -0.540720 -1.148051 endloop endfacet facet normal 0.877091 0.219700 0.427133 outer loop vertex -2.718381 -0.540720 -1.148051 vertex -2.652291 -0.804565 -1.148051 vertex -2.531837 -0.768025 -1.414191 endloop endfacet facet normal 0.779472 0.195247 -0.595232 outer loop vertex -2.386999 -0.724089 1.666711 vertex -2.446478 -0.486635 1.666711 vertex -2.274472 -0.452421 1.903180 endloop endfacet facet normal 0.779470 0.195250 -0.595235 outer loop vertex -2.274472 -0.452421 1.903180 vertex -2.219174 -0.673180 1.903180 vertex -2.386999 -0.724089 1.666711 endloop endfacet facet normal 0.235966 0.059108 0.969962 outer loop vertex -0.560067 -0.169895 -2.942356 vertex -0.574023 -0.114181 -2.942356 vertex -0.854119 -0.169895 -2.870821 endloop endfacet facet normal 0.235966 0.059108 0.969962 outer loop vertex -0.854119 -0.169895 -2.870821 vertex -0.833353 -0.252796 -2.870821 vertex -0.560067 -0.169895 -2.942356 endloop endfacet facet normal 0.941028 0.235713 0.242704 outer loop vertex -2.747203 -0.833355 -0.870855 vertex -2.815657 -0.560069 -0.870855 vertex -2.885817 -0.574024 -0.585272 endloop endfacet facet normal 0.941028 0.235715 0.242702 outer loop vertex -2.885817 -0.574024 -0.585272 vertex -2.815657 -0.854120 -0.585272 vertex -2.747203 -0.833355 -0.870855 endloop endfacet facet normal 0.651865 0.163285 -0.740547 outer loop vertex -2.029975 -0.615787 2.121321 vertex -2.080558 -0.413849 2.121321 vertex -1.866610 -0.371292 2.319032 endloop endfacet facet normal 0.651867 0.163284 -0.740546 outer loop vertex -1.866610 -0.371292 2.319032 vertex -1.821229 -0.552464 2.319032 vertex -2.029975 -0.615787 2.121321 endloop endfacet facet normal 0.333598 0.049482 0.941416 outer loop vertex -0.854119 -0.169895 -2.870821 vertex -0.866658 -0.085359 -2.870821 vertex -1.142520 -0.112529 -2.771639 endloop endfacet facet normal 0.333599 0.049487 0.941415 outer loop vertex -1.142520 -0.112529 -2.771639 vertex -1.125988 -0.223973 -2.771639 vertex -0.854119 -0.169895 -2.870821 endloop endfacet facet normal 0.978495 0.145145 0.146564 outer loop vertex -2.885817 -0.574024 -0.585272 vertex -2.928185 -0.288401 -0.585272 vertex -2.971177 -0.292636 -0.294052 endloop endfacet facet normal 0.978495 0.145146 0.146563 outer loop vertex -2.971177 -0.292636 -0.294052 vertex -2.928187 -0.582453 -0.294052 vertex -2.885817 -0.574024 -0.585272 endloop endfacet facet normal 0.589712 0.087473 -0.802863 outer loop vertex -1.866610 -0.371292 2.319032 vertex -1.894014 -0.186544 2.319032 vertex -1.658685 -0.163366 2.494409 endloop endfacet facet normal 0.589710 0.087476 -0.802864 outer loop vertex -1.658685 -0.163366 2.494409 vertex -1.634685 -0.325159 2.494409 vertex -1.866610 -0.371292 2.319032 endloop endfacet facet normal 0.508988 0.075503 0.857456 outer loop vertex -1.387015 -0.275895 -2.645764 vertex -1.407379 -0.138615 -2.645764 vertex -1.658683 -0.163366 -2.494410 endloop endfacet facet normal 0.508988 0.075502 0.857456 outer loop vertex -1.658683 -0.163366 -2.494410 vertex -1.634683 -0.325159 -2.494410 vertex -1.387015 -0.275895 -2.645764 endloop endfacet facet normal 0.423347 0.062799 -0.903788 outer loop vertex -1.387016 -0.275895 2.645763 vertex -1.407380 -0.138615 2.645763 vertex -1.142521 -0.112529 2.771639 endloop endfacet facet normal 0.423348 0.062797 -0.903788 outer loop vertex -1.142521 -0.112529 2.771639 vertex -1.125990 -0.223974 2.771639 vertex -1.387016 -0.275895 2.645763 endloop endfacet facet normal 0.987988 0.146554 -0.049008 outer loop vertex -2.942355 -0.585271 -0.000001 vertex -2.985553 -0.294052 -0.000001 vertex -2.971177 -0.292636 0.294051 endloop endfacet facet normal 0.987988 0.146554 -0.049008 outer loop vertex -2.971177 -0.292636 0.294051 vertex -2.928187 -0.582453 0.294051 vertex -2.942355 -0.585271 -0.000001 endloop endfacet facet normal 0.664730 0.098601 0.740548 outer loop vertex -1.866609 -0.371292 -2.319033 vertex -1.894013 -0.186544 -2.319033 vertex -2.111103 -0.207925 -2.121322 endloop endfacet facet normal 0.664731 0.098604 0.740547 outer loop vertex -2.111103 -0.207925 -2.121322 vertex -2.080557 -0.413849 -2.121322 vertex -1.866609 -0.371292 -2.319033 endloop endfacet facet normal 0.240624 0.035691 -0.969962 outer loop vertex -0.854121 -0.169895 2.870821 vertex -0.866660 -0.085359 2.870821 vertex -0.582452 -0.057367 2.942356 endloop endfacet facet normal 0.240624 0.035691 -0.969962 outer loop vertex -0.582452 -0.057367 2.942356 vertex -0.574025 -0.114181 2.942356 vertex -0.854121 -0.169895 2.870821 endloop endfacet facet normal 0.959602 0.142342 -0.242701 outer loop vertex -2.885817 -0.574024 0.585271 vertex -2.928185 -0.288400 0.585271 vertex -2.856996 -0.281389 0.870853 endloop endfacet facet normal 0.959601 0.142342 -0.242701 outer loop vertex -2.856996 -0.281389 0.870853 vertex -2.815658 -0.560069 0.870853 vertex -2.885817 -0.574024 0.585271 endloop endfacet facet normal 0.794854 0.117902 0.595236 outer loop vertex -2.274471 -0.452421 -1.903181 vertex -2.307863 -0.227305 -1.903181 vertex -2.482396 -0.244495 -1.666712 endloop endfacet facet normal 0.794855 0.117905 0.595235 outer loop vertex -2.482396 -0.244495 -1.666712 vertex -2.446478 -0.486635 -1.666712 vertex -2.274471 -0.452421 -1.903181 endloop endfacet facet normal 0.894404 0.132676 -0.427129 outer loop vertex -2.718379 -0.540719 1.148050 vertex -2.758290 -0.271668 1.148050 vertex -2.633023 -0.259330 1.414190 endloop endfacet facet normal 0.894404 0.132674 -0.427128 outer loop vertex -2.633023 -0.259330 1.414190 vertex -2.594925 -0.516163 1.414190 vertex -2.718379 -0.540719 1.148050 endloop endfacet facet normal 0.894403 0.132674 0.427132 outer loop vertex -2.594925 -0.516163 -1.414191 vertex -2.633023 -0.259330 -1.414191 vertex -2.758291 -0.271668 -1.148051 endloop endfacet facet normal 0.894402 0.132672 0.427134 outer loop vertex -2.758291 -0.271668 -1.148051 vertex -2.718381 -0.540720 -1.148051 vertex -2.594925 -0.516163 -1.414191 endloop endfacet facet normal 0.794855 0.117905 -0.595234 outer loop vertex -2.446478 -0.486635 1.666711 vertex -2.482396 -0.244494 1.666711 vertex -2.307864 -0.227305 1.903180 endloop endfacet facet normal 0.794857 0.117903 -0.595232 outer loop vertex -2.307864 -0.227305 1.903180 vertex -2.274472 -0.452421 1.903180 vertex -2.446478 -0.486635 1.666711 endloop endfacet facet normal 0.240624 0.035695 0.969962 outer loop vertex -0.574023 -0.114181 -2.942356 vertex -0.582451 -0.057367 -2.942356 vertex -0.866658 -0.085359 -2.870821 endloop endfacet facet normal 0.240624 0.035691 0.969962 outer loop vertex -0.866658 -0.085359 -2.870821 vertex -0.854119 -0.169895 -2.870821 vertex -0.574023 -0.114181 -2.942356 endloop endfacet facet normal 0.959601 0.142343 0.242703 outer loop vertex -2.815657 -0.560069 -0.870855 vertex -2.856995 -0.281389 -0.870855 vertex -2.928185 -0.288401 -0.585272 endloop endfacet facet normal 0.959601 0.142343 0.242704 outer loop vertex -2.928185 -0.288401 -0.585272 vertex -2.885817 -0.574024 -0.585272 vertex -2.815657 -0.560069 -0.870855 endloop endfacet facet normal 0.664732 0.098601 -0.740547 outer loop vertex -2.080558 -0.413849 2.121321 vertex -2.111103 -0.207926 2.121321 vertex -1.894014 -0.186544 2.319032 endloop endfacet facet normal 0.664732 0.098601 -0.740547 outer loop vertex -1.894014 -0.186544 2.319032 vertex -1.866610 -0.371292 2.319032 vertex -2.080558 -0.413849 2.121321 endloop endfacet facet normal 0.423343 0.062800 0.903790 outer loop vertex -1.125988 -0.223973 -2.771639 vertex -1.142520 -0.112529 -2.771639 vertex -1.407379 -0.138615 -2.645764 endloop endfacet facet normal 0.423343 0.062799 0.903790 outer loop vertex -1.407379 -0.138615 -2.645764 vertex -1.387015 -0.275895 -2.645764 vertex -1.125988 -0.223973 -2.771639 endloop endfacet facet normal 0.987988 0.146554 0.049008 outer loop vertex -2.928187 -0.582453 -0.294052 vertex -2.971177 -0.292636 -0.294052 vertex -2.985553 -0.294052 -0.000001 endloop endfacet facet normal 0.987988 0.146554 0.049008 outer loop vertex -2.985553 -0.294052 -0.000001 vertex -2.942355 -0.585271 -0.000001 vertex -2.928187 -0.582453 -0.294052 endloop endfacet facet normal 0.508986 0.075502 -0.857457 outer loop vertex -1.634685 -0.325159 2.494409 vertex -1.658685 -0.163366 2.494409 vertex -1.407380 -0.138615 2.645763 endloop endfacet facet normal 0.508986 0.075502 -0.857457 outer loop vertex -1.407380 -0.138615 2.645763 vertex -1.387016 -0.275895 2.645763 vertex -1.634685 -0.325159 2.494409 endloop endfacet facet normal 0.589710 0.087476 0.802864 outer loop vertex -1.634683 -0.325159 -2.494410 vertex -1.658683 -0.163366 -2.494410 vertex -1.894013 -0.186544 -2.319033 endloop endfacet facet normal 0.589709 0.087473 0.802865 outer loop vertex -1.894013 -0.186544 -2.319033 vertex -1.866609 -0.371292 -2.319033 vertex -1.634683 -0.325159 -2.494410 endloop endfacet facet normal 0.333599 0.049484 -0.941416 outer loop vertex -1.125990 -0.223974 2.771639 vertex -1.142521 -0.112529 2.771639 vertex -0.866660 -0.085359 2.870821 endloop endfacet facet normal 0.333600 0.049482 -0.941415 outer loop vertex -0.866660 -0.085359 2.870821 vertex -0.854121 -0.169895 2.870821 vertex -1.125990 -0.223974 2.771639 endloop endfacet facet normal 0.978495 0.145146 -0.146564 outer loop vertex -2.928187 -0.582453 0.294051 vertex -2.971177 -0.292636 0.294051 vertex -2.928185 -0.288400 0.585271 endloop endfacet facet normal 0.978495 0.145145 -0.146563 outer loop vertex -2.928185 -0.288400 0.585271 vertex -2.885817 -0.574024 0.585271 vertex -2.928187 -0.582453 0.294051 endloop endfacet facet normal 0.733329 0.108779 0.671116 outer loop vertex -2.080557 -0.413849 -2.121322 vertex -2.111103 -0.207925 -2.121322 vertex -2.307863 -0.227305 -1.903181 endloop endfacet facet normal 0.733328 0.108776 0.671117 outer loop vertex -2.307863 -0.227305 -1.903181 vertex -2.274471 -0.452421 -1.903181 vertex -2.080557 -0.413849 -2.121322 endloop endfacet facet normal 0.145312 0.021554 -0.989151 outer loop vertex -0.574025 -0.114181 2.942356 vertex -0.582452 -0.057367 2.942356 vertex -0.292635 -0.028822 2.985554 endloop endfacet facet normal 0.145312 0.021554 -0.989151 outer loop vertex -0.292635 -0.028822 2.985554 vertex -0.288401 -0.057367 2.985554 vertex -0.574025 -0.114181 2.942356 endloop endfacet facet normal 0.931480 0.138171 -0.336533 outer loop vertex -2.815658 -0.560069 0.870853 vertex -2.856996 -0.281389 0.870853 vertex -2.758290 -0.271668 1.148050 endloop endfacet facet normal 0.931478 0.138175 -0.336537 outer loop vertex -2.758290 -0.271668 1.148050 vertex -2.718379 -0.540719 1.148050 vertex -2.815658 -0.560069 0.870853 endloop endfacet facet normal 0.848714 0.125895 0.513648 outer loop vertex -2.446478 -0.486635 -1.666712 vertex -2.482396 -0.244495 -1.666712 vertex -2.633023 -0.259330 -1.414191 endloop endfacet facet normal 0.848715 0.125897 0.513647 outer loop vertex -2.633023 -0.259330 -1.414191 vertex -2.594925 -0.516163 -1.414191 vertex -2.446478 -0.486635 -1.666712 endloop endfacet facet normal 0.848714 0.125897 -0.513649 outer loop vertex -2.594925 -0.516163 1.414190 vertex -2.633023 -0.259330 1.414190 vertex -2.482396 -0.244494 1.666711 endloop endfacet facet normal 0.848715 0.125894 -0.513647 outer loop vertex -2.482396 -0.244494 1.666711 vertex -2.446478 -0.486635 1.666711 vertex -2.594925 -0.516163 1.414190 endloop endfacet facet normal 0.145312 0.021554 0.989151 outer loop vertex -0.288399 -0.057366 -2.985554 vertex -0.292633 -0.028822 -2.985554 vertex -0.582451 -0.057367 -2.942356 endloop endfacet facet normal 0.145312 0.021556 0.989151 outer loop vertex -0.582451 -0.057367 -2.942356 vertex -0.574023 -0.114181 -2.942356 vertex -0.288399 -0.057366 -2.985554 endloop endfacet facet normal 0.931481 0.138172 0.336528 outer loop vertex -2.718381 -0.540720 -1.148051 vertex -2.758291 -0.271668 -1.148051 vertex -2.856995 -0.281389 -0.870855 endloop endfacet facet normal 0.931481 0.138172 0.336528 outer loop vertex -2.856995 -0.281389 -0.870855 vertex -2.815657 -0.560069 -0.870855 vertex -2.718381 -0.540720 -1.148051 endloop endfacet facet normal 0.733328 0.108776 -0.671117 outer loop vertex -2.274472 -0.452421 1.903180 vertex -2.307864 -0.227305 1.903180 vertex -2.111103 -0.207926 2.121321 endloop endfacet facet normal 0.733328 0.108776 -0.671117 outer loop vertex -2.111103 -0.207926 2.121321 vertex -2.080558 -0.413849 2.121321 vertex -2.274472 -0.452421 1.903180 endloop endfacet facet normal 0.049068 -0.002411 -0.998792 outer loop vertex -0.294051 0.000000 2.985554 vertex -0.292635 0.028822 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.049068 -0.002411 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.292633 0.028822 -2.985554 vertex -0.294049 0.000000 -2.985554 endloop endfacet facet normal 0.802581 -0.039428 -0.595239 outer loop vertex -2.494409 0.000000 1.666711 vertex -2.482398 0.244495 1.666711 vertex -2.307864 0.227305 1.903180 endloop endfacet facet normal 0.802582 -0.039429 -0.595238 outer loop vertex -2.307864 0.227305 1.903180 vertex -2.319031 0.000000 1.903180 vertex -2.494409 0.000000 1.666711 endloop endfacet facet normal 0.740461 -0.036377 -0.671114 outer loop vertex -2.319031 0.000000 1.903180 vertex -2.307864 0.227305 1.903180 vertex -2.111105 0.207926 2.121321 endloop endfacet facet normal 0.740462 -0.036378 -0.671114 outer loop vertex -2.111105 0.207926 2.121321 vertex -2.121320 0.000000 2.121321 vertex -2.319031 0.000000 1.903180 endloop endfacet facet normal 0.048596 -0.007208 -0.998793 outer loop vertex -0.292635 0.028822 2.985554 vertex -0.288401 0.057367 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.048596 -0.007208 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.288399 0.057367 -2.985554 vertex -0.292633 0.028822 -2.985554 endloop endfacet facet normal 0.047655 -0.011936 -0.998792 outer loop vertex -0.288401 0.057367 2.985554 vertex -0.281390 0.085359 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.047655 -0.011938 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.281387 0.085359 -2.985554 vertex -0.288399 0.057367 -2.985554 endloop endfacet facet normal 0.046256 -0.016550 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.271666 0.112529 -2.985554 vertex -0.281387 0.085359 -2.985554 endloop endfacet facet normal 0.046255 -0.016551 -0.998792 outer loop vertex -0.281390 0.085359 2.985554 vertex -0.271668 0.112530 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.044410 -0.021005 -0.998793 outer loop vertex -0.271668 0.112530 2.985554 vertex -0.259330 0.138616 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.044410 -0.021005 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.259328 0.138615 -2.985554 vertex -0.271666 0.112529 -2.985554 endloop endfacet facet normal 0.042137 -0.025257 -0.998793 outer loop vertex -0.259330 0.138616 2.985554 vertex -0.244494 0.163368 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.042138 -0.025256 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.244493 0.163366 -2.985554 vertex -0.259328 0.138615 -2.985554 endloop endfacet facet normal 0.039459 -0.029265 -0.998792 outer loop vertex -0.244494 0.163368 2.985554 vertex -0.227304 0.186546 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.039459 -0.029265 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.227303 0.186544 -2.985554 vertex -0.244493 0.163366 -2.985554 endloop endfacet facet normal 0.036401 -0.032991 -0.998793 outer loop vertex -0.227304 0.186546 2.985554 vertex -0.207925 0.207928 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.036401 -0.032992 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.207923 0.207926 -2.985554 vertex -0.227303 0.186544 -2.985554 endloop endfacet facet normal 0.032991 -0.036401 -0.998793 outer loop vertex -0.207925 0.207928 2.985554 vertex -0.186543 0.227307 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.032992 -0.036401 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.186542 0.227305 -2.985554 vertex -0.207923 0.207926 -2.985554 endloop endfacet facet normal 0.029265 -0.039459 -0.998792 outer loop vertex -0.186543 0.227307 2.985554 vertex -0.163365 0.244497 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.029265 -0.039459 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.163364 0.244495 -2.985554 vertex -0.186542 0.227305 -2.985554 endloop endfacet facet normal 0.025256 -0.042138 -0.998793 outer loop vertex -0.163365 0.244497 2.985554 vertex -0.138614 0.259332 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.025256 -0.042139 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.138612 0.259330 -2.985554 vertex -0.163364 0.244495 -2.985554 endloop endfacet facet normal 0.021004 -0.044410 -0.998793 outer loop vertex -0.138614 0.259332 2.985554 vertex -0.112527 0.271670 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.021005 -0.044411 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.112526 0.271668 -2.985554 vertex -0.138612 0.259330 -2.985554 endloop endfacet facet normal 0.016551 -0.046255 -0.998793 outer loop vertex -0.112527 0.271670 2.985554 vertex -0.085357 0.281392 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.016551 -0.046255 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.085356 0.281390 -2.985554 vertex -0.112526 0.271668 -2.985554 endloop endfacet facet normal 0.011937 -0.047654 -0.998793 outer loop vertex -0.085357 0.281392 2.985554 vertex -0.057365 0.288404 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.011936 -0.047655 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.057364 0.288401 -2.985554 vertex -0.085356 0.281390 -2.985554 endloop endfacet facet normal 0.007210 -0.048595 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.028820 0.292636 -2.985554 vertex -0.057364 0.288401 -2.985554 endloop endfacet facet normal 0.007208 -0.048595 -0.998793 outer loop vertex -0.057365 0.288404 2.985554 vertex -0.028820 0.292638 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.002411 -0.049067 -0.998793 outer loop vertex -0.028820 0.292638 2.985554 vertex 0.000002 0.294054 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.002411 -0.049068 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.000002 0.294052 -2.985554 vertex -0.028820 0.292636 -2.985554 endloop endfacet facet normal -0.002411 -0.049067 -0.998793 outer loop vertex 0.000002 0.294054 2.985554 vertex 0.028825 0.292638 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.002411 -0.049068 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.028825 0.292636 -2.985554 vertex 0.000002 0.294052 -2.985554 endloop endfacet facet normal -0.007208 -0.048595 -0.998793 outer loop vertex 0.028825 0.292638 2.985554 vertex 0.057369 0.288404 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.007210 -0.048595 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.057369 0.288401 -2.985554 vertex 0.028825 0.292636 -2.985554 endloop endfacet facet normal -0.011937 -0.047654 -0.998793 outer loop vertex 0.057369 0.288404 2.985554 vertex 0.085362 0.281392 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.011936 -0.047655 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.085361 0.281390 -2.985554 vertex 0.057369 0.288401 -2.985554 endloop endfacet facet normal -0.016551 -0.046255 -0.998793 outer loop vertex 0.085362 0.281392 2.985554 vertex 0.112532 0.271670 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.016551 -0.046255 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.112531 0.271668 -2.985554 vertex 0.085361 0.281390 -2.985554 endloop endfacet facet normal -0.021005 -0.044410 -0.998792 outer loop vertex 0.112532 0.271670 2.985554 vertex 0.138618 0.259332 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.021005 -0.044410 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.138617 0.259330 -2.985554 vertex 0.112531 0.271668 -2.985554 endloop endfacet facet normal -0.025255 -0.042138 -0.998793 outer loop vertex 0.138618 0.259332 2.985554 vertex 0.163370 0.244497 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.025256 -0.042139 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.163369 0.244495 -2.985554 vertex 0.138617 0.259330 -2.985554 endloop endfacet facet normal -0.029265 -0.039459 -0.998793 outer loop vertex 0.163370 0.244497 2.985554 vertex 0.186548 0.227307 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.029265 -0.039459 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.186547 0.227305 -2.985554 vertex 0.163369 0.244495 -2.985554 endloop endfacet facet normal -0.032992 -0.036400 -0.998793 outer loop vertex 0.186548 0.227307 2.985554 vertex 0.207930 0.207927 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.032992 -0.036401 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.207928 0.207926 -2.985554 vertex 0.186547 0.227305 -2.985554 endloop endfacet facet normal -0.036400 -0.032992 -0.998793 outer loop vertex 0.207930 0.207927 2.985554 vertex 0.227309 0.186546 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.036401 -0.032991 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.227307 0.186544 -2.985554 vertex 0.207928 0.207926 -2.985554 endloop endfacet facet normal -0.039459 -0.029265 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.244497 0.163366 -2.985554 vertex 0.227307 0.186544 -2.985554 endloop endfacet facet normal -0.039459 -0.029265 -0.998793 outer loop vertex 0.227309 0.186546 2.985554 vertex 0.244499 0.163368 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.042137 -0.025256 -0.998793 outer loop vertex 0.244499 0.163368 2.985554 vertex 0.259335 0.138616 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.042137 -0.025258 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.259333 0.138615 -2.985554 vertex 0.244497 0.163366 -2.985554 endloop endfacet facet normal -0.044410 -0.021005 -0.998793 outer loop vertex 0.259335 0.138616 2.985554 vertex 0.271673 0.112530 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.044410 -0.021005 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.271671 0.112529 -2.985554 vertex 0.259333 0.138615 -2.985554 endloop endfacet facet normal -0.046255 -0.016549 -0.998793 outer loop vertex 0.271673 0.112530 2.985554 vertex 0.281394 0.085359 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.046256 -0.016550 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.281392 0.085359 -2.985554 vertex 0.271671 0.112529 -2.985554 endloop endfacet facet normal -0.047654 -0.011937 -0.998793 outer loop vertex 0.281394 0.085359 2.985554 vertex 0.288406 0.057367 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.047655 -0.011938 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.288404 0.057367 -2.985554 vertex 0.281392 0.085359 -2.985554 endloop endfacet facet normal -0.048596 -0.007208 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.292638 0.028822 -2.985554 vertex 0.288404 0.057367 -2.985554 endloop endfacet facet normal -0.048595 -0.007208 -0.998793 outer loop vertex 0.288406 0.057367 2.985554 vertex 0.292640 0.028822 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.049068 -0.002411 -0.998793 outer loop vertex 0.292640 0.028822 2.985554 vertex 0.294056 0.000000 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.049068 -0.002411 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.294054 0.000000 -2.985554 vertex 0.292638 0.028822 -2.985554 endloop endfacet facet normal -0.049068 0.002411 -0.998793 outer loop vertex 0.294056 0.000000 2.985554 vertex 0.292640 -0.028822 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.049068 0.002411 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.292638 -0.028822 -2.985554 vertex 0.294054 0.000000 -2.985554 endloop endfacet facet normal -0.048595 0.007208 -0.998793 outer loop vertex 0.292640 -0.028822 2.985554 vertex 0.288406 -0.057367 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.048596 0.007208 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.288404 -0.057367 -2.985554 vertex 0.292638 -0.028822 -2.985554 endloop endfacet facet normal -0.047654 0.011937 -0.998793 outer loop vertex 0.288406 -0.057367 2.985554 vertex 0.281394 -0.085359 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.047655 0.011938 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.281392 -0.085359 -2.985554 vertex 0.288404 -0.057367 -2.985554 endloop endfacet facet normal -0.046256 0.016549 -0.998793 outer loop vertex 0.281394 -0.085359 2.985554 vertex 0.271673 -0.112530 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.046255 0.016551 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.271670 -0.112529 -2.985554 vertex 0.281392 -0.085359 -2.985554 endloop endfacet facet normal -0.044410 0.021005 -0.998793 outer loop vertex 0.271673 -0.112530 2.985554 vertex 0.259335 -0.138616 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.044411 0.021004 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.259333 -0.138615 -2.985554 vertex 0.271670 -0.112529 -2.985554 endloop endfacet facet normal -0.042137 0.025257 -0.998793 outer loop vertex 0.259335 -0.138616 2.985554 vertex 0.244499 -0.163368 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.042137 0.025258 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.244497 -0.163366 -2.985554 vertex 0.259333 -0.138615 -2.985554 endloop endfacet facet normal -0.039459 0.029265 -0.998792 outer loop vertex 0.244499 -0.163368 2.985554 vertex 0.227309 -0.186546 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.039459 0.029265 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.227307 -0.186544 -2.985554 vertex 0.244497 -0.163366 -2.985554 endloop endfacet facet normal -0.036400 0.032992 -0.998793 outer loop vertex 0.227309 -0.186546 2.985554 vertex 0.207930 -0.207927 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.036401 0.032991 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.207928 -0.207926 -2.985554 vertex 0.227307 -0.186544 -2.985554 endloop endfacet facet normal -0.032992 0.036400 -0.998792 outer loop vertex 0.207930 -0.207927 2.985554 vertex 0.186548 -0.227307 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.032992 0.036401 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.186547 -0.227305 -2.985554 vertex 0.207928 -0.207926 -2.985554 endloop endfacet facet normal -0.029265 0.039459 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.163369 -0.244495 -2.985554 vertex 0.186547 -0.227305 -2.985554 endloop endfacet facet normal -0.029265 0.039459 -0.998793 outer loop vertex 0.186548 -0.227307 2.985554 vertex 0.163370 -0.244497 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.025255 0.042138 -0.998793 outer loop vertex 0.163370 -0.244497 2.985554 vertex 0.138618 -0.259332 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.025256 0.042139 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.138617 -0.259330 -2.985554 vertex 0.163369 -0.244495 -2.985554 endloop endfacet facet normal -0.021005 0.044410 -0.998792 outer loop vertex 0.138618 -0.259332 2.985554 vertex 0.112532 -0.271670 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.021005 0.044410 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.112531 -0.271668 -2.985554 vertex 0.138617 -0.259330 -2.985554 endloop endfacet facet normal -0.016551 0.046255 -0.998793 outer loop vertex 0.112532 -0.271670 2.985554 vertex 0.085362 -0.281392 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.016551 0.046255 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.085361 -0.281390 -2.985554 vertex 0.112531 -0.271668 -2.985554 endloop endfacet facet normal -0.011937 0.047655 -0.998793 outer loop vertex 0.085362 -0.281392 2.985554 vertex 0.057369 -0.288404 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.011936 0.047655 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.057369 -0.288401 -2.985554 vertex 0.085361 -0.281390 -2.985554 endloop endfacet facet normal -0.007208 0.048596 -0.998793 outer loop vertex 0.057369 -0.288404 2.985554 vertex 0.028825 -0.292638 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.007208 0.048596 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.028824 -0.292635 -2.985554 vertex 0.057369 -0.288401 -2.985554 endloop endfacet facet normal -0.002411 0.049068 -0.998792 outer loop vertex 0.028825 -0.292638 2.985554 vertex 0.000002 -0.294054 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal -0.002411 0.049068 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex 0.000002 -0.294051 -2.985554 vertex 0.028824 -0.292635 -2.985554 endloop endfacet facet normal 0.002411 0.049068 -0.998792 outer loop vertex 0.000002 -0.294054 2.985554 vertex -0.028820 -0.292638 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.002411 0.049068 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.028820 -0.292635 -2.985554 vertex 0.000002 -0.294051 -2.985554 endloop endfacet facet normal 0.007208 0.048596 -0.998793 outer loop vertex -0.028820 -0.292638 2.985554 vertex -0.057365 -0.288404 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.007208 0.048596 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.057364 -0.288401 -2.985554 vertex -0.028820 -0.292635 -2.985554 endloop endfacet facet normal 0.011938 0.047655 -0.998792 outer loop vertex -0.057365 -0.288404 2.985554 vertex -0.085357 -0.281392 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.011936 0.047655 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.085356 -0.281390 -2.985554 vertex -0.057364 -0.288401 -2.985554 endloop endfacet facet normal 0.016551 0.046255 -0.998792 outer loop vertex -0.085357 -0.281392 2.985554 vertex -0.112527 -0.271670 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.016551 0.046255 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.112526 -0.271668 -2.985554 vertex -0.085356 -0.281390 -2.985554 endloop endfacet facet normal 0.021004 0.044411 -0.998793 outer loop vertex -0.112527 -0.271670 2.985554 vertex -0.138614 -0.259332 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.021005 0.044411 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.138612 -0.259330 -2.985554 vertex -0.112526 -0.271668 -2.985554 endloop endfacet facet normal 0.025256 0.042138 -0.998792 outer loop vertex -0.138614 -0.259332 2.985554 vertex -0.163365 -0.244497 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.025256 0.042139 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.163364 -0.244495 -2.985554 vertex -0.138612 -0.259330 -2.985554 endloop endfacet facet normal 0.029265 0.039459 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.186542 -0.227305 -2.985554 vertex -0.163364 -0.244495 -2.985554 endloop endfacet facet normal 0.029265 0.039459 -0.998792 outer loop vertex -0.163365 -0.244497 2.985554 vertex -0.186543 -0.227307 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.032992 0.036401 -0.998792 outer loop vertex -0.186543 -0.227307 2.985554 vertex -0.207925 -0.207927 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.032992 0.036401 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.207923 -0.207926 -2.985554 vertex -0.186542 -0.227305 -2.985554 endloop endfacet facet normal 0.036401 0.032992 -0.998793 outer loop vertex -0.207925 -0.207927 2.985554 vertex -0.227304 -0.186546 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.036401 0.032992 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.227302 -0.186544 -2.985554 vertex -0.207923 -0.207926 -2.985554 endloop endfacet facet normal 0.039460 0.029264 -0.998792 outer loop vertex -0.227304 -0.186546 2.985554 vertex -0.244494 -0.163367 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.039460 0.029265 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.244492 -0.163366 -2.985554 vertex -0.227302 -0.186544 -2.985554 endloop endfacet facet normal 0.042137 0.025258 -0.998792 outer loop vertex -0.244494 -0.163367 2.985554 vertex -0.259330 -0.138616 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.042137 0.025258 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.259328 -0.138615 -2.985554 vertex -0.244492 -0.163366 -2.985554 endloop endfacet facet normal 0.044411 0.021004 -0.998792 outer loop vertex -0.259330 -0.138616 2.985554 vertex -0.271668 -0.112529 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.044410 0.021005 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.271666 -0.112529 -2.985554 vertex -0.259328 -0.138615 -2.985554 endloop endfacet facet normal 0.046256 0.016550 -0.998793 outer loop vertex -0.271668 -0.112529 2.985554 vertex -0.281389 -0.085359 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.046256 0.016550 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.281387 -0.085359 -2.985554 vertex -0.271666 -0.112529 -2.985554 endloop endfacet facet normal 0.047655 0.011938 -0.998792 outer loop vertex -0.281389 -0.085359 2.985554 vertex -0.288401 -0.057367 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.047655 0.011937 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.288399 -0.057366 -2.985554 vertex -0.281387 -0.085359 -2.985554 endloop endfacet facet normal 0.048596 0.007208 -0.998792 outer loop vertex -0.288401 -0.057367 2.985554 vertex -0.292635 -0.028822 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.048596 0.007208 0.998793 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.292633 -0.028822 -2.985554 vertex -0.288399 -0.057366 -2.985554 endloop endfacet facet normal 0.242964 0.011935 0.969962 outer loop vertex -0.582451 -0.057367 -2.942356 vertex -0.585269 0.000000 -2.942356 vertex -0.870852 0.000000 -2.870821 endloop endfacet facet normal 0.242964 0.011938 0.969962 outer loop vertex -0.870852 0.000000 -2.870821 vertex -0.866658 -0.085359 -2.870821 vertex -0.582451 -0.057367 -2.942356 endloop endfacet facet normal 0.968931 0.047608 0.242706 outer loop vertex -2.856995 -0.281389 -0.870855 vertex -2.870821 0.000000 -0.870855 vertex -2.942356 0.000000 -0.585272 endloop endfacet facet normal 0.968932 0.047610 0.242703 outer loop vertex -2.942356 0.000000 -0.585272 vertex -2.928185 -0.288401 -0.585272 vertex -2.856995 -0.281389 -0.870855 endloop endfacet facet normal 0.671194 0.032981 -0.740547 outer loop vertex -2.111103 -0.207926 2.121321 vertex -2.121320 0.000000 2.121321 vertex -1.903180 0.000000 2.319032 endloop endfacet facet normal 0.671195 0.032980 -0.740547 outer loop vertex -1.903180 0.000000 2.319032 vertex -1.894014 -0.186544 2.319032 vertex -2.111103 -0.207926 2.121321 endloop endfacet facet normal 0.427461 0.021003 0.903790 outer loop vertex -1.142520 -0.112529 -2.771639 vertex -1.148049 0.000000 -2.771639 vertex -1.414189 0.000000 -2.645764 endloop endfacet facet normal 0.427460 0.021000 0.903790 outer loop vertex -1.414189 0.000000 -2.645764 vertex -1.407379 -0.138615 -2.645764 vertex -1.142520 -0.112529 -2.771639 endloop endfacet facet normal 0.997595 0.049011 0.049009 outer loop vertex -2.971177 -0.292636 -0.294052 vertex -2.985554 0.000000 -0.294052 vertex -3.000000 0.000000 -0.000001 endloop endfacet facet normal 0.997595 0.049013 0.049008 outer loop vertex -3.000000 0.000000 -0.000001 vertex -2.985553 -0.294052 -0.000001 vertex -2.971177 -0.292636 -0.294052 endloop endfacet facet normal 0.513935 0.025249 -0.857457 outer loop vertex -1.658685 -0.163366 2.494409 vertex -1.666711 0.000000 2.494409 vertex -1.414190 0.000000 2.645763 endloop endfacet facet normal 0.513935 0.025249 -0.857457 outer loop vertex -1.414190 0.000000 2.645763 vertex -1.407380 -0.138615 2.645763 vertex -1.658685 -0.163366 2.494409 endloop endfacet facet normal 0.595442 0.029253 0.802865 outer loop vertex -1.658683 -0.163366 -2.494410 vertex -1.666709 0.000000 -2.494410 vertex -1.903179 0.000000 -2.319033 endloop endfacet facet normal 0.595444 0.029258 0.802864 outer loop vertex -1.903179 0.000000 -2.319033 vertex -1.894013 -0.186544 -2.319033 vertex -1.658683 -0.163366 -2.494410 endloop endfacet facet normal 0.336842 0.016550 -0.941415 outer loop vertex -1.142521 -0.112529 2.771639 vertex -1.148050 0.000000 2.771639 vertex -0.870854 0.000000 2.870821 endloop endfacet facet normal 0.336842 0.016550 -0.941415 outer loop vertex -0.870854 0.000000 2.870821 vertex -0.866660 -0.085359 2.870821 vertex -1.142521 -0.112529 2.771639 endloop endfacet facet normal 0.988011 0.048540 -0.146556 outer loop vertex -2.971177 -0.292636 0.294051 vertex -2.985554 0.000000 0.294051 vertex -2.942356 0.000000 0.585271 endloop endfacet facet normal 0.988009 0.048548 -0.146564 outer loop vertex -2.942356 0.000000 0.585271 vertex -2.928185 -0.288400 0.585271 vertex -2.971177 -0.292636 0.294051 endloop endfacet facet normal 0.740460 0.036381 0.671115 outer loop vertex -2.111103 -0.207925 -2.121322 vertex -2.121319 0.000000 -2.121322 vertex -2.319031 0.000000 -1.903181 endloop endfacet facet normal 0.740459 0.036380 0.671116 outer loop vertex -2.319031 0.000000 -1.903181 vertex -2.307863 -0.227305 -1.903181 vertex -2.111103 -0.207925 -2.121322 endloop endfacet facet normal 0.146725 0.007208 -0.989151 outer loop vertex -0.294051 0.000000 2.985554 vertex -0.292635 -0.028822 2.985554 vertex -0.582452 -0.057367 2.942356 endloop endfacet facet normal 0.146725 0.007210 -0.989151 outer loop vertex -0.582452 -0.057367 2.942356 vertex -0.585271 0.000000 2.942356 vertex -0.294051 0.000000 2.985554 endloop endfacet facet normal 0.940538 0.046210 -0.336531 outer loop vertex -2.856996 -0.281389 0.870853 vertex -2.870821 0.000000 0.870853 vertex -2.771638 0.000000 1.148050 endloop endfacet facet normal 0.940537 0.046211 -0.336533 outer loop vertex -2.771638 0.000000 1.148050 vertex -2.758290 -0.271668 1.148050 vertex -2.856996 -0.281389 0.870853 endloop endfacet facet normal 0.856969 0.042103 0.513646 outer loop vertex -2.482396 -0.244495 -1.666712 vertex -2.494408 0.000000 -1.666712 vertex -2.645763 0.000000 -1.414191 endloop endfacet facet normal 0.856967 0.042100 0.513649 outer loop vertex -2.645763 0.000000 -1.414191 vertex -2.633023 -0.259330 -1.414191 vertex -2.482396 -0.244495 -1.666712 endloop endfacet facet normal 0.856968 0.042104 -0.513646 outer loop vertex -2.633023 -0.259330 1.414190 vertex -2.645764 0.000000 1.414190 vertex -2.494409 0.000000 1.666711 endloop endfacet facet normal 0.856967 0.042107 -0.513649 outer loop vertex -2.494409 0.000000 1.666711 vertex -2.482396 -0.244494 1.666711 vertex -2.633023 -0.259330 1.414190 endloop endfacet facet normal 0.146725 0.007208 0.989151 outer loop vertex -0.292633 -0.028822 -2.985554 vertex -0.294049 0.000000 -2.985554 vertex -0.585269 0.000000 -2.942356 endloop endfacet facet normal 0.146725 0.007207 0.989151 outer loop vertex -0.585269 0.000000 -2.942356 vertex -0.582451 -0.057367 -2.942356 vertex -0.292633 -0.028822 -2.985554 endloop endfacet facet normal 0.940538 0.046208 0.336532 outer loop vertex -2.758291 -0.271668 -1.148051 vertex -2.771638 0.000000 -1.148051 vertex -2.870821 0.000000 -0.870855 endloop endfacet facet normal 0.940539 0.046213 0.336528 outer loop vertex -2.870821 0.000000 -0.870855 vertex -2.856995 -0.281389 -0.870855 vertex -2.758291 -0.271668 -1.148051 endloop endfacet facet normal 0.740461 0.036377 -0.671114 outer loop vertex -2.307864 -0.227305 1.903180 vertex -2.319031 0.000000 1.903180 vertex -2.121320 0.000000 2.121321 endloop endfacet facet normal 0.740458 0.036384 -0.671117 outer loop vertex -2.121320 0.000000 2.121321 vertex -2.111103 -0.207926 2.121321 vertex -2.307864 -0.227305 1.903180 endloop endfacet facet normal 0.336841 0.016550 0.941416 outer loop vertex -0.866658 -0.085359 -2.870821 vertex -0.870852 0.000000 -2.870821 vertex -1.148049 0.000000 -2.771639 endloop endfacet facet normal 0.336841 0.016551 0.941416 outer loop vertex -1.148049 0.000000 -2.771639 vertex -1.142520 -0.112529 -2.771639 vertex -0.866658 -0.085359 -2.870821 endloop endfacet facet normal 0.988010 0.048548 0.146556 outer loop vertex -2.928185 -0.288401 -0.585272 vertex -2.942356 0.000000 -0.585272 vertex -2.985554 0.000000 -0.294052 endloop endfacet facet normal 0.988010 0.048540 0.146563 outer loop vertex -2.985554 0.000000 -0.294052 vertex -2.971177 -0.292636 -0.294052 vertex -2.928185 -0.288401 -0.585272 endloop endfacet facet normal 0.595444 0.029258 -0.802864 outer loop vertex -1.894014 -0.186544 2.319032 vertex -1.903180 0.000000 2.319032 vertex -1.666711 0.000000 2.494409 endloop endfacet facet normal 0.595446 0.029254 -0.802863 outer loop vertex -1.666711 0.000000 2.494409 vertex -1.658685 -0.163366 2.494409 vertex -1.894014 -0.186544 2.319032 endloop endfacet facet normal 0.513937 0.025249 0.857456 outer loop vertex -1.407379 -0.138615 -2.645764 vertex -1.414189 0.000000 -2.645764 vertex -1.666709 0.000000 -2.494410 endloop endfacet facet normal 0.513938 0.025249 0.857456 outer loop vertex -1.666709 0.000000 -2.494410 vertex -1.658683 -0.163366 -2.494410 vertex -1.407379 -0.138615 -2.645764 endloop endfacet facet normal 0.427464 0.021001 -0.903788 outer loop vertex -1.407380 -0.138615 2.645763 vertex -1.414190 0.000000 2.645763 vertex -1.148050 0.000000 2.771639 endloop endfacet facet normal 0.427464 0.021003 -0.903789 outer loop vertex -1.148050 0.000000 2.771639 vertex -1.142521 -0.112529 2.771639 vertex -1.407380 -0.138615 2.645763 endloop endfacet facet normal 0.997595 0.049013 -0.049009 outer loop vertex -2.985553 -0.294052 -0.000001 vertex -3.000000 0.000000 -0.000001 vertex -2.985554 0.000000 0.294051 endloop endfacet facet normal 0.997595 0.049011 -0.049008 outer loop vertex -2.985554 0.000000 0.294051 vertex -2.971177 -0.292636 0.294051 vertex -2.985553 -0.294052 -0.000001 endloop endfacet facet normal 0.671194 0.032980 0.740547 outer loop vertex -1.894013 -0.186544 -2.319033 vertex -1.903179 0.000000 -2.319033 vertex -2.121319 0.000000 -2.121322 endloop endfacet facet normal 0.671194 0.032978 0.740548 outer loop vertex -2.121319 0.000000 -2.121322 vertex -2.111103 -0.207925 -2.121322 vertex -1.894013 -0.186544 -2.319033 endloop endfacet facet normal 0.242964 0.011938 -0.969962 outer loop vertex -0.866660 -0.085359 2.870821 vertex -0.870854 0.000000 2.870821 vertex -0.585271 0.000000 2.942356 endloop endfacet facet normal 0.242963 0.011939 -0.969962 outer loop vertex -0.585271 0.000000 2.942356 vertex -0.582452 -0.057367 2.942356 vertex -0.866660 -0.085359 2.870821 endloop endfacet facet normal 0.968931 0.047610 -0.242706 outer loop vertex -2.928185 -0.288400 0.585271 vertex -2.942356 0.000000 0.585271 vertex -2.870821 0.000000 0.870853 endloop endfacet facet normal 0.968932 0.047605 -0.242701 outer loop vertex -2.870821 0.000000 0.870853 vertex -2.856996 -0.281389 0.870853 vertex -2.928185 -0.288400 0.585271 endloop endfacet facet normal 0.802583 0.039433 0.595235 outer loop vertex -2.307863 -0.227305 -1.903181 vertex -2.319031 0.000000 -1.903181 vertex -2.494408 0.000000 -1.666712 endloop endfacet facet normal 0.802583 0.039431 0.595236 outer loop vertex -2.494408 0.000000 -1.666712 vertex -2.482396 -0.244495 -1.666712 vertex -2.307863 -0.227305 -1.903181 endloop endfacet facet normal 0.049068 0.002411 -0.998792 outer loop vertex -0.292635 -0.028822 2.985554 vertex -0.294051 0.000000 2.985554 vertex 0.000001 -0.000002 3.000000 endloop endfacet facet normal 0.903100 0.044372 -0.427131 outer loop vertex -2.758290 -0.271668 1.148050 vertex -2.771638 0.000000 1.148050 vertex -2.645764 0.000000 1.414190 endloop endfacet facet normal 0.903101 0.044370 -0.427129 outer loop vertex -2.645764 0.000000 1.414190 vertex -2.633023 -0.259330 1.414190 vertex -2.758290 -0.271668 1.148050 endloop endfacet facet normal 0.049068 0.002411 0.998792 outer loop vertex 0.000002 0.000000 -3.000000 vertex -0.294049 0.000000 -2.985554 vertex -0.292633 -0.028822 -2.985554 endloop endfacet facet normal 0.903099 0.044366 0.427135 outer loop vertex -2.633023 -0.259330 -1.414191 vertex -2.645763 0.000000 -1.414191 vertex -2.771638 0.000000 -1.148051 endloop endfacet facet normal 0.903100 0.044369 0.427132 outer loop vertex -2.771638 0.000000 -1.148051 vertex -2.758291 -0.271668 -1.148051 vertex -2.633023 -0.259330 -1.414191 endloop endfacet facet normal 0.802582 0.039435 -0.595237 outer loop vertex -2.482396 -0.244494 1.666711 vertex -2.494409 0.000000 1.666711 vertex -2.319031 0.000000 1.903180 endloop endfacet facet normal 0.802585 0.039429 -0.595234 outer loop vertex -2.319031 0.000000 1.903180 vertex -2.307864 -0.227305 1.903180 vertex -2.482396 -0.244494 1.666711 endloop endfacet facet normal -0.973329 0.000000 0.229412 outer loop vertex -4.713967 8.819212 -10.000000 vertex 0.000006 8.819212 10.000000 vertex 0.000006 9.238795 10.000000 endloop endfacet facet normal -0.426132 0.900979 0.081537 outer loop vertex 0.000006 9.238795 10.000000 vertex -3.826835 9.238795 -10.000000 vertex -4.713967 8.819212 -10.000000 endloop endfacet facet normal -0.510369 0.851501 0.120293 outer loop vertex 0.000006 8.819212 10.000000 vertex -4.713967 8.819212 -10.000000 vertex -5.555702 8.314696 -10.000000 endloop endfacet facet normal -0.963516 0.000000 0.267651 outer loop vertex -5.555702 8.314696 -10.000000 vertex 0.000006 8.314696 10.000000 vertex 0.000006 8.819212 10.000000 endloop endfacet facet normal -0.982182 0.000000 0.187933 outer loop vertex -3.826835 9.238795 -10.000000 vertex 0.000006 9.238795 10.000000 vertex 0.000006 9.569404 10.000000 endloop endfacet facet normal -0.336488 0.940420 0.048839 outer loop vertex 0.000006 9.569404 10.000000 vertex -2.902847 9.569404 -10.000000 vertex -3.826835 9.238795 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -4.713967 8.819212 -10.000000 vertex -3.826835 9.238795 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -3.826835 9.238795 -10.000000 vertex -2.902847 9.569404 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.587707 0.792432 0.163256 outer loop vertex 0.000006 8.314696 10.000000 vertex -5.555702 8.314696 -10.000000 vertex -6.343933 7.730105 -10.000000 endloop endfacet facet normal -0.953197 0.000000 0.302351 outer loop vertex -6.343933 7.730105 -10.000000 vertex 0.000006 7.730105 10.000000 vertex 0.000006 8.314696 10.000000 endloop endfacet facet normal -0.989630 0.000000 0.143638 outer loop vertex -2.902847 9.569404 -10.000000 vertex 0.000006 9.569404 10.000000 vertex 0.000006 9.807846 10.000000 endloop endfacet facet normal -0.242912 0.969759 0.023695 outer loop vertex 0.000006 9.807846 10.000000 vertex -1.950903 9.807853 -10.000000 vertex -2.902847 9.569404 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -5.555702 8.314696 -10.000000 vertex -4.713967 8.819212 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -2.902847 9.569404 -10.000000 vertex -1.950903 9.807853 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -6.343933 7.730105 -10.000000 vertex -5.555702 8.314696 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -1.950903 9.807853 -10.000000 vertex -0.980171 9.951847 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.656823 0.724691 0.208342 outer loop vertex 0.000006 7.730105 10.000000 vertex -6.343933 7.730105 -10.000000 vertex -7.071068 7.071068 -10.000000 endloop endfacet facet normal -0.942809 0.000000 0.333334 outer loop vertex -7.071068 7.071068 -10.000000 vertex 0.000006 7.071068 10.000000 vertex 0.000006 7.730105 10.000000 endloop endfacet facet normal -0.995276 0.000000 0.097085 outer loop vertex -1.950903 9.807853 -10.000000 vertex 0.000006 9.807846 10.000000 vertex 0.000006 9.951847 10.000000 endloop endfacet facet normal -0.146727 0.989151 0.007191 outer loop vertex 0.000006 9.951847 10.000000 vertex -0.980171 9.951847 -10.000000 vertex -1.950903 9.807853 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -7.071068 7.071068 -10.000000 vertex -6.343933 7.730105 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -0.980171 9.951847 -10.000000 vertex 0.000000 10.000000 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -7.730104 6.343933 -10.000000 vertex -7.071068 7.071068 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 0.000000 10.000000 -10.000000 vertex 0.980206 9.951843 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.716765 0.649638 0.253415 outer loop vertex 0.000006 7.071068 10.000000 vertex -7.071068 7.071068 -10.000000 vertex -7.730104 6.343933 -10.000000 endloop endfacet facet normal -0.932754 0.000000 0.360514 outer loop vertex -7.730104 6.343933 -10.000000 vertex 0.000006 6.343933 10.000000 vertex 0.000006 7.071068 10.000000 endloop endfacet facet normal -0.998801 0.000000 0.048950 outer loop vertex -0.980171 9.951847 -10.000000 vertex 0.000006 9.951847 10.000000 vertex 0.000006 10.000000 10.000000 endloop endfacet facet normal -0.049068 0.998795 0.000000 outer loop vertex 0.000006 10.000000 10.000000 vertex 0.000000 10.000000 -10.000000 vertex -0.980171 9.951847 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -8.314696 5.555703 -10.000000 vertex -7.730104 6.343933 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 0.980206 9.951843 -10.000000 vertex 1.950935 9.807846 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -8.819212 4.713968 -10.000000 vertex -8.314696 5.555703 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 1.950935 9.807846 -10.000000 vertex 2.902876 9.569395 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.767093 0.568916 0.296486 outer loop vertex 0.000006 6.343933 10.000000 vertex -7.730104 6.343933 -10.000000 vertex -8.314696 5.555703 -10.000000 endloop endfacet facet normal -0.923382 0.000000 0.383882 outer loop vertex -8.314696 5.555703 -10.000000 vertex 0.000006 5.555703 10.000000 vertex 0.000006 6.343933 10.000000 endloop endfacet facet normal 1.000000 0.000000 -0.000000 outer loop vertex 0.000000 10.000000 -10.000000 vertex 0.000006 10.000000 10.000000 vertex 0.000006 9.951847 10.000000 endloop endfacet facet normal 0.049070 0.998792 0.002405 outer loop vertex 0.000006 9.951847 10.000000 vertex 0.980206 9.951843 -10.000000 vertex 0.000000 10.000000 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -9.238795 3.826834 -10.000000 vertex -8.819212 4.713968 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 2.902876 9.569395 -10.000000 vertex 3.826860 9.238785 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -9.569404 2.902846 -10.000000 vertex -9.238795 3.826834 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.914991 0.000000 0.403475 outer loop vertex -8.819212 4.713968 -10.000000 vertex 0.000006 4.713968 10.000000 vertex 0.000006 5.555703 10.000000 endloop endfacet facet normal -0.807901 0.484236 0.335873 outer loop vertex 0.000006 5.555703 10.000000 vertex -8.314696 5.555703 -10.000000 vertex -8.819212 4.713968 -10.000000 endloop endfacet facet normal 0.998801 -0.000000 0.048951 outer loop vertex 0.980206 9.951843 -10.000000 vertex 0.000006 9.951847 10.000000 vertex 0.000006 9.807846 10.000000 endloop endfacet facet normal 0.146719 0.989075 0.014312 outer loop vertex 0.000006 9.807846 10.000000 vertex 1.950935 9.807846 -10.000000 vertex 0.980206 9.951843 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.826860 9.238785 -10.000000 vertex 4.713991 8.819201 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -9.807853 1.950902 -10.000000 vertex -9.569404 2.902846 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.907821 0.000000 0.419359 outer loop vertex -9.238795 3.826834 -10.000000 vertex 0.000006 3.826834 10.000000 vertex 0.000006 4.713968 10.000000 endloop endfacet facet normal -0.839731 0.397163 0.370288 outer loop vertex 0.000006 4.713968 10.000000 vertex -8.819212 4.713968 -10.000000 vertex -9.238795 3.826834 -10.000000 endloop endfacet facet normal 0.995276 -0.000000 0.097086 outer loop vertex 1.950935 9.807846 -10.000000 vertex 0.000006 9.807846 10.000000 vertex 0.000006 9.569404 10.000000 endloop endfacet facet normal 0.242831 0.969428 0.035245 outer loop vertex 0.000006 9.569404 10.000000 vertex 2.902876 9.569395 -10.000000 vertex 1.950935 9.807846 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 4.713991 8.819201 -10.000000 vertex 5.555723 8.314682 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -9.951847 0.980170 -10.000000 vertex -9.807853 1.950902 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.902061 0.000000 0.431609 outer loop vertex -9.569404 2.902846 -10.000000 vertex 0.000006 2.902846 10.000000 vertex 0.000006 3.826834 10.000000 endloop endfacet facet normal -0.863413 0.308934 0.398845 outer loop vertex 0.000006 3.826834 10.000000 vertex -9.238795 3.826834 -10.000000 vertex -9.569404 2.902846 -10.000000 endloop endfacet facet normal 0.989630 -0.000000 0.143638 outer loop vertex 2.902876 9.569395 -10.000000 vertex 0.000006 9.569404 10.000000 vertex 0.000006 9.238795 10.000000 endloop endfacet facet normal 0.336195 0.939593 0.064328 outer loop vertex 0.000006 9.238795 10.000000 vertex 3.826860 9.238785 -10.000000 vertex 2.902876 9.569395 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 5.555723 8.314682 -10.000000 vertex 6.343950 7.730090 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -10.000000 -0.000002 -10.000000 vertex -9.951847 0.980170 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.897851 0.000000 0.440300 outer loop vertex -9.807853 1.950902 -10.000000 vertex 0.000006 1.950902 10.000000 vertex 0.000006 2.902846 10.000000 endloop endfacet facet normal -0.879879 0.220398 0.420996 outer loop vertex 0.000006 2.902846 10.000000 vertex -9.569404 2.902846 -10.000000 vertex -9.807853 1.950902 -10.000000 endloop endfacet facet normal 0.982182 -0.000000 0.187933 outer loop vertex 3.826860 9.238785 -10.000000 vertex 0.000006 9.238795 10.000000 vertex 0.000006 8.819212 10.000000 endloop endfacet facet normal 0.425402 0.899433 0.100266 outer loop vertex 0.000006 8.819212 10.000000 vertex 4.713991 8.819201 -10.000000 vertex 3.826860 9.238785 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 6.343950 7.730090 -10.000000 vertex 7.071083 7.071054 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.000000 -0.000000 -1.000000 outer loop vertex -9.951847 -0.980173 -10.000000 vertex -10.000000 -0.000002 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.895288 0.000000 0.445489 outer loop vertex -9.951847 0.980170 -10.000000 vertex 0.000006 0.980170 10.000000 vertex 0.000006 1.950902 10.000000 endloop endfacet facet normal -0.889992 0.132018 0.436446 outer loop vertex 0.000006 1.950902 10.000000 vertex -9.807853 1.950902 -10.000000 vertex -9.951847 0.980170 -10.000000 endloop endfacet facet normal 0.973329 -0.000000 0.229413 outer loop vertex 4.713991 8.819201 -10.000000 vertex 0.000006 8.819212 10.000000 vertex 0.000006 8.314696 10.000000 endloop endfacet facet normal 0.508943 0.849111 0.141376 outer loop vertex 0.000006 8.314696 10.000000 vertex 5.555723 8.314682 -10.000000 vertex 4.713991 8.819201 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 7.071083 7.071054 -10.000000 vertex 7.730116 6.343918 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -9.807853 -1.950906 -10.000000 vertex -9.951847 -0.980173 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.894427 0.000000 0.447214 outer loop vertex -10.000000 -0.000002 -10.000000 vertex 0.000006 -0.000002 10.000000 vertex 0.000006 0.980170 10.000000 endloop endfacet facet normal -0.894423 0.043940 0.445058 outer loop vertex 0.000006 0.980170 10.000000 vertex -9.951847 0.980170 -10.000000 vertex -10.000000 -0.000002 -10.000000 endloop endfacet facet normal 0.963516 -0.000000 0.267651 outer loop vertex 5.555723 8.314682 -10.000000 vertex 0.000006 8.314696 10.000000 vertex 0.000006 7.730105 10.000000 endloop endfacet facet normal 0.585344 0.789240 0.185669 outer loop vertex 0.000006 7.730105 10.000000 vertex 6.343950 7.730090 -10.000000 vertex 5.555723 8.314682 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 7.730116 6.343918 -10.000000 vertex 8.314706 5.555689 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -9.569403 -2.902850 -10.000000 vertex -9.807853 -1.950906 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.895288 0.000000 0.445489 outer loop vertex -9.951847 -0.980173 -10.000000 vertex 0.000006 -0.980173 10.000000 vertex 0.000006 -0.000002 10.000000 endloop endfacet facet normal -0.893565 -0.043898 0.446783 outer loop vertex 0.000006 -0.000002 10.000000 vertex -10.000000 -0.000002 -10.000000 vertex -9.951847 -0.980173 -10.000000 endloop endfacet facet normal 0.953197 -0.000000 0.302351 outer loop vertex 6.343950 7.730090 -10.000000 vertex 0.000006 7.730105 10.000000 vertex 0.000006 7.071068 10.000000 endloop endfacet facet normal 0.653395 0.720909 0.231010 outer loop vertex 0.000006 7.071068 10.000000 vertex 7.071083 7.071054 -10.000000 vertex 6.343950 7.730090 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 8.314706 5.555689 -10.000000 vertex 8.819220 4.713954 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -9.238794 -3.826837 -10.000000 vertex -9.569403 -2.902850 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.897851 0.000000 0.440300 outer loop vertex -9.807853 -1.950906 -10.000000 vertex 0.000006 -1.950906 10.000000 vertex 0.000006 -0.980173 10.000000 endloop endfacet facet normal -0.887496 -0.131647 0.441611 outer loop vertex 0.000006 -0.980173 10.000000 vertex -9.951847 -0.980173 -10.000000 vertex -9.807853 -1.950906 -10.000000 endloop endfacet facet normal 0.942809 -0.000000 0.333334 outer loop vertex 7.071083 7.071054 -10.000000 vertex 0.000006 7.071068 10.000000 vertex 0.000006 6.343933 10.000000 endloop endfacet facet normal 0.712319 0.645603 0.275315 outer loop vertex 0.000006 6.343933 10.000000 vertex 7.730116 6.343918 -10.000000 vertex 7.071083 7.071054 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 8.819220 4.713954 -10.000000 vertex 9.238800 3.826823 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -8.819211 -4.713970 -10.000000 vertex -9.238794 -3.826837 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.902061 0.000000 0.431609 outer loop vertex -9.569403 -2.902850 -10.000000 vertex 0.000006 -2.902850 10.000000 vertex 0.000006 -1.950906 10.000000 endloop endfacet facet normal -0.875971 -0.219420 0.429570 outer loop vertex 0.000006 -1.950906 10.000000 vertex -9.807853 -1.950906 -10.000000 vertex -9.569403 -2.902850 -10.000000 endloop endfacet facet normal 0.932754 -0.000000 0.360514 outer loop vertex 7.730116 6.343918 -10.000000 vertex 0.000006 6.343933 10.000000 vertex 0.000006 5.555703 10.000000 endloop endfacet facet normal 0.761855 0.565030 0.316730 outer loop vertex 0.000006 5.555703 10.000000 vertex 8.314706 5.555689 -10.000000 vertex 7.730116 6.343918 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.238800 3.826823 -10.000000 vertex 9.569407 2.902837 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -8.314694 -5.555706 -10.000000 vertex -8.819211 -4.713970 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.907821 0.000000 0.419359 outer loop vertex -9.238794 -3.826837 -10.000000 vertex 0.000006 -3.826837 10.000000 vertex 0.000006 -2.902850 10.000000 endloop endfacet facet normal -0.858453 -0.307160 0.410744 outer loop vertex 0.000006 -2.902850 10.000000 vertex -9.569403 -2.902850 -10.000000 vertex -9.238794 -3.826837 -10.000000 endloop endfacet facet normal 0.923382 -0.000000 0.383882 outer loop vertex 8.314706 5.555689 -10.000000 vertex 0.000006 5.555703 10.000000 vertex 0.000006 4.713968 10.000000 endloop endfacet facet normal 0.802264 0.480856 0.353766 outer loop vertex 0.000006 4.713968 10.000000 vertex 8.819220 4.713954 -10.000000 vertex 8.314706 5.555689 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.569407 2.902837 -10.000000 vertex 9.807855 1.950895 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -7.730102 -6.343936 -10.000000 vertex -8.314694 -5.555706 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.914991 0.000000 0.403475 outer loop vertex -8.819211 -4.713970 -10.000000 vertex 0.000006 -4.713970 10.000000 vertex 0.000006 -3.826837 10.000000 endloop endfacet facet normal -0.834178 -0.394537 0.385340 outer loop vertex 0.000006 -3.826837 10.000000 vertex -9.238794 -3.826837 -10.000000 vertex -8.819211 -4.713970 -10.000000 endloop endfacet facet normal 0.914991 -0.000000 0.403475 outer loop vertex 8.819220 4.713954 -10.000000 vertex 0.000006 4.713968 10.000000 vertex 0.000006 3.826834 10.000000 endloop endfacet facet normal 0.834179 0.394536 0.385340 outer loop vertex 0.000006 3.826834 10.000000 vertex 9.238800 3.826823 -10.000000 vertex 8.819220 4.713954 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.807855 1.950895 -10.000000 vertex 9.951848 0.980165 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -7.071064 -7.071071 -10.000000 vertex -7.730102 -6.343936 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.923382 0.000000 0.383882 outer loop vertex -8.314694 -5.555706 -10.000000 vertex 0.000006 -5.555706 10.000000 vertex 0.000006 -4.713970 10.000000 endloop endfacet facet normal -0.802263 -0.480857 0.353766 outer loop vertex 0.000006 -4.713970 10.000000 vertex -8.819211 -4.713970 -10.000000 vertex -8.314694 -5.555706 -10.000000 endloop endfacet facet normal 0.907821 -0.000000 0.419358 outer loop vertex 9.238800 3.826823 -10.000000 vertex 0.000006 3.826834 10.000000 vertex 0.000006 2.902846 10.000000 endloop endfacet facet normal 0.858453 0.307159 0.410744 outer loop vertex 0.000006 2.902846 10.000000 vertex 9.569407 2.902837 -10.000000 vertex 9.238800 3.826823 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.951848 0.980165 -10.000000 vertex 10.000000 -0.000005 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -6.343928 -7.730108 -10.000000 vertex -7.071064 -7.071071 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.932754 0.000000 0.360514 outer loop vertex -7.730102 -6.343936 -10.000000 vertex 0.000006 -6.343936 10.000000 vertex 0.000006 -5.555706 10.000000 endloop endfacet facet normal -0.761855 -0.565031 0.316730 outer loop vertex 0.000006 -5.555706 10.000000 vertex -8.314694 -5.555706 -10.000000 vertex -7.730102 -6.343936 -10.000000 endloop endfacet facet normal 0.902061 -0.000000 0.431609 outer loop vertex 9.569407 2.902837 -10.000000 vertex 0.000006 2.902846 10.000000 vertex 0.000006 1.950902 10.000000 endloop endfacet facet normal 0.875971 0.219418 0.429570 outer loop vertex 0.000006 1.950902 10.000000 vertex 9.807855 1.950895 -10.000000 vertex 9.569407 2.902837 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 10.000000 -0.000005 -10.000000 vertex 9.951847 -0.980174 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -5.555697 -8.314699 -10.000000 vertex -6.343928 -7.730108 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.942809 0.000000 0.333333 outer loop vertex -7.071064 -7.071071 -10.000000 vertex 0.000006 -7.071071 10.000000 vertex 0.000006 -6.343936 10.000000 endloop endfacet facet normal -0.712316 -0.645607 0.275314 outer loop vertex 0.000006 -6.343936 10.000000 vertex -7.730102 -6.343936 -10.000000 vertex -7.071064 -7.071071 -10.000000 endloop endfacet facet normal 0.897851 -0.000000 0.440299 outer loop vertex 9.807855 1.950895 -10.000000 vertex 0.000006 1.950902 10.000000 vertex 0.000006 0.980170 10.000000 endloop endfacet facet normal 0.887496 0.131647 0.441611 outer loop vertex 0.000006 0.980170 10.000000 vertex 9.951848 0.980165 -10.000000 vertex 9.807855 1.950895 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.951847 -0.980174 -10.000000 vertex 9.807853 -1.950904 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -4.713962 -8.819216 -10.000000 vertex -5.555697 -8.314699 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.953197 0.000000 0.302351 outer loop vertex -6.343928 -7.730108 -10.000000 vertex 0.000006 -7.730108 10.000000 vertex 0.000006 -7.071071 10.000000 endloop endfacet facet normal -0.653394 -0.720910 0.231010 outer loop vertex 0.000006 -7.071071 10.000000 vertex -7.071064 -7.071071 -10.000000 vertex -6.343928 -7.730108 -10.000000 endloop endfacet facet normal 0.895288 -0.000000 0.445488 outer loop vertex 9.951848 0.980165 -10.000000 vertex 0.000006 0.980170 10.000000 vertex 0.000006 -0.000002 10.000000 endloop endfacet facet normal 0.893565 0.043897 0.446782 outer loop vertex 0.000006 -0.000002 10.000000 vertex 10.000000 -0.000005 -10.000000 vertex 9.951848 0.980165 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.807853 -1.950904 -10.000000 vertex 9.569404 -2.902845 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -3.826828 -9.238798 -10.000000 vertex -4.713962 -8.819216 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.963516 0.000000 0.267650 outer loop vertex -5.555697 -8.314699 -10.000000 vertex 0.000006 -8.314699 10.000000 vertex 0.000006 -7.730108 10.000000 endloop endfacet facet normal -0.585341 -0.789242 0.185668 outer loop vertex 0.000006 -7.730108 10.000000 vertex -6.343928 -7.730108 -10.000000 vertex -5.555697 -8.314699 -10.000000 endloop endfacet facet normal 0.894427 -0.000000 0.447213 outer loop vertex 10.000000 -0.000005 -10.000000 vertex 0.000006 -0.000002 10.000000 vertex 0.000006 -0.980173 10.000000 endloop endfacet facet normal 0.894423 -0.043940 0.445058 outer loop vertex 0.000006 -0.980173 10.000000 vertex 9.951847 -0.980174 -10.000000 vertex 10.000000 -0.000005 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.569404 -2.902845 -10.000000 vertex 9.238797 -3.826831 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -2.902840 -9.569406 -10.000000 vertex -3.826828 -9.238798 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.973329 0.000000 0.229412 outer loop vertex -4.713962 -8.819216 -10.000000 vertex 0.000006 -8.819216 10.000000 vertex 0.000006 -8.314699 10.000000 endloop endfacet facet normal -0.508939 -0.849114 0.141376 outer loop vertex 0.000006 -8.314699 10.000000 vertex -5.555697 -8.314699 -10.000000 vertex -4.713962 -8.819216 -10.000000 endloop endfacet facet normal 0.895288 -0.000000 0.445488 outer loop vertex 9.951847 -0.980174 -10.000000 vertex 0.000006 -0.980173 10.000000 vertex 0.000006 -1.950906 10.000000 endloop endfacet facet normal 0.889992 -0.132018 0.436445 outer loop vertex 0.000006 -1.950906 10.000000 vertex 9.807853 -1.950904 -10.000000 vertex 9.951847 -0.980174 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 9.238797 -3.826831 -10.000000 vertex 8.819216 -4.713963 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -1.950896 -9.807855 -10.000000 vertex -2.902840 -9.569406 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.982182 0.000000 0.187932 outer loop vertex -3.826828 -9.238798 -10.000000 vertex 0.000006 -9.238798 10.000000 vertex 0.000006 -8.819216 10.000000 endloop endfacet facet normal -0.425400 -0.899434 0.100266 outer loop vertex 0.000006 -8.819216 10.000000 vertex -4.713962 -8.819216 -10.000000 vertex -3.826828 -9.238798 -10.000000 endloop endfacet facet normal 0.897851 -0.000000 0.440299 outer loop vertex 9.807853 -1.950904 -10.000000 vertex 0.000006 -1.950906 10.000000 vertex 0.000006 -2.902850 10.000000 endloop endfacet facet normal 0.879879 -0.220399 0.420996 outer loop vertex 0.000006 -2.902850 10.000000 vertex 9.569404 -2.902845 -10.000000 vertex 9.807853 -1.950904 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 8.819216 -4.713963 -10.000000 vertex 8.314700 -5.555696 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex -0.980164 -9.951848 -10.000000 vertex -1.950896 -9.807855 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.989630 0.000000 0.143637 outer loop vertex -2.902840 -9.569406 -10.000000 vertex 0.000006 -9.569406 10.000000 vertex 0.000006 -9.238798 10.000000 endloop endfacet facet normal -0.336191 -0.939594 0.064327 outer loop vertex 0.000006 -9.238798 10.000000 vertex -3.826828 -9.238798 -10.000000 vertex -2.902840 -9.569406 -10.000000 endloop endfacet facet normal 0.902061 -0.000000 0.431609 outer loop vertex 9.569404 -2.902845 -10.000000 vertex 0.000006 -2.902850 10.000000 vertex 0.000006 -3.826837 10.000000 endloop endfacet facet normal 0.863414 -0.308933 0.398845 outer loop vertex 0.000006 -3.826837 10.000000 vertex 9.238797 -3.826831 -10.000000 vertex 9.569404 -2.902845 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 8.314700 -5.555696 -10.000000 vertex 7.730110 -6.343925 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 -0.000000 -1.000000 outer loop vertex 0.000008 -10.000000 -10.000000 vertex -0.980164 -9.951848 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.995276 0.000000 0.097084 outer loop vertex -1.950896 -9.807855 -10.000000 vertex 0.000006 -9.807855 10.000000 vertex 0.000006 -9.569406 10.000000 endloop endfacet facet normal -0.242829 -0.969429 0.035245 outer loop vertex 0.000006 -9.569406 10.000000 vertex -2.902840 -9.569406 -10.000000 vertex -1.950896 -9.807855 -10.000000 endloop endfacet facet normal 0.907821 -0.000000 0.419358 outer loop vertex 9.238797 -3.826831 -10.000000 vertex 0.000006 -3.826837 10.000000 vertex 0.000006 -4.713970 10.000000 endloop endfacet facet normal 0.839731 -0.397163 0.370288 outer loop vertex 0.000006 -4.713970 10.000000 vertex 8.819216 -4.713963 -10.000000 vertex 9.238797 -3.826831 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 7.730110 -6.343925 -10.000000 vertex 7.071076 -7.071060 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 0.980180 -9.951847 -10.000000 vertex 0.000008 -10.000000 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -0.998801 0.000000 0.048950 outer loop vertex -0.980164 -9.951848 -10.000000 vertex 0.000006 -9.951848 10.000000 vertex 0.000006 -9.807855 10.000000 endloop endfacet facet normal -0.146714 -0.989075 0.014311 outer loop vertex 0.000006 -9.807855 10.000000 vertex -1.950896 -9.807855 -10.000000 vertex -0.980164 -9.951848 -10.000000 endloop endfacet facet normal 0.914991 -0.000000 0.403475 outer loop vertex 8.819216 -4.713963 -10.000000 vertex 0.000006 -4.713970 10.000000 vertex 0.000006 -5.555706 10.000000 endloop endfacet facet normal 0.807901 -0.484237 0.335872 outer loop vertex 0.000006 -5.555706 10.000000 vertex 8.314700 -5.555696 -10.000000 vertex 8.819216 -4.713963 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 7.071076 -7.071060 -10.000000 vertex 6.343941 -7.730098 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 1.950912 -9.807852 -10.000000 vertex 0.980180 -9.951847 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal -1.000000 -0.000000 -0.000000 outer loop vertex 0.000008 -10.000000 -10.000000 vertex 0.000006 -10.000000 10.000000 vertex 0.000006 -9.951848 10.000000 endloop endfacet facet normal -0.049067 -0.998793 0.002405 outer loop vertex 0.000006 -9.951848 10.000000 vertex -0.980164 -9.951848 -10.000000 vertex 0.000008 -10.000000 -10.000000 endloop endfacet facet normal 0.923382 -0.000000 0.383882 outer loop vertex 8.314700 -5.555696 -10.000000 vertex 0.000006 -5.555706 10.000000 vertex 0.000006 -6.343936 10.000000 endloop endfacet facet normal 0.767094 -0.568915 0.296485 outer loop vertex 0.000006 -6.343936 10.000000 vertex 7.730110 -6.343925 -10.000000 vertex 8.314700 -5.555696 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 6.343941 -7.730098 -10.000000 vertex 5.555711 -8.314691 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 2.902856 -9.569401 -10.000000 vertex 1.950912 -9.807852 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.998801 -0.000000 0.048950 outer loop vertex 0.980180 -9.951847 -10.000000 vertex 0.000006 -9.951848 10.000000 vertex 0.000006 -10.000000 10.000000 endloop endfacet facet normal 0.049068 -0.998795 0.000000 outer loop vertex 0.000006 -10.000000 10.000000 vertex 0.000008 -10.000000 -10.000000 vertex 0.980180 -9.951847 -10.000000 endloop endfacet facet normal 0.932754 -0.000000 0.360514 outer loop vertex 7.730110 -6.343925 -10.000000 vertex 0.000006 -6.343936 10.000000 vertex 0.000006 -7.071071 10.000000 endloop endfacet facet normal 0.716766 -0.649636 0.253415 outer loop vertex 0.000006 -7.071071 10.000000 vertex 7.071076 -7.071060 -10.000000 vertex 7.730110 -6.343925 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 5.555711 -8.314691 -10.000000 vertex 4.713976 -8.819208 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.826843 -9.238791 -10.000000 vertex 2.902856 -9.569401 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.995276 -0.000000 0.097085 outer loop vertex 1.950912 -9.807852 -10.000000 vertex 0.000006 -9.807855 10.000000 vertex 0.000006 -9.951848 10.000000 endloop endfacet facet normal 0.146727 -0.989151 0.007191 outer loop vertex 0.000006 -9.951848 10.000000 vertex 0.980180 -9.951847 -10.000000 vertex 1.950912 -9.807852 -10.000000 endloop endfacet facet normal 0.942809 -0.000000 0.333333 outer loop vertex 7.071076 -7.071060 -10.000000 vertex 0.000006 -7.071071 10.000000 vertex 0.000006 -7.730108 10.000000 endloop endfacet facet normal 0.656823 -0.724691 0.208342 outer loop vertex 0.000006 -7.730108 10.000000 vertex 6.343941 -7.730098 -10.000000 vertex 7.071076 -7.071060 -10.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 4.713976 -8.819208 -10.000000 vertex 3.826843 -9.238791 -10.000000 vertex 0.000006 -0.000002 -10.000000 endloop endfacet facet normal 0.989630 -0.000000 0.143637 outer loop vertex 2.902856 -9.569401 -10.000000 vertex 0.000006 -9.569406 10.000000 vertex 0.000006 -9.807855 10.000000 endloop endfacet facet normal 0.242913 -0.969759 0.023695 outer loop vertex 0.000006 -9.807855 10.000000 vertex 1.950912 -9.807852 -10.000000 vertex 2.902856 -9.569401 -10.000000 endloop endfacet facet normal 0.953197 -0.000000 0.302351 outer loop vertex 6.343941 -7.730098 -10.000000 vertex 0.000006 -7.730108 10.000000 vertex 0.000006 -8.314699 10.000000 endloop endfacet facet normal 0.587708 -0.792431 0.163256 outer loop vertex 0.000006 -8.314699 10.000000 vertex 5.555711 -8.314691 -10.000000 vertex 6.343941 -7.730098 -10.000000 endloop endfacet facet normal 0.982182 -0.000000 0.187933 outer loop vertex 3.826843 -9.238791 -10.000000 vertex 0.000006 -9.238798 10.000000 vertex 0.000006 -9.569406 10.000000 endloop endfacet facet normal 0.336489 -0.940420 0.048839 outer loop vertex 0.000006 -9.569406 10.000000 vertex 2.902856 -9.569401 -10.000000 vertex 3.826843 -9.238791 -10.000000 endloop endfacet facet normal 0.963516 -0.000000 0.267651 outer loop vertex 5.555711 -8.314691 -10.000000 vertex 0.000006 -8.314699 10.000000 vertex 0.000006 -8.819216 10.000000 endloop endfacet facet normal 0.510370 -0.851500 0.120293 outer loop vertex 0.000006 -8.819216 10.000000 vertex 4.713976 -8.819208 -10.000000 vertex 5.555711 -8.314691 -10.000000 endloop endfacet facet normal 0.973329 -0.000000 0.229412 outer loop vertex 4.713976 -8.819208 -10.000000 vertex 0.000006 -8.819216 10.000000 vertex 0.000006 -9.238798 10.000000 endloop endfacet facet normal 0.426132 -0.900979 0.081537 outer loop vertex 0.000006 -9.238798 10.000000 vertex 3.826843 -9.238791 -10.000000 vertex 4.713976 -8.819208 -10.000000 endloop endfacet endsolid Exported from Blender-2.72 (sub 0) openscad-2019.05/examples/Basics/rotate_extrude.scad0000644000076500000240000000343413402025764023022 0ustar kintelstaff00000000000000echo(version=version()); // rotate_extrude() rotates a 2D shape around the Z axis. // Note that the 2D shape must be either completely on the // positive or negative side of the X axis. color("red") rotate_extrude() translate([10, 0]) square(5); // rotate_extrude() uses the global $fn/$fa/$fs settings, but // it's possible to give a different value as parameter. color("cyan") translate([40, 0, 0]) rotate_extrude($fn = 80) text(" J"); // Using a shape that touches the X axis is allowed and produces // 3D objects that don't have a hole in the center. color("green") translate([0, 30, 0]) rotate_extrude($fn = 80) polygon( points=[[0,0],[8,4],[4,8],[4,12],[12,16],[0,20]] ); // By default rotate_extrude forms a full 360 degree circle, // but a partial rotation can be performed by using the angle parameter. // Positive angles create an arc starting from the X axis, going counter-clockwise. // Negative angles generate an arc in the clockwise direction. color("magenta") translate([40,40]){ rotate_extrude(angle=180) translate([12.5,0]) square(5); translate([7.5,0]) rotate_extrude(angle=180) translate([5,0]) square(5); translate([-7.5,0]) rotate_extrude(angle=-180) translate([5,0]) square(5); } // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Basics/text_on_cube.scad0000644000076500000240000000330713402025764022441 0ustar kintelstaff00000000000000// text_on_cube.scad - Example for text() usage in OpenSCAD echo(version=version()); font = "Liberation Sans"; //["Liberation Sans", "Liberation Sans:style=Bold", "Liberation Sans:style=Italic", "Liberation Mono", "Liberation Serif"] cube_size = 60; letter_size = 50; letter_height = 5; o = cube_size / 2 - letter_height / 2; module letter(l) { // Use linear_extrude() to make the letters 3D objects as they // are only 2D shapes when only using text() linear_extrude(height = letter_height) { text(l, size = letter_size, font = font, halign = "center", valign = "center", $fn = 16); } } difference() { union() { color("gray") cube(cube_size, center = true); translate([0, -o, 0]) rotate([90, 0, 0]) letter("C"); translate([o, 0, 0]) rotate([90, 0, 90]) letter("U"); translate([0, o, 0]) rotate([90, 0, 180]) letter("B"); translate([-o, 0, 0]) rotate([90, 0, -90]) letter("E"); } // Put some symbols on top and bottom using symbols from the // Unicode symbols table. // (see https://en.wikipedia.org/wiki/Miscellaneous_Symbols) // // Note that depending on the font used, not all the symbols // are actually available. translate([0, 0, o]) letter("\u263A"); translate([0, 0, -o - letter_height]) letter("\u263C"); } // Written in 2014 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/COPYING-CC0.txt0000644000076500000240000001561013402025764020137 0ustar kintelstaff00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. openscad-2019.05/examples/Functions/echo.scad0000644000076500000240000000327313402025764021447 0ustar kintelstaff00000000000000echo(version=version()); // Using echo() in expression context can help with debugging // recursive functions. See console window for output of the // examples below. // Simple example just outputting the function input parameters. function f1(x, y) = echo("f1: ", x, y) 0.5 * x * x + 4 * y + 1; r1 = f1(3, 5); // To output the result, there are multiple possibilities, the // easiest is to use let() to assign the result to a variable // (y here) which is used for both echo() output and result. function f2(x) = let(y = pow(x, 3)) echo("f2: ", y) y; r2 = f2(4); // Another option is using a helper function where the argument // is evaluated first and then passed to the result() helper // where it's printed using echo() and returned as result. function result(x) = echo("f3: ", x) x; function f3(x) = result(x * x - 5); r3 = f3(5); // A more complex example is a recursive function. Combining // the two different ways of printing values before and after // evaluation it's possible to output the input value x when // descending into the recursion and the result y collected // when returning. function f4(x) = echo("f4: ", x = x) let(y = x == 1 ? 1 : x * f4(x - 1)) echo("f4: ", y = y) y; r4 = f4(5); // Written in 2018 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Functions/functions.scad0000644000076500000240000000227513402025764022542 0ustar kintelstaff00000000000000echo(version=version()); // Functions can be defined to simplify code using lots of // calculations. // Simple example with a single function argument (which should // be a number) and returning a number calculated based on that. function f(x) = 0.5 * x + 1; color("red") for (a = [ -100 : 5 : 100 ]) translate([a, f(a), 0]) cube(2, center = true); // Functions can call other functions and return complex values // too. In this case a 3 element vector is returned which can // be used as point in 3D space or as vector (in the mathematical // meaning) for translations and other transformations. function g(x) = [ 5 * x + 20, f(x) * f(x) - 50, 0 ]; color("green") for (a = [ -200 : 10 : 200 ]) translate(g(a / 8)) sphere(1); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Functions/list_comprehensions.scad0000644000076500000240000000332413402025764024615 0ustar kintelstaff00000000000000// list_comprehensions.scad - Examples of list comprehension usage // Basic list comprehension: // Returns a 2D vertex per iteration of the for loop // Note: subsequent assignments inside the for loop is allowed module ngon(num, r) { polygon([for (i=[0:num-1], a=i*360/num) [ r*cos(a), r*sin(a) ]]); } ngon(3, 10); translate([20,0]) ngon(6, 8); translate([36,0]) ngon(10, 6); // More complex list comprehension: // Similar to ngon(), but uses an inner function to calculate // the vertices. the let() keyword allows assignment of temporary variables. module rounded_ngon(num, r, rounding = 0) { function v(a) = let (d = 360/num, v = floor((a+d/2)/d)*d) (r-rounding) * [cos(v), sin(v)]; polygon([for (a=[0:360-1]) v(a) + rounding*[cos(a),sin(a)]]); } translate([0,22]) rounded_ngon(3, 10, 5); translate([20,22]) rounded_ngon(6, 8, 4); translate([36,22]) rounded_ngon(10, 6, 3); // Gear/star generator // Uses a list comprehension taking a list of radii to generate a star shape module star(num, radii) { function r(a) = (floor(a / 10) % 2) ? 10 : 8; polygon([for (i=[0:num-1], a=i*360/num, r=radii[i%len(radii)]) [ r*cos(a), r*sin(a) ]]); } translate([0,44]) star(20, [6,10]); translate([20,44]) star(40, [6,8,8,6]); translate([36,44]) star(30, [3,4,5,6,5,4]); echo(version=version()); // Written by Marius Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Functions/polygon_areas.scad0000644000076500000240000000333313402025764023370 0ustar kintelstaff00000000000000// polygon_areas.scad: Another recursion example // Draw all geometry translate([0,20]) color("Red") text("Areas:", size=8, halign="center"); translate([-44,0]) shapeWithArea(3, 10); translate([-22,0]) shapeWithArea(4, 10); translate([0,0]) shapeWithArea(6, 10); translate([22,0]) shapeWithArea(10, 10); translate([44,0]) shapeWithArea(360, 10); // One shape with corresponding text module shapeWithArea(num, r) { polygon(ngon(num, r)); translate([0,-20]) color("Cyan") text(str(round(area(ngon(num, r)))), halign="center", size=8); } // Simple list comprehension for creating N-gon vertices function ngon(num, r) = [for (i=[0:num-1], a=i*360/num) [ r*cos(a), r*sin(a) ]]; // Area of a triangle with the 3rd vertex in the origin function triarea(v0, v1) = cross(v0, v1) / 2; // Area of a polygon using the Shoelace formula function area(vertices) = let (areas = [let (num=len(vertices)) for (i=[0:num-1]) triarea(vertices[i], vertices[(i+1)%num]) ]) sum(areas); // Recursive helper function: Sums all values in a list. // In this case, sum all partial areas into the final area. function sum(values,s=0) = s == len(values) - 1 ? values[s] : values[s] + sum(values,s+1); echo(version=version()); // Written in 2015 by Marius Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Functions/recursion.scad0000644000076500000240000000215313402025764022536 0ustar kintelstaff00000000000000// recursionscad: Basic recursion example // Recursive functions are very powerful for calculating values. // A good number of algorithms make use of recursive definitions, // e.g the caluclation of the factorial of a number. // The ternary operator " ? : " is the easiest way to define the // termination condition. // Note how the following simple implementation will never terminate // when called with a negative value. This will produce an error after // some time when OpenSCAD detects the endless recursive call. function factorial(n) = n == 0 ? 1 : factorial(n - 1) * n; color("cyan") text(str("6! = ", factorial(6)), halign = "center"); echo(version=version()); // Written in 2015 by Torsten Paul // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example001.scad0000644000076500000240000000164613402025764021155 0ustar kintelstaff00000000000000module example001() { function r_from_dia(d) = d / 2; module rotcy(rot, r, h) { rotate(90, rot) cylinder(r = r, h = h, center = true); } difference() { sphere(r = r_from_dia(size)); rotcy([0, 0, 0], cy_r, cy_h); rotcy([1, 0, 0], cy_r, cy_h); rotcy([0, 1, 0], cy_r, cy_h); } size = 50; hole = 25; cy_r = r_from_dia(hole); cy_h = r_from_dia(size * 2.5); } echo(version=version()); example001(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example002.scad0000644000076500000240000000172613402025764021155 0ustar kintelstaff00000000000000 module example002() { intersection() { difference() { union() { cube([30, 30, 30], center = true); translate([0, 0, -25]) cube([15, 15, 50], center = true); } union() { cube([50, 10, 10], center = true); cube([10, 50, 10], center = true); cube([10, 10, 50], center = true); } } translate([0, 0, 5]) cylinder(h = 50, r1 = 20, r2 = 5, center = true); } } echo(version=version()); example002(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example003.scad0000644000076500000240000000161113402025764021147 0ustar kintelstaff00000000000000 module example003() { difference() { union() { cube([30, 30, 30], center = true); cube([40, 15, 15], center = true); cube([15, 40, 15], center = true); cube([15, 15, 40], center = true); } union() { cube([50, 10, 10], center = true); cube([10, 50, 10], center = true); cube([10, 10, 50], center = true); } } } echo(version=version()); example003(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example004.scad0000644000076500000240000000115713402025764021155 0ustar kintelstaff00000000000000 module example004() { difference() { cube(30, center = true); sphere(20); } } echo(version=version()); example004(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example005.scad0000644000076500000240000000174513402025764021161 0ustar kintelstaff00000000000000 module example005() { translate([0, 0, -120]) { difference() { cylinder(h = 50, r = 100); translate([0, 0, 10]) cylinder(h = 50, r = 80); translate([100, 0, 35]) cube(50, center = true); } for (i = [0:5]) { echo(360*i/6, sin(360*i/6)*80, cos(360*i/6)*80); translate([sin(360*i/6)*80, cos(360*i/6)*80, 0 ]) cylinder(h = 200, r=10); } translate([0, 0, 200]) cylinder(h = 80, r1 = 120, r2 = 0); } } echo(version=version()); example005(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example006.scad0000644000076500000240000000337513432700636021164 0ustar kintelstaff00000000000000module rounded_cube(size,r,center=false) { s = is_list(size) ? size : [size,size,size]; translate(center ? -s/2 : [0,0,0]) hull() { translate([ r, r, r]) sphere(r=r); translate([ r, r,s.z-r]) sphere(r=r); translate([ r,s.y-r, r]) sphere(r=r); translate([ r,s.y-r,s.z-r]) sphere(r=r); translate([s.x-r, r, r]) sphere(r=r); translate([s.x-r, r,s.z-r]) sphere(r=r); translate([s.x-r,s.y-r, r]) sphere(r=r); translate([s.x-r,s.y-r,s.z-r]) sphere(r=r); } } module example006() { difference() { rounded_cube(100, 10, center=true); union() { for (i = [ [ 0, 0, [ [0, 0] ] ], [ 90, 0, [ [-20, -20], [+20, +20] ] ], [ 180, 0, [ [-20, -25], [-20, 0], [-20, +25], [+20, -25], [+20, 0], [+20, +25] ] ], [ 270, 0, [ [0, 0], [-25, -25], [+25, -25], [-25, +25], [+25, +25] ] ], [ 0, 90, [ [-25, -25], [0, 0], [+25, +25] ] ], [ 0, -90, [ [-25, -25], [+25, -25], [-25, +25], [+25, +25] ] ] ]) { rotate(i[0], [0, 0, 1]) rotate(i[1], [1, 0, 0]) translate([0, -50, 0]) for (j = i[2]) { translate([j[0], 0, j[1]]) sphere(10); } } } } } echo(version=version()); example006(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example007.dxf0000644000076500000240000003347113402025764021033 0ustar kintelstaff00000000000000999 dxflib 2.0.4.8 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $DIMGAP 40 0.625 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $DIMSTYLE 2 Standard 9 $PLIMMIN 10 0.0 20 0.0 9 $PLIMMAX 10 210.0 20 297.0 9 $DIMEXE 40 1.25 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 4 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 43 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 cutout1 70 0 62 6 6 CONTINUOUS 370 0 390 F 0 LAYER 5 44 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 cutout2 70 0 62 5 6 CONTINUOUS 370 0 390 F 0 LAYER 5 45 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 dorn 70 0 62 3 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 cutout1 62 256 370 -1 6 ByLayer 10 2.0 20 31.0 30 0.0 11 -2.0 21 31.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 cutout1 62 256 370 -1 6 ByLayer 10 -2.0 20 31.0 30 0.0 11 -2.0 21 3.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 cutout1 62 256 370 -1 6 ByLayer 10 -2.0 20 3.0 30 0.0 11 2.0 21 3.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 cutout1 62 256 370 -1 6 ByLayer 10 2.0 20 3.0 30 0.0 11 2.0 21 31.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 11.0 20 31.0 30 0.0 11 11.0 21 15.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 -11.0 20 31.0 30 0.0 11 11.0 21 31.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 11.0 20 15.0 30 0.0 11 6.0 21 12.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 6.0 20 12.0 30 0.0 11 6.0 21 3.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 6.0 20 3.0 30 0.0 11 -6.0 21 3.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 -6.0 20 3.0 30 0.0 11 -6.0 21 12.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 -6.0 20 12.0 30 0.0 11 -11.0 21 15.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 cutout2 62 256 370 -1 6 ByLayer 10 -11.0 20 31.0 30 0.0 11 -11.0 21 15.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 0.0 20 30.0 30 0.0 11 8.0 21 15.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 8.0 20 15.0 30 0.0 11 5.0 21 12.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 5.0 20 12.0 30 0.0 11 5.0 21 2.0 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 5.0 20 2.0 30 0.0 11 7.0 21 2.0 31 0.0 0 LINE 5 56 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 7.0 20 2.0 30 0.0 11 7.0 21 11.0 31 0.0 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 7.0 20 11.0 30 0.0 11 11.0 21 11.0 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 11.0 20 11.0 30 0.0 11 11.0 21 0.0 31 0.0 0 LINE 5 59 100 AcDbEntity 100 AcDbLine 8 dorn 62 256 370 -1 6 ByLayer 10 11.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 5A 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 5A 100 AcDbDictionary 281 1 3 DIMASSOC 350 5C 3 HIDETEXT 350 5B 0 DICTIONARYVAR 5 5B 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 5C 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/examples/Old/example007.scad0000644000076500000240000000325113402025764021155 0ustar kintelstaff00000000000000 module cutout() { intersection() { rotate(90, [1, 0, 0]) translate([0, 0, -50]) linear_extrude(height = 100, convexity = 1) import(file = "example007.dxf", layer = "cutout1"); rotate(90, [0, 0, 1]) rotate(90, [1, 0, 0]) translate([0, 0, -50]) linear_extrude(height = 100, convexity = 2) import(file = "example007.dxf", layer = "cutout2"); } } module clip() { difference() { rotate_extrude(convexity = 3, $fn = 0, $fa = 12, $fs = 2) { import(file = "example007.dxf", layer = "dorn"); } for (r = [0, 90]) rotate(r, [0, 0, 1]) cutout(); } } module cutview() { difference() { difference() { translate([0, 0, -10]) clip(); rotate(20, [0, 0, 1]) rotate(-20, [0, 1, 0]) translate([18, 0, 0]) cube(30, center = true); } # render(convexity = 5) intersection() { translate([0, 0, -10]) clip(); rotate(20, [0, 0, 1]) rotate(-20, [0, 1, 0]) translate([18, 0, 0]) cube(30, center = true); } } } echo(version=version()); translate([0, 0, -10]) clip(); // cutview(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example008.dxf0000644000076500000240000004305413402025764021032 0ustar kintelstaff00000000000000999 dxflib 2.0.4.8 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $DIMGAP 40 0.625 9 $DIMEXO 40 0.625 9 $INSUNITS 70 4 9 $DIMTXT 40 2.5 9 $PLIMMAX 10 210.0 20 297.0 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 5 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 43 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 G 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 44 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 E 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 45 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 B 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 46 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 X 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 20.0 20 30.0 30 0.0 11 20.0 21 20.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 20.0 20 20.0 30 0.0 11 40.0 21 20.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 40.0 20 20.0 30 0.0 11 40.0 21 10.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 40.0 20 10.0 30 0.0 11 10.0 21 10.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 10.0 20 10.0 30 0.0 11 10.0 21 40.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 10.0 20 40.0 30 0.0 11 50.0 21 40.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 50.0 20 40.0 30 0.0 11 50.0 21 50.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 50.0 21 100.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 50.0 20 100.0 30 0.0 11 50.0 21 110.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 50.0 20 110.0 30 0.0 11 10.0 21 110.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 10.0 20 110.0 30 0.0 11 10.0 21 120.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 10.0 20 120.0 30 0.0 11 30.0 21 120.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 30.0 20 120.0 30 0.0 11 30.0 21 130.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 30.0 20 130.0 30 0.0 11 10.0 21 130.0 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 10.0 20 130.0 30 0.0 11 10.0 21 140.0 31 0.0 0 LINE 5 56 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 10.0 20 140.0 30 0.0 11 50.0 21 140.0 31 0.0 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 50.0 20 140.0 30 0.0 11 50.0 21 150.0 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 50.0 20 150.0 30 0.0 11 0.0 21 150.0 31 0.0 0 LINE 5 59 100 AcDbEntity 100 AcDbLine 8 E 62 256 370 -1 6 ByLayer 10 0.0 20 150.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 5A 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 100.0 21 150.0 31 0.0 0 LINE 5 5B 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 110.0 20 140.0 30 0.0 11 140.0 21 140.0 31 0.0 0 LINE 5 5C 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 140.0 20 140.0 30 0.0 11 140.0 21 130.0 31 0.0 0 LINE 5 5D 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 140.0 20 130.0 30 0.0 11 110.0 21 130.0 31 0.0 0 LINE 5 5E 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 110.0 20 130.0 30 0.0 11 110.0 21 140.0 31 0.0 0 LINE 5 5F 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 110.0 20 120.0 30 0.0 11 110.0 21 110.0 31 0.0 0 LINE 5 60 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 110.0 20 110.0 30 0.0 11 140.0 21 110.0 31 0.0 0 LINE 5 61 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 140.0 20 110.0 30 0.0 11 140.0 21 120.0 31 0.0 0 LINE 5 62 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 140.0 20 120.0 30 0.0 11 110.0 21 120.0 31 0.0 0 LINE 5 63 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 150.0 20 145.0 30 0.0 11 145.0 21 150.0 31 0.0 0 LINE 5 64 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 150.0 20 105.0 30 0.0 11 145.0 21 100.0 31 0.0 0 LINE 5 65 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 150.0 20 120.0 30 0.0 11 150.0 21 105.0 31 0.0 0 LINE 5 66 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 145.0 20 100.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 67 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 100.0 20 150.0 30 0.0 11 145.0 21 150.0 31 0.0 0 LINE 5 68 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 150.0 20 145.0 30 0.0 11 150.0 21 130.0 31 0.0 0 LINE 5 69 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 45.0 20 30.0 30 0.0 11 20.0 21 30.0 31 0.0 0 LINE 5 6A 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 50.0 20 5.0 30 0.0 11 50.0 21 25.0 31 0.0 0 LINE 5 6B 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 5.0 20 0.0 30 0.0 11 45.0 21 0.0 31 0.0 0 LINE 5 6C 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 0.0 20 45.0 30 0.0 11 0.0 21 5.0 31 0.0 0 LINE 5 6D 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 5.0 21 50.0 31 0.0 0 LINE 5 6E 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 5.0 20 50.0 30 0.0 11 0.0 21 45.0 31 0.0 0 LINE 5 6F 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 0.0 20 5.0 30 0.0 11 5.0 21 0.0 31 0.0 0 LINE 5 70 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 45.0 20 0.0 30 0.0 11 50.0 21 5.0 31 0.0 0 LINE 5 71 100 AcDbEntity 100 AcDbLine 8 G 62 256 370 -1 6 ByLayer 10 50.0 20 25.0 30 0.0 11 45.0 21 30.0 31 0.0 0 LINE 5 72 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 150.0 20 130.0 30 0.0 11 145.0 21 125.0 31 0.0 0 LINE 5 73 100 AcDbEntity 100 AcDbLine 8 B 62 256 370 -1 6 ByLayer 10 145.0 20 125.0 30 0.0 11 150.0 21 120.0 31 0.0 0 LINE 5 74 100 AcDbEntity 100 AcDbLine 8 X 62 256 370 -1 6 ByLayer 10 115.0 20 35.0 30 0.0 11 115.0 21 15.0 31 0.0 0 LINE 5 75 100 AcDbEntity 100 AcDbLine 8 X 62 256 370 -1 6 ByLayer 10 115.0 20 15.0 30 0.0 11 135.0 21 15.0 31 0.0 0 LINE 5 76 100 AcDbEntity 100 AcDbLine 8 X 62 256 370 -1 6 ByLayer 10 135.0 20 15.0 30 0.0 11 135.0 21 35.0 31 0.0 0 LINE 5 77 100 AcDbEntity 100 AcDbLine 8 X 62 256 370 -1 6 ByLayer 10 135.0 20 35.0 30 0.0 11 115.0 21 35.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 78 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 78 100 AcDbDictionary 281 1 3 DIMASSOC 350 7A 3 HIDETEXT 350 79 0 DICTIONARYVAR 5 79 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 7A 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/examples/Old/example008.scad0000644000076500000240000000253013402025764021155 0ustar kintelstaff00000000000000echo(version=version()); difference() { intersection() { translate([ -25, -25, -25]) linear_extrude(height = 50, convexity = 3) import(file = "example008.dxf", layer = "G"); rotate(90, [1, 0, 0]) translate([ -25, -125, -25]) linear_extrude(height = 50, convexity = 3) import(file = "example008.dxf", layer = "E"); rotate(90, [0, 1, 0]) translate([ -125, -125, -25]) linear_extrude(height = 50, convexity = 3) import(file = "example008.dxf", layer = "B"); } intersection() { translate([ -125, -25, -26]) linear_extrude(height = 52, convexity = 1) import(file = "example008.dxf", layer = "X"); rotate(90, [0, 1, 0]) translate([ -125, -25, -26]) linear_extrude(height = 52, convexity = 1) import(file = "example008.dxf", layer = "X"); } } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example009.dxf0000644000076500000240000005467413402025764021045 0ustar kintelstaff00000000000000999 dxflib 2.0.4.8 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $DIMGAP 40 0.625 9 $DIMEXO 40 0.625 9 $INSUNITS 70 4 9 $DIMTXT 40 2.5 9 $DIMSTYLE 2 Standard 9 $PLIMMAX 10 210.0 20 297.0 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 7 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 43 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 plate 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 LAYER 5 44 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 body 70 0 62 3 6 CONTINUOUS 370 0 390 F 0 LAYER 5 45 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 fan_top 70 0 62 1 6 CONTINUOUS 370 0 390 F 0 LAYER 5 46 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 fan_side 70 0 62 1 6 CONTINUOUS 370 0 390 F 0 LAYER 5 47 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 fan_side_center 70 0 62 2 6 CONTINUOUS 370 0 390 F 0 LAYER 5 48 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 dim 70 0 62 2 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 -20.0 20 20.0 30 0.0 11 20.0 21 20.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 -20.0 20 -20.0 30 0.0 11 -20.0 21 20.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 20.0 20 20.0 30 0.0 11 20.0 21 -20.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 20.0 20 -20.0 30 0.0 11 -20.0 21 -20.0 31 0.0 0 CIRCLE 5 4D 100 AcDbEntity 100 AcDbCircle 8 body 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 18.0 0 CIRCLE 5 4E 100 AcDbEntity 100 AcDbCircle 8 plate 62 256 370 -1 6 ByLayer 10 -16.0 20 16.0 30 0.0 40 3.0 0 CIRCLE 5 4F 100 AcDbEntity 100 AcDbCircle 8 plate 62 256 370 -1 6 ByLayer 10 16.0 20 16.0 30 0.0 40 3.0 0 CIRCLE 5 50 100 AcDbEntity 100 AcDbCircle 8 plate 62 256 370 -1 6 ByLayer 10 16.0 20 -16.0 30 0.0 40 3.0 0 CIRCLE 5 51 100 AcDbEntity 100 AcDbCircle 8 plate 62 256 370 -1 6 ByLayer 10 -16.0 20 -16.0 30 0.0 40 3.0 0 CIRCLE 5 52 100 AcDbEntity 100 AcDbCircle 8 body 62 256 370 -1 6 ByLayer 10 -16.0 20 16.0 30 0.0 40 3.0 0 CIRCLE 5 53 100 AcDbEntity 100 AcDbCircle 8 body 62 256 370 -1 6 ByLayer 10 16.0 20 16.0 30 0.0 40 3.0 0 CIRCLE 5 54 100 AcDbEntity 100 AcDbCircle 8 body 62 256 370 -1 6 ByLayer 10 16.0 20 -16.0 30 0.0 40 3.0 0 CIRCLE 5 55 100 AcDbEntity 100 AcDbCircle 8 body 62 256 370 -1 6 ByLayer 10 -16.0 20 -16.0 30 0.0 40 3.0 0 ARC 5 56 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 16.0 20 16.0 30 0.0 40 4.0 100 AcDbArc 50 270.0 51 180.0 0 ARC 5 57 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 20.0 100 AcDbArc 50 53.1301023541559729 51 126.8698976458440342 0 ARC 5 58 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 -16.0 20 16.0 30 0.0 40 4.0 100 AcDbArc 50 360.0 51 270.0 0 ARC 5 59 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 20.0 100 AcDbArc 50 323.1301023541560085 51 36.8698976458440058 0 ARC 5 5A 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 16.0 20 -16.0 30 0.0 40 4.0 100 AcDbArc 50 180.0 51 90.0000000000000568 0 ARC 5 5B 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 20.0 100 AcDbArc 50 233.13010235415598 51 306.8698976458439915 0 ARC 5 5C 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 20.0 100 AcDbArc 50 143.1301023541560085 51 216.8698976458439915 0 ARC 5 5D 100 AcDbEntity 8 body 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 -16.0 20 -16.0 30 0.0 40 4.0 100 AcDbArc 50 90.0 51 0.0 0 LINE 5 5E 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 1.0000000000000002 20 4.8989794855663567 30 0.0 11 1.0000000000000011 21 17.9722007556114285 31 0.0 0 ARC 5 5F 100 AcDbEntity 8 plate 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 5.0 100 AcDbArc 50 341.5369590328155027 51 78.4630409671845115 0 ARC 5 60 100 AcDbEntity 8 plate 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 18.0 100 AcDbArc 50 333.1847385367203742 51 86.8152614632795974 0 LINE 5 61 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 4.7426406871192839 20 -1.5834643389987413 30 0.0 11 16.064382416273375 21 -8.1200749740212839 31 0.0 0 LINE 5 62 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 -0.9999999999999997 20 4.8989794855663558 30 0.0 11 -0.9999999999999989 21 17.9722007556114249 31 0.0 0 ARC 5 63 100 AcDbEntity 8 plate 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 5.0 100 AcDbArc 50 101.5369590328154885 51 198.4630409671844973 0 ARC 5 64 100 AcDbEntity 8 plate 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 18.0 100 AcDbArc 50 93.1847385367204026 51 206.8152614632795689 0 LINE 5 65 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 -4.7426406871192857 20 -1.583464338998738 30 0.0 11 -16.0643824162733821 21 -8.1200749740212697 31 0.0 0 ARC 5 66 100 AcDbEntity 8 plate 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 5.0 100 AcDbArc 50 221.5369590328154459 51 318.4630409671844973 0 LINE 5 67 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 3.742640687119283 20 -3.3155151465676189 30 0.0 11 15.064382416273375 21 -9.8521257815901606 31 0.0 0 ARC 5 68 100 AcDbEntity 8 plate 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 18.0 100 AcDbArc 50 213.1847385367203742 51 326.8152614632795121 0 LINE 5 69 100 AcDbEntity 100 AcDbLine 8 plate 62 256 370 -1 6 ByLayer 10 -3.7426406871192861 20 -3.3155151465676154 30 0.0 11 -15.0643824162733804 21 -9.8521257815901464 31 0.0 0 CIRCLE 5 6A 100 AcDbEntity 100 AcDbCircle 8 plate 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 2.0 0 ARC 5 6B 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 17.1172427686236901 100 AcDbArc 50 83.290163192243071 51 96.7098368077569432 0 LINE 5 6C 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 2.0 20 17.0 30 0.0 11 2.0 21 6.0827625302982185 31 0.0 0 ARC 5 6D 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 6.4031242374328485 100 AcDbArc 50 18.2007602645333293 51 71.7992397354666707 0 LINE 5 6E 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 6.0827625302982193 20 2.0 30 0.0 11 17.0 21 2.0 31 0.0 0 ARC 5 6F 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 17.1172427686236901 100 AcDbArc 50 353.2901631922430852 51 6.7098368077569503 0 LINE 5 70 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 6.0827625302982193 20 -2.0 30 0.0 11 17.0 21 -2.0 31 0.0 0 ARC 5 71 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 6.4031242374328485 100 AcDbArc 50 288.2007602645333577 51 341.7992397354666423 0 ARC 5 72 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 6.4031242374328485 100 AcDbArc 50 198.2007602645333009 51 251.7992397354666707 0 LINE 5 73 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 2.0 20 -6.0827625302982193 30 0.0 11 2.0 21 -17.0 31 0.0 0 LINE 5 74 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 -2.0 20 -6.0827625302982193 30 0.0 11 -2.0 21 -17.0 31 0.0 0 ARC 5 75 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 17.1172427686236901 100 AcDbArc 50 263.2901631922430852 51 276.7098368077569148 0 LINE 5 76 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 -2.0 20 6.0827625302982193 30 0.0 11 -2.0 21 17.0 31 0.0 0 ARC 5 77 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 6.4031242374328485 100 AcDbArc 50 108.2007602645333293 51 161.7992397354666991 0 LINE 5 78 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 -6.0827625302982193 20 -2.0 30 0.0 11 -17.0 21 -2.0 31 0.0 0 LINE 5 79 100 AcDbEntity 100 AcDbLine 8 fan_top 62 256 370 -1 6 ByLayer 10 -6.0827625302982193 20 2.0 30 0.0 11 -17.0 21 2.0 31 0.0 0 ARC 5 7A 100 AcDbEntity 8 fan_top 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 17.1172427686236901 100 AcDbArc 50 173.2901631922430568 51 186.7098368077569432 0 LINE 5 7B 100 AcDbEntity 100 AcDbLine 8 fan_side 62 256 370 -1 6 ByLayer 10 0.0 20 -30.0 30 0.0 11 6.0 21 -30.0 31 0.0 0 LINE 5 7C 100 AcDbEntity 100 AcDbLine 8 fan_side 62 256 370 -1 6 ByLayer 10 6.0 20 -30.0 30 0.0 11 6.0 21 -35.0 31 0.0 0 LINE 5 7D 100 AcDbEntity 100 AcDbLine 8 fan_side 62 256 370 -1 6 ByLayer 10 0.0 20 -50.0 30 0.0 11 6.0 21 -50.0 31 0.0 0 LINE 5 7E 100 AcDbEntity 100 AcDbLine 8 fan_side 62 256 370 -1 6 ByLayer 10 6.0 20 -50.0 30 0.0 11 6.0 21 -45.0 31 0.0 0 CIRCLE 5 7F 100 AcDbEntity 100 AcDbCircle 8 fan_side_center 62 256 370 -1 6 ByLayer 10 0.0 20 -40.0 30 0.0 40 3.0 0 LINE 5 80 100 AcDbEntity 100 AcDbLine 8 fan_side_center 62 256 370 -1 6 ByLayer 10 -3.0 20 -37.0 30 0.0 11 3.0 21 -43.0 31 0.0 0 LINE 5 81 100 AcDbEntity 100 AcDbLine 8 fan_side_center 62 256 370 -1 6 ByLayer 10 -3.0 20 -43.0 30 0.0 11 3.0 21 -37.0 31 0.0 0 DIMENSION 5 82 100 AcDbEntity 8 dim 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -10.0 20 -51.0 30 0.0 11 -11.875 21 -40.0 31 0.0 70 0 71 5 72 1 41 1.0 42 0.0 1 bodywidth 3 Standard 100 AcDbAlignedDimension 13 0.0 23 -29.0 33 0.0 14 0.0 24 -51.0 34 0.0 50 90.0 100 AcDbRotatedDimension 0 DIMENSION 5 83 100 AcDbEntity 8 dim 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -15.0 20 -27.0 30 0.0 11 -17.0 21 -48.0 31 0.0 70 0 71 5 72 1 41 1.0 42 0.0 1 platewidth 3 Standard 100 AcDbAlignedDimension 13 0.0 23 -29.0 33 0.0 14 0.0 24 -27.0 34 0.0 50 90.0 100 AcDbRotatedDimension 0 CIRCLE 5 84 100 AcDbEntity 100 AcDbCircle 8 fan_top 62 256 370 -1 6 ByLayer 10 0.0000000000000005 20 0.0 30 0.0 40 1.5 0 LINE 5 85 100 AcDbEntity 100 AcDbLine 8 dim 62 256 370 -1 6 ByLayer 10 6.0 20 -4.0 30 0.0 11 6.0 21 -29.0 31 0.0 0 ARC 5 86 100 AcDbEntity 8 fan_side 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 13.0238095238095237 20 -37.4333333333333371 30 0.0 40 7.4333714650801985 100 AcDbArc 50 339.8005183485309999 51 160.8918335353623945 0 ARC 5 87 100 AcDbEntity 8 fan_side 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 13.0238095238095237 20 -42.5666666666666629 30 0.0 40 7.4333714650801985 100 AcDbArc 50 199.1081664646376055 51 20.1994816514690321 0 LINE 5 88 100 AcDbEntity 100 AcDbLine 8 dim 62 256 370 -1 6 ByLayer 10 17.0 20 -3.0 30 0.0 11 17.0 21 -30.0 31 0.0 0 DIMENSION 5 89 100 AcDbEntity 8 dim 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -5.0 20 -50.0 30 0.0 11 -6.875 21 -40.0 31 0.0 70 0 71 5 72 1 41 1.0 42 0.0 1 fanwidth 3 Standard 100 AcDbAlignedDimension 13 0.0 23 -30.0 33 0.0 14 0.0 24 -50.0 34 0.0 50 90.0 100 AcDbRotatedDimension 0 DIMENSION 5 8A 100 AcDbEntity 8 dim 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 18.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 70 2 71 5 72 1 41 1.0 42 0.0 1 fanrot 3 Standard 100 AcDb2LineAngularDimension 13 2.6843774609657962 23 4.2183074386605375 33 0.0 14 9.6637588594768662 24 15.1859067791779339 34 0.0 15 5.0 25 0.0 35 0.0 16 26.0 26 15.0 36 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 8B 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 8B 100 AcDbDictionary 281 1 3 DIMASSOC 350 8D 3 HIDETEXT 350 8C 0 DICTIONARYVAR 5 8C 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 8D 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/examples/Old/example009.scad0000644000076500000240000000271413402025764021162 0ustar kintelstaff00000000000000echo(version=version()); bodywidth = dxf_dim(file = "example009.dxf", name = "bodywidth"); fanwidth = dxf_dim(file = "example009.dxf", name = "fanwidth"); platewidth = dxf_dim(file = "example009.dxf", name = "platewidth"); fan_side_center = dxf_cross(file = "example009.dxf", layer = "fan_side_center"); fanrot = dxf_dim(file = "example009.dxf", name = "fanrot"); % linear_extrude(height = bodywidth, center = true, convexity = 10) import(file = "example009.dxf", layer = "body"); % for (z = [+(bodywidth/2 + platewidth/2), -(bodywidth/2 + platewidth/2)]) { translate([0, 0, z]) linear_extrude(height = platewidth, center = true, convexity = 10) import(file = "example009.dxf", layer = "plate"); } intersection() { linear_extrude(height = fanwidth, center = true, convexity = 10, twist = -fanrot) import(file = "example009.dxf", layer = "fan_top"); rotate_extrude(convexity = 10) import(file = "example009.dxf", layer = "fan_side", origin = [0, -40]); } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example010.dat0000644000076500000240000011523013402025764021006 0ustar kintelstaff00000000000000# Created by Octave 3.1.54, Sat Jul 25 03:55:47 2009 CEST # name: d # type: matrix # rows: 46 # columns: 46 4.546487134128409 3.049135365122645 1.430224191212503 -0.2457055078678564 -1.91183970371809 -3.501754883740146 -4.952066146974032 -6.204954160076457 -7.210470231681788 -7.928527609104572 -8.330499610668049 -8.400360881165891 -8.135326272203333 -7.545961877274642 -6.655763794958727 -5.500221413615028 -4.125402561462865 -2.586116927645778 -0.9437309728873401 0.7362785576448079 2.386934985545012 3.942431847980459 5.340756393700049 6.526161835734216 7.451389799872247 8.079554366909637 8.385612597846531 8.357362916838071 7.995931549519037 7.315727623941807 6.343868724111537 5.119099797486346 3.690248516188934 2.114278671803671 0.4540192087657636 -1.224340567385163 -2.853889748744539 -4.369663351791345 -5.71123226627233 -6.825112373132667 -7.666896787563758 -8.203026221366581 -8.412126885869672 -8.285862597434599 -7.829267114791266 -7.060543458962299 5.035828673073257 3.377315902755755 1.584160205132016 -0.2721509607637287 -2.117612326675841 -3.878651171635513 -5.48506043417364 -6.872797646310392 -7.986538104655897 -8.781880491747168 -9.227117016458916 -9.304497503575988 -9.01093703726527 -8.358138946934957 -7.372128232423011 -6.09221402938029 -4.569422478079272 -2.864462472223704 -1.045305386934624 0.815524725479631 2.643842440626112 4.366758500792109 5.915585679634834 7.228577125140624 8.25338801176127 8.949162363424968 9.288161852373825 9.256871638758197 8.856539164652959 8.103124422478512 7.026663680467649 5.670072031436031 4.087432503458046 2.34183994020634 0.5028856086418853 -1.356117185191807 -3.161055866327164 -4.839973225360668 -6.325936125317769 -7.559703914604285 -8.492090164840738 -9.085923578545179 -9.317529891462899 -9.17767569077386 -8.67193652212408 -7.820474610215396 5.324407614299007 3.570853513082628 1.674940750779526 -0.2877466136759709 -2.238962428681152 -4.100917877109334 -5.799382670971877 -7.266644378753076 -8.444207906375773 -9.285127512010241 -9.755878384655105 -9.837693172558298 -9.52731017830761 -8.837103392413644 -7.794589181356518 -6.441329296887258 -4.831273940141129 -3.028610937368119 -1.105206773856724 0.8622584960466719 2.795348240726728 4.616996272280487 6.254579232232685 7.64281185566189 8.726349688693348 9.461995497225455 9.820421404336635 9.787338100188716 9.364064511717672 8.567475221178798 7.429327729803009 5.99499638643935 4.321663455453438 2.476039440296261 0.5317035462487614 -1.4338296903001 -3.342200661807952 -5.117328639853587 -6.688444873692612 -7.992913917025852 -8.978730705585699 -9.60659383493706 -9.851472383449366 -9.703603816152382 -9.168883186197988 -8.268628117693945 5.400719226082497 3.622032462322777 1.698946694274643 -0.2918707171379004 -2.271052164109463 -4.159693928017514 -5.882501821688773 -7.370792931037254 -8.565233786107424 -9.418205799283712 -9.895703668109622 -9.97869105938673 -9.663859527706666 -8.963760412729174 -7.906304456877885 -6.53364909211736 -4.900517756176106 -3.07201824177415 -1.121047054386814 0.8746167413903643 2.835412327701047 4.683168972167305 6.344222448307544 7.752351795785409 8.851419341126077 9.59760872960501 9.961171745040346 9.927614277296112 9.498274156714555 8.690267819042166 7.535807927150502 6.080919153820417 4.383603323277566 2.511527061495859 0.5393241413542663 -1.454379930367366 -3.39010246382654 -5.190672310139893 -6.784306431561657 -8.107471664674037 -9.107417587122166 -9.744279510489891 -9.992667759626542 -9.842679878873495 -9.300295411722241 -8.387137515284946 5.261721205277139 3.528812407274513 1.655220994405354 -0.2843588561588514 -2.212602216474262 -4.052636108688901 -5.731104188082895 -7.181091229043116 -8.344790823945194 -9.175809942206806 -9.641018474015334 -9.721870023257994 -9.41514129380829 -8.733060592170913 -7.702820323490013 -6.365492916166737 -4.774393393750382 -2.992953873194801 -1.092194726527053 0.852106777267553 2.762437472830941 4.562638503728103 6.180941535720031 7.552829933771732 8.623610836697077 9.350595588940964 9.704801602564489 9.672107801566185 9.253817584620604 8.466606862686255 7.341859243059576 5.924414863988718 4.270782759862838 2.446888024335571 0.5254435848797225 -1.416948632172156 -3.302851578699326 -5.057080255534608 -6.609699101121306 -7.898810101657983 -8.873020469578222 -9.493491511811653 -9.735487005914017 -9.589359355196404 -9.06093420796045 -8.171278207284479 4.91295496433882 3.294909737359715 1.545506856841021 -0.2655105049310103 -2.06594280073829 -3.784012476539642 -5.351225516043248 -6.705102080990831 -7.7916673851425 -8.567603498676819 -9.001976297355174 -9.077468708436898 -8.791071087722237 -8.154201204569132 -7.19224905145976 -5.943564625123038 -4.457929033185433 -2.794569878503285 -1.019800041540425 0.7956260049135155 2.579332953294609 4.260210036383667 5.771245989192293 7.052200576631698 8.052006181586624 8.730803709656549 9.061531645466804 9.031004909888981 8.640440507537887 7.905409008638012 6.855213799524476 5.531722849102 3.987699565046725 2.284699283246702 0.4906152508091408 -1.32302806345222 -3.083926423880241 -4.721878369680736 -6.171583925630922 -7.375247906025503 -8.284884026347463 -8.864227965002353 -9.090183107381513 -8.953741335000977 -8.460342150758638 -7.629655823119084 4.368324712698232 2.929649413905326 1.374178238023352 -0.2360770877384193 -1.836920764996389 -3.364532208092634 -4.75801036944758 -5.961801672142627 -6.927914755722455 -7.61783374029087 -8.004053733098379 -8.071177361819418 -7.816528619197737 -7.250259547011087 -6.394945506202153 -5.284685168478457 -3.96374110987594 -2.484775201531057 -0.9067491470627086 0.7074261344866228 2.29339856846624 3.787940438758798 5.131469077295334 6.270422237007184 7.159393449591173 7.762942238112459 8.057007016981043 8.029864351438505 7.682596333906389 7.029047444376102 6.095272614680437 4.918498500582482 3.545639372485864 2.031426791520294 0.4362276349147517 -1.176362540898928 -2.742054854433646 -4.198430093976552 -5.487427174584921 -6.55765785032041 -7.366455401449627 -7.881575621917326 -8.082482294089306 -7.961165902943748 -7.522462950159604 -6.783863138057164 3.649543139808145 2.44759321336187 1.148065469325888 -0.1972320220420281 -1.534666495092764 -2.810918657904327 -3.975108364192017 -4.980823044179203 -5.787968027290999 -6.36436499014402 -6.687034804755113 -6.743113643859221 -6.530365821108268 -6.05727292083076 -5.342695664029783 -4.415121990955059 -3.311531336824084 -2.075920378435365 -0.7575490255040018 0.5910234164900096 1.916033619950813 3.164657609377909 4.287116686573691 5.238661950254811 5.981358293533024 6.485596756915665 6.731274944084161 6.708598440998452 6.418471288276723 5.872459939948812 5.092332145434113 4.109189138064303 2.962225727056051 1.697167724153914 0.3644489998122177 -0.9827991560666609 -2.290866210995255 -3.50760365933783 -4.584504018666033 -5.478634670009056 -6.15434944589027 -6.584709730536586 -6.752558417479561 -6.651203909247942 -6.284686890242273 -5.667619237398981 2.785265798733263 1.867959195228706 0.8761829532964909 -0.1505239380284582 -1.171229914949966 -2.145242651192145 -3.033731332635951 -3.801274719340386 -4.417273278600766 -4.857169091755243 -5.103424900904859 -5.146223264043962 -4.983857945492241 -4.622801938126964 -4.077449405583663 -3.369541832375409 -2.527301259514483 -1.584305160797028 -0.5781478148826403 0.4510584599601819 1.462282457401677 2.415209867765704 3.271850482337386 3.99805274309953 4.564865257579304 4.949690999504721 5.137188180933072 5.119881880922376 4.898462047040874 4.481755989334729 3.886376463332679 3.136059371907682 2.260717489732352 1.295247935347975 0.2781409331724952 -0.750054670284097 -1.748347960970855 -2.676940135684732 -3.498811154761955 -4.181195614235898 -4.696888999096009 -5.025332241452506 -5.153431345695215 -5.076079404778086 -4.796360196487312 -4.325425242952448 1.809948699677379 1.213855538667884 0.5693697878743604 -0.09781493961144824 -0.7611000941278394 -1.394042589681589 -1.971409006340514 -2.470181567057512 -2.870475783804629 -3.156333189361605 -3.316357551044089 -3.344169202537879 -3.238659381062657 -3.004034430245145 -2.649648106472589 -2.189628674143088 -1.642315656348354 -1.029528695961759 -0.37569767533284 0.2931112260290228 0.950234707775073 1.569475330361154 2.126145924291543 2.598053789661878 2.966385449071229 3.216456681596708 3.338297936342937 3.327051786975494 3.183166581980383 2.912378570424738 2.5254832158083 2.037904815000729 1.469081580199606 0.8416906987509336 0.180744265251656 -0.4874078717316904 -1.136128594973583 -1.739555456394979 -2.273631731254591 -2.717065483848913 -3.052178409798129 -3.26561061425464 -3.348853228751029 -3.298587632934588 -3.116817757488257 -2.810790193738072 0.7624746575887673 0.5113592923230357 0.2398576457599462 -0.0412063682250215 -0.3206276143430717 -0.5872664492762099 -0.8304928241031526 -1.04061007080476 -1.209241477818354 -1.32966424309348 -1.397077490994629 -1.408793668062789 -1.364345687290786 -1.265505549408286 -1.116213698804572 -0.9224219304455371 -0.6918561105903662 -0.4337081708841666 -0.1582696550500929 0.1234785724820486 0.4003040989885004 0.6611707643009137 0.895678637685649 1.094478630263245 1.249645213679287 1.354992385909446 1.406320287639134 1.401582637400947 1.340968310359362 1.226893808453956 1.063906922092792 0.8585054241002257 0.6188780240193119 0.3545779101032878 0.07614189384674533 -0.2053296594378249 -0.4786153671558212 -0.7328201905434427 -0.9578097854819362 -1.144614526816829 -1.285787099007545 -1.375699397096658 -1.410766901494015 -1.389591581461206 -1.31301763018535 -1.184097809460741 -0.3153968429699904 -0.2115232353191719 -0.09921686377634671 0.01704497102832257 0.132627276626609 0.2429221512353662 0.3435324862595468 0.4304472651360086 0.5002014699063924 0.5500142205486248 0.5778996398878249 0.5827460242524682 0.5643601635915864 0.5234750441497907 0.46172062661877 0.3815588647481526 0.286185555018652 0.1794029303213007 0.0654680769307238 -0.05107678209061699 -0.1655853709921119 -0.2734925936870061 -0.3704965297273865 -0.452729938296945 -0.5169144328985401 -0.5604911802782915 -0.5817229130325473 -0.5797631889770021 -0.5546901361254837 -0.5075033379725885 -0.4400839832541203 -0.3551198688886271 -0.2559982459960941 -0.1466707808848774 -0.03149601458619469 0.08493439842261759 0.1979787449923144 0.3031303037572243 0.3961970138943235 0.4734685993594334 0.5318644858846474 0.5690566137530826 0.5835622501931699 0.5748031012552267 0.5431283665663152 0.4898008178430777 -1.380694466691827 -0.9259729990693727 -0.4343359100507957 0.07461678107528391 0.5805947366067604 1.063426212162366 1.503862240474527 1.884344026970699 2.189702963502988 2.407765352887697 2.529837735795723 2.5510534715422 2.470566755693045 2.291586339618643 2.021247607702515 1.670328112082959 1.25281790565982 0.7853618028335425 0.2865958032807762 -0.2235958665434362 -0.7248734747661234 -1.197252665020412 -1.6219011696696 -1.981889592889172 -2.262866332254524 -2.453629731840534 -2.546574656894428 -2.537995686558978 -2.428234837308953 -2.22166792783356 -1.926530128954008 -1.55458765335044 -1.120668673792816 -0.6420721706855765 -0.1378782763090046 0.3718123898439437 0.8666800693356641 1.32699594943008 1.734408688598593 2.072676026595801 2.328312312120061 2.491126133174475 2.554626616502324 2.516282198220691 2.377621549283654 2.144172632195354 -2.390948159060002 -1.603507141423449 -0.7521393542177419 0.1292138555276426 1.00541571661104 1.84153482584592 2.604237752873515 3.263117938841503 3.791907909952001 4.169526478750082 4.380919184542068 4.417658467236295 4.278279647569251 3.968339319245766 3.500193825082827 2.89250664861418 2.169504359897848 1.360010778619294 0.4962978593593797 -0.3872008893947277 -1.255263160571735 -2.073282050748716 -2.808645728182195 -3.432037563627176 -3.918604891831163 -4.248949808870655 -4.409902505366961 -4.395046305226375 -4.20497347826705 -3.847261628290367 -3.336171597929878 -2.692078933858195 -1.940661578039921 -1.111876169216943 -0.2387637662554357 0.6438673946040369 1.500829594281713 2.29795845417703 3.003474962131552 3.58925240135922 4.031937673885623 4.3138823148693 4.423846081201991 4.357445064530748 4.117326463849724 3.713063050030014 -3.30588229339968 -2.217114514208372 -1.039957375845013 0.1786595813180147 1.390153944766803 2.546227257322191 3.600790524212898 4.511801635854819 5.2429414540886 5.765061741606376 6.057347210190657 6.108145360569123 5.915431030789019 5.486887133033441 4.839598360157432 3.99937007289772 2.999699521573657 1.880440416423686 0.6862140859437864 -0.535369434668916 -1.735609465377321 -2.86665622373352 -3.883418444706294 -4.745361027124189 -5.418121040243312 -5.874877665357591 -6.097421457202605 -6.076880297075037 -5.814073096207792 -5.31947714836337 -4.612810433194559 -3.722245522619361 -2.683286429282323 -1.537353173609781 -0.3301304983038976 0.8902534381823263 2.075145779445412 3.177308606983185 4.152802166937654 4.962736609421381 5.57482240410846 5.964657621913146 6.116700762897727 6.02489034683103 5.69288656527711 5.133925361308007 -4.089021333016357 -2.742332527821242 -1.286315578672616 0.2209827133941487 1.719471122029165 3.149409643133779 4.453791140303494 5.580614039459991 6.484955467509192 7.130762185529173 7.492287917633426 7.555119773743378 7.316752846033308 6.786690071700684 5.986063380848329 4.946791233116909 3.710306129423557 2.325902828898148 0.8487731223953848 -0.6621944900388012 -2.146762497830699 -3.545745859334898 -4.803371522675512 -5.869501921322429 -6.701633800650617 -7.266592688575257 -7.541855457065665 -7.516448248184021 -7.191383967171353 -6.579621901111978 -5.705551073052852 -4.604017928618686 -3.31893711818922 -1.901540758369277 -0.4083359691720135 1.101147886537466 2.566732450883808 3.929989492206033 5.136570254273005 6.138372169686898 6.895456557448895 7.377640852136887 7.565701887542177 7.452142263644087 7.041489244289306 6.35011426946898 -4.709143995738668 -3.158222397480602 -1.481392438582083 0.254495962038536 1.980238411761126 3.627035005010469 5.129233158380877 6.426944971957868 7.468434770900569 8.212181643536248 8.628534749081897 8.700895403097618 8.426378814655045 7.815929093848203 6.89388294466016 5.696999437374171 4.272994540441402 2.678638835395257 0.9774942529155544 -0.7626199407663925 -2.472330883996379 -4.083477796772693 -5.531829335951035 -6.759644296201945 -7.717973569654379 -8.368611592358691 -8.685619479556678 -8.656359127161986 -8.281997053088212 -7.577457891860837 -6.57082939653611 -5.302242668622715 -3.822272257705642 -2.189919913751454 -0.4702623735279068 1.268143043529455 2.955991599298102 4.525994098173628 5.915559494955271 7.069290202300532 7.941190617715322 8.496500823077938 8.713082352883248 8.582300785000461 8.109369967835956 7.313144160650595 -5.141527947914094 -3.448203906499507 -1.617410856769451 0.2778632597848961 2.162059845019839 3.960061927008222 5.600188836664843 7.017053889821449 8.154171147984922 8.966207334453294 9.420789129000436 9.499793789993564 9.200071650912507 8.533571687614522 7.52686515037404 6.220086251984656 4.665332143345871 2.924585964458808 1.067245772233472 -0.8326421410420161 -2.699335239708387 -4.458414360612515 -6.039750570299125 -7.380300984282985 -8.426622087910019 -9.137000360635794 -9.48311526245501 -9.451168284460866 -9.042433051851468 -8.273204548512339 -7.1741494874307 -5.789083725623066 -4.173225464184948 -2.390993872864271 -0.513440901049977 1.384581339232713 3.227404690819291 4.941561602047335 6.458714046201143 7.718377942983702 8.670334467929564 9.276632118461686 9.513099720536216 9.37031005707512 8.853955701361743 7.984622072107995 -5.368935405835869 -3.600716407202944 -1.68894820813253 0.2901530262118541 2.257686775031992 4.135213676674213 5.847882658448798 7.327415012691896 8.514826453374175 9.362778633449111 9.837466375364958 9.919965376815327 9.606986662953039 8.911007707438348 7.859774994939016 6.495197856345744 4.871677676002062 3.053939080184086 1.11444957050123 -0.8694695267085139 -2.818725617658153 -4.655608013234817 -6.306886008944467 -7.706728362007201 -8.799327775264402 -9.541125758006334 -9.902549165539984 -9.869189187144494 -9.442375779884992 -8.639124647421326 -7.491458877599298 -6.045132282992935 -4.357805340781697 -2.496746451483471 -0.5361501601036421 1.445820746239842 3.370151341981964 5.160124638846803 6.744380050075756 8.059758311830187 9.05381944373006 9.686933365387848 9.933859822653556 9.784754636897503 9.245562161347152 8.337778298482458 -5.382300351782382 -3.609679707468892 -1.693152524221641 0.2908753071145678 2.263306857866227 4.145507506472566 5.862439852701268 7.345655222001519 8.536022498156086 9.386085494285842 9.861954881263999 9.944659248324436 9.630901433341164 8.933189970277535 7.879340413410047 6.511366418956426 4.883804793183958 3.061541282044484 1.117223781242091 -0.8716339061148982 -2.825742300234944 -4.667197265990103 -6.322585804942894 -7.725912799925885 -8.82123203210352 -9.564876580168589 -9.927199682695818 -9.893756660964112 -9.465880782714354 -8.660630108971949 -7.510107442983564 -6.060180492757929 -4.368653270291459 -2.502961628021068 -0.5374848041936438 1.449419842645591 3.378540694267371 5.172969790010383 6.761168904475835 8.079821550822126 9.076357209288462 9.711047147921935 9.958588281749131 9.809111926925592 9.26857723401821 8.358533615477349 -5.181089967534271 -3.474736468801078 -1.629856192221796 0.2800013074327352 2.178696038555143 3.990533033893282 5.64328007002529 7.071047338165455 8.216914262913187 9.035198745970977 9.493278367245317 9.572890937789841 9.270862555648927 8.599234139312866 7.58478139429494 6.267947350248265 4.701230024998847 2.947089494241964 1.075457805428347 -0.8390489922843309 -2.720105554446849 -4.492720091943021 -6.086224056971523 -7.437089475039214 -8.491461604830073 -9.207305956793 -9.556084075592718 -9.52389127826568 -9.112010990051067 -8.336863578276587 -7.229351724130582 -5.83362843028209 -4.2053367799973 -2.409391623001631 -0.5173916252718265 1.395235143833869 3.252238290674027 4.979584959896401 6.508411290756739 7.777767801934123 8.737049255013993 9.348012125649753 9.586299252193967 9.442410878869843 8.922083381055785 8.046060574101277 -4.773325876155424 -3.201266452287175 -1.501582637146705 0.2579645392187804 2.007227483459789 3.676468602107865 5.199140519357471 6.514539110936956 7.570223585980346 8.324107135872664 8.746134802496814 8.819481674569811 8.541223643761541 7.922453979666336 6.987841076151081 5.774645000337366 4.331232051306271 2.715146548382711 0.9908167207155332 -0.773013842903595 -2.506026783992408 -4.139132345428268 -5.607223762039341 -6.851772861875711 -7.823163399728696 -8.482669100254197 -8.803997552362862 -8.774338404679673 -8.394874073827912 -7.680732605209696 -6.660384565575114 -5.374508011369955 -3.874366782992262 -2.219766777248058 -0.4766716749741102 1.285426822756593 2.996279409462914 4.587679791420381 5.996183857354676 7.165638994948616 8.049422718295403 8.612301359286031 8.831834722770459 8.699270706324162 8.219894218952904 7.412816488448197 -4.175264345195113 -2.800172044501049 -1.3134457208466 0.2256435388803507 1.755737102771503 3.215834968923976 4.547727643019533 5.698316767172359 6.621731983896433 7.281159642506184 7.650310443197156 7.714467508468514 7.471073098587216 6.929830580599756 6.112317585708757 5.05112577720909 3.78856152372123 2.374959277779841 0.8666749000507603 -0.676161070992536 -2.192040633885014 -3.620530454088728 -4.904681150332459 -5.993297686728825 -6.842980357299839 -7.419854995298554 -7.700923429341156 -7.674980347925095 -7.343060019838303 -6.718395061126436 -5.825888892449073 -4.701122918285288 -3.388938008620714 -1.941646834964742 -0.4169483292196312 1.12437259065492 2.620868323502963 4.012878306921188 5.244907495612248 6.267838773715967 7.040891099220648 7.533245315416116 7.725272813416223 7.609318062853523 7.190003813716571 6.484046801895833 -3.410748200600429 -2.287443613754537 -1.072945868473995 0.1843268427061244 1.434251024344538 2.626996143683169 3.715011216738866 4.654920515979006 5.409252823698197 5.947935291220925 6.249492348477882 6.301901867214561 6.103074445306729 5.660936704629639 4.993115281657762 4.126234109092623 3.094853003682659 1.940089875389279 0.7079814860717643 -0.5523518909306521 -1.790664741088856 -2.957589438789203 -4.00660437877821 -4.895888645756584 -5.589989282298683 -6.061234686386791 -6.290837790860787 -6.269645044499783 -5.998501335223617 -5.488216307077675 -4.759133413836612 -3.840318889699831 -2.768402970257767 -1.586119560592286 -0.3406025693357043 0.9184931715267248 2.140971488113207 3.278096027694826 4.284533223282468 5.120159599884286 5.751661370836673 6.153862553350843 6.310728655499175 6.216005920808633 5.873470645796447 5.296778630944794 -2.510256288486159 -1.683522024573375 -0.7896710502018139 0.1356616169901937 1.05558588361779 1.933427272159427 2.734189016642643 3.425947273264703 3.981123823303499 4.377585529669897 4.59952671523833 4.638099285316098 4.491765473256983 4.166359146364736 3.674853228013503 3.036842508131333 2.277762460760673 1.427875211974583 0.5210630844078612 -0.4065221840245499 -1.317900695834841 -2.176738665778339 -2.948796934213331 -3.60329597434807 -4.114142974843539 -4.460972077860914 -4.629956301545421 -4.614358778159311 -4.414801331739156 -4.03923968793379 -3.502646304328436 -2.826413465809092 -2.037500441671404 -1.16735870462873 -0.2506780598459248 0.6759963281225712 1.575720875718599 2.412626404474485 3.153348131966858 3.768355820403181 4.233131054014477 4.529144710919736 4.644595660743251 4.574881238442103 4.322780738036853 3.898344610929531 -1.509688379721747 -1.012483724933438 -0.4749145391091887 0.08158799070985261 0.6348378648050846 1.162778756577268 1.644363328685269 2.060392323967141 2.394279979236409 2.632715247320912 2.766192466508119 2.789390321280759 2.701383986374111 2.505681996640854 2.210086372838312 1.826381579681559 1.369864716423261 0.8587356697792575 0.3133715418782656 -0.2444857204963248 -0.7925961087140347 -1.309108191258972 -1.773430261348203 -2.167051263300292 -2.474278769910309 -2.682864590002175 -2.784493065159446 -2.775112588784801 -2.655097130869491 -2.429231328989921 -2.106519739906278 -1.699827856300014 -1.225369200180058 -0.7020589409250443 -0.150759807170451 0.4065496443459431 0.9476512444838604 1.450972979990634 1.896449001595198 2.26631958609706 2.545839160486248 2.723864161406895 2.793297293862669 2.75137047797148 2.59975520357519 2.344495893214314 -0.4489339593550001 -0.3010808942575579 -0.141224684021771 0.02426170870570256 0.1887808636693288 0.3457739213309235 0.4889820639017611 0.612696034656969 0.7119837479845479 0.7828869160746246 0.8225788533633334 0.829477167566125 0.8033068446646229 0.7451112128476809 0.657210348308904 0.5431085811302354 0.4073547887001401 0.2553610463269413 0.09318686487506814 -0.07270238281121608 -0.2356932159204538 -0.3892877042838959 -0.5273625203459285 -0.6444130569104365 -0.7357728784589211 -0.7977997572088324 -0.8280208772415469 -0.825231417869619 -0.7895425860355593 -0.7223771828419703 -0.6264128809614945 -0.5054754742772395 -0.3643863555536506 -0.2087703027217771 -0.04483123673317359 0.1208951091908324 0.2818017486179796 0.4314738416045685 0.5639444341208273 0.6739323416782621 0.757052693489469 0.8099917434291753 0.8306389786351164 0.8181712589957502 0.7730856331489335 0.69717952272126 0.6297180412781989 0.4223250815566671 0.1980953535573332 -0.03403181106229467 -0.2648022347684586 -0.4850158290061779 -0.6858933726973768 -0.8594265120808325 -0.9986970285048157 -1.09815264597303 -1.153828382867369 -1.163504623252803 -1.126795605960306 -1.045164803667328 -0.9218665788603957 -0.761816442672515 -0.5713950889660844 -0.3581940162040492 -0.1307128783625411 0.1019793694509399 0.3306060216189227 0.5460524549925905 0.7397295001538707 0.903915864495442 1.03206595579104 1.119070834301707 1.161461890080995 1.157549125507695 1.107488530157902 1.013275861992868 0.8786670827870677 0.7090286197848682 0.5111234231810415 0.2928413486382201 0.06288461363950699 -0.1695791324611385 -0.3952822936884582 -0.6052267972518273 -0.7910428183123687 -0.9453224584867627 -1.061915075378811 -1.13617248928231 -1.165134291437744 -1.14764586618743 -1.08440442185818 -0.9779311952654839 1.683265170795829 1.12889428909309 0.5295179545161437 -0.09096858991682827 -0.7078285037378014 -1.296469528796759 -1.833424404988772 -2.297286435859161 -2.669562906038411 -2.93541232744681 -3.084236122589167 -3.110101156393801 -3.011976271584753 -2.793773397668383 -2.464191594648746 -2.036370248956716 -1.527365247576704 -0.9574690136555669 -0.3494015116281765 0.2725955260675967 0.8837250403639841 1.459623226056689 1.977330839833961 2.416208512855347 2.758759577256071 2.991327603080867 3.104640837050949 3.094181838108516 2.960367573536122 2.708532795786939 2.348717362739231 1.895265980245349 1.366256323976739 0.7827783395423258 0.1680934529102542 -0.4532927892397816 -1.056607678330947 -1.617798953605395 -2.114493689859416 -2.526890235369443 -2.838547641258541 -3.037041110245732 -3.114457334104856 -3.067709972291675 -2.898662694601847 -2.614054882537336 2.669705829804243 1.790458043755305 0.8398303456189292 -0.1442787381593636 -1.122635883945128 -2.056237079720395 -2.907862591958544 -3.643560798946349 -4.234001734801155 -4.655646382654547 -4.891685100973239 -4.932707770921118 -4.777078948101876 -4.431003062566172 -3.908277067764701 -3.229740399552937 -2.422444173646198 -1.518572743000832 -0.5541606092254262 0.4323441592848651 1.401612730505363 2.315003425205354 3.136102238758166 3.832174552594589 4.375470160145175 4.744329580005311 4.924047551108387 4.907459285079375 4.695226103737553 4.295809074282484 3.725131693245221 3.005945066931102 2.166920896606633 1.241508428248773 0.2666009366630344 -0.7189350929595494 -1.675809449156724 -2.565874570938535 -3.353646370662466 -4.007718872631197 -4.502016270236361 -4.816832486081088 -4.939616791099661 -4.865474162519273 -4.597360432970828 -4.145964450769626 3.54971374212228 2.380641886330078 1.116661351079797 -0.1918369484093717 -1.492687314141955 -2.73402894710691 -3.866373473677969 -4.844577890900531 -5.62964427556248 -6.19027450832758 -6.50411803098649 -6.558662892681309 -6.351734561902528 -5.89158261819819 -5.196551867470355 -4.294350992454181 -3.22094789497706 -2.019135769216056 -0.736827072087785 0.5748565952123353 1.863622544126233 3.078091743206837 4.169847137965979 5.095363886047989 5.817744555343825 6.308190108172687 6.547148028033732 6.525091816737419 6.242900785825731 5.711825001195826 4.953036778474351 3.996786609606501 2.881197171203133 1.65074349372734 0.3544798823789649 -0.9559157232538983 -2.228201985567143 -3.41165686621379 -4.459099753710306 -5.328772405529383 -5.986003717453734 -6.404591951090286 -6.567849314495497 -6.46926725177881 -6.112775918687044 -5.51258749969712 4.288205769311382 2.875917049446775 1.34897459230178 -0.231747224902796 -1.803230011571154 -3.302823708099532 -4.670744246048903 -5.852456950294104 -6.800850664426962 -7.47811592389443 -7.857252300035656 -7.923144821967909 -7.673166562777629 -7.117283366806719 -6.277656542887673 -5.187759362894486 -3.891042588024042 -2.439202224064016 -0.890118564778289 0.6944513127535784 2.25133560791381 3.718466256886861 5.037353390496664 6.155417140715221 7.02808383407551 7.620563003372249 7.909234373801725 7.882589528780094 7.541690714195699 6.900128490017602 5.983479917557116 4.828288882746387 3.480609206727212 1.994168625333327 0.4282268338104019 -1.154787010228619 -2.691763140310978 -4.121427168338916 -5.386782901080704 -6.437384598532856 -7.23134808638331 -7.737020545868154 -7.93424241176944 -7.815151070663276 -7.384494318505103 -6.659441080987506 4.855740564693871 3.256538475283084 1.527508473464183 -0.2624184708600041 -2.041883618860373 -3.739945310513147 -5.288907184715668 -6.627017019575332 -7.700928598626055 -8.46782845613504 -8.897142714875848 -8.971755970131976 -8.688693626872098 -8.059240487467115 -7.108490862230847 -5.874348138457536 -4.406013691981442 -2.762025383586276 -1.007923839222646 0.7863604479231795 2.549295025514206 4.210597255203638 5.704036259636104 6.970073338524186 7.958235588743649 8.629128099704545 8.956004504118614 8.925833271260007 8.539817232971965 7.813345630556984 6.775380594289642 5.467302514677827 3.941260336876582 2.258092546810274 0.4849017327257366 -1.307620583246664 -3.048012193000405 -4.66688917517789 -6.099712013161457 -7.289358581934639 -8.188401426947269 -8.760998547062469 -8.984322302035931 -8.849469478495738 -8.361816232963735 -7.540803761460487 5.229692306937458 3.507331988711279 1.645145412121301 -0.2826279204933955 -2.199133769801996 -4.027967095476507 -5.696218084039577 -7.137378833047617 -8.293994811283408 -9.119955389607474 -9.582332126231357 -9.662691519780038 -9.357829894821458 -8.679901122296229 -7.655932083036974 -6.326745191317807 -4.74533093401977 -2.974735307140072 -1.085546370884799 0.8469198735379744 2.745622095213007 4.534865028263448 6.143317203231159 7.506854707664531 8.571117604153223 9.293677089490007 9.645726997162825 9.613232208310484 9.197488187621289 8.415069337243999 7.297168227677697 5.888352048419835 4.244785854760888 2.431993444268991 0.5222451297532001 -1.408323450046034 -3.282746618113592 -5.026297037822943 -6.569464856031814 -7.85072884157588 -8.819009042613789 -9.43570318311505 -9.676225613788761 -9.530987464336391 -9.005778921451114 -8.121538392346379 5.395152720151853 3.618299243775675 1.697195594753702 -0.2915698868206932 -2.26871139710953 -4.155406543328425 -5.876438743808457 -7.363195875747651 -8.556405624029034 -9.408498481379727 -9.885504194511661 -9.968406050920841 -9.653899015204164 -8.95452149039132 -7.898155451383183 -6.526914878599211 -4.895466806476436 -3.068851921318294 -1.119891594379443 0.8737152764050196 2.832489876287216 4.678342043240527 6.337683476291875 7.744361468860196 8.842296208410893 9.587716501611499 9.950904793681877 9.917381913524109 9.488484312582518 8.681310784741999 7.528040791374196 6.07465156776076 4.379085155812245 2.508938437703814 0.5387682614972115 -1.452880905113711 -3.386608294868589 -5.185322298967513 -6.777313866237354 -8.099115316710975 -9.098030597743653 -9.734236109340088 -9.982368345415507 -9.832535056744142 -9.290709623719028 -8.378492916525859 5.345525419802729 3.585016326194277 1.681583944833682 -0.2888878818624344 -2.247842660347122 -4.117183045441479 -5.822384335036501 -7.295465534789873 -8.477699545843972 -9.321954428933225 -9.794572406069209 -9.876711689935791 -9.565097646490701 -8.872153344291123 -7.825504285953553 -6.466877066541816 -4.850435865897734 -3.040623093715808 -1.109590274028466 0.86567840836979 2.806435224432541 4.635308324315644 6.279386308869567 7.673124977038238 8.760960366318479 9.49952391260276 9.859371417972785 9.826156897953913 9.401204510644819 8.601455766712713 7.458794124825067 6.018773898766608 4.338804150703687 2.485859973040466 0.5338124028368944 -1.439516583325327 -3.35545658596765 -5.137625123282998 -6.714972759646662 -8.02461562240514 -9.014342383437267 -9.644695760044115 -9.890545552295466 -9.742090504798149 -9.205249051818882 -8.301423367986789 5.082788889746999 3.408810120860735 1.598932849578142 -0.2746888286927486 -2.137359530194382 -3.914820452055196 -5.536209836422897 -6.936888005132817 -8.061014339694061 -8.863773470533452 -9.313161924357349 -9.391264001639069 -9.094966019022742 -8.436080442052933 -7.440874959449751 -6.149025273252079 -4.612033353781187 -2.891174218607906 -1.055053090966565 0.8231296739990461 2.668496856398217 4.407479490061577 5.970749825062005 7.295985206327845 8.330352681230107 9.032615282679755 9.374776016874794 9.343194015093491 8.939128352084104 8.178687850727879 7.092188874105124 5.722946707767992 4.125548715994828 2.363678115836767 0.5075751282179191 -1.368763278017028 -3.190533411739751 -4.885107046646795 -6.384926879450768 -7.630199826372963 -8.571280784705591 -9.170651826392648 -9.40441791942675 -9.263259547370208 -8.752804249065901 -7.893402266422392 4.617417606324923 3.096705413130865 1.452537347334307 -0.2495387987538081 -1.941666620400823 -3.5563863211758 -5.029324122151516 -6.301758641327084 -7.322961929822302 -8.052221835118193 -8.460465066103314 -8.531416253444307 -8.262246797201303 -7.663687634181376 -6.759601429351459 -5.586031246689127 -4.189763625962253 -2.626463351031946 -0.958454270580386 0.7477653570618542 2.424173939628084 4.00393835714458 5.42407838751986 6.627977529253878 7.567640122689131 8.205604785502139 8.516437879800469 8.48774747100499 8.120677355176557 7.429861459476516 6.442840433670812 5.198963691333348 3.747820672901074 2.147263871172282 0.4611024349828368 -1.24344170019649 -2.89841373869619 -4.437835167907522 -5.800334113373086 -6.931592041751236 -7.786509269328339 -8.331002944088237 -8.54336582146739 -8.41513166369451 -7.951412761973714 -7.170696125567001 3.967964454042534 2.661144832798496 1.248233764798917 -0.2144404443737696 -1.668565589735227 -3.056170290497144 -4.321935126079993 -5.415398046841001 -6.292966136751218 -6.919653525392167 -7.270476164205151 -7.331447861665553 -7.100137868602942 -6.585767784499835 -5.808843921420753 -4.800339782061639 -3.600461243939888 -2.257043677934734 -0.8236449030035197 0.6425899950486453 2.083206857808219 3.440772837086368 4.661166061336456 5.695733303881148 6.503229633525916 7.051462719809843 7.318576239632341 7.293921219883536 6.978480578397405 6.384829938119489 5.536636276704745 4.467714398803897 3.220678846510804 1.845244992047145 0.3962470427578658 -1.068548025696312 -2.490743456364277 -3.813640805422481 -4.984500330207981 -5.956643556328476 -6.691314201133876 -7.15922326440309 -7.341716688355996 -7.231519036070902 -6.833023540195608 -6.162116958625413 3.160321080613384 2.119492805710582 0.9941670410904191 -0.1707930261825025 -1.328944114470087 -2.434114394639413 -3.442244215186624 -4.313142621504115 -5.012089642410857 -5.511220465838168 -5.790636320954395 -5.839197779363776 -5.654968848964071 -5.245294155842311 -4.626506137210002 -3.823273918671509 -2.867619834034114 -1.797642795911458 -0.6559994123056947 0.5117965977428373 1.659188892506926 2.740434562000088 3.71242775344765 4.536418165608486 5.179555901001853 5.616201087656102 5.8289460598929 5.809309347024744 5.558073802826458 5.085255395625619 4.409703903252567 3.558351431882195 2.565138717949963 1.469662018096385 0.3155945313679901 -0.8510547134099066 -1.983775092422612 -3.037408618664727 -3.969950248377854 -4.74422248959062 -5.329357551403209 -5.702027945401628 -5.847376479006589 -5.759608564857086 -5.442223232722587 -4.907873634227967 2.22668567867006 1.493343288905311 0.7004660147291653 -0.1203366290059004 -0.9363418310866921 -1.715018039159572 -2.425321890063545 -3.038935810756489 -3.531396950591077 -3.883072437973098 -4.079942080996805 -4.114157308252927 -3.984354066603155 -3.695707201674252 -3.259724153093075 -2.693786189182488 -2.020455470643085 -1.266575568405079 -0.4622012951650975 0.3605994851525819 1.16902430193471 1.930843808868214 2.615686666272127 3.196250350568365 3.649389619738685 3.95703924108492 4.10693419504852 4.093098642835834 3.916084164252973 3.582947767959545 3.106970550803082 2.507128222398642 1.807334603467782 1.035488257270811 0.2223602619286077 -0.5996325353583019 -1.397719875710371 -2.140084535377989 -2.797130778047369 -3.342664243452604 -3.75493623385838 -4.017510766006725 -4.11991982190273 -4.058080675658289 -3.834458658889454 -3.457968875724721 1.204279345431145 0.8076588876886379 0.3788396188089894 -0.06508279017502479 -0.5064105536953812 -0.9275493265108165 -1.311709634729428 -1.643576219150494 -1.909918606318715 -2.100118565749699 -2.206593425271613 -2.225098368236168 -2.15489566096309 -1.998784063853906 -1.762987253646724 -1.456905705064642 -1.092741923553445 -0.6850139698967194 -0.249976670946797 0.1950264090267705 0.6322544015138652 1.044276406206742 1.414666405988919 1.728658120402314 1.973733690651419 2.140122727131086 2.221191824027839 2.213709012276733 2.117972607968906 1.937799319430418 1.680372087105609 1.355953722388659 0.9774777617194828 0.5600328473000009 0.1202611905445145 -0.3243049003718474 -0.755941978313681 -1.157442035093003 -1.512798530452724 -1.807844522315121 -2.030817458056102 -2.172828110359468 -2.228214962658407 -2.194769915935083 -2.073826318660405 -1.870205810398125 0.133862195013134 0.08977567533482943 0.04211008278445129 -0.007234305880492386 -0.05629028559915311 -0.1031021492652438 -0.1458036555977758 -0.1826924302916663 -0.2122978343091302 -0.2334395936172461 -0.2452748529890788 -0.2473317779817941 -0.2395283654869346 -0.2221757129355783 -0.1959656158254859 -0.1619429880176926 -0.1214642043182845 -0.07614302609516824 -0.02778626570485129 0.0216782454144859 0.07027851329880706 0.1160769986345782 0.1572478603369399 0.1921497460719863 0.2193912277947304 0.237886273594353 0.2468975443593155 0.2460657891609279 0.2354241674541947 0.2153969271149841 0.1867824910160091 0.1507216264264608 0.1086519662208858 0.06225069499319062 0.01336768499954474 -0.03604825241086339 -0.08402705975448951 -0.1286559733884243 -0.1681557793607642 -0.2009517450562382 -0.2257363988162215 -0.2415216547078018 -0.2476782043918371 -0.2439606056605409 -0.2305170674437688 -0.2078835411866856 -0.9418916186934663 -0.6316866098910525 -0.2962982493546524 0.05090258736032291 0.396074098549645 0.7254553853138876 1.025915055172518 1.285474729243588 1.493786582409802 1.64254587845149 1.725822053672573 1.740295149760155 1.685388170045718 1.563290082541485 1.378868552693453 1.139475884920871 0.8546559094405842 0.5357634998735836 0.1955118902661149 -0.1525341614328149 -0.4944991574648012 -0.8167500325709951 -1.106439661282354 -1.352019032270644 -1.54369767098508 -1.67383395497704 -1.737239761272558 -1.731387300463223 -1.656509891692994 -1.515592660960215 -1.314253533564164 -1.060519265151764 -0.7645054402998314 -0.4380131960795705 -0.09405874796218745 0.2536455256169031 0.5912377525143929 0.90525919597775 1.183190812008062 1.413952344138135 1.588344058292062 1.699413507151409 1.742732702290064 1.716574644099477 1.621982171813179 1.462726388797417 -1.980095185873649 -1.327965543382954 -0.6228941053151842 0.1070101550754859 0.8326482582733674 1.525091302987413 2.156733770155261 2.702394067873998 3.140318442004222 3.453048229699637 3.628115881200739 3.658542001700102 3.54311359778859 3.286432435674765 2.898731583287855 2.395467450151741 1.796703589112747 1.126310825801873 0.4110156041456203 -0.3206655126131722 -1.039562707302622 -1.717015817381742 -2.326016925178589 -2.842287078339433 -3.24524421504243 -3.518823705852006 -3.652118799799595 -3.639815442126497 -3.482404128877647 -3.186160352372156 -2.762894417128001 -2.229480600290467 -1.607184427452228 -0.9208148832552137 -0.1977353554622115 0.5332272569630683 1.242931781349151 1.903084537910887 2.487367319476658 2.972486615356378 3.339102250105779 3.572598415289946 3.663666355642739 3.608675479763801 3.409818100340678 3.075022033560224 -2.939358606544735 -1.971302681297775 -0.9246571389528138 0.1588515655978607 1.23602735951325 2.263926643114734 3.201570315688885 4.011577482915883 4.661655715163819 5.125888444753457 5.385768177727149 5.430934329229159 5.259586267329132 4.878555098534946 4.303031333133039 3.555959287479722 2.667122366513022 1.671955693384779 0.6101334229225803 -0.476012941724182 -1.543182172530108 -2.548829599910208 -3.45286323443881 -4.219242107950363 -4.817413113206347 -5.223529059864967 -5.421399386705929 -5.403135628214004 -5.169465902805643 -4.729705885045418 -4.101387419098447 -3.309559579428456 -2.385790043245842 -1.366906586834864 -0.2935288783299538 0.7915509002700281 1.845074042359564 2.82503990484805 3.692380341259188 4.412517225444294 4.956740972354244 5.303355098597096 5.438541192763665 5.356909811883925 5.06171534151083 4.564726253638137 openscad-2019.05/examples/Old/example010.scad0000644000076500000240000000146713402025764021156 0ustar kintelstaff00000000000000 // example010.dat generated using octave: // d = (sin(1:0.2:10)' * cos(1:0.2:10)) * 10; // save("example010.dat", "d"); echo(version=version()); intersection() { surface(file = "example010.dat", center = true, convexity = 5); rotate(45, [0, 0, 1]) surface(file = "example010.dat", center = true, convexity = 5); } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example011.scad0000644000076500000240000000133013402025764021144 0ustar kintelstaff00000000000000echo(version=version()); polyhedron( points = [ [10, 0, 0], [0, 10, 0], [-10, 0, 0], [0, -10, 0], [0, 0, 10] ], triangles = [ [0, 1, 2, 3], [4, 1, 0], [4, 2, 1], [4, 3, 2], [4, 0, 3] ] ); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example012.scad0000644000076500000240000000131613402025764021151 0ustar kintelstaff00000000000000// example012.stl is generated from Basics/LetterBlock.scad echo(version=version()); difference() { sphere(20); translate([ -2.92, 0.5, +20 ]) rotate([180, 0, 180]) import("example012.stl", convexity = 5); } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example012.stl0000644000076500000240000004165613402025764021054 0ustar kintelstaff00000000000000solid ascii facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex 3.422440e+000 -1.067730e+001 5.000000e+000 vertex 6.347434e+000 -1.067730e+001 5.000000e+000 vertex 3.422440e+000 8.281660e+000 5.000000e+000 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 3.422440e+000 8.281660e+000 5.000000e+000 vertex 6.347434e+000 -1.067730e+001 5.000000e+000 vertex 6.347434e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 2.280978e+000 1.133150e+001 5.000000e+000 vertex 3.422440e+000 8.281660e+000 5.000000e+000 vertex 6.347434e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 2.280978e+000 1.133150e+001 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex 3.422440e+000 8.281660e+000 5.000000e+000 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 3.422440e+000 8.281660e+000 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex -2.320538e+000 -4.613285e+000 5.000000e+000 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -2.320538e+000 -4.613285e+000 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex -4.104071e+000 -4.613285e+000 5.000000e+000 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -4.104071e+000 -4.613285e+000 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex -9.793542e+000 8.281660e+000 5.000000e+000 endloop endfacet facet normal -0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -9.793542e+000 8.281660e+000 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex -8.527233e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -1.252235e+001 1.133150e+001 5.000000e+000 vertex -9.793542e+000 8.281660e+000 5.000000e+000 vertex -8.527233e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -1.252235e+001 1.133150e+001 5.000000e+000 vertex -1.252235e+001 -1.067730e+001 5.000000e+000 vertex -9.793542e+000 8.281660e+000 5.000000e+000 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -9.793542e+000 8.281660e+000 5.000000e+000 vertex -1.252235e+001 -1.067730e+001 5.000000e+000 vertex -9.793542e+000 -1.067730e+001 5.000000e+000 endloop endfacet facet normal 0.000000e+000 -1.000000e+000 0.000000e+000 outer loop vertex -1.252235e+001 1.133150e+001 1.500000e+001 vertex -1.252235e+001 1.133150e+001 5.000000e+000 vertex -8.527233e+000 1.133150e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -1.000000e+000 -0.000000e+000 outer loop vertex -8.527233e+000 1.133150e+001 1.500000e+001 vertex -1.252235e+001 1.133150e+001 5.000000e+000 vertex -8.527233e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal -9.124922e-001 -4.090940e-001 -0.000000e+000 outer loop vertex -8.527233e+000 1.133150e+001 1.500000e+001 vertex -8.527233e+000 1.133150e+001 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 1.500000e+001 endloop endfacet facet normal -9.124922e-001 -4.090940e-001 0.000000e+000 outer loop vertex -3.033951e+000 -9.213713e-001 1.500000e+001 vertex -8.527233e+000 1.133150e+001 5.000000e+000 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 endloop endfacet facet normal 9.174094e-001 -3.979447e-001 0.000000e+000 outer loop vertex -3.033951e+000 -9.213713e-001 1.500000e+001 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex 2.280978e+000 1.133150e+001 1.500000e+001 endloop endfacet facet normal 9.174094e-001 -3.979447e-001 0.000000e+000 outer loop vertex 2.280978e+000 1.133150e+001 1.500000e+001 vertex -3.033951e+000 -9.213713e-001 5.000000e+000 vertex 2.280978e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal 0.000000e+000 -1.000000e+000 0.000000e+000 outer loop vertex 2.280978e+000 1.133150e+001 1.500000e+001 vertex 2.280978e+000 1.133150e+001 5.000000e+000 vertex 6.347434e+000 1.133150e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -1.000000e+000 -0.000000e+000 outer loop vertex 6.347434e+000 1.133150e+001 1.500000e+001 vertex 2.280978e+000 1.133150e+001 5.000000e+000 vertex 6.347434e+000 1.133150e+001 5.000000e+000 endloop endfacet facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000 outer loop vertex 6.347434e+000 1.133150e+001 1.500000e+001 vertex 6.347434e+000 1.133150e+001 5.000000e+000 vertex 6.347434e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000 outer loop vertex 6.347434e+000 -1.067730e+001 1.500000e+001 vertex 6.347434e+000 1.133150e+001 5.000000e+000 vertex 6.347434e+000 -1.067730e+001 5.000000e+000 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex 6.347434e+000 -1.067730e+001 1.500000e+001 vertex 6.347434e+000 -1.067730e+001 5.000000e+000 vertex 3.422440e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex 3.422440e+000 -1.067730e+001 1.500000e+001 vertex 6.347434e+000 -1.067730e+001 5.000000e+000 vertex 3.422440e+000 -1.067730e+001 5.000000e+000 endloop endfacet facet normal 1.000000e+000 -0.000000e+000 0.000000e+000 outer loop vertex 3.422440e+000 -1.067730e+001 1.500000e+001 vertex 3.422440e+000 -1.067730e+001 5.000000e+000 vertex 3.422440e+000 8.281660e+000 1.500000e+001 endloop endfacet facet normal 1.000000e+000 -0.000000e+000 0.000000e+000 outer loop vertex 3.422440e+000 8.281660e+000 1.500000e+001 vertex 3.422440e+000 -1.067730e+001 5.000000e+000 vertex 3.422440e+000 8.281660e+000 5.000000e+000 endloop endfacet facet normal -9.134987e-001 4.068417e-001 0.000000e+000 outer loop vertex 3.422440e+000 8.281660e+000 1.500000e+001 vertex 3.422440e+000 8.281660e+000 5.000000e+000 vertex -2.320538e+000 -4.613285e+000 1.500000e+001 endloop endfacet facet normal -9.134987e-001 4.068417e-001 0.000000e+000 outer loop vertex -2.320538e+000 -4.613285e+000 1.500000e+001 vertex 3.422440e+000 8.281660e+000 5.000000e+000 vertex -2.320538e+000 -4.613285e+000 5.000000e+000 endloop endfacet facet normal -4.979881e-016 1.000000e+000 0.000000e+000 outer loop vertex -2.320538e+000 -4.613285e+000 1.500000e+001 vertex -2.320538e+000 -4.613285e+000 5.000000e+000 vertex -4.104071e+000 -4.613285e+000 1.500000e+001 endloop endfacet facet normal -4.979881e-016 1.000000e+000 0.000000e+000 outer loop vertex -4.104071e+000 -4.613285e+000 1.500000e+001 vertex -2.320538e+000 -4.613285e+000 5.000000e+000 vertex -4.104071e+000 -4.613285e+000 5.000000e+000 endloop endfacet facet normal 9.149041e-001 4.036714e-001 0.000000e+000 outer loop vertex -4.104071e+000 -4.613285e+000 1.500000e+001 vertex -4.104071e+000 -4.613285e+000 5.000000e+000 vertex -9.793542e+000 8.281660e+000 1.500000e+001 endloop endfacet facet normal 9.149041e-001 4.036714e-001 0.000000e+000 outer loop vertex -9.793542e+000 8.281660e+000 1.500000e+001 vertex -4.104071e+000 -4.613285e+000 5.000000e+000 vertex -9.793542e+000 8.281660e+000 5.000000e+000 endloop endfacet facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000 outer loop vertex -9.793542e+000 8.281660e+000 1.500000e+001 vertex -9.793542e+000 8.281660e+000 5.000000e+000 vertex -9.793542e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000 outer loop vertex -9.793542e+000 -1.067730e+001 1.500000e+001 vertex -9.793542e+000 8.281660e+000 5.000000e+000 vertex -9.793542e+000 -1.067730e+001 5.000000e+000 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex -9.793542e+000 -1.067730e+001 1.500000e+001 vertex -9.793542e+000 -1.067730e+001 5.000000e+000 vertex -1.252235e+001 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex -1.252235e+001 -1.067730e+001 1.500000e+001 vertex -9.793542e+000 -1.067730e+001 5.000000e+000 vertex -1.252235e+001 -1.067730e+001 5.000000e+000 endloop endfacet facet normal 1.000000e+000 -0.000000e+000 0.000000e+000 outer loop vertex -1.252235e+001 -1.067730e+001 1.500000e+001 vertex -1.252235e+001 -1.067730e+001 5.000000e+000 vertex -1.252235e+001 1.133150e+001 1.500000e+001 endloop endfacet facet normal 1.000000e+000 -0.000000e+000 0.000000e+000 outer loop vertex -1.252235e+001 1.133150e+001 1.500000e+001 vertex -1.252235e+001 -1.067730e+001 5.000000e+000 vertex -1.252235e+001 1.133150e+001 5.000000e+000 endloop endfacet facet normal 1.000000e+000 -0.000000e+000 0.000000e+000 outer loop vertex 1.156780e+001 -1.469280e+001 1.500000e+001 vertex 1.156780e+001 -1.469280e+001 0.000000e+000 vertex 1.156780e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal 1.000000e+000 -0.000000e+000 0.000000e+000 outer loop vertex 1.156780e+001 1.530720e+001 1.500000e+001 vertex 1.156780e+001 -1.469280e+001 0.000000e+000 vertex 1.156780e+001 1.530720e+001 0.000000e+000 endloop endfacet facet normal 1.184238e-016 -1.000000e+000 0.000000e+000 outer loop vertex -1.843220e+001 -1.469280e+001 1.500000e+001 vertex -1.843220e+001 -1.469280e+001 0.000000e+000 vertex 1.156780e+001 -1.469280e+001 1.500000e+001 endloop endfacet facet normal 1.184238e-016 -1.000000e+000 0.000000e+000 outer loop vertex 1.156780e+001 -1.469280e+001 1.500000e+001 vertex -1.843220e+001 -1.469280e+001 0.000000e+000 vertex 1.156780e+001 -1.469280e+001 0.000000e+000 endloop endfacet facet normal -1.000000e+000 -1.184238e-016 -0.000000e+000 outer loop vertex -1.843220e+001 1.530720e+001 1.500000e+001 vertex -1.843220e+001 1.530720e+001 0.000000e+000 vertex -1.843220e+001 -1.469280e+001 1.500000e+001 endloop endfacet facet normal -1.000000e+000 -1.184238e-016 0.000000e+000 outer loop vertex -1.843220e+001 -1.469280e+001 1.500000e+001 vertex -1.843220e+001 1.530720e+001 0.000000e+000 vertex -1.843220e+001 -1.469280e+001 0.000000e+000 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex 1.156780e+001 1.530720e+001 1.500000e+001 vertex 1.156780e+001 1.530720e+001 0.000000e+000 vertex -1.843220e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 1.000000e+000 0.000000e+000 outer loop vertex -1.843220e+001 1.530720e+001 1.500000e+001 vertex 1.156780e+001 1.530720e+001 0.000000e+000 vertex -1.843220e+001 1.530720e+001 0.000000e+000 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -1.252235e+001 -1.067730e+001 1.500000e+001 vertex -1.252235e+001 1.133150e+001 1.500000e+001 vertex -1.843220e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -1.843220e+001 -1.469280e+001 1.500000e+001 vertex -1.252235e+001 -1.067730e+001 1.500000e+001 vertex -1.843220e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -1.843220e+001 -1.469280e+001 1.500000e+001 vertex -9.793542e+000 -1.067730e+001 1.500000e+001 vertex -1.252235e+001 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -1.843220e+001 -1.469280e+001 1.500000e+001 vertex 1.156780e+001 -1.469280e+001 1.500000e+001 vertex -9.793542e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal -0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -9.793542e+000 -1.067730e+001 1.500000e+001 vertex 1.156780e+001 -1.469280e+001 1.500000e+001 vertex 3.422440e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -2.320538e+000 -4.613285e+000 1.500000e+001 vertex 3.422440e+000 -1.067730e+001 1.500000e+001 vertex 3.422440e+000 8.281660e+000 1.500000e+001 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -2.320538e+000 -4.613285e+000 1.500000e+001 vertex -9.793542e+000 -1.067730e+001 1.500000e+001 vertex 3.422440e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -2.320538e+000 -4.613285e+000 1.500000e+001 vertex -4.104071e+000 -4.613285e+000 1.500000e+001 vertex -9.793542e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -9.793542e+000 -1.067730e+001 1.500000e+001 vertex -4.104071e+000 -4.613285e+000 1.500000e+001 vertex -9.793542e+000 8.281660e+000 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex -3.033951e+000 -9.213713e-001 1.500000e+001 vertex 2.280978e+000 1.133150e+001 1.500000e+001 vertex -8.527233e+000 1.133150e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -8.527233e+000 1.133150e+001 1.500000e+001 vertex 2.280978e+000 1.133150e+001 1.500000e+001 vertex 1.156780e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -1.843220e+001 1.530720e+001 1.500000e+001 vertex -8.527233e+000 1.133150e+001 1.500000e+001 vertex 1.156780e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal -0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex -1.843220e+001 1.530720e+001 1.500000e+001 vertex -1.252235e+001 1.133150e+001 1.500000e+001 vertex -8.527233e+000 1.133150e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 2.280978e+000 1.133150e+001 1.500000e+001 vertex 6.347434e+000 1.133150e+001 1.500000e+001 vertex 1.156780e+001 1.530720e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 1.156780e+001 1.530720e+001 1.500000e+001 vertex 6.347434e+000 1.133150e+001 1.500000e+001 vertex 6.347434e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 0.000000e+000 1.000000e+000 outer loop vertex 1.156780e+001 -1.469280e+001 1.500000e+001 vertex 6.347434e+000 -1.067730e+001 1.500000e+001 vertex 3.422440e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 1.000000e+000 outer loop vertex 1.156780e+001 -1.469280e+001 1.500000e+001 vertex 1.156780e+001 1.530720e+001 1.500000e+001 vertex 6.347434e+000 -1.067730e+001 1.500000e+001 endloop endfacet facet normal 0.000000e+000 -0.000000e+000 -1.000000e+000 outer loop vertex -1.843220e+001 1.530720e+001 0.000000e+000 vertex 1.156780e+001 1.530720e+001 0.000000e+000 vertex -1.843220e+001 -1.469280e+001 0.000000e+000 endloop endfacet facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 outer loop vertex -1.843220e+001 -1.469280e+001 0.000000e+000 vertex 1.156780e+001 1.530720e+001 0.000000e+000 vertex 1.156780e+001 -1.469280e+001 0.000000e+000 endloop endfacet endsolidopenscad-2019.05/examples/Old/example013.dxf0000644000076500000240000003227413402025764021030 0ustar kintelstaff00000000000000999 dxflib 2.0.4.8 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $DIMGAP 40 0.625 9 $DIMEXO 40 0.625 9 $INSUNITS 70 4 9 $DIMTXT 40 2.5 9 $PLIMMAX 10 210.0 20 297.0 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 BLOCK_RECORD 5 43 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 sub1 340 0 0 BLOCK_RECORD 5 44 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 sub2 340 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 45 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 sub1 70 0 10 0.0 20 0.0 30 0.0 3 sub1 1 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 0.0 30 0.0 11 -10.0 21 10.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 10.0 30 0.0 11 0.0 21 20.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 20.0 30 0.0 11 10.0 21 10.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 10.0 30 0.0 11 10.0 21 0.0 31 0.0 0 ENDBLK 5 4A 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 4B 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 sub2 70 0 10 0.0 20 0.0 30 0.0 3 sub2 1 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 0.0 30 0.0 11 -20.0 21 10.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 10.0 30 0.0 11 -20.0 21 20.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 20.0 30 0.0 11 0.0 21 10.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 10.0 30 0.0 11 20.0 21 20.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 20.0 30 0.0 11 20.0 21 10.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 10.0 30 0.0 11 10.0 21 0.0 31 0.0 0 ENDBLK 5 52 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 53 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 sub1 10 0.0 20 10.0 30 0.0 44 1.0 45 1.0 0 INSERT 5 54 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 sub1 10 0.0 20 -10.0 30 0.0 50 180.0 44 1.0 45 1.0 0 INSERT 5 55 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 sub2 10 -10.0 20 0.0 30 0.0 50 90.0 44 1.0 45 1.0 0 INSERT 5 56 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 sub2 10 10.0 20 0.0 30 0.0 50 270.0 44 1.0 45 1.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 57 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 57 100 AcDbDictionary 281 1 3 DIMASSOC 350 59 3 HIDETEXT 350 58 0 DICTIONARYVAR 5 58 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 59 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/examples/Old/example013.scad0000644000076500000240000000155513402025764021157 0ustar kintelstaff00000000000000echo(version=version()); intersection() { linear_extrude(height = 100, center = true, convexity= 3) import(file = "example013.dxf"); rotate([0, 90, 0]) linear_extrude(height = 100, center = true, convexity= 3) import(file = "example013.dxf"); rotate([90, 0, 0]) linear_extrude(height = 100, center = true, convexity= 3) import(file = "example013.dxf"); } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example014.scad0000644000076500000240000000124113402025764021150 0ustar kintelstaff00000000000000echo(version=version()); intersection_for(i = [ [0, 0, 0], [10, 20, 300], [200, 40, 57], [20, 88, 57] ]) rotate(i) cube([100, 20, 20], center = true); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example015.scad0000644000076500000240000000177213402025764021162 0ustar kintelstaff00000000000000 module shape() { difference() { translate([ -35, -35 ]) intersection() { union() { difference() { square(100, true); square(50, true); } translate([ 50, 50 ]) square(15, true); } rotate(45) translate([ 0, -15 ]) square([ 100, 30 ]); } rotate(-45) scale([ 0.7, 1.3 ]) circle(5); } import(file = "example009.dxf", layer = "body", convexity = 6, scale=2); } echo(version=version()); // linear_extrude(convexity = 10, center = true) shape(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example016.scad0000644000076500000240000000216013402025764021153 0ustar kintelstaff00000000000000// chopped_blocks.stl is derived from Basics/LetterBlock.scad // The exported STL was converted to binary using MeshLab module blk1() { cube([ 65, 28, 28 ], center = true); } module blk2() { difference() { translate([ 0, 0, 7.5 ]) cube([ 60, 28, 14 ], center = true); cube([ 8, 32, 32 ], center = true); } } module chop() { translate([ -18, 0, 0 ]) import(file = "example016.stl", convexity = 12); } echo(version=version()); difference() { blk1(); for (alpha = [0, 90, 180, 270]) { rotate(alpha, [ 1, 0, 0]) render(convexity = 12) difference() { blk2(); chop(); } } } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example016.stl0000644000076500000240000001452413402025764021052 0ustar kintelstaff00000000000000COLOR= MATERIAL=   ppApppppAppApAppApppA?>@4-pA4-pApAppA?5ApAppApA4-pA?6Y@5ApA 5ApA >LzpA?ppApApppA4-pA? 5ApAppApA5ApA?pApApAppApA 5ApA?9A5ApApApApA6Y@5ApA?pApApA 5ApA6Y@5ApA?9A4-pApApApA9A5ApA?pAppA9A4-pA>@4-pA?pAppApApApA9A4-pA?pppApAppA4-pA?4-pA ?EdpA9EdpA?>@4-pA>@ApA ?EdpA?pppA4-pA4-pA?>@4-pA ?EdpA4-pA?ApA4-pA9EdpA?pAppApAppApA?pApApApAppApApA?pApAppAppApA?pApApApApAppApApApppppApApApApppApppApppAppAppApppApAp?A@4-@4-@?A@5A@4-@? ?Ed@ >Lz@9Ed@? >Lz@A@9Ed@? 5A@5A@A@?9A4-@>@A@>@4-@?9A5A@>@A@9A4-@?9A5A@6Y@5A@>@A@?>@A@ >Lz@ ?Ed@?6Y@5A@ >Lz@>@A@? >Lz@ 5A@A@i?>9Ed@A@ApAi?>9EdpA9Ed@ApA? ?Ed@9Ed@9EdpA? ?EdpA ?Ed@9EdpAi>>@A@ ?Ed@ ?EdpAi>>@ApA>@A@ ?EdpA?>@4-pA>@4-@>@A@?>@ApA>@4-pA>@A@?9A4-@>@4-@>@4-pA?9A4-pA9A4-@>@4-pA9A5A@9A4-@9A4-pA9A5ApA9A5A@9A4-pA6Y@5ApA6Y@5A@9A5A@9A5ApA6Y@5ApA9A5A@ԯj?̾ >LzpA >Lz@6Y@5A@ԯj?̾6Y@5ApA >LzpA6Y@5A@RiҾ 5ApA 5A@ >Lz@RiҾ >LzpA 5ApA >Lz@5ApA5A@ 5A@ 5ApA5ApA 5A@?4-pA4-@5A@?5ApA4-pA5A@?4-@4-@4-pA?4-pA4-@4-pAA@4-@4-pAApAA@4-pAApAApAppAApApAApAAppA?ȇ#B4-pA A4-pADBppA? A5ApAApApA A4-pA?B5ApAEBEd@ AA@ AApAi?>EBEdpAEBEd@ AApA?KH BEd@EBEd@EBEdpA?KH BEdpAKH BEd@EBEdpAi>ȇ#BA@KH BEd@KH BEdpAi>ȇ#BApAȇ#BA@KH BEdpA?ȇ#B4-pAȇ#B4-@ȇ#BA@?ȇ#BApAȇ#B4-pAȇ#BA@?pN/B4-@ȇ#B4-@ȇ#B4-pA?pN/B4-pApN/B4-@ȇ#B4-pApN/B5A@pN/B4-@pN/B4-pApN/B5ApApN/B5A@pN/B4-pAB5ApAB5A@pN/B5A@pN/B5ApAB5ApApN/B5A@ԯj?̾ h BLzpA h BLz@B5A@ԯj?̾B5ApA h BLzpAB5A@RiiҾ and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example018.scad0000644000076500000240000000172513402025764021163 0ustar kintelstaff00000000000000 module step(len, mod) { for (i = [0:$children-1]) { translate([ len*(i - ($children-1)/2), 0, 0 ]) children((i+mod) % $children); } } echo(version=version()); for (i = [1:4]) { translate([0, -250+i*100, 0]) step(100, i) { sphere(30); cube(60, true); cylinder(r = 30, h = 50, center = true); union() { cube(45, true); rotate([45, 0, 0]) cube(50, true); rotate([0, 45, 0]) cube(50, true); rotate([0, 0, 45]) cube(50, true); } } } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example019.scad0000644000076500000240000000136313402025764021162 0ustar kintelstaff00000000000000 function get_cylinder_h(p) = lookup(p, [ [ -200, 5 ], [ -50, 20 ], [ -20, 18 ], [ +80, 25 ], [ +150, 2 ] ]); echo(version=version()); for (i = [-100:5:+100]) { translate([ i, 0, -30 ]) cylinder(r1 = 6, r2 = 2, h = get_cylinder_h(i)*3); } // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example020.scad0000644000076500000240000000522713402025764021155 0ustar kintelstaff00000000000000 module screw(type = 2, r1 = 15, r2 = 20, n = 7, h = 100, t = 8) { linear_extrude(height = h, twist = 360*t/n, convexity = t) difference() { circle(r2); for (i = [0:n-1]) { if (type == 1) rotate(i*360/n) polygon([ [ 2*r2, 0 ], [ r2, 0 ], [ r1*cos(180/n), r1*sin(180/n) ], [ r2*cos(360/n), r2*sin(360/n) ], [ 2*r2*cos(360/n), 2*r2*sin(360/n) ], ]); if (type == 2) rotate(i*360/n) polygon([ [ 2*r2, 0 ], [ r2, 0 ], [ r1*cos(90/n), r1*sin(90/n) ], [ r1*cos(180/n), r1*sin(180/n) ], [ r2*cos(270/n), r2*sin(270/n) ], [ 2*r2*cos(270/n), 2*r2*sin(270/n) ], ]); } } } module nut(type = 2, r1 = 16, r2 = 21, r3 = 30, s = 6, n = 7, h = 100/5, t = 8/5) { difference() { cylinder($fn = s, r = r3, h = h); translate([ 0, 0, -h/2 ]) screw(type, r1, r2, n, h*2, t*2); } } module spring(r1 = 100, r2 = 10, h = 100, hr = 12) { stepsize = 1/16; module segment(i1, i2) { alpha1 = i1 * 360*r2/hr; alpha2 = i2 * 360*r2/hr; len1 = sin(acos(i1*2-1))*r2; len2 = sin(acos(i2*2-1))*r2; if (len1 < 0.01) { polygon([ [ cos(alpha1)*r1, sin(alpha1)*r1 ], [ cos(alpha2)*(r1-len2), sin(alpha2)*(r1-len2) ], [ cos(alpha2)*(r1+len2), sin(alpha2)*(r1+len2) ] ]); } if (len2 < 0.01) { polygon([ [ cos(alpha1)*(r1+len1), sin(alpha1)*(r1+len1) ], [ cos(alpha1)*(r1-len1), sin(alpha1)*(r1-len1) ], [ cos(alpha2)*r1, sin(alpha2)*r1 ], ]); } if (len1 >= 0.01 && len2 >= 0.01) { polygon([ [ cos(alpha1)*(r1+len1), sin(alpha1)*(r1+len1) ], [ cos(alpha1)*(r1-len1), sin(alpha1)*(r1-len1) ], [ cos(alpha2)*(r1-len2), sin(alpha2)*(r1-len2) ], [ cos(alpha2)*(r1+len2), sin(alpha2)*(r1+len2) ] ]); } } linear_extrude(height = 100, twist = 180*h/hr, $fn = (hr/r2)/stepsize, convexity = 5) { for (i = [ stepsize : stepsize : 1+stepsize/2 ]) segment(i-stepsize, min(i, 1)); } } echo(version=version()); translate([ -30, 0, 0 ]) screw(); translate([ 30, 0, 0 ]) nut(); spring(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example021.scad0000644000076500000240000000240413402025764021150 0ustar kintelstaff00000000000000 module thing() { $fa = 30; difference() { sphere(r = 25); cylinder(h = 62.5, r1 = 12.5, r2 = 6.25, center = true); rotate(90, [ 1, 0, 0 ]) cylinder(h = 62.5, r1 = 12.5, r2 = 6.25, center = true); rotate(90, [ 0, 1, 0 ]) cylinder(h = 62.5, r1 = 12.5, r2 = 6.25, center = true); } } module demo_proj() { linear_extrude(center = true, height = 0.5) projection(cut = false) thing(); % thing(); } module demo_cut() { for (i=[-20:5:+20]) { rotate(-30, [ 1, 1, 0 ]) translate([ 0, 0, -i ]) linear_extrude(center = true, height = 0.5) projection(cut = true) translate([ 0, 0, i ]) rotate(+30, [ 1, 1, 0 ]) thing(); } % thing(); } echo(version=version()); translate([ -30, 0, 0 ]) demo_proj(); translate([ +30, 0, 0 ]) demo_cut(); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example022.scad0000644000076500000240000000333213402025764021152 0ustar kintelstaff00000000000000// size is a vector [w, h, d] module roundedBox(size, radius, sidesonly) { rot = [ [0,0,0], [90,0,90], [90,90,0] ]; if (sidesonly) { cube(size - [2*radius,0,0], true); cube(size - [0,2*radius,0], true); for (x = [radius-size[0]/2, -radius+size[0]/2], y = [radius-size[1]/2, -radius+size[1]/2]) { translate([x,y,0]) cylinder(r=radius, h=size[2], center=true); } } else { cube([size[0], size[1]-radius*2, size[2]-radius*2], center=true); cube([size[0]-radius*2, size[1], size[2]-radius*2], center=true); cube([size[0]-radius*2, size[1]-radius*2, size[2]], center=true); for (axis = [0:2]) { for (x = [radius-size[axis]/2, -radius+size[axis]/2], y = [radius-size[(axis+1)%3]/2, -radius+size[(axis+1)%3]/2]) { rotate(rot[axis]) translate([x,y,0]) cylinder(h=size[(axis+2)%3]-2*radius, r=radius, center=true); } } for (x = [radius-size[0]/2, -radius+size[0]/2], y = [radius-size[1]/2, -radius+size[1]/2], z = [radius-size[2]/2, -radius+size[2]/2]) { translate([x,y,z]) sphere(radius); } } } echo(version=version()); translate([-15,0,0])roundedBox([20,30,40], 5, true); translate([15,0,0]) roundedBox([20,30,40], 5, false); // Written by Clifford Wolf and Marius // Kintel // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example023.scad0000644000076500000240000000231013402025764021146 0ustar kintelstaff00000000000000// Example combining MCAD/fonts.scad with search() function. use echo(version=version()); thisFont=8bit_polyfont(); x_shift=thisFont[0][0]; y_shift=thisFont[0][1]; hours=["one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"]; module clock_hour_words(word_offset=20.0,word_height=2.0) { for(i=[0:(len(hours)-1)]) { hourHandAngle=(i+1)*360/len(hours); theseIndicies=search(hours[i],thisFont[2],1,1); rotate(90-hourHandAngle) translate([word_offset,0]) for( j=[0:(len(theseIndicies)-1)] ) translate([j*x_shift,-y_shift/2]) { linear_extrude(height=word_height) polygon(points=thisFont[2][theseIndicies[j]][6][0],paths=thisFont[2][theseIndicies[j]][6][1]); } } } clock_hour_words(word_offset=16.0,word_height=5.0); // Written by Andrew Plumb // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Old/example024.scad0000644000076500000240000000220413402025764021151 0ustar kintelstaff00000000000000// Menger Sponge // Size of edge of sponge D=100; // Fractal depth (number of iterations) n=3; echo(version=version()); module menger() { difference() { cube(D, center=true); for (v=[[0,0,0], [0,0,90], [0,90,0]]) rotate(v) menger_negative(side=D, maxside=D, level=n); } } module menger_negative(side=1, maxside=1, level=1) { l=side/3; cube([maxside*1.1, l, l], center=true); if (level > 1) { for (i=[-1:1], j=[-1:1]) if (i || j) translate([0, i*l, j*l]) menger_negative(side=l, maxside=maxside, level=level-1); } } difference() { rotate([45, atan(1/sqrt(2)), 0]) menger(); translate([0,0,-D]) cube(2*D, center=true); } // Written by Nathan Hellweg, Emmett Lalish and Marius Kintel May 13, 2013 // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Parametric/candleStand.json0000644000076500000240000000325313402025764023125 0ustar kintelstaff00000000000000{ "parameterSets": { "Medium Size": { "CenterCandleWidth": "6", "candleSize": "9", "centerCandle": "true", "count": "7", "heightOfRing": "4", "heightOfSupport": "3", "holeSize": "3", "length": "50", "radius": "25", "width": "5", "widthOfRing": "23", "widthOfSupport": "3" }, "small": { "CenterCandleWidth": "4", "candleSize": "6", "centerCandle": "true", "count": "7", "heightOfRing": "2", "heightOfSupport": "2", "holeSize": "2", "length": "30", "radius": "16", "width": "4", "widthOfRing": "13", "widthOfSupport": "2" }, "With Ball": { "CenterCandleWidth": "7", "candleSize": "6", "centerCandle": "false", "count": "5", "heightOfRing": "2", "heightOfSupport": "2", "holeSize": "2", "length": "30", "radius": "16", "width": "4", "widthOfRing": "13", "widthOfSupport": "2" }, "Large": { "CenterCandleWidth": "10", "candleSize": "9", "centerCandle": "false", "count": "7", "heightOfRing": "4", "heightOfSupport": "3", "holeSize": "3", "length": "70", "radius": "25", "width": "5", "widthOfRing": "23", "widthOfSupport": "3" } }, "fileFormatVersion": "1" } openscad-2019.05/examples/Parametric/candleStand.scad0000644000076500000240000000541013402025764023063 0ustar kintelstaff00000000000000/*[ Candle Stand ]*/ //Length of candle stand length=50; // [70:large,50:medium,30:small] // Center stand cylinder(length,width-2); //Radius of ring of stand radius=25; /* [ Number of candle holders ]*/ // Number of candle holders count=7; //[3:14] //Do you want center Candle centerCandle=true; /* [ Candle Holder ]*/ //Lenght of candle holder candleSize=7; //Width of candle holder width=4; //Size of hole for candle holder holeSize=3; CenterCandleWidth=4; /*[Properties of support]*/ heightOfSupport=3; widthOfSupport=3; /*[Properties of Ring]*/ heightOfRing=4; widthOfRing=23; //Create center candle translate([0,0,length-candleSize/2]) if(centerCandle){ difference(){ $fn=360; cylinder(candleSize,r=CenterCandleWidth); cylinder(candleSize+1,r=CenterCandleWidth-2); } }else{ sphere(CenterCandleWidth); } //make ring translate([0,0,length-candleSize/2]){ make(radius, count,candleSize,length); //make bottom cover for candle holders make_ring_of(radius, count){ cylinder(1,r=width); } } //Base of candle stand for (a = [0 : count - 1]) { rotate(a*360/count) { translate([0, -width/2, 0]) cube([radius, widthOfSupport, heightOfSupport]); } } //make ring with candle holders module make(radius, count,candleSize,length){ $fa = 0.5; $fs = 0.5; difference(){ union(){ //making holders make_ring_of(radius, count){ cylinder(candleSize,r=width); } //Attaching holders to stand for (a = [0 : count - 1]) { rotate(a*360/count) { translate([0, -width/2, 0]) cube([radius, widthOfSupport, heightOfSupport]); } } // make ring linear_extrude(heightOfRing, convexity=2) difference(){ circle(radius); circle(widthOfRing); } } //Making holes in candle holder make_ring_of(radius, count){ cylinder(candleSize+1,r=holeSize); } } } module make_ring_of(radius, count){ for (a = [0 : count - 1]) { angle = a * 360 / count; translate(radius * [cos(angle), -sin(angle), 0]) children(); } } // Written by Amarjeet Singh Kapoor // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/Parametric/sign.json0000644000076500000240000000122113402025764021636 0ustar kintelstaff00000000000000{ "parameterSets": { "Welcome sign": { "Message": "Welcome to...", "To": "Parametric Designs", "height": "2", "radius": "80", "resolution": "30" }, "Congo Sign": { "Message": "Congratulations", "To": "openSCAD", "height": "2", "radius": "67", "resolution": "20" }, "Happy birthday sign": { "Message": "Happy Birthday!", "To": "To Me", "height": "2", "radius": "67", "resolution": "10" } }, "fileFormatVersion": "1" } openscad-2019.05/examples/Parametric/sign.scad0000644000076500000240000000326213402025764021606 0ustar kintelstaff00000000000000// First example of parameteric model // // syntax: // //Description // variable=value; //Parameter // // This type of comment tells the name of group to which parameters below // this comment will belong // // /*[ group name ]*/ // //Below comment tells the group to which a variable will belong /*[ properties of Sign]*/ //The resolution of the curves. Higher values give smoother curves but may increase the model render time. resolution = 10; //[10, 20, 30, 50, 100] //The horizontal radius of the outer ellipse of the sign. radius = 80;//[60 : 200] //Total height of the sign height = 2;//[1 : 10] /*[ Content To be written ] */ //Message to be write Message = "Welcome to..."; //["Welcome to...", "Happy Birthday!", "Happy Anniversary", "Congratulations", "Thank You"] //Name of Person, company etc. To = "Parametric Designs"; $fn = resolution; scale([1, 0.5]) difference() { cylinder(r = radius, h = 2 * height, center = true); translate([0, 0, height]) cylinder(r = radius - 10, h = height + 1, center = true); } linear_extrude(height = height) { translate([0, --4]) text(Message, halign = "center"); translate([0, -16]) text(To, halign = "center"); } // Written by Amarjeet Singh Kapoor // // To the extent possible under law, the author(s) have dedicated all // copyright and related and neighboring rights to this software to the // public domain worldwide. This software is distributed without any // warranty. // // You should have received a copy of the CC0 Public Domain // Dedication along with this software. // If not, see . openscad-2019.05/examples/examples.json0000644000076500000240000000226113402025764020432 0ustar kintelstaff00000000000000{ "Basics": [ "CSG.scad", "CSG-modules.scad", "logo.scad", "LetterBlock.scad", "logo_and_text.scad", "linear_extrude.scad", "rotate_extrude.scad", "text_on_cube.scad", "projection.scad" ], "Functions": [ "echo.scad", "functions.scad", "list_comprehensions.scad", "recursion.scad", "polygon_areas.scad" ], "Advanced": [ "offset.scad", "surface_image.scad", "children.scad", "children_indexed.scad", "GEB.scad", "animation.scad", "module_recursion.scad", "assert.scad" ], "Parametric": [ "sign.scad", "candleStand.scad" ], "Old": [ "example001.scad", "example002.scad", "example003.scad", "example004.scad", "example005.scad", "example006.scad", "example007.scad", "example008.scad", "example009.scad", "example010.scad", "example011.scad", "example012.scad", "example013.scad", "example014.scad", "example015.scad", "example016.scad", "example017.scad", "example018.scad", "example019.scad", "example020.scad", "example021.scad", "example022.scad", "example023.scad", "example024.scad" ] } openscad-2019.05/features/boost.prf0000644000076500000240000000530013402025764017555 0ustar kintelstaff00000000000000# Optionally specify location of boost using the # BOOSTDIR env. variable BOOST_DIR = $$(BOOSTDIR) !isEmpty(BOOST_DIR) { QMAKE_INCDIR += $$BOOST_DIR message("boost location: $$BOOST_DIR") win*: QMAKE_LIBDIR += -L$$BOOST_DIR/lib } # See https://svn.boost.org/trac/boost/ticket/6219 macx: DEFINES += __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 # MXE cross build CONFIG(mingw-cross-env)|CONFIG(mingw-cross-env-shared) { DEFINES += BOOST_THREAD_USE_LIB !CONFIG(mingw-cross-env-shared) { DEFINES += BOOST_STATIC DEFINES += Boost_USE_STATIC_LIBS } BOOST_LINK_FLAGS = -lboost_thread_win32-mt -lboost_program_options-mt -lboost_filesystem-mt -lboost_system-mt -lboost_regex-mt -lboost_chrono-mt } # MSYS2 isEmpty(BOOST_LINK_FLAGS):win32-g++ { DEFINES += BOOST_STATIC DEFINES += BOOST_THREAD_USE_LIB DEFINES += Boost_USE_STATIC_LIBS BOOST_LINK_FLAGS = -lboost_thread-mt -lboost_program_options-mt -lboost_filesystem-mt -lboost_system-mt -lboost_regex-mt } # check for OPENSCAD_LIBDIR + multithread isEmpty(BOOST_LINK_FLAGS) { OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) !isEmpty(OPENSCAD_LIBDIR) { exists($$OPENSCAD_LIBDIR/lib/libboost*thread-mt*) { BOOST_LINK_FLAGS = -lboost_thread-mt -lboost_program_options-mt -lboost_filesystem-mt -lboost_system-mt -lboost_regex-mt } else { exists($$OPENSCAD_LIBDIR/lib/libboost*thread*) { BOOST_LINK_FLAGS = -lboost_thread -lboost_program_options -lboost_filesystem -lboost_system -lboost_regex } } } } # check for BOOSTDIR + multithread isEmpty(BOOST_LINK_FLAGS) { BOOST_DIR = $$(BOOSTDIR) !isEmpty(BOOST_DIR) { exists($$BOOST_DIR/lib/libboost*thread-mt*) { BOOST_LINK_FLAGS = -lboost_thread-mt -lboost_program_options-mt -lboost_filesystem-mt -lboost_system-mt -lboost_regex-mt } else { exists($$BOOST_DIR/lib/libboost*thread*) { BOOST_LINK_FLAGS = -lboost_thread -lboost_program_options -lboost_filesystem -lboost_system -lboost_regex } } } } isEmpty(BOOST_LINK_FLAGS) { unix { BMT_TEST1 = /usr/lib64/libboost*thread-mt* BMT_TEST2 = /usr/lib/libboost*thread-mt* BMT_TEST3 = /usr/pkg/lib/libboost*thread-mt* # netbsd BMT_TEST4 = /usr/local/lib/libboost*thread-mt* # homebrew BMT_TEST5 = /opt/local/lib/libboost*thread-mt* # macports exists($$BMT_TEST1)|exists($$BMT_TEST2)|exists($$BMT_TEST3)|exists($$BMT_TEST4)|exists($$BMT_TEST5) { BOOST_LINK_FLAGS = -lboost_thread-mt -lboost_program_options-mt -lboost_filesystem-mt -lboost_system-mt -lboost_regex-mt } } } isEmpty(BOOST_LINK_FLAGS) { unix|macx { BOOST_LINK_FLAGS = -lboost_thread -lboost_program_options -lboost_filesystem -lboost_system -lboost_regex } } LIBS += $$BOOST_LINK_FLAGS openscad-2019.05/features/cgal.prf0000644000076500000240000000057113402025764017342 0ustar kintelstaff00000000000000DEFINES += ENABLE_CGAL # Optionally specify location of CGAL using the # CGALDIR env. variable CGAL_DIR = $$(CGALDIR) !isEmpty(CGAL_DIR) { QMAKE_INCDIR += $$CGAL_DIR/include QMAKE_LIBDIR += $$CGAL_DIR/lib message("CGAL location: $$CGAL_DIR") } LIBS += -lCGAL -lmpfr -lgmp *g++* { QMAKE_CXXFLAGS += -frounding-math } *clang* { QMAKE_CXXFLAGS -= -frounding-math } openscad-2019.05/features/double-conversion.prf0000644000076500000240000000003313427162620022062 0ustar kintelstaff00000000000000LIBS += -ldouble-conversionopenscad-2019.05/features/eigen.prf0000644000076500000240000000300613402025764017517 0ustar kintelstaff00000000000000# Detect eigen3 # # Priority # 0. EIGENDIR if set # 1. OPENSCAD_LIBRARIES eigen3 # 3. system's standard include paths for eigen3 # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) EIGEN_DIR = $$(EIGENDIR) # Optionally specify location of Eigen3 using the # OPENSCAD_LIBRARIES env. variable !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(EIGEN_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/eigen3) { EIGEN_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/eigen3 } } } !isEmpty(EIGEN_DIR) { EIGEN_INCLUDEPATH = $$EIGEN_DIR message("User set EIGEN location: $$EIGEN_INCLUDEPATH") } isEmpty(EIGEN_INCLUDEPATH) { linux*|hurd*|unix: EIGEN_INCLUDEPATH = /usr/include/eigen3 freebsd-g++: EIGEN_INCLUDEPATH = /usr/local/include/eigen3 netbsd*: EIGEN_INCLUDEPATH = /usr/pkg/include/eigen3 macx: EIGEN_INCLUDEPATH = /opt/local/include/eigen3 } !exists($$EIGEN_INCLUDEPATH/Eigen/Core) { EIGEN_CFLAGS = $$system("$$PKG_CONFIG --cflags eigen3") EIGEN_INCLUDEPATH = $$replace(EIGEN_CFLAGS,"-I","") } # disable Eigen SIMD optimizations for platforms where it breaks compilation !macx { !freebsd-g++ { QMAKE_CXXFLAGS += -DEIGEN_DONT_ALIGN } } # EIGEN being under 'include/eigen3' needs special prepending has_qt5 { QMAKE_INCDIR = $$EIGEN_INCLUDEPATH $$QMAKE_INCDIR } else { QMAKE_INCDIR_QT = $$EIGEN_INCLUDEPATH $$QMAKE_INCDIR_QT } # qmakespecs on netbsd prepend system includes, we need eigen first. netbsd* { QMAKE_CXXFLAGS = -I$$EIGEN_INCLUDEPATH $$QMAKE_CXXFLAGS } openscad-2019.05/features/fontconfig.prf0000644000076500000240000000206513402025764020570 0ustar kintelstaff00000000000000# Detect fontconfig, then use this priority list to determine # which library to use: # # Priority # 1. FONTCONFIG_INCLUDEPATH / FONTCONFIG_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) FONTCONFIG_DIR = $$(FONTCONFIGDIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(FONTCONFIG_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/fontconfig) { FONTCONFIG_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/fontconfig FONTCONFIG_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } } isEmpty(FONTCONFIG_INCLUDEPATH) { FONTCONFIG_CFLAGS = $$system("$$PKG_CONFIG --cflags fontconfig") } else { FONTCONFIG_CFLAGS = -I$$FONTCONFIG_INCLUDEPATH } isEmpty(FONTCONFIG_LIBPATH) { FONTCONFIG_LIBS = $$system("$$PKG_CONFIG --libs fontconfig") } else { FONTCONFIG_LIBS = -L$$FONTCONFIG_LIBPATH -lfontconfig } QMAKE_CXXFLAGS += $$FONTCONFIG_CFLAGS LIBS += $$FONTCONFIG_LIBS openscad-2019.05/features/freetype.prf0000644000076500000240000000201413402025764020251 0ustar kintelstaff00000000000000# Detect freetype2, then use this priority list to determine # which library to use: # # Priority # 1. FREETYPE_INCLUDEPATH / FREETYPE_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) FREETYPE_DIR = $$(FREETYPEDIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(FREETYPE_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/freetype2) { FREETYPE_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/freetype2 FREETYPE_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } } isEmpty(FREETYPE_INCLUDEPATH) { FREETYPE_CFLAGS = $$system("$$PKG_CONFIG --cflags freetype2") } else { FREETYPE_CFLAGS = -I$$FREETYPE_INCLUDEPATH } isEmpty(FREETYPE_LIBPATH) { FREETYPE_LIBS = $$system("$$PKG_CONFIG --libs freetype2") } else { FREETYPE_LIBS = -L$$FREETYPE_LIBPATH -lfreetype } QMAKE_CXXFLAGS += $$FREETYPE_CFLAGS LIBS += $$FREETYPE_LIBS openscad-2019.05/features/gettext.prf0000644000076500000240000000151313402025764020115 0ustar kintelstaff00000000000000# Detect gettext, then use this priority list to determine # which library to use: # # Priority # 1. GETTEXT_INCLUDEPATH / GETTEXT_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) GETTEXT_DIR = $$(GETTEXTDIR) macx: { isEmpty(GETTEXT_INCLUDEPATH) { !isEmpty(OPENSCAD_LIBRARIES_DIR) { GETTEXT_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include GETTEXT_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } !isEmpty(GETTEXT_INCLUDEPATH): GETTEXT_CXXFLAGS = -I$$GETTEXT_INCLUDEPATH !isEmpty(GETTEXT_LIBPATH): GETTEXT_LIBS = -L$$GETTEXT_LIBPATH GETTEXT_LIBS += -lintl -liconv } QMAKE_CXXFLAGS += $$GETTEXT_CXXFLAGS LIBS += $$GETTEXT_LIBS openscad-2019.05/features/glew.prf0000644000076500000240000000055113402025764017370 0ustar kintelstaff00000000000000# Optionally specify location of GLEW using the # GLEWDIR env. variable GLEW_DIR = $$(GLEWDIR) !isEmpty(GLEW_DIR) { QMAKE_INCDIR += $$GLEW_DIR/include QMAKE_LIBDIR += $$GLEW_DIR/lib QMAKE_LIBDIR += $$GLEW_DIR/lib64 } unix:LIBS += -lGLEW mingw-cross-env*: { { CONFIG += link_pkgconfig PKGCONFIG += glew } } else { win32:LIBS += -lglew32 } openscad-2019.05/features/glib-2.0.prf0000644000076500000240000000224213402025764017643 0ustar kintelstaff00000000000000# Detect glib-2.0, then use this priority list to determine # which library to use: # # Priority # 1. GLIB2_INCLUDEPATH / GLIB2_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) GLIB2_DIR = $$(GLIB2DIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(GLIB2_INCLUDEPATH) { GLIB2_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/glib-2.0 GLIB2_INCLUDEPATH_2 = $$OPENSCAD_LIBRARIES_DIR/lib/glib-2.0/include GLIB2_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } !exists($$GLIB2_INCLUDEPATH/glib.h) { !exists($$GLIB2_INCLUDEPATH_2/glib.h) { GLIB2_INCLUDEPATH = GLIB2_INCLUDEPATH_2 = GLIB2_LIBPATH = } } isEmpty(GLIB2_INCLUDEPATH) { GLIB2_CFLAGS = $$system("$$PKG_CONFIG --cflags glib-2.0") } else { GLIB2_CFLAGS = -I$$GLIB2_INCLUDEPATH GLIB2_CFLAGS += -I$$GLIB2_INCLUDEPATH_2 } isEmpty(GLIB2_LIBPATH) { GLIB2_LIBS = $$system("$$PKG_CONFIG --libs glib-2.0") } else { GLIB2_LIBS = -L$$GLIB2_LIBPATH -lglib-2.0 } QMAKE_CXXFLAGS += $$GLIB2_CFLAGS LIBS += $$GLIB2_LIBS openscad-2019.05/features/harfbuzz.prf0000644000076500000240000000200713402025764020263 0ustar kintelstaff00000000000000# Detect harfbuzz, then use this priority list to determine # which library to use: # # Priority # 1. HARFBUZZ_INCLUDEPATH / HARFBUZZ_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) HARFBUZZ_DIR = $$(HARFBUZZDIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(HARFBUZZ_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/harfbuzz) { HARFBUZZ_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/harfbuzz HARFBUZZ_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } } isEmpty(HARFBUZZ_INCLUDEPATH) { HARFBUZZ_CFLAGS = $$system("$$PKG_CONFIG --cflags harfbuzz") } else { HARFBUZZ_CFLAGS = -I$$HARFBUZZ_INCLUDEPATH } isEmpty(HARFBUZZ_LIBPATH) { HARFBUZZ_LIBS = $$system("$$PKG_CONFIG --libs harfbuzz") } else { HARFBUZZ_LIBS = -L$$HARFBUZZ_LIBPATH -lharfbuzz } QMAKE_CXXFLAGS += $$HARFBUZZ_CFLAGS LIBS += $$HARFBUZZ_LIBS openscad-2019.05/features/hidapi.prf0000644000076500000240000000300613402025764017666 0ustar kintelstaff00000000000000# Detect hidapi, then use this priority list to determine # which library to use: # # Priority # 1. HIDAPI_INCLUDEPATH / HIDAPI_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) HIDAPI_DIR = $$(HIDAPIDIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(HIDAPI_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/hidapi) { HIDAPI_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/hidapi HIDAPI_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } } win*: { # Use included HIDAPI on MXE/Windows build. HIDAPI_CFLAGS = -I$$_PRO_FILE_PWD_/src/ext/hidapi HIDAPI_LIBS = -lsetupapi HEADERS += src/ext/hidapi/hidapi.h SOURCES += src/ext/hidapi/hid.c } else { isEmpty(HIDAPI_INCLUDEPATH) { HIDAPI_CFLAGS = $$system("pkg-config --silence-errors --cflags hidapi-libusb") } else { HIDAPI_CFLAGS = -I$$HIDAPI_INCLUDEPATH } isEmpty(HIDAPI_LIBPATH) { HIDAPI_LIBS = $$system("pkg-config --silence-errors --libs hidapi-libusb") } else { macx: { HIDAPI_LIBS = -L$$HIDAPI_LIBPATH -lhidapi -framework IOKit -framework CoreFoundation } else { HIDAPI_LIBS = -L$$HIDAPI_LIBPATH -lhidapi-libusb } } } !isEmpty(HIDAPI_CFLAGS) { QMAKE_CXXFLAGS += $$HIDAPI_CFLAGS LIBS += $$HIDAPI_LIBS DEFINES += ENABLE_HIDAPI HEADERS += src/input/HidApiInputDriver.h SOURCES += src/input/HidApiInputDriver.cc } openscad-2019.05/features/lib3mf.prf0000644000076500000240000000221013441321275017577 0ustar kintelstaff00000000000000# Detect lib3mf, then use this priority list to determine # which library to use: # # Priority # 1. LIB3MF_INCLUDEPATH / LIB3MF_LIBPATH (env or qmake) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths # read environment variables if not set as qmake parameter isEmpty(LIB3MF_INCLUDEPATH) { LIB3MF_INCLUDEPATH = $$(LIB3MF_INCLUDEPATH) } isEmpty(LIB3MF_LIBPATH) { LIB3MF_LIBPATH = $$(LIB3MF_LIBPATH) } exists($$LIB3MF_INCLUDEPATH/Model/COM/NMR_DLLInterfaces.h) { ENABLE_LIB3MF=yes } else { LIB3MF_INCLUDEPATH = LIB3MF_LIBPATH = } isEmpty(LIB3MF_INCLUDEPATH) { LIB3MF_CFLAGS = $$system("$$PKG_CONFIG --cflags lib3MF") !isEmpty(LIB3MF_CFLAGS) { ENABLE_LIB3MF=yes } } else { LIB3MF_CFLAGS = -I$$LIB3MF_INCLUDEPATH } isEmpty(LIB3MF_LIBPATH) { LIB3MF_LIBS = $$system("$$PKG_CONFIG --libs lib3MF") !isEmpty(LIB3MF_LIBS) { ENABLE_LIB3MF=yes } } else { LIB3MF_LIBS = -L$$LIB3MF_LIBPATH -l3MF } !isEmpty(ENABLE_LIB3MF) { DEFINES += ENABLE_LIB3MF QMAKE_CXXFLAGS += $$LIB3MF_CFLAGS LIBS += $$LIB3MF_LIBS message("3MF Import/Export enabled") } else { message("3MF Import/Export disabled") } openscad-2019.05/features/libxml2.prf0000644000076500000240000000177713402025764020016 0ustar kintelstaff00000000000000# Detect libxml2, then use this priority list to determine # which library to use: # # Priority # 1. LIBXML2_INCLUDEPATH / LIBXML2_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config libxml2 { # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) LIBXML2_DIR = $$(LIBXML2DIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(LIBXML2_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/libxml2) { LIBXML2_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include/libxml2 LIBXML2_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } } isEmpty(LIBXML2_INCLUDEPATH) { LIBXML2_CFLAGS = $$system("$$PKG_CONFIG --cflags libxml-2.0") } else { LIBXML2_CFLAGS = -I$$LIBXML2_INCLUDEPATH } isEmpty(LIBXML2_LIBPATH) { LIBXML2_LIBS = $$system("$$PKG_CONFIG --libs libxml-2.0") } else { LIBXML2_LIBS = -L$$LIBXML2_LIBPATH -lxml2 } QMAKE_CXXFLAGS += $$LIBXML2_CFLAGS LIBS += $$LIBXML2_LIBS } openscad-2019.05/features/libzip.prf0000644000076500000240000000152513402025764017725 0ustar kintelstaff00000000000000# Detect libzip, then use this priority list to determine # which library to use: # # Priority # 1. LIBZIP_INCLUDEPATH / LIBZIP_LIBPATH (qmake parameter, not checked it given on commandline) # 3. system's standard include paths from pkg-config exists($$LIBZIP_INCLUDEPATH/zip.h) { ENABLE_LIBZIP=yes } else { LIBZIP_INCLUDEPATH = LIBZIP_LIBPATH = } isEmpty(LIBZIP_INCLUDEPATH) { LIBZIP_CFLAGS = $$system("$$PKG_CONFIG --cflags libzip") !isEmpty(LIBZIP_CFLAGS) { ENABLE_LIBZIP=yes } } else { LIBZIP_CFLAGS = -I$$LIBZIP_INCLUDEPATH } isEmpty(LIBZIP_LIBPATH) { LIBZIP_LIBS = $$system("$$PKG_CONFIG --libs libzip") !isEmpty(LIBZIP_LIBS) { ENABLE_LIBZIP=yes } } else { LIBZIP_LIBS = -L$$LIBZIP_LIBPATH -lzip } !isEmpty(ENABLE_LIBZIP) { DEFINES += ENABLE_LIBZIP QMAKE_CXXFLAGS += $$LIBZIP_CFLAGS LIBS += $$LIBZIP_LIBS } openscad-2019.05/features/opencsg.prf0000644000076500000240000000045513402025764020073 0ustar kintelstaff00000000000000DEFINES += ENABLE_OPENCSG # Optionally specify location of OpenCSG using the # OPENCSGDIR env. variable OPENCSG_DIR = $$(OPENCSGDIR) !isEmpty(OPENCSG_DIR) { QMAKE_INCDIR += $$OPENCSG_DIR/include QMAKE_LIBDIR += $$OPENCSG_DIR/lib message("OpenCSG location: $$OPENCSG_DIR") } LIBS += -lopencsg openscad-2019.05/features/qscintilla2-priv.prf0000644000076500000240000000107613410050067021631 0ustar kintelstaff00000000000000greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets printsupport greaterThan(QT_MINOR_VERSION, 1) { macx:QT += macextras } } DEFINES += QSCINTILLA_DLL INCLUDEPATH += $$[QT_INSTALL_HEADERS] LIBS += -L$$[QT_INSTALL_LIBS] CONFIG(debug, debug|release) { mac: { LIBS += -lqscintilla2_qt$${QT_MAJOR_VERSION} } else { win32: { LIBS += -lqscintilla2_qt$${QT_MAJOR_VERSION}d } else { LIBS += -lqscintilla2_qt$${QT_MAJOR_VERSION} } } } else { LIBS += -lqscintilla2_qt$${QT_MAJOR_VERSION} } openscad-2019.05/features/scintilla.prf0000644000076500000240000000267113402025764020421 0ustar kintelstaff00000000000000HEADERS += src/scintillaeditor.h src/scadlexer.h SOURCES += src/scintillaeditor.cpp src/scadlexer.cpp DEFINES += USE_SCINTILLA_EDITOR QSCILOADED = OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) !isEmpty(OPENSCAD_LIBDIR) { exists($$OPENSCAD_LIBDIR) { exists($$OPENSCAD_LIBDIR/lib/x86_64-linux-gnu/qt5/mkspecs/features/qscintilla2.prf) { include($$OPENSCAD_LIBDIR/lib/x86_64-linux-gnu/qt5/mkspecs/features/qscintilla2.prf) INCLUDEPATH = $$OPENSCAD_LIBDIR/include/qt5 $$INCLUDEPATH LIBS = -L$$OPENSCAD_LIBDIR/lib/x86_64-linux-gnu $$LIBS QSCILOADED=yes } } } mingw-cross-env*: { load(qscintilla2) { # MinGW/MXE has good *.prf file. QSCILOADED=yes } } else { mingw*: { load(qscintilla2) { # MSYS2 QSCILOADED=yes } } } # The qscintilla2.prf which ships with QScintilla is broken for Mac/Windows # debug builds, so we supply our own isEmpty(QSCILOADED) { win32|macx: { include(qscintilla2-priv.prf) QSCILOADED=yes } } isEmpty(QSCILOADED) { load(qscintilla2) { QSCILOADED=yes # All good, found installed *.prf file. } } isEmpty(QSCILOADED) { # Older scintilla libs (e.g. 2.7.2 on fedora20) do not provide the # prf file. # # In addition Ubuntu (and maybe other distributions) have the Qt5 # prf file in the wrong location so it's not picked up by qmake # message("Using local copy of qscintilla2.prf instead.") include(qscintilla2-priv.prf) QSCILOADED=yes } openscad-2019.05/features/sparkle.prf0000644000076500000240000000043313402025764020072 0ustar kintelstaff00000000000000OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) !isEmpty(OPENSCAD_LIBRARIES_DIR) { QMAKE_OBJECTIVE_CFLAGS +=-F$$OPENSCAD_LIBRARIES_DIR/lib QMAKE_LFLAGS +=-F$$OPENSCAD_LIBRARIES_DIR/lib } LIBS += -framework Sparkle HEADERS += src/SparkleAutoUpdater.h DEFINES += OPENSCAD_UPDATER openscad-2019.05/features/spnav.prf0000644000076500000240000000235613402025764017566 0ustar kintelstaff00000000000000# Detect spnav, then use this priority list to determine # which library to use: # # Priority # 1. SPNAV_INCLUDEPATH / SPNAV_LIBPATH (qmake parameter, not checked it given on commandline) # 2. OPENSCAD_LIBRARIES (environment variable) # 3. system's standard include paths from pkg-config # read environment variables OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES) SPNAV_DIR = $$(SPNAVDIR) !isEmpty(OPENSCAD_LIBRARIES_DIR) { isEmpty(SPNAV_INCLUDEPATH) { exists($$OPENSCAD_LIBRARIES_DIR/include/spnav.h) { SPNAV_INCLUDEPATH = $$OPENSCAD_LIBRARIES_DIR/include SPNAV_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib } } } !win*: { isEmpty(SPNAV_INCLUDEPATH) { exists(/usr/include/spnav.h) { SPNAV_INCLUDEPATH = /usr/include SPNAV_LIBPATH = /usr/lib } exists(/usr/local/include/spnav.h) { SPNAV_INCLUDEPATH = /usr/local/include SPNAV_LIBPATH = /usr/local/lib } exists(/opt/include/spnav.h) { SPNAV_INCLUDEPATH = /opt/include SPNAV_LIBPATH = /opt/lib } } } !isEmpty(SPNAV_INCLUDEPATH) { QMAKE_CXXFLAGS += -I$$SPNAV_INCLUDEPATH LIBS += -L$$SPNAV_LIBPATH -lspnav DEFINES += ENABLE_SPNAV HEADERS += src/input/SpaceNavInputDriver.h SOURCES += src/input/SpaceNavInputDriver.cc } openscad-2019.05/flex.pri0000644000076500000240000000066013402025764015556 0ustar kintelstaff00000000000000{ flex.name = Flex ${QMAKE_FILE_IN} flex.input = FLEXSOURCES flex.output = $${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx flex.commands = flex -o $${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx --header-file=$${OBJECTS_DIR}/${QMAKE_FILE_BASE}.hxx ${QMAKE_FILE_IN} flex.CONFIG += target_predeps flex.variable_out = GENERATED_SOURCES silent:flex.commands = @echo Lex ${QMAKE_FILE_IN} && $$flex.commands QMAKE_EXTRA_COMPILERS += flex } openscad-2019.05/fonts-osx/conf.d/10-scale-bitmap-fonts.conf0000644000076500000240000000364013402025764023771 0ustar kintelstaff00000000000000 false pixelsize pixelsize false pixelsizefixupfactor 1.2 pixelsizefixupfactor 0.8 false 64 true true 1.0 false 1.0 matrix pixelsizefixupfactor 0 0 pixelsizefixupfactor size pixelsizefixupfactor openscad-2019.05/fonts-osx/conf.d/20-unhint-small-vera.conf0000644000076500000240000000235313402025764023650 0ustar kintelstaff00000000000000 Bitstream Vera Sans 7.5 false Bitstream Vera Serif 7.5 false Bitstream Vera Sans Mono 7.5 false openscad-2019.05/fonts-osx/conf.d/30-metric-aliases.conf0000644000076500000240000002632713402025764023214 0ustar kintelstaff00000000000000 Nimbus Sans L Helvetica TeX Gyre Heros Helvetica TeX Gyre Heros Cn Helvetica Condensed Nimbus Roman No9 L Times Nimbus Mono L Courier TeX Gyre Cursor Courier Avant Garde ITC Avant Garde Gothic URW Gothic L ITC Avant Garde Gothic TeX Gyre Adventor ITC Avant Garde Gothic Bookman ITC Bookman URW Bookman L ITC Bookman TeX Gyre Bonum ITC Bookman Bookman Old Style ITC Bookman Zapf Chancery ITC Zapf Chancery URW Chancery L ITC Zapf Chancery TeX Gyre Chorus ITC Zapf Chancery URW Palladio L Palatino TeX Gyre Pagella Palatino Palatino Linotype Palatino Century Schoolbook L New Century Schoolbook TeX Gyre Schola New Century Schoolbook Century Schoolbook New Century Schoolbook Arimo Arial Liberation Sans Arial Liberation Sans Narrow Arial Narrow Albany Arial Albany AMT Arial Tinos Times New Roman Liberation Serif Times New Roman Thorndale Times New Roman Thorndale AMT Times New Roman Cousine Courier New Liberation Mono Courier New Cumberland Courier New Cumberland AMT Courier New Gelasio Georgia Caladea Cambria Carlito Calibri SymbolNeu Symbol Helvetica Arial Helvetica Condensed Arial Narrow Times Times New Roman Courier Courier New Arial Helvetica Arial Narrow Helvetica Condensed Times New Roman Times Courier New Courier Helvetica TeX Gyre Heros Nimbus Sans L Helvetica Condensed TeX Gyre Heros Cn Times Nimbus Roman No9 L Courier TeX Gyre Cursor Nimbus Mono L ITC Avant Garde Gothic TeX Gyre Adventor URW Gothic L ITC Bookman Bookman Old Style TeX Gyre Bonum URW Bookman L ITC Zapf Chancery TeX Gyre Chorus URW Chancery L Palatino Palatino Linotype TeX Gyre Pagella URW Palladio L New Century Schoolbook Century Schoolbook TeX Gyre Schola Century Schoolbook L Arial Arimo Liberation Sans Albany Albany AMT Arial Narrow Liberation Sans Narrow Times New Roman Tinos Liberation Serif Thorndale Thorndale AMT Courier New Cousine Liberation Mono Cumberland Cumberland AMT Georgia Gelasio Cambria Caladea Calibri Carlito Symbol SymbolNeu openscad-2019.05/fonts-osx/conf.d/30-urw-aliases.conf0000644000076500000240000000127513402025764022541 0ustar kintelstaff00000000000000 Zapf Dingbats Dingbats ITC Zapf Dingbats Dingbats Symbol Standard Symbols L openscad-2019.05/fonts-osx/conf.d/40-nonlatin.conf0000644000076500000240000001207613402025764022131 0ustar kintelstaff00000000000000 Nazli serif Lotoos serif Mitra serif Ferdosi serif Badr serif Zar serif Titr serif Jadid serif Kochi Mincho serif AR PL SungtiL GB serif AR PL Mingti2L Big5 serif MS 明朝 serif NanumMyeongjo serif UnBatang serif Baekmuk Batang serif MgOpen Canonica serif Sazanami Mincho serif AR PL ZenKai Uni serif ZYSong18030 serif FreeSerif serif SimSun serif Arshia sans-serif Elham sans-serif Farnaz sans-serif Nasim sans-serif Sina sans-serif Roya sans-serif Koodak sans-serif Terafik sans-serif Kochi Gothic sans-serif AR PL KaitiM GB sans-serif AR PL KaitiM Big5 sans-serif MS ゴシック sans-serif NanumGothic sans-serif UnDotum sans-serif Baekmuk Dotum sans-serif MgOpen Modata sans-serif Sazanami Gothic sans-serif AR PL ShanHeiSun Uni sans-serif ZYSong18030 sans-serif FreeSans sans-serif NSimSun monospace ZYSong18030 monospace NanumGothicCoding monospace FreeMono monospace Homa fantasy Kamran fantasy Fantezi fantasy Tabassom fantasy IranNastaliq cursive Nafees Nastaleeq cursive openscad-2019.05/fonts-osx/conf.d/45-latin.conf0000644000076500000240000001034413402025764021417 0ustar kintelstaff00000000000000 Bitstream Vera Serif serif DejaVu Serif serif Liberation Serif serif Times New Roman serif Times serif Nimbus Roman No9 L serif Luxi Serif serif Thorndale AMT serif Thorndale serif Georgia serif Garamond serif Palatino Linotype serif Trebuchet MS serif Bitstream Vera Sans sans-serif DejaVu Sans sans-serif Liberation Sans sans-serif Arial sans-serif Helvetica sans-serif Verdana sans-serif Albany AMT sans-serif Albany sans-serif Nimbus Sans L sans-serif Luxi Sans sans-serif Bitstream Vera Sans Mono monospace DejaVu Sans Mono monospace Liberation Mono monospace Inconsolata monospace Courier New monospace Courier monospace Andale Mono monospace Luxi Mono monospace Cumberland AMT monospace Cumberland monospace Nimbus Mono L monospace Impact fantasy Copperplate Gothic Std fantasy Cooper Std fantasy Bauhaus Std fantasy ITC Zapf Chancery Std cursive Zapfino cursive Comic Sans MS cursive openscad-2019.05/fonts-osx/conf.d/49-sansserif.conf0000644000076500000240000000104113402025764022303 0ustar kintelstaff00000000000000 sans-serif serif monospace sans-serif openscad-2019.05/fonts-osx/conf.d/50-user.conf0000644000076500000240000000124113402025764021256 0ustar kintelstaff00000000000000 fontconfig/conf.d fontconfig/fonts.conf ~/.fonts.conf.d ~/.fonts.conf openscad-2019.05/fonts-osx/conf.d/51-local.conf0000644000076500000240000000027513402025764021401 0ustar kintelstaff00000000000000 local.conf openscad-2019.05/fonts-osx/conf.d/60-latin.conf0000644000076500000240000000324513402025764021416 0ustar kintelstaff00000000000000 serif Bitstream Vera Serif DejaVu Serif Times New Roman Thorndale AMT Luxi Serif Nimbus Roman No9 L Times sans-serif Bitstream Vera Sans DejaVu Sans Verdana Arial Albany AMT Luxi Sans Nimbus Sans L Helvetica Lucida Sans Unicode BPG Glaho International Tahoma monospace Bitstream Vera Sans Mono DejaVu Sans Mono Inconsolata Andale Mono Courier New Cumberland AMT Luxi Mono Nimbus Mono L Courier fantasy Impact Copperplate Gothic Std Cooper Std Bauhaus Std cursive ITC Zapf Chancery Std Zapfino Comic Sans MS openscad-2019.05/fonts-osx/conf.d/65-fonts-persian.conf0000644000076500000240000002360613402025764023107 0ustar kintelstaff00000000000000 Nesf Nesf2 Nesf2 Persian_sansserif_default Nazanin Nazli Lotus Lotoos Yaqut Yaghoot Yaghut Yaghoot Traffic Terafik Ferdowsi Ferdosi Fantezy Fantezi Jadid Persian_title Titr Persian_title Kamran Persian_fantasy Homa Homa Persian_fantasy Kamran Fantezi Persian_fantasy Tabassom Persian_fantasy Arshia Persian_square Nasim Persian_square Elham Persian_square Farnaz Farnaz Persian_square Elham Sina Persian_square Persian_title Titr Jadid Persian_serif Persian_fantasy Homa Kamran Fantezi Tabassom Persian_square Persian_square Arshia Elham Farnaz Nasim Sina Persian_serif Elham farsiweb Homa farsiweb Koodak farsiweb Nazli farsiweb Roya farsiweb Terafik farsiweb Titr farsiweb TURNED-OFF farsiweb roman roman matrix 1-0.2 01 oblique farsiweb false false false serif Nazli Lotoos Mitra Ferdosi Badr Zar sans-serif Roya Koodak Terafik monospace Terafik fantasy Homa Kamran Fantezi Tabassom cursive IranNastaliq Nafees Nastaleeq serif 200 24 Titr sans-serif 200 24 Titr Persian_sansserif_default 200 24 Titr Persian_sansserif_default Roya openscad-2019.05/fonts-osx/conf.d/65-nonlatin.conf0000644000076500000240000001742713402025764022145 0ustar kintelstaff00000000000000 serif Artsounk BPG UTF8 M Kinnari Norasi Frank Ruehl Dror JG LaoTimes Saysettha Unicode Pigiarniq B Davat B Compset Kacst-Qr Urdu Nastaliq Unicode Raghindi Mukti Narrow malayalam Sampige padmaa Hapax Berbère MS Mincho SimSun PMingLiu WenQuanYi Zen Hei WenQuanYi Bitmap Song AR PL ShanHeiSun Uni AR PL New Sung ZYSong18030 HanyiSong MgOpen Canonica Sazanami Mincho IPAMonaMincho IPAMincho Kochi Mincho AR PL SungtiL GB AR PL Mingti2L Big5 AR PL Zenkai Uni MS 明朝 ZYSong18030 NanumMyeongjo UnBatang Baekmuk Batang KacstQura Frank Ruehl CLM Lohit Bengali Lohit Gujarati Lohit Hindi Lohit Marathi Lohit Maithili Lohit Kashmiri Lohit Konkani Lohit Nepali Lohit Sindhi Lohit Punjabi Lohit Tamil Meera Lohit Malayalam Lohit Kannada Lohit Telugu Lohit Oriya LKLUG sans-serif Nachlieli Lucida Sans Unicode Yudit Unicode Kerkis ArmNet Helvetica Artsounk BPG UTF8 M Waree Loma Garuda Umpush Saysettha Unicode JG Lao Old Arial GF Zemen Unicode Pigiarniq B Davat B Compset Kacst-Qr Urdu Nastaliq Unicode Raghindi Mukti Narrow malayalam Sampige padmaa Hapax Berbère MS Gothic UmePlus P Gothic SimSun PMingLiu WenQuanYi Zen Hei WenQuanYi Bitmap Song AR PL ShanHeiSun Uni AR PL New Sung MgOpen Modata VL Gothic IPAMonaGothic IPAGothic Sazanami Gothic Kochi Gothic AR PL KaitiM GB AR PL KaitiM Big5 AR PL ShanHeiSun Uni AR PL SungtiL GB AR PL Mingti2L Big5 MS ゴシック ZYSong18030 TSCu_Paranar NanumGothic UnDotum Baekmuk Dotum Baekmuk Gulim KacstQura Lohit Bengali Lohit Gujarati Lohit Hindi Lohit Marathi Lohit Maithili Lohit Kashmiri Lohit Konkani Lohit Nepali Lohit Sindhi Lohit Punjabi Lohit Tamil Meera Lohit Malayalam Lohit Kannada Lohit Telugu Lohit Oriya LKLUG monospace Miriam Mono VL Gothic IPAMonaGothic IPAGothic Sazanami Gothic Kochi Gothic AR PL KaitiM GB MS Gothic UmePlus Gothic NSimSun MingLiu AR PL ShanHeiSun Uni AR PL New Sung Mono HanyiSong AR PL SungtiL GB AR PL Mingti2L Big5 ZYSong18030 NanumGothicCoding NanumGothic UnDotum Baekmuk Dotum Baekmuk Gulim TlwgTypo TlwgTypist TlwgTypewriter TlwgMono Hasida Mitra Mono GF Zemen Unicode Hapax Berbère Lohit Bengali Lohit Gujarati Lohit Hindi Lohit Marathi Lohit Maithili Lohit Kashmiri Lohit Konkani Lohit Nepali Lohit Sindhi Lohit Punjabi Lohit Tamil Meera Lohit Malayalam Lohit Kannada Lohit Telugu Lohit Oriya LKLUG openscad-2019.05/fonts-osx/conf.d/69-unifont.conf0000644000076500000240000000124013402025764021773 0ustar kintelstaff00000000000000 serif FreeSerif Code2000 Code2001 sans-serif FreeSans Arial Unicode MS Arial Unicode Code2000 Code2001 monospace FreeMono openscad-2019.05/fonts-osx/conf.d/80-delicious.conf0000644000076500000240000000064613402025764022273 0ustar kintelstaff00000000000000 Delicious Heavy heavy openscad-2019.05/fonts-osx/conf.d/90-synthetic.conf0000644000076500000240000000323313402025764022321 0ustar kintelstaff00000000000000 roman roman matrix 10.2 01 oblique false medium medium true bold openscad-2019.05/fonts-osx/conf.d/README0000644000076500000240000000172213402025764020073 0ustar kintelstaff00000000000000conf.d/README Each file in this directory is a fontconfig configuration file. Fontconfig scans this directory, loading all files of the form [0-9][0-9]*.conf. These files are normally installed in /usr/share/fontconfig/conf.avail and then symlinked here, allowing them to be easily installed and then enabled/disabled by adjusting the symlinks. The files are loaded in numeric order, the structure of the configuration has led to the following conventions in usage: Files begining with: Contain: 00 through 09 Font directories 10 through 19 system rendering defaults (AA, etc) 20 through 29 font rendering options 30 through 39 family substitution 40 through 49 generic identification, map family->generic 50 through 59 alternate config file loading 60 through 69 generic aliases, map generic->family 70 through 79 select font (adjust which fonts are available) 80 through 89 match target="scan" (modify scanned patterns) 90 through 99 font synthesis openscad-2019.05/fonts-osx/fonts.conf0000644000076500000240000001245213433421325020043 0ustar kintelstaff00000000000000 /usr/share/fonts fonts ~/.fonts mono monospace sans serif sans-serif sans sans-serif conf.d fontconfig ~/.fontconfig 0x0020 0x00A0 0x00AD 0x034F 0x0600 0x0601 0x0602 0x0603 0x06DD 0x070F 0x115F 0x1160 0x1680 0x17B4 0x17B5 0x180E 0x2000 0x2001 0x2002 0x2003 0x2004 0x2005 0x2006 0x2007 0x2008 0x2009 0x200A 0x200B 0x200C 0x200D 0x200E 0x200F 0x2028 0x2029 0x202A 0x202B 0x202C 0x202D 0x202E 0x202F 0x205F 0x2060 0x2061 0x2062 0x2063 0x206A 0x206B 0x206C 0x206D 0x206E 0x206F 0x2800 0x3000 0x3164 0xFEFF 0xFFA0 0xFFF9 0xFFFA 0xFFFB 30 openscad-2019.05/fonts/05-osx-fonts.conf0000644000076500000240000000056613402025764020273 0ustar kintelstaff00000000000000 /usr/X11/lib/X11/fonts /System/Library/Fonts /Library/Fonts ~/Library/Fonts /usr/local/var/cache/fontconfig /opt/local/var/cache/fontconfig /usr/X11/var/cache/fontconfig openscad-2019.05/fonts/10-liberation.conf0000644000076500000240000000075513402025764020457 0ustar kintelstaff00000000000000 sans-serif Liberation Sans serif Liberation Serif monospace Liberation Mono openscad-2019.05/fonts/Liberation-2.00.1/AUTHORS0000644000076500000240000000036213402025764021110 0ustar kintelstaff00000000000000AUTHORS Current Contributors (sorted alphabetically): - Pravin Satpute Project Owner (Current) Red Hat, Inc. Previous Contributors - Steve Matteson Original Designer Ascender, Inc. openscad-2019.05/fonts/Liberation-2.00.1/ChangeLog0000644000076500000240000000144613402025764021616 0ustar kintelstaff00000000000000* Thu Oct 04 2012 Pravin Satpute - Resolved "Glyphs with multiple unicode encodings inhibit subsetting" #851790 - Resolved #851791, #854601 and #851825 - Following GASP table version as per Liberation old version. (Anti-aliasing disabled) - Added support for Serbian glyphs for wikipedia #657849 - In Monospace fonts, isFixedPitch bit set via script for getting it recognized as Monospace in putty.exe * Fri Jul 06 2012 Pravin Satpute - Initial version of Liberation fonts based on croscore fonts version 1.21.0 - Converted TTF files into SFD files to be open source. - Update Copyright and License file - set fsType bit to 0, Installable Embedding is allowed. - Absolute value in HHeadAscent/Descent values for maintaining Metric compatibility. openscad-2019.05/fonts/Liberation-2.00.1/LICENSE0000644000076500000240000001047613402025764021054 0ustar kintelstaff00000000000000Digitized data copyright (c) 2010 Google Corporation with Reserved Font Arimo, Tinos and Cousine. Copyright (c) 2012 Red Hat, Inc. with Reserved Font Name Liberation. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting ? in part or in whole ? any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components,in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. openscad-2019.05/fonts/Liberation-2.00.1/README0000644000076500000240000000367113402025764020726 0ustar kintelstaff00000000000000 1. What's this? ================= The Liberation Fonts is font collection which aims to provide document layout compatibility as usage of Times New Roman, Arial, Courier New. 2. Requirements ================= * fontforge is installed. (http://fontforge.sourceforge.net) 3. Install ============ 3.1 Decompress tarball You can extract the files by following command: $ tar zxvf liberation-fonts-[VERSION].tar.gz 3.2 Build from the source Change into directory liberation-fonts-[VERSION]/ and build from sources by following commands: $ cd liberation-fonts-[VERSION] $ make The built font files will be available in 'build' directory. 3.3 Install to system For Fedora, you could manually install the fonts by copying the TTFs to ~/.fonts for user wide usage, or to /usr/share/fonts/truetype/liberation for system-wide availability. Then, run "fc-cache" to let that cached. For other distributions, please check out corresponding documentation. 4. Usage ========== Simply select preferred liberation font in applications and start using. 5. License ============ This Font Software is licensed under the SIL Open Font License, Version 1.1. Please read file "LICENSE" for details. 6. For Maintainers ==================== Before packaging a new release based on a new source tarball, you have to update the version suffix in the Makefile: VER = [VERSION] Make sure that the defined version corresponds to the font software metadata which you can check with ftinfo/otfinfo or fontforge itself. It is highly recommended that file 'ChangeLog' is updated to reflect changes. Create a tarball with the following command: $ make dist The new versioned tarball will be available in the dist/ folder as 'liberation-fonts-[NEW_VERSION].tar.gz'. 7. Credits ============ Please read file "AUTHORS" for list of contributors. openscad-2019.05/fonts/Liberation-2.00.1/TODO0000644000076500000240000000053613402025764020533 0ustar kintelstaff00000000000000Here are todo for next release 1) Serbian glyph for wikipedia https://bugzilla.redhat.com/show_bug.cgi?id=657849 - Improving shape of S_BE https://bugzilla.redhat.com/show_bug.cgi?id=657849#c96 2) Liberation Mono not recognizing as Mono in Windows application #861003 - presently it is patch, we have to update zero width characters to fixed width openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationMono-Bold.ttf0000644000076500000240000111516413402025764025163 0ustar kintelstaff00000000000000 FFTMa aclGDEFypcGPOSCd3>GSUB(k_P"OS/2Ľ<`cmapC'h.cvt C|7;Hfpgm~a-gasp c\glyf6 c\headq,6hhead9d$hmtxB%`loca =%dmaxp  nameT post<ȕ*[prep'5L1&_<̓G̓G%%z X X"H]/\33af  @x1ASC #Tg`:E ;EX3eDYu{]Gh}mrFeeeJ,PPfcHH&=Wu[-[jnadu|vuvE\ay 1&_bIf!k!TD&eosY |PHHHHHf.jjjjjjnddddvvvvT\\\\\e\&&jjjPnPnPnPn\dddddP|P|P|P| vvvvvIfvvEvvqH\H\H\&y&y&y&y==4> &WWWuPPbEaESHJPKvEHHH\4+@}d=2cN2nzeb""PPP9jvH\djjP%P|H\H\d""P|Yj.\3joQdFFvH3H\M3_=&y=F&@9WjdH\H\H\H\&b]P'T fuHa&3ax&aadd0`/]k||\5}vwvvKKE\2>\&z&J '5Ddxjp\rHPg:ajp3*41U(>VX%CEee>>44$ttttttss4A:a^s@,8,nnn))D`IIGSs@HiiD/Rn/ =DLo/ooC1SSSSSSS**ZxnxFwW>csHd= .2FowF$LowC(\P))I/w\/g\.$H\Pn5GAT @^ L[o$YnuH\wPc<PPPP&fMcHP= AYYO9Vjfdbc\nn&11oOOcfF dd yvvu\ &?&cK5>DYO:FPH\H\?D?%k(tbYvqHHGwPn=n55:ASAm  ATccvjjdHdHdb.dH\H\H\9f&&&AoOc(t112auHKP\ JHa ;\qq;9VVw/H#L'PmbNqm5qf?{N7 /n9v<\55lEEJRI  L   .55;TT+au0jzsH``& au(zEyG1j66d_<xUd5/sTWZ#? +yXXojPnaaaaaddddduP|vvvvvvcEcEcEH\H\H\H\&y&y&y&y&y====     11&WWW &juajjj3jjjjjjjjddddg?dddvvH\H\H\H3H\H\H\H\H\H\H\H\&&&&FFFFFFFF//oooooooo//""wwwwwwww=/""\\\\\\qq';////////qqeeFFooww\\//FFFFFFFFoooooooo//""////////qqeeFFFFFFFooooo77wwwwww7/  /////MM2 L-oq?pzA;MedxG1PP%[E-!\G=-PP\2^ 1>xvvvvMhe<4_[t[osjjjjjjjfwhh4nh%%n<fafpJ^jiWH D)b?.5BPqmN7TLBP=b=}qqf{N7Lf'ERE)P@C#v7vFFFFFFFFwwwwwwwwvHEUW}}'''qI$~~6ou~EMWY[]}   " & . 0 4 : < > D ^ o  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# 8tz HPY[]_   & * 0 2 9 < > D ^ j  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 7/*wg\"(% 9,?>52/,)" EBA$"!+(ډaa$    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvj72s9:gw*-,q5l|Zcn1T6+m}bx:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A+SMURMUVTUTO3NUL3MUMM==<U<:U;=:U54A-444.U3H2U22.U1=0U00.U/=.U .`.. ..U-=U,ADD>UCBB>UA@U@>U?=>@UF<F?oO_/?+=*U=UA)U)) )P)`))@@ $F(@`(=U=UA *U *P****@ӯ<@F!< @ <`@(/O@ г2HA/O_o@@'F<P`@F@ F<P`2U/''''@" (P` P0A$@$P$_###@(`oϖߖGE<FEdAO0p@?/?@'''/@ FO_@w,vs(ustssP,,@F@0F,pF2oF2nFU3U3Ub_$a_$`_$_Pp  ^F$O@\F[Z2ZF2UU2U@! SPRPQPNFLF.KKFF(@ @o FJFIIPIIF ?HOHHFGFFFFFdUU2UU2UU2U?_/Oo?oOTS++KRK P[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++++t++t+st++++t+++++s+++++++s+s+++++++++++++s+++++++ss+ssts+++stsssttuuu++sts+ssstusss+s+ss+s+++s++st++ssss+s+s+st++++t+s+sss+++++s+s+stsssst+++sss++s++++++s+++st++s++s++s++++s++++++}ENE:wbW&' %Zsu!;1n>U`m:[s}&e}E M pMMdd my c(#mlTDE, hc x{wHHHH8,(4p 0 X P d t h4$$p`4P x !T!!"0"""#$%4%&''(|()p)*D++,,-p-./@/0$012P23h34L445L6(70788:@:;<=(=h=x>>?H?@AtABDBBC<CD(DE ELEF\FFFGGPGHpHHHI(I\IIIJ JJK,K\KKKLXM8MhMMMN,NOOOPPDPxPQRRHRtRRSS,S\STxTTUU,UXUUVWW,WXWWXXXXXYYHYtYYYZ(ZTZZZ[ [<\\ ]]D]p]]]^(^P^x^^__8_h___``L`|a$abbbccHcxcccddteeef f4f\fgggghh0hXhiiijj,jTjjk`lllmmHmtmmnoopp@phpppq$qTqqqrr,rTrxrrsXt tPt|ttuu4uuuv$vHvpvvvw(w\wwwxxDxpxyz|{{|T}}~l,<l4D@H 4TD8<\lDt$D\<T@pL\<,(Hl@`((Lp@Txd|<d4\4`8\4X| 0Tx8`(<dP80Tt@d lpt(@`p\  Ϩ\Ґ0԰՜Pp4ۄ0ެߠd$l|L@ lP@HT( Dl4$t`<Lld `\ 0  , T P8L8tlH\h|\<|<(h8lDh  !8!" "d"#4#h$$,$<$t$$%@%x%%& &T&' 'L''(8(l())|)**<*t**+(+|+++,\,,,- -@--.4.H.l../8/|//000h00011D1|1122T2x223383344d4455(5x56666777<7`77788L889D9|99:0:h::; ;T;;<8<=x==@AATAAB(BXBBCCxD,DtDE E0ETEFF8FLF`FFFFFGTGhGGGHDHpHHHIJHJXJKKHKLHLM8MNOtOOOPPPPPQpQQQQR R|RRRSpSSTdTtU UUV0V\VVVWWXY@YZ[\\]] ]^\^_`(`albbc,cdle8effgg4g`ghijj jDjTk llm4mnxnoPp p|qqrds,stXtuvw`x$xyzPz{|H}}}$}4}~`~p~~~$4x` Dtx4D4XTdt PT\ pLHT ,l|@P($x, L\xX@0DP XDxT8Dxh$TtT@l@ŸXLȜɀ,˸̨ͼlиl`xp֨XT@ @ۨ۸ܜ(ݰ<޼<T 0@4`| 8DxHxD$Tl8h0d$DLp<h x@,<L\ldt $ X h  |  @    ( x   , < h   xH<tX$ 8dT,\x \|| p(`xx 0 !!"\"x"""#$#$0%P&,&<&'P'())t))*x**++,,-../</0H01(1812l3(383H3X445x5566$67478D89::h:;`;;$>??@l@AHABHC$DDEFLFGH HIlJ(JtJKL0LMMhMNTNOHOPhPQlR0RS4ST|TTTTUUV@VTVhW8X@YPZ0[X\T]l^<^_`abbcdeDeTfDfghijTkhllmpn0o opqrrsXt\u8v$vxy yzt{0{|}\}~t0<p|4t@$((L0|T,tD$T,X0Hp(\DlT<d0P0XX HpH0X(@X0Hl<| L|,T,XDHp8`(\0\ <h(Px8h@hL|@d<h<` $Hl@d@d| 0Tx,Xx$Hl4Xx(H`x,Pt$Hl,D\t(Ld|$Hl,D\tŒ¤¼(LpÔø $<TlĄĜ,PtŌŤż(LpƔƸ$<TlDŽǨ8\ȀȤȼ4LdɈɨ0Ttʘʸ @l˘Ht̠ @`̀͠$P|Ψ @`πϠ,XЄа4`рѠ @`ҀҤ0X|ӠӸ0ԌD(Ppְ֘x،ج(HpٔٸTdۄۨ$Hhܐܴ ݀ Ldތެ4L߀x4dP4<X@tL(\,0h|\ ld X|<  H  8    @ | (TDd<L<<D` d,|h$l (  !P!"$"x"#H#$$$%l%&<&'8'($(()*$*+p++,,0,`/6 <4<`<<=D=p==>>0>?@AABPBCpDEFGHlIIJJdJKLMlNNOLP Q\R,RSpSTTU`UVtW(WXY Y`ZZXZZ[0[l[\\l\]]d]]^<^^^_`,`t``a aa,a<aLa\ala|aab bdcccd8ddepeef4ffg g\gghHhhi@ij$jjkLkkkllDlmmLmmn(nno otoptqlqrs st txtuuuvHvwwdwxxxyyzzlz{p{||H||}}D}}~~X~~T h(d`Hpxp8D@LLP@@8L <hX$h |@  //9933103!!!oE3@  [??+9/_^]933310#!! & L%@ [?3+3933310#!#!%%L;E@7    !   ! @ Y @6Y O _  @H@"H@H   /3?399//++q+]q33+3333+3399333399339999103!#!##53#5!3!33!!ENONNFON4ONXF5FCjjDnnDEU&-4@/"3 - ).56/_   @+ H 2-uY"--).!''vY3  sY?33/+3?3/3+39993+39/+_^]9/^]9933333393310#5.'%.#.546753&'24.'6m&qiYm. '<]J$Et /qi %ep '`-9(:2?(!Q$/^@6 +""% 1 0(Y[.Y Y [Y???+++?+++333333339933103#3% #"&5464&#"32 #"&5464&#"325889:7m%5889:7mIk^[nl]k^[nl]M",8p@<%##53- 3 (9:# %+5 + +QY 0QY?+?3+39/99999993399339910467&5463267327#"'#"&%&'324&#">G_wK!*qUT9$&9gDJndh>?JM4dP,qC}f_Is{9(tFbp7ESDXa/:BL@ [?+9310#!%LXW "@  ??93333310&7!W>_@9     u       0p ?3/]39/]33]333393339107''7'73DDh=y{=heh :@   YY Y?+3+3+99933310#!5!3!q9hh+@ [[++9310!;jD@ Y?+99105!DD1@ [?+9310!!!1Yr@ ??9933103Y5 uWZ T@0   @  tY tY?+?+9/_^]q99339910#"!24.#"326%53W*XRV\)+ZRtdcT`W^^Ͱ^ڈvE=@    sY  sY?+3?3/+993331035!#5267!!'逋8 C{Rpzk{UZT@0/_o@ H tYuY?+3?+9/+_^]99333331035>7>54&#"%>32!{2R/^[Z_†nݐqVQ*HRaaǧmkD]eZ)x@D&### *+&uY?O  tY uY?+?+9/_^]_]+999993333339910#"$'%32654&+532654&#"%6$32eivb\zm[VpӔsxɾeWW\]SK`QXZk{GE <@sY??9/933+3993333310!!5!3467!S:8DSl6~8jAhcEY@,uYsY tY?+?+9/+99//993333333910#"&'%32654&#"!!!632c}pUlzvjuJ1OfƌwZRuh}[Z}[Z#W@. $% sY   tY !tY?+?+9/_^]+9/993333310#"32&#">324&#"326[+&r-eoaZsv^]loEbX%KPm{o[qDE ,@  uY ??+39939310 !!5!DDf#7m`Z"-V@+   )#./ !&!&vY!!vY+vY?+?+9/+93993399339910#"$54675.546324#"324&#"326`qr_Y!omenjj~Լn¼jⲲ[`meioclrRZ#W@. $% !sY/ tY tY?+?+9/_^]+9/993333310#"&'%3267#"&54$324&#"326R,'r&dv\[mm\[v%KUznlu=(@ [[?+?+933310!!!!!1 1F*=(@ [[[?+++933310!!!F; 1je}h?@$?o /]]3/]39=/33993310 eABe#h)R@8 Y_oo Y p @/]q+/_^]q+9933105!5!eJe}h=@# ?o/]2/]]39=/3399331075 5e@}DEyJYZ`@4 p [@ _Y?+3/_^]]?+9/_^]]9933933310!>7>54&#"%6$32!Y-UjaqRzce I!Al_n`jgCMc;M]va v,=I@I(6D>!/6JKF FY..+ @Y  _ o      2::$Y:2+Y2/+?+99//_^]^]33+339/+39333333310#"=7##"&54632373325#"3267#"&5$324#"326$~IjwagBT!c(J]԰w^eGsw~NmE1E 9@ _Y _Y?+3?+393333310!!!!5!!7l7E}fE2@  _Y _Y 0?2/]+?+993310"&'%3265!5!4#Z?IVS+vtvnyE C@#     _M   ?33?339]]9933339910!!!! q'W4-aEWbE@_Y?+?993103!!'hEcjEN@)  ?2?39/3]339333]33333]10!47#&'#!67!;|~/[Odi3,ldi`E /KFE 0@   ?22?339933333310!!!&5!QfpEHZ (@  _Y _Y?+?+993310! ! #"326{yyzbYYZ5vE 4@ _Y_Y??+9/+9933310+!! 4&+326vz ׃zn$Em]_mHmZ ?@!!"_YaY aY /+?3+?+93339310327#"&'&! #"326#~i-N~tB{yyz3aY *X,YZ5E M@&      _Y_Y ?22?+9/+999333339910!#!!  4&+32ޭ]|E‰'^Y&Z(P@+ !*) !bY  aY?3/]+?3/_^]+999333310!"$'%32654&'.54$32&#"*pkױj9%,jp6]^ƽ%^mTYB[4M`P̱OJ1A-%.q=E&@ _Y??+3933310!!5!jSaaLE%@   _Y?+?3993310"!3265!W'Qfh^' 5ί(E 0@    ?2?3339993393310)!?!04/31EXVEh@;        ?222?3339/9]33393]33]3]3]3]33]10!#&'#!?3767!@2(#,NY (cc  T EI`LS-WpNE K@'        ?2?3999333333999910! ! ! ! ^86T~R9ED@ @ H??39/+33933333910!! !05,05,,6WrE 5@ _Y_Y?+3?+399333310)5!5!!raouW(@ YY?+?+993310!!!uZPWu[t@ ??99331035 WX(@ YY?+?+9933105!!5!PZW-+@?33/2993393310 #!B$@ Y/+33105!``[Y@ [?+9310%5!+jN&1`@$11,32'@ H'@  QY..PY ?2+3?+99//_^]+93333310"&546?54&#"%!2327#"&'#3265FNIE6)0 ((-je ?ÆZQ*xa7gjIPAx[E heqd !I?ul$8@  %&PY "PY ???3+?3+99333310365!3>32#"&'#32654&#")oԷh-  5a?`igdbqdv[dca!u#xYnUNF@&   PY   PY?+3/_^]?3/]+99333310"32.#"3267p `XPl % +Sced o_aA$:@  %& PY !PY??3+?3+?99333310!.5##"323'!4&#"32>1 5kϽk*pcdgi`>b5y(kY, (a^ d"YdiNU@-   QYQYPY?+?+9/_^]+9/9333310"4>32!3267"!.r"rJr 7gz{) ?B{xub3@  PY PY??3+3?+9933310!!5!54632&#"!˟b]||SQe9|NZK".O@()#  /0&PY,PY QY?+?3+9/?3+?9933333310"&'%326=7##"323467!4&#"326h^Aeh]i,  padil_fmN!AL;sa^#xlޤP0@  RY?+3?3?9933310>32!4&#"!!9wQ\f}b|pRmwkmhv{ :@   S[ PYPY?+3?+?+933310%!!5!!5!%5!a;uW`4@ S[PY RY?+?+?+9933310#"&'53265!5!%5!`qщO-n\| b"kmr @@       ?222??3999333339310!!!! `y.TjZlv{ ,@ PYPY?+3?+933310%!!5!!5!a;PEN'O@(''   ()#QYQY  ?22??+333/+9933393910!4&#"#4'33>323>32#4&#"%23;"hNXW(oUvf%23;tS*0f]`djZ/tPO/@  RY  ?2??+39933310!4&#"!4&'!3>3 8M^h}  9wPkHWo,|p`Q\qN (@  PY PY?+?+993310#"3 4&#"326q fy|mom|p%  $WlO%>@  '& PY ""PY?+3?+3??993333103>32#"&'#!4'32654&#" 0kϽk*4_@efi`>b5:~_fa^^dwUYaWAO#<@% $%PY !PY ??3+?3+?93933310!7##"3234674.#"326A)oֵb  5a?`igdbq:d [d& 1,w xY9N)@RY ???+3993310&#"!4&'!3>329pd$ 2hfPJLcbpyPO(X@2! )*! PY`  PY ?3/]+?3/_^]]+999333310#"&'732654&'.54632.#"P'gvlWhW ^fddM[wG<%M@<@4=/Q^BA3!i)8=&:2 :L@%       ?222?3339/9339939333333210!#&'#373463S\P K:JJ92?>a1: @]     vRF4y;[  FVf ?222?]3339]]]]]]]]]]]]]99333333999910! ! !! j}/1}x/ b&W:[@   @H   SY?+?333339_^]+_q99339310"'52>7!7!EjL335463!#";ΆnwylG[Qs\_pQ[WHrqqqHhi_]jg9/?9310!9mW #J@&    $% YYY?+?+9/+999333910532654675.54&+5!2#[Qp_]rQ[GlywnWgj-]^-ihqqqr_mHN@5 Y@P`  Y _   o  /]q+33/_^]3+9910"&'&#"5632327bKKVGwAqid-r@u*/+-T/.\,$7+@ [??+9/9333103!! &eEbsdu@A    !p@P vY vY/3/+3?3/_^]3+99//_^]]]993922333310267#5&54753.#"{XwಢܢpX|7md [cIZ&@  &'(&&0&@&P&&&@ H&&" @)Y? p/   vY""sY?+3?+99//_^]]]3+39/+_^]99333333910#!5>=#5354632.#"!!!267җ@fKԩ,RB[PRdhkk:iRϊ/MFs}Pg8c^ff'5@ "()Y%Y/++9933/33331047'76327'#"''7&732654&#"     wY wYp  ??399//]33+33+393333933939310!!!!!5!5!5!5!! !+RP!"&!쓢9%@ ?/99//933310!!  kUV3>@L=+.71$ 11+49++?@=(7..!!QY QYt/?2/]]+/3/_^]+9933339933933339999102.#"#"&'732654.'.5467.5464&'6u rZpi6cUnW'{{z~0gΫngZbw6d͍>C;A)9+&RzW]O%PKAP0<-,1p]#&TGL!)7* !%@ [?2+393331053!53u&&2@M -'43Y Y @ Hp ##*Y#0Y?+?+99//_^]+]3++3993399333310"&54632&#"327#"$54$32#"32tV1r_dk]q:%͎  ~M+*q{FF ?=!+W@" *%%,-&Y @ H   Y)@ ""Y?2+3?+99//++9933333310"&546?54#"'>3237#"&'#'26=pw==&8CEQ^S[FdjeGznt}057 oz78}TFmL7:aIR@(    [ [ =?33333+3+393333333333310%53!53Y=iGo%#iGo%#TW@YY?++99310%!5!wtD&%1@Q",&23"Y!YO_oO"_" "" )Y /Y?+?+9///_^]]]++33993399333339310#"$54$32##!24+326#"32  ht3eUڷzPT"FFzI?~ofPNc ?= B& 9@ @ Y0 Y /+_^]+933310#"&54>324&#"326UX]FG_bDC`VVSF`aEEcbeh ]@     Y @ YY @ Y/]]+3+3+?+9933933310#!5!3!5!oUT=3S@#       Y+Y?+3?+9/_^]]993333310567>54#"'>32!?_R`c P332°! zxB767!3267#"$!|-U hcqRzce `Al_n`jfEMc;M]va &$C&%+5+5&$v]@ &d%+5+5&$@ &%+5+5&$@ &$%+5+5&$j@ &%+55+55&$B@ H@ H0 @ H%+55+]]+]]+55Et@F  bYbY bY??O  bY?33+?99//_^]_]]q+++3939933310#!!!!!!!#3hft$)\:.b}EzPCZ&&zb  %+5z&(C &  %+5+5z&(v[@  &G  %+5+5z&( & %+5+5z&(j & %+55+551&,C & %+5+51&,vg@  &n %+5+51&,@  & %+5+51&,j@  &%+55+55E R@+  aY _Y _Y?+?+9/_^]3+3993333910)#53! 4&+3#3 [iHE׫=f@46F&1@ &# %+5+5H&2C&%+5+5H&2vb@ &i%+5+5H&2@ &%+5+5H&2@ &+%+5+5H&2j@ &%+55+55ff %@  p/]99993210 7   fd```Ff``b.u"_@5  #$! !_Y  _Y?3/+?3/9+99933339910!"''7&!274'326%&#"׆jriԅjrkh>uyz54&#"!4$32ɺt2/QJL]79=2]Xgl!2;2!)8+$E94Y=m6^26Q-AN 6UD6-)-^}j&DC2&f36%+5+5j&DvM@ 2&925%+5+5j&D3&Ӵ82%+5+5j&D2&ܴ;G%+5+5j&Dj2&մ64%+55+55j &D5&ܴ82%+55+55N*5=@G +$2:2;**2>?.2:QY:_:o: ::"6"QY&$"..QY ?33+3?33+399//_^]]3+39/933333399333103267#"&'#"&546?54&#"'!2632326="!.YL<@%ts"2d{<813'GU-)&Nof]Iv(H,-ELA-nzvr7]lJI8+@Io6] AuRnCUN&FzQ %+5di&HC&! %+5+5di&Hvo@ &v  %+5+5di&H@ &# %+5+5di&Hj@ &! %+55+55v{&C & %+5+5v{&vh@  &] %+5+5v{&  & %+5+5v{&j)@  & %+55+55To%j@; ! &' PY  @ P    ##PY?+?99//_^]+3/999333999910!"5432&''7&'!74&#"3264;N89TMX%`@Sjx}opkwbfOGi0.m͔P&Q @ &". %+5+5\q&RC&%+5+5\q&Rve@ &l%+5+5\q&R@ &%+5+5\q&R@ & ,%+5+5\q&Rj@ &%+55+55eh :@"   YYYYY?+++++99933310535!53xq\qP#Y@2  $%! !PY PY?3+?39+99933339910#"''7&53274'326%&#"qȀU`_h|ObWf {7m|p8 5o|maaNk $WYNbSIIWT@M<&XC& %+5+5<&XvZ@ &f %+5+5<&X@ & %+5+5<&Xj@ & %+55+55&W&\vk@ &s %+5+5Wg:@  ! PY PY??3+?3+?99333310!3632#"&'#!#"326oҳӽc-esscmede[akð&W&\j@ & %+55+55f&$ @ &%+5+5j[&D4&ݴ23%+5+5&$@ &%+5+5j&D2&Ѵ5<%+5+5bE&$ @ ?%+]5jWN&Dk99%+5P&&v@ & %+5+5nU&Fvf@ &r%+5+5P&&@ & %+5+5nU&F@ &%+5+5P\&&@ & %+5+5nU&F@ &%+5+5P&&@ & %+5+5nU&F@ &!%+5+5}&'&ȴ%+5+5$*K@&%((,  +,*@' PY !PY??3+?3+??9933333910!.5##"5323'!4.#"32>53 5TV*I.HQPG-K+Xyy(kY4. d"vT°\!B%E\*r@2  &+,QY#PY @ H (PY ??3+?+_^]3+?9/3+3993333910#!.5##"5323'5!5!5!34&#"326 5kͿk*fkhgdepPdy(kY!a^]ͨzf&( & %+5+5di[&H@ & %+5+5z&( & %+5+5di&H@ & ' %+5+5z\&( &  %+5+5di&H@ & %+5+5WzE&(K %+5dWiN&H>$$%+5z&(  & %+5+5di&H&% %+5+5Ph&*@ & !%+5+5|NZ&J0&5/%+5+5Ph&*@ & %%+5+5|NZ&J/&29%+5+5Ph\&* @ &%+5+5|NZ&J/&/1%+5+5P;hZ&* %+5|NZ&J1&2/%+5+5C&+@  &  %+5+5P =@!!"[  RY?+3?3??3+933310>32!4&#"!!#'##5%39wQ\f}7Ӡb|pRmwEmhMEW@  `Y @Y  ?2?399//33+33+99333333333310!!!#535!!5!3#5!و'k'>쨱2 P^@4  QY RY p?3?99//]3+3+393393333910>32!4&#"!#535!!!9wQ\f}熆,:|pzEwmh1&, &!%+5+5v{& &%+5+51f&, @ & %+5+5v{[& &  %+5+51&, &%+5+5v{&@  & %+5+5W1E&,  %+5vW{&L8 %%+51\&,@  & %+5+5v{: ,@ PYPY?+3?+933310%!!5!!5!a;IEC@$_Y _Y??3/]+?3+993399310!!"&'%3265#5!Iǭ /4.$E&fU^my.WI@%SY RY ??+?3?3+399333399310)!%5!#"&'53265!%5!ZqщO-n\:b"km0fO&-x@ &%+5+5W>&g@ &%+5+5;E&.  %+5;&N  %+5: =@      ?222?339993333910!!!! `y.T~:,Fb&/v&r %+5+5v{ E@"  PYPY?+3?+?933/3/92/310%!!5!!5!%57!a;ɾR+;bE&/ д %+5v;{&O %+5bE&/@ %+5?5E&O %+5bE&/T %+5v&OT ` %+5lE M@'    @ H   _Y ??+99//+3992999933310!7!!''\hq|a倵@v{W@2      O _ o    PYPY?+3?+99//_^]99333107!!5!'%!5!SaU;yҾpF&1vz@ & %+5+5P&Qv@ & %+5+5;FE&1۴ %+5;PO&Qڴ %+5F&1& %+5+5P&Q&! %+5+5FG@#   @RY  ?2??+3?93393333310!4&#"!4&'!36325!HOZw  mۛ_YkHWo,Q!B%qoY#K@)  !!$%_YaY 0?2/]+???+3993339310"&'732654&#"!!3>32z''"/'F\?N 4owD:*yu||m;=yyWPO!8@!#"SYRY ???+3?+9333104&#"!4&'!3>3 #"'52658M^h}  9wPdF3J4kHWo,|p`я AaHf&2 @ &%+5+5\q[&R@ &%+5+5H&2@ & %+5+5\q&R@ &!%+5+5H&2-@ &w %+55+55\&R@@ &!%+55+55Ko@C   bY? ? O     bY bYbYbY?+?+?+?+9/_^]_]]q+933310!"!2!!!!!%27&#"WN&3.bO8&-|kqR\^DzʾN'-w@=" *++./*QY****(PY%%PY ?33+3?33+39/_^]+9/99333933993103267#"'#"3263 %4&#"326"!.NF34"kQSOU?WHNI??CRJ`6䓧BA-!+:*r&5vH@ &  %+5+59&UvY@ &G %+5+5;E&5 %+5;9N&UѴ %+5&5& %+5+59&U& %+5+5&&6vx@ )&),%+5+5yP&VvV@ )&_),%+5+5&&6@ *&/)%+5+5yP&V@ *&/)%+5+5&CZ&6zL .)%+5yCPO&VzV .)%+5&&6@ )& +1%+5+5yP&V@ )&+1%+5+5=;E&7Ҵ %+5; T&W %+5=&7@ & %+5+54&W&9%+5+5>EF@#   _Y bY  ??9/3+3+393333939103#!#53!5!kRaJYT f@4     !"PYPY PY ?3/3+3?+9/_^]3+3993333333310#535#533!!!!327#".5TX!JC|v@WҾҾX=# EL&8@ &'%+5+5<&X@ & , %+5+5Lf&8 @ &%+5+5<[&X@ & %+5+5L&8@ &%+5+5<&X@ &! %+5+5L&8<@ H@H0 %+55]]]+]]+55< &X@ & %+55+55j&8@ &R%+55+55g&X@ &T! %+55+55WLE&8; :!%+5WI:&X!3 %+55&:@ &! %+5+5 &Z@ & %+5+5&<@  & %+5+5&W&\@ & %+5+5&<j@  & %+55+55Wr&=vf@  &o %+5+55&]vU@  &c %+5+5Wr\&= @  & %+5+55&]@  & %+5+5Wr&= @  & %+5+55&]@  & %+5+5ub @  PY?+?993104632&#"!u˟b]Qel+c@4 & -, #PYQY )PY??+?9////3+3+39933333333331035!!!3>32#"&'#!65#4&#"32611pm) 8bjnefklbAp`e]#z]vE!(S@* &""  )*&aY& & %aYaY?+?+399//+9939933332210#!#"&5463!24&+324+32n?YᄉjeFMQon3Si`sqX_E>@  aYaY_Y?+?+9/+/3393107!!32#!4&+3 { ԊBÀl]ill&Q@+!'(PY  $PY RY??+?+99//3?+933333310365!!3>32#"&'#32654&#"E)oֵh-  5a?`igdbqdյ[dca,w #xYE4@  aY  aY?+?9/+99333310#!'5%3324&+3 { eKՊl$]ill'J@& "()PY   %PY ???+99//3?+99333333310365'5%33>32#"&'#32654&#"]K)oֵh-  5a?`igdbqd]$v[dca,w #xYPZ6@  _Y _Y ?+?+99//999310!"%>3 !"&'%326hLs:89D~ujBO4Pn'K@( !! ()bY"" %_Y _Y ?+?+9///+39331032>7# !254632&#".#"|~1H7"F;W6{.Q$("XDu-]j4]T"  8UB|cb0%J@*%% '&!SYRY  PY PY?+?+9///?++93310.#"3267#"32>32&#"OHcXYfPN (h(KM:;5gOͩed   EHEE?@    _YaY_Y?+?++9/993932210#!#"&5463! 4&+326?Aׅ>|ton3Si`EDE ?@! aY _Y aY?+?+9/+9333310)"$546;!5!!3#"D 1-iaA&M@)  '(RY PY #PY??+?+99//3?+93333310!.5##"323'5!5!4&#"32>1 5jϽk*3pcdgi`>b5~kY, (a^ d"YEXN7@ PYSYQY?+?+?+93310!5!.54>3 # 3 [ea`pt(#+E쩧eSDE A@!   _Y _Y _Y?+?+9/+33399910!5!!5!!5D8d6EDUHZA@" _Y   _Y _Y ?+?+99//+933310%2!"%>3 ! 47!.h"}VRg#>" WbgIa@N;JY(N@-  &*)_Y%% aY "_Y?+?+9///_^]+93310"$5467.54$32.#";#"3267S򜠗F'|hlgz;;ss/E}&yȲ=~eV[aOJ``br]ɱWRE>@! _Y_Y  _Y?+3?+9/+93310!!#"'53265!m9X88$a EWoWYZC@!      vY vY ??+9/3+3993339910.#"!!!#737>32*` PF.$%įH 6Ikc P^&W@/" $(' bY %$aY% %_Y_Y?+?+9///++3933310%# !254632&#"&#"32675!5!h.nVx[/!'5~5q* oN# 4Y6("WE9@ aY ?2?+99////933310! !#"&54674&'32645.15fA;h1- +"",E0ɹ:?y%YZR910-,K%C@#  ## &'!RY RY?+???+?9333333310"&=74&#"#33>3232>53<%({+ZHoo.5$+햒O<k}Xbi1aoz1E,1EV@,    _Y  _Y _Y?+3?+39/3+39939333210!!3#!!5!#53!3 8M^h}  9wPXHh|p`HZH B@  "!  _Y_Y?+?+99///399393310! !265#34&#"326] 3K\WTgxxhhxxgEbYFq~32#"&'#!4632.32654&#"/0kϽk*篜1zK4_@efi`>b5_fa^^\ wUYE;@   _Y_Y??99//++9333310 #!!3  4&+32}Œ'n|E$49^Y@Z*Q@+ %,+ ($$$((!aY(  bY?+3/_^]?+3/_^]99933104>7>54&#"%>323267# $@+JezZ5ok,%9kmn*IqU?0'&,A1JO̯P_N3YTm^%}TO(Y@2#)*&"" ""&&PY&`  PY?+3/_^]]?+3/_^]99933104>?>54&#"'>323267#"$}RqZMddf^ Xe[muh&<`S$7/<3BA_P/=4A;?N%dETW"H@ $# @ Y  RY  Y?+?+3?+?93331046323267# #"&732654&#"~kwMDr,4Yhx3$$22$$3^n¾jIp[(//((//f T!S@, !!"#SYPY PY?3+3?+9/?+39333310#533!!327#"'532=".5HX JD|L[H&vMO|X>"ȏ4NE3@    _Y ?+3?9/99339310"&5463!!!ZUja`3Si`~a $S@+ $$&%  PY   PYPY?3+3?+9/?+9/9333310#5354632&#"!!327#".5H?q|@J# JD|v@O|G ;A@X>" N=WE0@  _Y _Y ?+3?+39310327#"&5!5!6@D[JjSauOM %K@  @Y @  _Y?+??9/+3399333910"&!3265!>5#39'DUYO'SRfֆ&5γ(?dҺ:$X@ ##&% &  @Y  $ RY ??+?339///+3339939333103265!>5#3!.'##"&5FHS^U`eԎ8h:yDjҽWo,.{p2E#@@" ! %$ _Y_Y?+?3+3339333310%2654&'!#"'#"&5%+5!fxWjp@rn@tjWηn0 l n̈cX3@ _Y  _Y ?+3?+?93310%264&#"563 #"!Ur+HW+DZLp'`r~ $5ΧZ(@   ??399//9//9310!!>32&#"5ҍ-vemF:*9Kq}]>47W 9@  SY RY?+?+3?9/9///99102&#"#"'5326?!7>~x_86,3eMeL5,Xb%T) N Q,J$;/Fͣ Sd0/")%%}NrEI@'  bY  _Y _Y?+?+9/3+39993210)5!5!!5!!!!r&p95:I@' QY SYSY?+?+9/3+3993931035#5!7!5!3!!pQhbE?@! aY_Y_Y6?+?+99//+9310"$'%32654.+5!5!QK6gUN&beqn?- 2bEB@"   aY _Y_Y6?+?+99//+93310 4%5!!#"3267|&NVg5Kb0 Y?orenNh:8@  SYPY?+?+99//9310267#"54675!!#"Ws Pf_j vNZ:*=@!$,+**SY'PY?+?+99//93310#".54>7>54.+5!5!3267Z"ـs`ng2jf/еYvendbz cLdWP*=,-/ˣQwT2=)8B\XzUZ"K@)  "$#bY aY _Y?+?+99//3+39333103567!5!>54&#"%>323!!{PVC$^[Z_phŖS;ïILI$HRaaǧwOJ(e]FF@%aY aY aY?+3?+99//+933310!!3 !"$'%32654&#!#n$(wkyFʶ x~xr[:F@%PY PY SY?+3?+99//+933310!!32#"$'%32654&#!#Psٞ$#`q:˸kXNU\SqP8&C@# &&('PY PY?3+3?+9/933310#53733##"&'732654&'.5X'QP'gumWhY|M'2# (R~_%M@;A4=.WkWQ7@   PY ???+?9/399333310!!3>32#"6z 3q_p|a5o[`nǝx9?9310!34@  ?22993310!33344bkO@'  bY bY ?99//3+33+3993933333210!3!!!!#!5!!bvvvv;oq E"' EL&+5"'+&+5.'W&+5P}E0@ _Y _Y?+?3?+9331033!732653#"'P5H$.TG֦REykyPWdM@+  b[_Y bYaY?+3?+?+??+9333310#"'53265#5!'533!dnEKT:>5 rfrEWt \@4   b[ PYRYPYPY?+3?+?+3?+?+9333310%3!53#5!53#"'53265#5!ZnEKT:>P rfrP}E ?@!   _Y???3399?+39333310!#33732653#"'6$.TG֦REykyWQV@.  b[bY aY?+?+?+?3?399933333310#"&'53265#5!'53#33Q9z'H8.us 1llrE9Wd#'_@5 $'! ()%$S[%RYRY ! PY"  ?3?3+39/??++?+933333310!4&#"#4'3632#"'53265#5!'53$-4CFynEKT:>skHN[p`Q rfr&$ E&+5j&D3&+51&, E &+5v{& &+5H&2 E&+5\q&R&+5L&8 E&+5<&X&+5L+&8f &+555<&X&j J4L+&8a &+555<&X&j Cm<L+&8f &+555<&X&j E 2L+&8m &+555<&X&j B2diN+&$f &+555j&D&j J4V@7=@++H=@H=@H=@H=@H=H=@H=@ H=@ H=6&մ64%+555+55+++++++++5+&$f &+55j&D& J4C@39@++H9@H9@H9@H9@H9H9@H9@ H9@ H92&+5+++++++++5m& J&+5f& J0A&+5PZ"d@   #$ @Y! aY!! _Y _Y?+?+9///+3+39933333333103## !2&#"32675!5!5!5!h[[.65~5q* toN6(" L%NK*6n@51 +)" *78## &QY 4PY.PY** Y?2+3?+?9///+3?+9/933333103!757##"5323467!3## %3267!4&#"326%1ki,  U`!u4 SPIbpadik`cp%;sKT a^#xl!]!45PNPh&* E&+5|NZ&J0&+5&. E &+5 O@)       ?222??39999333339310!!!! #%53373`y.^˟TjE5ZlHWZ&2d\WqN&RdHWf&d&2 *&+5\Wq[&d&Rb&y E&+5dW^&S&+5W?&h&+5"EJ@'   _Y_Y?3+33?3+339333310+324&+326!5!5!!rܺ>NC28M&cE7i"ER@- bY _YbY_Y?+3+3?+?+39333310#!324&+3265!5!!r繰>MC20E6W%d@7 #"%"&'" SY ##SY   PY PY??+?+99??+3?+3933333310!'#"3234&#"3265!5!!3[k|{rM7,%P)$'-.G6J)*B U"UPh&*v &+5|NZ&Jvu4&+5YEC@#  `Y aY ?+??399//+9333331032653#".=##333(,,'A}z9td\[ZǺvE}Z,@  _Y ???+99333310!!>324&#">}OBoyf[kg{QCvfU$vF' B1&+5P&QC&+5)@  $  +*'@H''!!Y aYe@ H ?333?33+]9/3+3/99//+3/+933399993933310!!!&54632!&57!4&#"326X0X.V1mo3gAf,w98/.::./8I6B3MYno3+ '&!!&'j&D'mvt)@J;G`JM%۴82%+55+5?554&v& %+5+5&vn@ >&v>A)%+5+5.&vd@ #&m#&%+5+5\q&vd@ $&k$' %+5+5&$ &+553&D =&+55&$f&+5j&DR=&+5oz&(C &+55Qi&H% (&+55z&(z&+5di&Hj(&+5F1', &+55F{' &+551&,f&+5v{&z&+5H&2! !&+553q&R "&+55H'f2&+5\q&Rf"&+5M&5! !&+5539&U  &+55&5f!&+59&U &+5_L'38 &+55=<&X "&+55L'f8&+5<'YX&+5&%Z&6r 12%+5y%PO&Vt 12%+5=9E&7d %+5% T&W| !"%+5FupZ'I@&& #()aY&_Y`Y/+?+9/99+933333105>54&'56$>54&#"'6!2pIQ Jx|P7Q0dg95]iPAs"W1`ThS_mbw_{OQDN(K@'"   )*"#RY  "" RY PY ?+?+9/99+9333333104&#"'>3256$654&'5>4jbStAB32!4&#"!!#%533739wQ\f}X˟b|pRmwEmh1WCZ1@  _Y  ??9?+?99333104&#"!!>32!TXlS'7NФ| Eh;B&W",9x@@( # 33- :;37 400SY0!&PY  *PY7PY?+?+99//?+??+99?39933333333310%632#"''7#.5#"325'34&#"3264&#"3326C\|~x.! sMHb%FECI, H K*,3G2u"$`c$  %TqBW932-3G4@%0[@2+"& "12 bY %((bY%%bY%.bY?+?+9/+93+9333310"326544! $54675.54634!"326#SPqsSU쉆⊁xrG||GK]mgX´OÈ$fWro{sr9&0R@,/ )$$   12!,,PY   'PY?+?3339/+939333310 $54675.54%32>54&'7% 54&#"fًsy*jF0~sSd0/Gj*zr ۿ,ly7_Dxl6\RB`8yl+ۼnrppWE:@ _Y_Y ?+3?+393331035!5!!2'654#Wa*oj~!S3n}::@ SYSY ?+3?+393331035!5!!2'654#:Qb#\~|j~!S3nm&$&+5j&D5&+5CzE&(zdCiN&HzJH+&2f &+555\q&R&j J!4S@="@++H"@H"@H"@H"@H"H"@H"@ H"@ H"&%+555+55+++++++++5H+&2f "&+55\q&R'v J!41@"3@H3@H3@ H3@ H3& ,%+55+5++++5H&2&+5\q&R&+5H+&2f &+55\q&R& J!4C@3@++H@H@H@H@HH@H@ H@ H&+5+++++++++5m&< J! &+5&Wf&\ J+&+5bWsM@& !  SY PY ?+??+9/3939939333210632#"&''67&54&#"326 sϫfap1|K>;w${I?KQ@LGJG393,3G9]TO(4m@:  !'..$)$'!56.$.$,,SY, 22PY RY ???+3?+3??+99//933333333310#"#/3>32632#"&''>7#&=4&#"3326Cqwz*IX93_8B4T(\@/ *)## PY!SY  &PY ?+?39/++33939933993332310>32#".''67&5#533!!4&#"326D=xSƛP}gPp1|XkhF2NnP5F,%2>GE`m39_7C;",7[@/(3# - 890&&PY 6* *PY  ??3+3?3+3?9333333333333310#"&'##5##"3235'336324&#"326%4&#"32Nu>~Fu ASHGELDHIKKH!d^%  %Ze`bƯnN",7[@.-2# ( 98/&&PY 5**PY ?3+3?3+3?93333333333333310#"'##75##"323533>324&#"326%#"326A uF~>uOSLEFI܍HKLHHDаbaeZ$ %İ]eu O@(   aY    ?3?339/+3333339333103!!#7#!3&3<S\<X+u*cd>JGoEe}P Q@* "!   @_Y _Y ?+?+99//9993333310'327!"'#7&!273&# `1BlNzV8fYc1=`B5VJ4XEl2݌c&'Wm%Z@-! "&'' $PY PY?+?+99//3399333933310"'#&323&'3267&#"ps]֣ODãޚ$.EPl "!J4 +9a#$$ed o_6kL TbE =@   bY _Y?+?9/3+39992223103#53!!!!'nhQ)7@   _Y ??3+339333310!#!5!7337#أjYY"j::aR?䇇YYWQO8j@:/"'":9'.+1+SY1/  ''PY'&PY?+??+99//_^]]?+3999933333310?32654&'.54632.#"+'3267#".'&'&7jumWhY ^fddMZX8?Y:MW@R~|OdFU;A4=-Q`BA3<076TbAJ=>wheW?:4@  RYSYSY?+?+?+391035!5!327#"&'.#:QBPNt9(:W@ZW[I\jedU hmpd:@ aY  _Y ?+99//+3933102654&#"%6$3 !0}!:(AqЈ9"mzG/ N/@  PY??+9/9939310!>54&#"%>32{FTBU -youcSE%z@C#   &' #bY#aY## ## ##aY"aY?+?+99//_^]^]]+3+39993933222333103!2#!#%4&+3#!24+32 ᄉyjeQӥ=sDVX_IiEM@&    bY_Y?3?+9/33+339933333333103!!!3##"5#26=!m'}'mmmKh^Q2H WlJTEMz@Q      _Y_Y /=.  _Y?+??39/_^]_]]]_]q3+3+39999333233333310!#7#!733#3!!3!7#55v BBh6ԞeennED Wi$(,_@4"))%-.)")QY(""""" QY PY?+??3+99//_^]3+3?933310"'#&4>323!3267"3&'7rfڣ>8yz=[Jr 5gz~8Z 2+@) CG7?B{qH7.efUEP@(  bY   _Y_Y?+?+99//3+39933333910"&'%326=#535!5!3#4#Z?IVSZZ+vtvn)uWW@-  S[SYPYRY?+?+9/3+3?+9933333339103##"&'53265#535!5!%5!`yytЇO-n\zz|,a"kmHWZ%A@!#  '& _Y aY`Y?+3?+?+?99333310"&=#"!273327267&#"]_}~15=D&s?k#Bvu}vWW7lGNmcNOM q20YaW O -E@#! (/. %PY+PY RY ?+3?+?+?9933333310327#"&57##"43234674.#"326A6<D&s!)oԷb  5a?`igdbq:dPK [d& 2!uxYEK@%   _Y _Y?+?39/3+33339333333103! !#!#4&+32]ޭى\|]'^Y9NG@$  RY SY  ??9/3+3?+99333333310&#"3#!#5354&'!3>329pdtt$ 2hfPm˅LcbpE[@    @ H  bY  ??39/33+339/+3393993332103#!#53'!!7!7#vWUR5JL5w?,ˍ&W:!_@0  "#"" SY  SY?+3?39/33+33339339333333103##"'52>7#53!!!67#.p;odjL33323>7>54#"FNIE%6o)0 ((-je ?ÆZQ*xaN7gjIP[E heqd!I?uaAN"C@#  #$ PY PY ???+?+9939333310467!!.5##"324&#"326%   XϻVkhfn+kid ' #lN#B@! $%   PY !PY?+?+993??99333310>32#"'#!654'!32#"(oóX   nfhk]b#}dTio)psl"/I@&# "*"01 'PY-PY RY?+?+?+99?933333104632.#"3>32#"&'#!6532654&#"#Q)oֵh- 5a?`igdbq }>[dca,w d7xYx_N6@  PYPY?+?+99//993310".'%32#"%>32]р lPX` _o devkcS&UN%J@(" &' SY  $PYPY?+?+99//99+933310767&532.#"632#"'4#"32&:J< `X׾/=lzAYYSv +ScFsk=X\cv_aW#*G@%$+,RY !PY 'PY?+?+99??+9933333310%##"323'!327#"&54&#"32>"5jϽk*/:p5pcdgi`>b5kY, (a^}  oYa!.K@'"(  0/RY %PY +PY??+?+993?+9933333310!.5##"323'54632&#"4&#"32>1 5jϽk*LW:6-pcdgi`>b5~kY, (a^t 6Chd"YdiNI@(    QYQYPY?+?+9/_^]9+933310"$'%3265!532"!.[6 rJr"e{zB?#<wzdiNB@"   QY  QYPY?+?+99//+/3933102#"5!4&#"%6$267![ރrJr7gz4{N<#?BO{x0N")b@3*+&&  +'PY&PY#PYQY?+?+9///33+3+/33993333910273267#"&'#"5%.#"'>265% - 34]dhmɹC4Q /FC@N&H48uq6)edYAmN%U@/#  '&   QYQYPY?+?+9/_^]99+993310%27#"$54675.54$3 .#"3"vd 4/Tjtqgfj  `{>GC7JKROEM`JN%U@/ #'&QY$   PY  QY?+?+9/_^]99+993310%2654춮&#"'6!2#"$'7WaqtjU.4dMEORJK7CG>{a  ifg/N0e@8.( *."21(** QY%PY   QYPY?+?+9///99++99933310"&'73254춮&#"'>327327#"&'#$p}f{d/=|ǝr&\8E<)@!  SYRYSY?+?+9/9+93310#5!# 32.#"3267>_Z+ VX탂5D=e:81"  ,'SQ5P:1@   PY?+?39993310#"&5467! !4&'326CbAR)&(/(V,**-ye:;gE1F]4;:N -:@ ,",(./%RY  PY ?+?399+393310%2654&' 5467'&#"'6327>32&#"j%.#01"-&2dT)YPVG}SIG+^}GVPY)TJ20)#]LP[!)0:6@  RY?+?393?99333310%#"&5!3265!!47)9wQ\f}|pwC4mhP!=@  #"RY RY?+?393?+93333103>32!4&#"!4632.#"9wQ\f}粚#Q7mh|pRmw }WP+F@& &,-")RY" RY RY?+?+?93?+93333103>32#"&'53254&#"!4632.#"9w0t:/Q\f}粚#Q7mh|p  |—w }v{\@1  SY SY PYPY?+3?+9/3+3?+99933333103#!!5!#535!5!%5!a; w:&@ PY RY?+?+9310".5!5!327K43/RdB_S EM@1: 7@  RY RY?+3?+399393210!!!!5!!53!!5!#467!5!'"_ia*be; ,9v]-7zv{_@3    QYQYPYPY?+3?+99//+33+3933333103#!!5!#"&546;!5!5#"3wwaxu;``׾*pr ̤PTW&@  PYRY?+?+9310327#"&5!5!/:p5;T}  [VS@,  PY SY???9/33+3?+9933333103!!#"&'%32654&+5!ש6Mvhn<\K:'F@# & &()'##QY ?33+3?339333933331032653#/##"&'##"&533265%23;"hNXW(oUvf%23;:ntF*0f]`djZntYKW:$H@$#  #%& $  QY ??3+3?3393339333331032653###"&'##"&533265%23;"hNXW(oUvf%23;:ntFXf]`djZntYEWN1S@, 1$)$ 23!'PY!-QY  ?3?9333?3+3?+933333310!4&#"#4'33>323>32#"&'53254&#"%23;"iMXW(oUvf0t:/%23;vS*0f]`djZϧ  }vWPO!>@ ! ! "#RY RY ??+?93?+9933333104'!3>3 !4&#"#"&'5325  9wPM^h}0t:/Hh|p`Qkg  }W:O!>@ ! #"RYRY ??93?+?+9933333104&#"!4'!3>3 327#"&58M^h}  9wP/:p5kHh|p`}  F: .@   ?3?39999333310)#!&53F@ ( hf:R\qN I@'PY PY PY?+?+9/_^]+99333310#"3 "!.267!q mn  hvjoBl%  $|}2N i@;  "!SY  SY SY PYPY?+?+?+?+9/_^]99+93333310%#"325!!!!!!#"32fVqoT?/WNDBH5I&  $C/oǽ>N)D@"'  '*+ ##PY#PY?+?3+39/93933310"326=332654&' #"&'##".5g,%'63*$- O_cmmc^P޴}{ss{"4\WqL@&    PY PY??3+3?3+3?993933333210#&5473'6qRDc!{6 /A E+!G:,@RY ??93?+99331073265!!&'##"'pd$ 2hfCLcbp,@RY ??93?+99331073265!!&'##"'pd$ 2hfHLcbpW:A@! RY  RY??+3?+99//39331073265!327#"&5##"'pd/:p52hfoz  3pW9N,@RY ??93?+993310&#"!4&'!3>329pd$ 2hfPfLcbpW9N7@  RYRY?+?93?+99333310&#"327#"&54&'!3>329pd/:p5$ 2hfP}   Lcbp:N '@  RY ??+9/99310&# !!29U-_M*WN %@  RY?+?9/9931063 !!"_-U5-9: 9@  QYQY ?3?+9/+933310!!2!'3254+uqBнM:w)&C: A@$   QY    QY?+?39/_^]+933310!!"&5467!#";)uq6нƜwMzWQO2c@9'1 !!, 134+).)RY.$$PY $PYp/?3/]]+?3/_^]+99?+393331032654&'.54632.#"#"'327#"&5qgumWhY ^fddMZXa/:WO3M@;A4=-Q`BA3<076Tb.t} [W/@  RY RY?+3?+39310"&'532654632&#"w+\7HB=YB*MGBWPufȵXkǶW G@& !" PY RY  RY?+3?+3?3+3933310%34632&#"3##"&'5326=#ӼYB*MGB+\7HB=ӾȵXk,ǶPuWM/@   RY RY?+3?+39310"&54&#"5632327ZCFH*CS7/C7AWkX!WH&&W)H@& $$*+'SY!PYRY?+?+9/99+933333104632&#"'#"&546323267.#"YB*MGB|1pbdμsL>H|$w;?JWȵXkIxQGM?Q58F4-29,a>@ PYPY??+9/3+39333103##!5!4.#"5>32X!JC|v@TؾX=# EX T5@ PY PY?3+3?+933310#533!!327#".5HX JD|v@O|SX>" N:#U@,!!  $% QY RY ??+?39/933+3339333333310!!3#!.'##"&=#53267!{xxkݤkkYtY:ggWo,.eJ:2<@ #.)34SY1 &PY ?+?3+39333310#"#".54>7654+53232654.546;aB.8.$4&Bb\s#*#qp#)#r]o/Mg~Eml̐4\RT=/j]/`gtB@sib.YnRN8@  SYRY?+3?+??3933102#"&5!324&#"5>^cDEN%~Ndžq : "@   ?3?993310)&'!!18Pqd8: :2@       ?3?39/993/3/9310!#&5#'#3>3[V_Iq9I<:-Q ;'*@   SY?+3?3999102&#"!&'!>jLP(׾(=BP &Wjm^s΢5:@ ??399310!! !Z)  &]T~HW:H@&   SY  SY RY?+3?+3?+39333310327#"&=!5!5!!5/:WOR:QhZ} M\D5:!P@,    "#PY SY  SY?3+33?+39/+93331067!5!5!3>32+4&#"326Y-?n}17&:Hp3;`M\ΔVu#%7d+dW^:@@!    PY SY ?+3?+9/39333102654&+5!5!#"$'%SkfS w艝[ʳ [nxW:)X@1  %*+SY 'SY   #PY?+?99//93++393333310&'#".546324&+5!5!%327&#"%ĊjǿpS881oRMQDc/9tQ[[ijFJ8BT7jqZ2@RY RY??+9/+93310!32654&#"%6$32.54.+32654&+{t? nyt <%E>Sb$<;ts9?Ym( %e,n FNE`}xH#4)'*3@G+*0)) #54((SY-PY)  !PY %PY10SY?3+33?+?+??9/999++3933333333310)'#"323!3>32+'#"3264#"3265^alohT2P7xDGQ?7XTS+.$2 H\$  )SnZw*lKHQJ+18!4`@511 -%-560PY % @4SY PY/?3/]+?+?399+393333310!632.#")"&5#53732654.'.547#3p~wd6'):BB3/,^(ţTc,Yp=3>W1b@51$  + "23+-(-PY("#"PY 1#  RY ??+3?3?39+33?+3933333310>32#"&'5325#"####5354632&#"&gE|pu_=?i;EXggpp=K4':_LD}||q@AUV+K@*++ %%,-(PY( PY/???3/]+99?+93333103332654.'.54632.#"#"'VKmpa%Knr@ɭBI633#&'#3?33s tDZm vo qs  tDZm qo q?U6` 1 P/4&n6` [$xP/D@"     RY RY?+?399//3+9933333310#!#!#!#!jrjr 4 %WE@@     RYRY?+?+3??99933331047# 4#"56323265!!-h͌2@ rXIIR_iD]OEպBWE%K@& ##'& &  RYRY#!!RY?+3?+?+3?333993310"&=#"&54#"563232653327$)tNj&@!lIwBOw2L[WlJ7E Ժ㯉B+fA@! 3. 1?3?393?3393333310>32#4#"#4632&#"'uQw{FTyiX&(XMWO}_hP`m Y3Y=/@  052?3?33?993331053"'52653CJ*#2#cmQ/C%dm=-f=8@  0 /.??33?9399333310#.'##"'532658%K@$(*GP-ylE xvvC7@  0 /?3322?93933310327#"&=##"'53265W&"Ske!PE'0"GPXsbL xuw 6@     0 .?3?39/339333103#!33254+AJR2kUuhjiE*  0 0 .?333?3?39910#.5#37373u ʿysq s/gn@3"@ 0?32299910%"'52673?3F2B>D"s)6m8~ Ba{piݐtL L? @  ?9//99331054673348>E?yMNH? @  ?9/993310#>5#48>EyMNH? @   ?9/993310##.=E>84HMN{w @    /9933102654#52#51fi|{j-$Ovh]^gw @  /993310"&5463"3j{}hf15wg^^gvO$-2@   ,.??33/9/39333103254&#"'>32)2IK5K ~s eTI=.r0@   ,.??399//3933105.54632.#"327r~ K5KI2)r.>HTe ge}he}h!>&@/329333310%# #!B@>&@/329333310%!3 3yED@ @   [?+9310#'##5%3ןӠ @  [?+9310#%53373˟eG?9310#3eg4[@ Y?+9910!!4d[=@ G?9333105!&=@ G?933310%5!&W/9310#3Wg4a/39910!!4dl=/9910%5!l&l=/99105!l&:(@ ??9993339310#!3`v`6`v:,,:@ ?293910#`v`:,c @    /993310%2654#52#51fi|{j-$Ovh]^gc @  /933310%"&5463"3j{}hf15cg^^gvO$-  @  /33993310%!53533y|x|  @  /23993310##5#5!x|ym| *@    /9/333933310##5#53533x|yy|xhh|xx$/29910%5!$ (@  [Y?++3993310"&'332673d XX"y:?@ SY?+93105!t|X ^@B  Y  / _ o   @ H Y/O/?O@H/+]q++_^]+933310#"&546324&#"326Xopmo8/.::..9DWqqWYnoX '&!!&'W(.@  Y H/++/9333310"&54673327o~WG?B1-6:?Wl\K%*s5*3!/@   Y [Y?2+++3993310".#"#>3232673 ,YTK-, of-ZTI/,4_#+#/B#+#5ɱ<::s$fqre(quGNFmt?N)2.??93103)2@! *+! 1 /?33?339993310#"&'732654&'.54632.#"HVTE=Eu= @DDD3E*nk9q|bj6-,+%+ 8\Dmzkc0-$+ :[0gtX@ //393310!#!5!X!tX @ //9/39310!#!5!3X1ЫQtX @  //9/3933310!#!5!3X1tX @  //9/3933310!#!5!3X1AtX@ /3/93310)5!3X1!sZp@ /3/99310)3!ZurpsZp"@ //9/3993310!#3!Zuurp E^4@  /32993310!5!!5!dd? .@  /329/39933993210#65#!#65#!1<)2;vV}R#@ /32993103738OO!#@ /2299310#'#rOODߞ!W@ /3993310%%!߾OOW@ /3993310 57'5ߞ!OOW @   /32993310#"&546324&#"326mRPppPQnb3**11**3RnlTSlmR*44*+66A/9910-5!Z& @   /223999107%5!3%5!&& @   /22399910%5!!5!1&&@    /333910".#"#>3232673(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi="@ /99//933310!!  @ /299310!##]tq@ /299310#5#5!t]qi@ /29931033!tKqi@ /299310!5353tiqW@  /32993310!3!53W}W@ /299310!3!PW}:Wq (@ /9/399932310!#53!q]uu$>//310%5!$&a$>//2105!a$&h^#+   /32/310".#"#>3232673U(PLD%) |+TD)RKC,$ z,T##)#/@fg;"*":4bi=$1/310!!d̨@A/2105!@NNb  /2210"&'332673 hGGiMYWOs/2105!F/2231053!53mu@   /32/3/39104#"'632#5248 7pX^R>f OI5H,+"+"X /239/3105!"&'332673 `EH^NNNNT  /3210"#>32#.Ded@QKKQn? /9/1054673348>E?yMNHn? /9/10#>5#48>EyMNHn? @  /9//33310##.=E>84HMN{?7 /9/10#>5#748>EyMNH)l /10%5!Bl&)l /105!׬l&DW /2210#5#535|5#!ks}kҼNr /10"&5463"3rj{}hf15Ng^^gvO$-IW/2310!53533z|wW|IW/3310##5#5!w|zm|GW @   /233310##5#53533{{{{{{rrqyyS/3105!SZֹWd /210%#"&'532=0t:/d  }Wd  /210%327#"&=/:p5d}  sarEM/3331053!53lur@W  2210#"&546324&#"326mRPppPQnb3**11**3RnlTSlmR*44*+669z  310#65#53z+3^lIu=dF]  /3210#"'532654#"7>32\QMMVa{?D$&*yer { .+TkfHW /210"&546733275o~E8231-6:?Wl\By&)e/*3!WJ/10#3JWgWy /3210#5!#!ySW}O@   /33333310#"'#"&533253325OcXZ77[Zdh\Zc\Ziw==|dqqqqr Esr $@  @H/]+393310#'##5%3rӠ$[' $@   @H/]+293310"&'332673 XX"y:?iX  /22102#.#"#>^HE` w@HH@iu%@    H/+22993310".#"#>3232673,YTK-, of-ZTI/,4_#+#/B#+#532632 )!\cZ"* peL[77VMh "qq"P[==ZQ/z /10''7'77]ut]xx]tu]v]yy]uu]ww]undq/104>75>54.d.MM&0 Yo&-2= Y 17<AK["18:$L/22105!%5!g$NNNNR/10%5!&/105!&a  /3210".#"#>3232673(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=n  ?9/10#65#!1< yT/  /3333105!%53!53E^!$%W  /210327#"&=3E!,5HU! QGy' /3210#5!#!yS} W~/32105!5! jjjj=W /3210#3#39WggDi /310#5#5!t]iqvc &@   ?332229939910&#"#>32732673#"''P%%) |+TD7S;_:",$ z,TE2XE^#/@fg;+h5f:4bi=,z6+!#@  /2399//33331053".#"#>323267353E3 @=6 d#B6!A=5#a#C!'2WN/!.*SQ0a3@   /',#/323210".#"#>3232673".#"#>3232673(PLD%) |+TD)RKC,$ z,TE(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=#)#/@fg;"*":4bi=b  /3322105#'735莎||||LW/33105#7#8||W玎 %-5=EKQYaiqy<@HrvjnFRV6:.zz2~bbfZZ^>>"B&*MM*B^f~v LI O OLL |Pdh\`@D(tt,x ll$pTTXI88<04xpXI<44557449 885667775558849*557sNsmmIok /31057'5ߞ!OOwr /10"&5463"3rj{}hf15wg^^gvO$-A@  /229/3105!2#4&#"#>`KJbFPQE/R @   /32339/10''7'77]ut]xx]tu]v]yy]uu]ww]uoW /310%%!߾OOoW /31057'5ߞ!OOW   /29/31057'57#'#ߞ!~PNOOvߞ!ws  /102654#52#r51fi|{j-$Ovh]^gL  //310#"&546324&&44&&4&44&&44CW!@   /339107''7'7'3,q!xYXFHY[x!rg2_f:yy;e_2WQ+2@ & ## )) /322333/3/3933310#"'#"&546326324&#"326%4&#"326QmR\77\PppP]66]Qnb3**11**33**11**3RnBBlTSlBBmR*44*+66+*44*+661f @ /9/3/33/3310#7!3_q<_q<׽)SW  /22/3/310! $'332$7bmmad *M,~luuSA  /3210! $'332$7bmmad *MA~luuSX/310!!8XS^/310!!8S@    /99//3310"%$#"#>3232673zzZ\͒z)(zY]DDGKDDGKSA  /2210&$#"#6$! Pea%$bwskSb/9/310!55!||tbRh`0.2?3??10533_m}tqRwU`gN!2. 1?3?393?10>32#4#"#3'uQw{FTLXO}_ho* 10.??93?3104'33>32&#" %K@%(*GPG-H[lE xv*v~zy 0.?3?39910 # 373  ΝptR ?105!w&Zl /10!57wz&W,x_NnUN[@6 [/  PY PY?+?+9///_^]q+99393210!"32.#"3267 `XPl N% +Sced o_x_N[@6[/   PY PY?+?+9///_^]q+99393210!".'%32#"%>32xр lPX` N_o devkcSF*=[?+99105!6!B%` 7@     [ ?9/3+39939331053%53!53;L!%vF&$8(2)@p%+]]]]]5?5)@[/?o@H/+]+9310! 1E p@   @[_Y_ _Y _Y?+?+9/_^]+3/+9933999339310!!!!!!5!G(<*16E!B%E j@  @"[`Y\K* ?2?39/]]]]]]+3/+933933239310!!!!!!5!z76>E!B%F&,}82!@ o_ %+]]]5?5Z D@ @[ _Y _Y?+?+?+9933393310#"32#"3265!bjjbbiC6gTT_!!B%EM@  @[ @P??3339/]333/+933923910!!!5!6BZ!B%Z%+i@   ##-)&& ,(+@[(  _Y  _Y?3+3?+9/3?+/93339933993310"!532&546326;!>54&5!lR`/j?g|둏섆}j@f/`R6w͸d nn &d֒ϕ!B%w`&j9'@&;%+]]]555+555E$E%xE@_Y??+99310!!x`EDE5  @ H `Y?3?+3339+9107!!%&/YV, 7cjx' IzE(WrE=CE+>ZI@'  aY  _Y _Y?+?+9/_^]+99339910!5! ! 4&#"326  ߊ}}}{liRQb1E,E.E (@ " ?222?39]9103!!&'0#Ea}Aa]cjE0FE1sZE :@  _Y `Y`Y?+?+9/+933105!5!!5-;Q(HZ2CE#@ `Y?2?+993310!!!!QEvE3dE N@'   `Y   `Y?+3/?933+3/9333331035 5!!!dG~ivp=E7E< O(V@+$  *) $ bY$%bY%$%$%  ??99//3+33+39933933333104&+3265#".54;5332+;#"ra[q,u ,q[`sсLJSE;.E>@ aY??339/3+393333310##"53;332653# \m m\s K%O2Z#K@*! $% _Y  _Y?3+3?+9/_^]393310"!532$46326;!>54&fxWjt@nr@pjWwηn l 0n̈1&,j @  &%+55+55&<j @  & %+55+55F&b8<@ %&)%(%+5+5m&f8P@ &&N&) %+5+5oXT&h8P@ &e %+5+5w&j8@ & %+5+5c`&v9@ &"%+555+555FN$D@" &% "PY PY?3+?3+??993993333310%#"32367!!&'3267.#"R>}܃02 2k h1U`YuXfWzz|o[sxu.ĪʧW*[@. % ,+PY(!SY %((PY?3+3??+9/+999339939310#"'#!46324>54&#"326ժ \NxnVSqd/Aor^[oܳ[i\}qdSY $/$X:B@&  /  ?333?339]q999310%>7!!67!g''f[ !DQ*&.6{/*Lz J@  PY @ Y  PY?+?99++3939999399104&'326'#"5%5!X[l|p|CsUnl2םw~ ~:mN%o@: #  '&     QY QYPY?+?+9/9/_^]+9/_^]9993993333310%27#"$54675.54$3 .#"3"vd 4/Tjtqgfj  `{>GC7JKROEMok":@   #$ PYRY  ??9/++3933310'654.'.54>75!5!+cǥ;#7.kYI?>H1#+xC8J\?'-&*aj`FoXTN(@    ????399333104&#"!4'!3>32=J\o{$ @{XtS{l'i)p]I ?@ PY QY  QY?+?+9/+99333310#"3 267!"!.Idn_6YBcnj|nmorw:0@  PY SY?+3/?+9933310"&5!5!327"4mIz ,l:CM@*  ;K/ SY ?222?+9/9_^]_]]3999910).'!'.#"'632ڌ)I >I90-0Uffd4V+:8S\FWS:7@RY ??33+??399333310!.5##"&'#!!3265!GN4Waz ,560*+H䧐Bp(L:$@  ??339999310!!654'!Lְm)oa12N8:nbok/Y@,("++%% 10%"#"PY+,+,PYRY++ # ??99//++9+39393993393310'654.'.54$75.54675#5!4mʽ;#7.gX ӭ`ݶh>O2 C8J\?%2&$!Zj" cSg\RU In\qN (@  PY PY?+?+993310#"3 4&#"326q fy|mom|p%  $: E@"  "!"PY PY ?+??+33/3933/993310327#"&5#!6="5>3!$0 $ai}%)0+9jj/|H7 !s|aքWiO5@  PY  PY?3+3??+9933310#"'#!432#"326iq }1z3!!327#"&5|Rk48E'@ &| H? c:-@ SY?+?399333310#"&5!32654'!c_ltdK14C;pWh)WR#J@%!   $% QY !PY??3+3?3/+399393333210#&4746324&#">]fpn@;98ys5i "4ɞl{)XPX@    @# H@ H   SY?+??3339_^]+]+9939210267! !.'!'.#"'6gv !) 6 4w5@6%)((UPm,JAENK=lf)IW<A@   PY  ??3+3?3?9933933310%>53#.533KO#Tjް=k`kp/O'T@) ! % %() ! QY" PY?33+3?3+39/99393339310"&'##"547326=33265'7jee=5/99/5=yy9 +ޙv+!w&jj#@&@/%+]]]55+55c&vj&Ҵ%+55+55\q&p8<@ &L%+5+5c&v8@ &%+5+5/&z87@ (&F(+ %%+5+5g~(4T@-//# ) 56,RY&QY QY 2SY?+?+99//9++9333333310# 4$32#"&'>324#"3264&#"326~(Q/#7]|@rcH?Nwme}{goukQwly&0:E"8I=.$#htugewq,5k@; 3&-""+& 67SY"-"RY+- --))0RY)SY?+?+99//_^]3+3+3933333310##"&547654#"563232>7"$&5463 3!4&#"s 癹:DWlhrF?N|MڭsRUDM*JI$22gY,KK-E6~h¨FFfxY*@  `Y ??9?+399310!!>32.#"n!=}VHh=x$+..fc7R/=&1&j &+55\Wq9.:+K@'%-,"PY )SY?+33?39/93+3933310!##"&'##"547#326=332654&'!1iafeegd=5/99/5=;3H3::ˣyyӡz66$WA2U@/0, & 34-RY-')#)RY# RY??+3?99?+3?+3933310 !654&#"'>32!327#"&'5326=.547UXc78((`)$69Xk7;)A0t:/FK[bYAYodK̇pcŹ  Av=A!&2G綕 nWMN,6@&-.$ $*RY$ PY ?+?+9933104&'.532.#"#"'53261@WM `Xkn*PqGJk@HvJ[{vd*0*Fo(ScUlE,/HnUA]10%<RE :@   _Y _Y??+99//+9333105!!!!!|mBEaW>: :@    PY SY??+99//+933310%5!!!!!OO`uX@ozZ+F@%'  ,- $aY*+++$ aY?+3?99//99+393310327#"&547'67654&#"5>32s*--5 *@ RY??9/+93310 #!53!):j11YZ/@   `Y ?+?99310.#"'>32!7>='%&''(kKqY$}Z^-HeKEf[3EqR̶nWV)@     ??99310%4''%&''%&%7_":a^ri S}[^̿zŎ"mr_GWE*G@%&&#+, $ bY _Y?+?3+3?33939333105!26=#"'#"&533265332653#GA0'fQ62sRtu).-7'0,8-]YWRtQJPRnnUAW:*M@(# ( +, )!%RYSY?+?3+3?339939333310%#!5!26=##"&'#"&5332653326533kgJ:j\Vb$o\mt[/;[0: Vjfejsti㨃Q㮊DTCV>@  aY aY  ??9/9+?+3933310327!!#"&54>32&#"}ez``'ٖiwbA$:/@?VV_pbwmFp  MDڧ/4WE9@ bY aY ??9/9+?+99333310#"!!>32)5!2>ZeZ'KPlRrR+Ax3zE A w)3Q@.*!'/!45 RY-SY'$$$2PY)$RY?+??+99//9++93310#"'.#"#4>323265'#"&5463267327.#".T7>54&#"%>3232654&'%! $@+JezZ5ok,%9kmn"*!IqU?0'&,A1JO̯P_N3YTW^4=KCu9^Z*7@$+,*$SY'RY?+?+993310%# $54>7>54&#"%>323267X}{+JezZ5ok,%9kmnr{=0!IqU?0'&,A1JO̯P_N3]P+4 Z #H@(#!"$% aY"##aY?+33?393+3933107>32.#"!5'.#"'632 g@wxG#Q+5;!`a2`_ <5+Q#GxvAH5~_f/(?q?(/f^V_N!Q@+  ! "# RY   PY?+33/3?393+3933333107>32&#"!5'.#"'632!jK>}QwGVI8K"QTDSP M8IVGwQ}>KzHfTLiG40r3r.6GiLTL"A@" #$_Y`Y!_Y?+?+9/9+933310#">32! 6$!34&#"3 q7^X<_3rr+3R9DVE[_S!?@! "#PY SY PY?+?+9/+393310#"!3#"32654&#"5632_Ͽs9}~pxc^DCca{""/cm^^QWo]!D@"   "# _Y  ??9/933+3933333310'654&+!#".546;!32] >N%&M? '& m)8?8b9>8)!l>š N@&   RY  ??399//3+33?9933932310#5!%1WW`$A(B@$&  )*#RY# RY??+3?99?+393310 !654&#"'>32!327#"&547UXc78((`)$69Xk78((c%YAYodK̇odYW|N'8@##()!PY&PY?+??+9933310#"&'32#4.#".3 4&#"32|j,WuK ,aN?{v|r*K>uu18sq ]/BnUNFuW`MHZ\V:G@' SY SY SY ?+?+9/_^]+933310"!!3!! ) !) oxxvs  wq:G@' SY  SY SY?+?+9/_^]+9333105! )5!267!5!.#w )! osvywEWgPZ&cjE032{z'&%9LrNJMwD:*ly%^@a+:JBx&Ev@ &e %+5+5PZb@: _Y _Y  _Y0@ 0?3/]q+?3/_^]+9/+9333310327! !2.#"!|yN8;tK"84XeXBju&Z61E,1&,j@  &%+55+55fE-E!U@+" "# bYaY `Y bY/+?+?+9/+/939933310+##"'53267!324&+326ڈ';'5836 cSP`o<{iڼdrQkMEM@&   bY  bY?3+?39/3+333993332310+##333324&+32p_ lEؾapeEC@% _Y aY0p?3?9/]++3393933310>32#4&#"!!5!JM9L}Na+: ֏^Ja&v@ &D %+5+5G&C&+5& @ & ! %+5+5WCE 2@   `Y??+3?399393210!!!!!'k'WEQWE$E ?@    _Y _Y_Y?+?+9/+99333910#!!!!24&+326u֋E]VVE%xEEhEG@#    aY aY?3?+33?+9939333310%3#!#367!#@OS8AAhxt rzE(E"u@;""$ !bY ?22?339/]3+39933/33333339393339310!"&'!.'33>73!#4&IoX$G76H$XoI&0B)Pyr;p:Q)6ZxY'l@8!) $$()!_Y aY_Y0?2/]+?+3/_^]9/+9993399393310"$'%32654&+53 54&#"%6$32^A)xyEE'wfJ>]qnhUZUM_=ƚw#{tfGE <@"   K [   DT?2]2?33]993333103!!!47QE` fG&&%+5+5EE@!    _Y ?2?39/+993/339339310!2!!#!&}1*sKE&B[ HE/@`Y `Y?+?+?939310# #"&'53267!!,1'e#; !:E=CQ͆ rcjE0CE+HZ2CE#@ `Y?2?+939310!!!!QEvE3PZ&=E7E/@   `Y?+?39/33999910"&'73267! !;G*RYGFY;3Y+$Br#*X}|y> OWE;WE 4@   `Y??+3?393933310!!!!3'>'WEQcACE&@  aY ??39/+/393310!#"&5!327!B_[gf'$S!YtE 1@  aY?+3?3399393310333333YEeeYWE>@   aY?+33?33?93993333103333333#YXEeeE =@   aY  _Y aY?+?+9/+99333310 #!!5!4&+326$'QPO}F~ia`\kojO~E >@    bY bY ?2?3+9/+999933310332#!4&+326#3O6aZ5;]XEEغgje_EE 2@ _Y_Y?+?9/+9933310#!!324!#3 '묲hEǸ9}Zg@;  _Y _Y    _Y ?+3/_^]?3/^]q+9/+99393323105!#"%>3 ! %3267"Ls;8Ny8VujBO4VZM@'   bY bY bY?+?+9/+??993339331032#"##3&#"326¨¸ cgDHJBEFGF,(@!E] CE H@$     _Y_Y ?22?+9/+9/33/3339103.54$)!#;#"]٭#|E'xYjNDf #N@(%!%$! PY  RYPY?+?+9/_^]+3939939104&#"3262! 6767>Zhsoq|pvR(0FJB&(AEkn: P@(   "!QYQY QY ?+?+9/+99933939310 #!32654&+32654&#zրslrze`r:^{l:uCPUD:IC>,:@PY??+99310!!,::h:H@    PY @ PY?+33?3?+939333310#!#36!3#CeT }Hh/|hVpcdiNH:!@P !!!  "#QYO_?O_ !?33?339/]q3+39933/33/993339393339310"&'#.'336?3###CVI^^IVFEe3KD6d&bFN&}@E   ( $$'(  QY `   QY PY?+?9/+9/_^]9+9/_^]993399393310 732654춮&#"'>32LlV`fuj^lv}{4,JZO@TLGM potklsop&#~gǝ 1:[h: 6@  @ PY?+3?3?993933103!!!3#e:|oC:-@ RY ?2?9/+93933103267!!#"&5:gdU:~8O~: 5@  QY?+3?3393939310333333O:{{Oh:D@   @  QY?+33?33?99393933103333333#OE:{{{: =@  QY PY  QY?+?+9/+993333102#!!5!32654&+Q+X|tiY|L'JUKAcj: >@  QY  QY?3+?39/+9933933102#!332654&+! bRMf!:M&?[S?':w: 2@  QY  QY?+?9/+99333102#!!32654&+zs:L'NSJ@fMNu@E   @P`  PY PY PY?+?+9/+9/_^]q9/]9939333310%3267!5!.#"%>32#".f lPii5hfX` Ҁh de}cS`FNO@(  PY PY PY?+?+9/+??93933933103>32#"&'##332654&#"6ž l?MM>;JOC1:⿰ C: ?@  QY QY  ?3?+9/+39333310 !.5463!!#";cBrwͽMvؗdi&HC"&+5di&Hj@ &! %+55+55 WP'l@<%%)(QY!! RY!! !p!! !!SY?+??99//_^]+33+3933333939910"'52654&#"!#535!!!3>321dF3J4TYf}煅,9wW Aarmh|p,&v@ &q %+5+5gN{@H @P` PY PYPY?+?+9/9/_^]+9/_^]q9333933910%267#"32.#"!!Pl ҃ `Xfh5hed o_% +Sc|yPOVv{Lv{&j)@  & %+55+55uW`M:#L@(%QY#QY PY QY?+?+9/+?+/9333310#"'532>7!32#!32654&+(:mx%%+( 54 bRMf!|>гK 8OL|1?ZS?\:M@&    QY QY ?3+?39/3+3993233333102#!##33332654&+5 bRMf!&:LM'?ZS? P\@3 QY RY p?3?99//]3+3+393393333910>32!4&#"!#535!!!9wQ\f}熆,:|pzEwmh&vd@ &H %+5+5C&C&+5&W&\ @ & $ %+5+5hC: 5@   @  PY/+3?3?99393310)!!!!#:{h?Y1O@)  ** 1 32._Y%'. '. ' _Y#'?3+3?39/993+3933310.#"3273325&#"'>32#"'#"632!1+3$$3+1*jKaaBbKj*?w#w 7364'X$lNzek]VV&N@(  QYQYPY?2+3??+9/+99333333310!!!!3 #!!32654&+&:f*xt+:nŸ|3IQLFcXL@*   _Y `Y_Y?+??9///+?+9333310327!"##3332.#"\Zd7ZvyDz&K19Z/%EĿHg|KN#g@9##! !$%PYPY""PY ??9///]3+3?+?+933333333310333>32.#"3#3267#"'#KaӦ D=FLNF9M Λ`:ITcee;E D@!    aY  ?33?9/9+333339933310###!!!3' DGXEl*EO5: L@%    PY   ?33?99//9+333999333210#!!!##3.'HlPkH(,[:[v`!>EW@-   aY ?222??9/93+333933333333103333######3'>?a03bq; Ez/#XD:b@2  PY ?222??99//92+333399333233310333!######3.'Dљ&R76Sb8:$[[[\ KYtEW@-   aY aY ?33?+9/33+3393333333310##"#467!#4&#! KQǞSJ''u3H 0u9O~:T@,    QY  SY ?33?+9/33+39333333310!#"#54>7!#54&#'!OkjPhfpai  heٯqx&:E!c@5! "#_Y !aY??+?3339/33+339333333333103!!##4&##"#47###:a&~;349'zE& 0s'u3uC#F: b@5   !"  SY  SY  ?333??+9/+33339333333310!##547##3!!##54/#g{bUw@`| ߯ZTy: gcٯ PaO@ G7AAD&>1!./,.1&GQP8:5: @-Y5/ /@1 aYD!""!aY "++" >..)bY._Y6?+?+39////+9+?_^]+3933333333331032>32!4#"#"&54>7>54&+532654&#"%%37>32&#"Mr0fmr;I"[m{AVǠw@99whKhfR>`:M ^;la.gT&]#*#jE'D8bV]`X];7?W?9KV!{![V5 *WLP@?: ),/00E#33QR/ BISY QYBFB  BFNN=SYN$&!& @Y! @)QY?+3?_^]+3?+9////_^]++9933333333333104>7>54.#52654&#"'>737>32&#"32>32#.#"#"&F{zO-6lNHOaoƑj&N;g>Py}{Q]=91SQW6oz'#'>H\C^uE"5*7=GM53#.'33JN%IIWUް:|s`kpHZ %R@*$ &'  `Y$`Y  _Y "_Y?+?+99//+3+399333310! ! %".#"322327#"6H)JE@4:".+@9A2'+ npch0?0H>8 14 pp[j(0% wv*Y5@ _Y ??9?+333393310)!67>32.#"l4!)( X&QG-'E{}߅kFR *9N"N6@ RY ??3+3933393310)!?>32&#"})8"(i8l{t2%-5:2vBE=@*&$f@ %"&+55+55"&%a@ % &+55+55WZ!,K@(  "(" .- %_Y*_YbY?+3?+?+?39333910"'532>73767673#"324&#"326:83Z  ż'u2350e41W#I{/LLۼReXYX+WN)O@+  $ +*!PY 'PY SY?+3?3?+9?+9333910"'532>733#"324&#"326B2%)3'Ù1ה~3+,55(-5W %Wk/%0-ŪH%9@$$  '&"" ?3/399//9939333210#"&'$7>32'#"'6326iBBjiBBh\_>WW=_`>UT?a:9GH9x$K98HF9t(}<;}ׂ:;\q):@''##! +*%% //399//999939333210#"&'&547>324&'#"'632>qZ89YS31Ro)-9VT8.)_7ML73/.0;;0+,(0/&L+|)B?*yO77(?M@ %F/<<6M FNO2"J"_Y5**CJ YJ @ YJ @ 9JAC,(C(_Y?C?3+39?32_^]++99//3+3933310#"&'.#"#4632>5#53.#"3273265&#"'>32#"'#"632>GOU{@d`Ț3[VFj*!:6]YY^6:*jKaaBbKj*h49<1sgd -d#\*wR %/9/9/>>=QY>  RYRY"?3+339?3+3?+99//3+93333333310%#"53"3267326544#"#"&'.#"#4632>5#53fL^ܽaPIP$B;2I'PIR_ϩ_GOU{@d`Ț3[VFj*+?3 +新 60&~49<1sgd -d#\*wR?w&f@ =2* %<&+5+5|_&R@ # %"&+5+5WZ=@   _Y aY??+?+9/39939310327!&!2.# G=8:tKl/["ǾBjuWpN=@   PYPY??+?+9/39993210&532.#"327 `X{sL:W" +Sc0@    ?/933333310%%#%77%732{83|[jz28z2kzaaaaaaaZ_@  /32333310#!#"&5463!54632_G2F35DC6SF32GS5E 732y'NYf?_f5[TU/uzȄ)2)$S{ @   /23333103##.5zl^3+Fd>uHS{ @   /2333310#65#53{+3^lNIu=dFn>@   /32333310#"&'.#"#4632>YkpI}xLttYn3:<1sg.663% '1;EO@U1O-KAAKO;77PE 'E'##Q#FK>C HH%M 27 449(-**/KCM79-//-97MCKA</3/39////////3333333333333333333333992333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EO@a;<7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96mh#\@  $%  `Y  6 @ Y??329/+??+9999339333222103!!3##47".'332>73Qy6U#DNMD"TE` tf73]cݍU#DNMD"T:$.'2:f32'#"&'#!4'327'7654&#" 0kVN^k*4_@5)`i`>b5:y(_f񑋊(a^^dwUaF`Yw2@ _Y`p"&H/+q??+9393103!!}uEdD&@  PY???+9393103!! ::(xE =@  bY  _Y ??+9/3+39333310!!!!#53x`;ىE=?t,: =@  PY  PY ??+9/3+3993333310!3#!#53,ώ:YWEE@#  ! _YaY_Y?+?+?9/+3993333310!!>32#"&'7324&#"!DFR2|曀OJviw=[1E&͡Pc|T%!Wq:H@%  RYRY  SY?+3??+9/+993333310%#"&'73265#"!!!632qE4bCst9zpvcVUz2$,:(whE&]@"!  %$ %6@  bYbY "`Y?+?3?339/3+3+3?//3933310!##"&'!.'33>733#ȳ04&IoX#J54K#XoI&kZB)Pyt; s:Q)*th:%p@$$% %'   @Y#QY PY %?3?33?+99//3+3+33/33339333310"&'#.'336?33####CVI^^IV@e=Ee3KD>Zz&WxY4x@= 3 -* $0056-_Y##3'3aY3'!aY'  Y?+3??+?+9///_^]+99939333310!"&'53254'&$'%32654&+53 54&#"%6$32,a DN >(~yEE'wfJ>+<]nqhUZUM_=ƚw#{hbWFN4w@B)"## &&056"-3QY-))QY)QYQY??+9/_^]+?+99//?+99333333104'$732654춮&#"'>32!"&'532= Q`fuj^gz }{ɷ,a DNz+< ),JZO@TLGM!!##!&2/i'1#yi3.E#9D8:R@- PYPYQY ?2?39/////+++/3993332310!27367!!##!,S5E9*{S!':D4!r(B;CES@* bY ?3?39/3+39393399333331035!3#267!!#!#'2ph,|/Pډp0#X YIO@(   QY??9/3+3?399939332223310#535!3#>7!!#!|}1.8*~,:>4$TUR0 AEC@"   _Y?+??393393933310#5!267!!#!:{D#hCaہ~&=[ :A@!    RY?+??393399339310!5!>7!!#!Zc0/8)~,:>3P0%USR0 AhED@!   `Y  bY6??+??39/+9939332310%##!!!!!'k'>Ezh:A@!   PY  PY?+??39/+9939332310%##!!!!!{1:TvE ?@   `Y _Y ?3??+9/+993333310!!!!!!#'>Eq: I@&    PY RY?+?39/_^]+?993333310!!#!!!:T1:HWEM@(  !bY bY bY?3?+9/+?+393333310!##!>32#"&'732654#" M7дb=0LOQE=43sE&PchT7WHW:L@(  !PYPY  PY?+3?3?+9/+93333310%#"&'732654&#"###!632bvb8/JSIJA+;_@`|AK~Hr|:G 4^@1  '1%'.".65+_Y++_Y%%aY411_Y?+3?+3+9/+99393332210>54&#"#"'#"&54632&#"3&54>32327d"4(.,4:Bk`h]VV12zpMb8/qH6dzg$44BW&qh_/wM&0Y@/'$ ++ ..21)QY RY .QY PY?+?+3?+9/+99393332210"'#"432&#"3.546322674#">TNWgUTJ0Tb+7~X,r2TIH*!'##$9#¡@PG,!PWZ#U@&%$"_Y_Y  Y ?+?+3?+99//99339310327!"&'53254'&!2.# |Nx,a DN8:tK4&j? Jd>ǾBjunWUN%M@(! &'$QY  QYPY??+?+99//?+99399323104'&532.#"3267!"&'532_ `XPl Ù,a DNz16 " +Sced bM=hE :@   _Y `Y6??+?+3999933103##!5!|jSatanh^: ;@  PY 6PY?+??+399339310!#!5!!3#|z|BE<5W: $@    ??39/999310!>!a)8 ?&VW:20IWE>@      _Y  ??39/33+399933103!!!53! !x5,05!?65W:@@    PY ?2+3?39/?999333103!!>!!!!5!8a)8 ?&V8:20IhE9@      `Y6??+??399///3/910%## ! ! ! A^86T4t~R-:h:D@&   QY  PY?+??399//+39310!# ! !! 3#;/1x/ bhED@    `Y  6@ _Y?2+3??+39933933210!#!!3#!#EQtah:D@  PY 6@ PY?2+3??+39939332210!#!!3#!#@:B||AhE=@  aY `Y6??+?39/+993933210%###"&5!327!NUúZh]'t S!Sh:>@   RY 6 PY?+??39/+9939332103267!3###"&5k.UrzV:~ 8ACEO@,  aYaYbY ??39/////+++99393332310!#5"&5!367!IYiSúT`ic?'SmA:V@1   SYRYSY QY    ??39/////++++99393332310367!!#5#"&5OLo3fKNo4M:~KOY˴ E6@ bY aY ?3?99//++9933310>32!4&#"!B_[gfE$>!_EPKZ&\@/# $(''  `Y#  _Y _Y ?+?+9///3+33339339333103267#".54732"!.JW 2Ҵ}~& -S]b8Qq-ȱ#0S_;8-< !A: N$b@4"!   &% QY!     QYPY?+?+9///_^]3+3993399332210"'$547>32!327"!. %#-WTq 7ՕKQ?TTz0B1+-Z")i@6&  ' +**`Y& #_Y @  aY ?+??+9///3+3333933993333103267#&.54732"!.JW (~Ծ}~& -S]b8Qq-S_;8-< !A: N&r@=$#   (' QY#      QY@QY?+3?+9///_^]3+3993393332210.'$547>32!327#"!.s %#-WTq TdKQ?T Tz0B1+-+1E,&@ '-%#&+5+5&@ &,%"&+5+5WE ?@ "!aY _Y??39/+?+9933333310)!2!!"&'732654.+&}1++]_btmE&DPc|TyVW: ?@  "!QY PY?+??39/+9933333310#"&'732654&+!!>7!}MTv0/8)~"V4>|BRuGA:0%US=hE=@`Y6@ `Y `Y?+?+??+99333310# #"&'53267!3##,1'e#; !:E=C[Q͆ rth:D@  PY SY6 PY?+??+3?+99933310!###"&'5326!3#y:/4F_E$_+8;;D|eV$ h0WCE=@   aY `Y??39/+?+993333310!!!!!!"&'73265'k'R!h9wq>EPc~(.WC:C@$   PY PY??39/]+?+993333310!!!!!!"&'73265)}}MTv1:T&BRuGhEF@"    `Y   `Y6??+??39/+99333333310%3##!!!!!Cy'k't>Eh:S@$   PY 6 PY?+???39/_^]+99933323310!#!!!!!3#y}1:TAhCEG@ 6@ aY `Y?3?+9/+?999333210#"&5!327!##3NUúZh]'| S!hTh:L@$  RY PY6??+?39/_^]+999333210!#35#"&5!3267!vzV.UrhV8~ chE!M@! #"  !6@ `Y?+??39/?999333333310!#47#&/#!767!3#0'|~) [Od,dbE 5!!;tch:N@ 6@ PY???3?+?993333933310!##!767!3##47G A-fn:[J^gv{O&$ I@ %&+5+5j&D@ 5<%2&+5+5&$j@ %&+55+55j&Dj@ 75%9&+55+55ENz&(@  % &+5+5di&H@  ' %&+5+5HZQdiNHp&Q F@ !%#&+55+55di&j@ " %$&+55+55p& F@ (&%*&+55+55&j@ '%%)&+55+55xp& F@ -+$%/&+55+55bF&j@ ,*$%.&+55+55.EG@% bY   _Y _Y?+?+99//+39333310!#"$'%32654&+5!̬E\x;nE͠]ygssdW^:SG& J!C@ %&+5+5Cf& J0@ %&+5+5Gp' F@  %&+55+5C&j@ %&+55+55Hp&2 F@ %&+55+55\q&Rj@ %&+55+55HZ C@"_Y _Y  _Y?+?+99//+99333310! ! 2!"! !!bYYZpE\qN I@'PY PY  PY?+?+9/_^]+99333310#"3 267!"!.q lp @ llkm  h%  $^ညHp' F@%&+55+555\q&j@ % &+55+559}p& F@   % &+55+55fM&j@ #!%%&+55+55f& @  %&+5+5&Wf&\ J!@  %&+5+5p& F@  %&+55+55&W&\j@  %&+55+55& Hm@ ^ %&+55+55&W&\@ @! %&+55+55ACp& F@ %&+55+55oC&j@   %&+55+55hxE 2@ _Y `Y6??+?+/939310!3##x`EtDh,: 1@  PY PY?+?+/939310!#!!3#9:BO~p& F@  %&+55+55cj&j@ %&+55+55(WxEV@-  bY aY_Y?+?+3?99//3+3933333103!!!!3#"&'532=##(`;o0t:/I0  }Z3tW,:b@5PY PY PY ?+3??+99//_^]3+393333310!3#3#"&'532=##53,ώU0t:/x:  }mWEE@# aY?+3??39333399333310#"'532654&'! ! ! ҥsU:/G:-<^86TiC. *-.h]t~Ri1W:E@%  RY??3?+39933333310 ! !!#"'532654'd}/1}P;'aU:/E2Lx/ bmfo6 4<6nEX@-       bY ?3?39/3+3993399993310!! !!!! !!r 86@Ru1:S@*      SY ?3?39/3+39999393333210!!!!!! !!z/1 OMbZ7x2DE 4@ _Y_Y??+9/+99333104$;!!".%!3# 2'* h{saAGE %H@%&'!aY!bY bY?+3?99//+?+993933210326=#"#"&5!33323#".;?FT]Y^7;nNL]^졩Th>}pxzeI{}*=E!.M@(( ""/0RY %PY ++PY?+3?+9/??+99393333210%#"3235'3326=3#".4&#"32>a*^X$),/-䖢UnG>[VOJFQ3Q/fy`_`n}*OǧƸZY*P@)$!+,$_YaYaY?+?+9///+9993993310%23#"&'.+532654&#"'>32^졩 Lc/!FTA7FT/Ɵggui #}]Mk[IRdp3s$wtx[.N&Q@+ '(QY! !RY! QY ?+?+9///+9933331052654#"'!2326=3#"&'.#^x3e}{~%*)'䐢iױ=W-b bZcKwnMhY!X@% !! #"_Y!!`Y!6 aY?+??+99//+99993333104&+532654&#"%6$323##:;;{lLFq`eY`d[`=Ǩ#`tuhMN!V@- !  "#QY QY!PY?+?+99//+993333310!#4춮&#"'>323#\NHOa綴}{}w7TLGM!4(+-'왧`'$/ElW#; !38.!9nu}w4 \: <@  !"PYRY PY?+3+?+9/993310# #"'5326!326=3#"&5GW$9BbaR;+9:1:),/-䖢|M in}HEC@" `Y aY ?+??399//+9939332310323#"&5##333]^졩}vEK:M@)  PY  RY?+??399//_^]+993933231033326=3!"&=##0_15:T}$1:PhZ*\KN# E;@ _Y  aY ?+?9/+39939331032!!"&5!5!oZa_}$:<@  RYPY?+3?+9/99333310!#326=!#"&5#E2P6.19&%@H&xAR;D9/&%@H(vAR4K?)N R?]1044qhN\hm/10#'73@ /3]9/10#52654632#"&gt. !/." .Rji\ 0/!"..N R?]10463"ëgrNmh\N N@ R?2]210463"!463"ffsJgrNme_mh\\;q)+7!@//))55 P##/]333]223104632#"''7&732654&#"'#"&546324&#"326~YY~[;.XRXx7((:<&%:XRX/:\}~[Y~y:$&<:(&8RY~}ZZ}XTX0;(89''98(;0XTX}ZY~~Y(8:&'98q;\)@ /P  /]3]2104632#"''7&732654&#"~YY~|[:0VTXw8((8:&&:RY~~YY~XTX,?(88((88N @  R?]29/310#"'#3326= WW"dd !0&2Xf fL -72#!@@P` /3]]9/3310#5.=3326=3#gN;d'30&gf\\ dN1150051 /]210!535 #j/10#'73 /]210#5265 grRjj[@  /2]22310#5265!#5265fgrgrRjj[jkZ @/]1057'%㎪3P3LN q;\)@ /  P/]3]210'#"&546324&#"326XTV28[|~YWw:&':8)(8R?,XTX~YY~~Y(89'(88#N R?10#'73NN R?3]10!535 j ;P{=) / /3]2104632#"&732654&#"~YY~|[[|w8()8:'&:RY~~YY~~Y(88((88 @ @ /3]q2104632#"&4632#"&/ ".0 /-" 0/!"-b".0 .. 00 0.9 #/;'@39!@!!!- ' /333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&9. ".." .. "--" .s. ".0 .J. "--" .0 !./ ".` .. ".." .. "..".."".0".." ..".0 "..Vu@@ /3]q29/3105!74632#"&4632#"&VH7."".0 ".. !/." .mm@".0 .. 0/!"..Vu!@@ /3]q29/33105#5!#74632#"&4632#"&oHk."".0 ".. !/." .rmmr".0 .. 0/!"..B  /3104632#"&/ ".0 /".0 ..)D  /333104632#"&74632#"&0 0/!".. !/." .".0 0." 0/!"..) #@!@!!! /333]q2104632#"&74632#"&4632#"&."".0 0. ".0 .t/ 0/! /b".0 0/!".."".0 .. 0.  /]310!!G}j /105#5!#1nGjujju @O    /]]3104632#"&/ 0/! /h10 0.F  S?3104632#"&/ 0/! /10 0.wT #@ @!!! /3]29/3104632#"&4632#"&4632#"&w. "--" .0 0/!".0 0/!".`".." ..I 00 00H".0 0.q  0  /]3104632#"&/ 00 /#--# --//31053/oHyL/39910!!H;LG //]]310!!Gj`//93103` wA /  /]3104632#"&/ 0/! /10 0.F  S?3104632#"&/ 0/! /10 0.=!@  N?22933310!!!##1 1  /3104632#"&/ 00 /f10 "--j  /3104632#"&/ ".0 /".0 ..#2@  A TYM TYN?+?+93104>;#"!!#NɽfFP[t6bL /10##57#5!LJ@     NM?2?3993393399329910!>?!!!>7N;m.1   4^gN?HI$6NH2ef@"T#L6@  TYM TY N?+3?+93105! 3!5!4&#{T$#8@ NTYM?+?39/3933102!!7>?.+5izR@.d61%5)$JugP3AJ&W!:\]>'o-@  NTYM?+3?9310)!5!#`HP}5@  N TY M?+?39/93310)!!4&#!5! s  'љ}MN??9310!!' :@   MN??39/399993333310'!467%lF7Ta##a]Xl*smf -@   NTYM?+?39933104&+!! !X(1b;@ A TYLM TYO?+??+93310 &!32>54&#"5632Rckv3NYY^]Up%~NӰ98xڍF@ M?]9310!!mN & QTYM?+?99310!4&#!5! `'R{;4@  A TYMTYN?+?+993310)5!26=4&#!5! ;>ZRTq\5@   A PJ TY M?+??399333107$54#!!!  @.b^6Xw&{mf4@ A TYMTYN?+?+993310)! !4.#f(8zo u=hV@A M TYLTYN?3+?+?939333399102!5!4.#" !67!6ӘOL>??SADy߈2,+ZlxpAKkMQ??9310!!2@   A TY MTYN?+?+9310)5!4.+532N$TQլNʇs1\һ E@  "!A TYMTYO?+?+3993339310467#5! # 32>=4&#b;0<+kV=y_e,sc:P'Aj-ˮGJ5 @@    UY PM?3?+9993393107$7!6!5%'s^#N/]j$q\=@   TY Q TYM?+?9/+9933910 !4&+3!#4򄥦%fuN@TY A TY MTYN?+?+9/+993339104&+3!! )5! d&aZRd?j?@  VY MQ??39/+39333910!4.!>?!%a6NgTUNf$uw.wB@   MTYN?+?39393339910)5!!>?!mD{A= >vc0z鍚h(u{y?@  QTYM?+?9/9/3933910!!2654&#!3ޞp{TvJpZN & NTYM?+?99310)4&#!5! `'ћ{J@   M TYN?+?339/3933993310>?332>73!3f>8  8hfP!`43fپ B]V?7qD@TYN TYM?+3?+399333310#5! !4&++53265ו aBDNA3ɠ~Xm' ' F' 3J?910#!L{ J?329910#!#!m״{{ : +@  SY  ?3?39/+339910)'!!! ]&X[:N:_@5  RY SY    SY SY?+??+399//_^]++3393333310!#!!!!!!#KX'+v{  :oN*5=c@3+ 2::;))?>6&6QY;*;QY2*** "&. QY ?3+3?39///3+3+3993393333221054&#"'>32>323267!"'#"5%4&#"7>2>7!YL<@%ts"2d{<813'GU)&Nof]I(H,EVLA-nzvr7]lJIȋ$+@Io6]AuR/:'b@3$$ )(# SY    PY $PY?+?+9/_^]33+339933933322310##!#53!23%4&+3264.+326vttͷ7+{NfbR(V^\1z=V#|B3<28=nUNFd:(@ PYSY?+?+9933103! #'2654&+ |:ɭW9n: R@+    SY  SY PY?+?+9/_^]3+399333333103! #!#2654&+3#9t St|: G@&  SYSY SY?+?+9/_^]+999923103!!!!!.:N'\@3!""  %% ()"  QYQYPY?+?+9///_^]+99333310"&'732654춮&#"'>32Q)kIPYNHOa綴}{,JZO@TLGM  @   ?2?3993310 ! "!265e+!o>  ~x}v5)%@  ?3/39333104! >54! .5% +Sced o_  `XPl "T@,$  #$ ?3?393393333393310 47'563 '"6527iY|ג+SrΎ\GE^D4H $qvǃeqifN'-b@2" **+/. %((PY+QY % PY ?3+3?399//++3999933933332104&#"'>32632#"'# 532654&#"27!NF34"kQSOUHNI??CRJ6VBA-籱?+:rla:)I@$'' !!*+$$QY PY?+?39/+9999333333310".54675.5!3265!'2654&#"fzp^xrebly^rzp}~op||gz&pr%zgzovwn{EN @   PY?+29910! !4&# E  ~x+E @   PY ?+29910!265!! lx~&*: 4@  QY QY??+9/+9933310!!2#%!2654&+a\gfn:\HNX:: C@!  QY QY  ?3?+9/+9993333310 !.5463!!#";`BrwͽMvؗ:: A@     QY  QY?+?39/+9993333310!!"&5467!#"; xq3нƜwM":)@ PY?+3?999310!!!!x:|c:vJ, +@ /33?39333310! 54&#!!267##!J_HWo,|pQDf} 9wR,  L@&  "! RYRY/33/399//++9939933333210! 54&#!!267##!3#3#~3Wo,|p}Df} 9wmI.&D@ "" ('&&/33/39/33933333333310! 54&#!!267##!! 54&'!I_HWo,|p~nQ_Vj 4l57wRi:Y :Z5:]<M@( QYSYPY?+?+399//+39333310"&'732654&+57!5!@)kIYdcwa5碌o,JZTN[PκeU$O#N@'  $% @ ##PY!PY?+?+99//99933932210#"&546752654#"'>32"327$۳Ռ}۳Ս|j e=Nk e>J N+:@&&,-"  RY(?3+3?993999310%#"'7326?'.546323267#"&'f)0[}@$^.2@6o7,߻-5o6@2._#@|Z1AMUG*.#KCOX22ZP@K#.*GTN:@PY??+99310!!::L:M-B:#@ PY?3?+993310!!!B}:|::7 :>@   PY  ??339/3+39939333210>5!!.!!TQ"\ͯ#RS/m ^Ct52 @:+@ PY PY??+3?+99310!##"&'5326!&:/4F_E$_+8;;D|eV$ h09 5@    ,.?3?39/399333310'!#3 !sUU]\.+_HM@     ,. .?2??99//3333339333105!#!!!!!#3Bu@#M?*AH# =@  ,.?3?39/399939332310#!! 4&+3264+!2#Į!dZ]tzRQUM8Ut{JD8=K"M@#$ ,.?3?39/33333999933332310#!#53! 3#4'!!24&+3261Į!77d5L2ɀ8RQUM];܈RN Yd 8@     ,.?3?39999932310 #33 xwg^>\,.?2?993103!M9@  ,.?33?3333993333104? # #!?!HI !  ZtM*hU6Fq/ 9@     A ,,..?2??3?99333310 #3&53_  |7tNA 9@   A . ,,.?2??3?9933331033#47Ͳ  _NtJ7|J %@   -/?3?3993310#"54324&#"326J̔ &1`@)'' --# # 32 **&& // -??399//393339999333323333310"32654#52#"&54675.54634&#"326?9 ;@    ,.?3?39/33993333310##!24#!!26\߭pcYRyᙏg_T(@  ,.??33999310#!5!4*@ %@   , /?2?3993310"&5332653\samrǻm}ruV;@   , ,  .?333?3?33333910#.5#3>373 x2-}y 5t>&T+"XP<)&1K@$$11+32(% 1..!/?2233?39/939/9933932310"&546?54&#"'>32327#"&'#3265jx8461&HEP=bY?0(F\wot}'RA2: ps6;lIHp9<65oO&1I@'$+23'%$$!''!.!1 /?33?33339/93399339221023267#"&54&#"5>32367>54&#"jx4861&HEP=bY?0(F\wot}'NE2: ps6;lIH9<65oO"9@   $#1 / .0???3?399333333104673#.5##"&546324&#"326><PMKSl^ 54&267!wUXl{8;95NYSFfLGc?-4@JKwov|'NE48 qrLLjo[ЋtQ /%65[^]\ 9@  !"1 2 ./?3???39933333310#"&'##65336324&#"32ŒPr AJMMQPMjHAN-Kch|ͼ}{;@   !A 2 1/.??3?3?9933333310.5##"&546323'34&#"326 ><ONKS[ϼч~z;@    H1/?22?39/+333393310"&54632!327"!.n(MLeLBJKükv[`Y]\5@   /1?22?39/3333933102#"&=!4&#"'6267!_MLeL@JKükv[e[^]\5&E@ %(' H 1$!/?22?339/+9/2239939310"&54675.54632.#"3"3267kcRNPz}@815[enZ=6/J :skKh ZBZtng/6/*63|6;-8<85%9@   ##&'1/?22?33993933310"'732654춮&#"'>32a: J/6=YogY518@}{Tk8<8-:7|36*/50gnoX& eJkz *=@&! +,0$1(.?322?3?99393332210%"&'7326=7##"&54632346734&#"326d C6NK>=QKLQkb.4cg(KȺɉ` ͦw%@  0.??933310#5#ƿa; <@    02.?3??93999323310#33 RY;@ $%& 1 0.?33??33399393223104#"#4'33>323>32#4#" o;H #jI%"iTmpp8HzbgPu6HPXNSSra^;@ ! 10.5?22???3993333310%"'52654#"#4'33>32C1#2#DV 'uQu}f/DycgPu6HPXOfl %@   1/?3?3993310#"&546324&#"32űůVRTQhոz}-@   1/?2?399//993310"&'732#"'>32]J6tےz GG ud !@   1?329933104632#4&#"İVRdze !@     /?3299331032653#"&5RVǾezҸ9@  !1 0 5/?3???39933333310#"&'##4'33632#"32ŔPr@ǘLQPLjH@waN(Tϻz|=;@     0/?23?333933333310"5#53733#327]g3Ɂ0VA%A@   &' 1@   "/?3333333?3999310#"'732?'.54632327#"&'f&i5fU+@87'%K2%~~%2K%'7=;+Tg5i&|.=633:4`=^-hh-\?`4:336=)H@ ##  *+ &2 5/?3??39/39993993323310#"'##463232654>54&#"ȢtZhs[0NQqpWM;?JGBCKu?#_PV_PF3F\p%@  5 0?2?99999103>3#67ʐ @,=t A9+ ?@  2/?3?339399339332104&'32'#"&5%'5! AGTMZdOXȧ<D@OJLfqKw»pg" @@   !"1 1/?333??399393333210#.54674632#"6"?F[PvaTv  ɼ~qy̯ 8@    501?22??399993932102?3#/#.#"'6s?Wg (i̅#3u*&:O*b1BD[#IF x&fxA-jjrwxrzP)@@##  +*&D A??3??3993339933310%#"'##463232654>54&#"ȢtZhs[0NQqpWM;?JGBCKu?#_PV_PF3F\pLr}n{&0@ ""('%%C@??39/399333310#"&'32#4.#".546324&#"32ֹIv >wwsG3RQVUYTQ4*PO"Wjiֽwsl~v}M"L+N &T@, $'(!PY#QY##  RYPY?+?+3?399//+?+993393210"'# 332363 !3267"!.vRG::N?(NF34"r8_L`+BA-ql.;]@/66$/++ $=<*3'3PY'9!9PY !???99//33+3?+399333333333310365'"#>35!2673+'3>32#"&'#32654&#" %) |+TD ,$ z,TE )oֵh-  5a?`igdbqd/@fg;L:4bi=8[dca,w #xYa0=^@/77 1.'"0 0>?+&&& 4 4PY ::PY??+3?+3?99//3399333333333310!.5##"323'5/"#>35!32673+'4&#"32>1 5jϽk* %) |+TD ,$ z,TE pcdgi`>b5~kY, (a^/@fg;M:4bi=rd"Yub.Y@-,%./0 #(PY#PY,??3+3?+9/23339333333331032673+'#!'"#>3!5!54632&#"! ,$ z,TE  %) |+TD˟b]|x:4bi=/@fg;SQe9N,5>q@:.))$!(-,,86 (@?2<'*Q!.P 6  # # )?33?9///9922?3/32/39333333333333310!&'##46754'33>323>32673#'54&#"%54&#"|IoF="iMXW(oUvfnD:%23;Y[h%2*: 0n*0f]`djZѥ3mz&`P'iv> vO%/i@7& )"%%01-R$QQ)Q&Q)&! !! ?3?9////99?299333333333310!&'&'!"#46754'!3>32>7354&#"8^m; 5|mf  9w3|[af[\ZpX*3-4; h{qг59~BQWlO.<f@3/.+& 66 =>&"**&& 3 3PY 99PY??+3?+3?99//3333993333333333103>32#"&'#2673+'!5'"#>34'32654&#" 0kϽk* ,$ z,TE %) |+TD4_@efi`>b5:y(_fa^:4bi=Q/@fg;dwUY9N+K@)% ",-)RY)QYQY "??9////++?+99333333310&#"32673+'#!'"#>354&'!3>329pd ,$ z,TE  %) |+TD$ 2hfPū:4bi=/@fg;]Lcbp:N"F@& #$QYQY  RY??+9////++993333310#'!'"#>3!2&# 2673& %) |+TD&_U ,$ z,T=/@fg;S:4bi=0O6P@**#55 378 20*$ $$'P  P??99//9999333333310#"&'732654&'.'"#467&54632.#"273P'gumZe9#*;I ^fddJ]9DX<%M@;A4=4"':^,<BA3<.71#nC6j T0_@3""( 0(021QY QY  , ,&PY, PY ?3+3?+9////++9933339933310'"#>3#533!!2673+/327#".5F%) |+TDX ,$ z,TE "KA|v@O/@fg;y:4bi=J?  Nz5:#l@!""%$SYQY  Y @Y QY !!SY?+3?9//////+++++3399391035&#"#>327!5!32673#"'!,%) |+TD?{Q<",$ z,TEGh; /@fg;!:4bi=(sQQN!-N@'(" /.%%PY ++PYQY?+/9/+3?+3?99333333102.#"3632#"&'#!654$32654&#"e^Aeh]i, padil_fmN!ALa^#xl" ;@    @Y/? /2/39/]+99333310!#3!3Ը,3HW:(N@'#  )* QY&PYSY?+?+9/+9993393332210.54?!5!#".544&#"326 5!1<G ,,#ö!D홼>4v@@240-*%!(,,##650&&$1.+#P44,($P P??3??3932?9/99333333333333310>32##"#3267#"'#7&5#53733#33(qT{ȉHOȷ HLVH-+tg ak?}ȱub{qR^fc"-Q7<~iXIu`m: 2@    SY ??9/3+3933333103!3#!#`y{{yX9`m:WO$+e@4 )!("! -," SY( PY%%PY?+3?+3?/33+33?933333333333103>323##"&'#!#5354'2!"!. 0kSS˨k*瀀ljWNpe:y(_fa^^adq 䌀&:O@'   SY  RY?+?39/33+33993393332310##"&=#53!!!3267![``[h`mggg)| : '\@2%% $ ()SY% SY !PY?+?39/33+33+39333333310##".'#5367#5!!.'5!#3267!NPo1OK KN1mg| $ kjʎˎg9xIIx9g3yyWl#0Y@/$ + 12((PYRY. .PY ???+3?+3?3+393333333310365!3>32#"'532="&'#32654&#")oYKW:/8h-  5a?`igdbqdv[d }Dca,w #xYaW"/Z@0# )10!RY&&PY, ,PY QY?+?+3?+3??+393333333102=#.5##"323'!3#"'54&#"32>/ 5jϽk*qKW:$pcdgi`>b5}T~kY, (a^ 󬿻YuWb"S@-  "$#PYPY QY  RY?+3?+?3+3?+9333333103#"'532=#!5!54632&#"!kKW:/˟b]|8 }T|SQe9(NK3@Y@. (!114 #;BA.#+R&0R!!&!&!8P>PQ????99//9/3933993333310"&'7326=7##"3234673!#"'526=#4.#"326T;[],``% /i$)T0U7[^aV\bN!AL;si^d[4p lŗ 0O`%rPWQ@,    RY  QY?+????+399333333102=#!!! 3#"'59y.)pKW:}TTjZ  zWS2@   RY PY?+??+399333102=#!3#"'5づ{@W:}T챫 EjN4^@2 44,* % 56&(#(RY#,,QY,0QY  ?3??3+33?++39333933310!4&#"#4'33>323>323#"'532=#4&#"%23;"iMXW(oUvfKKW:/N%23;vS*0f]`djZ }AvWO$P@*"  &%# RY RY RY ?3?+?+3?+39333333102=#4&#"!4'!3>3 3#"'5aM^h}  9wPCKW:}TkHh|p` WlO$2[@0% $! , !34$!))PYRY//PY?+3?+3?+3???933333333103>32#"'532=#"&'#!4'32654&#" 0kYKW:/k*4_@efi`>b5:y(_f䱫 }Da^^dwUYW9N!Q@) "#RYQY RY ?+3?+??+3/933339310&#"3#"'532=#4&'!3>329pdvKW:/$ 2hfP }TLcbpyWPO2T@*++$ 34+!%% !!(PY! PY RY?+3?+?+99//999933922310#"'532=#"&'732654&'.54632.#"P@W:/k'gumZeW ^fddL[YM }c#%M@;A4=/Q^BA3!K@W:/i)8=& }T:21W:M@*   RY  QY?+??39?+39333333102=# ! !! 3#"'5-D}/1}@W:}Tx/ b W5:F@%  SY  SY RY?+3?+3?+39333310#"'532=!5!5!!5@W:/D:QhM }T\jWN+6b@5$(616(87%PY%!RY!-QY   QY3PY?+?+99//+?+3?+933333310"&5%754&#"%!2327327#"&=.'#3265FNIE7)0 /:WKFE?ÆZQ*xaQ 7gjIPAx[E} HcSqd !I?u6WN#.T@-"$* 0/RY 'PY ,PYQY?+?+?+??+39333333310!.5##"32347!3327#"&=4&#"326. [s- q/:WKurqnoz~'  %`_XSg} M#6W '2U@,%% ( . 43SY +PY 0PY$""RY?+3?+?+?+399333333310"&=##"323'54632.#"3274&#"326`[s-aUK=7/:purqnozW'  %`_rFG2}  ̯dWN%[@. "  &'# RY" QY""QYPY?+?+99//+?+3/3399339310"32!327327#"&="!.^ Jul' /:W@f~ckn!  } a(|_W+N3w@A11,&  &54+).)RY.QY2$$2 QY !PY?+?+9////_^]+?+3993333333310"$54675.54632.#"3"3267327#"&=Y{}|f^juf`>C/:W@jibFJC? a(WdN2w@A# ),--00 34,QY""&&QY& RY PY?+?+3?+9////_^]+993333333310"'327#"&5732654춮&#"'>32ji/:W@`fuj^gz }{)i} m,JZO@TLGM2!$5)78vRWXc'*lpKNYG6 B+4luEOWHA@" S[QY RY ?+3?+??+993333310%3327#"&=#!%5!k/:W@} M:xW_N#I@% ""$%RY PYPY?+?+99//?+39933331032#"%>32#"'327#"&5 `XPl ҃ k/:W@cSckved o_9y} W D@#! "!RYSY  RY ?+3?9/3++3933993103267#"&=32654632&#" nOW37HB=XC*MGB bPu0ȵXkUW:$K@'#  #%&$ RY  QYRY?+3?+?+3?3933333103265!3327#"&=#.'##"&5nLLMn$5)789e:D{G6 M.ldW^:&U@/ %  %'("QYSY QY "SY?+?9///+++39333333310%32654.+5!5!#"'327#"&5y y_tq?f?MH/:W@Vi[fIR%*P-=@ /!9@ #"/1 0.???3?39933333310#654'33632#"'32#" ><ONKSbR32#"&'53254#" o;H B%"jSmpqjW 'Xp8JzbgPu6HPURsXs`^Wv @@   !" 0@   /?333?3399339321032653##"'##"&533265o9J%kI#%iRlpo:ITycVGXNTt_ =@  !"5. 10??33??339933333104'33>32#4#"#"&'5325i 'uQu}DVrjX"&X:u6HPXOyc1sX ?@   "!5 1 0.???33?33933333104#"#/33>32327#"&5GT 'uQw{X' Skp}_gPeFHPXOXs 9@    A 00. .?3??3?99333310##3'33JH{u C@o H 1/?3?39/+]399333310#"&54632%"!&27!űůWhոA;L@   !2 1/5??333?333?993933333210%.546734&'>% õȰYZW\\WZYԲ Ѵ~yx~1C@&+ 0 0 23*(-%#/1?33?3322299993393321032654&'.54632.#"#"'327#"&=HVTE@Bȅ @DDD3?t=dDX#$A/kp6-,+&, &obm{kc0-$*!' &<[Gq| QY sZs%@  2?3322933310%"'532>54632&#"@)*, %@)40.2>~ @I~=G@  5 0/?3?333?33999332333102=.5#53733#327#"'5EPQX]gU!6IX1g!L@!CJQ/Zmk\-QKD!AK#%@   0 /?2?3993310"&5332653e:JJ:ۖ>]]]]+/@    0/1?2?3?99333102#"&53324&#"5>qp:J/.-"YJ`aAaM    .0?2?399103#&'#Ɂ(3$T? )@   0.?2?3993333105!5!!?Zyߏ#5@  0 .?322?39933932210327#"&=!5!5!!IW"&C.koHo&X s7ߏ$[E@   0 .?333?39/399393322107!5!5!3>32+4#"32$o&RUXg~s,^6!;'oJDߏ#udXei/`Z267 ;@    0?33299//3933333102654&+57!5!#"&'7\YIn}E~e UEaoea GG+ ;@ /?2 /?3?39/]399333310#"!22!"!.=|A?<dT"nU  /2222105375353;3$%r!nU  /22221053%5353s;L!%vyNX+/310"&54>54.54>54#"'632X_a % % %+%,.23F33NK&hN   0%'#!  /39/310#"#"&5332>;6>jhl?x}n)ZdsC&7$"(": /310!7!;IS: /310!%7!:I;: /210!'!_I֘: /210!'%!:I_.X@ /99//33107'%6J{w~X@ /99//3310''%7J6\~w{Wt /310'33>32&#"p^-* $4WUN(-e99ok/10%%!VOOW @  /99//91057'5373ߞ!NP~OO!WE&$f %+55jWN&Dv82%+55&%@ !%!&+5+5l&E E&%9д!%+5l&E:&( %+5E&%qѴ! %+5l&Eg  (' %+5PC&&'zbv@+& %+/ %+5+5+5nCU&F'zQvf@ .&r.2%+5+5}&'@ %&+5+5aA&G}E&'9%+5aA&G; &( %+5}E&'l%+5aA&GX  (' %+59}E&'f%+5a9A&Gp -. %+5}E&'X%+5aA&GN ,& %+5z+&(f@  %&+55+55di&H'B J@ &&#$ %+55+55z+&(f@  %&+55+55di&H' J@ &&#$ %+55+55zE&(  %+5diN&Hl $ %+5zE&( ! %+5diN&Hw &2 %+5Cz&('z!&$+ %+5+5dCi&H'zz@ 2&5< %+5+5R&)@   % &+5+5ub{K@(   PYPY ?/]?9/3+3+99333333310!!5!54632&#"!5!˟b] SQe9Phm&* J!@  %&+5+5|NZ[&J J6@ 21%2&+5+5C&+@   %&+5+5PmA@"SY@  RY?+3?3?+93333310>32!4&#"!!5!9wQ\f}:b|pRmwEmh<CE&+9   %+5P&KD %+5Cp&+ F@  %&+55+55PmI@& RY@  RY?+3?3?2+393333310>32!4&#"!!53!539wQ\f})ub|pRmwEmh0CCE&+zTCP&KzLCE&+v  %+5P&K !%+51E&,r ! %+5v{&L#%+51+&,a@ %&+555+555v{&&j CU;-@@H@H@ H & %+55+55+++5&. C@ <  %&+5+5 G@%     ?3??99333339310!!!! 57!`y.TjE5Zl+E&.9  %+5&NHԴ  %+5E&. %+5&Nƴ %+5bE&/l  %+5v{&O`  %+5bm&/' JTk@  % &+5+5v{m O@)  PY QY SYPY?+3+?+?+99399333210%!!5!!5!!!5!a;dɾ(bE&/ %+5v{&O  %+5bE&/ %+5v{&O  %+5cj&0 Cj@ Z%&+5+5E&Pv@ ), %-&+5+5cj&0@ %&+5+5E&PcjE&09EN&P9F&1@  %&+5+5P&Q@  %&+5+5FE&19PO&QCFE&1vPO&QFE&1lPO&QlH&2f &+55\q &R' Ctf{&+5H&2f &+555\q&R' FZ{3@%@H@H@ H H@ H@ H&+5++++++55H&2f &+55\q&R' B J!@@ H& %+5+5+5H&2f@ %&+55+55\q&R' Cv J2@@ H& %+5+5+5v&3 C_@ 6%&+5+5Wl&Svm@ _'* %+&+5+5v&3@ %&+5+5Wl&S2@ ') %)&+5+5&5@  %&+5+59&U4@  %&+5+5E&5Wٴ %+59N&U[ %+5&5' J?CW&+59[&U' J^]&+5E&5 %+59N&Ul  %+5&&6@  *,%,&+5+5yP&V@ *,%,&+5+5&Z&69  *,%+5yPO&V9 *,%+5&&6 @ S+.%0&+55+55yP&V @ R+.%0&+55+55&&6 f@  3/%1&+55+55yP&V'/@!,@H,@ H,@ H,@ H,-&/5%+5+5++++5&&6'9,&+5yP&V&9,&+5=&7@  % &+5+5 &W @ %&+5+5=E&79  %+5 T&WW -%+5=E&7X  %+5 T&W .%+5=E&7b  %+5 T&Wb  %+5rLE&8f %+55r<:&Xg  %+55LE&8w '%+5<:&Xp  , %+5LE&8b %+5<:&Xl  %+5L&8f@ &%&+55+55<&X' CtZ{@@ H%&&3 %+5+5+5L&8 f@&%+555+555<&X'j, J!"&+5&9@   %&+5+5&Y@   %&+5+5E&99   %+5:&Y9   %+5&:C& %+5+5 &ZC&| %+5+5&:vg@ &o %+5+5 &Zv^@ &e %+5+5&:j@ & %+55+55 &Zj@ & %+55+55&:@  %&+5+5 &Z@  %&+5+5E&:9  %+5 :&Z9  %+5&;@   %&+5+51&[@   %&+5+5p&; F@  %&+55+551&[j@  %&+55+55&<@  % &+5+5&W&\@  %&+5+5Wr&= D*@   %&+5+55&]@   %&+5+5WrE&=D   %+55:&]9   %+5WrE&=   %+55:&]v   %+5P&K %+5 &Wj@ % &+55+55 &Z @  %&+55+55&W &\ @   %&+55+55j)&D(@ >;%>&+5+5ubq -@   @PY?+?933104632&#"!5!u˟b]Qe(aZ#G@#!! $%!_YaY?+??+9/999339333210#"'73254&+5&#"!4>32Y}-?PwALfWf/n緞aZRG~~E&$9jN&D9&$&+5j&Di@&+5&$ 2f &+55j&&D :f >&+55&$ 3f &+553&&D ;f @&+55&$ 4f &&+55ju&D <f 8&+55&$ 5f /&+55j&D =f R&+55&$'9 D&+5j&D&9 &$ 6f &+55j&D >e 2&+55 &$ 7f &+55j&D ?e 2&+55 &$ 8f &+55j&D @f D&+55 &$ 9f &+55j&D Ac L&+55&$'9 I &+5j&D&9zE&(9diN&HMz&(&+5di&H}+&+5z&(&+5di&H&&+5&( 2z &+55d&&H :z )&+55gz&( 3y &+55?i&&H ;r +&+55z&( 4z #&+55dpu&H <r #&+55z&( 5y ,&+55di&H =Z =&+55z&(' D@u&+5di&H&>1&,s&+5v{&i&+51E&,9v{&LWHZ&29\qN&R9H&2%&+5\q&Ri%&+5H&2 2f "&+55\&&R :f #&+55H&2 3f $&+553q&&R ;f %&+55H&2 4f -&+55\qu&R <f &+55H&2 5f 6&+55\q&R =f 7&+55H&2'9 D&+5\q&R&9H&b C~&&+5\&cvj%&+5H&b B&&+5\&cC%&+5H&b0&+5\&cj.&+5H&b*&+5\&c)&+5H&b(\N&cLE&89<:&X/L&8s!&+5<&Xi%&+5%&q C"&+5&rvh*&+5%&q By"&+5&rCu*&+5%&qg,&+5&rI3&+5%&q&&+5&r.&+5%&q:&r&<C & %+5+5&W&\C& %+5+5E&<9&W:&\&<t&+5&W&\f$&+5&<&+5&W&\&+5F0&bd*&+5F0&bd+&+5F0&bd *&+55F0&bd +&+55F0&bJd *&+55F0&bJd +&+55Fz&bd *&+55Fz&bd +&+55&$W&$W&$&$&$&$&$&$m0&f d+&+5m0&fd,&+5m0&f$d +&+55m0&f$d ,&+55m0&fBd +&+55m0&f8d ,&+55/z&(E/z&(Sz&(z&(z&(z&(oXT0&h@d&+5oXT0&h,d&+5oXT0&hd &+55oXT0&hd &+55oXT0&h^d &+55oXT0&h^d &+55oXTa&h,K &+55oXTa&h,K &+55/C&+E/C&+SC&+C&+C&+C&+"C&+."C&+.w0&jd&+5w0&jd&+5w0&jd &+55w0&jd &+55w0&jd &+55w0&jd &+55wa&jK &+55wa&jK &+55=1&,S/1&,S1&,1&,1&,1&,"1&,."1&,.\q0&Rd&+5\q0&R!d&+5\q0&Rd &+55\q0&Rd &+55\q0&R2d &+55\q0&R1d &+55&2&2&2&2q&2qq&2qc0&vd&+5c0&vd&+5c0&vd &+55c0&vd &+55c0&vJd &+55c0&vJd &+55ca&vK &+55ca&vK &+55&<'&<';&<;&</0&z d-&+5/0&zd.&+5/0&z$d -&+55/0&z$d .&+55/0&z$d -&+55/0&z$d .&+55/a&zK -&+55/a&zK .&+55&Z&Z&Z&Zq&Zqq&Zqe&Zqe&ZqF&b*&+5F&b8*&+5m&f+&+5m&f8,+&+5oXT&h&+5oXT&h8T&+5w&j&+5w&j8&+5\q&R&+5\q&R8"&+5c&v&+5c&v8&+5/&z-&+5/&z86-&+5FW0&b'd*&+5FW0&b'd*&+5FW0&b'd *&+55FW0&b'd *&+55FW0&b',d *&+55FW0&b',d *&+55FW&b'i *&+55FW&b'i *&+55W'v&$WW'v&$WW&$'W&$'W&$'vW&$'vW&$'vW&$'voWTN&h',&+5oWTN&h',&+5oWT0&h'd &+55oWT0&h'd &+55oWT0&h'^d &+55oWT0&h'^d &+55oWT&h',i &+55oWT&h',i &+55/WC&+'Ev/WC&+'SvWC&+'vWC&+'vWC&+'vWC&+'m"WC&+'.v"WC&+'.v/W0'v&z d;&+5/W0'v&zd;&+5/W0&z'$dv ,&+55/W0&z'$dv -&+55/W0&z'$dv ,&+55/W0&z'$dv -&+55/Wa&z'Kv ,&+55/Wa&z'Kv -&+55W&Z'vW&Z'vW&Z'vW&Z'vqW&Z'qvqW&Z'qveW&Z'qveW&Z'qvF&b%&+5F[&b J(&+5FW&b'b*&+5FWN&b0FW&b'08<3&+5F&b.&+5FW&b&0-&+5&$ I&+5f&$ &+5&$:&$8uWE&$v, @   ?3993310#>5#5"6/8ǰKzO9h?W )@   Y?+9/93310327#"&=3!,5HU! QG, @    ?3993310#>5#5"6/8ǰKzO9h?@    /323910".#"#>3232673(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=!8@ #! "   /32339/332933910".#"#>323267353!53(PLD%) |+TD)RKC,$ z,T[u #)#/@fg;"*":4bi=oWT&h',&+5oWTN&hoWT&h'8T,&+5oXT&h "&+5oWT&h' /&+5z&()7z&(8\C&+)7C&+8\WCE&+v, (@   0   ?2]93310#>5#55!"6/8jĚKzO9h? %!, +@  0   ?2]99992210#>5#55!"6/8j>ĚKzO9h?!$%, $7@  !!&%   ?329/339993310#>5#5%".#"#>3232673"6/8j(PLD%) |+TD)RKC,$ z,ŤKzO9h?B#)#/@fg;"*":4bi=w&j&+5w[&j J&+5wC&j&j/ &+55wC&j&j8/ &+55w&j&+5w&j 0&+5551&, &+51f&, &+51&,)71&,8\, +@     ?339/99333910##.=5!j8/1'E?h9E~Q %!, )@    ?339/99922310##.=5!j8/1'>E?h9E~Q!$%, $5@ !!&%   ?329/339333310##.=%".#"#>3232673j8/1'(PLD%) |+TD)RKC,$ z,T?h9E~QB#)#/@fg;"*":4bi=c&v&+5c[&v J&+5cC&v'/j &+55cC&v&j8/ &+55WiN&r+!&+5WiN&r/"&+5c&v&+5c&v 7&+555&< I &+5&< J!D &+5&<&<8*/v&3S  (@    /3333993333105!753!53Eq^ %!  (@   /3333993333105!%53!53PE^!$%[?+99105!m6>%!/W&z'v-&+5/WO&zv/W&z'v87;&+5/&z1&+5/W&z&v0&+5M&2&28M&Z&Z82WZ&Zv/99105!E!$%, @   ?3933310##.=j8/1'?h9E~Q*//3310#*T F@"    //39///3333323333310#'7'77'*T7777Y7887 0@   //99//3322339910'7##!'77RJ77}m}8L( ,@    //99//3322339910##'7!(R77J}78}-@ Y/+99105!-s*m@ Y?+99105!m@ Y?+33105! m@ Y?+33105! W6@  Y@ HY@ H/++/++3333105!5!*````o^]@ [?+9310!]7nq^_@ [?+9310!qE^n?-@ ['?+9310!?Enp^^@ [?+9310 !E^n^B%@ [?3+3933310!!!w77nn^C%@ [?3+3933310!!!UE~E^nnC'@ ['?3+3933310!!!UE~Ennz^<' +  6@  Y ["??+3+3933310#5!%VWkx-!a@   Y !["@ Y![?+3+3?+3+39333331053%%%%#5TihUddVA % @ HP   /]]+9310#"&54632ywxzyzz;1 1@  [?22+3399339310!!!!!!PP111//333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332233310###!!!TuO .@    /3/9/3333333310!!5!###uTON'3?K@^7.%%( F=@=77M L4CY:4[:IY: O 1"1Y+Y"[" Y [Y?+++?+++99//_^]q]q?+++333333339333993310#32#"&5464&#"3262#"&5464&#"3262#"&5464&#"326Yuowqttr"-.''-((uowqttr"-.''-((uowqttr"-.''-((W_IUSQWXJ_IUSQWXx_IUSQWXL@ Y?+9310#!%LL$@ Y/3+3939310#!#!%%LeLj'&{dT1@ [[=?+33+93333310%53fiGo%#xh3@ [[=?+33+93333310%553x#in%GE C@    [  ?3?3+39/39333933310#!!#!! &  &  B*E@ ??993310!#3IE I@&   [  [ [[?+?+?+9/+9333333310!!!!    N!pD@        /33/9/33333/3933333103#5!#3###TOON .@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG *@   //333332393310#'77'*TT~~~ݵqqp 0@      /3/9/33333333103#5!3###TONG;@   Y_@ H /2/+]+39/99333104&#"#'33>32.<>I#cJnkWC`["/A:lyOibihhqwq0fhi1^@2  !bYbY  bYbY?++9///3+3+9993333210!"5432.#"3!!!!! VQgsfsuniz# K[iP"'@8 &"" #)( %"_Y" @Y@&`Y_Y Y ?2?+++?2?+3+999333933333333310%&%737367#7&'#&':?.%6q7n9;3+:-;Ls{ b32&#"67! !2.# |~ %6G33<0PcZ28:tKl%[cr\.64XeXǾBju%lEY@     @Y bY     bY ??+99//_^]+3+39939933310!!!!!#53!}:㌌uо[Z0@"&' $$   &21020@9 H00' wY$ #wY ?     ,vY,,sY?+3?+9///_^]^]]3+33+39/+339333333333310#!5>=#535#5354632.#"!!!!!267җJY9ԩ,RB[P!CR|hkk2A\Fp@ϊ/MFs})pB_E-c^E<))P@* &' $' *+$bY ' ?33??3?33+39333333331054&#"#4'33>32332#4&'#5%23;"iMSW[vf (}mēvS*0f]W[۬/zCE %(+@*'&$"!*!( ) ,-)+ @ Y% $ & @Y'((?3?39///333+3333333+33339933333933322333332310!3!3#3#!#!#535#53'#'5#3'#Q7S7p ! {66ggƒCOd.wa-E -5J@/#"" .;??8I66I=DD)I. 3 LK) A @ YF  >J8JY&@Y##;9883wY332wY??+9/+3/333/3/++3?3/3+39999333933/33/33/33333/310+#3 #"&'732654&'.54632.#"4&+3253733#327#"&5F)GthXLf v8-0J@iRCaw53GW.P;[:-34T^rEpTk_NX'$>!3c9Q^_I $+%9#W_YykkNk ROEBr@>  :--3$CD4:$0!bY _Y07bY0_Y?3?+9/?++3?+999339333332310!##!234&+32#"&'732654&/3.54632.#"2%\H 9@EJt  3840-D.UU-t +'-,#2'_Z0EÑ'^YT0V>:B7?"QyY"M;3<$,&UE!'-058@= ., 38+7 $"25'/0(,7 9:)9568732 !  @ Y.+'!)% @Y 60!! ?3?399//993333+3333333+3333333333993999333333310'#53!3733!3#3##'###5!67#%#373'7#%7#z"X==20>?Y"{>@#o#B?m./ :ڨwwڨn G>ڐJ>>A  !]@  AMN VYMVYN?+?+??9/9/99339933102#54.+#332>53#X/kw9Ӥvi+i@'!?R\&-?5GZ+@f%(#((-,wY*&wY#?o   uY/  uY  H ?3/+3+?3/_^]+99//_^]q]q3+33+3993333339310!3267#"$'#53&57#536$32.#"!!!}~`ODXЇ%$=M]xrxy=6QQFO1@|u9* EH@#   _Y ?3?39/33+333393399933103!3!!!!!#o'/WXio/-aD=Eg@6    _Y      ??9////99993332+39333333310%%!55%55%!5!PP$$jSaσ냥rrrrB~6AO[@U% B*PJ.G? :G./(P \]7XX YJ(.( Y.< Y#R @Y.*#%%#*.3 D Y?+?3/9//////++3+3+3933333333310#"'#67>32#"'#"&5463275>7#>732654#"%324''&#"3267Ua6# ?ibTeldblbB\6@@3#"GJ0f,U=&/ F$<%- )PL=c}C6:-55 $+-+u0<ԓ{ooSNFaBWD:!9 U(#;vqrUenY& D-"7)0)LK-Wc#/\@$*! 10 @Y@'bY@ bY ?+??/++9993333333102#"'53254&''!7&5464&#"767r,\WKs:DY43(*-),@̩+fei&vU7`8:?4mlE$)@M%$&"" *+# @ %$_Y$$ $`$p$ $$)_Y?+?9/_^]+9/_^]333332223399339933322233323103!23#3#+!#535#'!!27!!&+v,oXYt2vvv;e}?T@|7y#0y$yS((S33x)P2h!p@(  #"aY `Y _Y  @Y _YbY?+?+3?+3++99//+99393333332210%#5&753&'!675hܧ᧔6*VSE?TL$j':Qyu6$>Ze) ;E {@!  ! " @ Y   @Y?3?39///33+3333+3333333933333107#5!!!#3#!!!#5)'#73&'D%X%CttcFcss\:/; Ψ9Ψ``Ψ/]Z/@ (/""...01 Y @Y/'+++%bY+ aY?+?+99//993+33+393333333333310#!!3267# $57#5367!5!654&#"%>32ͨ3N*IUQ>ok,%@L 'YTm^%6e@$JO̯-P2p@* @bY `Y   @ Y`Y`Y?++?+399//+3?+999933333210&%53&'67#04m,ep<{_<y3ww(B/~*4&wOzG\q  AP .2@d)((/01202" "341/@ ` Y? %%-Y))/) ))% Y  0   Y?+_^]+?3/_^]+_^]+3/_^]q??9933399332233310#"&5463 #"3263267#"&54632.#"#3͎ bf5//591&$ a_z i["ތSV ؒ P45E"d@2   $# PY   PY  QYRY?+?+99//+3/9+999333393/310%2673!"&=5746324&#">PUTҿ69ujzjkT00NɶET+E$(c@3&  *')*Y"Y&  %&Y%%?33/+?39999//++99333393393310!#3&53#"324&#"3265!Hxw%&)'#%-&X9mzEtrzзˉyw||՜&".]@2#)0/YY  ,Y &Y ?++9///_^]++99399333210#"$54$32#!2#4+326#"32  J3zPTDF?~opNc ?=Jb@5    Y @P ?33]2+3993333393393310##5!>3#7#'#3;aGNYaXXaWW$2Z#Q@+  !$% _Y  _Y?3+3?+9/_^]3993333910"!532$46326;!>54&fxWjt@nr@pjWwηn l 0n̈^HZ@  !     Y Y Y?+?+9/+9/_^]99333310"&54>32!3267"!&r,}EzMgHlch!"/l|=qu>LN E(,47x@?) 6//5++74.".1198 "-1Y6/Y1661+52,+  Y?+3???39///++339999993333332333310%#"&'732654.'.54632.#"# '##33 5=;3"G xS-}l5(01`|aXp 00ЧDj{bc6,** )!8U;ivf`6$"*!oEG: 2@ SYSY?+?9/+9993310)5!5!5!!U-15E'&?5>5Q'&$?5E'&:0@)))   `P]]5]]5]555?555Q'&b@ Go]]5?555E'&b@ ;o]]5?555E'&:<@%+++  _ O ? /  p]5]]]]]]5]555?555x_NdD 0@   @ Y /+99339910#&'5673!9>HH>9)CI$ICVvV &@   o/]299/9333105673&'#;CI$ICV9>HH>9#dD 0@    @ Y /+99339910&'3#67!59>HH>9#CI$ICVvV &@  `  /]299/933310%67#&'53CI$ICV9>HH>9dDB@    @ Y /+2299339339910#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$ICvV<@  ` o/]299/]299933333105673&'67#&'5;CI$ICCI$IC9>HH>99>HH>9vHVW@ @@ Y o /]299/3/+_^]2999333333310!!5673&'67#&'5v CI$ICCI$IChPX9>HH>99>HH>9Mq,N@' '  -. ##QYPY*PY?+?+3/9/3+399333910 #"&54>323654&#"7632.#"32q:s|Qrg%C4-qxNY\_V\˹va[JM2&IJayt\iEF@  @ H `Y?3?+3339+9933933107!!%&/YV, 7cjx' Ih9cE"@ `Y/2?+993310!!!IF9 9E Q@'    _Y  _Y/+9/?93+9/99333393105 5!! !^]79eVe9h@ Y?+99105!e9*E)@[/?o@H/+]+9310! 1<T/@ Y/2/9/+993393310##5!37P$0a@9+ " 12((Y%% ?o . .Y? O  @ H /+q3+3/_^]q393+3933310#"&'#"&54632>32%"32654&.#"326aG8Ue=\H:S_:ff/^>:CC^:U23[Gpb\1Ѷui_2&esx`fsπZ}]ctl4Y//+993103!!4^^0"@   Y /2/+3993104>32#4&#"tтwgĠ9&@ RY RY/+/+933310"&'53254632&#"b+\B5ԾXC2EMP9e^k_m7,@ * -.'Yp @9H)!!YO!!/!?!_!!!!!! !Yp @"H Y     ?   /]]]q+33/+_^]qr3+/_^]q+33/+_^]qr3+993310"&'&#"5632327"&'&#"5632327bKKYCvFn5|yOr?xTKK\GwAqSLfFr@u)/'1T0+\-#,-+-T. \,$[%r+m@G Y P p  0   Y_o?o/]q33/+3/_^]q3/3+3993310#7#5!!5!33!!Ձ=PӃ#JtWP Y@   Y Y@YoP/]]]+/+9/+993333105!5!5!t8d[] N@.  Y0@`/]]3/]39=/33?+99333310 5![@wAZoq L@-  Y0@`/]2/]]39=/33?+993333105 55!o@B; 7@  YY/+/+_^]9933103 %! ww{@UrsW*@ Y??/]/]+99310#!`T>@  //93310#432#".#"Fe2#'+3+ I8'1$+$@  //933103#"&546323265Fe2#'+3+I8'1$+$+Y?+33105! +@ ??93103#"@ Y?+?39310!!#ؑn"@ Y?+?393105!# ++Y??+393103!!(G+"@ Y?+?393105!3 (+)@  Y??+?3933103!!#(ؑn'@  Y?+??3933105!3# (+*@ Y?+3?3393105!!# ؑ+n+*@ Y?+3?3393105!3! ((+ 5@    Y?3+3??339333105!3!!# ((ؑ+nwp.@  YY?+?+3333105!5! ߑjc @ ?2?39933103#3#jh p 9@  YY?+?+?3393310!!!!#(ؑpב"j -@   Y ?3?+33993310!###בnn#jp ;@    Y Y?+?3?+33993310!!#!!#jm$hpo"p 7@  YY?+?+?33933105!5!5!# (wב)c .@ Y?+3?339933105!### mב+ncp ;@  Y Y?3?+?+33993310#!5#!5!c$p)F)ޑw 7@    YY??+?+33933103!!!!((GǑבj+ *@    Y?2?3+39933103!!33ґt~jw ;@    YY?2?+?+339933103!!3!!jht_2Ǒw 7@   YY?+?+?33933105!5!5!3 ((wב9+c .@  Y?+3?33993310!5!333ctב+wc ;@   Y Y?+?3?+33993310!5!3!3!5!cܑtw6 >@   YY??+?+?339333103!!!!#((ؑǑב"j 1@    Y?2?+?3399333103!!#3#ґtn j G@  Y @ Y  ?2?3?+?+9933333310#3!!#3!!t _" Ǒ <@   YY?+?+??339333105!5!5!3# ((wב9c 1@  Y?+?3?3399333105!3#3# th+~c G@    Y@ Y ?2?3?+?+33993333103#3!5!#!5!ґt 6)ޑp @@   @ Y Y?+3??+333393105!!#5! ؑw"h 4@    Y?+33?3339933105!!### ב+nnp I@   Y Y ?2?3+3?+3333993310#!5!3!!#!5ޑ"בw @@   @ Y Y?+3??+333393105!3!5! ((ߑ9Ǒ+ 4@   Y?+33?3339933105!333! tבt+w I@    Y  Y ?2?3+3?+33339933103!!3!5!5!ґttǑ6V@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# ((((ؑwב9Ǒב"I@       @ Y ?2?3?33+333399333333103!!###!5!33ґtבtnn b@ Y @ Y ?2?3?3+3?3+3333399333333103!!#!5!3!!#3!5!ґtבtǑޑ" 6s/?3310!!3s6s?/3310!!3??3310!!3 g??3310!!gg f??3210!!g $g #'+/37;?CGKOSW[_cgkosw{@j&FVznn'GW{o6Nff7Og*>Z~rr+?[s ":Jbb #;Kccsgokw2Rjj3Skk/C_w.B^wvvgckhk@ Yd`h_[WTW@ Y\XTOKSPS@ YLHPC?GDG@ Y@n?o*Z+[BrCs.^/_@ JzK{۸ GwFv¸!@ ׸@Yԯ@Y@Y{x{@Y|xgkoswc`c@Ydhlpt`OSW[_KHK@YLPTX\H7;?CG303@Y48<@D0#'+/@Y $(, @ Y Y@Ԩx`H00H`x @ ظYA  Y ?3+3/3+39//////////3+33+33+33+33+33+33+33+33+33+3333333339333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#fggggggggggggffffffffffffeggggggggggggffffffffffffeggggggggggggffffffffffffggggggggggggffffffffffffffggggggggggggfffffffffffffffffffffffffegggggggggggg(bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````8EIMQUY]aeimquy}  !@kdx KkHh`{eyOoLl"\a|SsPp&X#] @ Tt* @'Y048<@DD!@ Ժо @Gg "@ .26:>B+ #@  $(,CҸƸYŸĸY@?Y   Y<; Yx{ wz~ g @Y8kosg7jnrff@YX\`dW[_cG@Y4KOSG3JNRFFYY0 @ gGGg  DӸǸY/Y"&*/3+3?+39//////////3+33+33+33+33+33+33+33+33+33+3233333333933333333333333333333333333333310!35#35#35#35#35#353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335#33535355#355#35#3#32fffffffffffgfgfgfgfgfggggggggggggggfgfgfgfffffffffgfgfgfgffgfgfgfg3gggffgfgfgfggfgfgfgffgfgfgfggfgfgfgfffffffffgggggggggfffgfgffggffggffffgg"a"a#`!b!b!```````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb``ba``````aab^^aa```b"bwuVT//3310!!w!T!,@  YY/+/+993310!!!7L17}1hd{/9310!!dhd{0@  Y@Y/++993310!!!dLPbF"//3310!!C"$2//339107 XV2|4//3310 4ia//33910 a|//3310i9en_ D@  )??9=/99333993399333310!# 3 h=h!!-*)0@  ! Y Y/+3/+9333104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbhVeR'/7?GOW_gow@8PhhTl8xx<|(pp,t ``$dHH L@@D0044DLdt|lX\\NvrvYJrF~z~YBz6njnY2j^Z^YZVRVYR>:>Y:.*.@Y *rzjZR:**:RZjzrb&bfYb&&"Y&?++9///////3+33+33+33+33+33+33+39933933333333333333333333310#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557  /99102#"54>fnrotjlw%@  //3399103!32>54.#"%vwvvvwvu}Avvvuvvw%#*@ %$ //339933103!4>32#".'32>54.#"%QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwn^u 0@ Y @ Y /++993310#".546324&#"326^aDpDegGJLfFFfbJM_}kArEgJGgFffFGei+7E|@& ,2?2 EGF>8 H88;;AY5)#)@Y/#;@ H;#;#  YY /++99//+3+3+3/+33333933104$32#"$732>54.#"74632#"&%4632#"&3267#".'?)**))**)h:}NP|9:pGsW.M **))**))N:;M1(DE'5b@"(".76@ Y%/5522,@Y2?2O2o2222 /99//]]+3/33+333933104$32#"$32654&#"32654&#"327'#"&'+)**))**).-WrIp::}NO}9M6))**))**DD)1N:;M'3_@($!!. 45+Y!$!Y1@ Yp $$/]33/]3++33/3+933333333310675373#'#5&''7&'#5367'32654&#"WgHfW3F E3WfHgW3E FxxvvE F3WfHgW3F E3WgHfWzvvv<F"b@ #$Y@ Y  Y/+_^]2+3/3+33933333331035.546323##5#32654&#"Xr{{rH,^_^[xp{{oH:^\]r!l@  "#@Y0 @/ Y/+3/_^]99]+9999399333993104632/!/#"&732654&#"{fQK7@{{H^_^[{@7Qf{{^\]ff!0@ "#  /?//9/]9339310#"&'3!5265#"&5467>5mic<% &;dcmVVfOl9+88+9lMmUUak*0@  +,/?//9/]9339310272#"&'3!5265#"&5463.54>fU|DC37c=% $?d73CD|=m@C$ql;)88);lr$C@m=ffh@   //9104&'54>323>32LwCr@YX@rClY6DўFr@cd@sEㅆw1H  //991053# U::f$@   /3/39933310>54&'#"&546323#)nZVE[S:*& yWM70&sAhDcD8AdDt{YfH3p<~@K  !  gT  'ywV?/]/3]9/3]]3]3]]]3]3]]]3]993333310%"&54632#"&54632%%5^E[S:*VE[S:*:,D8AdQDcD8AdCdPDcQxQ7@F  !         ?9////99333333332/933333333333310##57573%3777```>`b?YY]]9mbbbJbEc@2    bYbY _Y??+99//3+33+399339333333103!!!!!!!#535#J'kkhqK^oT@*    PYPY ??99//3+33+39333333333103!3#3#!#535#^{}}}}{{{.CbEK@   Y  @Y   _Y?+?9////++9933333103#"#>;!32673+!*',WJ'(. qgh2I~h?2IvEP@) _Y bY    _Y ??+99//3+3+99333333310+!#53! 4&+3#326vو ׃֠z$/Km]fpmWE U@+ !"_Y_Y `Y ??+3?+9/+93393333310!#327#"&5!  4&+32ޭ5=D$z#]|OM  y'^YjW'-27@Q'*0)16 7--5 10. 8!98'61QY)QY   QY5RY QY *00RY?+3?+??+?+99//++3?9399339333333310.5%%!3327#"&'##>54'7t~7W\)0 ((-je ,qQ^^GKZ;U[(;Q  KHAjLx[E heOh`]vG&!J1iW}!\@.    #"PY! PY ?33+33?9/?+?993333393333310#533333#327#"'#&57#HXºtTT|v@Zң'kk|nK9 +93I}DhEi@4   `Yx</   `Y 6??3??+9/_^]]_]]]]+9933933310!!!!!3##'k'e>EthF@#    PY RY?+?+3??9993233310>323##4&#"!!9wsQ\f}b|pmwkmhhEB@     `Y 6??3??+9993333310!!! 3##.'W4Gc-aEWthF@$     PY?+???99993233310!#!!! 3#;y.#oTjZ*WhrE ;@   _Y  _Y6??+3?+3933310#!5!5!!rahoh5: 8@   SYSY ?+3?+3933310)5!5!!#DF:Qh\HCZ2@  _Y aY??+?+?9939210!5#"!273%267&#"m~~1 ?k#Bvu}vQelGNmcN20Y^N.@   RY  SY?+??+939310.#"!!?>32)(1i)8"(*qz;)8:2v|TUZ%3@' & ""_Y ?3?9/9?+333310!#'#37673767>32&#"@JY cc' 2qq9c32.#"߷S7b^Fi3d!# @%O-:Il9qIos)+7>DN#R@/ "   $%QY PY"QY" SY??+9++?+99332310%>!!'7'&546324#"6`A&]y=~ jTa6X2K;\-*VPvzf]7Os]H%*/1E?@% `Y\K*??9/]]]]]]+993310!!!!'f>E:-@ PY??9/]+993310!!!!:T1:)R 7@  !"QY PY?+3??+993933210! 4746324&#">]fpn@;98ys54ɞl{bMj$@ //99//9933105%5%b,e? @  /9/3333310#3#53Êݧ"@ /9/3333910#53'T&axa0*buc[  @  /32339310#53!5T0턄[ @ /3333310!5!53 [D $@ //9/3999310!#!53R$X KD $@ //9/3999310 #5!3!$IK )@ [//+9/933310#!! & P|)@ [//+9/933310!3! |,@ [,?/+9/933310!3! |[4 &@   /9/233339310!##5##ㆡ4_ (@   /339/333931033533!p_DŽl@ /323910#'#3~vl':@  ?32933310!!   .#)@  /329933105!5!.rrJ/9310#! &??9310#!#%?AO@) S[ PY PY?3?33+3?+?+99333333910!#5354632&#"3!!%5!蒒ghS>71||qESW:AB@!  PY PY?3?3+3?+?993333910!#5354632&#"3!蒒ghS>71߄||qESW4&&-@GU p@ %P`]5+]]]]5  S?3]210#"&533265JA=O㚣CXVE#''5}@ u  %+]]]]55BP}; q\ mf N7qTww(@  UYK?+39310!!!!wT&*@X&vE!#%+]]]q]5&'@wU"#%+]]]]5&'f@>X&vE!#% ,,',W,,6,F,,,,,@-,,%,_,m,\,,-,,,,,,,9,,]]q]]q]]]qq]5+]]]]]]]]5+]]]q]510&'f@wEU"@$#% ,,',W,,6,F,,,,,@-,,%,_,m,\,,-,,,,,,,9,,]]q]]q]]]qq]5+]]]]]]]]5+]]]]510&Y%+5&$@wFTY%+]]]]510&K@#d#Z##(#w#F##@##%######@#P#`#p#]]5+]]]]]]]510L&> @XG %+]]]510&Ly@XER 0`wt%hk.R`?]]]]]q]]_q_q5+_]_]]]]]]q]510B&Og@X  F  # %+]]]]5P}&g@ F%+]]510=>&P&>@&G#Q`]%+_]_]]]]]q]]5&3g5@ XFv 0`%+]]]]5]5b&$@ w F V   %+]]]]510=F>&P&C  H @ H   @ %]q5+]]]++]510}N& /g!@XC %+]]]]]5;& A@.XwfE 04 %`]]5+]]]]]]]510q\& #@D0#`$%+]]]]]5h& B9@$$$c$C$$1$#$$@ $$%$$]5+]]]]]]]5&c*@GU  %+]]]]]510&7@($$G$$d$$t$$$$ $$$$%+]q]q]q]]]510q\&~K@wW7@ %o/?]]q5+]]]]]]5fu&[@fvES@&%Oo~]wt_q_q]qq]q]q5+]]q]]510w&(O@!uD"a0P@%O_?@]]]5+]q]]]q]]5{y&I@KX7v@%?/{]]]]]]5+]]]]]5N&Ug!@XD  %+]]]]]5&fm@  ' W 6 F     @- % _ m \  -      9  ]]q]]q]]]qq]5+]]]]]]]]57q&7gM@)XuC9%d@  %g]5+_]]_]]]]]q]]5F&L&%+5;& %+5fu& %+5'H@   MNM?3??9393339310#!3>?!!Jd/,qR!nJ)}s2  /3310#"#6$!3^x~ v2  /33103 #&$+ x^2v @  /29/3310.#"#>32`F[q> ܺw).2}5@  /39/331032673#"&'aEmzNX*4Cfq5"; [/]+99105!Y;!B%+@  [ Y?++3993310".'332>73gT#DNMD"S=vp9AB8ow=i [?+99105!Yi!B%[?+9910!5Y!%>W:*@ PY RY?+?+993910#"&'53265!5!qщO-n\| b"kmrEME /@  Y?3/]+9?933310#52673#}9:&5B2RMyQH@$  '  YY?+3?+9/_^]9939933105>7>54#"'632!RpQO?O ' .GUP@ ^MHt10L/[*4 re=ZE612E9Q(@H%""* )*Y%@P`   Y  Y?+?9/+9/_^]q9+9/993399393310#"&'73254&+532654&#"'>32*+RAH)%D6#,"|CERKiwk}:?h3008-*86 rrm^BRc)LE C@  Y ??9/933+393933/33310#5!533354=AR)1]젠>KT4P@~E[@-  Y Y Y?+?+9/+3/9/993933333310#"&'732654&#"#!!632~y%!)%%/6-,^gwCzlg5)?@=7(.~@ME .@  Y ??+39399310#4>7!5!Z(.dvzMrmC@Q /[@- ,)##) 101, Y&&Y&Y?+?+9/+9393933/33399104&#"3264&#"3267#"&5475.54632(B$" ,,*+*.-(̔?<~;APAs(4\,/+911;D2.9svwq#T3232673d3TU$--[ +L?7SS"0+\ *K+&%#(RH(%&&%QJ'7_ @  /333233310#'##'##'Z'//(//'Z_oooo @   /229910".'33273fZ YL{zL2+ 9@   @ H?O_G?]9/+333310#'5!5!Cd+2+ 0@ H?O_G?]9/+/3/310#57!!疇d+؊?+;@ /?OF?2]9/9/33333310"'&#"#>3232673#573TU$--[ +L?7SS"0+\ *KS疇&%#(RH(%&&%QJ'v?+7@ ! F?2229/332333333310"'&#"#>32326737#53#533TU$--[ +L?7SS"0+\ *KI&%#(RH(%&&%QJ'ޘW+ "@  /23333910#53!#5g#2+ <@   @ H /?O/]239/+333339310#533#'53QFћ C2+ 7@   /?O F?]22333333910#53#53!!dv{:Y@0   SY   PYPY?+3?+9/_^]3+3999333103#!!5!#535!5!a; F=&b'q J$/@H/@ H/@ H/9&+5+++55F=&b'Jq J$/@H/@ H/@ H/9&+5+++55F=&b'q J$/@H/@ H/@ H/9&+5+++55F=&b'@q J$/@H/@ H/@ H/9&+5+++55F&b&@;@H;@ H;%&+5++55F&b&"@;@H;@ H;%&+5++55F&b&@;@H;@ H;%&+5++55F&b&@;@H;@ H;%&+5++55w>&j'r J$@H@ H@ H#&+5+++55w>&j'$r J$@H@ H@ H#&+5+++55w>&j'r J$@H@ H@ H#&+5+++55w>&j'%r J$@H@ H@ H#&+5+++55w&j&@ @H @ H &+5++55w&j'@@H@ H &+5++55w&j'@@H@ H &+5++55w&j'@@H@ H &+5++55c=&v'q J$ @H @ H @ H *&+5+++55c=&v'"q J$ @H @ H @ H *&+5+++55c=&v'q J$ @H @ H @ H *&+5+++55c=&v'"q J$ @H @ H @ H *&+5+++55c&v&$@,@H,@ H,&+5++55c&v'B@@H@ H'&+5++55c&v'@@H@ H'&+5++55c&v'"@@H@ H'&+5++55v{=&L C&+5WCZ?@ _YaY?+3???+999333310!"'532654&#"!!>32CkXlO0dOQaTe0ei p!E[`WFE>@   bY?+3??399933933210#"'526=!!.5!FdF3H5'Q ?c>fpE==HZ?@_Y _Y??+?+99//99393210326=4&#"!3>3 ! a {ovykr;}OjȀnXϨ[`Rg!n #@  ;=?3?3323310# 46324&#"326!-=?//==/ȻďnlkpEqc"@ :<??39/333107573ѥqZm{r%n)@   ;<?2?3332233310%5>7>54#"'>32!jja3`Z|*L_,Prrq;sPJFVersqg1TOE @ f-n"?@!# $!; =?33?339/393332229310#"&'73254+53254&#"'>32- lpB?31-9zGhyymj_[Y).2/ htn_-!rDc <@   :<??39/33333332222310#5!533573حZl{%g #g/c3@ : =?33?39/333333310#"&'732654&#"#!!632/}c8B>9=- :Myp{liZ@=6?/%g&n!7@" # ;=?3?339/3333333310#"&54632&#"6324&#"326&dDv t7@8/;N@rc $@  :<??33239310#4>7!5!w`23c}y:⩸^ag+n )M@ %% *!!+ ##;'=?3?39/393333333932310#"&5467.546324#"3264#"326+L<9<=7>J`_`0/tosA/KmwvlBaX7\ojc5YYZZ`-iks@g&n 5@! " ; =?33?39/333333910#"&'7327#"&5463 4&#"326&mGw 8po(?017530?ZeN>uzAJB95G;6@   @ H /3+9/]233399103#5#'##538`tih H4@@ H  /3]2+9/3339910#'533#'##5`hiV S<@   @ H/3+29/3233393104#"'632##52#'##53T;3(:CC6=Kih#@`,8N? 8@   @ H  /3+2299//333333310"'&#"#>3232673#573#3TU$--[ +L?7SS"0+\ *KЛF&%#(RH(%&&%QJ'pC 9 *@   /239/3333103#5"&'332673#݂YkjTThk tD78Cx9 (@   /239/333310#'53"&'332673\ kjTThkv tD78Cx9 2@   /229/3233333910"&'3326734#"'632+52kjTThkc;3(:CJI#KtD78Cx#@`047? $.@ !!&% /22229/33333310"&'332737".#"#>3232673fUU#DA=Q[ *K@$F@;0+\ *Lj]SSdcv&.@ @  /399/3339910#'533#'##5t˟t -u .@ /29/3339310#'##5%3%4#"'632#5>qӠL=5FYBI[*5?,Pp0E &^q#,@ $%  " /392222333310".#"#>3232673#'##5%3(PLD%) |+TD)RKC,$ z,TӠ#)#/@fg;"*":4bi=} $@  /22339910"&'33267357! XX"?y:?I+_ $@   /22339910 33273%5!"XX ?:yI+b2@ /233333339104#"'632#52"&'332673G48 7pX^I XX"[>f OI5HZ}y:?g%.@ &$' # /322222333910".#"#>3232673"&'332673(PLD%) |+TD)RKC,$ z,T䡴 XX"#)#/@fg;"*":4bi=y:?US/9310%5!+WU/931057!W+ @   /323310#'##5%3ƟӠ @  /323310#%53373˟p&@ [/2+393331053!53ug&@   /32339310".#"#>3232673,YTK-, of-ZTI1*5`g#+#.C#+#89os9 @   /32399910#573#5732X"+"+ "@  /22339310"&'332673S XX"y:?wf/33210!!df& m'l@BG0#` %F%R `u@ %P`]5+]]]]q]q]5+]]]]]]5& mG@%F%R `u@ %P`]5+]]]]q]q]5}N& /r 9@'6DTW@%0]]5+]]]]5}N& / '@ %P0]]]55+]5510'&@<<<<%+]55555'&+@$Y$$$$G$w$&$$U$$%+]]]]55510'&%@$Y$($7$w$$E$$[$$%+]]]]55q\ &K@#d#Z##(#w#F##@##%######@#P#`#p#]]5+]]]]]]]510 #/;?%@<9!@!!! ='/33333]q222104632#"&74632#"&4632#"&%4632#"&4632#"&3."".0 0. ".0 .t/ 0/! /0." 00 ".. !/." .ob".0 0/!".."".0 .. 0."--" .. 0/!"...n@@/3]q29/10!!%4632#"&4632#"&3Ge." 00 ".. !/." .o5j>"--" .. 0/!"...n#@ @! /3]q29/105#5!#%4632#"&4632#"&3QnGj." 00 ".. !/." .oujju"--" .. 0/!"...nIw.4.'32>#".54>7$U 7H(CkL):Y=Fa<.?!GɁƇGI`}EufX(LiSBpQ./Rsn9TlLEun_!:QpKnV%?z)z3   s  . + 5  2   5 4D (  & = (   8v \ j Z 4 Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Liberation MonoLiberation MonoBoldBoldAscender - Liberation MonoAscender - Liberation MonoLiberation Mono BoldLiberation Mono BoldVersion 2.00.1Version 2.00.1LiberationMono-BoldLiberationMono-BoldLiberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Liberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Ascender CorporationAscender CorporationSteve MattesonSteve MattesonBased on Cousine, which was designed by Steve Matteson as an innovative, refreshing sans serif design that is metrically compatible with Courier New!". Cousine offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.Based on Cousine, which was designed by Steve Matteson as an innovative, refreshing sans serif design that is metrically compatible with Courier New. Cousine offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.http://www.ascendercorp.com/http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlhttp://www.ascendercorp.com/typedesigners.htmlLicensed under the SIL Open Font License, Version 1.1Licensed under the SIL Open Font License, Version 1.1http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL# X  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Yuni00A0uni00AD overscoremu1 middot.001AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni200Cuni200Duni200Euni200Funi2012uni2015 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Eminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23undercommaaccent cyrillicbrevecaroncommaaccentcommaaccentrotatedotlessj onefraction twofraction threefraction fourfraction fivefraction sevenfraction eightfraction dotbelow.alt1hookabove.alt4 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capcyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lcgrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.ucmacron_referredlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BE=P^̑x N O Q R S T V W W .Xcyrlhebrmark .6>FNVdr Frh$(6NHj0 > !L !!!""H"x""##8#h###$$*&*-111n L $*06<BHNTZ`flrx~ &,28>DJPV\gxxxdx````zz ( K NHfj" zf &,28>DJPV\bhntzfXfX@A22z2zfX&<XfXX zf L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzfFfFFFNFNfFffFfNFNNFNfFfFFFXNFNFfFf&F&NFNpFpDFDDFDXFXDFD0F0FfFfNFNfFffFffFffFffFffFfFNFNFFXNFNFNFNFfFfFfFffFffFffFfFFFXFXFFffFfFFFFXFFfFfDF&DF&DF&0F0FFf&Ffff&&0RFRFFFzz ( K NHFLRX^djpv|fFfFfFfFfFfFfFfFfFfFfFfFfFfnfFff. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzNN00ffMMffff\fffffffffff2fDDXX::DD\lXXffffffffXffNNMMffffffXXXXN00X>0,fTfXhXXXX\lfXf00XXTTzz ( K NH T U Vjpv|ffffffffffffffffffffff2ffff2zz<zz2 K N!< K N!J` T U Vzz J` T U Vzz T U VJ` T U V K N! T U VJ` T U V K N! 4<zz4Jzz4< K N!4J K N!Jl T U V T U VzzJb T U V zzJl T U V T U V K N!Jb T U V  K N!n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFvFFFFvFFFFFFvFFFFFFFFFFFF^F^F^FF^FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFxxFFzz ( K NH FRFFn L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFfFFFFfF F FpFFFfFFFFFFFFF\FFF4F4F4FFRFFFF F FF\FFFFFFFFFFFFFFFFF F FFFFFFFFF\FFFFFFFFF F Fzz ( K NH F|Fn L $*06<BHNTZ`flrx~ &,28>DJPV\H ~> RzX    >  fH vv> X vH>zz ( K NH ( > T U V  K L$*  K L$*  K L$*  K L$*  K L$*  K L$*  K L"  K L$*$*$*$*$*$*$*$*$*$*$*$*$*"("(n L $*06<BHNTZ`flrx~ &,28>DJPV\ 8LpppLL L~~zz ( K NH ffn L $*06<BHNTZ`flrx~ &,28>DJPV\fffffffffffffff,ffffffffffffffffffffff  fffffff,ffff,ffffffffff,,zz ( K NH T U Vflrx~:::::::::::::::::::::n L $*06<BHNTZ`flrx~ &,28>DJPV\fFDFDFDFfFfFfFfFfFfFDFfF4FfFfFfFfFfFfFfFfFfFfFfFDFfFfFfFfFfFfFfFfFfFfFfF4FfFfFfFfFFfFFfFfFfFfFfFfFfFfFfFfFfFFfF4FfFfFfFfFfFfFfFfFfFfFfFFFFFFfFfFzz ( K NH:@FLRX^djpv|pFpFpFpFpFFpFFFpFpFpFpFpnn L $*06<BHNTZ`flrx~ &,28>DJPV\ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffzz ( K NH T U Vflrx~ppppppppppppppppppppp@p 8 >fcyrlhebr&MKD SRB ccmpdliglocl" $,(,<8v 8BLV`jt~ (2<FP T U V S   N M K L (06<   ", zzJ",6@  openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationMono-BoldItalic.ttf0000644000076500000240000103663013402025764026311 0ustar kintelstaff00000000000000 FFTMa GDEFypGPOS$3>GSUBmN:d4OS/2Ľ`cmapC'l.cvt k zp9fpgm~a-gasp pglyfڊb1wLeR+mr,;CE^meee  S >T!4JjJJ ijB(g3#]MT$& D &LLD\Y!`7k=R}T+&e9:6'>S    4444JJJJJfiiii 333333]TTTT    ;&LLLLLe\\\\333S]S]S]S]E T T T T TT$T$T$T$!&!&4 4 4 4 4 AJDDj j jj  &&&X &JLJLJL   DDDDxi\i\i\i\i\i\jY!!! #\ # #NS]\'MG$HT44D &JJL2\ KF\gW8M!BSDbkQQ34 JLi\i\i\i\i\W33TT$DJLJLAT$&333 T T4 4 JLJL  i\i\D!&! !3 TJLJLJLJLQk^9!w# MJILdZ}K##]MM@WNN$$K_Q&& 4  r&L#L***>v!O$$#:b!5d&PKoL)V5TE<vD2[[W'FiqgZs?`b4i}g  ]}K_[.gtttttss7", -|C Jbb*&dvXH(_*MqF^|C(vO |Q&h$w#!"$*/QZ]]T[!!"!!! H !A4 J!d4/N*j/3N*DqL~=jn(jLjq MJLv>Dz9#HI]JL SZNSN  qHS44Jq!!! HX !!J!S!ts 3_!VT1!!!!L!]""zL BTT&oD  &!!!4kYj:JLqq(JL40:k%(n%k! &\v/]!1!!!! lqM!! OfP]g pJt^tx!)&)&4%!"t_ 33 TGWGW1 !!JLJLJLBtzHMG6cTK~V$NJLjYysRD5#bb1`%5m3F%bD`u{)//7y`moPyVH)y-V` mn]:'lhdD%L]'&(GE6#CjY!W",l* qC:i6>SA.K;#%,qa]z!YU-#Mr D! OO#M\D&D!4!!S+'qe*/7WPpwHYM:. d9WEc_b#3 # # #S]MMMMM T T T B T>T$!&!&!&!&4 4 DDDj j j j &&&&JLJLJLJL  K M DDDDDEi\6@i\i\i\jYjYjYjYjY!!!&Y3 333333333333 T T T T T T T T4 4 JLJLJLJLJLJLJLJLJLJLJLJLi\i\gWgWgWgWgW//////// 5!INNNNNN;;********;;;;LLLLLLOwjjjjjjjjgaOw))//NN**LLjj//////// 5!I;;Ow))///////TTTs*!jj44jjjjjjT] 4Tn L?'ZWM>Z]*M>nGkkSS"7PTS=2^E ]vvvvMhe><4_[t[osjjjjjjjfwhh4nh%%n<fafp7K4!&D!IjYQ!<hh  ;@0DD)yFmmmmPHa)yV` my) dl%?[xQr uuu ////////jjjjjjjj !6Rcc{ OMOO.qQ**DddyIOO#\$~~6ou~EMWY[]}   " & . 0 4 : < > D ^ o  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# 8tz HPY[]_   & * 0 2 9 < > D ^ j  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 7/*wg\"(% 9,?>52/,)" EBA$"!+(ډaa$    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvj72s9:gw*-,q5l|Zcn1T6+m}bx:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-AR]WU\WU`^_^Y3XUV3WUWWJJ_JJJ`JpJJJJ0J==<U<:U;=:U9=8U86U7=6U54A 444.U32A 22.U1=0U00.U/=.U .`.. ..U-=U,CBA@@9FF?$($"P`'>U@ =U=U=UAU P`0U@U P܀ܰ0@.PгP`P`2U SS@ F/P@Ø F/`_ /@P/?0mus tssPrn3qnoF2nF2U3U3U)mlb_$a_$`_$_P^FVfFO]\F[F2ZF U2UU2UYYGFF@SPRPQP@O #F OFNMMKF)JIF%HF#GFFFFFdUU2UU2UU2U?_/Oo?oOTS++KRK P[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++++t+++t+tus+++++t+ss+++++++s+ttst++++++s+++++++++++++s+ssss+ssstst+ssss+ss+s+sssss+tss+++sssst+++++t+s+st+++ss++s+++++st++s++s++s+++++++ssstus++++++}EyE:wbbW& ,"E"kE B|uc\e=i1n+`dxo}t} DpMMddoWE UE c mm{{h'rNwu8888p|8Dp$ \   4 x ($<$d,dP<h``$h p !"4"##t#$$%t&&','(l()0)***++,--(-p.,./0,0l11233444D5H5\56D6778X88949::|::;P;<(>@>p>>??4?l?@\@@@AALABBBCC@CtCD DEEDEtEEF G4G`GGGH$HTHHHIIJ(JXJJJKDKLL@LpLLMtMMMNN8NPNhNNNOO4OXOOOPPQQQQRR<R`RxRRRRS SPSSSSTT(TUpV VDVhVVVVWW(W\WX,XXY Y$Y<YYZ(Z@ZXZ|ZZZ[8[[[\\,\P\t] ]^`^^^^__@`aa(aLada|aaab b0bTbbbcc,cDchccddde e0eTexeeeff0fHflfffg g0gTgxggghLiijdkkl(lmLmn noopLpq`r(rs$sthuu,uv(vwwxHxyDyTyz{,{|P} }~8~~<@<t<| 4`0@dXHl Dh\l| hhDh0H` l@d@d Dl,Pt 4\<TlL 8@ X $<dTx 0Tt h@XDTp PD ¼ØHƐȀHˤ0̘͜LΰLаь,(Ԅ4@֨4נ<،Xژ ۠ hޔ< |0\44@TL4|@P`@H hD,,hD4t0\<dD$d<h|4p(d,\X@l ( X     l     \   P d    \  TP,` Xl@8 4H\@|T(T x0h@t<| 4 p  !!" "T"x""#H#|####$$$$8$L$`$t$$$% %L%`%p& &&''h''(T()*,*+\++++,8,H,X,h- -0-@---.,.<.../ ///0|1$1L1t11122,234456x7788899d:P:`:;<<=(=>H>?\@@<@`@@@ABBCCDCTDDElEFlGGtGH|HIIJK|LLMNNOXP PQLQRlRSTLT\TlT|TU|UUUUV,VVWWDWhWXDXhY$Y4YDYlY|Z(Z[<[`[[\\\\\],]<^^_D_h_`L`\`l`|````axaaab`bccddePfffgdhhLhhijHjjk0klltllllm0m@mnn\noo|p pq$qrss8s\t,tPuu,u<u`upv4vvww<w`wxyyz4z{{|\|}l~~`X0\0XH| X@xHX0pTPpT,Dp 44D\h$hD8TXh,$,\h| (L\l HlHX|8@d(L 0\p`ˆHĬXƬLȄȔȤɘɨɸH ˈ\P͌ʹ<|Τ0hϼЀLѸDҜӄPԌp֤פ8(`٘Txڜ,d۠pܬ0ݜ\TߴHt4 444 $@\xpL\04 d(H$4DxP`<$$X<Dhx,x8 H  p , p  t  l (xp`x|\ L!!","#$8$H% %&p'<(()*L*+,X-,-./\/0h012345p6X7,78T89:; ;<8<<=\=>>?\??@@@A<ApB<BC|D DlDExF8FG0GHpHIHIIJTJKlKLHLM8MMMN(N\NNO<OlOOOPP8PPPhPPPQQ,QLQdQ|QQQQRR<RdRRRSS4SXS|SSSTTTTUUUUVVVVWW,WPWxWWXhXXXXXYY<YYZZ,ZPZtZZZZ[[4[X[p[[[[\\D\\]t]]]^$^H^l^^^^__,_X____``,`D`l```aa@adaaaabb4bXbpbbbbcc@ccd8d\dddddee@eheeeeff(fLftfffgg(g@gXg|ggghh<h`hitiiiijj<jdjjjkk,kXkkkkl$lLltlllm$m<mTmxmmmn n4n\nnnno$oPo|oooop p$pHplpppq q4q\qqqrr(rLrprrrss$s<sTslsssstt8t\ttttuuu@udu|uuuvv$vHvlvvvw w4w\wtwwwwwxxx@xdxxxyyy4yLydy|yyyzz,zTz|zzzz{{,{D{\{t{{{{|$|L|t||||} }$}<}T}l}}}}~~D~l~~~~~~ Dl 4Ld|,T|,D\t@d<` <l<\|(TDt4Tt,\ ,Ll4`x<TlD4`x $<Tl$H 8P$`<Tl<l,D\tD($h``04HXht@ X\0Dh`(hp`4Txp0l(XPH8H4€dİHŨ `LǠɘ\ʬH˘L̐XͨDΔPϘT$|PҤt<Ԭ՘hdP(ٴPۜ,\܌L`@l,($dd$0,hH04<x\h(X\8 Dt @    \    , T     X h x       ,T|T|Dp4dL,`D8|Dt0 8@(|,dd d !0!x!"<"|""#<#t##$$\$$%%T%%%&<&|&&'4'l''''''''''(())**\*+h+,H,--.@../\/0D01122P2334\4555686t677X778 8<8l8889(989x:\:;p<?354'4.'>m! ]cLAm´ ENJҌv-S4D'HVv9/ mb .tVzB')RxW^G& *a$.  8e0Q+84@!/Y%[%5Y% Y [Y/2?3?+++?+++103#3%2#"54>4&#"32>2#"54>4&#"32>/`Y1_*'2E,U-G+Vt1]*'2E,U-G+IOCL<9.H;kKvrvL>9.H;kKM$.9\@9 ' 77 '%-QY PY2QY?+?+9/_^]?+9_^]]]_^]10&54>3267327#"'#"&54&'324&#">tcƅW@\k@YEV8(&*9sǹAXf[SgR35Udo W\qdxiVJIs{5-WLQ*3q`B=Bm>L [?+10#!XL1WQ ??1047! Ŕu޴rW(6i,wW ??10654'! wqJMqݺWˢ,cLa  ?]10%''7'73DaƢj#h=y{=heh @ Y ?3+310#!5!3!q9hhR+ [/+10!R*;Hj+ Y/+107!+/D/m1 [/+10!!m;!;1)?2?3103Y rZ ?@' @?OtYtY?+?+9/_^]^]10"&5463  4&#"32673a^KPsdRLp_00ӛ^t`[EiW,6E2@ sY  sY?+3?33/+9_^]1037!#7267!!,)8*L C){So{jZ.@  tYuY?+3?+399_^]10376%>54&#"%6$32!&]OOZr!=ӿٺ)-N8?aaϞyC;Z.=@"&uYtY tY?2+?+39/_^]+910"&547%32>54&+732654&#"%6$32"MxByb,\XR28*UtV :l9EKt^>KWmjQ}EE )@sY ?3?339/333+3310!!7!3!688):(C,bZS2 W7:ȂCEG@( uYsYtY?2+?+9/_^]3+3_^]310"&=%32>54&#"!!!632TH_Zv[O(WzOKO\[ZZ*@@% sY  tY  'tY?+?3_^]+9/_^]9+10"&54632.#">324&#"32>e O;r)?.54>324#"32>4#"32>[ebgֹn|͛Gd3Li+PQu=Vu;fvWnlg|z+~:n>B|GHI^Z'@@& %sY   /   tYtYiV?2]]+?+9/_^]9+10"&'%3267#"&54>3  4&#"326׺  q*5fS݃fXMFtDWJl%JVr۠SWy[hPOS^ma=@ [[/+?+10!! !m;!;;!;1 1j=@ [[?+/+10! !;!;g*;H 1je}h@?0?o/]]]10 eABe#h)A@0Y_oo Y p @/]q+/_^]q+105!5!eJe}h @0??o/]]]331075 5e@}DEyZ:@  [  _Y?+3_^]/+9/_^]9910!>7>54&#"%6$32!3GXTMa^eBD쎆x4!4;^QCU5f:u 3KQUw?C?=$A`t\x4t܋/ІfQHg>0a_mhl0ZswqyPKy x԰YFXafWgAjymU<dE@ aY ?2?39/+10)!!!!'d8X=L" JE)J| E#G@) aY>* aYaY?+?+9/_^]_]_]]+910)!24+32764&+!2>f ƬHΟ>Ӥ ZWHNk9E!mPDqBFE !@_Y_Y?3?+9/+10!!!!?Km,c,aETZ2@aY_Y    _Y?+?3_^]+9/+10"&546$32&#"326?!7!mub7~).* l}{6š+!E 7@#`Y\ I) ?2?39/]+]]_]_]+10!!!!!!pp'gkg'>E4E $@ _Y  _Y?+33?+3310!!!!7!!:,Į<,l,<E}JE"@  _Y _Y?2+?+9910"&57%3267!7!Ǿ+A?Im-S+˻ +hovnyWE @   ?222?333910!!!! ךQ't(WI-aEWj%E@ _Y?+?3103!!j'h,EE@ ?2?39/93310!>7#&'#!67!# 2l!#[& 3"Od31E,dQE /+QE@   ?2222?33339910!!!67!  Q4pE~JZ@ _Y_Y?+?+10"&54$32 4#"326ghk_j`{eE !@_Y_Y?3?+9/+10#!!24&+3276h]YsqQ)$EjՕROD_JmZ$&@_Y !aY aY/+3?3+?+10!327#"&'$4$32 4#"326kl,Q'rg݃Dk_j`^\ @~zYPe E4@_Y_Y?222?+9/_^]+3310!#!!24&+327d-^QwnI%EF~]L=Z+,@ aY aY?2+?3_^]+9910"$'%32>54'.54>32&#"%|cDߠXLQp:/QNƽ%^m/a:j39W|VYF-X1(6'"-\O}-E@ _Y?3?+3310!!7!kj,S,aaiE!@ _Y?+?333910"&547!3267!Ǻ'DHg|#'9Xn5_EUG(hE @ ?22?33310)!67!4SI3~1EwejiE#@  ?22222?3339/3310!#&#!673767! 3. G'8; EITXSf.JAE .@ 6   ?222?3339]]]10!! !! .pU8Y6K~R9fE@?2?3339]10)!!l55,6E "@_Y_Y?+3?+3310)7!7!! )O-(oW@ YY?+?+10!!!sZ$P&Wu?2?3103 BW@ YY?+?+107!!7!B&P)$ZW(z@ ?333/22210#!*5Bg$P Y/+107!`` [/+10%7!,+3QN-8>@"&QY&.QY*  QY5PY?+?+99//_^]9+?+10"&547%?654#"%!2327#"&57#3267J D uGTq L & *)._TV*id/`b|v'-U70$}HQA.:x7%& SQ)qd 4q:bq#'(@ PY #PY ??3?+?+99103?!3>32#"&'#32654#"#L%:pOoi !gSIULc"`v[due_0qjyuS]tN)@PY  PY?+3_^]?3]+10"&54>3274&#"3267\IX`PP #iF]sed maM)'@PY$PY?+?99+?3?10!5467##"&54>3237!4&#"32>76DqRsl M THXK>sVvd`,od[ ;jnjYwSTtN"6@QYQYPY?2]+?+9/_^]+10"&54>32!3267"!74&U" f[M}Sgf~jXf21kqA@{9fg"@ PY PY??3+3?3+10!!7!7>32&#"!ѭ%"̠$cm %||SSc9$NK"/5@ &PY,PYQY?+/+9/?+99?10"&'%327##"&54>32367!4&#"32> OA9$EkOtk! -ԹRJWIWHN!AL i^&ld[#efcsdȋ&|!@ RY?+?3339?310>3 !654&#"!!Qwy533>323>32#654&#"2`q  9zKXD=TXP3Zu}40(S"KC00kX__jZ\dKr/}40(&|O@RY ?2??+910!654&#"!67!363 x@Eeq!  kJ5KGHL6ANQLN @ PYPY?+?+10"&54$3 4&#"326ٟ"4lRYkPmQø`Lee]rΆ'WO%'@PY"PY?+?+99??103>32#"&'#!6732654#"@lj R RJXLQO:Bf^g²a^^;LirsГLWO'%@PY  #PY ??3?+?99+10!7##"&54>323>74&#"32676R$:pLoi%gTHUKb#:_ [d%we` rkxn;SN@_o ?3??]3910&#"!65'!3>32uke&UL†jaPJ\N17.pDlO,4@ PY PY$?2]+?3_^]+9910"&'%326?4&'.54>324&#" [ww NYǖPSddn GLkF%M@<@(4)BfKqaE>3<$0DeJwdHT$@PY PY?3+3?+310#733!!327#"&546%7%g HN{$'KOW3 |<6/ r{D\: @RY ?222??+9103267!!67## 47 v [p:?4DB\{CK: @ ?33?33310)!67!)X;?R&:8‚uqY+:)@  ?22222?3339/3]310!#'#3736733# #31f3:MJ9F+N_: @   ?222?333910!! !! /41,x/ bW:<@#pe   SY?2+?333333_^]]]]]10"'726?!7!kH'22Uv8)X&czW Va0/ #!%%ϡ!m: @PYPY?+3?+31037!7!!!''Q'Fh(\W+-@ Y Y)Y?+?+9/+910"&547654&'7>7>3!#";v~?Yf&w?G$[f;_NU;CI&Wui"+H##LPprHhiaiK*"CB9 /?10!9mW(-@ ! !Y YY?+?+9/+91073267>75.57654+7!2#&[e;cMV;$Gv ?&y?Wgj-^lJ4-"+nk&,(to`HC@/Y@P`  Y _  o  /]q+33/_^]3+10"&'&#"7632327]KFUG~K)i])*H}*/*.T/0\,$7c7@ @[?3?+103!! ,55eEkd$E@%@QYY   @V  QY /+3_^]]32/33]]+210267#7.54$?354&#"NX!6%%$$\VJyX2e7md ƭ9X^DQqtZ&A@# QY  vY""sYF&&?3]+3?3+9/_^]3+310#!7>?#7376$32.#"!!!267z?@(nj"&(ҥDB[f""olh~#k7kR΅/MFs}Pm6c^=*@!Y 'Y/+/_^]+10'76327'#"''7&54632654&#"6kirvzU85lkpx|U~9bKbbI>tL;;=JJE;9ADMJ`aJ^CwRHEA@"cY  cY    ?3?3339/333]22+33+3310!!!!!7!7!7!7!!!H R..P !!쓢9//99//10!!  U7DT@4'6B%BB ;D    ;B'$QY! !QY)?2]+/3_^]+9_^]_]]]]]]102.#"#"&'732654.'.5467.54>4&'>-dZpu ,ZwFp?K l|,[FIdpq,Y~nt͌?B;A1'%F_Dl"]Ilf%PKYV&1')-[l'!kCfX3B! ^B1'[[[/3+31073!73M++u++&&2Y@:Y Y @ Hp ##*Y#0Y/+?+99//_^]+]3++310"&54632&#"327#"$54$32#"32tV1r_dk]q:%͎  ~M+*q{FF ?=.&1:@$''Y+Y@ H  Y?+?399//+++3310"&5476%7654#"'>3237#"&57#'26?ak0Eau!(Α5-9ICQGs=HxjSM&ZUKZl m|ld!&1}M6oJ"D&G} [ /3+310%73!73 H= JiGo%#iGo%#TW@Y/?o?]+10%!5!wt+&%1[@9"Y!YO_oO"_" "" )Y /Y/+?+9///_^]]]++333310#"$54$32##!24+326#"32  ht3eUڷzPT"FFzI?~ofPNc ?= BE& @ Y @ Y ?++10#"&54>324&#"326UX]FG_bDC`VVSF`aEEcbeh ;@% Y   Y K[k`/]3]]3+33_^]/+10#!5!3!5!oUT=386@ +    YY?+3?+3_^]_]9910767>54#"'>32!]ufOc"(Ѝc 3}Bc@Kswe_PF&9'0*U@4#Y  HY YD?2]+?+3+_^]9/_^]]+910"&54?32654+732674#"'>32rrELB3!Yל)כr̄u~zr0CV@ @ Y/+/9/10"'73254&#"73.6 2-B&j324&#"32>vE}kF@;J]3vL_4]ÌJcŊKJ9UIX6O [ /3+310?7337736F F #in%G#in%G'E'&$@_ ` q5]q55?55E'&]5?5>Q'&54@"111_11,,,,,,((]5]]5]q55?55=:9@ [    _Y?+3_^]?+9/_^]9910!3267#"&54>76!: oka^d@Bgz44fDSoHP2'-orVYJE묞L^HI3'@ PY PY?2+?3?+9910"'7326?4'.5467>54&#" !6$32k),~2QX uDGNMNGNN3,.2BZ+!,Ln+%E9KV1m?Pr:;_84= &[QED!*4>ohe3Q&DC@ 99&:<:= %+5+53l&DvM9&99< %+5+53Q&D@ ::&??9 %+5+53&D@ 99&BBN %+5+53Q&Dj@99&==; %+55+553Q &D@99&<32632326?"!654&;:/KP]CtN&FzQ!a!0 %+5Tt&HC@ ##&$=$' %+5+5T&Hvo#&##& %+5+5Tt&H@ $$&))# %+5+5Tt&Hj@##&''% %+55+55 7&C@  & %+5+5 &vh & K %+5+5 c& @  & %+5+5 &j)@  & %+55+55;+N@,   !PY (PY?+?9/_^]3+3/_^]9/]9]10#"&54>32&''7&'!%4&#"32>]\N4"@/J%V85V^} lHؔi´w[vcfOGi0.m^XA5j&&Q @ &$$0 %+5+5L&RC@ &B %+5+5L&Rve& %+5+5L&R@ &!~! %+5+5L&R@ &$$0 %+5+5L&Rj@& %+55+55eh !@ YYYYY?+++++10535!53xqP$@ !PY PY?+?99+10"''7&54$327326&#"mhQt/$jaRj.\%&mhQ&oiPaaNkZaWYNbT~kIWyM}\&XC@ & %+5+5\&XvZ@ & %+5+5\&X@ & i  %+5+5\&Xj@& %+55+55W&\vk@ &%+5+5W}%)@"PYPY?2?+?99+?310!3632#"&'#!4#"326FP$ҐPub Qe$TJ^NdǾtd\o7akOAmpW&\j@&%+55+55of&$6 &+53Q[&D ;;&+5&$/ &+53h&D 99&+5bdE&$ 3WQN&DkS&&v&( %+5+5]&Fvf&" %+5+5S&&C &+5]t&F  &+5S\&&< &+5]t&F &+5S&&@@ & %+5+5]&F@ &!!' %+5+5&' &+5(.+@+)PY#PY?+?+99?3?10!5467##"&5463237!4&#"32>7673C\q~Ӏ/ M :3AqD5/-\L[vbb|ο ;Zhc\\Ywb!B%EEV!/B@#QY %PY   +PY ??+/_^]99+?33+33?310#!5467##"&54>323!7!7!34&#"326765 DqPul9!RN[|If P;vd`|'kc\/[diiĿP f&(F &+5Tt[&H %%&+5 &(/  &+5T&H ##&+5 \&(  &+5Tt&H ##&+5 WE&(KTWtN&H> &(:  &+5T&H ##&+5T&*/ &+5$N&J 11&+5T&*2@ &!!+ %+5+5$N&J@ 00&33=%+5+5T\&*( &+5$N&J 00&+5T;Z&*$N&J 22&+5!&+.  &+5&$.@#Y!#[! RY?+?3339??3++10>3 !654&#"!!#'##7%3Qwy@ QY @`Y ?2?39/3+3_^]22+3310!!!#737!!7!3# 7!ppÈ!"'"k"'"!È$$>쨱2&u @@#QY  RY09/]q+?39?_^]3+3?1063 !654&#"!#737!!!ܙ~q32 { "0=I>??s9  MoG4xD:*zud326324#"326"!654&g3A{-vsLzh-w{fE`GUNkD7 (R?BA-췷Kss+ b?V+E8 &5vx &+5&UvY &+5 ;E&5;N&U &5 &+5&U &+5&6v ,,&+5Du&VvV --&+5&63 --&+5Dl&V ..&+5CZ&6zL.a.=%+5DClO&VzV// /w/>%+]5&6/@,,&.?..4%+]5+5D&V@ --&//5%+5+5;-E&7;HT&W-&7/ &+5x&W &+5-E'@ _Y PY  ??9/3+3+3103#!#73!7!kC%rr%Ck,R,aJYVT$8@$PY PYPY ?32+3+3?+39910#737#733!!!!327#"&547K%(%7%(% HN{$'KOW3 ҾҾ<6/ r{'Ii&8. &+5\&X &+5if&86 &+5\[&X &+5i&8/ &+5\&X &+5i&8@ Oo]55\ &X &+55iL&87 &+55\&X &+55iWE&8;\W:&X!ji&:/ &+5Y+&Z &+5f&</  &+5W&\ &+5f&<j,@ & ) %+55+55&=v  &+5!t&]vU  &+5\&=+  &+5!m&]  &+5&=9@  & %+5+5!&]@  & %+5+5  @ PY?2+?3102&#"!>ؠ$cm"Sc#~+=@!  #PY )PYQY/?]2+3??+?9/+991037!!!3>32#"'#!67#4&#"3261!)Gp2!MNMQAkp`,w Zpeon\E#+L@,''aY((aY((>(*(( ( (  aY?+?99//_^]_]_]]+9+310#!#"'463!24&+3264+326~n*/ YŭZVFIMu}>cfjoTA-2_!hGIvyh E&@aY aY _Y?+?+9/+10!!32#!74&+326',7ܘ )xzNE誡MWl}#'-@  PY $PY RY??+?+?+99103>7!!3>32#"&'#3254#"#D)#%:pi #gSIUG"{Oյ[dνe_1v v }E@ aY  aY?+?9/+10#!'7%3324&+326} mKcxzN$MWl}#'&@  PY $PY ???+?+99103?'7%33>32#"&'#3254&#"#sLM%:pi #gHMOR`]$v[de_1v +qg|NZ@_Y_Y?+3?3+10#"%!2! %326Ѥ|}. \Lub`4l|OBktRSn&0@bY@#_Y _Y?+3?3+2+10327!"&547!2>32&#".#"Ѥ|5cLN{\[/(&&(% \Lub4Xk}|y; 2[;@Bkt]0).@SY@PY %"PY?+3?33+2+10"&54>325>32&#"74&#"3267\zV KJ'74H/IX`PP #i' jZfsoTA-2_ $'E &@aY _Y aY?+?+9/+10)"&54!3!7! ;#" 06,1zN}M&,@RYPY#PY??+?+99?+10!547##"&5463237!7!4#"32>Jjj 73)KHMUBfkYƺZa^J Mtd~XN'@PYSYQY ?3+?+3?+10!7!.54$324#"326*#e'?E1eW+4u5{E @@*_Y?o _Y _Y?+?+9/_^]q+10 !7!!7!!78,?-dB6,EDUGZ!*@_Y  _Y_Y?+?+99//+10%2!"'6$32#"54?!654&(a"N Ry8f*WW0*ibgIuV$0)i$Y(K@,_Y??O  aY %"_Y?+3?3+9/_^]_]q+910"&5467.54$!2.#";#"3267þvo; 2ZHt;,;@pLkz]=\Y.K=&UYm]dzHWE(@_Y_Y_Y ?3+?+9/+10!!#"'73267!?Km,i'9T+64,aBZoWZ.@ PY PY ?3?+39/33+3310.#"!!!#737>32_PQ).I2J58ݱH 6Ikc T^(9@%$aY%% bY @_Y _Y?+?33+2+9/+10"&546$32>32&#"&#"326?!7!moN"W/'!&%7vb7~).* l}{# 1\6Ţ+WhE@ aY ?2?+910!!#"&54>74&'326-8c6$ȭ~J( <%>);E0ɘ9ukB81_#O>@"E=+(@' RY#RY?+???+9?10"&'467654&#"#33>3232673}("$?]q O &HmF8 !%4D{z-NΣ@&'k2_QyK20mz4E,4E5@_Y  _Y _Y?+3?+39/3+310!!3#!!7!#73!:,?,C<,l,4(WI-a 4HWD!@SY ?3?3+?910!!>32.#"! ‰O̚^U'M4Kc.2Tj~SWQ3WEcy=-&Q"KC0If_`lX[fLpc8*$dWE@ `Y ?2?3+?3310!#"'73267!67!  )KV->70 Q/6Ӝ EWe&X|O@ RY ????+910654&#"!67!3>32|@Dfq!  PwXI4PDHL6{qBOJZJ"'@  _Y_Y?+?+99210"&5463 67#3 4#"326aY\2)~_ĦcYbZvlGp|:cLaN#%@  PY PY ?3?+?+991067#3#"&54>3 4&#"326I_d2)==YߏIN`xEbxG5:@YĊg}e]uΆ-2jY0 D@ bY bY?2+3?3+33??10"&5$32%3##&#"327}`TL'f 0[XRJ& B< b£mM/@ QY QYD??3+3?3+33?10##"&5!2%3 &#"327pGQ@(n*J0Za1'm+1SqD<( z| \E$@ _Y_Y??99//++310+!#"'463!24&+326K]%*/ ƶ[kpQ&$oTA-2_ǬRH_W*1@RY!PY'PY?+?+99??+310"3>32#"&'#!>32.3254&#"/@ll e<ЙfY)MʜKHPK^gȹd[J\!se E&@_Y_Y??99//++310#!!324&+3 ػD' ϻlzI'E,4_IHZ+&@ %))"aY) bY?+3?+399104>7>54&#"%6$323267#"&?s>w]9eZPI;m~{pu*OE]nZ00H8@?XjY+ hNHEm^%ƶK]O)&@#'' PY' PY?+3?+993104>%>54&#"'6$323267#"&K6kgP[Zek8Inpb]ou$B R~\E5=82*@C]]?F>34?N%ETFWl'&@  RY H%?+2?+310463 3267# 547#"&732654&#"F{ aQ)Gs .5IV{( +>' ,>n6Ej[-7Tg ':- '<fHT$4@PYSYD@ PY?3+3?3+?+310#733!!327#"'7326?"&547%7%g HN|=OT'E&4M M |>3/ȏ32&#"!!327#"&547%k?o%}|AQ. %g HN{$z> |G}L >>@>3/ sz/AW-E @_Y _Y ?+3?+310327#"&547!7!k.1D+^Kqj,S,au$1- f9Fg @ _Y?+??99210"&547!3267!>7#3̽&6;Ym"'WUmf3)$+8]~5tBJ@(?cҷW:&&@!&!RY  &!???299+9103267!>7#3!>7##"547 v64T|qeXze2)%6 Ni:c7E>DkҼq+%x:xsLf87E%&@  _Y_Y?+?3+3333310%2>54'!#"'#".547+7!%a\w;,p>rUZsr>t,;j|Ⓘ0 Pžpӊ` ЉMX @_Y _Y ?+3?+?10%264&#"763 !"&547!U9A,F+^g&KӤU TL Ri5T32&#"6b5dJdU99;*C KqZB?>47W>(@ SY RY?2+?3+?333102&#"#"'7326?!?>Vh16L8}kfH'5*Yq9 i d,RGJ$jHǫ Sd0/abE2@  _YbY  _Y?+3?9/3+3+310)7!7!!7!!!! )s&$-(&p9!m:@@% SYQY SY?+3?9/_^]3+3+31037#7!7!7!3!!!' "p'Q'"h(b E0@_Y_Y_YD?2+?9/+3+310"$'%3 4.+7!7!$zf}L-N-(bepUi1- bE2@ _Y   _Y_YD?+3?+39/3+10"$5%7!!#"3267B6(-NO-e|cUzb'HYS{xkeЧN:-@SY QY PY?+3?9/3++31027#"$54>77!!#";<&( %f ׳vN:)2@SY@ #)&PY?+3?9/93+310#"&54>7>54.+7!7!3267A۱eu1gfd( mjwa[bc~d\0F5$'ˣknb^5F10:\XZ"3@bY aY _Y?+3?+39/3+3103767!7!>54&#"%6$323!!&s%fOOZr!=P[h%šeR-ïd}>:CaaϦTVmPQ*BF,@aY aY aY?+3?3+9/+10!!32!"&57%32654&#!# -,$jtWF⯩ո [US:,@QY PY SY?+3?3+9/+10!!32#"&'%32654&#!#'$P݇vjzH:˸|jf_DIqD+8)-@ ' PY PY?3+3?3+910#73733##"&'732654&'.547%1%IF ^~vQ^I|Z ("!GiMӌ%N?FH,6$KqN%+WQ@ PY???+910!!3>324#"$n(% Dr۰ot/|RR[`®_ ??10!34?2?310!33344bk1@bY bY ??99//3+33+310!3!!!!#!5!!bvvvv;oq kEQ& E &+5QU& &+5& ++&+5E@_Y _Y?+?3?+10#3!732673#"'5,t"-T^װ/ϳSEykyW2@_Yb[ bY aY?2+?+?+?+?10"'73267#7!73 3!_n>*ET;T%'((5,W tdrEW+ >@"PYRY S[ PYPY?+3?+3/+?3+?+10%3!73#7!73"'73267#7!%Z%׮$((kn>*ET;T%'ѾPZ tdrE @ _Y???3399?+10!#33732673#"'*b"-T^װ/ϳSEykyW5@b[ bY aY?2+?+?+?3?39910"&'73267#7!73#33M;s"*1o 7C%u% (({WjnrEW&*9@ ('S[(" PY"RYRY  ?3?9?+?3+?+?+10!654#"#673632 "'73267#7!73x36dq$ [#n>*ET;T%s'((kwAYH<[pMbQW tdr&$ E &+53&D ::&+54&, E  &+5 &  &+5J&2 E &+5L&R &+5i&8 E &+5\&X &+5i+&8f&+555\&X&j JS4/@ $$?$_$o$  @&+]qr55]_]5i+&8a!!&+555\&X&j C<3@!"""?"o"" @&+]q55]]q_]510i+&8f&+55510\&X&j E 2=@+""""?"o"""""" @&+]q55]]q_]510i+&8m##&+555\&X&j B2;@)"""?"o"""""" @&+]q55]]q_]510WwN+&$f&+5553`&D&j JE41@ CC?C_CoC9 99 9@999&+]qr55]_]510+&$f &+553d&D& JI4'@????_?o?99 9@99&+q5]_]5105m& J &+5f& J0 FF&+5TZ%<@ cY $@$#aY$$_Y_Y?+?3+9/+2+3103##"&546$32&#"326?!7!7!7!V[[mvb7~)* t}{6Ţ+ LNK&1@@! #QY )PY &@.PY?2+2?+?99?+9/10#!7##"&546323>7!3## %327!4#"32>D,Ahi  6U`Bu HOH}KNMRHb]+k]!63 mT&* E &+5$N&J 11&+5W&. E  &+5D #@ ?3??32?910!!!! #'73373‰O.2TjE5ZlJWZ&2dLWN&RdJWf&2&d" 00&+5LW[&R&d //&+5Ab&y E &+5W&S &+5W&h &+5PE4@_Y_Y _Y_Y?+?+?+3?+310+3 4&+32>!7!7!!-0!UK3(-&&cLEUfaA 0iE4@bYbY _Y_Y?+?+?+3?+310#!3 4&+32>7!7!! ,00^B$F&'&f0(CEVeafW *B@$'$%$PY%"(!(PY!  PY PY??+?+99??+3?+310!7#"&54632734&#"3267!7!!'A[MLhlQM F.R9,S324&#">H-M RrHOgsM)ѬcXgh$gt&1 B &+5&|&QC  &+5+L@*aY@ H""p   ((?333/333/]]2/2/3/+9/3+310!!!&54>32!&7%!4&#"32>%.yESaoCA* 2(:=0+%8CB&4:rAWK\-3+6 '3&D'mv,@SPSSS<<%< <0<54'76$>54&#"'6!2Og.Z,4OnmO6J+NF_^PU$5RpS~*hc R*X+FLYR6pODf ٶ$BDH*J>Z!&+ E  &+5&%&@#! RY?+?39??3210>32!654&#"!!#'73373QwyEDhq4  b|pISRmR2HBEGj$1!WZ@ _Y  ??9?+?104&#"!!>3 !6a@=mj'Q?0YP| EhF7L\~ W@$1=N@*#5SY 8 ! #(PY.PY ;PY ?33+?+?+9/999+?10%632#"''7#547#"&54632734&#"32>4&#"326N[dr[aa!7+Nflw|KT ^{/,Dg54#)O-(/.&sowk2T!'R%V!m:$@SYSY ?2+3?+31037!7!! '>54#!''Q'Fb#V&s\[!'R%Vdm&$ &+53Q&D <<&+5 CE&(zTCtN&HzrJ+&2f!!&+555L&R&j JX4/@ %%?%_%o%  @&+]qr55]_]5J+&2f ((&+55L&R'iv J`4U@A77?7_7o7%4D0Pp 0`GC &+_rq_qqr]]5]_]5J&2 &+5L&R &+5J+&2f &+55L&R& JX4%@!!?!_!o! @&+q5]_]5fm&< J!  &+5Wf&\ J+ &+5W#%@SY   !PY ?3+?9/9+10 632#"&''>7&547 4&#"326s|fR9^D29.pIIXQwmZ@L1CKG.+2-3GFTLO-8>@"($2!!6PY%!0SY RY  ???+9/9+?3+910654#"#673>32632#"&''?#'4?4#"3326;L>lq&LbgjDUdr\aKg+]uJ!i9=H1%*;0/`<HgZ~}LX.~op^5?wzZO]wM_7CLQsT!,4@!PY%SY'  *PY ?3+?39/9++310>32#".''>7&546#733!!4&#"326DHPrrPw]D9I%7%k;*adN?S.#ul[2>1 Bu*/_9AH".:8@ 1PY  %PY7++PY ??3+3?+9??+10#"&'##7##"&546323336324#"32>%4#"326ptNb "#eX]qsM] oh jZ_M_Ci?Z>oC]Bq?bBhCd^ijyb]=5е̊҆υnN!.:;@ 1%%PY+PY D8PY?+??+?3+3?910#"'####"&546323733>324&#"32>%4#"32on cqc\fpl#"2M^eM1.AgA\Am>^Bn@3/mzL=|İ_cepĄǂel$ .@aY     ?3?39/9+33103!!#7#!3&3RX0 >JGoE##kJ}$%5@  "_Y @ _Y ?+3?3+910'327#"'#7.5!273&#"nN 5k|lѻnu)*{\^y^)=t]aB5VJ4E8n2?+&&kW$")2@# &PY PY?+3??3+9?10"'#.54$32354'3267 &#"sWգ\65%OAʆn'EP #o#!J4c>9a $$ed n` ^%E $@ bY _Y?+?9/3+3103#73!!!!js'l'ln'Gh,Q)~&@ _Y ??39+3310 !#!7!7337#GARhj-ss"-YK:aR?䇇YY9WmO92@/11+SY1&&QY&PY?3+?3+99?+310?32654&'.54$324&#"+'3267#".'&'&9*juS]SRernEUԘO+2L9Q'YBNrZL)8SFUGG,6$DoP̖C@ECM1\ghdU +L^iC(w.@aY _Y P/]]+3?9/+102>54&#"'6$32!1f~9_MAm7"gzp}mzGϖ!/ 6N@ PY??+39/310!>54#"%6$326Ÿ9SDxBh%5DucSdzE ([@4 %%aY%%>%*%% %%aY$aY?+?+99//_^]_]_]]_]+9333103!2#!#%4&+3#!264+326 ŭ?ZW&u}>cf= pjD}GIIivyh#E!,@ bY_Y?3?+9/33+33103!!!3#!"&54?#26?!Jmh'h}h'hm'm7ȹmj}  A2H鮱VoWlJP$TGPEM .9@ _Y_Y  _Y?+??39/93+3+310!#7#!733#3!!3!7#9JJv \\,,h,ennEDMW &+0M@*.$.QY*$,.) $$ !QY PY?+3??+9/993+3?10"'#&54>323!3267"34'37#_ϣg`U>5 ѝ2\M}Pg D: +@h~j ChXf8A@{L5d21JE/@bY_Y _Y?2+?+9/3+310"&57%326?#737!7!3#Ʒ,@?In.'/-S\Z'Z-+ҵ+dnvn)W8@S[SYPYRY ?3+?+9/3+3?+103##"&'73267#737!7!'7!wy'y[N+)~opVy'z.%|)),a"llIWZ'2@"_YaY`Y?+3?+?+99?10"54?#"&54$327332727&#"j|͹@˩k0[F,%rC]1uacW:JW7cN%]  qbYLWO$02@$ 'PY-PY RY ?+3?+?+99?10327#"&'47##"&546323>74#"32>[F-\a{>:p:$hGNOP:"{O%\ d]Z[d\$~knj~E(@ _Y _Y?+?39/3+33103!2!#!#4&+3 (u伬ddxmI&]2PAdN/@RY SY  ??9/93+3?+310&#"3#!#73765'!3>32uke}:'GGt'tL†jaPm˅|ckH1pZfE)@ bY  ??39/933+33103#!#73'!!7!7#W'll'U6..h<&?,ˍW: 4@"SY SY ?3+?39/33+33333103##"'72>7#73!!!67#\p'z۔kH'22=XN;~'vD)2]&%n8 ϡ (Vi400p$}N+6:@,QY($$$QY$ QY3PY?+?+?+99//9+1023267!"&547654&#"7>323>7>54#"uGT"vqɘ M ""!*).jIPهka0`bN|i"}HQs198(" ^I&li*\OlqKN'&@PY$PY ???+?+9910>7!!547##"&546324&#"32>m"  "t }񊕈n3ITJKQQ}P6=kļ_b]koqb#N*'@  PY 'PY?+?+99??10>32#"'#!7677!32>54&#":o1!FO   WKQXJFPUN]b)z `=OgQ kqrlf{##/0@ &PY,PYRY?2+?+?+99?102.#"3>32#"&'#!767>3254&#"!)M1:pi #fHMOR }[de_1v `=ONJ+qg|]tN@PY PY?+3?3+102#"&5%32654#"%>\IX`PP #NiF]sed matN!*@@ &!$!$SY(PYPY ?3+?+9/+2999910'67&54$3254&#"632#"'4#"3262\I&IXq# x i֑k0ijYhD@e6I^Fsumk ukTv_DMW!-1@RY $PY *PY?+?+99??+310%##"&5463237!327#"&5474#"32>Jjj Mm.>)Yk KHMUkYƺZa^V rv4@td~M"..@RY%PY+PY??+?+99?3+10!547##"&5463237>32&#"4#"32>Jjj +ZpMS)767 KHMUBfkYƺZa^JQ 5DhMtd~@zN2@ QYQYPY?2+?+9/_^]+10"&'%3267!732"!654& fJq"C? caB?)6Ũx%\fWwN"*@QYQYPY?+?+99//+102#"&54?!654&#"%6$267!U f[M}Sg4fN~jXf21kqA@O{9fgN"+M@* '&&PY PY @#PY QY?+3?+9/3+3+33_^]1027327#"&' #"&547%74&#"'267  4Eica]8"//Q;SFc! !N&<1+8k{⳨eQEN&YAE36^NN%=@!   QYQYPY?+3?+39/_^]+910%27#"&546?.54$32.#"!".~ܤo#6 Vt}#akb}|  }Ub[{327327#"&';rJS\r"pY})0rY:K,=Xf DZjp,]XA9VdYUI+#`X^! tYi^NcN%7@ QY   PYQY?+?+9/_^]+910"32654𑯎&'2#"&54$ͣg`^pVr$lE gr1eP?6QZ17n= kYjc6P:#@PY PY ??3+?3+310%!!!#"'7326?!7$"ʢ$cm F$|SSc9$N'3<@ !RY *PY0PYQY?+/+9/?+99?3+10"&'%327##"&546323!2&#"4#"32>OA9$Bqi99&MS)777 ,ӸJNNPN!AL cdRb]'" 6Cajds$NKJKlN(@RYRYRY?+?3+9/+10#7!# 4$32.#"3267)Xn[<+ LO8H>e::/L&WLP:@ PY?+?3910#"&54?!!4'3269"\W$+A*P;D5<1b[u|x;gn\yp+RR_%N 1/@%(RY, ! PY ?+?39+33310%2654'"&54>7'&#"'6327632.#"#+<.I4$)Lq3VQb!Zl/asG1mQ+(G$z5">6ApXc# 'db7kxXGnLT95*'13Qn:D@ RY?+?39?10%# 47!3267!!6?QwyEDfqO  |pISR2HBC4Gj$&|%"@!RY RY?+?39?3+103>32!654&#"!>32.#"QwyEDhqϚ!)Mb|pISRmR2HB }j&W|/,@$+RY'$  RY RY?+?3+?9?3+103>32#"&'7327654&#"!>32.#"Qw"1v)7/EDhqϚ!)Mb|pIS  |R2HB }j 7:@SY SY PYPY?+3?+9/3+3?+103#!!7!#737!7!'7!1(3a%%3(-%;(( :@PYRY?+3?+10"&'47!7!327f%4 /4Sg*J]w~CM E:-& 4: @RY RY?+3?+310!!!!7!!,z<,l,73!!7!#>7!7!H(* =cIQa%%i(( zgM$; .8kj9],8| 7J@+  QYQY_o   PYPY?+3?+99//_^]++33103#!!7!#"&546;!7!7#"32w"w:a%%:e{8$;H rR׾*u` ̤bBrW@PYRY?+3?+10327#"&547!7!n/<)y-  %;{V  uu3?[V.@ PY SYPY???9/3++3?3+103!!#"&'%32654&+7!!N&幻 jJ%Zhnx0(F"KC0If__jZ[fLpns>0(YW:*%@* &&QY ??3+3?33991032673###"&=##"&54733267A2`qudXD=TWQ3Zu:ns>0(FX__jZ[fLpns>0(YWN;/@)/PY,) 7QY  ?3??3+399?3+10!654&#"#>533>323>32#"&'7327654&#"2`q  9yLXD=TWQ 1v%7/3Zus>0(S"KC00jY__jZ[cLsϧ  }s>0(W|O&#@!RYRY??+?9?3+10!3>3 !654&#"#"&'7327>  Qwx@Ei"/q)07::|pBOQkI5NEg  }J&WO)(@ ""RY"RY ???+9?+3104&#"!67!3>32327#"&5476V@Efq!  Pwm.>)Yk NEHL6{qBOV su4@I:   ?33?3310)#!673k( gK:4LN 2@PYO PY PY?+?+9/_^]+10#"&54$32%"!654&267!ޠ"0m'Bj)BJ?,%Tp}=[nN"L@+SY SY SY   PY  PY?+?+99?+?+9/_^]+10%#"&546327!!!!!!4#"32dr~pE ?(+/(0W(tKp8\x5IɻYC/օ&#N+)@# &&PY&PY?+?3+39/910"326?332>54&'2#"&'##"&5lg*&U I7wDuwbV-cnmbD:JRݹ̭|rs{ŭaLW+@ PY PY??3+3?3+3?10#.546734'6PP~LLcr_r{%cݴ"{- 0 G31*<:@P` ???]391073267!!'47##"'Xke&UL†jaC}AlG1p*@P` ???]391073267!!'47##"'Xke&L†jaH}AlG1p*W<:-@@ RY??+3?_^]391073267!327#"&547##"'Xke&Um/<)y-z <L†jao$V  ls6E3p>WN@_o ???]3910&#"!65'!3>32tke&G‹gdPf|c74O*uvWN#-@#@!  RY?+3?9?_^]310&#"327#"&54765'!3>32uke&en/<)y- L†jaPV  su4@ |ckH1pN @ _o ??]310&# !!2tPT\6rkMaRyWmO52@-//*RY/$$PY$PY?3+?3+99?+31032654&'.54$324&#"#"'327#"&547D[uQ^RRermCVԘOXm.>(YP C3M@GG,6$EoO͘C@7>32&#"*Z)5F/>('Y>*$OHU'W&JUfǶ]fɴ$W ,@ PY RY RY?3+?3+?3+31073>32&#"3##"&'732>7#ӳ'Y>*$OHU$ *޾*Z)5F/>(ӾǶ]f,̱&Jd#WbM @  RYRY?+3?+310"&547654#"7632327 mH.*ET 23B<)DW|:C8!j|:C!C!3.W[".3@,PY &PYRY?2+?+9/9+3102&#".'#"&54>32>3267.#"Y>*$OIS+R .qfgd'A6Jm:IW]fISQ%9|#@#M?yd^Qɴ*0G3-2Ga(@PYPY??+39/3+3103##!7!654#"7>32x%7%g |%z>ؾ>b syDXIT$@PY PY?3+3?+310#733!!327#"&547%7% HN{$z> |S>3/ sz/A:$/@ QYRY ??+?39/933+3310!!3#!67##"&54?#73267! P{PPx"x? ܄k"kPWB:ggfq늅CMeT4TV::1@SY0 &PY ?+?3+310#"#"&54>54+73232654'&546;aL޲#5>5#:b'P].9hg^lo6BVg7ƭEs`N?2&XI.hYexƙ=oi,gb}N @ SYRY?+3?+?102#"&547!32654&#"7>tż~y ]Z70N)'N|ȗBQD3IK @:  ?3?310)&'!!@_ ]iPqM8:m:@  ?3?339/3?10!#67#'#373Y !9 4:/_GH#r<:-jf@  SY?2+?399102&#"!&!>DkH&50;VJCX [/| %Pr>$bsҞ:??3910!!!rU)]&UT~H!W:.@SYSYRY?+3?+3?+310327#"&54?!7!7!!m.>(YQ R''Q'Fh9V rv4@M\5:!2@PY SY  SY?3+3?+39/+10?!7!7!3>32+4&#"3264'n?''pmpIF3;gp:F`G\Ɯpabi+p3W:1@QY PY SY ?+3?+39/+3102654&+7!7!#"&57%f%(&Nb誼nk[󕹧 TbW:!+=@"SY )SYQY   %PY?3+?99//9+3++310&'#"&54632654&+7!7!%327&#"´֦p%(&N;10_M]pQYc26t~'!hj[ZC.b0;T:Z!@RY  RY??+39/+10!32654#"%6$32dm*> V;9A3 ֵoUCșZ!@RYRY??3+9/+10!.54$3254&#"3267A(hiTkZ!@.nNࡸZfC Ojwr 5iE@RYRY?3+?9/+10#".=%32654&#"w@ؾhiTkZ!@.mEࡸZfC Ojwr 2WtN!@PY PY?2+?+310254&#"3267#"&547IXs"ZP #N4FNI^/R54.+32654&+<|nWVv̀bV3(HKҊ݅vUp:rsj"oOkU@:&+8VU85P~N&7@!QY PYQY?+?+9/_^]+910"3"32>54&'2#"&5467&54>VaTi$kNGbXj=¿׬WJ<6Pb6Byޒƭ +^UK0'9@SY@SYRY$SY?+?33+9/+2+10#7!# 4$32!2&#".#"3267)Xn[<+xTMLH'74H* LO8H>e::/L# 32&#"4#"32>}E0:p:;ʙKJ'73HGNOPWb[d\- :N&nj~)Z 3@RY PY  RY?+3?99//3+3+10!32654#"%6$32!!!7!MO5*> V;9 N$" ֵoUCș,hhVZ$3@RYPY#RY??3+99//3+3+10%!!7!7!7.54$3254&#"3267!$N (hiTj["@,5Ohhh,ᡸZfC Ojxq !$A@##""SY   PY PYSY?+?+?+99??+3910!7#"&546323!!4&#"326l NuLSmje(]O&,k(&7^7<2b32+'4&#"3264#"326 NuLSmje(]O&,KWF69?`&7^7<2bRM@4N0^= yc%mqSF;O6~_/j<:77AE06-0BJ1l@,8l>:)<'w\Lb*HW(2;@ #RY RY-PY @)RY'?2+?3+3?3+?3+10"&547#73733>32&#"#"&'732>7727#t|Z|%2"pY>)&MHU'*Z*5F0@'dC$$i$qM%-~S]fɴ'Li %<E82;J@)(5SY&1((..9PY.#PY PY RY?+?3+3?3+?+9/9+10"&547#73733#3267&5463 4&#"632#"&'4#"326U_|q%{n2%k K|%(Fv{gmtCv+rJ8iM@DjZ$*~/6/, .MmJYnf:6pKJv_J@",1PY.,"&'&PY5' $RYRY?+?3+?39?3+3?3+10>32#"&'7327654#"####737>32&#" 5tE\a#tZ*:>E:iq߭Xޭg%gr=H%/'& :1JLD|xO]}b@{||q@AU*0@ ''PY)'PY???+3?3+39910#332654&'.54632.#"#"' ;mvvClig<˘5INRCjz`7[;FCN1>#!FcE̕G32#654#"#{C6{Mgi\PhEtP>MCgaBN'[tTU !3 .1?3?39?33103>32#654#"#>32&#"*6{Mgi\PhEtPt8-$abMCgaBN'[tTUX]a d[ 053?3?33?1073"'72673\F+(/* wnQ 5=%gj 1 0.???33910&#"#6733>322/Em1_A%!C I[N W / .0???339103273#7##"'v2/Em.bA%! jXQ 'l!4 0 /?33?9?3310##"'73273327#"&546H/eD+20E!(("F7XZXR k LX.q    0 .?3?39/33103#!3 32654&+8C9@UM692a>}=<'3 0 0  .?333?3?310#&=#3>373*/ ;42R7373f>8'$88.1jCKYc >S% ax^.L  yLx? /3107>733&YENf 3?|LNE? /210#67#&YE2|LF? /210##&54?3K3& !~~cvJ\iwy  /32104#72#726X[h{=:K@vULjt7w  /2210"&5463"3N[hz>9XwSMkv4*Bq .??339/31032654&#"'>32O)3YuC>s/*0 {9XcSMkv4*Bi /3310%!73733y,|,x| /2310##7#7!x,|,ym|} @   /9/33310##7#73733x|yy|xhh|xx/210?!,,{@ [ Y/++310"&547332673ᔘXdX{r o:?g [/+107!g)) | @Y@ H@Y/+++10"&54>3274&#"326`oFR_pJ>2(:=0+5A|WK;r@TM?q>6 0 W Y/+3/10"&54673327[ou]O]!-7>EWONT-.4,!]*@ Y    @Y /2+_^]+310".#"#>3232673,RLD05(g-TKB23%#+#4=#+#89}  [/2+310#7%3#7%3 *"+"+Kh9  /332210%3267#"&/K"-?*G*"zqN7L;8ba#_3a /10%'7%'_}T~klm[\ 04?3?39910#"&5467332654'?tclFV_ *`Ne{`T&$/C]ZE[ZS"*A1"+A- /10%'7!{& /22107'7!3'7!{{&&| /2210?!!7!&&C7  /3310".#"#>3232673:(ID=$2|>^D)KD<,/z?_#)#-Blb:"*":4dh< /3210!!E7 7N7 7  /210!##a]+tqJ /210#7#7!|t+]qid /21033!2t+Kqi /210!7373N+tiqbW/3210!3!73TJ++W}bWs /210!3!TJ+PW}W /9/310!#73!]xuu$Q> /10'7!I{$&*$> /107!$&j&#+  /3210".#"#>3232673(ID=$2|>^D)KD<,/z?_##)#-Blb:"*":4dh<d$/310!!{d!̨v@/2107!v@NNX /2210"&57332673|YFHz0}.MYXNA S[/+107!((H[/3+31073!73++u++/229/3104#"7>32#722< h,hj Y7fE?&$/C_]ZE[ZS"*A1"+AE  /3210#73#73Ɏ&" +" +A(e /10#3Fege/3210#3#3:FFegg  /321073#73#q^+"+"_ /322107!"&573326734((ˇQEHm1{0NNNN* /3210"#>32#54&Du-ҐT@QKIP?: /3107>733Y&YENf 3?|LNE?: /210#67#:&YE2|L?6 /210##&54?63K3& !~~cvJ\M? /210#67#&YE2|Ll% /10'7!u{l&qlV /107!ql&W+/9/310#7#737+G|@}3)%m}ҼN /3210"&5463"3L[hz>9XNSMkv4*BW/2310!73733z,|,wW|W>/3310##7#7!&w,|,zm|W) @   /9/33310##7#73733{{{{{{rrqyy./3107!$Z$ֹ^Wd  /22107#"&'732?""/q)07$d  }|Wsd /22107327#"&54?$n/<)y- "dV  su4@arM[/3+31073!73J++u++rW-  /3210#"&546324&#"326-\GX]FXd(%1>&$/C]ZE[ZS"*A1"+A9  H/+310#67#73pl(>9dF~FrC] /332210#"'732654#"7632޺\NHPaim>H2]Hjzp { 73CkUW2 /2210"&54673327_lYTBJ(&6@EWXLG40p/")!W /10#3rFWgW/3210#7!#!+S+JW}(@  /2222310#"'#"&54733273327{XZ+C[IPhKYcKYhx==TL!IqIq Esv\ Ds' I |i /22102#.#"#>QHEm$w@HH@O?b J$$B?= /32107!7!'s'D's'rd.7/310!7!v)7/310!7!q)/10%t.*/103K) N  /32104#72#726X[h{=:@vULjt7W/3210!3!73J++W}WI/3210!!7#Ix##Wx괴 @   /39/932310.#"#74#"#>32632>$!]cH"/pvP[+CVKV"q'J"K`==VNz  /10''7'77Zo^Kbp\J]yy]uu]ww]un<q /32107>54'&54><-64X\-42_qY%@@%8D$['I3 /O*|$F /22107!%7!|$NNNN /10'7!{&f /107!&  /3210".#"#>3232673(ID=$2|>^D)KD<,/z?_#)#-Blb:"*":4dh<H /210#67#!k2&U|| @ /3/33/3107!%73!73~++^++!$%W/2210327#"&54?3T% $,7?D <5iB'/3210#7!#!+S+J}QWm~ /32107!7!vjjjjWM/3210#3#3FFWggi) /310#7#7!t+]iq&v  /3210&#"#>32732673#"''F $2|>^D6LOUN,/z?_F3N]T#-Blb:+h5f:4dh<,z6+!@    /32221073".#"#>323267373 ;61'd2J7!<60#%a2L!$5XM/!.*TP0M3@   /',#/323210".#"#>3232673".#"#>3232673P(ID=$2|>^D)KD<,/z?_(ID=$2|>^D)KD<,/z?_#)#-Blb:"*":4dh<#)#-Blb:"*":4dh<hbl  /329/3107#'737lk||||W' /107#7#-|К|-W玎 %-5=EKQYaiqyNY|YPdYh\@ Y` @YD(txt@ Y,x lplY$pTXT@ YXI8<8Y<40@%YxpXI<44557449 885667775558849*557sNsmmIk1 /10?'7 kOO:$w4  /2210"&5463"3[hz>9XwSMkv4*Bw  /222107!2#74&#"#>((*OBKr p4 7?SC~RT  /]10''7'77'o^Kbp\J]yy]uu]ww]uW% /10'7% OO:W /10?'7 WOO:#W @ /9/3210?'7%#'##  x~1mWOO:ߞ!w  /32104#72#726X[h{=:K@vULjt7>L  /310#"&54632>@-!*?/"(*?, )?+W'  /107''7'773bz~Fd.`Mnr3ig2_f:yy;e_2W+!@## )) /3299233310#"'#"&546326324&#"326%4&#"326\[+D\GX]])B^FXd(%1>&$/C)$1>&$/C]BBZE[BBZS"*A1"+A2"*A1"+Af/9/310#7!3qaqa׽)W  /2210! $'332$7G=K@b,~lvt!TA  /3210! $'332$7TG=K@bA~lvtX/310!! 8X^/310!!8G /3210"%$#"#>3232673xxYi .xxZi.DDFLDDFL A  /2210&$#"#6$! S:}$$n=xrl~b;/9/310!77!k||b"h&0.3?3??10733Kn|q$$w_gq*o/ttvQKz 0.?3?39910 #373~YvnxZ  /107!Z&lR /10!7%Rz&W]tN]tN!A@&@/  PY PY?+3?3+9/_^]q]10! "&54$3254&#"326755ڞ$¾IX\LP #N>I^qed n`ToN?@%@/ PY PY ?3+?+39/_^]q]10! "&57%3254#"%6$3255̾SPXs=!ݛN S_cSƬj=[ [/+107![t!B%` @ [ /9/3+31073%73!73++L++!%vdF&$82?5 [/+10!; ;1! E N@0[_Y;* _Y _Y?+?+9/_^]_]]]]+?+103!!!!!7!(-?,E!B%"KF&,}82@n i  9$4DTdt$DTdt$d 0p %+_]]qr^]^]5?5!Z!!@![_Y_Y?+?+?+10"&54632 4#"326%7!Ncb،Y[Y[ft~ ݝu!B%!jE)@ [ ?2?3339]]?+10)!! 7!VF4tZy$!B%!Z++@_Y'$ _Y&[?+?3+333?+107!%"!732.54$3276;!$4&!tTT;M,V+cC0"׼6E%\,9;Q!B%•u= PՀQ0Xzy`&j9&+555dE$ E%HE_Y??+10!!,`EDE @ `Y ?22?+33310!!7%.5[Y,V,f S6Ej=j E(E=!E+AZ!@@*aY? _Y _Y?+?+9/_^]q+10!7"&54$32 4&#"326H**eff]kbd]jbpzO4E,WE.PE  ?2?310#!!&547U0P([EaTA!*]/E0E1 E I@, _Y  x <   I   `Y`Y?+?+9/_^]+_]]_]_]+107!7!!7//V// ,;,Q(JZ2!E@`Y?222?3+310!!!!QEE3E (@`Y  `Y?+3?9+310#7 7!!!-'-/~)(/p-E7fE<O #-5@( (bY" ))bY   # ?3?399//3+33+3104&+32>7#"&54>;7332+;#"WMtI~J(R Sx(VEtOGp7аr[tffckSlAE;d<E#@aY ?3?339/3+310## 473;332673#MM TUQN nwUT1sZHeKL7[H%OZ(%@_Y"  _Y! ?3+33333?+10"!732&46$326;!>54&c[<;;,t>nZq\u?p,;nz?jwy[L sjƄyX 0_dz4&,j,  &+55f&<j,  &+55/5&b8< ))&+5N&f8P ''&+5*X&h8P  &+5;&j8 &+5j}`&v9&+555/5N('@  %PY PY?+?+99??10%# 47!2367!!&5%326?4&#"Z|p3E G% %;ADX3QNZtMy_[r6|l_ua^êr{n[SɨQW-B@$PYp #PY '**PY?2+3?3?+9/_^]+910"'#!6$324>54#"32>kq :.#B^t^'_{?r~)|BV|E^k_܍S%tbdK~A| $/OX:@  ?3?33310>7!!67!& ?%S'O_)Hq*g4(F{ր/3 #%@ #!#PY! PY?+?9+3104'32>'#"&547%7!WyZaZdN KS LU$G(lejh+SuJA~Ŵ5G~:NN&U@2 ! !QY   QY' PY?3]]+?3_^]_]]+9/_^]+910%267!"&54>?.546$3 .#"!".\Vggk5r$Ts}#XQL͈}ZU vUZV{>GP?_^1Eo"z@V PY6fIY+dFV2        ??9]]]]]]]]]]]]]]]]+3_^]10'6?4&'.54%7!7!'Wa=J fMq+$?$s)5(!&u\NKJ]>+4&$PqQ6^*XN!@ RY ?2?3??+910654&#"!654'!3>32@Blq VzXN3J<SDO**,50(p]t54'!])nwK:aA88:qo1O@,-,-PY,,# %"#"PY@H4 ( # ??9]q]++39/+910'6?4.'.546$?.546?#7!la=J +_̞ȳ`$#%ς:zEK|dNKJ]>+"")p}ߔ tY_!f]EH :VkLNR :"'@ PY  PY ?+3??3+3310327#"547# !6?"763!;r # &gj y8BJ7Yr$9m!'Fu%|(# !';s}tWuO%@ PY PY?2+?3?+910"'#!6324#" 326SV H/EO˒@5&m32&#"h}?dM\.^e{f]fJ\$'>YDUWJjF.$ #p=.:!@ PYPY?+?+310"&546$3!#'4'#"32>b %z^)6Rl3YS^MʿckOXlkz:"@PY PY?3+3?+310"7>3!!327#"&547Q'i6%p53)@$ ) || 1" ]b$-j}:@  RY?+?310"&547!32654'!~y MUe~U.(@L<.ST:yWR',@ QY QY $PY?2?3+3?+?+10#.54>7>324#">OFËSLh'ӤQuL9MhlTWȵu!t ̻wmz:nXP$@  SY?+3??391027! !&'!'.#"'6sFQ;G D)o VeH2;2)+WP,kJoaN`^4K=W(W< @ PY  ??3+3?3?10%>73#.54733okvy2OOyvENް`k@`pO8QOO-/@&QY' PY?3+3?3+39/910"&'##"&54>7326?332654'7eg0ekyHkFkKG2\++=3YA\@~wyyݍilW'kϧ?&jj &+55j}&vj &+55L&R8< &+5j}&v8 &+5&z87 ..&+5q'3:@+RY%QY"%%% QY 1SY?+?+99//93+3+10!"546$32#"&'>324#"3264&#"326pr5ݻP+6BBZ̊rAz&^HDWd[ueW dfZ&Oa9Hb5.$(TZtR`/9=@ SY#0#RY.000**4RY*SY?+?+99//3+3+310##"&54>54#"76323267.54>3 3!654#"s61G&diVd rO{ۀNswQ`uj(RKA'2PK(NMK$]|n`wwJZUWd[Y@ `Y ??99?3+10)!>32.#"^lPYJ]+!4*.f{i:O/=7 [&1?5[&j@ &+55MW9:..@%PY  ,SY?+33?39/9+310!##"&'##"&547#326?33254&'!i'a,qteg0ekz[jd' .[ (=NuH^m:g֬yy[XX  O"SWA33@-RY-#)RY&# RY ??+3?99?3+?+10 !654#"7>32!32?#"&'7326?.5467uؓR(*i"dn$@Kj9U-0=$1v)7/GX AGJdA~|Hz̴n~Ź  ADa巿7Gxox WtN+'@ ##)RY%# PY ?3+?3+9104&'.54$32.#"#"'7326@KңV%NLZE-\sn=-C\T$,4eq/aUlrCY=%1E_Fs[0%E>E #@ _Y@ _Y??+9/+107!!!!!$c,|KmPBEaW: #@ PY@ SY??+9/+10%7!!!!!%O%(`MuLX@ozZ')@'& !!aY! aY ?+3?+3910327#"&5467'654#"7>32oFwE?)!q'gt8a!,~fE?)!q'evi\ iW-6\f\ fX[D @ RY??9/+9910!#!73! X : j111zYZA@"QYQY@ aY `Y ?+3?+9/32+3+310.#"'>32!7>?'%&''^K|XtW/ԍ.:BKEg[2|̶nWVn@   ??910'%&''%&%76Q`8(99d*GRko\]̿{Ũ}_WE/0@ )QY %QY _Y?+?+?+?3399107!26?#"'#"54733267332673#u-C>5uRAR.W.WRlZWUtPKPRJfnpC8)ns@6+UW:1,@,"(RY SY?+?3+3?339910!7!26?##"&=#"&54733267332673(JN 2ZVK<[PUv9.]sv9/Zq X{WkgdfguhusQgn@oQn@oDСUV(@aY  aY ??9/3+3?3+103267!!#"&54>32&#"NV4z1w'fEJK% ^vFOMe@*@RY RY ??3/3+9/+310!# 47!2&#"3267!vYa?GBy)*7/+]mbzj EOFp  ]=/4WnE"@bY aY ??9/9+?+104#"!!>32#!7!26Aed}'`SMl(Rg3zE!k͎& w)4J@'/'-))$ RY-SY--$$2PY$RY?+??+99//++2999910#"'.#"#>3232>5#"&54>3267327.#" 9i{W42QoW[ZGPtA]9)`*ABgDdhCb=h˨9"^;7>54&#"%6$3232654'%!"&?sǙu=eZPI;mݝpu$E]nZ0'8J5@?XjY+7kRHEhp2;KYW9Z*&@ !SY($RY?+3?+39910"$54>7>54&#"%6$323267C>rǢu4eZPI;mCnƏ.]m[0(7H7@?XjY++@Q8N?(70!QZ"7@ !aY""aY aY?3+?+33?+39107>32&#"!7'.#"'632%ZwblNC6E*'2':;7Bk"T]BFH5]fK*=q:-Kf(\YV_#)N!1@ RY   PY?+33?3339+3107>32&#"!7'.#"'632 !_NOcoGJ8U+g%D%:C8IdQn.zHfTLiG40r3r.6GiLTH!(@_Y`Y_Y?+?+9/3+10#">32#"5$!34# 326)A^חv_sm3qs+3ϡmxuwIS"+@ PY  SY PY?+?+9/+310!"&5!3#"32654&#"7632I(`5ceUPAJ'ga]dAq|nxskAE @ _Y  ?/9/333+310'>54&+!#"'546;!32@@9%&^I'>>&Yf)#45#bNP.) >wl '@ RY ??9/33+333310#7!%)1:1h1WW`A(,@""RY" RY ??+3?99?+310 !654#"7>32!327#"&5467uؓR(*i"dn$@Kj9R',c'dnJdA~|Hz̴n~|bԠWN"-A@ %PY  RY@ H@+PY?+??+_^]+?+910#"&'32#74.#".5!24#"326j Mk>-\Hp<oJ߼bUȮK>-f`(-[Q # 3d֖~w]tNFWMJZL:0@SY SY SY ?+?+9/_^]+10"!!3!!"&5)ه%!'m|()\@'owy!ec=_:0@SY  SY SY?+?+9/_^]+107!2)7!267!7!74&#')'('!l}opy'ed EW}SZ&E0W:@  ?3??333?10!##!67!#67n>%j$ Q8dz3ui,Uf|t]ZWO#4@PY PY !PY?+?9/3+3?+910#"'#3#!7#736324&#" 32^ !&x&x/Jg]@5[xҪ9mmր~NZHSZ&&O]]510NZ&HYO]]510 &(C &+5 &(j,  &+55qE#<@aY_YaY H?2++??+39/9+10"&'732654&#"!!7!!>32{  ,408p},N,:SN}{WxD:*[29/@a+:vMbJBH&Ev &+5SZZ@9_Y__o*:  _Y  _Y ?+3_^]?3]+9/_^]_]]qr+10327!"&547! .#"!kk|6w. \Le-8M4Xl|{BktZ64E,4&,j,  &+55JE-E#6@bYaY `YbY?+?+?3+39/+10!###"'73267!324&+32>݈;:,&3N%6g QBTCh6o<uiLLQLE,@bY  bY?3+?39/33+3310!###333324&+326yygggNVU Px}lEbŏKGVeqE$@_YaY  ?3?9/9++310>32#654&#"!!7!9VL}|a[08|{,N,a-8uKf Y,9/Ja!C&v &+5&C &+5_&7 &+5!WE @ `Y ?3+3?3?10!!!!!.S'k'SWEQWdE$!E &@_Y_Y_Y?+?+9/+10)!!!24+32>),u;З|FkCEТÌ2l E%HEEXhE!@ aY aY/3?+33?+10%3#!#367!#į{O@O{a<1`1yVhxo! r E(]E#C@*"bY_/? ?22?339/]qr3+3333310!"&'!.'33>73!#p/-& 13oo>`6'c.r>6pB)Pyƃm;zu:Q)6ZY)a@>#_Y+OO_ aY_YH:?2]]+?+3_^]]9/_]q]]+910"&'%32>54&+732654&#"%6$32wVJE,EeYva?}]sl7k7!!{fH0 -CH[:Qҁ<E0!E+JZ2!E@ `Y?2?+310!!!!QEE3SZ&-E7_E>@'         `Y?2+?39_^]]]]_]10"&'73267!!H"OHHoM3+\$*_v|yOWAE;!WE @ `Y??3+3?310!!!!3S'>'׷WEQctE@aY ??39/3+310!# 47!327!_H]WS IPh'$/M_SA5RM!E @ aY?+3?3310#33333ڧڧEeeWE!@  aY?2+33?33?10#333333#ڧڧX{SEeesE 0@ aY     _Y aY?+?+9/_^]+102#!!7!4&+32>,'cmrPNO`HFaHRo>uE #@bY bY ?2?+39/+10332#!4+32>#3g6N|A5P;Mc3EbŏKݐeBdE E -@_Y _Y?+?9/_^]+10)!324+326 'eٔHEȑ~Z\@:_Y__o*:  _Y   _Y ?+3_^]?3^]+9/_^]_]]qr+107!7#"%!  # %3267-L5vj3y28GqnB;4Z!P@9bY?o?O  bY bY?+?+??9/_^]q+103  #"&547##3%4#"326HZucrpVFjeRErb+)~cޗξ`uEE.@  _Y _Y  ?2?+9/_^]+310#.546$3!!#;#"hhp dzܰIjAE"iuzx4m3QND_ $9@!#  PY 0 @  ?  PY?+/_^]39/]q+9104&#"32> # 4,7bRXgMkIVW^k .fGa`xky_JAFh:!:#=@#QY`pQYQY?+?+9/_^]q+910 #!32>54&+32>54&#jjs4kwT2am-Xd:l:u)[7>3$Q-3/:PY??+10!!%::Vhu:% PY D@ PY?+33?3?+10#!#36!3#>TOt}_mtO| ǾhVsQTtNH+:!7@!QY !?33?339/]]3+310"/#.'336?3### s- H("]VV^q Ta\Eb1KD4a&1`N(K@,!  QY/o QYPY?2+?+3_^]_]]9/]+910"&'732654H>54&#"'6$32 u^n"MT^05ӻ֚m~,LX]QC>&N6,=~oi tVd^!:  ?22?3310!!67!\7>i(:$%,ls:!& &+5!:@ PY ?2?39/+3310!267!!#!Vf|WHN QIV:DJmX0C:@PY PY ??3+?+10!# #"&'7326!xgz[%_%):Pw|qחA n6:!@  ?333333?3333310!##!767!#>7d9 G$ 4%A΀,"jPI:ExJR@!: %@ PY   ?2?39/]3+310!!!!!Z{ZSS:1:TLNR!:@ PY?3?3+310!!!{:|:WOS]tNF:@ PY?+33?310!!!!%:|W:\"W$/@QY QY?3?3+3?3+3?310.54>734'>hG1PQڄKKNڂPJsQ*,Vֱzu~Ѳyt gL* \:["h: " D@ PY ?2+3?3?3103!!!3#"etO:|z:@ RY ?2?9/3+3103267!!#"&547K:lh`Q[~ U:~-o8ym(-: @ QY?+3?3310#33333ܯͯܯί:{{h:$D@  QY?2+33?33?10#333333#ܯͯܯίܯErO:{{{Ly: :@" QY    &  PY QY?+?+39/_^]^]+102#!!7! 32>54&+}Q%+T\Xa{7dtYr~td|L'.`481: 5@ QY    &   QY ?+3?39/_^]^]+102#!3 32>54&+!@vzT\ T\(IT!pySm::M&.o13+': V: 1@ QY    &   QY?+?39/_^]^]+102#!! 32>54&+ւT\b~32#"&547##332654&#"LAMm Z+5J_F*0JbI罬o?F1:HKW[GC:(@QY QY  ?3?+9/+3310 !.54>3!!#";OY^EσU]MtXTf3ؗ%pTt&HC ((&+5Tt&Hj ##&+55&Wu)G@'"" RY"" "QY'SY?2+?333?3+3?/_^]q+910"'7267654&#"!#737!!!363 udD'2IAz;Kfi!,!!W @brL;FPHFN&v &+5oN#Z@9PYoPY  PY?+3_^]?3]_^]+9/_^]qr+10%267#"&54>3274&#"!!

7!32#!32>54&+9_|x#%!+42+T4@wx٭g T[(FV!|>ʸL :OLpySk:|1-n31,:G@)QY  QY&   QY ?+??39/_^]^]3+33/+102#!##333 32>54&+J@wx\\TTT\ T[(FV!pySk:&:LM'-n31,&u!&vd &+5!&C &+5W&\ &+5!h: D@ PY ?3+3?3?10)!!!!#O:{h4Y4?@!+22_Y2)++ _Y+'_Y' _Y ?+3?+?+3?3+9/10.#"3267332654&#"'>32#"'#"&5632-,SA;9908sC i8Hfl␁Hxovv׈C?{ZeC4#wdBR>I}}&k:@    ?333?339910 ##363>='Tfb3}P*RA):RDw:l?׏0-YE1@_YbY_Y??+99//3+3+1037!3#32#!#4+326~'%%ו> eFk{͓kjc/@QYQYPY?2+3??+9/+10!!!!3 )!32654&+NN:%0f*jv+:n|3V_=:X"0@_Y`Y _Y ?+3??9/+?3+10327#"&547##33324&#"@8feI⌓vpgsK30NUfn9QaEĿHizN'5@!!PY!PY &&PY??9/3+3?3+?+310#336$3274#"3#3267#"&57#UaAhFh% &F9a2`X:I'@29neeλP;dE !@ aY  ?33?39/+310###!!!3'&5D]]GX $E[#X.: !@  PY  ?33?39/+310#!!!##3.'HaP(HCb[:[t]#dE(@ aY ?222??39/3+3310#333######3'57+}90]]3η]0WEzJ@:(@ PY ?222??39/3+3310#33!######3&=%jT7CC6ԥC:$[[[>"+E ,@ aY  aY ?33?+9/33+310##"#>7!#654&#!kk Kk;<*٠V}<; >9O''t3 HCK05(IQ9:,@ PY  SY ?33?+9/33+310!#"#7>7!#7654#'!kO-"*ql*"M^i  +'ٯ)"&FE!$9@aY"_Y !$aY??+?33399//+3+3103!!##654&##"#67###ka{&<; '$kk4T;<>o{E&O[0D.AD'q3rC#: #9@ PY! SY #SY  ?333??+9/+33+310!##767##3!!##7654/#O*"*,{LҾ_bubk." j9 ߯_Oy: z<5'aQa@1NbYN<973@E%$%$aY%%?13@0-33+aY3 @aY@_YD?++?+3339/+922?+1032>32!74#"#"&54>7>54&+73 54&#"'%37>32&#"d0ltx;sz;"buA|c㧋K9+9Fe[x'nM*]>`,^ ! t8`d-vE&up')!<#*#tP .REOHGM;7?W?9KV-m%la]8 /WQm@;GJ@BJSYoBBB BO@. QY OO=SYO7QY7%" (@QY?+33322?+?+9/+9_^]]+104>7>54.#72654&#"'6737>32&#"32>32#74#"#"&W{g53gu#B?NrPrU4W'DNbCrqR)C4,2TX16MC>FF6NY.sMo  nTNsS=@8)"%)9"<E#@aY ??339/33+310##".'3;332673!MM n:++ lu!UTfJs_Kk.%O:W:@ PY  ??3+3?3310%>73#.5733kl vy2OOsP0-@Gް`kM^pSpeJZ-=@ )_Y!_Y@'))%_Y_Y?+?+9/32+3+310"&54$32 32#".#"%27654#"632ghܱa2+)D>:0E.2a>3+:5<{H%3>3%LN -L@*)PY')) ))@ PYPY$PY?+?+9/3+3_^]2+310"&54$3 27654&#"632"3267#".ٟ"4'. RYg(1'@A@34g',#0D74ĸ`Lek 61e]w''t0)wY@ _Y?3??3+10)!67>32.#"YՎ./ECFQ{7%1'E{2lʚkFR *7PqN@ RY ?3??3+10)!?>32&#"q$G`Vml-$-=&:87BE:C&$ $$&+55q&%  &+55W'Z-1@ /'_Y _Y bY?2+?3?+?+33310"'73267332#"&56"32654&W:4'1868nPN[cn|̓dn|U32 4'#"'632>A[zܙ(z??Z{ݛ#yc5CNK0>^:4EJK0?^324'#"'632> f89M~ ]31I+FVT+[M1BMN*aU:0;;0!դh3(0/&ͪ/B?F᠏377@46QD@"*ICI_Y-FFC@ 1C# O32>7#7332654&#"'>32#"'#"&5632.#"326G{EGsAdv!D~R8VH?_,j!:.T*8sC i8Hfl␁Hxovv׈C,SA8,ah49;2sg.6&-d#])uTJSdBR>I}}&쇓{I0&<F?@.5<((2AB @ RYF RY%?33+33?3+32/33210%#"&5463"326732>54H#"#"&'.#"#>32>7#73W_-E|Gl'M=*@(:sDCB-`G{EGsAdv!D~R8VH?_,j!:+?پI}܏%10&߆gV~49;2sg.6&-d#])uT:w& 66&+5k_&R %%&+5WZ@_YaY??+?3+10327!.5!2.#"hjGAR{\ ZM l$BjuWN@PY PY??+?3+10.54$3254&#"327XQ%¼IX`VM=zW׫>I^}} ??10%%#%77%73\bq]\tb\saaaaaaa%Z /39/310#!#"&5463!>32U> P8*:T@S(?"*:g9U>A20?R/37( /29/31074#"+732>32n'Vcn?_$f5a[[/m)2)$,3S2 /2103##.547=(l@:W2J0#,S2 /210#67#73pl(MSdF~Wunn /33210#"&'.#"#6$32Y`bJ}"LkiXn3:<1sg-763% '1;EO@ YC@Y/+2/+9///3+32223+32223+32222104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EOb@4 @C-//(#%%OM7:2:  CE(9M:JJ:M9(EC //9////////////3333333310#65#5546733#"&'5353%32&##&'''.'77'67'77>7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96mh$+ `Y  D@ ?2?33]2??+103!!3##67  /47332>73IRQy6!?B\MJ.kE` t/"%,<.@:nx=!h%4@! @ PY  D??+?3?332_^]210!3##>7!% /47332>73]%'>]i * B]MJ.l:$u1:f."&.9/A8ow= E/@_YQY  _Y?+?99//3+3+10#!#737!3#!24+326u#u%'%}#}FƤ{԰Γk&t/@QY QY    QY?+?99//3+3+10 )#737!3# 32654&+}!}!f\ԑjv(U`=:E@_Y _Y  ??+9/+10'+!!24&+327'776˔Ufu]sqQ6.ol ǜj~-$EUI_ WO/'@!PY,PY?+?+99??103>32'#"&'#!67327'7>54&#"@l]XprT_l eSI5.nM$KHOT:v^gؽq(d[JMfvaH2syx\Y@ _Y??+103!!EquEdDv@ PY??+103!!Pu::/E &@ bY  _Y ??+9/3+310!!!!#73-`C;'oo'pE=?]: &@ PY  PY ??+9/3+310!3#!#73%6%RR%[:Y!WE -@_Y  aY_Y?+?3+?9/9+10!!>32#"&'7324&#"!',;NIS3ν=;uQV=b7tE'vPc|TK#y%!W*:-@RYRY SY?3+??+9/9+10%#"&'732>54#"!!!632*廙7*]B]K:~F-6xؼڟTWz2$Z:(h]E':&D@ "bY #`Y?+?3?339/3+3?10!##"&'!.'33>733#_>6pp/-& 31oo8_='c.Jk~OZB)PyƄo;s:Q)*th,:%:@ #QY PYD %?3?33??+9/3+310"/#.'336?33#### s/ G("]VV^q TaetO=a\E`6KD4az&WY6A@"._Y $(("aY(5 _Y cY?3+?3+3?+39/+910!"&'7326=.'%32654&+732654&#"%6$32e,^?MPY~E-EeZva?|~aqs]nqucKInbCN=«&fnB1W`N2@@"*0QY-* QY QY'QY?2+3?+39/+9?3+10$732654𑯎&#"'6$32!"&'7325u`q"Ʀ]Uh5Ӷۙk,]?M ),JZ^JG@RT49KEsm yYV!hCE2@ _Y bYD?2??+9/+33?10!267!3###!'&j?h18ytOVJoE}&D[ !h:2@ PY PYD?2??+9/+33?10!267!3###!Vf|WHNtOQIV:DJmX0C!CE/@_Y ?2?39///33+310!273>!!##!'&j16Ni9/1850iK50oE#7ID!:/@PY ?2?39///33+310!27367!! ##!V-#'V:D4#pX0;C DE3@bYQY ?3?399//3+3+331037!3#267!!#!#'"23,1=Snȉm0 X l5@ QY  QY??9/3+3?39/+3310#737!3#>7!!#!P|!}!l28H7>A!4W&WPT. AqKE)@ _Y_Y?+??39/+3310#7!2!!#!l,jp:Coa&K[ M-:)@ QY RY?+??39/+3310!7!>7!!#!-cZ28H7>A!3WP0&WPT. A!hEL@- `Y   L   I     bYD??+??39/_^]+_]]_]_]+10%##!!!!!xtOpp'gkg'>Ez!h:1@ PY    PYD??+??39/_^]+10%##!!!!!ttOZ{ZSS1:T VE I@-`YL I  _Y  ?3??+9/_^]+_]]_]_]+10!!!!!!#;pp'gg,>E%: .@  PY RY?+?39/_^]+?10!!#!!!SS-ZZ:T1:WE!/@bY bY bY?3?+9/9+?3+10!##!>32#"&'732654&#"^%T7emb* LOM( 5=sE&QPchTTzo7WWk:/@PYPY PY?3+?3?+9/9+10#"&'732654&#"###!632k\|*"Iu{1/+@M䭻`d@u}˨=O~HZ_r|:O 4W@5*_Y** * **_Y P #aY/ /_Y3 ?33+3?+/_^]]3+9/_^]+10654#""'#".5$32&#"3&54>32327.Kk7D`Wrg4_L/1f_y*CpalnrP.J[-I44&վ~pa/$flM)5:@,QY RY QY3##PY'?22+3?+?3+9/+10"'#"&54632&#"3.54>322674#">sSH]hߑVLp0EvMmcZdgh+v"&7X+1#4 5S##B#zl'3274&#"3267!"&'7=PX\IX`PP /,^?nk)ηiF]sed Uh-E !@  _Y `YD??+?+3103##!7!k|Oj,S,atah: # D@PYPY?+?+3?10!#!7!!3#%%zu|BE<W: @   ??3310!67!S)J;?8&SW:8‚uRWgfE!@_Y  ??39/33+3103!!!73!!-jj-55!?6 W:@ PY ?22+3?3?103!!?!!!!7!38)J`8'8&--:%7RhAE%@  `YD??+??3910%##! !!~OApU8Y6t~R-h:&D@   PY?+??39?10!#! !!3#1;/*1"tx/ bphD)@  `Y  D@ _Y?2+3??+310!#!!3#!#,֑~ODPt`Jh:)@  PY  D@ PY?2+3??+310!#!!3#!#o%@uPﭵ:B||thE+@aY `YD??+?39/3+310%### 47!327!O_UUWS 1hi't 0K`SC39f!^h:+@RY  PYD??+?39/3+3103267!3###"&547K1]p`ztOQ\{ U:~m8vo(.tE-@aY ??39///33+310!#7 47!367!_N]2i/SWS ,_ai`eC'0K`SD26ex:-@SY  ??39///33+3310367!!#7#"&547KCoB2o`QPT'o#6M{ U:~nY˴ vo(.!E@ aY ?3?9/9+10>32!654&#"!N^KYWS 2ghE#K`>C2:f!_EiK)Z$-5@(_Y@(( %_Y _Y ?+3?+9/3+3103267#"&547.546732"!654&Jg2Z `e# /-K3̹&Pz7 G8bHQq-ʯS_g> $K7:PmP?|3*@i)Z&/=@*_Y@** '_Y  @ aY?+33?+9/3+3103267#$47.546732"!654&Jg2G22 `e# /-K3̹&Pz7 G8bHQq-*nTag> $K7:PmP?+|3*@i4E,]& $$&+5+& ""&+5WCE!2@aY !!_Y??39/+9?+9/10)!267!#"&'%32654&+G&k@j1<-ͶٖIPͭmE{&HڹPc|T苜%Wa:!&@QY PY ?3+??39/3+10#"&'732654&+!!>7!췮}=GuWZ19J40VBRuG{yA:0'YM?hE)`YD@ `Y `Y?3+?+??+10# #"'73267!3##{fH0 :]pF׃[Qҁwth:+D@PYPY PY?+?3+?+?10!## #"&'73267!3#6yviy^'`%)7MhEr|uؚC  aUWEK@-  aY `Y\ I) ??39/]+]]_]_]+?+9/10!!!!!!"&'%3267"o'gkg'?>_9w)>EPc~(.W:*@ PY PY??39/]+?3+10!!!!!!"&'73267}ZSS1}=Ew"1:T&BRuG!hEL@- `Y   L   I      `YD??+??39/_^]+_]]_]_]+10%3##!!!!! ypp'gkg't>E"h:4D@PY  PY?+??39/_^]+?10!#!!!!!3#8yZ}ZSS1:TthE/D@aY`Y?3?+9/3+3?10# 47!327!##3UUWS 1hi'O| 0K`SC39f!h_h:,@RYDPY?+??39/3+310!#37#"&547!3267! Otz,\{ UK1]p`hV8vo(.~mhE")"D@  `Y?+??3339/3?10!#67#&=#!>7!3#S02 R:# [& OזdqȅGd|E '6GJth:$PYD@  ?3??333??+10!##!767!3##67d9G$ 4%A-3fn:JRJR] 7O&$ I &+53h&D 99&+5d&$j &+553Q&Dj @@&+555EN &(  &+5T&H ##&+5GZQWwNGp&Q F ))&+55Ww&j **&+55]p& F ++&+55+&j ))&+55p& F 11&+551`&j 00&+55 (E.@QY _Y _Y?+3?3+9/3+10!#"&'%32654!#7!2&{s;"UnE}]zw W:S& J!C &+5!f& J0 &+5p& F &+55!&j &+55Jp&2 F ##&+55L&Rj ""&+55JZK@._YL I _Y_Y?+?+9/_^]+_]]_]_]+10"&54$32 '2!"!74ghsae`{p6<OLN 0@PYPYPY?+?+9/_^]+10"&54$3 326?4&#"ٟ"4m(&RYk(ĸ`LeG΄He]Jp& F &+55L&j $$&+55p& F ""&+55B]&j ++&+55_f& &+5Wf&\ J! &+5_p& F &+55W&\j  &+55_& Hm &+55W&\  &+55tp& F &+55z&j &+55HhE @ _Y `YD??+?+10!3##,`PEtDh:  D@ PYPY?+?+?10!#!!3#29%t:Bp& F !!&+55&j ""&+55WE4@ bY @aY_Y?+?3+?9/3+3103!!!!3#"&'7326?##Tr-`E;'Zn""/q(07ET mI0  B;Z3W:6@PYPY@ PY ?3+??+9/3+310!3#3#"&'732?##73%6%?T"$/q$07xS%[:  }mWAE"@ aY?3+??3910#"&'732654&/! !!Uɫ6w)7/RD&TipU8Y6=M  :=)u~RW: @RY ??39?3+10 ! !!#"'732654'H/41C,άaQ)7/T;0x/ b|< ;D9`AE%@ bY ?3?39/33+3310!!!!!!!! 8Y6A(%p@Ru:%@ SY ?3?39/33+3310!!!!!!!!/41r 'ϺbZ7xE @_Y  _Y ??+9/+1046$;!!"&%;# e'.Hat ĚsMGE '-@#aY#bY   bY ?+?99//9+?+10326?#"#"&5!33323#".ZDp']oP|Mtw La=_1JI0ͪT`1J{ȰfH{]:j}*=E-4@RY  #PY *PY?+?+9/99??+10%#"&54632333273#".4&#"32>po˃[qo8]1.-/âUg9/;D@uD2,BQ߳heZ?n7\+Q]ddU]GY*3@%_YaYaY?+?+399//+910%23#".54&+732654&#"'>32&_1JI0ͪcc*AV/,!Up5*Ef6O標J@}SC.-0q}:']ױRa`-}ns okS!3273#"&547Wizel`$T%),<@W{8]1.-/Ģy|H  8n7\UwEK@.`YL I  aY ?+??399//_^]+_]]_]_]+10323#"&54?##333=_1JI0Шzpgg)j}聇Z~vE{]:0@PY   RY?+??399//_^]+1033326?3!"&547##SS{?2O.-^|Z:T\9ly$M1:TZ*KlN#~E"@_Y  aY ?+?9/+31032!!"&547!7! g1JI]Z,,a_E4}$HZV:%@  RYPY?+3?+9/10!#326?!#"&547#{%V?@Yi.-0ƷU:DX-B:r瓠K^$YRNNWE%@`Y`Y `Y?3+?+?3+10# #"'73267!#"&'73267{fH0 :]pF&%k&-A;GQҁwŭ LPW:%@RYPY PY?3+?+?3+10 #"&'73267!#"&'73267xviy^'`%)7MhEr*%k&(D?3qg !%23 d SKgmL .6/1V\ ^^m!yN #(@ @ H!\?3+]q223104632#"&74632#"&4632#"&y. ".." .. ".." .- ".0 -o -- ".." -- "..".."".0sN \?10#7'7'7vVVVVVVVVVVN "@ @ H\?3+]q2104632#"&4632#"&- "0/# -'-#!./ #-m"--" .. 00 "..RN (@ @ H\?3+]q2104632#"&4632#"&3R." 00 ".'. !/." .HnGm"--" .. 0/!"...nDm /]103"&547^YRGOjun, X \?10'7wPT! @    \?]99//3310"&5463232654'7#"&'."2+'RgM.B*/ 3+)RhH1G(!(99-)HWNn1N7120*H WNl4K>*N \?]10654H;]YN!ENmxm%'5/10#'73TՐ#  /39/104632#"&%#72675. !/." .q˜f^ 0/!"...ji\bN\?]10>3"bʛgNmh\bN\?]10>3"bʛgNmh\N@    \?3]210>3"!>3"ʛgI̛eNmh\md`1;D)+7!@//))55 P##/]333]223104632#"''7&732654&#"'#"&546324&#"326~YW~YH5{Bwv8)(8:&':%'#j5/10#'73Vא/]10#7267ɞfRji\m7@  /2]22310#7267!#7267˜fɞfRjh]ji\3 @/]10?'%Z)3P3LN \?]10654H;]YN!ENmxm%'F; )@ /  P/]3]210'#"&546324&#"326%;b@")[|~YWw:&':8)(8RB9HTL ~YY~~Y(89'(88%!@@P` /3]]9/3310#7&5473326?3fle"(.3 ff\\mb#)051N \?10#'73ِNbN\?3]10!737=)jDm /]103"&547^YRGOjun, PT! @    \?]99//3310"&5463232654'7#"&'."2+'RgM.B*/ 3+)RhH1G(!(99-)HWNn1N7120*H WNl4K>*`{) / /3]2104632#"&732654&#"`~YY~|[[|w8()8:'&:RY~~YY~~Y(88((88u; @ @ /3]q2104632#"&4632#"&/! // 0'0 !./ ".b!/." ..".0 ".. #/;'@39!@!!!- ' /333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&. ".." .. ".." .. ".0 .q. ".." .)0 0/!".` .. ".." .. "..".."".0".." ..".0 0.@@ /3]q29/3107!74632#"&4632#"&HC."".0 ".'. !/." .mm@".0 .. 0/!"..!@@ /3]q29/33107#7!#74632#"&4632#"&'nHk."".0 ".'. !/." .rmmr".0 .. 0/!"..{B  /3104632#"&{/!".0 0!/0 ..D  /333104632#"&74632#"&0 0/!".- !/." -".0 0." 0/!"..) #@!@!!! /333]q2104632#"&74632#"&4632#"&)."".0 0. ".0 .0 // ".b".0 0/!".."".0 .. ".0/ /]210!!DG}j/ H/33+107#7!#oGkujjuwF  ]?3104632#"&0 0/!". 00 00wF  ]?3104632#"&0 0/!". 00 00 #@ @!!! /3]29/3104632#"&4632#"&4632#"&- #--# -0 0/!".-""./!"-`".." ..I 00 00H 00 "..7q  /3104632#"&70 00 0#--# --/31073-o-y#L/310!!<)LyG//]]310!!Hj``//10 3`ך)` wAw /  /]3104632#"&0 0/!". 00 00wF  ]?3104632#"&0 0/!". 00 00m`=X?2210!! !m;!<;!91 1  /3104632#"&/ 00 /f10 "--oj  /3104632#"&o/ ".0 /".0 ..#"A ^YW ^Y X?+?+103#"!!>Z/FP4Z-O$w1q6[b/33]10##7#7! 4 "@ WX?3?2993310!>?!!!>7;5N,= ARw~#6E|:TbU.dikZ&F%^YW ^Y X?+3?+107!23!7!654&#/T^--VqO[#X%dZP# X^YW?+?39/3102!!7>?.+7L8 F?7[LDgnT5D/D.[I] |3X^YW?+3?10)!7!#o`/H/! X ^Y W?+?39/10)!!654&#!7!2 y y/ :*bPQaywWX??10!!h'V @   WX??39/39910'!>7%4dRHssqj1#&fUXl*sX^YW?+?3104&+!!2!6v| %kW٪SW1CH!' A ^YYW^YV?+??+10"&547!32>54&#"7632VefPH;>Tm/kqY`%G8WIFMVUQ98NtFwW?]10!!hmV[ ^Y W?+?10!654&#!7!2m u`/R8,_SQa)d"A ^YW ^YX?+?+10! )7!2>54&#!Zw-=on:`KFL}|y!A ZT^YW?+??3104#!!! 6$6Tr7J`XߍE"C" A ^YW ^YX?+?+10)!2!654&#JX p٪N\ C4e[5W^YV^YX?+3?+?93102!7!654&#"!67!6^#y-LG%59;JKl?OH+9ߕrpEH7.kٓt-wW[??10!!h" A ^Y W^YX?+?+10)7!654&+732DM-ZJZ/ęi9K>ZwV#'A ^YW ^Y Y?+?+310#7!2#"&54>%32>54&#'0;:_ߜ(9J)D2bjZrKDNXP蕁&88md@A5j\  " _Y ZW?3?+9910!6!$%D]N3^e `'^Y[^YW?+?9/+10 !654&+3!u;/1٣Ec%K2i] 4^Y A ^Y W^YX?+?+9/+104&+3!!2)7! 6z3//#=`-ZFmjVd#`YW[??39/+310!654.!>?!?w58;5_l+DPCR-4iu{e " .# W^YX?+?39310)7!!>?!-CDS'DB6w龼=u' [^YW?+?9/9/310!!2>54&#!)7ypdw{߉jP0 sI@VX ^Y W?+?10)654&#!7!2 u`/8,_SQamB&  ^YXW?33?+9310>?32>73!3@D7&8Z%Y{kT ԇ8K3 @^V?* ^YX^YW?+3?+310#7!2!654&++732671/ oad%iC-MYPb3=/\VXon' ' F'  T?10#!{T?3210#!#!ʹZ{{X: @ SY   ?3?399//+10)'!!! X-&y[N:N:@@%RY SY    SY SY?+??+399//_^]++10!#!!!!!!#4ʌ]'',+(/v(N  :oN,7@S@,=,=QY44&( ,,( (8QY( $$QY$0QY QY ?+3?+?+3?+9/993/+3105674&#"'32>32327#"'#"47%4&#"7>2>7!57m$8q6q?vS?1:&;@ " SY    PY #PY?+?+9/_^]33+3310##!#73!23%4&+3264&+326XWt'tTAKMT0pa:@  SY PY?2+?+10"&=%327#7!2<%d'# !MF#D:: #@ @  SY?+?9/910)?!%!:N,Y@,>OP:@  ?3?3?33310!##!67!#67n>zj%Q8cz3uf:0nM|t]%:  ?33?3310!!>7!^%'Vk * :u&1:LNR]tN'> FY FY?+?+102#"&5 !2654h[C>ԡ:YЗ&)* GY GYFY/+/+3/+104$32>54! .&/u׆)lt[RTDĘ|]AZ ("% FY FY?+?+9910"&547'7632'"65427g$SO_$X\J~l[_Fn qvz_eqiP QN)1=@!!**PY-QY  'PY PY ?+3?+?39/99++310654&#"'32632#"'#"4732>54#"27!513A{߷-vsqԎ.w$fHn5Tsp7 'VR@SUBA-8oʉ8P2C9G: .(@((QY !PY?+?39/+9910"&546?.547!3267!'2>54&#"崌GS YUaeXf]Ei^_~CeZ%%1)NY{r%k}MVX]KU]cEN@  PY?+_^]210!2!654&# E4[GxG)KUVAQ6@  @ PY ?+_^]2103267!!"&547lL}x&&6T@REL#: @ QY QY??+9/+10!!2!'!2654&+NgzXYn:ϯiZ?H: &@QY QY  ?3?+9/+310 !.54$)!#";LQf U]MveصwC: $@  QY QY?+?39/+310!!"&5467!#";5Uܠ3skM`Sy:@ PY?+3?10!!!!x%ѭ:|j}:v, $GY GY /3/+3//+10!2654&#!!267##! _|7HWo-4QDroXk [,  7@  GY  GY /+33/+99//3310!2654&#!!267##!3#3#T3|7Xo,4}**DroXk [m.'Q''G@YO_ G@Y   GY /+33/_^]+9/_^]+310!2654&#!!267##!!2654&'!e_6HXo-4+Q6_|_\K^ S U_\J[:YY+:Z!m:]W]<3SY@H@PY?2+?9/+3+310"&'732654&+7%!7!Ӳ ]Ejxb]a(5$t,NVl_K7κ~h|k4O$5@   RY PY$"PY?+3?+39/+9910#"&546?2>54#"'>32"3278v?686y e DBhx eJYhdN)$@ !  RY&#?333+3?910%#"'7326?'&54>32327#"&'%5?YpjLV3H EUNzވ'9B'72YeZ"AMUGG.#K|mkd;dSCK#.GGUMm:PY??+10!!m%::m:M-":@ PY?3?+10!!!}:|:O:7,,:!@ PY  ??339/3+310>7!!.547!!TY847%??73H[m.n ^CLbc:L?2:@PY PY ??3+?+10!# #"&'73267!viy^'`%)7MhEr|uؚC  aUl ,.?3?39/310'!#3!'K& ( .H"X?;w5@ h   ,. .?2??3399//]]33107!#!!!!!#30ΤE#/M1*\H[ (@ h.,?2?39/]]3910!2#!32654&+32654&+txdac!7veXQ̀ߍo\iymfxvQQAJ>-SGS@C%0@  h.%,?3?39/]]33333103!23##!#4&#!32632654&+`KD`+!QaOK5ߍowveXQ;ymhB9J>AGpAJ>-d  , .?3?3102#!32654&+w,ǎxϪٶ $@ h, .?2?39/]]310!!!!!պ/1E &@h ,.?3?39/]]310!7!7!7!!7)/1 -/?2?339/310"&5!2.#"32?#7!:$qVvj Gb H7OX}DoFB &@h ,.?3?39/]]310!#3!3(PWQȺJJ»Vu{,.??103Ⱥ*7 ,/?22?310 73267#7!_0 m4?a )GZI  ,.?3?3910#33 tEƹX=W>N ,.?2?103! țq , ..?3?3?3331067# #!7!u/N? w <>+ og|jAYÊd A ,,..?2??3?10#3>3 }sVAO A . ,,.?2??3?1033#7l)1Ẳn'J /-?2?3102#"&54$"32>54&pXznlX}ݻߘ¥gwg|"#.&@ **$/! ,?32?39/399103254'7#"&546?&5463"2654&#"OF`@Qwr|J<;ajLS\q26fvh?`T}b=tt~;`SGAbOm   , .??39/3102#!#32654&+ ҮCȺniiUS˝Q]GM  ,.?3?39/3310##!22654&+aFȺz_iWN7xᗅwePOAFC,.??3310#!7!Aɜ4*@, /?3?3102673#"&54>3pouru&Ƶ eh d~idȼW:?IO ,, .?333?3?310#'#37373P<J[<uL~>'2')1&#//?33/22?339/9310"&57##"&546?654#"'>32327#3267ZEI6qR]tV?? 06 (nQ[6-8^;0.YHu^FZ13fjfjZ3.mi?<36ZK:(3'*/01'$0?22?3?339/931023>323267#"&54?4&#"763>54&#"EI:pO]tV?? 0 (nQ[<'8^;0.]Du^FZ13fjfjZ3m?<72ZK$'  A .0 1/?3?3??9910#"&546323673#47'2>54&#"5nPjyXn( "O  K^5@@CY/[E:w2KSC`89 \UUL]Ri*5=:@ 66+#% ** :%/!/21 1?33?3?3?39/9933310654&#"'>32>32!#3267#"'#"&54732654&#"3267V@>d,1~B0r]tV?@ B`mMW4'8\C7BZ&JPw4m[OLu^:"Z40giPPGQA:81YL'LEbV$)3 ./1?2?3?993?102#"'##>3#36"32>54&,ovVv0LTLLa2L=EN31s N/ MnaIORXGKKW#'  A .3 1/?3?3??9910#"&54632373#47'2>54&#"7nMkyVp(9 J`5@@CZ/[H8vr'VM3>\NUL^O6 $@ @ H 1 /?33?39/+310327#"&54>32'754&#"?>e,2|cuC7CY:&JPw4pXtAWLEcU>  / 1?33?39/310654&#"'>32#"&5473267*?>e,2|cuC7BZ&JPw4pXsAWLEbVS&$@ 1/?33?339/391027#"&546?.54632&#"3"{elWIcxsh;F^+-^7Bhcn`55bcjF9zbYg X7aoER;T.-04{4/*5A$! 1/?22?339/3910"&'732654#72654&#"'6!2jp;Btd:0k7{8^7NPqis75i|89)(efQ8X5YBl,"/)0 &1,.4?22?3?399?10%"&'7326?##"&546323>734&#"32>oLR7rHj}VsPu { oM:HO-u=c6`hZUgzT?rzOD*3kwPN_D_@04.??3?10#7#ga.W 03.?3??910#33`9Ŀq<^532>32#6=&>[QT U?\Pq5eETb ;qE^d [S _m\T?!Un]VXS=TP^FhaEB U"# 10.4?22???3910%"'7267654#"#733>32:7'/* YhEtPq6{Mgigz 3?N'ZtSUXpMCga5?el  1/?3?310#"&54324#"32>ŒġǎO]1PZ3陋XLY; /1?33?3310"'6!2#"&'732676549HGc iGS"jJH#|}vdZ#h  1?3210654#"#>32IWaꭡh.'mm)ԛ<(%g /?3210#"&5473326?ꮔY]gئ#4,#mm, %$!04 /1?3?399??10"32>54%>32#"'##673Ka3L=HP,/pRovTv. A i`JOR`KDAs5wlDU 0/?22?33310"&547#73733#327Q` Edn]x!F;05OP87s&B ,, 0/.??3?391032673#7##"&547NP hEtPq6{MgiV\O [tSLDha4? @  .?333223103254&'%53'#".%RXnSdCr+~JAc^@CSkHwTu7~Rjm [q*$$0 /.??332?339910267332673#7##"&'#"&5463>[QT U?\Pq 5eETb ;qE^d [S pm\@?!Un]e>S=TP^FhaEFB Ua[  0.?3?310#3?3w0'V7\2!( 1@  /?33333?910#"'7326?.54632327#"v:xEdMG69#(/:5yb{C;E]g~PQ33!4S{5|u`Q[4:33&,4@ !!""  /3?2?3339/39?102#"'##"32654ᷦ&}mZR[{[ 5~}-#d#X%YfgY7fhzRBH i`FU1>]X 40?2?9103673#67]5 2l^52Lj7Mj+F "@  3/?3?3393102654&''#"&5%'7!m]n+2f_9Q hG8弓:gzFr:(SxYW[aNҩ=hpV!&1 /41?2??333?3102#.5467">54fm65}Ⱥ Ul@=G5(1Fx|~ˆSay{JY ±]"  501?22??39102?3##'.#"76$7-', .p,1+$75cS/MIiH zx&!xftjswxrzYL|Ls}m{'"C@??39/3310#"&'32#.#"&546322654#"߳M|.p{OZ)89~؋_dudsPZ<0YS##KSݦ1OKUM~-MN&.A@#)QY))'PY RY$!PY?+3?+?3?+9/99+10"'#"&5473323632!3267"!654& 3f~vP6vb$(523A{17 (ISe;}_L`oN@UWBA-N3C:#.:Z@ +' '1PY'H@Y  @ H@Y  7PY ???+9/+_^]+?+99103>7'"#>37!2673+'3>32#"&'#3254&#"# $1|$}]# $0z?_F 0:pi #gHMOR"{O,CyL+Cdh<[de_1v +qg|M1=V-#H@Y-- - -@'H@Y!4PY:PY??+?+99?9/+_^]+10!547##"&546323?/"#>37!32673+'4#"32>Jjj !$1|$}]$ #2z?_F KHMUBfkYƺZa^,CyM+Cdh<rMtd~r.V@#(PY%#PY H@Y    @H@ Y,??39/+_^]++3?3+1032673+'#!'"#>3!7!7>32&#"!L ,/z?_F CX$2|>^D7%"ʠ$bn %|x:4dh<-Blb:SRd9N-7Ay@D5QY.:/88 "/+/QY,( ++p++ + @ QY%  ?QY*?33??+9/_^]99+3_^]399+3399?+10!&'##>77336323>32673#'7654&#"654&#"Y?_[ oaB; dXD=TWQ * n_AFIPr1U>Yf+S0j-sHg__jZ[c'h!0hz&`P'is>0(n 4/).O&1T@,'*%QY%# % %@QY/RY?3??+9/9+_^]99+9910!&'&'!"#>77!3>32>737654#"B[e|32#"&'#2673+'!7'"#>3>73254&#"@ll $ ,/z?_F %$2|>^DKHLT:Bf^gȹd[:4dh<Q-Blb:O{"R!seN,PH@Y  @H@Y &*,**RY*"???+39/9+_^]+10&#"32673+'#!'"#>3765'!3>32ukf1 ,/z?_F CX$2|>^DG‹jaPū:4dh<-Blb:]|ckH1uN"NH@Y   @H@YRY??3+9/+_^]+9910#'!'"#>3!2&# 2673 >S$2|>^D:O&[.Q< ,/z?_=-Blb:S:4dh<O5?@ /441 ,)&PY" PY?3+?3+9/999333310#"&'732654&'.'"#67&54$3254&#"273+ ^~vQ^239&TbrnJPl5B"etӌ%N?FH,56!-G/#ϖ?>3#733!!32673+/327#"&5465$2|>^D8%7%L,/z?_F IM{$'KOW3-Blb:y:4dh</1/ szD!m:"_@ SY H@Y   @ H@Y  SY?+3?9/+_^]99+99+31037&#"#>327!7!32673#"'!!'D*$2|?_D?t'Q':!#2z$}]Fh(; -Bhe;!+Cy(QYN ,6@  )PY #PYQY?2+?+9/+99102.#"3632#"&'#!76$3254&#"ӸOA9$ꖏk"7,-OIOON!ALǾeZ|p^u 7  /229/310!#3!3<<7,73W:).@ QY'PY SY?+3?+9/9+10.54?!7!#"&54$4&#"326E(&,'rӻqmpPplG%0)ö5׽swpilq:N@,6932$!741)*)PY,@*#PY RY?+?39?+3?+3?910>32#654#"#3267#"'#7547#73733#33@T]cvaIqqxB!TUH$;t |a%kp}1%O7unb{q|uO`R^W9fT"-Q/5~iXIuO: @ SY ??9/3+3103!3#!#vySS{'{XXyX9O:WO!(/@@!!%SY, "PY)PY?+?+9/9933+33??103>323##"&'#!#73>72!"!74@lS(S?l e稀(.?PlQQ&:v^g*.d[JaSrq 2irz=:*@ SY RY?+?39/33+3310##"&547#73!!!32![!`'`PPPP[h6m ֥p;Qgg) 3+:"*8@SY' SY! #PY?+?39/33+33+33310##"&547#7367#7!!54&'7!#3267!N P'oL('Ue3C'(qmMc$$Yj.5ˍh7sP Ds9h3|0W{#W%14@" (PYRY .PY ???+?3+?+9103>7!3>32#"'732?"&'#3254&#"#M%:pbW."KS)7/ 9i #gHMOR"{Ov[do }De_1v +qg|MW#/;@ !RY &PY ,PY QY?+?+?+99??+3102?#547##"&5463237!3#"'74#"32>Jjj Mq2"KS)7ǜKHMU}TBfkYƺZa^ td~\W"5@PYPY QY RY?3+?+?3+3?3+103#"'732?#!7!7>32&#"!ҋk2"LS)07%"ʡ$cm %|8 }T|SSc9NK0<O@)-RY 3PY(#RY((9PYQY?+/+99//+?+9/99+?10"&5%327## 46323>73!#"'732>7#4#"32>$E;9$@`ڊ`{ 6h/=&+ )U-뿈wE@IJN!AL i^]Zd[/t Ę 8%ilZxDW.@RY   QY?+???9?+3102?#!!!3#"'79‰O .2p2"KS)7}TTjZ  W@ RY PY?+??+3102?#!3#"'7R!{6"AS)0}T첪 jN>=@ 4&QY4+0RY-+D@ :QY  ?3??3+399?3+?+10!654&#"#>533>323>323#"'732?#654&#"2`q  9yLXD=TWQiK.$LS)07 N3Zus>0(S"KC00jY__jZ[cLs }As>0(&W|O)2@'%%RY% RY QY?+???+9?+3102?#654&#"!67!3>323#"'7ax@Efq!  PwcC2"KS)7}TkI5NEHL6{qBO WO&35@&# *PYRY0PY?+?3+?+9??103>32#"'732?#"&'#!673254&#"@ldU,"LS)07 l eSIKHOT:v^gؽj䱫 }Dd[JMfvsyxWN"/@" RY QY RY ?3+?+??+3910&#"3#"'732?#65'!3>32uke&2v2"LS)07KiaP }T|]kH1rDWkO62@)1 &PY" PY RY?2+?3+?3+910"'732?#"&'732654&'.54$3254&#"RAS)07q ^~vO`͍LTbrnGSxO'L"W }c#%N?FH+5,DkM͘?>7>32&#"!#"'7326?#&*Z)4G/>('Y>*$OHUE"H(%5+8 'W&JUfǶ]f >6rɴW:$@QY RY?3+?+3?310%3#"'732?!!67!2"AS)07)X;?R& }T:8‚uqW:-@RY  QY?+??39?+3102?#! !!3#"'7D/41̅2"@S)7}Tx/ b !Wm:,@ SY   SY RY?2+?+3?+310"'732?!7!7!!7@S)7/D''Q'Fh7"W }T\汫4WN6AF@&7QY4//QY/'))$RY) QY>PY?+?+?+3?+99//9+10"&546?654&#"%!2327327#"&54?.57#3267J8=GTsɘ M "# 1n/<)YL C+V+ka0`b|i">?HQAs08x2!*#V su4@HV6*qd *\Olq!WN(5;@ ""RY" ,PY 2PYQY?+?+?+99??+310!547##"&54632367!3327#"&54?4&#"32>q ,wp3n/<)YL R^TSXW ?f[_`[PHV su4@Mpqtg|!W,99@SY 0PY 6PY *'RY?+3?+?+99?3+10"&54?##"&546323?>32.#"3274&#"32> 1q )ʝaQ'H4Ln/<)yR^TSXWWrv4@[_`Jڈ)YB o;aH8op?8agV su4@a(& Pp+WN8M@*/11,RY1QY QY 7&#PY?+33?3+9/_^]+9?+310"&546?.54$3254&#"3"3267327#"&54?hdkciz#ϫd]` Hn/<)YA r} mN  ?DNFA>V]8DYK,V su4@a(W~N6K@)/QY%))"QY) RY PY?22+?+3?+39/_^]+910"'327#"&547732654𑯎&#"'6$32am/<)YA Gu`q"Ʀ\Uh5ӹؙk)}X su4@m,JZ^JG@RT49KErm yYl['WxN)1<@ -QY*QY RY%#PY?+3?+3?+9/93+1023327#"&547!"&547!654#"%>2!ZΟ  )))99ym?㧮 Qd?@J<'N؞=HY&" `j>TB}b<muDO6*>hqW(@S[QY RY ?+3?+??+10%3327#"&54?#!'7!k3m.>)YB ((V su4@M:WqN(0@ ""RY"PY  PY?+3?3+3?+3103254#"%6$32#"'327#"&547wIXP 71ڟ~`n/<)YA QcI^ ed ª9V su4@eW$,@$SY$$RYRY?+3?3+9/+103267#"&54?32>7>32&#"MfN)Y4 &5F/>('Y>)&MHU$Rsu4@&JU0ɴ]fε*Wd:+0@"% +%RY% QYRY?+3?+?+?39103267!3327#"&54?#>7##"&547vqMq4*+)9:ym Og:V8D{&" `j>TM%x:{pCMW:,M@+SY PY/  $&&!QY&SY?+3?+399//_^]+3+3310%32654.+7!7!#"'327#"&547?gW;tf%q'%_r E;.>!YA ;R\vt9@}wP@,0 su4@/$'0 . /1?3?3?99?10>32#"'##7673"32>54<5nPjyWn& "O  J^6@@CY/tE:w2KC`89 [TUL]R/1/?33?3310267#"&54>32&#"q9H'a iGS"dJH#y}~vdZ((@ &/ 1?33?39/931067&54>3 .#"632#"'%4&#"326,C du92-b{ϔ۷+Z@c^rJ@Z{HY%'M|&裌`ZN~zGW32&#"3vvkkw;.*.) _uOl` .-<W!@  50??339/3331033##"'73267#7VHHll6|k4B5,2Plic .-"/)0 &1,.5?22?3?399?10%"&'7326?##"&546323>734&#"32> oLR7rHj}VsPu { oM:HO-u=c6`hZUgzT?rzOD*3kwPN_D_PP 3.??39/93107##"&546332673C6{Mgi\PhEtP`>LDgaB]T![tT^ $ 3  .0??9/333?310333###73Y89gf??Y*րQ3;0.??103폿<0.??103Y   .0??9/33310333###Y89gf??Y*րQ'  A .305?2??3?33310%"&546;33#7326?#"]|FutjjO51 N=6#gS~j{u;@;)5)+p3 5?22?10%"&5473327Y] οJ&" pV 53.?3??33102?#33#"'7X sĿ_(s|+A WX;iqj w0.?3?10!3!et/H3/,)&4 10.?3?99?333?3310"#654#"#733>32>32#"&'73276=&>[QT U<]Pq5eETb ;qE^dblX$"W_ _m\T?!VjaVXS=TP^Fga(Lr X?#VY($"0 /4??332?339910267332673###"&'#"&5473s>[QT U?\PQ3eGTb :qF^dWS pm\@?!Un]P?SP]Fga'LFB UM!'!!10 4.??33??3910654#"#"&'7327>533>32PgEtZkU$"Xz  6{MgiVN'ZtSr X5/"7LMCga0D4)#"41 0.???39?33104#"#>533>32327#"&5476%gEtPq  6{Mgi hI!)]X] [ZtSUX*r [MCga < > MW$-J, 00.?33?3?10# #33bb  1 /?3?39/310#"&5432267!4#"!Œġ\S[kT^W陋 `c bc^m*3 1/5??333?333?10%.5433#2654'#"6225Oo~vvHC  QW4)/-*&1 5/?333?33?339910#"'327#"&5465373254.'.54632.#"³iHI$&F4X]2JM1Qu C932&#"qD*#1.4 J$419 A eqN$-@ !0/ .??3?39/93333310!33##467##"&547#73267!>877il- 6{Mgi__7Dt"ޅ] XLDha'r"tXO"[N//0$ /?3?33310#"#"&5467654&+73232654'&546;2M. 7mq1G*I3C,5,WN_mVLV&OeX~BxO/ =5-RU\6QXq+POHX:0 /?2?310 546332673ZWO29JJOS*>*!78]]+. 0/1?22?3?102# 546332654#"7>KW\sZS mYU&Yqf1J/"p_  .0?2?3103#&'#dw0B7*T  0.?23?33107!7!! &Fߏ#%. 40?33?33?3310!7!!327#"&547!7&F'J#&F.ZYIV#> ]S \[[,@  0 .?3333?339/3107!7!7!3>32+2654&#"1&FjTJ^bJ'0!E1Dߏ#q_Pmj#67(@  4 0?33?39/333/102654&+7%!7!# '78Rb`y8~ep|ѧ-FvcdYd  /3?2?39/3102#"&546267!"!654jv~nDWCX{z]m@!b?@U @[@ [ /2++31073?373~h\++++%r!9U @[@ [ /2++31073%7373 ++#,,!%vN,*/339910"&54>54.54>54#"7632fZ[$,$!)2)(048F/,#)# A$*$dN  0  WD /39/310#"#"&547332>;6>por?_e Z)`myC&7$hd/7R"("E/3210!%!; -Sc/3210!'7!f;_/3210!'!_e֘b/3210!'%!,3_.H@ /322210%'%g{w~J@ /322210''%7J-T\~w{W@  /3/33910733>32&#"6^ 5*$? WUN(-e99kS /10'7S OO:#W$ @  /9/3210?'7373# x/o~WOO:q!WdE&$3WQN&Dv &% ''&+5#&E )?5 E&%9#&E: E&% JY$?5#&E J8(?5SC&&'vzb &+5]C&F&vfzQ &+5&' &+5M&G+?5E&'9M&G;E&' J=?5M&G JG*?59E&'fM9&GpkE&' D?5Mk&G D2?5 +&(f &+55Tt&H'B J ++&+55 +&(f &+55T&H' J ++&+55 kE&( D?5TktN&H D+?5 fE&( G?5BftN&H G/?5 C&('z  &+5TC{&H&zz ##&+5>&)  &+5{4@SY @PY  PY ??3+9/3+3+10!!7!7>32&#"!7!%"ʡ#cm %((SSc9Tm&* J! !!&+5$N[&J J6 33&+5!&+ &+5&|m$@SY@ RY?+?39?+10>32!654&#"!!7!QwyEDhq4  ((b|pISRmR2HBEGj$<!E&+G&|&KV!p&+ F &+55&m#'@!! @ RY?+?39?22310>32!654&#"!!73!73QwyEDhq4  ++u++b|pISRmR2HBEGj$0CE&+zTC|&KzL!E&+ I?5&|&K I  ?5104E&,?5 7&L?54+&,a&+555 &&j CU;5@#?o  @   &+]q55]]q_]510W&. C &+5D @?3???910!!!! 7%!‰O.2+TjE5Zl+WE&.gD&NoWE&. JB ?5D&N JH ?5j%E&/l 7&O`jom&/' JTk &+5 om 5@ Y @PYSY@PY?+3+?++10%!!7!!7!!!7!a%%%;Td!((ɾ(j%E&/ JF?5 7&O J/ ?5jk%E&/ D?5 k7&O D?5&0 Cj  &+5&Pv 77&+5&0% &+5&P 55&+5E&0HN&PK&1 &+5&|&Q &+5E&1k&|O&QUE&1 J?5&|O&Q J&?5kE&1 D?5&k|O&Q D#?5J&2f@ $ $$&+q55L &R'i{ CfS@?::::%4D0Pp 0`GC &+_rq_qqr]]5]]q5J&2f@ $ $$&+q555L&R'M{ FZc@N555/5o55=5%0D0@Pp 0P`pGC &+_rq_qqr]]5]]q55J&2f ##&+55L&R' B J! ##&+55J&2f %%&+55L&R' Cv J2 ##&+55&3 C_ &+5W&Svm ++&+5&3 &+5W&S ))&+5 &5 &+5&U4 &+5 E&5pKN&U[ &5' J?Cp &+5M[&U' J^] &+5 E&5 JN?5N&U J?5&6 //&+5Dl&V 00&+5Z&69DlO&V9&6  33&+55D&V  44&+55&6 f 44&+55D&V'+ 11&+55&6'9 ,,&+5Dl&V&9 --&+5-&7  &+5H&W @  / ?  &+]q5-E&79HT&WW-E&7 J?5HT&W J^?5Ek-E&7 D?5kHT&W D%?5irE&8f\r:&Xg6fE&8 G"?5@f:&X G&?5ikE&8 D?5\k:&X D"?5i&8\ &+55\&X'O{ CtZY@F99_9999/99%4D0Pp 0`GC &+_rq_qqr]]5]q5i&8 \!!&+555\&X' Jj),/@ ""?"""""" @&+q5]q]5510h&9( &+5&Y &+5hE&99:&Y9ji&:C &+5Y+&ZC &+5ji&:v &+5Y+&Zv^ &+5ji&:j- &+55Y+&Zj &+55ji&: &+5Y+&Z &+5jiE&:9Y+:&Z9A&; &+5&[ &+5Ap&; F &+55&[j &+55f&<  &+5W&\ &+5&= D* &+5!m&] &+5E&=D!m:&]9E&= J ?5!m:&] J ?5&|&K J?5[&Wj@ $/$?$$&+]55Y+&Z &+55W &\ &+553Q)&D( BB&+5 q @ S[PY?2+?+?102&#"!>'7!$cm"'))OSc(SZ#3@_Y!QY aY?3+??39/+3+310!"'732654&+7&#"!>$32XyX;OzhyA#=e|&ٛ(ex~}JHR|dE&$93QN&D9d&$ &+53Q&Di GG&+5l&$ 2f &+553h&&D :f EE&+55d&$ 3f &+553_&&D ;f GG&+55 &$ 4f &&&+553)u&D <f ??&+55&$ 5f 11&+553&D =f YY&+55&$'9 D &+53Y&D&9 ::&+5| &$ 6f &+553&D >e 99&+55| &$ 7f &+553w&D ?e 99&+55| &$ 8f &+553{&D @f LL&+55 &$ 9f &+553&D Ac@ SgSwSS&+]55&$'9 I &+53{&D&9 99&+5 E&(9TtN&HM &( &+5Tt&H} 11&+5 &( &+5T&H ,,&+5 &( 2z &+55T|&&H :z //&+55 &( 3y &+55Tt&&H ;r 11&+55 &( 4z ##&+55T5u&H <r ))&+55 &( 5y ..&+55T&H =Z CC&+55 &(' D@u  &+5Tt&H&> $$&+54&,s &+5 7&i &+54E&,9 7&LWJZ&29LN&R9J&2 ,,&+5L&Ri ))&+5Jl&2 2f ((&+55Lh&&R :f ''&+55J&2 3f **&+55L&&R ;f ))&+55J &2 4f 33&+55L)u&R <f !!&+55J&2 5f >>&+55L&R =f ;;&+55J&2'9 D !!&+5L&R&9 &+5J&b C~ ((&+5La&cvj ))&+5J&b B ((&+5La&cC ))&+5J&b 33&+5La&cj 22&+5J&b ,,&+5La&c --&+5J&b(LaN&ciE&89\:&X/i&8s &&&+5\&Xi ((&+5g&q C &&&+5W&rvh ,,&+5g&q By &&&+5W&rCu ,,&+5g&qg 11&+5W&rI 55&+5g&q **&+5W&r 00&+5g&qW:&rf&<C  &+5W&\C &+5fE&<9W:&\f&<t &+5W&\f ''&+5f&< &+5W&\ ""&+5/50&bd ..&+5/50&bd 00&+5/50&bd ..&+55/50&bd 00&+55/50&bJd ..&+55/50&bJd 00&+55/5z&bd ..&+55/5z&bd 00&+55d&$Wd&$W d&$5d&$!d&$Id&$d&$d&$N0&f d ,,&+5N0&fd ..&+5N0&f$d ,,&+55N0&f$d ..&+55N0&fBd ,,&+55N0&f8d ..&+55&(E&(S&(;&(&(;&(*X0&h@d %%&+5*X0&h,d ''&+5*X0&hd %%&+55*X0&hd ''&+55*X0&h^d %%&+55*X0&h^d ''&+55*Xa&h,K %%&+55*Xa&h,K ''&+55&+E&+S&+;&+&+;&+&+.&+.;0&jd &+5;0&jd &+5;0&jd &+55;0&jd &+55;0&jd &+55;0&jd &+55xa&jK &+55xa&jK &+55&,S&,S&,;&,&,;&,&,.&,.L0&Rd  &+5L0&R!d ""&+5L0&Rd  &+55L0&Rd ""&+55L0&R2d  &+55L0&R1d ""&+55&2&2O&2w&2&2q&2qj}0&vd &+5j}0&vd !!&+5j}0&vd &+55j}0&vd !!&+55j0&vJd &+55j0&vJd !!&+55ja&vK &+55ja&vK !!&+55gf&<f&<'f&<;af&<0&z d 33&+50&zd 55&+50&z$d 33&+550&z$d 55&+550&z$d 33&+550&z$d 55&+55a&zK 33&+55a&zK 55&+55&Z&ZO&Zw&Z&Zq&Zq)&Zq)&Zq/5&b ..&+5/5&b8 ..&+5N&f ,,&+5N&f8, ,,&+5*X&h %%&+5*X&h8T %%&+5;&j &+5;&j8 &+5L&R  &+5L&R8"  &+5j}&v &+5j}&v8 &+5&z 33&+5&z86 33&+5/W50&b'd ..&+5/W50&b'd 00&+5/W50&b'd ..&+55/W50&b'd 00&+55/W50&b',d ..&+55/W50&b',d 00&+55/W5&b'i ..&+55/W5&b'i 00&+55Wd&$'WvWd&$'Wv Wd&$'5Wd&$'!Wd&$'vIWd&$'vWd&$'vWd&$'vWN&h', %%&+5WN&h', ''&+5W0&h'd %%&+55W0&h'd ''&+55W0&h'^d %%&+55W0&h'^d ''&+55W&h',i %%&+55W&h',i ''&+55W&+'EvW&+'SvW&+'v;W&+'vW&+'v;W&+'mW&+'.vW&+'.vW0&z' dv 33&+5W0&z'dv 55&+5W0&z'$dv 33&+55W0&z'$dv 55&+55W0&z'$dv 33&+55W0&z'$dv 55&+55Wa&z'Kv 33&+55Wa&z'Kv 55&+55W&Z'vW&Z'vOW&Z'vwW&Z'vW&Z'qvW&Z'qv)W&Z'qv)W&Z'qv/5&b ))&+5/5[&b J ,,&+5/W5&b'b ..&+5/W5N&b0/W5&b&8<0 ..&+5/5&b 22&+5/W5&b&0 22&+5&$ I &+5df&$" &+5d&$:d&$8uWdE&$vT, ?310#>7#7>@:L j%̌P|H9h?TWT ?3310327#"&54?3% $,7?D <5iT, /210#>7#7>@:L j%̌P|H9h?sg  /3210".#"#>3232673j(ID=$2|>^D)KD<,/z?_#)#-Blb:"*":4dh< @   /3323310".#"#>323267373!73(JC>$1|$}])KC<#2z?_++u++ #)#,Cy"*"+Cdh<W&h' %%&+5WN&hW&h&8T %%&+5*X&h ))&+5W&h&  ))&+5&()&(8\&+)&+8\!WE&+vj,  @ ?310#>7#77!>@:L j%ܥ ̌P|H9h? %!j,< @ ?310#>7#77!>@:L j%~̌P|H9h?!$%, $@    ?33210#>7#7%".#"#>3232673>@:M j% (ID=$2|>^D)KD<,/z?_̌P|H9h?B#)#-Blb:"*":4dh<J&j &+5;[&j J &+5;C&j&j/%@/_ &+]q55]510;C&j&j8/#@/_ &+]q55]5K&j &+5&j22&+5554&,  &+54f&, &+5&,)&,8\, @?310##.54677!%j@"ܥ Lc6H1+ %!,< @?310##.54677!%j@"~Lc6H1+!$%, &@ "  ?33210##&5467%".#"#>3232673%j@-" (ID=$2|>^D)KD<,/z?_GhZV+B#)#-Blb:"*":4dh<j}&v &+5j}[&v J &+5j}C&v&j/@"/"_""&+55]510j}C&v&j8/@"/"_""&+55]5WuN&r+ ##&+5WuN&r/ %%&+5j&v ##&+5j&v::&+555f&< I  &+5ff&<"  &+5Tf&<f&<8*&3SX @  [ /]2+3107!?3!73w t++^++ %!X @  [ /]2+3107!%73!73~++^++!$%]e [/+107!>%!W&z'v 33&+5WO&zvW&z&87v 33&+5&z 77&+5W&z&v 77&+5 &24&28&Z&Z8WZ&ZvT /107!T~!$%n,z ?310##.5467z%j@"Lc6H1+*//3310#*T F@"    //39///3333323333310#'7'77'*T7777Y7887 0@   //99//3322339910'7##!'77RJ77}m}8L( ,@    //99//3322339910##'7!(R77J}78} Y/+107!'s':m Y/+107!((m Y/+107!"((m Y/+107!"((?WP@ Y@Y/++107!7!````^ [?+10 !n^ [?+10 !!EQ^n [/+10!"EPn'^ [?+10!E1^n^@ [?2+310 !!!.nn^@ [?3+310 !!!!EQ~!EQ^nn [/3+310 !!!"EP~"EPnn^L'+ @Y [/?+3+310#7!%(P-e](kxZ-3@ Y[ Y[?+3+3/+3+31073%% %%#7V(N5Uo(](m'5U'P\ddVW /10"&54>32FjhVjge[^fXbm1 @ [/22+3310!!!!!!0;;P;;P;;111//333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332233310###!!!TuO .@    /3/9/3333333310!!5!###uTON*7DQm8HY?8@ [?NY?.Y%@![ %%4Y% Y [Y?+++/+99//_^]^]33++/+++10#32#"54>4&#"32>2#"54>4&#"32>%2#"54>4&#"32>΢7)OqFF)4"=%7!D)OqFF)4"=%7!ط)OqFF)4"=%7!WAw;\i*C0TKǼAw;\i*C0TKAw;\i*C0TK>L ZLL' {&  o] [/+10%73 JiGo%#*n [/+10%773*F #in%GME !@ @ [  ?3/3+3210#!!#!!&4 4s&4 4 BE>E /2?3103#3En ; S[ S@ [ S[S[?+?+99//++10!! !!X6 67 77 77 7N!pD@        /33/9/33333/3933333103#5!#3###TOON .@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG *@   //333332393310#'77'*TT~~~ݵqqp 0@      /3/9/33333333103#5!3###TONG(@ @ Y@ H/++3/222910654&#"#733>32K(->\Dc )kT[YT,-$`[!N8CIP"*Ojbiphjqkxr0kik!i@EbYbYbY  + {  P` bY?+/_^]]3]+99//_^]]3+3+10!"&54$32.#"3!!!!!JďNFI]Fu$n"i$&$zĽ4 WOm`iS%,=@##( )"%%_Y@ "_Y ?32+?392+9107&47%737367#7&'&'P25C$Cb]s`m'+D&6q 7$8W~Kovk}s{`733>32&#"67! 4$32.#"!"#2MqH2-:/4bKbT0>Ͼ ZMmcUj#p]eP{54XBju ES@1  cY0 @  0 @     @bY bY ?3?+9/+_^]]qq22+3310!!!!!#73!CB}(%:22(uоZ/a@9"cY& cY#   @vY++sYF//?3]+3?3+9/_^]]3^]2+3+310#!7>7#737#7376$32.#"!!!!!267?J(_L2  (ҥDB[f1RZ|h~#k0EdBp@΅/MFs})pC\G-c^<)1,@,QY0- /' ?33??39+310674&#"#>533>32332#654' #7V52`q  9yLSFWQ,x I0(S"KC00jYW[[cLs/{7M CE %(+M$ EY+E@Y% ')&?33?339/333]222+333+33310!3!3#3#!#!#737#73'#67#37#YQTYY!!PLPP!!KS  !W{66ggƒ+gKGwaE 3=TY@-MJO* TF>>?($CA?@@?9cY??8cY?3?+99//+333/33333?3399?3310##3 "&=7326?4'.5463254&#"4&+32>73733#327#"&57!)fGTy8F=)b?My($-]=k#>DL>W14PW[G.-54HOMrEszhVJ X'483M)Y|SC  (92#GX7n?B<8yG'kk1k =<(ED=@!2;PY72$PY  _Y_Y?3?+9/+3?3+?3+10!##!234&+326#"&5?3254&/3.5463274&#"W<2d%}{q M51-EIJLVȢs&5&IC="jp #@36$dME6A5{"0!=6(1 >Y?~v-"%5.MB!)*}iE &,/Q E@Y-*& / ($E@ Y  ?3?39/333+333332222+33107#73!3733!3#3##'###7!67#%#373'X!=|?!YL{! o!m< /:ڨwwڨn n>چT>>A5!=AWX`YW`YX?+?+??9/9/102#7654&+#332>73#7ȫ71`JruuIх)թٓcpFaS'!=Ro"V&1?57Z)[@4&cYcY( @#  uY  uYT ?3]]+?3_^]+9/3_^]2+3+310!3267#"&57#73?#736$32.#"!!!nd`ON`hS?3xM_,rxz=6QQ(r1@~sSEWE)@ _Y ?3?39/9933+3103!3!!!!!#Noh'h/W-ךQqo/-aDP.E`@2_Y_Y@   _Y @_Y@_Y  ??9/++99+9999+99+310%%!77%77%!7!k(i- j.7 .: -;>j-S-aσ냥rrrrB~6AO[E@"J*(.<3+.PR@%BD#X D7?3??9999?339/2210#"'#67>32#"'#"&5463275>7#>732654#"%324''&#"3267Ua6# ?ibTeldblbB\6@@3#"GJ0f,U=&/ F$<%- )PL=c}C6:-55 $+-+u0<ԓ{ooSNFaBWD:!9 U(#;vqrUenY& D-"7)0)LKW$1-@.bY(bY?+?3+??9102#"'732654''!7.5464&#"7>э*H ‚Z+OKKF qdc (!@@ AB;̃t:v;&Wj/D*,8lm6E$)k@E$_Y 0@P #  @%  )_Y?+?99//_^]33233333^]q+103!23#3#+!#737#)!>27!!&+{v4oXYtM]ٓvvv8e |J IT9{7ySy$ySS833x)T2#7@  _YaY @ `Y  ?33+3?39/++310#7$4$?3&'!6?)% OKl,.DxF77!7!654&#"%6$32 i!%[OI!AXQ >e[NI i<.9%ƵD&?L'1@?,S2.@`Y@`Y ?33+3?33+310$4$?3&'67# \vc%r.wwB.~)4&8z2  A=P 6:@Y:987dP ##Y/#O##?#_#o## #@H#*@*3Yk//_/ /*Y @0P` @ H@Y?++_^]q+?3_^]_]++_^]q+3_^]_]/3?310"&546324#"32>3267#"&5463274&#"#3TcgZw6dz>1K5?+O6D&3+]ij]rZ]0K7Ň z|0[YKwM{%RW }%} C*0uE )7@ &#QY P RY?+3//_^]]+9910%2673# 5467?>324#">vPj+U&FH&L"P܊'WtAUNjk10upQĨ,#!rc yE &*5@Y #Y(@'(cY'' ?3333/++?33?+10!#3>3 "546324#"32>7!AK~RWjgXU@.)=2,+;4=XzEth+~phǔ0Yw@Vpꜜ&".2@YY &Y ,Y/+?+9///++10#"$54$32#!2#4+326#"32  J3zPTDF?~opNc ?=JV@  0HY@HK[ ?3332]]+22]2+33+_^]310##5!>3#7#'#3;aGNYaXXaWW$2Z#%@_Y   _Y?3+33333?+10"!532$46326;!>54&fxWjt@nr@pjWwηn l 0n̈^H+@ c?2]]]?9/]10"&54>32!3267"!&r,}EzMgHlch!"/l|=qu>LNE'+37F@&,0 !Y6.Y0660*41+* Y?3+???39///+3+99310%#"&'732654&'.54632.#"# '##33w)@7$c5kx((:81MLC&Xvn UkG`|bc7+05'++O7rg_2(+0"$/F EG<E: @SYSY?+?9/+10)7!7!7!!'U,'-XE'&?5Q'&"?5E'&0@(((/(O(( o ]5]5]555?555 Q'&(@GGG/GPG(((]5]]555?555E'&(@>AA/APA]5]]555?555E'&6@$)))/)O)/?O_o  ]5]5]555?555]tNdD @ Y /+10#&'5673!9>HH>9)CI$ICVvV @ o/]299/105673&'#;CI$ICV9>HH>9#dD  @ Y /+10&'3#67!59>HH>9#CI$ICVvV @ `  /]299/10%67#&'53CI$ICV9>HH>9dD@  @ Y /+2210#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$ICvV!@ ` o/]299/]299105673&'67#&'5;CI$ICCI$IC9>HH>99>HH>9vHV8@ @@ Y o /]299/3/+_^]29910!!5673&'67#&'5v CI$ICCI$IChPX9>HH>99>HH>9Mq,*@#QYPY*PY?+?+39/3+10 #"&54>323654&#"7632.#"32q:s|Qrg%C4-qxNY\_V\˹va[JM2&IJayt\iE@`Y ?33?+333107!!%&/YV, 7cjx' Ih9cE`Y/2?+10!!!IF9 9E '@_Y _Y/+9?99+9105 5!! !^]79eVe9h Y?+105!e9>E [/+10!; ;1<T&@t ?22]/39/3]210##5!37P$0)@ .(/]3/2]22/9910#"&'#"&54632>32%"32654&.#"326aG8Ue=\H:S_:ff/^>:CC^:U23[Gpb\1Ѷui_2&esx`fsπZ}]ctl4Y//+103!!4^^0Y /2/+104>32#4&#"tтwgĠ9@ RY RY/2+?3+10"&'53254632&#"b+\B5ԾXC2EMP9e^k_m7,g@='Y @)!!Y!! ! @Y @ Y    /]]+_^]r+_^]+_^]r+10"&'&#"5632327"&'&#"5632327bKKYCvFn5|yOr?xTKK\GwAqSLfFr@u)/'1T0+\-#,-+-T. \,$[%r+U@0      Y Y `  /]3322+333_^]]3+333_^]]310#7#5!!5!33!!Ձ=PӃ#JtWP C Y Y@YoP/]]]+/+9/+105!5!5!t8d[] Y//+10 5![@wAZoq @ Y/33/+105 55!o@B; &@  YY/+/+_^]103 %! ww{@UrsW@ Y??/]/]+10#!`T>  //10#432#".#"Fe2#'+3+ I8'1$+$  //103#"&546323265Fe2#'+3+I8'1$+$+Y?+33105! +@ ??93103#"@ Y?+?39310!!#ؑn"@ Y?+?393105!# ++Y??+393103!!(G+"@ Y?+?393105!3 (+)@  Y??+?3933103!!#(ؑn'@  Y?+??3933105!3# (+*@ Y?+3?3393105!!# ؑ+n+*@ Y?+3?3393105!3! ((+ 5@    Y?3+3??339333105!3!!# ((ؑ+nwp.@  YY?+?+3333105!5! ߑjc @ ?2?39933103#3#jh p 9@  YY?+?+?3393310!!!!#(ؑpב"j -@   Y ?3?+33993310!###בnn#jp ;@    Y Y?+?3?+33993310!!#!!#jm$hpo"p 7@  YY?+?+?33933105!5!5!# (wב)c .@ Y?+3?339933105!### mב+ncp ;@  Y Y?3?+?+33993310#!5#!5!c$p)F)ޑw 7@    YY??+?+33933103!!!!((GǑבj+ *@    Y?2?3+39933103!!33ґt~jw ;@    YY?2?+?+339933103!!3!!jht_2Ǒw 7@   YY?+?+?33933105!5!5!3 ((wב9+c .@  Y?+3?33993310!5!333ctב+wc ;@   Y Y?+?3?+33993310!5!3!3!5!cܑtw6 >@   YY??+?+?339333103!!!!#((ؑǑב"j 1@    Y?2?+?3399333103!!#3#ґtn j G@  Y @ Y  ?2?3?+?+9933333310#3!!#3!!t _" Ǒ <@   YY?+?+??339333105!5!5!3# ((wב9c 1@  Y?+?3?3399333105!3#3# th+~c G@    Y@ Y ?2?3?+?+33993333103#3!5!#!5!ґt 6)ޑp @@   @ Y Y?+3??+333393105!!#5! ؑw"h 4@    Y?+33?3339933105!!### ב+nnp I@   Y Y ?2?3+3?+3333993310#!5!3!!#!5ޑ"בw @@   @ Y Y?+3??+333393105!3!5! ((ߑ9Ǒ+ 4@   Y?+33?3339933105!333! tבt+w I@    Y  Y ?2?3+3?+33339933103!!3!5!5!ґttǑ6V@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# ((((ؑwב9Ǒב"I@       @ Y ?2?3?33+333399333333103!!###!5!33ґtבtnn b@ Y @ Y ?2?3?3+3?3+3333399333333103!!#!5!3!!#3!5!ґtבtǑޑ" 6s/?3310!!3s6s?/3310!!3??3310!!3 g??3310!!gg f??3210!!g $g #'+/37;?CGKOSW[_cgkosw{@j&FVznn'GW{o6Nff7Og*>Z~rr+?[s ":Jbb #;Kccsgokw2Rjj3Skk/C_w.B^wvvgckhk@ Yd`h_[WTW@ Y\XTOKSPS@ YLHPC?GDG@ Y@n?o*Z+[BrCs.^/_@ JzK{۸ GwFv¸!@ ׸@Yԯ@Y@Y{x{@Y|xgkoswc`c@Ydhlpt`OSW[_KHK@YLPTX\H7;?CG303@Y48<@D0#'+/@Y $(, @ Y Y@Ԩx`H00H`x @ ظYA  Y ?3+3/3+39//////////3+33+33+33+33+33+33+33+33+33+3333333339333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#fggggggggggggffffffffffffeggggggggggggffffffffffffeggggggggggggffffffffffffggggggggggggffffffffffffffggggggggggggfffffffffffffffffffffffffegggggggggggg(bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````8EIMQUY]aeimquy}  !@kdx KkHh`{eyOoLl"\a|SsPp&X#] @ Tt* @'Y048<@DD!@ Ժо @Gg "@ .26:>B+ #@  $(,CҸƸYŸĸY@?Y   Y<; Yx{ wz~ g @Y8kosg7jnrff@YX\`dW[_cG@Y4KOSG3JNRFFYY0 @ gGGg  DӸǸY/Y"&*/3+3?+39//////////3+33+33+33+33+33+33+33+33+33+3233333333933333333333333333333333333333310!35#35#35#35#35#353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335#33535355#355#35#3#32fffffffffffgfgfgfgfgfggggggggggggggfgfgfgfffffffffgfgfgfgffgfgfgfg3gggffgfgfgfggfgfgfgffgfgfgfggfgfgfgfffffffffgggggggggfffgfgffggffggffffgg"a"a#`!b!b!```````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb``ba``````aab^^aa```b"bwuVT//3310!!w!T!YY/+/+10!!!7L17}1hd{/10!!dhd{Y@Y/++10!!!dLPbF"//3310!!C"$2//339107 XV2|4//3310 4ia//33910 a|//3310i9en_ 0@ K[k@ DTd?3]?3]9=/33310!# 3 h=h!!-*)0@  ! Y Y/+3/+9333104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbhVeR'/7?GOW_gowfbYJrvrYNvBz~zYF~2jnjY6nZ^ZY^RVRYV:>:Y> *.*@Y.v~n^V>..>V^n~v&f&"Y&?+/9///////3+33+33+33+33+33+33+3+10#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557 /102#"54>fnrotjlw%@  //3399103!32>54.#"%vwvvvwvu}Avvvuvvw%#*@ %$ //339933103!4>32#".'32>54.#"%QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwn^u Y @ Y /++10#".546324&#"326^aDpDegGJLfFFfbJM_}kArEgJGgFffFGei+7E|@& ,2?2 EGF>8 H88;;AY5)#)@Y/#;@ H;#;#  YY /++99//+3+3+3/+33333933104$32#"$732>54.#"74632#"&%4632#"&3267#".'?)**))**)h:}NP|9:pGsW.M **))**))N:;M1(DE'5b@"(".76@ Y%/5522,@Y2?2O2o2222 /99//]]+3/33+333933104$32#"$32654&#"32654&#"327'#"&'+)**))**).-WrIp::}NO}9M6))**))**DD)1N:;M'3_@($!!. 45+Y!$!Y1@ Yp $$/]33/]3++33/3+933333333310675373#'#5&''7&'#5367'32654&#"WgHfW3F E3WfHgW3E FxxvvE F3WfHgW3F E3WgHfWzvvv<F"b@ #$Y@ Y  Y/+_^]2+3/3+33933333331035.546323##5#32654&#"Xr{{rH,^_^[xp{{oH:^\]r!l@  "#@Y0 @/ Y/+3/_^]99]+9999399333993104632/!/#"&732654&#"{fQK7@{{H^_^[{@7Qf{{^\]ff!0@ "#  /?//9/]9339310#"&'3!5265#"&5467>5mic<% &;dcmVVfOl9+88+9lMmUUak*0@  +,/?//9/]9339310272#"&'3!5265#"&5463.54>fU|DC37c=% $?d73CD|=m@C$ql;)88);lr$C@m=ffh@   //9104&'54>323>32LwCr@YX@rClY6DўFr@cd@sEㅆw1H  //991053# U::f$@   /3/39933310>54&'#"&546323#)nZVE[S:*& yWM70&sAhDcD8AdDt{YfH3p<~@K  !  gT  'ywV?/]/3]9/3]]3]3]]]3]3]]]3]993333310%"&54632#"&54632%%5^E[S:*VE[S:*:,D8AdQDcD8AdCdPDcQxQ7/?9910##57573%3777```>`b?YY]]9mbbb7%E4@bY bY _Y??+9/32+3+3103!!!!!!!#737#A'Ak%$k&*h,qV&$KK+@PY PY ??9/32+3+3103!3#3#!#737#{[[}%}$}&}VV{&{${.C%E:@!QY  @ QY _Y?+?9/+_^]+103#"#>;!32673+!j)0"?bKX'p15'fIh,/Lg?B9E1@_Y bY    _Y ??+99//3+3+10+!#73!24&+3#326˗]ٞ(@sq($/KUIfpWE$2@"_Y""!_Y `Y??+3?+9/+310!#327#"&547!24&+3 j+/F-%x(y伬mxI&%/.  mx>Ry2IH4WR.49?X@..80=0QY,)$= = = $$QY$<QY711PY?+3?+3??+399//9993+3?10.5467%!3327#"&57##>74'76gmpBKs pI M "# *).jIR֣q Wk|n!5. +93'+2BD!hEO@)`YL I  `Y D ??3??+9/_^]+_]]_]_]+10!!!!!3###p'gkg'e~O>Et&h+@ PY DRY?+??+9??10>323##654&#"!!Qw`stOyEDhq O  b|pISmR2HBkGj$hWE'@  `Y D??3??+910!!!3##1Q't(W~Oc-aEWtDh'D@   PY?+???9?10!#!!!3#2;‰O .2otTjZ*hE %@ _Y  _YD??+3?+310#!7!7!!O)O-(ho!hm: ' D@SYSY?+3?+3?10)7!7!!#F''Q'Fhw\IZ'@   _Y aY??+?+99?10!7#"&54$3273%27&#"ʹBΩk11]1ucaQecNbYN@ RY  ?3??3+10.#"!!?>321&%7$D$W`Eqxx;&;:87}TjZ&#@#_Y!  ?333?9/3?3+10!#&5#3>73767>32&#"i A3.  1+! 0p9X8%& ,%EI|YSvY%2z^&)7>YN#$@ RY ?33??9/3?3+10!#&5#3?367>32.#"s41$ /412v`Fa+ ,?&i-:Mb9F+Not)+3BQN!. H@Y QY??3?+9/3+310%67!!'7&546324#"6;?R'\ Zjm  '"$ cςut-*S,`WkD?r34)C;!ME5@"`Y\ I)??9/]+]]_]_]+10!!!!p'gf>E:@PY??9/]+10!!!S%Z:T1:R%@QYQY  PY?+3?+?+10! %>324&#"6  h&Ӥ*#9MhA} ҝc^mz.M3@Y@Y@Y@Y/++++107%7%e0,/v/-/,e{/9/310#3#73g<J/9/310#73'NM0*buch[/3210#73!70턄h[ /310!7!73y*[D /9/310!#!73]]$ KpD /9/310#7!3!$^^K  Q[0/]+9/10#!!y[& 4 4P| #@  @Q[/+_^]9/10!3!Fڜl44|"@  Q[?+_^]9/10!3!ڜl44|[  /9/2310!##7##''+;_  /339/1033733!*&&p_DŽ@l/3210#'#3a6l'`: /3?310!! 7 7y7 7 #) /32107!7!i+r+#+r+J/10#!&0? ?10#!\%?D:@S[ PY PY?333?3333+33?3+?+10!#737>32&#"3!!'7! 譒%ʘhb$N?7>%((||qESW:D3@ PY PY?333?33+33?3+?310!#737>32&#"3! 譒%ʘhb$N?7>%) ||qESW4&w& @ %0P`]5+5 ]?3]210#"&54733267Ӥ5;>` 㘥}u+ '1CXC<'' o#@ b %P]5+510  )d y  VFw_YU?+310!!!!h1TTTmD& -"%+5mB& "%+5mD&'3P@ (( (@((@+(.%-"%+O+_+o+O+_+++++++q]q5+]5+]]510mB&'3?@("%((.%O_oO_q]q5+5+510 &Ŵ %+5 &Ŵ %+5 &] %+]5F&I@ %]5+5P&R"@  %/@P`]]5+5&g%+510&g !%+5'   %+]510L&3g@  0@޴%+]510H&@ ""( %++]5+510aF&f* %5+5V& 4gǴ%+5)d& r@ ( %]5+510y& |%@  @ %]5+]510& #/@!0pN$ %!!!0!]5+]q510&I@%_]5+5V&"$@$* %-_---0-]]5+5`&H@C %]q5+510 &\@0@P`N%5+q5&@ %O_]5+5&@ _%]5+510V&4gǴ%+5mB&3g@% +d$DTt@)"%o/O_o ]]qr5+_]]qq510&g0@ p # % 5+]q5ywF&F&r %+5)d&  %+5 &z   %+5d$ WXW?3??9310#!3>?!!yVI9N%BE.!nJ4zl2 /210#"#6$!3v v2 /2103 #&$+ \SE2v   /2210.#"#>32[F%=x)1F|5 /331032673#"&']E+yNT*5Bdk=";@ [/]+107!;!B% @ @ Y/+_^]210"&547332>73中A^MJ.kft$%-90A8ow=%i [/+107!%i!B%? [/+10!7!%>W: @  PY RY?2+?+3310"&'73267!7!O+)~op%|W"llraMjE ( @@H@ H ?3++9?310#72673#J_ :#'B2[MQ;@+      YY?+3?+3_^]_]99107>7>?&#"'>32![/_YM ?-;){ro C]m^MHp51K/$75A {sWN2>]JE<.x9Q*\@0%Y/  - Y Y?2+?+3_^]9/_^]q+910"&=732654&+732>54#"'>32q~{F547A)%4> 4,-&lr~9j{bR0&#G'486 rrUL<q+fzQLE .@Y ?3?339/333+3310#7!733376eWR?5k& 젠>RDw6@E!c@-HY/"Y@ YT?2]]+?+9/_^]3+3_^]+]]10"&=732>54&#"#!!632qxy%/%7!/5^W^@id-"3a((.YU&!{M*E  Y??+310#>7!7!RzMHMmr@Q 2K+ @H @/ %%Y%Y?+?+9/_^]q+99104#"32>4#"32>"&54675&54>32 5*-5''H&2*(0z[\]M\vw>6-U~7L.="GC(Y!"%^YY[y2V@p;SJC>35rL*1a /107!(({ /229/3104#"7632#7260A9 >A |?Y\1 l FA2n& 7: @ PY PY?+3?+10%!!7!!7!a%%%;.+  /333210#73#73'!!tdي + @   /33310#?#73#73 t+.+@  b  /333]2210#73#73%3#'73t(ö C+ @   /33310#'73#%3#i +٘.+/3210#73%!!dيu.+@  /32210!!"'&#"#>32326736d4LM$-4[8U?$A;602\8R+&%#(PI)&%TG'k_  /332310#'##'##'k'E(E'0_oooo  /2210".54733273F0)?nW')4Dz+ `/310#'7!7!id+ + ` /310#?!! d+؊u+@ @ /3210"'&#"#>3232673#?24LM$-4[8U?$A;602\8R&%#(PI)&%TG'vu+ !@@ /3223310"'&#"#>32326737#73#7324LM$-4[8U?$A;602\8Rtt&%#(PI)&%TG'ޘS+  /210#73!#7wu,#+  /32210#733#'73/ö C+  /322310#73#73!!td 7:1@ SY PYPY?+3?+9/3+3103#!!7!#737!7!1(3a%%3(-%; /5=&b' J'q@7@H7@ H7++&+5++55/5=&b' JJq@7@H7@ H7++&+5++55/5=&b' J*q@:@H:@ H:++&+5++55/5=&b' J@q@:@H:@ H:++&+5++55/5&b&,@ B@ HB))&+5+55/5&b&;@ B@ HB))&+5+55/5&b&"@ E@ HE))&+5+55/5&b&@ E@ HE))&+5+55;>&j' J4r@ @H @ H &+5++55>&j' JHr@ @H @ H &+5++55;>&j' J4r@#@H#@ H#&+5++55}>&j' JAr@ @H @ H &+5++55J&j&;@ +@ H+&+5+55p&j&4@ +@ H+&+5+55J&j&@ .@ H.&+5+55V&j&@ .@ H.&+5+55j}=&v' J/q@(@H(@ H(&+5++55j=&v' JJq@(@H(@ H(&+5++55j}=&v' J(q@+@H+@ H+&+5++55j}K&v' J;@+@H+@ H+&+5++55j}&v&L@ 3@ H3&+5+55j&v&Q@ 3@ H3&+5+55j}&v&1@ 6@ H6&+5+55j}&v&?@ 6@ H6&+5+55 =&L C &+5!WZ *@_YaY?2+?33??+910"'73267654&#"!!>32Yg)M0ceAGU AePW m!Z7!!67!eC'259" Q_W D1pEz;6Z,@_Y _Y??+?+99//91032654&#"!3>32 # PfoqZYas#Ԅ L}aPȁmYd[}[`}Jg(n  ;=?3?310#"&54324&#"32>(aftzʫ&&.T1'(-S0f郉G6_mG8cRqc:<??3/3910'?3Mu饓qZm{r4n ;<?29?339910%7>?654#"'>32!+wGrRZ$'zw{6[2]rrq32}f?FB?KJ+*-C $yt{hwkh _95L91 &2/ is[R6r'c !@   :<??39/333310#7!7333\l){%/g?c$@ : =?33?39/33310#"&=732654&#"#!!632ɤ{aBS30>6r+AMhtjeZPE+2/%og0n! ;=?3?339/9310#"&5432&#"6324#"326 y}׻dp D9VFk_lZ:I-,gt[H=.=Sr\c  :<??3310'#>7!7!?R}y:Sr_g5n )"@ ##;(=?3?39/39910#"&5467.546324#"3264#"32}^R,,wSE19QtQ>6,b@HaoycYNtJ-j}^LCjHDrHDQFCUg-n !  ; =?33?39/9310#"&'7327#"&546324&#"326-ؼmo Gx0Dp^h+-:I)*k^->VA*6Oc  /329/103#7#'##73-`Rih   /329/10#'733#'##7`̬hiV Sc@ /329/229/3104#"'632##72#'##73552,>CT;=SBih@P2BN{4"@  @ "/323210".#"#>3232673#?3#N#@<8-3[8U?$A;602\9RԤôF#(PI)&%PJ(pC  @ @ /39/103#7"&=33273-}k_T5k0 }o D7{|} @ @ /39/10#'73"&=332735(}k_T5k0v }o D7{|} @  /29/32210"&=332734#"'632+72}k_T5k0-52,?BVS# S}o D7{|}@P7=74 %@ !@ /23210"&=332737".#"#>3232673doUMC,U&A#A<9P[iW$B=701 \5QdW (+Sbe&  /329/10#'733#'##7Jtt - u :@  / [/3+39/_^]^]229/310#'##7%3%4#"'632#7>3 D?7 JYOW[?+F%P_3Q &^ S#4@  /   @ """[ x/]3+33_^]210".#"#>3232673#'##7%3V(ID=$2|>^D)KD<,/z?_W3#)#-Blb:"*":4dh<Oo @[ [/2+3+10"&573326737%!{XcX+g* o:?I+M @[ [/2+3+10"&5733273%7!|MX&$ьo?:yI+O ,@ [/3+3_^]229/3104#"7>32#72"&573326732< h,hjXcXb7fE?3232673"&57332673\(JC>$1|>^D)KD<,/z?_١XcX#)#,Clb:"*":4dh3232673,RLD/5(g-SKC23%g#+#2?#+#89Q  [/3+310#7%3#7%3ߎ+"+"+  [/2+310"&57332673XcXg* o:?f/310!!d!f*'Sr& (@% % %5+]5+510*'Sr @ %5+5V&  %5+5V&  %55+55D&δ<%+55555d&$%+555d&$%+55y  &]#@ @  %]5+]5I #/;?+@<39!@!!!- '=/3333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&3I."".0 0. ".0 .0 // ".V." 00 ".'. !/." .HnGb".0 0/!".."".0 .. ".0"--" .. 0/!"...nOv@@/3]q29/10!!%4632#"&4632#"&3dG." 00 ".'. !/." .HnG5j>"--" .. 0/!"...nOv#@ @! /3]q29/107#7!#%4632#"&4632#"&3oGk." 00 ".'. !/." .HnGujju"--" .. 0/!"...n#.6.'32>#".7>7&:!5 H{cE(P=FkM3U="$nفl mgC(EufX(LiSBpQ./Rsn9TlLEun_!:QpK[!!33333 ܯͯܯί[M:{{\[!!3267!!67## 47+ vv [p[y?4DB\{CKnV% M_zo G s>  . g 5  n   5 4Y 6  2+ y ( ) V 8 \  j  4 8Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Liberation MonoLiberation MonoBold ItalicBold ItalicAscender - Liberation MonoAscender - Liberation MonoLiberation Mono Bold ItalicLiberation Mono Bold ItalicVersion 2.00.1Version 2.00.1LiberationMono-BoldItalicLiberationMono-BoldItalicLiberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Liberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Ascender CorporationAscender CorporationSteve MattesonSteve MattesonBased on Cousine, which was designed by Steve Matteson as an innovative, refreshing sans serif design that is metrically compatible with Courier New!". Cousine offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.Based on Cousine, which was designed by Steve Matteson as an innovative, refreshing sans serif design that is metrically compatible with Courier New. Cousine offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.http://www.ascendercorp.com/http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlhttp://www.ascendercorp.com/typedesigners.htmlLicensed under the SIL Open Font License, Version 1.1Licensed under the SIL Open Font License, Version 1.1http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL# Z  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [uni00A0uni00AD overscoremu1 middot.001AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni200Cuni200Duni200Euni200Funi2012uni2015 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Eminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23undercommaaccent cyrillicbrevecaroncommaaccentcommaaccentrotatedotlessj onefraction twofraction threefraction fourfraction fivefraction sevenfraction eightfraction dotbelow.alt1hookabove.alt4 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capcyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lcgrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.ucmacron_referredlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BES_TES_PE=P̒x N O Q R S T V W Y .Xcyrlhebrmark .6>FNVdr Frh$(6NHj0 > !L !!!""H"x""##8#h###$$*&*-111n L $*06<BHNTZ`flrx~ &,28>DJPV\gxxxdx````zz ( K NHfj" zf &,28>DJPV\bhntzfXfX@A22z2zIX<XfXX zf L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzXFfFFFNFNfFffFfNFNNFNfFfFFXFXNFNFfFf&F&NFNpFpDFDDFDXFXDFD0F0FfFfNFNfFffFffFffFffFXFfFNFNFXFXNFNFNFNfFfFfFfFXFXFXFFFhFXFXFFfFFFFXFXF F@fFDFXDFXDF0F0FfF&F&&0FXFXFFzz ( K NHFLRX^djpv|fFfFfFfFfFfFfFfFfFfFfFfFfFfnfFff. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzNN00ffMMffff\fffffffffff2fDDXX::DD\lXXffffffffXffNNMMffffffN00f>0l,fTfhXXXX\lff00&XXTTzz ( K NH T U Vjpv|ffffffffffffffffffffff2ffff2zz<zz2 K N!< K N!J` T U Vzz J` T U Vzz T U VJ` T U V K N! T U VJ` T U V K N! 4<zz4Jzz4< K N!4J K N!Jl T U V T U VzzJb T U V zzJl T U V T U V K N!Jb T U V  K N!n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFvFFFFvFFFFFFvFFFFFFFFFFFF^F^F^FF^FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFzz ( K NH FRFFn L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFfFFFFfF F FpFFFfFFFFFFFFF\FFF4F4F4FFRFFFF F FF\FFxFFxFFFFFFFFFFFFF F FFFFFFFFF\FFFpFFFFFF F Fzz ( K NH RFFn L $*06<BHNTZ`flrx~ &,28>DJPV\H fL>  zX    >  fH vvL> X vH>LLzz ( K NH ( > T U V  K L$*  K L$*  K L$*  K L$*  K L$*  K L$*  K L"  K L$*$*$*$*$*$*$*$*$*$*$*$*$*"("(n L $*06<BHNTZ`flrx~ &,28>DJPV\p 8LppppLLp L~pzz ( K NH ffn L $*06<BHNTZ`flrx~ &,28>DJPV\ffffffffff,fffffff,fffffffffffffffffffffffRRffffffff,ffff,ffffffffff,,zz ( K NH T U Vflrx~:::::::::::::::::::::n L $*06<BHNTZ`flrx~ &,28>DJPV\fFDFDFDFfFfFfFfFfFfFDFfFFfFfFfFfFfFfFfFfFfFfFfFDFfFfFfFfFfFfFfFfFfFfFfFFfFfFfFfFFfFFfFfFfFfFfFfFfFfFfFfFfFFfFFfFfFfFfFfFfFfFfFfFfFFFFFFFfFfFzz ( K NH:@FLRX^djpv|pFpFpFpFpFFpFFFpFpFpFpFpnn L $*06<BHNTZ`flrx~ &,28>DJPV\ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffzz ( K NH T U Vflrx~ppppppppppppppppppppp@p 8 >fcyrlhebr&MKD SRB ccmpdliglocl" $,(>NJ WJ Y X 8BLV`jt~ (2<FP T U V S   N M K L (06<   ", zzJ",6@  openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationMono-Italic.ttf0000644000076500000240000103105013402025764025477 0ustar kintelstaff00000000000000 FFTMa U0GDEFyp,GPOSѾ3>GSUBmN.4OS/2n`cmapC'l.cvt mQt>;fpgm~a-gasp glyf c/head,6hhea }d$hmtx5%dloca0>P%lmaxpe name6t postQD[prepl5PN_<̓G̓G%%d X Z"Hc/\M33Paf   @x1ASC #~g`:E y#Z5ptS?y4'\<T\vttt 9t99Yt9a99f9f9(nj*Rrg?IJpptOP&Pppn c*tfuXI xt?Gt>`':H>:7t9999aaaa&9fffffnnnn9%IIIIIIptttt&&&&bPpppppt!IIItptptptp9&n9t9t9t9t9ttOtOtOtO9P9Pa&a&a&a&a&929P9P9PcPPfpfpfp999(n(n(n(n nnnnnnjc***'J;SJ9J2tp&;p-e4(7ta9 (Pffp0;99qo r mIp*'RsJ r Ia&fpnnnnntIIttO9fpfp tO9cI!II9t9ta&a&fpfp99nn(n 9P93^*I9tfpfpfpfp1%+ oiA9tp[pJJdppgtxNsO>mMPP&Ddv@//DPPpoNNNjOOGGK>X**X>fPDmLp:  ;}'PDee[nss.aakvv;v7dl  ZCtttttssz - 1;1/Y53ts-mj@*]![H &XtM-,W&E `m{v pf$1Q2#V8w,"!I~tx`p_[-^_-^9w99fa99f:9jahxP}hWxP pEH}!2}p}F5pfpAYNR/9YaXq1tn-9t2t299wt(aa?9399wM999?9f99t92IP^tNPPqLpLp5GMcQttPn&&PqPL:U9cxfpf) :Utr,B.n%k9P9a9yB:9N?q?q?q9L%SpspwFV9P!!a<ND9V II9tetftN$9P9Pfpfpfp2QwJp;vDotmk8{fpjcsRD5#bb/`'5m3B'bDbu{)//7y`o)hFX^u-/Ht<dw|Opd&')obb}c*ab&~,C}1g% >"!CHJZ Jn)0N-/A}uo1U^:H|Vd;6 IJqMip ; EDtDC!|S$VDd~u:m&'9/8-QY3a4]Mxfp ,I9J9J9Jtp9p9p9p9p9U9t9t9m9J9tYtO9P9P9P9PD&a&9999c9c9c9cfpfpfpfp9999{9{9(n(n(n(n(n  dpnDDddnnjcjcjcjcjc***P cI'-IIIIIIIIIIII9t9t9t9t9t9t9t9ta&a&fpfpfpfpfpfpfpfpfpfpfpfpnnmmmmmhhhhhhhhwwxxxxxx8[8[PPPPPPPP8n8[^^8[8[^^pppppp#?#}}}}}}}}w[S#hhxxPPpp}}hhhhhhhhww////////8[8[@@#hhhhhhhkqki///P/9aa}}}}}}wnppr L?EG gg MZyS cezt&Kt9tt =I;_`>.8R\vvvvi iucN4lttstsjjjjjjjfwhh4sh%%n<fafp5T99P%;tjca0__EG7`Iy)F{)hkF^u-FXl S]R1>^ &xxx"&hhhhhhhh}}}}}}}}&99meK,=nonnD>>XXXIOOL$~~6ou~EMWY[]}   " & . 0 4 : < > D ^ o  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# 8tz HPY[]_   & * 0 2 9 < > D ^ j  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 7/*wg\"(% 9,?>52/,)" EBA$"!+(ډaa$    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvj72s9:gw*-,q5l|Zcn1T6+m}bx:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A&SMURMUVTUTO3NUL3MU==<U<:U;=:U54A-444.U3H2U22.U1=0U00.U/=.U .`.. ..U-=U,ADD>UC=BUB>U?=>@GUP(F*F(F5/o0@Pp @(@8F@F&=F@FF@36FF>U@ =U=U=UAU P0U@PU P܀ܰ3`p? P&p 0p<&Pp)F@ F P#@ 1?!<@ F @H/?Э/?Ъ #FKA($[I-=2U p@F 0F&F@*F@1F@F@ F/? o @ &Sߐ0/o @"F 0O_o0/@F  0   F F@' FJ<<p0msP&F@CFrrr r!FrrqoHoF5nF5U3U3U)mlaP`P&_P&F,ϼF@#F&^ZH\F1[ZHZF1U2UU2U@<YYoS@9P&RPQQ@Q58F@Q%(FPOL<NF1MF1L&L6LLLLKF4P%@bJF&IF5HF5GF5FFFFHUU2UU2UU?_/Oo?oOTS++KRK P[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++++stu++++s+stt+++t++s++sss+++++++++++t+++++s+++++++s+t+++++tss+++s++s+sttt+usttt++ss+++s+++s++t++s+ssssssstt+sststt+++s+st++s+++stu+sssss+ss+++ssss+s++++++t++^s+^s+++++^su^ssssts++++s++++s+++st++s++s++s++++++++++}E`E:w{_Wz~ E|_Eo|^`yPL3 {+nllVnE`Lp[^io^h&J{uh iq[RPVpMMddhEEE s}Dj_gs6Uoo ["x`Sh4444xx8Dlh` 4 L  X 0 4 H0ppp,l4hD0X Ll@(Ph \  |!L!" ""#D$$%%&H&'`'(`())p)*L++@, ,,,-.|//011P23\344(5$585646778<889 99:t::;<;;< >$>H>l>?,?P?t???@@TAA<A`AAABLCC<C\C|CCCDEE4ETEtEEEEFFGG G@G`GGHHII$IDIhIJ(JLJpJJJJKK(KHKlKKKKLL8LM MNN4NXNxNNNNOO0OTOtOOOOPP4PXQQR`RRRRS S,SDS\SSTLTUU$U<UTUUV8VPVhVVVVW8WWXXX0XTXtXYHYZ Z,ZPZpZZ[x\h\\\\]] ]D]d]]]]]^^4^L^p^^___``(`L`l```a a8aPataaaab b@bdbbbc cddeefg@hhhiXijk$kllm4mnpnoop@pq(qrrs0s@sPstu<uvdw wxTxy yzlz{h{|h}}~<~L\|\(|X$4@dHl8X8d$HxXp<\4$Hl Dh@d<`@L`L<Tl0Tthld|l@P8PhHl< 8$@4DP,ƨ@ȐHʰ ˨dΨTϴЌ@XXlԼՌ\x0ٴ4ۨ۸܀@hD@P` , p|pL Dh,` P|$\,d@xTL @| @l$lXP|L@hL,p  P    , \    ( d    4 p    p  @dH lLp TD0$d8H@p|D@|Pt  H |    !!x!"""x"""#$#T#h#x$4$$% %%%%&x&&'('(( (0(d((())))* *0*@***+ +t++,X,h,----..8.X.|/$/0@012@23l334d45<6 6067`7889d::;;;< <@<`<=T>@>?H?l?|@@A ABBC<CDDDEF FGH HI0JJKL<LMN NOOP`PpPPQQQQQRRS@SPSSSTTTUUUUUVW0WWXX$XXYY$Y4YYZx[D[[\4\\\\]](]8]H]]]^$^^_T_`\`ab8bbc|d(d`ddefdffg\gh`hhii,i<iijDjTjk kxkl`lmPmno,oLopp8p\pqqq<qLqrs(sHshsstu$uvLw wx@xy@yzp{{|x} |D ,PHl8| D(p|<P8 x 8DhH($ 0`pX|pdx8X|$Hl$Hl8\4X8ltlTh´T|ČĜŔ@PxLjǘǨǸ$ȸh(P$Lˤx<ͤhΘPψ4Р H4ҘhpԨՌո,d4X|ר Dؐ`ِ|D۬8ܘ,Xݬވߌ߸ | x`<D\d$x(X,<t t0 L\T L(8x x\H( dl<@XXTX` `   l  |  L  D (Hhp`xdD( !!""#l$D%$%&''()*x++,-(-.8/@0$11234l456X778p89:T:;X;;8>>?@P@AAB|C$CDPDEF$FFG(GpGHxHIIJLJK(KXKKKL,LlLLMHM`MxMMMMMNN@NlNNNNNOO O8OPOhOOOOPP P8PPP|PPQ`QQQRXRpRRSHS`SxSSSSTT,TPTTTU U$U<UTUUVV,VDV\VVVVWWW<WTWlWWWWWXX@XhXXYY(YTYxYYYZZ Z8ZPZ|ZZZZ[[4[L[p[[[\\0\T\x\\\\\]],]P]h]]]]^4^\^^^^__,_L_p____``4`L`p````aa@a`axaaaaab bDbdbclccccdd,dPdtdddee0eXe|eeef f0fTfxffffg gDghgggghh<h`hhhhi iDi\itiiiijj4jXj|jjjk k8k`kkkkl l0lTltlllllmm@m`mmmmnn0nHn`nnnnnoo@o`oooopp8p\ppppppqq4qXq|qqqr r0rTrxrrrs s0sTsxssstt,tDt\ttttttuu(uLupuuuvv$v<vTvlvvvvvww,wPwtwwwwxxx4xLxpxxxyy$yHylyyyyyzz8z\zzzz{{{4{L{d{|{{{{||4|X|x|||}}$}D}h}}}~ ~8~d~~~(Hh@lHh(Ht$P|(Hh0Xx0lX(PpdLl,PtL$Xx,Ph@p$<Tl4tTL\@<<d XxP`txl8 4th$8P(p(T4<Dh(8`lHXp\ô@Đ8|żPƜ<Ǡ@Ȥl$ʔL˼tT͸@άϘ pl\ӈDtԤ4ظ4xL|@Xpldx,l``8x( P8pT`Hx(x ,p(@Xp0H`x   8 P h    T    d   ,  0|h4XLx,p<L(8hHx@xHxPPx,   !"P""#t$$`$%8%& &x&''(L()\)))*(*d*+ +P+t+++++, ,$,4,L-0-.X./@/:E //103!!!wGEfD@ [??+9/10#3734''yMm?33/210#3#3ǎTSMEh@D  YYOO_OO_ /3?399//]q]q3+33+310!!#!##73#7!3!33!!ہnnnkn@jAlhhl=lhhl=#s%,4b@;**sY1)sY))@ 'H@H2sY@P%?3/]/]3+3?3//++39/3+3+310#7$7.54>?3.'4.'>*\_0b;?s goSL~WP&-/Xr\Y% 3CbHQn:!ilV.MrUxr4&#"32>2#"54>4&#"32>t/`Y1_27ER195BS.Vt1]72EQ195AT-IOCL<=:SAE8^nrvL>D4TBE8]TM%2=9@35 .)QY!;;QY?3+3?+9/9910"&'#"&547&54632673274&#">&'326G(彀YZpzRX!W(9)4MEje@[tnjB D=[UdrbSyP왳+63i7@|JKB8=B9lZe;ZM ?3/10#3SM5W2 ??10%#&5473 `nicwپ|ĴB@W ??10#654'3 TzihkayWĮHĦ5}pL<@      /]3?99//329/333/310% '7%73؉diG-gIHHIk)tW .@Y Y ?3+3_^]+++10#!5!3!X`TTS+ [+10!S* Hj?p Y?+107!?0Р+ [?+10!3::+?3?3103Y yZ"/@ |  sYsY?+?+9/_^]310"&54632 4&#"32>73a^DnvrruioJ 11ԙӝvǐ@rg4E&@ sY  sY?+3?3/+91037!#72$73!45ՆFaOscL'Z +@ sYsY?+3?+3/_^]1037>$7>54&#"'6$32!':Dtom%60nӄ(uZ wES\wwŒH[?\Z/H@(' `  sY!!sY! sY?+?+99//+9/_^]910"&54?!2>54&+732>54&#"'6$32gVfb`borw"6¼ɤQ IJYgE}\QZzoÒ iO{B<VE 1@ sY   /   ?3?339/]3+3310#!733!~>>r(Ǭ??zCKTE>@! sY@HsYsY?+?+9/++33/39/10"&5732>54&#"#!!632кjbxIK!p͘cWgy-8ؑWZZ):@ sYsY&sY?+?+9/_^]3+9/10"&5463 .#">324&#"32>i> kQ0CsRzoXZ|gb[Ӟ[Q[_gܠXjtZnzgE @ sY?2?+3310!#!7!4i4`M\Z*71@'.'.sY'' sY4sY?+?+9/+9310"&54>?.54>324#"32>4&#"32>^`Zg풷ͷjzPM`Fpml:U{iRuOiv_mmgWF@GJW\T_bVYXvzZ(2@ %sY sYsY?+?+9/3+9/10"&'7327#"&54>3  4&#"32>Ԧ 39uQ}wc[yjc\xiZ\Ynl۠Wa}zheoz_D:$@[[?2+3?3+310!3 3::S::++D:@ [[?++103 !::* H+jtW.@?o/]]3/]39=/33105 tZ;tXWI@6YOo @HY0P`pPp/]]q+/+_^]q+105!5!tXtW,@?o/]2/]]39=/331075 5tZ㚙on^Z*@[  Y?+3/?+9/10#>7>54&#"'6$3273S|y'>26m}''eiKZbW[ ؙG@RI ?M\@5I IY CCY-  _ o      199"Y91*Y1/+?+99//_^]^]93/+33+3310%"54?##"&5463237332654&#" 3267#"54$324&#"32>u 1MQUw>t=%$Eby[}6t܋/ІS3-LuM4pgfhl&Wlwqyݭz#0~بOC[WfWgAAAc)cE @ _Y ?2?39/+10!!#3!@.IL~E[E9E"-@ _Y_Y_Y?+?+9/+910)! 4&+3 74!#!267(ReM5P*,] EWmkRAQG`ع"y{tZ7@#_Y/o P _Y?+3/_^]?3/]+10!267!"&54>3 .#"< gPhOBdluMÏA|Aw}f9E @ _Y_Y?+?+10)! 4&+32>7!lyʢÊPE5aa(9E 4@_Y _Y _Y?+?+9/_^]_]+103!!!!!9(RdZEZ3YE @_Y_Y??+9/+10!!#!`\i{EtZ2@_Y _Y  _Y?+?3/_^]+9/+10"&54>3 &#"!267!7!jX5$krOD6Ao}8c* Pę9E @ _Y ?2?39/+10!!#3!3yyn noE6aE @  _Y _Y?+3?+310!!!!7!!g7<<E wE!@ _Y _Y@P?2/]+?+10"&=732!7!ݩ\T7' ps _9E $@7G8Hh  ?2?39]]10!#33 [+E_E_Y?+?1033!EWE@   ?2?39/33310!67#&' #3?3@'7`Q6Z +Hd~lJIE9Z9E @ {t?33]?3]310!#36733 j]Ew`fZ@ _Y_Y?+?+10"&54632 #"32>cbD舿sduJ٠~ ݛ-lhK9E @_Y_Y??+9/+10!#!24!#32>udܕgr[EXf}Z'&@_Y #_Y `Y_/]+?3+?+10327#"&'.54632 #"32>pe7>bTcN舿sduJ~r Ǡ~ ݅y-lhK9E&@ _Y_Y?2?+9/+310!##!24)!2>Tpg~6[oN?Ehʉ*O(Z/$@ "`Y_Y?+?+9910 7326?4.'.54>32.# 7=lnC#H z+/Pj;NRf%w{s-8J3((6BT7Vz=!of)/<)0LqW`EE@ _Y??+310#!7!DE4WnE@  _Y?+?310"&547332673ɹew*4M^mfDf[F_E  ?3?310!#3?3`ɑ,^EzY]jiE@    ?333?39/310!#&#3>33  !c35 Ref ; P;EX׽ZCE ??10 3 # # 3SeD|?=EE ??10!#3 3[rHcE @_Y_Y?+3?+310)7!7!!aWt@ YY?+?+10!!!s#oWu* ??1037 RW@ YY?+?+107!!7!Ro=#W_r3E?33/210#3*#ug$P Y/+107!``? [?+10'73>ŴI6N+8:@""PY1QY" , ,PY QY?+?+3?9/++9/10%27#"&57##"&547%7>54&#"'>3 %2>?!FHWIYǀ D\\tw6T Z $_pMIopLLAzi|m)0]Q+UHO]-4.+!*+[SYCM>HJ[%%@PY "PY?+?/??99+10"'##>73363 4&#"326M6R"27_b~`lrxX,qJY]zxm{sMpdNE@`p @HPYPY?2/]+?+3/+_^]10254&#"3267#"&54>jvaxxl& zSNVhʊzjm `Yƿkp''@  #PY PY?+?+99??10%#"&547!2373#547%32654&#"EyoyW ]dbltW|Y=i_a|6Vbx,+ukK~ytQtXN :@PY  PY PY ?+?+9/_^]+9/103267#"&54>3 "!7; }qf*EP$HE4XN-|ɽ|!l[iҮH @ PY PY??3+3?+10#!7!7>32.#"!(F+,irEṰ  .ifOXK"21@&PY  .PY PY/+?9/+?99+?10"&'7327##"&54>323>734&#"32>b\;&Pq$,qgZ~X;]kPh6XKQ;ѝ|Oiia% Ra~N[ndVPI@  PY??+?391033>3 #654&#"#pK %C! W\|zz8_n9A/:(XR& %@ SY PY PY?+3?+?+10%!!7!!7!'73|*%%W&@SY PY  PY?+?3?+?+10"&'73267!7!73O+{iK$f%%W"xŎ $@ @H?2??9/+39310!#33 )N AVboa / @ PY PY?+3?+10%!!7!!7!|*ՎN1(@-PY ' ?22??3+39310!654&#"#>533>323>32#654&#"(*?t!v  9zKXD=TXP(*Ao zn=;/S"KC00kX__jZ\dKr/n=;/PJN@PY ?2??+910!654&#"#>533>3  W\|z  D:(XRS"KC0{8_n9F/p]N@ PYPY?+?+10"&547324&#"32>73Tmv_eg:žO`j}|ΈSW\P&&@PY #PY?+???+9910"'##6733>3 4&#"326M0_ F|4n5Yiac73#7##"&5474&#"326}  lLznktuY[eaJZ^Ab&9nba|6{usr@N@ RY ??9?+10&#"#65'33>32^ke$cIs_ja\2NB8qh5nEK-,@ "PYPY?+?_^]+9910"&'732654&/.54>3254&#";oS_tk;B}mhuGVtF~XMn[1B$;U=Hf5~FG`U.;:4CF,gb 3T#@ PYPY?3/3+3?+10733!!327#"&547 qx7PLQt,96".cj-#:@PY ?2??+91032673#467##"&547օUcz Sv:RH3TFs"KC0 )p]t733B'=/G۰ʋ:9"VWL_: @  ?2?3910!# 33 ;g | 8D,[W:7@   @ H H PY?+?33++_^]?310"'7326?3673hH1$/OI % 5ξfW v1/~1X*p: @PY PY ?+3?+31037!7!!*EL&ڋW*E@# #(  Y Y(Y?+?+9/99+999999910"&54774&'7>7>3!#";`nE{pE ]`DmReDDIW{m&!_2S^{g`[hauR* A8W ??103WuW)G@$%&"   !"!"Y!!YY?+?+9/99+99999991073267>75.57654&+7!2#DjTbDFI qExsEĄWYj[fxN4Z* B7zlQ`xkt)';@%Y/@H@ H @ Y?  /]+3++_^]2+102327#"&'&#"76QDxCJwSEDxXCzL~'.-\-#,-(0Tf2:@ [??+9/103##77''IDc#Y@7_oPY    PY /+3/_^]/3/^]3/]+/_^]q310267#7.54>?34&#"Fp&0&&P{$$wp^k: ml  vo dcI\Z&E@# " sY sY""sY&?3+3?3/+9/3+3999910%#!7>?#7376$32.#"!!!267Y__W:*&Κ iNz*hdYX;C-MqRzl9?@s}؎*55us+@ !Y(Y/++10'76327'#"''7&54632>54&#"QQ|PatTs'HCQ{Q_}Rz%EXdRccSgdgeRPai`N]WHdieNPiifMZXb[VcYX5EI@* `Y `Y      ?3?399//]]q33+33+310!!!!#!7!7!7!33A22}@i9@ ??99//1033  IT7FF@%,C1;C;C;%QY""""QY ?2/]+/3/_^]+99//333310254&#"#"&'732654.'$5467.54>4&'>/rknHFNTSFu ~8jʟ~JXrzPF1cqVK̆~KPkQ6Q&!F`BEc(eGHg6`Ww^.B1$Gj"mH[V=Z%>j5&?16e${@ [?2+31073!73]$$$$ø&(5@Z  YY_ o     p   %%,Y%3Y?+?+99//_^]q]q3/++3/_^]q103267#"&54632.#"#"$54$32#"32vjA`#s4jVra@kp  \vJR#vk!CFFF-GH )'3=@& &0Y&& ++Y Y ?+?3+339/+9/104#"'>32327#"57##"&5476%7632>?qTj&Ȓ8944}js0e13+@    YY?+3?+3/_^]107>7>54#"'>32!>,{}ozDg#}sy}}r 3gEKLHfIDn`X`MbX1k`' )Q@/"Y 0_o  YY?+?+9/_^]]9/9/]+910 =732654+732654#"'>32r]c=9]m{Db"qsiVLT'  zfMjm^JbFA ly[SX X=KK [?+107%3w: @PY ??3+3??310!4>7##"&'##332673+ RsH} ׃x |3@:z|F%–i"LC1E%@QY/3?+339/10 ###"&54>3!=҄.҅r̃G}ysz0DL"@ Y@ H Y?+/9/++10"'732?4#"739!0$w+dk:QPCDbV@d@8;l7'3&@ Y Y?+3?3/+9107!#726733' w"Z`/y3kb1BmFBk:WYY?+?+10"&54>324#"32>yuٌD~۾aHLvJ+~`I__8hR)@ [ ?2+39=/33310%#7 73#7 73  ot?ot?HE'&&$@o ]5]]]55?55>E'&: ]5?5:Q'!&&(@11o111@( ((]]5]]]55?55794@[   Y?+3/_^]?+9/1033267#"&54>7>#7w|y(?6n}''iKZaX[ יGBRc&$C&+5y&$v&+5d&$/&+5&$/&+5c]&$j, &+55c`&$U 0]55EQ@,_Y _Y `Y _Y?+33?+399//_^]_]+3+310!#!!!!!!#!mިTGZzIwdER/otDZ&&zb9&(C&+59&(v&+59&(/&+59]&(j@ &+55a&,C&+5a&,v&+5a&,/&+5a]&,j, &+55&E 5@_Y _Y_Y?+?+9/_^]3+310)#73! !32>54&+!tu7!l8VÊPyW!U[5UGa(xA9&10&+5f&2C"&+5f&2v"&+5f&2/#&+5f&2/&&+5f]&2j/ $&+55.s ?310 7   bh^^i`fJb`g_iia+p )0@#$& &_Y _Y?+?9+910"''7&546327 '32>&#"cR ceQ!bD{4duJ_4sA[z~ AZ{3RhK# on&8C&+5n&8v&+5n&8/&+5n]&8j, &+55E&<v&+59E )@`Y`Y@H?3?399//+++10%!#3!24&+32>B1- ܔۋpt`E먜go[%5,@#PY , #PY?+?3?9+910"'732654&'.54767>?4&#"#6$32h3Dh|?LEFFC sb ƴ,O:7Lg1!${Z4W40e?r\3R1ALs4c;?#!D7m_iI6&DC>&+5I:&DvM>&+5I6&D?&+5Iu&DB&+5I6{&Dj @&+55I6 &D 9&+55N+6?V@-":2:PY ::::"7"PY&$"..PY ?33+3?33+39/_^]3+39/9/103267#"&'#"547%7654&#"'>32632326?"!654&Klwys DK25JS/*oV]{_j9'Q!i A]a^H-m{3=]3A8Q[oqYJV1d]pDdN&FzQtX&HC&&+5t\&Hvo&&+5tX&H'&+5tX{&Hj (&+55&&C&+5&U&vh&+5&?& &+5&M{&j) &+55b{,3@!PY  (PY ?3/?+99//_^]3+102&''7&'3%#"&54>4&#"32>S0o"asKL"TVnsZttea6;ysn^[C%Arl\ix[smx{yrDP&Q (&+5p]&RC#&+5p]&Rve#&+5p]&R$&+5p}&R'&+5p]{&Rj %&+55tWu C@* Y YO_ Y?+33/_^]q+/_^]+10535!53!N!+6@$%' 'PY  PY?2/+?3/9+910"''7&54>3274'32>&#"k^?g,WgX@a*U*;kk;fm9gk<kWD_U{!hdRDZQxj(_Q(#@YQ&XC%&+5&XvZ%&+5&X&&+5{&Xj '&+55W&\vk&+5W\#'@ # PYPY?+?+99??104&#"326>3 !"'##3Yiac32373#547%32>54&#"73PEa~LhbtW kEHDd8aW\Wti_~6vVbx,+h`_Zw!$%&En/ /M@QY/ ,PY@ H $PY ??+?++99?9/_^]3+310#547##"&547!237!7!73332>54&#" Eyly4,_d^b:kvuZ3,+i_V}+VbsjQVwt9^&(F  &+5tXS&H"&+59&(0 &+5tX&H!&+59f&(&+5tX&H$&+59UE&(KtUXN&H>9&(0 &+5t]&H"&+5t&*0$&+5OX&J9&+5t&*3&+5OX&J3&+5tf&*(!&+5OX&J6&+5tYZ&*OX&J6&+59&+/&+5Pe"B@)!Y![  PY@H  ?2?39/+]+9?3++103363 #654&#"##'##7%3V%+ { V\}nih,Ed;Ak{5/WQ9AEE@' _Y `Y  ?3?399//3+33+31073!733##!##77!&& &&ÿyyà!++ĔoPC E@  QY  /  PY H ??++9/_^]3+3?39103!!363 #654&#"##73p+ +! W\|t̝CV9AM:(XRa&,1&+5&}&&+5a^&,6  &+5& S& &+5a&,/ &+5&f& &+5aUE&, &U&L8af&,&+5&: @ PY PY?+3?+10%!!7!!7!|*󎎎"E*@_Y  _Y ??3+?3/_^]+103#%267!7!#"&=7h{ʹ(KE _橿 opW/@ PY SY  ?2?3?3+3?+103#733#"&'7326773VҴ%%$O+{%%: "x%&-&+5W&h&+59YE&.Y&N: @ ???9?10!#33 )MҴhCVbt:/&/v &+5 '@ @ PY PY?+3?+10%!!7!!7!'7%3|*պ)`YE&/ Y&OE&/E?5J&OE&/T&OT2E '@  _Y?+?399//9103'73%!Y*ɏ{A%{N=y`ynE2@    PY  PY?+3?+99//9107!!7!'%!7!#(s|*_+9mtq{p/9&1v&+5Pv&Qv$&+59YE&1PYJN&Q9&16&+5Pd&Q &+5cF&QiC!?5PZ'.@ `Y _YDTd?2/]+???+310".'73267654&#"#?336!  C]A >.Op*Q ^h  . W:<=d<'2*WY_X{88@APWJN'#@PYPY ???+9?+10"#>533>3 #"'7267654&|z  DyL1=FE WõS"KC0{8_n9F Ig":(XRf^&26 &+5p]S&R&+5f&20&+5p]&R&+5f"&2\ (&+55p&R@ )&+559K"J@)_Yz   _Y _Y?2/+33?3/+339/_^]]]+10!#"&54632!!!!!%27&#"<'ǽa;1.rVoXVG$>ovўH9!bN,5J@')0PY 0000-##PY))PY ?33+3?33+39/_^]+9/103267#"'#"&54>326324&#"326"!654&rB_r-vsLzh-w:;TwTsYwQIv!D 7nV^H-Kss^Vv{ V=^W9&5vx&+5&UvY&+59YE&5YN&U9&5&+5&U&+5(&6v5&+5nE&VvV3&+5(&646&+5nE&V4&+5(DZ&6zLnDEK&VzV(&6/1&+5ni&V/&+5YE&7 Y3T&W&70 &+5|&W?5E)@ _Y _Y  ?3?9/3+3+3103###73!7!DSyySE4Xl=T 7@PY  PY PY ?+?3/3+39/3+310!327#"&546#73#733!!P,LQ59qx7P9,96".cj&%n&81&+5&X)&+5n^&86 &+5S&X!&+5n&80&+5&X &+5n&8+H@H0 ]]]]++55 &X  &+55n.&8h !&+55&X> +&+55nUE&8;U:&X!ji&:+&+5c!&Z&+5E&<+&+5W&\&+5E]&<j- &+55&=v&+5*p&]vU&+5f&=+ &+5*p&] &+5&=9 &+5*p&] &+5'  Y?2?9+910!#>32.#"۴(F+,S̭  lJ[ .I@(  QY@ H $PY +PY?+???+99339/+3+310"'##67#7373!!363 4&#"326M6 )~2!28_b_lrv\7.!׃^yxm{sN;E'5@$$_Y$ $ #`Y_Y?+?+399//+910)"'5463! 4!#3 4&+326hZU8Ƙ]#{Q}Xd8 q"sUK`SEJ[(5@ PY RY %PY?+??+?+993310"'##67!!363 4&#"326M6 )3"28_b_lrv\7.!^yxm{sN9E@ _Y  _Y?+?9/+10#!'7%3!24)!26~L8nB\3ъr!ʤ(J[)-@ &PY PY ??+?+?993310'7%3363 #"'##674&#"326#]$3R"286 )#_b_lrv\>!Y^y7.!xm{sN2Z7@ /  _Y_Y?+?+99//_^]]10!"'!2# 7326f;RְPhveYqAO_tASt"%K@+_Y/  !_Y_Y?+?+99//_^]]9+310!2!"&54>32>32&#".#"< ҧhgw5@(,GN (dmvIA{^GM=w}hp)>@""PY"  @ YPY?++3?+99//9102>32&#"54&#"3267#"&54>fr10!+BE)jvecV|Xd8dE &@_Y _Y _Y ?+?+9/+104$)!7!!"&73!! 3BP)3\DaYp)4@RY%PYPY??+?+9933?+10!#547##"&547!237!7!%32654&#"Eyoy8s]dbltX~Z9+i_`}6Vbw$ukK~ytT-W]N)@ PYPYY?+?+?+310!7!.'.5! 4&#"32]&RX;@D!nuulۄYX;pHwbE &@_Y _Y _Y?+?+9/+1037!!7!!7!ZdR(͚eZ *@_Y  _Y _Y?+?+9/9+10>32#"&54?!654&#" !cϥ5 aȃ$n \nuweqPVEwsXHu4Y&5@`Y#  _Y  _Y?+?+9/99+910"&5467&54>32.#"!3# 3267ٲ%}.QKC9EVX$6.35:AYA[2΃t&(@@! _Y $#_Y$$_Y_Y?+?+99//9++310"5!2>32&#"&#"3267!7!bMa!y5@4 GL-$ϏoC6Bo eGM8믹)!PQHWdE @  _Y ?3/+9910"&546?334'326bl=Wl]@O~7OK#MS(NcLJ!%(J**@& PY"PY?+???+?9310"&547>'4&#"#3363232673sp+,02Ew| VrE)'>K'ikGb+<3E^E\g6<2u3żOaE5@`Y _Y _Y ?+3?+39/3+310!!3#!!7!#73!g7P_<<_PEf9Z!@  _Y?3?+3?9910!#>32&#"3 WC> .9~Os?2l!@  RY?3?+3?9910!#>32&#"3 )NB@!.BxAVbo /1@ PY PYPY?+3?+9/3+3103#!!7!#73!7!g|*gg- &@   ?3?9?9/993310#.'#''7'37ؾ^Be~!"[Z:E@qvWE@  _Y?/+?39910!#"'73273673G0(:q 2 jW `PWJNhfZf$,@ _Y _Y _Y?+?+93+10"&5463 67#73 #"32>eM:^X *bDrduJ١?rjp6-nhKpmN'(@ PY#PY?+?+?9/9310"&5473267#734&#"32>73lX!h 4νmv_eg:žO`Ejt7,1}|ΈS0XZ)@ `Y _Y_Y?+?+?9+/10"&5$32%3##&#"327}do+4Ә$FihaZ>-G@3_+ WN,@QY PY PY??+?+3?9+10 ##"&5!2%3 &#"327AQ@%R-F*08nrB:W?',Vo+A^ُ;E+@ _Y`Y?+3?9/+9/10+#"'5463!24!#326dZUrgXd8­W['9@ PYRY %PY?+??+3?+993310#"'##>32&#"3>3 # 32[0_:6&# <4}4J|4zmr WMj^s49E&@_Y_Y??99//++310##3!24)!26,R#jā !\ZEk*9Z*1@ (% %%((#_Y( `Y?+?+99//99104>7>54# '6$323 7!"&9/SwOqCWN 9hN|M'b9)XcI5&#9[J!YdN)&AhS`e%qIK'1@%! !!%%PY% PY?+?+99//991074>7>54#"'>3 3267#"&q4bL|W/;1fvjzv&=˼JtYL) -B6z}:%XJDNQT"~EToW@)4!$@Y  RY'$Y?+?+39/9+104632327#"&547#"&732654&#"ooU ^67J?mp BITP/*:K0+5Na~M(._ mb(1 RU'1I8'1I W3T$5@YRYPY?3+3?+3?+310733!!327#"'7326?#"&547 qx7P32&#"!!327#"&547 B3 3/?GP7#73#"&547332673^YxX!U5Yg)h]jMNfmtE_SFY:'1@'!PY!  RY ?3/+?9933?+?1032673>7#73#467##"&547хLZy zMX[X TUp:RU5JAst"h[j1N )r[qx@TI0E%"@ _Y _Y?+?3+310"&547+7!32654&'7!#"'y*,ći[U,-rlz zݞH QpZ@_Y _Y?+??+310"&547332654&#"7632ĸes>B:4FMJ_cW?mh]W Z@  _Y?+3??9102&#"#3?e1n=>/=AqqZ-3E.$H<<W"/@RY  PY?+3?93?+310"'7326?33>7>32&#"oE1$+UL+ gFnYk8H,U-bbW |,.~#5 ~u]>;N\SE:@  _Y aY _Y?+3?9/_^]3+3+310!!7!!!!!7!H]<:a;,*p::@  PY PY PY?+3?9/_^]3+3+310!!7!!!!!7!SLrghiF[VE(@  _Y _Y?+3/+9/9310!7!#".'732>54&+7 t$"}JHK𚙞VE-@_Y`Y _Y/+?9/9+3+310#"3267#"&54$77!!CJ[w2h.zꦖKͽ(Ww:.@PY PY PY?+?+39/93+10!#"3 7#"&54>77![J>R~sU:ٹш"i~ ̯jV:+,@PY+%(PY??+9/93+310#"&54>7>54!7!3267GҺZy=d6$@Xlp=w2e{U^-!3C/?7*w tc;[E3''$4H7?Fha'Z!0@`Y!!aY  `Y ?+?9/93+3+310!654#"'6$323!!!7>7!im%6UN/TI7wwŘbFmNu{RE4@ _Y_Y `Y?+?+39/+9/10#".5732654&+#7!!32>_ qҒYq;DXp~uҬowʜѺsi:1@ PY  PYPY?+?+39/+9104&+#7!!32#"&'7326K}M\2JzkOT|o [rJ ((@%!"!QY &" PY ?+?399+3?10#"&'732654.'.54?#7373KazH )Qq CS#09'CdLŃWQ`n)8('%v`'/s[NWWcP!@ PY   ??9933?+10#336324&# >c:% 杧gaOfLq.ɵsw\G  ??10!3 4rZ?2?310!333r44J1@_Y _Y  ??99//3+33+310!3!!!!#!5!!rrtt:̙`4fD '<@ %""_Y@ H @# &&_Y?3+33?3+29+331073373#+324&+326!7!7!!h~hԦzRU^^5Hy{{HEh1a ';@ @ H "@"!`Y"_Y%_Y?3+3?+?++291073373#+324&+3267!7!!ah~hզzRU^^{{HEh1+Ջ t !-7X@1 2@ H 2@21PY2.5PY.!QY*PY $PY ?+?+??+3+?++299931073373##"4632373#'47'32654#"7!7!!th~hԦ1ZEilL? b!ODu9LHu8{{W?7AO 'K±*+ՋE$@_Y _Y_Y?+??+?+10#3!73267#7!#"'85F[ga)ĦpIEW' F(W/2@S[_Y_Y `Y ?+?+?+3??+10"'73267!7! 3!735cVSYt$'%%WxŎEW W>@S[PYPY PY Y?+3?+??+3?++10"'73267!7!733!73#7!cVSYt$c%%]uWxŎE!7@_Y  _Y????+39933?+310%##33463"'73267#7!~R!\V/[62 *4Q_9)\$(D r-  FW. $?@""!S[" `Y _Y?3?+3?3?99+33?+10%# #33463"'73267#7!73~R3XV/[bXSYt$e%%\z9D r-VwŎW.1@@S[,PY,%)((  PY Y?+3?+??393??++10"'73267#7!73654&#"#>533>324cVSYtl$c%%(-F~z  4XWwŎX9A:S"KC00_dJf/&$ E&+5I[&D:&+5a&, E &+5&g& &+5f&2 E&+5pd&R&+5n&8 E&+5&X!&+5n+&8f &+555j&X&j JS@)@ H)@ H)$&+55++5n+&8f #&+555&X&jv $&+55n+&8e &&+555&X&j $&+55n+&8f #&+555&X&jC $&+55tXNt+&$f &+555I6P&D&j J9@ B@HB@ HB++5u+&$f &+55IAP&D& JI@>@H>@ H>9&+5++5^& &+5R& J!A&+5tZ&?@! ! aY!%$_Y%!%!%_Y_Y?+?+99//9+3+3103##"&54>3 &#"!26?!7!7!7!9"ojX5$lsKD6%QH}8f{* ckXK'4O@#!#PY1PY +PY ''$Y?2+3?+?9/9933+?+910#!## 46323>733##"&'73267!4&#"32>3̀q$BK< h, vdgfabd:ia% Yi]{q[htzt&* E&+5OX&J4&+59&. E &+5  @ ?3?99?9910!#33 #'73373)NAVjhiboE /fUZ&2$pU]N&R'fU^&2&" /&+5pU]R&R&- J!0&+5V&y E5&+5W&S!&+5W&^&+5`E ,@_Y_Y?3+33?3+3310+324&+326!7!7!!юzRU^^5HHEh1E 4@`Y_Y`Y_Y?+3+3?+?+310+324&+3267!7!!юzRU^^HEh1+Ջ #-D@%*'('PY (%+$+PY$ PY PY?+?+???+3?993+310%#"4632373#'47'32654#"7!7!!1ZEilL? b!ODu9LHu8|W?7AO 'K±*+Ջt&* C#&+5OX&JvB8&+5E,@_Y `Y ?+??39/+9/10%32673!"&547!#3!302FW~Fݏ^8zn1n>9s[[:IE61YWZ!@ _Y  ??939?+10#3>324#"614YNjYpa6eXabbK>9&1 B&+5c]&QC&+5 ,Z@ [ *Y_Y@ H  $Y ?3?+99//+_^]3+333++10 #!#&54>32#!&7%34&#"326dKAHQbm>C,F.)81=O:1>LC,S=p?WI:jKIO[ %7)!&8I6CIU@? ((+( ((+%[%%%@S$S4SdStSSPSS@S S1MY101@11@1H1I54&#"'6%&54>322>?7%34&#"326P Z $+!FHWIYǀ D\\twQEFR_pK_pMId/:0>M83?K>2-4.+!*+pLLAzi|m)0]Q+UHO]/-S;r@TM>r[SYCM>Hc %8(!&:&v%&+5&vZE&+5+&v/&+5!&vd1&+5c&$ &+55I6&D D&+55c&$&+5I6&DQE&+59&($ &+55tX&H ,&+559&(z&+5tX&Hf-&+5a&, &+55&& &+55a&,&+5&&p&+5f&2 (&+55p]&R )&+55f&2)&+5p]&Rf*&+59&50 #&+55&U #&+559&5l$&+5&U$&+5n&8 !&+55&X &&+55n&8"&+5&Xf,&+5(9Z&6nn9EK&Vn9E&7n 93T&WnUZ"#@  _Y/?+9/993107$54'7,654&#"'6$32 (+"YouuQqVn)/SmTr8QwRbVjOf\.VCN"$@!  PY??+9/993107$54'7,654&#"'>32Ius=sŸ+(nbt7MO?WQ*4^>|kUQV[!ɐS9&+ E &+5P"+@  @PY?+?99?393103363 #654&#"##'73373V#!! R`|zhiDy7D/7*VU9WZ@ `Y  ??9?+10 654&#"#3632 \jTJ̴ٖWKB2_ZdPFJ_VG#0>V"<Y4@Y#   .PY 'PY?+?+9/99933+??+9910%#"&532373632#"''6?%32654&#"4&#"326DAg{jr _C>mtPX,XiX~*}EKmKVS.2&D#70>MjXhZbMl_[QGwu_ڮvo „q&5:=H3(56A@"aY!,!,`Y!!(aY63`Y?+?3/+9/3+93/+10#"&54>?&54$732>54&'4&#"326'Ըwbl БnX~twcjrunr?MQCWZhgvU]js ^)6,@**QY$#1PY?+?339/+93102>54&'7#"&54>?.5467"32654&^S:7_ɧeu]lX_3^rrOn]zĉjIU@hql's킸xcPq*hakdkxxɮsE"@_Y _Y?+3?+310!7!!2'>54&#!7Sr|>Ajb$u6"$4"4/* p:"@PY PY?+3?+310!7!!2'7654#!7L}v8WZF"'4_cf&$ &+5I6&D<&+59DE&(zvtDXN&HzVf+&2f $&+555p]j&R&j JP@'@H'@ H'@ H'+++5f+&2f )&+55p~&R& JTJ@8@H8@ H8@ H8+++5ff&2  &+5p]&R!&+5f+&2f  &+55p]j&R& J!@#@H#@ H#@ H#+++5Ej&< J! &+5WR&\ J!&+51Vs+@ Y   Y ?+?9/9+10 632#"''674&#"326#HNsl_[QuU&5:=G%VJN-:K)(%'%%8@ Y%PY1@Y??9/993+?+?+92104&#"#>533>32632#"''6764&#"3265=V z  D[icHNHC8S"KC0{8o^fjIdnh`[Su`b[&51:=G+4T':PY@Y    %Y ?+?3?39/99++310632#"''67#733!!4&#"326 HCkrPW,W~ppx6Pm/1&@$5.>Ni`\Ru^CT&5!68G  /;M@# / $##2PY&8PY-Y?+?3+3?3+393333?1032654#"#67##"&546323733632#"'4#"326VL{JjNp?!XU]dyIYaL#XU]dy"VL{JjMoAGТ(CM_BR{¤cТبBXN /;@@"8-8PY-2&2PY#$ //$ &! ???393333+3?3+3104#"326733632#"&'##7##"&5463232654#"VL{JjNp?k!XU]dyNT ^Q#XU]dy"cVL{JjMoAТب;WCMEOG_¤Т( 0@_Y `Y ?3?+9/99+310!!#7#333/!@mSdL)C7.b .I~tEvGX[wb'B@"  !  #_Y _Y?+?+99//9993103&'32!"'#&54>32&#"* xAҧl4hcsAemvIEaA"aAdAl{I*$ ?hW *N@(  RY# #PY$&PY?+.3??+99//9933+3?102354'3267#"'#&54>&#"A?*4Rl&5oZ@kS"*ec<N IWM0jm Kbk&Q6NoE $@ _Y _Y?+?9/3+3103#733!!!ussmW\M@wb#@ _Y ??399+3310 ##!7!7337#xjI`vkEjmm( N{ %iVDK:@@2...**0PY*  @ YPY?++3/?+99//9910#"'327#"&'.'.'73 54.'.54632&# "C@@AJCp8Lz46o3( 'wx,)Jg={vA䳺'E_8uC_ =q;*HRST?WW>(5&!C^C~%0#&DdAVs:3@ PY @ YPY?+3+3?+310%2327#"./.+7!7!&=M96, 5HJCp90H9/z@K18-R#Dq<05K-$'@`Y  `Y??+99//9+10!325!"'6$32Ti0Lۄ2D-Jtwŵܤ-N@  PY ?+?9/10!2654&#"'>32T]gD7Ӽ=]\.E%?@!aY""_Y"" !_Y _Y?+?+99//+93+310)#73! 4!#!!! 4&+326h(@!b" $Q᫰Hx lªsUK`E!*@_Y_Y?+?39/33+33103##"&'4?#733!326?!f5ɸtt2t3+ fjK`|XXBUYfYYEM9  B@!_Y  _Y _Y?3+3?3+39/3+310!#7#!733#3!!!!3#mTTbJ2) EZ3X '-2O@)0&!!PY,$,PY1$$$  * PY ?3+333??399//3+33+33?103267#"'#&54>323"!&#4'318f*E\H4~P_Ko".0( vXN-|Vd|!l/`[iҰ3gA!EZ<E6@ _Y_Y_Y?+?+9/3+39/103##"&=7326?!7!!7!"*YXh#W혱氹 itWU9@S[PYPY Y?+?+9/3+3?+10!!#"&'73267!7!!7!'73Sd$N+|cz?iK&&i"vCtWZ*1@&_Y _Y !_Y?++3?+?99103267#"54?#"&54>3273!27&#"!7?>M %{hY{ n7mvI$5 )4J{[LB"Yv;hpWJ%32@ RY  )PY 0PY?+?+?9933?+10%##"&547!23>73327#"54?4&#"326Lzn '#7(05J "uktuY[eanb`}6Z^AbKl"#5 +6{usr@E+@aY_Y  _Y ?+?39/3+3+10!###73!24)!26Tppyi€5\??pk*~N4@ RY @Y   ??9/933+3?+10&#"!!##73>5'33>32^ke8q^^|} Iu\ia}H](OI:ri3[EE+@ `Y  ??39/9933+333103!#!73'3!737!uqqnhEJHpW: 7@Y  PY?+3?39/933+33103##"'7326?#733!367!!I1$/OJSJ1 1L v1HUUQ+qN+7<@ 1QY ! 11!!PY!,PYQY?+?+?+9/993+10"76323>323267#"&547654&"7>54&!FHSLYǀY_ux6Ȍ Z &8_pæHpIQ"zito%QLQ[k-5+ /'\SY@Np|J&-@  "PY PY?+?+??993310%#"&547!2373#547%32654&#"Eyoy ]dbltX~Z9i_`}6Vb]+ukK~ytTJ[P%+@PY  "PY?+??9933?+10"'##673363 4&#"326M6 )&28_b_lrv\7.![^yxm{sNJ["08@  -PY &PY RY?+3?+?+?9933102&#"363 #"'##67>4&#"326BL 6EAR!286 )_b_lrv\MGw^y7.!őxm{sNdXN'@PYPY?+?+9/9/10"&5732654&#"'>32jvaxxl& zSVh6zjm `YƿkrN#/7@-*PY- PY $PY?+?+99//99+3310"''67&54$3254&#">32'2>54#"p.JjW6("µsnjwvgL~XjoO1cYk;R9\b>Zj[\iV.M0W^^'pW!09@RY ,PY %PY?+?+9933??+310%##"&547!2373327#"54632654&#"EyoyW"7(05JD]dbltX~Z9i_`}6Vbw##5 'aukK~ytTp /9@ +PY$PY RY?+3??+?+9933102&#"#547##"&547!23?32654&#"4CA 6;y Eyoy!:]dbltX~Z9;]+i_`}6Vbw(wukK~ytTgZN(@PY  PY PY?+?+9/9+10732#"&'73267"!654&~82×绦j%Ň*Iy'y-J\ͷҩ2)p}tXN *@PY  PY PY ?+?+9/9+10654&#"'6$32# 4?267! }qf*EP~$CE4XN-|ɽ|l{[i.HN"+B@#RY) QY     &PY PY ?+?+99//9992+3+104#"'>3 7327#"&57#"&5473267[(E[ w&)DaKFO읫]g"UQ-~7?(;|k'Ԙhzvo@xoNfNFN N7S@/5PY+0RY&3RY +& +&&+##PY# PY?+?+9///_^]99+++910#".5?32654&+732>54&#"'>327327#"&'9wORm}_f`ZBmCSVG4ꡉ"25WW]h;dgSByg3,OdukDN/ZC>Oe\DC(4}l7rsiN&5@ PY   $$PY$PY?+?+9/_^]+91032654+732>54&# 4$32#"&2}`ZAoBidN¶˃̈́g.W@BRBvh&#ibn:'@ PY Y ?/+3?3+310%3!!#"&'732>7!72(I% +iqFTʯ  /jdOX(8F@%"$$RY  ,PY4PYPY?+?+9?+9933?+310"&'7327##"&54>323>32&#"4&#"32>b\>&ByQq;!&3 .:Xqg[}X;]kPh6X~KQ;dm}Oiia1 |8a~O[ndV>XvKJmCN*@PY  PY PY?+?+9/9+10!#"&54$3254&#"32?#zRX~ך(^lڃ~w+^CLCUhCW:  Y ?3?+9910%33#"&54>4'326{BD~YXf$6%H1;/4]}IPc\.baNjel$HHM A 8-@(/(RY++4 /Y?+?393+310%4'3262.#"#"&54767.#"'>32?>t''H8-1L}&")#8!.D|X]cz *H ##?P,\JLdc#T<7j5`BDD`\oB.55TECzHaUm(=055[2o\`\iFFlYW}:@ PY?+?393?10%#"&547332673#67 SvSe z۴Pp]u~3!7! #p`$b|*o'% U6`/0rr=0/g}D@#QY  QYPYPY?+3?+9/3+39/+3103#!!7!#"&546;!7!7#"3Y|*YUlv7*54&+7!P N"HpiRʷn˜.vk}S/:0+@0 %,,PY??3+3?3393331032673#?##"&=##"&54733267"'*?t!v  dXD=TWQ'*Ao z:Rp:533>323>32#"'7267654&#"'*?t!v  9yLXD=TWQy?1=FE'*Ao zp:533>32 R`|xL1=FE  Nu 7*VU Ig"KC0{8kb}9F/PW_N+)@$PY$! RY?+3??93?+10327#"547654&#"#>533>32^?. B< R`|z  Nu [)387*VUS"KC0{8kb}9F P}:@  ?3?39910 73#&'#H ҧ :ST}6KAns:p]NN%J@)QY PYPY "PY PY?+?+?+?+9/_^]99+10!!!7#"&546327!!'4&#"32rvGTt~rҌHP LL>7>VIqqK_Y(+?zrlڶ?N+)@"%%PY% PY?+?3+39/91032674.#"326?2#"&'#"&54$! lu~Fi94Np'k}[o3[p~BMe+Ж]ƻkZj۝~}ioW_*@ PY PY??3+3??3+310.5734&'6RPLKPNPW̸3o~dzf`| )3%D#N: @RY ??93?+310732673#&547##"'nmd$cIs_jaC}A0HH:qh5N^ @RY ??93?+310732673#&547##"'nmd$Is_ja}A0HH:qh5NW:0@RY  Y??+3?+39310732673327#"547##"'nmd$c"741>F GDs[jaN##5 ,7kge2jWN @RY ??93?+310&#"#65'33>32^ke#Iu\gd[f|c(OI:ri3WN'+@%RY%!   RY?+3?93?+310&#"327#"54765'33>32^ke$y"76-  Is_ja##5 *5>|c0GI:qh5N @   RY??+3103!2&#"d6Z fg!ag)c/WN@  RY ??+31065!"7632Egi mgWQCN]SOJ: &@  PY PY ?3?+9/+310!#!2##!2654&#Ӥ cHYg:{M=tlAQO:$@ PY PY?+?39/+310%2654#!33#!3,HbHmf-Ҵrn=}b:WEK<<@!5**2PY..*  RYPY?+?+3?_^]+910#"'327#"547732654&'.54$3254&#"Yd;* I4cnT`oA߱ksJStHd;] )4y>G e^5D71=G/Ç}HEZU1?96FJGWw#@  RY Y?+3?+310"'73267>32&#"N497MU!l(!+BL_DW`euGWw4@ PY@ Y  RY?+3?+3?3+31073>32&#"3##"'732>7#"[-!+BL_%N4977F-ޱeGF.XKW!N#@  RYY?+3?+310"&'47654#"7632327x{v vB6 0W~ 358B;Wnu8H B+|sr2@_ 64Vw)5RY'@ Y"Y?+?9/9++310/#".54>32>32&#"3267&#"E9Q#5@v>h;Me@?!l(!+C7J0]]<[E9=K1: +;@&PY  !PY??+?39/_^]933+33310!33##467##"&54?#7326?!ZZZll1 SvkkZ" S://"KC0 )p]u~54&+73232>54'&546;#"":'#&R|LY7<9:unb !i|R15$ͱ$>:!"RH@uFBOlh=ba@k4& BNa?g:v:  ??39103#&/#jŃ 9%c:Du44y>>j:@  ?2?39/993103>3#>7#'#<47 'eI1&-OIp v1S !KD:@ ??399310!33UU{K*Wp:.@PYPYRY?+3?+?+3310327#"54?!7!7!!%(4(F: EL1*# .;&**N\:4PY@Y  PY  ?3+33?9/++310%32!#'7!7!7!%"32654&in-HN18R/wW\L-HdT?s=u&ڷRe7; %W:)@ PY PY?+3?+9/9310!#".5?32>54&+7!i";`ibRK:ǡNy# xlpx{V:!+?@! $&PY $"QY !!PY?+3?+99//93+310!'#"&54>32654&+7!27&#"i";C9>*|aڣYx5SKyuS`k:ʡdJD=}}lPHo^~,iD<6@%@PY   PY??+99//3+10!3254&#"'6$3 Oi2Ds}l*>K)icqŰ ~(@PY  PY??+99//+310!$4$32.#"327K$wkˁC:jy6bjXA(@ PYPY?+3?+9/?10#"&'73254&#"#Om۴vkρD8mjȰdh2>VlN!@PY PY?+?99//+107$324#"327#"&>9ڳؒrK4FGh fZ ,@ SY  Y Y?+?+9/+10#"5$32#"32673͡2ntso?++seW㫶X+PR:D]N&5@ PY   $$PY$PY?+?+9/_^]+9104&#";#"32!"&5467&54>32~xi;@zzԽҠoZCMngFW"|~:bYmj)C@Y )PY  PY %PY?+?+99//9++310!#"&54$32>32&#"54&#"32?#zRX~ך(Ut00!+BD)^lڃ~w+^CLCO{ GMUhCL:W!6@S[PY PY PY?+?+9/3+3?+10!!!#"&546;!26?#"73bPoedVqD %%:$%bXsgN9lj/6'nJ: @     ???3910 73##  Nഴ: b4i:Y?+?10)3!ҴX:[pW-9@*PY  RY #PY?+?+3??+99331023?>32&#"#7##"&5474&#"326}$7&# <4{ƵgLznktuY[eaJZ^d Snb`}6{usr@: 8@ QYPY  PY?+?9///3+3+310!3254&#"'6$32!!#7!R340Es}n&=őU )l`Į n{:@QYPY PY ??+9///+33+310!7!7!7$4$32.#"327!!U$wkˁC:43{ny6bj{ %(@@"((PY PY PY&PY/+3?+?+??993+310!67##"&54632373!!%2654#"%!X]UlqIYaNL{JjzCMBRnՋw(2 W1=L@)..PY.!  % %%PY%#8PY2PY??+?+??+9/993?+91032>54&+7!#67##"&54632373!#"&'2654#">@CF|GQK.:X]UlqIYaNu҆L{JjzTH}ppt}CMBRn]1Ӥ{(S&25=Y@*55PY 6PY3 -PY 'PY 9Y?3+33?+?+??9/9993++310!'7#67##"&54632373!3>32#%2654#" !"3254TxDX]UlqIYaNT;n^N^L{Jjz-T6K"8uCMBRn՟{FNw((pIKh,;,&<4@*PY6 QY 32&#"#"'732>7#"&5473327}qx7 !l( .@L_#N498%7,!t 32'2654&#"P]j|Px/0832!"'7327654&#"####737>32&#"7|T[W:9B ,?l,2Jw zعxx{D0+@J:^PcfJj!o7>1Iz HZa.'@*PY* PY???+99?+10#332654.'.54632&# #"&'# ;)Jg={vA䳺'E`8uCIROZg\(5&!C^C~%0#&DdHo\F=oP #@  PY PY?+3??+31033!!P Ninڋ" >@  ?3??39///9999333310# #333# #333$5|{,z%6|{-z #885#88D+@  RY RY?+?39/+9/310#!#!#!#!x>>^r>>_r?4?eVL#+@#   RYPY?+?+3?93?10%## 547654#"'63232673#%5[(3Figk7LSo|۵FT4x)|zNbS5KBeWL15@)','RY,   RYPY?+?+3?93?+310%## 547654#"'63232673327#"&547%5[(3Figk7LSo| 7?0<R@xFT4x)|zNbS5KBD.C>v{CZ[ +v "%3"" .1?3?393?3310>32#654#"#>32&#" 8qOeeV{U yWQyhV1$+1 bP@ga(L4A(vqU][hjBF}8n_ 02 5?33?3?1073"'732673z}"6$)( z]yy8 `:BFkb-sZ/  .0??39?331032673#7##"'$GrKznt)W="O xWR sZ$/ 40??33?33931032673327#"&54?##"'$GrKzA*1*AU.)U='N x#A p NO#VP .6   0 .?3?39/31033#!32654+LPŏ{;[V05`IxfXEh!0 0 .?333?3?310#'#3?373r.>y# x}v2T 2_; 04?22?39910%"'72673>3H2(4Bf=|M&VQYb _`qZK1/i5M yMya /9/107>733aC8yyY&`Ea /9/10#67#7@;yyY&̒[I| /9/10##&5467|&Y3y#$ !adQZEx~  /104H#726$-#BWb3EK',ULJdUIxf /10"&5463"3BWb2F,#xMJf~UE8'-  ,.??399//331032>54#"'>32E+TnA1s"{Wn0b ^[crn~   ,.??399//33107.54>32&#"32731cq3efoz |TjANH+ F}SBqj YSY^ kNc! vW /3910%# #3WvW /2910%#3 3fHK5 [?+10#'##7%35ih-d [?+10#'73373=hiW /10#3qAqLS Y?+10!7!'; /1073;6 /10'73Ovj( /10#3qAqjLk/310!7!%7j[ /10'73Ojj /1073j;:/?9910#'73; <ҏ ;:dc;: ?210#'; ;:\  /104H#726X-#BWb3E/',ULJdUI\ /10%"&5463"3PBWb2F,#\MJf~UE8'-l/3310%!73733{-q-{l/2310##7#7!{-q-{gl   /9/33310##7#73733{q{{q{ }}l||/310!7!jpR @ Y[?++310"&=332673xUc1sF?z  [?+1073%%  |  @Y@ HY?+3/++10"&54>3274&#"326`oFR_pJP:0>M83?K|WK;r@TM?q> %8(!&:Uu &Y?+/10"&54673327[Ys\SnN7ACUMBP1+3232673*LHE#%0o*{W,MGC!(2pA\%-%/Ho%-%7@aa6 @ [ ?3+310?3!?3 6 e @   /233310327#"&=7&34WTk]R D<(4nZ-_ /10''%'7%iG,i*GXXXXP 40?3?391033#"&5472654'5~v9r [SBPMK!8XofD`mRCUe5-7FP@W2.??103zC%$@ 1 /?3?399//9910#"&'732654.'.54632&#"~d[Vae9`xd oS\@t[S1q}XS(9>F@,!!&gFfoi83*7%9N.0tX /3/10!#!5!XFtX//9/310!#!5!3XNbtX//9/310!#!5!3XNtX//9/310!#!5!3XNWtX //310)5!3XNEsZp //310)3!ZnypsZp//9/310!#3!ZnnytpzWo/2210#37je/3210!7!!7!Np?pvvz /329/310#67#7!#67#7@;yyY&@;yyY&̒[IÒ[I ?3210#373Rrr?rw?3210#'#3wr?rR-Vw/10'7wr``rR VV/10?'7VRr``rW   /3210#"&546324&#"326]F`_Faa0'8G0(4JW]FT[Q%-F0%/EB /1073{yB /221073!73/yGyB /221073373M1l2x  /3210".#"#>3232734*LF@7B[)V,ME>f&\"B[l%-%>9%-%wjf<@ [@[/++107373((((| /210!#!)AQP;| /210!#7!SA)W /210!3!ujA)WPW /210!73!)Aj1Wd/3210!3!73#A''WP/XA /2103!!p'iYȇX /9/310!#73!Vp p # /10'73NO Y # /1073 5  /3210#'##73ih31  /2210".#"#>32326736*LHE#$/o*{W,MGC!(2pA\%-%-Jo%-%7@aa6tS/310!7!%s#5/2107!s# /2210"&'7332673riVJKpi(q=GH5,&HJ _kid pN5c}H` 2x#{b   /3210#"&546324&#"326{]F`_Faa0'8G0(4JW]FT[Q%-F0%/E> /221073373j /3210#73373̶hi@ /10#3qAqL_/3210#3#3AqAqqAqLL* /2210%73!%73ϭGϭd@ /299//310"&'7332673#7riVJKpi(7!!q=GHriVICvi(q=GACy /9/107>733 !?:{yX+ZI| /9/10#67#7!?6{xX*̨kC}! /9/10##&5467+X2{") !_fMW"L[| /9/10'67#73yp%^)!oG*ѥi /10'73kOij /1073j_*/9/310#7#7373oo_sqr_3/9/31033##ooKrqsHU /210#!7!=9 /9/10#67#7@;yyY&̒[I W /10"&5463"3\BWb2F,#WMJf~UE8'-W /2310!73733 {-q-{WlW:/3310##7#7!%{-q-{glW$   /9/33310##7#73733{q{{q{}}l||&c/310!7!p֍XWf /2107!"'7327f7:5P .Ex4tW  /2107327#"547g4aF4 U6 7])3M: /1073M%%-W~[/3+31073!73I$$$$WW5   /3210#"&546324&#"3265]F`_Faa0'8G0(4JW]FT[Q%-F0%/E9  310#67#73urX C9eYjWuD /29/310!"'73254+739 0%vek;QPbeCdDU /210"&54673327[Xs[Ro)&6ACUREO.*C!'kW/10#3yDW^W /3210#7!#!''AWP}@   /32992310#"&'4733267332673#"& WDGM aG7O\*7.:au^9J&5QM%*$PJE%=ANl+,W[ /3210#'73373V̲hiWW[  /3210#'##7%3ihlWrv /3210"&'7332673riVJKpi(rq=GHriVICvi(q=GACyWc  /3210".#"#>323273*LF@7B[)V,ME>f&\"B[W%-%>9%-%wjf<E;/310!7!j%i/3107!i W/3210!7!!7!p?pvv`a  /22107".#"#>323273c*LF@7B[)V,ME>f&\"B[%-%>9%-%wjf<mG/310!7!+B{</310!7!$W}E//10 'EPQbav//10 #+ N  /104H#726-#BWb3E',ULJdUIW /3210!3!73A''WPWI /3210!!7#Ix%%Wx纺@  /3332210&#"#654#"#>32>32ZK7J \]KblNq&&X8NKJJEaJNZ[0+XHr% @   /32993310''7'77_gjFjgjFUSUS lE /107654'&5467 oq96 2blMS>>'L\ L +//3,/N1p R0/22107!%7!p| fffffq /10#7Ux   /10#7x  $@   /99//3310".#"#>323273*A:;%/=e$X,C<<$\#f,%49~%mx /9/10#67#7@;yyY&̒[I1   /339/310#773!73mus!!|!! 쬬W  /210327#"54?3_%!,(up i}A"/3210#7!#!''APQWm~/32107!7!vjjjjWF /3210#3#3DDW^^WQ /310!#7!A)Yu)@  /9////93310&#"#>3273273#"''D$c+[)V>FRVR%f'\"B[?;GSVz0l6lzjf<1m72b1(@    /9////3310".#"#>32327373738+KD?7<h&~V,LC=a$jA[!!S!!7 '!53|p!'!i[\5լ#U0-@,$ ! ) ) )$/2299//3310".#"#>323273".#"#>3232673)+KD?7<h&~V,LC=a$jA[ +KC?7=h+zU,LC>6=jA[ '!53|p!'!i[\5 '!53j!'!72[\5VWx  /329/3107#'737xsvvW$/33107#7#.v͕|.W %-5=EKQYaiqy<@HrvjnFRV6:.zz2~bbfZZ^>>"B&*MM*B^f~v LI O OLL |Pdh\`@D(tt,x ll$pTTXI88<04xpXI<44557449 885667775558849*557sNsmmI}4!/10?'74xRr``r8x /10"&5463"3BWb2F,#xMJf~UE8'-@    /299//3102#.#"#>73riVICvi(8""q=GACyOwB_ @   /32993310''7'77+gjFjgjFUSUSV#/10'7#r``rRV/10?'7Rr``r,V @   /9///9310?'7#'#3r?rRRr``rx  /104H#726-#BWb3EK',ULJdUIFe  /104632#"&G,#,G,#,+C/!+C/V)/107''7'773p EK2g:v({S3K%z)~)y%L5"W+!@# )) /3223333310#"'#"&5463263232654&#"4&#"326\X&@ZBV\Y%?[CU1&1M/&5K1&2K.&5KW{IIRBW{HHRu*+I1%3D*+J0%3Dgq4/9/310#7!3qqcqcW /2210! 33 7ҤE36svQ2 /3210! 33 7QҤE32svK/310!7!2JU/310!7!JF@  /99//3310#"%.#"#>32327FMχI_/G|YdžZV-(S]),V 6  /2210&$#"#! Ev3//ÂvvsW6/9/3107!7!76lvbh0.2?3??10733^zُzyybaqrwz 1/?3?3991027#"&54>32.#"9jR߃Z}p yCCVi;A#䜉}vk?O^kg!2 .1?3?393?10>32#654#"#3.8qOeeV{U yWQyz3 bP@ga(L4A(vqU!YoI0 .1 0?3?33?310&#"#733>32$ItKznt.T;" qsI^K ~vzht 0.?3?39910#33N¿9r(wx /1073x W.x /10#7.W`TNpdNR@R[`p @HPY PY?+?+9///_^]+^]+104$3254&#"3267#"&73p#ójvl&5!!9Xijm _VN@@'R[o PY PY?+?+9///_^]]+10#"&57324&#"'>3273Vxzl&z!!* jm ^[QD:[ [?+1073[!$%>A "@  Y  [?+2+31073?3!73}ٙ$$$$!o%cF&$8P?5 [/+103::+-7F&(a8P?5^E 8@_Y  @ [  ?2?3+39/3+310!!#3!3 73FyXynn^oE6!$%_F&,8P?5-Z&2F8P?5^LE$  @[  ??39/33/+10!#33 73rɃk HY!$%Z'-0*- @[* _Y _Y?+?3+333?+1026;!7>54&#"!732&4>73.=vlc,1,zStw{k,1/\[ZjԬ@ N#y”߇ 'x!$%1A&j9 &+555cE$9E%wE@ _Y?2?+10!#!!6{DEtE 3 @ H  _Y?+333?33+_^]10#73!&']GQ24N s9E(E=9E+fZ >@( _Y ?    _Y_Y?+?+9/_^]q+10"&54632 #"32>!7cbD舿sduJ٠~ ݛ-lhK%aE,9E.YE @  ?2?3310!#&'#3Yɏ 3XJqzEE09E1E &@ _Y _Y_Y?+?+9/+107!7!!7mcWfZ2:E@_Y?2?3+3103!#!:EW9E3E *@_Y  _Y?+3?933+31037 7!!!Tym%ݡa|E7EE<O",7@'`Y&'( (`Y ' ' ?3?399//3+333+310%##7#"&54$;73324&+32>;#")**)Ҙ!!Ԝ{ Vh8| v_ձêڨSzyHEuwrE;j9E@`Y??339/3+310!#"&5473;332673+M:TUml33"UT.:MJPKF54&#"!732.54>u.,Vo,-rrtaZ[ QΏ Wra&,j6 &+55E&<jF &+55h&b8<-&+5xo&f8P.&+5PWJ&h8P$&+5 &j8&+5}_A&v9 &+555hN')@ $PY  PY?+?993+??10%#"&547!23673#&5%326?#";p{(N>#[ax?z\`{6}i]vjTfsiCdW.2@+*+*PY++ PY #PY?+?3?+9/+910"'##6$324&#"32>54>1t :.⭮Ccye^ 5SjZwS^ia܋W}%tMS*2[Zsy \X:  ?2/?3310>3#67h QqT?n:o5/W #$@ #"#PY" PY?+?9+3104.'32>'#"&54%7!$4CxscpZH(W/(1DtaWMںys{m~Ls]İ]`HxoN(E@*PY "#"#PYp@" ""PY?+?9/_^]9q9]+9+10%267!"&54>75.54>32.#"3"lOVº[X[ky⎔/!igrULdy^Z lP\VVcXGDiTJH3lP#$ PYY   ??9/++310'>54&'.547#!7!TffmnCN8s&.{THV2"V>Q&6O:533>3  W\|z  DW`:(XRS"KC0{8_n9F9@ QY/? QYPY?+?+9/_^]3+310"&547!2 '2!"!654&"Ѷd|?>#\ᆰҧ8ў #ks :PYY?+?+10327#"&547!7!YBBm{Fs  E?jxxy7IO -: /@  Y ?+?33399_^]]10'.#"'>32#&'#!32 3 j!LZ;;_dc`& :AF8Wb:" @PY! ??3?333+310332673327#"57##"&' % X_z F/Ce^WR@%YWs-*4)&~: ?3?310!#3654'37Ƚ:`A87? 4@@ 4QY+@ Y++ $  PY ?+3?99//_^]++910.57>?#7!'>54&'.546$7^Ԙ`bk`8K;s&/o|L), rc.i!pP\w^?S#3J7?H8)X/>6CW7pp]NRE :#!@!PY! PY ?+??+3310327#"&547! #6"7>3!$("%PC^U Fv?*YM7Mi6^(. HQ(6J_- W_O%@ PY PY?2+?3?+910"&'##6324&# 3262m2S/'ַR~uL=+Xi^CL{WowFMhN"&@ Y!PY ??+9/9+10"'>54&'.54>32&SuL}e;s"2cGadYZEVl7)8M8s8%[(>*,U{Ymr}H6:!@ PYPY?+?+3310"&547)#'4'#"3264f/05Yq={aǶC` #@aǨRi:@PY PY?+3?+10"7>3!!327#"&547Si6g9Px4ld  T-Z RU#-}_:@  PY?+?310"&547332654'3 ߄a"!FBc1)̡Povy!WR'1@# !!QY $QY?2?3+3?39+3910#.5467>324&#" $6PĆP_6q'ʓ{Q997rDVWƷLeaDزxdm {XP @ PY ?3?+?910%#.#"'6323 #8v{&J2 ADYg7ii9WkpmG2W< @ PY  ??3+3?3?10%>73#.54733a#}}0OO³}}swr|kGZzA>jWO/.@((PY,, " PY! ?3+3?39/9+31032654&'7#"&'##"&54>7326?3<7=jNDA9tuuai1cjtHfZU]L~114\g9zmҨȍ~zߏN {&jj &+55}_{&vj  &+55p]&R8<#&+5}_&v8&+5&z8-5&+5e(19@ &PY0PY  ,PY QY ?+?+99//_^]9++10>32#"&5$32#"&32654&#"4&#"32.8 Giͥ5ލdmcwpvpyTLrf*[fQZIqeZG0OnvƮmr/3OF/:@@Y"0"PY.000))5QY)PY?+?+99//3+3+310## 54>54#"76323267,54>323654&#"a+"*"03htPPU#*#C=g#t|a[Yu4aXL ,16PF.YWU+5;:u__r]UuxjpZ@   _Y?+??993102.#"#3 >>X6t.&+=>qqw@Z&5#,#HPV&@   _Y?+???993102.#"#3 >73>X6t.&+=>qqw@OZ&5#,#HPV 5f& F ?55pW`9:.2@$$PY (( PY?+33?39/93+310!##"&5##"&547#2>54'!32673}},k}da2ksvhu|Iu@#dnoHpEE4:w̭-ǃeԭaXCR]W>00)@Y) %RY  RY ??+?99?+?+10 !4&#"'632!327#"'7326?.54>7>.):FK7e( .)*46:?A)47EHL6c-jDJT8QCK DQd l`V?fWZ@@_Y`Y?+?+10.5$32#"326LP2PntsoW,cW㫶XpW^N @PYQY ?3+?+?10.5! 4&#"3 MOC!OnuWϸGyk eYZ%@_Y    _Y?+?99//9+10.54$3 .#"327#.QBh㋉82Wе8Av~萄 AAWdN*/@ &&" ")@ Y" PY ?+?+99//99104&'.54$3254&#"!"&'73 WU´iu1WxHzj:e2!qG)b1;Yx/VhM[78WD+YE '@ _Y  _Y ?+?9/+9/10!#7!#!`H(i{ENX: * @ Y  PY ?+?9/+9/10!!#7!#!h7+A$s%_R'/@!&''! !_Y! _Y ?+?+99//99910 327#"&547'654#"'632,{W0+>CTfoULXM =ESe@FNbOCHwuU;jj 7tva @ RY??9/+10!#!73!g  11YZ!@ _Y?+?9/910'>7'74''.#"'>32gG٤m .%%0jbf^t@{2y|?`M|xgfvm}V@  ??9331065''%&''%%7#=M\\z*1`+Ž-A}t6expUXE/0@-..  '(`Y'_Y?3+3?+?3399310"'#"&547332673323#!7!26?#0Mwk/:I[+58'}ʘ?& [L[|Khgb[U6MAh3X:24@!2 '.!.PY!PY?+?3+3?3399331032673#!7!26?##"&=##"&54733267"(*?t!v+_XD=TWQ(*Ao z:Rp9<0_ً__jZ[fLpRp9<0sZ @_Y_Y  ??9/+?+10&#"32673##"&54632/D{mgWEhvՆG`&4˱oy4&V'&Z$@PY RY ??+9/+?10!#"&546!2&#"32673 lJÇvH< 6=u3enb)[Pw|.iRE4SIXSE"@ _Y_Y??+?9/9+1032>54&#"#3>32#!ɲZ2sjciEc+_ZPE3%s+7=@Y%3PY"%%% PY ,PY?+?+?99//9++10267!".#"#>3232>54'#"&54>"327.p;9jW6AHbF7CDp;UUUVt^smt~scG?8eOPER\k;b#KDb922wU4`d^ZbS,M1+-"&/Z11@ /) ))//#_Y/ `Y?+?+99//99104>7>54# '6$3232654'7#"&//SwOqCWN 9hN|M )XcI5&#9[J!YdN)&AhS_f=,8@L䀣9Z,/@ $Y'Y?+?+9/9910"&54>7>54&# '6$323267/SwOqCxWN 7iN|My~XcI5&#9[JUW!YeP(&AhS`e'"JYI!$0@ ""_Y_Y$ ?293+3+99102.#"!7.#"'6327>!YP}!)':B *(?K*W^c"l:?|d=-#1*/%S0c`nhf HaA$8 @Y! Y?+99?393+31032'&#"!7.#"'>327>ML}&~/ 1#=S,RJLbaZ:`\o3b^m35&b3o\`vmnuXtE(@`Y _Y aY?+?+9/9+10# $3!!"6324&#"3 t߾_2Nyi&}ͦEǕ:m̉~qN#*@ !PY!! @ Y PY?+?+9/+10#"&5%6332654&#"7632>~٫r8}pJ;0xdАx@}ɏXV E(@   _Y  ??9/3+39/310'654+##"'46;733 ""hh`--b b;"J&gC.=@  PY ??3+3?10!%73!#!#!{eg8Pe8Cd= d>'#@ RY  RY ??+?99?+10 !4&#"'632!327#"&54>7>.):FK7e( .);FK`e5e+jDJT8QCKomS=1WkN*+@RY  (PY "PY?+?+9?9/+107!2!"&'32#.#"&4&#"321WUp/Q~A K|k|nuIMN8.fr3@H3 R錌thNFWMZn:.@PY  PYPY?+?+9/_^]+10)"&54$3!!"!!3!–& Wʿ<=3U-_:.@PY  PY PY?+?+9/_^]+107!267!7!654#!7!2#!Hٍ  &ܿŕ'60±9EW\tZ&E @  ?3?39/99310!# #330I$pEW:@  ????399310!67##3673d%*n"ߚ%L 4KEUG&\LW^O&4@PY PY $PY?+?9/3+3?+910#"&'#!!#7#736324&#"32^k3 !> zz0ѯ̿wk})>,XɯBMO˗FM2ZHtZ&&@@H@ H@ H+++52Z&HK@@H@ H@ H+++59&(C&+59]&(j@ &+55E&A@_Y_Y_Y H?2/++??+39/3+310"&'7326?654&#"#!7!!>32Nt{6-,P' CKrЍ7?4 ,"P>r33fn>#F@2*%~z4Aଽw&Ev &+5tZB@(`Y _YO _Y0@P ?3/]+?3/_^]+9/+10!267!"&54>3 .#"!H  gPhOBd6a]@ÏA|Aw}(Z6aE,a]&,j- &+55wE-E'B@)"`Y`Y aY#`Y?+?+?+9/_^]+10!## #"'732>!324&+32>p]}w38@?Sfop*D|\K1`9FuDT} 8yWMT`TE$@ `Y  `Y ?2?39/3+3+1032#!!#3!4&+32>yp\D|\{{pIp*\Kc`kFuDEWMyE@T`TE,@_Y  _Y  ?2?+39/3+310!654&#"#!7!!>32cj CKrЍ7?4 n!>#F@2*%~z4A? &v&+59& B&+5S&0&+53WE %@_Y ??33+3?310!3!3!PSSWE[WcE$9E &@_Y_Y_Y?+?+9/+10)!!!24)!2676F)PBی\3Efy(p|9E%wEEMhE&@ _Y   _Y?33?+33?+10%3#!#367!!!lOOlwpR\zM_h.pEs9E(`E9@ `Y  ?2?39/3+3993310!&'#&'33>73#v9(2mILCuuHs;߭4S|Zv_ @^~cf[de(VG0yY+I@*$`Y _Y_Y@P?2/]+?+3/_^]9/+910"&'732>54&+732654&# '6$321%paGGsg)ȼQl}XMMV`YyQ[=VmeUJ9E @  ?2?310333#679,+Erlo9&&+5? E)@ _Y  ?2?39/+99103273###ErD2_;ngNvE{R9X'!&E @_Y _Y?+?+3?10! #"'732>7!#!ms:$=XXoE I!E09E+fZ29E@ _Y?3?+10!!#![E9E3tZ&E7SE@  _Y?+?39310"&'732>73 3>}*mPJ4KV$k%!;&Y;OWE;WE @  _Y??+3?310%#!3!3mrS} E[[E@_Y??3?9/]+10# 47332673#g? mj9# /44#!E @ `Y?+3?3310#3!3!3EGGWE-@  `Y?2?3+3?310!3!3!33SnWEGGGoE &@_Y _Y  _Y ?+?+9/+1032#!!7!4&+32676=یm\uyx\V(t|E '@`Y`Y?33+?3339/+103#3324!#326763p>PE`ME]G}}[E9E @_Y_Y?+?39/+10)3!24)!2676FnBی\3Eʜy(p|2ZP@1`Y  _Y P   _   _Y ?+3/_^]?3/^]+9/_^]+107!654&#"'!  # 73267 |e=RfP9Ҫ6aPLtAOEtAZ"6@`Y `Y    `Y?+?3?39/_^]+?+10"&547##333  4&#"326vsF[HKdkdlhE44|dyu)E,@   _Y _Y  ?2?+9/+3310#.54>3!##3!! 5p"Ӂ}[+Uy|o?]_I6ND((@PY&!!"RY! PY?+?+9/9+104&#"32>2!"&546767 >ktdc9puga6glP.CvqKXxvIPj̘$!6b|PR:&-@QYPYPY?+?+9/+9102#!!2>54&#!!2>54&#𰲏in@lPkD#nzX?gw3[i:ljn dSGh6:K3#]78f/E+XX&PY[1ڹ A]`iUl[8 >aj+  NFN(5@!  PYPYPY?+?+9/99+910"&'73 ?4𑯎#"'>32  #ۂ2XWm}y,UOP[jbHHynO{R  zX^_P~: @     ?3?399103#67#s;Ҭ\:eP:P&&+5q:-@ PY/  ?2?39/]+991032673###C\nfaU$w1\:&Yt n5&:#@PY PY?2?+?3+310!! #"'7326!vfxU1*)6b}BژD 9 ::@   @ H @ H  ?3+?3+3910!>7##3673e! *mL 2ND*+G,:je5.L: +@QY/  ?2?39/]3+310!3#!#YYҴ``:6:p]NRL:@PY?3?3+310#!#Ҵ:T:W\PSpdNF:@ PY?2+3?310!!#!vv:TW:\5W"/@  PY PY?2?3+3?3+3?310#.54>73%4'>PRۋJJvO݊դ}YҤ|WWʷyp {u  N:[Gh|: )@ QY  ?2?3?3+310!33#!͹hO:II:f: @PY ` ?2?9/]+103273##"&547NYRtcҴ[|yP:n&>>4[qf#.: $@ QY ?2+3?310#3!3!3Ҡ:IIh:. @  QY?2+3?3?310#333333# ҠhO:IIIM[: (@ QY  PY QY?+?+39/+10 #!!7! 32>54&+lB|sgY`f?hspMh868tCE@: '@ QY   QY?33+?3339/+10 #!3 32>54&+3lB|sҤY`a{>dmOҤpMh8:68tCE@ :c: @ QY   QY?+?39/+10 #!3 32>54&+lB|sAҴY`f?hspMh8:68tCE@QNN$2@PYQY  PY?+?9/_^]99++10".54?3267!7!654&#"'6$32v`l-~w|v!;[S\  ch:.}wi[ɻjN$6@ PYQY  !PY?+?9/_^]++?3?31036$32#"&547##332654&#">Mn`ҤOK[UOCaSpï~pET:qv?{t}d: 6@ QY QY  ?3?+9/_^]3+3310 #&5463!##";;lҴYacA^j6,6qGCCtX&HC&&+5tX{&Hj (&+55PWC)C@&)&QY) PY % @ H) ) %PY??+?99//+9+3+3103!!363 #"'7267654&#"##73p+ +! xL1=FD W\|t̝CV9Aǘ Jf:(XR&v &+5}N"0@PY QY   PY?+?9/_^]99++10254&#"!!3267#"&54>tv.~ oq%zSNWg<4xoh _ZƿknEKV&L&M{&j) &+55WM:"8@"QY  QYPYQY?+?+?+9/_^]+10 +##"'732>7! 32?4+,Xoҏϻ~=kw^-%%/BC8Yb3'4pjcE` D62:(@QYQY/?2?39/]3+3+10!33 +!#32?4&+_YKYY6lB|sbb6'gr7:66Mh8 :;1FHPC 6@ PY QY  @ H ??399//+93+3+103!!363 #654&#"##73p+ +! W\|t̝CV9AM:(XRq&vj&+5P~&C&+5W&\&+5LW:  @ QY/+3?3?1033!3!#LҴSS:IW:Z26@ ("(_Y &&""00_Y?3+3?39/993+31033254&#"'632#"'#"&5432&#" 3277NTLZ1*,+K]|bkہ6ugn܃?Ni.6eY9/+TPn2Vr:6;W2l}U:@   ?3?339/99310 # #334' c#ӪY+.< :8\x:nnS^39E3@ `Y _Y  _Y ?+?9/+9/3+310!2#!#7373!!4)!26Bߋ''5\3r̓ʿ(c/@QYPYQY?+?3+3?9/+10!3!!!2#!!32654+~-NN*7:B:o剀{|Z&@@! _Y$!_Y _Y ?+?+??9/3+39/9/1032>7#"&547##33! .#"!O\]3WTHq݆vr'TO{9Fa\y2d{8˩_pEb>kN'H@&QY  PY "PY"?+?+??9/_^]3+39/9/10#33>3274#"!!3267#"&547^Ҥ[;i,N Mz!0ᓘ :+RCgm DKYE #@_Y   ?33?9/9+310!#####3!'&'YUgg}ƃN.zE# ERV`: #@PY   ?33?9/9+310!#####3.'H{HHtB8;spp:vwdE,@  _Y   ?333??9/93+3310!#######333!'d2_gg[gIpJ{Ej A5^Y:3@ QY ?333?399//93+3310 3#######3!-ƥ)THHQHҤqnBppq:E *@ `Y _Y?+?339/33+310#654&'##7>7! !]48{zzW&)(+xŘr4ohZrHx@:,@  PYPY?33?+9/33+310!#654&'#"#7>7!!A zTT($udODj^QFFjSmi~E#&3@  _Y$ ""&_Y"?+?3?9/33+3310#654&'##7>7##3!!#tiG@BPzz>S<+F(=(xpyc/vy+nHo#LGr)Tͧ:E?:"%3@!!PY%$PY?+?3?9/33+3310#3!!#654&'#"#7>7##;Ҵdnun/FOTT9L6'*XCTI1:kr*737>32&#"32>32#74&#"#"&54>7>GG~rRvc)T6Q N |GӰp=:pjb-LW(\sCtX^1ja[a=SC8M>v'pqoH#:.Z!ZQ!"sf`N0LuW]SoCL@Y/ PY(@YQ$QY @PY?+_^]+?+9////9993+9+104>7>54𑯎&#"'6737>32&#"32>32#74#"#"&Uw@SQZJyd)T6Q N `hQPf~7dpc3:bZT-JS>J^rDj\wF3XHRVedzUL}N y\RzU=$:+^$VR4#{9E@`Y??339/3+310!".'33332673+Mn:#AP3$UT.:M)fųKG0ǴOsxW:@  PY ?3+3??3310%>73#.533>$zy1OOgq454wrkJ7lc*fZ//@ _Y*_Y * *&_Y_Y?+?+99//++10"&54632 3267#".#"%2765# 632eb玽80#<_UU2JA9+(pCA1^6:S١ݛ +5+w xZ-l"$& p]N//@ PY+PY + +'PYPY?+?+99//++10"&54732"3267#".%27654&# 63273TED ߓ-N74PFD,@B mv_@A2IDHžO`j9#EH !)! <0}|!(!O@ _Y ??9?+10!#3?>32&#"dő -[O5G<\+w!-6$EzCfm]+5q.8F(N@   RY?+??9102&#"#37>e<\+w!-6$f߷e j5N+5q.8F:@l m_ '@ @ _Y ??9?+2210!#3?632&#"%73!%73dɑ /]Ob<\+w!-6$ϭGϭEzKf+5q.8Fx(!'@  @RY?+22??9102&#"#37>'%73!%73e<\+w!-6$f߷e n5HϭGϭN+5q.8F:@Dt5 m_cW2W-,@  #aY`Y*aY?+?+?+?9310"'732>733#"&56324&#"3264$!"?EM>&=hHlܕi^kؔgf&&XD%#[DW *b5/Ar]eu_W2N *0@%&#PY QY QY?+?+?+3?3910#"46324&#"32"'732>733|mmі(*Qt7''|4$!"?EM>&=hWmbOeRb *b5f.,@ _Y+(&&_Y ?33+33?33+3310#"&'.57>324'#"&'632>a56Kt^33I}~Y[01HW|BYEb0FSIr(H-87,%YA*44*&E'//'5KR/&2()),@PY%"''PY?33+33?33+3310%632#"'.7>32$4'#"')@d3= S3`V65> BV5d,td7,Ұ,7`Ӷ 0<:.E".:f#F4?S<@S@@J?J?FM;@1_Y*$$_Y ?3+3/3+3/399//3310>32 #"'#"&532.#"326732654&#"#67#7"&'.#"#>323&H1oxCl1=T 04aR:ND9x-X:bk)'91jdN+JJOg7](7چ=tROyAW""mm" UTGFUy@y0)(<`I49=0mp0:91 %0D@@!D11;,;00;,7> RY"PY ?3+3?39+?39///33104H#"'#"&54$3"3267326#67#7"&'.#"#>323dqrԉUvz¹~;(k:TF1jeN*JJOg7](9څ=tRQw@}SST;,-:y0)(32r '9!*6V@[ '8!,5Z653,8K662(;MB /29/310654#"+73267632xV!I+Ok0fi4^.kE T&+ .$+.I /9/10##&5467%Y+w#̺MO>H2I /9/10#67#710waY$̒Kl:han; /3210"&'.#"#6$323gUbGu.=B}ocX>67=0mp+?91% '1;EOh@5F#K>C HH%M2 7 449(-**/KCM79-//-97MCKA</3/39////////33333333333333333333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EOb@4 @C-//(#%%OM7:2:  CE(9M:JJ:M9(EC //9////////////3333333310#65#5546733#"&'5353%32&##&'''.'77'67'77>7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96m9f!,@@ _Y?+3?39922103333##67 ".573326739,Ҭl'kKT\ik;Erhl{-YM1@8HMP-@@  RY ?+??399221033##67#%"&54733273s,ųy\Ǘ2I:^eg(7P:vx$%.9E3@`Y  _Y _Y?+?9/+9/3+310#!#73733#!24)!26ž((*B\3ъr͓֤(a3@QYQYQY?+?9/+9/3+310733#!2#!#732654&+^##wwj ?zJhswlnxIE9E3@_Y   _Y  ??+9/9933+10'#!#!24!#327'76^~_dgwVVN8`FE-valUW\P.>@"),+,)PY 'PY?+?9??+9333310%'#"'##6733>3 4&#"327'76NuK`w0_ F|4kQYiac32#"&'73265#"#!!FGŦhcp?S{Dr&(M酙_Hl6"-)E9W:/@PYPY PY?+?9?+9/9+10%#"&'732654&#"#!!632jeʖtlPaSMzt߿盌 WHӃ c:t#h`E%9@`Y!aY @_Y ?3?33?+99//9++10!.'#&'33>733##v S4nIMBuuHq=߭4SGnO|Sv_A]~cf[bg(VGyh,:%C@ !$@Y   QY  ?3?33?+9/9+333310!.'#&'33>?33##]; %,f.F+XX1kWò[1KhO F]`7^El\8]kj+#  WY5E@$#`Y)))`Y)_Y13.3aY.?+3?+?+9/99+910'.'732654&+732654&# '6$32#"'7326/%ԭGGtb$Ҽֳ{rNSVRQS@Md_}T`='kC"#`NWEN4F@% PY4 44PY4.0+0QY+PY??+?+3?+9/99+910"&'7!2654𑯎#"'>32#"'73265'~2°YRmŮgNPNRKy,q`S]h_GIzsL{O [g!"aoC?hE,@_Y _Y?2?+9/9+?1032733####ErD2_;onO*r%vE{R9X' qh:,@PY QY?2?+9/9+?10326733####C\nfdRNhO")u.\:&Yt p31&?E5@_Y ?2?39///992+33103273673####Er68TsF?3###!\.C\Süt,ȶE\:&%_g#9hE(@_Y  _Y?+??39/+10!!#3!33#yyn nnOoE6[Lh:0@  QY   QY ?+??39/_^]+10!33##!#YYyhO``:6I:jE $@_Y  _Y ?+?3?9/+10!!#3!!#y(ynnoE6W%6: ,@ QY    PY?+?3?9/_^]+10!!!#!#YYڷ`O`:6ʋQ:WE"2@_Y!_Y _Y ?2+9?+9/9+10#!632#"732>54#"#!c[b^kq4;D~W.a3-8E-N-PWz5*)WW^;: @Y PYY?2?+9/9+?+910#!632#"732>54#"#!cmWdvy4;SyCoV\K;:PWz>aSZ,93@"-_Y4"" _Y *_Y?3+3?+9/9+.310%#"&'# $32&#"327.54632327"654&Ze=W*v[$zJi0Ist%R15qsbo"1AJ6`? gu&(<76";t4v,X{X/w>[cpPL*7:5!.@Y5!!  PY (QY?3+3?+39/9+310%#"'#"&54632&#"37.54>32274&#"68Pk[JX|ӎR;Y&+XeyF!'_b]jvq/B:g$+I/Ng#7%%G퉔1W􏜉e'FPhTF~"GsWZ%5@"_Y aY `Y?+?+3?+99//10!2#"'7326='&5$3 .#"; ҧsLSURQʡ7OBfpA+\"#`p" AqpWdN)6@' ""QYQY PY?+?+99//?+3?104$3254&#"3267#"'732654'.p#ójvl&-fNPORJ9Xijm K!"`l5hE !@ _Y _Y?+?+3103##!7!DɌnOE4h: !@  PY QY ?+?+310!!3##!vtiOv:EE<W:@  ??3?3910#3>73SʅNcW:L1)$wFE!@_Y  ??39/33+310!!#!7!3 3K<drrf:HecFW:!@ PY??3+3?3910)!#!7!3673S>88>˅B3Ɋ:L1VhE#@    _Y ?+??3910 3 3## # 3nO5eD|=h:)@   QY??3?+993310 # 333##Pg | dhO'D,[UWE(@  _Y  _Y?+3?+3?10%#!!7!!!3mrS[Vh:(@ PY QY ?+3?+3?10!!!33#!!qĹhO:IhE#@_Y _Y ?3?+9/+10#"&547332%33##g;Ώ njVosoP#l-54' D\1[hg:#@PY QY?+?39/+10!#"&5473326733#[c PNWSH?diO[R%,n<>"IE+@_Y  ?3?9///9+310#7#"&5473;3673#gm/{-Ώ njVoa{_fl-54' D\ g:-@PY ??39///9+331033673##7#"&547N;p9s[dӴ[ji*p&%/c P:nz0(R%,9E@ _Y ?3?9/9+10>32#654&#"#3AΏ njVo9g#m,4 ' D\*EPIKZ$-<@$$ _Y(%_Y!_Y?+?+9/3+39/9/10%#"&'47"&547332!3267"!654&@hdg0/LJ6O`Ct:GJ}oVge`PbU2K 49zP_KlTVaMj!N#,<@ PY, )PY PY ?+?+9/3+39/9/103267!"&547#"5473;6$32'654&#"lgi% 0/h>ǰSyu#LAz}^H-ERFkU1Wf0)hZ'0B@!''@  _Y+(_Y$_Y?3+?+9/3+39/9/10%#.547"&547332!3267"!654&@\r99ցdg0/LJ6O`Ct:GJmm #Vge`PbU2K 49zP_KlTVaMj!N&/B@!! @PY/!!,PY!QY ?3+?+9/3+39/9/103267#.547#"5473;6$32'654&#"lgi%99w 0/h>ǰSyu#LAz}^H-&ׄFSFkU1Wf0)haE,`& &+5+&"&+5?3 jeYl]Ҵ\.C\Sük.ֽ蘌 WHfM :&%_g{%fE'@_Y_Y  _Y?+3?+?+10! #"'732>7!3##mw:#=XXoEҬڅ I!h:'@QY  PY RY?+?+3?+10#! #"'73267!3~{i{S/,)8[lSkγ7DҜE rEg(WE'@_Y  _Y ?+9?39/+10!#3!3#"&'732{yn nFhc:oE6_H(DWx:-@ PY QY/    ??39/]+?+9103267!#3!3#"&'`h}"R`ӴYY,IJZF:69fE#@ _Y   _Y?3+?39/+10#!#3!33ځyyn nfoE6hV:0@  QY   RY ?+??39/_^]+10!33##!#YYɎ``:6g(7:hE%@_Y @_Y ?3?+9/+10%3#"&547332%3##>;Ώ njVosP>#l-54' D\1hhg:!@PY  QY ?+?39/+1032673##3#"&547NWSH?d}OilAc P:n<>"hO[R%,fE(@  _Y?3+?39/99310# #/#3?33C@Q'Z +Hfd,JwSEOZh:&@  RY?+???399310#67##36733"*m!L 2NEf7bG'3:\Lg( O&$ I1&+5I?&D9&+5c]&$j &+55I6{&Dj @&+55EN9&( IE &+5t\&H !&+5eZQtXNf&Q F# %&+55tX{&j (&+55`& F# '&+55+{&j )&+55& F) 3&+55NF{&j 0&+55$/'@_Y_Y?+99//3+310"&'732654&+7!7! 1%ک? ŸM˜myq W:S9^& &+5P~R& J!&+59& F# &+55P~{&j &+55f&2 F# $&+55p]{&Rj %&+55fZ&@_Y_Y_Y?+?+9/+10"&54632 ' !"!65ebw"n 8k ١ݛRK7]?-p]N!3@QY PYPY?+?+9/_^]+310"&547323267!"!654&73T ߕ,1GmžO`j?;ۨ.1}|f& F# &&+55p]{&j )&+552& F $&+55QN{&j ,&+55S^& &+5WR&\ J!&+5S& F3 &+55W{&\j &+55S& H7 &+55W&\% "&+55& F &+55f{&j &+55whE @ _Y_Y?+?+10%3##!!UnO{DEh: @ PY QY?+?+10!3##thO::& F# "&+55{&j !&+55WE<@`Y_Y  _Y_Y?++3?+9/3+310!!3!"'732?##73!!\XX7:}_czzU:ڄzWE#@_Y?+3?3910#"'732654'# 33 Jĕ:G 6=BP7e7&oP??n|}PW:#@ Y?+??3910#"'732654'# 33不:G 68?M5Ǽ^+-bP>EvD,[1XE)@  _Y   ?3?39/993+310 3!!# #!7!3^."_Dǘ=t9:,@Y   ?3?39/993+310!#!7!33!!0Ǽ^n6D[>JE @_Y  _Y ?+?9/+1046$3!3!"&7!3#"Jd4gJpGE'(@  aY%aY  ??399//9++310332673#"&'#"&546$;3267#" ^@QZZ)Xmqщ sOQ{;{E.M2{t1ѸCLZf-;!-:@!   (PY ""PY?3+3?+9/9933?10%#"&5463237332673#"&'2654#"X]UlqIZaZAQZZ*hyN~GlzBRU1tr1ԵPT$vY*5@  `Y ** `Y'_Y?+?+9///+910>3232673#".54&+732654&#"vVӅfO]AQZZ*UQ$&:TXM:g}u'ޓr1ԵRf\LXGPDN*5@PY % %PY% PY ?+?+9///+91072654&#"'!232673#"&54&TQZ_LQPY[-(532vhO0~2³XVst cgi^GIzpKzP  tb'.E$+@ `Y!aY?3+33?+9/103#"547# #"'732>!3267IZ)p]}w38@?Sfo_BUD1Ѹ?RGT} 8y.I2w:$)@QY   PY?3+33?+9/10##"'732>!32673#"&547~32.#"!3#"3 ͹$~;GGט9vj=txeqM{rNfWE*@_Y_Y  _Y?+3+3?+10! #"'732>7!#"'7327!mw:#=XXoE;>)B| I!:W:,@ QYPYY?+3?+3?+10"'73267! #"'73267!I=>)D7F{i{S/,)8[lSk:WCQ2DҜE rEEf}Z4pWJTjiE:c!:Z!@ @P`/]]29/3310#654&#"#7>?3qg !%23 d SKgmL .6/1V\ ^^m!N{ #(@ @ H!R?3+]q223104632#"&74632#"&4632#"&. ".." .. ".." .- ".0 -o -- ".." -- "..".."".0sN R?10#7'7'7vVVVVVVVVVVN "@ @ HR?3+]q2104632#"&4632#"&- "0/# -+-" 0/!"-m"--" .. 00 0.RN %@ @ H/3+]q2104632#"&4632#"&3R." 00 ".). !/." .HnGm"--" .. 0/!"...nDm /]2103"&547^YRGOjun, X R?10'7wPT"$@   R?3]299//3310"&5463232654'7#"&'."2+'RgM!0(!- 3+)RhH1G(!(99-)HWNn,=;-20*H WNl4K>*N R?]210654H;]YNENmxm%'5/10#'73TՐ#  /329/104632#"&%#72677. !/." .o˜f^ 0/!"...ji\bNR?]210>3"bʛgNmh\bNR?]210>3"bʛgNmh\N@     R?3]22310>3"!>3"ʛgI̛eNmh\md`/;D)+7@)/#5// /3]2/3]2104632#"''7&%4632'#"&732654&#"32654&#"~YW~YH5{Bw~YY~#'#j5@P/]10#'73Vא /210#7267ɞfRji\m7 /222310#7267!#7267˜fɞfRjh]ji\3 @/]10?'%Z)3P3LN R?]210654H;]YN!ENmxm%'B;)/ /3]2104632'#"&732654&#"B~YW#;b>0[|v8)(8:&':RY~~YD3LTN~Y(88((89'@@P`/3]9/3310#7.5473326?3f<.e"(.3 f\ A3V#)0511NO_R?]10#'73ِNbN@ _oR?3]10!737=)jDm /2103"&547^YRGOjun, PT"$@   R?3]299//3310"&5463232654'7#"&'."2+'RgM!0(!- 3+)RhH1G(!(99-)HWNn,=;-20*H WNl4K>*b{) / /3]2104632#"&732654&#"b~YY~|[[|w8()8:'&:RY~~YY~~Y(88((88u; @ @ /3]q2104632#"&4632#"&/! // 0'0 !./ ".b!/." ..".0 ".. #/;'@39!@!!!- '/33333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&. ".." .. ".." .. ".0 .s. ".." .+0 0/!".` .. ".." .. "..".."".0".." ..".0 0. @@ /3]q9/32104632#"&4632#"&%7!Z."".0 ".). !/." .Hb".0 .. 0/!"..mm )@@ /3]q29/33]104632#"&4632#"&%7#7!#Z."".0 ".). !/." .nHkb".0 .. 0/!"..?rmmr{B  /3104632#"&{/!".0 0!/0 ..D  /333104632#"&74632#"&0 0/!".- !/." -".0 0." 0/!"..) #@!@!!! /333]q2104632#"&74632#"&4632#"&)."".0 0. ".0 .0 // ".b".0 0/!".."".0 .. ".0//^]210!!DG}j//107#7!#oGkujjuwF @O    S?]]3104632#"&0 0/!". 00 00yF  S?3104632#"&0 0/!". 00 00 #(@@!!!!!H! /3+]29/3104632#"&4632#"&4632#"&. "--" .0 0/!".0 0/!".`".." ..I 00 00H".0 0.7q  0  /]3104632#"&70 00 0#--# --/31073-o-y#L/310!!<)LyG//]]310!!Hj``//10 3`ך)` wAw /  /]3104632#"&0 0/!". 00 00wF  J?3104632#"&0 0/!". 00 00D9WYWYN?++10!3 3:9T9:++  /3104632#"&/ 00 /f10 "--oj  /3104632#"&o/ ".0 /".0 .."A TYM TY N?+?+103#"!!>L!KZ;f #k˪=Y /10##?#7! l/͠k  NM?2?39933103673##>7JJBB _x {/@75àEYmQld#>bmX7%TYM TY N?+3?+107!23!7!654&#!yk !j!Aq۪'B;odw)VYNTYM?+?39/+102##7>?.+7;ac8 _XF*CF@bpF19 JAwtYϚ9NTYM?+3?10!#!7!#FD !!)! N TY M?+?39/103#3#654&#!7!2Ḛq-!B;odAq5MN??103#}5@   LN??39/3910'#>7%7%f@7$ lg%%5L9Zj sNTYM?+?3104&#!#!2#6ǁ͸Nod˚Aq1Bh"'A TYLM TYO?+??+10"&547332>54&#"7632Dzfwvc[DI1p2"]nPw3`@j\S}l`X#=PvFJM?]103#}{Q TY M?+?10#654&#!7!2) yRR+odAqFF"A TYM TYN?+?+10! )7!2>54&#!3@s DxvBfUPes!A PJTYM?+??3104#!3! 76$wVLV 8z)P`J*7O" A TYM TYN?+?+10)!2!654&#81Xj˝QaR'K2od}5AMNTYLTYN?+?+??99102!7!654&#" #673>;y!TMXz|HKNdߦw`n_zeXJMQ??103#Ƹ" A TY MTYN?+?+10)7!654&+732!fAN |};HLB2n^S^!'A TYM TY O?+?+3107!2!"&5467332>54&#!1#BҾ>e21K6tyudI!Dƹ|4?J}UcDwb   M?3/3910%3637 ˑR]j&Xd&u}'TYQTYM?+?9/+102#654&#!3!׸C!R˝U]RX%od4TY A TYM TY N?+?+9/+10!!2)7! 654&#!F!R!>] zQDǪT٪G{ MQ??39/310#654&/3>?3 9FEq50FQ@:6JWN",-% MTYN?+3?39910)7!3>?3P!U_%A@6!"5P' A OQTYM?+??39/10#!276$54&#!!ѹ)hwb}y]FQEN TY M?+?10!#654&#!7!2u yR+odQa1+ VYM UYN?+?339/+10>732>73 !3Rxt$X^2otC_bFT` }* TYNTYM?+3?+310#7!2#654&++732>7V p#l EX7!Oa1K0peY1hsr'>=r'=FJ' J?10#3{/J?3210#3#3Z{{: @ PY  ?3?9/9+10!#!#3 :uf6B5:3:8@PY PY    PYPY?+??+99//9++10)!#!!!!!3#WA>SC\L:KN+7@F@&8'8PY4QY+267!-Kkw{s fjȨ 25JR/,o#**,@sT{xQ! ,CwF^H-qwtr;L1A8RZDm9D[RYN;FyHs:%9@ PY PYPY?+?+9/_^]33+33103!23##!#!!2654# 32654&#cu\r2\u)A²A[hb؂xXK)_ibi@DthNF<N:@  PY PY?+?+10)! 4&+32NnҺ:b N: 5@ PY  PY PY ?+?+9/_^]3+3103! )#%4&+3#32.Yn^>Cpo涌Šd5: .@ PY PY PY?+?+9/_^]+10)!!!!!|>$Cd:wN(5@!  PYPYPY?+?+9///+910"&'732654𑯎&#"'!2ߧ ngpSQZ_LPRf~t},NVteRVed54&TX0{\;y"Kg  "wpf)^##@ /22/933910%"&547'763 ''27"654& ` PVW ͂`,2Zӂ2ƹdSsX[Q^|pM^zrN)17@"**PY.PY  ' PY ?3+3?39/999++310654#"'32632#"'#"&547324#"267!s:c r-vsqԎ.ws{$p7=r~Iw! CtRTR-trnVV?J:!,&@$RY ! *QY ?+?39/9+310#"&54>?.547332674#"326J}fzsݗac`i NI^z^`W:uxtyc'+2/PV~bg_N@ PY ?+210654&#"#!2jz+lnL|u0XnoJ@  PY ?+21032673!"&547@mt+ogI~ºRdbY: @ PY  PY?+?9/+10!#!2#!!2654&#ΘyنgL|`^:~w_z~nIQX: @QY QY?+?39/+10 #&5463!## ;/lҴYa^j6*ɶHHbX: @ QY  QY?+?39/+103!"&54673#";KYPp|z6}jv:@ QY?+3?10!!#!d:I}_:vX /333/310!2654&#!7!27#! #S*!-9ODP/ i}*}bX #@    /33/399//3310!2654&#!7!27#!3#3#浒U#*!-:Oٸ l  i}[>-Y(@ ((  /33/39/3310!2654&#!7!27#!7!2654&#!R#S*!-:OFR/#|o`q't\"S̴qdk:Yc!:Z*p:]N:&@PYPY?+?9/93+310"&'732654&+7!7!觭 ngty0pi},NVhSO)|L(4@(   !!PY! PY ?+?+9////3310#"327#"&546?32654&#"'>32;zOMW;痒;|PLT9癒X`][6I{p|\\6I}nZOVM+"@( PY$?2+3?93310"&'7326?'&546323267#"&/Vj-nP-"M woQԥ,DUDA"-c)BCXYl'&GK7?s'4"#us?m`U#"4's>8JXUUZH:QY?+?10!#:I::Mal:@ QY?+?310#!#lҴ/:I:bY:7&+:@PY??339/3+310!"&'473332673#<E< ||4<۔]u<¹`K{ "@ /?O, .?2?39/]310!!!!!<%Bitrtu "@ /?O ,.?2?39/]3107!!7!!7!iB%<tRr6t"@ -/?3?29/39/102.#"326?!7!!"&54>*'xb|i[>"DTr|.`H73wչrZ $@ /?O ,.?3?39/]310!#3!3LY YQQ6^K,.??10#3, ,/?2?39/10"&'73267#7!*xH6CaqD<\Mb`GtH  ,.?3?3910 #33 pڈI^`dBC,.?2?103!Ct}  ,, .?33??3991067#&'#373#9"dx yB}P}>\/biR.U  ,..?2??3910 #3>3G_ 6l[;  . ,.?2?39?1033#67 mu7y;XK-/?2?310"&54>324&#"326hR҄S%}ggֽoZҹsZmz1>+%/?39/32102673# 4>7&5473"32>54&SzjXE>_e.(Z`d! ,, .?333?3?310#'7#3?33*4*F&.3. kM{\puiK(4*@ * 1$00.?3233?39/99310"57##"&546?654&#"'>3232732>7}|>zVdx΢JBQW|v 48 ,uA9ClJ l-[Ew[I?>;>h]p`&I%4O XR4D8d4%'3) ((//##1?22323?39/931023>32!3267#"&547654#"767>54&#"|>zVdx}JBQW|v 48 ,uA9ClJ l-[Ew[I?>;>g^p`&I %4O XR4D8d4 !+  A . 01/?2?3??399310"&54632373#47#'2>54&#"pxVx0}tx2q/^v?[LWc;ۇs~"OB>bl`\^h[>*7?:@<!?, #!%!133 /?333?39/999933333103267#"&'#"&546?654#"'>32632%32>7%74&#"=da3fjewӧ TZ|"FX ign<3]Wxo"#+2   ./1?2?3?9933?102#"'##733>"32>54pxWy0y"}: 2r/\x?[MVc;siy?$B>bkb\^h[!2"+  A . 21/?2?3??399310"&54632363#47#'2>54&#" pxVx0G~x2q/^v?[LWc;ۇs(q"OB>bl`\^h[C 1 /?3?39/93103267#"&54>32'74&#"?m$a6kcqo`N_MP>@,_R}R>a3]WxoH / 1?3?39/931074#"'>32#"&5673267{An"`(SuPdpo`N_PA=,ED(}Z6a3]WxoJ'*@ !!   1/?3?39///3910267#"&54675.54632.#"3"JJp1>D^uzf9JX{(^M5EPn=E<80JD:r`Vt U:ek6B<-'@7qcA93AZ$(@    1/?2?39///3910"'732654𑯎&#"'>32g%rNSmbrC8}pkmuWEVܳtKCG<_EC11edRfQQkaEl !.3   0+1$ .5?2?39/?3?993310%"'7326?##"&546323>7332>54&#"%rek32>32#654&#"V,;QvR}tv4fG:sF [|V,;QvRT'48sVXQ?\GN)T'48qT)"'. 105?22?3?3?310%"'73267654#"#733>32--*( e }WS}tvga#Qma0  1/?3?310#"&54>324#"32>_a~_r>XWcn<̂~td[fokN 1 /?3?39/9/10"'632#"&'732>54Ž32#6ePdCɨ Be̚044/h /?321047332>73#"&/XWP`Cɩ1&*/foAgͦ%,1  05 /?2??9333?310"'##?33>32"32>540F}t2rSpxV]v@[LWb<܋;c9 QB>skc[_g\X 0/?2?33310"&547#73733#327Y;D XWYIT!W ?( ?H; <]]:*> ^A 0/ .?3?3?391032673#467##"&546'X }WS}sv;uOghb9I!uv^R=ga*-f  /33/210!2654&#!7!7#!sloc`GcV`JU{t@|}+)+ 0''/.?3?333?33991032673#7##"&'#"&54633267W554&ru\MdƩ`)} -n-t1rl\dnH|ifxWBc${pRcded">54_[m8jl6s6Qk6PPLwb/@Lc|@bӎI^g[ap]VhenkL$0  15?3?33?910 #'.#"'6323#F$ /1(1#9z-Fe5 X@_|x& >?55Ux<- >?5ksw >?5xsz >?5N'(A@ !! "" ?D?2?39/939?102#"'##"32654>54&qp\R[|` 4z~-k(r3o~g\bkG~gf{RBHc&{pPeded3#67N )oO7)Mr$(T*`(@ % ?C?3?39?104632#"'32#.#"&4#"32>MĞ_I._lUq0w[_r>XWcn?55^M B?5N*39@+PY.PY% .. "PY(?3+3?39/999+?+10%#"&547332673632!3267#"&"!654&9ns//PU"o{#KlwsxQ~"i .pM[jHpRd:A6mwrwF^H-\M:Gz:[.<U@+#! (&%% ((2PY( 9PY?+???+993399//2/2/322310"'##67'"#>37332673#"'363 4&#"326M6 )1'$ U4"#p`!!28_b_lrv\7.!0/g}i/0rry^yxm{sNH/>I@%/ , ('###  :PY 3PY?+?+?99//222/3?993310%#"&547!23?&#"#>327332673#'#547%32654&#"Eyoy('$ U!"$p`5 ]dbltX~Z9i_`}6Vbw 0/g}j/0rrG]+ukK~ytT|/E")@Y"PY -??399//223223+3?+10332673#'##&#"#>3!7!7>32.#"!L#p`6P]'$ U5?(I% +iqFx/0rrb0/g}Dʯ  /jd N/<Hj@:9==PY+,2,QY.0C@QY @C#032A% 2A%%A2 *?33?9////999333+333+3?3+310!&###>?67336323>32673#"'37>54&#""72>54&[L+cV "cG1 dRI* '*Bn!>q 6]h ()Sa_HgXlh\[c'g;O_,&\?>533>3 6737654&#"A:{yv5_`X`*  Nu8XeAS;, X[SdM '--S^"KC0{8kb;%{um=< :(XRWW\P-<Y@1(1PY(%$$ PYPY 9PY?+?9////3+33+3?9933?+10"'#>73#"'#7&#"#>36733>3 4&#"326M0.1!!p`##'$ U3 F|4n5Yiac3765'33>32_md" #p`#>K'$ U.#Is_ja5 /0rr0/g}|c0GI:qh5FN$?@" PY  PY!   RY?+?9////3+33+3102&#"32673#"'#&#"#>376$9% "<{!"#p`#>K'$ U. (N /0rr0/g}VzK3H@),2QYQY %!,/!!/,#PY PY?+?+9//////99++10#"&'73 54&/.#"#67&54632&# 32673,L[oP+K' 䳻+RH/!i _ǃWQ2C"(i)!/~$3'&(6,"d3T1T@ PY '(/(PY0/, // ,!!@ Y!PY?3+3?+9////3+33+310733!!32673#"&'327#"&54?'"#>3 qx7PG,#p`632!7!32673@4{|8'' V4yA8F*$p'w 0/g} =00rrX*K"2=@  .PY   &PYPY?+?+9///99+33102.#"3632#"&'##?6$32>54&#"ͩb\;&Pq$,qgZ~X;]kPh6KKQѝ|iia% R:~N[ndV6 $Y /3/29/+10!#3!3??ww9X9xC(3 WZ:-(@ PY 'PY PY ?+?+9/9+104$3&546?!7!#"&"32>54& 23O% .DQD.礻;{X~x\#;4+E4!23 3#!"'###267!"!654&Px?F|4 LLv0_x{. l. YiEti_>Y \M9ytTM1lrI:!2@ PY PY?+?39/_^]33+331033!33##"&54?#26?!cgZZZZee%ʯ g˃ `i//{Ö,4{XX6*Z[:#,7@(##PY PY$PY?+?3+39/33+33103>7!7!!.'7!!3##"&547#267!9]%{yV3MVITA_LJ iRc'yt(cRæ2]<)}JW[#1:@  'PY .PY RY?+?+?3??+993310"'732?#"'##673363 4&#"326:G .E}EF6 )R"2gX4:p_b_lrv\Ww7.!Ylxm{sNqW"1C@ "  @YRY -PY &PY?+?+??+?+993310%#"&547!23733!"'732?#547%32654&#"EyoyW\7::G .E}Y]dbltX~Z9i_`}6Vbww+ukK~ytTW*!:@PYQY@ Y RY?+?+?3+3?+3103!"'732?##737>32&#"3T7:8@,?}_J2-"GLwz KWaXK3C[@ "1PY ""7PY*,',@Y''?PYPY?+?+9/9+3?+?9/993+310"&'7327##"&54>323>73!#"'7326?#4&#"32>Ub\>&ByQq$r MpD3 ,lXqg[}X;]kPh6X~KQ;dm}Oiia% YiuOq*e8a~O[ndVW,@RY   Y?+???9?+102?##33 3!"'7}'K Aq7::G .wma /2W"@  RY  Y?+??+31032?#33!"' (6~d!V7:-> w WN=B@ 33&@Y3*/RY*9PY  ?3??3+3?+?+933310!654&#"#>533>323>323!"'732?#654&#"'*?t!v  9yLXD=TWQnb7::G .E}a'*Ao zp:533>323!"'7}fQf z  SvnZ7::G .wJ3QGS"KC0{8p]t~=NW\P&58@*PY   2PY  RY?+??+??9933?+10"'7326?#"'##6733>3 4&#"32632&#"3!"'7|]#Ef"% "r݊g gpWKK59@ '### %PY PY RY?+?+?+99//99910"'732?#"&'73 54.'.54632&# P7!2&#"!!"'732?!#"'0#6D+D=W(.@7J09:(.+(u'#50,Vgb2W` ˴ V:+@    @ Y PY ?++3?3910%3!"'732?!36734:(.+(ue N* x:@Dt5G V:0@Y PY??3?+99+310 # 333!"'732?#IǼ^+q4:'.+(v:D,[] x;Vm:2  @Y PYPY?+3?+3+310!7!!!"'732?!784:'.+(v x VN3@M@,QY,01:QY1 PY$"'"@ Y'4PY?++3?+99//9+3?+10"&5%7654&#"'!2327327#"54?&547#'2>?1!]d{~d̑ [F!._(/0( \BcxƗONtm$SMUW$l,4.)Y _ *5y #ziZSY9t^EKEV\J%4H@% ""PY" 0PY @ Y)PY?++3?+??+993310%#"&547!23733327#"54?#547%32654&#"EyoyD2_(/0) L]dbltX~Z9i_`}6VbQ _ *5+ukK~ytTDW)7<@ '&&##-PY#4PY RYRY?+?+?+?+9933102&#"327#"54?##"&547!234&#"326 CA 6;w#7(05J "Lzn::ktuY[ea"#5 +6nb`}6Z^ ({usr@tWlN'.=@+PY $+$+(PY!PYY?+3?+?+99//9+10327#"54?#"&54>3 !3267"!7cB+H7 uP }qf*Lޅ"H](36|!l[iE4XN-cHWGN6H-+0+@ Y0PY5%%PY#PY?+?+9///9+9?+310"&54>75.5463 54&#"3"327327#"54?WZ\rFaZf|`TTEd@-B= !m}VX oSBIfVIGxrIN,a)3<DWN3H@!'PY1  /!/PY/!PY!Y?+3?+?+9///9+910327#"547732654!72654&#"'!2#"'cB+H7 GqTQZ_Lh{t׌V a)4k,xbed32ކ^cB+H7 A jvaxxl& zS1a)4M-6Vh6zjm `Yƿk|Wu$1@ RY$YY?+3/3+?+310327#"&54?32>7>32&#"1'1B+H7sj !973>(!l( .@L_"*'\_+7(Rbe SW:*:@ !! *$PY$ YY?+3?+?+?39310326733327#"54?#467##"&547Qf zY6c=+?; MSv:RJ3QGsaa)4 )p]u~!$@YPY $ $PY?+3?9///93++310732654&+7!7!#"'327#"547ʎRUs?bjB+H7 >vjleU }}lLe)4A$$(1  0./?2??993?310"'##6?33>32"32>54/yqr1oQmtSZt>YKUa8ی}_Q6 RB>sk^[_kTV  1/?3?39/9/1027#"&54>32.#"h9jR߃Z}p yCCVi;A#䜉}vk?O^k"-,@ +( 1#/?3?399//9933310"''67&54>32.#">32'2654#"ouPDO56&[|pxG?Vi<Q?PZQ^LI9D,1@ &/22?33??399//99310&'37#"&54>32.'7"32>54&2Sx-= sMFYWv3` ;*kPi7VOYk5b2<0HL/]xyqb&$L1OTLN[c`N>Wd$(@    1/?2?39///3910"'732654𑯎&#"'>32r$sLTlcqD8|qtnuXEVܴtIEG<^ED11e\ZgPQlbEl!.  20?333?33?10##737>32'"3~{~ghh\3">4* c]WmXa;7G]~O'@    50??9/333331033##"'7326?#7mV{Vgg0iZ8!11 -\jZa4>\ lu$"@  . 2?3?9/93310#"&547332673#778qOeeV{U yVQyz3 P@ga(L9A(vtC " 0. 2?3??9/33310#7333#73:PQCzCRR:3z8]e]yy 0.??103#zz 0.??103#zz  0.??9/33310#7333#:PQCzCRR:8]e]:%  025?2?3?9/33310%"&546;33#'267#"73N`s/{^],&.@EV{VN^kGbdDc8.AdyyW2 5?33?10327#"&547WA*(3AU#B o NO#fh2. 5?33?3?103#"'732?#3<&k`1.#*R32>32#"'73267654&#"T3;NsPzqs6bCS` 6pF\cf`P+- )' b3;OrPJ067rVX_T533>32(V zUa`O+- )'  t9sLdfWC'vso^ `;A5/"_R>ga+I4&''.!105?33?3?3?310327#"&547654#"#>533>32]?&#1*AUf zUPzpt9qNdffoB p NO!C'vsUX#oR>ga&N' 0.?3?3991073#&'#) \sg as.F?89 $@ o 1/?3?39/]310#"&54>32!32>74#"!7]]zbVTJ]Dft~~u7hn;zy/!/A 251 0./?3?3?3?3??10%.54>734'>7bqVn3o4knSy6#loJ\5PgoC]6&}{yxw " nj%O f40@ .)))+&1 5/?3?33?399//99310#"'327#"&546732654.'.54632&#"|GF $ (NT2d[Vae >XZT. oS\!>Tygr|1:rMH '8>F@,#7K2foi83+!%j8 25?22?3310%"'7326732&#"5-,5>/6.'$f uoMW/t̄vi%0/5?22?3?33310%"'73267"&546#73733#327*$.,9CXUVGR U=(lHiG<9\\9C> Ͻ %0@ " 0/ .?3?3?39/93333310!33##467##"&547#732>7!0>V>{>IJ! s8qPdfII>:gD H^d> [P@ha{^HYC{Ch#v--0& # 0/?2?33310"&547>54+73232>54'&546;#"_Z:18N4C'(P`VFsB\KR8#"ܒ{}mF-(bC4/V1aeObJI)GH'TYb(/8F-Q0 /?2?310 54733273QT}] ID&]{\:K#-(3;'Y 0/?3?31032654'3#"&547-R y^zt NK2)hb`g{65  .0?2?3103#&'#F SI^3 0.?2?3107!7!!3`8b`b0 .5?33?3?310327#"&547!7!7!!l5!1;Ng0!h8q HK|`8baɳm % 0 .?333?39/310>32+'7#7!7!%"32654&%gAESqw0 V5g0,U-j6GLaOA^\D9+Ra7b`ȁI8%*(@    40?23?399//3310!# '732>54&+7!1exatuLuAi[79O~pngRIVdea $@ o2 /?3?29/]3102#"&546267!"!654& jv~n,b*.b~*}?{z:qKkqMea4) "@ [@ [ ?+3/2/+1073?373X$$>$$B%!G) "@ [@ [ ?+3/2/+1073%7373=$$$$!F%N,/10"54>54.54>54#"7632d&-&$)0).)5B;"8gho@]m,94bfqC#Z%-%dU $<(0(M /310!7!%:hx /310!'7!U:Ԕlf /210'!7!sWԀp /210!'%!+,WTl=@ /9/3210'%7%=RRAmzzmE/2210''%7(I(ԀmzzmW@  /39/3310733>3&#"6T >2$rWTJ/"Z~ }U!/10'7U!r``rR,V6 @  /99//3310?'7#373Rrr?rRr``rWcE&$fI06N&DD9f&%&&+5J[&EL9E&%J[&E9E&%J[&E7tD&&' Czb &+5pD&F'vzQ$&+59f&'&+5p&G9E&'p&G9E&'Xp&GT99E&'Vp9&GX9WE&'`UW&G\9+&(z &+55tX&H'C9+&( &+55tX&H'v=9WE&(mWXN&Ht9WE&(JWXN&Hl9D&('zu"&+5tDX'zG&H7&+5Yf&)1 &+5f2@ @PY  Y ??+9/3+310#!7!7>32.#"!73w(I%+iqF%%%%ʯ  /jdt^&*& &+5OXR&J J4&+59f&+&+5PIf&@ @PY?+?393103363 #654&#"#73V""! R`|zb%%E{7D/7*VU9E&+PI&K9&+ F# &+55PY *@@ PY??+?393?32103363 #654&#"#73!73V""! R`|zB$$$$E{7D/7*VUθDE&+zDI&Kz9rE&+fPrI&KfDWE&,f&W&Lza+&,f &+555&7&&jvJ &+5559&. C&+5  @  ?3??9?10!#33 7%3)NAVboE /9E&.,&N9E&.&N}E&/)&O>^&/')&  &+5T^ -@QYPY @PY?+3?+?+10%!!7!!7!73!7!|*!!')E&/&OWE&/W&O&0 C&+5&Pv7&+5f&0&+5&P5&+5E&0N&P9f&1&+5c]&Q9E&1c]N&Q9E&1fc]N&Qz9WE&1kcW]N&Qf+&2f %&+55p&R& C @ <@ H<&&+55+5fS&2f -&+555p~&R& F# +@;@ H; H;@ H; H;&&+555++++55f+&2f $&+55p]k&R' J! B &+55f+&2f &&+55p]j&R' J! Cw &+559&3 C&+5W\&Sv_,&+59f&3&+5W\&S*&+59f&5&+5&U"&+59E&5{N&U9^&5'& &+5{R&U' JD&+59E&5fN&U(f&63&+5nE&V1&+5(Z&6nEK&V (&6 [ 9&+55n&V Q 7&+55(&6 w 5&+55n&V g 3&+55(f&6'4&+5nE&V'5&+5f&7 &+5 3f&W]&+5E&7 3T&WE&7f3T&WdWE&7kpW3T&WwnE&8fl &+55:&Xfl &?55DWE&8fDW:&XfdWE&8kdW:&Xkn+&8f &+55&X& C=@.;H;@H;@H;@H;@ H; H;@ H; H;)&+5++++++++5n+&8 f &+555a&X' J!j@ )@H)!&+5+55_&9 G&+5&Y&+5_E&9:&Yji&:C&+5c!&ZC&+5ji&:v&+5c!&Zv^&+5ji^&:j- &+55c!{&Zj &+55jif&:&+5c!&Z&+5jiE&:c!:&Zf&;&+5&[&+5&; F# &+55{&[j &+55Ef&< &+5W&\&+5&= DA&+5*p&]&+5E&=*p:&] E&=r*p:&]fPI&Kp 3`&Wj  &+55c! &Z &+55W &\ &+55I6&DC&+5'f@ Y?+10!#>32.#"73۴&I% +%%ȱ  l-V$&@"_Y _Y?+??+9/310#"'732654&+7.#"#3 lt:Su)%xD`Z!?  t~ 'e^5C^@ cE&$I6N&Dc+&$&+5I6&D`H&+5s&$ 2 &+55I5&&D : E&+55c&$ 3 &+55I6 &D ; G&+55 &$ 4 %&+55Ih&D < Q&+55&$ 5f 0&+55It&D =O A&+55c'&$&+5I6&D&;&+5&$ 6f &+55Iz&D >N 9&+55&$ 7j &+55IS&D ?J 9&+55&$ 8f &+55Ie+&D @\ 9&+55&$ 9f &+55I&D AY 9&+55c'&$&+5I?'&D=&+59E&(&tXN&H9+&(&+5tX&Hy0&+59&(&+5t~&H*&+59&( 2 &+55tN&&H : -&+559&( 3 &+55tX&&H ; /&+559&( 4 #&+55tu&H < 9&+559&( 5v .&+55t&H =m )&+559'&(&+5tX'&H'&+5a+&,v&+5& &v&+5aE&,&&LfZ&2p]N&Rf+&2v,&+5p] &Rv-&+5ff&2 2 )&+55pC&&R : *&+55f&2 3 )&+55p]&&R ; ,&+55f&2 4 4&+55pu&R < 6&+55f&2 5f ?&+55p&R =j &&+55f'&2#&+5p]'&R$&+5f&bvb*&+5pm&cve-&+5f&bC*&+5pm&cC(&+5f+&b4&+5pm &cz7&+5f&b.&+5pm&c1&+5f&bpmN&cnE&8:&Xn+&8v%&+5 &Xo/&+5m&qvV&&+5^&rvU(&+5m&qC&&+5^&rC-&+5m+&qY0&+5^ &rg7&+5m&q*&+5^&r0&+5m&q^:&rE&<C&+5W&\C&+5EE&<W:&\)E+&<q&+5W &\s&&+5E&<&+5W&\ &+5h0&bd-&+5h0&bd.&+5h0&bd 3&+55h0&bd 4&+55h0&b1d 3&+55h0&b&d 4&+55hJ&bd F&+55hJ&bd G&+55c&$c&$˓wc&$c&$wc&$c&$c&$% 1?55c&$% 1?55xo0&f(d.&+5xo0&f d/&+5xo0&f&d 4&+55xo0&fd 5&+55xs0&fCd 4&+55x0&fRd 5&+55&(T?5'(?58&( ?555[&( ?558&( ?55[&( ?55PWJ0&h"d$&+5PWJ0&h)d%&+5PWJ0&hd *&+55PWJ0&hd +&+55PWJ0&hd *&+55PWJ0&hd +&+55PWJ&hd =&+55PWJ&h'd >&+55&+T&+T8&+n&+8&+[&+^&+ /?55^&+ /?55 0&jd&+5 0&jd&+5 0&jd &+55 0&jd  &+550&jd &+550&jd  &+55J&jd 2&+55J&jd 3&+55&,T&,T8&,[&,8&,[&,^&,^&,p]0&Rd#&+5p]0&Rd$&+5p]0&Rd )&+55p]0&Rd *&+55p]0&Rd )&+55p]0&Rd *&+55#&2?&2&2&2&2^#&2^}_0&vd&+5}_0&vd&+5}_0&vd $&+55}_0&vd %&+55}_0&v,d $&+55}_0&v,d %&+55}J&vd 7&+55}J&vd 8&+55wE&<[E&<E&<2SE&<0&zd5&+50&zd6&+50&zd ;&+550&zd <&+550&z)d ;&+550&z)d <&+55J&zd N&+55J&zd O&+55&Z&Z&Z&Z&Z^#&Z^&Zj&Zjh&b-&+5h&b8!-&+5xo&f.&+5xo&f8b.&+5PWJ&h$&+5PWJ&h8W$&+5 &j&+5 &j8&+5p]&R#&+5p]&R8!#&+5}_&v&+5}_&v8&+5&z5&+5&z8;5&+5hW0&b'dD-&+5hW0&b'dD-&+5hW)&b']D 3&+55hW0&b'dD 3&+55hW0&b'dD 3&+55hW0&b'dD 3&+55hWJ&b'dD E&+55hWJ&b'dD F&+55Wc&$&hWc&$&˝hwWc&$'hWc&$'hwWc&$'hWc&$'hWc&$'%hWc&$'%h/WJ0&h' d$&+5/WJ0&h'd$&+5/WJ0&h'd )&+55/WJ0&h'd *&+55/WP0&h' d )&+55/WP0&h'!d *&+55/WD&h'^ <&+55/WJ&h' d =&+55W&+'TeW&+'Te8W&+'e[W&+'e8W&+'e[W&+'e@W&+'e@W&+'eW0&z'dn4&+5W0&z'dn5&+5W0&z'dn :&+55W0&z'dn ;&+55W0&z'3dn :&+55W0&z'3dn ;&+55WJ&z'dn M&+55WJ&z'dn N&+55W&Z'vW&Z'vW&Z'vW&Z'vW&Z'^v#W&Z'^vW&Z'jvW&Z'jvh&b(&+5hR&b J!)&+5hW&b'D-&+5hWN&bDhW&b&8"D-&+5h&b1&+5hW&b&D(&+5&$0&+5c^&$6 &+5c&$ic&$8vWcE&$nkv ?10#>7#7v777<W!MQr73L#qWP@ QY /]+310327#"54?3%!,(up i}kv /210#>7#7v777<W!MQr73L#ij  /2210".#"#>323273l*LF@7B[)V,ME>f&\"B[%-%>9%-%wjf<%@ /3299//33107373".#"#>323273C$$$$+&E?:3;S'tL(E?9[$S'qĸ "("84q"("lp/WJ&h'$&+5/WJN&h/WJ&h&8g$&+5PW&h (&+5/W&h' .&+5&(+&(8W&++&+8W9WE&+o ?9/10#73!#>7#7r777<W! MQr73L#0 ?9/103#7#>7#7Jr777<W!  MQr73L#{##@"#  # #/9///33310".#"#>3232673#>7#7*NGB7@['}X,PHA6=\@Z487<W $49w%58a`7,MTm93L# &j&+5 R&j J&+5 &j&j@ !@H!@ H!++5 &j&j8M&j&+5W&j &+555a&, &+5a^&,  &+5&,)&,8 ?339/10#73!##&547r W>) 1[BF./  ?9/103#7##&547Ir W>)  1[BF.{#%@#  # #/9///33310".#"#>3232673##&547*NGB7@['}X,PHA6=\@Z W>)$49w%58a`7,1[BF.}_&v&+5}_R&v J!&+5}_&v&j@ &@H&@ H&++5}_&v&j8EW_0&rd%&+5W_0&r d&&+5}~&v"&+5}&v  &+555E&< I1 &+5E^&<  &+5wE&<nE&<8&3Tpk @   [ /33+310#73#73#73G$u$к  pk @   [ /33+310#73%3#7#73G$u?$кY i /1073  %!W&z'n5&+5WO&znW&z&8Hn6&+5&z9&+5W&z&n0&+5&2e&28&Ze&Z8WZ&Zvr /1073rj ?210##&547j W>)̥1[BF.*//3310#*T F@"    //39///3333323333310#'7'77'*T7777Y7887 0@   //99//3322339910'7##!'77RJ77}m}8L( ,@    //99//3322339910##'7!(R77J}78}(L+L Y?+107!xÉL Y?+107!ÉL Y?+107!É?WP-@ Y@ HY/r+/+_^]+107!7!````^ [?+10 !n^ [?+10 !! Q^n [+10!" PnE^ [?+10! 1^n^@ [?3+310 !!!2nn^@ [?3+310 !!!! Q! Q^nn@ [2+310 !!!" P" PnnG^$' + *@ Y [/3?3+3+310#73%s d-am Nng+G@)  Y   [Y[/3+3+3?3+3+310%#773%%  -a ef# d-am g"*nbbng /10"&54>32G`_QfecWZ`V[  @   [/33+3310!73!73!73A++++++//333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332233310###!!!TuO .@    /3/9/3333333310!!5!###uTON+9FTP@/Q6&6YJ//Y:&[ A& Y [Y?+++?399//_^]+3+3+310#32#"54>4&#"32>2#"54>4&#"32>2#"54>4&#"32>wÓY)OqFF'#4<((&/@%1)QpEF(#5>%(&0@%ķ)OqFF(#5>%(&.A&yAw;\i5'G45*Nӽ@y:\i5(J06*NAw;\i5(J15*LZM ?3/10#3SMyMm?33/210#3#3ǎTSMM#"9S@ [?+9=/3310%73 \ h m?s w@ [?+9=/3310%#7 73Ҳ ot?}D 4@  [  ?3?3+39/310#373#3734''f4'' BEcE?2?3103#3vsE @ E[  E[ E[E[?+?+9/+9/+10!73737373++3**++**[YD@        /33/9/33333/3933333103#5!#3###TOON .@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG *@   //333332393310#'77'*TT~~~ݵqqp 0@      /3/9/33333333103#5!3###TONeT@8   Y @ HY ?O P/]]q2++_^]+3/3910654&#"#733>32M 06HhGcw)kTYR T,1&d^o8CEM$/Og~bihkqys0;hizE@# `Y `Y `Y`Y?+?+9/3+39/+9/10&#"!!!!!!$4$32wŹryU_U:|?Zr Պ{ &+S@, !' !(  &@ _Y#_YaY?++??+339///999931073'6!'#7&'#&54$?3&'pQ?Ow= Oϥ'-9H:\1:7Q5 NPd\V "RyA4A^t1/nv3RN#Y#tZ*>@!  _Y $$ !!'_Y!_Y?+?+9////99+310?33>32&#"6!"5$3 .#"<<>R#Ef"% "?#737#737>32.#"!!!!!2679,ϒFpa&Ó _Irhh*Uy75|kLym9?Ls}TXYW8@33@1  `Y" *?33?99//993+33310!7#>54&#"#>533>32332#654&+ * '*?t!v  9yLWE WQ'*y`[3274&#"4&+32>73733#327#"57!=fFQo<<Fi6_DAGo6$-`|E<8O@>W3IZWGJ8-54NrEszhKH OM77SY7`3K? !I2#I[VDE7eM.aa4a u,E ?M@(:$44//7aY/!aY _Y_Y?3?+9/+3?+?+99//9910!##324&+326#"&'732654.'.5463274#"gc8pҢ}tXd[ĭ}B>\\5NFB%qscLU@MlV?E+ QQ*|XMq_%9+$ >V>xpiY4C .~jE#&*-[@/$')& _Y, #_Y' -+--  ?3?39///9933+3333333+33333103#3#####737#733!337#37#7#7#3@XQ|z V>쀽JmFPgM ~S[ggq\%!=AMNTYMTYN?+?+??9/9/102#7654&+#332>73#!ɮ<0^}͸Nmn~Q(Ԭ˖5hTh[5FRh&/&1?5KZ)[@5sY(&sY#?o   sY sY ?3+?3+99//_^]]q3+33+310!3267# 7#7367#736$32&#"!!!Z5Jp2omawwK(mMmw5% E~*>B:CCW6>dNJE%@_Y  ?3?39/33+3310!###73333!![ynn[O=1Yo+o66ʠtE"@_Y   ??9+310%%#7%77%!7!D:i hQ>h hME4٬]@)6AOXC@!B9R %0( 0((0-I?WW ?33333/9////999333210#"&'#67>32"&'#"546327667763674#"32632654&&#"32n#/L2u8(1qOEM@Z+#^3`T>4)0{r;P0 Oq@Bo})C=O!#[!l~d2?O_`nb"+09W ,:@*$$$`Y$  `Y?+3??+9/9910#"'732='#546324&#">F;HLND#si1j{7%GN Z|^I"[Dmwx11O,9/E$)~@ aY%@@ H # aY 0    $_Y$$ $$$$ $$ )_Y?+?9/_^]+9/_^]]33+339/+33+33103##!##737#737!23#'!!627!!&+dNd-̹a 8f XCsq{b~m@@b/UURt,$<@!  _Y_Y @_Y aY ?3++3?399//++310#7&5%73&'!>71|%D/|boz^}`P9z+B uv8 GF '+̤h(PE!E@$ _Y _Y     ?3?9///933+3333+33103##!##737!7!3!!'!73&/(B:͑ɀUSW$R jj0f\ZZ7M@()_Y&! _Y 25   550_Y5`Y?+?+99//993+33+3104?#73>?!7!654#"'>323#!!3 7!"&6T*kvqe~.O5(i-b60M%-?/),5fo!1F6P)% ; _e%t#9@_Y aY _Y?3+3?3+99//+3107.547%73.'>7*~| ]HX?k*_kDl~!twA^ynA 0 n  =P 59k@86`p @0H""Y)"[)2Y.. .@H..)Y[Y?+++?3/+_^]+++3/+_^]q??10"&546324#"326327#"&54632654#"#3TcgZw6dP=P>Q:V:RT4'bij]rZaE8U:vs z|0[YX~{R % {}%|| y{E!,I@%)QY )QY))(%%QYQY?3/+/9+99/+3/9+910%2673#"&5467767>324&#">l3c&Eg\i'3\MCr|V_v{/ 7_1*3FbY\Nhmmk1!IKobu?.%GBgEOhx4E (,5@%QY)QY )*Y))?333/+?33?+9/+10!#3>3 "546324&#"3267!ABIWjgXUV 5A;7B;'XEh8+~phǔ;7+nN6)lI&'0?@$-Y,@, Y,, , , Y Y/+3/?+?_^]++10#"$54$32#"32%#!2#4&+326׎  \v3~_QPTDF-GH?~ovEHUJ6@"Y    ?3]]?33+3+10#'#373##5!_Y/i =VoJ|/#V%%\\;Z#%@  _Y _Y?+?3+33/31026;!5654&#"!532&5gu,,uZl bܭb mIC_H>  $@ Y $Y$Y?+?+9/_^]+910"&54632!3267.#"r2UNHbܕ3Wu"6Fl~*z5AuE 6L@,Y&-Y Y0* ? *& &* ???9/////]999++3?+10 # '##3 3#"&5732654.'.5463254#"m?hlu`Pٞhkf7FMU-HZKfpELG$:Ƌ?>E'&?5Q'&?5.E'&K +?5558Q'&K G?555RE'!&K ;?555E'=&+ (?555\PN'@PYPY?+?+9/9/10"&5732654&#"'>32۵jvaxxl& zSVh6zjm `YƿkdD @ @ Y /+10#&'5673!9>HH>9)CI$ICVvV @ o/]299/105673&'#;CI$ICV9>HH>9#dD @ @ Y /+10&'3#67!59>HH>9#CI$ICVvV @ `  /]299/10%67#&'53CI$ICV9>HH>9dD@  @ Y /+2210#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$ICvV!@ ` o/]299/]299105673&'67#&'5;CI$ICCI$IC9>HH>99>HH>9vHV4@@Y o /]299/3/+_^]29910!!5673&'67#&'5v CI$ICCI$IChPX9>HH>99>HH>9ic,/@ "QY PY)PY?+?+9/+3310 #"&54>323654&#"7632.#"326c\둵Tud%<4'|zUejod_uɶvdcT?6'$>Yrs  0@   _Y?+3///?33_^]]10353! b4ƑIi9bE_Y/2?+10!#!~9j 9E (@_Y  _Y/+3?9/3+3105 5!! !{BH9m"ju`X Y?+105!u`cE [/+103::+N}T@ Y/2?9/+10##5!3juN +B@($$Y!!**Y?_@,H@H/++]3+3/393+310#"#"&5463232%"32654&.#"32zw8R~{s=g0-fBH^^`,gCG\\IuN~ԯR~skps4 Y//+103!!4^^0Y /2/+104>32#4&#"tтwgĠ9@ Y Y/+/+10"#"'53254632&nSYO7<9W,1Xwr-ѬlP`-@V)#Y))/))@H)@ H)@&Y_@H  Y  /  @H @ H @Y?/]+3++_^]2+/_^]+]+3++_^]2+10"&'&#"563232727#"&'&#"5632\EIT?rGrMFYNr Y 0 P ` p P p    Y?@H/+]q3+3/_^]]q3+310##5!!5!3!!!󘑗7 =X!l$ܔtWP :@% Y YYoP/]]]+/+9/+105!5!5!t8dsX B@*Y/?pO_/]]]]3/]]39=/33/+105 5!uZw쑑tW @@)YpO_/?/]]2/]]]]39=/33/+1075 55!tZXXuB; @ YY/+/+_^]103 %! ww{@UrsW@Y??/]/]+10#!`T>  //10#432#".#"Fe2#'+3+ I8'1$+$  //103#"&546323265Fe2#'+3+I8'1$+$+Y?+33105! +@ ??93103#"@ Y?+?39310!!#ؑn"@ Y?+?393105!# ++Y??+393103!!(G+"@ Y?+?393105!3 (+)@  Y??+?3933103!!#(ؑn'@  Y?+??3933105!3# (+*@ Y?+3?3393105!!# ؑ+n+*@ Y?+3?3393105!3! ((+ 5@    Y?3+3??339333105!3!!# ((ؑ+nwp.@  YY?+?+3333105!5! ߑjc @ ?2?39933103#3#jh p 9@  YY?+?+?3393310!!!!#(ؑpב"j -@   Y ?3?+33993310!###בnn#jp ;@    Y Y?+?3?+33993310!!#!!#jm$hpo"p 7@  YY?+?+?33933105!5!5!# (wב)c .@ Y?+3?339933105!### mב+ncp ;@  Y Y?3?+?+33993310#!5#!5!c$p)F)ޑw 7@    YY??+?+33933103!!!!((GǑבj+ *@    Y?2?3+39933103!!33ґt~jw ;@    YY?2?+?+339933103!!3!!jht_2Ǒw 7@   YY?+?+?33933105!5!5!3 ((wב9+c .@  Y?+3?33993310!5!333ctב+wc ;@   Y Y?+?3?+33993310!5!3!3!5!cܑtw6 >@   YY??+?+?339333103!!!!#((ؑǑב"j 1@    Y?2?+?3399333103!!#3#ґtn j G@  Y @ Y  ?2?3?+?+9933333310#3!!#3!!t _" Ǒ <@   YY?+?+??339333105!5!5!3# ((wב9c 1@  Y?+?3?3399333105!3#3# th+~c G@    Y@ Y ?2?3?+?+33993333103#3!5!#!5!ґt 6)ޑp @@   @ Y Y?+3??+333393105!!#5! ؑw"h 4@    Y?+33?3339933105!!### ב+nnp I@   Y Y ?2?3+3?+3333993310#!5!3!!#!5ޑ"בw @@   @ Y Y?+3??+333393105!3!5! ((ߑ9Ǒ+ 4@   Y?+33?3339933105!333! tבt+w I@    Y  Y ?2?3+3?+33339933103!!3!5!5!ґttǑ6V@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# ((((ؑwב9Ǒב"I@       @ Y ?2?3?33+333399333333103!!###!5!33ґtבtnn b@ Y @ Y ?2?3?3+3?3+3333399333333103!!#!5!3!!#3!5!ґtבtǑޑ" 6s/?3310!!3s6s?/3310!!3??3310!!3 g??3310!!gg f??3210!!g $g #'+/37;?CGKOSW[_cgkosw{@j&FVznn'GW{o6Nff7Og*>Z~rr+?[s ":Jbb #;Kccsgokw2Rjj3Skk/C_w.B^wvvgckhk@ Yd`h_[WTW@ Y\XTOKSPS@ YLHPC?GDG@ Y@n?o*Z+[BrCs.^/_@ JzK{۸ GwFv¸!@ ׸@Yԯ@Y@Y{x{@Y|xgkoswc`c@Ydhlpt`OSW[_KHK@YLPTX\H7;?CG303@Y48<@D0#'+/@Y $(, @ Y Y@Ԩx`H00H`x @ ظYA  Y ?3+3/3+39//////////3+33+33+33+33+33+33+33+33+33+3333333339333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#fggggggggggggffffffffffffeggggggggggggffffffffffffeggggggggggggffffffffffffggggggggggggffffffffffffffggggggggggggfffffffffffffffffffffffffegggggggggggg(bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````8EIMQUY]aeimquy}  !@kdx KkHh`{eyOoLl"\a|SsPp&X#] @ Tt* @'Y048<@DD!@ Ժо @Gg "@ .26:>B+ #@  $(,CҸƸYŸĸY@?Y   Y<; Yx{ wz~ g @Y8kosg7jnrff@YX\`dW[_cG@Y4KOSG3JNRFFYY0 @ gGGg  DӸǸY/Y"&*/3+3?+39//////////3+33+33+33+33+33+33+33+33+33+3233333333933333333333333333333333333333310!35#35#35#35#35#353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335#33535355#355#35#3#32fffffffffffgfgfgfgfgfggggggggggggggfgfgfgfffffffffgfgfgfgffgfgfgfg3gggffgfgfgfggfgfgfgffgfgfgfggfgfgfgfffffffffgggggggggfffgfgffggffggffffgg"a"a#`!b!b!```````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb``ba``````aab^^aa```b"bwuVT//3310!!w!T!YY/+/+10!!!7L17}1hd{/10!!dhd{)@ Y @Y/+_^]+10!!!dLPbF"//3310!!C"$2//339107 XV2|4//3310 4ia//33910 a|//3310i9esY -@ Y Y/+/_^]+9=/310!# 3 R7Rb`15>*)0@  ! Y Y/+3/+9333104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbhVeR'/7?GOW_gow@SbfQY.*.QY *>:>QY:VRVQYR^Z^QYZ6njnQY2jF~z~QYBzNvrvQYJr*:RZjzrrzjZR:*b&&"QY&?+9///////3+33+33+33+33+33+33+3+10#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557 /102#"54>fnrotjlw%@  //3399103!32>54.#"%vwvvvwvu}Avvvuvvw%#*@ %$ //339933103!4>32#".'32>54.#"%QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwn^u )@ Y  @ Y /+_^]+10#".546324&#"326^aDpDegGJLfFFfbJM_}kArEgJGgFffFGei+7E|@& ,2?2 EGF>8 H88;;AY5)#)@Y/#;@ H;#;#  YY /++99//+3+3+3/+33333933104$32#"$732>54.#"74632#"&%4632#"&3267#".'?)**))**)h:}NP|9:pGsW.M **))**))N:;M1(DE'5b@"(".76@ Y%/5522,@Y2?2O2o2222 /99//]]+3/33+333933104$32#"$32654&#"32654&#"327'#"&'+)**))**).-WrIp::}NO}9M6))**))**DD)1N:;M'3_@($!!. 45+Y!$!Y1@ Yp $$/]33/]3++33/3+933333333310675373#'#5&''7&'#5367'32654&#"WgHfW3F E3WfHgW3E FxxvvE F3WfHgW3F E3WgHfWzvvv<F"b@ #$Y@ Y  Y/+_^]2+3/3+33933333331035.546323##5#32654&#"Xr{{rH,^_^[xp{{oH:^\]r!l@  "#@Y0 @/ Y/+3/_^]99]+9999399333993104632/!/#"&732654&#"{fQK7@{{H^_^[{@7Qf{{^\]ff!0@ "#  /?//9/]9339310#"&'3!5265#"&5467>5mic<% &;dcmVVfOl9+88+9lMmUUak*0@  +,/?//9/]9339310272#"&'3!5265#"&5463.54>fU|DC37c=% $?d73CD|=m@C$ql;)88);lr$C@m=ffh@   //9104&'54>323>32LwCr@YX@rClY6DўFr@cd@sEㅆw1H  //991053# U::f$@   /3/39933310>54&'#"&546323#)nZVE[S:*& yWM70&sAhDcD8AdDt{YfH3p<~@K  !  gT  'ywV?/]/3]9/3]]3]3]]]3]3]]]3]993333310%"&54632#"&54632%%5^E[S:*VE[S:*:,D8AdQDcD8AdCdPDcQxQ581@   ??9/9333310!##??3%377%`>F`>b@`8kD`<bak=>YYYYG\YY YYm TEA@"aY   aY _Y?+?9/3+39/_^]3+3103#737#733!!!!!^XX|{@䅔={<@!PY /  PY ??9/3+39/_^]3+310!#737#7333#3#fnnnnkknnnnf "ޅEA@# aY aY @ H@ _Y?+?9/+2+32+3103'"#>3332673#"'!#'$ U&dr#p`[0/g}/0rr*9E3@ aY  _Y  _Y ?+?9/+9/3+310#!##73!24!#!!326dD&]'b^ŅɴWE$1@!_Y!!_Y _Y?+?+39/+310327#"&547!2##4)!264=4I?kq!i \9gc'+Ңj?T(*X07=C\@1:1.1PY*+;7@7QY +.@@.% QY%?  PY??+3333??+?399//93+33+310.54>7&#"'!23327#"&547#+ >?'?6MDB@{ˣ,Mz}dcMF [ O!FIRM\ʅ Y`uT(no\ XwScb>RZ$,Dt,2..TpHO$zil^QYK"w;0X!:@Y! PY ?33+33?9/?+99?10733!33#327#"'#&547# qx7 T(||E^ Y)n@".'A&!%.-9hE(@ _Y  _Y?+??39/+10%##!#3!3knOyyn noE6[PhK+@  QYPY?+?+93??10>323##654&#"#3O}suhOX`| KjctwCOQ2ME~de%hE$@   _Y?+??3910 3###33UnOB[ ~+E_h#@  QY?+???910###33 3O/N A ahboa /hE "@ _Y  _Y?+3?+310#!7!7!!˱Owah;hm: "@PYPY ?+3?+31037!7!!#;18jO&tZ%@  _Y _Y??+?+?9910!7#"&54>3273 !27&#" {hY^ n7mvI6J{[Lv;h2N@ Y ??9?+310&#"#3?>32 *?#Hշe ^FgT:32&#"_9Y35 6 fL`M< G!4asExYZUWh/ :DcjN"+@Y ?3?9/993?+310!#'#3736?>32&#"_" k K ;!M]K< G2U:?>DAWh/ 5IE".@ Y ??+?93/33310 #'7&54632?654&#"[qu NZ) ] +5:#$}';@|^Pk<%5522CV"=a1E@ _Y??9/+10#3!ynyoEʠ:@QY/??9/]+10!!#6Y`:6:R%@PY PY PY?+3?+?+10! 467>324&#" $uvp%Ğ784q- ᎉA˥o|%@/]3/399//33107%7%J X bXk/9/310733B0h{hs0*/29/10 '73*LFjdVm__ /3210!7!%73$_ya__ /310!73!/}Gv //9/310!#!73dd  Utv //9/310#7!3!eeUE@ [//+9/10#373"i]U٘G@ [//+9/10#3#7!io,@ [,?+9/10#3#7io,i  /32310##7##!-}--}EOc7c /332103!33733hE}--}-c`Wt/32103#'"pW㾾1:@ [[/?++107373F((((k^j /32107!7!.֔IY{ ?10#73QM,,YyP{ ?10#73Q,,P3@SY PY QY/3?3+3?+?+10##737>32&#"3733𹴹I4-!CMD!!MҴIz D^ai:-@ PY QY?3?3+3?+?310##737>32&#"33𹴹I4-!CME Iz D^aI4*J& `]5 S?3]210#"&54733267ԗCHLm㐭s!$)7J\N<J''f#)FF s  {mhUYK?+310!7!3!H3%TTTD&1&D&'31&'3&&&I7&rw&R&g)&g&f!&gh&kF&{4& 4gFF& s& |}& &S^&u}&\&f-&&&4g1&3&gyF&7&rFF& z&rX#J MNM?3???9910#33673#uVVJJAB _x /RJld#l2  /10#"#6$!3v v2 /103 #&$+ \SE2v  /210.#"#>32[F%=x)1F|5  /31032673#"&']E+yNT*5Bdk=" Ysp H/+]9/1073 Y!$%  [&Y?++310 57332673P`el;4=9DQS [?+1073S!$%] [?+10#7!% W:@ PY  PY?+?3?+10"&'73267!7!O+{iK$W"xŎRME1@ Y@ H  Y?+3?3/++91073#726733Rdr/3t$ytMk(7w@4skMuQ<@  @H  YY?+3?+3/+_^]9107>7>54#"'>32!'hf_\=G!pqf~a|Ma>qECnGS>=gsYBRM(k;TQ*V@+#YO_/o Y Y?+?+9/_^]qr99+910"&=732654+732>54#"'>32hq5-DP)%5F$N-Nj]g~;j` 68WEYm#N'J?9 auUI=qezKqE 6@Y/ ?3?339/]3+3310#7!733!ʍaz , 졡c e 21FxE9@ YYY?+?+9/9+33/310"=732?4#"#!!632 و12u^(8v=AQ_cF6/-[q;ZV"#zME Y?2?+3310#67!7!zQM!qe>@nQ 26@+Y%%Y%Y?+?+9/+93104&#"32>4#"32>"&54>?&54632#.@9O*7.b0@!b1@ pe%K2Hx\hGE1,G #Y7O)UU*Z(X+c[L3kE&VoOKFw>2LE^K/1073^%% H/23104&#"'632#7>,&HJ _kidpN5c}H` Z#&: @PYPY?+3?+10%!!7!!7!|*󎎎+ @  @[/+3231073!73%!7!:$$$$%+ "@  [/+39/3103#773!739ڂ$$$$+ ָ.+ &@   [ /+329/33103#'7373!73ðO$$$$+ a޸+ "@  [/+39/310#'7373!73B$$$$~ }+/29/10737!7!]$$%x+@  /29/3310!7!"'&#"#>3232673%4LM$-4[8U?$A;602\8R&%#(PI)&%TG'r  /332310#'##'##'r(C(C(4eeee  /2210"&54733273՗2)x$%0ǩ+ /39/10#'73!7!Z%~ +  /39/103#7!!"ق%+ 'x+@  /229/310"'&#"#>32326733#754LM$-4[8U?$A;602\8RR&%#(PI)&%TG'h x.S %@ /3299//3310#7!#7"'&#"#>3232673.$$$$\4LM$-4[8U?$A;602\8RSp&%#(PI)&%TG'"> /9/310#7373d '- @ @/9/9310#73#'73373̼him&+   /329/310#7!#7!7!&####%+&:9@ PY   PYPY?+3?+9/_^]3+3103#!!7!#73!7!B|*B?iVCh4&b' J?h (&+555h4&b'_h J 9&+555h4&b'8h J 9&+555h4&b'<h J 9&+555h4&b'D4h@ <@ H<(&+5+55h4&b'D@h@ 7@ H7(&+5+55h4&b'D'h@ <@ H<(&+5+55h4&b'D;h@ 7@ H7(&+5+55 -&j' Ja &+555\4&j',h J %&+555 4&j'h J %&+555C4&j'h J %&+555 ;&j'o&@ @ H%&+5+55J4&j'h&@ @ H%&+5+55 4&j'h&@ @ H%&+5+55@4&j'h&@ @ H%&+5+55}_4&v' J 9h &+555}4&v'Yh J *&+555}_4&v'-h J *&+555}h4&v'9h J *&+555}_4&v'+h4@ @ H*&+5+55}e4&v'5h4@ @ H*&+5+55}_4&v'"h4@ @ H*&+5+55}_4&v'%h4@ @ H*&+5+55&d&Lvwj&+59WY&$@_Y_Y?+?93?+10"&'73267674&#"#33>32_,Dj1OZNx9T́>WKIsnlHfZkc=S|Vs\9WE#@ _Y ??+3?39910"'7326?#3673wS=2(B> B 8W Cm^j8Eڛw5mY%.@_Y_Y?+?99//93?+10"&'7326?674&#"#33>32 ق.0OZNx"N5&T4;lHfZkc"|Vsj7j  ;=?3?310#"&546324&#"3267Ҽz{?:ymw[ZLe}c<;?3?9/10'?31t}Yxy}2j ;<?2?39/10%767>54&#"'>32! `bW:6:^xs|9d.}C:^3+.65Zi^R?cTSL:nj4j(2@%/?; =?3?39///]3910#"&=732654+732654#"'>32 Sa?#3dU{?VxsneZPgshY jL@Yk;7S11]l\RReL}%c (@/?< ;?3?9/]33310#7!7333tf[q.T*q5j@[$@ : =?3?39/993310#"&'732654&#"#!!632Zj D>Wn=C?Y&ulr4Zhr|YRgb;5fU4@(u?mi0j#*@ 0   ;!=?3?399//]9310#"&54>32&#">324&#"326 –~zdz ^NsjHiuA?P[;;QdyL{}"1ik:-^Q5=c|b\ <:?3?10'#67!7!IEFc|#o`{j9j%/*@ ))#/#?###;.=?3?39/]39910#"&546?.54>324#"3264&#"32 ~}[>>Q[shYAP`xLT?8OR0FBRabs^VWz  O4,.D/1NDfi0j#,@/?   =!;?3?399//]93104632#"&'73267#"&732654#"–~zfy F+NrjHiuA?Q[xQc8UK)'x}"1im;0^To_ /39/3103#7#'##73`Rih K`@  /399//310#'73#'##73m`:ihh ,l@ /3299//33104#"'632##72#'##7352,?BT;=SBih@P2BN8"%@ " "/3299//3310".#"#>3232673#?3#R#@<8-3[8U?$A;602\9RԤôX#(PI)&%PJ(pC  /39/3103#7"&=33273-}k_T5k0 }o D7{|} /39/310#'73"&=332738(}k_T5k0 }o D7{|} !@ /22239/10"&=332734#"'632+72}k_T5k0-52,?BVS# S}o D7{|}@P7=77 %!@! /2229/310"&=332737".#"#>3232673coUMC.U%A#A<9P[iW$B=701 \5QbY (+S`g#'##73E>7 MWNW[>-Rih%P_3Q &^=% #%@ /3299//33103#'##7".#"#>3232673U̬hi#@<8-3[8U?$A;602\9Rh#(PI)&%PJ(n, @ @ /239/10"&57332737%3}u:u1ӱIo  @  /239/10"&=332673%73uawu/IϭLMIn + @  /23210"&57332734#"'632#7>}u:u1 THJ _km_pM6.cvI\ (n"n, %!@ ! /2229/310"&5733273"'&#"#>3232673}u:u1A4LM$-3[8U?$A;602\8R|&%#(PI)&%TG'D /10%73Pϭ /107%3J  /3210#'##7%3Jih,x /3210#'73373Rhi6@ [?2+31073!73o$$$$θ  /2210".#"#>3232673*MHE#$/o&{Z,MGC!..p@Z%-%-Ju%-%?8a`7 /2210?33?3b /2210"&=332673䂚ua[[xu-j 5<=4sR/310!7!%>& 'gr>& gr&  &  X&X&X&s &II #/;?+@<39!@!!!- '=/3333]q2232104632#"&74632#"&4632#"&%4632#"&4632#"&3I."".0 0. ".0 .0 // ".X." 00 ".). !/." .HnGb".0 0/!".."".0 .. ".0"--" .. 0/!"...nOv@@ /3]q223/310!!%4632#"&4632#"&3dG." 00 ".). !/." .HnG5j>"--" .. 0/!"...nOv#-@! @ /3]q2239/33]107#7!#%4632#"&4632#"&3oGk." 00 ".). !/." .HnGujju"--" .. 0/!"...nL16.'32>#".7>7&7$&a-9N~\5cMQ|Y;F '2gsrbog!UsVQr[L`76_`:anHDspa!: nTSS!7!3!3!3@-Ҡ:IIS#!7!32673#467##"&547H.Ucz SvRH3TFs"KC0 )p]t?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [uni00A0uni00AD overscoremu1 middot.001AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni200Cuni200Duni200Euni200Funi2012uni2015 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Eminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23undercommaaccent cyrillicbrevecaroncommaaccentcommaaccentrotatedotlessj onefraction twofraction threefraction fourfraction fivefraction sevenfraction eightfraction dotbelow.alt1hookabove.alt4 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capcyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lcgrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.ucmacron_referredlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BES_TES_PE=Pv̑x N O Q R S T V W Y .Xcyrlhebrmark .6>FNVdr Frh$(6NHj0 > !L !!!""H"x""##8#h###$$*&*-111n L $*06<BHNTZ`flrx~ &,28>DJPV\gxxxdx````zz ( K NHfj" zf &,28>DJPV\bhntzfXfX@A22z2zDX<XfXX zf L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzfFfFFFNFNfFffFfNFNNFNfFfFFXFXNFNFfFf&F&NFNpFpDFDDFDXFXDFD0F0FfFfNFNfFffFffFffFffFfFfFNFNFXFXNFNFNFNFFFFfFfFfFFFhFXFXFFfFFFFXFXF F@fFDFXDFXDF0F0FF&F&00FXFXFFzz ( K NHFLRX^djpv|FfFfFfFfFfFfFfFfFfFfFfFfFfnfFff. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzNN00ffMMffff\fffffffffff2fDDXX::DD\lXXffffffffXffNNMMffffffhh00X>0,fTfhfXXXX\lf00&XXTTzz ( K NH T U Vjpv|ffffffffffffffffffffff2ffff2zz<zz2 K N!< K N!J` T U Vzz J` T U Vzz T U VJ` T U V K N! T U VJ` T U V K N! 4<zz4Jzz4< K N!4J K N!Jl T U V T U VzzJb T U V zzJl T U V T U V K N!Jb T U V  K N!n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFvFFFFvFFFFFFvFFFFFFFFFFFF^F^F^FF^FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF<<FFzz ( K NH FRFFn L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFfFFFFfF F FpFFFfFFFFFFFFF\FFF4F4F4FFRFFFF F FF\FFFFFFFFFFFFFFFFF F FFFFFFFFF\FFF FFFFFF F Fzz ( K NH FFn L $*06<BHNTZ`flrx~ &,28>DJPV\H L>  zX    >  fH vvL> X vH>LLzz ( K NH ( > T U V  K L$*  K L$*  K L$*  K L$*  K L$*  K L$*  K L"  K L$*$*$*$*$*$*$*$*$*$*$*$*$*"("(n L $*06<BHNTZ`flrx~ &,28>DJPV\ 8LppppLL Lzz ( K NH ffn L $*06<BHNTZ`flrx~ &,28>DJPV\ff&ffff,fffff,ffffffffffffffffff  ffffff,fff,fffffffff,,zz ( K NH T U Vflrx~:::::::::::::::::::::n L $*06<BHNTZ`flrx~ &,28>DJPV\FFDFDF&FFfF&F&FFF&FF&F&FFfFfFfF&F&F&F&F&F&FF&F&F&F&F&F&FFF&F&FF&FF&FFFFFFFFFDFDF&FRFfF&FRFFFF&FF&F&F&F&F&FFFfFfFFFFFFFFzz ( K NH:@FLRX^djpv|FpFpFpFpFFpFF~FpFFFFnn L $*06<BHNTZ`flrx~ &,28>DJPV\ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffzz ( K NH T U Vflrx~pppppppppppppppppppppppp@p 8 >fcyrlhebr&MKD SRB ccmpdliglocl" $,(>NJ WJ Y X 8BLV`jt~ (2<FP T U V S   N M K L (06<   ", zzJ",6@  openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationMono-Regular.ttf0000644000076500000240000114410013402025764025674 0ustar kintelstaff00000000000000 FFTMa 8GDEFypTGPOSNQ3>GSUB(k_"OS/2n`cmapC'h.cvt gmW:fpgm~a-gasp (glyf)Pubheadn,6hhea9d$hmtx%`locaQ^=x%dmaxp  nameo7w) post<Ȕ5|[prep5Lz3_<̓G̓G%%z X X"H[/\33af  @x1ASC@ #~g`:E 6B+VPtNr|g`ttt^,qqffOL $$IsucE^Bl84OtNGt82wk qfffff8$}tnBBqqqqqqqq5buU6fffOOOOLLeL$B$III:9Wf9kg]qirUff2&dlL:LIF{x rYY2YYYYSfqfqff4uYY2q]8n_srfsfs}OLx$YIffff$BFF)uc)3!  yuq %1/5x1hhc84rIuED;zfzIh 22/FC@h_4m &66kvv.Q`.T&.-t 76tttttss*.KC8Y[O?^>LMK8JLD% G5Ot%ttA8SSSSSSSOWu`7 If flL$$1;$5pr\\2:X550{(6fq z(UhnZd fn6ufqfKWqWqOGCfqL$_YViWV4 fBF^f\j|FE5 u\5BH?c E?c#?.Lf S Sf<'Hqn%kP7C <TTSqL$E$E$^__ _fghCMzfffW|BBB_ ij7{$}$}n a giVq\ f;\qq;9VVw/HNN7{ X ` %FsumJ`'   Uhp55%99??E [E  C-0--RR-*8~?:-?~!*D"V6h|Cu*AT*W.c"muWVVX -:8Q-@**SA7u@@4 +bbotqqcccfffftOOOOOLLLL E E$^$^$BIIIB@jUfffIXffffffff$B$B$B$BGG@G@$$\55555555$"YY55G@55555555$$YY22**w**$$@555550w0w; L]PuMZne6qq"Pc-1[L<qq;_ %9vvvvi iuN4lttstsjjjjjjjfwhh4sh%%n<fafp_nIq`$RJ   TT  Z7{`'N7{~`%suJ`' Nuu%?7YXSU|SSljH- T//``t$~~6ou~EMWY[]}   " & . 0 4 : < > D ^ o  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# 8tz HPY[]_   & * 0 2 9 < > D ^ j  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 7/*wg\"(% 9,?>52/,)" EBA$"!+(ډaa$    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvj72s9:gw*-,q5l|Zcn1T6+m}bx:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A&SMURMUVTUTO3NUL3MU==<U<:U;=:U54A.444.U3H2U22.U1=0U00.U/=.U .`.. . .U-=U,pADD>UC=BUB>U?=>@gUP(F(F*F5o_o@ F&=F@FF@36FF>U@ =U=U=UAU P@SU P܀ܰ3_oP&p 0p/?o߼& 0Pp@)F P? @+Hа/?Э/?ЪA 2U @P`p&F&0@F@ F<A E<GE<FE@(d@1F@F@ F/? o @ &Sߐ0/o @ F 0O_o0/@F  0   F @PF&J<=<J 00@ FsP&oF5nF5U3U3U`P&_P&&F@F^ZH\F1[ZHZF12UU2U<5@(F @%P&RPQQ@Q58F@Q%(FPLLFKFHP@bJF&IF5HF5GF5FFFFU2UU2UUd?_/Oo?oOTS++KRK P[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++++stu++++s++tt++s++++s++++++++++++++++++++stts+++++++s+sttt+usttt++ss+++s+++++++s++sts+sststtst+ssst+s+ststu+st+ss++sss+s++++++t++^s+^s++++^ssssts++++s++++s+++^st++s++s++s++++++++++}E`E:w_WW~4|_ox^`tPL {+kk>nE`LN[^io^h&J{uh iq[RpMMddhEEzEM nLbF ["x`Sy_hHHHH `TthT4 ` p ( TT(x<<LHlD4pHx  !4!p!""L"#x$$%&8&'(())x)*++,(,-@../ /t0,01412T23L3344556779 9|:;<\<<==>t??@@AtAABxBC\DDLDDEEEFF@FtFG|GGHH4HhHHHI,IJJHJxJJK KtLPLLLMMDMNNO O@O|OOQ(QPQQQRR@RlRRSTTLTxTTUUVlVVVW,WXXX0X`XXXYY<YlYYYZ$ZPZZZ[[\\] ]<]h]]]^^D^t^^__,_\___``ahbbLb|bbc c8c`ccdde<eleeefHfxfg$gLgxgggh|ii@ipiiijjPkkkll0l\llmnnoo0oXoooppDpppppqqDqhqqrDrs sPsssttXtttuu@upuuvv4vdvvvwwHwxydytz,z{`{|}}~<~0D @l| Lx$0x T 0 |4HDHxx4H$T@p Xx|@lDL|<\@Hx@l4h0d,\$TDldD°4ø0HĀPŀŬ4dƐ40̼ͬδhld  DֈDذT ܄(|T,,<D4T8pP|l,\T\40LX 0D\xdt 0    l , Dxt`pL`ttD(lLl|,t $ d  !!D!!""P""#$#x#$$T$%`%&H&&'(()D)T))**X**++`+,,d,,-8--.@.//X//0080|011H112D2p23343t34D445$5h564667 7P7788<8|889<9|9::@:::;;;,>>?@?l??@L@x@@AALAABLBC(CpCCDXDEELEEFFLGGHHILL`LM MMNNNOOPLPPQDQtQRRlRSTHTUUV,VWhX$XYYpYZ(Z`ZtZ[P\\(\l\]]T]^4^t^_@`,```p``aHaXahaxb8bHbXbbbchcxccd\dld|ePe`effgg@glggghij$jkldlmnnnoDoppq<qrs sttuvvw wTwwwxyzPzhzz{|||}}~(~hP LtHpH(8H|$tP@0@PT$4DTl80@P`|LTd` hDT@$P`$4D`pD Hp <l8hP`pp (TDhDp8pX0lDȐDxdLD<Τ8XhT@ؐ4ڌۄ܌ݴl߄P4(<0xp@PDpHp\DTxD|<PDT(8hL|0`x$X  H |    H x  0 d  D  T 0T|$dt\lH <d H0 d !!D!l!!"$"4"""## #0##$%4%%&H&&' 'd'($(`((() )H))**8**++,,-T--.\./,//0t0112823X34l456 6`7777784899;(< <<=0=>t>?T?d?@`@@@AdABCDDE8EFLFG(G8GH|IDITIdItJKKLL LlL|M MN NOPQQRRSDSxSThTUTUV0VWtWXXY\ZZ[\]^_d``abcxcdHeef$fggph(hi,ijhjk|lTlmln(nnnooopDpqqrstuvwyyz{|}t~P~ |\<XDT(@$,L,|x\T\lp8TDd L`,\, <$p(Lt8`8X Hp8pH|\(Px4(Px(X 4d|¤¼$<ppĤ4ŐHxƤ HpǘDxȬ@hɘ@hʐʸ 4\˄ˬŤ0X̀Ͱ<pΠ$L|Ϩ <hИ<dь,\ӘH|԰LՀմ h֜8lנ@xؠ(Xلٸ Tڈڼ$`ۘ Hpܘ,`ݔ0dޘ8dߔ$T$T$Tx8h8d,`,D\tP 8PhH|0H`x8l<p0`,`x P TH|L(@p,X@l8t(d @`$P| @`,X4` @`<l $L$<h0H`x,\L|T<l  0 ` x        @ l       X   \ (XTx@\pD|| Xx8h@(<Pdx\l !"$#$&&&'()D*+,-.0D1$182X3\4H5L66789L9l99::h:;|;<<<<=>>?@<@A A<ALAABCClCDEF<FGDGGHDHHIIHIIJJ`JJKLKLLPLM M|MN4NOO\OP,PPQdQRPRS STTUU|UVlWWXTXXXYYD\ciiDiij(jTjjjkkl0nnoDoplqrstuhvvww`wxyzTz{x| |~D HlL`$lx P0$p PPt(8HXhl`Ld@,<tH,DlD$x`,0pL |pd`LX,(d0x8t@ HPHdT8x,h,4 $Ph X,@0¨8t 0|X`@  //9933103!!!mD*@ [?/+9/933310#353M!@ ?33/2993310#3#3()M6E@j     !  ! Y Y O _ OO_@"H   /3?399//+]q]q33+3333+339939939939223910!!#!##53#5!3!33!!CXnVTnTCYnXkXnX@EjCAlhhl=lhhl=Bs~$,4@f 2 )- %-56**sY1 ) sY ))@ 'H@H2  sY  @ P ` @ P  ?33/]3/]q+3?3/++33/9/3+3+39933333393310#5$7'.546753.'4.'>~ZFIр-m\./Zw~7d| Y%~})a^!jlV*H\y.9M3e*BV9#) uQ%1[@6,## & 32)Y [ /Y  Y [Y???+++?+++932393333103#3% #"&5464&#"326 #"&5464&#"326ݑ?JMBBLGC?JMBBLGCIwmjztpowmjztpo+M%1;j@C6, &$2.4  <=E2 2  . 42 )QY!99QY?3+3?+9_^]^]]93333310"&'#"&5%.54632673274&#">&'3260I2$ +OX%,v+a(:%0`LYo=b4Jx@} F;Ȳ 7>54&#"'>32!1ϲr Ο!umݎWox}qsxIKZ*v@A'$,$$ +,'sY!!!sY! sY@@?3/]q+?+3/9/_^]+9993333339910#"$'7!2654.+532>54&#"'>32K$[afbVRw 랉r¼~yKg79hGjwzo»wgeE F@'    sY  / o   ??39/]33+399333310#!533 !r{Ǽ ??zCKKEX@- sYsYsY sY?3/+?+9/+3/+993333333310#"&'732654&#"#!!632Kv 9써I~?/!usѨ|.7ؑWZHZ#[@2 $%sY_  sY  !sY?+?3/_^]+9/_^]]+993333310#"3 &#">324&#"326H?S51s跙JK~Y=\|[_ΐCwK̨-E ,@  sY??+39939310#!5!-'XaLFZ&2j@9- ' " -'34 %*%*sY%%sY0sY?+?+9/+93_^]]993333339910#"&54675.54>324&#"3 4&#"326F{poʃlpއ{|#zҺpbXYeqoqrnozxr?Z#_@8 $% sY  sY sYp?3/]+?+9/_^]3+993333310#"&'7327#"5463 4&#"32>?+6(tĠLNZmɮE{:'@ [[/+?+933310!33++`:0@ [[[?+++993393103! +jtW;@ ?o@H/]3/+]39=/339933105 tZ;tXWV@; Yo@HY0P`pPp/]]q+/+_^]+9933105!5!tXtW9@?o@H/+]2/]39=/3399331075 5tZ㚙on^^1Z!E@!!! "# [_Y?+3//+9/9933933310#>7>54&#"'6$32531,S\nG)-O_kC( IraBPJV7Fo]GNJU7mu~ g,<I@R=-.D.5 '55JKF FY @Y    _ o    -  -199#Y91*Y1/+?+9///_^]^]3^]3/+33+399339333310#"=7##"&54632373325#"3267#"&5$324&#"326"{NjwagG[ tc(1Ncڴ|^eGsw~bF;?jArJv9XkȹSZDX*UzFXWcZmjm:E S@*   _Y ZK?2?33]]9/3+3/9323933999910!!#3 ! ͉ Eϭ~E'YE P@(  _Y_Y_Y?+?+9/+99933393910#!! 4&+3 4&+!26(|,Q |Ezk[`rx"yqvZe@?    _Y0@P  _Y ?+3/_^]q?3/+_^]]939333103267! ! .#":e9S%gAjSAqeE(@  _Y_Y?+?+993310)! &+32e7ICyE bE W@6   _Y//?__Y _Y?+?+9/_^]q+9333103!!!!!(dEZ3=E L@/ _YO_?o @)H_Y??+9/+_^]r+93310!!#!\{EqOZP@  @ H_Y _Y _Y?+?3/+9/++993333910%#"! &#"!267!5!M ZsPЩUD.߅sJ[V8* P*E ;@   _YP ?2?39/]q+99333310!!#3!3k oE6E 9@ _Y _Y?+3?+393333310!!!!5!!7<<E E0@ _Y _Y?3/+?+9933910#"&'732!5!Ҿ#uYv E H@&     H v?2?399]33+99333993310!#33 <E~+E_LE@_Y?+?9931033!EWKEH@  @ H?2?39/3+33933333310!4?#&'#3?3@N/,dBdUJ.E5Z*E D@&   ziuf?33]]]?3]]]399333310!#3&53DjRE`ffZ (@  _Y _Y?+?+993310#"32! 32fȞfWQ`_E 4@ _Y_Y??+9/+9933310#!#!24!#326_wݑ}nEf}qZ C@$!"_Y_Y `Y_  /]+?3+?+93339310327#"&'&32! 32fŷ)e7<]U?Ȟ,~r c@Q`E _@5     _YO?o _Y?2?+9/_^]q+399333933310!##!24)!26?E*OhZ,J@(" -."  `Y _Y@P?3/]+?3/+999333310# 732654.'.54632.# h7JAjDR*,}5[yEz_D'rf%u|rFX8#*BUnJ!peEzVE[@1   /O_   $  ?3333]3?39/]39933933333310!# '#3>33JM+1wӽm +zEO1#h }SE׊ZC$E @@!     ?3?3999339933910 3 # # 3fMMMD|?=$E>@! @P`???39/]]33933923310#3 3ļvtHHcIE 5@  _Y_Y?+3?+399333310)5!5!!2aW(@ YY?+?+933310!!!#oWusZ@ ??9933103ϲ5 W1(@ YY?+?+9333105!!5!o#W_FE1@?3]3/2993393310 #3z|#u$@ Y/+33105!``:@ [?+9310%53N"/d@:-'' 01(QY o PY #PYQY ?33/++?+3/_^]9/+93333310%27#"&'##"&5%754&#"'!2%2>=M!DGd[Ajtvh .y*`Rv|EYopipyj];sTX$.PQ\RY0cRRdB!8@  "#PY PY?3+???3+99333310#"'##653363 4&#"326B˽Z[{y"0h 6YA\8Nh@ p`p @ HPY PY@H?3/+]+?+3/+_^]q9933331032.#"3267#"vl wy"[ijm `Y ":@#$ PY PY?3+?3+??99333310%#"!23'3#.532654&#"^1yʾy1wxi_6Vb6t+lFNO@,  PY PY PY ?3/]]+?+9/+93333103267#"32"!Bg,%HYM-|& үHK3@  PY PY??3+3?+9933310#!5!54632.#"!DH*/hj1Tͬ  .h] XK!/Q@+(" 01%PY,PY PY 0?2/]+?3+?3+?9933333310"&'7325##"32346734&#"32>gq\1xƷq-!z3laUFXKQ;gj ia 6ݿߗP_0@   PY??3+?3993333103363 #4&#"# i^is|z;/e <@  SY PYPY?+3?+?+93333310%!!5!!5!'53|*ȎuWD6@  SYPY PY?+?+?+9933310#"&'53265!5!'53DO-{iK"wŎe =@    ?2??993399333339910!#33 Iboa /\ ,@ PYPY?+3?+933310%!!5!!5!|*ՎcdN'E@"''   ()#PY  ?22??333+39933393910!4&#"#4'33>323>32#4&#"1A@O"hNXW(oUvf1ABM{S*0f]`djZ/{N/@  PY  ?2??+39933310!4&#"#4'33632dis|iS*,9Oͻ/IN (@  PY PY?+?+993310#"324&#"326I$WBP#8@  $%PY !PY?3+???3+99333310!"'##4'33>324&#"326BxU2}ºzz"ʸY63ci_WJ"5@  #$ PY PY?2+??3+99333310234673#7##"4&#"32615|ʾՈyzJY_ 66ke6N)@RY ???+3993310&#"#4&'33>32pdƴ(2`_hfLcppi5$K&N@* '( PYp  PY?3/+?3/_^]+999333310#"&'73 54&'$.54632.#"$!}beLɰ xwS\wR5VO@OAJoSHJy:Rys*,9Op]E: 4@   UD?33]]?3993393310!#3?3O 4#':@5uv:Z@.    u  ?3333]3?333/9/39933933333310!#'#36734>73̏9'˷]!'  eʋ:>6WilZ_V_^m: <@    ?2?3999333393310! # 3 3 s,*sD,[BW:9@     PY?+?39/39933993310"'5326?373$J2&.O0*[)68YW v1/~n,: 5@ PYPY?+3?+39933331035!5!!LVω&ڋW%#V@2# #$%Y/#Y"Y?+?+9/_^]+9933310"&54&'5>5463!#"; [PgfP[W_kxzh`XkbgjYW@ ??93103WuW#Z@5   $% Y/YY?+?+9/_^]+9933310532654675.54&+5!2#[QffP\ WYj[faZiZiyyjl)`'8@ Y@H@ H @ Y  /]+3++2+99102327#"&'&#"56sfW$r=#5354632.#"!!!2672WG%͙"uNzxhHSX;9 ,NqRym9?@s}؎,55/s'a@3"()  Y0  %Y/+3/3/_^]]+933333/399331047'76327'#"''7&732654&#"Ndhcrrah`PRdfermiffNursurdgeRPai`urdieNPiifrrvt4EZ@/    `Y `Y  ??399//33+33+3933932310!!!!#!5!7!5!3 3A}@eimi9&@ ??99//93331033  T,4A@I?;;,/85 22,,5%,BC8/?)/$/ //"QY` QY?2/+/3/_^]+99_^]]33339933333333399399102.#"#"&'732654.'.5467.5464&'>xm}32327#"'##"&732>=δT\ +24+fyRFEsBvfu{+DM jx:<^ MYr}@JDm63C`T@)       [ ?2+39=/33333933333333310%53 !53 RToPQm?sm?stW(@ Y?+_^]99310%!5!N~p&*3}@E)&0 !**+&!&45!)0Y"/Y""!! !0""0! Y Y?+?+9///_^]]++33993993333393310#"$54$32#"32##!24&+326  \vǡ3hUݟ_QPTFF-GHuP?~of{PEHURBG Z 3@ Y  Y ?+3/_^]+933310#"&546324&#"326vvxxmgKKgiIJh=wuuwLhjJJjitW h@7    Y Y_oY H/+3+3_^]q++/+9933933310#!5!3!5!XuvX83D@"     YY?+3?+3/_^]993333310'>7>54&#"'>32!:laXGJDX ~^`d3gEKBr<>KIDlpKD]\2k2'%~@G" &'"  Y_o  / YY@?3/]+?+3/_^]9/^]]+9993333339910# '73254+532654&#"'>32 =9P\JGDT VZ[jt mHA7>733267#"$#5,S\nG)-O_kC(qOIraCOJV7Fo]FOJU7mu~ &$C&%+5+5&$v]@ &]%+5+5&$@ &%+5+5&$@ &%%+5+5]&$j@ &%+55+55`&$U@ #%+55?55E@L   _Y _Y//?__Y _Y?3+?+399//_^]q++99933339999910!#!!!!!!#!GzIMdER/qDvZ&&zb  %+5b&(C &  %+5+5b&(v[@  &?  %+5+5b&( & %+5+5b]&(j & %+55+55&,C & %+5+5&,vg@  &g %+5+5&,@  & %+5+5]&,j@  &%+55+55eE \@4_Y?  _Y _Y?+?+9/_^]q3+3993333910)#53! !32&+!e7ICߢy!U[YG  A*&1@ &% %+5+5ff&2C&%+5+5ff&2vb@ &b%+5+5ff&2@ &%+5+5ff&2@ & -%+5+5ff]&2j@ &%+55+55.s $@  ?399339310 7   bh^^i`fJb`g_iia8p"Y@2  #$! !_Y _Y?3+?39+99933339910#"''7&3274'32&# fڀu^_ـt^`OMA#Q`AߤrR t=&8C&%+5+5=&8vV@ &V%+5+5=&8@ &%+5+5=]&8j@ &%+55+55$&<ve@  &e %+5+5_E 6@ `Y `Y  ??99//++99333310#!#3!24&+326_tۖ翿 oĔ1V@/ ,'' 23 ,$$PY$  PY`p?3/]+??+999339933910#"/32654&'.5467>54&#"#4632p:E\bRd\[96:5mqG*BwY_'1!$_OCi=7~R=d-0T2M]案e?<"*EP<&DC0&p14%+5+5&DvM@ 0&/03%+5+5&D1& 6д60%+]5+5&D"@0&0: ::ڴ:G%+]]]5+5{&Dj@ 0& 4Ҵ42%+]55+55 &D@ 3&60%+55+55N(5<@J "1911'):''=>6 PY9PY1QY99$" o  ,,PY ?3/]33+3?3/_^]3399//+++399333333933399103267#"&'#"&5%754&#"'>3263232>="!.KYDy"4aJ@HJCGU99@`6zOQ.R]i X^H-nzzn];oQ[RdYXY0dMD8N&FzQ !%+5F&HC& %+5+5F&Hvo@ &o %+5+5F&H@ &! %+5+5F{&Hj@ & %+55+55e&C@  &` P  %+]]5+5e&vh@  &T %+5+5e& "@ &`P0 %+]]]5+5e{&j)/@ &p`P@  %+]]]]]]55+55}N&@J !'( -  "   PY  $PY ?3/3?+99//_^]3+9_^]]99333999102&''7&'3%#"5464&#"326d^U7mPZ7K;zsn^WG$Brl\!&Q @ & #0 %+5+5I&RC&%+5+5I&Rve@ &e%+5+5I&R@ &%+5+5I&R@ &"/%+5+5I{&Rj@ &%+55+55tWu U@5   Y[YO_ Y?+_^]q++++99933310535!53n]N#_@5  $%! !PY  PY?3/+?3/9+99933339910#"''7&53274'326%&#"]MLTczHNPa!M"KkWD_ dRDZ__ؒ\@Y&XC& %+5+5&XvZ@ &T %+5+5&X&  %+5+5{&Xj& %+55+55BW&\vk@ &k %+5+5WB >@!" PY PY?+3?+3??993333104&#"326>32!"'##3zz2}xU"Mi_ʸYuYA\BW{&\j@ & %+55+55^&$ @ &%+5+5S&D0&10%+5+5&$@ &%+5+5&D@ 0&3;%+5+5`E&$ %+5UN&Dq´99%+5qv&&v@ &v %+5+58&Fvf@ &o%+5+5qv&&@ & %+5+58&F@ & !%+5+5qvf&&@ & %+5+58&F@ &%+5+5qv&&@ & %+5+58&F@ &#%+5+5e&'&ƴ%+5+5#)W@)$$&''+*+&) @Y&& !PY PY?3+?3+?3/+?993333333310%#"323'3#.532654&#"531ab1>]iorg`Oūi_#  )Vb6t+lɽ!$%eE*d@'%+,QY(PY@ H "PY ??3+?+3+?9/_^]3+399333310#.5##"!23'5!5!53332654&#"1yʾy1,vy36t+i_+Vb_b^&(  & %+5+5FS&H@ & %+5+5b&( & %+5+5F&H@ && %+5+5bf&( &  %+5+5F&H@ & %+5+5UbE&(K´ %+5UFN&H>$$%+5b&( & %+5+5F&H&# %+5+5qO&*@ &  %+5+5X&J@ 1&60%+5+5qO&*@ & % %+5+5X&J@ 0&3;%+5+5qOf&* @ & %+5+5X&J@ 0&02%+5+5qYOZ&*  %+5X&J@ 2& 30%+5+5*&+@  &  %+5+5W@.  PY YY?2++?39/3+93333933333103363 #4&#"##'##573 i^is|ihE;k{E[@1    _Y `YP ?3?399//]q33+33+99333333331053!533##!##55! iĔo5\@)QY PY   H ??+]q+9/3+3?39393333103!!363 #4&#"##53+ i^is|̝;M&,@  &#%+5+5e& &!%+5+5^&, @  & %+5+5eS& & %+5+5&,@  &%+5+5e&@  & %+5+5UE&,  %+55Ue&L8&%+55f&,@  & %+5+5e: ,@ PYPY?+3?+933310%!!5!!5!|*󎎎bE;@ _Y _Y ??3+?+3/9333103#%265!5!#"&'7bh_ʼ%gE _uW%H@(   PY 0`?2?/]q3/3?+9333333103#533#"&'5326553ѴO-{: "w%)&-x@ &%+5+5uW&gYE&.  %+5Ye&N  %+5e: <@    ?2?39933933339910!#33 Ibt:/L&/v&h %+5+5\ G@$   Y@PYPY?+3?++9333333310%!!5!!5!'573|*Ԏ)`YLE&/ Ӵ %+5Y\&O %+5LE&/,@  %+5?5U&O ɴ %+5?5LE&/T f%+5k&OT %+556LE H@'    / _Y?+?99//_^]92399333103'73%!uB$==y`yn\O@*         PYPY?+3?+99//_^]99333107!!5!'%!5!>|*@tq{p/*&1vz@ &z %+5+5&Qv@ & %+5+5Y*E&1 %+5YN&Q %+5*&1@ & %+5+5&Q@ &! %+5+5F&Qi*  %+]5?5UZ#C@"  $%!!`Y! _Y?3/+???+3993239310#"&'732654&#"#4'336! U\>+F.OJt|jk?Yd<'_*,9OWN!8@ "#PY PY???+3?+933310"#4'33632#"'52654&|ixyM2>E8iõS*,9Oͻ Hh"ff^&2 @ &%+5+5IS&R@ &%+5+5ff&2@ &!%+5+5I&R@ &#%+5+5ff&2-@ &_%+55+55S&R@@ &r%+55+55Ky@J   !_YO_?_o  _Y _Y ?3/+3?3/+39/_^]qr+93333910!#"!2!!!!!%27&#"a9):3.ro;H&=R\^DH9!N%,o@; )!*-.)PY)) &PY# #PY  ?3/]]33+3?33+39/+99333393399103267#"'#"3263 %4&#"326"!.WQAN?QSOU?kO[[U^RLHVDP^H-!'S&5vH@ & %+5+5&UvY@ &; %+5+5YE&5Ŵ %+5YN&UҴ %+5&5& %+5+5&U& %+5+5Oh&6vx@ -&-0%+5+5$&VvV@ '&V'*%+5+5Oh&6@ .&3-%+5+5$&V@ (&-'%+5+5ODhZ&6zL 1-%+5D$K&VzV +'%+5Oh&6@ -& /5%+5+5$&V@ '&)/%+5+5LYE&7 %+5YT&W %+5L&7@ & %+5+5e&W8%+55LEF@#   _Y _Y  ??9/3+3+393333939103###53!5!E4XlTR@,PYPY PY ?+?3/39/3+3+393333310!327#"&=#53#533!!PUa:xPOL".%=&8@ &)%+5+5&X&$1 %+5+5=^&8 @ &%+5+5S&X& %+5+5=&8@ &%+5+5&X&% %+5+5=&8.@Hp%+55]]]]+55 &X&  %+55+55K&88@ &j%+55+55Q&X>@ &j  %+55+55U=E&8; =%+5U8:&X! "" %+5&:& %+5+5&Z& %+5+5$&< & %+5+5BW&\& %+5+5$]&<j@  & %+55+55I&=vf@  &f %+5+5,&]vU@  &[ %+5+5If&= @  & %+5+5,&]@  & %+5+5I&= @  & %+5+5,&]@  & %+5+5K@ PY??+99310!#4632.#"DH*/hj1Sͬ  .h]:B)f@.$*+'PYQY  !PY H ??+3+9/_^]3+3?3+?9933333310353!!363 #"'##65#4&#"326:1[˽ZNzy9A\0h 6fE!)\@.' *+''_Y' ' &`Y_Y?+?+399//+999333339910#!"&5463! 4&+3264&+3 MB8}Q{},|DG18A%gAjSi GMAq%W@ &'##PY#  @ YPY?++?+99//9993333931032>32&#".#"3267#"us/4$+B7vl wy"Q~ GM[ijm `Y eEeE=@  _Y`Y_Y?+?++9/99333310)"&546; &+32eMBIC>DG18A< 9+E ?@   _Y  _Y _Y?+?+9/+993339104$3!!5!!"$73!!"9B)3դѲ|ps$G@%& @Y"PY PY?3+?3+?+?993339210%#"!23'!5!#.532654&#"^1yʾy1wxi_6Vb6~*lWIN>@"   PYPYPY?+?+3?+933310!5!.'.5324&#"326II_dimVۄYX[Өk+E ?@   _Y _Y _Y?+?+9/+9933991035!!5!!5!kd(͚geZE@#   _Y  _Y_Y?+?+99//+993333310>3 #"5!!" !Lٛ 5d9# nuwObWPɪs]Y%T@-"##&'`Y"" _Y  _Y?+?+9///+993333310"$5467$54$32.#"!3#"3 `뵍H5{bGGwWѶCΜAqygڔy}pMW=EV@3 _YO_?o @)H_Y _Y/+?+9/+_^]r+99333910!!#"'7325!\=R#3$h{aW-YM@'    QY  sY?+?9/_^]3+3993339999102&#"!!##737>OQ(6LTL.$Y=_2΃q,&&Z@/ "%'(_Y%$_Y %%_Y_Y?+?+99//9++933339310%#"!254632&#"&#"!267!5!M tz6B8 G>QϩUB6߅sJ[Ve GM8'#PWEB@!       _Y/+?3999933933310"&54?3 3'4&'326htMFHO;:.((.Wrd~7er)_yy_)154id#C@# "" $% PY PY?+???+3?93333310".54&#"#3363232653Id{;5MYl~z1sx3\OE`@3   `Y  _Y _Y?+3?+39/_^]3+39333333310!!3#!!5!#53!7<<EfZJ@%  _Y?3?+?93993333399310!#4632&#"3 !BB29~<=s?2leH@$  RY?3?+?93993333399310!#4632&#"3 BB2BIbo /\L@&   PY PYPY?+3?+9/3+39333333103#!!5!#53!5!|*-rRM@*       ?3?99?9/9939299310#&'#''7'37.ľ)*E.I6 uM?PIB=H >L[g[xoW*E5@  _Y?2+?33993333310!#"'53253&53DG2,8sjN `WNhffZfH@%  _Y `Y  _Y _Y?+?+9/++99333310#"3 65#53! 32f LvRXâ"ȞfWYX?rjnN!B@! "# RY PY PY?+?+?+9/99333310#"3 65#534&#"326IE_X`^$Cjr7,02XqZC@"    _Y_Y?+?+?9339333310%#"32%3##'&#"327}qc++Gv~>&K_fWDmG@3+ &WND@#   PY PY??+?+?9339333310##"!2%3"327&۳9QR3:*@84W?',!0+Ar.iED@"  _Y`Y??+399//+993333310+#"&5463!24!#326iwݑMBr}nDG18A<WB)C@#$  *+!PYRY 'PY?3+??+?3+993333910!"&'##4632&#"3>324&#"326Bx{'6'%8<}2~ºxz"^ZYMgaEK@&   _Y_Y??99//++3993333339310 ##3!2 4)!26꿿#ZEs*dxZ(R@*#$$ )* &## ##&& _Y& `Y?+3/?+3/_^]999933333104>7>54! '>323267!"$d3_Ec;-/UJJ9mQ^J& 2L^Hs{x~%"K'T@+!"" () %!!%%PY%p  PY?+3/_^]?+3/9999333333104>7>54#"'>3 3267#"&+UAlN+ҰYh`!>cO@');.~UzU=O?QZRS"lETW$S@ %&Y@ H"Y  Y?++9/++933333104632327#"&5#"&732654&#"o^;:64EA=ThM<01<;20<ZeDK  gU1<<10<<WT M@ !"  Y @ YPY?3+3?+?+9933333310533!!327#"'5326=#"&5:xPUaCD82<6[LtOL"BG} E5@  _Y??+39/9333310##"&5463!žMB:WE4QL6$=@   `Y_Y?+??39/+993333310>5#53#"&332653_YXÒοitoSj!MmЛF:$T@#  #%&$ PY  @ Y  ?33?99//+3?+?993333331032653>5#53#.'##"&5hVvyRFX{@n:Rxst#hZj1*,9OsZ:E#C@! !!$% _Y _Y?+?3+333993399332210"47+5!32654'5!#"'fᮣu,ㆂ,uDIl bܭb mfZ-@ _Y _Y?+??+93310"&533264&#"'63 Yݿ|nKOZ:2CNI?cO CpKZ:@     _Y?+??9933933923102&#"#3 >c?n;TM;/4v 0xZ-3E.$HONLWF@     @Y PY?+?933?+999399310"'532?3367>32&#"*F2&*`*PL,olRDHa3IWW ,/~(@ {x]>\IE\@1     _Y `Y _Y?+3?9/_^]3+3+3939939910!!5!!!!!5!{T]<av;,,:\@1     PY PY PY?+3?9/_^]3+3+3939939910!!5!!!!!5!Lrg%iF[VsEK@(  _Y `Y_Y?+3?9/3++9333310 !5!#".'732654&+  ͐=?JIKFVEJ@' `Y _Y_Y ?+?+9/+39333310#"3267# 4%5!!?Jȷ=T'.ՅK$/WF:K@( PY  PY PY?+?+99//3+9333310!#"3 7#"5475!JR$i~  jVh:(S@,#()*PYPY((&PY?+99//+3+393333310#".54>7>54!5!3 7h(ҊiUrddtOa4BeL\OnN+*Q:J=*w wRlH+".A0IR{QZ!Z@.   #"!!`Y `Y `Y ?+3/?+9/3+393993229910!654&#"'>323!!!5>7!{ir j~XT3¿7wln}qȼtup:u~xEEG@& _Y_Y `Y?3/+?+39/+933310#"&'732654&+#5!!32E"#q۶qD«~uʜ!:G@&   PY PY PY?+3?3/+9/+9333104&+#5!!32#"&'73 l\J%i Zhd¡ aq1)E@#'$  *+"#"QY '&# PY ?3/+?39+393333310#"&'732654.'.=#5373"UUN*%'LsK{?aSD,&;Jb@WQO`1?, S_s[NWWBP?@   @Y PY ???3+9/+99333310#336324&#">B㵩 [ͺ{mshiJꯤM ?9310!3 4rZ@  ?22993310!333r44JC@!  _Y _Y ?99//3+33+393333310!3!!!!#!5!!rrtt:̙`4DY &y@@ !!% $$ '($!!_Y"%%_Y [ Y ?++3?3+33?3+33933333333933331053373#+32&+32!5!5!!hhɥzYo{cs|y{{ E XY &u@A  $##%% '($`Y! `Y!_Y_Y [ Y ?++3?3+?+?++933333333933331053373#+32&+325!5!!hhɥzYo{cs`{{E X+Ջ2 +5@M & //-.242-672/0/PY0-3,3PY,)PY #PY  [ Y ?++3?3+?3+???+3?+3933333393333331053373##"323'3#&532654&#"5!5!!hh[ NEzrGL :DB88AB=`{{W?6;U-d+ՋYwE8@ _Y _Y_Y?+??+?+9331033!73265#5!#"'Y8w32wͺb\VZuk7AG[!pXonwŎS*_d/&$ E@ &%+5+5&D1&ٴ39%+5+5&, E@  & %+5+5e& & %+5+5ff&2 E@ &%+5+5I&R@ &!%+5+5=&8 E@ &%+5+5&X&# %+5+5=+&8f@&%+555+555j&X&j J=+&8f@&%+555+555&X&jv=+&8e@"&%+555+555&X&j=+&8f@&%+555+555&X&jCFN+&$f@&%+555+555P&D&j JB@:@H:@H:@H:@ H:@ H:0&Ҵ42%+555+55+++++5+&$f@ &%+55+55P&D& J>@5@H5@H5@H5@ H5@ H50&Ҵ03%+55+5+++++5^& @ &%+5+5R& J@ >&?@(%+5+5qZ j@8   !"`Y_Y  _Y _Y?+?+9///_^]+3+39999322333103##"! &#"!275!5!5!5!M ZsQϩU/sJ[V8KbkfXZK&4k@0 .'%56 "PY1PY11 +PY &&Y?2+3?3+?9/+3?+9/9933333333103!##"32346733##"&'73267!4.#"32>faÿq-BK$/ix HP}yQGia6]ysZiu\ɹ]qO&* E@ &# %+5+5X&J1&39%+5+5&. E & %+5+5e P@)     [ Y   ?3?9933?++39933339310!#33 #'53373I}hiboE /fUfZ&2$UIN&R'fUf^&2' "@ &%+5+5UIR&R& J-@ &%+5+54V&y E5&+5WR&S&+5uW&@ &%+5+5YE L@' _Y_Y?3+33?3+33933333310+32&+32!5!5!!ɥzYo{cs|E XYE U@, `Y_Y_Y?3+33?+9/+3933333310+32&+325!5!!ɥzYo{cs`E X+Ջ2!+d@6*$()%##(-,(%&%PY&#)")PY"PY PY?3+?3+???+3?+393333333310%#"323'3#&532654&#"5!5!! NEzrGL :DB88AB=`|W?6;U-d+ՋqO&* C@ &r %+5+5X&JvB@ 5&Q14%+5+5]xEC@"   _Y `Y ?+??399//+993933231032653! !#3!332!"6i⿸>@;%;(AG("#(#822MN3QY""/""@ H""%%J@+DY+@!H+;@ JpJJ H;H;@ HJ;;J.= ..PY?33+3/9///+++_^]^]]++933/+_^]+9933339333933310327#"&'##"&5%754&#"'67.546322>=5734&#"326N35*;!DGd[Ajtvh $10mo`Rv|EYf]A87CC78A4Z<.PQpipyj];sTX/X2Yno5\RY0cRRdc%..%&..&v& %+5+5&vZ@ =&Z=@'%+5+58&vd@ #&e#&%+5+5n]&vd@ $&d$' %+5+5&$&%+55+55_&D;&]85%+55+55&$f@ &%+5+5&DQ;&ʹ;3%+5+5b&($& %+55+55sF&H&&# %+55+55b&(z& %+5+5F&Hf@ &&& %+5+5r&,& %+55+55e&&%+55+55&,f@ & %+5+5e&p& %+5+5ff&2!&%+55+55sI&R#& %+55+55ff&2f@ !&!%+5+5I&Rf@ #&#%+5+5&50!& %+55+55s&U!&q %+55+55&5l!&ϴ! %+5+5&U@ !&! %+5+5=&8&%+55+55}&X%&" %+55+55=&8f@ &%+5+5&Xf%&% %+5+5O9hZ&6n 16%+59$K&Vn +0%+5L9E&7n  %+59T&Wn %+5xU1Z"W@-  #$ _Y   _Y_Y?++99//93+9333993105$54&'5,54&#"'>321W^*%IfDs>Um;F@Pha2I(norTlO[i[H<VN&_@$ !!!'( @ Y$  @ YPY?++99//93+933399310%5,54&'5>54&#"'>32>H-+gӚ܃D{xr%4ڽ@97B6M?L4^2Q^tIflU\!P5/y*&+ E@  & %+5+5Q@,  [Y PY?3+?3?++393333333103363 #4&#"##'53373 i^is|hiD;/W=Z/@    `Y  ???+399333104&#"#3632rU8ٻWKgMF$V#/;j@9$"6* "0" <="69PY3PY -PY 'PY?3+?3+9/9+??+99333339310%#"323'3632#"''67532654&#"4&#"326-hj+A G=4?kWZbywSq>Dzu`pO0AP^9Ys'2c@4.$$'(  34+!!+`Y`Y!! '`Y 1`Y ?++99//++9399393993310#"$54675.546732654&'4&#"3 z~彩܉ARŢ|%}aSTY^yl|M'4F@%+% 1 56 ((QY!.PY?+29/+9993333102654&'7#"&54675.5467"32654.f}QII{po{IIQ}Ij}Q~#qDp ɏԐ pDq#~Q~WNIE;@ _Y _Y?+3?+39933333107!5!!2'654&#!I2SGM~MM"8 G> ?:;@ PY PY?+3?+39933333107!5!!2'654&#!LVɓGM&psGV"1'?<f&$ @ & %+5+5&D3&13%+5+5DbE&(zvDFN&HzVff+&2f@&%+555+555Ij&R&j J<!@H!@ H!@H!@ H!&%+555+55++++5ff+&2f@ "&".%+55+55I&R& JJ@3@ H3&"/%+55+5+5fff&2 @ & %+5+5I&R@ &%+5+5ff+&2f@ &%+55+55Ij&R& J2@ H@H@ H&%+55+5+++5$j&< J@  & %+5+5BWR&\ J@ & %+5+5VA@" PY   PY ?+?9/9+993333910632#"''674&#"326kD;H{JOnb9:&> G=4?swSq>uV0AP^9VN'3c@4.#'('45.'$!#!!1PY!PY+QY ??9/+?+3?+999333333104&#"#4'33>32632#"''674&#"326@UVe0~Y{D;}H{JOnyl9:&> G=4?yS*,9Or[nySq>u`0AP^9T%T@-  &'PYPY    #PY ?+??39/9++3993333333310632#"''67#533!!4&#"326DBH{JQnyl:xP9:&: D<4?wSq>u`C>0ATZ9F#-7]@0$ 33)!!).)891+ +PY 5''PY ??333+3?333+3?93333333310!&5##"323'33>32#"'#32#"4&#"326"7t{Ie""eI{t9CAGGCBHFB2^)BRq_qRB^2aMFWN!*3V@,"/'+45!-))PY1%%PY ??333+3?333+3?933333333103632!"&'##7## 3234732#"#"3269wOa  aOv7AI򈡟HB:2^FNpGpMG"/^2OMa p@;  _Y  ?3?39/933+33333339399339910!!#7#33 3/! mMLXc.7! E~tEvGd'ԫ)w$m@=  %& _Y"_Y ?3/+?+3/_^]99333339223107&!273&'3267#"'#&#"|ps:# Te9P‚'Lg<IJ\A%`Ac2{ ?uWW%l@>  !  &' ! `PY#PY ?3/+?+3/_^]9993/39332310%&323&'3267#"'#&#"ZI<Ɂ "7Q`tXŎ -0",Y5=VD..#hl %F˰e cLE ;@   _Y _Y?+?9/3+3999223103#533!!!튊m\M@)wM@'   _Y ??39+33933333333310 ##!5!7337#̾ĢEjSS(E N{ %VK;b@'3&-, ,&<=37"))0PY---)  @ YPY?33/++?3/_^]+99333310#"'3267#"/&'&'732654&/.54632.#"!FE"6`8g8~ICM9uXbJʳnzt0^~I(+ !q;*RTaWX=TT@P"(MnP~HMJK.<*%$=JaVr:C@ PY @ YPY?+3+?+393310%2327#"./.+5!5!t>QBD2 4<`8g81NE:%DN8/P#Dq;18G, $3L7@ `Y `Y?+3/9/+93310!3 4&#"'6$3 4KT$ ƹuvN8@ QY PY ??+3/9/+93310!2654&#"'>32mףۣ{Ï&!E&}@H $  '(`Y$$_Y$$ $0$P$$$$ #_Y _Y?+?+99//_^]]qq+93+39333333910#!#53! 4&+!!!264&+3 (}b Q,|Hxzvrxyk[` EG@#   _Y _Y?+?39/33+3399333333103##"&5#533!326=!=݃24uj|XXBUbC EM b@V  _Y_Y //?_ _Y?3+3?39/_^]q3+3+3993333993310!#7#!733#3!!!!3#aa::bJ2)EZ3yX[#'+@X $$"!'& +* (,-"*&PY$ $PY+    PY ?3/]]+??9/99993+3+9?93333339933103267#"'#&323"!&%&'59g,\L_OϺ%4Tu7dYM-|Vc 0ү3.h!N`EH@$  _Y_Y_Y ?3/+?+9/3+3993333103##"&'7325!5!!5!چҾ#r\혱uuWFP@$ SYPYPY  Y?+?+9/3+3?+993333310!!#"&'53265!5!!5!'53DO-{ziKi"wCqWZ"D@" #$ _Y _Y_Y?3++?3+?993333310 5#"!273327327&#"fi873/:\ZOW _pMQ`\MBQCRy>WN ,A@"'! -.RY $PY *PY?3+?3+??+993333310%7##"!234673327#"&54&#"326c6{687&02J|xy1k[6We;lQC EM@' _Y _Y ?3?+9/3+339333333310!###53!24)!26??p*NH@  RY  @ Y  ??9/3+3?+3993333910&#"!!##5354&'33>32pd q||(2`_hfELcppi5 Eh@3    `Y  ??39/933+333393339933399399999103!#!53'3!737! 츟͙JHp%W: r@' !" @Y PY?+?39/933+3333933992993992299103##"'5326?#533!37!CtYJ2&.O0)vS v1HUUn+19N"/V@-(-01(QY((PY #PY QY?+3/3+?+99//+93333310"56323>323267!"&54&"7>54&l!DGd[A:jtvh .*&`Rv|EYpipyj;sTXܻPQ\RY0cRRdJ$:@ %&PY "PY?3+?3+??99333310%#"!234673#&'4&#"326a5}˽1yxke6Y_3OJltBP"8@  #$PY  PY?3+???3+99333310#"'##654'3363 4&#"326B˽Z [zy"0h 6i[9yB+C@#&& ,-#PYRY )PY?3+??+?3+993333910#"'##654632&#"363 4&#"326B˽ZBO:E?E[zy"0h 6ŎLHqA\AN<@ PY PY?+?+99//99333310#"&'73 4&#"'>3 A#7l |{'ծjm ^ZEN+O@, $) ,-&PY) PY  PY?+?+99//9+9333310"''67&532&#">3 '2>54#"} 8{H%_"垒Y^DZVwO%aYt2"ەRZj呜(D+k_]'W'C@" " ()%PY PY RY?+?3+?3+?993333310#"##"!23'332732654&#"2J1yʾy187&0lwxc (/i_6VbQC *D@" %%+,RY(PY "PY?3+?3++?993333310%#"!23'5!2&#"#.532654&#"^1yʾy1AF:;ywxi_6Vb(;6~*lFNE@# PY  PY PY?+?+99//+993333310532#"&'73265"!.,gᇙ I&ۄ|-MYζҩFNE@#  PY PY PY ?+?+99//+9933333104&#"'>32#"5267!g,ۆCYM-|!./N!)i@" ((  *+ @ Y"))PY!  %PY PY ?+?+9///33+33+993333333310.#"'>3 7327#"&'# 53265'~_\+ΙZPr (&)=6VKMlK {yyӁsWO-DC(;z(5?oɺOANf%N5N3r@"!!/* /145,& @$Y1PY/!!,,PY PY?+?+9////93+9+93333333310#"&'732654&+532654&#"'>3273267#"&'cltpt`Z]pi^ʢ"/2%=";~U[!y!^]W`\NR]e\DC4yp7MN'F@%!! () PY %%PY%PY?+?+9/+993331032654&+532654&#"32# CBxnv`Z]pkxnˁ&`sYRT\NP_ '?yr^Sxn9:4@ PY  Y ??3++39933310%3!!#"&'532>=!5H*/hj1Tͬ  .h] X&4Z@.-' %%56!RY 1 PY11*PYPY?+?3+99//+3+99333333310"&'7325##"3234632&#"4&#"32>gq\fƷq- &729@Az3laUFXKQ; ia1 NF|8ݿߗP_XKJ(NE@#PY PY PY?+?+99//+993339210!# 4632.#"3275#yO{u擩ulj^EJZjC1W:E@$  PY ?3?+9933933333310%3 3#"&54>4'326;dn0}kj}%LK'$%']umm(Z\SQ.43A 8N@$44!,9: !(/( @Y4++ / PY?+?39/993+3/393993310%4.'322'&#"#"&54?.#"'>32?> )  GHL8r!??#-3R}kj}P1-#?>"r8Lau)77(u*3L00/]`\o2[55^QjxxjV]055[2o\`WnFFmXW:0@  PY?3+?3?99333310%#"&5332653#?e>yb~p]RysJ:@ RYPY ?3++?399333910!2&#"363 #4&#"#EI5B~ i^is|(d;/W%D@# $$%%&'%PYRY PY ?3++?+?9333910!2&#"363 #"'52654&#"#EI5B~ i^xyM2>E8is|(d; Hh"eS@+  S[ PY PYPY?+3?+9/3+3?+93333333103#!!5!#53!5!'53|*iVCs:%@  PY  Y?+?+9310327# !5!97!,2-%QF (: 1@ PY PY?+3?+3933310!!!!5!!3@?:⎎\ Q@* !" PYPY  PY PY?+3?+99//3++39333331032673#"'!!5!&#"#>3!5! Z`#|*'kT7/0rr=0/h|\b@2     QYQYPYPY?+3?+99//+33+3933333393103#!!5!#"&546;!5!5#"3੩|*dfմ3;nځ5˃kc{<3iW"@  PY RY?+?+9310327# !5!977/E-sQC(Wd@3  ! PY PYQY???9/+3+3?+9/993339933331033!#"&'732>54&+5!璼'7aORn䁘_aShi:'D@" & &()'##PY ??333+3?339333931032653#/##"&'##"&5332651A@O"hNXW(oUvf1ABM:R{_*0f]`djZR{shWc:&D@"% %'(&""PY ??333+3?339333931032653#47##"&'##"&5332651A@O#eEXW(oUvf1ABM:R{_#|YN`djZR{scWdN0P@* 00(# 12!%PY!,PY  ?3??3+333?+9333933310!4&#"#4'33>323>32#"'52654&#"1A@O"iMXW(oUvfxy@2>E81ABM{S*0f]`djZ Hh{WN!9@ !!"#PY PY ??+??+399333310!4&#"#"'52654'33632dis|xxM2>E8i Hh*,9Oͻ/WN 7@"! PYRY?+???+39933310327# 4&#"#4'33632u>,@;is|is(8S*,9Oͻ:0@  ?3?399993333310 '3#&'#g%7(!:SJ}:GbAg:IN8N"f@8  #$QY PYPY PY PY?+?3+?3+?+9/_^]+933333310!!!5#"325!!4&#"326bvABY$LLO[[U_RqK_ #0?SS4N&D@" $$'(!!PY! PY?+?3+39/9933931032654#"326= #"&'#"&5NNTGʽHTNNO+a[,Mjð丳j{}'LWIN@)    PY PYPY??3+3?+??+993933333210&%34&'>%ihrqiejlcW2~-fD:)@RY ???+3993310732653#&'##"'pdƴ(2`_hfCLcppi5)@RY ???+3993310732653#&'##"'pdƴ(2`_hfLcppi5Wx:5@RY  Y??+?+39933310732653327#"##"'pdƴ873/;G.`\hfNQC (kfe3WN)@RY ???+3993310&#"#4&'33>32pdƴ(2`_hf[fLcppi5WN2@  !RY RY?+??+39933310&#"327# 4&'33>32pd876+".(2`_hfQC (>Lcppi5N @  RY??+99310!!2&#" igdh/WN @   RY ??+993104&#"563 hdgi  WSn: I@$    PYPY ?3?+9/+399333339310!#!2##!254&#lӻ}atk:#=\[n:I@$   PY PY?+?39/+399333339310%2654#!33#!3zlsL}ϼ-[\=":W$K4c@4 +&%%56+"")PY&p& &&"RYPY?3/+?+?3/_^]+99993333333910#"'327# 73 54&'$.54632.#"$ηez9*"$+ DhnbfMɰ ux+NlAAqI5; (y=H ?P@JoTII.9&)FmW.@    Y  Y?+?+933310"'532>54632&#"O7<96=k,1BMKW,UhiuW C@!" PY  Y  Y?+?+?3+393333310%34632&#"3##"'532>=#AZ11BMKO7<96=޲iGF,Uh%WN.@    Y  Y?+?+933310"&54&#"56323274KKB1,W849<7W ffW,rV'R@## ()%PY# @ Y PY?+?+9/9+933333310/#".546324632&#"3265&#"fynFTQI{I@Dk,1BMKUA/>IN9:61ZuXe=qTv+i86_O1Ad;@PY  Y?+9/3+39933310##!5!4&#"5632:xPUaOL".aWT6@    @ YPY?3+3?+9933310533!!327#"&5:xPUaOL".8I:%N@'"!&'"PY PY ??3+?39/33+3399333333310!33##.'##"&=#5326=!hll>ykk b://*,9Op]{=XyuW:/?@ ((#--01% PY" PY?+?3+3993399332210"547>54&+53232654'&546;#"fT3!++R|YmCDCDnX|R++ 4TԌvH@*gW_tt]]tt_Xf*>IvD:vE: (@    ?2?393333103#/#4#':6uv>:*@  ?222?39/3933103>3#5#&'#̏9 2˷]!'  e:)+_>6XilZ_VD.@   PY ?3+93933102&#"#&'#>J2&.O0[)ʾY v1m:;:2@ ??3933933392310!3 35W`){KW:C@"  PY  PY RY?+?+3?+3993333310327#"5!5!5!!,+75%C:LVsQC (&N: Q@+ !"PYPYPY ?3+33?9/++39933392210%>32+'7!5!5!%"32654& eav0"78j./dFMF6{gxy^T=u&ڷQf,7'-zWA:L@( PY PY PY?+3?+99//+3933310!#"&'732654&+5!iv،RK:Nj wǤV: *^@6(#  ,+%PYPY# !QY  PY?+3?+99//9+3+933310!'#".54632654&+5!27&#"iA>Cd|_SKiaISx:ƃn8I}EzJu?J,i:5=J1:@  PY   PY??+99//+933310!32654&#"'>324Ek׾ic~1:@  PY  PY??+99//+933310!&4>32.# 327J}ᓲlԣE4cik1;@   PYPY?+?+9/?933310#"&'73 4&#"l}ᓲl,E4jci2V@N=@ PYPY?++99//99333310!2&#"327#  (֞"S rffZ C@ @   Y  Y?++9/99393210#"32! 32%53f ȞhfWYX::zIN'P@," "() PY   %%PY%PY?+?+9/_^]+99333104.#";# 32>7!"&5467.54632I{oz;@鍈xHyom,W^QN\Rf]Ě㣒o"qX'`@   %%() @Y 'PY   PY #PY?+?+99//9++99333333910!# 4632>32&#".#"3275#yO{u擠fs/4$+B7ulj^EJO} GMZjC:IW9"Q@*"  $# S[ PY PY PY?+?+9/3+3?+9933333310!!!#"&546;!26=#"53POgĊV\MAQ:$%bY}~N9kk<98A'hn: =@        ???399339933932310 73## ;n%2: b4i :"@  Y?+?99310)3!X:[W(A@"# )*&PYRY PY?2+?+??3+993333310234632&#"#7##"4&#"326}37'%8<}5}˽ՈyxJVd"ke61[@2  !QYPY   PY?+?9///_^]+3+393333310!32654&#"'>32!!#5!34EkU ׾icn{1]@3! QYPY  PY ??+9///_^]+3+393333310!5!5!5&4>32.# 327!!JU}ᓲlԣE43͙{ncik{2"%d@5##$&'%%PY PY PY#PY?+3?3+?+3??+3933333333310!&5##"323'3!!32#" !7t{Ie" AGGCc2^)BRqnՋ22W/9@G0 ""5!/& %))% /!:;,,PY,% # PY#! && QY&&7PY3PY??3+?+39/+3??+3?+9/93333333331032654&+'!#&5##"323'3!#"&'32#"MBSap_. 7t{Ie"{*AGGCWEĬt}2^)BRqn]!uS$.19~@D% 558/*08"" :;11PY2PY/,PY (PY 5PY?3+3?3+?+??9/9++3933333333993310!'7#&5##"323'3!3>32!32#" !"3254)2-7t{Ie";L_egAGGC^p-F'Kx58u2^)BRqn՚c\(pIK[9,"4a@311 -%-56%PY0 QY 4PY?+?3+3?3/_^]+999333333310#!"&5#5373!632.#"254.'.547#3׿Ytm}!xBC cR!=#"&53327/:xk,1BMKO7<96=Uaj0iu,Uh7"tOL,0<t@6 $4--;&=>!PY QY*7PY&;**  @ Y1PY?+?+?399//9++3?+9333333310"'#"&5#53733#327&53 &#">32'2654&#"Zdon}!x8G=?L04}p"S`_7sRnck82/\7A-ddzȃkUF5"ΏeWI&}kXGGF0;6;AFWd1c@5*11$    23(-PY("#"QY1#  RY PY?3+?+?3?3+3?+9333333333103>32!"'53254&#"#'###5354632&#""h[znG g@4    ?3?3?33399//333/333933333333310# #333# #333z|{zą|{z #885#88D@"     RY RY?+?399//3+9933333310#!#!#!#!rr?4?V'L9@  RYPY?3+?+?99333310%##"&54.#"'63 32653#r0p50(.0?hYkoPUp;)ZsW@L(?@!((#)*% RY% RYPY?3+?+??+993333310%##"&54.#"'63 32653327#"&5r0p50(.0?hYkoES/9MAPUp;)ZssC+b@ F@ A HY3. IY1?3+?3?+9333310>32#4&#"#432&#")oTvs{FRXf{10"/VbMD{qR}h>O udDp=@  IYH[,?++9}/933331053#"'52653){PT9*4!{Wuu)ea_9>)(1@  HY 10.???3+93333104'33>32&#"tJF%NOJq@bGt}rh/ 0 HY /.??3+?933310#'##"'53265tLF%ONq@`It}_F=@  HY  0 HY 4?+?9/3+9333310327#"=#"'53265&&'3&NH$MO9/ qPEt}4 X@  I@ Y@ H  0 IY .?+?39/+3+9933333931033#!3254+]f}z5x\fsem`I@   0 0 .?333?3?393333333310#&'#373?3u  y| x'~0IR9<U>M 8@   0IY4?+?393393310%"'52673731#98]+܃C/A_XtZˋM M @  ?9/93310546733%+y_YaC} @  ?9/93310#65#5%+y_Y̒aC} @  ?9/93310##.=Y_y,$}F^&x @   /99331026544#&*77*TeeT8117UfWWgx @ G?993310"&5463"3UddU*77*xhVWfU71186E@  I@ Y  IY,.??+3/9/+93331032654&#"'>32*iYWh~pb hs 6E@ I@ Y  IY,.??+3/9/+9333105.54632&#"327Fq~hWYi* ĥsh kNc! vW&@/329333310%# #3WvW&@/329333310%#3 3fHK @ Y [?3++9310#'##573ih "@ [Y?++39310#'53373hi.G?9310#3qqLQxS@ Y?+9910!5!x' @ G?93331053`@ G?933310'53Sς.j/9310#3qqjLTyk@ Y?+9910!5!y%j@ /933310'53ςjj@ /93331053j:(@ ??9993339310#'73e ee e:c:@ ?293910#'e e:&\ @   /993310%26544#&*77*TeeT8117UfWWg\ @ /993310%"&5463"3UddU*77*\hVWfU7118 @  /33933310%!53533{q{l @  /23933310##5#5!{q{gl *@    /9/333933310##5#53533{q{{q{ }}l||./39910!5!p- (@   [Y?++3993310"&'332673e|VRUUu?FF?w 4@"9P`0`/]qr^]/931053 t|X Z@>  Y   @ H Y/Oo/?Oo@H/+]q++_^]+933310#"&546324&#"326XopmoyA87CC78ADWqqWYnoX%..%&..U&@ Y?+/9333310#"&54673327?LijSH@S1-6=pfUD)$}B*0/@  Y[Y ?2+++3993310".#"#>3232673*TPM# o /R?,TPJ!%( pc%-%$@`b6%-%/Hn 1@   [ ?3+393333310573!573ϻ6ϻe @    /329933107327#"324P;~U*N#D<(4 - *@     /32993310''7'77XXXXXXXX G@   IY /3/+9933933333331033#"&5474'32ǂ JQIIRJ232AzSHYYHS323273*TNG76 [ 0Q?,TNEd\dl%-%>9fi=%-%wx*@ [@[/++9333105353|1@ /299310!#!1QP|1@ /299310!#5!W1@ /299310!3!1jWPW1@ /299310!53!jW@  /32993310!3!53WPX@ /2993103!!iYȇKX .@ /9/39993332310!#53!Vpp M#@ /333310'53ς  #/33321053 K )@   ?32333393310#'##53KihC"@   /32333310".#"#>323273F*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wxS/33310!5!%#T/233105!#$ 8@#  //?O/]q22333310"&'332673xi cLJciw;IG=zZ/331053Zլ{@ ?2233331053!53sӥø+&@  /3233393104&#"'632#5>3*HFZjQ[pE0"c;U 2x8b @   /32333310#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99 )@  ?223323331053353K )@ ?32333393310#53373khi:?3210#3:qqLY@ ?23323310#3#36qqqqLL +@  ?2233333310%53!%53$G$d -@   ?229/333339310"&'332673#5xi cLJciw;IG=z$ @    ?323333102#.#"#>wibJLc i{>FI;wd @  ?9/32210546733e&({^XjA~d @  ?9/33310#65#5d&({^X̨jA~d @  ?9/33310##.=^X^{(&~@h @    ?9/33310'67#53UP,h^$%G*[i@ /333310'53NςiOj/32231053j?_@ /9/3332210#5#5353oo_sqr^_@ /9/333331033##ooKrqsy@ ?233210#!5!y9> @  ?9/33310#65#5%+y_Y̒aC}W_  /33310"&5463"3_UddU*77*WhVWfU7118LW@ /23329310!53533{q{WlMW @ /33339310##5#5!{q{glKW .@    /9/33333933310##5#53533{q{{q{}}l||9c/33310!5!9p֍W  /2333107!"'53253U2ExW  /2333107327# xE2U3(W@ /3233331053!53sӥW8W @  /32333310#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--999b @     /]333310#65#53b,(u^XWu/dZJD;@    Y@ HY?+/9/++3933310!"'53254&+739!1%=HAk'^^bV(*dSLU"@  Y?+/33310#"&54673327?LijWD@S1-6=pfUF&$}B*0WC/3210#3CW^Wy@ /32333310#5!#!yWPc}0@   /33223333393910#"&533265332653#"MD^\a..7A\A7..a\^r&5lLCJEEJDKlWE[ &@ /32333393310#'53373ehiWWA[ (@   /32333393310#'##573Aihlr$v @  /32333310"&'332673xi cLJcirw;IG=zr$v @   /223333102#.#"#>wibJLc i{>FI;wWgc"@  /3322333310".#"#>323273*TNG76 [ 0Q?,TNEd\dW%-%>9fi=%-%wx;/33310!5!%iT/333105!iW9@ /32333310!5!!5!9ppvvg"@  /22223333107".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx_/33310!5!_BV/33310!5!VW}/3310 'ccba/3310 #X N\ @   /33331026544#]*77*TeeT8117UfWWgWy@ /32332310!3!53yWPDW@ /32332310!!5#x_Wx纺^0@   /333223322393910&#"#4&#"#>32>32J7<\<7Jb ZNp9 N6N_ JJEEJJNZ[3(ZN%r% .@    /3293333910''7'77WVWVUSUSli(@ /3299333333105>54.5467i/PS,1#_s-0# 1?$ M&*15<"DN L$,25; U0@ /223333105!%5!W ffff@ ?333310#5x  N@ ?333210#5Nx  ]'@    ?2/33/3333210".#"#323273*GAA%/3 e,IDA$[fi%49%mze @  ?9/33310#65#5e%+y_Y̒aC}S 2@    /33333333933310#553!53u| 쬬W @   /233310327#"=3>!,&!p y"@ /32333310#5!#!yP W~@ /323333105!5! jjjjGW@ /32332310#3#33W^^5W@ /333310!#5!Yug]@.        ?2/32/3/33/99333393992910&#"#>3273273#"''P(c[ 0Q?>O=a=*d\dU;Q=azfi=0l6lzx1m7bi B@  ! /3299//3/33/33333933310".#"#>32326735353+QLE72 h 0R?,RKD62je7 '!53Y]6!'!72kլp1G@!!"" ./ 2&&/"+""   ?3/22/32/3/32/33333323310".#"#>3232673".#"#>3232673+QLE72 h 0R?,RKD62jeU+QLE72 h 0R?,RKD62je '!53Y]6!'!72k '!53Y]6!'!72kW (@   /329/3333233105#'735vvOW @ /333393105#7#;v|W %-5=EKQYaiqy<@HrvjnFRV6:.zz2~bbfZZ^>>"B&*MM*B^f~v LI O OLL |Pdh\`@D(tt,x ll$pTTXI88<04xpXI<44557449 885667775558849*557sNsmmIt}!"@/93333331057'5窪xRr``rx\  /33310"&5463"3\UddU*77*xhVWfU7118$ 6@  [?2+9/3333393102#.#"#>53wibJLc i{>FI;wO%B 1@    /3293333993310''7'77WVWVUSUStV @ /933333310%5r``rRtV@ /93333321057'5窪Rr``rV H@!    /99//92333333399333331057'5#'#3窪r``rRRr``rx] @   /33331026544#\*77*TeeT8117UfWWge @  [ ?+33104632#"&8''89&'8'89&'88AVA@!         /29/9333339393107''7'7'3 ]CKNB^ S3K%z)~)y%L5WE+<@&&  ,# ) /332223333333939910#"'#"&5463263232654&#"4&#"326EiNY33YOhiNZ22ZOh=,,;;,,==,,;;,,=NeIIeNNeHHeN36=,,=6336=,,=68g4@ /9/3333310#7!3_q@_q@SW @  Y/2+333310! 332$7^JK^6svvS2 $@  @Y?+2333210! 332$7^JK^2svvS@ Y/+3310!5!JSU@ Y/+3310!5!JS&@   /9/33/3333210#"%$#"#>32327-^t-{Y͑9VUT\(-VS6 @   /22333310&$#"#! ^^0/ÂvvsSW@ /9/33332105!5!5ϖlv#/`@) -0*I@ Y! IY1$$IY.?2+3?+99//9+3333339310"&546?54&#"'6!2327#"&'#'2>=ipoMQQL (3,F;/y@Bi=}bAyjx~*_N:? ΄}99O LMVJ_@m<>OQ?CJY@ I@Y@ H A IY1 IY /?+?+99//++3333333103267#"&5463 '.#"idP`kqD~ a]YgMB3 [YȽkaynyn=.A 0.H[2?+??33331053332#4&#"#3)oTvs{FRXf{{bMD{qR}h>p%N@%  &!IY1 0 .?33?93?3+333333933104&#"#'33>323632#4&#";8NN\zs&eLTaCpey8ON[kXzsFX`#NCFKkXwvFO/@   A HY 10.??9?+3333104'33>32&#"tJF%NOJq@bGt}rW<@ IY 0IY/?+?3+33333310#"5#53733#327;AUZ$R"+-]]7, X /@  0.?3?3333393310#3>3E04C!O ?@     0.?3?3932232393310 #33DŽ :r(v6@ ?33331053n uWx@ /322310#5n߈W6AN8Nf@>  RY`p PY PY?3/]+?+3/_^]9/+933331032.#"3267#"%53vl wy"[ijm `Y ǬANh@? RY/ PY PYp?3/]+?+3/_^]q9/+9333310#"&'73 4&#"'>3 53A#7l |{'ծjm ^Z`:!@  [?+93331053Oū!$%7A ?@  Y  [?+2+39333331053753!53 6Œ!o%F&$8&P%%+5?5%@[?o/]+93103+F&(a8P&H H%+++5?5iE Z@    @Y_YP ?2?39/]q+3/+993333333310!!#3!353XOūoE6!$%F&,8&P&H H̴%+++5?5Z&2F8P%+5?5EY@   @Y @P`???39/]]333+9392333333310#3353MQOūHHY!$%Z$*b@'((%*%!  ! !+,'* @Y'  _Y _Y?+?3+33/3?+993333993333331026;!5>54&#"!532&54653_.1|xx|1._~OūZf [ٽ\ eA̱!$%]A&j9 %+555555E$E%[E@_Y??+99310!#!!{DE EI@'      _Y?+3///?33_^]]9333310353!&' ?/43$N y sbE(IE=*E+ffZ X@9 _Y/_  _Y _Y?+?+9/_^]q+93310#"32! 32!5fȞfWQ`VE,E. E 2@  ZK ?2?33]]9333310!#&'#30$5VzEKE0*E1FE W@5  _Y /  / ? _   _Y_Y?+?+9/_^]q+993399105!5!!5UcWffZ2*E#@ _Y?2?+9933103!#!EW_E3lE S@*   _Y  _Y?+3?9/_^]33+3993393331035 5!!!lm%ݡa|LE7$E<O )V@.%!  +*&&`Y%%`Y??99//]3+33+393333310+#5#".54;53324&+326%;#"x׌))x¥ ǣ ŠقᤲH$E;1E<@   `Y ??339/3+393333310!#"53;332653+:㡐33:K0ȳOs;Z#D@#!   !$%  _Y _Y?+?3+33393333331026;!5654&#"!532&5gu,,uZl bܭb mIC&,j @  &%+55+55$&<j @  & %+55+55&b8<@ &&&)%+5+5A&f8P@ (&=(+ %+5+5W&h8P@ &O %+5+5]&j8@ &  %+5+5DA&v9%+555555N%X@0 &'#PY   PY{?3]+?3_^]+??993333333310%#"323673#.'3267.#"vs~-22T;/#rxwyywtjbg=!1Wg)M@) #' *+'&'&PY''PY  PY?+??+9/+99333310#"'##46324&#"32654>gܷߔyn@Qŗ^rXܷW;bp+1 5X:@@$  v; K [   ?2?9/33]]93339910 >3#67 J6&KE$@):o /pU ?@" !"  PY PY?+?9+393333104.'326'#"5475!8Qbȧ54&'.545#!5!wss|GS~ \NnHU2"{Nc#Hc@e8R3J##_]<WN0@  PY  ????+399333104&#"#4'33632dis|iW`S*,9Oͻ6 >@QYQY PY?+/+9/+99333310#"!22!"! 6*#}}t ]::@   PY  PY?+3/_^]?+933310327#"&5!5!PTne^ZoejxOe:rRF@&@H  PY ?+?39/+33_^]9333310.#"'>32#.'#3V5:23#b$KdT; /8d' 8A$Z~W}:7@   PY ??3?33+399333310332653327#"&'##"&'kw#+A0[_jCmWRsKF^d)&\6:(@  ?3?39333310#3654'36ªfK14NF:`Ona#0S@*$$ 12QY-  Y--& PY?+3?99//++99333104>75.54675#5!'>54&'.y塱ő^pnzvCS~ wXbt tjy`amOf$>^F`8R7F"^INR:2@  !PY PY ?+??+33993310327#"&5!#6="5>3!*4#MBsfD')Pk4^LEqHP WTO1@   PY PY?3+??+9933310#"&'##4324&# 326TkDՎ~;VAN54.'.54632&=9ydA$/~ 4j}Uq>qsRkQ.&3!!327#"&5Rk4|8Pr8w T wD:/@  PY?+?3_^]993310#"&53!2654'3DٵI)5:;c3Nv2WR E@$  !" QY QY??3+3?3+393333310#&4746324&#"$z4[QA5 i  +!`D :XPb@=  Td_o+;    PY ?3?+9_^]]]]]?93333310%#.#"'6323 #s־;^3"7IZ|U&ri9WkpnGXWq<>@    PY  ??3+3?33/93333310%>53#.533}С{r|kz5O)R@+'! '! '*+(( $$PYp ?3?33]+39/93339991032654&'7#"&'##"547326=3\IGKgadcagKGK[Ѿ ߓxy C!ǽҷ]{&jj&Ѵ %+55+55D{&vj&ִ%+55+55I&R8<@ &;%+5+5D&v8@ &%+5+55&z8-@ *&+*- %+5+5K'0`@8-((" 12%PY/PY  // +PY QY ?+?+99//_^]9++93339910>32#"&!2#"32654&#"4&#"32K'5jڬmaSVv*?8P[>!{ozrƒ7aAc:[5&+5v1yZ*1#,#HPV{?&1?& F#&Ǵ%+55+55WI9(:'S@, %%""()PY ## ## PY?+33?39/_^]9+39339310!##"##"547#2'!32653(}}3=2vjp|%edHOQ:X~  u a6W>-p@ -**'./' Y'# @ Y  Y ??+?99?+?+993333393333910 !4#"'632!327#"'5326=.547fw8"BK|z6$  oyw*2@C+578ca5"PiuI DQdBfWfZ2@  _Y`Y ?3+?+99393210&32! 32 ȞWa6YX"cRWIN3@  PYQY ??3+?+99393210&5324&#"326ЉWeq[Z8@ _Y   _Y?+?99//+933310&5432.#"327#4"D'h:. .Av~ƾǾ AW6N,K@  & -. @ Y# #* @ Y# PY ?+?+99//+93333104.'.532.#"#"&'5326X.[lg6 u7dW>y_:f4zIw*7$PwrZjm}G# >eR+J=E >@  _Y _Y ??+99//+99333910!#5!#!{E X: @@  @Y PY  ??+99//+99932310!!#5!#!+s_*J@$)&+,*)**" "_Y" _Y ?+?+99//339933333310327#"&547'654.#"'632W%??;;$@T @-' :$@TZk2N=dmue^f }UO-IwWzR $@ RY?9/+993310 #!53!R1(YtZc@4       _Y?+9///993233933333910'>='&''.#"'>32t7g_=*0=JhbNshQdG!|~n|{dgumy^VP@(           //99//99323393933210%54''%&''%%7.7,F~-GGpj6ΒwqU3UXpE)P@' ! ' *+( !"`Y!_Y?3+3+?339999339939310"'#"&5332653323#!5!26=#> uM?PIB=HS?|@L[g[i3hXc:,O@'$#,,# # -.,#((PYPY?+?3+3?33999933993931032653#!5!26=##"&'##"&5332651A@O#eEXW(oUvf1ABM:R{_׋YN`djZR{sn*Z?@!  _Y_Y  ??99//+3?+933310&#"32673##"&54632f9D}MD俬Gg.4Ֆ/+V'&*Z>@  PY RY ??+99//3+933310!#"&5!2&#"32653u8H@:=u/k`)[P7(ro4XeE;@  _Y_Y?+?9/+39933331032>54&#"#3>32#!kK)^FL"MϓZPE3%_5(3[@,% 1%45 @Y/"PY1/// PY )PY?+?+?99//9++9333310267#".#"#46323 4'#"&54>"327.+4#|H%|HhN<Bu]U_^V!6_nm{HA#mOPNI\t2#Kez22V_eqyYDQF47"&ZnZ,S@,"' '.- *%% %%** _Y* `Y?+3/?+3/_^]9993333104>7>54! '>323 4'7#"$Z3_Ec;-/UJR$2mQ^J& 2L^Hq}IS8jbdTZ(H@")*"PY((% Y?+3/?+3/99933310%#"$54>7>54! '>323267F3_Ec;-/UJy{6JƻQ^J& 2L^Hs{&# !$P@+" $#  $%&_Y$   "_Y ?+/393+393333333102'&#"!5.#"'6327>!vj :@)1|;6|2).,&jv\t,GG&v6d0T&.*.&/:c[shf HA#T@! $%  @Y PY?+?393+3933333331032'&#"!5.#"'>3276hmL8h!B@ #$ PY   @ Y PY?+?+9/+93310#"%6332654&#"5632S7A}JH;/sez$  Pԍwn n_EB@      _Y  ??9/93+339333333310'654+##"&5!3533 _hh9`b8JBA8C8ABF9@    PY  ??399+3293333310!%53!#!#!F{eJeCd= d6>$J@ !%& Y  Y ?3?+?3?+993333333310 !4#"'632!327#"&547fw8"BK|z6$  oyw8"BK|z5"PiuIBWTN ,H@''!-. @Y  *PY $PY?+?3+?9/+9933333104>32#"&'32#.#".4&#"3266tp>]@$OyCaRMNI$UZ >k8NFuWDMffZ7:Q@/   PY     PYPY?+?+9/_^]q+99392310)"3!!"!!)7&#'K:S@0 PY  PY PY ?+?+9/_^]q+993392107!265!5!4&#!5!2#!َ&'_EWBqvZ&EE @@    ?3?39/333933333310!##33$pEfWg:<@    ??3??333933333310!?##36735.rsGGKWTO'J@'"  ()PY PY %PY?3+?9/3+3?+93333310#"&'#!!#5#534324&#"326Tһn@?zzьu~u7XunDK@@H@ H@ H+++5W\Z&H@@H@ H@ H+++5b&(C& %+5+5b]&(j & %+55+55E"X@/   #$_Y _Y_Y?2/+??+39/_^]+9933333910"&'7326=4&#"#!5!!>32eN!eA-,r33fnzm2*$૾[&Evx@ &@ %+5+5qvZ@`      `Y/_ _Y _Y 0`p0?3/]q+?3/+9/_^]q+_^]]9933333910!267! ! .#"!;Ee9S%g a&AjSAqOhZ6E,]&,j@  &%+55+55E-E#L@)  %$`Y`Y `Y  `Y?+?+?+9/+9333310+# #"'532>!324&+326̡?sx5 :9' 6*΢vZ19ZnT AͱlGEM@&    `Y `Y ?2?3+9/3+39933393331032#!!#3!4&+326\̡IvZckZnEͯyE@BlEJ@'  _Y   _Y ?2?+39/_^]q+993333310!4&#"#!5!!>32P`sž78!zm2*$&vW@ & %+5+5*& B&%+5+5&@ & %+5+5W0E 4@    _Y??+3?399339310!3!3! WE[WE$E G@%   _Y  _Y_Y?+?+9/_^]+99333910#!!!!24&#!!26)B3Efys(pE%[EEhEI@$   _Y _Y?3?+33?+9933933310%3#!#367!!!w]iC\1!YIh.tIubE(E@G !  `Y? ?22?339/]q+3_^]399339333333333999910!/#&'33>73#M:=+ɭ)_DD_)(A;V_=a~gb[bg(\A0yCpY(~@K"  % %%)*"  `Y/__Y_Y?2/]+?+3/_^]9/]q+99933933910"$'7!2654&+532654&#"'6$32mUwGG~2F}Muzrzierv=Ÿv!|yg*E D@&   z i   uf?2]]]2?33]]]99333310333#47ުErlR*&&%+5+5EP@*        _Y ?2?39/+99_^]9933333991032673###]I)H7U$f#Eem{R7!#+2b:%=L:6=׺u LKE0*E+ffZ2*E#@ _Y?2?+993310!!#!k[E_E3qvZ&LE7EI@(     0  _Y?+?39/3_^]_]99333910"&'732>73 3>.Q^H&:69K]Nl}& ;5X:OW$E;WE 2@    _Y??+3?3933310%#!3!3} E[[_1E-@ _Y ?3?9/+9933310#"&533273#s>̾w%41YsE 3@  `Y?+3?339933931033!3!3YEGGVWE>@      `Y??+33?339933339310!3!3!33>WEGGGE =@  _Y _Y _Y?+?+9/+9933331032#!!5!4&+326mu̺Byo(ticE @@ `Y`Y?3+?39/+993339310+3324!#3263C>EMEȶ}EE 2@ _Y_Y?+?9/+9933310#!3!24&#!!26B3Eys(pW\Z@f  /   `Y?_o @$)H _Y0@P  _Y ?+3/?3/_^]q+9/+_^]qr+_^]]99333993105!.#"'>3 !"&'73267 g%DO8e aqAOAVZW@/     `Y   `Y  `Y?+???+9/_^]+9933393310#"##3332#"32Ⱦ ƲȬjomjB3E44 4+E ]@4      _YO?o _Y ?2?+9/_^]q+3993333393103.5463!##3!! 4U̕?xNDS %R@#&'# PY @Y  RY PY?+/+99//++3993339104&#"3262#"6767>lɊ΄T).ʿûBNC'!Do::!P@(   "#QYPYPY?+?+9/+999333939102#!!2654&#!!2654&#tkpwmfy:^|j:KU]eSHZRL :@PY??+99310!#:T:hv:K@$    PY PY  ?3?+33?+993333993310! !#!#36!3?$[@7wNn+pyh&`TFNH:!t@(!!! #"  @Y/ ?22?339/]3+39933993333339333999910!.'#.33>?3#7 O32Z1ӹ IHw,TP_iZRGIyAjCi: 4@      ?3]3?33]993333103#4?#g Ŭ:eAd0:&@ & %+5+5\:F@#    PY/ ?2?39/]+999933333991032673###ڴqJNH"n5:&^o o4&:/@  PY PY??+?+9939310!! #"'5326!c.$Owj2,+:IBCn Mfg:H@%   @P? ?333]]?33399333393310!47##36735.5GK,:: 5@   QY/ ?2?39/]+99333310!3#!#i:6:INR:#@ PY?3?+993310#!#:T:WBPS8NFJ:'@ PY?+3?933310!!#!vv:TBW:\FWN@(     PY PY??3+3?3+3?9933933310#&54734&'$~ņg!+N)^m:[h: 6@     QY ?2??+399333310!33#!d:II::+@  PY ?2?9/+99333103273##"&5Neau碒:nNT4[fg: 3@  QY?+3?339933931033!3!3f:II\h:B@   @  QY?+33?33?99333393103333333#\:III~: E@$  QY    PY  QY?+?+9/_^]+993333102#!!5!32654&+gʂxtp6\c^Wjb: F@$  QY    QY?3+?39/_^]+9933393102#!332654&+3}sq~p:6^a^W :): :@  QY    QY?+?9/_^]+99333102#!332654&+Axtp:6\c^W|<N}@OQY/ PY PY p`?3/]q+?+3/_^]9/]q+9933399310#".'73267!5!.#"'>3232#"'##332654.#"ΧʶTohhn5^=lqp:ϋeE: K@%   QYQY ?3?+9/+399333339310 #&463!##";KXxk|64\]^]F&HC & %+5+5F{&Hj@ & %+55+555W%`@! %!!&'#$#QY$ PY @ H$ $ !PY??+?99//+3+3+399333339103!!363 #"'52654&#"##53+ i^xxM2>F6is|̝;Ǚ Hh &v@ &g %+5+5QN@S  QY     PY p`  PY?3/]+?3/_^]q+9/_^]q+993333391032.#"!!3267#"v ~ q |z"[ipg _Y $KVeLe{&j)@  & %+55+55uWDM: W@.!" QY QY PY QY?+?+?+9/_^]+9939933310 +##"'532>7!3254+μϥ(>d^/%%04#534pΖE_ E6ɿ\:W@,    QY  QY ?2?3+9/_^]3+399333933310!332+!#32654&+K66zt7:66 :;de^a5T@QY PY @ H  ??399//+3+3+399333339103!!363 #4&#"##53+ i^is|̝;M\&vj@ &5 %+5+5&C&ٴ %+5+5BW&\@ & %+5+5W: 4@  QY?+3?3?9933931033!3!#:IWHZ.Q@*)$# #/0 & &_Y ,,_Y?33+3?39/+3933339310332#"'632#"'#"32&#"327?0KSRJ+#[F}WT?X(Y!-JRRJT8n:N%2VrdOHs6;W2:O@'           ?3?3399333393933333310# #33654't2o S\0:y]x:nnKzEH@% _Y `Y  _Y?+?99//3+3+993333310!2#!#5353!!4&#!!26aB󍍿5s3̺̓ys(pG@$  QYQYPY?3+3?+9/+993333310!3!!!2#!!3254&+-*:t:o娟^f?Z$i@7"$%&_Y_Y" _Y ?+??9///3+3?+9933399333331032>7#"##33!2.#"!B z}3M@1F 8#;O5{s Fa2a~8Ʈ>3Eb>j\.cN"i@8"" #$PY PY QY/ ??9///]3+3?+?+99333993332310#33632.#"!!3267#"' ʶ [TlfN Me  :+Zjgm  E K@&    _Y  ?33?39/+3939932239910!#####3!'&'ɼ}b'%OEN+!Ei|}E: K@&   PY   ?33?39/+3939932239910!#####3'&'ɐ{t.O *7Lpp:X4?Eg@5       _Y   ?333??39/3+339399229933993310!#######333!'&'͢_[ɠO @?EjsX^c:k@6    QY ?3?3339/3+33?93333939939939910 3#######3!{x5jqTQn}ڤnBppq:E_@/   `Y_Y ?33?+9/33+3993393933993310#54.'##54>7!!0K8{:Orw”FrIx@#:[@/  QYPY?33?+9/+33393339333310!#54.'#"#5467!!;|>ȔMOFDQEFFkƯi~?E"%t@:$"%!"! ##  '& _Y#!!%_Y!?333??+9/33+33993339933933993310#54.'##5467##3!!#ku6 !PKNS#yt ]uׅ@rC;8E?.:!$r@9"# $$ !! &%  PY$#PY ?222??+9/33+3399333993393399331033!!#54.'#"#5467##.qz5 MMKL!8<|: \FFw4Q6~FF+Q~LW\T@Q6K#A@ &,,&@)K UV=C_Y2O`Y)`Y# _Y=22=HH8_YAH`Y/+/+9/////_^]+33+9++933333333104&+532654&#"'>737>32&#"32>32#4#"#"&54>7>GG~37[H6S-B X0Rum;:kc]-^mJVl~CTlW?#vw{k{u=SC8M> [\;$ 3)l!dM"zWn>%>YWM@9'*1DCC1 *-  NO@F @Y- PYD@  @DKK; YK#@Y'@PY?+33+?+9////+9+933333333104>7>54!52654&#"'6737>32&#"32>32#4#"#"&Hk9c]Yq $Լ[H6S-B [pgyRpO*:\RN-[jJEWlD{Nc<-L=ȉTXJVJF,YC8M>fe  m_P.$t$}hM#ED@"`Y??339/3+33393933310!".'33332653+tNF*dd -1FQ3:(cĸKI0ȳOsW^:>@   PY  ??3+3?339933933310%>53#.'33lR%w*>7wrkQRxm/ffZ 'H@&!()_Y# _Y## _Y _Y?+?+99//++99333310#"32"3267#".%27! 632f OI=+&?2OKO!0#ð !)!!!(! 1O0@  _Y ?3??+93393310!#3632&#"@(,Q;Hc+a+,-Ezx,5+q.Hc+a+,-w 8@ tN5+q.4&"9O% 񠰍4Džk{742454055W w+5LBu3djogWN +S@-%$ )#&'((&$,-'$)&#PYQYQY?+?+?+?33?3933333310! 324.#"32>"'5326?33[䋔424631564&"9O% 񠰍42۶MSUO w+5ff+e@7" $**$ ,-  _Y *$''$ $_Y ?33/]+3/3?3/_^]3+33/9333310#"&'&7>32'#"&'>326fV56UT33SɞR01RO00P8-87,6\M2*44*2{m'//'ls&,/&o<*m@<(" +, PY  %%"((PY?3/]3+33/?33/_^]+3/_^]3933331047632#"'&>32>54&'#"&'<,db--ba-׽jqK65ItghrJ55Iuhdc-c`0<:.Ϳ.:9-/:M}@DCD800:# )M :DNO:9`YM;;D,_Y:D66D:G GAYG & _Y# ?333+3+9////3+33/3+933333310>32#"'#"32.#"326732#"#65#5"&'.#"#>323 B1DZXWdz1C 7 6GM{h:hh:izKG6 h %jSNCKRWt7$<{`\AW"ymmUT{""UFFUA1 @b*<4:bG58<1ݥ.<:0'#.Aw@,78,$$. A .8BC;5Y;A//8.-PY. @Y*!PY ?333+3?3+3+2/3+93333331044#"'#"3"3267326#65#5"&'.#"#>323|맧dg|U]=ut=]U %jSNCKRWt7$<{`\A"ݹSS!<++<b*<4:bG58<1ݥ.<:0H&fh :/%+5&I@  &! %+5+5qU[Z;@  _Y _Y?+??+9/933310%27#&!2.#"A-E%gh5AqW)L;@  PYPY??+?+9/933310&532.#"327Dri=.W" Zjn_P@)        //9////9933333393310%%#%7%73_)Nd))\M)a~^_`5]^^_{`"@ /3/2333310#!#"&5463!54632`I5C.2BI5[C.2Bq2<8<@42<8<@L!@ Y /2/3+33310.#"+5326763255!B&thfi4X*aFcgJ@&H .}yIb @  ?9/33310##.=bYNw#̺^k3rLIb @  ?9/33310#65#5b%wNY̒Jm:k^;.(@  Y @Y /3/++33310"&'.#"#>323.ferFv ߤAo\>58?.mp*@91% '1;EO@U1O-KAAKO;77PE 'E'##Q#FK>C HH%M 27 449(-**/KCM79-//-97MCKA</3/39////////3333333333333333333333992333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EO@a;<7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96mfl@:  / @Y@ _Y ?2?33?++_^]29333333333103333##47 332673ޠl \ji] ErhlNMHHMc@4  Y RY ?+?3?33?+_^]293333333331033##467#% 33273g ٬y :eg(7$:v@EJ@&  _Y`Y  _Y?+?99//3+3+9939223310#!#53533#!24&#!!26󞞿B3͓ys(pP)J@&  QYQYQY??+99//3+3+993333310533#!2#!#532654&+ʴww ?z.xtl\c^W|E\@.   _Y _Y  ??+9//}/99+9999339939910'#!#!24!#327'76_ZwkywvNmlcr`FE-val9WIM-m@7)*,++*$ */. PY),'++'PY ?3+?9|/?9/99?3+9993333339939910'#"'##4'33>324&#"327'76E^bd^WyV0ƽzky?X8ve_#"jZe6Y61fd]Z*[hbv%@ _Y??3/+9933103!#´+EdXD&@ PY??+?993310!#!3!o:7[E ;@    `Y _Y?+?9/3+3999223103!!!!##7{Dh\@V: =@  PY  PY ??+9/3+399922310!3###53˴zz:ڄW\EN@)   !_Y_Y  _Y ?+9/?+9/3+9333310>32#"&'732&#"#!!m:J:+sf?I{Dr%)_H,"-)EW?: P@*!"PYPY PY?+?9/?+9/+39333310%#"&'732654.#"#!!632?tӋ.yfUbtfaSts|\{ TKpV c:t#uhE'@Q""#' '' )(# & `Y  !@!_Y! ?3?33?+9/_^]+_^]339393399223333993310!.'#&'33>733##  :=+ɭ)_DD_)(AGL_=a~gb[bg(\Ayh:%@& !%%% '&!$ @Y    QY  ?3?33?+9/_^]93+333393399223333993310!.'#.33>?33##=O32#"'532654'Z-شu| JF!wxgTWN@;z,TP`hZRIWFJzAjEi}sSkq!"=?KLhE]@/    _Y _Y?2/?+9/+99?9333333331032733####)H7o*Um'E{R3###!<04Bü]#aA:&3\; #hEQ@-  _Y  _Y?+??39/_^]+93333310!!#3!33#k oE6[h:M@)   QY   QY ?+??39/_^]+93333310!33##!#iy:6I:E ?@   _Y _Y ?3??+9/+993333310!!#3!!#(oE6W: G@$    QY  PY?+?39/_^]+?993333310!!!#!#BڴO:6ʋQ:TWE!P@*!"#_Y _Y _Y ?2+9/?+9/3+93333103!632#"&'732&#"#!TcU[r&E;]QLO5+'E-NPW9$)WTW;Z@ !  @Y PY Y?2?+9/3+?+9/93333103!632#"&'732654&#"#!TcMcr&E;\RKPXN;:PWӯ>aSZ)4[@0 -%02""0 56*_Y _Y '_Y%00?33399+3?+9/+933333310%#"&'# 32&#"327&5432327"64&Pd=\0j{SO6I%OWe^W&0?C=EF>rA(<7Jd6"S ګU,XEL&2_@ -#0'!!0 34* @Y PY $QY#00?33399+3?+9/+933333310%#"'#"32&#"37.54632274&#">FkZRVwR@@*+mFDGvy0D07./46/.5#7%%!/Nu޲'xvti44qWvZ&W@.  !  '(!! $_Y`Y  `Y ?+3+?+99//933333103267#"'53254'3&!2.#":e9tsSYVE%gA+L_n"#PA kDAqW8N({@+ &$$&)*!QY&`p @ HQY PY@H?3/+]+?+3/+_^]3?+9333331032.#"3267#"'532654'&vl!wxgTWN@;"[ijm |Ekq!"=?PG LhE 7@   _Y _Y?+?+3993333103##!5!ŌE4hJ: 8@    QY  PY?+3?+99333310!!3##!vtv:$E<EW: 4@  ??3933939233310!#37>3= 4# W:L+p&7$ED@!   _Y  ??39/33+393933233310!!#!5!3 3$3>´>= 4# Ɋ:L+p&7$hER@+         _Y ?+??399933393322310 3 3## # 3fMMp5MD|=^hn:P@*       QY??3?+9993339332310 # 3 3 3##cs,*sAd'D,[UWEA@!   _Y   _Y?+3?3+393333310%#!!5!!!3[h:B@"    QY PY?+3??+393333310!!!33#!!Ĵ:I_hE>@   _Y _Y ?3?+9/+9333310# 332733##s>fw%m41[h:>@  PY QY?+?39/+9333310!#"&53326733#I碒eaGB[nNT!I_1EJ@& _Y  ?3?9///3+3933333310#5# 3;3673#sg{f{c m4 :L@' PY  ??39///3+3393333331033673##5#"&5NdapmYdbp#0:nNT0)tE/@ _Y?3?9/9+9933310>32#4#"#3`>̾wg% 1*EKZ$^@0! "%&_Y! _Y_Y?+?+99//3/3+39333333310%#""&54733 !3267"!.Q̏ v^ `2ێ G ~n41:;;2b 2;GPTVN$^@0 $  %&  PY$ !PY PY ?+?+99//3/3+393333333103267!"#"5473;>3 '.#"܋a] zyuWO- =>;2pZ 'g@5$    % ()  _Y$  !_Y_Y?3+?+99//3/3+393333333310%#&"&54733 !3267"!.Fq v^ `2ێ G lm#4:;;2b 2;GPTVN&m@8&   '(PY& #PY @ QY ?+3?+99//3/3+3933333333103267#$#"5473;>3 '.#"܋aS zyuWO-&)=>;2pE,&@  &"(%+5+5&@ "&$*%+5+5WE!R@*  "#_Y _Y?+9/?39/+9933333910#"&'732654$!##3273%8*oNNMꔓ]OE{Rq1WT:#Z@-!$%!QY PY?+?9/?39/+9993339933910%#"&'732654.+#32>3TrҎ.yfn|04BüT&\z TK] :&3\;|$fE>@_Y  _Y?3+33?+3992233310! #"'5326!3##g+2b:%MYG&=u /'h :G@& QY PY PY RY?+?++?+9333399310#! #"'5326!3Y~;@JmV2,+7C7#,Ϊ7LϜJ nEg(W*EH@$  _Y _Y ?+9/?39/+9933333310!#3!3#"&'732k :+sfoE6_H'W:O@(    PY QY/    ??39/]+?+9/99333333103265!#3!3#"&'zlk~xų"VJ:6fEE@#     _Y   _Y?+??39/+99333333310#!#3!33b foE6h:O@*    QY   RY ?+??39/_^]+993333310!33##!#s紻¬:6g(7:_h1E@@  _Y @_Y?3?+9/+993333310%3# 33273##銧>fw>%m41hh:<@   PY  QY ?+?39/+99333331032673##3#"&5NeaGB}l碒:nNT!hO[fET@*    _Y?+??39/933933333333310#7#/#376733bC .&:&(# fd#kJwEQZuhf:M@'    RY?+?3??333933333333310#?##36733_5.f7rsGG,:g(\O&$ I@ &%+5+5&D0&ϴ3;%+5+5]&$j@ &%+55+55{&Dj7&Ҵ53%+55+55ENb&( I & %+5+5F&H @ & & %+5+5geZQFNhf&Q F#@ & %+55+55F{&j@ "&  %+55+55& F#@ '&%#%+55+55{&j@ )&'%%+55+55Cp& F)@ 0&.,%%+55+55%{&j@ .&,*$%+55+55MR@*    `Y_Y_Y?2/++39/+393333310"$'7!2654&+5!5!wVw?7M𡇅q ܲuzWA:S*^& @ &%+5+5R& J@ & %+5+5*& F#@ &%+55+55{&j@ & %+55+55ff&2 F#@ &%+55+55I{&Rj@ &%+55+55ffZ M@+_YO  _Y  _Y?+?+9/_^]+99333310#"32 !"!f # nfWYX7IN G@%QY  PY  PY?+?+9/_^]+99333310#"32267!"!.I  G $9úXff& F#@ &%+55+55I{&j@ !&%+55+55W\& F#&!%+55+55|<{&j@ %&#!%+55+55^& @ & %+5+5BWR&\ J@ & %+5+5& F3@ & %+55+55BW{&\j@ & %+55+55& H7@  &i %+55+55BW&\%@  &W %+55+55_1& F@ & %+55+55{&j@ & %+55+55h[E 0@  _Y_Y?+?+9993210%3##!!{DE h: 0@ PY QY?+?+9993210!3##t::ic& F#@ &%+55+55jb{&j@ &%+55+557W[E^@2 `Y _Y_Y _Y?+?+?+9/_^]3+3933333310!!3!"'532=##53!!\Y;I2E{m{D:waQ{W:\@#  PYPY Y  Y ?+?+?+9/3+3933333310!3#3!"'532=##53S3I1>~_zz:ڄz$WEJ@' _Y?+??3993399329910#"'532654&' # 3 3 ͠;I:=5C&4MLMMLtn+E 4@ _Y  _Y ??+9/+99333104>3!3!"$7!3#"nwݑ4H}nG E$C@#  %&`Y"`Y  ??3399//++393339310332653#"'#"&54$;3265#"o>AA:@Tҫs>fd{}zE.ut1ϺO}-al*K@&  &&+,(PY ##PY?33+3?3+9/?93339310%#"323'332653#"&'3265#"57t{If";@A:g&AGSQGC)BRqst1ϺNVY*U@-*$   +,  `Y  `Y**'_Y?+3/?+99//+99333310>3232653#"&54&+532654&#"?|g~>AA:&:ejNr+g~tŸ}ut1ϺDžxjydsHO N(U@- & )*PY# #PY# PY ?+3/?+99//+9933331052654&#"'!232653#"&'.c]Yq .KΑg :=;9 TXJVJF~e lb_q1Ϻj\hY"T@,  "#$`Y ""_Y" _Y?+3/?+9/+9933333104&+532654&#"'6$323##nGG1Fazierx=Ÿv!ghEN"V@-  #$ PY PYQY?+?+3/9/+993333310%3##54춮&#"'>32w·u| JF{ZRIWFJzAjEE!B@ #" `Y`Y?3+3?+9/3939933103#"&5# #"'532>!3265?sx5 :9' 6?BA?D1ѸGT A.yu:!?@ !!"#QY  PY?3+3?+9/933310##"'532>7!32653#"&5X(@ia/%%04#59AA:Ed E9tt1ϺixEO@+  `Y_YP??399//]q+?+9933393310!#3!332653#"&5:ң.>AA:oE6.ut1ϺVw:I@&  PYQY/??399//]+?+9933393310!#3!332653#"&5+ߴ!;@A::69st1ϺqOZ*(N#E<@   `Y_Y?+3?+9/99333310!5!!32653#"&5eijgɾ򗇈E:<@   PYQY?+3?+9/99333310!!326=3#"&5!(u~~x뿾:&\Z(U@-  %&& )*`Y _Y %%#_Y?+3/?3/+9/+99333310"$5467.54>32.#";#"3 e嬖uڋF3{GGuY満"xi[=pqguqp~wMANfW]E8@_Y_Y _Y?+?+?+39399310! #"'5326!#"'5325+2b:%MYG&=ח;@,B|u /': W:8@   QYPY Y?+?+?+93310!"'53265! #"'5326!=@,D7:;@JmV2,+7C7#,΁CQ2LϜJ nEf}qZ4WJTE::Z#!@ @P`/]]29/3310#54&#"#546753#g&03'dBGgHC/6..6/1U] ^^ ]UN' #(@ @ H!R?3+]q223104632#"&74632#"&4632#"&. ".." .. ".." .r- ".0 -o -- ".." -- "..".."".0N R?10#7'7'7wVVVVVVVVVVN "@ @ HR?3+]q2104632#"&4632#"&- "0/# -0 0/!".m"--" ..".0 0.N (@ @ HR?3+]q2104632#"&4632#"&3y." 00 ".. !/." .om"--" .. 0/!"...n /]103"&51rgR[jjX R?10'7;P! @    R?]99//3310"&5463232654'7#"&'.&:mRB2T.(7 &:lQ>2P6.19&%@H&xAR;D9/&%@H(vAR4K?)N R?]1044qhN\hm/10#'73@ /3]9/10#52654632#"&gt. !/." .Rji\ 0/!"..N R?]10463"ëgrNmh\N N@ R?2]210463"!463"ffsJgrNme_mh\\;q)+7!@//))55 P##/]333]223104632#"''7&732654&#"'#"&546324&#"326~YY~[;.XRXx7((:<&%:XRX/:\}~[Y~y:$&<:(&8RY~}ZZ}XTX0;(89''98(;0XTX}ZY~~Y(8:&'98q;\)@ /P  /]3]2104632#"''7&732654&#"~YY~|[:0VTXw8((8:&&:RY~~YY~XTX,?(88((88N @  R?]29/310#"'#3326= WW"dd !0&2Xf fL -72#!@@P` /3]]9/3310#5.=3326=3#gN;d'30&gf\\ dN1150051 /]210!535 #j/10#'73 /]210#5265 grRjj[@  /2]22310#5265!#5265fgrgrRjj[jkZ @/]1057'%㎪3P3LN q;\)@ /  P/]3]210'#"&546324&#"326XTV28[|~YWw:&':8)(8R?,XTX~YY~~Y(89'(88#N R?10#'73NN R?3]10!535 j ;P{=) / /3]2104632#"&732654&#"~YY~|[[|w8()8:'&:RY~~YY~~Y(88((88 @ @ /3]q2104632#"&4632#"&/ ".0 /-" 0/!"-b".0 .. 00 0.9 #/;'@39!@!!!- ' /333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&9. ".." .. "--" .s. ".0 .J. "--" .0 !./ ".` .. ".." .. "..".."".0".." ..".0 "..Vu@@ /3]q29/3105!74632#"&4632#"&VH7."".0 ".. !/." .mm@".0 .. 0/!"..Vu!@@ /3]q29/33105#5!#74632#"&4632#"&oHk."".0 ".. !/." .rmmr".0 .. 0/!"..B  /3104632#"&/ ".0 /".0 ..)D  /333104632#"&74632#"&0 0/!".. !/." .".0 0." 0/!"..) #@!@!!! /333]q2104632#"&74632#"&4632#"&."".0 0. ".0 .t/ 0/! /b".0 0/!".."".0 .. 0.  /]310!!G}j /105#5!#1nGjujju @O    /]]3104632#"&/ 0/! /h10 0.F  S?3104632#"&/ 0/! /10 0.wT #@ @!!! /3]29/3104632#"&4632#"&4632#"&w. "--" .0 0/!".0 0/!".`".." ..I 00 00H".0 0.q  0  /]3104632#"&/ 00 /#--# --//31053/oHyL/39910!!H;LG //]]310!!Gj`//93103` wA /  /]3104632#"&/ 0/! /10 0.F  S?3104632#"&/ 0/! /10 0.9!@  N?23933310!33++  /3104632#"&/ 00 /f10 "--j  /3104632#"&/ ".0 /".0 ..N4@  A TYM TYN?+?+9939104>;#"!!NDKM Z<= /10##57#5!=m͠kJ@     NM?2?39933933339999103673##>7LÖ \Mkf#?fmYN}9@   TYM TY N?+3?+99393105! 3!5!4&#}y!۪'@@ NTYM?+?39/3993339102##7>?'.+5aiD94qTM2!"#FveB )2=9E54&#"5632LԸ4ti~@Xkf_NKj3D`A=vڍ F@ M?]93103# {` & QTYM?+?99310#4&#!5! ۸yR4@  A TYMTYN?+?+993310)5!26=4&#!5! D@3T'Ӫ'9@   A P TY MJ??+?39933910%6$54#!3!  LRG`JL 4@  A TYMTYN?+?+993310)! !4&#L7XR'LW@AMN TYLTYN?+?+??939933339102!5!4.#" #>73>,_Xz@q4uJ[N/xg MQ??93103# %2@   A TY MTYN?+?+9310)5!4.+532!NJD;Y˷bE@ ! A TYM TY O?+?+3993393310467#5! ! 32>=4&#j:)1Dy>x4X-Gx5[XF^ 2@  PM?3?3999333107 7363FHyCm3Xf/sF=@   TY Q TYM?+?9/+9933910 #4&#!3!DRRuVL@ TY A TY MTYN?+?+9/+993393104&#!3!! )5!265R \Rm76@  MQ??39/3993393310#4&/3>?3bWdَW,\h5 tɚߧQP},JDG@  MTYN?+3?393939922310)5!3>?3DO}NE 6g\@!!ۑ_$PL=@  A OTYMQ??+?39/933310#!25654&#!j3ub)x^OІf` & NTYM?+?99310!#4&#!5! ۸yѸP@   VYM UYN?+?339/+933339910>732>73 !3NmT ?~3m?@$bzF[` |'LA@TYN TYM?+3?3+99339310#5! #4&++532>5𹕸D EP$!1ѸZ1hs ' ' F'@ J?933310#37{-@ J?329933333310#3#3X؊{{M: @@"    PY  ?3?339/3+39333310!#!#3 MvutF5:3:u@>  PY PY      PYPY?+??+399//_^]++3333933333993910)!#!!!!!3#דSL:KN(5<@e:'" 919)9'=>6$6PY1QY(:PY((/1?1O111_1111@H11 " $p $, PY / ?3/]33+3?3/_^]]339/+]q3/+++39333339933105#"'32>323267#"'#"5%4&#"7>267!%KYDy"4a@HJCGU99@`6zOQ.bR] XCs^H-nzzn;oQ[$RdYXY0dUe:&n@= #'( PY PYPY?+?+9/_^]q33+339933339393103!23##!#!!2654&#32654&#UuK!-2u)yfnqyffyb؞dF]3RRYSURRV8NF;:(@  PY PY?+?+993310)! 4&+326;n(ĸ-:ʵ;: R@*    PY   PY PY?+?+9/_^]3+39933339103! )#%4&+3#326n(dĸ񻷷pIʵŠ: I@&   PY PY PY?+?+9/_^]+99333910)!!!!!$d:N$W@. "" %& PY PYPY?+3/?+3/9/+99333310"&'732654!52654&#"'!2L-5`qc]Yq .KΑgy},^[ȉTXJVJF~e  mhn>: >@   S[  PY PY?+3?+?+93333310!5!!!!#5Z? \:,@  PY PY?2/+?+993310 73265#5!4_@O^'dZhrce:: 6@      PY?+?99//9933310)5737!wwweepp]:@@   ?3333?33393333333310!##!67!#?60 GT:{0rs: 0@      ?33?3399333333103#467#f Ŭ:e$:INRAN51 &@SY SY/+/+993310 ! 4$"32654&e꽅5k/@   SY SY/3+3/+93310".54$! '>54&khl Zj"`ri%^"Y@2   #$ SY SY /3/+/3/+9993333910% $547'563 ''27"654&ibt֊0[iɅ\X݂U1Q2vdSs[QDMCN%,@L* )!)-.&&PY*PYO @$'H@H # PY / ?3/]33+3?339/++_^]q++393339933104&#"'32632#"'# 53265#"267!WQAN?QSOUO[[U^RHVPC^H-籱?'y:%F@%  &'RY  #QY ?+?39/+999333310#"&54675.5332#"326yСxyf\!lrtnmq:ҿC JN &@   PY ?+29933104&#"#!20J &@   PY ?+299331032653#"@!): 4@  PY  PY??+9/+9933310!#!2#!!2654&#βظivuj:ze`^c9: K@%   QYQY ?3?+9/+399333339310 #&463!##";?Xxk|63\]^]9: B@"    QY  QY?+?39/3+9333333103!"&573#";;P;|kxpƖ36}]^]\:'@ QY?+3?933310!!#!d:ID:v?X-@  SY SY /+3/+93310!2>54&#!5!27#!?kv4S*,9Op]/ *\Y>yX"P@+!"  #$"RYRY SY SY /+3/+99//++93333310!2>54&#!5!27#!3#3#/kv4U*,9Op]鸸 *\Y>y>-?Y)L@'%%  +*))RY !RY  SY /+3/+9/+393333310!2654&#!5!27#!5!2654&#!?xS*,9OsZbkm`/x|Vps:l{8qVpvE:Y:Z,:]:P@*    QYPYPY?2/+?+39/+39333310"&'732654&+5!5!U-5`y06},dZkb)L'@K$ $()'QY@QY!Oo ! !!PY! p   PY ?+3/_^]?+3/_^]9/]99++93333310#"327#"&5467532654&#"'>32;xgbT5˗š;xgbT5˗šPQ@Vt|PQ@Vt M+5@ (!(,- ( PY$?2+3?99393310"&'7326?'.546323267#"&/$Wu8X!Z-"G]J:ù:J]G"-Z!X9sXWz:779y7?s'4"#[CCZ#"4's?7G[UUZH[|:@QY??+99310!#|:I:E:M:#@ QY?3?+993310#!#/:I:):7 :>@  PY  ??339/3+39933933310!".53332653# |6lwc̛4yj :-@ QY PY??+?+93310!! #"'5326!h;@JmV2,+7C7#,LϜJ nE9 D@ HY ,.?3?339/3+39333310!#3 !&mXo/3wV{!eA'@  HY H@Y/  /    A HY,. HY.?+??+399//_^]]++3399333310!#!!!!!#yavZ!trt h@  H@Y/ A HY,HY.?+?+9/_^]+993333910#!! 4&+324+326{[VUUosha7rkO{fOBX3"h@    #$ H@ Y A HY.HY,?+?+9/33+339933339399103! 3##!#4+3264&+32^[VFL{^rj6ha-jBxDm˧XOB 4@  A HY,HY.?+?+993310#!!24&+326t؊< ɠz궿 [@   H@Y/ A HY, HY.?+?+9/_^]+99992310!!!!!%itrt ]@  H@Y/  A HY ,HY.?+?+9/_^]+993399105!!5!!5!i%tRr6t0P@ HYHY/ HY-?3/+?+9/+933310432.#"32675!5!#"4)jX5H s{)TO̻73wN\ D@  H@ Y/?O ,.?3?39/]+99333310!#3!3a 6^,.??9310#3W7@   HY ,HY/?2/+?+993310"73265#5!80 R>CND TZb`GtH B@   ,.?3?3993393333310 #33 lväg]PC&,HY.?+?993103!Ct<C@   , .?3?333933333333104?#&/#3?3 d  V]x.\!88iRj!a 5@   ,.?22?339933333310 #3&53J 6lT\ 5@    ,.?22?33993333331033#47݀u;ZHE 4@   A HY -HY/?+?+993310#"54324&#"326E ̻%L@# &'IY  IY /3/+9/+9993333102653#"&5467.53"32654&gSbSGVa`WHR^Ycseqqcrply{rvzcxx >@  HYHY,.??+9/+9933310#!#!24+!2⡍ T@      HYHY,.?3?+9/+399333339310!#!24#!!26|Ǧ{l3_pf☆mUí_-@  HY,.??+3933310#!5!Xntt-@  , HY/?+?3993310"&5332653aԍ|ɯxdI@      ,  .?33?333333933333310#&/#3?33ۤ $ȓv,RTcRquiDM#/l@- ((01*I@Y/ IY1$$IY .?22+3?+3/_^]9/+93333310"&546?54&#"'6!2327#"&'#'2>=poMQQL (3,F;/y@Bi=}bAyjx~*_N:? ΄}99O LMVJ_@m<>OQ?C#/b@) -01)I@ Y)) IY.$$IY 1?2/2+3?+3/9/+9333331023267!"&54&#"56323>"7>54&poMQNL (3,F;*}ADi;}bAyjx~*_N5D ΄}H99O LMSM_An:>OQ?C-"J@  #$.0 IY 1IY/?3+?3+??99333310#"&5!23473#&532654&#"!#oTTp#uuQ]h^^g\SeJ?AE3F*e8*Q0(4;@5();- #;(<=8%8IY)IY(5I@Y(()/)?))) !%%/0 I@Y o 1?3/]33+3?3/_^]39/]3/+++3933333333105.#"'>32>323267!"'# 57>54&#"32677g^P`k%oG7crrLRRO CQgD?Fj9 a]Vc B3 _UcRyjx~*_N6C bbRN=EAl324&#"326To#vz#oTQ]h^^g\Skq?E'"8eylJ?ʝ-"J@ #$.2 IY 1IY/?3+?3+??99333310#"&5!235'3#&532654&#"!#oTTo#zuQ]h^^g\SeJ?@E?323632#4&#"+8NN\zs&eLTaCpey8ON[kXzsFX`#NCFKkXwvF?I@   AIY10.HY4?+???+3933310#"'53254&#"#'33>32)*-PBWWg{s,mS{n t h5lWzsFX`#PA 4@   A IY1IY/?+?+993310!"&5!24&#"326J[jl`^fn_htƞ:C@   IY/ IY 1?+3/?3/+993333104&#"'>32#"&'732Wb~ou{ XBk nv̿˃nLIh +@    IY 1?+29933104&#"#!2/[jl`Jhh /@    IY/?+29/993310!"&533265^fn_htɖ-$I@  %&IY1 0 4"IY/?3+???3+993333310!"'##/33>324&#"326<zv"lVTZk[^g\SkqG$*I?ˢ>@ IY 0IY/?+?3+39933310#"5#53733#327;AUZ$R"+-]]7, ?:@    0 IY/ .??+3?3993331032653#'##"&5BWWgzt*nT{nnUzsLDf3@  HY  HY /+3/+93310!2654&#!5!7#!nUzsZDMCBWWgzt*nT{n~N&L@& &'(&0""IY/ .??333+3?339333931032653#/##"&'##"&5332658NN\zs+bJTa hWqdy8ON[kXzs`#S>FKCNkXwv -@  0.?3?39333310#3>304C!'>@ () $1IY /?2+3?993/9910"&'732?'&546323267#".'3S+<4>7 EhY%4b@"4=;+R3';4DI27#2RA)Wndgwwf-aE{W.$R2#,]`+!(`@ " )*IY %A IY 2 4IY/?3+??+9/+99333310#"'##463232654>54&#"{]{es&qtefp;6bnex ɾ`(˯eJ@ A 0 IY 15?3?+?993333310#'.#"'6323#k,t/."/9H9`-Fd6\By|*x&fx(tDjswxsz"a(D@ " )*% D @??33??39/399333310%#"'##463232654>54&#"{]zfr$v9beuoWLTIbZB먚u@'o]eodbVGMkx`r6@    AB?2?93393333103>3#67" .1 /r$fA*d`#H@ $% A@ ! /?C?3?]33?9/3993333310%!2!"&'32#.#".4&#"326JPh%bo7B[jl`_en_s51^8Uea"A@   #$C C ?@??333??39939333210#.546746324&#">tSXdfikp:7bne `˰eMN%,i@: ) !*!-.&PY)PY))  PY#   ?33/]]3+3?39/+?3+9333339310%#".5332653632!3267#"&"!.H vps7:FR?UKYDsR]i YmPERxrw^H-\M-9m@8 4$ .:;##PYPY++1PY'+ 7PY?3+???3+99/|/+3+399333333333310!"&'##65&#"#>35332673#'3>324&#"326Mr{3'kT7Z`72zxy"Yc 60/h|i/0rrtAXhZV,8]@0-3,%9:)$$PY PY6PY 0PY?3+?3+?99//+3+3?9933333310%#"!23'5&#"#>35332673#'#.532654&#"52z{2'kT7Z`7xyhZ6Zby0/h|i/0rrF6t*pK0X@ .%12") @Y"PY  PYPY.??399//3++3+3?+993333310332673#'##&#"#>3!5!54632.#"!DZ`7'kT6H*/hj1x/0rrb0/h|Dͬ  .h] N.9C@E= /..@2))"((DE6::PY>QY% >"1+1QY' -/@+>+>+)?33??33399//922+333+3+39993333339333310!&###>754'33>323>32673#"'3754&#""7254&M+OD"iMXW(oUvf vCPn|H=1ABM=N6\o1)Nd*0f]`djZw9O_,&{PP{N'3d@3(, ''45 (PY#( ,,PY& ((1PY?3??3+99//33+333+399333333310!.'##46754'33>3265354.#"gA{:,-za>yNoaT_?*\YM (.- ;&]ٽ*,9Op]$}wp=? kv4WKM.;n@=6( /<=,2PY(,#PY PY 9PY?3+?99//_^]9+33+??3+9933333310!"'#32673#"'#5&#"#>34'33>324&#"326KrV Z`#'kT30ƽzky?{"ʼ/0rrv0/h|ǧ61fd]Z6N,^@4%-.PY PY%**RY*"???+399//_^]9+33+99333310&#"32673#"'#&#"#>354&'33>32pdZ`#'kT/(2`_hf5 /0rr0/h|Lcppi5N%U@/ %&'$PY$!PY %$$$$ RY?+?99//_^]9+33+99333104>32&#"32673#"'#&#"#>3\;%$<|nZ`#'kT/f /0rr0/h|heK7a@206(("! !8964 -(44%PY PY?+?+99//999939932329910#"&'732654&/.#"#67&54632.#"32673%!TgU+Kʳnzt+MlAK/a!+WQTT>L%(i)5J~HMJK)7((3,<|T-l@+ ,""./( PY+$PY, #+++++ @ YPY?3+3?+99//_^]92++3993333310533!!32673#"&'327#"&='"#>3:xP3Z`:Ua&'kT)/0rrOL".0/h|*):!c@7"#PY PYPYPY?+3?99//_^]92++3+399333310"'!!5&#"#>32!5!32673U3{38'oU5~8J*Z'w 0/h| =00rrW=K-P@)  './ *PY $PYPY?2/+?3+9/3+?933333102.# 3632#"&'##6532654&#"o{diǻs.HS~vUHKKQŮia 6;:edC =@  @Y? /2/39/]q+99333310!#3!3wwXxC(3uWW: ,Q@+$ ** -.!PY  'PY PY ?+3?+9/99+9393231074>3.546?!5!#"."32654&u~ރ )+9%-=]k]=玏{횣8y <&)<,$6CUtexw履* 1@G&**# 1/+0112311,) !"!QY* +/&$"PY?33/?+?33399+33?3/9333333993333333910#4&+#327#"'#7&5#53733#33cZ1A C$DY]I0.| }5n ]L /{323#!"'###267!"!.Al0 NMVlA}|  {i61fd]YQTx:I@$  PYPY?3?+9/33+33993333331033!33##"&=#26=!Tgeegwwi//{Ÿ{XX*:#,a@2* ! ''!-.)##PY $PYPY?3+333?+9/33+33933333333103>7!5!!.'5!!3##"=#26=!*][iNwMwNg\_LJ;iQf&zy&eR$ WH$0R@'+ %12"(PY" .PY  Y?+?3+?33??3+93333310!"'532=#"&'##6533>324&#"326H^;I2E}?H{32zxy"wYc 6YAXhZWp ,Z@!'-. Y @Y*PY $PY?3+?3+??+?+933333310%#"!23'33!"'532=#.532654&#"c2z{2Y;I2E}VxyhZ6Zbywt*pWWv!R@ "#QYQY Y  Y?+?+?3+3?+933333103!"'532=##5354632&#"3T6E/?}_K4-#E>wz F\a.WK0>w@'8 ++1") ?@%)PY))5PY!. @Y.. ;PY PY ?3/+?3+9/+?3+9/+?93333333310326=#!"&'73 5##"3234673!#"'4.#"32> l;{d 3wǻs. \B3 HS~vUH*f8KQ;hiia6uRnMedWaZ@    @Y    Y?+???9?+933333393102=##33 3!"'5;}'IZq;I2wma /2W)5@    Y   Y?+??+933331032=#33!"'+5dW-@ w cWN3\@ 3) +$ 45+ Y+"' @Y"/PY  ?3??333+3?+?+933333310!4&#"#4'33>323>323!"'532=#4&#"1A@O"iMXW(oUvfb;I2E}a1ABM{S*0f]`djZw{WpN&O@  $'(" @Y" PY Y?+???+3?+933333102=#4.#"#4'33>323!"'5J}f*\Y>yZ;I2wkv4S*,9Op]WGM%2P@&- &34#)PY#0PY  Y?+?333+???3+93333310!"'5326=#"'##4'33>324&#"326G|;I2E=@67V0ƽzky?{"ËCQp Y61fd]Z"WNF@  ! @YRY  Y?+??3+?+9933333102=#4'33>32&#"3!"'5}^+pf$%$r%f gW%K4b@0+%$ 44$56+/ !!(PY%%%! PY  Y?+?33/+?3/_^]+9933333310!"'532=#"&'732654&/.54632.#"%;I2E}l!XbJʳnzt0^~I(3WQTT@P"(MnP~HMJK.<*%$=Ja>W%V@  %&' @ YPY# # Y#  Y ?+?+99//++993333991032>5!2&#"!!"'532=!#"'5!6;=pxyn .]!v(-.) EZcYF_;rRZ$. (y |gZSY0dQX`VVN".Z@)) ##   /0&PY,PY  !PY  Y?+?+?3+?3+?99393333310327# 5#'5##"!23467334&#"326-v(-.)Q6{6Dxyx (w;k[6We;jVW".R@#)/0  @Y RY ,PY &PY?3+?3+?+?+9933333310%##"!23'5!2&#"327# 32654&#"92z{2AF:;yz@*?=xyhZ6Zby((WN$j@5$ %&$PY$$!PY_oPY  Y?+?+3/_^]]3?+9/+9333333103267327# 5#"3 '.#"323327# # 53267{Z|,˓ z@*?=ܾU vplCWO-}D(;?WC@ R[ Y  Y?+?+??+933333310 5#3332753t_[z@*?LW(:aɬW N#O@"  "$%  @Y PY  PY?+3/?3/+3?+933331032654&#"'>32#"'327# c`ir٧fz@*?=NlhjZG( W!=@ "# Y Y  Y ?+?+?+9933310%327#"&=32>54632&#"|/;@*?=<927k,1BMKέ B:'NgiW:$Q@$   $ %& $ PY   Y Y?+?+?+3?39933333310326533327# 5#.'##"&5:*\YYzA$?8M>y:Rkv4sa(,9Op]WJ:%j@*$  $&'PY  QY"" @ Y"  PY?+3?+99//+33/+393333310%32654&+5!5!#"'327# 5RvUsy׊vD>@*?=̃ugUgel2IK(A-!J@ "#0.IY /IY1?3+?3+??99333310>32!"&'##4'34&#"326"oTTo"{uvP]h^^fZUjJ?p@EU!]1J:N@  IY1@  IY /?+3/_^]?3/+993333103267#"&54632&#"BV |wr~bVlILmľxl 8'@"&()&$I@Y  I@ Y  1IY/?+3/?3/_^]+9/_^]+993333310"''7&54632&#"632'2>54#"lM#TJCr~aW?y[8M)Tpc/874Aufxl _E=^9^0K3'j@""  ()   IY  2%IY/?+?99//3+3/993399399310"&54632&'57&'374&#"326a^@JV̔?f4?Аp{(]mn_bbodݵ*P]PB5;0]OAia}}}Q{%@! !#&'#I@"YO_o/?@ HIY1 I@ Y@P/?3/]+?+3/_^]9/+]q+99333310#"&'732654&+532654&#"'>32{| y KMMNA=?MCEuz oxRXduwz E?=DdA76E jyra}0b@@   IY 2IY0.??3+3?+9333310##5354632'"3{ggX\96/*a\Uh\a1AD\@@  IY  IY 0?+9/3+3933331033##"'526=#5={ggX\96/*\h\a1A\-l@7@  IY.2?3?9/3+9933310#"&5332653#47)oTwr{GQXf{{MD}tO}hp F@    H[ 2 IY0.??9/3+3?+933310#5333#53+SSyQQyyjX9Xyy*0.??93103*y*0.??93103*y 3@   IY0.??9/3+3933310#5333#+SSyQQjX9XSyb@    !H[2 I@ Y @ H0IY5?+?9/+3+3?+99333310%"&546;33#'26=#"53}4,7zaYYZGbjdMJ))'.dyy (  2HY5?+?93310327#"53['%$","{9/ r q=@   A HY 52 HY.?+??+933331032=#33#"' "VDz<(#6hTW=&0IY.?+?99310!3!=Sx5nN-X@-$$(./&+HY&4  A IY10.?3??+333?+933333104&#"#4&#"#'33>323632#"'53258NN\y8NN\ys&eLSaCpd*2%,QlXwvFlX{rFX`#NCFK s iL#J@" "$%#0IY / 4??333+3?339333331032653##"&'##"&5332659MN\yx&eKSa iWpdy9MN\mVzsL=EKBN~mVwvF@   !A HY4. IY 10??3+??+993333104'33>32#4&#"#"'5325t,mSzo{BVWg(5"/PB`#PApT{r r iI@   AIY10.HY4?+???+399333310327#"54&#"#'33>32BP+**BUXgzs,mR{ni t >pT{rFX`#PAA9@  0..0???3?3993333310 '3#&'#=tr s.X@s, N@ IYA IY1 IY/?+?+9/+99333310!"&5!2267!"!.Jf^s_dc`[is {}\{}w\@  2IY 1IY/5??3+3?3+3?9333333310%.5%34&'>%+ pHLKIoID!d$÷ $N71i@''  0!0!23.)HY.5@  &$$IY$/IY1?3/+?3/+39?+999933323103254.'.54632&#"#"'327#"5bW!=xg\2znSO6APyW4sOS $+"=9v$- 6O8hmXci36(2!6T>lu*peruW4@   A HY 2HY5?+?+933310%"'532>54632&#"1*0 $)efI#+62 q:L7y vKYU@  IYA 0 IY /HY5?+?+?3+3933333310#"'5326=#"5#53733#327,0%$#* UY$R",( q (9O\\8, ![@ "#IY 0IY / .??3+?39/33+3399333333310!33##'##"&=#5326=!WzIIt,nQ{oHHXgBG^Q?~W^GZs>nU1G@*!/ &//23' IY$ 0IY/?+?3+3993333910"&54>54&+53232654.546;#"f$*$8TWC5bF?/FAE.qr.EAF/?Fb5CW>@-@    0IY/?+?3993310"&533253f{{ݎ%@-@ 0 IY/?+?3993310#"&53324&'3{LW)%!+}ٓ)gh;]LH -@    .0?2?393333103#'#" 04C4 @@ IY0IY.?+3?+3993333105!5!!4Y1>`9b`bW@  IY0  A IY .HY4?+?+3?+39933333310327#"=!5!5!!Y&!1$Y1>90q [`9ba ms@  !IYI@ Y 0IY .?3+33?9/_^]++39933333933310>32+'7#5!5!%"32654& FBRZ^h^%Z0>{BQu40&LyoXHTV:C+Ra8b`ǁ &^@  IY IY 4IY0?+3?3/+9/+39333310!#"&'732654&+5!>Yyer{p8 "~‰ une+ m@I@!YoO_o A IY3 IY/?+?+9/_^]q+99333310#"!2267!"!.=aYXbaXsUAkɺP) A@   [@ [ ?+3/2/+33339933105375353,Ҿ_6`B%!}) A@   [@ [ ?+3/2/+333399331053%5353_!F%Nf,4@) $$ -),/329333933310"54>54.54>54#"'632Z!)!!)!$*$1+/ <   ]-@ Y @ H  Y?++2/+33310#"#"&5332>;]"8``g@mB94Z]iC#Z%-%m9G(0(,/@/ Y/+_^]339310!5!7,:h:'@Y//]+339310!%7!:@:Ԕl,'@Y//]+339310'!5!WԀ:'@Y//]+339310!'%!:@WTlb4@//33]2333993310'%77==Amzzmb0@//22]2233993310''%7v=,=ԀmzzmoWl@   /333233104'33>3&#"T71$=5W>J0!ZG7t}!"@/32933323310%5!r``rRV N@$      /3299//92333333333339331057'5#373窪Rr``rRr``rWE&$f %+550N&DD60%+55f&%"&ִ "%+5+5B&ELE&% "%+5B&E#% %+5E&%!"%+5B&E7$% %+5qDv&&' Czb@&! %v %+5+5+5D8&F'vzQ@&!%!%o%+5+5+5ef&'&%+5+5&G$?5eE&'ϴ%+5&G $&%+5eE&'XԴ%+5&GT %&%+59eE&'Vд%+59&GX ',%+5WeE&'`ش%+5W&G\ *$%+5b+&(z& %+55+55F&H'C@ "&"! %+55+55b+&(@ & %+55+55F&H'v=@ "&"! %+55+55WbE&(   %+5WFN&Ht  " %+5WbE&( ! %+5WFN&Hl $0 %+5Db&('zu &#+ %+5+5DF&H'zG@ /&2: %+5+5=f&)1@  &  %+5+5KfS@" PY [ @  Y ??++9/3+3933339310#!5!54632.#"!53DH*/hj1U%%ͬ  .h] qO^&*& @ &* %+5+5XR&J J1&23%+5+5*f&+@ &  %+5+5fB@# [ PY??+?39/3?+93333103363 #4&#"#53 i^is|IE;/*E&+   %+5&K %+5*&+ F#@ & %+55+55H@& Y PY??3+?3?3+3933333103363 #4&#"#53!53 i^is|!ӥE;/θD*E&+zD&Kzr*E&+f  %+5r&Kf  %+5WE&,f ! %+5We&Lz #%+5+&,f@& %+555+555e&&jvJ3@! &p`P@  %+]]]]]]555+555&. C@ &>  %+5+5e X@.    @ H  ?3??9933?+9333333339310!#33 573IboE /E&.,ߴ  %+5e&Nٴ  %+5E&.޴ %+5e&N}Դ %+5LE&/) %+5\&O  %+5L^&/')&  &+5\^ O@* YPY R[ @PY?+3+?+?+93333310%!!5!!5!53!5!|*ն')LE&/ %+5\&O  %+5WLE&/  %+5W\&O  %+5K&0 C@ &%+5+5cd&Pv@ -&), %+5+5Kf&0@ &%+5+5cd&P@ +&)+ %+5+5KE&0 %+5cdN&P )+ %+5*f&1@ & %+5+5,&Q*E&1  %+5,N&Q*E&1f  %+5,N&QzW*E&1k  %+5W,N&Qff+&2f@ &*%+55+55I&R& C O@;2H2@H2@H2@H2H2@ H2 H2@ H2 H2&"/%+55+5+++++++++5ffS&2f@&&&2%+555+555I&R& F# 5@$6@ H6 H6@ H6 H6&"/%+555+5++++55ff+&2f@ &%+55+55Ik&R& J B;@+@H@HH@H@H@ H&%+5+5++++++5ff+&2f@ &%+55+55Ij&R& J Cw;@+@H@HH@H@H@ H&%+5+5++++++5_&3 C@ &#%+5+5WB&Sv_@ )&J%( %+5+5_f&3&%+5+5WB&S@ '&%' %+5+5f&5&ʴ %+5+5&U"@ & %+5+5E&5ɴ %+5N&U %+5^&5'& &+5R&U' J#&+5E&5fȴ %+5tN&U %+5Ohf&6@ 0&.0%+5+5$&V@ *&(*%+5+5OhZ&6  .0%+5$K&V  (*%+5Oh&6 [@ 6&X/5%+55+55$&V Q@ 0&D)/%+55+55Oh&6 w@ 2&4:%+55+55$&V g @ ,&.4%+55+55Ohf&6'1&+5$&V'+&+5Lf&7@  & %+5+5f&W]@ &h%+5+5LE&7  %+5T&W%+5LE&7f  %+5T&W 4%+5LWE&7k  %+5WT&Ww %+5=E&8fl %+55:&Xfl %+55W=E&8f '%+5W:&Xf#/ %+5W=E&8k %+5W:&Xk! %+5=+&8f@ &&%+55+55&X& CR@59H9@H9@H9@H9H9@ H9 H9@ H9 H9&$1 %+55+5+++++++++5=+&8 f@&%+555+555a&X& Jj&@"@H"& %+555+5+55 &9 G@ &! %+5+5E&Y@ &" %+5+5 E&9   %+5E:&Y   %+5&:C&Ŵ %+5+5&ZC&%+5+5&:vg@ &g %+5+5&Zv^@ &]%+5+5^&:j@ & %+55+55{&Zj@ &%+55+55f&:@ & %+5+5&Z@ &%+5+5E&:  %+5:&Z %+5$f&;@ & %+5+5^m&[@ &  %+5+5$&; F#@ &%+55+55^m{&[j@ & %+55+55$f&<@  & %+5+5BW&\@ & %+5+5I&= DA@ &&  %+5+5,&]@ &  %+5+5IE&=   %+5,:&]   %+5IE&=r   %+5,:&]f   %+5&Kp  %+5`&Wj #@@((H@H&%+55+++55 &Z@ & %+55+55BW &\@ & %+55+55&D=&Ѵ=:%+5+5Kf0@[  Y??+?+93310!#4632.#"53DH*/hj15ͬ  .h]}V$K@("! !%&""`Y""_Y _Y?+??+9/+39333310#"'732654&+7.#"#3 }j}yZv|)%D`w8 e 'y6B^=E&$ %+5N&DѴ13%+5+&$@ & %+5+5&D`?&̴6:%+5+5&$ 2@ &g%+55+55&&D :@ ;&;=2%+55+55&$ 3&%+55+55@ &D ;=&i49%+55+55&$ 4@ $&;&%+55+55h&D <@ G&#I9%+55+55&$ 5f@ '&"%+55+55&D =O7&̴B3%+55+55&$'@ &%+55+5&D&&5&@ ;=% 6д60%+]5+5+5&$ 6f@ &%+55+55&D >N0&ʴ39%+55+55&$ 7j@ &%+55+55&D ?J0&ƴ39%+55+55&$ 8f@ &%+55+55+&D @\0&ش39%+55+55&$ 9f@ &"/%+55+55&D AY0&մ39%+55+55&$'@ &%+55+5&D&@ 0&3;%+55+5bE&(&   %+5FN&H  %+5b+&(@ & %+5+5F&Hy@ *&!% %+5+5b&(&# %+5+5F&H@ $&%2 %+5+5&( 2@ &_ %+55+55&&H :@ &&r( %+55+55jb&( 3& %+55+55UF&&H ;(&$ %+55+55b&( 4@ "&1$ %+55+55Ou&H <@ 2&U4$ %+55+55b&( 5v%&  %+55+55F&H =m@ "&- %+55+55b&(' & %+55+5F&H&@ &! %+55+5+&,v@ & %+5+5e &v&%+5+5E&,   %+5e&L %+5ffZ&2 %+5IN&R %+5ff+&2v@ %& %+5+5I &Rv@ '&"%+5+5fm&2 2@ !&Z#%+55+55z&&R :@ #&g%%+55+55If&2 3!&%+55+55XI&&R ;%&!%+55+55ff&2 4@ ,&H.%+55+55Ju&R <@ /&P1!%+55+55ff&2 5f@ /&*%+55+55I&R =j@ &*%+55+55ff&2'@ &%+55+5I&R&@ &%+55+5f&bvb@ $&" #%+5+5&cve@ '&#&%+5+5f&bC&j!$%+5+5&cC"&$'%+5+5f+&b.&δ%)%+5+5 &cz1&(,%+5+5f&b(&)6%+5+5&c+&,9%+5+5f&bɴ "%+5N&c#%%+5=E&8 %+5:&X %+5=+&8v@ !&%+5+5 &Xo)& $ %+5+5$&qvV"&!%+5+5&rvU*&+5$&qC&,"%+5+5&rC%&+5$+&qY,&p#'%+5+5 &rg4&+5$&q'&g'4%+5+5&r/&+5$&qn %+5:&r$&<C & %+5+5BW&\C&ƴ %+5+5$E&<  %+5BW:&\)$+&<q&%+5+5BW &\s$& %+5+5$&<@ & %+5+5BW&\@ &, %+5+50&bd+&ʹ+'%+5+50&bd,&0+%+5+50&bd1&1'%+55+550&bd2&6'%+55+550&b1d1&1(%+55+550&b&d2&6(%+55+55J&bdD&δ/<%+55+55J&bdE&ô/<%+55+55&$&$˓&$&$&$&$&$%&$%A0&f(d@ -&-) %+5+5A0&f d.&2- %+5+5A0&f&d3&3) %+55+55A0&fd4&8) %+55+55A0&fCd@ 3&3* %+55+55A0&fRd@ 4&+8* %+55+55Gb&(T*'(b&(b&(b&(b&(W0&h"d@ & %+5+5W0&h)d@ &# %+5+5W0&hd@ $&$ %+55+55W0&hd@ %&) %+55+55W0&hd@ $&$ %+55+55W0&hd@ %&) %+55+55WJ&hd@ 7&"/ %+55+55WJ&h'd@ 8&"/ %+55+55G*&+T@*&+T*&+*&+*&+*&+*&+*&+]0&jd&%+5+5]0&jd&%+5+5]0&jd&%+55+55]0&jd& %+55+55]0&jd&%+55+55]0&jd& %+55+55]J&jd.&&%+55+55]J&jd/&&%+55+55G&,T@&,T&,&,&,&,&,&,I0&Rd@ &%+5+5I0&Rd@ &"%+5+5I0&Rd@ #&#%+55+55I0&Rd@ $&(%+55+55I0&Rd@ #&#%+55+55I0&Rd@ $&(%+55+55f&2f&2$f&2$f&2f&2^f&2^D0&vd&%+5+5D0&vd&̴%+5+5D0&vd &ִ %+55+55D0&vd!&Ҵ%%+55+55D0&v,d@  & %+55+55D0&v,d@ !& %%+55+55DJ&vd3&+%+55+55DJ&vd4&+%+55+55&<&<\&<2&<50&zd@ /&/+ %+5+550&zd@ 0&4/ %+5+550&zd5&5+ %+55+5550&zd6&:+ %+55+5550&z)d@ 5&5, %+55+5550&z)d@ 6&:, %+55+555J&zd@ H&3@ %+55+555J&zd@ I&3@ %+55+55&Z&Z$&Z"&Z&Z^&Z^Y&ZjY&Zj&b+&y(+%+5+5&b8!+&'*%+5+5A&f-&*- %+5+5A&f8b@ -&O), %+5+5W&h&̴ %+5+5W&h8W@ &V %+5+5]&j&{%+5+5]&j8@ &%+5+5I&R&´%+5+5I&R8!@ & %+5+5D&v&%+5+5D&v8@ & %+5+55&z/&,/ %+5+55&z8;@ /&9+. %+5+5W0&b'dD+&ʹ+'%+5+5W0&b'dD,&0+%+5+5W)&b']D1&1'%+55+55W0&b'dD2&6'%+55+55W0&b'dD1&1(%+55+55W0&b'dD2&6(%+55+55WJ&b'dDD&δ/<%+55+55WJ&b'dDE&ô/<%+55+55W&$&hW&$&˝hW&$'hW&$'hW&$'hW&$'hW&$'%hW&$'%hW0&h' d&+5W0&h'd&+5W0&h'd $&+55W0&h'd $&+55W0&h' d $&+55W0&h'!d $&+55WD&h'^ 6&+55WJ&h' d 7&+55GW*&+'Te@W*&+'TeW*&+'eW*&+'eW*&+'eW*&+'eW*&+'eW*&+'e5W0&z'dn/&+55W0&z'dn/&+55W0&z'dn 5&+555W0&z'dn 6&+555W0&z'3dn 5&+555W0&z'3dn 6&+555WJ&z'dn H&+555WJ&z'dn I&+55W&Z'vW&Z'v$W&Z'v$W&Z'vW&Z'^vW&Z'^vYW&Z'jvYW&Z'jv&b&&޴)1%+5+5R&b J'&޴()%+5+5W&b'D&&+5WN&bD1,%+5W&b&8"D+&+5&b0&޴0=%+5+5W&b&D0&+5&$@ &%+5+5^&$ @ &%+5+5&$i&$8vWE&$n 2%+5 @  ?9/93310#>5#5--.WMWn53L#W @  QY /+93310327#"=3!,&!p  @  ?9/93310#>5#5--.WMWn53L##@   ?2222333310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wxD@   @[?3+3229/3333339933105353".#"#>323273&LFA30S ]N(LF@[S *Hĸ "("84r"("l_^6W&h'&+5WN&hW&h'8#&+5W&h @ #& #0 %+5+5W&h' 0&+5b&(+2b&(8W*&++2*&+8WW*E&+o 3 %+5*n9@   [?3+39/993333310#53!#>5#5nr--.W MWn53L#*x9@   [?3+39/9933333103#5#>5#5rT--.W  MWn53L#{#F@!##  $!!## @ [  #G?229/33+9/333393310".#"#>3232673#>5#5*TNG76 [ /R?,UPG62\c--.W$49ac9%58n,MWn53L#]&j&%+5+5]R&j J&%+5+5]&j&j &+555]&j&j8 &+555]&j&'%+5+5]&j@ &!,%+555+555&,@  & %+5+5^&, @  & %+5+5&,)w&,8*n9@   [?3+39/993333310#53!##.=nrW.-- #L36nVM*x9@   [?3+39/9933333103#5##.=rXW.--  #L36nVM{#I@##  $# @ ## [#G?+3/33229/333393310".#"#>3232673##.=*TNG76 [ /R?,UPG62\cW.--$49ac9%58n,#L36nVMD&v& %+5+5DR&v J&%+5+5D&v&j &+555D&v&j8E &+555WT0&rd$&$ %+5+5WT0&r d%&)$ %+5+5D&v&,%+5+5D&v@ &&1%+555+555$&< I@  & %+5+5$^&< @  & %+5+5&<&<8@_&3T 5@    [ ?33+33333933310#53#53#53uк   5@   [ ?33+33333933310#53%3#5#53u<кY !@  [?+93331053E %!5W&z'n*&+55WO&zn 150 %+55W&z&8Hn/&+55&z@ 4&4A %+5+55W&z&n4&+50f&2ewf&280&Zew&Z8;WZ&Zv 9/* %+5D@ ?93331053 )@   [?+9/93310##.=W.--̥#L36nVM*//3310#*T F@"    //39///3333323333310#'7'77'*T7777Y7887 0@   //99//3322339910'7##!'77RJ77}m}8L( ,@    //99//3322339910##'7!(R77J}78}"L"L@ Y?+99105!xÉL@ Y?+33105! ÉL@ Y/+33105! ÉW6@  Y@ HY@ H/++/++3333105!5!*````^?@[?+933310!?7n^A@[?+933310! ^n] @[[++933310!] n^@@[?+933310 ! ^n^3@ [?3+39333333310!!!c727nn^/@ [?3+3933333310!!!i Ω ^nn6@ [[+3+393333310!!!i Ω nn^' + /@  Y [/?+3+3933310#53%shiNn+P@*   Y  [Y[/+3+3?+3+393333310%#553%%h""hi""*nbbnP{   /3/9310#"&54632{ropsuusuX .@  [/22+33933310!53!53!53//333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332233310###!!!TuO .@    /3/9/3333333310!!5!###uTON%1=H@O,##& D;;>5 5JI2AY82[8GY8)Y [ /Y  Y [Y?+++?+99//++?+++933333393333310#32#"&5464&#"322#"&5464&#"3262#"&5464&#"32Guowqttr-69026dwqsvr04810832uowqrvr049026eybZWeeWؕeWVf_]YeWWeeWM@ ?3/9310#3)MM!@ ?33/2933310#3#3()MM)'&SZ]2@ [?+9=/3393333310%53 PQm?snq2@ [?+9=/33933310%#5 53 RQot?D <@   Y  ?3/3+39/399333310#353#353 BE@ ??993310!#3BvsE H@&   [ [ [[?+?+99//++9333333310!53535353[YD@        /33/9/33333/3933333103#5!#3###TOON .@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG *@   //333332393310#'77'*TT~~~ݵqqp 0@      /3/9/33333333103#5!3###TONe<@    Y  @ H /]2/+]3/+399333104&#"#'33>326FHUw#cJnaZFd^oA:lyOg~bjhiqxs0dii6j@9   `Y  `Y  `Y`Y?+3/?+99//_^]+3+3933333310&#"!!!!!!&432-_U|$ĸՊqv &,@F'   -.$)! )   @&  _Y*##_Y?22+3?+32399//999933339333333331073'6#'#7&'#&?3&'SE0HM0lP'"JF7Yx#DBR1S peV "QzA4A^t2/6@Xv3RN# gK+qvZ)^@2$##*+ _Y $$ '_Y _Y?+3?+9///3/3+93333333104'33>32&#"6# !2.#":+pf$%$=#535#5354632.#"!!!!!27fFgHē"oHrphh76{kLym9?Ls}TXc8d@*b@3  (**#"" +,(PY) # ?33?39+33393333939933310!5#54&#"#4'33>32332#4&+J1A@O"iMWWevf1A`b{S*0f]_b/{E#'*@U!"*(())'$  $&&+,'_Y # _Y) $(    ?3?399//993+3333+39933333333933910!!##535#533!33#3#35#3'#&'#3DĪ޹E’jD LEgqqg4@Ѵ-E ,5I@R#"" (-;??8H2H KJ>676tY( &tY##;79972sY7272 A tYF  1sY??+?3/3+399//+3/33/3/+99+3933333333333310+#3 #"&'732654&'.54632.#"4&+32653733#327#"5F=Gn`ZJb l="-0MA^WFXm#753MQ8@KKZ;GD-34rEhSdSPX%($>!4e8OVVH ,#I%9#Yd^eraaNa E ;@L    5+10#0+ <=5#--3`Y1p1 11-!`Y _Y_Y?3?+9/+3?3/+?3/_^]+99933333333339310!##324&+326#"&'73254.'.5!2&#"8һd^fyml P?!D^ZX/wk}?mh\6?Eò#po*u֙}XM2D4($OqS%}JL,*RxE#&*.@Z# )'  '"+ %$$+'/0 &)_Y ,#+_Y $'' ?333?399//33+33+39392293333939103#3#####53'#533!337#37#7#7#3'@X$|?np@z$V>>42W?@P8M.[ggq(1X@ ! MA TYN TYMN??+?+99//?93333102#54.+#332>53#Y1ro32"&'#"&5463277563>7%4&#"32632654&&#"32h\#5$u#J^OSd(@d8Q69?HPSE>@z&~>30@5)7L\N@~"<73B[D쐀r5FC8N~E"',@J !%)('  ' _Y&  `Y `Y(' '0'''' 0 @ H'' ,_Y ??+9///+_^]]]33+3333+33+/33/3/3333339/3103##!##535#535!23#'!!627!!&+_d8翉̺0a8S R q{b~m'bUURq,O"h@7  ! #$ _Y_Y  `Y _Y?3+3?+33/9/++3933333333310%#5&%53&'!>7Mm[||9E 6o+HFp5#uv 8 7+zh&PE"@K       $# _Y _Y    ?3?399//33+3333+33999333929393339103##!##537!5!3!!'!73&/T˓ɀڀɇTUƭWP5.$,jj0ᕂZ5@(%** & 01167(_Y% _Y ?  300@000 0@0P0`00 0033-_Y3/o @ H`Y?+3/+_^]q?+3/_^]q99//]3+33+3933933333291047#53>?!5!654!"'>323#!!3267!"$_T"^wpqe},Zp(i J7r"-?/)ep!5(:,!$&r|v%qvm@A   _Y`Y_Y  0 0  ?3/]q3+3?33/++39333333310.'67#5&753twK[||gV"AZ~&A!g@IWt/o P .2@L12/020# 4*)##31/  Y& [&-Y* **& Y [Y?+++?3/_^]+++3/_^]??3333333333993310#"&5463 4&#"326327#"&54632.#"#3͎ 8>B89?=;YE9S b^z +-}vs[ y؇| HU!E&@$  '( Y  @ Y $Y$$ @Y?Oo Y?3/+/_^]+9/+3/_^]+3/+93333310%2673#"&=56746324&#"63NE(s3QO5{i~HH723f~NhmɦIKRewcgyEE$(e@5 % ()*"Y%%&`Y%Y  ?33?33?]+?+9/+99333399333310!#3&53#"324&#"3265!Hxw)68,'5:-X9mEޠrз˗}y숈&'0`@4-($$12-Y,@, Y,, , , Y Y/+3/?+?_^]++99993333210#"$54$32#"32%#!2#4&+326  \v3~_QPTDF-GH?~ovEHUJf@6  Y    ?33]33]?3333+3993333393393310#'#373##5!_Y/i =VoJ|/#V%%\\;Z#G@#  ! !!$%  _Y _Y?+?3+33399333399331026;!5654&#"!532&5gu,,uZl bܭb mIC_HT@   !  YYY?+?+9/+9/993333310"&54632!3267.#"r2UNHbܕ3Wu"6Fl~*z5AuE 5@b    .#)((# 67.&Y&+Y))))))& Y ` ? & & ???39///]]3+33/_^]+3?3/+99933333339922339910 # '##33#"&'73254.'.54632&#"\m;>l`O[uh}bCF4XXH(vpcr32#"&'7326dir٧`"jZẜ lhdD -@   @ Y /+33399310#&'5673!9>HH>9)CI$ICVvV &@   o/]299/9333105673&'#;CI$ICV9>HH>9#dD )@    @ Y /+33329910&'3#67!59>HH>9#CI$ICVvV &@  `  /]299/933310%67#&'53CI$ICV9>HH>9dD?@    @ Y /+2233399333910#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$ICvV<@   ` o/]299/]299933333105673&'67#&'5;CI$ICCI$IC9>HH>99>HH>9vHVS@) @Y o /]299/3/+_^]2999333333310!!5673&'67#&'5v CI$ICCI$IChPX9>HH>99>HH>9ic,b@7&-. "QY  / O _ o  PY)PY?+?+3/9/_^]+33993333910 #"&54>323654&#"7632.#"326c\둵Tud%<4'|zUejod_uɶvdcT?6'$>Yrs  I@%   _Y?+3/3/?33_^]]993393310353! b4ƑIi9bE"@ _Y/2?+993310!#!~9j 9E J@$    _Y  _Y/+3?9/3+3993339333105 5!! !{BH9m"ju`X@ Y?+99105!u`E%@[?@H/+]+93103+N}T0@ Y/2?9/+993393310##5!3juN +Z@5'!  ,-$$Y!!**Y?_@,H@H/++]3+3/393+39939210#"#"&5463232%"32654&.#"32zw8R~{s=g0-fBH^^`,gCG\\IuN~ԯR~skps4@ Y//+993103!!4^^0!@ Y /2/+9933104>32#4&#"tтwgĠ9&@ Y Y/+/+933310"#"'53254632&nSYO7<9W,1Xwr-ѬlP`-|@L&./)#Y)@H)@ H)@&Y_@H  Y @H @ H @Y?/]2++++3/_^]+]+3++2+993310"&'&#"563232727#"&'&#"5632\EIT?rGrMFYNr@  //93310#432#".#"Fe2#'+3+ I8'1$+$@  //933103#"&546323265Fe2#'+3+I8'1$+$+Y?+33105! +@ ??93103#"@ Y?+?39310!!#ؑn"@ Y?+?393105!# ++Y??+393103!!(G+"@ Y?+?393105!3 (+)@  Y??+?3933103!!#(ؑn'@  Y?+??3933105!3# (+*@ Y?+3?3393105!!# ؑ+n+*@ Y?+3?3393105!3! ((+ 5@    Y?3+3??339333105!3!!# ((ؑ+nwp.@  YY?+?+3333105!5! ߑjc @ ?2?39933103#3#jh p 9@  YY?+?+?3393310!!!!#(ؑpב"j -@   Y ?3?+33993310!###בnn#jp ;@    Y Y?+?3?+33993310!!#!!#jm$hpo"p 7@  YY?+?+?33933105!5!5!# (wב)c .@ Y?+3?339933105!### mב+ncp ;@  Y Y?3?+?+33993310#!5#!5!c$p)F)ޑw 7@    YY??+?+33933103!!!!((GǑבj+ *@    Y?2?3+39933103!!33ґt~jw ;@    YY?2?+?+339933103!!3!!jht_2Ǒw 7@   YY?+?+?33933105!5!5!3 ((wב9+c .@  Y?+3?33993310!5!333ctב+wc ;@   Y Y?+?3?+33993310!5!3!3!5!cܑtw6 >@   YY??+?+?339333103!!!!#((ؑǑב"j 1@    Y?2?+?3399333103!!#3#ґtn j G@  Y @ Y  ?2?3?+?+9933333310#3!!#3!!t _" Ǒ <@   YY?+?+??339333105!5!5!3# ((wב9c 1@  Y?+?3?3399333105!3#3# th+~c G@    Y@ Y ?2?3?+?+33993333103#3!5!#!5!ґt 6)ޑp @@   @ Y Y?+3??+333393105!!#5! ؑw"h 4@    Y?+33?3339933105!!### ב+nnp I@   Y Y ?2?3+3?+3333993310#!5!3!!#!5ޑ"בw @@   @ Y Y?+3??+333393105!3!5! ((ߑ9Ǒ+ 4@   Y?+33?3339933105!333! tבt+w I@    Y  Y ?2?3+3?+33339933103!!3!5!5!ґttǑ6V@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# ((((ؑwב9Ǒב"I@       @ Y ?2?3?33+333399333333103!!###!5!33ґtבtnn b@ Y @ Y ?2?3?3+3?3+3333399333333103!!#!5!3!!#3!5!ґtבtǑޑ" 6s/?3310!!3s6s?/3310!!3??3310!!3 g??3310!!gg f??3210!!g $g #'+/37;?CGKOSW[_cgkosw{@j&FVznn'GW{o6Nff7Og*>Z~rr+?[s ":Jbb #;Kccsgokw2Rjj3Skk/C_w.B^wvvgckhk@ Yd`h_[WTW@ Y\XTOKSPS@ YLHPC?GDG@ Y@n?o*Z+[BrCs.^/_@ JzK{۸ GwFv¸!@ ׸@Yԯ@Y@Y{x{@Y|xgkoswc`c@Ydhlpt`OSW[_KHK@YLPTX\H7;?CG303@Y48<@D0#'+/@Y $(, @ Y Y@Ԩx`H00H`x @ ظYA  Y ?3+3/3+39//////////3+33+33+33+33+33+33+33+33+33+3333333339333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#fggggggggggggffffffffffffeggggggggggggffffffffffffeggggggggggggffffffffffffggggggggggggffffffffffffffggggggggggggfffffffffffffffffffffffffegggggggggggg(bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````8EIMQUY]aeimquy}  !@kdx KkHh`{eyOoLl"\a|SsPp&X#] @ Tt* @'Y048<@DD!@ Ժо @Gg "@ .26:>B+ #@  $(,CҸƸYŸĸY@?Y   Y<; Yx{ wz~ g @Y8kosg7jnrff@YX\`dW[_cG@Y4KOSG3JNRFFYY0 @ gGGg  DӸǸY/Y"&*/3+3?+39//////////3+33+33+33+33+33+33+33+33+33+3233333333933333333333333333333333333333310!35#35#35#35#35#353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335#33535355#355#35#3#32fffffffffffgfgfgfgfgfggggggggggggggfgfgfgfffffffffgfgfgfgffgfgfgfg3gggffgfgfgfggfgfgfgffgfgfgfggfgfgfgfffffffffgggggggggfffgfgffggffggffffgg"a"a#`!b!b!```````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb``ba``````aab^^aa```b"bwuVT//3310!!w!T!@  /2/3333310!!!7L17}1hd{@ /]9310!!dhd{9@  @ Y Y/+_^]+933310!!!dLPbF"//3310!!C"$2//339107 XV2|4//3310 4ia//33910 a|//3310i9esY P@(  Y Y/+/_^]+9=/3339933933310!# 3 R7Rb`15>*)0@  ! Y Y/+3/+9333104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbhVeR'/7?GOW_gow@8PhhTl8xx<|(pp,t ``$dHH L@@D0044DLdt|lX\\NvrvYJrF~z~YBz6njnY2j^Z^YZVRVYR>:>Y:.*.@Y *rzjZR:**:RZjzrb&bfYb&&"Y&?++9///////3+33+33+33+33+33+33+39933933333333333333333333310#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557  /93102#"54>fnrotjlw%@  //3399103!32>54.#"%vwvvvwvu}Avvvuvvw%#*@ %$ //339933103!4>32#".'32>54.#"%QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwn^u 9@ @ Y  Y /+_^]+933310#".546324&#"326^aDpDegGJLfFFfbJM_}kArEgJGgFffFGei+7E|@& ,2?2 EGF>8 H88;;AY5)#)@Y/#;@ H;#;#  YY /++99//+3+3+3/+33333933104$32#"$732>54.#"74632#"&%4632#"&3267#".'?)**))**)h:}NP|9:pGsW.M **))**))N:;M1(DE'5b@"(".76@ Y%/5522,@Y2?2O2o2222 /99//]]+3/33+333933104$32#"$32654&#"32654&#"327'#"&'+)**))**).-WrIp::}NO}9M6))**))**DD)1N:;M'3_@($!!. 45+Y!$!Y1@ Yp $$/]33/]3++33/3+933333333310675373#'#5&''7&'#5367'32654&#"WgHfW3F E3WfHgW3E FxxvvE F3WfHgW3F E3WgHfWzvvv<F"b@ #$Y@ Y  Y/+_^]2+3/3+33933333331035.546323##5#32654&#"Xr{{rH,^_^[xp{{oH:^\]r!l@  "#@Y0 @/ Y/+3/_^]99]+9999399333993104632/!/#"&732654&#"{fQK7@{{H^_^[{@7Qf{{^\]ff!0@ "#  /?//9/]9339310#"&'3!5265#"&5467>5mic<% &;dcmVVfOl9+88+9lMmUUak*0@  +,/?//9/]9339310272#"&'3!5265#"&5463.54>fU|DC37c=% $?d73CD|=m@C$ql;)88);lr$C@m=ffh@   //9104&'54>323>32LwCr@YX@rClY6DўFr@cd@sEㅆw1H  //991053# U::f$@   /3/39933310>54&'#"&546323#)nZVE[S:*& yWM70&sAhDcD8AdDt{YfH3p<~@K  !  gT  'ywV?/]/3]9/3]]3]3]]]3]3]]]3]993333310%"&54632#"&54632%%5^E[S:*VE[S:*:,D8AdQDcD8AdCdPDcQxQ84x@@  !        ?9////99333333332//399333310##57573%3774```L`Y=>YYYYG\YY Y _LE_@1  `Y`Y   _Y?+?99//_^]3+33+3999322233103#535#533!!!!!펎|{䅔=.D@# PYPY  ??99//3+33+3933310!#535#5333#3# nnnnnnnn "ޅLEN@(  `Y `Y  _Y?+?99//+33+93333333103'"#>3332673#"'!#'kT&Z`!0/h|/0rr*_EL@' _Y `Y    _Y ??+99//3+3+9939223310#!##53!24!#!!326_wݑ翍]}nb^ŅɒWEQ@*   !_Y  _Y _Y?+?+?9/+39333339310327#"&5!2##4)!26a/4<2F>@mQL?*nX)06;@e'*0:9))1 ;#..43<=9 3*'*PY4/;/QY;;;;#' QY  PY  /  ??3/]q+??+?339/_^]993+3+3999339333332910&54673&#"'!23327#"&'#+>=4'7n0Myn .dQr*;!DGd[E aU@{l M[XBꨴRZ$,^.PQpip|gl_QYg/wn@I(Xgp@(  !  @Y PY ?33+33??+9?9933339293310533!33#327#"'#&5#:x T'{}Lŏn@".'A&323##4.#"#3h:}u*`Ujcro4~= hEO@(      _Y??+??3993393333333310 3###33r͋B< ~+E_hdP@)      QY??+???993393333333310###33 3d/Ilahboa /IhE <@    _Y  _Y??+3?+39333310#!5!5!!w2ahh): =@  PYPY?+3?+3?933331035!5!!#8j&qGZ:@   _Y _Y??3+?3+?99333310!#5#"!273327&#"Gfi󫰙ZOK_pMQ`\M^y>`N-@    Y ?3??+933310&#"#3?>32!*2w 8:*zhSC:D:@(5Љ})E!N@'  # "_Y ?333??+9/3333933333310!# #363>32&#"ZOpӽm"c0#Q 7WO>+"' hEѡZigZUVh0 9EN%N@ ' &" @Y ?333?9/3?+333933333310!#/#3?347>2&#"v(&{˷] #ni75/ie>+"( E\U:OYU`EZl =AKE"Z@&#$QY  Y ?3?+?9/3+39333399229910 #'7&54632?654&#"Klj1m&l\qcnU$:"i"/:#$}'rHfxcY41554N;M"+'E1@ _YP??9/]q+993310#3!yoEʠ:+@ QY/??9/]+993310!!#:6:$R;@   PYPY?+3??+3933310! 4746324&#">|WP5* ڸ AR{6@ /]3/399//339933105%5%{))J!@?9/3333310533U{s@ ?33/333910 '53WmdVm_@ ?32339310!5!%53$_ya_@ ?233310!53!}v "@ //9/3933310!#!53[c Uv "@  //9/3933310 #5!3!]U)@ [//+9/933310#353i8٘)@ [//+9/933310#3#58i4,*@ [,?+9/933310#3#58i4,i8 %@  ?2333339310##5##!8}}Oc8c $@ /2333339310)335338h}}cWt*@/329933933103#'⪕W㾾:@  ?329333105353k^ j@  /329933105!5! H֔ Y?9310#535Q3n P?9310#535Q3eT%W@/  PY QY?3?33+3?+/_^]/99333333310##5354632&#"3533K4-#E>Iz F\ai:T%@@   PY QY?3?3+3?+?993333310##5354632&#"33K4-#E>Iz F\aI4 && `]5  S?3210#"&533265ZNM[㑬M]^L <'#'Zr7F{R ' L `'LLh,@  UYK?+3999310!5!3!L3T&@  %+]5&ߴ %+]5&' /@&&'&,%@{]]]5]]5+]5&'/&&@&,%{@]5]]]5+]5&^ %+5&^ %+]5&/@>#(#X##G#w##@ ## %##]5+]]]]5N}&i$"@  %]]5+]]5&LG@4FS"0`%/O?]]]]]5+]]]]]]57F&(g, U @ % ? /  ]]]]5+]]5{R&g,@%?/]]]]]5+]5~)&fgW@( T   P  0 G D  @ %_O]]]]5+_]]_]]q]]]5&gA@GUt @ %?/]]]5+]]]]]]]5Z&4!!@!!%####|#_#O#]]]]]]5+]]5F<&yzs@K/  v  4 T #  "  P  0 G D     %+_]_]_]]_]]q]]]q]q]]q5]]]5`& kg+@"%/?]5+]]]]5& ȯM@;Dt 0P`& %|_O]]]]]]5+]]]]5'& !@G"%+]]]]5L& 1C@G `@!%####|#_#O#]]]]]]5+]]]]5%&iM@!7GT"@ %(]]]]5+_]_]]]]]5b&1@!####%####|#_#O#]]]]]]5+]]5sF&p@|O]]]]]]5uV&t#@   | _ O  ]]]]]]]5JD&!7@ XG@%?/`p]]]]5+]]]]5L&+@ I@ %pq]5+]]]5`&kg1@!"%?/]]]]5+]]]]5&@{@]5]]]5'L&/gC@###F#v###"#`#@## %##/#?####]5+]]]]]]]5 F&N}& %+5&  %+5uV&%+5B@  N MMJ??3??939333310#33673#VÖ 32`F[q> ܺw).2}5@  @ Y ?+3321032673#"&'aEmzNX*4Cfq5"Y&@  [/]+93331053OūY!$% (@  [Y?++3993310 332673t \ji] MHHM!@  [?+93331053Oū!$%!@  [?+933310#5Oū!% uWD:(@ PY PY?+?+993910#"&'53265!5!DO-{iK"wŎ%MEG@  Y   Y?+3?33/_^]+9333331053#526733Ij-2hytMk'8w?5skMQO@    YY?+3?+3/_^]/3/3/3933/105>7>54#"'>32!kZRFo=; oxyuK|Ma>rD=`5y>=ftpgxYG'k;Q(@C%"  *%YO_o/o Y@  YP?3/]+?+3/_^]9/^]qr+9/9339932/3_^]10#"&'732654+532654&#"'>32wk A06B)%D@6)-B im{CERKezpd <=B;@ltsm&1Ylj\.Z/321053?H$@ /233393104&#"'632#5>3*HFZjQ[pE0"c;U Ze: ,@ PYPY?+3?+933310%!!5!!5!|*󎎎++ 4@  @[F?2+323333991053!53%!5!%++ 9@   [ F?39/+333339333103#553!53>+ ָ3+ G@    [ F?3293+333333333933103#'5353!53ћ+ a޸++ 9@   [ F?39/+33333333310#%5353!53h~ }+-@Y@[F?++339310537!5!W%?+C@   YYY G?3++9/+333339910!5!"'&#"#>3232673%3TU$--[ +L?7SS"0+\ *K&%#(RH(%&&%QJ'7 @  ?33233310#'##'##'Z(//(//(Zeeee ,@  Y?+_^]2333310 33273T @+ )@ ?39/33333310#%53!5!8%~ + '@  ?39/333223103#5!!&%+ '?+;@ G?2229/333333933310"'&#"#>32326733#53TU$--[ +L?7SS"0+\ *K&%#(RH(%&&%QJ'h ?SG@    G?3]2239/333333993310#5!#5"'&#"#>3232673+3TU$--[ +L?7SS"0+\ *KSp&%#(RH(%&&%QJ'YX 4@   Y/E?]9/+33333310#5353 0'K 9@   @@ H  E?322/+339933310#53#'53373D'him++ 3@   @ F?322333339910#5!#5!5!+=%+e:F@$   PY PYPY?+3?+9/3+39333103#!!5!#53!5!|*iVC4&b& J h'&޴()%+555+54&b& J!h'&޴()%+555+54&b& Jh'&޴()%+555+54&b& J h'&޴()%+555+54&b'Dh&@9@ H9&&޴)1%+555+5+554&b'Dh&@4@ H4&&޴)1%+555+5+554&b'Dh&@4@ H4&&޴)1%+555+5+554&b'Dh&@4@ H4&&޴)1%+555+5+55]4&j& Jh&%+555+5]4&j& Jh&%+555+5]4&j& Jh&%+555+5]4&j& Jh&%+555+5]4&j'&h&@#@ H#&%+555+5+55]4&j'&h&@#@ H#&%+555+5+55]4&j'&h&@#@ H#&%+555+5+55]4&j'&h&@#@ H#&%+555+5+55D4&v& Jh&%+555+5D4&v& Jh&%+555+5D4&v& Jh&%+555+5D4&v& Jh&%+555+5D4&v'Rh&@(@ H(& %+555+5+55D4&v'R%h&@(@ H(& %+555+5+55D4&v'Rh&@(@ H(& %+555+5+55D4&v'Rh&@(@ H(& %+555+5+55e&Lvwj@ &c%+5+5W5Y!=@  "# _Y_Y?+???+39333310"&'732654&#"#33632_;ZjjcxNVuWJJsnɫlc=M\W*E9@  _Y?+?3?3393333310#"'532>=#3&53*}zRA4(-1 AS^jNEڐ5Y"F@# #$_Y _Y?3/+?9/?+3993333310#"&'7326=4&#"#336325,ocxNVuRËWUɫlcv=Mj2j    ;=?3?3332310#"&546324&#"322LSVMNR¾X}c @ ;<??39/333107573}Yxy}$jO@  @H  Y;Y<?+3?+3/+9333339310%5>7>54&#"'>32!$zd\EF=:S yTQzU}CF|F@S,6865XkpdEv6QE$nj0j#y@3!$ $!Y/ @HY; YH=?3/++?+3/+9/_^]+9333393310#"&'732654+732654#"'>320HR?3WM yKgzm^p@;jk/1eb[np^!}Ac <@Y ;<??39/3+3333333310#5!5333tfq$ T*q5j1[b@  Y: YH=?3/++?+9/333333399333310# '732654&#"#!!>3211O>LWIP?Q ur#T?z};5SGCR(u#i)j"K@  ##  ; =?3?3/]39/]33333932310#"&54632&#">324&#"326)7^N[`HvFQCHIFENow˙L{}"1{KCJDENN|#\ 0@   Y :<??+33339310#47!5!#}EFح#oj0j"-V@#  ).#. !&!&Y!!Y;+Y=?+?+9/+99333393310#"&54675.546324#"324&#"3260`PKO~QLQaEEQKIPNJBiopgHf ^>VljY=^ bii69:;@7@i*j$S@( %%O_o  =";?3?3/]39/]33339333104632#"&'73265#"&732654&#"؜eN+N[`HvLKCHIFENdwSM)'x}"1}R@LFEJJSK@%   @ H E?3+9/]233333333933103#5#'##53`tih UG@#  @ H  E?3]2+9/3223333393310#'53#'##53i`~ihh |O@%  @ HE?3+29/32333933333933104#"'632##52#'##53;3(:CC6=Kih#@`,8N? Q@& !! @ H  E?3+2299//3333333333393310"'&#"#>3232673#573#3TU$--[ +L?7SS"0+\ *KЛX&%#(RH(%&&%QJ'pC 97@    E?39/333339333103#5"&'332673#݂YkjTThk tD78Cx97@    E?39/33333933310#'53"&'332673\ kjTThk tD78Cx9 ?@  E?229/39333339310"&'3326734#"'632+52kjTThkc;3(:CJI#KtD78Cx#@`047? $E@   !!%%   !E?22299//3333333993310"&'332737".#"#>3232673fUU#DA=Q[ *K@$F@;0+\ *Lj]SSdc#'##53L=5FYBI[*5ih,Pp0E &^I !I@""" ?32299//33333333333933103#'##5"'&#"#>3232673chi3TU$--[ +L?7SS"0+\ *Kh&%#(RH(%&&%QJ'M 7@   ?299//33333933310"&'33273573uuIM 7@     ?299//33333933310"&'33273%53uuIM+ ?@   ?229/33333339339310"&'332734#"'632#5>uuR]HFZjQ[pE07c;U (nM #?@  $$    ?22299//3333333333310"&'33273"'&#"#>3232673uu 3TU$--[ +L?7SS"0+\ *K|&%#(RH(%&&%QJ'j@ E?933310%53H@ F?933310573H +@   E?32333393310#'##573ih +@ E?32333393310#'53373hi-Z'@ [G?2+393331053!53ӥθ%@   E?2222333310".#"#>3232673*TPM#%& o /R?,TPJ!%( pc%-%/H`b6%-%/Hn  1@  E?2293333333105733573  #@    E?22993310"&'332673eum[[kuo5<=4rTyR@ Y?+9910!5!y%/& w'W@G"@,#%@p 0@P`p ƴ%+]q]5+]]]]5/& w8@'@p 0@P`p ƴ%+]q]5`& U !@ %_0]]5+]]5`& k !@ %0]55+]]55&2@<<'<#(#X##G#w##@ ## %##]5+]]]]5 #/;?%@<9!@!!! ='/33333]q222104632#"&74632#"&4632#"&%4632#"&4632#"&3."".0 0. ".0 .t/ 0/! /0." 00 ".. !/." .ob".0 0/!".."".0 .. 0."--" .. 0/!"...n@@/3]q29/10!!%4632#"&4632#"&3Ge." 00 ".. !/." .o5j>"--" .. 0/!"...n#@ @! /3]q29/105#5!#%4632#"&4632#"&3QnGj." 00 ".. !/." .oujju"--" .. 0/!"...nt;04.'32> #".54>75$&~1ELIf<#IoMQpEr/Z3O1@{sr}BI`.UsVQr[L`76_`:anHDspa!:wTSnV%Ez  s  .  5     5 4M    ( (   8a \ j E 4 Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Liberation MonoLiberation MonoRegularRegularAscender - Liberation MonoAscender - Liberation MonoLiberation MonoLiberation MonoVersion 2.00.1Version 2.00.1LiberationMonoLiberationMonoLiberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Liberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Ascender CorporationAscender CorporationSteve MattesonSteve MattesonBased on Cousine, which was designed by Steve Matteson as an innovative, refreshing sans serif design that is metrically compatible with Courier New!". Cousine offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.Based on Cousine, which was designed by Steve Matteson as an innovative, refreshing sans serif design that is metrically compatible with Courier New. Cousine offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.http://www.ascendercorp.com/http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlhttp://www.ascendercorp.com/typedesigners.htmlLicensed under the SIL Open Font License, Version 1.1Licensed under the SIL Open Font License, Version 1.1http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL#T X  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Yuni00A0uni00AD overscoremu1 middot.001AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni200Cuni200Duni200Euni200Funi2012uni2015 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Eminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23undercommaaccent cyrillicbrevecaroncommaaccentcommaaccentrotatedotlessj onefraction twofraction threefraction fourfraction fivefraction sevenfraction eightfraction dotbelow.alt1hookabove.alt4 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capcyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lcgrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.ucmacron_referredlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BE=Cz̑x N O Q R S T V W W .Xcyrlhebrmark .6>FNVdr Frh$(6NHj0 > !L !!!""H"x""##8#h###$$*&*-111n L $*06<BHNTZ`flrx~ &,28>DJPV\gxxxdx````zz ( K NHfj" zf &,28>DJPV\bhntzfXfX@A22z2zfX&<XfXX zf L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzfFfFFFNFNfFffFfNFNNFNfFfFFXFXNFNFfFf&F&NFNpFpDFDDFDXFXDFD0F0FfFfNFNfFffFffFffFffFfFfFNFNFXFXNFNFNFNFFFFfFfFfFFFhFXFXFFfFFFFXFXF F@fFDFXDFXDF0F0FF&Ff&00FXFXFFzz ( K NHFLRX^djpv|fFfFfFfFfFfFfFfFfFfFfFfFfFfnfFff. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzNN00ffMMffff\fffffffffff2fDDXX::DD\lXXffffffffXfNNMMffffffhh00>0,,ThhXXXX\l4f00XXTTzz ( K NH T U Vjpv|ffffffffffffffffffffff2ffff2zz<zz2 K N!< K N!J` T U Vzz J` T U Vzz T U VJ` T U V K N! T U VJ` T U V K N! 4<zz4Jzz4< K N!4J K N!Jl T U V T U VzzJb T U V zzJl T U V T U V K N!Jb T U V  K N!n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFvFFFFvFFFFFFvFFFFFFFFFFFF^F^F^FF^FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFzz ( K NH FRFFn L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFfFFFFfF F FpFFFfFFFFFFFFF\FFF4F4F4FFRFFFF F FF\FFFFFFFFFFFFFFFFF F FFFFFFFFF\FFFFFFFFF F Fzz ( K NH F|Fn L $*06<BHNTZ`flrx~ &,28>DJPV\H L>  zX    >  fH vvL> X vH>LLzz ( K NH ( > T U V  K L$*  K L$*  K L$*  K L$*  K L$*  K L$*  K L"  K L$*$*$*$*$*$*$*$*$*$*$*$*$*"("(n L $*06<BHNTZ`flrx~ &,28>DJPV\ 8LppppLL L~pzz ( K NH ffn L $*06<BHNTZ`flrx~ &,28>DJPV\ffffffffff,fffffff,fffffffffffffffffffffffRRffffffff,ffff,ffffffffff,,zz ( K NH T U Vflrx~:::::::::::::::::::::n L $*06<BHNTZ`flrx~ &,28>DJPV\fFDFDFDFfFfFfFfFfFfFDFfF4FfFfFfFfFfFfFfFfFfFfFfFDFfFfFfFfFfFfFfFfFfFfFfF4FfFfFfFfFFfFFfFfFfFfFfFfFfFfFfFfFfFFfF4FfFfFfFfFfFfFfFfFfFfFfFFFFFFfFfFzz ( K NH:@FLRX^djpv|pFpFpFpFpFFpFFFpFpFpFpFpnn L $*06<BHNTZ`flrx~ &,28>DJPV\ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffzz ( K NH T U Vflrx~ppppppppppppppppppppp@p 8 >fcyrlhebr&MKD SRB ccmpdliglocl" $,(,<8v 8BLV`jt~ (2<FP T U V S   N M K L (06<   ", zzJ",6@  openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSans-Bold.ttf0000644000076500000240000126322013402025764025154 0ustar kintelstaff000000000000000FFTMaftGDEF}t1DGPOSPOJGSUBOQ.OS/2̴`cmap[*.cvt m_k<fpgm~a0gasp 4glyfZg!,head<6hhea t$hmtxyo(lkern)Zlocau ?(pmaxp34 name9sx post<hprep8h0_<̓H̓H% oD>NC %z o  RT\/\MT33f  Px!1ASC Q3>`: 99s#s3ZmfV9P99sQssGs/ss?sKsXsAsGVUV^u3TV9T9s9TV9TV;{VVV#=s9-sBs<sPTsP#T99s9PTsHs9ssR!=+Q9s3ss9s=s5 -s\TP k3Zd13,WsG`R-s]^^gr333333TVVVV99h999T9T9T9T9TV9T{{{{V#Vs4s4s4s4s4s4BsPsPsPsPsP99r99PPPPPPd1ss3s<3s<3s<TsPTsPTsPTsPTTVsPVsPVsPVsPVsP9TT9TT9TT9TT 9999999X9E99Gss9ss9j999TP9TP9TPTP8V;sHV;sHV;sHV;sH{{{{{{9V#sV#=R=R=R9 8TsPXTPVPT^s9Tr99s9s9TTPTPAVVPsTZ{ji{)#s4@H6(67sGs==R T Vr :3s<999TP{{{{{sP3s<3s<B9T%9TTs9TP9TP69 T9TTCR3s<B9T3s 3s<Vs VsP99999TH9TPk{L{V;sH)CT a T=D3s<VsP9TP9TP9TP9TPV#s 9]T3Ts  sOD)4+VVs s93TTVssTs<sTTsFsPAPE5+RTTPs 99l>D9PPQP sHQKs9sDpD66sBsRsBsT9TRPsTsBsW?TT TF#5E""+,6"3/m99999VV.. $~~ "A'L!119bb#A..:a^s@,8,nnn))D`IIGSs@H{{D/Rn/ =DLo/ooC1SSSSSSS.*Zs<sPs<n$.?$$k93SV=9T9V&T9TVZV#?Vy`jS9V#PMk9PsVMBkSZ9vs sBP *y)OyPP Q9PQg)#)#PNi9TP|sP<oi} VVVV$ TQ(iZsP99TPQVT8T8VZTV;95s3V;.9TVTGVn '6@#s<^UsP5PsP:sRsS&k4sPsP UkPsH9@9@ s =Y: &&^VshgyU}PDy`u9TP,,TP## =Y5P =Y: csP%kVU;.5 %  _;;TsP:ssssVs.nSnS m  m 9;n]93s<3s<BVsPTsPTsP;.5.69TP9TP9TP6k4sssnSUUVsVsUT>ZzTQMCQJMCf9TP :^E9TT9D+m^`Nh)\DH^jb\D^H)==\\\^5uBR?)hj3j'mPF1jsH3)f7h  ;{'q9=?5LsP59AvPs<GG&BNPP:J$RIs9R5=Us$7,U$U$%|%rT2)"*w"x#&/zF[1/w!{!/!!3!10086 1!1&0(H1 .I2I2 0 (B*0L 6C22!1.(-B12`Ts &R99 T#%Ts9JEsHssDs<TTsPE5>P9s<6!2 1 H/6 0,t!1!1tv?PIB/2__70H1-19 @^23+R12 '8yXXo3s<TsPTTTTTVsPVsPVsPVsPVsP#9TT9999sss99999TP9TP9TP9TPVV\V;sHV;sHV;sHV;sHV;sH{{{{{VsVs99999VsVsV#s=R=R=R9ss<93s<3s<3s<3s 3s<3s<3s<3s<3s<3s<3s<3s<VsPVsPVsPVsPVsVsPVsPVsP9Q9P999TP9TP9TP9TB9TP9TP9TPTPTPTPTPTP{{{{{{{V#sV#sV#sV#sPPPPPPPP33DDMMMMMMkkkkkkkk99999999PPPPPPUUbFQQQQQQQQPPMMkk9 9PPQQPPPPPPPP33DDkkkkkkkkQQQQQQQQPPPPPPP33 33kkkkkCOW/WE99999999/OyyV#V#Jr  QQQQQeFFj2Us9 Lss>k9999{ssAM)UU\]~V#5+-+l0H10s TTss ~s sV9TVT6) }%UX`^3rTgs<5+UV9dH1d+ddd1d1d"g{mmb))s+kUFQ@;@<fB0 9Vs<s=DT[s#T|NP?U`a##j)uB)hmPF'=Zq9q9q9q9uBuBuBR?)hjj'mPF1sH3f7 ;{'q9=jRmP7XPGGIIgqgWW#{{{{{{{{sssss{sssssssss{{{{9WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWW79PPPPPPPP9999999999999Ekk''XPXPXPFuB=iiV$~~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-AU?9U>9UB@A@;3:U839U992=1U1/U0=/U,))*U(='U'*U&=%U%*U#""*U+=*UP/@Po@5/_/_o ='==U=U0U/A  @@(F<&`ѐ`ѐѰF F@&@)AF@"'F!@&=o  @`p@`з @ H=`е@ F_</A ?O@@(&)F/?@Fp5P&<<@~P<'''F(F5&&o&O@ F_6FvP&uP&tP&sP&)pppppphpYp@}p FonHnF2U3U3UaP&`_2_P&^ZH\F'[ZxZF12UU2Uo?Oo_S@S(,F@S"F@SFkR{RRQOPOO)OYOiO@-F%IFHF!GF5FFHU2UU2UU @- ?_/Oo?oOTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu++++++++st++++st++s+++ssu+++++++++++++++++ssssttt++++ss+s+ss+s++s+s+s+++++sss+++st+st+st+s+st+stu+st++++s++st+++s++su+s++++++sts+sssssssss++++++++++++s++++++}y:wW%')L?]%uy!1=DsN0Ess0`HjgaAohQ^Uc wuLLLLX   p d < l $ | $DL@ |4(@  !<##$<$%&\'8()4)+D+--..4..//X0\112P3 3450567,78949:l;;<==?(A8ACD8DE4EFPF`GHIJTK$KLMNOP0PPQRRSSTTUxUV,WpWX\XY0Y\YZPZZZ[[H[\\\]]@]t]]^^4^_$_T___`$`aaab,b`bc$dd4ddddee<fffg gPggghhHi,i\iiij(j\jkkl l@ltlmLmmmnnHntnnoo4odoooppPppqqqrrPrrrs s@spsstt0t`tttuuLv$vww@wpwwxx(xPxxyy@ypzz{{|{{||(|X|||}X}~ ~P~|~~ \ <p <l$T 4dD,`(\,\$ThH|@P@PXDTTX\x4hh4Pl$Tx0DL4TlHx<p$dX H8hTd,D\4d|”¬ è4hĜHxŨ@xƬPDŽǸ(XȈ,\ɔ4lʤ0X˄ˬx@p͠D0є @tҌҤLӀ @tԼ,<(T߀<L\|XT,d4t$|,@|X HpLPd   8  h h  x(T4h(@P !#D$<%4&l'\((()*l+ ++,|,--x../0///0 0l011H12H2X2h233l344P4445$5`5566d6674778h899h:X:;(;<0>H>>???\?@@L@@A8AlABBBCC@CtCCD(DtDDDEPEtEEEF0F|FGG(GLGGHHTHHHI4I`IIIJJ@JxJJKK,KhKKKLDLtLMM8MhMMNN$NhNNOODOXO|OOOP(PXPPQ0QQQRRtRRS4SdSSSTlTUUV Y$YTYYZ,Z\ZZ[[P[\T\\]]@]d]^^<^P^d^^^^^_X_l___`L````abPb`bc4eLe\eef,ffg8ghgxggh@hPh`hpiTiditiijjxjjjkdktkmnppqqHqxssst$tuvwxtyyzdz{8|}l@$4h<xd4dppP`8<|DP (x0|(`4(XhxXhxXH|` Xhx,@|<ôtĴL\Ǵ PPHXˤ˴͔̈́XҨԜ$ռ<h؜݄Pހ޴\$t0xP<l8HPH8L0   X   Plp\ l$0|t\t p!d"d#p###$%|&&'@'(d()*$*+++,,<,t,,,,---L---. .T.//8/h//00@01122T22233P3334 4|45 5D567`8 89h99:;<`==>t?(?@pA AA,AB,B<BLBCCCCCD8DE E|EF0FXFGG@GGGH0HI`IJJ@JhJJK K4KKKL L L4LLMN4NNODOOPPTPdPQ(QHQtQQQQRHR|RSSHSTlUUPUUVxVWtWXXxXY`Z Z@Z[H[\<\]X]^x^_`(`@`X`p``aLbcLd(d8deHeffgHgXgi\iiij|jklmn nnop qqrxs(sstttupv@vvvvwxxty yzz{P{|P||}X}~~  `<4x TL8\LT<,@Th|0D(@ P\LxHXHdL`t8,\8h, ŌƘ @tt0pL˜@̰<@Р`DҘx,Xՠp P׀\، 8lِټ<hڔ@l۔<tܠ(PxݠHxި8`ߌ(P|8h Lt Ht,\ 4\8t$`0d$P P8l<lDl@h<x(\$X <l8hHt@p,TL$XL$\ Px0`8lD 4\P(\P T 4`(\(XD\P , d     D l     < p    H p     8 h  <p(PxHx X@h8lDh,`8l,T|H|<`(PL|@tD@,X  H x  !0!p!!","l"""#,#\###$($d$$%$%d%%&&<&l&&&','\'''(((d(())0)T)x))*H*+++,,@,p,,--8-\--.\//@/p//0(0d0001 1x12233P334444p4445 5H566`6667,7h77778 8T888888888888889899:,:\::::;4;;<$<=D==>l?0?p?@ @D@@AHAXD@D|DDE,EEEFFGG|GGH\HI<JJ\K0KKKKLLLN@OHPQ,RS,V<W|XYhZT[\0\^_`abcddefxgxhxi0ijklTltllm mDmmmnPnooppq|rdrsLs|sstu`uvvtwHx xy y|yz zz{{L{{| |h|} }`}~ ~x~0 pLP8< $<0`8@ld8H|xtD$X(x4h0Pd`LL8dT0lDtd`œ¬¼ ,|Ôì\tČ8PŀŘŰ4`Ɛƴ <xǨ8PhȀȘ,\Ɍx0̈́ `ΨX<Фи,xшќѰ$8L\lҀҔҨҼ  4H\pӄӘӬ$8L`Ԑ x֌4׈(|hٴ dڸ PۜPܨDݐ@ޜ<߀,@$|$ pt(x|<|< x8(x x4t4(p00|488<0|4@(4xp$p\\H@<PD|d$d $ d   $ d   $ d   0 t   D  hHDP|`0\dL$P\ DDDx,xh !,2@  ?/993310!!!eL5@ [ t d T F 2 "           r d T D 2 $   h        r d T D 6            v f V 6 "          p ` P @ 0 $   8       @Y t d T         p ` T D 4 $       t T D   ^]_]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qq_qqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqq/+?9/933310#!! & D-@  [?3+399_^]3310#!#!'9#Rs@v    !   Y Y  O   /3?399//]q]q3+33+39933339999103##!##53#533!33!!ERPPOFTR3TToH5F^}}LLhV(/6@R#5/ 0 +  875  tY  0 @   4$/#))uY   4/@ H//+]9933/]]+33333/_^]+393333333333310#5.'%.#.546753.'24.'6Vm&qiZmk!WP ';`J$Et /qi %epI'W_ `,:& :2?(!3 '3 @" (. 541Y[+Y Y [%Y 55t5d5T5E565&5555555555v5`5R5@505"555g55555555r5d5V525"5555555555v5f5P5B545&5555555555b5T5F565&5@w55755555y5f5I545$555555555v5f595 555555555p5`5P5D555_^]]]]]]]]]]]]q_qqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]_]]qqqqqqqqq??+++??+++933333310#"&54632#3%2#"&5464&#"3264&#"326紮Aճ1=JP=@KI@=JP>AKJ?rZ$0:e@=% +5 -3 1 <;3-8"8OY 1""(RY?+?39/_^]9+399333310467&5463267327#"&'#"&4&#">&'326ZJĵNch6D}V\A47LVG LAMQ6i[1RjpAiRM|jPFI>;9HVGWj->FĹQcx0m}@ [?+9310#!bfW "@   ??931033&7!W>W@.           ?3/]393333999399339107''7'73DDoh=y{=hVY %@  Y ?3+3933310#!5!3!q9hh1 "@   [[/++993310%#>5#!39;J!BxOGL1PX@ Y?+99105!P1@ [/+93103!!1%/?33103#) Q (@  sY sY?+?+993310# 46324.#"32>jԮ&TPUW%'UQPW'@^_^c: +@ @tY?+3?329331035!5%!!]a CPG!=@    sYsY?+?+3/993331035>7>54#"%>32!G7˚wZ_Nzsy}xKaaмcvprA/)(@`" "%)*%sYF<  _ sY sY `p0@?3/]q+?+3/_^]9/^]]]]]]]+99333310#"$'%32654&+532654&#"%6$32)epb\yza]Wkdg^dc\Wc`Xǰh :@tY??39/33+3993333310!!5!3467!S:8Do6~8j?:s@C sY_!tY sY?@?3/]]q+?+9/_^]+3933393910#"&'%32654&#"!!!632:pUi}vjuJ1OfZR~o[ZK)#M@)  %$tY  sY  !sY?+?3/_^]+9/3+9333310#"32&#">324&#"326)+&q-eoa]pu__j]Wy}%KPxwb{X *@   sY ??+39993210 !4!5!_~I\DӨIULA4#.M@)) $ 0/ !&!&uY!!uY,uY?+?+9/+999333310#"$54675.546324&#"3264#"3264ru\]\[!fmlomgŇsôsd]^tm|rrG'#S@. %$!tY  sY sY?3/q+?+9/_^]3+9333310#"&'%3267#"&54$324&#"326','v&ds_]kj_Zw%KUwu{ B@ [/Oo @"H[ ` P        _ O 0  h     p ?     o _ 0       /   8      ` P      _ O ?        p P @  ^]]]]]]]]qqqqqqqqqqrrrrrrrrr^]]]]]]]]qqqqqqqrrrrrrrr^]]]]]]]]]qqqqq/+/+_^]+993310!!   I@ [/Oo @"H [ [ `P_O0hp?o_0 /8`P_O? pP@^]]]]]]]]qqqqqqqqqqrrrrrrrrr^]]]]]]]]qqqqqqqrrrrrrrr^]]]]]]]]]qqqqq/++/+_^]+93310!#>5#! 39@E RxOQGV}Y4@?_ /]]]3/]39=/33910 VABU#X)\@>  Y @H Y0p @`p/]q+_^]/+_^]q+_^]9105!5!UJV}Y2@_ ?/]2/]]]39=/3391075 5V@}DEy^mJ@  [Y?+3/?+9/99333310!>7>54&#"%6$32!mWwLDCgdkXsje I!aU71d54$#"3 %#"$5$!24&#"32>V\c2gE'u%/PUџ &'>dyw^^SadB}b5նԩ[Q%i˶D2*錯 tٗz_Ri_x}yrT3@   _Y  tdSC4%ufTE4$htbPB2$tbRD6$vdRD4&@o8vdTF&tdPD4pdD^]_]]]]]]]]]qqqqqqqqqqqr_rrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrr_rrrrr^]]]]]]]]]]]]]]]]qqqqqqqqq?2?39/93+/93333999910!!!! !'m}}\R +h$\4j@Q    ! _Y I_Y_Y!!!p!`!P!@!0!0! !]]qqqqqqqq?+?+9/+_^]+993333910)! 4&#!!264)!26j? ywR}qRx_PW lgTR@2   _Y @ _Y0]?+3/_^]q?3/+933310% # !2.#" hSfT8?! aZ[tGj}q 4@ _Y_Y0 ]]q?+?+993310#!! 4&+32qdG t@J    _YI I_Y _Y@ 0  ]]]?+?+9/+_^]+_^]q+9_^]33103!!!!!TV H@* _Y @ 1H_Y0  ]]??+9/+_^]+93310!!!!/LTJ@)_Y _Y _Y 0 ]]?+?3/+9/+933310%2675!5!# ! .#"&s;fpt],C4s}^\sRkn= m@F  `Y M M: ` P @  p   0  ]]]]qqrrr?2?39/]]]+++99333310!!!!!!'f'\1f@EP@p`]]]]]qqqqqqqrrrrrrrr??93103!'6@   _Y _Yp0qq?2/+?+93310"&'%3265!5! '%bVX[?+mivn= 3@   0  ]]??93333310!!!! X'{X#@_YP]?+?993103!!'c!m@  '  (  kK;t[O4 g{oD+ kK;{[;/7tK$ k_@?O? ^]]]]]]]]]qqq_qqqqqqqrrrrrrrr^]]]]]]]]]qqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]qqqqq?22?399^]]399333310!467# !!7! G"k 0?V:jwKL;= P@/   `P@p0 ]]]]qqrrr?2?39999333310!!!&5!Qo=`|3T H@,  _Y _Yp`@0 ]]qqqqqq?+?+993310# ! 4#"32xOOyݿTS| H@) _Y_Yp`0qqqqq??+9/+9933310#!!!24)!26|y9zÈu7yTm"Y@6#$_Y _Y  _Y$p$`$@$0$$ $]]qqqqq?3/+3/+?+93310327#"&'$! 4#"32"{o;<~tAxOOy2cX }9S| ]@3    _Y_Yp0 ]]]q?2?+9/+9933339310!!!!2 4)!26Q}|˔"`p;*R@/ ",+ " _Y _Y 00@?3/]q+?3/+999333310! $'%3 54.'.54$! .# ,5G|dF'&~9p˯f6/pe!?!#+.5J25+/r܋TtD )@     ??9333310! ! ! ! A8996T1d#58@ 4 $      t D 4   l     p ` 0       p @       0   :     P       p ` O 0      p _ @ 0  ]]]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqqrrr_rrrrrr^]]]]]]]]]qqq??39/33/993393910!! !? 5RV5BB?T= n@F  _Y_Y          p ` P @ ]]]]]]]]]]]]q_q?+3?+393310)5!5!!R#3sW&@ YY?+?+9310!!!sWu&/?331033#) W7&@ YY?+?+93105!!5!W-%@?33/29993310 #!BT@ Y/r+33105!NNB?1@[/?_/]q+993310 5!+<N&3m@?$'',54(RYYi-  QY//OY$!5O5]q?22+3?+3_^]_]]9/+93333310"&546?54&#"%>32327#"&'#32>5JTNI )0 ((-je vYbR+G;Bm>7jgGRʺv[E he #H@   "# OY OYp#q??3+?3+?99333310!.5##"323'!4&#"326L [s-urqnozy('  %`_ d#P-No@C    RY!HRYQYo_O/]]]]]?2/]]+?+9/_^]++9333310"32!327"!.J Jul' sckn!  |#C@$  QY OY]q??3+3?+929333210!#5354632&#"3螞Oc))H;||q 9HUTNZO!+a@:" '-,%OY)OY QYVfv"2p-q?2]]]+?3+?3+?93333310"&'%326=7##"323467!4&#"326TcPul][  wnpwN!AJ9k  #xlާdP@/ PYp]qqqqqrr?+3?3?9933310>32!#"!!9wf}b|pR^kmhV@6 SYP @    `       ]]]]]qqqqqrr?+??9333105!!:W@  PYSYP@`PpP@8`??^]]]]]]qqqqqrrrrr^]]]]]]]]]]qqqqrrrrrrr?+?+?93332105!"'5265!dF3H5Z ?cvFu 7@   / ]?2??9993329933210!!!! By.TjZlF@-P@`]]]]]qqqqqrr??93103!4O&@^&('"PY (((T(;((((T(;(/((((((((`(/(]]]]]]]qq_qqqqqqrrrrr?22??3+39933393310!#"!4&'!3>323>32!#" Uk  4l57wRi_HWo,|p~nQ_dOO@/PY p]qqqqqrr?2??+39933310!#"!4&'!3>32Lf}  9w_HWo,|pQPN 0@  OY OYp`qq?+?+993310!"! 4&# 3   ~x}v,+WQ!<@  #"OY  OYp#q?3+???3+99333310#"&'#!4'!3632#"32r-_pwwn"c]a`j4lİTWZO<@   OY  OYp q?3+???3+9933331032467!!7#!"4&#"326T[ ]tqny '.ql›'O>@% PY _/]]]]qq???3+99331034&'!3>32&#"  )@XB6!D4iu!})8 >&:2)`=:@   yk]O;- k]K=+ h{mK[=+ m}[I+;kO_4 8dK?@?{o+Kp@ H  ?223?333^]+]]]_]]qqqqqqqqrrrrrrrrrr^]]]]]]q_qqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqq3333933333310)&'!!?!7!!׬ #4--n:Ju|4d: @@$       O ]]]q??9333333310! ! !! 3/1x/ bWh:@     PYscPB2$t`RB4&gvfTD2"vf@2"`TD0 7t@;t;$pP0^]]]]]]]]]_qqqqqqqqqqrrrrr^]]]]]]]]]]_]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqq_qqqq?+/33?39333310"'532>7!?!eL5,546;#";-nwyl:[Qs\_pQ[:WHrqqqHhi_]jg95@!P@0 P@]]]]]qqqq/?910!9m+W#C@# #$%Y#Y#Y?+?+9/+993331032654675.54&+532++9]Oq^[tO]9Ŋnyyngj-\`-ihprtoQ_H&@ Y [Y/2+++39910"&'&#"5632327TKKVGwAqid-r@u*/+-T/.\,$:I@  @[{ k ;      d K ; +  i       t ;      { k [ 4 $      0 $   8     { d T       P @ ?        p P @  ^]]]]]]]]qqqqqqqqqq_qrrrrrrrrr^]]]]]]]]]qqqqqqqqrrrrrrrrrrr^]]]]]]]]]qqqq?+?9/933310!3 ,+3Da@6    !vYP  vY   ??99//+3/_^]q3/]+933333310267#5&54753.#"LXwಢܢpX|Tmd [c^&q@2"  &'( uY uY""tY@&&H&&?3/+]+3?3/+9/3+399399333393310#!5>=#5354632.#"!!!267^җJfKԩ,RB[PRd|hkk:i\ϊ/MFs}Zg8c^99'R@*" () Y  %Y/]+23/_^]+_^]2993333331047'76327'#"''7&732654&#"@&=99+ $.71441+?@7.=.!@Y   @ Yp?2/]+/_^]3/^]+993393993323993102.#"#"&'732654.'.5467.5464&'6? rZpi6cUnW'{{z~0gΫngZbw6d>C;A)9+&RzW]O%PKAP0<-,1p]#&TGL!)7* |@U [o/?_ @+3237#"&'#'26=ashf ~!1A6GQHO=W\X>ia*w^ bizq01mI=`A02U\S@*     [ [?33+3+333393333333310%53!53'GiGo%#iGo%#TWH@1/?O_o Y?+_^]qr99310%!5!wtPX -6@K!,,)3##$ --.))$78 $,3"3"Y%2Y$$%%%@H$3%%3$ Y Y?+?+9///+_^]]++93933333393310#"$54$324$#"32$##!24&+326PQp䣝諣EuJ`NKEBCMP£婣䤤9/q^v;9324&#"326ۻUX]FG_bDC`VVSF`aEEcb14 B@#     Y Y _@/]]3+3/+9333333310#!5!3!5!oUT=3I@(    /   YY?+?+3/_^]9933310'>7>54#"'>32!5j[W@QU |gMjy=i;8I'[bcyoc}bB>!,~%{@L "&'"Y//  @HY YP`p?3/]q+?+3/+9/_^]q+99333310#"&'73254+532654&#"'>32~ hf83?@.+X }IOSXcphh ]`]~/+',Y ^ngU@[ \WU'@[/?_/]q+9105!W +V!:7@ PY ??33+??399333310!&5##"&'#!!3265! !ZO4QUZYYd,VN0*+HBpG/A@    Y /3?+39/_^]933310###"&5463!ÛŮuD@ Y/]+9310! 1`W@ YtTD`P `08p/^]]]]]qqqqqqqrrrrrrr^]]]]]]]]]qqqqqqqqqqqqr_rrrrrrrrr?+?9/399933310#"'53254&#"73-8#18B&>!^[^`vE#"RRRj I@   @@ HY?+3?3+_^]2933333310535733Rylzuy- *@  Y Y?+?+993310#"&546324&#"326ɳ;IIA@CK@1jachjfe]Q@)     [[?33+3+3333933333331075533553]#in%G#in%G^K&{ 'K@   @ p ]5?55^L&{ 'tI?5gK''Ku;@ @p]5?55r:Q@! [Y?+3/?+9/99939333310746?>7!3267#"$!rWwMCC hckXsje 8aU71dC=1\ho TW&&z ! %+5&(5 & ô  %+5+5&(@  & <  %+5+5+&(s@  & %+5+5&( s@ & %+55+55&,&%+5+5hf&,@ &J%+5+5+&,& %+5+5b&, @&%+55+55q `@5 _Y<  _Y _Yq?+?+9/_^]_]]3+39933339210#!#53! 4&+!!32qƁddRT=&1 @ &$ %+5+5T&2@ &%+5+5T&2@ &T%+5+5T+&2&%+5+5T&2 &""/%+5+5T&2 @ &%+55+55VV G@(    @`p  H?+]q3933310 7   Vd```Ff``bT%]@4!   &' !#_Y #_Y ?3/+?3/9+999393229107&!273#"'4'32%&#"xOƜRprԔ[aV[zT\uIqS|Ju^M|73{J&8I&%+5+5{J&8@ &l%+5+5{J+&8&%+5+5{J&8 @&%+55+55#5&<@  & _ %+5+5 B@& _Y _Y_o_ o   ??99//]]++99333310#!!!!24&#!!26y'R׃9yrn|%1K@* &-&32 -##PY# OY3P3]]?+?+99333310#"'532654&'&5467>54&#"!4$32ɺt2/QJL]79=2]Xgl!2;2!)8+$E94Y=m6^26Q-AN 6UD6-)-^}4x&DC44&558%+5+54x&Dv @ 4&4 47%+5+54x&D55&::4%+5+54x&D44&=Ҵ=J%+5+54x&Dj@ 44&8״86%+55+554x&D )@ 77&:ٴ:4%+55+55BN&3:@^$%%8,7 ,1,<; -RY7RY7!H77 7 4QYo "''OY$$$$_< <]]?33/]]+3?3/_^]3+399//_^]+++93333339933310 '!"&546?54&#"%>32632!327%2>="!.|衳PXUL tJvk' sEtAhV-K3ckn嬚7leJOkkNH-#HfY|ג+SrΎ\GE^D4H\&XC& %+5+5\&Xvx@ &` %+5+5\&X& %+5+5\&Xj@& %+55+55Wh&\vF@ &` %+5+5W@@"  ! OY OY@5;H??+3+?3+?99333310!3632#"&'#!4&#"32_r-opqvwn2c]aWh&\j@&  %+55+553&$N@ &%+5+5<[&D66&445%+5+53&$ @ &%+5+5<&D44&77?%+5+53b&$ %+532!#"!#535!!!9wf}煅2:|pz6mh&, @ &  %+5+5&@ &  %+5+5P&,N@ &%+5+5P[&@ &%+5+5&, @ &%+5+5&@ &%+5+5XW&,  ߴ %+5EW&LԴ%+5&,@ &%+5+5:>@'`]]]]]qqqqq??93103!:&,-@o0]]5W&LM9@0@]]55]"+&-\@ &%+5+5W @   PY [/?_ P@`PpP@8`??^]]]]]]qqqqqrrrrr^]]]]]]]]]]qqqqrrrrrrr/^]q3+3?+?9333933310#'##53"'5265!ӠdF3H5>^ ?cvF9&.Ҵ  %+59u&Nyٴ  %+5u: 8@    ?2?3993339333310!!!! By.Tj:@Zl&/&m %+5+5jhf&OO@ &M%+5+59&/ %+59&O:  %+5&/r@  %+5?5&OK@   y %+5?5&/ %+5q&Op ] K@$        _Y?+?99//339999993333910357!%!'3ABѓߓt) e@> :  5      `       ]]]]]qqqqq??99//92]3]3333910!57!7}}31EEJ=&1@ &Z %+5+5d&Qv@ &d %+5+59=&1 %+59dO&Q    %+5=+&1 & %+5+5d&Q&! %+5+5,'Q_2@" %?o p]q]q5+5K$C@% ""&%_Y_Y?2/]+???+3933310"&'732>54&#"!!36$32J4R/?J ac BOcD1A'b_D=yWdO!Y@6#" PYPY######p##]qqqqqrr?+???+3933310"'5265#"!4&'!3>32EdF3J4f}  9wW AaHWo,|pяT&2N@ &%+5+5P[&R @ &%+5+5T&2 &$%+5+5P&RP@ &!%+5+5T&2 1@&o#%+55+55P&R@&d %+55+55T @V  !" _Y_YI I _Y"o"_"O"?"]]]]_q?2+3?39/+_^]+_^]q++399933210!# !2!!!!!&#"327&k6wPGe^Gat6RRs PKN$+s@?  (),-(RY(!H(( % OY ##OY-]?33/]]+3?3+39/++9933393399310"'#"! 632!3274&# 3 "!.h Jvk' s~x}vckn,+2|&5@ & %+5+5 &Uv@ &I%+5+59&5Դ %+59O&U9X%+5+&5 f& %+5+58&U8&%+5+5;&6@ +&++.%+5+5H&Vv9@ )&)[),%+5+5;+&6q@ ,,&1&1+%+5+5H&V@ **&//)%+5+5;W&6z 0/0+%+5HWO&Vz ..)%+5;+&6 Z@ ++&--3%+5+5H&V@ ))&+ +1%+5+5W&7z^ M%+5W8&Wz H%+5+&7 !@ &  %+5+5&WoK@  [ %+]5^@   _Y _Y  P@4$pdT;$hTD4t[;$ D 7{oK;+[K p0 ^]]]]]]]_]qqqqqqrrrrrrrrrrr^]]]]]]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]qqqqq??9/3+3+39333103#!#53!5!9rm8h@8   OY OYoOOY?+/_^]q3+3?3/3+39333333333310"&=#535#53733#3#327|X͹@  _Y _Y ?+?+9/9/99333310 %6$3 !"$'%32654hSATs?!aGj}TE%Z@.% %%'& _Y!aY_Y _Y?+?+++9/9/9/9933333310.#"3267# !254632&#"y!:QfTӒKM:;5j}~aZ[tI< EHP0#Q@)#  ##%$ PYOYOY?+?++9/9/9/9933310.#"3267#"32>32&#" `XPl ІuaKM:;5Sced o_% +& EHq^=@  _Y_Y_Y?+?++9/99333310#!#"&5463! 4&+32^&dn3Si`GX= =@   _Y _Y _Y ?+?+9/+933310463!!5!!"$%)!"X%$+UiT\"R@*  $#  !OY  PY OY?+?+?9/+9/39/9333310323'5!5!!.5##"32654&#"TѼ_3 .s%pwyp а+]z$_cPXNB@"  OYQYPY?+?+?+9933339910!5!.54>3 # 3 [ea`pt(#+E쩧eP :@   _Y _Y _Y?+?+9/+9331035!!5!!5!PVTsbT{K@%   _Y _Y _Y?+?+9/+9/993333310%267!! #"$547!.#"塶 : W6^ٝ z,`hKL=fj^%Y@,#"##'& "" _Y _Y  _Y?+?+9/+9/9/99333339910"$5467$54$32&#";#"327{ᨔDIl{;;\D„G=`[d`Yeak]ſW=@"  _Y_Y `Y_Y?+9/+++933310!!!"'53265!/J[DA5Lw MOW W@/     uY0@P  uY ??+9/_^]3+399933339310.#"3#!#737>32@A9 $%*j" B=k񾇓 Td)e@5 '+*!! _YaY_Y $_Y _Y ?+?+9/+++9/9/93333310%2675!5!# !254632&#".#"&s;fpt]ٔKM:;5,C4s}^\sH; EHRknW >@!  aY ?299//+93393310! !#"&54674&'3264NK1fA;h1- +"",b:?y%YZR910-,!G@%   #"   PYPY?+?+???9/39333310"&=#"!!3>3232!"f}9w__kmh|p}z$,9 2@   _Y  ??9/3+3933333103!3#!#'ى;FWM@(  `Y _Y?++?3?9/9/9933333910!!!2&#"! XLGZD34{X  4HuN@ PY@ Y?3?9/++9933333910!!4632.#"! By篚aUK=7.TjFGZl% 2@   QY  ??9/3+3933333103!3#!#{}}{:nhe@5     RY RY?+??39/+9/9/9/9933339310%'!7! !'6R*%Jy`NPC/#xf$F@##  # &%  $   aY?3+3??339/33933333103265!!'##"&'##"&5!3265ben' 9p)G'ddj[eXbgn[[W=H@$ `Y`Y??3++9/9/993333310 &5!!#"'53265oJ[DA5|3=`Ǯ MOXdO5@  PY?+???9/39933310#"!4'!3>32Lf}  9wXHh|pTT!R@  #"@Y _Y _Y?+?+?9/+9/99333333310# ! 65#!4#"32xOh7{}ݿYPTS|?FPNE@"  !  OY OY?+?+?9/9/9933333310#"! 65#!4&# 326  }~x}vh&,+8TWS@,   `Y _Y `Y_Y?++?+3+39/9333310## !2%327&#"hFpfTǦI>5<>WF,;[[tSNxPWcNI@&    PY  OY OY?+?+?+?9/9333310%#"!2%3##27&#"@eeM/*"*wwC*-) (XX ?  H@#  _Y  _Y ?+3?9/+9/993333310"&5463!2#!!4)!26Z}^9zn3Si`Չt7yW(U@-$  *)PYPY !OY'OY?+?+?++9/39/9333310#"&'#!4632.#"3632#"32t)篜1zK_pwvo"fZa\ lİ;R@(   _Y_Y??9/+9/+993333339910 !!!!2 4)!26'7} |˔"k`pP+F@"!&'' -,&&) aY)#_Y)?+?+9/9/99333333104>7>54!"%6$! !267! $P+KfvBq9~&  (Hezv5VRxW<*$1G7\['NsU=.#!^Hdq/}T+O'@@!!"" )( !%%QY% QY?+?+999333333104>%>54&#"'>323267#"$TY[Lddf^ ZiWmuh&5#!'1'ks} qPkҼ:"[@  !!$# "" @Y "PY?+??339/+9/39/993333333103265!>5#!!.'##"&5f}n}k:㯉D nWo,.i%G@$  " ""'& _Y _Y?+?3+3993333993310"$547#!5!32654&'!!"'5Ǩ݀<Ҹӡ:Ѩ(g PȞP5 g˷{D6@ `Y_Y _Y?+?++?9933310! !3264&#"5632D'LW\+DZ  q< #2@ ??39/9/9/93310>32&#"!!8}UmF:%3 5-d[>(,B?W 8@"! PY PY ?+?+9/993299102&#"#"'5326?!7>~x_86,3eMeL5,Xb%T) N Q,J$;/Fͣ Sd0/")%%}4E@$    aY_Y _Y?+?+9/3+39333310!!5!!!!!5!4R'>#QCWi@:I@&    RYPY PY?+?+9/3+39333310!7!5!3!!!5#@\ )J}yND@$ _YaY_Y?+99//++933333310"$'%32654&+5!5!QK6gȀN&Neq·- HNC@$  _YaY _Y ?+99//++93333310 4>75!!#"3267Ȁ&Nʟg5KNDY糪re(N":K@&   PYOY?+?+39/39/93333310267#"54675!!#"9Ws Pf_j v7N:*O@($*,+ "*"PY'OY?+?+9/39939333333310#".54>7>54.+5!5!3267"ـs`ng2jf/еYvendbz cLdWP*=,-/ˣQwT2=)8B\XG!S@* !  aY _Y _Y?+?+9/3+39/933333310!654#"%>323!!!5>7!VZ_fnh.&*vuaaмUm\k=5O@( _Y _Y _Y ?+?+39/+9/93333310!!3 !"$'%32654&#!#F$(xjxʶ }y:S@*   QY PY OY ?+?+39/+9/93333310!!3 #"&'%32654&#!#TA2ݺ&fXYZky:˸SMNU^QqU8&R@(('     OYQY?+?3+39/9333333339910#53733##"&'732654&'.5X'QP'gumWhY|M'2# (R~_%M@;A4=.WkWQ7@  OY ?+???9/399333310!!3>32#"6z 3q_p|a5o[`nǝx9?9310334M@  ?22993310333344R[O@(    aY aY ?99//3+33+39333333310!3!!!!#!5!!Rvvvv;oq  o+&''=  }&'']T&G']&/-W&/MW&OM9 &1-Wp&1MW&QM3+&$ @ &%+5+5<&D55&7ܴ7=%+5+5+&, & %+5+5&@ & %+5+5T+&2 @ &"%+5+5P&R@ &%+5+5{J+&8 &%+5+5\&X&  %+5+5{J+&8 3!@ &%+555+555\&X'j4@%&+55+55{J+&8 4@&%+555+555\&X'jm@%&+55+55{J+&8 5@& %+555+555\&X'j  @%&+55+55{J+&8 6!@ &%+555+555\&X'j@%&+55+55P-NS@*   RY  QYRY?+?+9/_^]+9/9933310332#"5!4&#"%267!3ul's`ck\nN5*&O|3+&$ 3!@ &%+555+555<&D'j4&@?!?>%8!87%44&+55+55+53+&$ 7@&%+55+55<&D'4 @;!;:% 47%44&+5+5+5&C&<%+5+5B[&8@ >&> >=%+5+5T.#r@&"# #% _Y  ##@Y _Y _Y ?+?+9/3+39/_^]+9/9933333310!5!5!3## ! .#"3267!XTfttpt],<߀js}^\sRknA7%NO'1x@9&(("!!-  32"$QY/OY+OY''Y?2+3?+9/_^]99+??+9993333333333103!757##"5323467!3##"&'%327!4&#"326%>m[  co"Ѵ*0*wnox%9kQD#xl]y%dT+&* @ & $ &%+5+5TNZ&J@ --&/ /5%+5+5+&. | & %+5+5uU&N * &ش %+5+5TW&2PWN&RTW&2'v.@ .-%--&+5+5PW[&R'+@ +*%**&+5+5N+&y @ &%%+5+5W&T@ & $%+5+5W&@ &S %+5+5 o&'= }&']T&G]T&*@ ""&M!%+5+5TNZ&Jv@@ 11&-?-0%+5+5I@%  `Y aY ?+??39/+9/9333331032!!"&=!!!!!=__)'f'}z$1X1@@ _Y ?+?99333310!!>324&#"$tUK~tp)fU=&1<& %+5+5d&QC& %+5+53D&$'-0@ - -0-@-P-%(g(+%%+55+5?55]5<&D'vc6@Q Q0Q@QPQ77&L[LO%:۴:4%+55+5+55]5&&`%+5+5B&v@ ;&;;>%+5+5T&@ &&&T&)%+5+5&vz@ "&"b"%%+5+53%&$lY@ &g%+55+55 &D@ ??&;_;8%+55+553)&$V&%+5+5<&D8??&8ڴ8>%+5+5&&(vZ@ & %+55+55 -&H@ %%&!! %+55+55)&(V& %+5+5P-&H;%%&$ %+5+5B&&,Z@ & u %+55+55L&@ & ~ %+55+55t)&, V@ &%+5+5r&@ &%+5+5T'&2[@ $$& ~ %+55+55H&R@ !!&%+55+55T)&2V$$&#%+5+5P&Ru@ !!& %+5+5'&5X[@ !!&" %+55+55 &U|@ ""&%+55+55)&5V!!&  %+5+5k&U""&!%+5+5{J'&8[@ &%+55+55L\&X @ ""& %+55+55{J)&8V@ &%+5+5\&Xl""&! %+5+5;&&6 3+34%+5H&O&Vt 1"12%+59&7%+5&8&W @%+5U>+D@!) &-,""_Y"?+9///993333933105>54&'56$>54&#"'6$32>9gO!BչHs|c7QGA4_paS8:dqVG{%)jW8eXpWhyg}dSLCQN(G@" " *) ""  QY ?+?9/9/9/993333393104&#"'>3256$654&'5>jbStAB3 7waKpW䐗MFQTW"-9}@B # 4). ;:1  1!&OY1PY1+OY7OY?+?+?+?+?9/39/9/9/9/9233333310%632#"&''67&=##"323'!4&#"3264&#"326Tsϫfap,[s-urqnozK>;w${I?KoQ@L@J+'  %`_W393,3G9a%0]@/ ""+&21%%  (aY .aY?+?9/+9/3339/99339339910"326544! $54675.54634!"326DSPqsSU쉆⊁xrG||GK]mgX´OÈ$fWro{srT%/Q@)   (#.#10 +OY &OY?+99//+3399339339910 $54675.5%32654&'7% 4&#"׋sy*jD2}tpw2Dj*xt ʍ/q8dIqqHf7q/uwvv=8@    _Y _Y ?+?+993333310%2'654#!5!5!o*R琄j~!S3n3D:6@   PYPY?+?+99333331035!5!! '654#D )N#[j~!S3n3&$&%+5+5<&D77&5ߴ57%+5+5W&(zPW-N&HzJT+&2 3 .@&$$#%+555+]]5]]55P&R'j"4=!@"! %%oO&+55]]]]5+55+5T+&2 8%&%%1%+55+55P&R'v4:@#,%0@+0H0@H0@HP00@ H0&+5+]+++5+5T&2@ &%+5+5P&R&%+5+5T+&2 7 @&  %+55+55P&R'"4#@%%&+5+5+5#5&<UC & %+5+5Wh[&\@ & %+5+5WO@' !   PY OY ?+?+?9/9/9/333933310632#"&''67&54&#"326sϫfap1|K>;w${I?KQ@LGJG393,3G9WO)4j@7*/#) )%65 ##-$$- PY-PY-2OY?+?+?+??9/39/9/9/9333332310#"!4'!3>32>32#".''67&54&#"326Lf}  9w:pEϫFqbRp1|K>tNkD?K_Hh|p*#0@GG39_7C9 8(k@6# *)  !PY OY &OY ?+?3+39/+9/9/9/93333233310>32#".''67&5#53733#4&#"326=xSƛP}gPp1|XhF2NnP5F,%2>GE`m39_7C;W: @  PY?+?39310"'5265!dF3H5W ?cvF]D"-8j@84# ). :9  1&&OY 7++OY?3+3?3+3??9/339/39/93333310#"&'#!5##"323'!36324&#"326%4&#"32Dv*+s-_urqnozlqrwur!g[^f'  %`_bòTW<Q",6f@6( -2#87  %00OY +4 4OY ?3+3?3+3??9/39/39/93333310327!>32#"&'#!47#!"#"324&#"326Tz+-t)]pwvo(tqny 'g\`gfZa_<'lİv3 x@:     _Y_YY?+?+?9/3+39/9/9/9339333310!!#7!!3 3/3#m}ߣ\Gwk+ RǗ5hb6<FRCE$\̘T&X@2  "('!$$_Y @_Y ?+?9+9933333310%267#"'#7&5!273&'&#":QἋ5\fT{9]=4#SdHZ~a:\a8[t-ccGJ3,6 WO%U@0 "'&!$ $OY  OY?+?9+99933333310"'#&323&'3267&#"Rs]֣ODãޚ$.EPl "!J4 +9a#$$ed o_6kL   =@   aY _Y?+?9/3+393333103#53!!!!'n)WN@'       _Y ?3+33?9/9/9339933210!#!5!7337#92288VVfdAKK䃃OWO8J@(."'":91+PY1''QY'%QY?+??+9?+9933333310?32654&'.54632.#"#"'3267#".'&'&O7jumWhY ^fddMZX 8?Y:MW@R~|OdFU;A4=-Q`BA3<076TbAJ=>wheDW:H@&PYPYPY PY?++?+3?+39933331035!5!327#"./&#D )B~PLq9(:W@=f[M?ow\fidU +K_N4D@"    _Y  _Y ?+?9/+9/9/9333102654&#"%6$3 !N}!:(AqЈ9"mzG/ +N/@  OY?+?9/933310!>54&#"%>32{FTBU -youcSj'o@; $ $ )($aY$$*#_Y_Y?+?+9/_^]_]3339/+993333333399103! )#%4&#!!!! 4&#!!26?BRzvR}qyxDechln!_PWO@'   aY_Y?+?39/33+339933333333103!!!3#! 5#26=!q'm'ssqǛn˄ 0r|HNo@: _Y  _Y `Y?3+3?3+39/3+39333333910!#7#!733#!!!!!#55b//O.c4nn__;bQi WO"&*@+ %  #',+  !#Y!%@Y''RY& )) OY  RY  !@ Y PYQY?++?+?+??+9/9/3+3++9/9/99333339933910"'#&323!327"37&&'7JrWգ SGģ<1I' 9cky%BALA  -#| Q6P6iW@,    aY _Y_Y?+?+9/3+39/933333310"&'%326=#53!5!3# '%bVX[?+mivn,W#O@(   PY SYPY?+?+?9/3+393333333310"'5265#53!3#5!dF3H5zzzzW ?cXTWR'W@- % )(  `Y `Y "_Y_Y?+?+?++9/9/993333310327#"&=#"$5!273267.#"~5=D&s!ТzMۤ@ym<=W OM ƁaFUcNG3/+.+TW(N +V@- '!-,$OY)OY PY PY?++?+?+?9/39/9933333310467!327#"&=##"324&#"326?  5=D&s![s-urqnoz xiOM '  %`_O@'   _Y  _Y ?+?39/3+39933333339910!!!#53!2 4)!26Qf}(|˔"`pOX@- PY PY PY ?++??9/3+39/39933333391034'!3>32&#"3#!#t  )@XB6!D4cst8hr]-mVM@(      aY  ??39/33+339/93339103#!#53'!!7!7!wxU5PQ5uBˍWh:Y@/ PY PY PY?++?39/33+339/993393103##"'5326?#53!!!#lMeL5,Xb%xy)fC`&[ ͣ Sd0400N3N&3}@&'$,54!  !%$$!'@ Y''!/OY!@ Y! QY?+?+?+9/+9/39/_^]9/9933333331023267#"&54&#"5>32367>54&#"杰JTNI %)0 ((-je vYbR+G;Bm>N7jgGRʺ[E he#H@  OYOY?+?+9/9/99333310".'%32#"%>32!р lPX` _o devkcS7N%p@9" '&  "RY""OY$?3?+9/+9/9/_^]39/99333333910'67&532.#"632#"'4#"32:J< `X׾/TlzA>YSv +ScFsk=cv_TW>'V@-#  )(   OY %OYPYPY?++?+?+?9/39/993333310"&=##"323'!3274&#"326~[s-/:purqnozW'  %`_}  ̯TH!,U@,""( .-PYPY%OY *OY ?+?+?++9/39/993333310%!.5##"323'54632.#"4&#"326T [s-#Qurqnozd~'  %`_r }F#NS@+     RY!HRYQY?+?+9/++9/993333310"&'%3265!532"!.)9 'luJ ]nj*5}P-NS@*   RY  QYRY?+?+9/_^]+9/9933333102#"5!4&#"%267!3ul's`ck\nN5*&O|PJN %c@4## $'&OY#$$!RYQY?+?+9///9329+993333333310273267#"&'#"5%&#"%2307?*C&E|s%"'s`PN&M:8k{5*eځ&OWAEN'S@,$%  %)(RY$  RY !QY?+?+9/99+99333310"&54675.54632.#"3"3267 voz߲bNHNYPHl)laDLC32)kIPYNHOa綴}{,JZO@TLGM3273267#"&')kIPYNHOa綅-m*C&E|f :,JZO@TLGM32&#"m%.#01"-&2dT)YPVG}SIG+^}GVPY)TJ20)#]LP[!)032!#"!4632.#"9wf}簜#Qb|pR^ }ImhWd*X@/"(,+**"PY%PYPY PY PY ?++?+?++9/3993339910>32#"&'5325#"!4632.#"9w0t:/f}簜#Qb|p  } }Imh# D@"     PY   SY ?+??9/3+393333333103!3#!#5!y{{yyX96l9: &@  PY PY ?++?93310!327#"&5l6>#[<:?= D: 9@   PY PY ?+3?+393333310#5!#3!53JjfZ@   Y Y ??9/+9/+9/9/93333333103#467!>53*be'"_i-7zG?,9vM@&  RY  RY ??9/3+39/+39933333310#!#"&546;!3!5#"3wxuwp``pr̤PTW &@  PYPY?++?93310"&5!327ҥ/:pW}  VZ@-   PY QY ?+?+??9/9/99333333393103!!#"&'%32654&+5!ש6Mvhn<\:&J@%%%  (' & ""PY?3+3??339/399333933103265!!.5##"'##"&5!3267Vj 4l57wRi:㮊DWo,|p~n㟌QW: J@$   "!   PY?3+3??339/3399333933103265!!#"'##"&5!3265Vj2r57wVj:㮊Dssl~n㪁QWO/[@0//$(10 +PY $PY &PY ?++?3+3?3?9/399333993310!#"!4'!3>323>32#"&'5325#" Uk  4l53y0t:/Uk_Hh|p{q  }WdO!E@$!!!#" PY PYPY?++?+??9/3993333104'!3>32!#"#"&'5325  9wf}0t:/Hh|pQ_o  }WNO!E@$!#" PYPYPY?++?+??9/399333310#"!4'!3>32327#"&5Lf}  9w/:p5_Hh|p}  ^: 4@   ?3?39/9/99333310)#!&53^"  hf:RPN X@0OY,<  OY OY?+?+9/_^]_]+_^]99333310!"! %"!2!  " },+`PNNp@= ! , OY PY PYOY?+?+?+?+9/_^]_]39/9/99393310%#"!25!!!!!!! 3 w uCk7}v 5I,+C/oQqN#H@# ""%$ OYOY?3+3?+9/39/99339310"326=!324&% # '#!"5a^aVa^UGGΰLԾVPWL@'   ! OY OY?3+3?3+3??9333333310&%!4&'>%x""~~W*%~kǮ   :1@  PY PY ?++??9/3933310!.5##"'53265 )@XB6!C5iu:Yw.r]-1@  PY PY ?++??9/3933310!.5##"'53265 )@XB6!C5iu2Yw.r]-Wx:C@$  PYPY PY PY ?++?++?9/39333310327#"&5##"'53265/:p53vb6!C5iu:r}  .fWO3@ PY PY ?++??9/39333104'!3>32&#"  )@XB6!D4iuWhr]-DWOE@%!  PY PY PYPY?++?++?9/393339104'!3>32&#"327#"&5  )@XB6!D4iu/:p5+!&22 ! 43.)PY.&$$QY $QYp+?3/]]]+?3/_^]+9?+99333392231032654&'.54632.#"#"'327#"&5?gumWhY ^fddMZXa/:WO3M@;A4=-Q`BA3<076Tb.t} [W1@  PY PY PYPY?++/++933310"&'532654632&#"{+\7HB=YB*MGBWPufȵXkǶW Q@, "!PY PY OY PYPY?++?3+3/++9333333310734632&#"3##"&'5326=# ӼYB*MGB+\7HB=ӾȵXk,ǶPuWM2@  PY PY PYPY?++?++933310"&54&#"56323270CFH*CS7/C7AWkX!WH&W)^@1$   +*'@''PYPY'PY'!OY?+?+/++9/9/9933339104632&#"'#"&546323267.#"YB*MGB|1pbdμsL>H|$w;?JWȵXkIxQGM?Q58F4-29K>@   OY OY ?/9/3+3+93333331023##5#534&#"56|X7654+53232654.546;aB.8.$4&Bb\s#*#xy#)#r]o/Mg~Emk͐4\RT=/j]/`gtB@sib.YnJN/@  PYPY?+?+?933102#"&5!324&#"5>^cDEN%~Ndžq j: -@    PY?+?39333310!!&'!P׽8 >:]2)=:6@    ??3333933333310!7!!!/!)4)Ӧ$:lD;Ju|Hh7@   PYPY ?39/++9933993102&#"!&'!>]eL5,Xb%ת N BM Sd0")^sͣy:*@ ??39/99339310!! !Z)  &]T~HDW:=@"   PY PY PYPY?++?+?+9332210327#"&=!5!5!!ǁ/:WOz )JZ} M\D5R: [@0    "!OYPY  PY?3+3?+9/+93339391067!5!5!3>32#!4#"326-R ){|17P1V93;`M\{VuHNM+W:L@&   PY OY?+?+39/9/9933933102654&+5!5!#"$'%kfS w艝[ʳ [nW1:)x@$%  +* '%@Y%%'PY' PY'#OY?+?+?+39/+9/9/9/933333910&'#".546324&+5!5!%327&#"m%ĊjǿpS881oRMQDc/9tQ[[ijFJ8BT7B!4@  PYPY  ??99//++99333310!324&#"%6$32.@ OYOY?+?+9/9/9933331032.#"3267#"T `XqqowPl І'Sc/ed o_%T&28@o?]]]]5:"Q@,  $#"RY RYRY?+?+9/_^]+93333910!2#!32>54.+32654&+ZbSkoծwXM+*H^ug_}:_zd60/58GIFBR7N#0@! %$RY QY?+?+9933910"3"32654&' #"&5467&546HN^w\YPyy|C=!!++ 5OY .PY:OY$QY?+?+?+?+??9/39/9/9/933333333310!.5##"323'!!#"&'%32654&+5!4&#"326L [s-ש8*pMv_urqnoz~'  %`_n:L?\}d#T5 '25>@F6!5'44(. %;! @?33PY8% +OY 0OY' %;4PY?+333?+?+99??9/3+393333333331067!.5##"323'!!!>32#!4&#"326 4#"326- [s-'{|17urqnozJP1V93;`M~'  %`_n\{VuTHNM+8 2`@3-+$ +//+43.OY +$2SY QY?+?+9?3+39333333339910!632.#")"&5#53732654&'.547#3Tk ^fddJ]a3R|XoSWhW/,^ +ScLyK:#Wt3_@4 3!!&$""- 54*/QY* $%$OY3%"PYPY?+?+?39?3+3?+93333333103>32#"&'5325#"!#!#5354632&#" 9w0t:/f}螞Oc))H;:|p  }||q 9HU*I@( $**$,+'QY' )QY???+9?+9333333103!32654&'.54632.#"! '`WhY ^fddMZX[33~s  tDZm qo qs tDZm vo q1, 7^ [$xP/`r7^ 1 P/L@%       PY PY?+?39/+9/39933333310#!#!#!#!jrjr 4 "WDEC@$   PY PYPY?+?++??9/3933310%#"&54#"56323265!!47/48f{df}oeEԺ㯉Bmh"WE%O@,$ $'&% PY PYPY!PY!PY!?++?+?++?9/39333210%#"&54#"56323265!327#"&=048f{df}CQlcoeEӺ㯉BϿ+,x,?@! * (?3?3229/399333910>32#4#"#4632&#"'uQw{FTyiX&(XMWO}_hP`m Y3Y=;1@   '")?33?3?933331053"'52653|J*#2#cmQ/C%dm6."2@  '* +?33??9/3993310#.'##"'53265%K@%(*GP-ylE xvvV;@  '+ )?33?33?9/39933310327#"&=##"'53265W&"Ske!PE'/#GPXsbL xuw3 A@      ' *?3?39/3993333393103#!33254+tJR2kUuhji9M@       ' ' *?333?3?31033339333333#.5#37373wu ʿysq s/gn@37@   ')?22?39/10333399337"'52673?3F2B>D"s)6m8~ Ba{piݐtm} D? @   /9/93331054673348>E?yMNH? @   /9/933310#>5#48>EyMNH? @  /9/933310##.=E>84HMN{w @    /9933102654#52#51fi|{j-$Ovh]^gw @  /993310"&5463"3j{}hf15wg^^gvO$-95@   *?9///32993333103254&#"'>32)2IK5K ~s eTI=.r95@   *?9///32993333105.54632.#"3270r~ K5KI2)r.>HTe gV}YV}Y!.~&@/329333310%# #!~B@.~&@/329333310%!3 3yED@ 8@"   [/?_/]q3+33993310#'##53Ӡ> 8@"  [/?_/]q2+33993310#53373˟= e/9310#3eg$[5@%Yo/?_@$'H@H/++]q+9910!!$d[~,@ /9933105!~&~,@ /993310%5!& W/9310#3Wg"a/39910!!"dAl@ /993310%5!Zl&li@ /9933105!l&:"@ /99//993310#!3`v`6`v:,,:/9910#`v`:,c @     /99331072654#52#51fi|{j-$Ovh]^gc @   /993310%"&5463"3j{}hf15cg^^gvO$-  @  /33933310%!53533y|x|  @  /23933310##5#5!x|ym| &@   /3323933310##5#53533x|yy|xhh|xx/2991075! @d  [Y/?_ ?o @PpP8@p0`^]r^]qr^]r/^]q++33310"&'332673' hGGiMYWO/93105!'p#l '@  Y [Y/+++993310#"&546324&#"326#kkiiI63JJ35Jniiii3JH58HJLW#@  Y?+?993310"&546733279o~WG?B1-6:?Wl\K%*s5*3!@[  Y [Y  +;[{ $44Ddt $DTt @ 6@H P0`A_^]qr+]qr/^]q2+++33310".#"#>3232673,YTK)+1\L-ZTI(-q&/&.MqqC&/&1J 8@"  [/?_/]q2+3923310#53#532X" +" +hf9&@  /329/393310%3267#"&/+7?*C&E|z K7M:8ba#3 0@    /3299//339333107'77'iiiklmF@      ',?3?39/399333333910#"&5467334'326F*umjz&>ɱ<::s$fqre(quGNFmt?N)1#*??9310311)4@! +*( +?33?339333310#"&'732654&'.54632.#"βHVTE=Eu= @DDD3E*nk9q|bj6-,+%+ 8\Dmzkc0-$+ :[1v9z@ /3/99310!#!5!z!z"@ //9/3993310!#!5!3z1ЫQz"@ //9/3993310!#!5!3z1z"@ //9/3993310!#!5!3z1Az@ //399310)5!3z1!bIp@ /399310)3!IurpbIp @  /9/3993310!#3!IuurpX ^#@  /32993310!5!!5!dd?} 0@   /329/39933333310#65#!#65#!}1<)2;vV}R#/3299103738OO!#/229910#'#rOODߞ!W@ /3993310%%!߾OOW@ /3993310 57'5ߞ!OOW @  /32993310#"&546324&#"326mRPppPQnb3**11**3RnlTSlmR*44*+66A/9910-5!Z& @   /223399107%5!3%5!&& @   /22339910%5!!5!1&&@    /323310".#"#>3232673(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=$@ /99//933310!!  @ /299310!##]tq@ /299310#5#5!t]qi@ /29931033!tKqi@ /299310!5353tiqW@  /32993310!3!53W}W@ /299310!3!PW}:Wq @  /9/39310!#53!q]uu$>/10%5!$&a$>/105!a$&r^#+@    /  /2]r210".#"#>3232673U(PLD%) |+TD)RKC,$ z,T##)#/@fg;"*":4bi=$1/310!!d̨@A/2105!@NNb /2210"&'332673 hGGiMYWOs/2105!F/2231053!53mu+ /3299104#"'632#5248 7pX^>f OI5H,+"+"X /329/3105!"&'332673 `EH^NNNNT  /3210"#>32#.Ded@QKKQn? /9/1054673348>E?yMNHn? /9/10#>5#48>EyMNHn? /9/10##.=E>84HMN{?7 /9/10#>5#748>EyMNH)l /10%5!Bl&)l /105!׬l&DW/10#5#535|5#!ks}kҼNr /10"&5463"3rj{}hf15Ng^^gvO$-IW/2310!53533z|wW|IW/3310##5#5!w|zm|GW /10##5#53533{{{{{{rrqyyS/3105!SZֹWd /210%#"&'532=0t:/d  }Wd  /210%327#"&=/:p5d}  sa rEM/3331053!53lur@W   /3210#"&546324&#"326mRPppPQnb3**11**3RnlTSlmR*44*+669z  /310#65#53z+3^lIu=dF]  /3210#"'532654#"7>32\QMMVa{?D$&*yer { .+TkfHW /210"&546733275o~E8231-6:?Wl\By&)e/*3!WJ/10#3JWgWy /3210#5!#!ySW}O@   /2223310#"'#"&533253325OcXZ77[Zdh\Zc\Ziw==|dqqqqmr sXr [/3+310#'##53rӠulc |iX  /22102#.#"#>^HE` w@HH@{y@   /]333/]2210".#"#>3232673,YTK)+1\L-ZTI(-qy&/&.MqqC&/&1J3W/210!!dNTB8= /32105!5!ssr{.E/310!5!EvE/310!5!Eq/10%6̂*/103#) Nq  /102654#52#t51fi|{j-$Ovh]^gWy /3210!3!53yW}DW /3210!!5#xbWx괴P@  /329/33310.#"#4#"#>32632 )!\cZ"* peL[77VMh "qq"P[==ZQ/z /10''7'77]ut]xx]tu]v]yy]uu]ww]undq/104>75>54.d.MM&0 Yo&-2= Y 17<AK["18:$L/105!%5!g$NNNNR /10%5!& /105!&a  /3210".#"#>3232673(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=n  /9/10#65#!1< yT/  /2223105!%53!53E^!$%W  /210327#"&=3E!,5HU! QGy' /3210#5!#!yS} W~ /32105!5! jjjj=W /3210#3#39WggDi /310#5#5!t]iqvc @  /  /333/]3310&#"#>32732673#"''P%%) |+TD7S;_:",$ z,TE2XE^#/@fg;+h5f:4bi=,z6+!@   /3/333/3/331053".#"#>323267353E3 @=6 d#B6!A=5#a#C!'2WN/!.*SQ0a39@!/''/'''  /   ,#/33/]33/]33/]310".#"#>3232673".#"#>3232673(PLD%) |+TD)RKC,$ z,TE(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=#)#/@fg;"*":4bi=b /105#'735莎||||LW/33105#7#8||W玎 %-5=EKQYaiqy7@LrvjnFRV6:.zz2~bbfZZ^>>"B&*MM*B^f~v LHI OO L|Pdh\`@D,x(tt ll$pTTXI88<04xpXI<44557449 885667775558849*557sNsmmIok /31057'5ߞ!OOwr /10"&5463"3rj{}hf15wg^^gvO$-A /229/3105!2#4&#"#>`KJbFPQE/R @   /33329/10''7'77]ut]xx]tu]v]yy]uu]ww]uoW /310%%!߾OOoW /31057'5ߞ!OOW @  /39/321057'57#'#ߞ!~PNOOvߞ!ws  /102654#52#r51fi|{j-$Ovh]^gL  /310#"&546324&&44&&4&44&&44CW)@    /33299//332107''7'7'3,q!xYXFHY[x!rg2_f:yy;e_2WQ+!@#))## /33322310#"'#"&546326324&#"326%4&#"326QmR\77\PppP]66]Qnb3**11**33**11**3RnBBlTSlBBmR*44*+66+*44*+661f/9/310#7!3_q<_q<׽)SW /2210! $'332$7bmmad *M,~luuSA  /3210! $'332$7bmmad *MA~luuSX/310!!8XS^/310!!8S@    /99//3310"%$#"#>3232673zzZ\͒z)(zY]DDGKDDGKSA  /2210&$#"#6$! Pea%$bwskSb/10!55!||tczRi_'*"?3??10533`m}tr^RxU}`hqN##* (?3?3?9/310>32#4#"#3'uQw{FTLXO}_hp.'*  (?33??9/3104'33>32&#" %K@$(*GPG-H[lE xv*w!~{z '*?3?39/310 # 373  ΝptR/99105!w&Zl/9910!57wz&W,<#NP7NT@)   OYOY?+?+9/9/9/9/9933339310"32.#"3267!R `XPl % +Sced o_<#NT@)  OYOY?+?+9/9/9/9/9933339310".'%32#"%>32!!р lPX` v_o devkcS '@[/?_/]q+9105!E!$%nJU S@   [ @#H[/?_/]q++2+393331053%53!53i;L!%v)$&$9k5@%'7W'w GW'w7g7'w8'Gw7GgwGg&FV&Vnfv6f&6V9FVvF@f eeE5e[EUuE)$T4Dt{$DtDICcx_^]^]qr^]qr^]q^]qr^]qr^]^]qr^]qr^]qr^]qr^]^]qr^]qr^]qr^]q^]qr^]+5?5Dy8.'(}9u&n@%/?O]]5+5?5$'+x9k$i@%/?O]5+5?5$A',9k.P@%?@]]5+5?5C&2`9-G@$4DTdt 2@%o?O_`]]q_q55+]5?5I'<9Ǟ8  @ %?OP]]5+]5?5a&[J97@&$$ $0$@$@$$!!%Op]]q5+]5?5U&k:;ٴ %+5553$j%@_Y??+99310!!dSl4@   `Y??+3399333310!7%&'7Y9 $:b\%n(===+Tq@G   _Y_Y_Yp`@0 ]]qqqqqq?+?+9/_^]q+99339910!!%# ! 4#"32KxOOyݿ;pTS|,.H 8@     ` / ]]]]?2?99333310%!&'!!H+1 +uud!0=1T ;@  _Y _Y_Y?+?+9/+99399210!!!5!5w9\GWT2=#@ `Y?2?+993310!!!! s3Z G@#   _Y   _Y?+3?933+3999932231035 5!!!ZQGsv B7#5<?S )@ % ! +*&&_Y@% %_Y +r+b+S+D+5+&+++++++++++u+f+V+G+6+'+++g++++++++t+f+R+D+0+"++++++++++r+d+V+@+2+$+++++++++++d+V+4+"+++7+@\+++++p+d+P+D+++++++t+T+;+ ++++++{+k+[+4+++^]_]]]]]]]]]qqqqqqqqqrrrrrrrr_rrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrr_rrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqq?2+3?2+93333333104&+3265#"$&54!35!3 +;#"*66**76ژqlj堭D;`@ _Ys`RB4&tfgvVF2$tfB4&yfV$7tPD+@.dT;$`P0^]]]]]]]]]_qqqqqqqqqqrrrrrrrrrrrr_r^]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]qqqqqq_qq??339/3+393333310!# !;!3265!!(  U-1S#L@%  ! !$% _Y _Y?+?33+3/3/993333993310 63!!>54&#"!5!2&55Lzr@aڣeCnza 5V̔V b-@b&, @&%+55+55#5&< R@  & %+55+55P&c9N@ %&%%(%+5+5M&g9@)&)N), % 000 00,0L0 00,0<0L0\0l0|000000000<0L0\0l0000000 000000?0_000/0O0o000000/0?0O0_0o0000000000?0O0_0o0000000 0/0O00000=0]0 00-0M0m000 00-0=0M0]0m0}000000 0=0M0]0m0}00@0000 0-0M00000^?0_0000/0O0o0000d00/0?0O0_0o0000000 0?0O0_0o000000000 0/0O0o0000400/0?0O0_00000 90/0?0O0_0o0000000 0/0O0o0000000000 ?0_000000]qr^]q_^]qr^]q_^]qr^]q^]qr^]q_^]qr^]^]+5+5kXd&i9@ &s %+5+5&k9@  &   %+5+5TU&w:"%+555555PN$F@# &% "OY OY?3+?3+??993323333310%#"32367!!&'3267.#"\>}܃02 2k h1U`YuXfWzz|o[sxu.ĪʧW)Y@- # +*  OY &PY OY?+??+9/+999333339910#"'#!463232654>54&#"ت ߖ /Aqzq]Vqd^[oܵW$/srcP\Xk:@     O ; K[kl+;KK K[:;K{ ;[To4DTT=t$Dt$_q^]qr^]q^]^]qr^]qr^]q]q?2?/33933332310!>7!!67*&''u]!D:*).6{V J@%    OY OY?+?+39/399933393104&'326'#"5%5!b[l|p|CsUnl2םw~ ~:MN(f@8&"   *) !"!"RY !!!!RY QY?3/]+?3/_^]+9/_^]+999392310%27#"&54675.54632.#"3"IwdݝwG*eETX}BUKF(q  jL]{98A9LIE>HJBo"4@ $# QY  ??99+393323310'654.'.545!5!D(Ga8qB;#7)U|M 8E+(HpWC8J\?(6( #Pd @kXdNP@0  PY  p]qqqqqrr????+399333104&#"!4'!3>32MQio{$ @{XrS{l'i)p]Z G@% OY QY QY?+?+9/_^]+99333310#"!22!"!-_]z}tHr.: 6@#     `  ]q]q??933103.5! +% EN<(u: 8@    ?2?3993339333310!!!! J#j:2 T+@   PY O; k[K4 lK;+tdK[K4 :t[Kp@ oO ^]]]]]]]]]]qqqqqq_qrrrrrrrr^]]]]]]qqqqqqqqqqrrrrrrr^]]]]]]]]qqq?2/+9/39333310)&'!.#"'632Tښ6I-C?-0-0UfK /:8S9`]:W@3PY p]qqqqqrr??33+??399333310!.5##"&'#!!3265!QN4Waz ,560*+H䧐Bp:@  rbTB4&tdP@4g`TD p`TD0 td@4$7p_@oP?@!/P?^]]]]]]]]]qqqqqqqrrrrrrrrr_^]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]_]]]qqqqqqqqqq?3?39333310!!654'!ְz)oa12N8:nbBo0R@')$,''21'$%$OY,-,-OY)%,, % ??9/999+9+399323399310'654.'.54>75.54675#5!D-WqB;#7)U|MnѐLU7H1#(HpWC8J\?(6( #PdvDŽ cZ~%OXDsPNR*:@@!  ! OY OY ?+??+33933333310327#"&5!!6="5>3!80&<ju*.:+Cj/ |H7 s|R%yWO/@ OY OY?+??+9933310#"'#!4324&#"326Ѽ{ڌusgqى<9W~OoO%2@  '& "OY  ??3/+999933310'654.'.54632&#"T,Mj>Rx<.7/[rgR<"~_kQP:J3%,q=AJ\>&5'#/@Z{RKdvPQ:/@   OY OY?+?+39933310! )#'4'#"326L3äXPfJ|  %qKظĬp:F@*  OY OYp`]]]]]]?+3?+93310"5>3!!327# Rk43@&+$w,| EB T:E@)  PYp]qqqqqrr?+?3993310#"&5!32654'!T_ltdK14C;pWhPWjR!@  #" RY QY#v#V#F#&# #####t#f#9#)###g#####v#f#I#6#&######y#i#Y#D#6# #########d#D#4#$# #7#####t#[#K#?#/########p#`#O#?# @!#######o#O#0##^]]]]]]]]]qqqqqqqqqqqrr_rrrrrrrrrr^]]]]]]]]]]]_]]qqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqq??3+3?3+3933333310#$474632#">j]f|{5 i  'ɞ k XPU@2        PY O ]]?+??393_^]]9333310267! !&'!'.#"'6Jhab!)/ 4w5@6%)((UPA.JAENfXK=lf)W<t@    OY  TFbTF ivbTFyiI"{o_@49dKtdK?o?^]]]]]]]]]q_qqqqqqqrrrrrrrrrr^]]]]]]]]]]]qq_qqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]qqq??33/?3+393333310%>5!!$&5!!_c-h:}r`kpQqO'k@ ''&& )(y)&)F)V)f) )))))))r)d)V)))9))h))))V)f)))9))&))))))))i)[)I)&)6) ))))))y)k)V)4)&) )8)))))){)d)K)?))+))))))P)`))?))O)_)))))&& ""OY QY ?3+3?33+39/_^]]qqqqq_qrrrrrrrrr_rr^]]]]]]]]]qqqqqqqqqqrrrrrrr^]]]]]]]]qqq933931032654&'7# '#!"47326=!^Ua\y GG v]_Vaڎ%/%ͧd&kj@  &  %+55+55T&wj@ &޴%+55+55P&R9V@ &@%+5+5T&w9@ & %+5+5Qq&{9[@ (&(V(+ %+5+5g~(4g@=) /# 65,PY&g&w&& i H X     2SY?+/_^]3]]99//^]93]]+9333310# 4$32#"&'>324#"3264&#"326~(Q/#7]|@rcH?Nwme}{goukQwly&0:E"8I=.$#htugewq,5d@8-+"+3&  &76)0PY"-"PY+-PYPY--) )PY?+/_^]99//++3+3+933333310##"&547654#"563232>7"$&5463 3!4&#"s 癹:DWlhrF?N|MڭsRUDM*JI$22gY,KK-E6~h¨FFfx# 5@  `Y ??+9/9/93310!! >32&#"? 5R 9^W>oSQ;&BB?dVRAQ?'2F &+5# & [@ & %+55+55PW:Nv:)X@+#""+*"" PY' OY ?3+3?+339/39/993333339310!## '#!"47#4&'!326=!326N(ytGGsv>11>]_Va^U`^:˜̞r-.oWRI3g@8- 0  &54 PY-PY-#'PY#)PY#?++?+?+??9/9/9/9/933333310 !654&#"'>32!327#"&'5326=.5467ft@A-0"u'08/miz@AA80t:/FKmr08AVof Sšqbб  A54&#"5>324/!?A,; $=0*>B-:!$%xVRH t,pG xVRH tAº, 3@   PY??9/+9933333310 #!53!1)j11YJ@  @Y_Y _Y?+9/////++933310 '$! ',='&''.t|V:o 0^-)^PEUQ(ӶPnWNQDV;@   @YPY   ?9////++933310%4''%&''%&%7_":a^ri S}[^̿zŎ"mr_WY+O@( $''-, _Y%!aY ?3+3?33+9/3933333105!26=#"&'#"&5!3265!3265!#nG:v-Tx&Zkf|&Zkf|(HWWyROTTYOZZXiW:*R@*# (  ,+ )!%PYPY?+?3+3?339/39/93333310%#!5!26=##"&'#"&5!3265!3265!KQdkS+|6VjVj Tlgdjsuh㪁Q㮊D}H@%   _Y  _Y_Y?++??9/+9/99333910327!!#"54>32&#"'ٸp·fU#&HneÊ6@m}_=@! PY PY PY ?99//+3++933310!#"&5!2&#"3265!F/wA$:/@@Yef:XdFp  LEC4W)B@   _Y aY??+9/+9/99333104&#"!!>32#!5!2>'`a*^P3\!x w)3F@$*""/(54 -(%2%?3??399//99239333310#"'.#"#4>323265'#"&546326327.#".T7>54!"%6$! !2654&'%! $V+KfvBq9,&9rzv5ORxW<*$1G7'V_LB^H[c,H)KxvV(7@"(*)("PY%PY?+?+993310%# $54>7>54!"%6$! 3267g+Mkq9,&  qoG)2RzZ?0($1G7'‘8H!\GaX,: "%E@%$#%%#'&$ _Y%aY?+?3+3999339107>32.#"!5'.#"'>32 ?zG5{b55#+/32&#"!5'.#"'632!jK>}QwGVI8K"QTDSP M8IVGwQ}>KzHfTLiG40r3r.6GiLTT!A@!  #"_Y  `Y _Y ?+?+9/9+99333310# 6! ! 6$!34&#"3 ǖ(Enca¾û8~V5CVEQUS!D@$ #"PYOY PY OY?+?+9/++99333310#"!3#"32654&#"5632UϿs9}~pxc^DCca{""/cm^^QW!I@$   #"  _Y  ??9/3+39/3933333310'654&+!#".546;!32 >N%&M? '& m)8?8b9>8)!l>š([B@      Y ?3+3?9/9/933310!%53##!#![eJ(me !Cd= dXA)M@+&  +* PYPY#PY#PY#?++?++??9/9/9333310 !654&#"'>32!327#"&5467ft>C-0"u'08/miz@A-0"u'08AVne Sšqb SsZWN(=@ ##*) OY&OY?+?+?9/99333310#"&'32#4.#".! 4&#"326l-Y +`U? ~x}~u*K>ut2 ]1 AP7NFWMTP:J@(  ,<  PY PY ?+?+9/_^]_]3/393310"!!;! ) Y oxxvs  Q:L@( ,<   PY PY?+?+9/_^]_]3993923105! )53267!5!.#Q Y osvywWT&! >@     ?3?39/9/39/9333310!#!! !BB1w W\:@@! OY PY?+?3+3??9333310!##!67!#47ft9 4nufϸfv1tgWO$V@,  &% OY OY"OY?+?+?9/3+39/933333310#"'#3#!5#534324&#"326Ѽ{xxڌusgqى<9xmm~8sHT&& 88s&H:&(& %+5+5&( y@ & %0@`p @p P0`@p P0`w@p P0`G 0@]^]qr^]qr^]qr^]+55+55#q@@# %$_Y `! ! _Y!  _Y ?+3/_^]??+39/_^]q+393333310>32#"&'7326=4&#"!!5!zl≼F4R/[Nw_S9346S_D1f p&ka'q' @ % ? O  _     . N n ~  > N ^ n  ^ ~  ]   - M m }  = M ] m ] }  \   , L l |  < L \ l \ | w _   / O o   ? O@ _ o  _  Y - } i - = M m = ] }  / O o   / ? O _ o  9 / _   ? O o   / ? O _ o  / O  ]qr_qr^]q_]qr^]^]qr^]_^]qr^]^]qr^]^]qr^]^]q+5+5T{}@O _Y _Y _Y 0 `p?3/]q+?3/_^]+9/_^]q+93333310% ! ! .#"!!h9bM! "  amZ]rxGj};6,`&, @ &@%  ? o   O _ / ? o  O   O  / _  ?  r O / o  O ?  /   P ` p  ]qr]qr^]qr^]qr^]qr^]q+55+55-x#`@8!!%$ _Y*!`Y `Y !_Y?+?+?+9/_^]^]+9333310#!! #"'53267!!24&#!! x{M16fE9JA"C֋\l;]ey6`@5    `Y   *  _Y ?3+?39/_^]^]3+3/933333310#!!!!!!!24&+! 6{'#'S֋l\1]ey{A@!_Y _Y?3?9/3++3993333310632!4&#"!!5!䈓9S ~5_&@ &K %+5+57&"&%+5+5>&J& %+5+5h6 F@   `Y @P D +       t d D 4   i     t [ +     { K $      { d P D 4   7    p d T 4      k K ; +     T +   _^]]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqq?3??+933310!!!!!c&'i'hsh3$w W@2  _Y   *  _Y_Y0]?+?+9/_^]^]+99333310#!!!!24&#!! w{%֋xl]eyj%a@_Y??+93210!!aOdhE@#    `Y `Y?3?+33?+93333310%3#!#367!!չxHp=_4thsn(E @  !"""r"`"R"D"2"$"""""""""""t"`"R"D"2"$"""g""""""""t"b"T"F"2""$"""""""""t""f"D"T"2"$""""""""""d"t"P"D" "0"""7""""""p@X"d"P"$"D""""""""T"t" """""p""O" "" ?22/3?339/33393^]]]]]]q_qqqqqqrrrrrrrrr^]]]]]]]]]_]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqq339333333310!"&'!&'!3!267!!# M-s,n\//\o,s-8Gd  "aW_Di".&@P!$ $$('!  _Yo_Y_Y0 `p?2/]q+?+3/_^]9/]q+99333339910"$'%32654&+532654&#"%6$32~E\쁆;;{lLE]kaeY`d[`=Ǩ#7 \@6      `P@p0 ]]]]]qqrrr?2?399//99333333103!!!47eLkF?N7>&J@ &%+5+5D@!   aY ?2?39/+9999333993210!267!!#!'4w_,|/N{Dk# /@`Y `Y?+?+?93310! #"'53267!!i16fE9JA"C;!0=+T27#@ `Y?2?+993310!!!!s3T&7 9@    `Y?+?39/39932393310"&'732>7! !UG*RYG/C;63*+Es#*$OvX=G )@ % ! +*&&_Y% %_Y&    ++r+`+T+@+4++++++t+[+;+++++g+++++t+D+4+++++++p+d+@+4+++++++[+$++7+++++t+D+++++++++p+`+@++++++@+o+_+ ++^]]]]]]]]qqqq_qqqqqqrrrrrrrrr^]]]]]]]qqqqqqqqqqqrrrrrrrrr^]]]]]]]]]qqqqqq_qqq??99//^]3+33+393333333104&+3265#"$&54!35!3 +;#"d,3{O6CC7O{3,ژqlj堭D;h 6@    `Y??+3?399333310!!!!3'9hsstn-@ _Y??39/3+9933310!#"&5!327!'#S?w5 @   `Y p d R D 2 $           r d R D 6 $   h      d D          d D ;          d T @ 4    8     p P 0     p P 0 @      p P @ /  ^]]]]]]]]]qqqqqqqrrr_rrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrr_r^]]]]]]]]]]]]]]]]qqqqqqqqq?+3?339333103!!!!!ssh@  @  `YvdVD6$t`T4 gtT+tTK4pdPD0$7`@ `@`P?@ ^]]]]]]]]]]qqqqqqrrr_rrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrr^]]]]]]]_]]]]]qqqqqqqqqq?+33?33?933333103!!!!!3#ssst Q@.   _Y   *  _Y _Y?+?+9/_^]^]+993333102#!!5!4&#!! {;8}nPƀl[]eyL \@7  _Y*_Yp]]]?3+?39/_^]^]+9333310#!!!24&#!! !O{C'֋f'l]eyw V@4 _Y*_Y@p0]]]q?+?9/_^]^]+9933310#!!!24&#!! w{'֋xl]ey6]@Q _Y_Y@P    _Y?+3/_^]?3/^]q+9/_^]q+93333310%267!5!.#"'! ! 7 " ʵ!Mb9hɼ}jG~aG@&  ! _Y `Y  _Y?+??9/+?+93333310# !!!!! 4&#"32'#U6^ӺJ&.#7 Y@2     _Y_Y p 0]q]?2?+9/+99333333103.54$3!!!3!! #}#}P"הdq<ND^ "?@!!$#! OY  OYp$`$qq?+?9/+3993333104&#"3262! 4>$%zpx|v3o qLgCM}L4@g:: V@.   "!RY  RY RY ?+?+9/_^]+993339310 #!32654&+32654&#րslrze`r:^{l:uCPUD:IC>:@OY??+99310!!::h:M@    OY @ OY?+33?3?+9333333310#!#36!3#BCe}Hh/|hVpcP-NH:!@ !  !!#" !/##/#O#####n#?#_#####/#_#o#####O######=#O#_######?#####/#_### #p#<`###P##### #p##^]qr^]^]qr^]qr^]q?33?3393339933333393333310"'!&'!3>7!!##XB>#9+?2)(2=.4(>G ,;e}S]'&&YXa! 75N's@@! %%)(!  RY  RYQYO)]?2/]+?+3/_^]_^]9/+9993393310"&'732654춮&#"'>32)kIPYNHR_綴}{,JZO@TLGM@    ?2?3939933339339910!>!!#!*(.9,:>3:0=eR0 A:-@ OY OY??+?+93310!! #"&'5326!l5?Hn]$_+8;;D;|xԙC h0\:<@   K$k;+itD+kT4{dK$ 9tD+pO`P0 ^]]]]]]]]]]qqqqq_qqqqrrrrrrrrrr^]]]]]]]qqqqqqqqqrrrrrr^]]]]]]]]]qq?33?3993933333310!##!67!#47ft9 4nuf:ϸfv1tgF: ;@    OY ?2?39/]q+99333310!!!!!}:T1:PNRF:#@ OY?3?+993310!!!F}:|:WQSP7NF::@ OY b T D 6 &       v f 6 &  h   t f V 6 &          t f V D 2 $           t f T F 6 $   8        b P @ 4 $       p @&` 0      p ` @   ^]]]]]]]qqqqqq_qqqqqqrrrr_rrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqq?+3?9310!!!!:x:|Wh:\RW!,6@2 " (- 87*55OY/%%OY 8v8f8B848"8888888888t8f8T8D868$888h88888v8V8F84888888888d8@8$888888t808$888888888[8D8$88888888p8P8@8@& 88888888_808 88^]]]]]]]]]]qqqqq_qqqqqqrrrrrrrrr^]]]]]]]]]qqqqqq_qqqqqrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqq???3+3?3+39333333310#"&'#!##"323'!6324&#"326%#"32ɴg*Tꮽȶk(WTecaaai`hg`"a_aY( %b]󭿳ǯl²d:[h: 8@   @ OY?+3?3?993333103!!!3#:|S:0@  PY ?2?9/+399333103267!!#"&5k.UrU:~ 8: @  OY t d V F 2 $           t f T F "   h       v d T F 4         v d R D 6 $         v d F 6   8     p P @     @/   ` @ 0      p P @  ^]]]]]]]]qqqqqqqqqrrr_rrrr_rrr^]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqq?+3?33933310)!!!!!w<;:||h:@   @ OY tfVD6$vdTF2"gtfVD&tbP4$pP@4 7dT4$kT@!dT;+^]_]]]]]]]]qqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]qqqqq_qqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqq?33?+33?933333103!!!!!3#=<:||&: =@  RY  OY  RY?+?+9/+993333102#!!5!32654&+ql|M(GSNDF: D@%  RY  RY]]?3+?39/+93333102#!!32654&+!Ԃxt:M(IQLF%:: :@  RY  RY ]]?+?9/+99333102#!!32654&+Ԃxt:M(IQLF4Nr@A   OY4 ;   OY?+3/_^]_^]]?3/]]+9/_^]393333310%3267!5!.#"%>32#".4 lPii5hfX` Ҁh de}cS`NU@0    OY / ?  OY  OY?+???+9/_^]+93333310#"'#!!36$3 4&#"32 tntl1:T: I@%  RY RY  ?3?+9/+9933333310 !.5463!!#";BBrwͽMvؗP-&HC& %+5+5P-&Hj@&  %+55+55 Wd&@+$$('RY PY     @!H  PY(((p((]qqrr?+??99//+_^]q+33+3933333310"'5265#"!#535!!!3>32EdF3J4f}煅69wW Aarmh|p-&v@ &W %+5+5P7Nr@A  OYY i ;   ` OY?+3/_^]]]?3/^]]]+9/_^]393333310"32.#"!!3267R `X 5 Pl % +Sced o_HOVLe&j@&% ?  0 @   @ P `  0 @ P p  0 P `  0 @ p  0 @ p P `  0 @ p m @ p  P  p ; p ` p ]qr^]qr^]qr^]qr^]q^]+55+55WMk:#P@, %$#RYOY OYRY@%]?+?+?+9/+9333310!! #"&'5326!!2#%32654&+d5?Hn]$_+8;;D3Ԃxt|xԙC h0MIQLF:J@% RY RY ?3+?39/+9333333102#!!!!!!32654&+_xt1:TM(IQLF dp@E  RY PY `p   p]qqrr?2?99//]q+33+3933333310!#"!#535!!!3>32Lf}煅69w6mh|pz&v?@ &M %+5+5]&C&%+5+5Wh&\& %+5+5hF: @   @ OY{ k ] I 9 +          { i [ M ; +   i      y k I 9          o [ D +        { [ O ;   9      { d ; +       o P ? /  @   p _ O 0   ^]]]]]]]]]]qqqqqqq_qqrrrrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqqq_qrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqq?3?+3?933310)!!!!#:{hY 2Z@,'$'$$-43 2%%/_Y*!!_Y ?3+3?3+39/9/39/9939332310>3 # '!"$5!2.# 3267!325!"^XQllQY\+aDln@?plDa+G,#LXw#,#?8A8?# :?@     PY ?3+3?339/9333310!!!67!64'2xaj)Bev%0:{h:_{l-&O@)  aY_Y_Y?+?9/+9/3+393333310!5!!!!2#!!4&#!! &'M{DUFe˶Āl ]ey&MO@  @YOYRY?+?3+3?9/+93333310!!!!! #!!32654&+& D:Ԃxt:nŸ|3IQLF!m@8!!  "#   _Y _Y_Y?+?+??9/3+39/9/9333333933103!3! .#"!!3 # #'T1!  ȲhR#6xGj} a?.'N"@N  ""  $#Y i ;    !!OY` OY?+3/_^]]]?+??9/_^]3333/_^]]]93333339103!36$32.#"!!3267#"$'# ܿ `X 5 Pl І:ISced o_;Z J@$   _Y   _Y?+?339/+39/3323933310#!!!##!;q\pqD5j: E@!    QY  ?3?339/+39/3332933310#!!!##3.'HlPkH(,[:[v`!nc@3    _Y _Y?+?3?9/3+339/9333333323103!!!!###!!!'k\qpD\5Z:[@/    QY ?3?2?9/3+339/933333333103!!!!###!#3.'PkHHl(,:$[[[v`!U$`@0    _Y _Y?+?339/3+39/933333333310!#"!4>7!!4&#'!rБr❋J@@{Aoboڎ={u}:`@0     RY  PY ?+?339/+39/3933333333310)"!54>7!!54&#'!`I΁`vtai  hbٯrw&H #k@8 "#  %$_Y! #_Y?+?3?9/33+33933333333333103!!!!4&+!#"!47!!'r❋]Jboڎ={@{AL-ua: k@8    "!PY  PY?+?3?9/33+33933333333333103!!!!54&#!"!547#!?I΁`vtA0: hbٯrwhmAyI&PWO@ G&A/1+,,!1DAG QP7>5:@1Y5/ /1@>..1 ND"!"!_Y N+"1""11)_Y1W/3]?+99//999+93333_^]+/393333331032>32!4#"#"&54>7>54&+532654&#"%%37>32&#"Vv1kpv=K#_qCXњE;;{lLl%ƑjU@c=Pa2UtjfW '!`$,$mH (H;eY`d[`=E>dA;NY!#X{S2 2DWP@4FE3,#: /,3ERQIB8/ RY8B FB BF=N!&@Y!@)RY?+33/+?39///99+93393333333104>7>54.#52654&#"'>737>32&#"32>32#.#"#"&DF{zO-6lNHOaoƑj&N;g>Py}{Q]=91SQW6oz'#'>H\C^uE"5*7=GME U:ZI;1uW:<@     OY ?3+3??3393333310%>5!!.'!3!_c-jZ9 gus:}r`k)VpT.x@J'-0/$EFVJO_   _Y *_Y?+?+99//_^]_]]q]]q33993333104$3 #"$%".#"326723267.#"6TAOx?ulc.biѭf#Cc_gG$f"ӪjFM7%-ŲN%-PN &j@E% (' &66FV) 9  9 I Y   " ?3?399//]]q]]q3399333310! # 2327#"6".#"3267P 0A=E4,4!7V3LA;"7=[|4 +&xz+@ _Y `Y?+?+?9310)!67>32&#"B4"/-3WWWK^1wXPpFKR"N&@ PY ??9?+9310)!?>32&#"})8"(i8l{t2%-5:2vBE=@z &%T@  & %+55+55"&&@  &a%+55+55TW'X@/  # )(  aYaY!_Y&_Y?+?+++9/39/93333310"'5326?!!! ! 4&#"32eL5,Xb%|)&JP݃yyW Sd0/%p~{`[tPWN*P@, $ ,+  !OY(OYPYPY?++?+?+?39/9333310"'5326?!!#"324&#"326eL5,Xb%|)&J|NBCQ&A'DRW Sd0/%10ǨpY#a/A@!'--*10-!'-$''$- //9////339933993310"&'$%>322654&'#"&'>B;aA&a;;`$Ca;8^]99^]w9/:8w/89/z/94++44,,4#+A@$* " -,$*'**'//9////33993399331047632#"&'&%>32>5'#"&'#8__8V45U![RQ21QQ\W56W)LL*33*)딶&..&"=,45+<Y $EO@) (LFJJ.(MI4(@("QP::+""$ F+E//$+Y+KJ@YK+B2+2_Y+=7$7_Y$?3+3?3+3++9/329/9/93339333210#"&'.#"#4632>3 #"$'!"$5!2.# 3267325!">5#53YdjP}x>qdT^XQlݏklQY\+aDlĎ݉܎lDa+j*49<1sgd .,#JDLXw#,#_qq_#E#\*wRP!6@q@"-7<<  BA#-70)Y0<;@Y<PYPY ?3+3?39/+++2933933210%# 3 32673265!52!"#"&'.#"#4632>5#53|,@pXYq?,*YdjP}x>qdT j*+?%/$23#F~49<1sgd .d#\*wRY & (T@ ==&> >3%+5+5 _& ""&## %+5+5cWZB@!   @ _Y_Y?+?+9/9/933310&! .#"327[E}"{G=W3^qxGl{lPW/NA@!   OYOY?+?+?9/9/933310&532.#"327ҹ `X{sL:W" +Sc'@ ?33933310%%#%77%732{83|[jz28z2kzaaaaaaaZ_/10#!#"&5463!54632_G2F35DC6SF32GS5E 732y'NYf?_f5[TU/uzȄ)2)$S{ /2103##.5zl^3+Fd>uHS{  /210#65#53{+3^lNIu=dFn>  /3210#"&'.#"#4632>YkpI}xLttYn3:<1sg.663% '1;EOh@8#FK>C HH%M 27 449(-**/KCM79-//-97MCKA</3/39////////33333333333333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EOb@47:#%-/ @C/(%OM2:  CE(9M:JJ:M9(EC //9////////////3333333310#65#5546733#"&'5353%32&##&'''.'77'67'77>7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96mh>Y@, ! !   ?3??399//22]99333333333310!#47!!!3#".'33273YeLZ Y?NkFstL{zLh!U@)  #"   ?3??399//2299333333333310%##467!!!".'33273qM!Z Y&2:.'L{zLwT@*  aY  _Y _Y?+?9/+9/3+399333333310#!#535!3#!24&#!! w{'֋xl.]eyY@   Y  @ Y RY?+?9/+9/3+399333333310 #!#535!3#32654&+}}ԂxtŸ(IQLF%C@#     _Y_Y?+?9/+9933922910#!!!24)!27'76 jy[p95,/եyo7 %WQ*R@,)!!  ,+OY  $OY?+?9/??+99933333910%#"&'#!4'!3632#"327'76Rgt)_Zpwvo>.c*fZa`j4󓊊lİdH%@ _Y??3/+9933103!!d=$@ OY???+9933103!!Hl::a =@     aY _Y?+?9/3+39933933103!!!!!#O;ى8Io: =@  OY  OY ?+?9/3+3999222310!3#!#53:YW"K@'  ! _Y_Y_Y?+?9/9++93333310!!>3 #"&'73 4&#"!%TUd<)]_7!3#'BG>#9+?2)(2=.9#Y 7 ,;e}S]'&&YXe.W4q@-2)#//()) 652_Y(,,,&_Y, @ Y_Y??++?+9/99+9933333339910!"&'53254'&$'%32654&+532654&#"%6$32,a DN C\쁆;;{lLFfE.9]kaeY`d[`=Ǩ#5WN5t@$ ',1'76.4@$Y.2RY.#RY*** QY*RY??+?+9/99+9?++9333333399104'.'732654춮&#"'>32!"&'532 &kIPYNHOa綴}{,a DNz,< ,JZO@TLGM7!3###!0/8)~,:i-3:0%USR0 Ao@8    aY aYaY?3?39/++9/+9/9/9/9933339933310#!!2737!!#6,'7*iY,|/ir%k# :_@  @Y ?2?39///9+99939233333310!>73?!!##!S1v,:>S(:0 9hR0N>Ah@(   aYaY@ Y ?3?39/++9/3+399333333333991035!3#267!!#!#'2ph,|/PډޣpDk# . q@  Y Y @ Y ?3??9/++9/3+3993333333339910#535!3#>7!!#!|}0/8)~,:>3%USR0 AR@  aY @Y _Y?+?3?9/++9333399310!267!!#!!2ph,|/P_pDk# %:U@    Y@Y PY?+?3?9/++9333339910!5!>7!!#!nc0/8)~,:>3P0%USR0 AhE@# `Y  `Y?+??39/+93333310!#!!!!!3#'f'r\1sth:E@#     OY  OY ?+??39/+93333310!!3##!!u}:T1: =@  `Y  _Y ?+?3?9/+9333310!!!!!!!'fa\1c: =@    OY   PY?+?3?9/+9333310!!!!!!v}:T1:WY@-  !  _Y _Y`Y?+?3+9/+9/933333310!!!!>3 #"&'73 4&#":c)]^<|{s&͡Pc|T7W2:e@4 ! OYQYOY OY?+?+?39/+9/+9/933333310%#"&'732654&#"!!!!6322IV}Ny}[ `|CI~Hr|:;q 3n@; '"-'-%0 433*_Y**_Y_Y0_Y%_Y?+?+?+9/+9/+9/9/9333310>54&#"#"'#"$54$32&#"3&5432327)7,41:@Ltlr闉i]_77}>4~P:]e$44BR&f`/;qM&0k@ .' ++.$21)@'Y .PY PY PY .PY#PY OYQY?+?+++?+++9/+933333310"'#"432&#"3.546322674#">TNWgUTJ0Tb+7~X,r2TIH*!'##$9#¡@PG,!TW%\@$   '&"aY@Y _Y "_Y"?+??+++9/9/93333310"&'53254'$! .#"3267,a DNfT!:W16 }R[txGj}~a,aJPW7N%\@,$  '&"OY "RY"RYY?++?+??+9/9/93333310"&'53254'&532.#"3267,a DN `XPl ÙW16 " +Sced bMh 5@   _Y `Y?+?+3933103##!5!|9Wt:h: 5@   OYOY?+?+393310!#!5!!3# xz|Bs$@ ??39/933310!!!_::??B9Wj: $@   ??39/933310!>!a)8 ?&VW:20IWs=@    _Y  ??39/3+39/93333310!!!!!!!3::g95Wj:@@   OY ?2+3??39/93333333103!!>!!!!5!o8a)8 ?&V8:20IhOS@*     `Y?+??39/9/993333333910!# ! ! ! 3#UGA8996T:1dth_:b@   @Y   OY?+??39/3+9/993333333910!# ! !! 3#n;/1x/ bh@@!    _Y `Y ?+3?3+3933310!!!!3#!!Wst.hT:A@!    OY OY ?+3?3+39333310!#!!3#!#.:B||nhM@' aY _Y `Y?+?39/+9/+9333310!##"&5!327!3#'|#S?w5stSh:Q@    @YPY OY?+?39/+9/+93333103267!3###"&5k.UrzV:~ 8na@2   aY  _YaY ??39/++9/9/+9/9/933333310!##"&5!367!lf"argk'#(?| ? !S:E@$  PY   ??39/99+933333310367!!#5#"&5ko)il&o:>:~Y' ϵ !<@  _YaY ?3?9/+9/+9933310>32!4&#"!]1" w5_dK  &a@1 # $ ('  _Y#!_Y_Y?+?+9/3+39/9/9333333310! #"&547! !3267 !.<=BG[9Wz, T>S_;8I9I>Kfj| N$w@@!  "&% RY! !H  RY  QY?+3/_^]?+9/_^]+3+39/9333333310"'$5476$32!327"!.; %9HJul' 9cknTz0B1+-| #)l@7&"# '#+* #@_Y&$_Y_Y!?2+?+9/3+39/9/93333333310&#"&547! !3267# !.BG[9Wz,sf 9S_;8I9I>KfjI)| N&@L#  $('@ RY#  !H   RY QY?2+3/_^]?+9/_^]+_]3+39/93333333310&'$5476$32!327#"!.ѷ %9HJul' bjckn Tz0B1+-%|,E+&I7!!&$$*%+5+5&@ ""&%%+%+5+5W#!\@- ! !!#"! !aY!_Y!!??2+9/+9/993333333910!2>!!"&'732654.+!'3=P,9C]_Xw?saZTPc|T{_W: Y@ "! @Y OY?+??39/+9/993333333910#"&'732654&+!!>7!}MTv0/8)~"V4>|BRuGA:0%US=h;@   `Y?+?39/39/9333310! #"'53267!3##i16gE9JC CoDsth :<@  OY PY ?3+33?+9333310!#!#"&'5326!3#y:/4F_E$_+8;;D;|eV$ h0W=L@% `Y _Y ??3+9/+9933333310!!!!!!"&'73265'f'ܖ]_\1iPc|TWF:M@&  OY OY ?+??39/+9/9933333310!!!!!!"&'73265,}}MTv1:T&BRuGhG@#   `Y  `Y?+??39/+9933333310!#!!!!!3#z'f'\1sth:G@#   OY  OY?+??39/+9933333310!#!!!!!3#y}1:TnhQ@) @ aY  _Y `Y?+?39/+9/+9333310#"&5!327!##3'|#S?w5h]h!:U@  @@Y PY OY?+?39/+9/+9333310!#35#"&5!3267!zV.UrhV8~ hO@(  `Y`Y?+?3+3?39/933333310!#4?#&'!!>!3#tY"GXF"Vv .5u~ZEsth:Q@*   OY PYOY?+?+?3+3?933333310!#47##!67!3#Ut9 4ntguf:ϸfv1O3&$ @ &%+5+5<&D44&7ϴ7?%+5+53&$ @ &%+55+55<&Dj@ ;;&997%+55+55BN&( c & %+5+5P-&H@ &% %+5+5T{QP-NT{&Q @%%&##! %+55+55P-&j@ !!& %+55+55E& K@((&&&$%+55+55&j@))&''%%+55+55.& 3@..&,,*$%+55+555&j@//&- -+%%+55+55.J@%   _Y _Y ?+?+9/9/933339310!#"$'%32654&+5!̩E\x;nÄo]yg{5W:T7&C@ &%+5+5][&@ &%+5+57& %+55?55]&j6@&%+55+55T&2 @  &%+55+55P&Rj@ &%+55+55T ?@ _Y _Y _Y?+?+9/+99333310# !2267!"!.xOB6׬"TS|2ѽڹPN X@0OY,<  OY  OY?+?+9/_^]_]+_^]99333310!"! 2!"!.  l!y,+T& @##&!!%+55+55P&j@ &%+55+556]& d@ !!&%+55+554&j@%%&##!%+55+55 &EC@ & %+5+5Wh[&\@ & %+5+5 & I@& %+55+55Wh&\j@& %+55+55 & @& %+55+55Wh&\W@&p! %+55+55n& r@&%+55+55S&j@& %+55+55ha 0@  _Y `Y?+?+93310!3##aOWth: 0@   OYOY?+?+93310!#!!3#7:BL& @ &%+55+55F&j@ &%+55+55Wa^@1    aY_YaY_Y?+?++9/3+39/93333333103!!!!3#"&'532=##O;o0t:/8I  }ZoW:X@- OYOY OY ?+?+?9/3+39/9333333310!3#3#"&'532=##53U0t:/x:  }mWOT@,   _Y_Y??3++9/9/99333333910 ! ! ! #"'532654&'A8996ToqsU:/G:5?1dĬ *-+t`Wj:_@  @Y PYPY?++??39/3+9/933333910! !! #"'532654'7/1}aU:/E2Lx/ b{ 4<6nDL@$      ?3?39/9933399333333339910!! !!!! !!:~8996+@A1ud:V@*      PY ?3?39/3+39999333333339910!!!!!! !!M/1 ECbZ7xU' 2@ _Y _Y?+?9/+9933310463!!!"$%)!"U'7*r1eT\GZ#T@+ %$ !_Y_Y aY?+?+?9/+9/9/93333910463!!32!!"&'#"$%!2>=!"Z'%9Q*L1?O$PXQC6qUeT)W@- %+*"OY PY 'OY?+?+?+?9/9/9/93333910326=!!"&'##"323'!4&#"326Tah)6<}s-urqnoz$\hf^ %`_WQ8(P@)  $''*)%%_Y_Y"aY?+?+9/+9/9/9333310"&'.+532654&#"%6$3232!] ;;{lLFut@b_k_`d[`=Ǩ#@oVzO$MJN(A@! $' '*)%% RY!PY?+?+9/9/9333310"&54춮&#"'>32326=!s扡NHOa綴}{UaahTLGM323#4NHOa綴}{}w7TLGM?3+]q223104632#"&74632#"&4632#"&+. ".." .. ".." .r. "--" .o -- ".." -- "..".." 00mN >?10#7'7'7vVVVVVVVVVV^N "@ @ H>?3+]q2104632#"&4632#"&`. "0/# .0 0/!".m"--" ..".0 0.`N (@ @ H>?3+]q2104632#"&4632#"&3'." 00 ".. !/." .om"--" .. 0/!"...nN/]2103"&5DtfR\ijhX >?10'7P+! @    >?]99//3310"&5463232654'7#"&'.%9mRA/Q5(7 %9mQ>2S4,19&%@H&xAR5J9/&%@H)uAR6I>*N>?]21044oqhN\hmB/10#'73B)@ @ /3]29/10#52654632#"&ev. !/." .Rji\ 0/!"..NH>?]210463"fsNme_NHNH@ >?2]22310463"!463"fsIfsNme_me_; )+7!@//))55 P##/]333]223104632#"''7&732654&#"'#"&546324&#"326Z~Y[~|];-XRXy7'(:<&$:XRX-;\}~[Y~y:$&<:(&8RY~}ZY~XTX/<(89''98(?]29/310#"'#3326=WW"ee !0&2Xf fL -72D!@@P` /3]]9/3310#5.=3326=3EFfCFd'30&ffZZ \\ Z[1150051H/]210!535#j^/10#'73j/]210#5265ftRjj[H@ /2]22310#5265!#5265grgrRjkZjkZb @/]1057'%㍪3P3L\N;)@ /  P/]3]210'#"&546324&#"326=XTV28YXWw:&':8)(8R=.XTX|[Z}~Y(89'(88D^N >?10#'73NHN>?3]10!535jHP){) / /3]2104632#"&732654&#"~YY~|[[|w8((8:&&:RY~~YY~~Y(88((88P @ @ /3]q2104632#"&4632#"&P/!".0 00 0/!".b!/0 ..".0 0.- #/;'@39!@!!!- '/33333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&. ".." .. ".." .r- #--# -I. ".." .0 0/!".` .. ".." .. "..".." 00".." ..".0 0.@@ /3]q29/3105!74632#"&4632#"&G8-# // #-- #--# -mm@".." .. 00 "..!@@ /3]q29/33105#5!#74632#"&4632#"&nGj-# // #-- #--# -rmmr".." .. 00 "..PB  /3104632#"&P/!".0 0!/0 ..=D  /333104632#"&74632#"&0 0/!".. !/." .".0 0." 0/!"..= #@!@!!! /333]q2104632#"&74632#"&4632#"&."".0 0. ".0 .u0 0/!".b".0 0/!".."".0 .. 00\ /]310!!H}j\/105#5!#5oHkujjuPF  ??3104632#"&P0 0/!". 00 00PF #@ @!!! /3]29/3104632#"&4632#"&4632#"&. ".." .0 0/!".0 0/!".`".." ..I 00 00H".0 0.qP @  0 `  /]3104632#"&P0 00 0#--# --7/310537nyL/33310!!<L\+0 /]]310!!H+j`//9103` wPFPF 1@  CYCY:?++933310!!  P  /3104632#"&P0 00 0f 00 "--jP  /3104632#"&P/!".0 0!/0 ..!2@   A @Y:@Y9?+?+93104>;#"!!NfFyy[t65b /10##57#5!BPJ@    :9?2?3993393399329910!>?!!!>7}H?B =gqu 6,>T$?.+5LZ8d61%5)$JugP3AJC!:\]>)q+@  @Y9:??+39310)!5!#`H7@  @Y 9:?3?+9/9933310)!!4&#!5!   'љ}:9??9310!!'3 @@   A@ Y  AY 8:??+9/99+9310'!467%mF7Sa##a]Xl*s +@   @Y9 :?3?+9933104&#!!! !瀠(1;@  A @Y89 @Y;?+??+93310 !32>54&#"5632t?NZX^]ֻ %[98F@ _9?]9310!!m' # @Y9=??+99310!4&#!5! `'R{P4@  A @Y9@Y:?+?+993310)5!26=4&#!5! =ZRTF15@  A < @Y 96??+?3933107$54#!!!  @.b^6Xw&{ 4@  A @Y9@Y:?+?+993310)! !4&#B(T 1+P@A9:@Y: @Y8?+?+??99933310 !5!4&#" !67!>D{uevEy2,+^<pӷk\h=9??9310!!H2@   A @Y 9@Y:?+?+9310)5!4.+532yy$TQwNʇs1\һ3%9@   @Y ;@Y9?+3?+93310467#5! ! !26=4&#;0-V=-sc:P35j-J) ;@  AY <9?3?+999333107$7!6!)%'q`$O/[m#<@   @Y @Y9=??+9/+93310 !4&+3!2%I@ @Y A @Y: @Y 9?+?+9/+933104&+3!! )5! &8ZRd 54@  9=??39/39333310!4.!>?!`)g5NmPUNguq. }J@  9@Y:?+9?39393339910)5!!>?!sD{B; =te/ {錙i)u{<@  A <@Y9=??+?39/93310!!2654&#!3jp{;X%pZ' # @Y9:??+99310)4&#!5! `'ћ{9#[@B@Y  9@Y:?+?339/_^]]+939923310!32$67! !!7>7 Bw)?@VmIDA" \#U? ?}=<@ @Y: @Y9?+3?3+93310#5! !4&++532>5 ODFP"3ɠ~_3lm&&j&& jF&&  js6?910#!{1 6?329910#!#!״{{: 3@    PY  ?3?39/+3393310)'!!! ]&X[:N :i@9    ,   PYPY PY?+?+3?9/+9/_^]_]3393333310!!!!!!!!#wES :oLN&3:@J 7, 781$%%7<;$$ 88RY,'""QY44RY?3+3?3+39/_^]3+39/9/9/9/93333333339910 6!23267#"'#"5!4&#"%"7>54&267!/6|PXUL %tvk'sUEtAhV-Kck\nN嬚7leJOkk5*&NH-#H32)kIPYNHOa綴}{,JZO@TLGM (@   ??9/9/993310 ! "!265w+!o>  ~x}vG)%@   //39/933104! >54! .G% +Sced o_  `XPl &"m@'   $#  Y Y ??9/+9/+9/9/9/9/9333310 47'563 '"6527{Y|ג+SrΎ\GE^D4H $qvǃeqifB=N$+u@@  ()(-, OY )RY   %RY#OYQY?+3+?+9///_^]9+3+933333993102632! '#"5!4&#"%3 4&# 267!% vk's[~x}vck\nNՙ5*&o|NC:)P@'   '!+* $RY QY?+?39/+9/3993333339910".54675.5!3265!'2654&#"Hzp^xrebly^rzp}~op||gz&pr%zgzovwn{PN &@   OY?+2993310! !4&# P  ~x+P &@    OY ?+2993310!265!! wx~&*: 2@  RY RY?+?9/+9933310!!2#%!2654&+a\gfn:\HNX: D@ @ Y  RY ?+?39/+33993339910 !.5463!!#";BBrwͽMvؗ: F@   @ Y  RY?+?39/+99333339910!!"&5467!#";xq3нƜwM::@ OY b T D 6 &       v f 6 &  h   t f V 6 &          t f V D 2 $           t f T F 6 $   8        b P @ 4 $       p @&` 0      p ` @   ^]]]]]]]qqqqqq_qqqqqqrrrr_rrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqq?+3?9310!!!!:x:|T:wJ, 4@    /33/99//399333310! 54&#!!267##!J_HWo,|pQDf} 9wR,  D@   "! /2/99//9333333310! 54&#!!267##!3#3#~_HWo,|pQDf} 9wmI.&E@! ""('&&   /33/9////3993333339910! 54&#!!267##!! 54&'!I_HWo,|p~nQ_Vj 4l57wRij:Y=:ZR:]5<R@( PYQY?+?+39/339/99333339910"&'732654&+57!5!)kIYdcwa5碌o,JZTN[PκeU=O#F@%#   %$ #QY!QY?+?+99333333310#"&546752654#"'>32"327۳Ռ}۳Ս|j e=Nk e>JN+I@$&&-,%"  PY(?3+3?9/39/39/9933910%#"'7326?'.546323267#"&'o)0[}@$^.2@6o7,߻-5o6@2._#@|Z1AMUG*.#KCOX22ZP@K#.*GTN:@OY?+?99310!!::j:NF:%@ OY?+?3993310!!!F}:|::8:>@     OY  ??339/3+393333310>5!!$&5!!_c-k:}r C2:/@ OYOY?+?+?93310!!#"&'5326!l:/4F_E$_+8;;D;|eV$ h0 3@   *%?3?39/399339910'!#3 !UU]\.+_H$\\@%     %* *?2??99//]3333933339933105!#!!!!!#3u@#M?*AH7 =@ %*?3?39/]33993333310#!! 4&+3264+!2Į!dZ]tzRQUM8Ut{JD8="U@# $#  %*?3?39/]3333333993339922310#!#53! 3#4'!!24&+326Į!77d5L2ɀ8RQUM];܈RN Y2 C@    %*?3?39/9/39393239910 #33 wg^>\)@ +?2993103!)ݛ*=@ * %?333?339/93333104? # #!?!FHI !  ZtM*hU6Fq/"T 9@    A %*%*?2?3??99333310 #3&53i_  |7tNA#U 9@  A % * %*?2?3??9933331033#47#  _NtJ7|/ %@   &+?3?3993310#"54324&#"326̔ F3&1V@$ # #-'32&&  * &/+?3?9/39/3339/99333333910"32654#52#"&54675.54634&#"3269373# x2-}y 5t>&T+"XP<)&1M@$''+32$%%( (..!+?2233?339/39/3933333310"&546?54&#"'>32327#"&'#3265jx8461&HEP=bY?0(F\wot}'RA2: ps6;lIHp9<65oO&1Q@ +$'32%$$!''!.!( +?33?33339/39/393333331023267#"&54&#"5>32367>54&#"jx4861&HEP=bY?0(F\wot}'NE2: ps6;lIH9<65oO/"E@ $#  A ' *( +?3?3??9/39/993333104673#.5##"&546324&#"326+><PMKSl^ 54&267!jUXl{8;95NYSFfLGc?-4@JKwov|'NE48 qrLLjo[ЋtQ /%65[^]\3 G@ "!  A # *(+?3?3??9/39/99333310#"&'##65336324&#"32Pr AJMMQPMjHAN-Kch|ͼ}{1E@  !   A #* (+?3?3??9/39/99333310.5##"&546323'34&#"3266><ONKS[ϼч~z0K@"    -=(+?22?39/]]q3993333310"&54632!327"!.(MLeLBJKükv[`Y]\09@   (+?3?229/39933333102#"&=!4&#"'6267!yMLeL@JKükv[e[^]\8&?@ $%% %(' ($!+?22?33993333339910"&54675.54632.#"3"3267ncRNPz}@815[enZ=6/J :skKh ZBZtng/6/*63|6;-8<86%?@  ##'&(+?22?33993333339910"'732654춮&#"'>32b: J/6=YogY518@}{Tk8<8-:7|36*/50gnoX& eJkz1 *M@&! ,+ '$((*,?22?3?3?9/39/993333310%"&'7326=7##"&54632346734&#"326 C6NK>=QKLQkb.4cg(KȺɉ` ͦw1&@  '*??2933310#5#𿿿a& D@   #'*?3??9/393333339910#33 RY;323>32#4#"o;H #jI%"iTmpp8HzbgPu6HPXNSSra^(D@! '* ()?22?3??9/399333910%"'52654#"#4'33>32C1#2#DV 'uQu}f/DycgPu6HPXOfl1 %@   (+?3?3993310#"&546324&#"32űůVRTQhոz}.7@    (+?2?39/9/99333310"&'732#"'>32xJ6tےz GG u2d !@    (?329933104632#4&#"2İVRdz2e !@      +?3299331032653#"&5RVǾezҸ0E@  !   A ' )(+?3?3??9/39/99333310#"&'##4'33632#"32Pr@ǘLQPLjH@waN(Tϻz| ;@     '+?2?3339/993333310"5#53733#327]g3Ɂ0VA A%F@    '& (@  "+?33333?9/39/999310#"'732?'.54632327#"&'&i5fU+@87'%K2%~~%2K%'7=;+Tg5i&|.=633:4`=^-hh-\?`4:336=6)E@#  +* )&"+?3?3?9/99333339910#"'##463232654>54&#"tZhs[0NQqpWM;?JGBCKu?#_PV_PF3F\p*@   ')??29/33993103>3#67ʐ @,=t A9+2  ?@ "+?3?339/3993339104&'32'#"&5%'5!EAGTMZdOXȧ<D@OJLfqKw»pg2 H@   "! ()(+?333?3??933333910#.54674632#"6?F[PvaTv  ɼ~qy̯  >@    ' )(?22?3?9/9/33239102?3#/#.#"'6?Wg (i̅#3u*&:O*b1BD[#IF 1x'.x.(jrxxr{-P):@ # +* &/3/9/399333339910%#"'##463232654>54&#"tZhs[0NQqpWM;?JGBCKu?#_PV_PF3F\pLr~1n{&2@ ""(%%/3/9/3993310333#"&'32#4.#".546324&#"32Iv >wwsG3RQVUYTQ4*PO"Wjiֽwsl~v}2ML  N 'n@9 $ % )( $RY$$ !RYPYQY?+?+?+?39/+9/9/9/9333333310"&5!32!632!327#"'"!.XpJul' 9yvckn_9M|-8j@6. )*$44#* :9&)!!!# 7OY 1OY?+?+?99//3?99//3333933333333310"'3632#"&'#!65'"#>35!26734&#"32_t+  %) |+TD ,$ z,ThlqrwuryLe]#z]/@fg;L:4bi=T4-8l@7# ..)**$4:9&)!!!#  1OY 6OY ??+?+99//3?99//3333933333333310"'!.5##"323'5'"#>35!26734&#"326j [s-%) |+TD ,$ z,Turqnozyrd~'  %`_/@fg;L:4bi=+@ #+)  -, Y@ Y   @Y  #OY %QY OY)?3+3?++?9/+39/9/++9/9/9/9333333333102673#'!'"#>3#5354632&#"3,$ z,TE%) |+TDOc))H;|x:4bi=/@fg;q 9HUfO/7>@/%&&"*1++*0//:8 *@?%%  Y 8Y88:@Y::0.RY001,RY11")@Y""+4<323>322673!&'5#"%#" ۉ 5|mf  4l53y"*zg\鰴dTjId 4; h|p{qɠ:4z ogH(?B)O%.@#!""%)%& %0/!! Y&@Y&&)QY))$@Y,PY?+?3?9/+9/+9/+9/+9/39/9/993333333333310!&'&'!"#46754'!3>32>735#"B`p@ 5|mf  9w3|QckZpX)2-4; h{q̳59~AQWQ-7@()**%3 .98""))  Y@ Y%@Y0OY6OY&%%PY?+3?+?+?+39/++9/9/9/9/39/993333333310'!5'"#>34'!3632#"&'#32673#"32 %) |+TD_t),$ z,TppwvoQ/@fg;`j4fZ:4bi={lİO+@!$%% + +-,$$  Y @ Y  )*!*@Y!!PYPY?++??9/+39/9/++9/9/9/9/39933333393103'"#>354'!3>32&#"2673#' %) |+TD  )@XB6!D4iu ,$ z,TE/@fg;hr]->:4bi=N!@ #" Y@ Y@ YPY?+?9/+39/9/++9/9/9/9/99333339310&#"2673#'!'"#>3329[ ,$ z,TE %) |+TDwIMS:4bi=/@fg;`O6@)5233$## *87$$  PY2Y 05@Y00 'QY  QY?+?+9/+9/+3+9/9/9933333333333310#"&'732654&'.'"#467&54632.#"273'gumZe9#*;I ^fddJ]9DX<%M@;A4=4"':^,<BA3<.71#nC68,@)+ %%$++.-**  Y@ Y"$$@YOY(OY?+?3+39/+39/9/++9/9/9/9/9933333333333310"&='"#>3#53733#2673#"'327| %) |+TDX ,$ z,TE327!5!32673#"'!D,%) |+TD?{ )<(,$ z,TEGJ; /@fg;!:4bi=(NO *_@/ !&,+ (OYQY$OY?+?+9/+9/9/39/9/99333333102.#"36!2#"'#!654$32#"cPul][ wnpwO!AJ#xl"ha& 4@  Y /3/29/+99333310!#3!3 Ը,3RW:(Z@  #*) @Y PY&OY?+?+39/+39333333310.54?!5!#".544&#"3265!1<G ,,#ö!D홼>4@D21*30-(,,%#!!/1650&$1.+#$#OY4,($OY PY?+?3?+?39+3?99/3933333333333310>32!#"!3267#"'#7&5#53733#!3:ucqe 6h{e?=Xbb}oR^fc "-Q0C~iXIu#: 2@    PY  ??9/3+393333103!3#!#y{{yX9#:WQ$*f@4)!!"(   ,+"( %OYOY?+?+??9/333339/39/993333333310##"&'#!#5354'!363232!"!Xӱt){{_WEs`^tfZaa˾`j4) ~ :I@#      PY?+?39/3333399333333310##"&=#53!!!3267![``[h`mggg)| : 'e@3 $%  % $ )(%  PY!OY?+?3+39/33333993333333333910##".'#5367#5!!.'5!#3267!NPp2MROQ5nu mjˍˍh6sQJw9f3xxW#.c@4  **$0/!!!'OY!-OY PY PY?++?3+?+??9/39/99333393310#"'532=#"&'#!65!36324&#"32WKW:/#+t+ _lqrwur! }Ge]#z]bTW!,b@4""(  -%OYRY *OY  PYPY?++?+?+?+?9/39/99233333102=#.5##"323'!3#"'54&#"326J [s-qKW:$urqnoz}T~'  %`_ #W"\@4""  $#OYQYOY RY PY PY?++?+?3+3?++93333323103#"'532=##5354632&#"3kKW:/Oc))H;|8 }T|q 9HUTN"O1;@G'/-  /2/ 7 =<$ .PY5OY9OY$'PY$)PY$QY?+?++?+?+?9/+9/39/9/9333333333310"&'%326=7##"323467!!#"'5326=#4&#"326TcPul][  ΐJ3(5-2wnpwN!AJ9k  #xl A>%ާWq[@   @Y  RY PYPY?++?+???9/+9933333910#"'532=#!!! 3q@W:/@y.)lM }TTjZ JW#4@  RY PY PY ?++?+?933102=#!3#"'5{@W:}T WO2o@<$22+)43+ .PY+RY+"%PY"'PY"?++?+?3+3?3?9/393333333910!#"!4'!3>323>323#"'532=##" Uk  4l53yu@W:/Tj_Hh|p{q }T_WO$Y@/"   &% PYRY #PY PY ?++?+?+??9/3993333333102=##"!4'!3>323#"'5bf}  9wn@W:}T_Hh|p WQ$.V@/% * 0/""'OY"-OY PY?+?+???+9933339310#"'532=#"&'#!4'!3632#"32WKW:/#+t)_pwvo" }GfZa`j4lİEWO"U@.! $# PYPYRY!PYPY?++?+?++?9/39933393102=#4'!3>32&#"3#"'5  )@XB6!D4iuv@W:}T!@W:/})8 >& }T:2)`Wp:d@    @Y RYPYPY?++?+??39/3+9/993333339102=# ! !! 3#"'5N/1@W:}Tx/ b DW:J@(  PY  PY PYPY?++?+3?+391033333#"'532=!5!5!!ǝ@W:/l )JM }T\3232732>5/:W@KJvJTNI )0 PbR+G;Bm>T} GcVի7jgGR̸v[EO#H'2i@9$$ . ( 43  PYPY +OY 0OY$PY"PY?++?+?+++9/39/993333310"&=##"323'54632.#"3274&#"326~[s-aUK=7/:purqnozW'  %`_rFG2}  ̯PWN%v@@"  # '&" RY"!H"""RYQYPYPY?++?+?+9/_^]++9/9/99333333310"32!327327#"&="!.J Jul' /:W@f~ckn!  } a(|EWN2g@5*&$0 0&&43 $$ 11 RY !QY-*PY-(PY-?++?+?+9/9/9/99333333339910"&54675.54632.#"3"3267327#"&= {}ܵbNHNYPHl/:W@]ib~DLC32#"'327#"&5&kIPYNHOa綴}{k^/:W@LJZO@TLGM32#"'327#"&5_ `XPl ҃ k/:W@cSckved o_9y} W J@)"!!PYPYPY  PY PY ?++/99//+++339339103267#"&=32654632&#" nOW37HB=YB*MGB bPu0ȵXkW:!V@-    #"!PY RYPY PY?++?+?+?39/399333333103265!3327#"&=#.'##"&5f}/:W@k:㯉D{} M.W:&f@5 % %(' "PY"PY"QY"RY"?++?+39/+9/9/9/9933333910%32654.+5!5!#"'327#"&5) y_tq?f?MH/:W@Vi[fIR%*P-=@ /2!K@  #"  A '*(+?3?3??9/39/9933333310#654'33632#"'32#" ><ONKSbRİñH&,:qEkB+DVRTQeϼaEV18D!!Pqeho6l;@   *  #'?333?33?99333310##5354632&#"3Ellkk4E5$^tPic .-=5@    '?9/2333299333331033##"'53265#5llkk4E5$Plic .-0m,8@  #*??39/39/399333310#"&5332653#7 'uQw{FTXOU}_l <@   '* "?3??9/3339333333310#5333#53YRRTTI+Ն1'*??93103#11'*??93103#1l 0@   '*??9/33393333310#5333#YRRTTI+ՆsG@    '"  *)?2?333?3?393333333107"&546;33#5326=#"p~Fjj25'Mb)zifsj <;)R!-? " " )?22?93310%"&53327kqX&"SrLXP1@ "* )?33?3?93333102=#33#"'5VXpSqj%A VX;ir B)'*?3?99310!3!)(/T-Y@-!-&/. '*)("$)?33?333?3?9/39333393104#"#4'336323>32#"&'53254#"o;H B%"jSmpqjW 'Xp8JzbgPu6HPURsXs`^2Q H@  "!  ' )+?333??339/339333331032653##"'##"&533265o9J%kI#%iRlpo:ITycVGXNTt_$ B@   "!'* ()?33?3??9/3993333104'33>32#4#"#"&'5325 'uQu}DVrjX"&X:u6HPXOyc1sX7v B@  "!  '*()?33?3??9/3993333104#"#/33>32327#"&5GT 'uQw{X' Skp}_gPeFHPXOXs0 9@   A '*' *?3?3??99333310##3'3ʱ3JH{u1 ;@  (+?3?39/39/99333310#"&54632%"!&27!űůWhոA-L@   ! ") (+?333?333??9333333310%.546734&'>%õȰYZW\\WZYԲ Ѵ~yx~11E@*&0   &0 32%(#+*(-)?33?33?332993333331032654&'.54632.#"#"'327#"&=HVTE@Bȅ @DDD3?t=dDX#$A/kp6-,+&, &obm{kc0-$*!' &<[Gq| QY s()@   ",?22?339333107"'532>54632&#"x@)*, %@)40.2>~ @I~ I@    '+)?33?3?3339/9933333102=.5#53733#327#"'5PQX]gU!6IX1g!L@!CJQ/Zmk\-QKD!AK3%@   ' +?2?3993310"&5332653u:JJ:ۖ>]]]]++/@  ( '+?3?3?2933102#"&53324&#"5>qp:J/.-"YJ`aAaM #@    *'?2?3339103#&'#Ɂ(3$TR +@  '*?2?3993333105!5!!RZyߏ#14=@    ' *)?33?3?39933333310327#"&=!5!5!!W"&C.koHo&X s7ߏ$2[K@   ' *?333?39/39933393993107!5!5!3>32+4#"322$o&RUXg~s,^6!;'oJDߏ#udXei/`Z267'?@    ')?3?39/9/993333993102654&+57!5!#"&'7wYIn}E~e UEaoea GG8 5@ " +?3?39/399333310#"!22!"!.=|A?<dT"nU  /2222105375353;3$%r!nU  /22221053%5353s;L!%vyNX+/310"&54>54.54>54#"'632X_a % % %+%,.23F33NK&u'   0%'#!  /39/310#"#"&5332>;6>jhl?x}n)ZdsC&7$"(": /310!7!;IS: /310!%7!:I;: /210!'!_I֘: /210!'%!:I_.X@ /99//33107'%6J{w~X@ /99//3310''%7J6\~w{Wt@  /3210'33>32&#"p^-* $4WUN(-e99ok /310%%!VOOW @   /39/21057'5373ߞ!NP~OO!3W&$@ %+55%+5+53+&$ @&a%+55+55<&&D <@@@&ABA6%+55+553+&$ @ &%+55+55 &&D <@ BB&88=%+55+553+&$ @''&(<(%+55+55<u&D <@LL&M%M=%+55+553+&$ @00&$%+55+55<&D <@ VV&W޴WQ%+55+553+&$' "@%%&+5+5+5<&D'  "@?:?@%::5%55&+5+5+53+&$ @&!%+55+55< &D <@ 44&7ߴ7?%+55+553+&$ @&!%+55+55< &D <@ 44&7ߴ7?%+55+553+&$ @&%+55+55<>&D <@ 44&7޴7?%+55+553+&$ @&$$1%+55+55<+&D <@ 44&77X%+55+553&$'  "@%%&+5+5+5<&D' !"@C;CD%7)7?%44&+5+5+5&(     %+5P-N&H *  %+5+&(@ &  %+5+5P-&H g@ ((&%$ %+5+5&(TV@ &" %+5+5P-&H@ #&##0 %+5+5+&( @&n %+55+55Pu&&H <@&&&'b' %+55+55+&( @ & %+55+55-&&H J@ ((&# %+55+55+&( @##&$=$ %+55+55PDu&H F@22&3N3# %+55+55+&( @,,&  %+55+55P-&H Z@<<&==7 %+55+55+&('| @  % &+5+5P-&H' *@    %&+5+5Q+&,B@ &  %+5+5P& -@ & %+5+5&, %+5&L   %+5T&2  %+5PN&R D%+5T+&2H@ ((&#%+5+5P&R @ $$&$ %+5+5T+&2 @%%&&d&%+55+55P&&R q@""&#d#%+55+55T+&2 @ ''&"%+55+55B&&R u@ $$&%+55+55T+&2 @00&1;1"%+55+55Pu&R v@..&/K/%+55+55T+&2 @99&!!-%+55+55P&R x@88&993%+55+55T+&2' "@%##%&+5+5+5P&R' D%!@!"%%&+5+5+5T&b''&##& %+5+5P&cvK%%&!!$ %+5+5T&b|''&$@$' %+5+5P&cC%%&"7"% %+5+5T+&bI11&'', %+5+5P&c ..&%%* %+5+5T&b +&++8 %+5+5P&c)&)v)6 %+5+5T&b ##% %+5PN&c D!q!# %+5{J&8  %+5\:&X : %+5{J+&8@ !!&%+5+5\&X @ %%&! %+5+5{&q!!&n %+5+5&rvw((&$$'"%+5+5{&q8!!&!%+5+5&rC((&%%("%+5+5{+&q++&!Y!&%+5+5&r 11&(g(-"%+5+5{&q %&%V%2%+5+5&r,&,f,9"%+5+5{&q T%+5:&r :$B$&"%+5#5&<" & ̴ %+5+5Wh&\C& %+5+5#5&< ~ %+5Wh:&\ #5+&<@ &%+5+5Wh&\ I@ $$&  %+5+5#5&< V&%+5+5Wh&\@ & , %+5+5P0&cd**&/ش/&%+5+5P0&cd++&//&%+5+5P0&cd@ **&//5%+55+55P0&cd@ ++&//5%+55+55P0&cJd@ **&//4%+55+55P0&cJd@ ++&//4%+55+55Pz&cd@ **&99F%+55+55Pz&cd@ ++&99F%+55+553&$ &+53&$̉ &+5'$, &+55'$, &+55'$, &+55'$, &+55D'$,P &+55D'$,P &+55M0&gd@ ..&3 3* %+5+5M0&gd//&33* %+5+5M0&gd@ ..&339 %+55+55M0&gd@ //&339 %+55+55M0&gd@..&3638 %+55+55M0&gd@//&3638 %+55+55'(  &+5'(  &+5^'(X &+55^'(X &+55^'(X &+55^'(X &+55kXd0&i@d@ &#5# %+5+5kXd0&i,d@ &## %+5+5kXd0&id@ &##) %+55+55kXd0&id@ &##) %+55+55kXd0&i^d@&#8#( %+55+55kXd0&i^d@&#8#( %+55+55kXda&i,K@&--: %+55+55kXda&i,K@&--: %+55+55'+  &+5'+%  &+5'+X &+55'+X &+55'+X &+55'+X &+55'+X! &+55'+X! &+550&kd&  %+5+50&kd&  %+5+5I0&kd@ &˴ %+55+55I0&kd@ &˴ %+55+55q0&kd@ & %+55+55q0&kd@ & %+55+55va&kK@ &ڴ+ %+55+55va&kK@ &ڴ+ %+55+55x', &+5x',% &+5',X &+55',X &+55',X &+55',X &+55',X! &+55',X! &+55P0&Rd@ &  %+5+5P0&R!d& %+5+5P0&Rd@ & &%+55+55P0&Rd@ & &%+55+55P0&R2d@&  %%+55+55P0&R1d@&  %%+55+55G&2d ##&+5G&2d ##&+5'2 ##&+55'2 ##&+55s'2 ##&+55s'2 ##&+55T0&wd& %+5+5T0&wd& ݴ %+5+5T0&wd@ & &%+55+55T0&wd@ & &%+55+55T0&wJd@& " %%+55+55T0&wJd@& " %%+55+55Ta&wK@ &*ش*7%+55+55Ta&wK@ &*ش*7%+55+55a'<,% &+5'< &+55FA'< F &+55'<X &+55Qq0&{d@ --&22) %+5+5Qq0&{d..&22) %+5+5Qq0&{&d@--&228 %+55+55Qq0&{&d@..&228 %+55+55Qq0&{"d@--&227 %+55+55Qq0&{"d@..&227 %+55+55Qqa&{ K@--&<*- %+5+5kXd&i&Դ %+5+5kXd&i9h@ &\ %+5+5 &k&  %+5+5&k9@ &   %+5+5P&R&ʴ%+5+5P&R9@@ &*%+5+5T&w&%+5+5T&w9"@ &%+5+5Qq&{--&**- %+5+5Qq&{9L@ --&)G), %+5+5PW0&c'd*@ *%%))&+5+5PW0&c'd/@ /*%**&+5+5PW0&c'd*@ *5%))&+55+55PW0&c'd/@ /5%**&+55+55PW0&c',d/@ /4%**&+55+55PW0&c',d/@ /4%++&+55+55PW&c'i@ **&99F%+55+55PW&c'i@ **&99F%+55+553W&$' &+53W&$' &+5W'$,& &+55W'$,& &+55W'$,& &+55W'$,& &+55DW'$,&P &+55DW'$,&P &+55kWdN&i',@ # %&+5+5kWdN&i',@ ## %&+5+5kWd0&i'd@ ) %&+55+55kWd0&i'd@) %&+55+55kWd0&i'^d@:( %&+55+55kWd0&i'^d@d( %&+55+55kWd&i',i@&--: %+55+55kWd&i',i@--: %&+55+55W'+'  &+5W'+'  &+5W'+X&< &+55W'+X&< &+55W'+X&< &+55W'+X&< &+55W'+X&< &+55W'+X&< &+55QWq0&{'da@ --( %,,&+5+5QWq0&{'da2@ 2- %--&+5+5QWq0&{'da-@ -8 %,,&+55+55QWq0&{'da@. .8 %--&+55+55QWq0&{'da-@ -7 %,,&+55+55QWq0&{'da@.".7 %--&+55+55QWqa&{'Ka<@ 5#5"6/8ǰKzO9h?W -@   @YY?++99310327#"&=3!,5HU! QG, @  /2933910#>5#5"6/8ǰKzO9h?$@    /22333310".#"#>3232673(PLD%) |+TD)RKC,$ z,T#)#/@fg;"*":4bi=!B@! # "  /33329/33333993310".#"#>323267353!53(PLD%) |+TD)RKC,$ z,T[u #)#/@fg;"*":4bi=kWd&i'@  %&+5+5kWdN&ikWd&i'9^@ R %&+5+5kXd&i@ "&""/ %+5+5kWd&i'@ 00= %''&+5+5C'(&p%+5+5O'(9|@ %&+5+5/'+ &+5E'+9 &+5W=&+  %+5, *@    /299//99339310#>5#55!"6/8jĚKzO9h? %!, *@    /299//99339310#>5#55!"6/8j>ĚKzO9h?!$%, $D@ &% !!&%    /299//333333933910#>5#5%".#"#>3232673"6/8j(PLD%) |+TD)RKC,$ z,ŤKzO9h?B#)#/@fg;"*":4bi=W&k &  %+5+5OP&k &  %+5+5e&k&j/"@& &  %+55+55+5e&k&j9/"@& &  %+55+55+5&k&  %+5+5t&k!@ ++&ش  %+555+555&, @ &%+5+5N&,C@ &%+5+5/@', &+5O@',9 &+5, ,@   /299//33399310##.=5!j8/1'E?h9E~Q %!, *@   /299//33399310##.=5!j8/1'>E?h9E~Q!$%, $J@ !! &%  @ H  /]299//+3332932310##.=%".#"#>3232673j8/1'(PLD%) |+TD)RKC,$ z,T?h9E~QB#)#/@fg;"*":4bi=T&w&ִ!%+5+5TP&w&ܴ%+5+5T&w'/j'& @ %&+55+55+5T&w'j91/'##&@ %&+55+55+5yWN&s+""&'' %+5+5yWN&s/##&'' %+5+5T&w&ٴ,%+5+5T&w!@ 77&״,%+555+555#5&< J & %+5+5#5&<SD & %+5+5'<_  &+5r)'<9  &+5'3 &+5  ,@   /2223993393105!753!53Eq^ %!  ,@   /2223993393105!%53!53PE^!$%'@[/?_/]q+9105!{E %!QWq&{'a)@ )- %((&+5+5QWqO&{` 4!4. %+5QWq&{'9Va@ Q(, %((&+5+5Qq&{@ 1&11> %+5+5QWq&{'a@ 11> %((&+5+5F'2, &+5G&2d97 &+5F!'[  ''&+5Y&[B97 ''&+52W&[ 0$0* %+5/99105!E!$%, @    /3933910##.=j8/1'?h9E~Q*//3310#*T 0@   /333/9/3333333310#'7'77'*T7777Y7887 4@    //99//3333333310'7##!'77RJ77}m}8L( 0@    //99//3333333310##'7!(R77J}78}o@ Y/+33105!s>4@ Y?+99105!>@ Y?+99105!@ Y?+33105!MT'BB? #@   [[?++93331054673348>E?yMNH? %@ [[?++933310#65#!1<yT (@  [[/++9333310%#>5#!39?G BxOLI? #@ Y Y ?++993310##.=<1Sy?h E@$       [[?3+3+399_^]33333310546733!546733C69>E348>E?|MNHyMNH?h I@&  [[?3+3+399_^]33333310#65#!#65#!h3:R2;yP}Rh N@'    [[/3+3+399_^]3333333310%#>5#!#>5#!h49;JR2;>EBxNGL|PNH{?r&v :@  Y [/?+3+39333333310#5!%LMJxsh@$   Y @ [Y[?+3+3/+3+39333333391053%%%%#5UUTVdd3A}  /3/9910#"&54632ywxzyzz1 .@  [/33+33933310!!!!!! XS 111@ /3/33310#!*SmOM)/3/333105!#MSO @ //9/3333310###!T 0@    /3/9/3333333310###!!!TuO .@    /3/9/3333333310!!5!###uTON)%1<H @C::4,##& =4 4IJ/F7FY)@2@Y272[ 7 Y [YtJfJVJ9J+JJ JJJJJJJ{JmJTJFJJJhJJJJJJJtJfJIJ;J-JJJJJJJJJ}JdJTJFJ)JJJJJJJJJ{JmJIJ;J"JJJ7JJJ@nJJJrJdJVJ9J)JJ JJJJJJJyJkJ]JIJ;J$JJJJJJJJJtJfJVJ)JJ J_^]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]qqqqqqq???+++?3+3+3+39939333333322310!#3% #"&5464&#"326 #"&5464&#"326 #"&5464&#"326~,1;4i1;4 |nh|nk|nl~|nk|nh|nkUz@[?+993310!U@2zUz&%+5z#'h'\\L1@ [[?+33+99333310%53^iGo%#]M1@ [[?+33+993333107553]#in%G&- - %+55~,T@ Y/+3310!5!,R??3310+3 I@%      ???9/9/9/9/9/933310!!!!    N!p:@      /33/9/33333333333103#5!#3###TOON 0@   /3/9/3333333310!!!##:QTN//333210#!*T&n @ //9/3333310##*TG 2@   /3/99//333333310#'77'*TT~~~ݵqqp .@    /3/9/33333333103#5!3###TON# <@ Y ??39/33+39933333310#5!53335232yV1:44A" O.puk` X@<5>.+p *@  Y ??+39939310#467!5!pdpfCŠ-y!*X@,    "&,+ $ $Y (Y(Y?+?+9/+99993333339910#"&54675.54632'4#"324#"326yV>32.<>I#cJnkWC`["/A:lyOic0ii1hrwq1v0hj kt@D ! aYaYaY    aY?+9///_^]^]]]3+3_^]++93333310!"5432.#"3!!!!!ܯ VQdvfsuni#% K[Ťκ޺T"(-@:  ")/.,,     aY ++ ## %!aY @Y  &_Y (aY %%_YY?++3??++?3++9/9/+9/9/9/9/99333399333333107&5%7373&'>7#7&'&'61,!FH+J(`0MM>Y>I?O_:o`=<pkgzaG?.{va\e z% xTT,v@< !'&&!!.-''$$$$ $`Y_Y$$*_Y$`Y?+?+9/++9/39/9/9/9/9933339933104'!3>32&#"67# ! .#"}ro  )@XB7 C5iuYQfT!DZ2Shr]-F'aZ[txGj}D}@N     _Y _Y  _  _  ?0P`*   _Y ??+99//_^]^]^]q+3+399992223310!!!!!#53!}:もtо^/@"&'/ $' ' ++  10' Y$ #@$Y /?   uY++tY@//H//?3/+]+3?3/+99//_^]3+33+39333933333339910#!5>=#535#5354632.#"!!!!!267^җJKD"ԩ,RB[PMi|hkk+KjIphϊ/MFs}Qpd;c^<)*`@2 ''( * (,+) #PY ( ?33??3+39933333333333105#"!4'!3>323632!#"!5uUk  4lIӣ4BUkJHh|pyQ_K#&)@R! ')  $&+*))((&&# '%Y ?3?39/33_]39/3339/9/9/99333333399103!!!3#3#!!!#535#35#3'##3'pQyqqqqpppnUM:N/+@ppڈKKڈ{"KT$@:VU *))E8L8#Q ?>>0##VQ OYRY??;;B@YQ;;Q-POY -&-@Y**&VVWV9V*VV VVVVVVVVhVXVIV:V+VVgVVVVVhVYVJV(VVVVVVVVzVkV\VIVV VVVVVVVVTVFV9V+VVV7VVVVVVtVfV9V)VVVVVVVVVtVfVIV=V&VVVV@VVVVV0V"VVV^]_]_]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]qqq_qqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqq??33/+3?+9///+3/33/+3+9333339333333399910%#"&5#5+#!23733#327%#"&'732654&'.54632.#"4&+326JI}qh8ݘn:VX}(3$&³YO]HAK{sN0 I?EC:H{EuKSz{qdo[QE9Kx=0'*"*%:V@sy|04$"$Bgzo$t q =}@C100#7*   *?>71#--4QY- QY_Y _Y?3?+9/3+?+?+99333992333333310!!!!2 4)!26#"&'732654&'.54632.#"Q}|C'gumWhY ^fddMZX˔"`pН%M@;A4=-Q`BA3<076T#'+.14v@A4./65/..3!'+2 -1["$(  ?3?339/33_]39/333993333333339103#3#!!!#53'#53!!!!!#3!37#3'##!7#3'$i#qgfq#ig+ZA]J_;W+ c A!A"=VE!ڈKKڈpp<^X@  9A BY: BY9:??+?+99//?93333102#54.#!#3!2>53#].mu>uh-n?'!=R~(,i@7  +$,+,.-! `&@ H),,?/]3+299//]9333399333333333333310533##.5#"&546325'5#54&#"326!!__EL!SSMSQV/jbbwk^HPǶ;ACtwu~r~ O'@$&""  ()& Y# !@FY/?   sY/_ sY@P @?3/]q+?3/_^]+99//_^]q3+33+39933333333339310%267#"#73'7#73!2.#"!!!!HV (Mu(W?ƶ TJciGT\R 38JR83N@'    _Y ?3?39/33+3399333333339103!3!!!!#!#p'J1Xe#N}pM44b`bo@7     _Y?+3?9/9/9/9/9/9/9/9/933333333310%!5!!%%!55%5/98EE/v\vvvj,4?MX@+N3)N@&FS)&NF = 8 YZ IY:Y#PY@@Y)+#&@@&#+)2BY5VVY?3+3?+9////////++++3339233333310#"'!67>32#"'#"&54632756$7>732654#"%32654#&#"326lBA%,r&d߫\hjU OZڊW#urWgP?NdGN:zyqsphOY:N,73 :R=IiDKu߂\NHg8^b"85%8 `>Khy{Xks]]t$;*2,SW6".r@#,  #)   0/,,@Y `Y aY &aY?+??++9/+9/9/9/3933339102#"'53254&''!7&5464&#"76ퟪlx,\WKs:D[23(*-),@Zg&vU/\248/wbaV$)@-&"   %$ +*$#  %@%Hp/h))?3]?9///]]]q+333q3333333399333333333333333103!23#3##!!#535#'!!27!!&#!wy-]GHb1www4CDU,y#0y$yS((S[[QT2%~@&  "'& _Y@Y##_Y "_Y_YaY?+?++?3+3+9/+9/9333333333910$%53.'>75#5!#A1?!j`7d̵yFCo}{ RUp- 3 3#!!327! #53>7!d~ 0!X/IM%x#N, 2:5}ʿ/G6&a[1Gc(T2!g@  #" @Y`Y `Y_YaY?+?++?3+3+9/9/9333333310$%53.'>7#6(>ij1Pȧˠ{?Dn}{G^v/za  A6%)5_@8 0 *') 76(&#-Y#Y3Y YY Y?+++99?+++??933333310"&54632.#"3267#"&54632#34&#"326B;UEFTFPUTҿ69ujzjkT00NɶET+){@;$  +*'Y!Y       !Y /+]?33+?399//_^]]99//_^]++93333333310!5!!#!&53#"&546324&#"326{Z)B6@A;954&#"!5!2&5;fn= ǵȝ@nga 5N˦L `-@X|HP@ !   YYY?+?+9/+9/99333310"&54632!3267.#"k2UNHbܕ3Wu"6Fl~*z5Au/36@L"!!30 '12420 87" "( %Y5Y53352 Y 4!Y?+?+/9////++9_^]]39333333333310'!#3 # '732654&'.54632.#" #3VWfd2ƾ;i]^][xAPN!=qrE"gƑ:|P|F=.9,8@eLz}l}98[%1@T`: <@ PYPY?+?9/_^]+9933910)5!5!5!!#^^'&{ uI3^''uItrH&{ 'L@  ]5]5?555TH''Lu(@  @]5?555gH''L2@  @]5?555H''Lx$@ @333 3@3]5]5?555<#Nd^D @    /99339910#&'5673!9>HH>9)CI$ICV $@   /2999333105673&'#CI$ICV9>HH>9#d^D @    /99339910&'3#67!59>HH>9#CI$ICV $@     /299933310%67#&'53+CI$ICV9>HH>9d^D.@    /993399339910#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC:@  @ /299299933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9H>@   /2992999333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>95*E@#%+, !RY (OY(OY?+?+3/9/3+99339210#"&546323654&#"7632.#"32OʀwyLzjo5w%-asV7@lCG>^~+VL@(9K]uial+ @u     _Y p ` P @       P 0 O  9    ` @       p P   ]]]]]]]]qrrrrrrr^]]qqqqqqrrrrrrr?+?9933331035!!+p HDV"O9$@ `Y/2/?+993310!!!C9TH9D b@  @% H_Y  - H _Y/+9+_^]?9/+9+99993223105 5!! !^qK9G8U9X@ Y?+99105!U9D@ Y/+9310! 1jT@`  Y     o    _ /  ;       p   o O ]]]]qqqqqrrr^]]]]]]qqqqqq?/9/+3339933310##5!3p7PHm+Y@&   ,-# #Y ))@Y/?O?O/]q33+3/33+39939210#"'#"&54632632%"32654&.#"326mzʑgAŘx^,cFEYV5Z32#4&#"tтwgĠ9'@ PY PY/+?+933310"&'53254632&#"+\B5ԾXC2EMP9e^+97,K@+ * -.)!!Y!['Y Y [Y?/]2+++3/3+++3993310"&'&#"5632327"&'&#"5632327.KKYCvFn5|yOr?xTKK\GwAqSLfFr@u)/'1T0+\-#,-+-T. \,$%H+|@S     Y     P  @ P   Y@H/+]q3+3/_^]q]q3+39933910#7#5!!5!33!!́ՁGZӃ#JdGP T@  Y @ Y @ Y?/]+/_^]+9/+993333105!5!5!d8d13 ;@  Y0@/]3/39=/33/+99333310 5!1@wAZ13 9@  Y0@/2/]39=/33/+993333105 55!1?7 $@ //9333103 %! {RVdG)@Y?_?/]/]+993107!!d>T"@  //99310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //993103#"&546323265";N2$! =/'5)%3%Y?+33105! %iH[??+3103#ؑHK&[Y?+?3+310!!#(in&[Y?+?3+3105!# (%%H$[Y??+3+3103!!Hn%H&[Y?+?3+3105!3 %H-[ Y??+?3+33103!!#iHnnH,@ [Y?+??3+33105!3# %K/ @ [Y?+3?3+33105!!# i%n%H/ @ [Y?+3?3+33105!3! %nH ;@   @ [   Y?3+3??3+3333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH([[?2?3+3+3103#3#ّhHK Kj < @ [ YY?+?+?33+3310!!!!#(iijב" 8 [ [  Y ?3?+33+3+310!###בnn#j D  [ [  Y Y?+?3?+33+3+310!!#!!#htjo"j :  @ [ Y Y?+?+?33+33105!5!5!# i(qב) : [ @ [ Y?+3?33+3+3105!### ܑב%nj D  [ [ Y Y?+?3?+33+3+310#!5#!5!ґttj)F)ޑqH 9 [  YY??+?+33+33103!!!!iH"ב%H 5 [ [ Y?3?3+3+3+3103!!33A$Hn#nqH D [ [   YY?2?+?+33+3+3103!!3!!ّK$hH"qH :  @ [ Y Y?+?+?33+33105!5!5!3 iqב)%H : [ @ [ Y?+3?33+3+310!5!333$ב%nqH D [ [  Y Y?+?3?+33+3+310!5!3!3!5!$KqFH A @ [  YY??+?+?33+333103!!!!#iiH"ב"H ? [ @ [  Y?+?3?33+33+3103!!#3#AHnn KH P   [[ Y @ Y  ?3?3?+?+33+3+33310#3!!#3!!jt " "H ?  @ [ Y Y?+?+??33+333105!5!5!3# iqבKH = [ @ [ Y?+?3?33+33+3105!3#3# 㑑h%K#KH O  [[  Y Y ?3?+?3?+33+3+333103#3!5!#!5!A㑑tHK )ޑj B   [ @ Y Y?+3??+33+333105!!#5! iiq"h @  [ @ [  Y?+33?33+3+33105!!### ב%nnj S @ [[ Y Y ?3?3+3?+33+333+310#!5!3!!#!5jtttAޑ"בqH B  [ @ Y Y?+3??+33+333105!3!5! Aّ"%H @  [ @ [  Y?+33?33+3+33105!333! ב%nnqH R   [[ Y  Y ?3?3+3?+33+3+333103!!3!5!5!AH"oHZ@  @ [ Y Y ?3+3?3+3??33+3333333105!5!5!3!!!!# iiiqב"ב"HV@    [@ [    Y ?3?33+33?33+333+3333103!!###!5!33AבHnnnnH m  @ [  @ [@ Y Y ?3?3+3?3?3+333+33333+333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{8@mmUE- yylTD, xeM5dL4qYA)}}pX@(|aQ9 `P8u]=%t\<$|xiI1!hH0 Ygckhk@ Yd`h_[WTW@ Y\XTSOKHK@ YPLHC?GDG@ Y@n?o*Z+[BrCs.^/_FvGwA&.6>JFF'/7?KGG@ ۸B@JzK{AP#+3;OCC"*2:NBBQӸCи@ԯ?<;87{{|4xgkosw3ccdhlpt0`OSW[_/KKLPTX\,H7;?CG+3348<@D(0#'+/' $(,$ #  KH@Ԩx`H00H`x DAGO   L/333/3339//////////333333333333333333333333333333333333339333333333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQD@lFh| OoLldi}SsPp`"eWwTt\&a# +P;;Xxؿ)H*99]'A!/L?? ,Q<%D.55 &I+648<@DHHA 0M@@6<@ؾ FKk A R"E/2226:>BFFSֹ:>Gʽɹ59ȹ48+/D*.C%)$( !@ ?| {~ osw <knrv ;jj\`dh[_cg@OSW8KNRV7JJDHCGLP@&4"&*. kKKk  ׹;?HKO@ 3 $(,0/333/339///////////3333333333333333333333333333333333333339333333333333333333333333333333333333310!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  /993310!!!7L17}1mi{/9910!!imi{@  /993310!!!iLPbh//9910!!hL//910! XVRZ//9910 7L//910 LRZ//9910Z79e <@  /3?39=/333993993333210!# 3 .h=h!!-.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow@lPhhTl8xx<|(pp,t ``$dHH L@@D0044DLdt|lX\\JrrNvBzzF~2jj6nZZ^RRV::> **.v~n^V>..>V^n~vf&fb"&/3/39///////3333333333333333333339933933333333333333333333310#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @  /]99102#"54>jnrotjlw)@ /9933103!32>54.#")vwvvvwvu}Avvvuvvw)#,@ %$ /993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @  /993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:p@? :6+%%<;("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332993993333210"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7T@15  **.&"## 9810/+*?*O**/^]]]]]93333333333310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'V@2$  )(P   @%(H/+^]2qr/]329333333310.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8>@!0,'6!'!9:,*3$$$-  **/^]]]9999339210&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<48@4((56$+/     //99//]92393310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@   //9310./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @  K  /]933310&&'6H zDS%Ut}FiGfY;,@  //]9/99333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt _@5 "!VC 6% X ///33]33^]]]]33]]39333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu0o@6  !   //9////333322993993333333333210##57573%377```>`b?YY]]9mbbb a@1   @   _Y?+?9/3339/_^]33399333339333103!!!!!!!#535# 'kky%U@*   OY  OY  ??9/3+39/3+39333333333103!3#3#!#535#{}}}}{{{.Cd@  Y@ Y_Y?+?9/3+9/+39/9/993333910!!#"#>;!32673#5*',WJ'(. qgZ2I~h?2I\@0      _Y   _Y?+?9/_^]+9/_^]3339333333103!2#!!#%4&#!!!!26y}ى烃9w"_ՉtWgmvˉ{W R@, "!_Y `Y `Y _Y?+?++9/+9933333910!!327#"&5!2 4)!26Q5=D$z#}|OM  ˔"`p ..&''#-Y<6@Y#+RY;PY5PY#Y#?+?+?+?+???9/+3+9/39/9/9/9933333333333910.54673"%>323327#"&'###>54'3_323#f}9ws^kmh|phR@(     `Y?+??39/9/9933333339910!#!!! 3#c'{XthnZ@   @Y   OY?+???9/+9933333993310!#!!! 3#};y.#oTjZ*=h 5@    _Y _Y?+?+933310#!5!5!!R#h3Dh: =@   PYPY?+3?+3933310)5!5!!#n )J\T~@@    _Y _Y?+?+??9/9/9933310!5#"$5!273%267.#"hТzMۤ@ym<=WQeFUcN3/+.+$N9@  PY PY?+?+?9/39933310.#"!!?>32)(1})8"(y*qz;)8:2vw|ThO@)    !   `Y?+?3?39///3393333333102&#"!&'!!!7>h~d1./3 )+DJ*"O#9</l}rH"tN@@ !     OY ?3+3?3?9/39/33910)&'!!?!7>32.#"!׬ #4-vqzd)(6-n:Ju|4F yT(9#jN#o@"     %$"@ Y"" OY Y @ YPY?+?+?9/++9/+933933310%>!!'7'&546324#"65 >&qy=~ jTa,N2K)`-*VPvzf]7}OsIH%*/1'@ `Y??9/+993310!!!!'f\,:'@ OY??9/+993310!!!}:T1:NmN #9@# #%$OY##OY?+3?+?93333104&#">4>32! 4>3^HO:6z+R}Zm͌Taw>JVSt{M,0 PMX$@ //99//9933105%5%P,e?/9/310#3#53Êݧ/9/310#53'T&axa0*buc[  /3210#53!5T0턄[  /310!5!53 [gD @ //9/39310!#!53gR$X KgD @ //9/39310 #5!3!g$IK $@ //99//993310#!! & P|$@ //99//933310!3! |$@ //99//933310!3! |[4   /239/10!##5##ㆡ4_  /339/1033533!p_DŽl@ /3233910#'#3~vl':"@ /99//933310!!   U#)@  /329933105!5!UrrJ`/9310#!f &a??9310#!d#%?#R[@2   QY OY  SY?/]]]?+?3?33+3?+9933333333105!!!#5354632&#"39螞Oc))H;:||q 9HU#RN@+ QY OY ?/]]]?2??3+3?+99333333310!!!#5354632&#"3:螞Oc))H;4||q 9HU&& 5X  ??3]210#"&533265XJA>M㚣CXXC&& ' jj}@O ? /   ]]]]5)BP)qP F1  '=Z}w(@  AY7?+39310!!!!}T9#F&9#F&9#F&'3@"@=`U@;$]]]]]]]]q5]59#F&'3@"@=`U@;$]]]]]]]]q5]5BP&BP&BP&P/@[;+]]]]5]]]]]5R&?&L+@P?/TD4]]]]5]]]]5)q&&@TK$]]]]5& &&F&  @    @H +]]5'& P&   ]5F1& @ tD4]]]51+&'@TD4+]]]]5H& ]53%&@tD]]]]5&]]5&u@ p]]q5 }&j!@o_?d]]]5]]]5{&9H$]5+5'&9#&3@"@=`U@;$]]]]]]]]q5]5=& []]5F&5R+&/P+& +&mP3E@  : 96??33?93933399310#!3>?!!J>B 32lkaXḅ .HKAIl  /39/1032673#"%kaXḅ.HKA !%)/AOW_jv@&&''MPqe*`kU]]FJPBX?::<3XPFk*e +"..#++w  x $ #.,Fbb7]t04\U3232673,YTK)+1\L-ZTI(-q&/&.MqqC&/&1J .@   [_@ H/+]2+3339910#573#5732X"+"+ 1@  [Y_@ H/+]++3333310"&'332673[ jFHh~>JI?CCCvvv+# /3299104#"'632#526щC5 <@|3232673d3TU$--[ +L?7SS"0+\ *K+&%#(RH(%&&%QJ' &@ /3/9/993310!#!5!3e*\* &@ /3/9/993310!#!5!3e*$E &@ /3/9/993310!#!5!3o ZZ"@ /3/9/99310!#!5!3o DM$@ /3/9/399310!# 7 3f\>Ha4R $@   /3/9/3993310!#!7!3bG4oaRM"@ /3/9/993310!#73_J^rM "@ /3/9/993310!#5 73fS܈kh/iF@  /3/9/99310!# 73pZzfjFp"@ /3/9/993310!#73p^ZHd(5&@ /3/9///99310!# 7 3RkGHyN!5 &@ /3/9/3993310!# 7 3Rka.K- O $@ /3/9/3993310!#!7!3xtdH^- "@ /3/9/993310!# 73`vcFFH@ /3/9/99310!#73wp=Dg-p"@ /3/9/993310!#73pEsHVH!$&@ /3/9///99310!# 7 3=|GHY2#% *@ /3/9///993310!# 7 534~X4(5f% &@ /3/9/3993310!# 7 3C{sVH2}q' $@ /3/9/3993310!#!7!3cy Q2X/@  /3/399310!# 73HԈG7%p"@ /3/9/993310!#573p={H\2#$@ /3/399//99310!# 7 36}MH)Q0) (@   /3/399//993310!# 7 530~YAuO/l6 (@   /3/399//993310!# 7 3ON,qS-m6 (@   /3/399//993310!# 7%3O~t8S-{0@  /3/39310)733+NS.)p@ /3/9/99310!#73pA>S.)O @ /3/9/9310!#!'!ataoL ,@ /3/9/93310!# ' 3[H5fy4L ,@ /3/99//93310!# ' 3UH)hy?L ,@ /3/99//93310!#5' 3SHhy-^(@ /3/9/9310!#' 3Q6fy=Lp@ /3/9/99310!#'3p^iy @  /3/9/399310!#!5!3pT; (@   //99//3993310!#!5!3a.izT (@   //99//3993310!#!5!35$$@ //99//399310!#!5!3?P(@ //9///39310!# 7 3h`axbVL *@   //99//393310!# 7 3e`;H`GF &@   //99//3993310!#!7!3fb*]v\^L$@ //99//993310!#73^'c{L @  //99//99310!# 73e[؈scSc[Lp$@ //99//993310!#73pd]?de[/)@ //9////9310!# 7 3Gu7TaF?9 -@   //9////93310!# 7 53Rv8HqGG? *@   //99//393310!# 7 3Nw]sX=U8H? (@   //99//393310!#!7!3mwo V=2? @  //39/99310!# 73\w߈5:=?p$@ //99//993310!#73pWw2-B=+6(@ //39///9310!# 7 3O}4H) 0q5 ,@   //39///93310!# 7 53N}<Au 1[l6 ,@   //39///93310!# 7 3ON,q -+m6 ,@   //39///93310!# 7%3O~t8 -6"@ //39/9310)7330O~ -Q5p @ //99//99310!#73pM4 -zL @ /3/9/9310!#!'!owKzL ,@ /3/9/93310!# ' 3oH Kz4L ,@ /3/9///93310!# ' 3oH)S@Kz?L ,@ /3/9///93310!#5 ' 3oHu^Kz-L&@ /3/9///99310!# ' 3o6RjKz=hp @ //99//99310!#'3po~3232673#573TU$--[ +L?7SS"0+\ *KS疇&%#(RH(%&&%QJ'v?+@  /22239/310"'&#"#>32326737#53#533TU$--[ +L?7SS"0+\ *KI&%#(RH(%&&%QJ'ޘW+ /210#53!#5g#2+   /329/310#533#'53QFћ C2+  /322310#53#53!!d#: 2@    PY  ??9/3+3933333103!3#!#y{{yX9P=&c'q@3998%88&+5+5/55P=&c'Jq@288&998%+5+5/55P=&c'q@3998%88&+5+5/55P=&c'@q@288&998%+5+5/55P&c'6@A( (0%%%&+5+5/55P&c'6J@A( (0%%%&+5+5/55P&c'6@A( (0%%%&+5+5/55P&c'6J@@( (0%%%&+5+5/55]>&k'r@ %&+5+5/55>&k'r@ %&+5+5/55R>&k'r@ %&+5+5/55>&k'r@ %&+5+5/55x&k&@&  % &+5+5/55&k' @&%&+5+5/55x&k'@&%&+5+5/55x&k'@&%&+5+5/55T=&w'q! *@ *)%))&+5+5/55T=&w'"q! *@ *)%))&+5+5/55T=&w'q! *@ *)%))&+5+5/55T=&w'"q! *@ *)%))&+5+5/55T&w'!.@ !%&+5+5/55T&w'! *@ *2%''&+5+5/55T&w'# *@ *2%''&+5+5/5510T&w'*@ *2%''&+5+5`&k&j'@ % &+55+55`&k&j'9@ % &+55+55{&k&j'x5@" %"""@ H""" &+55]]+]]5+55{&k&j'9 '@ %O""" &+55]]5+55T&w'j'@ %&+55+55T&w'j'9@ %&+55+55T&w'j' @ %&+55+55T&w'j' 9+@ %&+55+55}I&L(2@  & b %+5+5WhD@$ _Y_Y_Y?+??++9/933310!"'532654&#"!!>32hoXlO0dOBލi p]p[`W=F@$    aYaY  ??3++9/9/9333310"'526=!!&5!dF3H5YQoW ?c2G` |hG@#  _Y_Y?+?+?9/9/9/993333310326=4&#"!!>3 ! $' Bލ 勀vЧŦ[`pg!n 02?3?310# 46324&#"326!-=?//==/ȻďnlkpEqc1/?3?9/107573ѥqZm{r%n 01?2?3310%5>7>54#"'>32!jja3`Z|*L_,Prrq;sPJFVersqg1TOE @ f-n"0 2?33?339/310#"&'73254+53254&#"'>32- lpB?31-9zGhyymj_[Y).2/ htn_-!rDc &@ 1 /?3?9/3339/10#5!533573حZl{%g #g/c"@ / 2?3?39/9310#"&'732654&#"#!!632/}c8B>9=- :Myp{liZ@=6?/%g&n!$@   02?3?39/99310#"&54632&#"6324&#"326&dDv t7@8/;N@rc 1 /?3?10#4>7!5!w`23c}y:⩸^ag+n )"@  #0'2?3?39/33310#"&5467.546324#"3264#"326+L<9<=7>J`_`0/tosA/KmwvlBaX7\ojc5YYZZ`-iks@g&n $@   0 2?3?39/99310#"&'7327#"&5463 4&#"326&mGw 8po(?017530?ZeN>uzAJB95G;+  /329/3103#5#'##538`tih+ H+  /329/310#'533#'##5`hiy S+@   /329/3104#"'632##52#'##53T;3(:CC6=Kih#@`,8N?+ )@@H @ H  /3+223/+39/3310"'&#"#>3232673#573#3TU$--[ +L?7SS"0+\ *KЛi&%#(RH(%&&%QJ'pC 9+  /329/3103#5"&'332673#݂YkjTThk+ tD78Cx9+  /329/310#'53"&'332673\ kjTThk tD78Cx9+ @  /229/310"&'3326734#"'632+52kjTThkc;3(:CJI#KtD78Cx#@`047?+ $%@  /2299//33310"&'332737".#"#>3232673fUU#DA=Q[ *K@$F@;0+\ *Lj]SSdcv& /329/10#'533#'##5t˟t -u@   /329/3104#"'632#5>#'##53wL=5FYBI[*5Ӡ,Pp0E &^>t#%@  "/3299//3310".#"#>32326733#'##5(PLD%) |+TD)RKC,$ z,Tӟ#)#/@fg;"*":4bi=6c @ /299//310"&'3326735! hGGiMYWOg&c @ /299//310"&'332673%5! hGGiMYWOg&b> #@ /2299//3310"&'3326734#"'632#52 hGGiP48 7pX^MYWO>f OI5H3232673 jEHh(PLD%) |+TD)RKC,$ z,TNNNN#)#/@fg;"*":4bi=k1& &@ tD4]]]5k1& '& J'& +@  P  ]]55P3&P3&P3&F1 BP&P/@[;+]]]]5]]]]]5= #/;?7@!!??39@999'' '>>-'/33/3/33/3]q22/2/3014632#"&74632#"&4632#"&%4632#"&4632#"&3=. ".." .. ".." .r- #--# -2. ".." .0 0/!".n` .. ".." .. "..".." 00".." ..".0 0.$[i{)@@ /33/]q22/9/3015!%4632#"&4632#"&3iG,-# // #-- #--# -nmm@".." .. 00 "..$[i{#1@ ##@ "" /33/]q22/9/93015#5!#%4632#"&4632#"&3nGj-# // #-- #--# -nrmmr".." .. 00 "..$[V.4.'32>#".54>7$b 7H(CkL):Y=Fa<.?!GɁƇGI`}EufX(LiSBpQ./Rsn9TlLEun_!:QpKV H$<;DGNW]$$7h$9h$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                          uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB01uniFB02uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFC commaaccent breve.cyrcaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmarkuni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lc uni1FEF.short tonos.shortlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BE x          bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.604D@8 8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz S R Q P O M L K J I G F E D C A @ ? > = < ; : 9 N T B H:BJRZbjrz o n m l k i h g f e c b a ` _ ^ ] \ [ Y X W V U p d Z j:BJRZbjrz             ~ } { z y x w u t s r q   v |:BJRZbjrz                            :BJRZbjrz                            J",6@   Vcyrlgrek&hebr2latn@kernkernmark  6>FNV^fn|&.6>     jx|8  #j&&&'8''(F( () )<)l)))*,*\***++,+Z+~;P;X>AEHHH1lll~.6llL.llll....llll..lll    ))     ))          ,             ))     -              1          n L $*06<BHNTZ`flrx~ &,28>DJPV\<<<<,<<<~<<<<<<<<PPd<<<~<<<<<<<<<<~<<<<< (  H" X &,28>DJPV\bhntzXlHxRRXXXXXX XXX  L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzFXFXF0F0F6F6FFF6F6FFFF4F46F6|F|FFFF0F0DFDXFXFHFHFXFXXFXXFXXFXXFXF0F0FFFFFFHFHHFHHFHHFHFFFXFXF0F0F6F6FF6F6FFF4F4|F|FFFDFDXFXFHFHF66bbFFFF (  HFLRX^djpv|FFFFFFFFFFFFFn. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz00>>66hh,6||6||XXXX\p  XXXXXXbbXX>>p        hhl00>066hh66h||XXXX\p  @600XX|||| (  H   jpv|-22<2  !<  !J`    J`      J`     !   J`     ! 4<4J4<  !4J  !Jl      Jb    Jl        !Jb      !n L $*06<BHNTZ`flrx~ &,28>DJPV\@FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF<FF<FFFFFFFFFFFFFFFFFFFFFFFFFdFFFFLFLFFF (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\FF0FF8FhFF`F`FhFpFHFFFFhF0F`FF$F$FFF$F\FFtFFFFFFFF8FHFFF\FtFFFFFFFFF0FF8FhFF`FhFpFHFFF0F`F$F$FF$F\FFtFFFHF$FFFpFpF (  H FFn L $*06<BHNTZ`flrx~ &,28>DJPV\$H8 88\ X    $ 8$$$H8 $ XH  88 (  H ( >       $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(h(6Tft&djxx@bxbxr&4~& NX&2l>d H : d  " 4 V p . \ r 6DNX$<;DGNW] 7h9h:DJPV\0D00t`0D0`8 (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\06h,|XXl0 X0    06h,|XXl0 60X,, (  H   flrx~n L $*06<BHNTZ`flrx~ &,28>DJPV\FXFF0FF6FFFF6FFF*FF4F6F|FFFFF0FDFXFFHFFXFXFXFXFXFF0FFF*FFFFHFHFHFHFFFFXFF0FF6FFF6FFF*F4F|FFFFDFXFFHFFFhF,FF*F*FFF (  H:@FLRX^djpv|FF@FFF@FhFTFFFFFFnn L $*06<BHNTZ`flrx~ &,28>DJPV\0hXd|XX XXXXX    0hX|XX 0XXX (  H   flrx~h@,,x0@p $=Ih&̑ openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSans-BoldItalic.ttf0000644000076500000240000125303413402025764026304 0ustar kintelstaff000000000000000FFTMazVGDEF~t1GPOS֏ tIGSUBm[OS/26`cmap[*.cvt fs<fpgm~a0gasp glyf∩0gheadf<6hhea Gt$hmtx}(tkern L{Jloca?((xmaxp< name I postESh'prepY8p0Ū\_<̓H̓H/ =>NC / d  RTd/\T33Zf   Px!1ASC! Q3>`: 99OsAsp1JLX}989.9sUs!sssss_sss0Y|{|$d$V$$9d$9$s$$$$9dV$9d$VwVVV9oRUs!s #s?:s?J#9#9$s#9###?;#sVUsn9css=ev9sLssHs'=s>hsHK8>k3dWG`sjXbfs&bbnQV$V$V$V$9$9$9$9$$9d9d9d9d9d~9#wwwwVV$#s s s s s s *s?s?s?s?s?9#9#99#:#?????dE*UUUUsss s s ds?ds?ds?ds?$::V$s?V$s?V$s?V$s?V$s?9d9d9d9d$#$#9$99$9#9$9#999$9#B$s#s9$$s#s#$9#$9$+#$#9$#$#$#$#9d?9d?9d?g:$#$$#VsVsVsVs:VwUwUwUwUwUwU9cVsV9##^Y$#$#%ds?WYV!:Vk$Bs9dx#9$9 $s#9sIG#9dd_?;gMYV$V:s#EVxwU?bzs66sss/=RO $ $: V$$r# :$$#s 9$9#9d?wUwUwUwUwUs?s s *9d9d$s#9d?9d?69$ $ $:9dH$$#s *9#*s s V$s?V$s?999$9#9d?9d?$#$#wUwUVsV)$#*T: 4 6s V$s?9d?9d?9d?9d?Vs_H#9$B>dsR+Bs)r>VV$sKs9$?d;VQssA:&#ss::s#s?8 \A`?sfRX##99C>99UU##0-?@9= #V  s3F\%=gs9snp66Ths9d%?#BFs); :1 :VVP:5#JE&998?8B<H<'<3Hp=+999cc||$L!P#n~JjD:q>oG?0bb#7MW1bO?!Y..\@iz=:JJ<91pF,OC.<X?P( ;-I2q:41wI)>AWy/,qss?s?9q9$$$_V$$9d9$$V$$B9d$V$V`V?9$V9%9Cf9sl71%vl9C%ssi1?CBLO@E9f@L/b79Cf?f7JDAi9d?s$4<oI]V&V4$BN=3Ri+s?9$9d?V$dFdV$V$$dV9$9$sV%$$k7#$$$oV$k$$$$$$9d$V$dk7?NV$$$$$*V#s ]'E<s? UU$##?#s?#s?s+UjU{UM&&j#s?s?##?s9#9#9$?%#$UsU ]:[_#$e#Vsh$gy'$/9d?FoFo aDB0 ]rBK ]:[d"H+A/k$U$&V$$#U#"k$ $$$$$$`$#'%&K%f?ds?#ssnsVsVsejj)#009$kF$$)$#j$#9#s s *V$s?ks?ks?k$ 6$U$U9d?9d?9d?*jk7sk7sk7sj$"$&VsVsV<:<uG~$kB N$j-9d?3 #$B9d;9c-sZ%#fZmmuu=uuX ^3uhFjHqHjmNHjsfw73h;qH?996Ks?!! 9%#?s1s0&3G? $_fR,hsn9c6#%s# /*,dT \\Z:Q[<nYe^T[aYAQ~hAr>]~RRR\0o0o?S5^LG9>jq<VjqjY]#{8b8^r6rh%kkh)^<86.hR)\Ur#:s48>{9 9#:s#9##s&snss ::s?(9#sKU6>I<q<#ua\S*9^-^<^<^-5^"^XHHY99@pQjn6y D8xn8u8o6! '?f+ ?s $#$#$#ds?$:$:$:$:$:V$s?V$s?V$s?V$s?V$s?$J9d$#$#$#$#999$9#$s#$s#$s#$9$9$9?$9$#$#$#$#$#$#$#9d?9d?9d?9d?V$V$$#$#$#$VsVsVsVsVsVVGwUwUwUwUwUVsnVsn9c9c9c9c9cVsVsVs#V9css 9##s s s s s s s s s s s s V$s?V$s?V$s?V$s?V$s?V$s?V$s?V$s?9$9#999d?9d?9d?9d?9d?9d?9d?d_?d_?d_?d_?d_?wUwUxwUxwUxwUxwUxwUVsVsVsVs99999999@hq I-UAh%%%%%%%%%I-U-T9C9C9@9C9C9C9C9C0TAiAh??????@Ai-TffffffffTUvx77777777@@i-Tqq99%%9C9C??ff7799999999@hq%%%%%%%%@-U-T77777777@@h-Tqq99999992p2l%%%%%W$qq9C9C9C9C949C9$9$effffffVVJ@  77777e4k@?LUs9 LsSs,k9999ss2ZMHI!OVTTFU]+\0j)0s@ddss# ; $NQsGsV$9dVd!$ +* %]bbHs?+}VT9~d|Q1dDd;ddWdWd"g{mm+b))s+kUFQ@;@<fB9V$s $#$s#8dn[cs$m$#!p&Y<1kJJjuhFmNHZqqqquuuhFjjmNsfw73;qjHm73X!N*6PX@-o::8:::``````````````9#8WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWWs~$9999999999#9#9#9#9#9#9#9#ffffffff9#9#9#9#ffff9#;$onrsU00XXXNu UU$~~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-AU?9U>9UB@A@;3:U839U992=1U1/U0=/U,))*U(='U'*U&=%U%*U#""*U+=*UP/@;o@@ ===U=U0U/A  @@F0GOd`o@  @`p_<@2/?O@&)F/?@F5P&'%%`K&&&&_oO@FG2mvP&uP&tP&sP&/y?yOyqopGoGU3U3Um)mlaP&`_2_P&cGbb bF)b9bIb^G][\[3[G2@RU2UU2Uo?OoYjOS_S@S(,F@S"F@SFkR{RRQOPOO)OYOiOGu@APNMMMMGLG2KG2JGIIGHG2G2UU2UU@-?_/Oo?oOTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu++++++++t++t++++tss+st++s+++ssssu++++++++s+t+++++ss+++++++s++++++s+s+stu++++ss+st++++++t+st+st+++ssssss++++t+++su+s++++++sssssssssss++++++++++++s++++++}y:wWU' ,"-mB?]%u\1DsNpp0`HjgaAohS}c wu\t L 4 d X `(TpP0T`H !"0"#$d%0%&,&'X'(P()$)\+0+++- ../0d1 2023t44586t7(789:@;4;<=4=>|?$?@ABClC|DFXGhH HJK KtLMNLNNOPPQRSSDT@UU4UVVWLWWX8XY0YdYYYZL[D[t[[\\8\h\\\]]^^L^|^^_``P```aaDabbccLc|cceDepeeff4fdfffghhLh|hhii|jljjjk0k`l<lpllmm0m\mmmnnHnxnnoo8otoppqq8qhqqqr$rTrrrssDstsstt8thuDv<vlvvvw,w\wwwxDx|xxyyzzzz{{L{|{{|$|}@}p}}~~8~h~t4h8l,\DtP@p @l0`$T,$|(t4x@||p $4dX Plh0L@P(@4p4d$T<|,l|0(X$` 8h˜DDĘL|ŬDtƨ@tǨ@xȨ @pɠ@pʜ̨ ͔δϤЈќ0hHxӨDt8x٨ڜۼ8dtX(\h \ |0,<@Xlt8txHH0@ 8Pt ,  ` `   $ $ phXdD\8`pd l!#0$4%8&l'(X()*`+$,,-0-../ /0L00111$14112D2223 3h34404d4t4445 5\556$6p667<7h788|89`9: :|;;T;<<<>>?8?x?@(@d@AAABBPBBCC@CCCD(DDDE$EHEEF(FxFFFG0GGGHHH(HXHHHIIDIIIJJ$JdJJKK\KKL(LLL|LM M`MMN\NNNODOhOOOPPHP|PQ Q|QQRRRRS<SlSSTTU$UVVHXXY(YYYZ ZxZZ[L[\$\l\\\]d]]]]^@^T^h^|^^^^^^_H__` ``aa aXaabbTbbcDcddHdXdhde4eDeTedff(f8fffg8gHggh8hHhXi@iPj jk(k\kkkllTm0n$noppDpqr\rs`stu8vv(vwxTxyz<{{|}}}~$~T~(D|X@< L,PX Hdt,lPpL\lT$T(l|($8XDH 0@(l\dtldl P((˜tÄÔŔŤ4ȨpT0̬8μϘ\\H4֐ט،وܬ| <lh,$Dp`Pp@THHD`LLx ` T X h    H |T|<pDxH4d4Dx @tt<X  !H!!"#$%l&0&'(x),)))*+++,|- -0-@-P-`-.d.////0001L111233t34484h445,55566P67<78p89x9::::;;T;<,P>??p?@4@@A0ABBHBC CxCDDEEFFG GGHlHIdIJJJ4J\JJKLMMN$NO<OLOPP$PPQQ(Q8QR<RTTUHUV,V<VW,W<WXlY0Y@YPY`YZ[X[[[[\x\\]^@__p_`@`a<axabPbc(cddeTefTfg ghihj k@klm|n$nolpXpq$qrssttdu0uvTvwxxyXyz|{@{{| | |4|H|\}}}0~L 88 4,@@lH(pp@| P|\`d, 8h”Lè,XĄĴ$P|Ŵ4`ƌƸ<hǔ4pȜ @`ɐ PʄʰH`xˤ(`̜(T̀ͬ@|Ψ,\όϼDtФ(TрѬTҐ4pӠ4dԔ(`ՌոDp֤lפ <hؔDpٜ Lڀڼ0`ېۼP܀ܰHxݤ0dޘ(X߄߰4h0H|H|P|@tLx PLP|(T @tDx$T T 8d$X P| 8P@p @tH(`(\4l <p @tH(TLT4l4h4l <p @tPL 0X THx  < l    D    D    < |   < |  ,hX LH@@8h(X(d4\Ht0h @lH$T4dp   !8!x!!""H"x""##D#$$$`$$%%0%l%%%&&0&l&&&&&&&&&&&&&&'T'((|(*P***,--`-.\.//041233L334(4478 808T899P99:P:;$;\;<$???????@ABC\DEFIIK4KLMNO,PQRSTUVVWXYZ[\]0^X^^__l_`,```aPabbhbcd`deeeeffhgpghhjxlllmpmnnlnoo0otoop4ppqqhqr$rhrs(sstPtu uxuvHvww|wxlxy8yz0z{{{||}}~`~~~ PTDp,$t,<plh8L p@DH|dX$l4p \| Ld|(@Xp0H`x 8Ph4\HL`0 dt0DXl|,@Th|0DXl€°TP tlldtɼ `(|l$̀\ |hl,҄$t4ԜDՔL֬ XנPشlٴX(ۀ |(݀Pި@ߘ` Th$l|80PPPx P hT p` pd d \ d0H00|`D(t X< l$h8@p$ d ,   |    0  P HHHh,\OO@. @[lmX       ]]]]]]]+??+99333310#!!&4 47@   p ]]?323333933310#!#!`HHAps`@9 !  Y Y  O   /3?399//]q]q33+3333+339103##!##53#533!33!!ERPPOFTR3TToH5F^}}LLh!(/@R&% ,-" "1) 0--uY , %/?Oo &  tY?33/+3/_^]393/+33333333393392910#7"&'%3.54>372.#4&'26"8!p I}n Q Y [-Y&[&3Y&;Y<r?d?V?F?4?&?????????V?4?&?? ?y?i?[?M???+??????????}?Y?I?;?? ?i???????{?m?]?O?$??????????i?[?M?=?)?? @;???????t?f?I?4? ???9?????rrr_r_r^]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqq^]]]]]]]qqqqqqrrrrrr??+??+++++9933333399102#"&547"32676542#"&547"3267654#3"zhTENZ4VOa.zhTENZ4VOa>R`^YUxJmM|R`^YUxJmM%1B'2>@A+!-5593399 0@?@5+(%(OYPY%!%-<%<@ M54&#"1ǟ[+L5e-SKm?0'BIGhV?|-|L|ahd3C:Ugb50~4Їz[uTwGShU@u7--"8SUigQ@6?N336n@6&vfV&F&vdTD4$p`P@0$ip`TD4$tdTD4$@4dTD4$9rrrrr_^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]_]qqqqqqqq^]]]]]]]]qqqqqqqqqqqqrr?933310#!IJWj @ ??32933310!%j @q<k^LWn @         [ K +   k ; +  d      k $  j    K 4 $     d 4 +      k ; $   :  _rr^]]]]]]]]qqqqqqqqqrrrrrrr^]]]]]]qqq^]]]]]]qqqqqqqqqrr??329333104'! PE WѪjXm  ?9107''7'73>DDoh=y{=h} Q@0   [0P Y ?3+3_^]q++93333310#!5!3!q9hh1 5@ [XYX ]+/+933333910#>7#!Ng;!/VNI1x8o@ Y/+99107!8//.1@ [XYX+?+9103!.;!;1@ ??3233103LK) U_ (@  sYsY?+?+993310 !"&5462654#"&5YCu[VkKD.sS3S^gS! 5@ sYX+?+33?3993331037!7%!!!+]/C,f^;@    sYsY?+?+99333393310#7>7>54#"%6$32! %1l;Xl5T,,U~hlp>X`;`ZB\'O@( &&##()'&sY''  sY sY ?+?+9/+9933399333102654&#"%!2#"&'%32654+7MP3f§ hohuk,=tjHS4d}|o&ZUpbP V@+ tY X+?3?339/33+333333999239910!!7!3!6j66)r*.GXfoN\ Z E@# !" "sYsYsY?+?+9/+3339333310!!>32#"&'%32654&#"!<O+W1>N0ˍ_^}cZ{O ⾡-]Kit[_~'U@.! )()$tY @sYsY?+?+9/_^]]9+933333310"5$32.#">3232654&#"+JBs'5gb[k_SCr@  利)IFHYȮi|ahD| /@    sY?+3?3399310!!67!,4#N3 p$0T@*" (21. 2%%uY+ +uY uY?+?+9/+993333939933102!"&54675.54$2654#""32654&櫑ow\_^m_lZtk`lj!pɳ")mwioeW]Ȏy_hz_e0j%M@( &' '#tY sY sY ?+?+9/_^]9+333933310#"&54>32 #"&'%324&#"3261Aha쐶|dMr`SrMIְج鍬0'WrUiYB 0@ [[XYX ]+?+?+933310!!7 7N7 7B =@    [ [XYX+?+/+9333333310!#>7#!7 7ĸNg7 *UNIx|}9@?_ /]]]3/]39=/33993310 |AB{#~)R@7 Y? @HY0p @`p/]q+/+_^]q+9933105!5!{J|}7@_ ?/]2/]]]39=/3399331075 5|@}DEy T@- !" @[_YXYX " "]q+?+?+999393333102!>7>54&#"%!KN9">avE[6`e4u4!4ZyW36>*Ms]I+B=>'?S(~jw@O@+2HA  9##9PQK KY DY     5=='Y=5/Y55p555/QQQQQ@Q0Q QQQ QQQQoQ_QOQ?Q/QQQF^]]]]]]]]qqq^]]]]]]]]rr/]+?+99//_^]]+3+3993993333339210#"&547##"&5463237332>54$#"3 %#"$5$!24&#"32>w\c2gE'u%/PUџ &'>dyw^^SadB}b5ԩ[Q%i˶D2*錯 tٗz_Ri_x}yrT3j@=   _Y @p@ O]]]]qqqqr?2/?39/3+33399399229910!!!!!&7\9MCh@rć${ y@G   !"  _Y_Y_YlmX@" """""p"0"]]]]]]qr+?+?+9/+99333339910!2)!2654&#!!2654&#!6H?&rӼHѢ!wI\iPH5euZ`dK@+ `@`p_Y_Y?+?+99_^]q932333103 !"$54$32.#" 9y'3v=u Gk|$ >@#  _Y  _YlmX@ ]qr+?+?+99333310 #!32654&+MbAưc$ n@>    _Y!I< _Y _YlmX+?+?+9/_^]_]]]++933399393103!!!!!$T,E,HV-$ Z@3  _Y @1H_YlmX P ]q+??+9/+_^]+9333993310!!!!0U,de,LdU@,  !aY _Y_YlmX+?+?+9/99+99333333910 4$32.#"326?!7!35lH.'fi=ιNq|촲4,kW$ m@<  `Y!I: lmX@ P ]r+?2/?3/39/]+3+339333993339910!!!!!!vv'mrm\1$\@plmXT4$p_`?  p@0<rr^]]]]]]]]]^]]]]]]]]qqqqqqqqqq_rrrr+??9103!$'M@)     _Y_YlmX+?+?+99_^]932333310"&'%32>7!7!& .6J0,?-:0X]&$C v@(   @  P @H lmX+?2/?3/3/9]+]qr93339933993310!!!! e'q{$k1@_YlmX P]q+?+?99333103!!$'-c$@   lmXtiVF)vfI;fYI;)dVF4&tfVD6ivV"iV4&@.yR@09rrrr^]]]_]_]]]]]]]]qqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqq^]]]]]]]]]]qqqqqqqqqqqrrrrrr+?222?3339933333339332310!67#'!!>!0EO#d^ X$>tA3#`KPV$S@-   lmX@P]qr+?222?3339933333333310!!!767!t^y kMRS[ud4@  _Y_Y`@qqq?+?+993310 #"$54$"32654&%Rv|}iِ Ҥ($Y L@)    _Y  _Y lmX@/]]+??+9/+33933399102)!!2654&#!Rb!xRtfkdp+J@*)  "-,%_Y  aY_Y-`-@-qqq?+/+?3+99393210 327#"&'.54$"32654&%Rsق[YPF-Hav{>v|}j`ߩmbXesҤ($g@6   _Y_YlmX@ qr+?2/?+9/+3993339933339310!!!!2 2654&#!gvٺ0sQb{ul]b`A(I@) &&*)**! aY_Y?+?+9_^]9333310 $'%3 54&'.54$!2.#"X!Yx]: !v|4d[01ofP]-1joحCZk]Q/B1(,M`|Qs*@  P _YlmX+??+3_^]910!!7!9,,cwN@(  _Y lmXP]+?333?+99993333933310%267!! $5467!"'7'Әd,{%WUgq D@&  O    _ ? ]]]qqq?33?3932393310)!>!1r/94wwjzV@.     _O?/]]]]?2/?339933332393333310)/!!?!6!@!  lmX p ` ]]]+??93339933310)! !p$CTB?]# C@"   _Y_YO ]?+9?+93333339910)7!7!!:(i-(^3WZ2@ YYlmX+?+?+33333310!!!6r%%Wuo@ ??9933103!) RW@ YYlmXi         Y I 9   v f V    { k Y K ; +           { k [ O ? /   i        o [ K ? /         { k [ K ; +     @,     o _   9     rrrrr^]]_]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]_]qqqqqqqq^]]]]]]]qqqqqqqqqrrr+?+3?+3333333107!!7!%)%WU3@`]]]?329333310 #!B!T@ Y/+33105!xNN!@ [/+3310 7!T+ 7N-8}@E88*!!2  :9::: 8 ..RY!   QY 5OY'RY XYX+?3/++?+99//_^]99+99_^]]993333333310"&547##"&54$%7654#"%>32327#3267|dlTv^\"G *VuOCS TE%a_$IE%x- \TFOj#)u@F /?' 0*+##OY OYXYX+ +qq+?+?9+9/??3/99_^]3]3339102#"&'#!>7!#3>"32654&W|} T8~"j_erLGNh^oCJUTið] (%'(! !OY OYXYX ((p(P(]]]q+?+?99+9??933_^]333910%#"&5463 3>7!!47'2>54&#"Gy: T QtR0^^fD]X̫nP>pw?a EQxmq?:Ng@= !RY!H  RYTd   QY ?+3_^]]?+9/_^]++399333310327#"&54$32'74&#"f][BK޴ cP`&3jqJ|7ct8kbJUU@-  QY OYXYX+?/?3+3?+_^]3933993299310!#737>32.#"3讞%IR$ @C< %||q@AUWM$2@B- % ""*344 40444"%/((OY  /PYQY@ HXYX+?2++/+?999+9?39_^]99]333933310"&'%326767##"&546323>7!4&#"32>nz" ?_wM߫v% /h^LcE-YOWv`NYN*Ȥqp`SWhw@Idž#Z@.     PYXYX q+?+?339939?39933399333103>32!654#"!YO'KuvevkhdmsS|)w#\^@8 SYXYX        / ]]]qqqqqq+?+3??3/933333107!!)):$W\S@0   PYSYXYX /]]]qqq+?3+3?+?39993107!"'7267!((_G$:C?ZE]vF# t@C'   '    / O ( XYX+?2/?3/?9]]]933399339]3]3310]]!!!! ؼU B'KZZl#\T@5XYXp` Cr^]^]]]]qqqqqq+??9333103!# 4#M,@g''&&(%% .-%&(   PY &'XYX...`....o.P.O. ..0..?^]]^]]]]]]]qqqqr+?3333/?3?3+3999333323339333310"!654#"!67!3>32>32!6=&*[w{~XvMf|Pmz|{[-yS_ )tXwq}k@dssZ1y#MU@,   PY   XYX q+?2/?3/9?+9993333339910!654#"!67!3>32vev KuS|)wSO hdms?M <@# OY OYXYX P]]qq+?+?+993310#"&54$324#"32>ռ&rLpK6xqqWN(r@@ !*( ("" !)"!%$ !(OYOYXYX* **p*P*]]]qq+?+?+999/?3/?39322399310"32654&%>32#"&'#!?!~"j_fvDMHv|} P]~an;WN%{@I# '& *'OY   OY XYX' ''p'?']]]qq+??3?+?9+93_^]_]33399]31067!!7##"&54632267654#",U$Kt衂) nGQ{8 bVĭn[l%XA{hn#zNK@)   PY XYX_/]]]+??/?+99393339910&#"!67!3>32LE-{#e I\/8U>x1k-K%}@N &' QY -  QY%P'@'0' ''''P'@' ']]]]qrrrrr?3]+?3_^]+999933333310#"&'732654&'.54632.#")pnmqSǣbU(JN$KBFB47-~E>x!, !)V8`@2      @ OY OYXYX]]+?+?3+9392393393239910"&547#73733#327x|f%0#h /( L QulGV8!.- U:f@:     PYXYXp ]qqqqr+??+?39999933333399103267!!467##"&5467vevLt:{*y^O kaon: L@,   p ` P     ]]]qqqqr?33?3932393310)!67!n!G==<.:{`c:b@6    @? ]]]]q?222?3333399323933333310)'!!?!7!+5*E4&-*5# Zn:HD{|: N@.    P ` 0 @  0  ??3333]qr3333999910!! !! Ժ$(4&2[W:K@(     PY@P]qqr?+/33?3333932393310"'7326?!7!XaL&(/Nw;#G,rkW \h0" %%A: c@</?  0  PYPYp ` P ]]]?+9?+933_^]]33]]9910#7!7!! &eH('(\W)i@6+ ($*+ Y"! ' Y  'YlmX+?+?9/99+99999+999333333310"&547654'767>;#";w =&+C%LRV<aJYA B8P%Wyf,94#!R]p^eK*"54W@K;kTD4dT D [KktdTD {dTD$;r_rrrr^]]]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]qq^]]]]]]qqqqqqrrrrrr??9310!WueW+m@9 *&,-,#$*+*Y   Y+ +YlmX-]+?+?9/99+99999+9933393333102+73267>?.547654&+7w =]c&vC%LRV<aKXA B8P%yf.7!#MOqq]p6_gJM- 54vHd@:Y  YY Y 0@ ~B^]q^]^]]]qq/++9/+9/+9910"&'&#"5632327yKKVGwAqPJNr@u*/+-T,/\,$L:f@= @[lmX@ 0          ]]]]]]qqqqq+?+/9939939910!35 5,+Lb!@   "#  OY OY  #y#i#[#9#)## #####y#9## ## }#k#[#K#9#+## #########y#i#[#I#;#)## #i########{#k#[#K#?#+##########{#@Gk#_#O#?#+## #######k#_#?###9#####rrrrr^]]]_]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrr_^]]]]]]]]]]]]]]]]qqqqqqqq^]qqqqqqqqrrrrrrrr??99//3+3+99//_^]]933333310267#7.5476?3&#"%Sl 4 8  ky1Hig2 دiJ s5%@N%' &/ uY ! vY   !!tYXYX+?+3?9/_^]9+9393+3_^]_]93339933993333910#!7>?#73>32.#"!!!267P*6'^r 3'ŰSGNT5!*_wk&i{Ͻ0TI\i~IZfHH'(@"()Y%Y/++99331047'76327'#"''7&732654&#"3( --((=7&0*  &vYvY?+/+93333333333333939102.#"!"&'732654.'$54%.546>54& pS4\met?Etj3]GJhgz1WvowmD=&8)Rp*#tK%SHPJ0>*$GC'zNyNF*;+ I>EO<*@  [O ]/2+333931073!738++v*+>9}@J0#)7#7;:6*3- 3Y&-Y  &&  & & Y Y;o;_;O;?;/;]]]]]]?+?+99//_^]]++999939933210#"$54$324$#"32$"&54632.#"3267PQp䣝諣̿0aEmovjBf:MP£婣䤤pu)=DJE/}ph (3f@7") &5- 45 HY*Y &$00Y?3+33?9/_^]++9+933339310"&57##"&546?654#"'>323273267BG8jLYo{ R<< };4 #bMX3&4X4.)W-6@L!,,3-3##$.)) -$-87-$,"3"Y%2Y$3%%3$ Y Y8o8_8O8?8/8]]]]]]?+?+9///++33993993333393310#"$54$324$#"32$##!24&+326PQp䣝諣EuJ`NKEBCMP£婣䤤9/q^v;9 -@ Y Y ]?++933310#"&54>324&#"326>UX]FG_bDC`VVSF`aEEcbWZ @    Y [Pp Y oOoO/ oOoO/O/9rrr^]]]]qqqqqrrrr^]]]]]qqqqq/3+3_^]++?+9333333310#!5!3!5!oUT=G0@  YY?+?+9333233107>7>54&#"'>32!G(n\M,#X{s2M`\N]x?h>2U3'a"c[eV32#"'7326oD<>LSZveR@N[.AU~2-S^b^YZGf M?e|c5@ [/+93107! +Ws:%@J#&' &  ! PY XYX@'''''`'O'/']]]]]]qq+?3+?3?33399933339993333310"&=7##"&'#!!3267!327kXM*jQ;MI#v }Qxp 2jAMWa1)s;<B -EjR@S    Y  `@ p p9r^]]]qqqqqrrrrrr^]]q/3?+39/99339310###"&5463!ϜÛŮuD@ [XYX+/+910!; ;1XW0@   YP]/+/99993910"'732654+7328*(QJnb0FWWu#*?SABaqb A@!  YYXYX+?+33?+399333331073?33b[ʯtylzuyf< ,@  Y Y?+?+339310#"&546324&#"32><麎乙?=4D1?<24)vIO&N}4OR2?\&0^@4     [ pP/]]]]]/]2+399333393339310#77!#77IIG)na'G)na'b&{'4K6@ _oK % @  %?55+5+55]5bD&{'tnI1@ _o" %   %?5+5+5]5n&u'4K@&&&+?55]5]5: S@* "! @ [ _YXYX "]+/+?3+3999939333310"&54>7>7!327 !KS6! >avE[6`e4 u44ZyW75=(Ms]I+B=>'?S(3&$]&%+5+53&$@&`%+]5+53+&$}@ &%+5+5C&$[@ &$%+5+53&$jK@ &5%+55+553&$4@&Oo)F%+]]]55]]553@W  _Y _Y !I  <    _Y _YlmX+?3+?+339/_^]_]]]++9/3+33339933399299339910!!!!!!!!#!EF>-CE+I,=\hoQW&&z]0, %+]55$&(@  & 6 %+5+5$&( &  %+5+5$+&([@  & %+5+5$&(jK@ &%+55+55$t&,@ &S%+5+5$f&,1&%+5+5$N+&,@ & %+5+5$L&,jK@&%+55+55 Z@.  _Y  _Y _YlmX+?+?+9/3+399333992399910 #!#73!!32654&+Mbs*te,GưRT$&1[@ &$ %+5+5d&2@ &O! %+5+5d&2D&+ %+5+5d+&2@ &#u# %+5+5d&2[@ &&&2 %+5+5d&2jK@&!! %+55+55~~ :@"  @`p  H?+]q910 7   ~d```Ff``b#z'f@:"$!()!"$ $_Y  _Y?2+?92+999333333910273#"'#7&54$"&4'326ퟃ|ޔs͌v|'WPO|}hi[|ܞҤyQFdK4(w&8B@ & %+5+5w&8@ & %+5+5w+&8@ &c %+5+5w&8jK@&~ %+55+55&<@  & %+5+5$. C@%  _Y_Y  lmX+??99//++993333910)!32)7!2654&#!K',,!xtfk#0S@+ ##00/))12QY/,,PYXYX+??9+9?+993333339931036$32#"'732654&'.5467>54&#"#2яV:6H~ݶvDN`2PS8B@;ENNDIFtܚk@@%(A5^9$TH3O1.gDDm:;b:5< 7&DCh@ 99&:O:= *%+5+5 7&Dv9&99< *%+5+5 7&D@ ::&??9 *%+5+5 T&D@ 99&BBN *%+5+5 7&Dj@99&==; *%+55+55 7&D)@<<&??9 *%+55+55*N+6>@c0>,, $88)))?@&;RY,RY>RY>!H)>9> >>""QY&"   QY 3OY@_@]]?+3+3_^]?3+9///_^]]++++99333993333333310327# '#"&5!3654#"%>32632%#"3267%74&#"][BK޴a3}w^\"](qEAScP`&3jqJ|P_,~_$IEqqct\SHMj8kb?WUN&Fz, %+55?:&HCw@  &!B!$%+5+5?:&Hv @  & #%+5+5?:&H@ !!&&i& %+5+5?:&Hj@ &$$"%+55+55#/&CA@ &0%+5+5#&v@ &%+5+5&@ & u %+5+5#&j@&%+55+55:(l@@&& )*OY"OYp***P*]]]q?]?+9/_^]+9/99333310&'!%!"&5!2&'7"32>54&|b%HE' _V>=% ]!n]WQjy:&8m6{v7%|o3ذfysvU`#&Q'@ &&&2 %+5+5?&RC@ &&%+5+5?&Rvl&%+5+5?&R@ & k %+5+5?&R @ &##/%+5+5?&Rj"@&%+55+55EH 6@  Y YY?++3/+93333310535!53xq*\'h@?"!()!"$$OY OY ))@)))p)P)]]]]qqr?+?9+999339107&54$3273#"'&#"%4'32>*n&r<]ռj:}2XrLD1JpK&r66Ei1C2+,xv "qU&XC@ &! %+5+5U&Xv]@ &  %+5+5U&X%@ &#Z# %+5+5U&Xj@&!t! %+55+55W&\v@ &%+5+5W&\@2 ('$!$##!""'#"OYOYXYX(P(]r+?+?+999??333399310"32654&%3>32#"&'#!!~"j_fvDMHv|} QqS]?!7!7!3#!47'2>54&#"Gy~ !"! jM^^aD]Xĥaa][EzPpw?a }ksgk$&(N@  & %+5+5?:[&H@  &!x!#%+5+5$&( @  &%+5+5?C&H@  &##,%+5+5$&(@  & %+5+5?:&H@  & "%+5+5$W&(E@ %+55?l:N&HO###/%+]55$+&( @  &%+5+5?R&H@  &""(%+5+5d+&*@ !!&&&  %+5+5W&J@ 44&9g93%+5+5d&* @  &##+ %+5+5W&J@ 33&66?%+5+5d&*@  & " %+5+5W&J @ 3&335%+5+5d9&*%%'!!& %+5+5WI&J@ 88&994%+5+5$+&+@  &  %+5+5#z&K#O@ &  %+5+5$?@D   `YaY o lmXP]+?222?33399//]333+3333+333933929339910!!!#737!!7!3# 7!vv{!{&'&r&&{!{w&&\ªP#!@O# !!! #" jY    @H !  PY 0 @  XYX #q+?]+?3339999?39/+_^]3+3993333999310!!3>32!654#"!#737Y9!#Kuwnen!̋hdm+|)w$&, @ & %+5+55&@ & z %+5+5$&,N@ &%+5+5#[&@ &%+5+5$c&, @ &%+5+5#(&@ &%+5+5W\&,g%+55W\&Lq Y %+55$&, @ &%+5+5#:D@*XYX0 /]]]qqqqqq+??9333103!#:$f&,-@o_o]q5]5#W&LM9(@/O_?]]q55q]+&-w&8%+5+5$W V@1   @  PYXYX /]]]qqq+?+?399?39339310"'7267!#'##736_G$:C?@WE]vFd>$9C&.' 9  %+5+5#9&N' p  %+5+5#: A@!     XYXO ]+?2/??9933993339910!!!! ؼUXB'KZ:@Zl$k&/@ & %+5+5#g_&O2O&%+5+5$9k&/> 'ߴ %+5+59\&O 'I %+5+5$r&// %+]55#&OHK)@/ /? %+]5?5]]5$k&/)%+55#&Oɴ%+55]5k P@*      _YlmX+?+?99//999339933399103?!%!$],'mP+M-@Aϕߕs W@0        XYX  / ]]q+??99//9933333999910)?!7;l)l*1EEJL$&1& %+5+5#&Qvk& %+5+5$9&1'i %+5+5#9M&Q ""'# %+5+5$+&1 @ & %+5+5#&Q@ &% %+5+5U'QK'@ 0(`("# %+5?5]]55$&c@6   ('_Y_YlmX(`(@(qqq+?+??3?+999993333993910 '73267654&#"!!36$3 Ls$O3TY(8ux`9" !_C.zu>9 w:V`RQD=CFkc#WM'b@4%%% !!)( %$ PYPYXYX )q+??3?++?999999999333399910"'7267654#"!67!3>32_G$:C?ev KuWG[|)wSO,9;hdmd&2N@ & %+5+5?[&R@ &u%+5+5d&2 @ & ( %+5+5?&R @ &&%+5+5d&2 H&& %+55+55?&R9@&#%+55+55g3%@S#'&_Y!I<  _Y  _Y _Y_YlmXO'0']]+?+?+3?+3?+9/_^]_]]]++9329933399310!# 46$32!!!!!%27.#"?u%74&#"][BK޴wDۊ&}F/rLhirJcP`&3jqJ|KM6CJctxq|u8kb$&5& %+5+5#&Uv@ &%+5+5$9&5' %+5+59zN&U'%+5+5$+&5 [@ &v  %+5+5#&Ue@ &%+5+5A&6)&),),%+5+51&Vv &&&&)%+5+5A+&6+@ **&//)%+5+5-&V@ ''&,c,&%+5+5WA&6z++;&%+55W-K&Vz((8%+55A+&6 ^@ ))&++1%+5+5E&V@ &&&((.%+5+5Ws&7z:W8&Wzs+&7 K@ & S %+5+5Vq&WK4  %+55sK@)   aY  _Y lmXp qq+?+3?9/3+33933103#!#73!7!G%zz%G9,,rm8!^@2  #" @ OY@M OY  OYXYX+?+?39/3++3+32993333310"&54?#737#73733#3#327x|~$-%0#-% /( L QulGVkt8!.- w&8 @ & u , %+5+5U&X@ &&v&2 %+5+5w&8I@ &w %+5+5U[&X@ &h  %+5+5w&8 @ &" %+5+5U&X @ & ) %+5+5w&8N@&l %+55+55Ul&X@ &#P# %+55+55w&8 @& %+55+55U<&X]@&& %+55+55wW&8& %+55UW:&X@  w , %+55+&:@& %+5+5c&Z@ &%+5+5+&<3 & %+5+5W&\@ &Y%+5+5&<jgK@ &  %+55+55#&= & - %+5+5 &]v &  %+5+5#&=G@  & %+5+5&]@  & %+5+5#+&= > @ &  / ? O  %+]5+5#&]@  & %+5+5#./@   QYXYX/]+?+?/9993102.#"!>IR$ @C< @Aq#"0e@5. (!   21#OYRY!+OY?+??99//993+3+3/99339929310##3>32#"&'#!67#737!3"3254&;?m}  )!c^jM,j_R^_h^;4%";MkyofYJ#,X@.$(( .-$#$#_Y$$ _Y, _Y ?+3?+99//+993333910#"&5463!2)%!2654&#!7!2654&#!HL q?QHѢ*&rLG%<&1ǽ!weuZ`\iPH$Z#+R@,) "-,PY %OYOY?+?+?99?+/933393102#"&'#!>!!#3>"32654&W|}  & $F? QuR0j_erLGNh^;4%^_FOky}+ail$Z 6@ _Y_Y?+?9/+93333103'7%3!2!%!2654&#!$vKmv |$ϳneY[#.FJ@'D)4 - ..HG-)%%7'7%313>32#"&'#"32>7>54&# pH% IYj32&#".#" hyKJ(74H>u=u ]P 32&#"9 ky1Sl ikĈfLH'74H/οs5ig2V5 ,`l`IOrqU\kwp:)W@.!(*+  RYPY $OY OY?+?+?+?+993993223910%#"&546323>7!7!!467'2>54&#"Gy|/.  PtR1^^fD]X̫nea epwc EQxmqXN!K@' #" OYPYQY?+?+3?+9993392310 !7!.54$322>54&#"*#e(NF*.fZpegKg6FmX-Rxis}ތtry ;@   _Y _Y _Y?+?+9/+392310 !7!!7!!7y,-E,H-bsk"E@$"  $#_Y"  _Y _Y ?+?+9/9+9333310%267!6$3 #"&547!74&#"0:W%D0TtY8,1`vۑ7%MYB*M@)'( ! (+,_Y'_Y$_Y?+?+9/99+33933310".5467.546$32.#";#"32673|ȼix(mu;,;ǫuzAd^hcl<mlgM_erS`}W?@   _Y_Y _Y?+?+9/+33993310!!#"'73267!0U,dv$JV*A@E,L MOW9X@-   vY uYXYX+??+33?9+99933339929910 !#737>32.#"3%IR$ @C< %|%q@AUdA+\@0%(( &,- aY '&aY ''_Y!_Y?+?+9/99++393933310 4$327>32&#".#"326?!7!KJ(74H>lH.'fi=fY į{j940 (V"b4nUƦH3?\#3lL .#](D@%!" "*)&PY& !PY  ???+?9?+933333104>54#"!!3>3232!#"&,evO'Lt$$KK1|z0(>j ykkaO"WOz$\,(@ C ]qr^]^]  .@    _Y  ??9/3+33932103!3#!#5m(n+zzO2r$CB@!  aY?3?+?993399339310!!>32&#"! eVJ(74CBq{g @  PY?3?+?99339339910!!>32&#"! ؼUVJ(74FaB'KZ FkO ':@FyukM7ŗ MO#WM@@     PY  ????+939933399310654#"!67!3>32ev Lt W|)ySO kaC9dd&@@!$ '( aY _Y _Y?+?+?99+339933310"$54$3 >7#!"32654&vI%RJ 3*5|} Z>Ԏ+uҤ(?M#=@$%OY  OY??+993?+33993310>7#!#"&54$324#"32>GJk3 * 0'tIpK+UOԡ6}pqgWt?@!   aY _Y _Y??+?+?9+33993310 ## $!2%3 27&#"8GmyeD I>8:=WF#/0.%NxٵMWNC@"  PY  OYOY?+?+9?+?33993310"&54$32%3##'27&#"h3M™9&D^S93%X G YG@$  ! _Y _Y _Y?++?9/+9/3399333102)!#"&546332654&+bHL xLG%<&1ǽRtfkW-Q@++/$ .PY   'OY OY?+?+993??+333999310>32#"&'#!>32&#""32654&Ir|}  b3Od(E v+QuR0j_gvCMgVh^AFFOkymjk$>T@-   _Y_Y??99//++393993393310 #!!!2 2654&#!G!vٺ`⑕sQb{ul\c`:O*B@"%&& ,+ %(("_Y( aY?+?+9993333331046%7>54#"%6$!23267!"$:B~(O".PrY~L3!Y7 (7O=\['ŸX^C3$'6P=\Mdq2#6O'@@!!"")(!%%QY% QY?+?+999333333104>?>54&#"'>323267#"&#\}aY[Zek5cull)?n])91>.@CcZ:E4q@M%UW(0@# *) PY &?33/3?+93331046323267# 547#"&732654&#" `Q)Gs '6Le2**22**2or}>Az[(; ac*22**22U8#G@$  #%#!PY!  OYQY?+?3+3?+/399333310326?.547#73733#327#"'+E&4M Zff%0#h /( L:OT@   #$ OY OYOY?+?3+3?+39933310"&547#737>32&#"3#327x|f%Od(E v #h /( L QulGVc>8!.- Ws/@_Y _Y ?+?+339310327#"&547!7!-2F+_J9,,9#0- }D?w 9@! "  _Y?+?33993339933310%267!>7#!! $547!"'\|3*#47'Әd(lX԰YsWUgqUD:(I@$ $ $)* ( (!PY!QY?+?+?339/9933399333103267!>7#!!467##"&5467vevZ3 *w"&Ku:{*w^5 cZԂUq hdmb&D@%  ## #'(  _Y _Y?+?3+33933910"$&54%#!7!32>54&'!!"'r>,|<֫xt<,;}R| Z{ۈG5 Nz -@"!_Y _Y?+??+93310"&547!32>54&#"7632 c' xcBJ-D*^οGPq@7sPLO n8@   `Y ??99?+3993933310)! >32&#"p$JHZu9C&)+WU'9@$   )( PY PY?+?9?+339933310"'732>7!7>32&#"XaL&(/5UKG#Gxe6cQE225,=YkW (Sy" 4CJC4 %ih8'#$46OA#P@,    _Y aY  _Y?+3?9/3+3+33333910!!!7!7!!7!!4}-(&Ji-(6|kY:T@.    PY PY?+3?9/_^]333+33333910#?#7!7!7!3!!#&&S ()'&7(UG@$ _Y_Y?+?9/93+3333393310"$'%32>54&+7!7!:(JgMc`,X-(կUncZ,rc-U@L@(     _YaY _Y?+?9/9++3333933310"54$77!!#"327%(-UG,كlU YЋqWk:L@(  PYRYOY?+?9/9++3333933310267#".54%7!!#"n-ؒt &( %fofc i} orN#:-K@&-/'.PY-*OY/+?9/93+33333933310!"&54>7>54.+7!7!3267}\$@]v`46rfd( m2`W1b[bi>^H6('#'3%$(ˣvmGlRA,%$0"67\X _@1    "! aY _Y_Y?+?+9/93+3333939929910!!!7>7!7!>54#"%6$323ntM,'%7%f^Xl5݉=Pt_fNMX`;M@(  _Y _Y _Y?+3?+9/9+/33933310!!2!"&'%32654&+#,4 l\xaƾȯ=TZi:J@(QY OY PY?+3?+9/9+9333310!!2#"&'%32654&+#T(F0y៺ W^[npT:˸rh/RNbRUIq/8(E@$ &&*)QY OY?3+3?+993333310#73733##"&'73254&'.547҉%1%#CFioV^ƎI |R( "IrW΋%M@-;*HlN%-WQ?@    OY??+?99333399310!3>32!4#"$  Dr=**or#(:>f[`%k@ ??9310334M @ ?2?3993310333344R[R@*    aY aY ??99//3+33+39333333310!3!!!!#!5!!Rvvvv;oq O$ +&''= '@ %&+5+5$ &'']o@ %&+5+5: &G']@ 2 21+,%11&+5+5$ h&/-$W?&/M#W&OM9$ Y&1-$W#&1M#W?&QME+&$ &M%+5+5 L&D@ ::&;;A *%+5+5$}+&, @ & %+5+5#?&@ & %+5+5d+&2 @ &% %+5+5?&R @ &"%+5+5w+&8 @ & %+5+5U&X@ &% %+5+5w+&8 3@& %+555+555U&X'j<,&@''&!! %&+55+55+510w+&8 4@"&"" %+555+555U&X'j|@!*! %&+55+55w+&8 5@& %+555+555U&X'j ;@!*! %&+55+55w+&8 6@$$& b " %+555+555U&X'j@!*! %&+55+55?:N3+&$ 3@ &X%+555+555 7&D'j6@=2=<*%99&+55+553+&$ 7h@ &Z%+55+55 7&D'J-@D9<*%/???/????99&+5]]]]q5+53&P&%+5+5*[& @ @&@i@B)%+5+5d8'v@? &%%'() ''aY  _Y "_Y ?+?+99//_^]9+3333933399399310!7!7!3## 4$32.#"326?!NQ'f644kNVږg[=ιNq|,('WM)5u@>* $ (% $$%0)%76$2PY -OY( QY?+?3933?+9/99+?39333339910##"&'%3267!7!67##"&5323>7!34&#"32>8'(Wl!I -:ayNv$ *h^m{A]nu2[GK]UQ+Ȥ.moa! hw`d+&* @ !!&""( %+5+5W&J@ 44&55;%+5+5$C+&. @  & %+5+5#+&N ^@  & %+5+5dW&2?WM&R"dW&2'_@ 0n0/ %//&+5+5?W[&R'"@ -c-,%,,&+5+5U+&y 6@ & &%+5+5W2&T@ &# %+5+5$W?&&2 %+5+5$ &'=$ &']:&G]d&*@ %%& # %+5+5W&Jv@ 88&336%+5+5$AB@#`Y aY ??+??39/+933333103267!#"&5467!!!!!&cm{z1 #v'mrm ]wz㬪S1?;X<;@  _Y ??993?+33399310!>324&#"6+d!_~-aeKX)fU>ur}cv}T+`$&1P@ &W %+5+5#&QC@ ""&w! %+5+5x=&$'C-2@!'''$'',%O%+]55+5?55]5 &D'z1@ QQQQ<<&QQV?9%??9 *%+55+5+55]53&& %+5+5*&v?&? ?B)%+5+5#z&@ (&((+%+5+5*&vl@ (&((+ %+5+53,&$DN@&%+55+55 7&D^@DD&@+@= *%+55+553"&$'J&%+5+5 7&D@ E&EwE< *%+5+5$,&(N@&3%+55+55?:&HJ@ ++&''$%+55+55$"&(J@ &%+5+5?:&H@ ,&,Q,#%+5+5!,&,N@& / %+55+55&P@& % %+55+55$LB&,mj@ &%+5+5#&@ &|%+5+5d,&2DN@ ((&$$! %+55+55?&Rh@ %%&!!%+55+55d!&2*I@ )&)h) %+5+5?&RV@ &&&b&%+5+5$,&5N@##& %+55+55#&U@&7%+55+55$"&5J@ $&${$ %+5+5#&U@  & r %+5+5w,&8DN@ ""& %+55+55U&X@ ((&$$! %+55+55w"&8 J@ #&#T# %+5+5U&X]@ )&)O)  %+5+59A&6h**/%+59-K&V'',%+59s&7 ݴ %+5V98&WF  %+5U,A@"  % .%-&% _Y?+?39/93333933104'76$>54&#"%>32 7> ,;KrebeJ"c&NYP\.T}JS,XIs^yRR^!IC1]V,MwjMgͥI.AVwQN%@@! '&   QY ?+/39/93333933104&#"'6$327,54'7>[RU#4&,x*hbR)b5 BI[P6$z?m=-DH(FCa$+&+ @  & %+5+5#+&K |&." %+5+5*Wn5@   _Y  ???9?+993399310!654&#"!!>32^in]pWTukHOT:WE'5@`@39'-%>%4!%BA#6<  0OY (OY?+?+99?/3?3999333339310%#"&546323>!632#"&''67'547'2>54&#"2654&#"Gy|ZkL1PtR1^^fDOJWD2_n]X̫nea g hPxFF9^H EQxmqoA6-5_3G4$1X@1 (/"  32 ++aY!"aY!!%aYaY?+?+99//++9993333103 54'7#"$546?&54$3"2654&#"qi"dr #kYVqy_HxIP _rsķ#XXzj^EuJdg6'3H@'+$ 1 !$54 --OY (OY?+?39/+999333310"$546?.546732654'7'2654#"+QbŷMQblkWmxcpߒdGzĴ&(\:!Xeoy}J9k;oxƙG{Nsj#=@ _Y _Y?+3?+3333399310!7!!2'654#!7i-(^"+7h(3uj<:&_BS:=@ PY PY?+3?+3333399310!7!!2'>54&#!7 ()'vs0$81t&o\peH.$%M(.03&$&5%+5+5 7&D@ <<&99; *%+5+5$W'z,(?W:N'zHd+&2 3@"&""& %+555+555?&R'j"F1E@/%/$$$$$$@H$@H$@ H$&+55+++]]]qr5+55d+&2 8@)&)) %+55+55?&R' 3^"@335#/%##/%&+5+5+5d&2@  & %+5+5?&R @ &%+5+5d+&2 7v@&$$" %+55+55?&R'+4@ l%&+5+5&<B@  &  %+5+5W[&\@ &}%+5+5_W 8@ " !/3?399?393333310%632#"&''67&547!2654&#"PkL1ZJWD2_noQxFF9%MK:OA6-5_3G#WUM.9O@)+7 ! +:2;$((PY( /5/3?39???+933933333310%632#"&''67&547654#"!67!3>322654&#"kL1Yev LtJJWD2_noQxFF9%MK|)ySO kaoA6-5_3G8(O@(! &&*)$   OY?3+3?3?9/9933933333310#73733#632#"&''67&5472654&#"%0#IkL JWD2_n|QxFF&%MKA6-5_3G$W: !@  PY?+?39310"'7267!6_G$:C?WE]vFB]'6Dq@9%&&<!73>32#"&'#!7"32654&2>54&#"Gy|Zm?m|} &QuR0j_erLGPtR1^^fD]X̫nea g^_h^FOky}+ail!EQxmq>WUN$0?o@8 6)= / )A@!!!1+!+OY!9%%OY?3+3?33+33?9/39/339/93339933107!3>32#"&'#!7##"&546322654#""32654&&Ir|} tU$Iw衂)mLnG%QuR0j_gvCMgVh^_Yĭn[l%v{FOkymjk @H         _Y_YaY?+?+?9/3+39/9/9/32933399910!!#7!!733&537#7ơ:\ݶH M-hFRgFx"@ѽ>d&@P  !"    '( @  _Y ""!!aYaY$_Y_Y?+?++9/+9/9/39/+9/9/3993339910%.54$3273&'3 #"'#&#"*f`ywHv//Hb hᬀT=R  ) (!!RY QY #OY!QYPYOY?++?+?+??+9/+39/9/33339310%267!"'#&54$323&''&#"Sl ikeСbuYQ} w*hn%ky1ig2*AoV-`& &%  s+r <@   aY _Y?+?9/3+39333103#73!!!!+~~'k'kn(R,)WBs\@.      _Y ?3+33?9/9/3933333999910 !7#!7!7337#}9,77P,]%>KK䮮W-K2K@*$#0)0#43)$ 'QY  PY QY?+?+?+99333310'3267#".'732654&'.54632.#"HyE=!M'YAPy1imqOƤbU)O 8Fwq9R]FB37-E>x!-!)|W:@@! PYPYPY?+3?+3?+33339910#7!7!327#"&'.##& ()'vITTw9(<+YA[VYJ\egi[ hmpdrD@"    _Y  _Y ?+?9/+9/9/1093332654&#"'6$3 !-ҟn7P!(@l7"¹r~Lʾ/ >N'@   RY ?+?9/931032654&#"'!2XYM(Sx^v=Xa/zo{(^@1$  *)  _Y _Y(_Y?+?+99//+933393333333103!2)#%!!!2654&#!7!2654&#!vH??v'HѢ*&rz!wDieuZ`\iPH K@$! " _Y?3?+9/333333333393333103!!!3#! $547#26?!/f'd~g'h'7"nˑI0LWUgqN$@Q      _Y_Y !I<  @_Y?+??399//_^]_]]]+3+3+339333310!#7#!733#!!!3!#YKK@AAn,N,C-KWōnn__;b!KU$)/@c)$** ,-(' 1 0'!$!RY,..$.RY( $!HK$[$$$  Td   QY ?+3_^]]??9/]+993+39/999+99?3333933310327#"'#&54$323%7&#"%4'37#R.LBH߶b͡gs nS#.` ^e)QK)J~-<s8"kct|8/"x&J@%    _Y _Y?+?+99//33333333910!!7!3## %32>?# :,?h'1-~E .5K/-n,:0W^$W\P@+  SYPY  PY ??+9/3+3?+3333933103!3##"'7267#7!#SS'q_G$:C?d~((XE]6dW.*L@)!"( ,+$_Y_Y`Y?+?+?+?999333910"&54?# 4$327332727&#"vv@+/I-%rφw|Wku@UdDAjU_%/.  }Y uҤ;WN%1L@** 0 32",OY"&OY PY??+?+?99+9333910>7!327#"&54?##"&546322654#"!.YI-%r'w~&Iw衂)mLnG.t+(h  LT_Yĭn[l%v{Q@(   _Y _Y?+?39/3+3333399333933103!2!!!#%2654&#! ~vٺghsQb{ul\c`zNS@+    PY PY  ??9/93+3?+399339339910&#"3#!#7367!3>32LE-L'GGt't=  I\/8Um<7#73!!!#'k]aL&(/5UKGo&u=#+A,κ! A (Sy'00AnN+6]@20 ,#(# 87,RYQY 3OY &RY?+?+?+9/99+93399331023>323267#"&547654&#"7>32654&#"dlTv^\"G(' *VvOCSDTE%a^%IE%xa-#]UFOj:N'H@%&)(   "OY OY?+?+??99993333910%#"&54632367!!467'2>54&#"Gy|$ 2t PtR1^^fD]X̫nea>tpwc EQxmq&N%H@%$ '&   OY OY?+?+??99993339310>32# '#!767!"32654Gy:$2t QtR0^^fD]X̫>t`pw>b EQxm q#$3O@+1!*  54PY !-OY%OY?+?+?99?+933393102#"&'#!67>32&#"3>"32654&W|}  )Od(E :G0? QuR0j_erLGNh^;4%CJ^_FOky}+ail1N7@    OY OY?+?+99933310"%!2#"&'%3267654XSl kĽ ky1ig2_s5VN*R@* % ,+" (QYOY?+?+99//9239339310'67&54$3 .#">32#"'4&#"326KaC -ZPu\g{`-CLA2m;dqYm?_W._`B>nkb3g&5D5.5E:W"0M@*"(/12PY  +OY #OY?+?+99??+39332910%#"&546323>!327#"&5467'2>54&#"Gy|ZeF+^= )PtR1^^fD]X̫nea g#] }R EQxmq:!/Y@0!'.01  !RYPY *OY "OY?+?+?+?+9939333910%#"&546323>32&#"!467'2>54&#"Gy|4Od(E 4M PtR1^^fD]X̫nea32#"&5473267][BK޴cP`^'2jqJ|ɦct8kb8N!'f@7$% ( ) OY$%%"RYQY?+?+9///9339+393333310 7327#"&'#"&547%4.#"%6$2v2-?47"fstr 8#L@?LCN&L;$nxZ[eTV0OWAEMg NqN1r@?( / ,/##32+ RY %OY (   RYQY?+?+9///99++93339333310"&'732654𑯎&#"'!27327#"&'#[\}UG(Sx'-?47"fslr&Onz,QHQDOQ9:/YLL;$^h?R_ATN(F@% %% *)  RY!!QY!QY?+?+9/+9933310"32654𑯎&'2#".54$a^qd]dch#oLjccv왊q-|{YQEASV19ExG5 sVm]p˂9`Wp::@ OY QY ??+?3+33399333107!3##"'7326?#7% IR$ @C< %|@AlW)7m@2* ''&2&  98#PY -OY4PYQY H?2++?+?+993?+3339933339910"&'%32>7##"&546323>32&#"4&#"32>C:ayN|vN LH'74H-h^LcE-YOWPUQ+ȤooaB 32&#"-1.,%-P3VQb!9'a;]amBR#<$u8UD6Ib488('n~[XGnvSMiB#5;Z?XX::@   PY??+?3939933399107##"&5467!3267!T'KuvevXhdm{*w^#!A@"!!#"PY PY?+?39?+9333993103>32!654#"!>32&#"Ltvev˫LH'7ka?6WS|)y #W,L@)% .-"(PY"PY PY ??+?+9?+9333993104#"!>32&#"3>32#"&'73276rev˫LH'7HR3Lt"/q)07~y EHkao&  }|\ <@   QY   SY ?+??9/3+3393322103!3#!#7!TT%ZZ())S0-C:@  PY ??+39310!327#"&547`$,]=z:+Q pu9Mn: 9@    PY PY?+3?+333339310#7!#3!73]))ρ)K(jfF@!      ??9/333/33333393992399103#>7!>73%,+ {or'+ sqw.6yG?,9vS@+    RYRY  ??9/3/3+3+333993992910#!#"&546;!3!7#"3__jv#]\ w.)zg̤](WY#@   PY?+?399310"&547!327 /m/<)yWn{2A%X  WW@-    OY PY???+3?+99/333933333103!!#"&'%32654.#7! O&:?|A%QWn(ҢszO{bu5[U:,N@' +##.- & PY ??3+33?339993333339910%267!3267!!467##"&'#"&547![w{~XvMf|Pmz_[-y\_ )tXwq}k@dZ1yUW:(L@& '*)" PY??3+3?339993333339910%267!3267!!##"&'#"&547![w{~XvvMf|Pmz_[-y\btXwq}k@dZ1y#WM6X@.4#,#87 )/PY)  PY ?3??3+399?+//9993333310"!654#"!67!3>32>32#"&'73276=&*[w{~XvMf|Uj"/q)07~|{[-yS_ )tXwqf@d&  }Z1yWM&G@$"  "('PY PY ??+??+939933399310!654#"#"&'732767!3>32ve"/q)07~ LtS|)yU  }O ka?6W#WM(I@'$ $*)!PY!PY ???+9?+93339933104#"!67!3>32327#"&5476rev Ltl.>)Yk ySO kao&W m{3A|-: .@   ?3?39999339910)#!3"M:*?M@N#i@9  %$  PY PY  OY OY?+?+?+?+9/_^]99393339910%#"&54$327!!!!!!'254&#"&,ǩi (2+(Z0(&柲vfi5I5C/ͬn{u9dN,E@# )) ".-"## &&OY&OY?+?3+39/93933310 326?!32>54&' #"&'##"&54$tJNUp$)OBGpAge|(=v;X^cgl}q>=W N@'    "!OY   OY??3+3?3+3?993993333210.5!!#254&'!"ObAJJOtlbאָgeWHn~ ؿ«kU vlp~:2@  PY ??9?+333339910'3267!!?##"'(E-{#eI\/8x0kN2@   PY ??9?+333339910'3267!!?##"'(E-{#I\/80x0kW:;@  PY  PY?+?9?+3333339910%##"'73267!327#"&547SEb/8.E-{#e2:.>)Y^ ~sr+*( m{3AWzN3@   PY ???+9322399310&#"!67!3>32LE-{#  I\/8UUy32LE-{#u2:.>)Y^   I\/8U+*( 3Ay)YZ EpnmqOƤbU)ON3s&W m{3AZ$KBFB37-E>x!-!)Wz @PYPY?+?+3310"&'732>7>32&#"e-e*4G/='fi*$OIS&W&GXzG ]f~Wz"C@$ !$#PY QY PY?+?3+3?+3393310%#"&'732>7#73>32&#"3\&-e*4G0='$fi*$OIS$N&KdG ]f3WKM+@ !  PYPY?+?+93310"&547654&#"7632327 77H.*EU 05B<*DWE7+):5~F6!-55.\W$0<@ ".!" 2(1 %+PY?+?33/3933393102&#".'#"&54632>"3267.oi*$OEQ$T._hsHѹI7'-AMI5Iz| UgISQ%0{#@#@0*'Ŝ(?:*54&+73232654'&546;rC$#5=5#k(La.971sko7CYm=~ʹGr[H9,YJ/jWR~;s}9uu(jygM/@   PYPY?+?+?933102# 47!32654&#"7>|кr{y W]<@)7('yM8<\~@3FA  : "@  ?2?33399310!!.5!PG<>:]{:B@!     ?2?993?3339333333310!67!!5!'!)+5*.)E4*5:lZD{|I7@   PY ?3/+933399333102&#"!&7!>aL&(/6SPCGx (Ys& $ sҞp:(@  ??393393310!!!CV)^&RTmYW":G@$ PY PYPY?+3?+?+33333399310!7!!327#"&54?!7 ()'v8:49/<'YQ z&o\&+, v12M5;:!Q@+ !# " PY!  PY?3+33?+39/332933310?!7!7!3>32#!2654&#"T4A& ()'vzoIF9G%1eH`G\obi2,!NMW2:J@%   OY PY ?+3?+9/933333933102654.+7!7!# %xAzQ%'&NO@覍bv4[䶑a)W2: *W@-)$ ,$ +PY! ' ?3?99//9933+33333933910%&'#"&5463254&+7!7!"327&(+" òضQ%'&NK^]N]pa:!GI&Bt|[:13;TT"8@ PY  PY??+9/9+33993310332>54&#"%6$32y:MUMb[D? |LofwXeC֝vhu8@ PY PY??+9/9+33993310!.54$32&#"326754+3254+1M_w[\5:I|N>4m8EN&<@$ $!(' QYQY?+?+9/3933310"3#"32>54&'2#"&5467.54$^S`a[#VF_Wg<㧕Vb ON@6>@q熃ˤmS?0&R@+& & ' (#PYPY OY?+?+9/993+39333310.#"32?#7!! 4$32>32&#"ilX]Ryjgk(\+n|AH'7{QVlڋz(&p۶*9 #:FWz>@ ! SY  ?22/333??+3333333310"&546;!3#7!26?#"g' .((;EN rYP9Wwm)̴Mb:L:,7nZ: 4@       ??399329933393107!!! U/:K4R@)(:@PY?+?99310)!!):;W*R@+#  ) +,%OYOY PY?+??+?+993993333910>32&#"!7##"&546322654#"O RH'74HU$Iw衂)mLnG8 54&#"%6$32!!!7!7;:MUMb[D? |c%%@/fwXeC֝J u k@;! "PY QY     PY?+?99//_^]]93+3+33933993399107.54$32&#"3267!!!7!7z [X!?/;K%%@Jڜ%CŴgq Ѻ:*-n@;+,,") .-/++PY%OYOY,,PY?+3?+?+99??+33393392339910!467##"&546323>!!!%2>54&#" Gy|ZMf'XU(PtR1^^fD0~c]X̫nea gn\ͬEQxmqa1W4B@I&*! -004:1A1 *C,D1**!#OY--PY  =OY 5OY?+?+99??+3?+99/3?339339339933310%#"&546323>!!#"&'%32654.#7!!467'2>54&#"Gy|ZM&;C|A%Q[{ PtR1^^fD]X̫nea gn(Ңq{P{bu5[xpwc EQxmq:5 U*8;E@P&!E?$?;#$9::*0'7'$GFB'E:'PY!'99PY  3OY *++OY#?+3?+99??+3?3+333/3933923399333910%#"&546323>!!!>32#!'?!467'2>54&#" 2654&#"Gy|ZLa'bzoIF4, PtR1^^fD1P9G%1eH]X̫nea gn\obikGc EQxmqV^2,!NMVz8!5^@3/-&-33  -76QY& 0 OY "OY?+?3+39?+93333339910)"&547#7373!632.#"%2654&'.547!5 =|c%0QhbUIPƝOkuiOJe 0ZulGVE>x)2)Q;?37 MqRM<8!.5VW*3a@5-.( '22'!4!5$PY/OY +PY PY?+?+?3+3?+39333333910"&'732>7#"&547#7373!7>32&#"27!-e*5F/='pk|f%0 fi*$OIS&|8Kh W&GgulGV1G ]f~b 8![P81=z@B0822 '&++#!?>)!"!OY5 0"&$"-PY;QY OY?+?+?+?39/993+39333393393104$3 .#">32#"'#"&547#73733#3267&4&#"326 -ZPu\gx~ r%1%kT)k0CLA2m;dq._`B>nʎwq,2J-V7%CQ&5D5.5E:W:i@9(!   2(<;/5PY/! %%PY%QY  OY ?3?3+3?+?+9?+933333993104#"!!!#737>32.#"!3>32#"&'732676bv讞%IR$ @C< Qm-r!'E&4M{||q@AU q[o x!-!)|LKq <@     PY PY?+3??+333333910#!!! N''(n\oV&*e@3(%$""( )**  ! +,  ??99//33933333333333933333310#&57#3?33#&57#3733(** $&Ӯ+(** 3&Ӯ@6g/ [$x&Y4@6g/ x&YJ@%    PY PY?+?399//3+33333933310#!#!#!#!M4j4_r4j4^r 4 9WxE%M@(%!""   '&"% PYPY?+?+?9/3?9333339910%#"&547654&#"763 3267!!?H11BEEi)m3gpOlhi%745yyr.B~W9WE0U@.0- #-  - '1'2*%PY*0 PYPY?+?+?9/3?+3933339910%#"&547654&#"763 3267!327#"&54?H11BEEi)m3gp DT)qc*lhi%745yyr.B/#5F??3@  # *(?3?39?33933103>32#654#"#C6{Mgi\PhEtP>MCgaBN'[tTUBB 7@ !"# *(?3?39?3339933103>32#654#"#>32&#"r6{Mgi\PhEtPt8-$abMCgaBN'[tTUX]a d/@   ')#?3?3?339931073"'72673\F+(/* wnQ 5=%gjH,@ ( '*??3?3393310&#"#6733>32n2/Em1_A%!C I[N 'l2@  +  *'??9?3332999103273#7##"'F2/Em.bA%! jXQ 49@ ) ' +?3?9?3339339910##"'73273327#"&546/eD+20E!(("F7XZXR k LX.H 7@    ' *?3?39/33/2333993103#!3 32654&+8C9@UM692a>}=<'3J@  ' '  *?333?3?3339333333310#&=#3>373*/ ;42R7373>8'$88.1jCKYc >S% ax^. &  lp ]?Q?Q?UcwH @     /329933102654#52#c51fi|{j-$Ovh]^gcwH @     /22993310"&5463"3Hj{}hf15wg^^gvO$- -@   *?29/933399331032654&#"'>32O)3YuC>s/*0 {z @   `/]2993910#73373==e/9310#3eg[@ Y/+3910!7!!Nv!CWO/9310#3OWg a/33910!![d!l@ /]9910'7!zl&lv@ /]39107!ol&PY:@  ?/99993310#!3Yv%cʛv:,,#Y:/9310#Yv%:,c @     /3299331072654#52#51fi|{j-$Ovh]^gc @    /22993310%"&5463"3j{}hf15cg^^gvO$-n "@ /33999310%!53533y|x|~ @  /239310##5#5!x|ym| @   /933310##5#53533x|yy|xhh|xx/23310'7!*+c1@   @Y/+_^]2933310"&57332673֌[INs+&J\WOJ@ /]299107!J))pl )@  Y [Y/+++339310#"&546324&#"326ߓkkiiI63JJ35Jniiii3JH58HJjW @  Y/+/99310"&546733272Zn[Y=U,#15OW`SI2&7&&"D;@  Y    @Y /2+_^]+3932310".#"#>3232673p,QKD*7'g-SJB+8'&/&3H&/&8C: $@  [/2+39323107!!7!:     + +hm9@   /32399310%3267#"&/C-?*G*"y{wr=L;8ba#q3 &@   /33939107'77'qiiiklm=@   ')?3?39333933310#"&5467332654'"?tclFV_ *`Ne{`T3232673E(JC>$1{>\E)KD<,/z?_#)#,Cla;"*":4dh<@  /993310!!?7 7N7 7?@ /]299310!##?]tq!~@ /]299310#5#5!~t]qYi@ /]29931033!YtKqiR@ /]239310!5353RtiqW@  /32339310!3!53W}W@ /233910!3!PW}W "@  /333399310!#53!]uu #/]10%7! +\ #/]10'7! +  /3210#'##73@>@#>+@   /   /3]210".#"#>32326737(HB<$3|CbD)JB;,1z B`##)#,Cfg;"*":4jc;i$/310!!vc!̨z@/2105!z@NN /2]210"&57332673<[INs+&J\WOD/2107!))=/2231073!73++v*+:+  /2104&#"7>32#?6G@2< h,vhi 2hfG@>OYKRp*ؘ{&ISPL?:?;??/l/]10'7!zl&l/]107!l&WF/10#5#535F|3*#|}԰lN /3210"&5463"3j{}hf15Ng^^gvO$-WH/10!53533Hz|wW|WC/10##5#5!Cw|zm|WT /10##5#53533T{{{{{{rrqyy;/3107!#Y#ֹW;d /2107#"&'732?;) 1v)7/$dϨ  }Wd  /2107327# 5467:$l.>)Yk)d&W 7F /]3107!)),rM/3331073!73#++v*+rWZ   /3210#"&546324&#"326ZmRPppPQnb3**11**3RnlTSlmR*44*+669 /310#67#73pl(>9dF~FrWN /22102#"'732654#"76ZPX.6"1RFf%;5:TBnkv'&=mW0  /210"&54673327Zn[Y=U,#15OW`SI2&7&&"OW/10#3WgW /3210#5!#!SW}C  H /22+222310#"'#"&533253325cXZ77[Zdh\Zc\Ziw==|dqqqq.l @/]3]210#73373"ll @    /]3210#'##738x[EHv.ur@HH@}0@     /]3310".#"#>3232673,E<7)6'g-F<515'}&/&1J&/&B9Xb/310!!~d'?T H/+3105!?NNP= /32105!5!Pssr(l@     /3]2107".#"#>3232673T,QKD)6'g-SJB15'&/&1J&/&B9O/310!7!&w)1/310!5!1q /10% 6̂* /?103K) ;N /32102654#52#51fi|{j-$Ovh]^g-W /3210!3!53W}WI /3210!!5#IxbWx괴I@  /329/33310.#"#4#"#>32632z )!\cZ"* peL[77VMh "qq"P[==ZQzt /10''7'77t]ut]xx]tu]v]yy]uu]ww]u2nq /32104>75>54.2.MM&0 Yo&-2= Y 17<AK["18:q$  /22105!%5!qg$NNNN/]10'7!|z&/]107!M&@   /   /3]210".#"#>3232673 (ID=$1|>^D)KC<,/z?_#)#,Clb:"*":4dh<?: @ _o/]3333107!%73!73 ~++m++!$%W/]210327#"&54?39!,7:K  ;@i:,' /3210#5!#!,S}Wn~/3]2105!5!jjjjW_ /3210#3#3WggiG/]310#5#5!Gt]iq4v( @  /  /333/]3310&#"#>32732673#"''U $|?_D7IPTM#2z$}]2N]S##9he;+h5f+Cy,z6+!7@  (HH/3++299//q33331073".#"#>323267373 ;60'd2J7!<50#%a2L!$5XM/!.*TP01`31@,/'' '' @ H #/+299//33310".#"#>3232673".#"#>3232673c(ID=$1|>^D)JD<,/z?_'JC>$1|>^D)KC<,/z?_#)#,Clb:"*":4dh<#)#,Clb:"*":4dh<b /105#'735莎||||WR/33105#7#||W玎 %-5=EKQYaiqy@U|Pdh\`@D,x(tt ll$pTTXI88<04xpXI<44557449 885667775558849*557sNsmmIk0/1057'50ߞ!OOw  /2210"&5463"3j{}hf15wg^^gvO$-w@  /2]29/3107!2#74&#"#>((7YEFgp06AOGRd /10''7'77d]ut]xx]tu]v]yy]uu]ww]uW/10%%!߾OOW"/1057'5"ߞ!OOIW @ ./99//331057'57#'#ߞ!~PNOOvߞ!)w  /32102654#52#)51fi|{j-$Ovh]^g>L  /310#"&546324&&44&&4&44&&44W[)@    /33299//332107''7'7'37q!xYXFHY[x!rg2_f:yy;e_2AW+!@#))## /33322310#"'#"&546326324&#"326%4&#"326mR\77\PppP]66]Qnb3**11**33**11**3RnBBlTSlBBmR*44*+66+*44*+66wf/9/310#7!3w_q<_q<׽)WW /2210! $'332$7<4˥@g,Xe-swyA  /3210! $'332$7<4˥@gAXe-swX/310!!9X^/310!!9@  /99//3310"%$#"#>3232673[zzYi .zzZk-DDEMDDGK2A  /2210&$#"#! {7}L(t<uul~}bI/10!55!5||cxiw&'*#?3??10733Kn|rIxf#hr|sp/tuaw"{q '*?3?39910 #373~Yvnx,@ /]39107!,&l@ /]3910!?z&qWr"@  /]2993310327#"&54?3!,7:K  ;@i1N/@    OY OY?+?+999310"%!2#"&'%3267654XSl kĽ ky1ig2_s5?UN&F?]]51N&5#@oO??]]]qqqq5B /99107!~!$%U 2@     Y/9/+333399331073%73!73,,L,,!%v)3&$9Ӵ%+5?5Dy'({92   @ %O`]q]q5+]5?5b'+x94@P 0 @  %O Pq]5+]5?5]]',9:@  @%?_oP]q]q5+]5?5]9'292M@ %   ]]55+]5?5 '<9-3@    @ %o]q]5+]5?5G&[39b-F@L+.%++/+++/+?+O+_+?+O+_+o++++++++++ +?+O+_+o+++++++ ]qr_q5+5?5$+U&k:^@ & %+555+5553$${%$2'@_YlmX+??+3933310!!2,*d @@"      `Y?/]]?2?+39339933310!7%&5Y,-#CPb*m$(#=$+d :@"!_Y _Y _Y?+?+9/+93310!! #"$54$"32654&,K,%Rv|};?iِ Ҥ($\,$C. 2@     /  ]]??23339933310%!&'!!u(V2+uqX$0$1e :@   _Y _Y_Y?+?+9/+33910!!!7!7,9,--W,,GWd2$/@ `YlmXP  ]]+??2+339310!!!!s$Y3 E@$   _Y _Y?+3?+3933393310#7 7!!!/2!),G+  -Bs7<`v(a@6  ( $*)( (aY @   aYlmXP*]+?2+3?2+3993393391032654&#7#"5!37!32!##";/6{k&L`EECsQ&@.vgBqԴz$>tԌ'ʼz;`@5   ! _Y   lmX`!P!!]]]+?3?9/3+3993932933310!#"&547!!3!3267!#SSRT &ZZ&UFNL4@1j*F@%#&&& ,+# _Y _Y?+?3+333333933910 6;!654.#"!73&546$)^7}˔4,?2\RtA,(,tp˫- B<SZ/tږP Z$L&,jK@&%+55+55&<jgK@ &  %+55+559=&c9@ ,&,f,/%+5+5&g9@ (&((+ %+5+5%W&i9 &  #%+5+5C&k9@  &  %+5+5fdU&w:@&i$ %+555+5559=M+Q@. ))#-,%OYOY--P-?--]]]]]?+???+999323991023>7!!&=##"&54>"326?4&dMD* ]uJʏYqAU5XMw+%ci~x}dtҺ'cƒuĶ@W*f@6%" ( ,+%&&%OY&&OYOYXYX,]+/?+?9+999/+9?33399339102#"&'#!" 32654$54&1Qj9qd6G\54~9( Q̴S^: y8&g&&-ev"FXlW:>@      ]?222?/3]3339333310!67!!67l N LE1QKo:9,d{7 "M@(! $#" "OY OY$P$]]?+?99+399339992310%2654&''.'!"$5%7!->J}O*rL) lN:$GЭ_T0ZlWs]ʏk8M'^@0 %%  )( ! !RY RYOY)]?+?+9/9+999333239910%267#"&546?.54632&#"3"YEfڥXeӓ9BS_MOO=_TzxPilTwD=EI!JB;K1n@"1@ !#$ !"!QY"/?+33339939310'>54&'.547#!7@"&Qr|\H3euy@WH4%̽f+8*"/wX_Ba?E*>(MtQ8%WMV@-!    PYXYX+?3?3?39?9+99993339310!654#"!654'!3>32et Ku1m|)wSD=<*&79#hdlLC@#  OYQYQYO ]?+?+9/+99339910  #"&546267!"!654mehZb+La+z8B܌cpWC : D@*  XYX0 /]]]qqqqqq+??999310%!.547!`*  V;E'@0N"%: K@'       XYX/ ]+?3?29333939999910!!!! Ef.*q: 23@  PY ]?2?+339933910)&5!.#"'632: s&'83/+Zf =-54'!!!鏂@"w,L5>@:1p1H@%(0($ 23%  OY1010QY1/?+39/+939393310'>54&'.546$75.546?+7$ٸL&̹q]2A% NaIK'#@]B`)D)3C )tՒ v_b?MRC:&V@/&## #'( %  OY &  OYXYX+?+3?+?9939339310!>?"7>3!#32?#"&547r%ra[NBP'm1s%o[5 $v3s} k||} !^  {t>:)WOM@(  OY OYXYX]+?+?99+99?3339393102#"&'#!" 3254&j/S4<2&sB|cO޹ԧGBuW 6>ɄLn=O#0@ $% OYp%]?+/9939933102&#"'>54.'.54>oPpEnFb8u_=1 ,brOmPCTV,'>ZDa:G! ,(#0}&z@: :@    ! "OYOY0""]]?+?+3933310"&54>$3!#''2654'#"a#J%_㢞!Gfl3k͋]yoBWx9:K@*   OY OYXYX@ ]]]]+?+3?+9939310"7>3!!32?#"&5477Q'f4%m[5 $v3s} k| !^  {t>:)fd:D@$  PY XYX?]]+?22?+99993393103 4'!#"&547tRV&,& v:GKN^PõFNU@WcR ]@3  "!RY QY RYXYXP"?"]]+?+??3+3?+/9933933102#.5%"$4ON$~^[hM<jh)bW <g@6      OY XYX`]+?32?3?+33999939933233999910%>7!!$47!!FfxGvy#OOCep 8yx`_kyDxF(7hO,T@+**))  # .-(&)) &&OY QY XYX+?3+3?3+39/999339391032654'7#"&'#!"&54$7327!J=RoC6x HKE@1-fOgu_7ͽ12YAlm)AC&kj@ & %+55+55fd&wj@&n %+55+55?&R9@ &%+5+5fd&w9@ & %+5+57h&{9@ -&--0 %+5+5J(5l@<&!3!,367/PYw  ### )PY?+?3_^]99//_^]993]+399332910#"4$32#"&'>322654#"2654&#"Iz%ԹR)6B?P@[q@}$^vctAuDo܎~`m_&Oa6K .$35$mbcAlPY24%4PY%%%--8PY-!PY?+?+99//3+3+3393933210##"&54>54&#"76323267.54>323!654#"7E&bjN];6P|q΀EWzk(F@>!2VN%KMM&0& Vo|i]yuLcTQb/@   `Y ??99+393310)!>32&#"q5_M]W2BR<1BB?dVQBQ?z'2}&jK@ & %+55+55DW"^@2  " $# OY ""OY?3+3?3+3??993393339910.54$7!>5'!"O4JJOtiUc]bjWȿ1~ǾҰkUv myA:0Q@)+ *#*12&&OY **  PY?+33?39/93+3393333310!##"&'##"&5467#2>54&'!326?!(<|@aj{MtAUuMBWt!! L:oטzѺsAz~IBۆcnA3X^WA1_@3 +. $.132+PY+!(PY! PY ??+?99?+?+3333393339310 !654#"7>32!327#"&'732?.5467=c,4 q/{UhmcC8>!/q)KS\YbA|u|wg̑Ks }Iy_gdW9@    _Y  _Y?+??3+3399333310 !&54$"32654&%RSSv|}a&2Ҥ(?WM9@  OY RY??3+?+93333310!.54$324#"326UU'tIvI2[#6}p~<@ _Y  _Y ??+9/9+339933310!.54$32.#"327-1tY24!lJTa|9Pk|fs WN*<@ " ' "+,(%%PY%OY?+?+933933102>54&'.54$32&#"#"'7fb@GHǢV SM5b7lT4.D2-#5A{|ȡ]\MkM3-B`H0%$ 2@ _Y _Y ??+9/+39310!!7!!!0GQ%s,aW: 2@   OY PY??+9/+339310%7#!!!!4%$''NLX@oz4+D@#'  ,-*+++ $$_Y$ _Y ?+?+99//99393310327#"&547'>54&#"7>32mH.;+>*"&x|GJ8.;,=*"&xAYj8-3 i^iAD ξ7.3 i^=,K 3@  PY??9/+33933310!#!73!HK  \1?1YA@$  ! aY`Y?+/9/////+933310"'6$32',?'&''.JOPE!D)T;;@fr{oӶOnWNPCYS @  //933310'%&''%&$'7a_8 +:9O;YVc̿[?vLW0U@+ ##  *++21 *&aY _Y?+?3+3?3393333933333107!26?#"'#"&547!3267!3267!#[,~wDyOsn &ISc&ISc(gWfpyRObF85ZH3TNZH3TNkMW:/S@*!$$  *++10 * &PY PY?+?3+3?339933393333310!7!26?##"'#"&547!3267!3267!]R(cli@#Cv{Vsv{VqoWnibpmBJF7QF7DРV|;@  _Y_Y   ??9/9+?+33399310"327!!#"&54>32&}'fkXiU?%vw6#͗"@@ # $PY  PY?+?9/9+33399993103267!!7##"&5467>32&#"evO'KuLcQ'74HLԁw^4hdm 32)7aUK'fbY!7l'AJ3\#Q< w)4Z@./*!!65PY-(%%%2OY)% PY ?+??+99//992+3339933310#"'.#"#>323267#"&54>327327.#" G[ yc9;R{;WMO3l {܃eg'CBx<\iPUf+ά9!^%-%sqkZ-A&3z'8D&<0M@'&+ +21/) ) ) //"_Y/ aY?+?+99//99933331046$7>54&#"%>3232>54'%# &yDtRB1UvžQuT&gu6'6M;EQCDNvYA30-CY>VK>rJ-4KTVv4I);@ !&+*&! PY$PY?+?+9933310 $54>?>54&#"%6$!232%H2X|œtsn0N+ΔJ.aUbI8/#_NCNhkB?R$iOWJw$8B"%K@)#%$&' _Y$%%aY?+33?393+33933107>32.#"!7'.#"'>32 &ZvO.oS'7O*)2)8>7*r(EG%w5]:0!-/32.#"!7'.#"'632 !_ONanB+8V+g%D%:B8+c( Qv/zHfUKi*40r3r.6*iLTN$A@! ## &% _Y`Y_Y?+?+9/9+99333310!">32# 4,!32654&#" Zg]H䫸>u54&+!#"'>;!32 6C*![LV"==++m)10+&bVU!'U>qi<R I@$   PY ??33+333??399339929910#7!%x2:1h2WW`A(I@'% %(*)"PY"PY??+?99?+33333393310 !654#"7>32!327#"&5467>YXc,4 q/|Thmc,4 q/{WeA]fs~vd̜Ns|wf+WN)I@&"'+*$OY PY QY?+?9/+?+999333310#"&'32!.#".54$322654#"o+Dt;&URa;ٔn˪VH{25ny$vRlv?UNF$W\Md?:J@( ,<  PY PY ?+?+9/_^]_]3393310"!!;#"&54$3!̓d(g(!/(lvwj:H@' ,<   PY PY?+?+9/_^]_]3393310732#!73267!7!4&#('([xoޣut˂n$.Wd& <@     ?3?39/9/39/3393310!# !!!<1wW::@ OY PY?+?3+3??339310!##!>!#67p $t*! Lpn[ L uvQW0>D$FWO%g@6#'& OY OY OY ?+?+?9/3+39/39333399910332#"&'#3#!7#" 3254&4j/ 'v<2&sB|cx ޹ԧGBQmm6>Ʉ8@ _Y_Y?+?+9/9/9939104&# '!2#"$'%32cǿ3vEutsGk|Pd&&b:H@# _Y_Y?+?+9/9/9/9/993923104&# '!2#"$'%32%!cǿ3v;!;EutsGk|P1$&('@ & ^ %+5+5$&(jK@ &%+55+55"L@(!$#_Y _Y  _Y ?+3??+9/+33933910>3 #"&'732>54#"!!7!Ah)Nx~=(]8JX5ҁ9,,8/4v6S_<1^1Bk$5&q@ & %+5+5dC@"   _Y_Y_Y?+?+9/+3933292310"$54$32.#"!!3 ǿy'3v3-  Gk|¯uA6$\,$L&,jK@&%+55+55-r$`@2  &  _Y$_Y`Y `Y?+?+9/+?+9933293333102)! #"'7326! !2654&#!} 0tq|sf9:02Rshmx|PϳDk3neY[%W@-    `Y _Y    ?3?33+9/33+339333333102)!!!!! !2654&#! u-v'mm'mx8|Pϳ\1neY[ZF@% _Y  _Y?+3?39/+33933310>32!654#"!!7!!ARQPڗ9,,8^4HR_Q15_$`&&%+5+5$&@ &'%+5+57G&J@ &y%+5+5#h B@%    `Y P  ]]?3/?3+3933310!!!!!O&'i'Ohsh3$$Z A@#    _Y  _Y _Y0]?+?+9/+9333102)!! !2654&#!e 0#,Ax|PϳneY[${%$5!@_Y??+3931010!!5,'dohc@3     `Y `Y O]?3+3/3?+3399339333993310%3#!#367!!OxOYJMthy{s*$(!o@?!!  #"  aY !  #]?3?29/3+3999339233333310!"'!&'!3!267!!#vI)*XR"}[vIW*H7&  A@   `Y `Y?+?3+399?3393210! #"'7326!!Vitq|sf9:02RshDk3$0$+d2$.@ `YP ]?3?2+3339310!!!!s$Y3d&s77I@'    `YO]]]?+?33399939233310"'732>7! !%kvO?2TQF)5L*(UlXƌN8(a@5 (    $ *)( (aY @   aY`*]?2+3?2+3933333991032654&#7#"5!37!32!##"; {k&6`E/-s;&@vg,qԴz$>tԌ'ʼz;$h 6@   `Y?3/?+33933310!!!!3O'9hsstD@"   _Y   ?3?9/3+3993932310!#"&547!327!kYQP v}'#1"û@RbK*ba5$ B@% `Y  0  ]]?3?2+3339933103!!!!!$ss$hG@)     `Y 0]?3?/+339323310!!!!!!30Ohssst =@   _Y  _Y _Y ?+?+9/+9333102)!7! !2654&#! X9,mx_|PϳneY[$#D@#  _Y _Y  ?3?33+9/+339933310!! 2)! !2654&#!'T 0'mx|PϳneY[$Z :@  _Y  _Y 0]?3?+9/+99333102)! !2654&#!e 0'mx|PϳneY[*U@-   _Y_Y_Yp]?+?+9/+9993333310 #"$'%3 !7!654&#"'N6C4{r_-"-j_} }jG#'S@, % )(`Y !_Y_Y?+?+99?3?39/+93333310 #".=#!!3>"32654&;mஏڔLv'm${nnWڃτטSϠ(O@'    _Y _Y  ?222?+9/+3933393293210#.54$)!! !"3!,Dq>2.he}wwcPmVprUi 7ND]!+K@(! '',-!$$OY$$@OY-P--]q?+?9/+939933310%2>54&#""54>$%>32DTsN&fdrDn]=[E-ιͥhGMآM9vIt|`kyx%ДcK38_xW'D%V@-% '&'%%RY%% !QY QY XYX+?+?+9/+9_^]9933993210! '6$!232654+72654#"k~t,}Wсu Ajz[)kوLUPI~wr.O*G@'&  ,+, &QYOY?+?+9_^]9333310"'>323267!"&54>7>54.Dgc4Ji-wy]aVbt=+H:Q0XxV/0,3&yEO8頤_]+" $!<-E@&+!  /.%QY OY QY /P/]]?+?+9/+93331074&#"'>3 #"&5676$322654&#"W[: ?!4O- tiBok<]F1 j}M ͙vQ,SvLpr$NyU@:n?:NH::!@V ! !  !!"#RY/!  XYX@#]+?3?39/]]3+39339333233399999910"'!&'!3>7!!##c@!'V12(\\+2EC@@!BW 6;!eyO[,&#R^|U- A N%d@9 # #'&@'`'  RY  RY QY?+?9/+99+9_^]_]9333310"&'732654𑯎&#"'!2#Y^}UG(SxRTm{,OJQDOQ9:/uN}J ~aU:XU&XR)@+ +p++++& < ' %+5+5]qr$a:Z@3     RY/  XYX`?]]+?2?39/]+993299333910!>7!!#![31BHFBHW:0Hj_& A:H@&  OY OY XYX?]+??+?3+3991039933!!#"&'732>7!=`SNUeA&`$! 018JaB |ˆP! F~ #:P@,        XYX]]+?3?39999333393310!67##!>!'3b l=W+v~C"kP":iBg#: \@4  OY  XYX _  ]]]+?333?3339/]q3+399333310!!!!!TTZ}Z:T1:?MR#:2@ OYXYX+?333?3+3993310!!!k:|:WNS?UNF#MPW:\?W'4C@LA$-:3$EDEE0EE !5OY! /OY (OY =OYXYX+?+??+?+9??+_^]q9333939310"&'!7##"&54632367733>32%2>54#""32654&usT$Gjwڙz'D%VAnujIgI)at@n cP[h=Dh^bVȩoZm iA|cZGG~ߪn+ptljk:[Uh:_@3       OY PYXYX` 0 ]]+??+?39999+/93333399103267!3##467##"&5467vevtOLt:{*y^ kaoj:P@+    PY   XYX@`]+?3?39/+339939323103267!!#"&547GAA1]paQ| I:-2?V|7+U:,k@; +##-.( % & PY '&XYX.]+?333??3+3993993322399310%267!3267!!467##"&'#"&547![w{~XvMf|Ujz_[-y\_ )tXwqf@dZ1yUh:.v@D +!((##" !"&% "%0/&(#OY  + PY( !" XYXP00]+?3??2+399+/933333339910"&'#"&547!3267!3267!3##467#|Ujz{[w{~XvuPMwqf@dZ1y_[-y\ )tXM0: J@'  RY  OY RYXYX+?+?+9/+33933310! '!7!323 54&+0'U@huS)gMHJ&:U@0  RY  RY XYX/]]+?3?+?339/+1093333!!32! '3 54&+0Uh@hu::M)%oHJ&H: B@"  RY  RY XYX+?2?+339/+993331032! '3 54&+Uh@hu:M)%oHJ*Mq@A 0    </ OYQY?+?+9/_^]]_]39^]9]]]93333102#"&'%3267!7!74#"%6$idLiy%6Qo+ M]bBSU#P"Q@-  $#OY OY   OYXYX+?+??9/_^]+?+9333310#"&=7#!!36$324#"32>ZT:7j~E_akxC1:Tzs}t: b@6     RY  RY  XYX+?3?+9/_^]33+33_^]393239310 !.546)!#";AMi$U^~pYJM]NRDH?:&HC@ %%&!J!$%+5+5?:&Hj@ &$$"%+55+55#W*@X $$,+RY @H! ('!! PY!! ! !PYXYX+?+?_^]+?39999?39/+_^]3+39333399910"'7267654#"!#737!!!3>32_G$:C?zen!8!#KuWE]g|)whdm# 4@ Y@OYXYX+??++3993910!!?!%O::e +?_Nu@D %(  </  OY OY?+?+9/_^]]_]9^]]]39]]]9333310%27#"&54$32.#"!!A4[Qaz*6%[2VæZew4xl-KV#\L#&j@&%+55+55$W\MI: )f@7 !! % +*  OY)RY# OY!##RY XYX+?3+3?+?39/++3993933331032! '!#"&'732>73 54&+U=`SNUeA&`$! 018JaB@hu:M)gˆP! F~ oHJ%:`@3   !   OYRYRY XYX+?222?3+39/33++3?39333331032! '!!!!3 54&+UVZTbSh277hu:M)1:ToHJ#$a&v?&%+5+5U&XCx""&! %+5+5W&\@ &"%+5+5Uh: ^@1   "!@   PYXYX+??+?3999/_^]993333939910#3267!!467##"&5467GRYvevLt8`r{*y^O kao 5Q@*/) & &762_Y5 ''+##_Y ?3+3?39/993+39333310632# '!"$54$32&#"3267!32654&#"\~޿}VY[jmM>>r̖Dg0GOhለ!.<驵>9Aw.#[F:C@"    ?3?3399333933333310 !!!67!4'; sֹ-)CR-/%C":5F֧hُ:\l03D_)e@4  aY_Y_Y?+?9/+9/3+39933333999910!7!!!!2)!!2654&#!]#'$%6$v 0|˶ϳ neY[#:+Y@/( ""-,PY RY %RY ?+??9/9+?+93399339931032#".5467 !67!3>332654&#Tz梷Y8OmG`  ?DW[M_bs:^]NxZ >y!!!@K:Z@.  QY  ?333??9/93+33933333333310#!!!!!!!##3IDkN5P'MDa)[[:$[Uo"]@0! " $ #_Y  "_Y ?33?+9/93+33393333333310!#"!>7!!654&#'!pp@GXz 5=wu$J@@xue~a;b˱A9=!^gu:Z@/      QY   PY ?33?+9/93+3933333333310)"!!!!7654#'!$P-"5DIolM)"iM V[+ɯ# &#&n@9 $& $'%('  _Y$&_Y ?333??+9/33+333333393333333310!#"!67!!!!!!654&#'! pp@GLo'v 5=wu$J@@xueBb˱A9=!^gu':!$j@8#"!$ "&%!  PY" $PY ?333??+9/33+3393333333333310)"!7>7!!!!!!7654#'!-P-"1 +L_qIolM)"i2Py: V[+ɯ# &WS@T)F!L C36540%46I LF==UT:@aY::4 46@_Y!II%&&%_Y3C/&6&&66,_Y6_Y?+?+9///9+999+_^]2/+33393333331032>32!74#"#"&54>?>54&+73 54&#"%>737>32&#"431y=z}<#`qCpՖ|{9,9Tiao7AֺqO3U81Ub !!vXTy"/!)!zq'.">!(!kXTLL\GYmxJ]J2(&Y.r%nT1WoR@G, 3FC) /C3,##T:SJA: O// ) FA AF7>54𑯎&#"'>737>32&#"32>32#654#"#".3,W[3}#QB&"rU5U91Rb ${[fnyqk_%Yah6>'CKXH4(&Y.zHvwZ!B5F"%( 9"?tJ@$    _Y ??339/3+333993339929910!".'!3!3267!!SSR*8  !ZZ2UV1W:H@$      OY  ??3+3?33933399299310%>7!!.5!3!Dvy1OOeN" H6`k1^p8Md,n@ **   .-#@1 M# M*((((_(((( ((_Y_Y?+?+99//_^]]992+3+99333310 #"$54$"&'3 &#" 32>32.%Rvz b!rp^r.is{ m f&GmfiC]ejې +%%&?M +h@=%-, '%o*  OY !OY?+?+99//_^]]]q]33/39933310#"&54$324#"32>32"'32>7&#"ռ'|#434JBF0.3B/(XkO6B"@FQ6=j.@ _Y ??9?+39933310)!67>32&#"4r=>;RˆHJ4K*wgxpR;KomN.@ PY ??9?+39933310)!767>32&#"o G:&Xml-$-=&::GBE:C+&%0M@  &R%+55+55om&&@ !!&%+55+55aW P -Q@++%('&&(.)**/()&!PY _Y _Y?+?+?+?393393333310#"54$322654&#""'732>7!!ѵ9ocegYbdg aL&).5SPD#T,sSQA« 'Yt"2РDWSN -Q@++%('&&(.)**/()&!PY OY OY?+?+?+?393393333310#"&546322654&#""'732>7!!?mG91>iH5saL&).5SPD#T,sJ2fmfr 'Yt"2РB13@! -32 )_Y 0_Y?+?+9333310"&'&54$7>322>54&'#"&'67cVm>:etT/7_~i{kTh8_hznSw<1H~ /8=/{h5* _5+`03@(   21OYPY?+?+93333104$7632#"&'.632>54&'#"& 3i/P Z45QHp@?7I^1NGsG96!]56Q+ L)# ֩"*33*}f^}T1& }vVu,45r %ISg@7CMPSJJN 6(( !/NP UTF2,2_Y!7#73}X^\P}!:kaSҵ~Ԗ鎻YU[n{遲~Dh0,j"7;2;;2sgd .]OmЛ\?#,<ⷨ^zY##])yPK%:DZ@0 >AD;;?011 ?A: FE-4:''1@; OY$?3+3?399?232933333310%#"&54$;"326732654H#"#"&'.#"#6$32>7#73N0-?cAQl\'ǙX\\P}DlVL,j!:2F30:29tlV3:;2sgd'-d#])uT & <V@ @@&AqA6%+5+5[F_& @ ##&$$ %+5+5dW:@  _Y _Y ??+?+9339933310327!&54$32.#"PL(XQy'3u=?)-Gk|"W$N:@ OY QY??+?+9339933310%27!.54$32.#" wBPHParO^8rתYYfwXyq-@   ??333293310%%#%77%73\br][tb\saaaaaaaHZ/10#!#"&5463!54632G2F35DC6SF32GS5E 732n'Vbo>_$f5`[[/m)2)$,3S3 /2103##.547?(l@:W2J0#,S6 /210#67#73pl(?SdF~GsAn  /3210#"&'.#"#4632YkpI}xLttYn3:<1sg.663/ '1;EOh@5F#K>C HH%M2 7 449(-**/KCM79-//-97MCKA</3/39////////33333333333333333333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EOb@4 @C-//(#%%OM7:2:  CE(9M:JJ:M9(EC //9////////////3333333310#65#5546733#"&'5353%32&##&'''.'77'67'77>7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96m$h<M@%     ??329?3993399333992333103!!3##? "&'7327$(9L`$ 6,kG[p<kFst?X߀JgU1Uh+T@, ") -,#(&@ PY QY?+?3?+?39/2993333103267!3##467##"&5467%"&'7327vev^Ku玹6,kG[p<:{*w^ hdmfJgU1$Z]@1  _YaY_Y??+99//3+3+993399333931037!3#!2)#!2654&#! ' #+v 0ρ|ޣϳ.neY[&H]@1  RYRYRY??+99//3+3+993399333931037!3#32! '#3 54&+~!g~@huA𘜰)HJ$Y<@!  _Y _Y ??+9/+33933102'#!!!7'7654&#!RTtZhb!HTpxgRi6JfkWN0N@+.)(+ 2#1&OYOY?+?+99??33399310>32'#"&'#!?!"327'7>54&Irj[^jM_}  b QuR0j_2&te+MgV_tuh^An m1FOkyu~EPjk$,#@ _Y??+3393103!!P|d#'@ _YXYX+??+3393103!!OtD::5 ;@   _Y _Y?+?9/3+3399333103!!!!!#>p,'Dq(ww?Bh: ?@   QY OY?+?9/3+33999333103!!3#!#*qY '4#UTpn̾K#WZ F@%   !"_Y  _Y_Y?+?+?9/9+3933310!!>32#"&'732654&#"!5%,>evGʖM`va>iQ|)=G[""W>:D@$  RYPY OY ?+??+9/9+9333310>32!"&'732654&#"!!!<`I~;pKunYhM.INF 1tr:h%l@:% $'&!aY$aY   `Y  ?3?33?+9/93+3+333333933310!"'!&'!3!267!3###vI)*XR"}!3####c@!'V12(\\#%.=@@tOJ!BW 6;!eyO[,&,NL|U- AW4c@5! ',1,$'!65.$_Y_Y* _Y?+3?+9/99+9?393333310265.'%32654&+73 54&#"%6$32!"&'7oSV9 )x;-;Qh_cM&t/gNz [xoiR`IYK w&  WN3`@4!,&' '1,540RY&)))$RY)QY?3?3+?+9/99+993333310!"&'73265.'732654𑯎&#"'!2DZ/gN(SV#[\}UG(SxRTnz9& | ,QHQDOQ9:/uN}J $h`S@+   aY aY `Y?+??39/++933993399310!##!!267!3#d[v't8s 4Vٺ IW7t$ha:S@+  RY RY PY?+??39/++933993399310!##!!>!3#MEW[--1@FBx A:0/V5_&t$`V@.  aYaY  ?3?39/9999++933933910#!!273!! #5=9v't6FOn2=4V>Ƿ=nu=W7$a:`@1  RY RY  ?3?39/9999+33+939939329910!!373!!#KW[&Dn,FBSnA:0\S_&6$`i@8  aYaY ?3?399//3+3+99339399339331037!3#267!!#!# ' #28s 4V>[vφޣIW7 .$al@9  RY RY ??9/3+3?39/+99//3399939331037!3#>!!#!# m--1@FBEWA/V5_& AM@(   aY _Y?+??39/+99339333310!267!!#!!t8s 4V>[vSIW7 `@:M@(    RY PY?+??39/+99339333310!>!!#!!c[--1@AGEW:0/V5\) AP$hR@*     `Y  `Y?+??39/+399333323910!#!!!!!3#vv'mrm\1st#h:V@-        OY  PY ?+??39/+9333393310!!3##!!TTOZ}Z:Tt1:' ?@   `Y _Y ?3??+9/+399333310!!!!!!!ut'mfm,a\1c% : 5@    OY PY?+?39/+?3910!!!!!!TTv.Z}Z:T1:&Wr"M@)  $#_Y `Y  _Y?+?39?+9/9+93333102#"&'732>5!"!!!!>ʖM`?{Q>iQ|kev=G[7;"s)%W:P@* ! OY OY  OY ?3?+9/9+?+99333310"!!!!632!"&'732654&jbM}ar~~;pKur|:NF 1tf_ 7T@.03& )#)0598-_Y--_Y&_Y 3_Y ?+?+?+9/99+93333310654#""'#"&54$32&#"3.5463227Qn@-P0ܒbMfLJ9C+i%Mkj &zʀ{iZ.S[Dgg_R4   ЧGK'/$?FM(3T@., #)2) &54/RY) PY QY#OY?+?+?+9/99+93333310"'#"&54632&#"3.54>32267'>54&#"b_H]gUNp0JyE!WagtXJ+t%&T7P.@##˵:#ur.4yj{rq]%6m*){dW%G@%  & ' #_Y_Y ?3?+3?+99339333103 !"&'732=$4$32.#" /gN(y'3u=u*C 6Gk|?WUN&F@%% (' OYOY ?3?+3?+999333310%267!"&'732=.54$32&#"Sl \/gN(ОĽ ky1ig2(D  ߺVs5hs >@    _Y `Y?+?+339333310!#!7!!3#M9,,8Wt#hM/Z@/*'.# +#'10)++&OY+  PY ?3??3+3?+9993399333310"!654#"!67!3>32>323##65&*[w{~XvMf|Uj[tOz|{[-yS_ )tXwqf@d1sZ6y#0@  ??39393393310)!!fo:s:?B9nW: 0@    ??39393393310!!67! S!H<>;.W:#{RV#F@#  _Y ?3?9/93+339329333310!!!!!!!|:s:8(ii9y$W:@@   PY??3+3?393339333310)!!7!7!!67!^4())& !HL.;.:#VRhG@&     `Y ?2?+9?333393310!!3##!59OK9)[th:H@'      PY?+??39333393310!#! !!3# 6$(42[thH@&      `Y _Y?+3??+39333333310!!!!3#!!,9OWstehN: b@4    "!PYOY  OY?+3??+9?+933333339910!#32>7!3##7##"&5467#%PB_vtOZ:k{*LM^̒mhL@'_Y  `Y?+?39/9+3933329910!##"&547!327!3#XkYQP v}'#1"û@RbK*ba5stjh:K@'     PY  OY?+?39/9+9333399103267!3###"&547GAA1]patOQ| I:-2?V|7+K@' _Y  ??39/9993+3393232910!#"&547!367!ka51QP UZMMoq'#-û@RbK*T^ q j:P@+     PY ??39///99+933933310367!!#7"&547G555}30gaQ[A(}#C| I:--= (˳|7+)*/@ _Y ?3?9/9+9933310>3 !654&#"!ajYYU tu3 DT0<3_S5_#K"*U@,$"* ,+_Y*"  '_Y _Y?+?+99//93+3933333310#"$5#"&547!2!3277.#"f߹B.sM!+(~zi]LJ;3=:N (i@;!(*)(RY(!H(( (RY %RY QY ?+?+99//9+3_^]++3393333310327#"&57$5476$32'74&#")][BH߶N.\7%\W`&3jqJ~E `0N1Hct8cj|#+^@1%#+ -,_Y+#(_Y!_Y?3+?+99//93+39333333310#&#"&547!2!3277.#"32B.sM!+("? ~zi]LJ;3=:N#+x@C%! +!-,+RY+!H++ +RY(RY @ RY?+3?+99//9+3_^]++33933333310327#.57$5476$32'74&#"'][B?33N.\7%\W`&3jqJ~E `0N1Hct8cj|$\,6&9@ ""&%%,%+5+5:&@ ""&%{%,%+5+5$W`#I@&""## $%#!aY #_Y?2?+?9/3+933933310!2>!#"&'732>54&+!6'w3D_R4'h&±ŌPamky8ja2e*9K\xۚ$W`:!E@%   #"RY  ! OY?+?9?39/3+9333310>7!!"&'732654&+!Z69F9!%Zۂ5pKvW:0%TT %"ONF 1}A:hA@!  `Y`Y `Y?+?+?+/333993310! '"'732>!3##Vinfn<9:0*CMivb'Gsth:9@OY PY ?3?+?+3933310%3##! #"&'732>!(uviy^&`$! +;@^ |uؚC 5~)WA@!   `Y_Y?+?9?39/+399332310"&'732>7!!!!!TM`^vIu'mfm'@  _Y`Y?+?39/9+3393310!#3#"&547!327!O{7#/!!?!^2JDC^Xgttf 3ݤ+e9#h:K@'     ??33?39939333333310%3##67##!>!P63bl=W+vUCfF:iBg#\O3&$ &7%+5+5 9&D@ 99&<?M X@1};K  OY OY?+?+9/_^]_]]]]399333310#"&54$322>7!4&#"!ռ'UhO ley&6:9ycmtd&jK@##&  %+55+55?&j@%%&"u" %+55+55*&jK@%%&"" %+55+55*&j@%%&"}" %+55+557&D@ &s%+5+5W[&\@ &p%+5+57&jK@&n%+55+55W&\j@&%+55+557*&L@&%+55+55W&\@##&!%+55+55&jK@&Z%+55+55j&j@&I %+55+55$h5 4@  _Y `Y?+?+39933310!3##5,'PWt"h: 2@  OYOY?+?+39933103#!!3#ʨ%?t:B$#&jK@& %+55+55&&j@ &f%+55+55W@`@3     aY_Y_YaY?++?+?9/3+39/3393333103!!!!3#"&'732?##mr-OE;'fo"".o(7/y8I  }ZoW:U@-OYOY OY ?+??+99//3+339333310!3#3#"&'732?##73%6%?U"$1v$7/xR%[:  }mWB@# _Y ?2?+?99333393310!! #"&'732654' !59=:ͬ7y)7/QD9)[pS  :@(/W:@@#  PY?+??39323393310#"&'732654'! !!Ŵ7y)7/SE$(4<(i  <>(/2[|tvN@*     aY  ?3?39/993+3333393310!!!!!!!!^59Q'<9-@A)u:N@*     PY  ?3?39/993+3333393310!!!!!!!!_$(4|'ٺ[Z7<y 4@ _Y_Y??+9/+39323104$)!!"."3!<6bm'|mxuL1dXjk[c:G<)V@-)((( " +*_Y%_Y aY??+?+99//9+933333993104$)!3267!#"&'#"."326?<2hm' PT_tUT0㕺(Tnwkl1?7)KV~OPXFNfVjtTa~~G+"0Y@.(((/ 21 +OY #OYPY?+?+?+999/?9333339310"&'#"&546323>!326?!%2>54&#"՘0K|Z \q.4-JPtR1^^fD[[bUϨnea g0&xEQxmq|*Z@0"#) )#,+_Y """''aY' _Y?+?+99//9+9933333104&+73 54&#"%6$3232!# 7`;-;Qh_cM&|N\1UT/E:OQ9:/uN}J Pkh#S@,#  %$_Y _Y"`Y?+?+99//+99333310!654!#73 54&#"%6$323#E [-;Qh_cM&Ol0*IYK d7tBhN"N@) ! !$# !!OY! RYRY?+9?+?+993333104!72654&#"'!23##:UG(SxRTm{wtO59OQ9:/uN}J xZ H &E@$$$( !aY!`Y `Y?+?+9/?+/3933310! #"'732>!3267!#"&547w}tqyue9:0(BJiTXWgUZ.EC?"-R`o1ҼHTE:&F@$$$( 'OY!PY! PY?+3+?+9/3933310! #"&'732>!326?!#"&547viy^&`$! +;@^ |VY\q../|uؚC 5~+"SaxݽET$"I@%`Y aY ?+??39/+9/933333103267!#"&5467!!!!!)ZXWgUZ.v'mrmqR`o1Ҽ#K1?"-:I@%OY PY?+??39/+9/93333310!!326?!#"&547!!TT{[Y\q../|Z:T+"Saxݽ?.1:d*?N$>@  aY_Y?+3?+9/933310!7!!3267!#"&547X9,,8ZXWgUZ.#"-R`o1HT# aM=f@512%*992?>11"66-PY6"  PY?3??+3993?+9/933993333310&#"!654#"!67!3>32>32326?!#"&547>{[w{~XvMf|Uj)VY\q../y{[-yS_ )tXwqf@d+"SaxݼET\BRMgW9@ ! `Y`Y `Y?+?+?+/33399310! '"'732>!#"&'73267Vinfn<9:0*CMi(%k&-A;Gb'GKɬ LPW:8@    OYOYPY?+?+?+393310"&'7327! #"&'732>!z%k&)Auviy^&`$! +;@^ 'W uؚC 5~λdp4;WNT:c:Z!@ @P`/]]29/3310#654&#"#7>?3 f %33 e UIg<1G .6/1W\ ^^ @3"N #(@ @ H!>?3+]q223104632#"&74632#"&4632#"&. ".." .. ".." .. ".." .o -- ".." -- ".. .. "..N >?10#7'7'7wVVVVVVVVVVN "@ @ H>?3+]q2104632#"&4632#"&;. ".." .+. ".." .o -- ".. .. "..N,@ @ H>?+]q23331034632#"&4632#"&HnG. ".." .+. ".." .Nn! -- ".. .. ".. /2103"&547aXRHOjvp#&-X\ >?10'7\wP""@    >?3299//3310".5463232654'7#"&'./ .+)&,YKi?5# 0-)(*ZH6P$291/0HJ.N\441//HJ.O[?210654H3]YN!ENmxm5s@P/]10#'73Տ@ /3]9/10#72674632#"&˜f. ".." .Rji\ .. "..N%>?210>3"̜fNmg]N%ZN% >?222310>3"!>3"̜fJ̜iNmg]mi[;)+7#//))5#>/ >?3]2?3]2104632#"''7&732654&#"'#"&546324&#"326-~Y[~|];-XRXy7'(:<&$:XRX-;\}~[Y~y:$'<:)&8RY~}ZY~XTX/<(89''98(?3]2104632#"''7&732654&#"~Y[~|];-XRXy7'(:<&$:RY~}ZY~XTX/<(89''98N@  >?]29/310#"'#3326? iW#d?e 00 2Xf fL -72N@ P`/]9/33310#7&5473326?3}fld!)0/ e\mX"&0511# /210!737#>)#j7@P/]10#'73׏; /210#7267;ɞfRji\ /222310#7267!#7267w˜f˜fRji\jh] @/]10?'% )3P3L%NN >?210654H]YN!ENmwn5;)/  >?3]210'#"&546324&#"326XRX/:[~YXy:%&<:('8R;0XTX}ZZ}|[(8:&'99N#NO_>?]10#'73D׏NNo@ _o>?]310!737o>)j /2103"&547_YRHPjwn0fP""@    >?3299//3310".5463232654'7#"&'. .+)&,YKi?5# 0-)(*ZH6P$291/0HJ.N\441//HJ.O[Ӡ/FR5Zz/y&w2r6Yb /10##?#7!o / :9?2?3993310!>?!!!>76)Uf ?H[/79)ZCsaoB|sܩ3%@Y9 @Y :?+3?+107!23!7!654&#/T/{/Vq[rNX1[W9%@Y9:?3?+9/3102!!7>?.+7it?"::13[LAgrV5D/&V">i崝^"}1:@Y9?+3?10)!7!#q`/H/F! : @Y 9?+?39/10)!%4&#!7!2!6Tp/C[WVw\RHH9:??10!!9'q5 #@    8:??9/339910'!>7%53fQEutph4#%bZXk)sH) : @Y 9?+?310)654&#!!!2pR7[WٯVwL'A @Y89 @Y;?+??+10"&547!32>54#"7632f ocDUk/iHSO%C8UFQ98cFH_9?]10!!9m+@Y9=??+102!654&#!7Xq\/ٯVw-X1[W'" A @Y 9@Y:?+?+10)7!267654&#!7!250=* /ZW򣯍Vc]ŸwlNy!A <@Y96??+?3104&#!!326$6^VVT9F^I@X"HHR" A @Y 9 @Y :?+?+104&#!!6!!2=p͔TV{F5[W RٯVwX5A9: @Y:@Y8?+?+??99102!7!654&#" !>7!> z0tHR]tʀ[BP߹(GW^pAg^C0`mF9=??10!!7" A @Y 9@Y:?+?+10)7!654&+732hy/yXNTw/ kFA9!gkZ!'A @Y9 @Y ;?+?+310#7!2 #"$54>%32>54&#L/W0f"A8sme<~ni_43klmP`UN   <9?3?39910!6!$%D]M4^e! w( @Y  @Y 9=??+9/+10!654&#!3!!2p54+3!!2!3/vj75/9:MYr9=??39/310!654.!>?!5+[1ao.FPFR/1jŠuO -) 9@Y:?+9?39310)7!!>?! /7GT%DA9 {ø7Xc'f*<SI MNXC$_#W>HP(@Y9@Y:?3+?+310)654&++732>7#7!2pg#vD/EX7^/DE[W_1hsKH&j& jF&  j9P 6?10#!{96?3210#!#!\{{T: +@   PY  ?3?9/9+3910)'!!! T-&y[N:NU:h@:  PYPY /      PY?+??99//_^]]]3++33339333310!!!!!!!!#4(,(E/(HNS :oKN+6>r@=0>$6 8))@?;&;RY7+7RY,$& +++ "&3 QY ?3+3?39/_^]99993+3+393333333310654&#"'>3 >32!#3267#"'#"&54732654&#"3267][BK޴)a3}w^\"]ءqEAScP`^'2jqJ|P_,^%IEqqct\SHMj8kb:#`@3 %$  </ QY#QY?+?+9/_^]]_]333339333333310#73!23##!%3254+732>54+|'T1N'(w6#[\5ZLG,>4m?UNF!: (@ OYPY?+?+9933103!2#'2654+!:ܾW: D@!      PY OY?+?+9/33399333392103!2#!#2654+3#.rTWq -'0ܾ!: J@(   ,< PY PY?+?+9/_^]_]33933103!!!!!!(,(/.(: No;+@ SY??+33993310!7!))::/@  PY OY?+?+9399310"&'%3267#7! ~BCi('!J]%:lY: <@       PY?+?99//99333310)?!%!1N+Y@,>OP#::#@    ?3?399910!!>7!_%'Wk ( :u&2!:?MR1N1> @  ?2?39933102#"&546$"!2>54`^`^?a>fξ|cHYKYr()@    /3/39/393310$4632654&'&#"ig2Vs5xrOSl iĽ o/e0k'0@$  !" )("?32999333310'#"$547'5632%27"654.rʫ6EiB1C+2+,~v "r5n'r<]ռj:x2XuI >1JrK&KN!08m@;( ""82:9$OY!1RY !!! 5RY+OY QY ?+3+?+9/_^]999+3+9333399310654&#"'>32>32#"&'#"&54732>54&#"3267][BK޴wDۊڼ}FrLhi]lO*cP`^'2jqJ|KMʫCJctxq|>= 8kb3: ,L@& * .-$''RY !QY?+?39/+93/393993310"&546?.547!3267!'2654&#"KZ aXaqXes`mǧ!Y)!(,R[{u*isVjZoGM(@   @ OY ?+2993310654#"!!2p axQ$U F2Rw.KB?&@  OY?+2993310#"&547!32>7'( dxMB:>2Ur ~: 2@  RY RY?+?9/+9933310!!2!'32654&+OjzU^m:c[>N:$: K@)   RY    RY?+?39/_^]3+93333310!!"&5467!#";Uږ6jtƑMKZ_:)@ OY?+3?39310!!!!x%Ѯ:|fd:wR[(@  ?322?3933103254&'%3'#".%RS{*wSEhd?6WvevKu,["3@ !"$# ?33229993333103254&'%'#".%''g@|)whdB7nses Ku ++*+hy,6@ && .-+*#/33/3?9/339333310%4&'%3254&'%"&'#"'%;6䚃{[-yS_ )tXwqf@dssZ1yr[w{~XvMf|Ujzn:Yc:Z:]<D@#   PY QY?+?9/93+333933310"&'732654+7%!7!bOg]a(5$w,KXWVκt#O&D@% & ! (' &!QY$QY?+?+993333310#"&546?2654&#"'>32"3270̵ѭRN-1ueVN6| eGZ.?FM} eQX.4{N#4@  %$   PY"?3+3?9933910%#"'732>7.54632327#".VepiV."6A:UNհ͍'F3XespG*D@uKϣp˄K#.GG%:!@OY?+?39310!!%;:::N#: ~:8:>@   OY  ??339/3+33399333310>7!!.547!!4>.??74 mrn C:I50e]2:*(@   *%?3?39/3910'!#3!' & ( .H"X?;,Q@    *% *?2?33?9/39/33933333107!#!!!!!#30ΤE#/M1*\Hd ;@  !" *%?2?39/333399333310!2#!32654&+32654&+xdac!7veXQ̀ߍo\iymfxvQQAJ>-SGS@CTA%M@   ! &' %%*?3?39/333333923233399103!23##!#4&#!32632654&+s`KD`+!QaOK5ߍowveXQ;ymhB9J>AGpAJ>-\  %@  % *?3?39933102#!32654&+6w,ǎxϪٶ\ 1@    % *?2?39/3393310!!!!!\/1EZ 1@    %*?3?39/3392310!7!7!7!!7)/1M7@    &+?2?39/39/393310"&5!2.#"32?#7!4:$qVvj Gb H7OX}DoFBQ? -@  %*?3?39/33910!#3!3PWQȺJJ»Vu[ @ %*??3393103[Ⱥ<I)@    %+?2?393399310 73267#7!q0 m4?a )GZIn 0@   %*?3?399393310#33 EƹX=W>NeN#@ %*?2?3993103!eț^3@  * %*?3?333?33391067# #!7!zu/N? w <>+ og|jAYÊdTB 5@   A %*%*?2?3??339310#3>3 }sVAO[C 1@   A %* %*?2?3??391033#7[l)1Ẳn'Jn %@   &+?3?23923102#"&54$"32>54&pXznlX}ݻߘ¥gwg|#.D@! '-   0/*   $+?399//933293333103254'7#"&546?&5463"2654&#"OF`@Qwr|J<;ajLS\q26fvh?`T}b=tt~;`SGAbOY /@   * %?3?9/333933102#!#32654&+ҮCȺniiUS˝Q]GMJ 3@    %*?3?39/33393310##!22654&+FȺz_iWN7xᗅwePOAF)@  *%?33?39310#!7!ɜ4*@~8'@  % +?3?33933102673#"&54>3ouru&Ƶ eh d~idȼW:?IO2@  % % *?333?3?33910#'#373736P<J[<uL~>A'2P@(!, !%3%4)(#//+?3233?339/93393333910"&57##"&546?654#"'>32327#3267EI6qR]tV?? 06 (nQ[6-8^;0.YHu^FZ13fjfjZ3.mi?<36ZKrI(3N@)!&!4- 5))+0($'?2?3?339/9333933931023>323267#"&54?4&#"763>54&#"EI:pO]tV?? 0 (nQ[<'8^;0.]Du^FZ13fjfjZ3m?<72ZK]o$E@ #%& A *' (+?3?3??99399332910#"&546323673#47'2>54&#"35nPjyXn( "O  K^5@@CY/[E:w2KSC`89 \UUL]R~ *5=m@+7(5=/(>?  ## 66+**% 2 (!::!%+?3333?3339/3339/9/9/3923333310654&#"'>32>32!#3267#"'#"&54732654&#"3267k@>d,1~B0r]tV?@ B`mMW4'8\C7BZ&JPw4m[OLu^:"Z40giPPGQA:81YL'LEbVRe$I@   %"&# *+(?2?3?993?3393339102#"'##>3#36"32>54&ovVv0LTLLa2L=EN31s N/ MnaIORXGKK\#V@ "$%  A # (+*?3?3?3?9/9/3339333910#"&54632373#47'2>54&#"27nMkyVp(9 J`5@@CZ/[H8vr'VM3>\NUL^Oo$ S@) "! BR   + ;   ( +?3?399//]]q]39333310327#"&54>32'754&#"8?>e,2|cuC7CY:&JPw4pXtAWLEcUo$ A@ "!M] + (?3?399//]39333310654&#"'>32#"&5473267[?>e,2|cuC7BZ&JPw4pXsAWLEbV?&3@$  '((+?3?33939331027#"&546?.54632&#"3"gelWIcxsh;F^+-^7Bhcn`55bcjF9zbYg X7aoER;T.-04{4/*5$/@ "" %&(+?22?33393210"&'732654#72654&#"'6!2Cp;Btd:0k7{8^7NPqis75i|89)(efQ8X5YBl5t"/[@ # *01 '&(,*)?22?3?3?9/39/339923323910%"&'7326?##"&546323>734&#"32>_oLR7rHj}VsPu { oM:HO-u=c6`hZUgzT?rzOD*3kwPN_D_$@  '*??2323910#7#gaLu B@     #'*?3??9/3339333310#33#`9Ŀq<^532>32#6=&>[QT U?\Pq5eETb ;qE^d [S _m\T?!Un]VXS=TP^FhaEB U>>"?@ #$* (')?22?3?3?339923310%"'7267654#"#733>32:7'/* YhEtPq6{Mgigz 3?N'ZtSUXpMCga5?elqk #@   (+?3?3392310#"&54324#"32>kŒġǎO]1PZ3陋XLYV1@  ( +?3?39/9/993910"'6!2#"&'732676549HGc iGS"jJH#|}vdZqhg!@     (?32993310654#"#>32Waꭡh.'mm)ԛ<(YMg!@   +?32993310#"&5473326?MꮔY]gئ#4,#mm,#g %R@%""!! &' %!A )(%!'+?3?3?3?9/33392333910"32>54%>32#"'##6730Ka3L=HP,/pRovTv. A i`JOR`KDAs5wlDU{?;@      '+?2?3339/3933310"&547#73733#327@Q` Edn]x!F;05OP87s&B bbA@      '+*?3?3?39/399323991032673#7##"&547P hEtPq6{MgiV\O [tSLDha4?^K)@  *?399//39223103254&'%53'#".%^RXnSdCr+~JAc^@CSkHwTu7~Rjm [r*Q@ )!!+,$$' *?33322?339/9/39233339910267332673#7##"&'#"&5463>[QT U?\Pq 5eETb ;qE^d [S pm\@?!Un]e>S=TP^FhaEFB U '@  '*?3?33399310#3?3w0'V7\2V!1@ #" ( +?333?933910#"'7326?.54632327#":xEdMG69#(/:5yb{C;E]g~PQ33!4S{5|u`Q[4:33%t&8@$  !'( ) +?3?2393233102#"'##"32654ᷦ&]}mZR[{[ 5~}-#d#X%YfgY7fhzRBH i`FU1>6@     ' )??29/3393333103673#675 2l^52Lj7Mj+k E@   #+?3?339/33933399102654&''#"&5%'7!]n+2f_9Q hG8弓:gzFr:(SxYW[aNҩ=hph!P@   #"()( +?333?2??9333339999102#.5467">54m65}Ⱥ Ul@=G5(1Fx|~ˆSay{JY ±B@     ' )(?22?3?9/9/3332999102?3##'.#"76 $7-', .p,1+$75cS/MIiH xS'-x&ujsx.x(r{L}Ls~m{'2@% )("/3/9/3399333310#"&'32#.#"&546322654#"߳M|.p{OZ)89~؋_dudsPZ<0YS##KSݦ1OKM\MrN)1@N*'!'321RY !$1!H11 11 $$.RY$PYTd   QY ?+3_^]]?+?3?+9/_^]+99+933333310327#"'!"&547!3267!>32'74&#":][BH߶^ zm\qv 1mK\W`&3jqJ~7EiO=_1"#ct8cj|#3B@M  90."!! @(DC11''    ,.".RY$" "QY 4OY37!;2673#"'#3>"32654&W|}  ) $1|>^D%,/z?_F-? QuR0j_erLGNh^;4%,Clb:M:4dh<^_FOky}+ail:/=@S(+5/,,+<+#>#?"" ,, (RYPYQY 8OY 0OY,/RY,?+?+?+?+3+3+9/9/9/9/39/9/39333399910%#"&546323>7'"#>37!32673+!467'2>54&#"Gy|+ $1|>^D# ,/z?_F PtR1^^fD]X̫nea!h,Clb:M:4dh3#737>32.#"3M,/z?_FCX $1|>^D8%IR$ @C< %|w:4dh<,Clb:q@AUM2>G@xC#+ ,9.<-1 ?12,-< 2- ' 'I H&&  RY ?RY??ARYAA70RY779.RY99#+RY##2-3EEQY?+3?33?339/+9/+9/+9/+9/+9/+39/9/9/33910333333999399993&'!#>7>7!3>32>32>73#!&'!"76=&654#"Ȓ_b.D {r.Mf|Uj'75 z~q CFvO[{~R~=9- )tXwqfF89h l|$ ^Z1y r0yGM*5@a )*.1+*1% %7 6 RYRY+RY++$$.RY.. )RY! 3PYQY?+?+?39/3+9/+9/9/+9/++9/333933333999999910!.'!'"#;767!3>3232673+7654#"Ij^Zc -- {3# Lt &+1 ||bAV{_o338;O ka_3@p7G|)WN/>@Z(+5/ ,,++<@##?/  + ## '' (RY(( RY0OY+/RY+ 8OY PYPYOY?+++?+?+?++39/+9/9/9/9/333993393399910>32#"&'#32673#'!7#"#>3?!"32654&Ir|} < ,/z?_F%$1| :YD QuR0j_gvCMgVh^<:4dh<R,Cs]8n m1FOkymjkzN)@M #!!   ))+*$#   RYRY  RY 'PY'PY' #PY ?+?++?9/+39/9/++9/9/9/3339933399910&#"2673#'!'"#>367!3>32LE-{',/z?_F#@T$1| :YD:  I\/8U :4dh<,Cs]8. 37632A3Ss~,/z?_F$?U$1| :YD4nSMk:4dh<,Cs]8\K5s@<#" ("2276##PY1RY.4RY..&QY QY?+?+9/+9/+3+9/9/999333310#"&'732654&'&'"#>7&54632.#"2673)pnmqOW#- PFbU)OM < sN$KBFB37%?*5ho.:E>x!-!259Q38.@D'' , 0 /,,RY$%%RY OY*OY?+?3+39/39/+39/9/+9/9/9/33933310"&54?#"#>37#73733#2673#'327x|$1| :YD,%0#@,/z?_F /( L QulGV,Cs]8:4dh<l .- :"l@;!$ #PY  $+       PY?+?99//_^]]]33992299+33333910#7&#"#>327!7!32673#"'!#&):'$1|>`HB ()'>%,/zxdO7(5,Ckg6&:4u'WM#1h@7,3$  !!2 .PY  H'OYQY?+?+9/9+9+333333999933102&#"3>32#"&'#!?6$32>54#"C?_wM߫v%/h^LcE-YOMPYN*Ȥp`TKhw@Idž8c )@ RY /3/29/+3910!#3!3<<7,73WS:%M@( '#&RYQY PY?+3?+9/3+333393310&54?!7!#"$54265#"/F'&,5'˚TR}G/2)ö "l˩3ٵdq|{;@Z'((+011925 5+# 2#=<33  2  2 (- OY 29jY27OY?+?+?33+33?3?9/39/39/9/9/39333392239333310"'#7547#73733#!733>32!654#"!327fEmf%0#Feg !LtvevjW L QMrGV S:ka?6WS|)yV%^  =: 4@    PY  ??9/3+3399333103!3#!#0ySS{'{YYyX9=:6@  PY  ??9/3+339333103!3#!.54?#/qSS',*  +qX"0V;E'@0WN )1s@;$// 3 -%2% -   !OY *OY?+?+9/99333333??333992939933310>323##"&'#!#73>7!267!"!74&Ir'{;}  b规' pfu";jp%MgVih^Aa˅ m1 kyއ3jk:O@'     PY?+?39/_^]33333993333333310##"&547#73!!!3267!e 1 j'jPPPPeohom [7İ;;gg).(V`:&e@4 %%'&!!(# #PY %   OY ?+?39/_^]33333+3/3339333333310%267!## #7367#7!!4&'7!#3Ms\c&G('_r7F'(v|y"jvg˛Z4xNJw9g#W)8a@46/&##"" :9"''2OY PY *OY?+?+?3+?99//3?/9333933102#"'732?#"&'#!>!#3>"32654&WMC7\yLS)70 ./}  &a? QuR0j_erLGNgr= }Hh^;4%O^_FOky}+ail:W%3i@9%+"!"2"45%"%RY "PY .OY &OY?+?+??+?99//3+3393332910%#"&546323>!3#"'732?#467'2>54&#"Gy|Z;[|LS)70 PtR1^^fD]X̫nea gr> }Tc EQxmqWU$S@-"# & %QYOY"RY PY?+?+?3+3?+3393333103#"'732?##737>32.#"3v;\yLS)70%IR$ @C< %|8r= }T|q@AUWM3A@E!01 4 11<)/""CB'+PY' !0PY !!7OY>PYQY H?2++?+?+?99//93+3?+33339333399910"&'%326?##"&546323>7!!#"'726?#4&#"32>nz":ayN|v$ *qNYyK>368 2h^LcE-YOWxUQ+Ȥooa! zs< 4I<Whw@Idž#WP@,  PY   RY?+???9?+339333333102?#!!!3#"'7VU B'ȕ;\yLS)7}TKZZ r= W\5@ PY RY?+??+3339933102?#!3#"'7" ;\yLS)7}Tr= #WM:b@54'8#&5.5#'<;55&RY5,1PY,  PY ?3??3+3?+?+999333333310"!654#"!67!3>32>323#"'732?#6=&*[w{~XvMf|Uj];\yLS)70z|{[-yS_ )tXwqf@d'r= }TsZ1y#WM*N@+!  (!,+&PY& PY RY?+???+9?+933333102?#654#"!67!3>323#"'7vev Ltb;[|LS)7}TS|)ySO ka?6 r> WN'6^@24  8 '-$$## 7# 0OYPY(OY?+?+/?+99??3333993310>32#"'732?#"&'#!?!"32654&IrO?;[|LS)70&6}  b QuR0j_gvCMgVcr> }Gh^An m1FOkymjkWzN!T@,!!#"PYPYRY PY ?+?+?+3?+33993339310&#"3#"'732?#67!3>32LE-{#B;\yLS)70  I\/8Ur= }T>yx!-!(W2+R@*'(( -,(OYPY#!PY?2+333?+9/+/33933310"&'732>7>32&#"!#"'7326?#-e*4G/='fi*$OISL DF? *," &W&GXzG ]f :CnW:@@!RY PY?+?+?3933933310%3#"'732?!!67!Ӕ;\yLS)70հ!G==<.r= }T:#{`W:K@+    PY  RY?+??39?+333933102?#! !!3#"'7Z$(4ǰ;\yLS)7}T2[r= W:G@%    PY   PY PY?+?+3?+333339310"'732?!7!7!!LS)70y& ()'v7@[W }T\r> WN5@w@B 46*/#$:$*4AB7RY# ## '' QY'=OY 2RY PY?+?+?+?+99//_^]9+3933339310327#"547.547##"&54$%7654#"%>32327#32676,/<)YADGTu]\"G('+ -uOCSz4# ;p L9%`_$FH%x-#K\TFOk:W=N(6e@8(. %$!%5%!78%RY%PY   1OY )OY?+?+?99?+?+3933333910%#"&54632367!3327#"&54?#467'2>54&#"Gy|$ 2}3/6/<)YA~ PtR1^^fD]X̫nea>tm&-* x6@<c EQxmq:W0>l@<,)06--=-)#?@-RY-&!PY&PY  9OY 1OY?+?+99?+?+?+39333393310%#"&546323>32&#"3327#"&54?#467'2>54&#"Gy|4Od(E 4M3/6/<)YA~ PtR1^^fD]X̫nea323327#"&54?#"&5473267][BK޴/6/<)YA~ -Y{cP`^'2jqJ|9M&-* x/GgZct8kb#WF@& SY PYRY?+??+?+3933333104?#!3327#"&7! 3/6/<)YA~S))6@<:z&-* x.W2N(]@1(%  *%%)  OYOY"PY"PY"?++?+?+9/9/9/3393333103267654#"%!2#"'327#"&5478 ky1Sl kp/6/<)YA~ Mls5ig2_ȿC&-* x/GKW'K@( ) ( 'OY PY PY PY PY ?++?++9/+9/3339103267#"&546732>7>32&#"4-;N)YA~$5F/='fi*$OIS$!$xD&GXNG ]f UW;:*Z@/ & & &+,  *#PY# QYPYPY?++?+3?+?39/399339333103267!3327#"&547#467##"&5467vev3/6/<)YA~Ku:{*w^z&-* x( hdmW7:*]@2 !' ,''+OY  $$RY$  PY?+3?+9///93+333339310732654&+7!7!#"&'327#"&546 bo}f%q'&`nH@@/32#"'##7673"32>545nPjyWn& "O  J^6@@CY/tE:w2KC`89 [TUL]Rq97@  (+?3?39/9/99393210267#"&54>32&#"9H'a iGS"dJH#y}~vdZ#H(Q@ # ) *  #(#&+?33?339/9/39/3993333321067&54>3 .#"632#"'%4&#"326#,C du92-b{ϔ۷+Z@c^rJ@Z{HY%'M|&裌`ZN~zGW32&#"3vvkkw;.*.) _uOl` .-<7@    '?9/2333233993331033##"'73267#7HHll6|k4B5,2Plic .-*i"/U@# *01 '&(,*)?22?3?3?9/39/333939329910%"&'7326?##"&546323>734&#"32>ToLR7rHj}VsPu { oM:HO-u=c6`hZUgzT?rzOD*3kwPN_D_<@    #*??39/39/3339333107##"&546332673C6{Mgi\PhEtP`>LDgaB]T![tT- R@        ' * #?3??9/33333993333999910333###73EY89gf??Y*րQ3< @ '*??3393103<< @ '*??3393103<- D@       ' *??9/333339333999910333###EY89gf??Y*րQI@  ! '#  *)?2?333?3?333399333107"&546;33#7326?#"]|FutjjO51 N=6#gS~j{u;@;)5)+")@   # )?2?9/33993107"&5473327Y] οJ&" 7@#* )?33?3?3399233102?#33#"'7AX sĿ_(s|+A WX;iqj HQ#@ '*?3?993310!3!6t/H3Z@)41 5* ( '*,&)?33?33?33?339/339333310"#654#"#733>32>32#"&'73276=&>[QT U<]Pq5eETb ;qE^dblX$"W_ _m\T?!VjaVXS=TP^Fga(Lr X?#VY(M@#&&)*""') +?332??339/39/39333310267332673###"&'#"&5473s>[QT U?\PQ3eGTb :qF^dWS pm\@?!Un]P?SP]Fga'LFB U]'A@$$($)*!(' )?33?3?3?333339910654#"#"&'7327>533>32:PgEtZkU$"Xz  6{MgiVN'ZtSr X5/"7LMCga0D4@b)H@% %*+"A *( '")?3?3?3?39/3933104#"#>533>32327#"&5476gEtPq  6{Mgi hI"(]X] [ZtSUX*r [MCga < > MW$-JQ 3@   '*'?3?3?9/339310# #33bbnh 1@ ( +?3?39/39233310#"&5432267!4#"!hŒġ\S[kT^W陋 `c bc^y5Q@     #) (+?333?333??33933910%.5433#2654'#"z6225Oo~vvHC  QW  4F@/## )5)6*-&(+ )?33?33?33339333310#"'327#"&5465373254.'.54632.#"ݳiHI$&F4X]2JM1Qu C932&#"D*#1.4 J$419 A eq$[@!##% &! '+ *?3?3?39/333339/3333399333310!33##467##"&547#73267!877il- 6{Mgi__7Dt"ޅ] XLDha'r"tXO"[n/;@!+'/0/1.'$ +?3?33339333310#"#"&5467654&+73232654'&546;M. 7mq1G*I3C,5,WN_mVLV&OeX~BxO/ =5-RU\6QXq+POHXuV)@  ' +?2?33393310 546332673WO29JJOS*>*!78]]+o?3@   ( '+?3?3?2339933102# 546332654#"7>W\sZS mYU&Yqf1J/"p_ '@   *'?2?333993103#&'#w0B7*T -@  '*?2?3393323107!7!!&Fߏ#B@  '* )?33?3?3339333310!7!!327#"&547!7&F'J#&F.ZYIV#> ]S \![K@   ! ' *?333?39/3339339107!7!7!3>32+2654&#" 1&FjTJ^bJ'0!E1Dߏ#q_Pmj#67 <@     + ')?3?3?9/333932102654&+7%!7!# '754.54>54#"'632_a % % %+%,.23F33NK&hN   0%'#! ?* /39/310#"#"&547332>;6>poq?_e Z)_myC&7$he/6R"("f /310!7!;IS /310!%7!I;+ /210!'!_I֘ /210!'%!I_.R@ /99//33107'%6J{w~ \@ /99//3310''%7\J6\~w{W @  /39/3310733>32&#"@] 6* $>WH$F(-eBCk& /310%%!VOO?W @   /39/21057'5373ߞ!NP~OO!W3&$@ %+55 W7N&Dv??9 *%+55${&%v@ $$&!!#%+5+5#&E ${&%{!!#%+5#&E?**,%+5${&%$i$"%+5#&E--e-+%+5dR&&'zh@ /2 %//&+5+5?WU&F'zv@ /3 %//&+5+5$&'|@ &%+5+5:&G $&'DS%+5:&G'F')%+5$&'K%+5:&Gs*p*(%+5$9&'Td%+5:9&G (T(-%+5$l&'U%+5:l&G-:-'%+5$+&( @&%+55+55?:&H'c@ !_!#% &+5+5$+&( @& %+55+55?W&H'"@ !g!#% &+5+5$l&(g %+5?l:N&Hv&& %+5$}&(k!%+5?}:N&HN))5%+5$W'z&( ?W:'z&H$&)g@  & %+5+5JU6&Ij@ & %+5+5d&*N@ !&!!# %+5+5W[&J@ 4&4s46%+5+5$&+@ &  %+5+5#&K"&# %+5+5$&+ j  %+5#&K" %+5$&+jK@& %+55+55#&Kj|j@ !!& %+55+55W&+zW&Kz$k&+y %+5#k&Kr& %+5}\&, c %+5}\&LJ%+5$++&, 4@&%+555+555#p&&j;@8%&+55+55$C&.@ &  %+5+5#$&N6@ &  %+5+5$C&. >  %+5#&N p  %+5$C&.I  %+5#&Ni  %+5$k&/D%+5\&OL%+5$k&/'/C:@ = %&+5+5&O'@ %&+5+5$k&/ ڴ %+5?\&OE%+5$lk&/ %+5l\&O # %+5$&0D@ &%+5+5#&PvX@ 22&--0#%+5+5$&0-@ &%+5+5#&P0@ 00&--/#%+5+5$&0Y%+5#M&P'--/#%+5$&1@ & %+5+5#&Q6@  & %+5+5$&1wW %+5#M&Q  %+5$&1t %+5#M&QH  %+5$l&1K %+5#lM&Q## %+5d+&2 @&&&n&3 %+55+55?&R'L@ #f#/%&+5+5d+&2 @.&.`.; %+555+555?&R'j.T@ #\#/%&+5+5d+&2 @$&$_$& %+55+55?&R'@ M%&+5+5d+&2 @&&&~& %+55+55?&R']@ f%&+5+5$Y&3}@ & %+5+5W&Sv8..&)),!%+5+5$Y&3h@ & %+5+5W&S"@ ,,&))+!%+5+5$&5@ & %+5+5#z&Ud@ &%+5+5$&5 %+5#zN&UTm%+5$&5'D@  %&+5+5#z[&U&[T@  %&+5+5$&5 %+5zN&UR%+5A&6i@ ,,&))+%+5+5-&V@ ))&&&(%+5+5A&6r))+%+5-K&V&&(%+5A+&6 X@00&**-%+55+55&V'vr@ W&+%&&&+5+5A+&6 @11&22.%+55+55-&V' 7@%'"'&%o1111@HO11 H1&&&+5+]+]qq5+5A&6'Yl@ $),%))&+5+5-&V'@ >&)%&&&+5+5s&7J@  &3 %+5+5V&WA@ & %+5+5s&7ߴ %+5V8&W@ %+5s&77 Ҵ %+58&Wys %+5Gls&7j%+5l8&W e  %+5wr&8? %+55Ur:&Xb!_! %+55w}&8 4 , %+5U}:&XF&^&2 %+5wc&8 %+5Uc:&X#F# %+5w+&8 @ & l - %+55+55U&X'j@ &*&2 %&+5+5w+&8 C@"&"h" %+555+555U&X'jE@  %&+5+5&9 ^@ &'  %+5+5n&Y@ &! %+5+5&9+ ʴ  %+5n:&Y   %+5&:A& %+5+5c&ZCM&д%+5+5&:@ & %+5+5c&Zv&@ &%+5+5&:jK@& %+55+55c&Zj@&%%+55+55&:@ & %+5+5c&Z@ &%+5+5&:Rߴ %+5c:&Z %+5&;z@ &  %+5+5&[@ &  %+5+5&;jK@& %+55+55&[j@& %+55+55&<h@  &  %+5+5W&\@ &%+5+5#+&=@ & %+5+5&]@ & %+5+5#&=: %+5:&] %+5#&=S w %+5:&] %+5#&KS %+5Vxy&Wj<@!!&z %+55+55c&Z@&%+55+55Wl&\@&f%+55+55 7)&D(@ E&EEB *%+5+5#.&AK@ & %+5+5#%C@#" #"'&#_Y _Y?+??+9/39333310!"&'732654&+7&#"!>$32^F3R;dtA%#sc|J"ڭ*-_ |sTf'\C`x3&$ %+5 7N&D99; *%+53+&$ &i%+5+5 7&D @ GG&==C *%+5+5+&$ &%+55+55 &&D 4@E&EE: *%+55+553+&$ @&%+55+55 7&&D  @GG&<$$%+5+5w&q!{!# %+5UD:&r ))+$%+5&<" & %+5+5W&\C:@ &%+5+5&<7 д %+5W:&\ +&<j@ &1%+5+5W&\ @ &&&"%+5+5&<O@ &5%+5+5W&\@ !&!!-%+5+59=0&cd@ 1&1)1,%+5+59=0&cd@ 33&66,%+5+59=0&cd1&11;%+55+559=0&cd@33&55=%+55+559=0&c,d@1&1J1:%+55+559=0&c,d@33&5^5<%+55+559=*&c(@11&@N@M%+55+559=*&c(@LL&5N5B%+55+553&$k@ %&+5+53&$u@ %&+5+5@_'$,@ %&+55+55h_'$,f@ %&+55+55q_'$,o@ %&+55+55_'$,@ %&+55+55_'$,(@%&+55+55_'$,(@222%55&+55+550&gd@ -&-k-( %+5+50&gd@ //&2q2( %+5+50&gd@-&-H-7 %+55+550&gd@//&1]19 %+55+55 0&gd@-&--6 %+55+55 0&gd@//&118 %+55+55 Q'(@ h % &+5+5IQ'(]@ % &+5+5-'(X@/%&+55+55U'(X@0%&+55+55A'(X@% &+55+55h'(X@% &+55+55%W0&id@ %&%% %+5+5%W0&i"d@ ''&** %+5+5%W0&i,d@%&%%/%+55+55%W0&i,d@''&))1%+55+55%W0&iTd@%&%%.%+55+55%W0&iTd@''&))0%+55+55%W*&i(@%%&44A%+55+55%W*&i(@@@&))6%+55+55%'+@ m % &+5+5I'+@  & i %+5+5-B'+X@5% &+55+55UB'+X@6% &+55+55-B'+X@% &+55+55TB'+X@% &+55+55B'+X-@ --%&+55+55B'+X"@ ""%22&+55+55CS0&kd@ &  %+5+5C;0&kd@ &  %+5+5@0&kd@&Z %+55+55C0&kd@&n %+55+55CB0&kd@& %+55+55CB0&kd@& %+55+55Cl*&k(@&!!. %+55+55Cl*&k(@--&# %+55+550$',@ x%&+5+5T$',@ t%&+5+5A',X@I%&+55+55i',X@J%&+55+55A',X@%&+55+55h',X@%&+55+55',X%@ %%%&+55+55',X@ %**&+55+55?0&R"d@ &~%+5+5?0&Rd@ !!&$z$%+5+5?0&Rd@&3)%+55+55?0&Rd@!!&#G#+%+55+55?0&Rd@&(%+55+55?0&Rd@!!&##*%+55+55{&2d@  %&+5+5@{&2d@  %&+5+5Ao'2X@, ,, %&+55+55io'2X@. .. %&+55+55-'2+ @ ++ %&+55+55T'2- @ -- %&+55+55fd0&wd@ &k %+5+5fd0&wd@ &"]" %+5+5fd0&wd@&>' %+55+55fd0&wd@&!R!) %+55+55fn0&w,d@&& %+55+55fn0&w,d@&!!( %+55+55fy*&w(@&,,9 %+55+55fy*&w(@88&!!. %+55+55T'<,@ % &+5+5UH'<X@ % &+55+55 '< @ % &+55+55xH'<X@h%##&+55+557h0&{d@ 2&22- %+5+57h0&{d@ 44&77- %+5+57h0&{d@2&2M2< %+55+557h0&{d@44&6b6> %+55+557h0&{:d@2&22; %+55+557h0&{:d@44&66= %+55+557h*&{(@22&AAN %+55+557h*&{(@MM&66C %+55+55x&[d ++&+5@x&[d ++&+5@l'[X ++&+55il'[X ++&+55-'[ ++&+55T'[ ++&+55q'[ ++&+55q'[ EE&+559=&c11&--0%+5+59=&c9@ 11&,-,/%+5+5&gz@ --&)), %+5+5&g9V@ --&((+ %+5+5%W&i"@ %%&!d!$%+5+5%W&i9%%&  #%+5+5C &k@ &1 %+5+5C&k9@ &  %+5+5?&R@ &'%+5+5?&R9@ &%+5+5fd&w& %+5+5fd&w9@ & %+5+57h&{@ 22&.!.1 %+5+57h&{9@ 22&--0 %+5+59W=0&c'd@ A)A<%@@&+5+59W=0&c'd@ 66,%22&+5+59W=0&c'd1@ 1;%00&+55+559W=0&c'd@55=%22&+55+559W=0&c',d@1J1:%00&+55+559W=0&c',d@5^5<%22&+55+559W=*&c'(@11,%00&+55+559W=*&c'(@O OF%KK&+55+55W3&$'k@ %&+5+5W3&$'u@ %&+5+5@W_'$,&>@ %&+55+55hW_'$,&f@ %&+55+55qW_'$,&o@ %&+55+55W_'$,&@ %&+55+55W_'$,&(#@ ##%&+55+55W_'$,&(@ %))&+55+55%W0&i'"d@ %>% %$$&+5+5%W0&i'"d@ *D* %&&&+5+5%W0&i'"d@%%%/%$$&+55+55%W0&i'"d@)9)1%&&&+55+55%W0&i'Td@%}%.%$$&+55+55%W0&i'Td@))0%&&&+55+55%W*&i'(@%G% %$$&+55+55%W*&i'(@CSC:%??&+55+55W'+'b@  d %&+5+5@W'+'b@ ` % &+5+5-WB'+X&@5% &+55+55UWB'+X&@6%&+55+55-WB'+X&@%&+55+55TWB'+X&@% &+55+55WB'+X&@ % &+55+55WB'+X&@ &&%&&&+55+557Wh0&{'d@ 22- %11&+5+57Wh0&{'d@ 6!6- %33&+5+57Wh0&{'d@2M2< %11&+55+557Wh0&{'d@6b6> %33&+55+557Wh0&{':d@22; %11&+55+557Wh0&{':d@66= %33&+55+557Wh*&{'(@AAN %11&+55+557Wh*&{'(@PPG %LL&+55+55Wx&[d': ++&+5@Wx&[d': ++&+5@Wl'[X&. ++&+55hWl'[X&. ++&+55-W'[&f ++&+55TW'[&f ++&+55qW'[&f ++&+55qW'[&f EE&+559=&c@ ,,&//8%+5+59=[&c-&--/%+5+59W=&c'-@ -0%,,&+5+59W=M&c771%+59W=&c'9@ #,/%,,&+5+59=&c@ 5&55B%+5+59W=&c'@ EER%<<&+5+59&$ &Q%+5+53&$B&%+5+53&$ @ %&+5+]]53&$9:@ %&+5+]5W3&$ %+52,f @   /2993310#>7#7f>@:L j%̌P|H9h?pWp@    /2993310327#"&5?3!,7;I  8:&i2,f @  /299310#>7#7f>@:L j%̌P|H9h?l_$@   /   /3]23910".#"#>3232673b(JC>$1{>\E)KD<,/z?_#)#,Cla;"*":4dh<!H@% "#   @ H /3+]29/]33333393310".#"#>323267373!73(JC>$1{?_F)KD<,/z?_++v*+ #)#,Cdh<"*":4dh<%W&i'!@ !$% &+5+5%WM&i%W&i'9@ m #% &+5+5%W&i@ )&))6%+5+5%W&i&@ 999F%00&+5+5'(,u9@ %&+5+5'(9m@ %&+5+5'+,u9@ %&+5+5z'+9m@ %&+5+5$W&+ %+5q, $@   /29/93393310#>7#77!>@9L j%ȥ ̌P|H9h? %!q,B &@   /29/933993310#>7#77!>@9L j%~̌P|H9h?!$%\ $8@ !%!&   /]299//33/]33910#>7#7%".#"#>3232673y 97:?j#(MGA$1|9U,2#)#,Cgc:'0':4c\5C2&k@  & %+5+5C[&k@  % &+5+5C&k&j"@3 % &+55+55C&k&j9"@3 % &+55+554'&k@ &# %+5+5C&k' 6j@)3)' %%%&+55+55$c&, @ &%+5+5$&,C@ &%+5+5',,u9@ %&+5+5',9m@ %&+5+5, &@  /22393310##&54677!%j@- ȥ LcZQ8 %!,B &@  /29/39310##&54677!%j@- ~LcZQ8!$%\&B@## #'(&&&&    /]229/3/33/]3393310".#"#>3232673##.54?(MGA$1|733&XGLf3?{MLJ?Q ,@ [XYX+?+9233910#67#!s3&U?u 1@  [XYX+/+339333910#>7#!Og 3 &VOFx?U &@   Y XYX+?+93910##&54?U3K4&"{bwH^? O@'         [ XYX+?+993323333993339107>733!7>733i&WLLf33&XGLf3?uQLJ{MLJ? J@$    [XYX+?+332933393333910#67#!#67#!!3&Y 3&T?~Ny7 T@) [ XYX+/32+33399333339333910#>7#!#>7#!ZQf 3&UNf 3&VQBxQNEw?4&v] F@#     PY /?9/3+39933399239910#7!%뛿(F-eS(Jx2sd@K     PY  PYXYX+?/99//3+393+399999393339331073%% %%#7!(N5Uo(V"n(6V(OVdd3Z} T@ y  &     t f V F     D 6 "           v f V D 4 $   l      d T F 6 &          p d P @ 4 $        t d $   ;    rr_rr^]]]]]]]]]]qqqqqqqqqqqqqq_qrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqq^]]]]qqqqqqqqr/^]9910#"&54632ywxzyzz1 6@   [XYX+/22+339933333103!!!!!;!;m;!;i;!;111@ /3/33310#!*SmOM)/3/333105!#MSO @ //9/3333310###!T 0@    /3/9/3333333310###!!!TuO .@    /3/9/3333333310!!5!###uTONH*7FSW<@xU /'W6KCR;;C' XYYYrYdYVY9Y+YY YYYYYYtY+YKYYYYYYYYY@YPY Y0YYWUM1$1YG++Y8$[@$Y[@ YY}YnYY@z}HHY9Y*YY YYYYYY@psHYYyYjY[YLY=Y.YYhYiYYYYYYYYYYoY_YXYNY9Y*YY YYYYYYYYY{YlY]YNY>Y,YY YYYYYYYYYYYKY2Y$YYY9YYYY_rrrr_^]]]]]]]]]_]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrr^]^]]]]]]]]]+]]]]qqqqq+qqq?+++?3+3+3+3??_^]]_]]]]]]]qqqqqqqr_rrrrrrrr933333333102#"&547"32676542#"&547"3267654%2#"&547"3267654#3w q{D=I*E@Mw q{D=I*E@MMw q{D=I*E@M>~yEIxGFEy_EqjgW>o~yEIxGFEy_EqjgW>oy~yEIxGFEy_EqjgW>oz5?3910!@2zz&p ]t' W'  UI-@ [/]+99393310%73 CiGo)'!a-@ [/]+99393310#77IG)na'O&-&@? O]55]55]T@ Y/+3310!5!4TY??3310+3>T O@&      ???9/9/9/9/9/9933999910!! !!>7 77 77 77 7N!p:@      /33/9/33333333333103#5!#3###TOON 0@   /3/9/3333333310!!!##:QTN//333210#!*T&n @ //9/3333310##*TG 2@   /3/99//333333310#'77'*TT~~~ݵqqp .@    /3/9/33333333103#5!3###TONF V@+      Y ?3?39/33+339933339923910#7!733%3XTg4>% BK+4"Un@     H@ HY Y Y?+?+9/+99+_^]+]3933333310!!632#"&'732654&#"#$9Ycuv./6>5(<&.sghY*+D>82/ +@ Y?+3?3393910#67!7!pC]$0R@*. "( 12%%Y+ +Y Y?+?+9/+9939332399102#"&54675.5462654#""32654&wWL4A^W'8m,4R)7,<<032E2^RE^ O>k|i]GdO8^h4-I,0''}<2#087&,\ +@   Y /3+9933310654#"#733>32J U=^Dc3mH O{.&K`[oD7*)ljciijrxr1kj@"Y@1   !#" ooO ?2/]]399//]]93333/39333310!"&54$3254&#"3!!!!!iP FLRXLZLu$n(i$+%ϰ= ERwzkκ޺d &,w@F&! )*    $# ' -.*)&#&_Y #_Y ?+?+93933939393910&'#7&4$?373&'67#&'2D>Df½[-.J<:X1 uE/.;Jn4JH 0~gk eG,++un[$ e[F5d+T@-%+,-)_Y"% )) _Y `Y ?+3?+9/99+33933310&#"67#"$54$32.#"67!3>324+C uhy'3uA  I\0j 6-u Gk|RZy32.#"!!!!!267#!767޻%ưSGNT(_w*6'$ptϽ0TI\i|pIZf'O#<)1^@2/( !!#""(32SY# %!,?33??39+39333993299310"!7#7654#"!67!3>323632!6=&*[w~XvMfJgz|Jn[-yS_ )tX^:\@dssZ1y #&)@J$&!"()* +&  # '(($)?3??39///33333333333333?339333333939103!!!3#3#!!!#737#37!3'#7#3'yoN^~ONr+qu+tUUUo+np=K,U[L6ppډLLډ=;{%LT@?>2JD88*)$!!QQ)JVU #"!@MuYMM?MOMMM;AxY!xY;$$!M!M!&.xY& xY TuYlmXVwVgVWVFV4V%VVVVVVfVWVGV6V&VVVVVVVVVwVgVVV jVYVHV9V)VV VVVVVVVdVUVFV7VVjVVVVv@oVgVUVFV7V'VVVVVVVVVVWV'VVVVVVVVVVwV7V&VVV:VVVVV_r_r_rrr^]]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]qqqqqqq^]]]]]]]]]]qqqqqqqqqqqrrrrrrrr+?+??+?+99//3+3+_^]+2999333333333310#327#"&547#7+#!23733"&'732>54.'&54632&#"32654+FD%-FJjh I^Jٕk::E}/ PO&A09 {S+غ++rW<M#:O8VPM8ڈKKڈppN ;A9:BY9BY:?+?+??99//102#654&#!#3!2>73#{д7< _r=uuI;ٜ\{>Y^P'!=RQK,0e@8$ +0.12'  @ H  -0?/39///+9333233933333910#"&54>32367#73733##47'2>54&#"!!6tRlYp+ ]\~ 7Q9!BBCZ2)E;sMwbbwhLW3>0a3QIXK(x@A %% *) wYwY/? ##sY#sY?+?+99//_^]3+33+39333333333239910"!!!!327#"#7367#73$3 .#k~$(6XL93ܤ ~ J'Y C56E}u( D'/A>CR@)    _Y ?3?39/33+33333333393333103!3!!!!#!#/n'sJqT-JfDevM44b]bGgF@'  _Y?+3?393392910!7!!%%!77%77%L9,,8-^. ^.<&.F .Evvvvjn,6CR]y@C;JA S%,D*0 M5 _Y ^=VDD&#,##,7\S F*MM440?33/33?3?33339///9323339333310#"'!67>32#"'#"&546326776$7>732>54#"%3254&#.#"32nϭl3TU1=7H֡|.MYwb'VJԖ b5vuNZFgf3Y?K9\9(&y{\VEvjK 7B4#sI@Mv 3邂UESl HB"85'7R-&QnbC`XN<=s]̎AA7$'W *L@( )  $,+! aY 'aY?+?+??9/993233933102!"'732654''!7&5>54&#" X+OKIH qdb Sb)&uzt;s&_u! &iA(-b$"',@^)%  .( &',,-'&  (/,??39///]]]]]]333q33333q33332393933993333331023#3##!!#737#734'!!627!!&#!R&i_i=]ژ:.ũPP?y+'y$ySy,J SQQGd2%v@D #"  '& aY aY# #`Y "_Y_YaY?++?+?3+3+9/+9/93333910#7&54$?3.'6?#7!٧&b0\ɉ.'iҼu$7w {ƦNbv, Td\c! @I    "! ? ?3?39///]333333333333393939310!!!!3#!!!#737!!'!735K\Uy))66Ϋڱ)]o$ ӧ==ӧG+{@C"+"$-$,$$%++  % H %% _Y  aY ?+?+99//9+9_^]333333339333310!54#"%>3 3#!!327! 5#73>7!wd,PX)ǒ)Ig$T(( 2:5w"qBjb11F5&d2!]@6   " #`Y aY _YaY?++3?3+99+3?3933310&54$?3.'67#G[+Z߅b$rq !1~{ŨG`s.u # A*:>]@82' 9 <>'@?Y[,Y$[$4Y$<Y>??+??+++++999333331027#"&54>32&#"%2#"&547"3267654#3w-$>rsj5Q8&VzhTE:3+VOa>&aQ :vDR`^YU9gTjImM%$* *p@;#(+ #$!$!uY tY!vYXYX+?+?+9/+9999999933393310232673#"&54??">54&旭{" 90Gd3Ce %KFljB]E0{qۯQ(/<<\yQ28b00p#z>2:* ,@H %   .-  (wY!wY/  wY   ?3?3+99//_^]]++999333333333323310!7!!#!673 #"&546324&#"32>!{! $&麎乙=7EN$:938,=Xd3FKL@IQ Em *2]@/+ /%%& &43&&'/$Y//' Y '.Y'Y?+?+?+9/+9/99339933310#"$54$324$#"32$+#!24+326PQp䣝諩ߡʪmLGMP£婩㝤#z {K@_@1   !Y  `!P!0!]]]?333/3333+3339933933933310#3?3#47#'%##5!_+).M1o=c-TKmH ]#P@(  !!  $% _Y _Y%]?+?3+33/3993333993310 63!!>54&#"!5!2&5;fn= ǵȝ@nga 5N˦L `-@bH:@   ! ?2]]?9/9333310"&54632!3267.#"u2UNHbܕ3Wu"6Fl~*z5Au 5t@;  /# #)76*  -&& ?3?39/39/39/339/9/9/3393333393310 # '!#33#"&'732654&'.54632.#"`h*϶_RvZFOj6Ƹ CHHMu=|FuH;18$40?U9gE,\"4,C\: :@   PY PY?+?9/_^]+3993310)7!7!7!!)'#+(XbI&{'usHHI&t'usHZ''}L{ I@3O07_7o77?555]5]]555]q]5Z''}Lu6;@&OTTT?555]5]]555q]5Z''}L>=@(ODDDOD?555]5]]555q]5$'^'GLW=@*/O_O:::::?555]5]555]51Nd^D @   /93310#&'5673!9>HH>9)CI$ICV (@   /2999399105673&'#CI$ICV9>HH>9#d^D @   /93310&'3#67!59>HH>9#CI$ICV (@    /299939910%67#&'53+CI$ICV9>HH>9d^D /9910#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC:@  @ /299299933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9H>@   /2992999333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>9?*E@#%+, !RY (OY(OY?+?+3/9/3+99339210#"&546323754&#"7632.#"32OʀwyLzjo5w%-asV7@lCG>^~+VL*0(9K]uial+ /@     _Y?+?999393321035!!+p HDV"OW"@ `Y/2?+993310!!!CW6*Wb N@'   _Y  _Y/+9_^]?99+999393223105 5!! !\qKW,Ƙ}9@ Y?+99105!}9TY~D@ [XYX+/+910!~; ;1|T&@ //9/92393310##5!37PQv+@U&   ,-# #Y ))Y/?O?O---------p-`-@-0-]]]]]]]]]]]]q/]q33+3/33+399399210#"'#"&54632632%"32654&.#"326vzʑgAŘx^,cFEYV5Z32#4&#"tтwgĠW(@ PY PY?+?+933310"&'53254632&#"+\B5ԾXC2EMPWae^DR7+n@ ( ,-()Y((& Y&Y`  @ Y Y  YY`  @ Y -d-T-D-4-------------p-d-P-D-0-$---o------T-4-----d-D-4-$-----------d-D-$--?_^]]]]]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]]]]]]]]]]]qq^]]]qqqqqq/+_^]2/++9/++_^]2/++9/+993310"&'&#"5632327"'&#"5632327GKKYCvFnPJJr?xTy\GwAqSLfFr@u)/'1T,.\-#F-+-T. \,$;%f+Z@         @ Y  P  @ P   Y+K@H{k[Ko_O?///joO0pPO/O/9rr^]]]]]]qqqqqqrrrrrr^]]]]]]]^]]]]qqqqq_qqqqqqrrrr/+]q32+3/_^]q3+3_^]2932399392910#7#5!!5!33!!ՁGZӃ#JdGP ?@!  Y YY/]+/+9/+993333105!5!5!d8dWY 5@   Y0@/]/9=//+93333310 5!W@wAZWY ;@  Y0@/2/]39=/33/+993333105 55!W?7 $@ //9333103 %! {RVdG@ Y/+/993107!!d>T"@  //99310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //993103#"&546323265";N2$! =/'5)%3%Y?+33105! %iH??33103#ؑHK"@ Y?+?33310!!#(in @ Y?+?333105!# (%%HY??+333103!!Hn%H @ Y?+?333105!3 %H)@  Y??+?3333103!!#iHnnH%@ Y?+??3333105!3# %K(@  Y?+3?3333105!!# i%n%H(@  Y?+3?3333105!3! %nH 3@    Y?3+3??333333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH@ ?2?33233103#3#ّhHK Kj 7@  YY?+?+?3333310!!!!#(iijב" /@    Y ?3?+33333310!###בnn#j ;@    Y Y?+?3?+33333310!!#!!#htjo"j 5@   Y Y?+?+?33333105!5!5!# i(qב) .@  Y?+3?333333105!### ܑב%nj ;@   Y Y?+?3?+33333310#!5#!5!ґttj)F)ޑqH 5@    YY??+?+33333103!!!!iH"ב%H ,@    Y?3?3+33333103!!33A$Hn#nqH ;@     YY?2?+?+333333103!!3!!ّK$hH"qH 5@   Y Y?+?+?33333105!5!5!3 iqב)%H .@  Y?+3?33333310!5!333$ב%nqH ;@   Y Y?+?3?+33333310!5!3!3!5!$KqFH <@   YY??+?+?333333103!!!!#iiH"ב"H 5@   Y?+?3?3333333103!!#3#AHnn KH G@   Y @ Y  ?3?3?+?+3333333310#3!!#3!!jt " "H :@   Y Y?+?+??333333105!5!5!3# iqבKH 1@  Y?+?3?3333333105!3#3# 㑑h%K#KH F@   Y Y ?3?+?3?+33333333103#3!5!#!5!A㑑tHK )ޑj >@    @ Y Y?+3??+333333105!!#5! iiq"h 4@    Y?+33?3333333105!!### ב%nnj I@  Y Y ?3?3+3?+3333333310#!5!3!!#!5jtttAޑ"בqH >@   @ Y Y?+3??+333333105!3!5! Aّ"%H 4@    Y?+33?3333333105!333! ב%nnqH I@   Y  Y ?3?3+3?+33333333103!!3!5!5!AH"oHT@   Y Y ?3+3?3+3??3333333333105!5!5!3!!!!# iiiqב"ב"HI@      Y ?3?33+33?33333333333103!!###!5!33AבHnnnnH b@   @ Y Y ?3?3+3?3?3+3333333333333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{8@mmUE- yylTD, xeM5dL4qYA)}}pX@(|aQ9 `P8u]=%t\<$|xiI1!hH0 Ygckhk@ Yd`h_[WTW@ Y\XTSOKHK@ YPLHC?GDG@ Y@n?o*Z+[BrCs.^/_FvGwA&.6>JFF'/7?KGG@ ۸B@JzK{AP#+3;OCC"*2:NBBQӸCи@ԯ?<;87{{|4xgkosw3ccdhlpt0`OSW[_/KKLPTX\,H7;?CG+3348<@D(0#'+/' $(,$ #  KH@Ԩx`H00H`x DAGO   L/333/3339//////////333333333333333333333333333333333333339333333333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQD@lFh| OoLldi}SsPp`"eWwTt\&a# +P;;Xxؿ)H*99]'A!/L?? ,Q<%D.55 &I+648<@DHHA 0M@@6<@ؾ FKk A R"E/2226:>BFFSֹ:>Gʽɹ59ȹ48+/D*.C%)$( !@ ?| {~ osw <knrv ;jj\`dh[_cg@OSW8KNRV7JJDHCGLP@&4"&*. kKKk  ׹;?HKO@ 3 $(,0/333/339///////////3333333333333333333333333333333333333339333333333333333333333333333333333333310!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  /993310!!!7L17}1mi{/9910!!imi{@  /32993310!!!iLPbh//9910!!hL//910! XVRZ//9910 7L//910 LRZ//9910Z79e+ ;@!      O ? / ]]]]]]/?99933310!# 3 Vh=h!!-.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @ /O/]99102#"54>jnrotjlw)@ /9933103!32>54.#")vwvvvwvu}Avvvuvvw)#,@ %$ /993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @  /32993210#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:p@? :6+%%<;("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332993993333210"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7T@15  **.&"## 9810/+*?*O**/^]]]]]93333333333310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'V@2$  )(P   @%(H/+^]2qr/]329333333310.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8>@!0,'6!'!9:,*3$$$-  **/^]]]9999339210&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<48@4((56$+/     //99//]92393310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@   //9310./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @  K  /]933310&&'6H zDS%Ut}FiGfY;,@  //]9/99333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt _@5 "!VC 6% X ///33]33^]]]]33]]39333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgud//910!##??3%377%`6F`>"^#=`5ZG`?#^#_[?YY]]9mbbbboyl@<       _Y??+99//_^]33333393339233103!!!!!!!#737#nL'Lk%$k&*,V&$yzL@(      ??99//33333333339333103!3#3#!#737#i{[[}%}%}%}WVz%z%{.CO@+   _Y?+?9/33/_^]333/39333310!!#"#>;!32673#I,4. @gNc'{19DmPZ9Bxp=6Ewr<$YS@,      _Y _Y?+?99//333+339933339103!2)!#%3#!2654&#!OEbڤ'!xeQ~tfkW$O@*$ &%$_Y$$#_Y `Y ??+?+9/+393333310!!327#"47!2 2654&#!kXI-%x(vٺ0sQ# e   CXb{ul\c` W7.4:@@O/?;;+!& 5 7 810>=&!BA7810>0RY  >> QY  1OY )RY?+?+??+9/999+99?9333333910"&547##.546%"%>33327#>74'76|dlIPi{ nU\"@`ZG(' *V`Mmx%sHPL= TE%q_ eo EIf g%x-#{\VE'T_W^N@(  !  OY OY?+??39+3?3333933310"'#547#7373333277#n|EΣf%08/( L Qf@;,gGV`!.- $hI@&  `Y  `Y?+??39/+933333310!#!!!!!3#vvv'mrm\1st#hF@%  OYPY?+?+9??933333103>323##654#"!YO'Lt`tOvevkka?6S|)y$hCM@(        `Y?+??3933933333310!#!!! 3#?\e'qB{t#hN@)    OY?+???9339333333103##!!!ĘtOYU B*KZh# =@   _Y_Y ?+3?+3333399310)7!7!!#B(i-(^|3h: =@   PY  PY?+3?+3333399310#!7!7!!Os& ()'v7h\d.:@  _Y _Y??+?+?999933310!'# 4$3273%27&#" v@φw|>RAjUY uҤnpN(@   PY ??9?+399310)!?632.#"n!G@zv&(::#<T)8 @5@)7A7B4;`Y4)"?3?3993?+39310)4.5!!1>7!67>7>32.#"  Y$ " N< /K\oB7!67>7>32.#"+!E    &-*  4qxw&(?OG11FNn:BD""B|B"$$"BxT':$NL@&    ??39/9933?33939933310)'7&54632!>54&#"nZ but0.=,F-*Z?oTYDvj%>"f$U"@ `Y??9/+910!!!!&u'mf\#?:"@ OY??9/+910!!!T%}Z:T1:!`N #=@!  %$PYOY OY ?+?+3?+933310%654&#"2! 4$3><77=n̒)kf^o,>\q jmHX^ܷ"⥗9qbH3M"@ //99//3399107%7%a/-/w.-/,e1/9/310#3#531ݧ/9/310#53'&axa0*buc[ /3210#53!50턄p[ /310!5!53[D $@ //9/3999310!#!53R$X KD $@ //9/3999310 #5!3!$IK @  //9/33910#!!S\& 5 5P|$@ //9/339310!3! ڜm55|$@ //9/339310!3!ڜm55|&[   /239/10!##5##ㆡY_  /339/1033533!Yp_DŽ] 㗦yw%(#9?XC& ' j}F' Ny HR -PZ}wAY7?+310!!!!}TD&D&D&'D&'&&& ]5&9&L&F&H& 5&L&FH&  +& '& Ny& X&'&Z&w&3&u&V&9-&&P&HHD&+&/'+& 3+&m : 99?3??9310#!3>?!!`yVJ)M`$BH*v!nJ<|؈!, /210#!'E/ iNH, /210 #.'-\,tyi* @   /]29310.#"#>32YeaXo#9Tx.HK"6 @  /3]931032673#"&'eaXp#:T.HK!  #.48DHLRY`h@6655 !!e?/M9aW^^'+S-$ZZS'aM? N jE1QQNJJNIIF2NNi FQ"Ogg<<'^']-WVccBB(2P'_O'W22W'O3K7 QQJ6N G003/33333332/33333339/////]]333333333333/32333333333333393333333333333333310#5#5!!5!#3#"'73253!5!!5353!#32##!!5!#"&54632#3!5!!334+324+32#"32dCC?ddV4I(_tC~dYwdC~CddCdYeo|~ddd~C-Od?d ĺ[6.C?d{C~ddCcm P9 !@ [ +99310#67#73ىpl(>9dF~Fr? @   Y/+3910"&'73276,kG[p<JgU1X "@  Y?+39910#67#73rl(<eYϒFq@tI "@  @[?+3991033#7>rl(CIeYϒWu-/3910%73] +5/39107%! ~++ @   /3939910#'##737}+ @   /2939910#73373Hkj/Ko/@  Y Y /2++3339310".#"#>3232673,QKD*7'g-SJB+8'&/&3H&/&8C: @  /323910?!!57!:    ++c 1@   @Y/+_^]2339310"&5332673֎[ONj*KYLXCCCvvv:+8 /2104#"7632#726A9 >O KM^/ l JB}2n&:+* @ /2]210"&5733273KD)%r"BG_/3107!))vvCC:+:+`_ `_ `_ `_ `_ `_ `_ `_ `_ `_ `_ `_ `_ `_ #:??99103!#:@+ @ @ H /333+210#73#73'!!Πvcي/+ @  O /3]23310#?#73#73/v+@+-@@ P `  O  @H /333+]29/]910#73#73%3#'73Πv'¶ C+ @ O /3]23310#'73#%3#i +٘8+O/3]210#73%!!cيV+@ /33]29/3310!!"'&#"#>3232673c3QR$-4[6Q=$C=802\ 2M+&%#(UG&&%\B$ '@ ??39/?993310!#!5!3e*\* '@ ??39/?993310!#!5!3e*$E '@ ??39/?993310!#!5!3o ZZ#@ ??39/?99310!#!5!3o DM%@ ??9/3?399310!# 7 3f\>Ha4R '@ ??9/3?993310!#!7!3bG4oaRM'@ ??9/3?993310!#73_J^rM '@ ??9/3?993310!#5 73fS܈kh/iF$@ ??3/9/99310!# 73pZzfjFp'@ ??9/3?993310!#73p^ZHd(5%@ ??9/3?399310!# 7 3RkGHyN!5 1@ ??9/933?993310!# 7 3Rka.K- O &@ ??39/3993310!#!7!3xtdH^- &@ ??39/3993310!# 73`vcFFH @??39/99310!#73wp=Dg-p&@ ??39/3993310!#73pEsHVH!$%@ ??9/3?399310!# 7 3=|GHY2#% 0@ ??39/933993310!# 7 534~X4(5f% 0@ ??39/933993310!# 7 3C{sVH2}q' &@ ??39/3993310!#!7!3cy Q2X/@  ?3?399310!# 73HԈG7%p&@ ??39/3993310!#573p={H\2#"@ ?3?39999310!# 7 36}MH)Q0) *@ ?3?399//993310!# 7 530~YAuO/l6 *@ ?3?399//993310!# 7 3ON,qS-m6 *@ ?3?399//993310!# 7%3O~t8S-{0@ ??39310)733+NS.)p @??39/99310!#73pA>S.)O"@ ??39/9310!#!'!ataoL 0@ ??3399//393310!# ' 3[H5fy4L .@ ??3399//393310!# ' 3UH)hy?L ,@ ??3399//93310!#5' 3SHhy-^(@ ??3399//9310!#' 3Q6fy=Lp @??39/99310!#'3p^iy"@ ??39/399310!#!5!3pT; .@ ??99//33993310!#!5!3a.izT *@ ??99//3993310!#!5!35$&@ ??99//399310!#!5!3?P(@ ??399//39310!# 7 3h`axbVL 6@ ??99//93393310!# 7 3e`;H`GF (@ ??99//3993310!#!7!3fb*]v\^L(@ ??99//3993310!#73^'c{L"@ ??99//99310!# 73e[؈scSc[Lp(@ ??99//3993310!#73pd]?de[/(@ ??399//39310!# 7 3Gu7TaF?9 6@ ??99//93393310!# 7 53Rv8HqGG? 4@ ??99//93393310!# 7 3Nw]sX=U8H? *@ ??99//393310!#!7!3mwo V=2? @ ?3?9/99310!# 73\w߈5:=?p&@ ??99//993310!#73pWw2-B=+6&@ ?3?9/999310!# 7 3O}4H) 0q5 .@ ?3?9/99393310!# 7 53N}<Au 1[l6 .@ ?3?9/99393310!# 7 3ON,q -+m6 .@ ?33?9/9393310!# 7%3O~t8 -6"@ ?3?9/9310)7330O~ -Q5p @??9/999310!#73pM4 -zL"@ ??39/9310!#!'!owKzL 0@ ??3399//393310!# ' 3oH Kz4L 0@ ??3399//393310!# ' 3oH)S@Kz?L .@ ??3399//393310!#5 ' 3oHu^Kz-L&@ ??3399//99310!# ' 3o6RjKz=hp @??39/99310!#'3po~3232673#?3!>97,2X6Q<#?94/0Y5P#&RD&&#TC%v4+!)@ @ HO/3]22339/+310#73#73".#"#>3232673 u!>97,2X6Q<#?94/0Y6P#&RD&!#PB%P+  /210#73!#7+ #@ @H o/]239/+310#733#'73 )¶ C$+ @  /3]22310#73#73!!qvOv9: 4@    PY ??9/3+33933103!3#!#,ySS{'{YYyX99=*&c'^^)@>>@%66?66==&+5]]]55+59=*&c'^^)@>>@%66?66==&+5]]]55+59=*&c'J^)@@@B%66?66??&+5]]]55+59=*&c'J^)@@@B%66?66??&+5]]]55+59=&c' )@A AH%6?6/66==&+5]]]55+59=&c' )@A AH%6?6/66==&+5]]]55+59=&c' )@C CJ%6?6/66??&+5]]]55+59=&c' )@C CJ%6?6/66??&+5]]]55+5#,*&&7^)@%?&+5]]]55+5#y*&'7^)@%?&+5]]]55+5#*&'#^)@%?&+5]]]55+5#e*&'#^)@%?&+5]]]55+5# &' )@ %?/&+5]]]55+5#&'Z )@ %?/&+5]]]55+5#&&  )@%?/&+5]]]55+5#&'P )@"%?/&+5]]]55+5fd*&w',^)@*:*, %""?""))&+5]]]55+5fn*&w',^)@*:*, %""?""))&+5]]]55+5fd*&w'^)@,:,. %""?""++&+5]]]55+5fx*&w'6^)@,:,. %""?""++&+5]]]55+5fd&w' )@-Z-4 %"?"/""))&+5]]]55+5fx&w'6 )@-Z-4 %"?"/""))&+5]]]55+5fd&w' )@/Z/6 %"?"/""++&+5]]]55+5f&w'@ )@/Z/6 %"?"/""++&+5]]]55+5#&&j'mA@*%?/&+55]]]]]]]q55+55#&&j'R@%&+55+55#&&j' O@%&+55+55#&&j' R@%&+55+55fd&w''j@&[&$ %""&+55+55f&w'p'j@&[&$ %""&+55+55fd&w'l'  j@0[0. %,,&+55+55f&w'j'  p@[ %&+55+55#5+&L@  & %+5+5;W!K@( #"_Y_Y_Y?++?+??9/933339910"'73267654&#"!!>326mg)M0dex!U(W q~1H9qk}p[`S^$WF@%      aYaY?++??39/9/39233310"'72>7!!!f_G$I07#2^W HvkMo'S@*& &)(''#_Y#_Y#?+?+?9/9/9/9333339910326?654&#"!!>32' $57.( )݊!UҍQ{D ky<5Ŧ[`>6 1g2n02?3?2102#"&54>2>54#"G7hRvt6`&:N6LBD1nOԚM~PړIn9oi.er)c /1?23?39/10%73?33a 髅rp{rUn 01?2?3310%767>54#"'632!N[@"R*=A|0Xt2c!nrqx;88A(9"hW5XQI C(gEn$#$$ 02?33?339/310254#"'>32#"&'732654+7Oc#uzYL=8 =4<9uH5jFal_dYHdJ@ild5'9*WrSc &@  1 /?3?9/3339/10#7!7333gl{%gSc&@   / 2?33?29/339/10!!632#"'732654&#"#(:Gb{& /6DK8*B-c!yi-+K=810g9n""@   02?2?339/39/10'"&5432&#"632'32654&#"3֩mz A{-D`cqS206F6&8JgcYK=n_PO3:LE2-Hr@c 1 /?2?10!#>7!aSW^cahgHm!-$@  " 0( 2?3?29/39/3102#"&5467.5462654#""32654&JxPIh`[)/g47X->-?B388F6mfTBb-qrnbJgT3`m;0N/5(-{F9)5F:-0gAn#$@  !! 02?33?39/39/10'27#"&54632#"&'74&#"3263s2Ac`sw9fVf 1*9J5(:G9t`~tZϔJ^aR'7MJ+.Nn+  /329/3103#7#'##737`Rih+ +  /329/310#'733#'##7 `˫hiy Sr+@ O/3]299//3104#"'632##72#'#73D53,?BBES;=TCih@+&1BN`+"#@  @ H "/3+229/333/310".#"#>3232673#?3##GE@-4[9R;'C=700\/G㤛´t+(OJ)#%U?#{C E+@  O/]239/3103#7"&=332673G7k`TSska+ l D78CE+@  O/]239/310#'73"&=332673ck`TSska l D78CE+ @ O/2]29/9310"&=3326734#"'632+72k`TSska43,?AXO# Sl D78C@M7@7c+ "2  @ H  @ H/2+2299//+33310"&=33273'".#"#>3232673ftU +UL(#B?:P[kW3SO"0, \1MeU QQ9SDE3&  /329/3103#7#'##73tV@& >s&  /329/310#'733#'##7ktt -u%@ /3]2]9/3104#"'632#?6#'##73,D?7 JYTXTQ[$FD@'P8-8G &^>U !+@ //3]299//333103#'##7".#"#>3232673lH(IB=)1$\)JA:%1$}K#)#2=y#)#+Dw_ @  /9/2310'!"&57332673[gYKRp*&{&ISPL_ @  /239/10'7!"&57332673:YKRp*&{&ISPL_+#!@  /]23]2910"&573326734&#"7>32#?6.YKRp*G@2< h,vhi 2h{&ISPLfG@>O3232673.YKRp*/(IB=)1$\)JA:%1$}{&ISPL#)#2=y#)#+Dw0y& &0y& +& J+& '+&b}&&Ny & ]5 L #/;?7@!!??39@999'' '>>-'/33/3/33/3]q22/2/3104632#"&74632#"&4632#"&%4632#"&4632#"&3 . ".." .. ".." .. ".." .Y- ".." -+- ".." -9n9` .. ".." .. ".. .. ".. .. ".. .. "..G-)@@ /33/]q22/9/3107!%4632#"&4632#"&3HK. ".." .+. ".." .9n9mmB .. ".. .. "..G-#5@ ##@ "" /33/]q22/9/]33107#7!#%4632#"&4632#"&3UnHj. ".." .+. ".." .9n9rmmr .. ".. .. "..G.6.'32>#".7>7$&!5 H{cE(P=FkM3U="$nفl mg e(EufX(LiSBpQ./Rsn9TlLEun_!:QpKU[0!7!267!3267!!467##"&'#"&547!F![w{~XvMf|Ujzc_[-y\_ )tXwqf@dZ1yU[ !7!3267!!467##"&5467i!(vevLt{*y^O kaoF4 8$<;DGNW]h$$7h$9h$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB01uniFB02uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFC commaaccent breve.cyrcaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmarkuni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lc uni1FEF.short tonos.shortlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BES_TES_PE x          bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.60FVR J   8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz S R Q P O M L K J I G F E D C A @ ? > = < ; : 9 N T B H:BJRZbjrz o n m l k i h g f e c b a ` _ ^ ] \ [ Y X W V U p d Z j:BJRZbjrz             ~ } { z y x w u t s r q   v |:BJRZbjrz                            :BJRZbjrz                            J",6@   bcyrlgrek2hebr>latnLMKD SRB kernkernmark  6>FNV^fn|&.6>     jx|8  #j&&&'8''(F(()  ).)^)))**N*~**++>+n+~9:<@nCGjGrG1lll~.6llL.llll....llll..lll    ))     ))          ,             ))     -              1          n L $*06<BHNTZ`flrx~ &,28>DJPV\<<<<,<<<~<<<<<<<<PPd<<<~<<<<<<<<<<~<<<<< (  H" X &,28>DJPV\bhntzXlHxRRXX0XXX XXX  L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz\F\vFvFFFFF F  F F0F00F0 F  F FFF4F4FFFFFF0F0F F FFFXFXF\F\FF0F0 F  F 0F0 F FFFF\F\\F\\F\vFvFFFFF F F0F00F0 F FF4F4FFFF0F0F F ** F  F 0F00F0 (  HFLRX^djpv|FF@FFFF@FPFFFFFFn. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzll0XXXXXXhh||vvXX,,ll\60 DDllXXhh||vv 00llXXXXhh||XX,,llX hh|| (  H   jpv|`t22<2  !<  !J`    J`      J`     !   J`     ! 4<4J4<  !4J  !Jl      Jb    Jl        !Jb      !n L $*06<BHNTZ`flrx~ &,28>DJPV\,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(FF(FFFFFFFFFFFFFFFFFFFFFFFFFdFFFFLFLFFF (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\FF0FF8FhFF`F`FhFpFHFFFFhF0F`FF$F$FFF$F\FFtFFFFFFFF8FHFFF\FtF@FF@FFFFFF0FF8FhFF`FhFpFHFFF0F`F$F$FF$F\FFtFFFHF$FFFpFpF (  H <FdFn L $*06<BHNTZ`flrx~ &,28>DJPV\$H8 88\ X   \$ 8$$$H8 $ XH  88 (  H ( >       $*    $*    $*    $*    $*    $*    "    "("($*$*$*$*$*$*$*$*$*$*$*$*$* h*DVdT^lvv,NhvNhVR0^hhn@<J\ d  6 < F P ( R X R   > \ 0 f x $<;DGNW]h7h9h:DJPV\0D00t`0D0`8 (  H ddn L $*06<BHNTZ`flrx~ &,28>DJPV\06h,|XXl0 X0    06h,|XXl0 60X,, (  H   flrx~Rn L $*06<BHNTZ`flrx~ &,28>DJPV\FXFF0FF6FFFF6FFF*FF4F6F|FFFFF0FDFXFFHFFXFXFXFXFXFF0FFF*FFFFHFHFHFHFFFFXFF0FF6FFF6FFF*F4F|FFFFDFXFFHFFFhF,FF*F*FFF (  H:@FLRX^djpv|XF,FFF@FFFTFF,F,F,F,Fhnn L $*06<BHNTZ`flrx~ &,28>DJPV\0hXd|XX XXXXX    0hX|XX 0XXX (  H   flrx~h@,,x0@ $p=N@̑jopenscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSans-Italic.ttf0000644000076500000240000126643013402025764025507 0ustar kintelstaff000000000000000FFTMalGDEF~t1(GPOSD"JfGSUBm[OS/2`cmap[*.cvt qc<fpgm~a0gasp glyf3ӂg)$head><6hhea , t$hmtxX(tkernte(loca>?|(xmaxp` name*@ postERh'prep`8pşU_<̓H̓H >NC V d  RTe/\x33Zf   Px!1ASC W3>`: 999Ms'sV!`9x9%i9P9sYs5ss0s s.ssss6sF9Q9&sVV?q?V??9e?9QV?s???9oV?9e?V:VVV999W(s`s.sCsEsE9Ess"!"!"s"sCssE"9]sVpfaz9@ssss-s?YsLdi?k3dA5LG=es`/AVVVVVVqV?V?V?V?9Q9Q9Q9Q"?9o9o9o9o9o9VV?"s4s4s4s4s4s4 CsEsEsEsE9Y9Y9:9YsCs"sIsIsIsIsIdR,sVsVsVsVsVs.Vs.Vs.qCqCqCqC?E"sEV?sEV?sEV?sEV?sEV?sE9es9es9es9es?s">s"9Q9Q"9Q"99Q9YQ!V?""s?!s?s?@!s?3!s?s&?s&?s&3?s"9osC9osC9osCeE?"??"V:V:V:V:9]9sVsVsVsVsVsVfVV!sS5>s5=s+qC"FP5GsEr-V9zPs9e1 "!90V?"Ms"9o~oCoWCSsV?VS,99]YVyssN9M ? ?sEs?:?! ??:"Vs.9Q"9osCsVsVsVsVsVsAVs.Vs. 9xs9esV?"9osC9osC ? ?sE9esF??s"Vs. 9,Vs.Vs.V?sEV?sE9;99Q9Y9osC9osC?"?"sVsVV:9;\~?s"Z@EC`Vs.V?sE9osC9osC9osC9osCVZ"`8 8V2ys/XV@VV5sx qsE VsFsEs ssEsEs@sAB"E9RssgBnesVs"s"<!VV"ss":sC B;=sBsF"F"SqPQL99s 2fh|a9o gBg"X"sEMkE>EE^]gM+"!!78UwUww w -+ peeMI!_(9D9oooVG5b?$bbPP<9eg ..z,89xss[O?^LMK8BkfQD%cvp#5oO;E6EA8Ixs|SSS6NE]ZW>x&uXC9&V9OLIIZ3.VV??^V??9e9QV?V??09o?V?V~V9QVF"q"?fhForC"=q"We?"bc7sC\[CDKfh8G^kv;C?fhsCfh;C Ef#sB;=9osB?d<@ cscVMVMdKtnBRC9oBV?sq>|u+q+V?V?Z?eV:9Q9Q????V5>V?Z?CV?V???|??9o?V?q\zV?c]?b?q>5>.?ts.i-',lCsEsVsV"|"g"sCg"sC"EY$VVB&5& "FsEsEs"!C!+H"s""sVsV joBg;"9?"X?r"{ 1?#9osBppoYBoB Brf joBqCs:-8l%f?sV5>5&V?s?"Z& (?4"V;?"?"?"u?g"!?"?"oBqC"spsCV.)Xc$c$c?s"9QV@(|?g?g"c$?|"!Vs.Vs. V?sE9zsA9zsAV?sV?sV9hsC9osC9osC c$Z?#>&Z[VVVNsENE?"9egB"P"|9esEf-sZ%#fZmmuu=uu9R 3boFHqDH9F3=RmH?3\FH99=Cq#q#P"|"#sCs$$UEsJsBH"FF(fhsspf$#g(H"`[TT>iTIT:TToTPPeYTT,h 9UB:~,rrP#P!":,u(oP(t(o[`5K70 nm !0)  kMVssE9sspp9s OtsfssE9^"<"s"s:ps.sEsEsE"A!S6sV\ fC)oPI"N+AA+!mf>u\u<((cu7ju<uE+9)xA2]KU7Vs.V?sV?sV?sqC?sE?sE?sE?sE?sEV?sEV?sEV?sEV?sEV?sE?9E9es?s"?s"?s"s?s"99Q9YV?"V?"V?"s?s?s?s??"?"?"?s"?s"?s"?s"9osC9osC9osC9osCV?sV?s?"???ZV:V:V:V:V:9]99d9isVssAsVsVVpVpfffffVVVs"9]fs.!b5Vs.Vs.Vs.Vs.Vs.Vs.Vs.Vs.Vs.Vs.Vs.Vs.V?sEV?sEV?sEV?sEV?sEV?sEV?sEV?sE9Q"99osC9osC9osC9osC9osC9osC9osC~oC~oC~oC~oC~oCsVsVYVYVYVYVYVVVVVFFFFFFFFVV""""""yooq"q"q"q"q"q"q"q"yoouu????????yoouusCsCsCsCsCsCy-o-ofhfhfhfhfhfhfhfh;C;C;C;C;C;C;C;Czyz o oFF""q"q"??sCsCfhfh;C;CFFFFFFFFVVq q q q q q q q yoouu;C;C;C;C;C;C;C;Czyz o oFFFFFFFVVVVV]XPq q q q"q ?3????9Q9QeefhfhfhfhfhfhVVjTTi;C;C;C;C;CeIBzIYkUs9 LssNk`ssDaM3cVMV9'NK\( sZqqss" N ? NqsV5+V?9eVVqT>%nX =(=>c|8V9d3i1dLdAdd?dAd"g{mm%b))s+kUFQ@;@<fB2s sV? s9?s"V?" qpLfu?#8GJ9999p EEoF3=RmHFXboF9F3=R?3\FH33)nX8ZXZ /qHAL=R0Rsk5 y6M 9Y}WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWWjn@=[jeFFFFFFFF????????fhfhfhfhfhfhfhfh????fhfhfhfh!J?F~==FF=Rt VsV$~~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A8 ?9U>9UB@A@;3:U839UO?@@R O P(F(F+_O_ F@FF@36FF=U=@XUUHU2UUUHU=UU=U<P&`p@`p@Y2F?? `p/oOߩ +@ F:@PС@ $F$$$PZH$Ж F @V_oϔߔ<@F@ F_@%FЏF0@o   @F 0Fmuuuuts?sP&rF5qF5@p&,F p0poF5nF5U3U3Um)mla_/`_B_P&^Z2\F1[ZHZF12UU2Uo?OoYRRRR-4F@R $FQQ@Q58F@Q%(FP N)/FN"F MMHMXMMMMML$-FL FLLKF7IF HF5GF5FFFF2UU2UU?_/Oo?oOTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++stu++++s++stu++t++s++sssu+++++++++++ss++++++t+++++st+++s+stst+st+st+++stss+s++s++++su^s++^stssstst^ss+ss+s+sstu++++++++++++++++t++^s++^st+++ss^ssssssssssttu++++++^}y:wW~ rj[Ltdje"39+kknL^[^t^eoz iq4 HjgaASEy'NWd\x_hTDLxH@, h ( `Hh@ th(|`l\@  p" "##h##$H$$% &$''(x)<)*+x+,p-(-x/d001`2<23445(67L79::;<\@TA0ApBCDlEtFFtFGHHIIKKMNDNDNPPQ<QhQQRRSS0S`SSTTU$UTUUUVVDVtWDWtWWXX4XhXYYZZDZxZ[8\ \P\\\]]H^^__0_`___``HaHaxaabb8blbccd,d\ddeeef fPfffgg0g`gggh hPhhhij j<jljjjk$kLk|kkl l<lllllm$mTmnTo(oToopLpxpqq,q\qqqrrrsssstt<tltttutuv$vTv|vvww4wxxyyLy|yyz{||@|h|||}}L}|}}}~,~\~t~~~p(XHxDl,` PDp \x|DP$`lTd<XT`4H`x8d8hHP0d<l,X,D\h@p 0`(\$X PH|°8`Èðp4dŔ,\\HTʄʴ\ː8l̨ʹΰψ @ׄؔ|DT Pݨބt XtT8P`@P,8PTD`XLLxL`<   x     ` ,d|Phll $h X !"D"##$%$%8%&(&'L'''+T//\/001 11,1l123T34P44455L5556P66747789D9:P;=l=>$>>???@@X@@A8ApAABEEEF8FxFFGTGhG|GGHHHHHI IhIIIIJJ4JJJK<KKLL@LxLMM\MpMMMNN0N`NNNOOHOxOOP PhP|PQ Q Q4QHQtQRR$RdRRSLStSSST T0TXTTTU0UUVDVVVVWW\WWXXPX|XYZ4ZpZ]h]]^0^t^^_(_h__``aaLapaab<blbbbbcclccddXdhd|dee4eeeeeffffg,g\ggghhPh`hphi4iDiTidj4jDjTjjjk`kpkklTldltm`mpn(no$oXoooppLqqrts<t tupv$vwwx\xyyz{0{|}}x~P~Dtx4hx\T8lt`X|\(Lx<$4Dphx DT0h$4d@|`0L$, <`$ 0@PLd l8H88H (X(<̄P8ϰ0ѐXhؘ40$۠H|݄|\,8h`L`,lLT0@d(4<HP(h\(T x $    $   ,\Xtx$4d L|8l,`0d0`0d `  !"<"#$,$%8%H& &'()d*(*+,X,---.../0$040D0T0d01h122233334P444566x67 7<7l778088899T9:@:;t;<|<= ===> >X>?0?T?x??@@8@@@ALA|ABlBC,CCD$DEE@EFFxFGxGHHHIhIJhJKTKLHLLMMM@M|MNOPPQlRRS`ST$T4TU4UUUV<VWXYZZlZ[|\ \`\p]]^^^__`|a4axaaabccpdde|efTfgTggh\hiiijTjklllmLmnopDqxr rsdttu|vPvwwxdxyXyzz{<{|4|}P~~~p0<$(X$TD$T<phd`PXxTDX p@\ddtTXh$,lPT”H8hĘ<xT|ƨ$Ltǜ$HpȘ8`Ɉɼ8ʀʨ Lx˨8h̘Ph̀ͨ XΔDlϔϼ<dЌд <lќLtҜ<ppԤ,Հհ@p֜@hא@tبHـٰ@hڐڸ 8`ۈ۰ Xܐ8`݈ݸH|ް8`ߐ(X8`L|x(\,`LP8` T$XH$L|H|Lx4d$Lt$TDt$T|$TPDx @t4h0d,`0d,`(TDt<p <l<h$TPPLPHx@l , X     H x    T    4 h    L   4l \ D4pX H0lTDt8d4|@x8`T 8d@t0  !!D!!","\"""#$#T##$$$$%%@%p%%&&8&h&&''''''''''''''D''(0(@(()$)4)*,,\,- .01$12p3p34484p4557788|89@9X99:L::; ;X;;<=H=>?@@@0@D@XA8BhCXDExFtGI,J`KLpMdNO4OQpR\ST|U\VWlWZ[p\|]|^d__`aTaaab b<blb|bc0ccd`defdfg gggh,hijk@kmhn$no oop0ppq(qXqqr$rhrssXstthtuupuv@vw wlwx4xxy\yz,z{{|{|l|}T}~(~H$XTl\ P@`L@h@ X` X|@LhXdpD|Px8<Tl$4DTdt D|0Tx<d$h(@XpH@8 | ädĈĬ HŐ0Ɣ<tǘ8HXȴl$ʀʔʨʼL`tˈ˜˰`̼xͨ δDL\Ѽt(x$t,Ո(x0ה<،<٘<ڄ@۠TܜPݬX ph88PLl$l|<DT$t<8TXl(| DLXh$ l,<4@4<T\X$l\dx D   4  $   d   T LD<<|p 4l8|40d $ | !P!"8"#$##$4$d$|$$$%%%,%T&D&'(()$M%*@ @[?/+_^]9310#373I(((#!@ ?32993310#3#3@%?E'y@    !   YY__o O:/?O?O@03H ?333?33399//+]qr^]^]q333+333333+33399333933333339333310!!#!##53#5!3!33!!NXnVTnTNYnXkXnX@PjNulhhlqlhhlqt"(/@i)' & ,--, ## 1 0--sY& ,t,,), #o @ H'  sY P `  ?33/3/]+3/+3/33/_^]9]33+33339333333933333310#7.'7.54>?3&'4&'$0r `Lr-VĺeZ>ZQ%sv )[^pY{-G5Ne(1@CV(r.;W@54+:##+<= /Y( [(6Y( Y [Y???+++?+++933333310!#3%2#"&546"326542#"&546"32654}6nY|]CV@+~Un<)}6nY|]CV@+~Un< jUl>M`TjUl>M`!%0=q@A+3 ( "%..18%>? +"(&3%%&;QY?  &&QY ?3+33/_^]q+9/99993333910327#"'#"&5467&54632>727.'>54&#"(e.<4 @ [/+9310373P++??32103tD Yb(@ sYsY?+?+3393102#"5462654&#"ܷϜ̵YQrwlrw!tA5 4@  tY )9?333/]]3?+3931037!7%3!5g#yW.ߴU L@) "! sYtY?+3?+3/_^]q3933310#7>54&#"'>32! 7}^6}jm%6fΓ.]wb[ZfyLbyww%Ĝj²]H0a+@P&  *,-+*+*tY++ #sY  @ P   P      sY ?+3/_^]q?3/^]q+9/+9339333102654&#"'6$32#".'732654&+76yew": y噀ā{|]lzo{}kXm0t~p{ & P@'   sY   ?3?39/9333+3399333399310#!733!N>>s3Ǹ??LFH.x^@2  sY sY tY?+?3/_^]+9/3+3/39333310!!>32! 732654&#"#W!r2SXutwA*0մI+rozess'O@*!( )$sY     sYsY?+?+99//_^]3+339933310"54$32.#">3232654&#""#rQ432# 7324&#"32>vbK~aKv[Sm~l^VgqۛJ-U\![yؽzfQ:'@ [[?+/+9933107373))))k&: 6@   [ [[/++?+9333310#67#7373{xX(B1((}Ϝ_-f?@'?0p?o/]33]]99333105 Z;XeD@) YO_ @YP/]]+_^]+9933105!5!Xf?@'0p??o/]]]33993331075 5Z㚙on^m!V@0 ! #"  @[/_ Y?+3/_^]/+_^]99333102#>7>54&#"'6$73=ay<b Fij\.t&?''ȝaeJ#HpDPw^LM@)7F?!07NOOOcOW\HOJPHO54$#"3 %#"$5!24&#"32>sejBqR't%QPNԝ)9"7^neZ_cPn<Ӥ[UF{{̵Y^mٞpW[bf}xX @@  _Y ?2?339/3+333939910!!#3 !%KP$V 0fdV)? P@+   _YI _Y _Y?+?+9/++99333910!2)! 4)!2654&#!P\Kcpß;v*kpqH@, _Y/  P _Y?+3/_^]?3/]+993210#"$54$32.#"32$7N~Եu+0$ϗbQ ٵ7p瓐? (@  _Y  _Y?+?+993310 #!!2$54&+8e}5*#?i G@( _Yx_Y _Y?+?+9/_^]]]]+932103!!!!!?X_<?C H@)  _Y?O @H_Y?3?+9/+_^]+3939910!!#!fneD@$ ! _Y_Y _Y?23+?3/+9/+93310 4$32.#"326?!7!7%•ߚ׊]3[ Ud8ר6ssOMxn? W@   _Y@Iy ?2?39/^]]+3+3?393239910!!#3!3ttsTQ"7@ &*H@#H??2?3]]++]91033QA@"    _Y_Y@P?2/]+?+993332910"&'73267!7!}pdi+!u|-&? T@*7       ?22/3?333933993339939310]!#373 (j-M2?!@_Y?+?39931033!??#@)  pTdy|H@CtwHDTti$4Tdt@P`@SHKH_o @90`p?0@  ?33/23/33?3333/3]]]]qqqrrr^]]+]q_qqrr^]]]++qq339333339^]_]333310!67#&'#37!$[6|# *h)s[L37>3~GL;]ߎO OgK0<1}9#s J@(     ?22/3?393/333]3393310! # 3 3 p^'\#9@  /2?39/333/33393310!#3 3s20@H9^ 7@   _Y_Y?+3?+333339910)7!7!!:uVW,@ YY?+?+3333910!#3'rWu@ ??93103@ WW`(@ YY?+?+33391073#7!AWs(3@"/2/?3]]339933310 #31΢pry `R@ Y/+39105!LL!@[/?/]+9910 73ϡ.-N)7`@40 * '  89+QYP PY'%33PY?3+33?+3/_^]]9/9+93333310"&57##"&54$%7654&#"'>3232732>7]US~ "j^wz-߼J Q!BwK+aMaf ML@~eb[WUW@]0(Ip"%9W>K^SM4)k@'  H@) H+*++/+   #PYPY?+?+9?3?3_^]99++33393102#"&'##>733>"32654&蝯{߭{ "SICcb8q|R^Nh^%JY.^_VQa}I{{|CNH@( PY `PY?+3/_^]?3/]+99333310%27!"&54632.#"TyΑﮩ l[~Vz1XaiڏE&N@)$  '(   PYPY?+?+9?3?3993339310"&54632373#47#'2>54&#"{߭{ R IBcb8qzV^}h^R3m_VQa}{|E'N Y@.  !" PY   PY PY ?+?+9/_^]+9/9933339103267#"&54$32'74&#"a,Iߎy%#N`S?x?μidH|E@@     PY QY?3?3+3?+993993310##737>32/"3K|aJ2-.?CIzpo9 AcaWaM#2k@;$+!!3444 ! +.PY'PYPY?+?+9/?+9?39_^]933333310 '7326?##"&54>323>7332654&#"6#ǎ ">_wMKy$0iflapZxR8W*YN*ɦ4arZ% Ry}J"E@#   PY?+?3339?39933399310>32#654#"#3Ss~~ v KsY@dsX>~de!J@  p  @!/8H?    SY?+?3?3_^]q+q9310733""NҴ :W9@     PYSY?+?+?399_^]931073"'732673!!!8I4;< 7T\@"V z@M8H7GW8 H X 9I:JZ  ?O_   ?22/3?3?39]339333339910]]]]]!#373 H iP|kE/!4@"`O/?2?]qqr931033! 4"KM-`@   ,-& .///T/t/ //T/t//////+/;///g////D/t////////t/[/0/$//////t/`/4/T/ /7///k/P/$/D/ /T////// /+/////t/[/4// //)PY ,$! PY"## -?22/32/3??+93?+_^]_]]]]]]]qqrrrrrrr^]]]]]]]]qqqqqqqrrrrrrr^]]]qqqq_q9333333339910!654&#"#6733>32>32#654&#"|LVtvIfySh|LVtvz}1KOƠS_ )rZwqf@dsz}1KOà"MG@%    PY  ?222?3?+99933399310!654#"#6733>32~~ vSsX>S_ )sY@dsC2M2@ PY PY?+?+_^]993310#"&56632#"32>2P؊޺Zzg}^;a<愔EW1N(C@$&*))PY "PY?+?3?3?+9339310"&'##6733>32"32654&*{ ^ Iw{&cb8q|R^h^ lono_VQa}I{{|EWeM'_@%())-3H)@H !PYPY?+?+9?3?3++9933333310"&546323>73#7#'2>54&#"{߭{  *U ICcb8qzV^}h^6 N6_VQa}{|"N=@    PY ?3??+9393339910&#"#?33>32,.in#BT.1 ܧ>r݅lK'N@*  () QYp  QY?3/+?3/_^]+999333310#"&'732654&'.5463 .#")!ufDb,zg|*OH=u~8XPa]>S3*PkGOFOH*:--(Rp],?@!  QY PY?+?3/3+3_^]933310"&547#73733#327Ua~}ix/} Z*:cfT7K{<#XVJ:=@   PY ?2/??+9993339931032673#467##"&547~~ vSs:{X>^_ )sY@dpb: <@   @P ?3?393/3]339933310!#37673նe -0:@Dt55^Xf5:1@6    Fvd@'ilH g@beHvYF6f$@AEHHD&679IYyiy6F@ H@ H?    ?33/3?39933/33/3^]+_]_]+qqqqrrrr^]]]]+qqqrrr+^]+]]]q3_^]9]3333333210!#'#37363,%0\(QU,!Kq:!ƾlROV<: c@!      @ P  @-;H   ?22/3?3933/3+]q393333210!# 33 ^+D,[Wg:F@$       PY?+?3?393/3_^]399333210"'7326?3>3H<- _Fٷp oWz/.P@ M: v@   t C S c 4 #   @ syH   @@mpH 0   i   @@cfH  t `  @@[^H     @SVH t b D T  @@ILH     @@&ADHt b T B  $ 4  9    @%/4HV 4 D "    @ `  H @H?   PYPY?+3?+3_^]]++q_r_rrr+rrr^]]]]]]+]]]]+qqqq+qqrr+rrrr+rr^]]]+]]+q_qqqq339310#7!7!! m&ڋWA-d@6(, ./!',  - Y @>H ,-,Y-Y?+?+9/+99+9999999393310"&547654&'7>7>;#";no 8 ]UnF?YaE]EQ=EM0Wu>7,!SIsuj^y_dN Q8E:{/?93103զ:naW-d@6# #/.'!,-,Y  Y- @>H -Y?+?9/+99+99999+993933102+73267>75.547>754&+74o 8 ]UnF?YaE]EQ=EM0̅u>7+"SIsu^yd_dN?Q8Ez)n'f@ Y&?3.#"0Tt |"L|l[~V1ծgaiڏ&@E  & ("'" uY  sY ""tY&&&?3/]+3?3/_^]+9/993+399333393333910#!7>?#73>32.#"!!!2673%ȖDau7(ἔpIr8h}Yg6.|Ϳ}i2@Ds}o*U`s' @5"()T)@)4) )))))))))))t)`))@ mpH))k)@IejH))p)D)T)d) ))))))))p);@)P)`))@)`))))))))IUH)DGH)=@H)@ 69H))))@ H) Y@%Y/++_^]+]++++]qr^]_qqrrrrrrr+^]+]]]]]]]qqqqq99331047'76327'#"''7&732654&#"Ndhcrrah`PRdfermiffNursurdgeRPai`urdieNPiifrrvt-@E        uY uY`   ?3?33399//]33+33+33933333333333910!!!!#!7!7!7!33A;;} @}/}y9{@ Y?/++1033զ v T=*7@&+%1! 9 8.(5.. .@..',H.@9H5?5!5@/2H.5.5%#QY!!QY ` p   /]3/]q+?3/+9999//+_^]++]q33333393333310#"&'732654&'$5467&5463 &# >54.'(!ujZ,)k"{9lu=Su~8XPa]?W1dnU7V29_Ei.eX3K:(l{$@ Y/3+333931073!73 ####ø?8@/#566)((#9::M:@OdH5@F H55 2Y&,YO)_)o)))&    @H&&p&&&  & & Y Y?+?+99//_^]+]q3/]++3/++_^]933333310#"$54$324$#"32$"&54632.#"3267PQ\۩ܨ"%Ƚ`r tL}Ns(s>MP¨#ܧܨ#!EDKQ#yhY.%0t@C&** #1#2&Y@HY!--Y `/]]]33+3?+3/+_^]9/+393339910"&57##"&54%7654#"'6!23273267BGBOeyl : 50%{m:3Y;1(UEp_Zfk\'-7h oMK/8}ULkR@.    [ /o/]3+3339393393310%73 !73 2 f  i m?s%m?s&dG8@#YH?3]]]]qq+99310%!5!i|p?-6@Z -!,-,3##$.))$788M8@OdH- $,!"3"Y%2Y$$o$3`3%% $3%%3$ Y Y?+?+9///_^]qq]++333/3+_^]933339933310#"$54$324$#"32$##!24&+326PQ\۩ܨ"%Rǡ3hUݟ_QPTMP¨#ܧܨ#P?~of{PEHU|T@ Y/+3310!5!|su\ 1@ Y Y ?+_^]+993310#"&546324&#"326vvxxmgKKgiIJhywuuwLhjJJjiA$ U@2    Y Y P/]]3]3+33_^]/+9333310#!5!3!5!|XuvX3X@5 ! /?/  YY?+?+3/_^]q933933107>7>54&#"'>32!M\hQ+DAFd}~w=kae3g0OF>MDK/3HN?rvx_Dn^V8M'q5'&F@ "& '((((((F(V(v( (p(((((y(((K([(k(=((]`H{(O(_(o(;(((@ILH((4(>((((p(D(T(d((+(;((((((((O((((`( &&Y_o  Y  / ?   /   Y ?+3/_^]q?3/]q+9/_^]+9_^]]qq_rrrrrrrr^]+]qqq+_rrrrrr^]]]]]3393331032654&#"'632# '732654&+L9ahB9Da}CoIZ$ [JV_XM=SH0?FAqZ, _DyHJYL6B!@[/?/]+991073WE: @ " !"@yH"""""@ptH2"B"R"$"""j"""@dgH"@`cHB"R"0""""@ X[H"""@RUHr"T"d"B""@2JMH""""""""V"f"v"D"6""""":""@158H""t""b"0"@"P"""$""""""""@=#H/""""""""""`"O"" PY  ?2?3/99?3+3_^]]]]]_]]qqq+qqqqqrr_rrr+r^]]]]]]]]]]+qqq+q+rrr++r^]]]+]]]]+333399333310332673327#"&5##"&'% pv 9 ,H3J>>Z^WR@%b))Ha\*%5.@  Y /3?3/+393310###"&5463!pqŭ3#fGWB@(Y@ H   Y 0/]+/_^]9/++9310!"'732654#"73>QQ280([Kw,ek`H;[,-H=3~ @  P ` 4 D   @ uxH   @nqHT 0 @   $ h bgH  \aH @QVH T d t  @AHKH t ` T 0 @   8  $ 4 D  `   @%H _ o  Y ?O?333/]]3?+3_^]+]_qqrr^]]]]]]+qq++r+^]]]+]]+qqqqq931073?33=v{3kake6 5@ YY `/]]]+?+339310"&547!2"32>54& DR D_l>an?W;Eb;E_VcS^M%I@*    [/o/]3+393333333310%#7 73#7 73  'ot?'ot?`0&{#'?^ ?55/q&{' t?50&uS'?^@ -?(((]q5?55A;!d@:   "#  @! [! @P YoP/]]+3/_^]?+_^]99333310"&54>7>733267#7=ay<b Fii\/t&?''ȝaeK"HpDPw^L;SbBbxz(û&$2@ &%+5+5&$&%+5+5&$Q& %+5+5&$ ^&6"%+5+5&$ g&2%+55+55&$-@#S3%+]]]]]55?55@S  `Y_Y _Y  x     _Y?22+?99//_^]]]]+3+3+3333393399299339910!!#!!!!!#!_QXY_ +d<qW&&zx$ %+5?i&(,@  &p %+5+5?i&(@  & %+5+5?i&(Z@  & %+5+5?i&( Z@  &%+55+55QT&,{@ &Z%+5+5QD&,a&%+5+5Q&,@ & %+5+5Q &, @ &%+55+55" e@;   _Y O   ?   _Y _Y?+?+9/_^]q3+3993339310 #!#73!!!2$54&#!8e}vIj`0*`#?&1 @ &" %+5+5o&2M@ &. %+5+5o&2%@ & %+5+5o&2@ &m" %+5+5o&2 @ &%0 %+5+5o&2 @ &  %+55+55=s %@   /q933310 7   bh^^i`fJb`g_iia'U@0"  ! ) ("!$_Y $_Y ?3+?39+933392910 #"'#%&54$3273"&4'32$ggz.fm.iy|_R^S^[Z&8Y@ &<%+5+5&8@ &%+5+5&8@ &_%+5+5&8 @ &m%+55+55&<@  &V %+5+5? E@'  _Y_Y    ??99//]++9933339103#3!2)7! 4&#!1GX~̹7w~"0X@0# )00)12 /)PY,PY0?2?+?3/_^]+993339931036$32#"&'732654&'.5467>54&#""/ܱ՛`;>OV08tnv@JIBMLRFxf ܢ~iA>$(UI 6c[8gA?k9Lr-0Y:EX43&DCU@ 8&^9< '%+5+543&Dvm@ 8&8; '%+5+543&D @ 9&o>8 '%+5+54F&D@ 8&@K '%+5+543{&Dj @ 8&<: '%+55+5543s&D"@ ;&>8 '%+55+55 N/<D@30'D=5=, ,!"5",FEA%PYDPYDD1QY)'@ H'%P!! !!%88PY ?33+3?3/_^]]3+39/+3/+9/+39333339103267#"&'#".54$%7654#"'>32632%32>7%74&#"{yW,Gԕ#a_M*|/g|sΓM]Nesvo{"#N[X?wLUbTXк0{"6kOM\YVH|CWN&Fz %+5E'&HC*@ !&0"%%+5+5E'&Hvf@ !&!$%+5+5E'&H@ "&e'!%+5+5E'{&Hj@ !&l%#%+55+55Y&C@ &%+5+5Y&vW@ &%+5+5:&@ &j %+5+5Y{&j@ &%+55+55C.k@( ##+  /0PY @ H&PY?3/?+99//+_^]93+99333910&'3%#"&54632.'7"32>54.q`cMOudO#Y:xP~u^Y4Av0ZB'?flC;.qBqxfpoDR7b:"G&Q@ &$/ %+5+5I8&RC4@ &0!%+5+5I8&Rvf@ & %+5+5I8&R @ &d#%+5+5I8&R@ &j%0%+5+5I8{&Rj@ &m!%+55+55R5u 1@ YP @YYO?]++_^]+10535!53,\'n@D"  ! )($!-!!!"$$PY  PY?+??9+9_^]_]]]?9339107&5663273!"'#&#"%4'326LiFJnAhP ?hZ|?iYm32"32654&*{  RsSIw{&cb8q|R^h^V^YuY.^_VQa}I{{|Wg{&\j@ &%+55+55&$N&%+5+5.-S&D @ 8&9; '%+5+5&$ &J%+5+5.-&D@ 8&;B '%+5+5U&$ %+5._-N&D) "??##%+5q&&S&) %+5+5C&Fvg@ &%+5+5q&&@ &#%+5+5C&F@ &g%+5+5q&& @ &%+5+5C&F@ &%+5+5q&& @ &%%+5+5C&F@ &!%+5+5?&' 5@ &%+5+5E&GK@ ,;++%+5?5"E-@I*( !(' '!"."/'($QY!/?O PY p @ H*PY?+3?+_^]+3?39/_^]3+3?3393333910%2>54&#""&546323!7!733##47#cb8qzV^2{߭{ 9, IvQa}{|}h^/)R3m_V?i&(N@  & %+5+5E'S&H@ !&{"$%+5+5?i&( @  &%+5+5E+&H@ !&$+%+5+5?i&(@  & %+5+5E'&H@ $&!#%+5+5?Ui&(c] %+5Ei'N&H9(( %+5?i&( a@  &%+5+5E'&H@ !&#)%+5+5e&*@ !&&  %+5+5Wa&J@ 4&U93%+5+5e&* @  &#* %+5+5Wa&J@ 3&6=%+5+5e&*@  & " %+5+5Wa&J@ 6&35%+5+5e9&*!& %+5Wa &J'@ 8&94%+5+5?&+@  &  %+5+5"gM&K O@ & %+5+5>4y@<    _Y_Y  ?22/3?399//333+3333+33/333933929339910!!##7373!733# 7!~~ǚ,,,,))s-" !g@:  "#PYQY   ?33/3?99//]q]93+3+993339299910>32#654#"##7373!!wSswv~ n-+YsY@d]X>mQx&, @ & %+5+5&K&&&H@+!!H@H@H@H@H@H@H@ H@ H+++++++++++5Q&,4N@ &%+5+5"S&K& &&H @+!!H @H @H @H @H @H @H @ H @ H+++++++++++5QA&, &@ &%+5+5"&K&&&H@+!!H@H@H@H@H@H@H@ H@ H+++++++++++5U"&,y  %+5U&L< %+5QN&,"@ &%+5+5Y:<@+@P@P` ?2?3]q931033YҴ:Q&,-!W&LM&-7&A%+5+5W D@" [@ PY ??+?32+399339310#'##73"'732673\t8I4;<T\@?9&.iX %+5"9V&Nt %+5"V: J@$       ?22/3?3933/333993339910!#373 HҴeiP|:E/?&/@ & %+5+5! ?&O)O&%+5+5?9&/ִ %+59&Odƴ%+5?&/  %+5?5!&OK@  >%+5?5?&/O %+5!&O *%+5 M@)        _Y?+?399//_^]999333910%!!?3%yiu2ΜUU L@   /  @  ?2?399//889]93339103?37 i~DDXHGz?&1& %+5+5&&Qv@ & %+5+5?9&1qM %+5&9M&Q" %+5?&1 @ & %+5+5&*&Q@ &$ %+5+53&Qxs! %+5?5?'E@$!!()_Y_Y?2+???+3933339910"&'732>7654!"#336$3 To,"_6H^A%Iw9 aF4jWDl0>GzF6ieD=[M[_"WM%I@& &' PYPY?+?3?3?+9933339910"'73267654#"#6733>32H8I4;<~ vSsWT\X>S_ )sY@d힅o&2N@ & %+5+5C2S&R@ &g %+5+5o&2  @ && %+5+5C2&R@ & '%+5+5o&2 +@ &% %+55+55C&RK@ &&%+55+55e!l@= " #_Yx  _Y _Y?+33?3+339/_^]]]]+39393310!# 4$32!!!!!%27&#"}Lswxi:Xv_RT 8 < K EAN!-5o@;"5.((. 675PY 55552$$PY**PY ?33+3?33+39/_^]+9/9933339103267# '!"&5663 >32%#"326%74&#" `-JieLyOYY}z%3>^U?v=]dμidօwH|?&5@ & %+5+5">&Uv@ &%+5+5?9&5 %+59N&UsԴ%+5?&5 B@ & %+5+5"j&UH@ &%+5+5:@-&6vI@ )&),%+5+5&Vv9@ (&(+%+5+5:@&6G@ *&/)%+5+5&V@ )&o.(%+5+5:W@&6z<0,%+5WK&Vz/+%+5:@&6 ;@ )&+1%+5+5&V@ (&*0%+5+5W\&7zW,&Wz\&7 @ &K %+5+5]&WK@ G %+5?5\B@"   _Y _Y  ?3?9/3+3+33393310!!#!7!!7!ZX}}X32&#"!F0+)(3 | :Me4 /^@1--& 10 )PY !PY??+9/333?+?999933393910373!!3>32#"&'##67#"32654&1 Iw{߭{ &)&cb8qzV^9?M_Vh^Qa}I{|S!(X@."%%*)"!"!_Y"" _Y( (_Y ?+3?+99//+993333910#"&5463!2)7!2654&#!7! 4)^]pßKcf\2;v♓kp> =@  _Y _Y _Y?+?+9/+933310!!!2)7! 4&#!P!UDvqHĴqy4)M@*  ' +*RY #PYPY?+?+?99?+933339102#"&'##67!!3>"32654&蝯{߭{ &) %ICcb8qzV^Nh^ퟢ3_VQa}I{|= 6@  _Y _Y?+?9/+9333310!2)'7%3! 4&#!9~L8kq-Ĵ!qy4*G@&( ! ,+ $PYPY?+?+?99?393393102#"&'##67'7%33>"32654&蝯{߭{ &)]%3S ICcb8qzV^Nh^_!Y?M_VQa}I{|+8@ _Y _Y?+3/?3/+993333106$32#"$'732$54&#"~@Ե 0$ϗb1rٵ7pA瓐qP(S@*" ()*_Y _Y ((%_Y?+3/?33/+2+3993339310#"$54$3 7>32&#".#"32$7N~Եu}@7-)DR&%ΗbQ ٔ'V\7p瓐C #S@*"  $%RY PY PY?+3/?33/+2+3993339310%267!"&5463232&#".#"d.y͑ﮣbFA20?Il[~Vznx1XO ]aaiڏ"P9@  _Y_Y?+?9/+3933310 #!#"&5463!2$54&+g8e}^](f\2#G7 =@    _Y _Y _Y?+?+9/+39932310!"&54$)!7!! 3!*'V?XĴqyE(P@*   &)* RY"PYPY?+?+?+?993993223910"&5463237!7!#47#'2>54&#"{߭{ 3!IBcb8q|R^}h^3m_VQa}{{|-W2M"J@'$# PY PYPY?+?+33?+99393310!7!.54632#"32>2"nUF޺Zzh`;WNlG愔Hc =@ _Y _Y _Y?+?+9/+33992310#7!!7!!7!!h!2`!-՜Ĝz!I@%  !!#"!_Y!!_Y_Y?+3/?+9/+993333910%27!654&#"'6$3 # 47.=) 'ϸ[wE +%~97,z323;<@OF J^CeP+^@1%(( &,-'&_Y'' _Y _Y !_Y?+?33/+2+9/+393933310 4$3 7>32&#".#"32$?!7!~@7-)DQ$%•ߚ׍U3[ Ud8׊V\6ssRJxn1WD@#    _Y?+?399393333910"&54>733'2654'Wfy-Nnl 3GF29!CP'Wug3|v7WK^Upr`1'+",B@#!)-.( PY$PY?+???+?99333310"&547654&#"#33>3232673x ;V\w KIy9 Xhz(*0+P6US~n[ka=K?*RWy3ʹ!O0M ,@  `Y??9/3+39933103#7333#Ra`?M@(      _Y?2+??39339933399102&#"73 ##>mA=-)CPJ-(jN\2j"VM@(  RY ?3?3+?939933923910!#>32&#"73 HyF7/ ?JriP|ń`aE/ ,@  PY??9/3+33393103#7333#Tf[@0  QYQY   ?3?9/99++9999339333310#&'#''7'37Qܴ]X #:CAnh !ԳCvE͔:M(R@)& %%$$ !)!!*& %  _Y_Y?+?+?33?993993333339910"'#"&547332673323#7I\^WaySY?:^JGng]@g]GN8_\CfbNXX<@   _Y ?2?3+?33339339910!#"'732673673"B7-)CQ"(КV\A_"WMiooS)<@' * + #_Y_Y?+?3?+99339933102>7#73# 4$"32$54&0.h`X#s˵zY/lHj?2 ;ٚbۭZCaM%A@   &' PY!PY?+?+?399399333310"&5463267#73#"32> X#TZzg}^;ͺGǶIj~:zZ愔EoXF@#   !  _Y _Y?2+3?3+33??339933310 4$32%3#'&#"327z+@pY^Yˈh;MFm4(0b.CW7MF@$    PY PY?2+3?3+33??9333310"&54632%3##&#"327^+ٯty>CZz>.ͺGLD?:愔 S?@!   _Y_Y  ??99//++393333102)##"&5463! 4&#!Xj^]T~еf\2;7w~W1.U@-,,0%/ PY RY (PY?+??3+?+99333993910"&'##>32&#"3>32"32654&*{ ]?yF7/ ?I-Kr{&cb8qzV^h^en`a_RQa}I{|?8Q@*  _Y_Y??99//++399339993310!#3!2 2654&#!ySwmeQ˧pxS4.J@$% % /0 """_Y" `Y ?+3/?+3/9999333333104&#"'6$3232>7!"$54>7>{8Y0Uuk̯5_5]ΟOG]bw!äT{Y?,$(qhoB}/ýW`E2&)Cb,O&J@$$  ('$PYPY?+3/?+3/999933333310"'6!23267!"&54>7>54&CozN^Hn6zNSx8lEQ0QrW237E3JT8Y^3 8?3?BUW(?@ &)* RY# H?+]2?+9333104632327#"&547#"&7"32654&klq _84EAgu ->JU6I.*8K0aukf(?] vi(0XL7*,J6*/W,"I@&  #$QY PY RY?2+?+?3+339333310"'7326?#"&547#73733#327A2/ ?? Ua~}ix/} Z*:,)W\b=fT7K{<#X\3@    _Y ??+39/3993310##"&5463!Zʸy2]"D@#  #$ RY QY!PY?+3?3+3?3+39933310"&547#737>32&#"3#327Ua~}~}F7/ ?H } Z*:cfT7KadC{<#XW\.@  _Y_Y?+3?+393107!!327#"&547Q:4G@lq  圜(Woc&<Z/8@   _Y?+?3?399339933310"$54733 367#73MN(X#$̹J3YsW8dm/eV:&@@"# #'( & PY  ?3?9?+?33393331032673>7#73#467##"&547~~ vPdX##¨-6Ss:{X>^f}[e$L )sY@dy*&H@&  # #'(   _Y _Y?+?3+333333933910"$&5%+7!32654&'7!#"'е%2M+Ƙ􇁏-#5sX MߌS Zӹ!6@ "#_Y_Y?+??+39933910".547332654#"7632 ft ~Иa54@CdjljLU:A=/^ e(6@    _Y?2/+??99399333102.#"#3 >ie"B+&:$qs2L}`'!,H9^Z@W'A@"    RY PY?+??3/_^]+339933310"'7326?37>32&#" ?>$.VKٷp <Cs}_b8E`O_Wy-.ACs{x]>TP@,     _Y `Y_Y?+3?9/3+3+33333910!!7!!!!!7!rPuf.8:P@,     PY PYPY?+3?9/3+3+33333910!!7!!!!!7!JC8-j|XiF[VN@) `Y _Y _Y?+3?3/+9/3+33339310!7!#"$'732>54&+7  [/,i>P圡ӎd;QcVR@+ _Y`Y  _Y ?+3/?9/+3+333393310# 3 #"54$77!!N9z:_ jS5ꡜU$;U@,PYPY PY?+3/?+39/+333393310!#"3267!".5477! 9F)vn0re~g "svhxu jx*%mV:,\@0,.'-PYPY',,*PY?+3/?9/99+3+33333933310!".54>7>54.#7!7!3 7Rqi2Yu@Md/54&#"'>323!!!7>7!H[P}jm%6㏍P,\6bJXbyww%Ĝ9kovD\mCQ@*  _Y_Y`Y?2/+?+39/+333933310".'732>54&+#7!!32e qqcYJ;0Yo~ukryʜϹ:S@+  PY PY PY ?+3?+3/9/+333933310%2654&+#7!!32#"&57lyL B1,ضpqsd]ת `r)G@$'$! !*+&"#"QY '# PY ?3/+?39+3?93333310#"&'732654&'.5467#7373 GYzB yxANj7CRk/$39%JkLYNka1=8CaE![NWW9NC@#  PY PY??9/9+?+33399310#33>324#",% ?pW%kZx@ ??931033Ĵ4 @ ?2?39933103333ǥ44NR@*    _Y _Y ??99//3+33+39333333310!3!!!!#!5!!rrtt:̙`4M%? &''= &+5? &'']&+5Ei&G'G]s(&+5?&/-s?Wi&/Ms!W&OM? &1-?W&1M"Wi&QMs&$ B&>%+5+5.-&D@ 9&:@ '%+5+5QN&, @ & %+5+5"&Y&&H@,!!H@H@H@H@H@H@H@ H@ He@ %&+5+5++++++++++o&2 @ &$ %+5+5C2&R@ &%%+5+5&8 q@ &z%+5+5VJ&X @ &$ %+5+5+&8 3@&r!%+555+555VJk&X'jL@&?&&& &+55/]]]5+&8 4@#&t %+555+555VZ&X'jv!@&&o&&&&& &+55/]qq5+&8 5@&&x#%+555+555Vd&X'jB/@!(o(((((/(?(((( &+55/]]]]qq5+&8 6@#&o"%+555+555VJ&X'jC0!@&&o&&&&& &+55/]qq5A#NA&$ 3@ &3%+555+555.-k&D'jQ0@B?BBB<&AC<:%<:%+55+5+55/]]]5+&$ 7&Z%+55+55.-k&D'<,@>?>>>8&d=?8:%8:%+5+5+5/]]]5&P&%+5+5 S&t@ F&FH,%+5+5x0'{@B&"# $$'' ')(!"!`Y""" "&@&%_Y&&_Y_Y?+?3/+9/+_^]]2+39333399399103## 4$32.#"32$?!7!7!7!ÿ6%•ߚ׍U][ Ubxn8ר6ssRJWaM)7}@C*1#''# "## 9 8 QY' @-PY"4PYPY /]+?+?9/99+29+3393333393310# '73267!7!##"&54>323>73332>54&#"o86#s' 6MkKzw$BQpfg]pvR]%]f]s^~]n^% Yi]ot}e&* @ !&"( %+5+5Wa&J@ 4&p5;%+5+5?&. B@ & %+5+5"V2&N_@ &a %+5+5oU&2CU2M&RoU&2';_/&+5CV2S&R'&0&+5V&y @  &!'%+5+5W&T@ &$ %+5+5W&&, %+5+5? &'=? &']EW&G]se&*Z%&. # %+5+5Wa&Jvt@ 8&36%+5+5?)D@$_Y `Y ??+??39/+9333331032673#"&547!#3!3~(ϸ 5tt '3˶./sT :W C@# _Y aY??9/9+?+33399310#36324&#"6e"ݺOtv`zW*ȷs]p}fgLc?&1@ &1 %+5+5"&QC@ !& %+5+5&$' -w@H((`(p(@(`((0(((((((((P((P(`(0(@( (0(( ((#¶&)%%+55+5?55/]]]]]]]]]qqqq5.&D'p@CRRRRpRRPR`R0R@RRRRRRRRRPRR R0RRR;&k@ PS '%>8 '%+55+5+55/]]]]]]]qqqqqq5&&%+5+5 &v@ E&EH,%+5+5&K(&(+ %+5+5,&v@ (&(+ %+5+5&$S@ &%+55+55.-&D @ C&<9B '%+55+55&$`D&%+5+5.-&D@ D&D; '%+5+5?i&(T@ &i %+55+55E'&H@ ,&"+%+55+55?i&(rD@ &%+5+5E'&H@ -&h-$%+5+5;&,?S@ &Q%+55+55&"@ &R%+55+55Q&,D@ &%+5+5Y&@ &%+5+5o&2S@ '&(& %+55+55C2&R@ (&'%+55+55o&2D@ (&w( %+5+5C2&R@ )&Y) %+5+5?&5S@ "&! %+55+55"&U[@ &%+55+55?&5XE@ #&t# %+5+5"*&U@ &}%+5+5&8S@ !& %+55+55VJ&X@ '&& %+55+55&8D@ "&g"%+5+5VJ&X@ (&U( %+5+5:9@&6w*/%+59K&V).%+59\&7Ŵ %+5;9,&WT %+5UGQ@+ !  aY _YaY?+?+3/9/+3339333107$54'7$54&#"'>32F -2!vqpQr[Uh[n9~bsVjYyápMVYN#Q@+!! %$ PY PYRY?+?+3/9/+3339333107,54'7>54&#"'>32iO,'Fێ~DWPY3:اTeG\VL`/'c?VdzKPb\f2iLd?&+ @  & %+5+5"N=&K,j@ &"%+5+5@W7@    _Y  ???9?+993339910 654&#"#33>32El|_ǎ9 Z뇯WEF6mul`D=[M[EW$3?q@<7711*==!!@A 4PY :PY" -PY%PY?+?+9/99+??3+939333333310"&54632373632#"&''6?#'2>54&#"2654&#"{߭{ R?7r|iP_e)JBcb8q|R^v9L4,FG;}h^}liYKeboeYQa}{{|qA=-4167AC'3e@51'$+ $ 45 . .`Y (`Y `Y''`Y?+3/+?+9/+9993339310!"&546?&54$332>54&'2654&#"4ѻuƱuRs~ҕ٘t?jZKPPTQfhmsqs`$1R@+) ""/  23 %%QY +PY?+?3339/+999333993102>54'7!"&54>?&5%"!2>54&]PjZƤgr]jR@xBl]qYjLXzCqhŋ+pĪxÄIqj_hhjaon;@  _Y _Y?+3?+3339933210!7!!2'654&#!7^s:(>A國ohhg-K51,:;@  PYPY?+3?+3339933210#7!7!!2'>54#,8s&rh32632#"&'%2654&#"~ vSss:7r|iP_9L4,FG;˝mX>S_ )sY@d}liYKe~A=-4167A`,&_@2 $$  (' PY PY QY ?3+3?+9/9+?3933333310'67#73733#632#"'%2654&#"r}ix/\@2r|&P_9E4,>C9`oO}lKe~A=-4.!:>W: @  PY?2+?3310"'732673d8I4;;WT\@8%4Ca@52 !!++A+DE!" =PY5PY .PY&PY?+?+??+?+9?933333310"&546323733>32#"'##7#'2>54&#""32654&{߭{ RS Iw{߭C,IBcb8q|R^cb8qzV^}h^Y?M_Vű_VQa}{{|MQa}I{|8WO$2AY@20)8 ? 8 CB! ;PY3PY ,PY%PY?+?+??+?+?993333102#"'##67##"&546323733>"32654&2>54&#"{ެCVX Iw{߭C,K?Z~mzV^cb8q|R^OƢFl _V}űbSфI{|Qa}{{| T@/   _Y   ???39/993+33393310#!#7#3333#KqaUP3fY05C!k_Ga292'm@8" "()"$$_Y@!_Y ?3/33+33?33/3+3339333333310&'32$7#"'#&4$3273&#"Dh&5cb~ʉϐu殃r?GXuU7H7DBYV:Ln(yW&]@3 !(' #PY PY?+3/??3/+9?3933333310&'3267!"'#&546323&#"] M-:d.yfM6lSJY%.~VU4*9nx1LlXV:/ A@"     _Y  _Y ??+9/3+3933331033!!!!#Nttq`y~*WnJ@'     _Y   ??39+3333933333103###!7!737#BUOf}nTŕ12iVK5W@, '..""76.%%+QY((% RY QY?33/+?+3/?3/+999933333310#"'327#".'732654.'.5463 .#"7@7J@ `Y  `Y??+3/9/3+33993310!32>54&#"'!2Xh0Lzk.Jv׌yr[ XN4@ QY PY ??+3/9/+9310!2>54&#"'!2ToXiXAiQ=RaadC%%h@7  "&'`Y _Y_Y%_Y?+?+99//+93+393333333310#73!2)!!!2654&#!7! 4)]$pßKcU;vڅkp@W@-   ! _Y_Y?3?+9/33+339333333331033!33#!"$547# 7!]tus ttuv4t^M)XX~SsZW8N5r^@3   _Y_Y  @_Y?3+3?39/3+3+3393333310!#7#!733#!!!!!3#h"aaX:}E-F<!xW%+0@K& )%(/ ,0. (21*%*PY/%(   .%%% "PY PY ?+??+99//993+3?393333333333103267#"'#&54$323%&#"#4'3]9P^1OoUBueP؆ /6%!! }+ZY?s#Ho?+hid:]? 8 e?$O@)  _Y  _Y _Y?+?3/+9/3+333393310!!7!3##"&'7326?!Vv.-pdi*)׺!u|WP@*  SY PY PY?2+?9/3+3?+333933310"'73267#7333#73d8I4;;sppZ[ppx!!WT\O/ɬqW*O@)( " +,"$$_Y!_Y _Y ?+3?3+3?3+3?93333103267#"5467#"$5$327327&#".,A>M+̹’`ܡ߭1) 8[M8 ( gdEWeM%4P@*2+ !! 56 .PY&PYRY?+3?+?+?99933333310327#"&5467##"&546323>732>54&#"j.,&2 3K^o &Iw{߭{  *[cb8q|R^1) c^<_V}h^6 Nl(Qa}{{| H@% _Y _Y ?3?+9/3+33933333310!!##73!2 2654&#!Gqrd pUeII˧pxNN@'  RY PY  ??9/93+3?+3399333333310&#"3###73733>32,.\*__{zE #BT'8 ^d݅l@@#  `Y  ??39/9933+33339103###73'3!73! qskh;?H^*Wg:!K@' # " PY PY ?3+?39/33+333333393103##"'7326?#733!3>!oo\H<- WNvhE@Z ':Mr/GUUJ*FEN)7X@/0 * '  98*QYPY3PY%QY?+?+?+3/9/9+9333331023>323267#"&547654#"767>54&#"]US~j^wz-߼J Q!BwK+aM`gDML@~eb[WUW@]z0(Ip%9W>K^RLE[M%F@$   # '&  PYPY?+?+??99993333910"&54632373#47#'2>54&#"{߭{ !!IBcb8q|R^}h^3m_VQa}{{| 1N&D@$  $ ('PY   PY?+??99?+993333910"&'##6733>32"32654&*{  Iw{&cb8qzV^h^]|a q%_VQa}I{|4!0O@*.. ' 21RY *PY"PY?+?+?99?+99333939102#"&'##67>32&#"3>"32654&蝯{߭{ &)yF7/ ?IICcb8qzV^Nh^愑]dQ_VQa}I{|N8@ PY PY?+3/?3/+99333310"'!2#"&'73265,TyHΑﮩ l[V1Cai& N%/W@0-))" "10+PY-PY&PY?+?3/+9/9+39333910"''67&54>32.#">32'2654#"ugt>_7Nʊn]i\V pbu`wpdV|"\Mg[o`P\`jv2*c[pc^Q^LX"'EW!0O@+ '.1 2RY  *PY"PY?+?+99??+33933910"&54632373327#"&547#'2>54&#"{߭{ R_84EAgu 7M@cb8q|R^}h^] vi(0bSQa}{{|Eo!0Q@+. '  12 RY*PY"PY?+?+?+?9939339310"&546323?>32&#"#47#'2>54&#"{߭{  }F7/ ?H!IBcb8q|R^}h^\e^3m_VQa}{{|@$NC@" PY  PY PY?+?+99//+9933333107!2!"&'7326?4&#"Mb]!.Б&wo.?SMz.;A#N K@&  "!PY PY PY ?+3/?+9/+993333910654&#"'>32#"&5473267h a,Iߎy%C7:`S?xμidH|BN$,k@9 **++"""-.RY+**PY$  'PY PY ?+?+9///333+33+3933393310&#"'>327327#"&'##"&547!267qa,7|r-37L&ghjm `S?^f7H?#8xܛҸNn-"MgN&V@- $$ (' PY PYPY?2/+?+3/9/+933933310"&'732654𑯎&#"'>32(q{dR,&ĭNUh|z,i`]]b`EFuNvJ  `N3p@< 1**1. $$54- PY!&RY*! ! !PYPY?2/+?+3/99//99++93339333310"&'732654𑯎&#"'>327327#"&'#(q{dR,&ĭz-37L&]b^q$Vh|z,i`]]b`EFeXH?#8hjBS `EN(T@, %%*) PY   ""PY"PY?+?+9/_^]+99333991032654&+732654&#"2#"&54${ozg^RLvYRgb3ߎkaNXi^DNMOun0CRV::@ QY PY ??+?3+3339933310733##"'7326?#7K^B9)2>DIpp9 CbxWn*9h@7+2 '((''!!;:$RY 5PY.PYPY?+?+9/?+99?+333993339310 '7326?##"&54>3253?32&#"32654&#"6#ǎ "9awPKu ;F70?H0iflapZxR8W*TQ,ˤ4al^\ey}JWaMJB NG@$PY PY PY?+?3/+9/+993333910!#"&54>32&#"32?!DRGׂ9r[f+Tfċ;nWj:E@$   PY ?3?+99393333910%33#"&5472654'Q㹮&zbvrn)2%=&$ ]QAv]wJAHjUA>#,eA 4S@. 0# *560#,)),,'RY,PY RY ?3/+?+?+3/9393310%2654&'2.#"#"&54?.#"'632?>5'0)I% Nz&t<$#;"6tbvrTL!'Ifdab//C>y=*6Z)6\B#)dXW@546˄g+sq[tf!64c_ubqi_VWJ::@    PY ??+?399933931032673#67##"&547~~ v۴U Ss:{X>^8ysY@d""C@"   $#RY" PY?+?39?+99333993910>32#654#"#>32&#"Ss~~ vyF7/ ?IsY@dsX>ń]d_"W,T@+%-."'PY"PY RY ??+?+9?+39933399399104#"#>32&#"3>32#"'732676\~ vyF7/ ?ISsv8I4;;ń]d_sY@dT\X ;@   SY  PY ??9/3+3?+39332210333###73(qZ[ss^^q""i/<<:@  RY?+?993107327#"&5473--". 01hy .' fl+:(: 9@   PYPY?+3?+333933210%3!73#7!#tΜRό#!O P@(  QY QY ??99//+3+333393333333103.546;33# ;7#"!u[k} Ru8(*;MYnXs40*GW+@   RY ?+?33333910 327#"&547_84EAgu 72] vi(0>Wa@2    PY PYPY???9/3++3?+9/399333332991033!# 732>54&+7!! N"E!oiRȷnҟ.wizSV:.P@)'-   -/0. "*PYPY??+?+?33999333993331032673#67##"&'#"&54733267 |LVq!v IfySh|LVr v:_.!KO\__ZrZwqf@d_.!KO_VW:,N@( &(**''(( -.* ' PY #PY?+?+?3399?9339933310%#"&'#"&54733267332673#7!IfySh|LVr v|LVq!v۴R,rZwqf@d_.!KO__.!KO\"WKM7_@2(0606   8-"9%*PY%3PYPY  ?3?99?+?+?+3393339333910!654&#"#6733>32>32#"'73267654&#"|LVq!vIfyPju8I4;;LVr vzw7KOS_ )rZwqi3tT\$KOWM%I@%" "' &PY PY ??+?9?+3339933399310!654#"#"'732676733>32~~ u8I4;;SsX>T\_ )sY@ds"W-M(G@%$$)' *!PY!RY?+??9?+33933399310327#"&547654#"#6733>32e\84EAgu ~ vSs] vi(0X>S_ )sY@d:l:,@   ?33?3399339910 73#&'#IҘ* :P>*\%@:C2MBWM%a@5 &'QY  PYPY "PY PY?+?+?+?+9/99+39333310!!!7#"&546327!!'4&#"326=FXk_?oZzWqFZͺG}8愔+=N+D@"#((-,#%%PY % PY?+?3+39/9993391032654.#"326?2#"&'#"&54$oϐ[Vo%rՏ~dwM`[Gxhٳrw`}zîXBW1"O@( $#PY PY ??3+3??3+3993399333310.546734'>'QKM}OlPMJbNWޯB wѫ iT1rF:0@  RY ??9?+33333910'32>73#7##"'+,.HyYn#BT.1 eo4Šr݅l0@  RY ??9?+33333910'32>73#7##"'+,.HyY#BT.1 eo0r݅lW:B@!   RY RY??+?+933333339910'32>73327#"&547##"'+,.HyYn_84EAgu CC|T.1 eo4J] vi(0JiWN0@  RY  ??9?+33333910&#"#?33>32,.HyY+#BT'8 er݅lWN <@  ! "!RY RY?+?9?+3339933310&#"327#"&547?33>32,.HyY\84EAdw #BT'8 eoP] sl(0r݅lN @  RY??+393103>32&#"(F, ,2z z sWBN@ RY ??+99310654&#"7632Ua<& *8W_6`\ @N": K@&    PYPY ?3?+9/+39333933103#!2##!2654#ִâ cHy:>uj": A@  PY   PY ?+?39/+333933931033#!32654#!SFnw2ҴW}G8h:OviWK7X@.0$*)) $980''-QY**' RYQY?33/+?+?3/+99333933310#"'327#"&547732654.'.5463 .#"hf;* 72s{ C!u,WDb,zg|*OH=E#R mf&/`8XPa]*=1,*PkGOFOH*:--(RpW) @ RY RY?+?+3310"'73267>32&#"vP@92K\%MF <2.$Wk~uPWPE@#   QYPY RY?+?+?3+33339933107>32&#"3##"'726?#7%MF <2.J2-.?Cܻ>| AcxWN&@  RYRY?+?+9310"547654#"7632327J uB6 0Wz-98B;W3OF"=KK/78LW'S@-&  ) ( PY & RY#PY?3+?+9/9+333999310&'#"&54632>32&#""3267&17-irME"MF <2IdcP8P;+9T1ra@a[|k|%n{dH8.1cM/9@    QY @ PY?+?2+33993331023##7#73654#"76_Ua}ix/Ȏ Z*:cfT7K<#XX,7@  QY PY?+?3+3339933310"&547#73733#327Ua}ix/ Z*:cXfT7K#<#X [:%b@2! "$'&"PY PY ??+?39/933+3399333399333910!33##467##"&5467#73267![[[ll1Ss lk[؁"://_ )sYGv>é82:3E@$1#,  ,1'4'5)  PY ,&PY?+?399+339333310"&54>54+73232>54'&546;#"';D;'IRrJe9;:;zh_ ryR42"ϯIxbPD9:_JCyFDLslgp:@@      ?222?3?3339333333310373#'#&5#&e:\*9-;:F;͈lRu7@    PY?+?3993339933102&#"#.'#>I1$/ULѲi th y+V. ,=|n:,@  ??393393310!33CUU{KW:G@%PYPYRY?+?+3?+333339310327#"&54?!7!7!!:%(5( E0^k ,81*% ld(>s&+N:X@0 ! PYPY PY  ??3+33?9/++333939310%>32+'7!7!7!%"3254&gafyB3N8C4uW+o\\V=u&ڷQfp!&W:N@)  PY PY PY?+3?3/+9/3+33339310!#"&'732>54&+7!8"Ep_R:՟񕘖ugzV: *g@:# ( ,(+%PYPY# !QY  PY?+3?+99//93++333393910!'#".54632654&+7!27&#"8"Ei21Rw\ּ/R[nSaz:ة@ PY  PY??+3/9/3+93331033 654&#"'!2j*=(F qfi rIwJE;jZ2˳į 1=@  PY PY ??3/+9/+33993310!.54>32.#"327zLL̑`Tx]iv;4j̮yag]w};@  PY PY?+3?3/+?933310#"&'73265#"OMΓ~\;4ojɰz_Å-{9VN:@!  PYPY?2/+?+3/339933102.#"3267#"&547s e\)Ookj$AݣL7NgcjYIym1Q_o&2v^ D&W@.&  '(&&QY& && "PY PY ?3+3?+9/_^]+99333310#"'>3232654&+7 54&#"鏃fzt,Ѱxt|\\}Hl}])jdlP^AL)N)N@*%% *+ PY   ""PY"PY?+?+9/_^]+99333104&#";#"32>"&5467&54632yrm~`NZ\hbjb5kʜȼOjYCSpfHTPy7_B2 (`@1('!!')*RY (PY PY $PY?+?33/+9/++39933933910!#"&54>3232&#"#&#"32?!DRGׂo9C00?J9r[f+Tfb]aċ;"?: 7@  QY/   ?3?39/]+99333310!3#!#YYҴ__:6:WJ@&   SY PY PY?+?9/3+3?+3333333310"&546;33#%2>7#"73wéE@%5%+^f+!!W~k$!+ToPB(4;W: <@        ???393299333910 73## 8 Hܶ: |zh":@RY?+?99310)3!Dұ :[EWn.S@+, %  /0RY (PY PY?+?+99?+?3993339310"&546323?32&#"#7#'2>54&#"{߭{  32.#"327!!zLL̑`Tx]iv;44={m̮yag]w}{Eq),j@:  +'-,.+PY,,PY  #PYPY?+?+99??+3?+33393333910"&54632373!!!47#'2>54&#"{߭{ RNIBcb8q|R^}h^nڋ3m_VQa}{{|9 EWW3B@N#'*-- 90. .@.C)D.('PY((PY**PY 0 54&+7!#47#'2>54&#"{߭{ RN"E(wnp_R!IBcb8q|R^}h^n՟$YSugz23m_VQa}{{|ENq'69B@K9%' =@@7## -"4"%DC&9%9PY:PY%"0PY(PY=8''PY ?3+33?+?+99??9/++393393339310%>32+'7!47##"&54632373!2>54&#""3254&՗afyB3NnIv{߭{ RNpcb8q|R^4uW+o\\V=u3m_V}h^nQa}{{|9 Qfp!&]4,$8`@2/2 '! 4!:9'QY3QY 8PY?+?3+3?3/+9993333399310!"&547#7373!632.#"#7 54.'.5467#3Sx~~}ix/DFhXgt#Cnr?&H|zk6&} Z_Y+E~OF`O%1&*%PnJ(8--+I_A5^{AQgW&/_@3 ''#)#01!RY(QY@/- -PY RY?+?3+3?3+3?+3933333310"'732>7#"&547#737337>32&#"#327P@924I2\LUa~}ix/%MF <2.$} Z,:W1`fT7K%u`{7(XM,8D@I-&&%/B<<6  6%FEB?3?PY/33"")PY&&"  QYPY9PY?+?+?3+3?3/+9/99+9993333939310"&'#"&547#73733#327&54632.#">32'2654&#"e0^Zhl~}ix/} YOl$ﮩ l[~V}mp?qv73Ab80?)fT7K{<#XJUqXaiڏ.b>#qcaJ).Mo!%+W7t@= 2!'+(('2859/ PY/#PY+QY'PY?+?3?3+39?+?+339333339993910"'73267654#"####737>32&#"!3>328I4;;~ vӹJ2HBCwSsWT\X>Iz| H\a )sY@d힅!+P@* %++%-, ((QY*(QY???3/+?3+399933333103332654.'.5463 &#"# '! >(Qvul:ּI)&ir;U6rsAQHfc[+=1+*LhDQM)5'(QpM~! :@     PY PY?+3??+33399331033!!! Ortnڋ$7~ |@A          ?3?3?3339/3332223933333333333322310# #333# #3331%6x{)~%6x{)~ %435%43J@%    RY RY?+?399//3+33333933310#!#!#!#!0>>_r>>^r?4?wVPL%@@" % &##'%"RYPY?+?+3?9?393310%##"&547654&#"'63 32673#E{5GKYA W7Y_|۵PUu|@Lv+LE&)=UH6TCwWL5P@+ )3&3 6--7.00+RY0%RY!PY?+?+3?9?+339333310%##"&547654&#"'>3232673327#"&546E{5GKYA $q>7%S@| 32#654#"#>32&#"8qOeeV{U yWQyhV1$+1 bP@ga(L4A(vqU][hjBF}81@  /_?]3?3?339931073"'732673z}"6$)( z]yy8 `:BFkb-.'@    ??9?3333291032673#7##"'2$GrKznt)W="O xWR +@  ??3?393332991032673327#"&54?##"'1$GrKzA) 1*AU.)U='N x#A p NO#VP +3 @@       ?3?39/3333993333931033#!32654+LPŏ{;[V05`IxfXEhB@!     ?333?3?3393333333310#'#3?373.>y# x}v2T 2_A2@    ?22?393339933107"'72673>3N2(4Bf=|M&VQYb _`qZK1/i5 #KV H H ~~H }}H ||H {{H zzH yyH @xxH wwH vvH uuH ttH @ssH rrH qqH ppH ooH nnH mmH llH kkH @jjH iiH hhH ggH ffH eeH ddH ccH bbH @aaH ``H __H ^^H ]]H \\H [[H ZZH YYH XXH WWH VVH UUH @TTH SSH RRH QQH PPH OOH NNH MMH LLH KKH JJH IIH HHH GGH FFH EEH DDH CCH BBH AAH @@H ??H >>H ==H <>H ==H <54#"'>32E+TnA1s"{Wn0b ^[crn~$2@  ??3/39/3399333107.54>32&#"327G1cq3efoz |TjANH+ F}SBqj YSY^ ff!eF@ /32910%# #3FeF@ /32910%#3 3fHKM @M   $   0 @ ` p n @ P  0 P `  0 @ ` p > @ p  w|H ekH @#VYH  P `   0 `    [/3+3_^]]qq+++r^]qr^]_]q339933310#'##73\t" @p    0 @ n P `   /   8 o  @ P     _  0 [/2+3_^]]]qqqrrr^]]]]qr^]q39933310#73373 ̵apJ?9910#3 qAqLS@e0`?o@x{H j` @Pp9P`@H@pY/+_^]]]+qqrrr^]]]qqqrrr^]]+]q3910!7!&I?991053I!r?9910'53ς_j/9910#3q@qjLk/3910!7!%jn/9910'53ςj(jy/991053(jD:@  ?2/3993310#'73 ;ӏ ;:c:?29310#' <:\ @    /329939104H7>1+$EUyj3E.&.UZIcsUA\ @   /329933103"&5467+$EUyj3E&.UZIcsUAo$@ /93999310%!53533{q{lo @ /939310##5#5!{q{glo ,@    /9933933310##5#53533{q{{q{ }}l||[/33910!5![p '@  [Y/++3339310"&'33273tgS@u3UNV ,@9I@ msHk@ ejH@\bH4D @MSVHDdt0$p$DTd7$@,1H`@H@HSY?+_^]++]q_r+rrr^]]]]]qqqqqq+rrr+r+_^]+]]]]q931073V"" s N@2  Y0 `     Y @@/qr+_^]]q+339310#"&546324&#"326dddclL:;LL;:Ldded:LO77RPGU1@   Y /]+/_^]93310"&54673327XZr[]d(&6<CU^JS#0}?"/i52:@otFffv$TitbFV4&@FPSHVfD&6dtP4D 947H@ '1HH@ H /2222]++q_q++r^]]]]]]_]]]]qqqqq+qqqqqrrrrrrrrrrr^]]]]]]]qq339310".#"#>3232737*LE@d*Z/yS,LE>e(\#@Z%-%wt%-%wme:@ `@    7 &   } q|H @lpH    f v  @`cH       SVH @@,MRH     b r D T 0   " > @5=H   v d R  @'+H   @:"H     p `  / ? [ /?/]3+3_^]]_]]]]q+qq+_rrrrrr+^]]]]]]]]]++qqq_qrr+rrrrr++^]]]3393331073373bec@     /399310327#"&=7R*38P,yZjrRDB$4 ?- .@    /3293393910''7'77XXXXXXXXR4@  ?3?39939339331033#"&5472654'7~v9r [SBPMK!8XofD`mRCUe5-7FP@Y@ ??3233103z$%=@& ' Y Y?3/+?3/+9933393310#"&'732654.'.54632&#"~d[Vae9`xd oS\@t[S1q}XS(9>F@,!!&gFfoi83*7%9N1. pY??+99310!#!5!pp*@  Y??9/+993310!#!5!3pHp*@  Y??9/+993310!#!5!3pH^p*@  Y??9/+993310!#!5!3pHVp"@ Y?+?99310)5!3p0HbIp@ /399310)3!I_p bIp @  /9/3993310!#3!Ittswp}WyS@  /323910!7!!7!<p?pvv#KS@H@H@~~H@}}H||H{{HzzHxxH@wwHvvHuuH@ttHssHrrHqqHppHooHnnH@mmH@llHkkHjjHiiH@hhHggHffHeeHddHccHbbH@aaH``H__H@^^H@]]H@\\H[[HZZHYYHXXHWWH@VVHUUHTTHSSHRRHQQH@PPHOOHNNHMMHLLHKKHJJHIIHHHHGGHFFHEEHDDHAAH??H@>>H==H<_ -exnf p 85j9f LADS 2x 8b  /3210#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99 ?321053353M ?3210#733735̵giY ?10#3qAqL9?3210#3#3VqAqqAqLL ?3210'733'73 ˆˆ$d /222/10"&=332673#7vhWHCui**""m?E@D$ /32102#.#"#>1riVICvh'q=GACwxs ?210##&54?*X1z" !"_dMWDQs[i /10'53NςiOj /1053j?_/9910#5#5353oo_sqr^_/991033##ooKrqsy /210#!5!y92PKW  /3210.5463":CT}c2D*#WYEevUG6&+LW/2310!53533{q{WlMW/3310##5#5!{q{glKW @   /9/33310##5#53533{q{{q{}}l||Fc 210!7!+o֍W ?3107#"'73277JC4>y4䙏W  ?3107327#"&5464g?5 =?w|6`yh;u W 221073!73 $$$$W8W  2210#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99B9PWzUpkW4o/]10#3DW^Wy/3]210#5!#!yWPc}@ /33292310#"&533265332653#"MD^\a..7A\A7..a\^r&5lLCJEEJDKlX)zfXz  2210#'##73\tli7  2210"&'33273:tgS@u3iUNsw 22102#.#"#>riVICvh'q=GACwXd 222210".#"#>323273*LE@d*Z/yS,LE>e(\#@ZX%-%wt%-%wme:; 210!7!$i`/3107!iWX@ H/+10!7!!7!Ao?ovvNAl/310!7!QCb/310!7!IX}//10 'ccbaQ//103QC# Np  /32104&'7726+#BVzg2E&-UZHatUEWy/3210!3!53yWPDW/3210!!5#x_Wx纺^@   /329/33310&#"#4&#"#>32>32J7<\<7Jb ZNp9 N6N_ JJEEJJNZ[3(ZN%r% @   /32910''7'77WVWVUSUScl /2299107654'&54>7o1aa1> llMW98&-Q1L,4;;# DMv W0/2]2107!%7!v} ffff /10'73qˆ /1073NpKc @  /33/9/310#773!73uu!!|!! 쬬W ?310327#"&54?3?$!.'58 p ;3!-nky"/3210#5!#!yPW~ H/+q107!7!jjjj#W/3210#3#3WDCW^^5W /310!#5!Yuf#@   /39929910&#"#>3273273#"''Q(c[ 0Q?>O=a=*d\dU;Q=azfi=0l6lzx1m7b )@   //99//99399210".#"#>32326737373+KC?7<h&|W,LC=6=j ?Y""R""7 '!53|p!'!72_Y4լo0@ )-$  /22992/329910".#"#>323273".#"#>3232673t+KC?7<h&~V,KC=a$jA[ +KC?7<h&~V,KD=6=jA[ '!53|p!'!i[\5 '!53|p!'!72[\5W  /3/399105#'735vvOW/93105#7#;v|W %-5=EKQYaiqyNY40Y8<8@ Y<ITXTYX lpl@ Y$p (txtY,x@@ YD \Y`dYhP|@&Y4557449 885667775558849*557sNsmmI;}T! /91057'5T窪xRr``rEx  /2210"&5463"3UddU*77*xhVWfU7118 @ @ ?32?102#.#"#>73viWHIri(/""|?EG={OMz  /329910''7'77zWVWVUSUSV0/]910%5r``rRV0/]91057'5窪Rr``r6V @  0/]93/291057'5#'#3窪r``rRRr``rEx  /321026544#E*77*TeeT8117UfWWge  /3104632#"&8''89&'8'89&'88AV@  /93107''7'7'3 ]CKNB^ S3K%z)~)y%L5WE+!@# ) /3299233310#"'#"&5463263232654&#"4&#"326EiNY33YOhiNZ22ZOh=,,;;,,==,,;;,,=NeIIeNNeHHeN36=,,=6336=,,=68g4/9/310#7!3_q@_q@IW{ /2210! 3!2$7{Рcw6svx2 /3210! 3!2$7Рcw2svs/10!5!J|U 10!5!JS /332210#"%$#"#>32327-^t-{Y͑9VUT\(-VS6  /3210#&$#"#! ^^0/ÂvvsSW//99105!5!5ϖlv6cNi[@/_?]3??10733zُzyybEr]xZ@   ?33/?3/31027#"&54>32.#"l9jR߃Z}p yCCVi;A#䜉}vk?O^kWhh>@  ?3?39?10>32#654#"#3+8qOeeV{U yWQyz3 bP@ga(L4A(vqUxpi@  ???33910&#"#733>32v$ItKznt.T;" qsI^K &wZ{+ ?2?39910#33*N¿9r(w6/991053n uWx/9910#5n߈XW3@  /9993310327#"&54?3$!.'58 p ;3!-nkNCN&FjN'&:</991073~!$%A 2@     /2/2/9/33399331073%73!73!"B""!p%&$9{%+5?5-@Y/@+H@H@H/+++]+931073++Lb'(9c{V%+5?5I'+9`{M%+5?5I',9`{V%+5?5!&2!9{g %+5?5g'<9{  %+5?5&[9{)B''##%+5?5.A&k:2@ & %+555+555$?%?!@_Y?3?+39310!#76@  _Y ?22?+3333399333103!7%.5$9; ^L vc?i(=?+eS@0 !_YO? _Y _Y?+?+9/_^]q+99339910!!  # 4$"32$54&KAzy;ۭٚZQ",?. .@    ?22/3?3339933310%#&'#3BCPaq ?0?1_ P@1   _Y O   ?  _Y_Y?+?+9/_^]q+33910!!!7!7&9`o2?%@ _Y?2/?+339310!!#!} ?I3 G@$  _Y  _Y?+3?933+333393310#7 7!!!!YcE7s\7<~c(q@:(  ( $$*)(`Y(  `Y (( ?3?399//3+33+3993393339333310%"$5!37332+#?32654&+";G#!1ﳠ.,|װE|ְF(٧à; J@$   !"`Y ?2?3/3/9/3+33932933310!#"&5473;32>73!#S3 ZZ8fu_Zb0iSG1-` x~IKU&K@)  # #'( _Y _Y _Y?+?+?+33393391026;!7654&#"!732&54$y2+Ƙ􇁏-5OX MCߌS Z-EQ&, @ &%+55+55&< @@  & %+55+55F&c9d@ *&s*-%+5+5"&g9@ (&(+ %+5+5"W&i9& " %+5+5?p&k94@  &  %+5+5hA&w:j@&n$ %+555+555FM)B@# &!! *+#PYPY?2+???3+33993931023>73#&=##"&54>"326?4&S A#8"YrHtQn@tMs%8SrZ{ξ*aŃKW`)Z@. #'' +*$#$#PY$$  PY PY?+?3+39/+9?33399393102#"&'## 32654>54&ǡqf7G]A8Il̳y8&g"ٍ%7tZgoXa::@     ?2/?99]]339333310673#67,r0GssS=q:]%/p{/C W@0?   !  PY(HPY?+?9+33+3393333_^]10%2654&''#"&54%7!?N߉lnY"(qidO‚u@PSw"M'X@0%  () ! !PY PY PY?3/+?3/_^]+9/+9393310%267#"&546?.54632.#"!"jFX^ΉXeо4)oKcsHMgtPDi^U{xPSXT?8\M,`JKZ= #A@  "$ % "#"QY #/?93+333339939310'>54&'.54?!7 )Swtd3,Ff/"]&9d0B/" 9N7,PKRH7G,<#*n"WME@&    PY  ??3?9?+9333333910654#"#>54&'33>32z~ v SsW.X>%e v <}sY@deE?@   ! QYPYQY?+?+9/+99339910  #"&5462!"!654&mehv<>0^8B܌up?: 0@  O  / ??]qq93107#&5473- JA(U4;N-"V: B@      ?2/?3/9333993339910!#373 HҴeiP|:E/R@-  ?    PY ?+?3/9_^]]]3399333910'.#"'>32##,:D([#go%δ|cf wA:U@+  PY??+?3?3/933329993339910!767##"&'##332673BXTuR} nxv\C7/X|=6ʵik~c:<@!  @P ?33/3?39]9333310%>54'3 #3Kxܨ|;=3D:71U@-%!%,.2.3/(,-,QY "QY-/?9/9+93+3339393310'>54&'.5475.546?#7!)Swtd3,Ff/"]/~GJz=Zeqm0B/" 9N7,PKRH7G,<#)w$^g!}C2MR[{:":@  #$ QYPY?+?3?+33393310%327#"547! #6?"7>3!#H#<SG n-Ya3Y'Qk7%R)9sP S#WVNA@    PYPY?+?+9?33339933102#"&'##"32654&cBSd&>1Lq]Nγ°CL{W ?TCN$@@# %&"" PY0 p  ?3/]+/939333104>32&#"'>54&'.Cb݀l8Ppis+Zmtd3,Ff/"]J'yBIljؘ5H3 9N7,PKRH7G,<#)D:9@   QYPY?+?+333933310"&54$3!#'' 4'#"ߝ.(Lt'Sy;~6ס8LfKg:*@ PY QY?+3?+39310"7>3!!327#"547NQk7DЅH#<SG  S#R5-h:#@  PY ?2?+993310324'3#"&547y͵"!s:I8cAĺDTOGWR'R@*  &&)(! PY  PY?2/+3?3?3+399933933102#.57>">54ъQOOwOuvp+I[qog9Pijfil$|DڻVgkXyPE@$  PY /3?+9?3339993310%#.#"'6323 #(ag)6( "Q<73#$4733肔V~}"OOSvzw<}|\kV@PdP.q_CO.P@(,+ + $$  /0++ ''PY PY ?3+3?3+39/999339331032654'7#"&'##"&5467326?3[WLfQ2ݚw:| H[Wg11 Vhw#p>ؾ<:eKz}@?{&kj@  & %+55+55h{&wj@ &d %+55+55C2&R9@ & %+5+5h&w9m@ & %+5+5C&{9r@ /&/2 %+5+5E(3e@7",254%PY)PY2) )) )) /PY QY ?+?+99//_^]]93+3+9933333310>32# 4632#"32>54&#"2654&#"lN!9avݙ~_㏇p`YJfa\NPVEBF1Z*OY{Ȩ)zkzju^mkq^C=+4KHL#.:m@9-11. 7%"/"% ++<;PY"/"PY-///((4QY(PY?+?+99//993+3+39933933322310##"&54>54#"76323267,546323654&#"aE념")"03hjYPU#+#C=f#ʫ a r`_oURxf5`TH)16SE2]WT(37:DTHHvpM]1z2@    _Y?+??993933102&#"#3 >`bDA/8qs2EbD+"H9^UG'T9?5z& @& %+55+55BW1:=W:.S@*),, "" 0/$$PY ((PY?+333/?39+393333333310!##"&'##"&547#2654'!32673s*ޑ| =|pbp^\W*dweEC W:xD}Ȋ^}۬`G0enW>1]@2%1.,,. 32,RY,#(RY%# RY ??+3?99?3+?+33933333310 !654#"'632!327#"'7326?&547oAZV;CDchhO Ri7W)67{B?-29DwJbztt{tW>z 蛍DQduhooW 9@! "_Y_Y??+?3+3399333310&54$32"32$54&QzOYW2ُyhbۮ[BW1M;@ QYPY??+?3+3399333310.54632#"32>*QzNZzh`;W୺GǩhT愔H:@ _Y_Y ??3/+9/+39933310!&54$32.#"37b7I(0%ϕ=Uʸ87r{IWN*?@' " +,'%%PY%PY?3/+?+3993399333102654.'.54>32.#"#"'7\#GZM̑aWs]*Kj@z帅!e[S$0!(r`kYsDS3"}c9+?C 6@ _Y@ _Y ??+9/+39310!#7!#!VH)~EtXW: >@  RY @ PY  ??+9/_^]+339310!!#7##!_WN'6EIcjd=ENg|xPXiatsa@7 <@  RY??9/+9933933310!#!73!l  11Yd@3  `Y `Y   `Y_Y?+?+3/99//3+33+39939933310',7'4''.#"'6$32&U ) J(@ܔn`B$YQ68c̄1wvt0VL@(  RY PY   ?2?399//3+33+393333104''%&''%%7x*/]+ɷ%BZLV?,(f UeX0S@, '-1 !!2'(`Y'.  _Y_Y?+?+?3399?+33933333310"'#"&547332673323#!7!26?#I\^WaySY?''ҥ# ;^JGng]@g]GN8_\CeAINX:4L@(.  '((4 56./PY. '# PY ?3+3?3399?+933333310%#"&'#"&54733267332673#!7!26?+KdySh|LVr v|LVq!v(ݫI&n^wqf@d_.!KO__.!KO\2eeD@#  _Y _Y  ??9/3+3?+33393310.#"3273##"&54>32@)K0bIʋhoXCwjmf}Z~-&jOH ;@!"PY RY ??3+?9/+339310!#"&547>32&#"32673kEm N>J;8uK Rd|)[P.K|E-QR~4X >@! " ! _Y   _Y??9/3+3?+393310!2>54&#"#37632#! .pV8Y]nKH!I}W0*P:wO6-9w@A1* $ ""$7*;:$ '4'PY744PY/ @PY.PY?+2?+?_^]+9/99+99333933310267#".#"#>3232654'#"&54>"3267.:G{PC=jJ/+D_F6=qUNSRNd]Tqtqz}62dNYN(8M[\&e3Lǧ#Kju22 -R]xf[H\H+3_P&-M32H@#)"" ) 34% %%_Y% `Y ?+3/?+3/999933333104&#"'6$3232654'7!".54>7$>w7F2X{݅Hȥ|kȳ z[@"EWjgu2V~[@1<@iKfx=F"MJZoqi'9$*7JM3,D@!*%%.-%PY+(RY?+3?+3/9999333310".54>7$>54&#"'6$323 7]|kȳ z[@"7F2X{݅H*Zoqi'9$*7J/Wjgu2V~[@1<@iKfxK?dQ!$V@-"  ##%&_Y $ ""_Y?+33?33/3/9+3393333102.#"!7.#"'>327>!LZ~-x%@&#<A *#Oz_WXXc"d?XׂtfTP8#2#!0+fkfdsr\ HKA!$W@.# " $$"%&RY " ##PY?+33?33/3/9+3393333102.#"!7.#"'632?>3Nz&t<$#;"ZH "'IfdQ]8$4C>AdXW@546+64c@iqi_St):@ ""+*`Y _Y %`Y?+?+?3+99333310 54>$3!!">3 4&#"32>U~є-d߆" /ſzպʉJtRJ;jH@$! 32654.#"7632Q SS7hfJ;0xdi.4o>L# H@$    _Y??9/993+3339339923310'654+##"&546;7332 6ÿ-:11&2B1a vghM@@#    QY  PY QY?+?3+3?+393310!%73##!#!2ߺeg8(Pe8!Cd= d>%F@% ""'& RY  RY ??+?99?+3333933310 !654#"'632! 327#"547oAz\V;DBrE maY&1FKzG!dy~bt_y{mhW`N .F@$(!! /0RY+PY$PY?+?+9?9/+9933333107476>32#"'32#./.4&#"326,,eˉ֍f H;G{s~^|o_ yNƳ>9_p1Yzwԅ|%CNFWMoB:G@& PY  PY PY?+?+9/_^]+3933310)"&54>3!#"!!3!Tw  ˆ d:7E:D@%  PY  PY PY?+?+9/_^]+333910!2#!73267!7!654#! Tݒ$w :^,9?W1q&> 4@     ?3?3339/33393310!##3 !͆J%m'aWU:.@   ??3??333339310#67##!67Uҭ% "߮% T 7G_:UG$I@uWVN%P@*# '&PY  PYPY?+?+9?9/3+3333393102#"'#!!#7#73"32654&w !? yyd&>3Jq]Nγ°T AR+Hq&&n]+&H]?i&(,@ &p %+5+5?i&( Z@  &%+55+55Z&b@7 !&!#'("#$#_Y_Y  $ ! _Y@ ?3/]+?3?9/_^]q3+3+33933310$32#"'7326?>54&#"#!7!ZD %'m4Y-OZ'wyXO;9.ʩx7+`t =RY  圜?&Fv@ & %+5+5ek@A !_Y?_Y    _Y0@P?2/]+?3/_^]+9/_^]+399332310"$54$32.#"!!3267o&/$ʔ6wּh| ٵ7qH燜Y:@6Q",Q &, @ &%+55+55-"a@7$#_Y"_Y_Y  _Y?+3?+3?9/_^]]++39333310! #"'7326!!2)7! 4&#!3x~:$ItY1sEvqd SĴqy?_g@7  _Y _Y?+?3?39/_^]]33+333/3933333310!!#3!3!2!%! 4&#! ~~s ssFqsTĴqy&X@0  _Y @ P  _Y?2?+339/_^]3+3?3933310!#!7!!63 #654#"gD ij RY圜;67#-0?&& %+5+5? :@     ???99?39332310333#7 %73?"蝹88ϭdZ4&J@ &%+5+5?h ?@   _Y  /2?333+3?33/3933310!3!3!PPhh$> G@)   _Y_Y _Y?+?9/_^]]++933310!!!2)7! 4&#!P!UDvqHĴqy?%?FChh[@/    _Y _Y/33/3?3+3333?3+33393333310%3#!#36!! voPPnc^TKx\Oh8c` A`?i(#@E ""## %$  !`Y/ "##?33/33/3?39/]3+399333/33/33333933993399310"&'#&'3332>73###b"X /]’OLUKxxH_jRe"j+~O)ϧj)k'b1a9 k){@K '!!'$*+$`Yo @H_Y_Y@P?2/]+?+3/+_^]q9/]q+99333310"$'732654&+732654&#"'6$32)=;ƞcGs>PրnwFti}^ow=Xar? P@0  E U   %   JZ *?2]q22/3?33/33]q33393310333#7?"蝹88dZ?4&J@  &%+5+5?T@*     `Y/ ?22/3?33/39/]+993399333991032>73###PxH_jRe"j+|'b1a9 {9@_Y _Y?+?3+3?33393210! #"'7326!# x~:$ItYQd S?0?+o2?S?I3q&\7F@$ H    _Y?+?399_^]33399333+10"&'732>73 3?x+USH7S_})j*#;*g>z  )q@:  !))!  %%+*)`Y) !!`Y ))  ?3?399//3+33+3993393339333310%"$54$;7332+#?32654&+";Wd$#$j,,Mᣊ7=ܡ9֥٥Խ;?h ?@   _Y/3?3+333?33/3933310%#!3!3SoPe>@ _Y ?33/3?39/3+33933310#"&547332673# jjVT;9.# =?] C@  _Y ?2+333?33/33/33399331033!3!3??h(P@(     _Y/3?+33333?33/33/339333310%#!3!3!3oP- G@)   _Y_Y _Y?+?9/_^]]++933310!7!!2)7! 4&#!5s$VqĴqy>R@-   _Y_YO   ?33/3?3/29/]qq++339933310!3 !2)3! 4&#!.Dvq-Ĵqy> B@$ _Y  _Y?+?39/_^]]+9933310!2)3! 4&#!9kq-ĴqyKw@J _Y?  _Y P   @H_Y?+3/+_^]?3/^]+9/_^]+93333310"'! #"$'7327!7!74& <15*ƙ-#cx<]wӾ: L?"I@'   #$ _Y _Y_Y?+?+?3?39/+9333310  # 7!#3!"32$54&2~sFͷy:PsJ֮[v Y@,      _Y_Y ?22/3?+9/3+3333393339310#.54$)#! !"3![*)5Zqud›e0ŁI}|.-NDi'B@! &()&PY RYPY?+?+9/+339933310 32>54&'2# 4>$%P y^[2zKKЊ`S{4dH 2PFTɾu[dZ73232654&+7 54&#"fzt,Ѱxt|\\}Hl}])jdlP^AL),O&I@%$  ('$PYPY?+3/?+3/999333310"'6!23267!"&54>7>54&CozN^Hk4zNVx8lEQ0QrW256D3JT8Z_/ 9>3?BC,'E@% %)(!QY QYPY?+?+9/_^]3+933310"&5463274&#"'632'265#"d/JG*Wa 9|LxS~ȟ%QCI{!ёꅇ_ {wE'NH:"@H   $# QY/ !""?3333/3?39/]3+399333/33333393393910"'#&'3332>3###a8+&3e154,\\08Lq5뺺P_W&rKrV#&,UJ$N&^@2 $ $(' PY PYPY?2/+?+3/_^]9/+933933310"&'732654𑯎&#"'>32(q{dR,&ĭNUh|z,ha]]b`EFuNvJ  `VJ:XVJ&X@ &n' %+5+5" :W@,     QY/ ?22/3?39/]+993/3339933391032>3###\&=GYq5뺽9^\:&4_3$#Y:8@ QY PY?2?+?3+33993310!! #"'7326!ҸboWD, !$3TxjGw7"U:d@ @% H    H/  ?333/333]]+?3333]]+3]99333310#>7##!67Uҭ   T 7G_:<@=G:I@"?: I@$  QY/  ?22/3?339/]3+3/399333310!3#!#YYҴ__:6:C2MR"@:0@ QY?33/3?3+3993310#!#@Ҵ:I:W1NSCNF"KMPWg:\EWn&5Ce@7A:!!#,  "3"ED"! 6//PY# =''PY/2+3?39+3?3?39339239310"&546323733>32#"&'###'2>54&#""32654&st̡rRnDjr͠r^qE+Y~X3tdoKTvRuanJT~h^`Uh^ lIbSRS}~{|MԉKy{|<:[YhM:W@-    PY  QY  ?22/3?3?+3?+99333993310326733##467##"&547~~ viPSs:{X>^I )sY@d:8@  PY  ?22/3?39/+3993331032673##"&547C MN8t]eҴYRRD:6)A<*,y8=PV:-]@0&,   ,./)PYPY#"" -?22/32/3?3?+?+999333993331032673#467##"&'#"&54733267 |LVtvIfyPj|LVtv:w7KOƠ\_ )rZwqi@dw7KOà_Vh:/s@< .-'(++())-01-.)((   PY $PY,++QY/?2+3?+?+?3993/33/3?3933399333310!467##"&'#"&547332673326733#HfyPj|tv|LVrviP )q[wqi@dw7à_w7KOã\dB: I@&  QY QY PY?3+3?3+39/+933310#"'!7!3232654&+ʹY2xt}O)6dlXV&:J@'  PY QY   ?2?33/3?39/++39333310!3#"'33232654&+4ҴδY2xt}:O)%6dlXV&: 6@ QY PY?3+3?39/+993310#"'33232654&+δY2xt}O)%6dlXV M|@O  QY  PY  ` p   @HPY?+3/+_^]?3/^]+9/_^]+93333102# 73267!7!74&#"'>#ϊ-x_ ruk6#MDmnX "M!Y@0 #"PY  QY    PY?+?3?39/_^]3+3?+93333310#"&57##33!2#"326Jȅ_ҴYgҽzOqnxObJ:6鄓:S@)  QY QY  ?33/3?+9/+3333993339310 #.5463!##"3!1Z:ҴY`ᝆeQ6OsGclJ[E'&HC*@ &&0"%%+5+5E'{&Hj@ !&l%#%+55+55"W +h@; &&,-QY# PY### # ##PY?+?3?99//_^]]q9+3+3993333310"'73267654#"##7373!!3>32G8I4;;~ n-+SsWT\X>msY@d! d@ p   @ +.H `  @H   @QY?3?+_^]393+qq+qrr10!#?3е:I:wCN@B  QY  PY/ @H PYHH?3/++]+?3/+_^]+9/_^]+9333310%267!"&54632.#"!!`2sΉ kX'sfzpv5ǿZ`j4/KV!&ڹ 88H 77H 66H 55H 44H 33H 22H 11H 00H //H &&H @)!!H @H @H @H @H @H @ H @ H//H@$&&H@""H@ H@H@H@H%+5+++++++55++++++++++++++++++++{&jZ &&H @8!!H @H @H @H @H @H @H @ H @ H&%+55+55++++++++++WM:$[@0 &%$QYQY PY PY?3+3?+?3+39/+39333310#"'! #"'7326!3232654&+ʹPboWD, !$3TxY2xt}O)jGw76dlXV"':d@4     QY  PY ?22/3?3+3?39/_^]33+3393333331032#"'!#3!32654&+Y[J_ҴYYxt}:6):6KdlXV" !n@?  "#PYQY   ?33/3?99//]q]93+3+99333339910>32#654#"##7373!!wSswv~ n-+YsY@d]X>m" &vG@ &%+5+5VJ&XCB@ !&.  %+5+5Wg&\@ &#%+5+5VtJ:b@2   ! @ PY ?33/3?3?+_^]]9993393399310#32673#467##"&547 GW&~~ vSsDH~{X>^_ )sY@do 1:\@04$, $;< ))/_Y-) 7_Y _Y_Y?+3?+?+?3+9/9933333310332>54&#"'>3 # '!"$546$32&#"3267MN<[ʹ\\Ɗ ,x̺t'NqhܠVǃ^2qNTsiA9􁳳[}8GhiWSB:A@    ?333?339933933333310%3654'3# #3P'< 8#ߡl4D1Fce:gT@+    _Y`Y  _Y ?+?99//3+3+993333993310!!!2)!7!73! 4&#!k-9*kqĴqy"N &T@-& !! &'($PY&$ RY QY??9/9+?+3?3+39333310%32654&+"#?33>3232#"'*xt}\on#kчl"]ͅdlXVhh>r݅l 0)?B%e@6 #&'_Y_Y _Y  "" _Y?+3/??9/+3/+?3/+3933333310"&57##33!2.#"!!3 b|x;,#0X¬t E"]7sH#Y"vN%b@5##  &'PY!  QY   PY?+3/??9/_^]3+3?3/+3393333310%267!"&57##33>32.#"!!r].s·^Ҵ[5ӣ gU%czrt5W:+cg4/ F@"   _Y  ?33?39/+3339933333310##3###!&'[P$igO<5B raYFV: >@   PY  ?33?39/+33993333310!#####3 EtGGpжy&Jpp:n?G@&    `Y ?222??39/3+339333331033!3#####!!&'?n$iggAh<5B (raYFV"(:K@(    PY ?222?339/3+3393333331033!3###### "Ҵp!SԣEtGGpжHWJ:Bppqn}R@+   `Y_Y?33?+9/33+39333333310#>54&'##7%! !F + zz/#(5>xٸMiL"r|} :V@-    PYPY?33?+9/33+393333333310!#654&'#"#7>7!!|TT*$ud=OHpdQEFj%M~?1"%c@5 %!! #$"" # '& `Y#!!%_Y!?333??+9/33+33393333333310#>54&'##7>7!#3!! ! + zz/#(wfz|xٸMiL"r͒G|}#:"]@3!" "  #$PY"!PY ?333??+9/33+339333333310!654&'#"#>7!#3!!!g|TT*!1C2TҴdBd=OHpdQE_%Q:%M~WQ@Y78 (I:=O=-;8C1LL8RS RF;CA A=@O-,-,`Y--I:=77==4_Y=@_Y  _Y$_Y?+?+_^]+?+3/339/+9_^]2223393393339331032>32#4&#"#"&54>7>54&+732654&#"'%37>32&#"jDD~`:J=:fab6Rh}Iz`ձVcGs>Fub)S4S&NvjjE6.-+!+""~ja}G@wdoy^ow=%)OC8M>,!uWO@X766E9L9*H'?.HHQ344PB?=9@L+*+*PY++E79@6933991PY9@RY  PY#PY?+?+_^]+?+3/339/+922333393333933331032>32#4&#"#"&54>7>54𑯎&#"'6737>32&#"7eʊR*:58`ZW/\Z(FXnDoL>dR,,ZNvJ  x=@    `Y  ?33?9/3+33933310".'3;332>73!##̊]00:iYOcZb0iSS]/EDHUW:;@   PY  ??3+3?333933310%>73#.'33輦#~}"OOpI (( W[w|[k]do!1W@,//%  32,_Y.,'@'_Y%'' _Y "_Y?+?+9/3+32+3993333102# 4$"32$7#"&'."63232?4&s˵zd,<d?vV6i :@xbMzl;%Q2")&AK >.5QB1M!1Y@-"'32/PY1/)@)PY')) $PY PY?+?+9/3+32+399339310#"&54632"32>7#"'.%#"6323271P؊^GHzXrX; O=X^%B,H>.F/&L*NEaͺG)*22kE*9&$&.@   _Y ?3??3/+3993310!#3?632.#" (\s͉n]'G(:N" nN+`% ><pDN.@   RY ?3??3/+3993310!#37632.#"շcvhc`?0.C):@ ]'4L&%S &( %+55+55pD&&&3 %+55+55oW E&5S@-," 3 3"67/_Y'_Y  `Y?2+?3?33?+?+393333310"'7326?3>32#"4>"32654&H<- WNٷp oп^nu@oWr/.P@ M?m<Ed߀կZBWM%2O@+, & &34#(PY#/PY  PY?2+?3?33?+?+39333310"'7326?3>3!"&54632#"326iH<- WNٷp o;\sӚfw>\ZfsAWr/.P@ MTbvμFz*of/@@!$01  _Y)&, ,_Y ?33+33?33+33933102#"&'&54$764&'#"&'5632>-M.y9M^@=t9S Do9N800yM2'..Z\*a>1UlF6CB.=@$  /0  PY(&++PY ?33+33?33+33993310#"&'.5467>324'#"&'632>sٞ8k3O {W65M {5c6N ^N;c0JZ}Iſj;6'ܠ702E.)͙CO5,nAS1(r 7KU@ISLQQLTTBKB#K1 VWK88BSUQBQBQEUU>E E )74_Y_Y,&&_Y ?3+3?3+3+399/_^]33/99//93393333933910>3  # '! 4$32.#"32$732>54&#""&'.#"#6$323%#67#7uUO"ޒx5SEgC_3\ΈV:凐eLo.gUbGu.@B}ocX7jg NW#mma#"iUFFUr#67=0mp+?91<2DbGf*4Hi@5?20+3H3IJ2/++;BH55?/?/B#&  PY ?3+3?33399/99//3333/9993333333104H#"'#"&54>3"326732>#67#7"&'.#"#6$323!pv\ݑvTa`9Z<']`fAo$+jg NgUbGu.=B}ocX{sɸkSSº$kLY:-,;RR=83bG67=0mp+?91o 1& Oh@ E&F;$%+5+5B& @ &5  %+5+5qU5@ _Y _Y??+?3/+39933310&54$32.#"327Pu+0%Η<:pU6ٵ7pCWN;@ PY PY??+?3/+399333310%27#.54632.#"25oPﮩ l[~VsԳXaiڏ:pv@>   _Y_Y  _Y_Y    ?/99//99++99+99+9999333333910%%#%7%73pGQF١GIFO՟^_`5]^^_-{ ?3210#!#"&5463!54632I5C.2BI5[C.2Bq2<8<@42<8<@8  ?3/9910#74#"+73267632YP#L+0rGfU4].tFRZ0Z%-".[S"I ?210##&54?%Y(h&̺1HPLO*OoI" ?310#67#7"4+vcY%̒Qq/i`l;  /32210"&'.#"#>323^gz>i0?ԝJql\>58A,js/;82% '1;EOY@+F#K HM%M2 7 499(-*//M9//9MA<>C/2/29///322223222232222104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&f '1;EOM@%C@EE/-(%&MOJ9277J(JJ(  /9/99///3/993/9993/910#65#5546733#"&'5353%32&##&'''.'77'67'77>7@dBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96m?f4U@    ! @ @ Y ?322?+?99333933333103333##67 "&'73267?"ӱڇ"8t2*tX^$g,d,WZw|=cTf[$VJ+K@(  !) -,PY @ RY("% ?222?+?+933333310326733##467##"&547%"&'73267~~ vkSs2*tX^$g,:{X>^g(7 )sY@dvw|=cTf[$>N@)   _Y`Y  _Y ?+?99//3+3+99339332103#!2)#7373! 4&#!-9̤*kqĴqy&Z@/  QYQY  PY?3+3?99//3+3+9993323310#"'#73733#3232654&+uu$$j2xt}O){dlXV?I?@!   _Y _Y ??+9/+999333102'#!#!27'7654&#!TSz]~Xj6~STyV2е|r`5;"savInw~W1N0C@%+ ).()#21PY &PY?+??99?+39333310"&'##6733>32'"327'7654&*{ ^ IwlZLrOVcb8qR5WqN1>^h^ lD q%_V^gZl)Qa}x[kTi{|?2@ _Y_/]3?3?3+33393103%#Pn"x0@ QY?2?3+3?33393103#!3!ִMg}:& ;@   `Y _Y?+?9/3+3399333103!!!!##Cu7W\%[An : ?@  PY  PY ??+9/3+333399310!3###73:ccyzS:τ?W"K@'#$ _Y _Y _Y?+?9/?+9/3+3933310#"&'732654&#"#!!>32ѵ+x䈓Gs'Kc\d7fኔPWi͟%32,"W:P@* PYPY PY?+?9/?+9/3+39333310%# 73254&#"#!!632*ibŠ{mfPaSMukױ SL̂ c:t#h'q@<%"  )(%"`Y !!_Y! '?3?33?+9/3+3333333393393910"&'#&'3332>733####b"X /]’OLUKxxH_jMkoP!q,~O)ϧj)k'b1a4 kh:&q@<$!  ('$!QY QY &?3?33?+9/3+3333333393393910"'#&'3332>33####S9*&3e+66/\\08M q5WiP P_W&rKi\&&,UJ$9;W8s@= && 8)66809 :.3`Y0.#`Y_Y8)_Y?2/+33?+3/9/+9?3+33933333310"$'732654&+732654&#"'!2#"'732654'Q=6žcGs>nw̲jNOTSUFzi}^ow=UW`s%=J%#ld%WN7z@@ $$. !!''446 .98,1PY., PY PY6'QY?2/+33?+3/9/+9?3+3339333333310"&'732654𑯎&#"'>32#"'732654'(q{dR,&ĭNUh|ysjNOTSU"z,i`]]b`EFuNvJ  `o%FJ%#ld"!?hO@'    `Y _Y?2?+9/+33?3399333991032>733####PxH_jMkoP!q,|'b1a4 {"h :O@'    QY QY?2?+9/+33?3399333991032>?33####\7QdNq5WiP 9^\:&*`a$9#?\@/  `Y ?2?39///33+3333399333999103273>3####Px?/Ns<?dMeHsPB,|Ea4i{" :\@/    QY?2?39///33+33333993339991032733# ###\6(>i+#q5뺜2i?%7\:&>d$D#?S@-`Y`Y ?3?399//3+3+3339333103733#2>73####**2H_jMeq,|ˢד'b1a4 {" W@/QY QY ??9/3+3?39/+3339333310373!!2>?3####0t7QdNq5뺽9^\9*`a$#PC@$   `Y _Y?+??39/+33393310!2>73###!xH_jMeq,|?'b1a4 {u:D@$   QY PY?+??39/+333393310!7!2>?3###\7QdNq5뺽9^\&*`a$#?hR@+    _Y  _Y?+??39/+399333333910!!#3!33#ttoPsT"h?:T@-       QY  QY ?+??39/+9333393310!33##!#YYiP__:6I:? 5@ _Y _Y  ?3??+9/+3910!!#3!!!ttz?sT": 5@    QY PY?+?39/+?3910!!!#!#YYӷ__:6ʋQ:?Wy$]@0%&_Y# _Y _Y?3?+9/3+3?+9/933333310!!#!>32#"&'732654&#"}jd]f4ѵ+x䈓Fu -fኔPWi͟%32"WC:Q@*  !PYQY  PY ?+?39/?+9/3+393333310632# 73254&#"#!#@huk׃*ibŠ{mfP:#׾ SL̂ cI:o,8a@4 1(36%%3 9:"-_Y""_Y_Y3(**_Y?3+33?3+3?3+9/+933333310%#"&'#"54$32&#"327&54632327"654&xyQ~=$GK=H|Ȁ;_qz̄1<^OJ|HdD(<!=5(Yb~/mu|goBL+6c@5 2((4,%%4 78".PY""PYQY4())PY?3+33?3+3?3+9/+933333310%#"'#"&54>32&#"327&54632274#"6R`[JXfNqR@E$-Z]bXMWfhoun+C8fD-H*-Tb#7%%{k钌ib'{rZCTqW,K@( &&-."_Y,,)_Y `Y ?3+?3+3/?3/+3933310#"'732654'#"$54$32.#"32$7NcjNOTSUu+0%ΗbQE:%#ld" ٵ7p瓐CWN(M@)' ) *#PY QY PY ?3+?+3/3?3/+33933310%267#"'732654'"&54632.#"d.`jNOTSU͑ﮩ l[~Vznx13E<%#ld"Xaiڏh\ >@   _Y _Y?+?+3393333103##!7!ZՌnO圜"hKM2Y@0%"'+&&##' 34%''"QY'.PYPY ?3??+?+?+999333333310!654&#"#6733>32>323##>54&#"|LVq!vIfyPjftiP|LVs vzw7KOS_ )rZwqi@dzp-KO4@  ??39393393310!#33,rG:kpWb: ,@    ??3393393310#3673RŻh2@}W:b*noCH@$   _Y ?3?9/33+339339333310!373!!#!`J»A @fprbgfA_HWb:N@&     PY ?22+3?3?3399339333310#!3673!!#!=Żj-E~>88:T~RczƊhK@(     _Y?+??393333393310! # 3 3 3#oP^'\h<:K@(     QY?+??393333393310!# 333#^+ciPD,[UhH@&      _Y _Y?+3??+39333333310!!!33#!!nOXh:!X@/   "#PYPY QY ??+?+?9+393333333310326733##467##"&547!7!b~ viPSsdX>^I )sY@dheI@% _Y_Y?3?+9/3+3933333310#"&5473326733## jjVTnO;9.# =h:M@'  PY   QY?+?39/3+39333333310326733###"&547C MN8t]etiPYRRD:6)A<I*,y8=PeQ@+_Y  ?3?9///33+33393232910#.54733673#q4{3 jj[{[+ 9.# =0 !:S@,     PY  ??39///33+339933339103673##7#"&547C 54#"#3 jjVT;9.# = "K#+T@+))!!,-_Y'@ $`Y _Y ?+?+99//3+3933333103267# 7#"&5473;! "!74&ٿ^wv--fE) ,;rM~X,GpdXOG@V,ZwpNN$,[@/ &&"".-PY,@ )PY PY ?+?+99//3+333393333103267#"&547#"&547336$32'74&#" ^1Op~--f6 y%2?ZY?s'<`_XOG@VϻidH|&.i@7 ,,$$/0_Y*@ !!'`Y! @ _Y ?+3?+99//3+3933333333103267#&57#"&5473;! "!74&ٿ^p۹99v--fE) ,;rM~X&'GpdXOG@V,ZwpNN'/j@6//  ))%%10PY/@ "",PY" @ QY ?+3?+99//3+333393333333103267#.547#"&547336$32'74&#" ^1GȄ89p~--f6 y%2?ZY?{u (׵'<`_XOG@VϻidH|Q",4&J@ $&'/%+5+5&@ #&&.%+5+5@W"G@%!" "#$" `Y "_Y?2?+?9/3+9/933331032>73 #"&'732654&+#QyE[hHѷ'Bx}#^17( xW :!L@( "#QY PY?+?9/?39/+393333310%# 73254&+#32>?3(gaÿc]Ҵ\7QdNf< XG֌ :&*`ay.fJ@@Y_Y _Y?3+?+?+3333933310! #"'7326!3## x:$GphQӱڗd 5;,Y:B@"  QY PY RY?+?3+?+3993333310#! #"'732>!3}boWD, !$&;B^7jG:g(?WF@$   _Y _Y   ??39/+?+9/393331032!#3!3! 6Ntt?hLhYQsTl%WC:C@#   PY QY   ??39/+?+9/3393103267!#3!3# i[|$R_ҴYY2*TK:6?fH@!   _Y  Y?+??39/+393333310!!#3!33#ttӱsT,"?:K@(    QY  RY ?+??39/+9333333310!33##!#YY|__:6g(7:heC@" _Y @_Y ?3?+9/3+3393310%3#"&547332673##*C jjVTO\;9.# =hh:E@"  PY   QY ?+?39/3+3339933331032673##3#"&547C MN8t]e}Pil@RRD:6)A<hJ*,y8=P?fL@!  Y?+?33?33333393333310!?#/#3767!3#(S,|!) =)ӱl$ML?&S/8,"U:F@$    RY?+?3??33333933333103##67##!67Ut% " T 7G_:g(7UG&1:I@!O&$ &J%+5+5.-&D@ 8&;B '%+5+5&$ [&8%+55+55.-{&Dj @ ?&<: '%+55+55 N?i&( @  &%+5+5E+&H@ !&$+%+5+5zQA#Nz&Qjj@ )&&$%+55+55A#{&j@ (&G%#%+55+55& W@ +&(&%+55+55{&j@ *&'%%+55+55& @ 1&.,!%+55+55{&j@ .&+)%+55+55*N@) _Y`Y_Y?2/+?9/+3+333933310"$'732>54&+7!7!34w]9FU^tzn}W:T?&P@ &%+5+5VJS&X @ &h %+5+5?& @ &%+55+55VJ{&Xj@ #&r  %+55+55h&2 #& %+55+55C2{&Rj@ $&s!%+55+55o?@   ! _Y _Y _Y?+?+9/+993399102# 4$2$7!"!74&s˵z0< <;Gu5C2MG@% QY  PY PY?+?+9/_^]+99339910#"&54632!32>#"!2P؊zia6*_aͺG|NLNo& @ '&$" %+55+55C2{&j@ &&u#!%+55+55K& @ %&u"  %+55+55 {&j@ $&v! %+55+55&P@ &%+5+5WgS&\@ &%+5+5& J@ &%+55+55Wg{&\j@ &%+55+55& @ &%+55+55W&\C@ #&!%+55+55e& \@ &a%+55+55{&j@ &T %+55+55?h 2@ _Y _Y?+?+39933310!3##6ӊoP#h: 4@  QY QY?+?+93293310!3##tiP::>& "@ & %+55+55&{&j@ !&{ %+55+55W^@2    `Y _Y _Y  _Y?3+?+?+9/3+33933333310%#"'732?##73!!!!7JC4>yu7W\b䙏s[A [W:Z@0PYQYRY RY ?3+?+?+9/3+3393333310!3#3#"'732?##73:Es7JC4>yucyzS:τ䙏sWG@% _Y?3+??3933393399310#"'732654&' # 3 3 O;6=>T"['vU@&P+6'\MNW<:G@% RY?3+??3933393399310#"'732654'# 33Q:68NX .@   _Y_Y?+?9/+399310!"$54$)3! 3!C1j6}]е%w~EGNO 'E@% " ()&`Y& _Y!! _Y?+3?99//+?+933310"326?#"&54$)332673# Ƈ!"bsb4Yt~NP,hq&bF%ƮTZ]6˛eE3 /N@*-&01PY  )PY!PY?+?+9/99??+9333310"&54632373326?3#"&''2>54&#"}ݭ\$Wq'(*z!V{W0gW|U^~c]}P6Ǡbi̋SL{|,T@, !,&!-.)`Y # ##_Y# `Y ?+?+3/99//+9933331032673#"&5?4&+732654&#"'!2-i^rNP+W@l:峥{HgdeݪHDd]]pu=UiN)P@*' ' *+PY $$PY$ PY ?+3/?+99//+993331072654&#"'>32326?3#"&54&HdR,&ĭNUmtJW`n!'(.ɴb`EFuNvJ  }kaeԭ`Wh&R@+" # #'(`Y"$$_Y$ _Y?+3/?+9/+9933333104.+73 4&#"'!23##6;|cGs>nĸv0nOH JV& ^ow=UW`ys/u.hN$S@+ ! &%"!"!PY"" QY PY ?+3/?+9/+9933333104&#"'>323##7654˖dR,&ĭ_s wiP2 =EFuq kc1:.THbt%H@%##'&  `Y _Y _Y?3+?+?+9/3933310! #"'7326!32673#"&547bPx:$Gph nd~NP,Ͻd 5;Z]6efe߯7nL:%F@% ' &#PY# QY PY ?3+?+9/?+393331046! #"'732>!326?3#"& qboWD, !$&;B^VOh| '(/׹=EjG:dP+UWؚ?@@# _Y `Y?+??39/9/+9331032673#"&5467!#3!}nd~NP,Ͻ-MttZ]6efe߯GsT"/:;@  PYQY??399//+?+93310#3!3326?3# 4675_ҴYYTNh| '(/׹ :6dR)UW/@ue*B N$7@ _Y `Y?+?9/+39331032673#"&546!7!Zkd~NP,Ͻ c/efe߯&V*"tM>V@04:*-&?@7PY71!PY14-)&)& PY ?+?3?9/99?+?+93333310326?3# 4?654&#"#654&#"#6733>32>32PRev!'(0ҵ+LVr v|LVq!vIfyPj/!QY*>J܁-KOzw7KOS_ )rZwqiE_BPR"MgW=@  _Y_Y_Y?2+?3+?+33333910"'73267! #"'7326!`946=T x:$GphQd 5;W:=@  QYPYPY?2+?3+?+33333910"'73267! #"'732>!tM4*(;<boWD, !$&;B^W O\"jG:@e}4EWeMT.:f5:Z!@ @P`/]]29/3310#654&#"#7>?3 f %33 e UIg<1G .6/1W\ ^^ @3"N #(@ @ H!>?3+]q223104632#"&74632#"&4632#"&. ".." .. ".." .. ".." .o -- ".." -- ".. .. "..N >?10#7'7'7wVVVVVVVVVVN "@ @ H>?3+]q2104632#"&4632#"&;. ".." .+. ".." .o -- ".. .. "..N,@ @ H>?+]q23331034632#"&4632#"&HnG. ".." .+. ".." .Nn! -- ".. .. ".. /2103"&547aXRHOjvp#&-X\ >?10'7\wP""@    >?3299//3310".5463232654'7#"&'./ .+)&,YKi?5# 0-)(*ZH6P$291/0HJ.N\441//HJ.O[?210654H3]YN!ENmxm5s@P/]10#'73Տ@ /3]9/10#72674632#"&˜f. ".." .Rji\ .. "..N%>?210>3"̜fNmg]N%ZN% >?222310>3"!>3"̜fJ̜iNmg]mi[;)+7#//))5#>/ >?3]2?3]2104632#"''7&732654&#"'#"&546324&#"326-~Y[~|];-XRXy7'(:<&$:XRX-;\}~[Y~y:$'<:)&8RY~}ZY~XTX/<(89''98(?3]2104632#"''7&732654&#"~Y[~|];-XRXy7'(:<&$:RY~}ZY~XTX/<(89''98N@  >?]29/310#"'#3326? iW#d?e 00 2Xf fL -72N@ P`/]9/33310#7&5473326?3}fld!)0/ e\mX"&0511# /210!737#>)#j7@P/]10#'73׏; /210#7267;ɞfRji\ /222310#7267!#7267w˜f˜fRji\jh] @/]10?'% )3P3L%NN >?210654H]YN!ENmwn5;)/  >?3]210'#"&546324&#"326XRX/:[~YXy:%&<:('8R;0XTX}ZZ}|[(8:&'99N#NO_>?]10#'73D׏NNo@ _o>?]310!737o>)j /2103"&547_YRHPjwn0fP""@    >?3299//3310".5463232654'7#"&'. .+)&,YKi?5# 0-)(*ZH6P$291/0HJ.N\441//HJ.O[!KZ;gy!ϒLb˪=g2m /10##?#7!X l/͠k'  :9?2?39933103673##>7LJA@`x {L`<â@]tWlc#!m^ ;' A @Y :@Y9?+?+3107!23!7!654&#!yk j~!Qa۪'UB]\$ @Y9 :?3?+93102##7>7.+7yp5X[H.CF/K[}*F=P!O>vz\>$H@Y9:??+310!#!7!#7C! !F# @Y 9:?3?+9/103#3654&#!7!2!c4\]U]1H:9??103#55q!@   8:??3339910'#>7%7'dA7$ kg$% 3I=Zj sH @Y 9 :?3?+10!654&#!#!2͸c4\]˝Qa1'A @Y89 @Y;?+??+10"&5473324&#"7632DHP1p2#Zow9XCTMngqaed#=JU$F 9?]]103#5}{@Y9=??+10654&#!7!27y!yRUB\]Qa" A @Y 9@Y:?+?+10)7!26?654)7!2)!D)!@1_kMZbR)!A <@Y96??+?3104&#!3!276$jcguT/ðB)TyNZ`JfQH" A @Y9 @Y:?+?+10)!2!654&#b߬j˝PdR'`7\] 7A9:@Y:@Y8?+?+??93102!7!654#" #673>{ Vׇ݆\>Xa߳vWb{n=9??103#5Ƹ" A @Y 9@Y:?+?+10)7!654&+732!yfAN!}}9=LB2p^W % @Y ;@Y9?+3?+10#7!2 #"&54732>54&#N V0nGeu?~!djU /]mhb%jW   <9?3?39910%3637 N]i%Lh&( @Y  @Y 9=??+9/+10#654&#!3!!2~D!RR[<]\Pd34@Y A @Y: @Y 9?+?+9/+104&#!3!!2 #!7!26?6߉C!RK\!.Jqf_XS\9=??39310#654.'3>?3N >h\62FP>0>8ϑ~?F"-h' 9@Y:?+3?39310)7!3>?3P W^$B=+Tyb!"ۍ_$P' A ;@Y9=??+?39/10#!276$54&#!!ͼ)g|b]T\R@Y9:??+10!654&#!7!2y!yUB\]Qa1:B@Y  9 AY:?+?339/_^]]+103 $67337>7%^.CY}ch,CTVrm'S3_ >{(@Y9 @Y :?3+?+310!654&#!+73267#7!2ŋ~q#k !gky![<]\YskHl1H&& F&  9% 6?10#3Ê{96?3210#3#3Ê\{{}: -@   PY/   ?3?39/]+3910!#!#3 }3l`)J5:3:_@6   PYPY PY    PY?+??99//_^]+++3339333310)!#!!!!!!#2K@b>?CX3\VL:K=N/<D@V!""5'D0D >,,DFE0QY/=PY')0/ 0/0/) )APY)!! !!%%PY%8PY  PY ?+3/_^]?+?+3/_^]?+99//99++93333333933310674&#"'>32>323267#"'#"&54677>54&#"32672{yW,Gԕ#a_M|/g|ΓM]Nesvo{"C#N[X?wLUbTXк0{"6kOM\YVH|D +h@7 $$ ,- PY+  'PY PY ?3+3?+9/_^]33+33933333333103##"'#737>3232654&+72654&#"}=Tzz,Ѱxt\\} HP7[)ÊdlQFmbAL8CNF#/:(@  PYPY?+?+9933103!2!4&+32#hЧ:"/: T@+   PY PYPY?+?+9/_^]3+399333339103#73!2!4&+3#32#_YhЧ>CŠ"#: E@%     PY PY PY?+?+9/_^]+393310)!!!!!;>$Cd:N&U@, $$ (' PY PYPY?2/+?+3/9/+939333310"&'732654𑯎&#"'>32(q{dR,&ĭNUh|z,i`]]b`EFuNvJ  `n:+@ SY?+?33993310#7#""Ҵ欬 :0:,@  PY PY?2/+?+399310"&57327#7!N@*w!$dZc"V:: ?@     RY?+?9/33/3999333310)?37!DNdJ K Z[|"U:,@    ??33?33393310#67##!67Uҭ% " T 7G_:UG&1:I@#: !@     ?33?339103#67#s,Ҭ0:^eP:C2MRN$1O ,@   YY/+/+9933102#"&54$"32>54&tYģètQcu$j@@   YYY/+3/+/+99399210".54>327>54&$SX*|ySl8!Hiy" K}ElrU^'K@!%)( " Y Y/+/+99933339102'#"&5467'7627">54&=;b!HF[!o|Y48;iL-/iHeTuG^I,NtM,,EuEAN!-5s@> //."5(567!.PY !! 2PY$PY*PY  PY ?+3/_^]?+?+?+9/99+93333333310654&#"'>3 6!2# '#"&5473265#"3267g `-J i߉eLyYY}z%C3>^U?vʸ]dμid*wH|:-E@$' ./#RY  *QY ?+?39/99+933333310#"&54>?.5473324&#"32>zixhΗWm^l 0^Z]U~F^]W|B:xnvowe$(1)YjW[\eXJ1M&@ PY ?+2993310#"#676$32#6w^~\: 4 =}?&(73#"&B zob+C8F8Y": .@  PY  PY??+9/+93103#!2#!!2654#ִΝgLz:zj:C@!   QY QY  ?3?+9/+39933333310 #.5463!##"3!1Z:ҴY`ᝆeQ6OsGclJ[(: @@!   QY  QY?+?39/3+933333103!"&54673#";Y\ɣpƕ6}oj!:)@ QY?+3?39310!!#!d:Ih:wXM@ @Y/  Y /3/+3//_^]+399333310!2654&#!7!27#!l#*!-9Oq m~\X Z@   "! Y Y/+3/+99//333333993333103#3#!2654&#!7!27#! l l#*!-9Oq-m~\Y+{@''+ ! -!,++Y! !"@Y!! !  @ Y P `  /]]3/+3/3/_^]+9/+3333339933310!2>54&#!7!27#!7!2>54&#!Nl9"*"-9O8rcXr!l:|1oDdwST\SqS1qBcxpb:Yf5:Z:]:O@(  PY PY PY?2/+?9/+3+333993333310 '732654!#7!7!t+$v#kb-ue) y$O%^@0$  '& @!!PY PY?+3/_^]?+3/9/99933333310"'6!2#"3267#"&546?2654akHD;}hedu#(êǽFP0}#oTPLCHV8v}yj[UfM(:@ %% *)!PY! %PY?+?9?+393310"&'732?'.54>32327#"&/Hu2_!ҸboWD, !$&;B^jG: #@  ?3?39/3910!#3!&.5XH!V= !eAlAEN@*    ? O   ?2??9/]33/333393333310!#!!!!!#!8A<&BZ6!trtu`B@!  ! ?O?3?39/]393333393310#!!2%2654&+2654+{[qi^Zp{ZX<}D(nfco^TE;4me[$D@ $%  & $#?3?39/333333333393333103!23##!#2654+2654&+r^Q[f8{Y^}D'sxZX<-nfGx8UmeZSE;T  @ ?3?3339310!!24&+32><۔]u<¹`KT 2@    ?O ?2?39/]3393310!!!!!T<%Bitrt> 0@ ?O ?2?39/]33933107!!7!!7!>iB%<tRr6ti"2@  !/?2/]2?39/3333993102.#"326?!7!!"&54>*'xb|i[>"DTr|.`H73wչrZT( .@ ?O ?3?39/]33910!#3!3Y YQQ6^T@ ??339310#3: &@   ?2/2?33399310"&'73267#7!8xH6CaqD<\Mb`GtHT  -@   ?3?39393310 #33 ڈI^`dBT@ ?2?3993103!TtT)@   ?333?33?3391067#&'#373#9"dx yB}P}>\/biR.UP$ (@  ?33?33339310 #3>3_ 6l[;P$ $@   ?22?33391033#67P mu7y;XKe< @ ?2?3339310"&54>324&#"326R҄S%}ggֽoZҹsZmzYf+6@",) -%?3?39/3993339933102673# 4>7&5473"32>54&SzjXE>_e.(Z`d(@   ?333?3?33910#'7#3?33*4*F&.3. kM{\puiK9(4J@$"- &5&6* $00?3/33?39/939/393333310"57##"&546?654&#"'>3232732>7|>zVdx΢JBQW|v 48 ,uA9ClJ l-[Ew[I?>;>h]p`&I%4O XR4D8d4U'3X@,!!(% 4, 5 )@ H))#//?3/33?33/9/+9333339333331023>32!3267#"&547654#"767>54&#"|>zVdx}JBQW|v 48 ,uA9ClJ l-[Ew[I?>;>g^p`&I %4O XR4D8d4B!4@ " #  ?2?3??99339933310"&54632373#47#'2>54&#"*pxVx0}tx2q/^v?[LWc;ۇs~"OB>bl`\^h[:*7?v@= #7??77(0@9((A<% ?@ H??!, #!!3 ?3?3?39/9939/3/+39/?3339393333993103267#"&'#"&546?654#"'>32632%32>7%74&#"=da3fjewӧ TZ|"FX ign<3]Wxo#4@ "% $  ?2?3?99?3333339102#"'##733>"32>54pxWy0y"}: 2r/\x?[MVc;siy?$B>bkb\^h["/@!# $  ?2?3??9939310"&54632363#47#'2>54&#"npxVx0G~x2q/^v?[LWc;ۇs(q"OB>bl`\^h[r(D@$  /?O  ?3?399//]]3393333103267#"&54>32'74&#"?m$a6kcqo`N_MP>@,_R}R>a3]Wxor(6@ !  ?3?399//33339331074#"'>32#"&5673267An"`(SuPdpo`N_PA=,ED(}Z6a3]Wxo#'H@$ %  () !! H ?33/?3/39/+393399399310267#"&54675.54632.#"3"#Jp1>D^uzf9JX{(^M5EPn=E<80JD:r`Vt U:ek6B<-'@7qcA93A!$L@&"" %& @ H ?2/2?33/9/+39339939932310"'732654𑯎&#"'>32.%rNSmbrC8}pkmuWEVܳtKCG<_EC11edRfQQkaEl:E!.C@$"/0 $/$?$O$$$+?22?39/]93?393332310%"'7326?##"&546323>7332>54&#"L%rek@!!* )$  ?33?99?3?3339333310654&#"#733>32>32#654&#"V,;QvR}tv4fG:sF [|V,;QvRT'48sVXQ?\GN)T'48qT",@ $# ?2??9?3333910%"'73267654#"#733>32--*( e }WS}tvga#Qmao. @  ?3?3329310#"&54>324#"32>._a~_r>XWcn<̂~td[fokP0@  ?33/?3/333933310"'632#"&'732>54Ď32#6PdCɨ Be̚044o&h@   ?3233931047332>73#"&oXWP`Cɩ1&*/foAgͦ %.@ $'&  ?2??99?3333910"'##?33>32"32>540F}t2rSpxV]v@[LWb<܋;c9 QB>skc[_g\0@     ?22?33/339933310"&547#73733#327;D XWYIT!W ?( ?H; <]]:*> ^[-@    ??3?3939331032673#467##"&546AX }WS}sv;uOghb9I!uv^R=ga*`f(@    /]33/39933310!2654&#!7!7#!xsloc`GcV`JU{t@|K+?@ !$$, -+ '??3?3?33993933331032673#7##"&'#"&54633267W554&8ru\MdƩ`)} -n-t1rl\dnH|ifxWBc${pRcded">54[m8jl6s6Qk6PPLwb/@Lc|@bӎI^g[ap]VhenkK1@   ?3?33?9339310 #'.#"'6323#F$ 00(1#9z-Fe5 X@_|x'x.3ksx!xs{N'I@" %!!)(!!" " " /2?99//33339333993333102#"'##"32654>54&qp\R[|` 4z~-k(r3o~g\bkG~gf{RBHf&{pPeded3#67N )oO7)Mr$(T*`(D@!*") %%@ H%%/3/99//+9333339333104632#"'32#.#"&4#"32>-MĞ_I._lUq0w[_r>XWcn -**6%==@A!(!PY*(@PY$ -9PY1PY?+?+?99?9/+99+99933333333102#"&'##67&#"#>327332673#"'3>"32654&蝯{߭{ &)'% z]"#%p` ICcb8qzV^Nh^0/ouj /0rr w?M_VQa}I{|E/>x@0<5&  ,*?!!@- *$@ 8PYH@ H0PY?+?++_^]+?9/3299//?9939333310"&546323?&#"#>327332673#"'#47#'2>54&#"{߭{ #'% z]"#%p` IBcb8q|R^}h^ 0/ouk/0rrDR3m_VQa}{{|-p@< $,,/."'PY$"QY  PY PY +??39/+99+99+3?3+33333933331032673#"'#&#"#>32#737>32&#"3N#%p` Q]'% z] $BJ2HBCn/0rr`0/ouPz H\aM3@K@V2>CE./,47(!!4/EC M L:PYHPY2,/4/QY$4KPY >C4K' 4K''K4 .?33?9////99993+33+399?+?+3933333333333310!$'###>?6733>32>327673##&$'>'4&#"%654&#"TۈbaE^+IfyPj#DhA@mM-LVr *'LVl%; Pew_ )rZwqi@d"~H 5tp KOO9 ;1KOM*6j@:)/22/  %%8 74PY(/PY!/  PY+% /%%/   ?3?9////93+33+3?+33933310!.'###>?6733>323673#>54#"A?{vq7_aWo+Ss#YpA\D, |M */, Wc_ )sY@d%|up?> KW1N1@t@?7 >.. $' BA'++2PY+#PY   PY@ :PY?+?9/+99+99??+9939333310"&'#32673#"'#7&#"#>326733>32"32654&*{ -#%p`! $'% z] Iw{&cb8qzV^h^ m /0rr x0/oușD q%_VQa}I{|pN+j@7%$ ++-,PY   PY@ %)+))RY)#???+39/9+99+993393333310&#"32673#"'#&#"#>32?33>32,.HyY#%p`"?K'% z]=#BT'8 eol /0rr 0/ou5r݅lpN%]@0# ' &PYPY @"RY??3+9/+99+9933933310"'#&#"#>327>32&#"32673V ">K'% z] 'C/ "<~ "#%p9 0/ou /0rrK7\@-)63" 89 60)2 22 &QY##  QY?3/+?3/+99//99999999333333310#"&'732654.'"#>7&5463 .#"3273)!u/MB80B gTb,zg|OhMBf3TQG!=u~8XPa].+&P:/W~2BOFOH9I""NNj8,/@B--)& !1 0QY$PY& $@PY .+PY?+3?39/+99+99+33339333333310"&546&#"#>3#73733#32673#"'327Ua1'% z]'<}ix/I$#%p`#$Z*:cfT90/ou6 /0rr 3X:!o@= #"PY  PY @ PY  PY?+3?9/_^]3/+2/99+99+333910#7&#"#>32!7!32673#"'!,w.!'' {]Dm:89)!2uaHx 0/pt<2.rr$U'K#2M@'$4+ 3'PY .PYPY?2/+?3/+9/99+333393310 &#"3>32#"&'##?>4&#"32>S6#ǎ!">_wMKy$0diflapZxR8K*YN*ɦarZ% R;y}JO! -@ QY? /2/39/]+3910!#3!3??ww9X9xC(3W-:"0S@*.. 2''1#PY  *PY  PY ?+3?+9/9+333993333310.546?!7!#"&54> 32>54&0$9@%".DPD.M~Ph= }Y6!-F-!5AOe~PhϞPڴj֝R5/zmu{6@J0 44/.$''  87/0.$)PY QY @ 52PY?+3?3+3??+??933992233333333310"'#7'47#73733#33632#654#"#327?1<~}ix/rIT +4~~ v_9*:c E$7KzQ/Y @dsX>": : W|N!*3n@:( &&/11/% !54 &!!PY."PY +PY ??+?+9/33+3399?393333333310376733>323##"&'###267!"!654&.i/ IwRN8{ ^i* *&^iD q%_VF=h^ l38}R?${|N: Z@0  !" PY PY?3?+9/_^]33+33933333331033!33##"&5467#26?!*hZ[ZZee&öhЀi//{;lXl3 :"+m@8&  ))"-,'""PY #PYPY?3+333?+9/33+33993333333333910367!7!!.'7!!3##"&547#267! ]QX2MRHPE_L% J i(wz'_Rӷ68ʟH!{W4%4Z@/+" 256".PY RY &PY?+?3+?+99?99?93333333102#"'732?#"&'##6733>"32654&蝯k]-JC4>y?9{ &)S ICcb8qzV^N`陏l h^Y?M_VQa}I{|EW"1X@0/(23 RYRY +PY#PY?+?+??3+?+9993333310"&546323733#"'732?#47#'2>54&#"{߭{ RY7JC4>yNIBcb8q|R^}h^䙏s3m_VQa}{{|^W"W@/!!$#PYQY RY RY?3+?+?3+3?3+33339333103#"'732?##737>32&#"3T7JC4>yVJ2HBC䙏sz| H\aWjM3Bt@>40 ;)/## CD"0PY "">PY)','RY,,7PYPY?+?+99//+3?+?9/99+93333333310 '7326?##"&54>323>73!#"'732?!32654&#"6#ǎ "9awPKw$r8~?@34j0iflapZxR8W*TQ,ˤ4an^% YiΑfy}J"WVG@'  RY   RY?+???9?+3933333102?##3733#"'77yH it7JC4s|kE/2䙏yX 䙏s"WKM:g@8)033/#"" ;<00"RY0',RY)'6PYPY ?3??+?+?3+?+9993333333310!654&#"#6733>32>323#"'732?#654&#"|LVq!vIfyPjab7JC4>yb|LVr vzw7KOS_ )rZwqi@d䙏szw7KO"WM(H@) && )*#PY#RY RY?3+?+??9?+933310%3#"'732?#654#"#6733>32Z7JC4>y]~~ vSs䙏sX>S_ )sY@dW1N&5O@-%3 ,76"RY%'PY /PY?+???+9?3+3933310"&'##6733>32#"'732?"32654&*{ ^ Iw|q&JC4>y%Tcb8qzV^h^ lD q%_V\ǙfQa}I{|:WN N@( "! RYRY RY ?3+?+?9?+33399333310&#"3#"'732?#?33>32,.HyYPS7JC4>yU#BT'8 eog䙏s>r݅lWK5T@,'..""76.%%+QY((%QY RY?3+?3/+?3/+99933333310#"'732?#"&'732654.'.5463 .#" FJC4>yq)!u,WDb,zg|*OH=#2't8XPa]*=1,*PkGOFOH*:--(RpW)%Q@+"!'&RY"PY RY RY?2+?3+99//++33933310"'73267>32&#"!#"'732?!vP@92K\%MF <2.8~?@34j'$Wk~Α˸pVb:C@" PY RY?3+?+3?3339333310%3#"'732?!3?3J6~?@34je ]ċ䒇:@Dt55W<:S@, PY RY?3+?+9/??393933333103#"'732?## 33gq5I@2=v!^.]씌|D,[W:H@&  RY PY  PY?+3?+3?+339333102?!7!7!!#"'7y.84JC4s&.VN5C{@B6"''/""/</ED7QY  P PY ?PY )QY1RY?+?+?+?+3/_^]]9/9+99333333339910"5467&57##"&54$%7654&#"'>3232?32732>7,S~ "j^wz-߼J Q/a,)3wK+aMafV6@~eb[WUW@]0(I` %9W>K^SMEVM$3\@0 *  154"  PYRY -PY%PY?+?+??+3?+9999333339910"&546323733327#"5467#47#'2>54&#"{߭{ !3a,)3)IBcb8q|R^}h^Q` 53m_VQa}{{|EWo+:W@.81(%%;< ""RY"RY) 4PY,PY?+?+99?3+?+339333310"&546323?>32&#"327#"&547#'2>54&#"{߭{  }F7/ ?H_84EAgu 7IBcb8q|R^}h^\e] vi(0_VQa}{{|EV'N&.U@- ($.$0/.PY..!!+PY!PYRY?+?+?+99//9+9333333103267327#"5467#"&54$32'74&#" ^1Ea,)3)#oߎy%89ZY?` 7;?ϻidH|"VM6j@6/ '&& - 487/0/0PY//##*PY''#PY RY?+?+3/3?3/+9/+99933333339910%267327#"&54?#"&546?.54632.#"!"aOi<a,)3)ku dSjо|9)oKcsHMgt@LL` jl.33{ySM^T?8\M,`JKZVN5l@833/ %++7%6/PY($$(("PY( RY PY?22/+?+3?+3/9/+93339393310"'327#"&547732654𑯎&#"'>32_"a,)3)ku E(q{dR,&ĭNUh|G` jl.3],i`]]b`EFuNvJ  `AW N+3j@7--,3 )#45$&&!RY&, ,PY  PY0PY?+?+99//3+33?+3933333333310##"&547!654&#"'>323327#"&54732675 ~_.Lٛ bB+@?my ay%μid7:\W?s4.\2arh(AH|!VK@(   SY PYRY?+3?+??+3393333310"5467#3332773fҴu3a,)3p""V5:Q` ʬVN(O@('*)RY #PY  PY?+3/?33/+?+3333399310"'!2#"&'327#"&54773265,TyHΑ]{+# a,)3)ku Ql[V1C.-)` jl.3ai& 6V)"=@ $ #RY RY RY?3+?3+?+3333910'3267>32&#"327#"&546(#J]%MF <2.#a,)3)kuko` jl8VVi:*S@*'  ' +,! *$PY$ PYRY?+3?+?+?39993333333310326733327#"5467#467##"&547~~ vY3a,)3)\Ss:{X>^\` 5 )sY@dVO:)p@:' +## *PY  PYQY(%RY?+3?99//+33/+3+333339333910"547732>54&+7!7!#"'3273ya[LcsInf-#.V'_ yN[jfU tI b f)$2@ %#& ?2??99?3339333310"'##6?33>32"32>54ɤ/yqr1oQmtSZt>YKUa8ی}_Q6 RB>sk^[_kT*@  ?33/?3/339931027#"&54>32.#"9jR߃Z}p yCCVi;A#䜉}vk?O^kC"-M@( + .& /(+ O #?3?3/]39/933333933310"''67&54>32.#">32'2654#"uPDO56&[|pxG?Vi<Q?PZQ^LI9o,[@-** # .-&??3?399//999399399393322310&'37#"&54>32.'7"32>54&2Sx-= sMFYWv3` ;*kPi7VOYk5b2<0HL/]xyqb&$L1OTLN[c`N>WI$\@4"" %&   /  Y`?2/]2?+3/_^]9/^]393393310"'732654𑯎&#"'>32W$sLTlcqD8|qtnuXEVܴtIEG<^ED11e\ZgPQlbEla4@  ??339/3333339310##737>32'"3~{~ghh\3">4* c]WmXa;7G]4@   ??339/333333391033##"'7326?#7V{Vgg0iZ8!11 -\jZa4>\NYmJ.@   ?3?9/93393310#"&547332673#7]8qOeeV{U yVQyz3 P@ga(L9A(vt+ G@'     / _  ??9/333?]33393333310#7333#73A:PQCzCRR:3z8]e]yyAJ@ ??3393103#zzAJ@ ??3393103#zz+Y 2@   ??9/3333333339910#7333#A:PQCzCRR:8]e]kF@' /_  ?2?9/333?]3339333107"&546;33#'267#"73N`s/{^],&.@EV{VN^kGbdDc8.Adyy!u @  ?33?3299310327#"&547uA*(3AU#B o NO#f~.@  ?33?9/3333393103#"'732?#3<&k`1.#*R32>32#"'73267654&#"T3;NsPzqs6bCS` 6pF\cf`P+- )' b3;OrPJ067rVX_To)?@  )' *%%+'$ ?3?3?3399?39333310#"'#"&54633267332673#75dB5pG\cayT3;OrPyT3;NsPzz8kS533>32V zUa`O+- )'  t9sLdfWC'vso^ `;A5/"_R>ga+I4'7@ $$)(!?33??9??333339310327#"&547654#"#>533>32H?&#1*AUf zUPzpt9qNdffoB p NO!C'vsUX#oR>ga&N<$@  ?33?3333931073#&'#> \sg as.F?8. >@" _ H ?3?39/+]339332310#"&54>32!32>74#"!7.]]zbVTJ]Dft~~u7hn;zy/!E@$    "#  ?333??333?339339210%.54>734'>7bqVn3o4knSy6#loJ\5PgoC]6&}{yxw " nj%O f4E@".#( #65.+&))& ?333/3?33?3/39933933310#"'327#"&546732654.'.54632&#"|GF $ (NT2d[Vae >XZT. oS\!>Tygr|1:rMH '8>F@,#7K2foi83+!%jo@  ?22?333310'"'7326732&#"5-,5>/6.'$f uoMW/t̄vc ?@   !?22?3?33339339333107"'73267"&546#73733#327*$.,9CXUVGR U=(lHiG<9\\9C> Ͻ%]@/$&!!'"@ H  ??3?39/+9333333333339933339910!33##467##"&547#732>7!">V>{>IJ! s8qPdfII>:gD H^d> [P@ha{^HYC{Ch#vjj0;@) . 1$..2&# ?2?3?3339333333310"&547>54+73232>54'&546;#"Z:18N4C'(P`VFsB\KR8#"ܒ{}mF-(bC4/V1aeObJI)GH'TYb(/8F-<$@  ?2?33393310 54733273<T}] ID&]{\:K#-(3;'E*@    ?3?33339331032654'3#"&547R y^zt NK2)hb`g{65 "@   ?2?333993103#&'#F SI^+ 0@  ?23?33393323107!7!!+`8b`b=@   ?33?33?3333399333310327#"&547!7!7!!`5!1;Ng0!h8q HK|`8baɳ9m I@$  !" ?3333?9/333339333310>32+'7#7!7!%"32654&KgAESqw0 V5g0,U-j6GLaOA^\D9+Ra7b`ȁI8%* @@   ?23?3/39/33339333310!# '732>54&+7!1exatuLuAi[79O~pngRIVde@ <@" ?O ?2?39/]3393323102#"&546267!"!654&Hjv~n,b*.b~*}?{z:qKkqMea) @ @ /9/3/1073?373 X$$@##B%!') @ @ /9/3/1073%7373'=$$##!F%xNc,@ )/3910"54>74.54>54#"7632%,&$(1(-)5B;^$,& '".&N9    0!4!   A /32/310#"#"&547332>;"8gho@]k+94bfqC#Z%-%eV $<(0(2 /310!7!%9h] /310!'7!U:ԔlK /210'!7!WVԀU /210!'%!++WTl!@ /3/32/310'%7%!RRAmzzm)/3210''%7(H(Ԁmzzm7Wx /3/3910733>3&#"7 T =2$8 '%+55?&%d@ !&} %+5+54&EM-&+5?&%  %+54&E i*,%+5?&%3! %+54&E+-%+5qR&&'zE6&+5Ci&F'zv2&+5?&'@ &n%+5+5E&G*&+5?&' 5%+5E&G "')%+5?&'7V%+5E&GD(*%+5?9&'52%+5E9&GG(-%+5?X&'Q"%+5EX&G-'%+5?i+&( @ &%+55+55E'&H'C!%@%%%%%%0%%!&+5/]]]]q5?i+&( @ & %+55+55ED&H'v%@******0**!&+5/]]]]q5?Xi&(N %+5EX'N&H~'!%+5?Xi&(1^%+5EX'N&H)4%+5?Wi&(' z@ &+5EW'&H'z!&+5?C&)@  & %+5+5E&Ia8@ & %+5+5e&*'P@ !&!# %+5+5WaS&J@ 4&Z46%+5+5?&+@ &  %+5+5"&K?@ &%+5+5?&+ J  %+5"&K 5%+5?&+ @ & %+55+55"F&Kjmj!&%+55+55W&+zW&Kz]?i&+lS %+5"i&K$%+5X"&,H %+5X&LA7%+5Q1+&, 4@&%+555+555Y; &&jv(@o&+55/]q5?&.@ &  %+5+5"V&N@ &  %+5+5?&. K  %+5"V&N -_  %+5?&.DU %+5"V&N %+5?&/ %+5&O >%+5?x&/' P &+5&O' j&+5?&/ʹ %+5&O[Q%+5?X&/ %+5X&Ox %+5?&0q@ &%+5+5"K&Pv@ 3&.1 %+5+5?&0P@ &%+5+5"K&P@ 1&.0 %+5+5?&0 aZ%+5"KM&P X.0 %+5?&1@ & %+5+5"&Q@ & %+5+5?&1 a %+5"M&Q > %+5?&1SQ %+5"M&Q %+5?X&1T %+5"XM&Qj" %+5o+&2 6@ %&%2 %+55+55Cb&R'v3@#6666666/66&j%0%+55+5/]]qqr5o+&2 7@-&-: %+555+555C2&R'j!AK@5_66?6o666/66_6o6?6O6666&j%0%+555+5/]]]]]qqrr55o+&2 @ #&l#% %+55+55C2&R'CA1@!!!!!!!0!!&g %+55+5/]]]]q5o+&2 3@ %&% %+55+55C>&R'v1@!!!!!!!0!!&g %+55+5/]]]]q5?I&3@ & %+5+5W1&Sv.&)),%+5+5?I&3d@ &a %+5+5W1&S@ ,&)+%+5+5?&5@ &t %+5+5"&Ud@ &%+5+5?&5  %+5N&U ɴ%+5?&5' P&+5S&U' O&+5?&5Zx %+5ZN&U%+5:@&6@ ,&)+%+5+5&V@ +&(*%+5+5:@&6 )+%+5K&V A(*%+5:@&6 x2&#*0%+55+55 &V 1&)/%+55+55:@+&6 @ .&/5%+55+55&V @ -&.4%+55+55:@&6' @ 0&-/%+5+5&V' A@ ,&,.%+5+5\&7~@  &5 %+5+5]A&Wu'@H %+5/]]]qr5\&7 iʹ %+5,&W  %+5\&7Ҵ %+5,&Wx %+5dX\&7%+5iX,&WG %+5W&8%+55VWJ:&XN  %+55X&8;)%+5XJ:&X@$/ %+5X&8 %+5AXJ:&X>" %+5+&8 @ &y,%+55+55Vo&X' v'@6666666/66&+5/]]qqr5+&8 @&%+555+555VJu&X' j9#@O$$/$$$?$$&+5/]qqq55&9 l@ &D%+5+5pb&Y@ &'  %+5+5&9 Դ %+5pb:&Y   %+5.&:& %+5+5f5&ZC&ִ%+5+5.&:@ & %+5+5f5&Zv&@ &t%+5+5.&: o@ & %+55+55f5{&Zj@ &)%+55+55.&:@ & %+5+5f5&Z@ &%%+5+5.&: ش %+5f5:&Z %+5&;@ &  %+5+5<&[@ &  %+5+5&; L@ & %+55+55<{&[j@ & %+55+55&<@  & %+5+5Wg&\@ &%+5+5&=@ & %+5+5&]@ & %+5+5&=  %+5:&] ( %+5&=} %+5:&] %+5"&K%+5]G&Wj@  &F %+55+55f5s&Z@ &-%+55+55Wgs&\@ &l%+55+55.-&D@ B&B? '%+5+5!&Aa8@ &%+5+55H%R@+ ## &' `Y _Y_Y?2+??+9/9+393333310"'732654&+7.#"#>32p)v|Iy)\i",Tz#)mfc5?[&^%+5+5.- &Di@ F&;A '%+5+5+&$ &%+55+55.&&D D&D9 '%+55+55+&$ @ &%+55+55.-&&D @ F&3;@ '%+55+55Q+&$ %&p%%+55+55.u&D @ O&O: '%+55+55+&$ D)#%+55.L&D @ @&@W '%+55+55&$' Q&+5.-&D' A=&+5+&$ &K%+55+55.[&D @ >&A; '%+55+55+&$ &J%+55+55.5&D @ >&AH '%+55+55+&$ r&="*%+55+55.2+&D @ J&MT '%+55+55+&$ &V"/%+55+55.T&D @ Q&TM '%+55+55&$'  &+5.-&D' P8&+5?i&( { %+5E'N&H Ay!#%+5?iJ&( >@ &%+5+5E' &H`@ /&$*%+5+5?i&(K@ &%+5+5E'&H@ )&n)4%+5+5?+&( &% %+55+55E&&H @ -&-"%+55+55?i+&( @ &C%+55+55E'&&H @ /& $)%+55+55?i+&( @ #&#%+55+55Eu&H @ 8&8#%+55+55?i+&( @ -&'!%+55+55E=&H @ )&)@%+55+55?i&('  a&+5E'&H' A&&+5QJ&,z>@ & %+5+5"U &G@)@!!H@H@H@H@H@H@ H@ H@ %&+5+5++++++++"&, I%+5&L E %+5o&2 Y %+5C2M&R At%+5oJ&2G>@ *&% %+5+5C2 &R]@ +& &%+5+5o+&2 @ (&( %+55+55C&&R @ )&)%+55+55o+&2 @ (&'" %+55+55C2&&R @ +&- %%+55+55o+&2 @ 3&3 %+55+55Cu&R @ 4&4%+55+55o+&2 @ =&71 %+55+55CN&R @ %&%<%+55+55o&2' Y%&+5C2&R' A &&+5oS&b%@ /&;*- %+5+5Ca&cv@ +&d&)%+5+5oS&bE/&}+. %+5+5Ca&cC+&'*%+5+5oSJ&ba>@ 8& -3 %+5+5Ca &cO@ 4&)/%+5+5oS&b 3&ٴ3> %+5+5Ca&c .&.9%+5+5oS&b c*, %+5CaM&c a&(%+5&8 %+5VJ:&X = %+5J&8&>@ $&{%+5+5VJ &XK@ *&% %+5+5/&q@ $&"%+5+5V&rv@ ,&M'*#%+5+5/&q2$&g #%+5+5V&rC,&@(+#%+5+5/J&q+>-&Ҵ"(%+5+5V &r:5&մ*0#%+5+5/&qK'&ʴ'2%+5+5V&r /&д/:#%+5+5/&q k!%+5V:&r ')#%+5&<" & %+5+5Wg&\C@ &,%+5+5&< Ǵ %+5Wg:&\ 1J&<>@ &. %+5+5Wg &\@ &&!%+5+5&<K@ &%+5+5Wg&\@  & +%+5+5F0&cd@ /&#/*%+5+5F0&cd@ 1&3*%+5+5F0&cd5&5*%+55+55F0&cd@ 6&8*%+55+55F0&cd@ 5&15+%+55+55F0&cd@ 6&F8+%+55+55FJ&cd@ /&L=I%+55+55FJ&cd@ 1&L@L%+55+55&$@ %+5?5&$̝@ %+5?5'$,%+55?55'$,@  %+55?55'$,%+55?55'$,@  %+55?55'$,!!%+55?55'$,$$%+55?55"0&gd@ -&-( %+5+5"0&gd@ /&1( %+5+5"0&gxd@ 3&F3( %+55+55"0&gxd@ 4&[6( %+55+55"0&gd@ 3&3) %+55+55"0&gd@ 4&6) %+55+55y1'(c %+5?51'(X %+5?5o'(X %+55?55'(X %+55?55o'(Xa %+55?55'(Xa %+55?55"W0&id@ $&$ %+5+5"W0&id@ &&( %+5+5"W0&id@ *&* %+55+55"W0&id@ +&- %+55+55"WQ0&i6d@ *&* %+55+55"WQ0&i6d@ +&- %+55+55"WJ&id$&2> %+55+55"WJ&id&&5A %+55+55y'+b %+5?5'+W %+5?5o!'+X %+55?55!'+X %+55?55o!'+X` %+55?55!'+X` %+55?55u!'+X ̴++%+55?55u!'+X ̴..%+55?55?$0&kd@ &  %+5+5?0&ḵd@ &  %+5+5?0&kd@ &  %+55+55?0&kd@ &  %+55+55?0&kd@ &  %+55+55?0&kd@ &  %+55+55?LJ&kd@ &+ %+55+55?LJ&kd@ &". %+55+55y',P%+5?5',E%+5?5oz',X %+55?55z',X %+55?55oz',XK%+55?55z',XN%+55?55uz',X##%+55?55uz',X&&%+55?55C20&Rd@ "&"%+5+5C20&Rd@ $&&%+5+5C20&Rd@ (&:(%+55+55C20&Rd@ )&P+%+55+55C20&Rd@ (&(%+55+55C20&Rd@ )&+%+55+55y\&2\@ & %+5?5\&2\@ ( %+5?5o'2@ , %+55?55'2@ - %+55?55o'2@ , %+55?55'2@ - %+55?55h0&wd@ & %+5+5h0&wd@ &~! %+5+5h0&wd@ #&J# %+55+55h0&wd@ $&_& %+55+55hG0&w,d@ #&# %+55+55hG0&w,d@ $&& %+55+55hJ&wd@ &+7 %+55+55hwJ&wd@ &.: %+55+55'<,e %+5?5)'<Xe%+55?55'<e %+55?55)'<X %+55?55C0&{d@ 4&4/ %+5+5C0&{d@ 6&8/ %+5+5C0&{d@ :&Z:/ %+55+55C0&{d@ ;&p=/ %+55+55C0&{d@ :&:0 %+55+55C0&{d@ ;&=0 %+55+55CJ&{d@ 4&BN %+55+55CJ&{d@ 6&EQ %+55+55y'[@ 1''##%+5?5'[@ 3''##%+5?5o"'[R7δ''##%+55?55"'[R8δ''##%+55?55o'[@ 7((##%+55?55'[@ 8((##%+55?55'[0::##%+55?55'[3==##%+55?55F&cX/&+.%+5+5F&c9U@ /&d*-%+5+5"&g/@ -&*), %+5+5"&g98@ -&(+ %+5+5"W&i@ $&C # %+5+5"W&i9@ $&" %+5+5?&ke@ &N  %+5+5?f&k9*@ &  %+5+5C2&R@ "&<!%+5+5C2&R9y@ "& %+5+5h&w@ &! %+5+5h&w9U@ & %+5+5C&{G@ 4&03 %+5+5C&{9G@ 4&/2 %+5+5FW0&c'dM@ /&#/*%+5+5FW0&c'dM@ 1&3*%+5+5FW0&c'dM5&5*%+55+55FW0&c'dM@ 6&8*%+55+55FW0&c'dM@ 5&15+%+55+55FW0&c'dM@ 6&F8+%+55+55FWJ&c'dM@ /&L=I%+55+55FWJ&c'dM@ 1&L@L%+55+55W&$&@ %+5?5W&$&̝@ %+5?5W'$,&,%+55?55W'$,&,@  %+55?55W'$,&,%+55?55W'$,&,@  %+55?55W'$,&,!!%+55?55W'$,&,$$%+55?55 W0&i'd&@ $&$ %+5+5 W0&i'd&@ &&( %+5+5 W0&i'd&@ *&* %+55+55 W0&i'd&@ +&- %+55+55 WQ0&i'6d&@ *&* %+55+55 WQ0&i'6d&@ +&- %+55+55 WJ&i'd&$&2> %+55+55 WJ&i'd&&&5A %+55+55yW'+'b %+5?5W'+'W %+5?5oW!'+X&z %+55?55W!'+X&z %+55?55oW!'+X&z` %+55?55W!'+X&z` %+55?55uW!'+X&z ̴++%+55?55uW!'+X&z ̴..%+55?55CW0&{'d@ 4&4/ %+5+5CW0&{'d@ 6&8/ %+5+5CW0&{'d@ :&Z:/ %+55+55CW0&{'d@ ;&p=/ %+55+55CW0&{'d@ :&:0 %+55+55CW0&{'d@ ;&=0 %+55+55CWJ&{'d@ 4&BN %+55+55CWJ&{'d@ 6&EQ %+55+55yW'['@ 1''##%+5?5W'['@ 3''##%+5?5oW"'[R&7δ''##%+55?55W"'[R&8δ''##%+55?55oW'[&3@ 7((##%+55?55W'[&3@ 8((##%+55?55W'[&30::##%+55?55W'[&33==##%+55?55F&c@ *&-4%+5+5FS&c@ +&"+-%+5+5FW&c&XM/&+.%+5+5FWM&cM4.%+5FW&c'9UM@ /&d*-%+5+5F&c@ 2&'2=%+5+5FW&c'M@ 2&'2=%+5+5&$ &J%+5+5&$N&%+5+5&$K%+5?5&$9%+5?5W&$ %+5]I_ @   ?3993310#>7#7_ 13v:3Y&̇D};>gW @  9993310327#"&54?3l$!.'58 p ;3!-nkXLa @  ?399310#>7#7a^v::Y"xm>oPQ@   /323910".#"#>323273S*LF@7B[)V,ME>f&\"B[%-%>9%-%wjg;[8@  /32]2299333933107373".#"#>323273$$$$+&E?:3;S'tL(E?9[$S'qĸ "("84q"("lp W&i'&@ $&C # %+5+5 WM&i& W&i'9&@ $&" %+5+5"W4&i@ '&'2 %+5+5 W4&i'&@ '&'2 %+5+5'(,K%+5?5'(,9~%+5?5'+,K%+5?5'+,9}%+5?5?W&+g %+5I3@  H /+2/99//3393310#73!#>7#7r879@W& rax87#75r879@W&  rax83232673C4*vaY" *NGB7@['}X,PHA6<\@ZxTk1hS,$49w%58a`73&k@  & %+5+5?S&k@  &  %+5+5? &k&jx7@%0o/& %+555+55/]]]qq5? &k&j9w7@%0o/& %+555+55/]]]qq5&k@ & %+5+5?&k@& %+555+555QM&, 2@ &%+5+5Q&,-P@ &%+5+5N',,K%+5?5N',,9d%+5?5I3@  H /+299//393310#73!##&5467r&W8% ;fAN?I1@ H /+299//3933103#7##&54675r&W8%  ;fAN?Z %R@/  "&"' ""`p   0/q9/2/3/]q2/99393310##&54?%".#"#>3232673C"Y"v  *NGB7@['}X,PHA6<\@Z­J>=A5=x,$49w%58a`7h&w@ &}" %+5+5hS&w@ &c %+5+5h &w'j7@%0#o##/######& %+555+55/]]]qq5h &w'j97@%0#o##/######& %+555+55/]]]qq5WV0&sd@ $&$%+5+5WV0&sd@ &&(%+5+5h&w@  &P + %+5+5h&w@& %+555+555&< @  & %+5+5&<P@  &' %+5+5'<,' b %+5?5ja'<9 X %+5?5'3X %+5?5TO *@   /339/3339310#73#73#73+$u$к  TO *@    /9/333999210#73%3#7#73+$u>$кY iL/991073  %!CW&{'g@ 4&03 %+5+5CWO&{CW&{'9O@ 4&/2 %+5+5C&{@ 7&t7B %+5+5CW&{'@ 7&t7B %+5+5$'2$K@  %+5?5I\&2\9`~ %+5?5'[5]*δ++##%+5?5I4&[d9`*E''##%+5?5W&[L1+%+5Y/391073YkIT !@  ?29933310##&54?T&Y*o! FOFQ05* /?10#*T &@   ??3?393310#'7'77'*T7777Y7887  ??9310'7##!'77RJ77}m}8L(  ??9310##'7!(R77J}78}LL1@"Y?O/?o@&+H/+]q+33107! rÉ L1@"Y?O/?o@&+H/+]q+33107! É L1@"Y?O/?o@&+H/+]q+33107! É` R'BB;@+_ooO_oO_?//]]]]]5/]]]q5  @|H    twHb  @orH  m   @fiHv T d B  @]`H    r  OSH KNH @BJH4 D   =@  9733C8yyY&`E + @@|H   twHb  @LorH  m     T d t B 4   "     r  @ OSH    @CKH$ T   =  @4733!7>733A8zxX&C8yyY&]D}Ò`E e@]mJ  @@\}HD&6dtBR4&hpBRb4@#WZHTdt6F@sGJHtb4DT&86VFV2 @p[ [?3+3+3_^]]_]qq_qqrrrr^]]]]]+qqqqqqq+rrrrrrr^]]]]]]]]]]]qqq+99_^]]]10#67#73#67#73NyxX&?{{xX&B}Ñ]I}Ñ_& @]mJ  Rbr$4Ddt2BR$hpBRb$4brT6F"t`2BR$8vD&66F@9 %H"`p/ [[/3+3+3_^]]]_]]]q_q+qqrrrrr^]]]]]]]qqqqqqqqqqqrrrrrrr^]]]]]]]]qqqqq39_^]]]10#67#73#67#73~yxX&?z{xX&A}Ñ[J}Ñ] 1@    ?329/339393910##&5467!##&5467'X2{" $'X2{" $ _fLZ!J _fLZ!JvX A@#  Y [/?+333+333393310#73%s Z-eg rxDsZq@>   Y [ Y[?+333+333/+333+33339339291073%% %%#7G b9Yo Z%m :Z dYxxGa @ I    f v  + ;  h  } [ k O &       @    ` 8  0 ` p p O    0 ` p  0  /]]]^]]]]qqqrrr^]]]q_qqqqqrrrrrr^]]]]]]q9910#"&54632ropsuus .@  Y/22+33933310!73!73!73++++++??310#!*SmOM)?3?105!#MSO??3?10###!T   ??33?310###!!!TuO   ?3??3310!!5!###uTON3)5DPT@O9STIA4.& QRR &AT9VUVkVPVDV+VVVVVVVVkV_V@V4VVVhVVVVVV[VkVDV+VVVVVVVVtV[V@V4VVVVVVVVVKV0V$VV7VVVVV{VdVKV?V$V VVVVVVVkVTV;V VVVVV@AVVkV_VDV+VVVSQK0#0YE**Y6#[>#Y[Y?+++?3+3+3+3??_^]_]]]]]]]]]qqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]qqqqqq933333333102#"&54>"32>542#"&54>"32>54%2#"&54>"32>54#3w|4gNtUtQ`8qNb4w|4gNtUtQ`8qNb4+w|4gNtUtQ`8qNb4wWG{v}l]IgGwWG{v}l]IgGlwWG{v}l]IgGz?39103@Ğzz&Uc -@   ?332239332310#3#3#3z@ay?z@EEV1@ [/o/]+933310%73 _  i m?s(R1@ [/o/]+9333107#7 73 'ot?M&T@ Y/+3310!5!^@ ??333310!#3l~~ R@-   Y Y YP Y?+?_^]+99//++9933333310353535353[Y   ?3/3??33/2103#5!#3###TOON  ?33?3?10!!!##:QTN ??10#!*T&n??3?10##*TG @ ??393310#'77'*TT~~~ݵqqp   ?3??332103#5!3###TON'3 Z@1    Y @H ?3?339/+]333+339933333910#7!733!?##kl}l ?岲o-qBN'[@2  Y Y   Y?+?3_^]+9/3+339333310!!>32#"&'732654&#"#rCVVF|q'ooe?Hb]QJ<4 *@ Y?2?+33399310#6!7!?*aRxU4BqeaK(%1Z@1)#/ 23&&Y   ,Y Y?+?+9/_^]+93339333102#"&54675.5462654&#""32654&sjV32I cHiGdw7dCQ] Kv3%`d^oI2Y\$>g~ciikrys1hjZ!k@= ! " # `Y `Y    `Y`Y?+?3/+99//_^]^]3+3+3933310&#"!!!!!!$4>32Tc[4ryU_U;|@ZuLׅ BSusՊlw_~q#)/@E$#, --/',& 01# @,*& _Y -'/ /_Y   ?3333/2+333?3333/+33323393333333310&'#7&4$?373&'$+'#&'KCLpm7;T@Lh-6~,Gߦ:PAR$!rz Z7J6 Y^mm)? q/X@.,,$01"'_Y$"" _Y ,,_Y//?3/+3?3/+9/93/3+39333310#"$54$32.#"?33>32&#">7N~Եu+0%Η薑U#BT'8!,.HzY*ZQ ٵ7pҢ#r݅l eQ}@H        `Y _Y  _Y ?3?+9/_^]q+9/3+333939933910!!!!##73!\Q)n66{$Ձ,@#"%" ! , .)-% uY" !  uY  _ o  _o @H  -sY))tY, ,,,?3/]+3?3/+99//+_^]qr]]qr3+33+3333393333339910#!76?#737#737>32.#"!!!!!273'řF-(ཏtJrhhY36[wo2:Js}m)"8K@2\@310%((!! 34-++PY1. @PY0% ?33??+9?3+39333333310654&#"#6733>323732#654&#" #7'LVp vIfxI |LV)!t//KOS_ )rZxo@dszw7KO I  #'*@N #*))'&  &! + ,'_Y #_Y) $( ?33?3399//333+333333+3333393333333333333107#733!33#3##!##7)7!!'#67#3-MԯNN,[6Z[S-gJhevpqq++՛kN EP@T%$$=0*CC76FKLL60RQJ_YKMM_YMK*=!33:PY773!(PY%%!QYPY @ QY?+?+?+?3/+?3/+99??+9/+933333333333104&+3 %3#327#"&547#73732.#"#"&'732654.'&546%!##32g8l^~L H??PQ^ Ohodn鍞 QKPs|rȹ!XXhdGmjw~qv.+R~bV44u`*:V,2rY[m4;86:(:v? ?l@: 8,$11, @A$8//5`Y22/!`Y _Y_Y?3?+9/+3?3/+?3/+99933333310!!#!2 2654&#!#"&'732654.'.5463 .#"q>>e)!u,WDb,zg|*OHI˧px]u~8XPa]*=1,*PkGOFOH*:--(Rp .#'+.25@V$(04&5#* )-.. " )*5&0761. _Y($ +'#_Y4 3/, ?333?33399//3333+33333333+33333393333333333103#3!#!#!73'#733!3!337!37!!'###3kgp%0d(#!ml+xsT\**֛qqQ..N!;9A @Y:@Y9:??+?+99//?102#654&#!#3!2>73#;˸/;jy͸mTn~Q(ԭ˖]+l6_O5FRiq+*.d@7%,./0'!  @ H  +.?/39///+9323333933339310#"&54>3237#73733##67%32>54#"!!4pVtwYwN]+xx~\\ s [u@Qj=27J>|EB\gg\PA[<>g]i4]+@d ))"  "(,(- uY "uY"?Oo"""""""" ""%%+sY))%sY`?3/]+?3/+99//_^]q]q3+33+3393333329910"!!!!3267#"'#73>7#73$72&'0fm&ARAl|j*<@pAqN'ͤ6K`Dia02k#5J@'  _Y ?3?39/33+3333933333103333!!####TtuR:6-j~-TTsl\7@   _Y??+3393333310%#7%77%!7!!%jQ>g fYFk?^?Ȝis:FU_t@<*VM#133'7S;AS '#Va[`*'G3>0-+3VX@#MO ^ OD?3??9999?339/22339333333310#"'#>7>32".'#"&546327756%7674&#"32632654&#"32lV8&2 q$~4Dcn>&JX]dQ&V ;[~B2&O0LNyUHL\XGI],H=4F2wvg@I+=9-p6M=9&ĕQ?7ENSQFXnt2$A\)YXLs߸aqt^atxJyy_*{*)11-W!-U@/) "/.+%`Y `Y?3+???+933393333310#"'7325' #546324&#"76(5 ]P$JC"pf2uH*4&*M#JP\.G_Eo|iO50=ixt?$)@[$)*&"+%# @$`Y  0/ $$$$)_Y??+9///_^]^]]]]^]+332233223333393331023#3##!##737#73765!27!!&#!@.k`s?lj0RB^qZgNv6,vb %=bddce,#%j@8"#  #"&'_Y "_Y@# #_Y ?33/+3?3+39/+933333333310#7&54$?3&'>?!7!}&o{1C܂W3 d:36NIwmUk h@9   "!_Y _Y   ?3?399//33+3333+33339333310!#!##737!7!3!!3#%!'!3&Qe0,-NY d&ᕕȜ;4@T!""3-( +((56-_Y*_Y3% !!_! !!%%`Y% @P  `Y ?+3/_^]?+3/_^]99//3+33+39933339333310!3 #"&547#736?!7!654&#"'>323#!(x cH!Buo +xkUG漺#2qY[HKVan-RT}?%GUYe!YN,8% q,#!a@2   "# _Y@ _Y?33/+3?33/+3333393333310#7&54$?3.'$%Nz%}&]{-"}oQ6 7g~  jw #-:d@9"3* *"<;.Y'['5Y'Y [ Y  ,<< <7<<<<<<<<{<l<\<L<=<-<<<<<<<<<<<|<l<H<9<< <<<<<<<<g<(<< <i<Z<H<9<*<< <<<<<<y<i<Y<J<9<(<<@ <j<<<<<<<<<<<~<n<^<N<?<(</<<< <<<<<<<<<<<<<<n<_<O<?<,<+<<< <<<<<<<<<}<n<[<I<:<+<< <:_^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqq^]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]?3/^]+++3/???+++933333331027#"&54632.#"#32#"&546"326545'}d{LA^qFMO}6nY|]CV@+~Un<||u MPrfffjUl>M`!+J@%%)-,&" "??9/9/999933393310232673#"&5467767>"654&2P]- 0:V&E7c`m#HHQ>r!~1?a*dldA7=6hmlnF!IKL`Y6@ET[,p@=&*##$*++$-.+**%Y Y   & %`Y,'#$?33333/+?3399//_^]++3/3933339910!7!"&547!2"32>54& #36737{ DR D_l>an?WJ+;Eb;E_VcS^M3`QA_> #3S@., $45 Y Y   (Y 0Y?+?+9///++93333310#!2+32654&##"$54$324$#"32$ZPXWQPQ\۪ܨ"&'+quLHFJMP©!ܧܨ$z@Y   O__OOO/Y   P ?3/3333]222/33+3_^]qr^]93333310#'#373##5!lMJ(zk$*hoon#C@$ ! !$% _Y _Y?+?3+333933910 6;!5654&#"!532&5/[њ66[s _` qU&OX|H>@!   ! /?3]]?9/]9333310"&54632!3267.#"k2UNHbܕ3Wu"6Fl~*z5Au c 6r@=,%44  78 Y  ,"")Y&&"""Y ?3?3/+99//3/+9939/+933333310 # !#3 3 '732654.'.54632.#"&t(Q-ihoqK{kdXWd:uW1"unOGME&+#"&tVojc@=@;!('"9U@~: 2@  PYPY??+9/+393103!7!!7!K>$:Ƌ?=a&{'u(?5(&t '*u=?5=N&{'n ?555>N&u 'n 8?555cN&'n /?555|:&>'Z ?555Nd^D @   /93310#&'5673!9>HH>9)CI$ICV (@   /2999399105673&'#CI$ICV9>HH>9#d^D @   /93310&'3#67!59>HH>9#CI$ICV (@    /299939910%67#&'53+CI$ICV9>HH>9d^D'@   /9333310#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$ICC@     @ /2992999339933105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9HA@      /299299933333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>98*C@#$+, QY PY'PY?+?+3/9/3+933310 #"&54632374&#"7632.#"326Hք~T 4y1$qpmEQWZRN_˴>cTu'$>Xss  7@   _Y?+333?339333310353!b4ƑI9$@ _Y/2/?+993310!#!9ZH9` M@'    _Y  _Y/+3?9=/_^]3+3933333105 5!! !{BH9m;6j`f@ Y?+99105!`-@[/@+H@H@H/+++]+931073++3bT9@  Y/3/9/]+393393310##5!3njuNio ,@' !.-.../._.....?.O._...... :...@]aH.@VZH..?..._.o.......`..$$**!??O@H@$H/+]3]+]q29]2]2]]]]]qrr++r^]qr93310#"#"&5463232%"32654&.#"326o˄?ZɀFw83wMSmm33wNTihWFxNӰS~qkop~`/993103!!^j8^@  ;/k{O +mK$4k4DT+K[k;@69H;Kk{//Oo@#H@H/Oo /2/^]]++qr_rrr+^]]]]]]qqqrrrr^]]]]]qqqq9933104>32#4&#"tтwgĠ9)@ PY PY/+?+339310"'53254632&#"$O7<9W,1BSY9Ѭwr-LP@+,@% )),--4-T----------@=R[H-- -@-`-p--? -@-`------ -@-`--- --&Y#T"@  //99310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //993103#"&546323265";N2$! =/'5)%3%Y?+33105! %iH@ ??93103#ؑHK$@ Y?+?39310!!#(in$@ Y?+?393105!# (%%H"@ Y??+393103!!Hn%H$@ Y?+?393105!3 %H+@  Y??+?3933103!!#iHnnH+@ Y?+??3933105!3# %K,@ Y?+3?3393105!!# i%n%H,@ Y?+3?3393105!3! %nH 7@    Y?3+3??339333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH @ ?2?39933103#3#ّhHK Kj 7@  YY?+?+?3393310!!!!#(iijב" /@   Y ?3?+33993310!###בnn#j 9@    Y Y?+?3?+33993310!!#!!#htjo"j 7@   Y Y?+?+?33933105!5!5!# i(qב) 0@    Y?+3?339933105!### ܑב%nj 9@   Y Y?+?3?+33993310#!5#!5!ґttj)F)ޑqH 5@     YY??+?+33933103!!!!iH"ב%H ,@   Y?3?3+39933103!!33A$Hn#nqH 9@      YY?2?+?+339933103!!3!!ّK$hH"qH 7@  Y Y?+?+?33933105!5!5!3 iqב)%H 0@  Y?+3?33993310!5!333$ב%nqH 9@     Y Y?+?3?+33993310!5!3!3!5!$KqFH 8@     YY??+?+?33933103!!!!#iiH"ב"H 3@     Y?+?3?3399333103!!#3#AHnn KH E@   Y @ Y  ?3?3?+?+3399333310#3!!#3!!jt " "H :@  Y Y?+?+??339333105!5!5!3# iqבKH 1@   Y?+?3?339933105!3#3# 㑑h%K#KH >@     Y Y ?3?+?3?+339933103#3!5!#!5!A㑑tHK )ޑj <@    @ Y Y?+3??+333393105!!#5! iiq"h 6@    Y?+33?3339933105!!### ב%nnj E@  Y Y ?3?3+3?+3333993310#!5!3!!#!5jtttAޑ"בqH <@   @ Y Y?+3??+333393105!3!5! Aّ"%H 6@      Y?+33?3339933105!333! ב%nnqH E@     Y  Y ?3?3+3?+33339933103!!3!5!5!AH"oHR@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# iiiqב"ב"HO@    Y ?3?33+33?33399333333103!!###!5!33AבHnnnnH ^@   @ Y Y ?3?3+3?3?3+3333399333333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H@ ??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{lYgckhk@ Yd`h_[WTW@ Y\XTSOKHK@ YPLHC?GDG@ Y@n?o*Z+[BrCs.^/_FvGwA&.6>JFF'/7?KGG@ ۸B@JzK{AP#+3;OCC"*2:NBBQDظYG  Y # $(,$Y#'+/'48<@D(030Y7;?CG+3LPTX\,HKHYOSW[_/Kdhlpt0`c`Ygkosw3c|4x{xY7{8Y;<Y?и@ԸYӸC@3Kc{׫{cK3 AO  Y LHYK?3+32+39/////////3+33+33+33+33+33+33+33+33+33+3333333339333333333333333333333333333333333333103#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQ@jh| OoLldi}SsPp`"eWwTt\&a# +P;;Xxؿ)H*99]'A!/L?? ,Q<%D.55 &I+648<@DHHA 0M@@6<@ؾ FKk A R"E/2226:>BFFS׹;?H˸YDHJ@YNRV7JOSW8KKY[_cg\`dhjYnrv ;josw <k kY{~ | Y ?!@ Y$( %)Y*.C+/DYȹ48ɹ59Yֹ:>@#GJj  jJ  $(,0KO3@Y"&*.@CGYLP4?3+39/3+339/////////3+33+33+33+33+33+33+33+33+3+333333333933333333333333333333333333333333333310!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  //993310!!!7L17}1mi{/9910!!imi{@  /993310!!!iLPbh?9910!!hL@ ?910! XVRZ?9910 7L@ ?9/910 LRZ?9910Z79e%  4@  ?/2/]33393333310!# 3 @R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow@kPhhTl8xx<|(pp,t ``$dHH L@@D0044DLdt|lX\\JrvNvBz~F~2jn6nZ^^RVV:>> *..v~n^V>..>V^n~v&bf"&//9///////323232323232329933933333333333333333333310#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @ /]99102#"54>jnrotjlw)@  /9103!32>54.#")vwvvvwvu}Avvvuvvw)#!@ $% /9103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @  /993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:s@B+%:6%  <;("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332993393310"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-]@8 ($./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]33293310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7~@C5  **.&"## 98+** !"1%*"*""*'o/]33/]339///999933/393333333333310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'\@3$  )(  /   @@%(H/+/]99//]q2329333333310.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8>@!0,'6!'!9:,*3$$$-  **/^]]]9999339210&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<48@4((56$+/     //99//]92393310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@   //9310./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @   //9/3933310&&'6H zDS%Ut}FiGfY;.@  //9/939333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt \@ "! H@ H  /3/]/3339/++3339333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu28@I    !      ??9///32992939933333333333310##57573%377```L`Y=>YYYYG\YY Y  u@B   `Y  @ `Y _Y??+9/_^]3+3_^]2+393333333107#733!!!!!!#7cc||?y^if@8  PY  @ PY??9/]3+3_^]2+3333393933107#7333#3###7mmjjoooofem"ޅ g@  `Y@ H@ `Y  _Y?+?9/_^]++_^]+933333103'"#>3332673#"'!>#'$ }`&p~#f`+]0/jzCv/0rr %?IT@,   _Y `Y   _Y ??+99//3+3+339333333102)##73!!! 4&#!TXjHx[(~еr7w~ W#Y@-%# $#_Y##"_Y _Y ??+3?+9/+33333339933310!!327#"&547!2 2654&#!GV34:Cto &d pUeIJ!]uf/2˧pxX.6;@@O719>:(/?!<<=?(':9 AB.91,1PY:0>0QY)-,>= > > $, PY?+??399//993+3+33?39333333333310.54$%&#"'>323327#"&57##' 32>7'76^HH 0Jwz-߼pR IJ Q!B>]US~1 af-gjZX)NUW#Ls@]0(IpML@~ei`SM}I/h"$bXS@,  PY QY ?3+3??+39?339333310 7#737333327#"' #}ix/ Z*:cJd1ȋX e<"XF&$;?hG@&  _Y  _Y?+??39/+933333310!#!#3!33#ttnsT"hD@$    QYPY?+?+9??93333310>323##654#"#3SsfviO~~ v KsY@dX>~de?hD@$     _Y?+??39933333310!#373 3#(jnOM2"hVE@%      QY?+3???939333310!#373 73#H i aiO|kE/h ?@     _Y  _Y?+3?+333393310#!7!7!!OOuhVhB: ?@   PYPY ?+3?+3339933331037!7!!#28kP&q>@  _Y _Y?+?+99??99333310!7#"$5$3273%27&#"̹’`ܡG[M8gdp2N*@ RY ?3??3/+399310!#3?>32.#"շe ;=FgQw}2%*?#:@Dt5uvЌzPKd<'^G6%2G"F/R\O :NJ \,;=k;(9EMq.m#\yf5N"4@ #$RY ???9??3/+3910!#'#3737>32.#"-($@](<l- S(VeULm"}2%,?!YJ:!9ALXh.IRd<';CuE#G@%$%QY !RY ?3?+?9/3+339333310 #'7&54632? 654&#"[qu }NZ7v^) ^ *6:#$}'<2XK>}b(;}55(3EY#>?"@ _Y??9/+910!#3!wts#7:"@ QY??9/+910!!#Y`:6:GR$@@" # %&PYPYPY?+?+3?+93333102#"&57>">54ьZ=uvp+I[qog9Pǰ]i$@ZKDڻVg.@ /33/322/33399107%7%< WbX^/9/10733N0h{hs/2/10 '53WmdVmJ_ /10!7!%73m#_ya_ /310!53!}hv "@ /9/3999310!#!53h[c Uhv "@ /9/3999310 #5!3!h]U4@  Y//+9/_^]3910#373i\V٘|8@  Y//+9/_^]39310#3#7in,J9@  @Y?+9/_^]39310#3#7in,i  /32310##7##!-}--}EOc?c /23310)33733&iE},,|,cW]t@ /32399103#'"pW㾾p& @  /32999910#7#7h,+W*+ Rj@  /3239107!7!}֔Y@ ?3910#73QM,,YP@ ?3910#73Q,,PE.&IL9E.&IO9&& 9??3210#"&547332679HKKh㗦v !9JaI<& ' s#O]]5'F R) H XJhAY7?]+310!7!3!%3%RRT"D&D&J"D&'@d4]]]]5D&'J@d4]]]]5'&'&'&/]q5;&&L'@O?/d]]]5]]]]5& ]5F& 4]5&&&F& + @H+5&  D]]5& @ D4]]]5R)&  4]]5 &  ]]5& ]5&&Zm]]53&P@ m?]5]]5h& '@?/4]]5]]]]]5&hd 4]]5& D]]5&@d4]]]]5& ]]5H D&;+&+& 3+&%1#: 996??3??9310#33673#XsTVJKB? _|| /RJlh#)v2 /210#"#6$!vw vn[2 /21053 #&!n~N{   /2210.#"#>32dVup x)2E~5   /331032673#"'eZwlNp*7@dk=7 !%)/AOW_jv@! )(//() !"--#,qek`MPUU]]FPJXB43:?  ?<3BJF`e, wxMU\\UUG]FFb7400tbTGGh;>>nhbhbhw( ..w $ #,$#,,#$'+/3333/333?3339////33333/33399//33/33/333/333/39/3/9393333333333393333333933333310#5#5!!5!#3!5!!5353##!!5!#3!5!!33%"&'73265#53%+3 4&+324&+32!"&546324&#"326dCC?ddC~dCdC~CddCd]_k *02,^dMNcfYV /ee4=@ٕqY\`WZ\]Y~ddd~Cd?dC?dC~ddC_wKDC_Zǂ|ly+Df k#B9EJCZիX9f "@ o ]9/99310#67#73urX C9eYjWu88 &@    Y/+2/3910"&'732673*tX]%g(u~=cTd]$~ @   ?9/39910#67#73murX CeYjWu+ @   /9/3991033#7>urX C eYjWuX,@/?_/]]]3910%73}ϭ ,@/?_/]]]39107%3 \ 0@ /?_/]]3]239910#'##7%3\_q 0@  /?_/]]3]239910#'73373x̻]tG @ /3]2391073!73w####6@     /  /22]]q22339310".#"#>323273*LE?.>d/yS,LD>[)f#@Z(1(;Ft(1(me:q| 0@ /?_/]2]23910?33?3q (@  /2]2339310"&'33273tgS@u4o;6rz]= /10#'3]A' /10#'3  /103zt L> /103#ڂ>q> /103#ڂ>= ## /103#2#h7  /9104#"7632#732b5SMrĸ] e%ATQ ?RJ  /299104#7632#7>D_ -exnf p 859f LADS 2x h 7  /9104#"7632#732rb6RMrĸ] e%ATQ ?0I0@    /33/2/210>323273#"&'.#"0~W>7@6?-"C<+MIou#W"_E,@    /33/2/210>323273#"&'.#"~W>7@6?-"C<+MEou#W"_4  /22/10"&'33273ÅtgS@u4Ċo;6rz  /3210#'##?3pSSu/1073%%ɬI /103#X /103 /10 3st /10#3h7 RJ I0  /3310>323273#"&'.#"~W>7@6?-"C<+MIou#W"_I0  /3310>323273#"&'.#"~W>7@6?-"C<+MIou#W"_Iy0  /3310>323273#"&'.#"~W>7@6?-"C<+MIou#W"_s<  /3310>323273#"&'.#"s~W>7@6?-"C<+Mou#W"_t  /3310>323273#"&'.#"~W>7@6?-"C<+Mou#W"_k4  /3310>323273#"&'.#"k~W>7@6?-"C<+Mou#W"_u wu u u u 52@  /22223910".#"#>3232737*LE@d*Z/yS,LE>e(\#@Z%-%wt%-%wme:Yu pu u  u  fu yRu xu 6u 5M&u L |G  /3310>323273#"&'.#" |U!.#D2=-)D2+M|dd  LSI0  /3310>323273#"&'.#"~W>7@6?-"C<+MIou#W"_|TG  /3310>323273#"&'.#"|U!.#D2=-)D2+M|dd  LSIa0  /3310>323273#"&'.#"~W>7@6?-"C<+MIou#W"_Y:??991033YҴ: + >@ 0 @ P  (1H @ !H o/r2/++]q99//31073!73%!7!5$$$$$+ X@$ p /o 0(1H@!H0@P/]]++]q/r3/99//]3/103#773!736ځ$$$$+ ָ)+ M@' / o    00@P(/H!H/++]q2/qr39/33/9103#'7373!73°O$$$$+ a޸}+ X@$ p / o   0(1H@!H0@P/]]++]q/r3/99//]310#'7373!737$$$$~ }+J!H@H 0`p@P(1H//+]q99//++q10737!7!X$$$+M@5   @P` 0p@P/]]]qr3/r3/9/99310!7!".#"#>3232673q$#?<8-3[8T>$A;602 \7S#(SG(&%SH' 1@ Y??+9/?993310!#!5!3e*\* 1@ Y??+9/?993310!#!5!3e*$E 1@ Y??+9/?993310!#!5!3o ZZ-@ Y??+9/?99310!#!5!3o DM%@ ??9/3?399310!# 7 3f\>Ha4R /@  Y??9/+?993310!#!7!3bG4oaRM'@ ??9/3?993310!#73_J^rM '@ ??9/3?993310!#5 73fS܈kh/iF$@ ??3/9/99310!# 73pZzfjFp'@ ??9/3?993310!#73p^ZHd(5%@ ??9/3?399310!# 7 3RkGHyN!5 1@ ??9/933?993310!# 7 3Rka.K- O -@  @ Y??39/+993310!#!7!3xtdH^- &@ ??39/3993310!# 73`vcFFH @??39/99310!#73wp=Dg-p&@ ??39/3993310!#73pEsHVH!$%@ ??9/3?399310!# 7 3=|GHY2#% 0@ ??39/933993310!# 7 534~X4(5f% 0@ ??39/933993310!# 7 3C{sVH2}q' -@  @ Y??39/+993310!#!7!3cy Q2X/@  ?3?399310!# 73HԈG7%p&@ ??39/3993310!#573p={H\2#"@ ?3?39999310!# 7 36}MH)Q0) *@ ?3?399//993310!# 7 530~YAuO/l6 *@ ?3?399//993310!# 7 3ON,qS-m6 *@ ?3?399//993310!# 7%3O~t8S-{0@ ??39310)733+NS.)p @??39/99310!#73pA>S.)O,@ Y??+9/9310!#!'!ataoL 0@ ??3399//393310!# ' 3[H5fy4L .@ ??3399//393310!# ' 3UH)hy?L ,@ ??3399//93310!#5' 3SHhy-^(@ ??3399//9310!#' 3Q6fy=Lp @??39/99310!#'3p^iy( @ Y??39/+99310!#!5!3pT; 4@  @ Y??99//+3993310!#!5!3a.izT /@  @ Y??99//+993310!#!5!35$* @ Y??99//+99310!#!5!3?P(@ ??399//39310!# 7 3h`axbVL 6@ ??99//93393310!# 7 3e`;H`GF /@  @ Y??99//+993310!#!7!3fb*]v\^L(@ ??99//3993310!#73^'c{L"@ ??99//99310!# 73e[؈scSc[Lp(@ ??99//3993310!#73pd]?de[/(@ ??399//39310!# 7 3Gu7TaF?9 6@ ??99//93393310!# 7 53Rv8HqGG? 4@ ??99//93393310!# 7 3Nw]sX=U8H? 1@  @ Y??99//+93310!#!7!3mwo V=2? @ ?3?9/99310!# 73\w߈5:=?p&@ ??99//993310!#73pWw2-B=+6&@ ?3?9/999310!# 7 3O}4H) 0q5 .@ ?3?9/99393310!# 7 53N}<Au 1[l6 .@ ?3?9/99393310!# 7 3ON,q -+m6 .@ ?33?9/9393310!# 7%3O~t8 -6*@ Y?+?9/9310)7330O~ -Q5p @??9/999310!#73pM4 -zL,@ Y??+9/9310!#!'!owKzL 0@ ??3399//393310!# ' 3oH Kz4L 0@ ??3399//393310!# ' 3oH)S@Kz?L .@ ??3399//393310!#5 ' 3oHu^Kz-L&@ ??3399//99310!# ' 3o6RjKz=hp @??39/99310!#'3po~32326733#7#?<8-3[8T>$A;602 \7SR#(SG(&%SH'h =+!]@  @P@.&,H  0p@P/]]]qr3/r399//+q993310#7##7".#"#>3232673ww#?<8-3[8T>$A;602 \7S+#(SG(&%SH'[u /2/9/10#7373ij+ ;@% 0  0pP/]]]qr/9/9q210#73#'73373˼hie+ A@   k  @)1H 0Pp@P/]q_q+3/r99//310#7!#7!7!$$$$$+: 4@    PY ??9/3+3393310333###,mZZrr^^mi/F*&c'^-@0>>>?>O>>+&+-! %+555+5/]]q55F*&c'^-@0>>>?>O>>+&+-! %+555+5/]]q55F*&c'^-@0?????O??+&+-! %+555+5/]]q55F*&c'^-@0?????O??+&+-! %+555+5/]]q55F*&c'z^W@@IIIIoIIOI_I/I?IIIII?IOI/I?III*&-6! %+555+5/]]]]qqqqqq55F*&c'z^W@@IIIIoIIOI_I/I?IIIII?IOI/I?III*&-6! %+555+5/]]]]qqqqqq55F*&c'z^W@@JJJJoJJOJ_J/J?JJJJJ?JOJ/J?JJJ*&-6! %+555+5/]]]]qqqqqq55F+&c'z_W@@JJJJoJJOJ_J/J?JJJJJ?JOJ/J?JJJ*&-6! %+555+5/]]]]qqqqqq55?*&k&^-@0  ? O   &  %+555+5/]]q55?*&k&^-@0  ? O   &  %+555+5/]]q55?*&k&^-@0!!!?!O!! &  %+555+5/]]q55?*&k&^-@0!!!?!O!! &  %+555+5/]]q55?*&k&c^W@@++++o++O+_+/+?+++++?+O+/+?+++ &  %+555+5/]]]]qqqqqq55?*&k&c^W@@++++o++O+_+/+?+++++?+O+/+?+++ &  %+555+5/]]]]qqqqqq55?*&k&c^W@@,,,,o,,O,_,/,?,,,,,?,O,/,?,,, &  %+555+5/]]]]qqqqqq55?*&k&c^W@@,,,,o,,O,_,/,?,,,,,?,O,/,?,,, &  %+555+5/]]]]qqqqqq55h*&w'^-@0,,,?,O,,& %+555+5/]]q55h"*&w'^-@0,,,?,O,,& %+555+5/]]q55h*&w'^-@0---?-O--& %+555+5/]]q55h*&w'^-@0---?-O--& %+555+5/]]q55h*&w'z^W@@7777o77O7_7/7?77777?7O7/7?777&%+555+5/]]]]qqqqqq55h-*&w'z^W@@7777o77O7_7/7?77777?7O7/7?777&%+555+5/]]]]qqqqqq55h*&w'z^W@@8888o88O8_8/8?88888?8O8/8?888&%+555+5/]]]]qqqqqq55h*&w'z^W@@8888o88O8_8/8?88888?8O8/8?888&%+555+5/]]]]qqqqqq55?+&k&j' @eOo/?_o/??_ &%  %+55+55+qr55/]]]]]qqqqqqrrrr55?+&k&j' @eOo/?_o/??_ &%  %+55+55+qr55/]]]]]qqqqqqrrrr55?+&k&j' v@U_(o((/(((((?(O(((o/?0_ & %  %+55+55+qrr55/]]]qqq5/]]]]qqq5?+&k&j' v@U_(o((/(((((?(O(((o/?0_ & %  %+55+55+qrr55/]]]qqq5/]]]]qqq5h+&w'j' 7@e""O"o"/"?""""""""_"o"/"?"""""""""""?""_ &! % %+55+55+qr55/]]]]]qqqqqqrrrr55h+&w'j' @e""O"o"/"?""""""""_"o"/"?"""""""""""?""_ &! % %+55+55+qr55/]]]]]qqqqqqrrrr55h+&w'j' 3v@U_4o44/44444?4O444 o   / ?   0_ &$,% %+55+55+qrr55/]]]qqq5/]]]]qqq5h+&w'j' v@U_4o44/44444?4O444 o   / ?   0_ &$,% %+55+55+qrr55/]]]qqq5/]]]]qqq5!+&L ;@   &  %+5+]5JW)9@*##+ _Y _Y?2/+??99?+33910"&'732>7654&#"#336$32!u6 g@WrQ#zx:b+-WFNk-9YűsLAidD=dX_ty?W<@    `Y/2+?333?339/393310"'7326?#3>3~8I4;; WT\kD%w(A@# "")*_Y_Y?+?99//99?+93310 $33267654&#"#7336$328x%z ^!Kq#L@hcwNevALjCj ?2?3102#"&54>2>54#"Kr_vr]Ma7>54&#"'632!3ohQ:8:QHo]batRS<7W6'/85oUGv6SD+}j j&A@%%/&?&O&&& P`@ o ?33/]?3/]39/]3910254&#"'632#"'732654&+719632.#"632%32654&#"9vcrVw :(NwG`|H8I[<9MbktXT,.bp\;HgJ3=W|j\ ??3310'#67!7!@ZE| o`k,j%1(@&&/?O,  ?2?39/]399102#"&54675.5462654&#""32654&4taZ=Loi7=fDKB@>QB UQEIMZMjaRJh O?ol]OnQ6^i@;,17=.6mN?.=NA27k*k#1@ !@ H  H ?2?3/+39/+33102#"&'73267#"&5464&#"326(z\uV}yZWtGe{H8I[<9MbkTXa~btc;HgJ3=W5+@ @  /329/]103#7#'##73\`Rih+ "+@ @  /329/]10#'73#'##73`8ihy +!@ @/329/]9102##7254#"'6#'#73KBES;=T53,?ih+0&2<N-@c+!a@E  [ k  @!H!+[[kO+;/_]]]]]]q3+]22/33]q2210"'&#"#>3232673#?3#}3LM$-4[8U?$@;602\8Rͤ´i&%#(PI)&%TG'pC E+M@' P`  @ P `  -1H !H /++]qr29/r9]q103#7"&5332673=7k`TSska+ tD78CE+M@' P`  @ P `  -1H !H /++]qr29/r9]q10#'73"&5332673ck`TSska tD78CE+.@ @H@H/3+]+9/99102+7254#"'6"&5332673BEXO# S43,?k`TSska+,&5=7-@tD78Cc+ $5@  o@/2/]]]3/9/33/39910"&533273'".#"#>3232673jrUMC,UM,#A<9O[7U=$A<701 \5Qi^(+S54#"'6#'#73=VP[<.D=9 J(ihuf5I &^)PPi "#@0  /3292/]3299103#'##7"'&#"#>3232673eˬdm4LM$-3[8T>$A;602 \7Sh&%#(SG(&%SH's /322/107%3"&5332673c:u`xumLMQ /322/10%73"&5332673϶u`xumLMK+3@ O_o0P0/3qr22/]229/3102#7>54#"'6"&5332673*p\oJ7RIJ _u`xum+?\ (n$$,cLMs$!@ "/3]22/329910"'&#"#>3232673"&53326734LM$-3[8T>$A;602 \7Su`xum-&%#(SG(&%SH'LM6+@O/]q9910'73|6%!6+@O/]q9910?3n6!%)& '~ 4]]5)& ~& %J ]5& 5+@D]]55]551&}1&1&R) '&/]q5; #/;?7@!!??39@999'' '>>-'/33/3/33/3]q22/2/3014632#"&74632#"&4632#"&%4632#"&4632#"&3. ".." .. ".." .. ".." .>- ".." -+- ".1" *#".7>77$& -9N~\5cMQ|Y;F '2gsrbogUsVQr[L`76_`:anHDspa!:wTSVY17!32673#467##"&'#"&54733267\|LVtvIfyPj|LVtvׂw7KOƠ\_ )rZwqi@dw7KOà_VJY7!32673#467##"&5473r~~ vSsׂ{X>^_ )sY@d$Y $<;ADGNW]h$$7h$9$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB01uniFB02uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFC commaaccent breve.cyrcaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmarkuni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lc uni1FEF.short tonos.shortlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BES_TES_PEx          bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.60FVR J   8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz S R Q P O M L K J I G F E D C A @ ? > = < ; : 9 N T B H:BJRZbjrz o n m l k i h g f e c b a ` _ ^ ] \ [ Y X W V U p d Z j:BJRZbjrz             ~ } { z y x w u t s r q   v |:BJRZbjrz                            :BJRZbjrz                            J",6@   bcyrlgrek2hebr>latnLMKD SRB kernkernmark  6>FNV^fn|&.6>     jx|8  #j&&&'8''(F( () )<)l)))*,*\***++,+Z+~::=AHDHDHLHh1lll~.6llL.llll....llll..lll    ))     ))          ,             ))     -              1          n L $*06<BHNTZ`flrx~ &,28>DJPV\<<<<<<<~<<<<<<<<PPd<<<~<<<<<<<<<<~<<<<< (  H(" X &,28>DJPV\bhntz x  XXll  L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz F XFXFFFFFFFF0F00F0FFFFFFFFFlFlFF0F0pFp F FFFXFXF F FF0F0FF0F0 F pFppFppFppFp F  F  F XFXFFFFFFF0F00F0FFFFFFFF0F0pFp F bbFF0F00F0 (  HFLRX^djpv|FFTFFFF,F<FFFFFFn. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzTT00xx0000,,TT||0000ZDD00HllXXXX0000TT||00XXXXXXXXXXTT00xx00xx,,TT||00DDllXXXXxxTT||||,,,, (  H   jpv|t``t`22<2  !<  !J`    J`      J`     !   J`     ! 4<4J4<  !4J  !Jl      Jb    Jl        !Jb      !n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFdFFFFLFLFFF (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\8FFFFFhFF$F$FhF F FpF$F$FhFF$FFFFFFF\FFLF F F FF F8FFF F F$F\FLFFFFF8F8F8FFFFFhFF$FhF F F F$FF$FFFFF\FFLFFF FF F F F F (  H PFxFn L $*06<BHNTZ`flrx~ &,28>DJPV\$HD88\ X88$888888$$$HD$ X8$H (  H (( >       $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(k 2Dbt ^dvv6Xr@*l "(np 4 B   $ . h : ` f  4 Z p  ,>HZ`n $<;ADGNW]h 7h9:DJPV\`88ppp8LL8\Ppppp`pp\PP```pppLL8\PLpppp (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\DT0x00T|00D0,lXX,,,X,D0T|0XXXXX44DT0x0T|0D,lXXxT|| (  H   flrx~Htn L $*06<BHNTZ`flrx~ &,28>DJPV\ FXFFFFFFFFF0F0FpFFFFFFFFFlFFF0FpF FFFFXFF FFF0FpFF0F FpFpFpFpF F F FXFFFFFFFF0F0FpFFFFFFFF0FpF F@FF,FFpFpF0F0F (  H:@FLRX^djpv|lF,FFlF@FFFFF|FhF6FTFnn L $*06<BHNTZ`flrx~ &,28>DJPV\DT000T|00<D0XPXXXD0T|0XXXXXDT00T|0DXPXXT|| (  H   flrx~h(dddnx<T,,@p 8=N̑9openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSans-Regular.ttf0000644000076500000240000125377013402025764025706 0ustar kintelstaff000000000000000FFTMaSWGDEF}t14GPOSr KNGSUBOQ.OS/2˗`cmap[*.cvt JK;fpgm~a0gasp $glyf4(pmaxp  name| posthprepGI8hCW-Y_<̓G̓G j>NC z j  RT\/\33f  Px!1ASC@ Q3>`: 999Ws sIVHh !d9[99sPssgsNs/sRshsisYs`99edesTVVhV9g9 Vs9aV9aV].V  V.V-A999 sjsWsWsVsW9sVsssVssV99sS""\9ss:sqsss-sSd[k3zdA)HLPwPsS88IVVVVVVhVVVV9 9999a9a9a9a9a9GV-VsWsWsWsWsWsWBWsWsWsWsW9 999sVssVsVsVsVsVdA,sssssVsWVsWVsWhWhWhWhWVsVVsWVsWVsWVsWVsW9gsV9gsV9gsV9gsVss 999 9 999\99 Vs[s~sUssssss9asV9asV9asVaV8V]9V]9V]9V]9.9..9ssssss V-V-ASASASs @s@ s [hWz@QsRtVVY^Xs9g  9V s9aa?VaWV sVVbOl C99.[W.->/-F\]\NsZsY.$sNr9 dV +VsW99asVssssssVVsWVsWB9gsV9gsVV9asV9asV-\D dV9gsVFsVsWB9G,VsWVsWVsWVsW9i9W999asV9asVlsisV]9.9\@~!stV]_A1VsWVsW9asV9asV9asV9asVV-zSSVh s.G13V!)X VsD asVV-ssVs~s=MsVsVsWsWWH5 5K9sVsVx^sssVDnsslsVSV?WfV+++ UU999sT`(1T1\D\l9[9W9a@Ix^k.;sV/OV@V V)o)J8c''aaFg(dhWv43eeee3Cw993PBd,3bbP9..:8Y[O?^>LMK8JLD% G5Ot%ttA8SSSSSSScWu>W>9W9F2AVVhX=VA9a9VX 3Z9aVl.V-buV.W9V-VFsj`VtVFVsjsjVsVOVV)`0U3?S`sV`?Ss` .9.9{P?RD9asVrZ;<2 .c edsd VnVnanIG(DbW9aPPVsh [h[VW.UhV]99 u.7V@VUkVcC@9aVh.7vV.UUU.@i`sWx@sWZ1xx ksVUsW#V+zk-+7UsWsWs W99@ s xk r9X.y{zm` _CD9asVm  m  a,U6+ lW rhP %kx@+VsJU]dcZC1 )I(k / >+#hW.#ssV.g1&U+EU+zUs T  T 9cZWh@ kkU+zVsWVsWBVsW^sW^sWcZC1M\Dxx9asV9asV9asVi7777U+zUUV.V.@XsV[V`UM`UG F9gx^.S#RI@ 9asV D+m^`Nh)\DH^jb\D^H)==\\\95BRb?o)3D9F'3P=Fm7H?3) \ {F'3=B@Wii1a06xsV=>A/WCsVsV+UU#`DE?S1kA)U+~ O Q5Q2H1H 0n.Vcf1-4q.o.+4Y--v*o';;-Z;;;80;B^^]];H;;Z [B+] `;:Beg`b <:DssV9ss91s btMI*s` ssV9Vss91sWsVsVsWI54X=s\DW@32'.,;`BBdBdB*BWB3X[[__:7/B"8[W<.%.<bbotVsWVsVsVshWsVsVsVsVsVVsWVsWVsWVsWVsW99gsVssssls9|99VVVssssssss9asV9asV9asV9asVVsVstTV]9V]9V]9V]9V]9.9.9.9.9sssssV V      V.V.V-ASASASs9 sWVsWVsWVsWVs1VsWVsWVsWVsWVsWVsWVsWVsWVsWVsWVsWVsWVs1VsWVsWVsW9Q 99asV9asV9asV9as%9asV9asV9asVa?Va?Va?Va?Va?Vss[[[[[V-V-V-V-VVVVVVVVVV****??FFFFFFllllsjsjsjsjsjsjsjsj*sVsVsVsVsVsV--````````?S?S?S?S?S?S?S?S__VVFFsjsjsVsV``?S?SVVVVVVVVVV****??sjsjsjsjsjsjsjsj?S?S?S?S?S?S?S?S__VVVVVVVVVVVVsjsjsjsjsj"B"B**w99 e eW**``````V-V-Kz?S?S?S?S?Se\'\_/WUs9 LssNk~KKKHssQM7UUXYV`95+-e=6;6shhss: PsV.)+V9gVshE%lX`P"P=];8eV`9d3W1d8dAdd?dAd"g{mmb))s+kUFQ@;@<fB2ssVsP9zsVA1aL -g0UAJ9999ddd)Bo)3P=FmF'=Z3333BBBRb?o)9F'3P=F7H?3\ {F'3=R3PP|ZjZH-/ HjjjHHHXHHjjmzf#:WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWW7YVVVVVVVV````````````hX=k=kF'F'PPP=FB&\tV$~~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A! ?9U>9UB@A@;3:U839U@@ O P(F(F*F+_O_ F@FF@36FFUHU2UUHU=UU=U@F<P&(Pp@2F?Oop?а/?Э/?ЪO/o$PoF0@pЏO_oF1ts?sP&on<nF5U3U3U`P&_P&\F1[ZHZF12UU2Ul <Ll|Q@dQ@Q58F@Q%(FPIF HF5GF5FFFF2UU2UU?_/Oo?oOTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++stu+++t++ssu+++++++++++++++++s+tstusts++tus+stsststtsts^sstssss+ss+++s+tu+++++++++++++t++^s++^st++++ss^ssssss++++++^}y:wW~j`jy"3kkk{Rni`[^^eoz iq4 HjgaAhLLLLXPHld p $ T 0 ,  h4XlD p@ xh !"##&P')x)*<*p*, ,P,-./H0 01234(5\6 689\9:;< ==>@?AC`EG(GILJJJLMNOLP(QSSLTUVVPV`WWXDXYpZdZ[\[[\l\]l]^0^|^___` `P``aaabbLbbbccDdd0ddddde0efdfffg0g`ghiiLiiij$kkkllDlxllmm8n,n\nnno oToppq,q`qqrprrs s<spssst(tXtttuuHu|uuvvwwHwxwwxx0xdxxxy(yXyyyzzDzx{H||L|||}}@}d}}~~0` Hx8h$T <lHp4dDl T0`H|$PP8lt4t\XxHT4L8h|(x<P`x8@xd @(X4Dp(@XLP8p@XŒ4 (XŌ $\Ɣ$<TlǜȀPɄ0`ː(`̐0`͐0`Θ0hϠ8pР HxӬTh\HL|ذ`ٔ8lڰ۰ܰ݀0ht\ tl4\0<HX<`Td$t40H(p  h 0  d  X T$,lh0x`8,4L t !","l#0#$%&(<)8* +H,<--.4./X00(01,1223344(484455`56<6667(7l78848h8899,9`99::X::;0;;<>$>8>>?@8@@AHAAB BXBhBC C@ClCCCCD8DlDEE@EF`FGDGGHXHITIIJLJK8KL LM8MN$NODOP`PQpRRR4RLRRSPSULV V0VW@WXXY<YLYZPZZZ[l[\]^h^__`,`a a0abhc c0c@cPcdeeefXfhfghhijLjk0klLllmTmn noohopqqrrhrstuxvwpxxy\z,{{|0|}\}~d~@D8xTX h\<L$D\T8P84hdX4l\x`p|@H|dDp0”(Ĉ0ń`ƴ(`ǜ lȜDxɜHxʨ,X˄ˬ0\̔ P|ͤ4lΜ,\όϸPhЀЬ(`Ѥ4`ҌҸ 8dӐӸ@pԠ TՄհ4`֌ DL؀4h٘(TڌL|ۤ4lܠ@tݜDlޘ@lߠ(H|Dx(X(X<h8hh$X0d@tL88h8pD0<l@xLDxDt$X(\$P| PDxP4X|4l@d @xHl Dh4d,Pt(X,`8h<p(Lp  @ t    < `      8 l    4 d    , \   (dX(T0hX 8d@lXP|,XP| P8<0l,Pt |8h  h  !!8!\!!"\"#(#\#$,$\$$$%,%\%%%&(&&&''<'l'''((4(\(((((((((((((())d))**T***+H++,,,x--. .8./d/00<0h00101@4484\4|45 5P5|5606677<778l9@9:;4;H;\;p;;?H@dATBpDDF4FGIIJ`L MN8O(PQ0RRS8STUVWLWY(YYYZ<ZZ[<[\T\] ]d]^|__`aDaabb<c cd$dflghphi|ij`jkk`kkllXllm8mmn0nnoDopppqPqr,rsshstDtu(uv(vw(wx xyyzz{T||L||||} @l@l0l 8lhhH$d@P4\8T, XL4|,p(x$4DTdtd$Lp8\,D\<Tl,d$84|0xp ,x 0@Pp 0DXl,@Tdt@PHH@P˜<àXĤHŤ\Ƥ8ǜXȰDɠHʠ`˰P̨x p(ψ4|,ѐHҐ4Ӝ\԰Xմ\,ׄt<ٜ0|DۨHܘXݼh޸ h,,,T,D0L<L@@8@,@`hdhlh |,(pH$L8DT (    T  `   p 8Ph@|2@  ?/993310!!!eL5@  @[  r b T D 2 "           r d T D 4 $   g     y I = -           } o _ K ; +           } k [ M = )   7       @[ y i [ K ; -        { k ; +        ` @   ^]]]]]]]]]_qqqqqqqqqqqq_rrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqq?/+_^]]933310#353gW#@  ?3]2993310#3#3jyE iy@h    !     O?O   /333?33399//]q]q3333222233332222993333999910!!#!##53#5!3!33!!NXnVTnTNYnXkXnX@PjNulhhlqlhhlqrR$,3@- ))##$11$%$ 4522sY)))x11w1- 1)%}@H@ @ H*sY#"pUe/2]]]2+3/+_^]+33]]9]]]]]]]]_]]+393333333333310%$7.546753.'#4.'>VFS%|*zuX.|4b\2coU%wx ,F[hI !^i C*FXxQ AT7%, t;R8I '3W@5" (. 541Y[+Y  Y [%Y?+++???+++933333310#"&54632#3%2#"&5464&#"3264&#"326Ԣ;ߟ]M[[QO[XRLZ^PP\WQp %ưH6#/9u@F4* $!0,2  :;2''QY, 70? 7QYPY?+?+/_^]]q9/999+999333310"'#"&5%.54632673274&#">&'326yKiW!0oq:?`pG.8gdV`dA{?Jy웆G AFϸ>FvZϦ+byH[g[r5NZdy7h @  ?]9310#3 X"@   ??93331073#&!,. X+"@   ??933310#6'3+43!S@2    *%   ?]]999399]]3]]3910% '7%73-ww- ZgIHHIk)dG C@&  _ Y 7?3]]3+33_^]_]933310#!5!3!X`TT "@ [[/++993310%#65#5&({^XۨjA~[Op@Y//]q+99105![Р~@ [/+93103539??33103i P# (@  sY sY?+?+993310#"!2#"32#rckj1 +@ tY?+3?33/39331035!5%3!gMW<g >@   sYtY?+9?+3993331035>54&#"'>32!g3Oys Ksu||Vt}qɹR^FN(c@9" "%)*%tYMMsY sY?3+?+39/_^]+++99333310#"&'7!2654&+532654&#"'>32$fbw 뗐srqzoŰ/7 6@sY ??39/3+399333310#!533!qh4 6??Lw^JR^@5 sYtY sYgs?3]]]+?+9/+933393910#"&'732654&#"#!!632 9쑤I~?/!uѯ.7AZh"P@+  #$uY sY    sY?+?3_^]+9/+39333310#"3 &#">324&#"326?S51s巖~~bRn[_֙Яi  *@ tY ??+39993210 #!5! زY UY$/U@.+ % 01 "("(uY"""uY-uY?+?+9/_^]+999333310#"&54675.546324!"3264&#"!26{st}#)Ŋyħy xwyu}ݍ`$T@. %& !!sYsY sY?3]+?+9/_^]+39333310#"&'732#"546324&#"32>+6(tĜNMz  ZmϱG~:'@ [[?+/+9933105353k: .@   [ [[/++?+93310%#65#553&({^XϜjA~eH<@'?0p?o/]33]2]29105 eZ;dXG?@( YO_ @YP/]]+_^]+9105!5!dXeH<@'0p??o/]33]2]291075 5eZ㚙on^T'"R@,!   #$ ?   [  _Y?+3_^]/+_^]99333310#>54&#"'6$3253',R]PHF'>NPM<%KvdD;4sDEhP?99FX;rz =n?N~@F)8G@@!18OPY JYCY     4<<%Y<0044-Y4/+3_^]?+99//_^]3++3/+9333333310#"&57##"&5463237332>54$#"32$7#"$5!24&#"32676nsclBqR't%QPNԝ)Ƒ*7^neZ_c}(ӤXXF{{̵Y^mٞKWpW[af}xҝ\R[@6   _Y P`0/]]]]]]qq?2?39/+93233999910!!#3 !&'~?6[ 1dS1EW h@:  _Y$M>_Y_Y?+?+9/_^]_]_q++993333910#!! 4&#!!264)!26AQs}rbBshy^@9  _Y@P  _Y  ]?+3/_^]?+3/_^]933310"3 #"$5!2.(WɣlB.G1%NIQ~<{e ,@ _Y_Y ]?+?+993310#!! )!26ef:~ T@2  _Yy_Y _Y ]?+?+9/_^]]]q+933103!!!!!-2< 6@ _Y_Y ]??+9/+93310!!#!ggb@;  _Y_Y _Y0@ `  ]]]?3/]q+?+9/_^]+933310!2.#"32675!5!#"$gpM$O<ӝJ[UpWx6xnTHr}K  r@  _YP@.Iy      p ` P  ]]]]]]]]q?2?39/^]]+]q+99333310!!#3!3asT|@a@0 9p`P@P@p`P@ ]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]??931033 hF@*   _Y _Y@ `P@ ]]]]q?2/]+?+93310 73265!5!C~_hxrtE#? 4@    ?3?399333310!#33 R͸>/@_Y?+?9931033!R@   pdD4 t`T4gtPD$dD4tT47tD$ dK4pP@? ^]]]]]]_]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqqqqq?3?33399333310!47#/#3>73V 1'8!w%3 pe@noT/;(  P@/    p`P ]]]]]]]]q?33?3399333310!#3&53: aXHXa0@ _Y _Y ]]?+?+993310#"$5!2#"32שŦrJ< MR},- <@  _Y_Y  ]q??+9/+9933310#!#!2)! bQ@a}$?@$%&_Y"_Y _Y & &]]/+?3+?+93310327#"&'&$5!2#"32)f7<]U>rJ< #~p  CR},-h W@/    _Y_Yp ]]]?2?+9/+3933339310!!#!24&#!!26I;͗Iվ{]-@ #/. HI Y i  #@9HF#V#f# #  # _YoYK  _Y`RD?3]]]+?3_^]_]]]+99_^]]+]]+9333310! 732654.'.54$!2.#"R г?r`d53EAvgL+f%w{EV8&%J[zOē!pepoAU;++:Tr.0@ _Y{ K ; $       _ O 0  g    _ O       p _ @     o _ ?   7    o P /      o P @        ` @ ?   ^]]]]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqqqrrrrrrr^]]]]_]]]]]]qqqq??+39310#!5!о圜)I@,  _Y p`P ]]]]]]]]q?+?3993310"$&5332653ۭĹӾ~d M>@& P 0 ` / ?3?3]]q9333310!#373TT  @  |H9* xi:JZ) h|k\K<+ m_M/?m}[M;- 8@o{mK[9+ }k]K=+_  ?333?333^]]_qq_qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqq_qqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]qqqq+q933_^]333]]33]310!#&'#3637>3.$a-&?8 "Ttdngו#s.+ @     K    4 D jT d ; $       { d 0 $       p d @ 4   9      D t $ T T d @  0 wx ?2?39]]]_]]qrrrrrr^]]]]]]]]]]]qqqqqqqqqqrrrr^]]q9333310! # 3 3 XYP} h)b-)@ H v b T F 6 $          p d @ 4 $   i        t ` P D           t d T @ 0 $      t T D $   9    p d T 4 $    @3    T 4       p ` 0 /  ]]]]_]]]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]_]qqqqqqqq??39^]33993393910#3 3 HH9aA J@+  _Y_Y p ` P @ ]]]]]?+3?+3393310)5!5!!ZVW)&@ YY?+?+9310!#3Wu9??33103i W&@ YY?+?+931053#5!Ws 7@o )i~FVVfN&6f6vFVHKH@LBEHDTutTATTtUXH@-;>HrpBRbr9`d_^]^]r^]++^]qr^]qr^]++^]qr^]qr^]^]?9333310 #3΢pry i@ Y/+33105!ij)@[/?/]+993310 53WsN#0@V )).21QY )QY?o  PY$PY2222p2`2P2022]qqqqqqqq?+?+3/_^]q9/+9?+93333310"&546?54&#"'!2327#"&'#'2>=pxyn .*;!DGd[EZcYF_;rRZ$.PQpip|gZSY0dQX`#]@7  $%PY !PY%?%%p%%%%%]]]qqqrr?+???+9999333310!"&'##6533>324&#"326r{32zxy"Yc 6YAXhZWNf@E  PY p`p  PY ]?+3/_^]q?3/]+9333103267#"32.#"`ri"hl ZjV"V@1$#  PYPY$p$$$$$]]]qqq?+?+99??99333310%#"!23'3#.532654&#"52z{2xyhZ6Zby6t*pWNw@F PY  PY PY p`P0qqqqqqqqq?+?+9/_^]+9/93333103267!"3 '.#"uaݺ^H- <@h  PY PY/O_?;_/@VdH@',H 0`@]q++]qr^]q??3+3?+929333210##5354632&#"3iK4-#E>Iz F\aVWK .@d! (0/ %PY+PYPY @0 0000 00P00O000/00000^]]]qqqqrrr^]]]]]qq?2^]]+?+?+99?93333310"&'73 5##"32346734.#"32>${d 3wǻs.HS~vUHWKQ;hiia68Ƅed`@; PYp]]]]]]]qqrrr?+?39?9933310>32#4.#"#3=:}*`Ujc/ro4~= =n@H SY       p         O  ]qqqqqqqrrrrrrrrrr?+??933310533 :W=@  PYSYo?oP@0 O?/=pOp]]]]]]]qqqqqqqrrrrrrrrrr^]]]]]]]]qqqqqqqqqrrrr^]]]]?+?+?933321053#"'52653xxM2>E8 Z Hh @g     ?  ? _   ? _  9 @SVH`   `   0 @  ????9^]qqr+^]qr93323993310!#33 0Ima />v@QpOp]]]]]]]qqqqqqqrrrrrrrrrr??9310334#N)~@)! !  +*%PYPY ! d+K+?++++++++++{+o+;++ +j++++++[+O+++++++++d+K++++++++++k+4+++9+++++t+[+K++++ +++++{+[+K+++++++`+O+@ 0+/++^]]]]]]]]_]]qqqqqqqqrrrrrrrrrrr^]]]]]]]]]qqqqqqqqqqqqrrrrrrrrr^]]]]]]]]]]qqqqqq?22??+99?+9933393310!4&#"#4'33>323>32#4&#"Vps:l{8qVpvxS*,9OsZbkm`/xNa@<  PY  p]]]]]]]qqrrr?2??+99933310!4.#"#4'33>329*\Y>ykv4S*,9Op]/VN H@, PYPYp`P0]qqqqqqq?+?+993310#"!24&#"326꽅!0WM$]@7 &%PY "PY&?&&p&&&&&]]]qqqrr?+???+9999333310!"'##4'33>324&#"326rV0ƽzky?{"ʼY61fd]ZVWN"@T$# PY PY@$ $$$$ $$P$$O$$$/$$$$$^]]]qqqqrrr^]]]]]qq?+?+99??99333310"!234673#7#4&#"326{66Ҋxy6We;6k[>N#@  ???3399331034'33>32&#"+pf$%$r%f 9K*d@<" +, "PY PY,,,,,`,,?,,]]]qqqqrr?3+?3+999333310#"&'732654&/.54632.#"!XbJʳnzt0^~I(+WQTT@P"(MnP~HMJK.<*%$=Ja*,E@$   PY    @PY]?+?_^]3+393332310%#"5#53733#327*Y]}5x3?$D҃UN?:_@;  PY  p]]]]]]]qqrrr?2??+3993331032653#.'##"&5:*\Y>y:Rkv4s*,9Op]: \@     ` T D          ` T D   g    T D       [ D       [ K   7    [ K ?          ` T D         ` P /   ^]]]]_]]]]]]qqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqqq?3?39333310!#3?3ew 8#':@(uv:@    vfTF6$fTD6itfF6$iVD6r`T$8tK0$@0{dD4d?^]]_]]]]]]]]qqqqqqqqqrrrrrrrrrr^]]]]_]]]]]]]qqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqq?3?33^]3]93233333310!#'#37373ѽ$ &Ѳ$.Ͱ-0:!J[: T@    v D T d 6 $         v d   & F V g F V  d V D 6 $      & 6 F 7f  @6=BH9 "       t ` T @ 4   @"H   P p  ?3?393^]_]+qqqqqqqqqqr_rr+r^]]]qqqqqqqqr^]]]]]]]]]qqqqqqq9333333310! # 3 3 ! D,[W:@  PYtdRB4$tdVB4$gtdVB4$p`TD0 p`TD0 7@Z`TD `P0 P/^]]]]]]]qqqq_qqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqq_qqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqq?+?33339333310"'532?373J2&.bSLF`CtW +5' ƭSS: b@ PYPY      t d T @ 4            t d T D 4 $        t d T D 4 $   7      d D          d D $        p P   ^]]]]]]]]]_]qqqqqqqqqqqqrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrr?+3?+39331035!5!!S]s&ڋ"W#_@: "$%YO//O Y!Y?+?+9/_^]qr+9933310"&54&'5>546;#";inmj?[MjXYiM[?Wiussujkl^ajmN]A@t`TD4$td hpdTD4t;+oP@0 8p`P@0 p@/^]]]]]]]]]]]]qqqqqqqrrrrrrr^]]]]]]]]]]]]_qqqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqq/?9103N~"W#_@: #$%YO//O ""#Y"Y?+?+9/_^]qr+99333102654675.54&+532+5^[OhYVkO[=#534632.#"!!!27PFYVē"oGrph\M7.yym9@Ks}~w)qs'B@!" ()) Y@%Y /33+22+_^]993333331047'76327'#"''7&732654&#"Ndhcrrah`PRdfermiffNsrqqrdgeRPai`urdieNPiifruvuv@O   QY QY/  @)-H   ??39/]^]33]+q2+3+333933333933223310!!!!#!5!7!5!3 3A}@[sw}/}yN]U@  t ` T D 4 $       t d    h   p d T D 4      t ; +        o P @ 0    8   p `      P @ 0         p @ /   ^]]]]]]]]]]]]qqqqqqqrrrrrrr^]]]]]]]]]]]]_qqqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqq?/99//93331033  sT3@@_$4 11+.:++BAy$k$\$8$>>5>7 7z7;7 F    7>$!QYQY?2+/3+9_^]]_]]]]qq]]]]]]]99399333322323102&#"#"&'732654.'.5467.5464&'>L}uȽ`r tLMP©!ܧܨ$#yh!ED#-@Q,!''./(YH H$$Y P  Y///p/`/P/@/]]]]]]]?+3/_^]3/+39/3+++99333333310"&546?54&#"'>32327#"&'#'26=l~FQCQ #1"IQIZvTtgt|7>54&#"'>32!+kaXGJDX zd3gEJDp:>KIDk{nZ\-q'%@O"   &'#  Y?O/?O  YY%5E?3]+?+3_^]]9/_]]+9993933933310# '73254+532654&#"'>32 =9P\JGDT VZ[jt mHA?>733267#"$#5,R]QGF'>NPM<%q2KvdD;4sDEhP?99FX;rz R&$N&%+5+5R&$@ &L%+5+5R&$`@ &%+5+5R&$ ^@ &&%+5+5R&$ l@&%+55+55R&$+@&6ESs"b%+]]]]55?55o@;  _Y _Y  _Y _Y?+??+39/_^]+9/+9992223239910!!#!!!!!#! E !d<?hNy&&z : %+5&(? &  %+5+5&(@  & (  %+5+5&(w & %+5+5&( y@  & %+55+55 &,&%+5+56&,F@ &E%+5+5h&,@ & %+5+54&, @&%+55+55e T@+    _Y  _Y _Y?+?+9/_^]3+399333339103! #!#%)!!!26fj:~!`H9 &1 @ & # %+5+5a&2&ش%+5+5a&2%@ &%%+5+5a&2@ &!!%+5+5a&2 &$$0%+5+5a&2 @ &%+55+55s #@   /q933310 7   bh^^i`fJb`g_iiaG$E@#  &%""_Y_Y &]?3+?3+999933339910#"'#7&!2734'32&#"שxȮrJyɬb;ze|pKR}n[-UX)&8&%+5+5)&8@ &%%+5+5)&8@ &%+5+5)&8 @ &%+55+55-)&<@  & A %+5+5 6@ _Y _Y  ??99//++99333310#!#3!24&#!!26tۖb߀ŏ1m@A,' ', 23$+    $$PY$  PYp3O3?3]]]?+??+99_^]_]]]]]93933210#"/32654&'.5467>54&#"#4632p4E\bUa\[96:5mqO"7R0'1(VO@f:6V=d-0T2M]案gH1&;9 |Ws&DC11&225%+5+5Ws&DvT@ 1&1 14%+5+5Ws&D22&771%+5+5Ws&D11&::F%+5+5Ws{&Dj@ 11&5ʴ53%+55+55Wss&D@ 44&7ȴ71%+55+55BN'4;@^- "4;4455&&&<=5'PY 555 " $$8PY$(QY ?o  PY 0PY PY ?3/]]+?+?+3/_^]q9/+?+999/_^]+99333933399333103267! #"&546?54&#"'!263 %32>5%.#"uafOҒoy~q .cvPÅBd]fW^H-u;oP\$5eJWaYVīWNN&Fz ( %+5W&HC& %+5+5W&Hvp@ &T %+5+5W&H@ &   %+5+5W{&Hj@& %+55+55 &C&´%+5+5/&v?@ &?%+5+5i&@ &  %+5+55{&j@&%+55+55V''s@$   "()   PYP@  H$ 4 D   R    %%PY?+?99//_^]]+]3+3/99939210"54632&'57&'3%4&#"3266^m}mPZ2ӫ<;rr^WG$Bp\j&Q@ &$$0 %+5+5V&RC&%+5+5V&Rvg@ &I%+5+5V&R@ &%+5+5V&R@ & ,%+5+5V{&Rj@&%+55+55A$u J@*   YP @YYO?]++_^]+99933310535!53ި,\"}@N $# PY PY$$$$$$$$$$p$`$P$@$ $$]]]]]]]]]]]]]qqq?3+?3+9999339910#"'#7&5!2734'326%&#"XvdSs[QDCbt֊0[iɅ\X݂U1Q&XC& %+5+5&XvW@ &5 %+5+5&X&!! %+5+5{&Xj@ & %+55+55W&\v@ &6 %+5+5W!>@  "# PY PY??+?+99?9933331033>32!"'##4&#"3260rVzky?{YAXd]ʼYZW{&\j@ & %+55+55R&$hI@ &%+5+5WsS&D11&2ʴ21%+5+5R&$ y@ &%+5+5Ws&D11&4̴4:%+5+5`c&$ ϴ%+5WUsN&D:´::%+5hy&&S@ &~ %+5+5W&Fvg@ &r %+5+5hy&&@ & &  %+5+5W&F@ &  %+5+5hy&&"%@ &' %+5+5W&F,@ & %+5+5hy&& @ &&" %+5+5W&F@ &" %+5+5e&' f&%+5+5V&GK@ ++S++%+5?5eVm*s@-%+,QY/ (PY@ H"PY?,,]r?+?++99?9/_^]3+3?99333339210%#"!23'5!5!533##.532654&#"52z{2,xyhZ6Zby)6t*p&(zI & %+5+5WS&H@ & %+5+5&(  & %+5+5W&H@ &# %+5+5&(% &  %+5+5W&HD@ & %+5+5U&(P´ %+5WUN&H}###%+5&( o & %+5+5W&H&" %+5+5g&*@  &%"%%+5+5VW&J@ 00&55/%+5+5g&* @ &"'"*%+5+5VW&J@ //&228%+5+5g&*5%@ &'!%+5+5VW&J-@ /&//1%+5+5gN&*N #.#%+5VW &J877&//3%+5+5 &+@  &  %+5+5>&K@&%+5+5@#   @(H _Y_Y @ ?2?399//]q33+33+_^]+]q99]]333333333310!!##5353!533#5!fs-  s@#!"@"P"`"@"""""@HQY PY H?++?39?9/3+3+_^]]qr393333310>32#4.#"##5353!!=:}*`U,YjcWro4= &, @ &  %+5+5&@&   %+q5+5 1&,I@ &%+5+5 1S&@ &%+5+5l&, @ &%+5+5l&@ & %+5+5\U&,  %+5U}&L@ %+5]|&,'%@ &%+5+5v: @$t4$n@4$tdk4$8td+{k@0 p`@ ^]]]]]]]]]]qqq_qqqqqqrrrrrrrr^]]]]]]]]]qqqqrrrrrrrr^]]]]]]]]]]q??931033´:I&,-W&LM@o0]55]]55 &-7@ & %+5+5W/ @ [/? PY?/o?oP@0 O?/=pOp]]]]]]]qqqqqqqrrrrrrrrrr^]]]]]]]]qqqqqqqqqrrr^]]]]]]]?+?/_^]+9333393310"'52653#'##53MM2>E8xjihW Hh@nN?&.ʹ  %+5N&NN  %+5: A@%   ?  ?2?39]]39333310!#33 0Il~: //&/&^ %+5+5[>&ON@ &K%+5+5N/&/ %+5~NG&O%+5/&/@  %+5?5i&O$K)@O/p  %+5?5]]q/&/ _%+5&OBT%+5/ F@%   @    _Y?+?9/_^]]9993333310!!573%hyUU I@+   O    p  ]]]]]]??9/]99333331035737zz||DDXHGz &1@ &I %+5+5&Qv@ &a %+5+5N &1 %+5NN&Q[  %+5 &1 & %+5+5&Q&# %+5+5P&Qb$$״$$ %+5?54$=@ !!&%_Y_Y?2+???+9933310"&'732>54&#"#336$32_;ZjIU&wyHMJJsnOBheD=aqWN#;@!!%$ PYPY?+???+9933310"'52654.#"#4'33>32M2>E8*\Y>yxW Hhkv4S*,9Op]a&2I@ &%+5+5VS&R@ &%+5+5a&2 @ &&%+5+5V&R@ & %+5+5a&2 @&]$%+55+55V"&R @&g %+55+55a _@4  !"_Y _Y _Y _Y_Y"]?+?+?+?+9/+9992399310!# !2!!!!!%27&"#"CpFkiLoR4,I OLy <WV2N%,}@E! ,&-.,PY ,,, )PY  PY #PY  PY ?3/]]+?+?+99?+9/_^]+933333993103267! '!"3 6! %4&#"!26.#".uay|u~?*^H-!'S@h&5& %+5+5&Uv@ &J %+5+5Nh&5 %+5NN&U^ %+5h&5 f& %+5+58&U8& %+5+5]-&6vI@ .&.[.1%+5+59&Vv9@ +&+]+.%+5+5]&6r@ //&44.%+5+59&V@ ,,&11+%+5+5]N&6z 2(2.%+59NK&Vz //+%+5]&6 s@ ..&006%+5+59&V@ ++&--3%+5+5.N&7z^   %+5N3,&WzP@))/)_)o))?)O)_)o)))))/)_)))))))/)?)o))))) ))_)o)))))))/)?)o)))))) ))?)O)o))))))) )%+5]^]qr^]qr^].&7 !& %+5+5&WK%+55.J@*   _Y _Y   ]]]??9/3+3+3933310!!#!5!!5!&85@'`pg&6FSs%+]]]55?]55s&X@&!! %+55+55)&8 @&Q%+55+55&X@&d$ %+55+55U)&8 &g@% ) )P)`)p)))))]q+5U:&XW$$$ %+5 &:y&  %+5+5&Z&%+5+5-)&<[ & %+5+5W&\@ & %+5+5-)&< h@ & %+55+55A&=@  & J %+5+5S&]v5@  & ] %+5+5A&=|%@  & %+5+5S&]  %+5A&= 8@  &  %+5+5S&] & %+5+5 c@)`p@"%H?`  PY??+_^]]q+qqrrrrrrr93310!#4632&#">K4-#E> F\ +h@1&&,- )PYQY#PY H??+]q+9/3+3?+99?93333310353!!3>32!"&'##65#4&#"326 12zr{3Uxy9AXhZYc 6f!*\@/ ''"+,''_Y' ' &`Y_Y?+?+399//+99333339310#!#"&5463! 4)!264&#!!26MBsQADG18J=}~rbBs U@  `@#H _Y _Y_Y?+?+9/+_^]+]99333310#!!!!24&#!!26Hy%H@%  &'PY SY #PY?+??+?+99993333310!"&'##65!!3>324&#"326r{32zxy"Yc 6AXhZ 4@  _Y  _Y?+?9/+99333310#!'5%3!24&#!!26uە%8{i!x &@@ !!  '( $PY PY ??+?+99?9933333105%33>32!"&'##654&#"326 32zr{3xy!YAXhZYc 6_[f:@   _Y _Y ?+?+99//9933310%2# '6$3 ! 7ݗX7Bj<-؈* :Nx]1%NIQ~GM<{W$O@(  &%PY "PY PY ?+?+99//9+99333333103267#"32>32&#".#"`j v/4$+B7ri"hl Hy GMZje<@ ! `Y_Y?+?+39/933310#!#"&5463! )!26MBf:~DG18J=Q ?@   _Y  _Y _Y?+?+9/+993333104$3!!5!!"$73!!"Q|R%K@'  '&PY SY #PY?+?+?99//3?+993333310323&5!5!#.5## 32654&#"Rz23{ryx"ZhXA6 cY0VWN>@   !PYPY PY ?+?+?+9933339910!&/.532!4&#"32>dniZDdq}?YWX քUY :@   _Y _Y _Y?+?+9/+9331035!!5!!5!Y2-Ĝ^E@# ! _Y  `Y _Y?+?+99//+993333310%27!&$#"'6$32#"$547 'Ǜ9N30͢~y9M%>X&X@- #$$'(`Y## _Y !_Y?+?+9///+9993333339910".5467$4$32.#"!3#"3 `키 F2~bGGwUgw7Ш=vtevMW:@ _Y_Y _Y/+?+9/+933310!!#"'7325!g=R#3$hCNC@#    PY QY //]+9/3+3993333310&#"3###737>323;<@OF J^-g^a*X@.#** ,+!&_Y!_Y_Y _Y?+?+99//9++933333310.#"32675!5!#"$5! 54632&#"<ӝJ[UppM!z6B8 G>xnTHr}KWx{GM W?@"       _Y/+?3993392310"&54>73 34&'326s*OY?4""4.((.Wz-iivAy9GG:5;:$E@$ "" %& PY PY?+???+9?93333310"&54&#"#3363232653scnyzlɴE|~= ͺyy3>@ ??9310334! ,@  `Y??9/3+39333103#5333#Ħa`?H@$  _Y?3?+?99339933333910!#4632&#"3 R͸BB29~idU@+ SY QY??399//+?+9/33339339103 ##4632&#"IBB2B:/m ,@  PY??9/3+39333103#5333#ppmma`A@!         ?3?99//9993333310#&'#''7'37ʟþ)+D.I6:?Apf.kʽCvE͓9!F@$ #" _Y_Y?+?+?3399?93333310"'# 332653323#'\xc0cXwodw 2gGGCfUQUW 1@ _Y ?2?99/+993333103&53##"'5325 H1,8sHXa֐ VN3@   PY  /???+9993333104.#"#4'33>329*\Y>yVXkv4S*,9Op]aa%H@% &'`Y _Y #_Y?+?+?99//+99333333310#"$5!2>5#53#"32שŦrJLHXEXs} MR},jIj{=jw,-VN G@#  !"  PYPY?+?+?99//99333333310#"!265#534&#"326Xxp!0Aj0GaXL@@    _Y _Y/+?+9/3?3/933310%#"$54$32%3#/&#"327mwȥ:ԣ+d eU45LGG@m..VWNB@"   PY PY??+?+9/3?3933310##"!2%3"327&9QR3D+z@84W?',!0+Ar.B@"  _Y   `Y ??+399//+93333102#!##"&5463)! bMB{@DG18J=VW)F@%$ +* PY SY  'PY?+??+?+999333310!"'##4632&#"3>324&#"326rV6'%8<}0ƽzky?{"ʼY[d]ZCI@%  _Y_Y/??99//++3993339922310 !#3!2 4&#!!26g}uQվ{b*;@% ,+$ (( _Y( `Y?+3?+993993333104>7>54!"'>3 !2>7! $b>xP32^Kvf4~ZgK>Y@w!ĵMuUD()IgMB~%OK%;@!&' ##PY#  PY?+3?+993993333104>7>54#"'>32327!"&OQ\1oҷLd3:L{+[{Q##+=.V`RqN"'/C3ƧlUCW$;@ &%QY SY"QY?+?+9/+9333104632327#"&5#"&732654&#"Co^;:64EA=ThM<01<;20<ZeDK  gU1<<10<<W*,E@$  QY PY SY?+?+?3+393333310#"'5326=#"5#53733#327*CD82<6}5x3?$DBGq҃UN?3@   _Y??+39/933310##"&5463!оMBn圜QLr@@   `Y _Y?+?3399//+9933333310"$&5332653>5#53ۭĹӾysXé~dmt_j:%R@*$ $&' QY   %!PY!??+?339///+39933333331032653>5#53#.'##"&5:*\YsYXÐ>y:Rkv4sb#oej/*,9Op]W#K@& ! !%$ _Y _Y _Y?+?+?+99993399332210 47+5!32654'5!#"'њ6MM6O&Ts _` q&-@ _Y _Y?+??+9933310".53324&#"'632N[:2CNc ]-,@    _Y?+??9933102.#"#3 ><;T^%$1 rT7x-3-0H9aVGW<@  !  !SY PYPY?++?9?+99339910"'532?37>32&#"J2&.bSLF* McQlRDHa3D]W +5' XYj0]>T>G@%   `Y _Y_Y?+?+9/3+39333310!!5!!!!!5!> S l].8/:E@$   PY PYPY?+?+9/3+39333310!!5!!!!!5!/ 84_{iF[-VJ@&  `Y  _Y _Y?+3/+9/9+933333310 !5!#"$'7!2654$+SvGHFVF@% _Y`Y _Y/+?9/9++393333310#"3 # 4%5!!AGcqvS%j؋lHA3ꡜ]U$;F@$QYPY PY/+?+9/9+933333310!#"3267#".54675!KRQQ׍uؽs}\bx mNV:(R@+(#*)PYPY#(&PY/+3?9/99++39333333310#".54>7>54!5!3 7(ҊiUrddtOa4BeL\OnN+*Q:J=*w wRlH+".A0IRZ $N@( &%$$`Y_Y `Y?+3?+9/3+3933333310!>54&#"'>323!!!5>7!ZPJIys {A}d[%lPEOt}qɹ:ppt?WrY&D@$ _Y_Y `Y?+?9/9++393333310#"&'732654&+#5!!32&"#qJN«~uʜ._:G@%  PY PY PY?+3?+9/9+933333104!##5!!32#"&'732ۧ B6Ѽ" \U ]u$)B@" '$  ) +*&"#"QY'#PY?3+?39+3?9333310#"&'732654.'.=#5373[!RLfH2!j$HkFkTD-"*2CR7WQPX1?*+}[NWVM8@  PYPY??+?+999333310#33>32!"> ,pӾppdiEa`RKd@ ??9310334 @ ?2?3993310333344r:R@*   _Y _Y ??99//3+33+39333333310!3!!!!#!5!!rrrtt:̙`4 j7&''=d &+5 a&'']H &+5V&G']d --&+5&/-W &/MW&OM /&1-W&1MW&QMdR&$ c@ &%+5+5Ws&D22&4۴4:%+5+5l&, @ & %+5+5& 2G&@. %Opqr]qr+5+5a&2 &$%+5+5V&R@ & %+5+5)&8 &%+5+5&X&$ %+5+5)+&8 3@& %+555+555k&X'j?@%&& &0&@&P&`&p&&&&&& %+555+55/]q]5)+&8 4@!!& %+555+555&X'jv)@&&&& %+555+55/]5)+&8 5@$$& %+555+555&X'j)@&&&& %+555+55/]5)+&8 6@!!& !%+555+555&X'jCp)@&&&& %+555+55/]5VNA@!  PY PY PY ?+3?+9/+993333104&#"'!2# 53267ZuaX#C^H-?R+&$ 3@&%+555+555Wsk&D'j!@?<<<0<@<<<11&+55/q]5R+&$ 7@&%+55+55Wsk&D'.!@7?77707@7744&+5/q]q5&I&C%+5+5BS&X@ ==&>>?'%+5+5g &j@9%% && (' &&`Y_YO  _Y !_Y ?+?3/+99//_^]]+3+39333333310!5!5!3##"$5!2.#"32675!L[UppM$O<ӝJ\kYr}KWx6xnTHVWhK)6h@81 ** $$78' QY$ @4PY@ H .PYPY?+?+?9/++2+399333393310"&'73267!5!75##"&632346733#4.#"326${dixr3wƼs.QHT~wWKQX\5hiia6v[Ǭg&* @  &""(%+5+5VW&J00&228%+5+5?&. @ & %+5+5&N  &ʹ %+5+5aU&2lVUN&RraU&2'lI@ 0&00/%+5+5VUS&R'r@ ,&,,+%+5+5-V&y !@ &$ %+5+5DW &T@ & % %+5+5W(&@ &W %+5+5 j&'= a&']V&G]dg&*G@ $$& _ #%+5+5VW&Jvk@ 44&0d03%+5+5a@  _YP@Iy `Y ??+??39/_^]]+]q+9333331032653#"&5!#3!3 vu3̲#sTW:@   _Y _Y /??+?+999333310#3>324&#"6Կ?oÐ_V#;H*Xabbu:- &1W& %+5+5&QC & %+5+5R>(.@j " )-  0/0000@0p0000 ))Yp&+++++@ H`++ ?&&&&/3//]]3339/]32/]+]9/]+3/_^]]q993933293310#!#.54632!&'4&#"326573;.á~$1=dd 5jN89NH6 :Lp7aDsc8Z1U&D'UvcZB@&N?NONNNpNNNNFF&IIL%7Դ71%+55+5+55/]]q5&& %+5+5B&v@ <&<&<ٴ<4%+5+5N&(tj@ & %+55+55W&H@ %%&"" %+55+55$&(j& %+5+5W&H:@ %&%% %+5+5ilN&,j@ & δ %+55+55WZ&@ & %+55+55P$&,,j@ &%+5+5B&@ &%+5+5aN&2j@ &&&## %+55+55V&R@ ""&%+55+55a$&2 j@ &&&&%+5+5V&RD@ "&" "%+5+5hN&5lj@ ""&e %+55+55&U@@ & %+55+55h$&5j"&"" %+5+5l&U@ & %+5+5)N&8j@ &ϴ%+55+55i&X@ &&&##  %+55+55)$&8j@ &%+5+5&X2&&&& %+5+5]N&6 228%+59NK&V //5%+5.N&7  %+5N*,&W@!X!!/!}!!/!?!O!o!!!!!!! !!/!_!o!!!!!!! !!/!?!o!!!!!! M!!o!!!!0!!!<@!!! !0!!!!@!!E%+5]qr^]^]qr^]qr^]_^]@U"F@!  $# _Y/3/?+3/9/33993333399105$54&'5,54&#"'>32W^*%IuAs>Uq8U@Pha2I(r𧆉TlOftY\<!V.N$D@ "  &%" PY/3?+3/9/3399333339910%5>54&'5,54&#"'>32.p@)! `eefiyr2@[0X_vGGuhA<ёmeV[!b{8) &+  & %+5+5&K @ &"%+5+5W1@    _Y  /???+999333104.#"#36$32E?yoRJWT}DbRO\VVt!-9g@7.4( " ;: 7PY +PY1PY%PY?+3/+?+99?/3+99333333310%#"!23'3632#"''67532654&#"4&#"32652z{2A G=4?hZ6ZbywSq>u`pU0AP^9]w'2^@2.$(  34!+!+`Y`Y!! 1`Y '`Y?+?+99//++9999333333910#"$54675.546732654&'4&#"3 ~~彩܉ARŢ|%}aSTY^yl|_,'4P@)"  1%+65((QY"!.PY?+?339/+99993333339102654&'7#"&54675.5467"32654.E}QII{po{IIQ}Ij}Q~#qDp ɏԐ pDq#~Q~WNA<@ _Y @_Y?+3?+39333107!5!!2'654&#!AZ|GMV~MM"8 G>1 ::@  PY PY?+3?+39333107!5!!2'654&#!18jGM&psGV"1'?<R&$%@ &%+5+5Ws&DJ44&2۴24%+5+5N&(zWNN&Hz2a+&2 3 @""&  %+555+555Vk&R'j%@!!?!!!0!@!!!&+55/q]5a+&2 8@'&''3%+55+55V&R'J@/22?2O2_2o22&+5/]q5a&26%@ &%+5+5V&RE@ &%+5+5a+&2 7@&!!"%+55+55Vk&R'K!@?0@&+5/q]q5-)&<eI@  & %+5+5WS&\@ & %+5+5V>@ PY   PY ?+?9/99+393933310632#"''674&#"326>D;H{JOnb9:&> G=4?swSq>uV0AP^9VtN(4f@9  /$()(& 56$(""2PY""" "PY ,PY?3/+??+9/_^]+99333333104.#"#4'33>32632#"''674&#"3269*\Y>yD;}H{JOnyl9:&> G=4?kv4S*,9Op]nySq>u`0AP^9,%]@1  '& PY #PYQY@QY?+?+?3+9/3+3933333331053733#632#"''674&#"3265xD;H{JOnyl9:&: D<4?wSq>u`N30ATZ9W=: @  PY?+?39310#"'52653=xxM2>E8 HhS!-9c@6.4( " ;: 7PY1PY +PY%PY?+?+9??+?+?933333333310%#"!23'33>32!"'##532654&#"4&#"32622z{22zrdxyxyhZ6ZbyYAXhZïpSWL!.:_@55)/ " ;<%PY 2PY8PY ,PY?+??+?+?9?+933333333310!"'##7##"!23533>324&#"326%4&#"326rV4}50ƽzky?z*xx ̼YegU6Xdd]ZR f@7  _Y_Y `Y ?3?+9/99+3/+93933333210!!#7#33 3.'3#q¢A?fݢTq6, 1&Pkh1Sqhy%@O  !$ '&#@P @_Y$  _Y ?+3/_^]9?+3/_^]9933333310%&5!273&'3 #"'#"&VwwlBNtz=?p(Wл[I-[{b.Q~1W%NDe& W%e@9 !  '& @PY!  #PY?+3/9?+3/99333333107&323&'3267#"'#&#"I<Ɂ "7Q`tXŎ -0",Y5=VD..#hl %F˰e / ?@   _Y  _Y ??+9/3+399922231033!!!!#qy*W.L@)    _Y _Y ??9+3/+9339933210 ##!5!733#A@C(;iiGVK;R@), 33&&=<3))0PY-)  PYPY?3++9?3+999933333310#"'3267#"/&'&'732654&/.54632.#"!FE"6`8g8~ICM9uXbJʳnzt0^~I(+ !q;*RTaWX=TT@P"(MnP~HMJK.<*%$=Ja1V:;@ PY PYPY?++3?+9933331072327#"./.+5!5!>QBD2 4<`8g81NE:%DN8/P#Dq;18G, $3L8@ `Y `Y??+39/+933310!3 4&#"'6$3 4KT$ ƹuvPN<@  QY PY ??+3/9/+933310!2654&#"'>32bmףۣ{Ï&!&i@5# # ('#`Y#_Y##_Y"_Y?+?+9/+9/3+39993333333399103! #!#%4)!!!264&#!!26!ć\sQA}UGrbBs)M@&   ! _Y_Y?3?+9/33+3399333333331033!33##"$&=#26=!)uuuu)XX~~s M8@ o 0 /  ??39]]]]93333103#'#H?zTT|  @U _Y _Y@ _Y _Yy_Y_Y?+?+9/_^]]]q+3/+?+?+933333933107#!733#!!!!!!3!kLFFS:|kj5<DX&"&*@J' )  "## ,+"#PY""**PY**%%PY)PY ?3+3?+399/+9/3/+?933333933310&323!3267!"'&#"%&'D^JͿX4Bua`PL3?M| E8ppi HhO欬aW#D@" !%$ _Y_Y_Y?++?+?9999333310327#"&=# !27327&#"5873/:NrJàvs sQC[UR}M8gdVWN ,I@&! '.-PY $PY *PY?+?+?993?+9933333310%7##"!234673327#"&54&#"32656{687&02J|xy1k[6We;lQC hO@'  _Y _Y ?3?+9/3+339933339922310!!##53!24&#!!26I;͗IIվ{NE@# SYPY ??9/93+3?+993339333103#5354'33>32&#"3#zz+pf$%$<r%f ϒ-)D@$   `Y  ??39/933+3393932103###53'3!73!ؾғ2?Ha'W:"X@. $#PYPY PY?+?9/993+33/+?9933932103##"'532?#533!3?!yoCtYJ2&.bhuFF+LS +NUUo'N#0W@.) .12QY)QY!)) PY$PY?+?+3/9/9+?+93333331023267!"&54&#"56323>"7>54&֣px{m .|*;!DGd[@]cYF_N;rTXܻPQpipxkZSY0cRX`VN">@ $#  PYPY?+?+99??99333310%#"!23'53#.532654&#"52z{2xyhZ6Zby/6t*p~N">@ $#  PYPY?+?+99??99333310>32!"&'##4'34&#"32682zr{2&xyhZZby/[6t* ,F@%!'' .-$PYPY *PY?+??+?+999333310!"&'##654632&#"3>324&#"326r{3BO:E?E2zxy"Yc 6ӏLHhZ=N6@  PY PY ?+3/?3/+99333104&#"'>32#"&'7326ir٧`"jZẜ lhMN+d@8 $* ,-*'PY   PY  PY?+3/?+9/_^]9+993333310"''67&532.#"63 '2>54&#"1p4#|H%cri" e}Sq=@32cltpt`Z]pi^ʢy!^]W`\NR]C5N3~@G1#// *541PY&,SY/!! &&PY PY?+?+9////_^]q93++9933333339910#"&'732654&+532654&#"'>3273267#"&'cltpt`Z]pi^ʢ"/2%=";~U[!y!^]W`\NR]e\DC4yp7KN&T@- !!'( PY   $$PY$PY?+?+9/_^]+9993339921032654&+532654&#"32#"C~rltpt`Z]pi^y,[^]W`\NR]Co V':<@  QY PY QY??+/+?+9333310733##"'5326=#5۴K4-#E>ӃI F\{VW'5T@,( /6"7$PY ,PY2PY PY?3+?+?+99?+39933333310%!"&'73 5##"3234632&#"4.#"32>;{d 3wǻs. &729@AHS~vUH8KQ;hiia1 NFyedVWKJ^NE@#PY PY PY?+?+99//+993339210!#"32.#"3275#@Kzrig^DK"ZjCW:A@$  PY ?3?+993392310%3 3#"&54>4'326w5>l}kj}%LK'$%'!]umm(Z\SQ.43A 8P@- !4$!,9:4$/++//(PY/ PY PY ?3/+?+?+3/993310%4.'322'&#"#"&54?.#"'>32?> )  GHL8r!??#-3R}kj}P1-#?>"r8Lau)77(u*3L00/]`\o2[55^QjxxjV]055[2o\`WnFFmXo;-@  PY?+?39/9933310%#"&5332653#??;{*`Um`Rro4~4J7@ !PY PY?+?39?+933310>32#4.#"#!2&#"=:}*`UEI5B~ jc/ro4(`?W'B@$ # )( %PY  PY PY?+?+?9?+93333103>32!"'53254.#"#!2&#"C :}3U:=u*`UEI5B~J?jc!ro4( 7@  SY  PY ??9/3+3?+933310333###53qrrqqi/<V: @   SY?+?99310327# 3 97!,2-%QF (#D: 7@  PYPY?+3?+3933310%3!53#5!#Rό#D@" PY  PY ??9/+3/3/3/+339333103&#"#>3332673#"''kT7 Z`#0/h|yB/0rrxZH@%  QYQY   ??99//3+3+393333310###"&546;33!5#"3Zdf3;nYYkc{ <3iW @  PY?+?39310327# 3:977/E-sQC(MWOW@.  !  PY PYQY???9/++3?+9/933333331033!#"&'732>54&+5!璼'7aORn䁘_aS$:)H@%"( (*+) %PYPY ??+?+?339993333331032653#.'##"&'##"&533265Vps:l{8qVpv:Rxs*,9OsZbkm`RxsW:#D@# "" %$ #PYPY ??+?+?3399933331032653##"&'##"&533265Vps7n{8qVpv:RxsXkXbkm`RxsW#N1Q@, 1((-23*/PY*$PY$  PY?3??+99?+?+933333104&#"#4&#"#4'33>323>32!"'5325qVpvVps:l{8q3U2ExxxS*,9OsZbkm`WN":@""$# PY  PY ??+?9?+9933333104'33>32#4.#"!"'5325>y*\Y3U/HvS*,9Op]/kv4 WN"=@ #$PYPY?+???+9399333310327# 4.#"#4'33>32u>,@;*\Y>ys(/kv4S*,9Op]:.@ ?3?39999333310 '3#&'#<%3(!:SJ}:GbAg:VN K@)PY PY PY?+?+9/_^]+99333310#"!2267!"!. I !04XVN!k@: #"QY PY PY PY PY?+?+?+99?+9/_^]+9333333310!!!5#"!25!!4&#"326GWsvq]q!0q]SWN(H@% &&*) ##PY#PY PY?+?+?+9/9933931032654.#"326= #"&'#"5uprwiiwrpUM|ʸzM`úoo䗻`xz}%NVWR@-   PY PY PYPY??+?+??+?+9333333310&%34&'>%ihrqiejlcW2~-fD++:*@ SY ??+?9993310#/##"'53265%"?[E$%$32&#"+pf$%$32&#"327# +pf$%$r%f YQC (N@ SY??+9931034>32&#"\;%$<}mf  WN@ SY ??+993104&#"5632fnx<$%;\W f0: I@%    PYPY ?3?+9/+3933399310!#!2##!254&#Bθؕctk:?\[0: B@!  PY   PY ?+?39/3+9933333991033#!32654#!BLٷ2ls?:O[\9WK5T@-**44$$.4672,PY2)''PY'PY?3+?3+9?+933333331032654&/.54632.#"#"'327# XbJʳnzt0^~I(Эoz9*"$+WQTT@P"(MnP~HMJK.<*%$=Ja>; (WN(@  SY SY?+?+339310"'532>54632&#"O7<96=k,1BMKW,UhiuW F@%!"! PY SYPY SY?+?+?+?+3339933310734632&#"3##"'532>=#Y21BMKO7<96=޲iGF,Uh%W:N(@  SY SY?+?+339310"&54&#"5632327KKB1,W849<7W ffW,VK&Q@*"  '("  $PY SYPY?+?+9/+93399333310/#".54632!2&#"%3265&#"FTQI{I@D$k,1BMKlyvA/>IN9:6VXe=qTv+bi`86_O1A*A@"  QY QY PY?+?9/+3/+39333106323##5#534&#"Y]}5x3?$D}ԃN?W*,6@  QY PY?+?3+3933310#"5#53733#327*Y]}5x3?$DokN?Q:&R@)  ## ('"PYPY ??+?39/933+3399333333310!33##.'##"&=#5326=!:ll>ykk *\://*,9Op]{=Xkv4T6:/M@)$(- -10"%PY"( PY PY?+?+9?+993399332210"547>54&+53232654'&546;#"ET3!++R|YmCDCDnX|R++ 4TԌvH@*gW_tt]]tt_Xf*>Iv:)@  PY?+?39933310#"&533 4'3ŵpA15:;cav: *@   ??3993333103#'#4#':uv>:+@   ?2?9?3933103?3#.'#&'#0ѯ#' /+&:Mg]#.խ"&3,@   PY?+?39933102&#"#.'#>BJ2&.bHD@r +V6O:V :&@ ??39933310!3 3g,5[{K1Wr:;@  PY PY PY?+?+?+3933310327#"5!5!5!!+75%C:,8jsQC (&1N): Y@/ "!PYPYPY ?3+33?9/++39333993310%>32+'7!5!5!%"32654&eav0"78j./dFMF6{gxy^T=u&ڷQf,7'-DW :P@) PY PY PY?+3?3/+9/+393339310!#"&'732654&+5!tsv،RA:Nj wǤlVK; *j@<(#   +,PY#  %PYPY  !QY?+3?99//++9+3933933310'#".54632654&+5!5!%27&#"|_RCsA>CaISxVEzJuDEp8Ii:5=J9<@  PY  PY??+3/9/+933310!32654&#"'>32l.=ir٧ۺjZ~[:@  PYPY ??3/+9/+933310!&532.#"327ri=. Zj93@ PY PY?+?3/+?93310#"&'732654&#" ri=.j꬗Zj9WVN9@PY PY?3/+/+3/9933331032.#"3267#"Wri`Zjjhl a<@   SY SY?+?+99//99393210#"$5!2#"32%53שŦrJ< MR},-:!p@  "#0##@(#H#/## QY PYPY?+?+9/_^]+9_^]+q99333339102#!32654&+32654&#4rmCpw؀mfy:]|k:KU]eSHZRLIN&R@*!! (' PY   $$PY$PY?+?+9/_^]+999393332104&#";#"32>7#"&547.54632]jq\Z`uosms>omӻ,ZUN\`W\_`ƕ੓)"qX^'X@.'' !)(#PY PYPY PY?+?+99//9++923333310.#"3275#5!#"32>32&#""rigKzj v/4$+B7ZjCۉ^DK"Hy GM: W@   @ P ` @   @HQY/   ?3?39/]++_^]qr99333310!3#!#: :6:W) R@+ "!SY PY  PY?+?9/_^]3+3?+99333333310"&546;33#'26=#"53WOV\MAQW}~$%bYkk<98A;nz: >@        ??3939933333991073## n%2:m4i:@PY?+?99310)3!:[VW(G@$ #)* PY  PY&PY?+?+99?+?399333310"!234632&#"#7#4&#"326{66'%8<}6Ҋxy6We k[>/f@9  !QYQYPY?   PY?+3/?99//_^]++3/+9333333310!32654&#"'>32!!#5!/=.=ir٧K ۺjZn{Oc@6   !QYPY? PY??3/+99//_^]+3+39333333310%!#5!5!5&532.#"327!ôKri=.={n ZjV%(c@5 && ' )*''PY  #PY PY&&PY?+3?+?+99??+39333333310!.5##"!23'3!!32654&#" !C2z{2rVxyYt*hZ6Zbynڋ$VV1=@I((8##)8*.2?>.'PY.**PY ;PY PY5PY?++?+99??+3?9/+993333333339310%#"!23'3!# 732654&+5!#.532654&#"52z{2{܋X#oRxyhZ6Zbyn'[P͜26t*pVN&25?@G'33-99"5=@A4#4PY #:PY6PY5PY 0PY*PY?+?+99??+/+?+?3+393333333333310%#"!23'3!3>32+'7!.532654&#"%"32654&52z{2sTeav0"7,xyM/dFMF6hZ6Zbynڪ{gxy^T=ut*pɯ#Qf,7'-)d,"5_@2&. 22 .76&PY 1QY  QY 5PY?+?+?+?3+9993333333310#!"5#5373!632.#"2654&/.547#3d}5xJ\nzt0^~I(IyXbJ(3?+ƒ~HMJK.<*%$=JaFK@P"(MnPYBeNB)W%-d@7( #++# #./PY*QY@ &PY PY?+?+?3+3?+39_^]]333333310"'532>=#"5#5373354632&#"27#O7<96=XY}5x՗k,1BMK&=3W,Uh+҃0iu6 cN?,0<|@E & 5--;(=>#PY (;++8PY++  QY PY1PY?+?+?3+39/+9?3/+933333333310"'#"&5#53733#327&532.#">3 '2>54&#"w~z}5x32!"'53254.#"#'###5354632&#":lV!kv4SdIz F\a.N@)- ''/0 **PY*-PY???3+9?+99933333103332654&/.54632.#"#"&'NXbJʳnzt0^~I(ڊSRQXWQ@P"(MnP~HMJK.<*%$=Ja>G32#4&#"#432&#")oTvs{FRXf{10"/VbMD{qR}h>O udDp.@  YY?+/+?393331053#"'52653hzPS9*0%zyykbb4HFg-@  Y ???+999333104'33>32&#"ktJF%NOJq@bGt}r(.@  Y ??+?93993310#'##"'53265tLF%ONq@`It}6@   Y @Y?++?93993310327#"=#"'53265n&&'3&NH$MO9/ qPEt}d D@"  Y  Y ?+?39/3+9933333991033#!3254+ވ]f}z5x\fse.@   ?3?3393393310#&'#373?3u  y| x'~0IR9<U>M1@     Y/+?99?339933107"'5267373t1#98]+܃C/A_XtZˋh  WH @  /9/933910546733%+y_YaC}v? @  /9/993310#65#5?%+y_Y̒aC}S @  /9/933910##.=MY_y,$}F^x @    /9999331026544#*77*TeeT8117UfWWgx @  /99993310"&5463"3UddU*77*xhVWfU71184>@  Y Y??+9/+3/93331032654&#"'>32*iYWh~pb hs 3<@ Y  Y??+3/9/+9333105.54632&#"327Cq~hWYi* ĥsh eHeH!eF@ /3/9910%# #3FeF@ //39910%#3 3fHK !@  [/+9993310#'##53ih !@ [/+9993310#53373hi/9310#3qqL3XS@ Y/]+9910!5!X%/991053ǂ/9910'53ςj/9310#3qqjLChk/9910!5!h%wj/9910'53jςjj6/991053j:@  ??910#'73e ee e:c:?9910#'e e:\ @    /99993310726544#*77*TeeT8117UfWWg\ @  /99993310%"&5463"3UddU*77*\hVWfU7118 @ /339310%!53533{q{l @ /239310##5#5!{q{gl ,@   /9933933310##5#53533{q{{q{ }}l||/39910!5!pw 1@  P` Y/+_^]]q23910"&'33273)uu P@ Y/+931053 3s J@/  Y     @Y/?O/]+_^]]+993310#"&546324&#"326dddclN89NL;:Ldded8NN87RQPU9@# @ HY P`p/]q+/+993310#"&54673327?LijWD4+1-6=pfUF&-;F'*0@  Y    /   @Yyi[I9+ tbRB2"grbRD4$tdVF6"vfVB0 7@tp`PD4$tdTD4p?/^]]]]]]]_]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]_]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqq/2+_^]]q+3/3310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx $@  [/2+392331053353e @    /999933107327#"324P;~U*N#D<(4 - ,@    /3299939210''7'77XXXXXXXX;@  ?3/3933339331033#"&5474&'32ف*,UIJSJ!34ToH(L[[LT@Cc7 %d@ ??93103dz,'@@!  () Y Y?3+?3+999333310#"&'73254.'.54632&#"lbW!=xg[3znSO6APyW4luVk=9v$- 6M9imXci36(2!6T1N3p@ ??399310!#!5!pp$@ ??9/3993310!#!5!3pHp$@ ??9/3993310!#!5!3pH^p$@ ??9/3993310!#!5!3pHVp@ ?3?99310)5!3p0HbIp@ /399310)3!I_p bIp @  /9/3993310!#3!Ittswp}Xz @  /99993310!5!!5!ppvvPN 0@  /329/39933993210#65#5!#65#5%+y_Y%+y_Y̒aC}ÒaC}%@ /399910#373|Rr``r%@ /299910#'#3%r``rRV@ /9993310%5᪪r``rRV@ /999331057'5窪Rr``rW  @  /32993310#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99 B/9910 53ϱB @     /32339910 53!53cϱGϱB @  /2233991053353lx@    /32993310".#"#>323273*TNG76 [ 0Q?,TNEd\dl%-%>9fi=%-%wx~$@ //99//9333105353| @ /299310!#! QP| @ /299310!#5!W @ /]299310!3! jWPW @ /]299310!53!jW$@ /3]2993310!3!53WPX@ /]2993103!!iYȇ:Xq 8@ @ H @ H  /]3/+2/+9310!#53!qVpp M# /10'53ς  # /1053 K  /32910#'##53KihS Y/+10!5!%#T Y/+105!#$  /2210"&'332673xi cLJciw;IG=zZ Y/+1053Zլ{Y/2+31053!53sӥø+ @ p+/H/+q99104&#"'632#5>3*HFZjQ[pE0"c;U 2x8b  /3210#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99 /221053353K /2910#53373khi: /10#3:qqLY/3210#3#36qqqqLL /2]210 53!53$G$d  /222/10"&'332673#5xi cLJciw;IG=z$  /32102#.#"#>wibJLc i{>FI;wd /9/10546733e&({^XjA~d /9/10#65#5d&({^X̨jA~d /9/10##.=^X^{(&~@hd /9/10#65#5d&({^X̨jA~[i/]10'53NςiOj/]1053j?_!@_o/]^]9/310#5#5353oo_sqr^_!@_o/]^]9/31033##ooKrqsy /210#!5!y9> /9/10#65#5%+y_Y̒aC}W_  /q9910"&5463"3_UddU*77*WhVWfU7118LW@ /]2310!53533{q{WlMW@ /]3310##5#5!{q{glKW @ o   /]9/33310##5#53533{q{{q{}}l||9c Y/+10!5!9p֍W /]2107!"'53253U2ExW /]2107327# xE2U3(u WY/3+31053!53sӥW8W  /3q210#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--999b @    /]9/10#65#53b,(u^XWu/dZJD /29310!"'53254&+739!1%=HAk'^^bV(*dSLU  /210#"&54673327?LijWD@S1-6=pfUF&$}B*0WCo/]10#3CW^Wy/3]210#5!#!yWPc}@   /^]3322310#"&533265332653#"MD^\a..7A\A7..a\^r&5lLCJEEJDKlWE[ @/^]3]2910#'53373ehiWWA[ @   /^]]2910#'##573Aihlr$v @  /^]3210"&'332673xi cLJcirw;IG=zr$v @ /^]22102#.#"#>wibJLc i{>FI;wWgc@    /^]3]29910".#"#>323273*TNG76 [ 0Q?,TNEd\dW%-%>9fi=%-%wx; Y/+10!5!%iT Y/+105!iW9@ 0/]q9910!5!!5!9ppvvg /2299107".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx_/310!5!_BV/310!5!VW} /3/310 'ccba//10 #X N\ @    /]q991026544#]*77*TeeT8117UfWWgWy/3]210!3!53yWPDW/3q210!!5#x_Wx纺^@  /39333/310&#"#4&#"#>32>32J7<\<7Jb ZNp9 N6N_ JJEEJJNZ[3(ZN%r% @   /32910''7'77WVWVUSUSli/3299105>54.5467i/PS,1#_s-0# 1?$ M&*15<"DN L$,25; U0/99105!%5!W ffff /10#5x  N /10#5Nx  ]@  /2/2/9910".#"#323273*GAA%/3 e,IDA$[fi%49%mze /9/10#65#5e%+y_Y̒aC}S   /339/310#553!53u| 쬬W @   /^]q210327#"=3>!,&!p y"/3210#5!#!yP W~@/^]]q99105!5! jjjjGW@ o/3]210#3#33W^^5W/]310!#5!Yuf@  /33229910&#"#>3273273#"''Q(c[ 0Q?>O=a=*d\dU;Q=azfi=0l6lzx1m7bp )@   //99//99399210".#"#>32326735353+QLE72 h 0R?,RKD62je7 '!53Y]6!'!72kլp1@ +.&! /22992/329910".#"#>3232673".#"#>3232673+QLE72 h 0R?,RKD62jeU+QLE72 h 0R?,RKD62je '!53Y]6!'!72k '!53Y]6!'!72kW //99105#'735vvOW@ /q9/3105#7#;v|W %-5=EKQYaiqy@ZNGG0488<ITTX ll$p (tt,x@D \`dhP|4557449 885667775558849*557sNsmmIt}! /91057'5窪xRr``rx\  /2210"&5463"3\UddU*77*xhVWfU7118$ @    /299//3102#.#"#>53wibJLc i{>FI;wO%B @   /32910''7'77WVWVUSUStV/22910%5r``rRtV/3291057'5窪Rr``rV @  /329/291057'5#'#3窪r``rRRr``rx]  /321026544#\*77*TeeT8117UfWWge  /104632#"&8''89&'8'89&'88AV)@   /]2993399333107''7'7'3 ]CKNB^ S3K%z)~)y%L5WE+@ # )/3//3/9910#"'#"&5463263232654&#"4&#"326EiNY33YOhiNZ22ZOh=,,;;,,==,,;;,,=NeIIeNNeHHeN36=,,=6336=,,=68g4 ?10#7!3_q@_q@SW  /3310! 332$7^JK^6svvS2 /3210! 332$7^JK^2svvS/310!5!JSU/310!5!JS /329910#"%$#"#>32327-^t-{Y͑9VUT\(-VS6  /3210#&$#"#! ^^0/ÂvvsSW//99105!5!5ϖlvcHi= ?9/1053332#4&#"#3)oTvs{FRXf{{bMD{qR}h>ppc@  Y ??+/104'33>32&#"tJF%NOJq@bGt}rWw7Y{O @  /3?3910 #33DŽ :r(v6/991053n uWx/9910#5n߈W6>Nb@A  PY p`p o  PY ?+3/_^]?3/^]q+99333104&#"'>32#"&'7326ir٧`"jZẜ lhWN&FG(@4Td%+5/_]]5>N&5(@4Td%+5/_]]5:/991053E!$%A :@   Y ?/]]33/+393331053%53!53EؖB!p%R&$9l|- @%/P0`?5]q]+5~@@w|HRb 0@p@ goHDTcfH\_HW[H@QVH$4D@CFH0$<@ 8;H@+-0H  0  HY/++_^]]]q_qqqr+rr+^]]]+]]q++++r+^]]_]+]q991053'(9(|-@ q@%/]]_]5+]5?5 '+9%|6@Pq@%/o]5+]5?5]U',9|@@ + 4 f@%/O_o]]_]5+]5?5]]&29|%@ ^@ %/]55+]5?5A'<9t|@ (HXhx8X Gg77WgwWw<'g'7GWw '7W 6vV&&Vv@6fv &F@Vfv%Eq%5Ueu %5EUe uA$DTt tbsx   @ ` p @ %]5+]5?5_^]^]q^]qr^]^]qr^]qr^]q^]qr^]q^]qr^]qr^]^]qr^]qr^]&[ 9|6@ +&$$$>@$$!!%_]q5+]5?5]A&k:@/?O/?Oom/8/_ @Ps p= &ܴ %+555+555^]qr^]qr^]r^]qr^]^]qr^]qr^]qr^]qr^]R$%/@_Y??+99310!#/8=>@!   _Y ?2?+33_^]]93333103!7%.'C#3 + ^J oj(A= +aO@+  `  _Y  _Y _Y?+?+9/_^]+_^]9933910#"$5!2#"32!!שŦrJ< KMR},-f|,?. N>@$ vo 0 /  ]]]]?2?3]9333310%#'#3N|TTz? 0 1Z ;@  _Y _Y_Y?+?+9/+99399210!!!5!5}9\a2 ?@     @ H_Y?2?++_^]q993310!!#!ax 3l E@#   _Y  _Y?+3?9+3999932231035 5!!!lmCC|.7-)<u(~@, $ )****$*D*d*****@ H# #`Y &&`Y  ??99//3+33+3+_^]_]]]]9333333310+#5#".54!3533 !#326%;#"SS~HG0884o.+;|@9 D`DT 0 @ H `Y  ??339/]3+3+_^]]]]]]q93333310!#".53;332653+SǬ88ÿS-Iǯ1UW#S@*  ! !$%% _Y _Y?+?3+33333_^]993333993310 ?3!5654&#"!53&5/[QQ[s_`qU&O4&, @&%+55+55-) @     Y H vbTF6$pd@4$it`PD tdT@0$tTD$9pdT4$@8T4p`0/]]]]_]]]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]_]qqqqqqqq??39^]332+393310#3 3%53!53 ӥHH9ayVe&c9!@ '&''*%+5+5Fj&g9@ '&'I'* %+5+5jX&i99@ &d %+5+5&k9@ &    %+]5+5A&w:!@ &"%+555+555VeN&U@- !!('(( !  $PY PY?+?+??9_^]993333333310%#"323673#.'3267.#"K?y~-22T;/#rxwyyywtjbg=!1WI)Y@- # +*  PY &PY PY?+??+9/+999333339910#"'##463232654>54&#"Iܷߔ@Qqyn^rXܷW+1zbpX:M@   @0`@ H  ?2/?933+]q933333103673#674z": @:]?C?[ZtV ?@  !"  PY PY?+?99+39933932104.'326'#"5475!`5ST54.'.55!5!0]6oZ:$/~ *Ss[O7={CS5#"9XD,mO8R$0$&5KeBa#jXNM@  @H PY  ???+9?+_^]]q99333104.#"#4'33>329*\Y$>yXVkv4S{l'i)p]j  U@`@#HPYPY PY?+?+9/+_^]+]99333310#"!22!"!  *#}}t : @    O ?  j   p `      ? `   7     ? /     o      ?   ^]]]]]]qqqqqqrrrrrrrr^]]]qqqqqrrrrrr^]]]]]??933103.53 +% ENAz(: A@%   ?  ?2?39]]39333310!#33 0Im: /D@' 0`   PY ?+?399_^]9333310.#"'632#&'#D++6'#C>kK)+żd; Apf.kw:L@ @H PY?+/?3?99+_^]99333310!.'##"&'##332653^54.'.VܖJzM0]6r^=$/~ -Xs[O7b! qg}kEZ4 CS5#"9XD,mO8R$0$&5KeVNRO+:J@(  !!/! PY PY?+??+33_^]933333310"&5!#6="5>3!#37fsfn4.4:Bk4%*4VMqH+P SLEW;OR@   @#H  PY PY?+??+9_^]]+]9933310#"&'##4324&# 326;n@Վ~7XDK54&'.54>32&FRZn$/~ dMOoeAt_zy?#F,mO8R0B,0qo^6DwdV:/@   PY PY?+?+39933310#")#''#"!260,9QG|Y* %yzc:L@  ? @HPY PY?+3?++_^]]]q9333310"5>3!!37#"&5Bk4D*4VMBsf SLEq:C@ `@H  PY?+?3_^]+]]q993310#"&5332654'3ɵu}F,5:;c.UvUWR"V@.   #$$ PY PY PY??3+3?+3/+_^]933333310#&4746324&#">|WP5i  * ڸDXPp@ $  @(H   H PY ?3?+?9+_^]]^]]+^]]9933922310%#.#"'6323 #IC&"5AVkPi9WJ dGW,<`@:   0`0@p PY  ??3+3?33/_^]]]qq93333310%>53#$&533.򵐸w|kzSO*z@ ""((+,,0,,,@(#H,,, ,@, )) %%PY PY ?3+3?3+39/9_^]]+]qr93393991032654&'7#"&'##"47326=3srfrqzeϾ~""~worfvϹ灊@ λ{&kj@  &ٴ  %+55+55{&wj@ &%+55+55V&R9)@ &F%+5+5&w9@ &%+5+5S&{9@ +&+7+.%+5+5s#'1^@4.("  23%PY0PY 00 00 +PY QY ?+?+99//_^]]9++99333992310>32#"&32#"32654&#"4&#"32;&*c֦l^Yy\NN)s*tK]<${o=tQrƑ6=HHO P+3]@2,**  1$$ 54 PY , PY*,,,''/QY'PY?+?+99//93+3+933333310## 47654#"'6323265&$&5463234&#"Pa:1`jO]hRFg^̪av 1]]#<16cX2]]2BI;av{9 .@     _Y?+??99933102.#"#3 > <;T^%$1 rT7x-3-0H9aVG'|2#?59 & y@ &%+55+55PW+R@-   PY PY PYPY??+?+??+?+9333333310&5%34&'>%_pzzpktujW4q .Zǽ˷+R:-[@/+ (""(/. %PY)) PY PY?+33?+9/?+993333333310!##"&'##"467#2654&'!32653Rl09Ͼ~""~63itt>01-N@+ *&! ./'PY'#SY SY ??+?99?+?+933333310 !4#"'632!327#"'5326=.547tw8"BK|z6$  oyw*2@C+578ca5"PiuI DQdBaW2@  _Y_Y/?3+?+933310$!2#"32rJ< W<R}ep,-VWN 3@  PYQY ??3+?+933310&!24&#"326ܺЅW0erP:@  _Y  _Y ??+99//+933310!&$&54$32.#"37%#X3ߓo =  C~ovIZWN,;@ & .-'# #*PY# PY ?3+?+992993333104.'.532.#"#"&'5326(PgVvi,D\9mW5]2nDvvw)6%ԗ ZjKkL3% B6u˄0{~xt9cVi1@     ??993333933310%54''%&''%%7i.7,F~-GGpj6ΒwqU3X}+Q@*$!* *!,-+"'`Y`Y@`Y?++?+?33999333331032653#!5!26=##"&'## 33265]st`ӯ桙*z{%^[tw |gYXWVc} ~X:-O@)&#, ,#./ -$PY )PY PY?+?++?33999333331032653#!5!26?##"&'##"&533265VpsaӮI8p{8qVpv:Rxs2lm`bkm`Rxsd7@ _Y_Y  ??9/+?+99392310&#"32673##"54632HUww^IݶTx346$~S'&E@& PY  SY ??+?9/_^]9+933310!#"&5!2&#"3265393|3U:=u*`U)[P(|ro4~4X8@ ! _Y_Y?+?9/9+99333310!2>54&#"#3763 #!.Z1UWF$7j"MВ0*P:y> '2]@3, 1$ $ 34 1"/"PYPY// PY (PY?2+?+99//++9?993392210267#".#"#46323 4'# 54>"327&p4#|H%crɅC_H7=mTOWVO "bSq=@7>54&#"'6$!232654'7! $n+NlOl?05c`r?ǻ5CMsT=-($6Q?nqep!ƳNz[K%&8VEzYh6zun,E@#&.-&PY,,)PY?+3/?+3/99933310%! $54>7>54!"'6$3 3267+NlOl?/ 5c`r?ڽ+?۾MsT=-($6Q?il!öNz[K%&8VEy("%V@0 %#$$ # '&%  _Y $ $_Y _Y?2+?+33?+399339102'&#"!5.#"'>327>!L@f"FA)1|;6|2)AE#f@L_t(CB%t>eln3f&.*.&f3nle]qma HA#O@- !$% !PYPY PY?3+?+33?+399331032'&#"!5.#"'>3276cmL8h!B$<@!! %&SY SY ??+?99?+9333310 !4#"'632!327#"&547tw8"BK|z6$  oyw8"BK|z5"PiuIBbWDN,@@!  '.-PY  *PY $PY?+?+9?9/+999933104>32#"'32#.#".4.#"326b6wz`B$O{E%?}paQ없H$VY =lUWNFW=MaP9:G@%  PY    PYPY?+?+9/_^]+99923310)"3!!"!!)9w# 'P9:E@% PY  PY PY ?+?+9/_^]+9333107! !5!4&#!5!2#!P #wUWhy& 9@    ?3?9/993?9333310!##3 3VE=l(UW:5@ ?????999333310!##!67!#?4. Gk}rs W;O&Q@)   '(PY @ $PY?+/9/3/?+9933333310#"&'#!!#5#534324&# 326;n@?zzՎ~7XDK32!"&'7326=4&#"#!5!uT^Eo!!24&#!!26 `13_:%5C:::*~or A)ByP@*  _Y _Y  _Y?+??39/+3/+933333310#!!#3!3!24&#!!26¿>VGsTy./e@<  ` _Y  _Y ?2?+39/3+3_^]]qr993333310!4&#"#!5!!$3 q ?zm2 圜;&@ &% %+5+5&T&%+5+57:&^J@ & %+5+5h G@(        _Y/?+3?3/_^]]q933310!3!3!""hhR$ _@  `@%#H _Y 0  _Y_Y?+?+9/_^]+_^]+]99333310#!!!!24&#!!26!~oHy%/FhEL@*   /  _Y _Y/3?+33?+_^]93333310%3#!#36!! 2Nm%CԺ1%Z?h8a_#Ae(G#@Q #""# #%$/%% %0%@%% !`Y/ #?33?339/]q3+39933_^]^]_]9333333993339910"&'#&'3332>73###R%oU0o`XKKZbk0Um' U#ϧk(k)o1f# {Cp'@B" %%()"  _Y? @ H_Y_Y 0p H?2/+]q+?+3/+9/_^]+9993333339910"$'7!2654&+532654&#"'6$32mVwGG~3FMvw{k{u=ǩ  8@  /  ?22/?3/3]99333310333#47ުdrzZ:&J@ &%+5+5P@)     `Y/ ?2?39/]+39_^]9933333991032>73###KZbk0Um')o1f# {7@_Y _Y?+?+?_^]93310! #"'532>!#^13_:%5C:::*r A)B0 +a2S@   P ` p ]q]3hy&.77=@    _Y?+3?3/993393310"&'732>73 3L>.Q^H3EFfUj}& ;'_z8v(j@< # )**`***?** $ $`Y &&`Y  ??99//3+33+3_^]]]q9333333310+#5#".54!3533 !#326%;#"((~ W o.+;h A@!     _Y/?+3/?3/_^]99333310%#!3!3ŴP@ @H _Y/  ?3/?9/]3+3+_^]q9933310#"&533273#Gھ"R{l1 U@1      p @    _Y?+3/?33_^]]_]]]]]93331033!3!3h/W@0  0@`/   _Y/?+3/3/?33_^]]]93333310%#!3!3!3/-ӺҺ. E@$   _Y _Y _Y?+?+9/+_^]99333310!2#!!5!4&#!!26B5s3-Ҿym R@  @ H_Y_Y?+3/?3/9/++_^]99333310#!3!24&#!!263~oy B@% o@P _Y_Y?+?9/+_^]]9933310#!3!24&#!! ~o@yiyy@J  _Y_ _Y@P  _Y?+3/_^]?3/^]+9/_^]q+93333310"'6$3 # 7327!5!&$ɘ-G.BlVE rv<tNa@8  ! !_Y _Y  0   _Y?+??9/_^]^]+?+_^]93333310# !#3!! #"32ٿ*W6\f;s$E,+`  Y@0     _Y?Oo _Y ?2/?+9/_^]+3993333393103.54$3!#!3!!"`I;_֝IWsNDx? "W@ $#$$$@#H PY   PY?+/_^]39/9++_^]993333104&#"3262#"4>%>.b~]d+ʿûBN|L56b}:!x@  "#0##@/#H#/## QYo PYPY?+?+9/_^]q+9_^]+q99333339102#!32654&+32654&#4rmCpw؀mfy:]|k:KU]eSHZRL:@PY??+99310!#:I:h:F@$ PY PY  /3?+33?+9333333310! !#!#36!3B%Z@FңwKn.mh}nIWNHS:#@I ""##$%%%p%?%o% %%%%P%`%%/%% @) H!PYO_O #?33?339/^]q3+399+33_^]]]]]qqqqq9333333993339910"&'#&'3332>3###SAa#]ؼBH;.04Bü]#aA PEj]$&3\; #1^N$@R  ""%&&  PY    P`pPYPY`p ?2/]]q+?+3/_^]9/]q+9_^]993333339910"&'732654!52654&#"'!2ʧ-5`qc]Yq .KΑgy},^[ȉTXJVJF~e  m: F@+   p   ?33?33]qr993333103#467#< Ŭ:e$:&@ & %+5+5:d@9  /  PY?O?  ?2/?3/9/^]q+3_^]3333933991032>3###04Bü]#aA:&3\; # :M@3 pp 0`p PY PY??+?+_^]qr93310!! #"'5326!h;@JmV2,+7C7#,LϜJ nE:F@&  ? ?333?333]]933333310!##!67!#?4. G,:k}rs: g@   @ P ` @   @!HPY? ?2?39/^]qr++_^]qr99333310!3#!#B紴:6:VNR:C@+  `   PY?3?+_^]]qr993310#!#Ǵ/:I:WMSWNF#:;@" ?    QY?+3?_^]]]]9310!!#!#d:IW:\VW>%2@@g3:,, & BA ##6PY#0PY)PY >PYBBBtBdBTB4BBBBdBTB@B0B BBB]]]]_]]]]]]qqqqqqq?+??+?+??+9933333310#"'##47##"!23'33>32326754&#"4&#"326>O.omp-.rmvzwylnkx^j7zwn"WSYmChZ6Zb\hY\ɿ:[hf: :@    PY ?2/?+3_^]99333310!33#!Bݴ:II:z:8@   PY?2?9/]3+399333103273##"&5.nN~:n/8: W@!  d 0     @ H PY?+3?33+_^]]_]]]93331033!3!3:IIhf:c@;   `@P?    PY?+33?33/_^]]]_]]]9333331033!3!33#:III-: i@ @'#H QY   O   PY  QY?+?+9/_^]q++_^]^]993333102#!!5!32654&+ gʂxtp6\c^W2: R@0  QY   O   QY?+3?39/_^]q+93333102#!332654&+3&gʂxt<p:6\c^W :: j@H /Oo @#'H QY   O   QY?+?9/_^]q++_^]q99333102#!332654&+8U܂xtp:6\c^W7N@B  PY  o     PY `p @""Ho @ H PY?+3/+_^]?3/+^]+9/_^]q+9333331073267!5!.#"'>32#"&7d c ߫; lhNO@+   PY PY    PY?+??9/_^]+?+93333310#"'##33!24&#"326 ޴!׽x~|:6: S@*  QY QY ?3?+9/_^]+399333339310 #&463!##";Xxk|63\]^]W&HC&ʹ %+5+5W{&Hj@& %+55+55 W){@A )) * ++@+P+`+@+++0+@+)PY QY%PY H??++9/3+3?+?9_^]qr]3933333103#5353!!3>32#"'52654.#",:}xxM2>F6*`U= jcљ Hhro4&v@ &U %+5+5WN@\  PYo  PY /   @ H  `p @ "HPY?+3/+_^]?3/+]+9/_^]q+_^]93333310"32&#"!!!2674 ҋc d!ħgm 9KV=L%{&j@ &%+55+55W=M :#}@ %$ %%@5#H%% #QYO PYPYQY?+?+?+9/_^]q+_^]]+q933333102#!! #"'5326!32654&+M>e;@JmV2,+7C7#,xtpLϜJ nE6\c^W,:z@  `@1#HQY PYO  QY ?2?+?9/_^]q+3/+_^]+]93333331032#!!#3!32654&+fNʂxt:6:6E\c^W  o@<!"@"P"`"@""""0"@"QY  PY H?++3?3?9/3+3_^]]qr393333310>32#4.#"##5353!!=:}*`U,YjcWro4= &v?@ &Q %+5+5&C& %+5+5W&\@ &  %+5+5h: L@.   @ P ` @  0 @ P  PY/+3?3/_^]qr93331033!3!#:Ihr F4Z@. '-!!65$$*_Y($1_Y_Y _Y?+3?+?+?3+9/99939333210332#"'>3 # '!"$5!2&#"3267J#tMϓBllBMtO2qLV;,h|GANQ~AG|hXR:8@     ?3?339939333310# #33654'2o S\0:y]x:nnKzM@)  _Y`Y_Y??+99//3+3+93333310!53!!!2#!!4&#!! ut@דҾyK@(  QYQYPY?2+3??+9/+93333310!3!!!2#!!3254&+-*:t:o娟^f@!@K!!  "#@P _Y _Y   _Y/??9/]3+3?3/+?+3/_^]933333393310333! .#"!!3 # #a+2Гz$c1N<~$Mñ]5xN!@Z !!#" p`p PY PY o      QY/??9/]3+3?3/_^]+?+3/_^]q999933323310333>32&#"!!!267#"'#֫ ҋc d:+ħgm R @@     _Y  ?33?9/9+393333310##3###!&'T?6мY 3'YEW: @@    PY   ?33?9/9+393333310!#####3 tpBpp:n$R@*    `Y ?222??9/93+339333333331033!3#####!!&'n)6м 3('YEW:Q@)    PY ?222?39/93+339333333331033!3###### !tp:Bppqny)Y@-     `Y_Y ?33?+9/33+3933333333310#54.'##5%! ![Ƥ[  GCx/ʹ\r\ |}z:_@0  QYPY?33?+99//3+3933333333310!#54.'#"#5467!!;|>ȔMOFDQEFFkƯi~!k@7  ! #"`Y!_Y ?222??+9/33+3393333333333331033!!#54.'##57! !GE[Ƥ[Cx|/ʹ\r\*|v:!$m@8 "#!! &%  PY$#PY ?222??+9/33+3393333333333331033!!#54.'#"#5467!!BȔM;|>8<O:kƯFFDQEFF+Q~`WpT@M)&6KA@ &,,&@KUVC=_YC CCH)`Y2OOH#AHH8_YH#@### `Y#?+3/332/2/+39/93+93/_^]+9333333933104&+532654&#"'>737>32&#"32>32#4#"#"&54>7>GG~37[H6S-B X0Rsm;:kc]-^mJVl~CTlW?#vw{k{u=SC8M> [\;$ 3)l!dM"zWn>%>Y WM@LDC1 - *9*1CONF@PYF FFK5- PYK 'CKK;PYK#'@'''QY'?+3/332/2/+39/9+933/_^]+9333933233104>7>54!52654&#"'6737>32&#"32>32#4#"#"& Hk9c]Yq $Լ[H6S-B [pgyRpO*:\RN-[jJEWlD{Nc<-L=ȉTXJVJF,YC8M>fe  m_P.$t$}hM#C<@  `Y ??339/3+393333310!".'33332653+cr\30PmP8¿S6k-GD̯;UDW:<@    PY  ??3+3?3393333310%>53#.'33w\(#TWwrkQRia.P@+,!0/*_Y$_Y$ *$*$ _Y _Y?+?+99//_^]++99333310#"$5!22$7#".#"">32327&שŦrJ}=Q>}LOq7vcMR}4+5+Is("$%!9VN (N@*" )*PY$ PY $$PYPY?+?+99//_^]++99333310#"!2"3267#".%27.#"632xE= I64WNJ&?= >?2OKO!0#ð !)!!!(! V&@ _Y ??9?+9310!#3?632&#"(,;-LK0TMa37 iN+7)E3GN&@  SY ??9?+9310!#37632&#"ew 8JBrQAT.8:@( [?4L VL&%mh@  &>%+55+55&&@ &Q %+55+55aW (O@*"!! $%% )*# $$!PY _Y _Y?+?+?+?39993333310#"32#"32"'532?3 3J2&.bg2tVwWS|-+ +5vUWN 'M@)! $ ()"## PYQYQY?+?+?+?3999333310# 324&#"326"'532?3 3d|˻crsifnwfFJ2&.bq(~P2 +5v6t0J@&% ("." 21""_Y+(.( (_Y ?33+3?3399+39333310%>32#"&'$>32654'#"&'6X'T43U(YݾV56UX87YZ89Z3+55+~-87-30<<01/1>>1+-I@$#,&   /.  PY) ,& &PY ?33+3?399+3993993321047>32#"&'&7>32>54&'#"&'+R43RR33QU65S{ts{T55S-77,,75+$00<:.ն.:9-7l 1EP{@A2+LFOO< RQE223 # '!"$5!2.#"326732#""&'.#"#>323%#65#5HNR@jˡj@SMKCg5AA4hCferFv ߤAo\ %jSNW#mmLR}# VEEV?, 58?.mp*@91b*<4:bGWw%0D~@F1,/'../;FE1;//+000;++;0>>7QY>> >PY #PY ?3?+?+?3/_^]+9///_^]9/39933933221044#"'#"4>3"3267326#65#5"&'.#"#>323p㻃pٕX1-Z %jSNferFv ߤAo\"ĖSS:-+<rb*<4:bG58?.mp*@91r F& Ph??&@@5!%+5+5& l@  &!! %+5+5hUl4@  _Y _Y?+?3/+933310$!2.#"327n@.G1ٕ(,Uy7T<{ PWL1@ PY PY??+?3/+93310&532.#"327ri=.W" Zj ?@     //993993999333310%%#%7%73)Nd))\M)a~^_`5]^^_{` ?3210#!#"&5463!54632`I5C.2BI5[C.2Bq2<8<@42<8<@L  /333/310#.#"+53267632LY55!B&thfi4X*aFcgJ@&H .}Ib /9/10##.=bYNw#̺^k3rLIb /9/10#65#5b%wNY̒Jm:k^;.  /32210"&'.#"#>323.ferFv ߤAo\>58?.mp*@91% '1;EOh@5F#K>C HH%M2 7 449(-**/KCM79-//-97MCKA</3/39////////33333333333333333333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EO%@OME@C0'%  /3/3/3/33??33/310#65#5546733#"&'5353%32&##&'''.'77'67'77>7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96mf:\@1  _Y p ??399]29?+993333333333103333##47  33273X dr,zZ@[@-  @ SY ??+?99?299933333333331033##467#% 33273< ٬y :Ceg(77:v@N@(  _Y`Y_Y??+99//3+3+993333333103533#!2#!#4&#!! +@דҾyN@(  QYQYQY??+99//3+3+99333333310533#!2#!#532654&+ww ?z.xtl\c^W\@0      _Y_Y??+99//3+399933922910#!#!2)!27'76(wbQVtks~MslflGʟn}`-|ao6W!M-[@1*,$$ /.  PY),++''PY?3+39???+999933333910'#"'##4'33>324&#"327'76^bd^WyV0ƽzky?X8ve_#"jZe6Y61fd]Z*[hb#@ _Y/??+9933103!# %@ PY??+/993310!#!3!B٣8:/ =@     `Y _Y?+?9/3+39933933103!!!!##8\&\@m: ?@  PY  QY ??+9/3+3999222310!3###53˴zz:τW O@)"!_Y_Y _Y?+9?+9/9+93333310#"$'732&#"#!!63 <-α:qj_& !ZM% %1[W: P@*"!PYPY PY?+?9/?+9/9+93333310%#"&'732654.#"#!!632tӋ.yfUbtfaSts|\{ TKpV c:t#uhN'|@@" &&' ' ')("%`Y! !_Y! '?3?33/?+9///3+3339333399333339910"&'#&'3332>733####R%oU0o`XKKZbk0p1Um' U#ϧk(k)o1f# {hS:'|@@!#  #)(!  QYQY  ''"QY'% ?3?33/?+99//3+3+33933333399339910##"&'#&'3332>33##uAAa#]ؼBH;.04Bü]#N% # PEj]$&3\;3CWp5o@:(%%+0 +763`Y3.@(`Y".. `Y .""_Y"?+3/?33/+9/+9+9333333399103254'.'7!2654&+532654&#"'6$32#"'7YVQwGG~3FtsS#PAMvw{k{u=ǩ |R_n"1W^N3r@;%" ."")) 45%PYPY1QY1@, PY ?3/+3+?+3/9/+993333333991032654'.'732654!52654&#"'!2#"'WN@;,5`qc]Yq .KΑgy!wxgT"=?OG|~,^[ȉTXJVJF~e  m}kVkq!hQ@( `Y _Y?2/?+99//+?99333333991032>733####KZbk0m.Um')o1f# {h:T@+ QYQY QY?2/?+9/++?33333933991032>33####04Bü]#N%A:&3\;3 #\@.   `Y   ?3?39///333+339933339933310##3273>3##:1@+s!v0s{'.f#k:\@.    PY    ?3?39///333+339333339933310##32733##%(iݼ]#ai#:& IvU@+ `Y`Y ?3?399//3+333+9933333399103533#2>73####KZbk0Um'ד)o1f# { [@. QY QY ??9/3+3?39/3+33339333339910353!!2>3#### 004Bü]#aA93\; #)N@(  `Y  _Y?+??39/3+39333339910!2>73###!)KZbk0Um'?)o1f# {(O:G@$  QY  PY?+??39/3+99333339910!2>3###!(04Bü]#aA:&3\; #hC@#  _Y _Y ??3/?+9/+93333310!#3!33##asThW:F@$     QYQY??3/?9/++39933333310!#3!373##)y:6G =@  _Y _Y ?3??+9/+9333310!!#3!!!a@sT : =@    QY PY?+?39/+?9333310!!!#!#BӴ:6ʋQ:W!S@+ !! #" _Y _Y_Y?3+9?+9/9+933333310!!#!63 #"$'732&#"ax <-αJ[ZM% $31W:"V@- !!$#PY!""PY" ! PY ?+?39/?+9/9+933333310632#"&'732654.#"#!#ts|tӋ.yfUbtf":#uޗ{ TKpV cN:>+7Z@3 //5$$'2 892' ,_Y  _Y _Y)_Y?+?+?+3/+99333310%#"'# 4632&#"327&5432327"654&kȀ眄WOFkZRQhII@ 5j{2DGvy0D07./46/.5#7%%-Nu޲'xvti44hWy'v@E%$$  )(% %%!!_Y!`Y @P  _Y ?+3/_^]3/+9?+3/_^]93333310"3 #"'53254'&$5!2.(KtsSYV֝lB.G1%N|R_n"#PAHQ~<{WWN(@R# *) p`p &&QY&!!QY! PY ??3/+?+3/?+9/_^]q]9333331032654'&32.#"3267#"'WN@;ri`{"wxgT"=?OG Zjhl wNkq!.h 4@   _Y _Y?+?+3933103##!5!Ќ圜#h: 5@    QY QY?+3?+93310!5!!3##{dt_ "@   ??39933310#373<&--'HH9gfAW: @   ??399333103?3e 8:]W8P(5W_6@   _Y ?3?9/33+393333310!373!!#!>F&--'FffgfA_HW:6@  PY ?2+3?39?933333103!3?3!!#!d>e 8:]>´:P(5Ɗ.hBO@*      _Y ??3/?+9993333333910 # 3 3 3##P}6h)bh:O@*      QY ??3/?+9993333333910 # 3 3 3## *d.D,[U1h9>@!    _Y _Y?+3??+3933310!!!33#!!1&h^;?@!    QY PY?+3??+39333310!!!33#!!&Lݴ;Ih:<@  _Y _Y?3?+9/+9333310#"&5332733##Gھ"R{l1E&:@ PY PY?+?39/+9333310###".5332733nJ?Y8ft-4ouɅaD$6nV@-  `Y  _Y  ?3?9///3+33/+933333310"&533673##W۾z{xj{³Rxl1 ") z:V@-  QY  PY  ?3?9///3+33/+933333310"&533673##6pBvwApyn 0"/-@  _Y  ?3?9/+9933310!4&#"#3$3  ?zm2 ;K ")^@1& ' *+_Y&  #`Y _Y ?+3/?+99//_^]3+39333333103267# #"&5473;!2"!& Λ9RCvz'f!4_ ryFU1:;;2p.X$?  N$V@,$  &%  PY$ !PY PY ?+3/?+99//3+39333333103267!"#"5473;>3 '.#"ua 4zݺ^H-=>;2p %,m@9)) *## -._Y)  &`Y @  _Y ?+3/3?+99//_^]3+393333333103267#$#"&5473;!2"!& Λ9IÆCvz'f!4_ ryF$S:;;2p.X$?  N&k@7&   '(PY& #PY @  QY ?+3/3?+99//3+39333333333103267#$#"5473;>3 '.#"uXۆr4zݺ^H-&(=>;2p|,G+&];@ $$&&&,%+5+5S&Y@ $$&&&,%+5+5W"S@) $# `Y _Y?+9?39/+3993333333910%#"$'73254$!##32>73<.~ǿKZbkp45Ѽߝ]Ox)o1f2W:#V@+!%$!QY PY?+?9/?39/+3993333333910%#"&'732654.+#32>3rҎ.yfn|04BüT&\z TK] :&3\;|$fR:@ _Y_Y _Y?+?+?+933310! #"'532>!3##^18`~:%5C:::*Z A)B, ::@ QY PY SY?+?+?+9333310#! #"'5326!3Y~;@JmV2,+7C7#,Ϊ7LϜJ nEg(W F@#   _Y   _Y ?+9?39/+993333331032!#3!3!"$'p.Լ9h\NsTlW:M@&   PY QY   ??39/+?+9/99333333103265!#3!3#"&'Ilk~xų"VJ:6f=@   _Y   _Y?+??39/+993333310#!#3!33pfsT,:C@"   QY  SY ?+??39/+9933333310!33##!#B紻¬:6g(7:h@@! _Y @_Y ?3?+9/+9333310%3#"&533273##eGھ\"R{l1hzh:<@   PY  QY ?+?39/+93333103273##3#"&5.n}lN~:n/hJ8f"G@%!#$"  @_Y?+?3?9?933333310%3##4?#./#3>73ļ (' Dw%3 p}"k@pT/;(:G@% @SY ?3?9??+933333310!##!67!3##?4. ¬zG,:k}g(7rs>OR&$ z@ &%+5+5Ws&D11&4Դ4:%+5+5R&$ n@&%+55+55Ws{&Dj@ 88&6д64%+55+55BN&(  & %+5+5W&H@ &# %+5+5^QWN^&Q @ ''&%%#%+55+55W{&j@ !!& %+55+55G& m@ ++&))'%+55+55S{&jk@++&))'%+55+55Cp& )@//&--+%%+55+551^{&j@,,&**("%+55+55MT@+  `Y_Y_Y?2/+?+39/+3933393310"$'7!2654&+5!5!wVw?7M𡇅q ܲuDW :T&I@ &%+5+5S&@ &  %+5+5& @ &%+55+55{&j@ & %+55+55a&2 @""&  %+55+55V{&Rj@&%+55+55a?@ _Y _Y _Y?+?+9/+99333310#"$5!227!"!&$שŦrJ~_τz.WKG@& _Y?+?9?99333333910#"'532654. # 3 3 K;I:=5CUP}LtX 4@ _Y  _Y ??+9/+99333104>3!3!"$7)! XsܖH{}m%,VG[9 &N@(! !!('$`Y$ _Y `Y?+?9/9+3/?+993933931032>=!"#"$54$3!332653#"&|UL~q後QnbW⻾T7śEoV{)U@,$ $+*  'PY !PY PY?+?+?+9/99?9333393103# '#"!23'33265%32654&#"Ƶ_:Ȏ{2q~~pMxyzib6Zby韟j`")Q@* $''*+`Y%%_Y"`Y?+?+3/9/3/+99333310"&54&+532654&#"'6$323 3dݾGG~3F{|~tw{k{u=ǩ :EUN&Q@* !$ $('PY"" PYPY?+?+3/9/3/+99333310 .#52654&#"'!23253O.c]Yq .KΑgz dKgUTXJVJF~e ca{t=`h#S@+ #! $%`Y!##_Y# _Y?+3/?+9/+9933333104.+532654&#"'6$323##JGG~3Fujz5w{k{u=ǩ UhNU@,   ! PY PYQY?+?+3/9/+993333310%3##4춮&#"'!2_wc]Yq .KΑg%jdTXJVJF~e A"C@#  #$ _Y _Y `Y?+?+?+9/933310"&5! #"'532>!32653^18`~:%5C:::*xwTZ A)B6E : C@# !" QY PY PY?+?+?+9/933310"&5! #"'5326!326=3;@JmV2,+7C7#,~y&LϜJ nEzÞG@$   _Y  `Y?+??39/+3/93333310"&5!#3!332653swsT6E:C@# QY  PY?+??399//+93333310!3326=3#"&=!#B~x:6zÞ\:g*^N$.t9@  _Y `Y?+?+39/93310"&5!5!!32653twXҞE#:<@  PYQY?+3?+9/933310!!326=3#"&5!#du~~x뿾:&R&Z@-#$$('`Y _Y ##!_Y?+3/?3/+9/+9993333339910"$5467$54$32.#";#"3 [槛G4{GGuYCФ=r{k{wvMIvN%^@/ "# #'&PY PY "" PY?+3/?3/+9/+99933333399310"&54675.5463 .#"3"327ݿՖ|kѥK. pZ]coe5-l  cFJVJWUfaTf,}W;@!_Y_Y _Y_Y?+++?+93310 #"'532>!#"'5325=18`~:%5C:::*;@,B{Z A)BX W:5@   QYPYPY?+?+?+93310!"'53265! #"'5326!=@,D7:;@JmV2,+7C7#,΁CQ2LϜJ nEa}4VWNT ::ZD!@ @P`/]]29/3310#54&#"#546753f&03'dCFfHC/6..6/1XZ ^^ [W+N #(@ @ H!>?3+]q223104632#"&74632#"&4632#"&+. ".." .. ".." .r. "--" .o -- ".." -- "..".." 00mN >?10#7'7'7vVVVVVVVVVV^N "@ @ H>?3+]q2104632#"&4632#"&`. "0/# .0 0/!".m"--" ..".0 0.`N (@ @ H>?3+]q2104632#"&4632#"&3'." 00 ".. !/." .om"--" .. 0/!"...nN/]2103"&5DtfR\ijhX >?10'7P+! @    >?]99//3310"&5463232654'7#"&'.%9mRA/Q5(7 %9mQ>2S4,19&%@H&xAR5J9/&%@H)uAR6I>*N>?]21044oqhN\hmB/10#'73B)@ @ /3]29/10#52654632#"&ev. !/." .Rji\ 0/!"..NH>?]210463"fsNme_NHNH@ >?2]22310463"!463"fsIfsNme_me_; )+7!@//))55 P##/]333]223104632#"''7&732654&#"'#"&546324&#"326Z~Y[~|];-XRXy7'(:<&$:XRX-;\}~[Y~y:$&<:(&8RY~}ZY~XTX/<(89''98(?]29/310#"'#3326=WW"ee !0&2Xf fL -72D!@@P` /3]]9/3310#5.=3326=3EFfCFd'30&ffZZ \\ Z[1150051H/]210!535#j^/10#'73j/]210#5265ftRjj[H@ /2]22310#5265!#5265grgrRjkZjkZb @/]1057'%㍪3P3L\N;)@ /  P/]3]210'#"&546324&#"326=XTV28YXWw:&':8)(8R=.XTX|[Z}~Y(89'(88D^N >?10#'73NHN>?3]10!535jHP){) / /3]2104632#"&732654&#"~YY~|[[|w8((8:&&:RY~~YY~~Y(88((88P @ @ /3]q2104632#"&4632#"&P/!".0 00 0/!".b!/0 ..".0 0.- #/;'@39!@!!!- '/33333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&. ".." .. ".." .r- #--# -I. ".." .0 0/!".` .. ".." .. "..".." 00".." ..".0 0.@@ /3]q29/3105!74632#"&4632#"&G8-# // #-- #--# -mm@".." .. 00 "..!@@ /3]q29/33105#5!#74632#"&4632#"&nGj-# // #-- #--# -rmmr".." .. 00 "..PB  /3104632#"&P/!".0 0!/0 ..=D  /333104632#"&74632#"&0 0/!".. !/." .".0 0." 0/!"..= #@!@!!! /333]q2104632#"&74632#"&4632#"&."".0 0. ".0 .u0 0/!".b".0 0/!".."".0 .. 00\ /]310!!H}j\/105#5!#5oHkujjuPF  ??3104632#"&P0 0/!". 00 00PF #@ @!!! /3]29/3104632#"&4632#"&4632#"&. ".." .0 0/!".0 0/!".`".." ..I 00 00H".0 0.qP  /3104632#"&P0 00 0#--# --7/310537nyL/33310!!<L\+ /]310!!H+j`//9103` wPFPF91@  CYCY:?++9333105353jP  /3104632#"&P0 00 0f 00 "--jP  /3104632#"&P/!".0 0!/0 ..6@  A @Y9 @Y:?+?+3339104>;#"!!CIN!yY:5 /10##57#5!m͠kBK@       :9?2?39933333323339999103673##>7}Ö 7.+5aiD94qTM2!#.Hl24>9E ~J}Ɖ//}Nvvif9=??93103#Hy6@  A @Y 9@Y:?+?+333910)5!4.+532yy!NJD;Y˷3A@  @Y ;@Y9?+3?+333933310467#5! ! 32654&#;'Cy3X5?w5X)B 3@    <9?3?399333393107 7363)HzCi3Xd1X=@   @Y = @Y9?+?9/+3333910 #4&#!3!VRRqL@ @Y A @Y 9@Y:?+?+9/+333393104&#!3!! )5!265R ]R 6@  9=??39/33333393310#4.3>?3,f٬c \h5 YwP}, G@  9@Y:?+3?39333333993310)5!3>?3P}MF 7f]?!!ی`%P{H?@  A ;=@Y9?+??39/33339310#!25654&#!f3ub)x^OІf' &  :@Y9?+?33910!#4&#!5! yѶ3P@BY9AY:?+?339/+933993310332>7337>73dt1M?@r{IlV Q#/d ?y=A@@Y: @Y9?+3?3+33339310#5! #4&#!+532>5𸕹C FP"!1ѸY3lmd&d& Fd&  H@ 6?933310#3`{-@ 6?329933333310#3#3`׉{{: ?@!   PY /   ?3?99//]9+9993310!#!#3 vutF5:3:^@4   PYPY PY    PY?+??99//_^]+++39339933310)!#!!!!!!#Kb? @^L:KBL'4;@R-" ;(;5&&;=<$8PY$'5PY(QY '"( ('('(   PY 0PY PY ?+3/?+?+3/_^]99//]99++?+933333399333105!"'! >323267#"'# 57>54&#"3267< uaXAfOҒoy~q cv#ÀLd]fV Cq^H-u;oP\?/bRWaYWī):&^@0#  (' PY PYPY?+?+9/_^]33+33993333333333103!23##!#!!2654&#32654&#uK!-2u)yfnqyffyb؞dF]3RRYSURRVWNF:(@  PY PY?+?+993310)! 4&+326n(ĸ-:ʵ: P@)    PY   PY PY?+?+9/_^]3+399392223103! )#%4&+3#326n(dĸ񻷷pIʵŠ: G@%   PY PY PY?+?+9/_^]+99923310)!!!!!$d:1^N$b@2  ""&%&  PY PYPY?2/+?+3/9/+9_^]993333339910"&'732654!52654&#"'!2ʧ-5`qc]Yq .KΑgy},^[ȉTXJVJF~e  mn=: @ ??933310#5#=欬 :0:.@  PY PY?2/+?+9939210 73265#5!{4_@O^'dZhrc:: <@       PY?+?99//99333310)5737!wwweep:A@% ? ??3?39]]9333310!##!67!#?4. G,:k}rs: H@,   p   ?3?399]qr993333103#467#< Ŭ:e$:VNR=N>1 &@SY SY/+/+993310 ! 4$"32654&n꽅Ak*@  SY /333/+93310".54$! '>54&whl Zj"`ri/^"D@'   $# SY SY/2+/3+99333310% $547'563 ''27"654&sbt֊0[iɅ\X݂U1Q2vdSs[QDMCW3N%,m@:& ,!,-.&PY  )PYPY #PY  PY ?+3/?+?+?+9/99+933399333104&#"'! 6!2# '! 53265!"3267[uaXz|u~#֤C^H-籱?'Cd:%E@!  &'@  #QY ?+?39/99993333339910#"&54675.5332#"326MyСxyf\!lrtnmq:ҿC VN &@   PY ?+29933104&#"#!2`0V &@   PY ?+299331032653#"!: 4@  PY  PY??+9/+9933310!#!2#!!2654&#Bβظivuj:ze`^c: I@$  QYQY ?3?+9/+399333339910 #&463!##";Xxk|63\]^]: D@"   QY  QY?+?39/3+993333399103!"&573#";P;|kxpƖ36}]^]\#:;@" ?    QY?+3?_^]]]]9310!!#!#d:I:wDX*@  /2/993333310!2>54&#!5!27#!Dkv4S*,9Op]/ *\Y>yEX"H@" !"$#"  /2/99//93333333310!2>54&#!5!27#!3#3#\kv4S*,9Op]/鸸 *\Y>y>-?Y)<@ ! %!*+) !  /2/9/3993333339910!2654&#!5!27#!5!2654&#!?xS*,9OsZbkm`/x|Vps:l{8qVpv:Y:ZS:]1^:R@)  QYPYPY?2/+?+39/+399333339910"&'732654&+5!5!ʧ-5`y06},dZkb)A+L'd@5 $$()'QYQY '!'' !!PY! PY ?+3?+399//99++9333333310#"327#"&5467532654&#"'>32;xgbT5˗š;xgbT5˗šPQ@Vt|PQ@Vt)M+D@$( !!-,(  $$PY$PY?2+??+399933910"&'7326?'.546323267#"&/-Wu8X!Z-"G]J:ù:J]G"-Z!X9sXWz:779y7?s'4"#[CCZ#"4's?7G[UUZH:@QY??+99310!#:I::N:C@+   `   QY?3?+_^]]qr993310#!#Ǵ/:I::8~6:@@!  PY/   ??339/]3+393333310!".53332653#|6lwc̛4yj :R@7 pp 0`p QY PY PY??++?+_^]qr93310!! #"'5326!h;@JmV2,+7C7#,LϜJ nE5@  Y?  ?3?39/]+33339910!#3 !&mXo/ V{!!e"\AR 6k@;  Y Y    Y Y?+??+399//_^]]++93333993310!#!!!!!#!=&UZ/6!trtug75 P@) Y YY?+?+9/_^]+9993333310#!! 4&+324+326{[VUUosha7rkO{fOBXa"X@,    #$ Y YY?+?+9/33+3399333333399103! 3##!#4+3264&+32$^[VFL{^rj6ha-jBxDm˧XOB2n (@ YY?+?+993310#!!24&+326nt؊< ɠz궿1' E@$  Y Y Y?+?+9/_^]+99333310!!!!!1%itrt  E@$  Y  Y Y?+?+9/_^]+993333105!!5!!5! i%tRr6t0C@# YY Y?+?+99//+9333310432.#"32675!5!#"04)jX5H s{)TO̻73wN\.A 3@   Y ?3?39/+99333310!#3!3 6^c@ ??9310#3V4@   Y Y?+?+9/93310"73265#5!70 R>CND TZb`GtH1[ >@     ?3?39399333339910 #33 väg]P-@Y?+?993103!-t45@     ?33?9?933331047#&'#3?3_!d  z$gGMDiRj!a.A .@   ?3?39999333310 #3&53 6lT\.A ,@    ?2?3999933331033#47.u;ZH+ (@  Y Y?+?+993310#"54324&#"326 ̻4%J@$#  &'Y  Y ?+/39/+999933333399102653#"&5467.53"32654&SbSGVa`WHR^YcseqqcrĀply{rvzcxx- 4@ YY??+9/+9933310#!#!24+!2⡍-r Q@)      Y Y?3?+9/_^]+399333339910!#!24#!!26Ǧ{l3_pf☆mUí_*F$@ Y??+39310#!5!Xntt'F%@   Y?+?3993310"&5332653ԍ|ɯxd&@   ?3?39?910#&'#3?33%ȓvPbpquiVM;#/k@:- ((01 *Y/ YY$Y?+3/+?+3/_^]9/+9933333310"&546?54&#"'6!2327#"&'#'2>=poMQQL (3,F;/y@Bi=}bAyjx~*_N:? ΄}99O LMVJ_@m<>OQ?C#/g@%) -01)Y )@ H))Y@H Y$Y?+?+3/+?+9/+9+93333331023267!"&54&#"56323>"7>54&poMQNL (3,F;*}ADi;}bAyjx~*_N5D ΄}H99O LMSM_An:>OQ?C;"=@ $#  YY?3+?+99?99333310#"&5!23473#&532654&#"/#oTTp#uuQ]h^^g\SeJ?AE3F*e8*Q-(4;@.5( #;4;-;(<=(5Y((% )Y #!)@ H))!@"H!!Y!!%%8Y%0Y Y ?+3/?+?+3/+3/+9/+99+9/+9333339933105.#"'>32>323267!"'# 57>54&#"32674g^P`k%oG7crrLRRO CQgD?Fj9 a]Vc B3 _UcRyjx~*_N6C bbRN=EAl324&#"326To#vz#oTQ]h^^g\Skq?E'"8eylJ?ʝ;"?@#$  YY?3+?+99?993333310#"&5!235'3#&532654&#"/#oTTo#zuQ]h^^g\SeJ?@E?323632#4&#" 8NN\zs&eLTaCpey8ON[kXzsFX`#NCFKkXwvF]8@   YY?+??9?+933310#"'53254&#"#'33>32)*-PBWWg{s,mS{n t h5lWzsFX`#PA; (@  YY?+?+993310!"&5!24&#"326J[jl`^fn_htƞH6@  Y Y ?+3/?3/+99333104&#"'>32#"&'732!Wb~ou{ XBk nv̿˃nLI;h &@   Y ?+29933104&#"#!2L[jl`Jh;h '@   @ Y/+2993310!"&533265^fn_htɖZ$=@  %&Y "Y?+???+9999333310!"'##/33>324&#"326<zv"lVTZk[^g\SkqG$*I?ˢ 9@  Y @Y?+?3+39333310#"5#53733#327<@UZ$R"+-]]7, [1@    Y?+3?39993331032653#'##"&5BWWgzt*nT{nnUzsLD+ f6@  Y  Y /3+3/+993333310!2654&#!5!7#!+nUzsZDMCBWWgzt*nT{n]-&J@%  %% ('& Y"Y?+3/+3?33999333331032653#/##"&'##"&5332658NN\zs+bJTa hWqdy8ON[kXzs`#S>FKCNkXwv @   ??3933910#3>304C!'C@#  )( Y $ Y?+?9/9993?+999310"&'732?'&546323267#".'3S+<4>7 EhY%4b@"4=;+R3';4DI27#2RA)Wndgwwf-aE{W.$R2#,]`+`(X@. " )*Y  %Y Y?+??+9/_^]93+99333339910#"'##463232654>54&#"ꥒ{]{es&qMtefp;6bnex ɾ`(˯e6@  Y ?3?+?93233910#'.#"'6323#g,t/."/9H9`-Fd6\By|ex'gxu`jsxxs{ba(W@- " )*Y  %Y Y/+//+9/_^]3+993333339910%#"'##463232654>54&#"륒{]zfr$v9beuoWLTIbZB먚u@'o]eodbVGMkx`r$@  /3/933993103>3#67 " .1 /r$fA*d<`#I@' %$ Y!Y @ HY/+/99//+9++9933333107!2!"&'32#.#".4&#"326<JPh%bo7B[jl`_en_s51^8Ue:aM"L@&   $# Y YY//+3/+/+33933333310#.546746324&#">MtSXdfikp:7bne `˰eMN#*l@8 *$##+,*PY** 'PY  PY PY ?+?+?399?+9/+9/933333393103267!"'#"&533265363 '.#"횔ua~3˵-e`s|ݺ^H-PIRmt4}Vj-9l@7%44    . :;#  '++1PY+ 7PY?+???+9999//9933933333333310!"&'##65&#"#>35332673#'3>324&#"326r{3'kT7Z`72zxy"Yc 60/h|i/0rrtAXhZV,8f@4 33& !!&-&:9($!! 6PY0PY?+?+99?99//9933?933333333310%#"!23'5&#"#>35332673#'#.532654&#"52z{2'kT7Z`7xyhZ6Zby0/h|i/0rrF6t*pZ+m@7*##- )  ,- ) )QY) %PY QY ??+?+?+99//993393333333333331032673#'#&#"#>3#5354632&#"3iZ`7'kT7K4-#E>m/0rrb0/h|Oz F\aN/9B@M3++&"*9//=: *DC+6PY.00<<: :),,#2%:22:%@PY????+9////3333333333?+?999333333339333310!$'##46754'33>323>32653#&%54&#"%54&#"ЏEmZ:l{8q?b_-VpvVpt: RXܽ*,9OsZbkm`$|wH 4w9 x 7yxN'3h@5-#'( '54& , ( ,##, 1PY????+9////33333399933333333310!.'##46754'33>3265354.#"9A{:,-za>yNoaT_?*\YM (.- ;&]ٽ*,9Op]$}wp=? kv4WM.;]@0/6$ =<(,,2PY,# 9PY?+?99//9933??+999333333310!"'#32673#"'#5&#"#>34'33>324&#"326rV Z`#'kT30ƽzky?{"ʼ/0rrv0/h|ǧ61fd]ZN*L@&** $,+* ' $$*SY??+?99//99339933333103&#"#>34'33>32&#"32673#"''kT/+pf$%$32&#"32673#"'#&#"#>3\;%$<|nZ`#'kT/f /0rr0/h|K7Q@)(64! 89640 0(%PY" PY?3+?3+933333993333333310#"&'732654&/.#"#67&54632.#"32673!TgU+Kʳnzt+MlAK/a!+WQTT>L%(i)5J~HMJK)7((3,<K,,`@0 ,'' ,.- #    QY@QY*PY?+?+?+99//9933993333333310%#"5'"#>3#53733#32673#"&'327*Y]&'kT)}5x3Z`:3?$D0/h|5/0rrN?1:![@0"#PY PY?+3?99//9933+393333910"'!!5&#"#>32!5!326733{38'oU5~8J*Z'w 0/h| =00rrW K,K@&& .- )PY #PYPY?2+?3/+9/99+99333333102.# 3632#"&'##6532654&#"R{diǻs. HS~vUHKKQŮiafS6;:edb ?@!  Y@ H  ?3/?3/9/++99333310!#3!31wwXxC(3MW/: ,Q@*** $ .-!PY  'PY PY ?+3?+9/9+933333331074>3.546?!5!#"."32654&M~ރ )+9%-=]k]=玏{횣8y <&)<,$6CUtexw履*3@H%%& ,& 3&54 2//*PY/%'!PY QY@ QY?+?+??+?9??+9993333333333923107&5#53733#33632#4.#"#327#"'# }5x]9E*`UC$DY]I0.}-;҃u~^T/ro4&D: 2@    PY ??9/3+393333310333###mrrmi/:WiM%,l@7*"")#.-#@))   PY &PY ??+?+9/_^]9933/22?99333333333310354'33>323#!"'###267!"!.l0 NMVlA}|  {i61fd]YQB:U@+    PY PY?3?+9/_^]33+3399333333331033!33##"&=#26=!geegwwi//{Ÿ{XX :#,k@8 '' **#!!.-)##PY  $PYPY?3+3?+9/_^]33+339933393322223103>7!5!!.'5!!3##"=#26=! ][iNwMwNg\_LJ;iQf&zy&eR$ W$0S@,%++ 21""(PY".PY PY?+?+???+999933333210!"'532=#"&'##6533>324&#"326^;I2E}?H{32zxy"wYc 6YAXhZVWB ,W@/''!.-PYPY *PY$PY?+?+99??+?+933333310%#"!23'33!"'532=#.532654&#"52z{2Y;I2E}VxyhZ6Zbywt*pW<!P@,  #"QYPYQYPY PY?+?+?+?+?+933323103!"'532=##5354632&#"3iT6E/?}_K4-#E>wz F\aVWK.<w@@)(/ 6 )>=%(PY ((3PY9PY,PY,, PY5 &  ?3]]+3/+?+?+9/99+?9333333331032=!!"&'73 5##"3234673!!"'4.#"32>+-(v;{d 3wǻs.).HS~vUH f8KQ;hiia6MedWS@,  PY   PY?+???9339?+99333339102=##33 3!"'5}'IZq;I2wma /2W-@   PY  PY?+??+9331032=#33!"'+5dW-@ w WN5c@6- +"55 &"76- PY-$)PY$1PY PY  ?3??+99?+?+?+93333333310!4&#"#4'33>323>323!"'532=#4&#"Vps:l{8qb;I2E}kVpvxS*,9OsZbkm`wxWHN&N@)$   ('"PY" PYPY?+???+9?+993333333102=#4.#"#4'33>323!"'5"}f*\Y>yZ;I2wkv4S*,9Op]WM%2W@.&-  43##)PY#0PY PY?+?+???+99939933333210!"'5326=#"'##4'33>324&#"326|;I2E=@67V0ƽzky?{"ËCQp Y61fd]ZWNI@& ! PY SYPY?+??+9?+99339333102=#4'33>32&#"3!"'5o}^+pf$%$r%f g9WK4Q@)%$$ +65+ !!(PY%! PY PY?+?3+?3+99993933232310!"'532=#"&'732654&/.54632.#";I2E}l!XbJʳnzt0^~I(3WQTT@P"(MnP~HMJK.<*%$=Ja>W%N@+  '&PYPY # #PY# PY ?+?+9///++3933331032>5!2&#"!!"'532=!#"'Y5!6;=pxyn .]!v(-.) EZcYF_;rRZ$. (y |gZSY0dQX`VVN"._@2 ##!! )0/ &PYPYSY,PY !PY ?+?+++?+99?99333333310327# 5#'5##"!23467334&#"326-v(-.)Q6{6Dxyx (w;k[6We;jVW".R@+)""#0/ PY PY  ,PY &PY?+?+99?+?+9933333310%##"!23'5!2&#"327# 32654&#"92z{2AF:;yz@*?=xyhZ6Zby((WWN$[@. $$&%$PY$$!PYPY PY?+?+?+9/+9/993333333103267327# 5#"3 '.#"uz@*?=hݺ^H-(D IWZN/s@;"--$ ($ $10+&PY+PY PY ."" PY?+3/9?3/+9/+9?+993333339933310"&54675.5463 .#"3"327327# 5ݿՖ|kѥK. pZ]coe5z@*?=cl  cFJVJWUfaTf,(<5WbN/j@7&##* *10&PY /- -- PY- PY PY?+?+3/?+3/99/+993333339910327# 732654춮&#"'!2#"'z@*?=5eoc]Yq .KҎj{c{(k,eUafTXJVJFc  m<XWN%`@1%% '&PY  "PYPY PY ?+3/?+?+9/3+39933333333104&#"'!23327# # 53267\uaX z@*?=#C^H-D(;?W|?@! SYSY PY?+?+??+933333310 5#3332753_[z@*?LW(:aɬ=WN#F@% ""%$ PY PY  PY?+3/?+3/9?+93331032654&#"'>32#"'327# `ir٧fz@*?=NlhjZG(WG!?@ #""PY PY PY ?+?+9/+33993310%327#"&=32>54632&#"<|/;@*?=<927k,1BMKέ B:'NgiW:$K@'  # #&% PY  PYPY ???+?+?+99933333310326533327# 5#.'##"&5:*\YYzA$?8M>y:Rkv4sa(,9Op]DW :%s@>   $$'&PY  QY@ H ""PY"  PY?+3?+99//_^]++3+3/99933333910732654&+5!5!#"'327# RvUsy׊vD>@*?=̃ugUgel2IK(AW!A@! #" YY?+???+999933333310>32!"&'##4'34&#"326"oTTo"{uvP]h^^fZUjJ?p@EU!]1J@.@  Y Y ?+3?3+9933103267#"&54632&#"BV |wr~bVlILmľxl 3'S@."&)($Y& Y Y`?]+?3+9/9+93333310"''7&54632&#"632'2>54#"|lM#TJCr~aW?y[8M)Tpc/874Aufxl _E=^9^0K32'Z@/   ")(    Y%Y?+?9/9+33/99933393310"&54632&'57&'374&#"326y^@JV̔?f4?Аp{(]mn_bbodݵ*P]PB5;0]OAia}}}'Q%x@D#!! '&#Y@H@ H@HY Y@?3/]+?+3/+_^]9/+++9993333339910#"&'732654&+532654&#"'>32Q| y KMMNA=?MCEuz oxRXduwz E?=DdA76E jyra}0b.E@#  YY Y ??+9/+3/+993333310##5354632'"3{ggX\96/*a\Uh\a1AD\,D@"  YY Y ?/+9/+3/+99333331033##"'526=#5{ggX\96/*\h\a1A\;m`9@  YO _ o  ?3?9/]9+99333310#"&5332653#475)oTwr{GQXf{{MD}tO}hp. @@!   Y@ H??9/+3+3?39333333310#5333#53dSSyQQyyjX9Xyyd@ ??93103dyd@ ??93103dy. 6@   Y@ H??9/+3+393333310#5333#dSSyQQjX9X%T@,  ! Y Y  Y?+?9/_^]3+3?+339333333107"&546;33#'26=#"53m|ckz]]yz;>}4,7zaYYZGbjdMJ))'.dyyWd $@  YY?++?39310327#"53'%$","{9/ r q 4@   Y @ Y?++?933331032=#33#"' "VDz<(#6hTWX@Y?+?99310!3!Sx5n[*-Q@,-$$(./&+Y& Y  Y?3?99?+?+?+9333333104&#"#4&#"#'33>323632#"'53258NN\y8NN\ys&eLSaCpd*2%,QlXwvFlX{rFX`#NCFK s i[&#M@' "" %$ #YY ??+3/+?339939333331032653##"&'##"&533265}9MN\yx&eKSa iWpdy9MN\mVzsL=EKBN~mVwv:@  !Y Y ??+?9?+9933333104'33>32#4&#"#"'5325bt,mSzo{BVWg(5"/PB`#PApT{r r i_F:@   YY?+??9?+993333310327#"54&#"#'33>32P+**BUXgzs,mR{ni t >pT{rFX`#PA_.@  ?3?39999333310'3#&'#=tr s.X@s,: K@* Y@H@ HY Y?+?+9/+++99333310!"&5!2267!"!.Jf^s_dc`[is {}\{}w7S@+   Y YY??3+3?+3/+?9333333310%.5%34&'>%D pHLKIoID!d$÷ $N/1S@*, !'0!032.)Y.$&$$$Y$Y?3/+?+3/999+99393322103254.'.54632&#"#"'327#"5bW!=xg\2znSO6APyW4sOS $+"=9v$- 6O8hmXci36(2!6T>lu*per2@  Y Y YY?++?++9333107"'532>54632&#" 1*0 $)efI#+62 q:L7y vKY"I@%  Y Y Y?+?+?3+3?99333333310#"'5326=#"5#53733#327,0%$#* UY$R",( q (9O\\8, !\@0   #" Y @ H Y ??+?39/+933+3339933333333310!33##'##"&=#5326=!WzIIt,nQ{oHHXgBG^Q?~W^GZs>nU81I@$ *!!&//23' Y*$ Y?+?399+3993333333310"&54>54&+53232654.546;#"$*$8TWC5bF?/FAE.qr.EAF/?Fb5CW>[%@   Y?+?3993310"&533253{{ݎ%W)@  Y?+?39933310#"&53324&'3{LW)%!+}ٓ)gh;]LH @    ??39339103#'# 04C< 5@  YY?+3?+3993333105!5!!<Y1>`9b`b.J@'  Y  Y YY?++?+3?+39933333310327#"=!5!5!!&!1$Y1>90q [`9ba%mT@+  !YYY ?3+33?9/++3993993332210>32+'7#5!5!%"32654&$FBRZ^h^%Z0>{BQu40&LyoXHTV:C+Ra8b`ǁ &.M@'  Y Y Y?+3?3/+9/+99333339910!#"&'732654&+5!NYyer{p8 "~‰ une< G@%Y Y Y?+?+9/_^]+99333310#"!2267!"!.=aYXbaXsUAkɺP) @  /2/2/99105375353,Ҿ_6`B%!}) @  /3299//1053%5353_!F%Nf,)/910"54>54.54>54#"'632Z!)!!)!$*$1+/ <   ] /32310#"#"&5332>;]"8``g@mB94Z]iC#Z%-%m9G(0(,Y/+10!5!7,:h:@ Y//]+10!%7!:@:Ԕl,@ Y//]+10'!5!WԀ:@ Y//]+10!'%!:@WTlb@ /332310'%77==Amzzmb@ /22322310''%7v=,=ԀmzzmoWl  /339104'33>3&#"T71$=5W>J0!ZG7t}! /910%5!r``rRV @  /93/391057'5#373窪Rr``rRr``rWR&$@ %+55WWsN&D97Դ71%+55&%%""& ˴ "%+5+5&E ''&+5&%  "%+5&E  % %' %+5&%!!"%+5&E7&&' %+5hNy'&&z& 4]+5Wb'z&Fvg22&4]+5e&'%&%+5+5V&G ##&+5e&' H%+5V&G $$&%+5e&'%+5V&G) %%&%+59e&'%+5V9&G'',%+5We&'%+5VW&G**$%+5+&( @ & %+55+55W&H'C!@0&+5/]q5+&( & %+55+55W&H'vn!@0 &+5/]q5W&(  %+5WWN&HI ! ! %+5W&(! %+5WWN&H6##/ %+5NP&('jz@  &%+5+5WN&H'z*@ &# %+5+5&)%@  & %  %+5+5<&I%@ &K%+5+5g&*I@  &!!"%+5+5VWS&J@ 00&1 12%+5+5 &+%@ &   %+5+5&K~%@ &6%+5+5 &+ k  %+5&K %+5 &+ @ & %+55+55&Kj"j@ &'%+55+55N &+zlN&Kzr &+ %+5r&K> $%+5W&, %+5|WI&L %+5M+&, 4"@& %+555+555{&&jv#@/o&+55/]q5?&.@ &   %+5+5&N(& q  %+5+5?&. A  %+5&N  Ǵ  %+5?&.´ %+5&N&ߴ %+5/&/    %+5>&O z%+5/&/' 'I  &+5&O' {N &+5/&/i %+5&O %+5W/&/d %+5W&&O %+5&0@  &O%+5+5#&Pv@ //&+}+. %+5+5&0c%@ &%+5+5#&Pc@ --&++- %+5+5&0  %+5#N&P  ++- %+5 &1%& %+5+5&QT@ & %+5+5 &1 q %+5N&Q  %+5 &1 %+5N&Q: %+5W &1 %+5WN&Q:"" %+5a+&2 #@#&##/%+55+55V&R' *@444P444& ,%+55+5/]]5a+&2  @+&++7%+555+555V&R'  ]@I4/4?4_44/4?4O4_4o44444/4?4_4o4444 44&332 ,% ,%+5+55+5/]]qr55a+&2 @ ""&##$%+55+55V&R'C.@ 0&%+55+5/]q5a+&2 $&$$#%+55+55V&R'v_.@ 0&%+55+5/]q5&3&%+5+5W&Svm@ **&&8&) %+5+5&3%&%+5+5W&Ss@ ((&&&( %+5+5h&5%& %+5+5&U@ & %+5+5h&5 fǴ %+5N&U  %+5h&5'I f@ & %+5+5tS&U' A@ & %+5+5h&5 %+5TN&Ugߴ %+5]&6%@ 11&//1%+5+59&V@ ..&,,.%+5+5]&6 D //1%+59K&V  ,,.%+5]&6 @77&0j06%+55+559&V @44&-7-3%+55+55]+&6 @ 33&55;%+55+559&V @00&228%+55+55]&6'% C@ ..&//1%+5+59&V' @ ..&,,.%+5+5.&7{%@  & %+5+5*&W% &%+5+5.&7   %+5*,&W  8%+5.&7p %+5`,&WN )%+5.W&7q %+5W,&WS )%+5W)&8%+55W:&X:@    %+55W)&8 )%+5W:&X9 $$0 %+5W)&8%+5W:&X&"" %+5)+&8 @&(%+55+55&X'c *@555P555&$$0 %+55+5/]]5)+&8 !@ &%+555+555u&X'jE@2$/$?$O$o$$?$$$$$$&##"% %+5+55+5/]]q55 M&9 a@ &%+5+5&Y&  %+5+5 M&9 @ %+5:&Y   %+5 &:A& %+5+5&ZCH&%+5+5 &:@ &K %+5+5&Zv&@ &]%+5+5 &: @& %+55+55{&Zj@&%+55+55 &:%@ & %+5+5&Z@ &%+5+5 &: _  %+5:&Z | %+5.+&;%@ &   %+5+5&[ &  %+5+5.+&; o@& %+55+55{&[j@ & %+55+55-)&<%@  &  %+5+5W&\@ & %+5+5A&=A@ &  %+5+5S&]&  %+5+5A&=   %+5S:&]   %+5A&=r   %+5S:&]  %+5&K<%+5 8&Wj @ &%+55+55s&Z@ &%+55+55Ws&\@&  %+55+55Ws&D>&>>;%+5+5&AP%&%+5+5C%Q@*#""" &'##`Y##  _Y  _Y?+??+9/9+3993333910#"'732654&+5.#"#! CwݎkE52VcP%df '{_7A.^(I%R&$ 4%+5WsN&D 2̴24%+5R+&$@  &%+5+5Ws&D4@@&77;%+5+5R+&$ @&f%+55+55Ws&&D E@==&>D>3%+55+55R+&$ @ &%+55+551s&&D E@ ??&5y5:%+55+55R+&$ @((&)=)%+55+55Wsu&D 1@II&JJ:%+55+55R+&$ @11&%%+55+55Ws&D 1@ 99&CʴC4%+55+55R&$'` C@ &%+5+5Ws&D' @ 66&772%+5+5R+&$ @&"%+55+55Ws&D 1@ 11&4̴4:%+55+55R+&$ @&"%+55+55Ws&D 1@ 11&4̴4:%+55+55R+&$ @&%+55+55Ws+&D 1@ 11&4̴4:%+55+55R+&$ @&%%2%+55+55Ws&D 1@ 11&4̴4:%+55+55R&$' v 4$@&% !%+5+5+5Ws&D' $@11&44:%>̴>@%+5+5+5&( \  %+5WN&H    %+5+&(& %+5+5W&HR@ ))& $ %+5+5&( @ &! %+5+5W&H@ #&##/ %+5+5+&( @&f %+55+55WV&&H E@&&&'q' %+55+55+&( @ & %+55+551&&H E@ ((&# %+55+55+&( @##&$)$ %+55+55Wu&H ;@22&3O3# %+55+55+&( @ ,,&  %+55+55W&H 1"&,, %+55+55&('w \$@& % %+5+5+5W&H'  &+5Q+&,:^@N& % 0@9@P`p@P @P`p]qr^]^]+5+5  & 2D@6& %Opqr]qr+5+5|&, %+5=&L z  %+5a&2 %+5VN&R %+5a+&28@ **&! !%%+5+5V &RG&&&!%+5+5a+&2 @''&(d(%+55+55VJ&&R 9@##&$c$%+55+55a+&2 @ ''&"%+55+55%&&R 9@ %%& %+55+55a+&2 @22&3;3$%+55+55Vu&R 1@//&0C0 %+55+55a+&2 @;;&##/%+55+55V&R 1@ &))%+55+55a&2' $@ &""%&&'%+5+5+5V&R' $@&%""#%+5+5+5a&b9++&'δ'*%+5+5V&cve&&&"մ"%%+5+5a&b++&(c(+%+5+5V&cC&&&#;#&%+5+5a+&b855&,,0%+5+5V &cG00&''+%+5+5a&b /&//;%+5+5V&c*&**6%+5+5a&b '')%+5VN&c ""$%+5)&8 n%+5:&X ٴ %+5)+&8##&%+5+5 &XG**&!!% %+5+5&q$$& #%+5+5&rv++&'մ'*%%+5+5&qZ$$&! !$%+5+5&rC++&((+%%+5+5+&q..&%]%)%+5+5 &rG55&,f,0%%+5+5&q (&(i(4%+5+5&r/&/o/;%%+5+5&q j D "%+5:&r 'F')%%+5-)&<" & %+5+5W&\Ci& %+5+5-)&< B  %+5W:&\ -)+&<@ &%+5+5W &\@ &&&! %+5+5-)&< h@ & %+5+5W&\@  &  , %+5+5Ve0&cd,&,״,(%+5+5Ve0&cd--&1´1,%+5+5Ve0&cd2&2˴2(%+55+55Ve0&cd@ 33&77(%+55+55Ve0&cd@2&2 2)%+55+55Ve0&cd@33&7 7)%+55+55Ve,&cF@ EE&0ʴ0=%+55+55Ve"&c<@ FF&0ʴ0=%+55+55R&$?5R&$̓?5*~'$, ?55*~'$, ?55*~'$, ?55*~'$, ?55?~'$,P 4?55?~'$,P 4?55Fj0&gd@ ,&,,( %+5+5Fj0&gd@ --&1 1, %+5+5Fj0&gdd2&2ش2( %+55+55Fj0&gdd@ 33&7ش7( %+55+55Fj0&gd@2&22) %+55+55Fj0&gd@33&77) %+55+55'( ?5'( ?5V'(X ?55V'(X ?55V'(X  ?55V'(X  ?55jX0&id@ & %+5+5jX0&id@  &$$ %+5+5jX0&id%&%% %+55+55jX0&id@ &&&** %+55+55jX0&i6d@%&%[% %+55+55jX0&i d@&&&*/* %+55+55jX"&i<@88&# #0 %+55+55jX"&i<@99&##0 %+55+55'+ ?5'+ ?5x'+X ?55*x'+X ?55x'+X  ?55x'+X  ?55x'+X /?55x'+X /?550&kd&  %+5+50&k̝d& %+5+50&kd&ʴ  %+55+550&kd@ &ʴ  %+55+55Q0&kd@&  %+55+55Q0&kd@&  %+55+55YJ&kd@ ((&  %+55+55YJ&kd@ ))&  %+55+55D',?5D',?5',X  ?55',X  ?55',X ?55',X ?55',X '?55',X '?55V0&Rd&%+5+5V0&Rd&!!%+5+5V0&Rd"&"۴"%+55+55V0&Rd@ ##&'۴'%+55+55V0&Rd@"&"/"%+55+55V0&Rd@##&'/'%+55+55;&2d?5;&2d%?5'2 +?55'2 +?55g'2 +?55g'2 +?550&wd&%+5+50&wd& %+5+50&wd!&!Ӵ!%+55+550&wd@ ""&&Ӵ&%+55+550&w,d@!&!;!%+55+550&w,d@""&&;&%+55+55"&w<@ 44&,%+55+55"&w<@ 55&,%+55+55U'<,?5'<X ?55'< ?55'<X "?55S0&{d0&00,%+5+5S0&{d11&550%+5+5S0&{d6&66,%+55+55S0&{d@ 77&;;,%+55+55S0&{d@6&6&6-%+55+55S0&{d@77&;&;-%+55+55SJ&{d@ II&44A%+55+55SJ&{d@ JJ&44A%+55+55&[d.?5&[d.?5'[ 4?55'[ 4?553'[ 4?553'[ 4?553'[ G?553'[ G?55Ve&c,,&)),%+5+5Ve&c9,,&((+%+5+5Fj&g1,,&)), %+5+5Fj&g9@ ,,&("(+ %+5+5jX&i&д %+5+5jX&i9#@ &N %+5+5&kE&  %+5+5&k9@ &  %+5+5V&R&%+5+5V&R9 @ &(%+5+5&w&%+5+5&w9@ &%+5+5S&{o00&--0%+5+5S&{9@ 00&,K,/%+5+5VWe0&c'd,&,״,(%+5+5VWe0&c'd--&1´1,%+5+5VWe0&c'd2&2˴2(%+55+55VWe0&c'd@ 33&77(%+55+55VWe0&c'd@2&2 2)%+55+55VWe0&c'd@33&7 7)%+55+55VWe"&c'<@ EE&0ʴ0=%+55+55VWe"&c'<@ FF&0ʴ0=%+55+55WR&$&?5WR&$&̝?5*W~'$,& ?55*W~'$,& ?55*W~'$,& ?55*W~'$,& ?55?W~'$,&P 4?55?W~'$,&P 4?55jW0&i'd@ & %+5+5jW0&i'd@  &$$ %+5+5jW0&i'd%&%% %+55+55jW0&i'd@ &&&** %+55+55jW0&i'6d@%&%[% %+55+55jW0&i'6d@&&&*/* %+55+55jWJ&i'd@88&# #0 %+55+55jWJ&i'd@99&##0 %+55+55W'+' ?5W'+' ?5Wx'+X&< ?55Wx'+X&< ?55Wx'+X&<  ?55Wx'+X&<  ?55Wx'+X&< %?55Wx'+X&< %?55SW0&{'d 0&00,%+5+5SW0&{'d 0&00,%+5+5SW0&{'d 6&66,%+55+55SW0&{'d @ 77&;;,%+55+55SW0&{'d @6&6&6-%+55+55SW0&{'d @77&;&;-%+55+55SW"&{'< @ II&44A%+55+55SW"&{'< @ JJ&44A%+55+55W&[d'`.?5W&[d'`.?5W'[& 4?55W'[& 4?55W3'[& 4?55W3'[& 4?55W3'[& G?55W3'[& G?55Ve&c''&**0%+5+5VeS&c((&)Ĵ)*%+5+5VWe&c&~,,&)),%+5+5VWeN&c22-%+5VWe&c'9,,&((+%+5+5Ve&c0&0Ĵ0<%+5+5VWe&c'0&0Ĵ0<%+5+5R&$ v@ &%+5+5R&$hI@ &%+5+5R&$i?5R&$9?5WR&$ .%+5 @  /9/933910#>5#5--.WMWn53L#W @   ?999310327#"=3!,&!p  @  /9/933910#>5#5--.WMWn53L#$@  /2299333310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx:@ ! /322/329999399332105353".#"#>323273&LFA30S ]N(LF@[S *Hĸ "("84r"("l_^6jW&i'& %+5+5jWN&ijW&i'9#& %+5+5jX&i@ #&##/ %+5+5jW&i'@ #&##/ %+5+5"*'(,Wr%+5?5B*'(,9u?5"L'+,W?5BL'+,9u?5W &+ * %+5*n2@    /3/2/9/99333910#53!#>5#5nr--.W MWn53L#*x2@    /3/2/9/993393103#5#>5#5rT--.W  MWn53L#{#N@'!##$%% $! @ H ##/]2/3/33/+33/93333933910".#"#>3232673#>5#5*TNG76 [ /R?,UPG62\c--.W$49ac9%58n,MWn53L#0&k & ش  %+5+5S&k & ״  %+5+5&k&j&F@3/Oo?@P`p& %+555+55/]]q_]5&k&j9F@3/Oo?@P`p& %+555+55/]]q_]5wD&k&Ӵ %+5+5,&k!@ &ܴ& %+555+555dP&,j& %+5+5 1&,N@ &%+5+5 ',,U?5W',,9?5*n0@   /3/2/9/9939310#53!##.=nrW.-- #L36nVM*x0@   /3/2/9/99393103#5##.=rXW.--  #L36nVM{#)@ @ H ##/]2/3/33/+33/10".#"#>3232673##.=*TNG76 [ /R?,UPG62\cW.--$49ac9%58n,#L36nVM&w&ݴ%+5+5S&w&%+5+5&w'j\F@3!!/!O!o!!?!!!@!P!`!p!!!&%+555+55/]]q_]5&w'j9F@3!!/!O!o!!?!!!@!P!`!p!!!&%+555+55/]]q_]5W;0&sd$&$$ %+5+5W;0&sd%%&))$ %+5+5&w&+%+5+5&w@&''2%+555+555-)&< r & %+5+5-)&<lI@  &  %+5+5K'< ?5z'<9 ?5'3?5 *@   /339/333333310#53#53#53uк   *@   /339/333333310#53%3#5#53u<кY /991053E %!SW&{'o SWO&{ 6+61%+5SW&{'9 @ +&+7+.%+5+5S&{4&44@%+5+5SW&{' 4&44@%+5+5\&2,?5;'92d?5\&[,?5/'9b[d?5WW&[ /+/* %+5D/991053 "@  /9/933910##.=W.--̥#L36nVM* /2/10#*T "@   /?933910#'7'77'*T7777Y7887 @  /?9/3310'7##!'77RJ77}m}8L( @   /?9/33]10##'7!(R77J}78}rLrL1@"Y?O/?o@&+H/+]q+99105!rÉL1@"Y?O/?o@&+H/+]q+99105!ÉL1@"Y?O/?o@&+H/+]q+33105!ÉN&BB1@% ?O_o/]]q5/]q5H #@  [[?++933310546733%+y_YaC}H #@ [[?++933310#65#53H&({^Xi@|H "@ [[/++933310%#65#53H&({^X3jA~~G #@ [ Y ?++993310##.=AX^{(&|@gK_ J@&     [  []]?3+3/+39933333310546733!546733$*z^X%+y_Y_C~ÒaC}K_ J@&    [  []]?3+3/+39933333310#65#53#65#53_"-y^X&({^X]I~Ñi@~K_ J@%   [[]]/3+3/+3/9333333310%#65#53#65#53_#,y^X&({^X3_G~ÐjA~HF&v 7@  Y YYY/?++++9333333310#53%s`arxsa@<   Y[ Y [Y[Y[?++++/++++93333333331053%%%%#5hihixxGQ| @ 0  /]]]9910#"&54632|vqptqss .@    [/33+33933310!53!53!53( //310#!*SmOM) /3/105!#MSO/?9/310###!T @  /?39/3310###!!!TuO @   ?3/9/3310!!5!###uTON7'3?K@.%%[(( F=7=[@7 [ 7 ML4CY:4[:IY:+Y"["1Y" Y [YyMiM]MIM9M+MMMMMMM{MfMIM6MM MiMMMMMyMkMIM;MM MMMMMMMyMkM[M9M+MMMMMMMyMkM9M&M M8MMMMMM@RYMFM)MMMMMMMM{MdMKM?MMMMMMMMpM_M@MMM^]]]]]]]_]]]qqqqqqq_qqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]qqqqqqq???+++?+++?+++993+33+3939933+310!#3%2#"&5464&#"3262#"&5464&#"3262#"&5464&#"3260.COTFIOKI.COTFIOKI.COTFIOKI xwy|׷xwy|귲xwy|UzY@ ?9933103U@ĞzUz&V `]5z'O&dzXQ%@ [/o/]+9310%53 PQm?sYR%@ [/o/]+9310%#5 53RQot?G&@ //]55]55T/3310!5!+u`b??3310!#3q~ H@&   Y Y YY?+?+99//++9333333310353535353[Y@   ?33/9/3103#5!#3###TOON @  ?3/9/3310!!!##:QTN/?9310#!*T&n/?9/310##*TG "@   /?39333310#'77'*TT~~~ݵqqp @    ?3/9/3103#5!3###TON3 N@.Y_o ??39/]q33+3993333310#5!533!'jo=岲o-q(_h5(|t@C  YDTd5  Y Y?+?+9/99_^]_]]+993333333_^]_]10#"&'732654&#"#!!>32|w S@GVQK[CF@;АLFSLKHvuQr lIbwvdIl meb@    Y @# H K[@H@H/?/_]]]++]3/+]2+399333104&#"#'33>326FHUw#cJnaZFd^oA:lyO=g ~c6ji;irxs1N6ijgl@>   `Y`Y O   `Y`Y?+?3+99//_^]3+3+933333310&#"!!!!!!&432-_U|$ĸՊhy"(.x@<# " /0"@%,._Y)  @ +_Y ?33+23/99?+333/9299333993333332107&5%7373&'$+#7&'&'0=L0!"UH*9G?W SF*}EV@Uqa8B{tvY32&#"$#"$5!2.+pf$%$=#535#5354632.#"!!!!!27PFYVē"oGrphh\M7.yym9@Ks}w)8#@.c@5. ++,##"", /0'PY@- PY+# ?33??+9?+9333333333331054&#"#4'33>323632#4&#"#5}Vps:l{ߞ{*Vp-$oxS*,9OsZbk/x ;#&)@K)(' %$$! & *+%_Y  # _Y'&)(((?3?39///99333+333333+333993333393332223333231033!33#3##!##535#!5!!'##3'󬎎?\oo`"owqq++՛~)g 'N@&CBB( <""/..H<< 44((POH@H4HH4?++2PY/+%PY_Y?FPY9CCC/C C??!PY?@ H_Y@P0P PPPPPPPPPpP`PPPPPPPP0P PPP;PPPPPPPpP`PPP@PPPoP0P PPP^]]]]]]]qqqqqrrrrrr^]]]]]]]]]qqqqqqqqqrrrrr??+99//_^]+]3/3+33/3_^]_]++?+?3+99++99393333333993333310+#!2!#3 #"&5#53733#327%#"&'73254.'.54632.#"+iq@{LQi]ho5n)7=跪cX$Gmh8 VFWrl<L{zŃbNIbxnx=:i* ;W>pwit04U&7<] &5VQ|#'+.14@A.2165+'#_Y40, _Y($ 21.  ?3?3399//9993333+33333333+3333993333339103#3!#!#!53'#533!3!337!37!!'###3 mBBmslpok>@!>CGG/]**֛qq. ]@  !A9: @Y9@Y:?+?+??9/9/33339933102#54.#!#3!2>53#Y1rpToq0[jG5GRh~)-g@-$$,-,./' @ H !@ H*P--?/]3+2299//]+99333399333333310# 46323'5#53533##&5%32654&#"!!#lV╌Vi#xx~\\xPbo]\obQ27I?{?E6\gg\Pd8a]V+@i '')$$  ,-"QY) QY&    @'/H   @_ sYsY?3+?3+9/_^]qr3^]+q2+3+39933333333339310%267#"#73'7#73632.#"!!!!dxۮ(x( ۯyj(c(l~d[NV[d>(&õ?R@)    _Y ?3?39/933+3399333333339103333!!####j=D#-TTsq.M@(     _Y   ??9+3933333333310%%#5%55%!5!GGGG]@ǜ)is:FU_@S[*VM#133'7S;AS '#V`a'G3GaYMV#  XaY>`Y  03@-3**3^aY O`YD`Y?+?+?+?3/399//+9+9+393333333310#"'#>7>32".'#"&546327756%7674&#"32632654&#"32lV8&2 q$~4Dcn>&JX]dQ&V ;[~B2&O0LNyUHL\XGI],H=4F2wvg@I+=9-p6M=9&ĕQ?7ENSQFXnt2$A\)YXLs߸aqt^atxJyy_*{*)11-W!-M@*"+(/.++%`Y `Y/+?3?+99339393210#"'532654' #546324&#">HPSE>@z&~>30@5)7L\N@~"<73B[D쐀r5FC8N~A %*@f'##  &%  ,+%`Y$   @&0%@%P%0 @ P /   %  % *_Y ??+9///_^]]]]33]2233]22+9933333333933333333103##!##535#535!23#'!!627!!&#!Z}3bQ1wY@NtR8ub~{,,bddcg,#%i@8 "'&""_Y_Y@ _Y #_Y?+?3/+?39/9++3933333333310%53.'>75#5!#5$gQ6|K5pIdݯ|Hv 6jl NDf| BnW"p@;    #$_Y _Y  ??99//933+3333+33?9933333393310!3!!3##!##537)!3&/پ}[檥á~ƨ\]WE !&ddvDSne5@C.55 4/*#$$* 76##,',/_Y  _Y4' ' `Y' `Y ?+/+99//3+39/+339/933339233310!3267!"$547#53>?!5!654&#"'>323#!YDY?u'E zo( (pG(Dy~%/)?\1+Ap~xm!--/G*"h,y ^@0  ! _Y @_Y@_Y?+3/3+?33/+39333333310$%53.'$#F |+R|\?>y\Bu}fov7<",! Aa`_: 6@  PYPY??+9/+99339103!5!!5!K$:Ƌ?P{&{'u?5"&t'u#?5PN&{'3@!/o  @ ` p /A)?555]]]5]555=N''u"3@!/o@`p/\?555]]]5]555]N''(3@!/o@`p/T?555]]]5]555N''f+@/o/B?555]]]5]555;Nb@A  PY p`p o  PY ?+3/_^]?3/^]q+99333104&#"'>32#"&'7326ir٧`"jZẜ lhd^D $@     /3299339910#&'5673!9>HH>9)CI$ICV $@  /299/9333105673&'#CI$ICV9>HH>9#d^D $@     /3299339910&'3#67!59>HH>9#CI$ICV "@    /299933310%67#&'53+CI$ICV9>HH>9d^D<@     /2333993399339910#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC6@   /299/299933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9H>@   /299/2999333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>98*Y@3$,+PY QY /o 'PY/,]?+/_^]q9/3++3993333910 #"&54632374&#"7632.#"326Hք~T 5{.$qpmEQWZRN_˴>cTu(#>Xss @| _Y H  /p ?:`@_pP ]]]]]]]]qqrrrrrrr^]]]qqqqqqqrrr?2^]+?+333993933103!7%.' #3 + ^J ojN"@ _Y/2?+993310!#!No3N0 E@$   _Y _Y ]/+9?99+993333105 5!! !{BHNm0,je`H@ Y?+99105!e``b~#@Y@&H/+]+9310533bT@l Y   p P 0  o 0   O /  9       p   o O / ]]]]]qqqqqrrr^]]]]qqqqrrrrr/3?9/^]+9933933210##5!3njuNW]!-R@1"( /.%%++"?@HP/]3]+q29]2]29939210#"#"&54632>32%"32654&.#"326]˄DXɀAaFw83wMSmm33wNTihWFxNӰ傓S~qkop~`@ //993103!!^j8^@   ?2/9933104>32#4&#"tтwgĠN@ PY @   PYtfTD6&I9) gv) {k[K;) {k[I9) 7{m_@0 p@'`Pp`/^]]]]]]]]]qqqqq_qqqqqqqrrrrrr_rrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrr^]]]]]]qqqqqqqq/+/_^]+933310"'53254632&#"$O7<9W,1BSYNwrB8P,,@ *-.'Y#T"@  //999310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //9993103#"&546323265";N2$! =/'5)%3%Y?+33105! %iH[??+3103#ؑHK&[Y?+?3+310!!#(in&[Y?+?3+3105!# (%%H$[Y??+3+3103!!Hn%H&[Y?+?3+3105!3 %H-[ Y??+?3+33103!!#iHnnH,@ [Y?+??3+33105!3# %K/ @ [Y?+3?3+33105!!# i%n%H/ @ [Y?+3?3+33105!3! %nH ;@   @ [   Y?3+3??3+3333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH([[?2?3+3+3103#3#ّhHK Kj < @ [ YY?+?+?33+3310!!!!#(iijב" 8 [ [  Y ?3?+33+3+310!###בnn#j D  [ [  Y Y?+?3?+33+3+310!!#!!#htjo"j :  @ [ Y Y?+?+?33+33105!5!5!# i(qב) : [ @ [ Y?+3?33+3+3105!### ܑב%nj D  [ [ Y Y?+?3?+33+3+310#!5#!5!ґttj)F)ޑqH 9 [  YY??+?+33+33103!!!!iH"ב%H 5 [ [ Y?3?3+3+3+3103!!33A$Hn#nqH D [ [   YY?2?+?+33+3+3103!!3!!ّK$hH"qH :  @ [ Y Y?+?+?33+33105!5!5!3 iqב)%H : [ @ [ Y?+3?33+3+310!5!333$ב%nqH D [ [  Y Y?+?3?+33+3+310!5!3!3!5!$KqFH A @ [  YY??+?+?33+333103!!!!#iiH"ב"H ? [ @ [  Y?+?3?33+33+3103!!#3#AHnn KH P   [[ Y @ Y  ?3?3?+?+33+3+33310#3!!#3!!jt " "H ?  @ [ Y Y?+?+??33+333105!5!5!3# iqבKH = [ @ [ Y?+?3?33+33+3105!3#3# 㑑h%K#KH O  [[  Y Y ?3?+?3?+33+3+333103#3!5!#!5!A㑑tHK )ޑj B   [ @ Y Y?+3??+33+333105!!#5! iiq"h @  [ @ [  Y?+33?33+3+33105!!### ב%nnj S @ [[ Y Y ?3?3+3?+33+333+310#!5!3!!#!5jtttAޑ"בqH B  [ @ Y Y?+3??+33+333105!3!5! Aّ"%H @  [ @ [  Y?+33?33+3+33105!333! ב%nnqH R   [[ Y  Y ?3?3+3?+33+3+333103!!3!5!5!AH"oHZ@  @ [ Y Y ?3+3?3+3??33+3333333105!5!5!3!!!!# iiiqב"ב"HV@    [@ [    Y ?3?33+33?33+333+3333103!!###!5!33AבHnnnnH m  @ [  @ [@ Y Y ?3?3+3?3?3+333+33333+333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#3#3#3#3#3#ghhhhgghhhhhhgg`hhbhh hhahhahhhhhhgghhahhahhhhhhgghhhhhhgg`hhbhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhh"bbbbba```````````c```````````c``````aaaaab^^^^^baaaaa``````bbbbb#`````b``aa`T #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKO3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQ!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  //993310!!!7L17}1mi{@ P/]/9910!!imi{*@ P/]/q993310!!!iLPbh?9910!!hL@ ?910! XVRZ?9910 7L@ ?910 LRZ?9910Z79e 1@  /3?39933933310!# 3 #R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @  /]99102#"54>jnrotjlw)@ //9933103!32>54.#")vwvvvwvu}Avvvuvvw)#*@ %$ //993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu (@@   //]]993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:p@? :6+%%<;("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332993993333210"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7~@C5  **.&"## 98+** !"1%*"*""*'o/]33/]339///999933/393333333333310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'\@3$  )(  /   @@%(H/+/]99//]q2329333333310.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8>@!0,'6!'!9:,*3$$$-  **/^]]]9999339210&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<48@4((56$+/     //99//]92393310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@    //399310./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @   //9/3933310&&'6H zDS%Ut}FiGfY;.@  //9/939333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt \@ "! H@ H  /3/]/3339/++3339333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu28h@7  !     ?/9////////////3993993333333333210##57573%377```L`Y=>YYYYG\YY Y /w@G  `Y`Y@H@ /O_  _Y?+?9/_^]3]+2+3+3933333333103#535#533!!!!!||䅔`@7  PYPY@H / ??9/]3]+2+3+39333333333103#535#5333#3#nnnnnnnn "ޅ@G@%   @ H _Y?+?9/+233/393333103'"#>3332673#"'!#'kT&Z`!0/h|Bv/0rr*L@(   _Y`Y _Y?+?99//3+3+9333333103!2#!##%)!!! Qb\@rMمWh P@) "!_Y_Y _Y ?+?+9/+39339922310!!327#"&5!24&#!!26I/4<2F>;͗IJQLվ{PXs)06;@P7#..43 )1=<3*'*PY40:0QY#'::)@' QY 9  PY_ /  ?3/]q3+3?+?39/93+3+39933333333933310&54673&#"'!23327#"&'#+>=4'7P0Myn .dQr*;!DGd[E aU@{l M[XBꨴRZ$,^.PQpip|gl_QYg/wn@I(zXT`@2   PYQY @QY?+?+?+9?99333333333310#537333327#"'#"}5xIJ3?$DY]h6GXЃp0N?80HhG@$  _Y  _Y?+??39/+9933333310!#!#3!33#sThcH@$    QY PY?+?+93??9933333310>323##4.#"#3=:}u*`Ujcro4~= hAR@(      _Y?+??399339933333339910 3###33>͸>hQ@(      QY????+99339933333993310#33 3##„Iga/ma /Ah :@   _Y  _Y?+3?+3933310#!5!5!!OZhV1h: ;@  PYPY ?+3?+399333331035!5!!#18j&a5:@  _Y _Y??+?+?999933310!5# !273%27&#"vrJàvs G[UR}M8gdN0@ SY ??9?3/+39933310!#3?>32.#"ew 8:*zh`j);$*2:@(5Љ}d<':D $7@%& _Y?2+???9?393102&#"#.'#363767>bqBI2<- 5a-&?8 9#kc9E52ongו#CzN"8@ #$ #SY ????9?3+333910!#'#37367>32.#"ѭ4/Ѳ "#.C\TJz5j?+,6#J:'!ĊBXh.FUd-6>@-E#R@+  %$QY !PY ??+?9/93+3933933310 #'67&54632?654&#"lj3F)&l\qcnU$:"i"/:#$rHfxcY4155-U;M"+'a'@ _Y??9/+993310!#3!as):'@ QY??9/+993310!!#B:6:UR9@   PY PY?+3?3?+9333310! 4746324&#">|WP5* ڸ AAj$@ //99//9933105%5%j))J@/9/10533U{s/2/9/10 '53WmdVm_/39/10!5!%53$_ya_ /310!53!}hv @  /9/39310!#!53h[c Uhv @  /9/39310 #5!3!h]U"@ //9/993310#353Si8٘$@ //39/933310#3#58i4, @  //9933310#3#58i4,i8  /32210##5##!8}}Oc8c /23310)335338h}}cWt@ /^]9103#'⪕W㾾~:@  /3/39333105353k^dj@  /3/39933105!5!dH֔dY?9310#535Q3ndP?9310#535Q3evV@, SY PY PY?3?3+3?+?+?9933333333310##5354632&#"3533iK4-#E>ӆIz F\ai:wH@$  PY PY?3?3+3?+?99333333310##5354632&#"33iK4-#E>ӇIz F\aI4&f&  J  ??3]210#"&533265JZNM[㑬M]`J<d& '  #)BB)7oP F  '=Z'h,@  AY7?+3999310!5!3!'3T3F&- $%+53F&3F&'P*@_****{*T**$%+5]]]]5]53F&'@_{T]]]]5]5B&B&B&9`#0##]]5R& ]5?-&LO$/$$]]5)7& ]5o& ]5f& ]5y& ]5& $$]5Ff&  @/]]]]]5'&    ]5P&  ]5F& @ ]5]57&@ 0"""d""]5]]5Hy& ]53& ""]5X&5q&- &H@ /$]]5]5{H&Td0]]5'& ]53&@_{T]]]]5]5=& ]5fF& R+&P+& q+&BPJ@ A : 996??3?/?93333393310#33673#VÖ 32`F[q> ܺw).2}5  /31032673#"&'aEmzNX*4Cfq5" !%)/AOW_jv@ qe*`kU]]FMJPBX?::<3XPFk*e + x"..+''+&&#++w( ..+nhhG5#53H,(u-1XWk/0V. %@  Y/+2323310 33273T @|E ,@ YP`?]q+993310#65#53E,(u^XWu/dZK 7@"   Y_oP  ?   /]q]q+99331046733#,(u^X%Wu/dZj&@/?_/]]9910%53H&@/?_/]]9910573H 4@  /?_/]3]99993310#'##573ih 0@ /?_/]]9993310#'53373hi-Z$@ Y/3+399331053!53ӥI@*  Y    /   @Y/2+_^]]q+3333310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx  -@  /?_/]2]29105733573  &@  /]2323310"&'3326734um[[kuo5<=4rjCjCjCHvHvHv+ /99104&#"'632#5>3*HFZjQ[pE0"c;U 2x+ /99104&#"'632#5>3*HFZjQ[pE0"c;U 2xX + /99104&#"'632#5>b3*HFZjQ[pE0"c;U 2xwu/1053ɬHvHvjCjC++u ?u |u u Zu m!u ^8u u~u u z.u kfu WRu #u :u +<&@ ??931033&++ %@  @ H o/r2232/+]31053!53%!5!%++ U@  k@!H0@Pp/]]]q+q_qr/r3/99//3103#553!53>+ ָ3+ [@   k  @!H0@Pp/]]]q+q_qr2//r399//39103#'5353!53ћ+ a޸++ S@  k  @!H0@Pp/]]]q+q_qr/r399//310#%5353!53h~ }+'@_@ HP/q22/+]q310537!5!W%?+7@$ 0@ o@H/+]3q/339/q3310!5!"'&#"#>3232673%3TU$--[ +L?7SS"0+\ *K&%#(RH(%&&%QJ' '@ ??39/?993310!#!5!3e*\* '@ ??39/?993310!#!5!3e*$E '@ ??39/?993310!#!5!3o ZZ#@ ??39/?99310!#!5!3o DM%@ ??9/3?399310!# 7 3f\>Ha4R '@ ??9/3?993310!#!7!3bG4oaRM'@ ??9/3?993310!#73_J^rM '@ ??9/3?993310!#5 73fS܈kh/iF$@ ??3/9/99310!# 73pZzfjFp'@ ??9/3?993310!#73p^ZHd(5%@ ??9/3?399310!# 7 3RkGHyN!5 1@ ??9/933?993310!# 7 3Rka.K- O &@ ??39/3993310!#!7!3xtdH^- &@ ??39/3993310!# 73`vcFFH @??39/99310!#73wp=Dg-p&@ ??39/3993310!#73pEsHVH!$%@ ??9/3?399310!# 7 3=|GHY2#% 0@ ??39/933993310!# 7 534~X4(5f% 0@ ??39/933993310!# 7 3C{sVH2}q' &@ ??39/3993310!#!7!3cy Q2X/@  ?3?399310!# 73HԈG7%p&@ ??39/3993310!#573p={H\2#"@ ?3?39999310!# 7 36}MH)Q0) *@ ?3?399//993310!# 7 530~YAuO/l6 *@ ?3?399//993310!# 7 3ON,qS-m6 *@ ?3?399//993310!# 7%3O~t8S-{0@ ??39310)733+NS.)p @??39/99310!#73pA>S.)O"@ ??39/9310!#!'!ataoL 0@ ??3399//393310!# ' 3[H5fy4L .@ ??3399//393310!# ' 3UH)hy?L ,@ ??3399//93310!#5' 3SHhy-^(@ ??3399//9310!#' 3Q6fy=Lp @??39/99310!#'3p^iy"@ ??39/399310!#!5!3pT; .@ ??99//33993310!#!5!3a.izT *@ ??99//3993310!#!5!35$&@ ??99//399310!#!5!3?P(@ ??399//39310!# 7 3h`axbVL 6@ ??99//93393310!# 7 3e`;H`GF (@ ??99//3993310!#!7!3fb*]v\^L(@ ??99//3993310!#73^'c{L"@ ??99//99310!# 73e[؈scSc[Lp(@ ??99//3993310!#73pd]?de[/(@ ??399//39310!# 7 3Gu7TaF?9 6@ ??99//93393310!# 7 53Rv8HqGG? 4@ ??99//93393310!# 7 3Nw]sX=U8H? *@ ??99//393310!#!7!3mwo V=2? @ ?3?9/99310!# 73\w߈5:=?p&@ ??99//993310!#73pWw2-B=+6&@ ?3?9/999310!# 7 3O}4H) 0q5 .@ ?3?9/99393310!# 7 53N}<Au 1[l6 .@ ?3?9/99393310!# 7 3ON,q -+m6 .@ ?33?9/9393310!# 7%3O~t8 -6"@ ?3?9/9310)7330O~ -Q5p @??9/999310!#73pM4 -zL"@ ??39/9310!#!'!owKzL 0@ ??3399//393310!# ' 3oH Kz4L 0@ ??3399//393310!# ' 3oH)S@Kz?L .@ ??3399//393310!#5 ' 3oHu^Kz-L&@ ??3399//99310!# ' 3o6RjKz=hp @??39/99310!#'3po~32326733#53TU$--[ +L?7SS"0+\ *K&%#(RH(%&&%QJ'h ?+v @ H@6H @P``p@P/]]]qqqqr3+qq2/39/+39910#5##5"'&#"#>3232673wwX3TU$--[ +L?7SS"0+\ *K+&%#(RH(%&&%QJ'YX @ /]99//10#5353 0K+   @ H/+39910#53#'53373D'hi++ 3@#  P`p@Pp/]q3/9/9310#5!#5!5!+=%+: 2@    PY ??9/3+393333310333###mrrmi/Ve*&c'^6@&0/0O00000000(&(('%+555+5/]]q55Ve*&c'^6@&;/;O;;;;;;;;(&(('%+555+5/]]q55Ve*&c'^6@&;/;O;;;;;;;;(&(('%+555+5/]]q55Ve*&c'^6@&;/;O;;;;;;;;(&(('%+555+5/]]q55Ve*&c'^0@ /E?EOEEEEE''&**2%+555+5/]]55Ve*&c'^0@ /7?7O7777788&;;C%+555+5/]]55Ve*&c'^0@ /7?7O7777788&;;C%+555+5/]]55Ve*&c'^0@ /7?7O7777788&;;C%+555+5/]]55*&k&^8@'/O & %+555+5/]]q55$*&k&^8@'/O & %+555+5/]]q55*&k&^8@'/O & %+555+5/]]q553*&k&^8@'/O & %+555+5/]]q55 *&k'^0@ /?O&&%+555+5/]]55*&k'^0@ /?O&&%+555+5/]]55 *&k'^0@ /?O&&%+555+5/]]55*&k'^0@ /?O&&%+555+5/]]55*&w'^8@'*/*O********& %+555+5/]]q55*&w'^8@'&/&O&&&&&&&&((&))* %+555+5/]]q55*&w'^8@'&/&O&&&&&&&&((&))* %+555+5/]]q55*&w'^8@'&/&O&&&&&&&&((&))* %+555+5/]]q55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55+&k&j' X@+;k{ +;[;{/o/?_?_o  _   0 @  @ P ` p & %+5555+qrr55/]qr_]5/]q]qr5+&k&j' @+;k{ +;[;{/o/?_?_o  _   0 @  @ P ` p & %+5555+qrr55/]qr_]5/]q]qr5 +&k&j' X@o""""?""""?"O"""""""/o?/?_ 0@ @P`p &% %+55+55+qrr55/]qr5/]q]qr5 +&k&j' @o""""?""""?"O"""""""/o?/?_ 0@ @P`p &% %+55+55+qrr55/]qr5/]q]qr5+&w''j y@+$;$k${$ $$+$;$[$$$;${$$$$$/o/?_?_o _ 0@ @P`p &%+5555+qrr55/]qr_]5/]q]qr5+&w''j @+$;$k${$ $$+$;$[$$$;${$$$$$/o/?_?_o _ 0@ @P`p &%+5555+qrr55/]qr_]5/]q]qr5+&w'j' @{o....?....?.O.......!/!o!!!!!!?!!!!/!?!!!!_ 0@ @P`p &%+5555+qrr55/]qr5/]q]qr5+&w'j'  @{o....?....?.O.......!/!o!!!!!!?!!!!/!?!!!!_ 0@ @P`p &%+5555+qrr55/]qr5/]q]qr5h+&L ;$@   & Y %+5+]]5W]"9@  $# _Y_Y?+?9?+9333310"&'732654&#"#336$32_;ZjjİwyHWJJsnsheD=atW ;@ _Y?+?39999233310#"'532>=#3&53 }zRA4(-1  AS[aXX`]%I@$ ##'&_Y _Y?2/+??+3/99933333310"$&'33254&#"#336$32 ]İwyHyJhe=Mwj2j '@ Y ) Y/?/]q+/_^]+10#"&546324&#"322LSVMNR¾X}c+@//]qr/]q9107573}Yxy}$jA@%  Y)Y/]qr+3/_^]+3/9910%5>7>54&#"'>32!$zd\EF=:S yTQzU}CF|F@S,6865XkpdEv6QE$nj0j#_@:!Y@ H/Y) YP`/?/]q3/]+/_^]+3/_^]9/++910#"&'732654+732654#"'>320HR?3WM yKgzm^p@;jk/1eb[np^!}Ac A@)Y @ H//]qr/]q9/+933+310#5!5333tfq$ T*q5j1[d@ Y@2 HY?_  YP`/?/]q3/]+/_^]q+9/++3/910# '732654&#"#!!>3211O>LWIP?Q ur#T?z};5SGCR(u#i)j"GY@" H Y )  Y/?O/]q+/_^]3/+9/+9+10#"&54632&#">324&#"326)7^N[`HvFQCHIFENow˙L{}"1{KCJDENN|#\ /@  Y/  O  /]q/]q+310#47!5!#}EFح#oj0j"-E@( !&!&Y!@ H!!Y)+Y/?/]q+/_^]+9/++9910#"&54675.546324#"324&#"3260`PKO~QLQaEEQKIPNJBiopgHf ^>VljY=^ bii69:;@7@i*j$F@*Y @ H Y  / ?    "Y/r+/_^]q3/+9/+9+104632#"&'73265#"&732654&#"؜eN+N[`HvLKCHIFENdwSM)'x}"1}R@LFEJJ+@ @  /329/]103#5#'##538`tih+ C+@ @  /329/]10#'53#'##53`~ihy +#@ @/329/]]99104#"'632##52#'##53T;3(:CC6=Kih#@`,8N?+ /@   @ H  /3]22/33+q2210"'&#"#>3232673#573#3TU$--[ +L?7SS"0+\ *KЛi&%#(RH(%&&%QJ'pC 9+D@( P` @ P `  @  H /+]qr29/r9]103#5"&'332673#݂YkjTThk+ tD78Cx9+D@( P` @ P `  @  H /+]qr29/r9]10#'53"&'332673\ kjTThk tD78Cx9+ X@&@H @P` HH H/+++qr29+9/99910"&'3326734#"'632+52kjTThkc;3(:CJI#KtD78Cx#@`047?+ $K@  P`p@*/Ho@/2/]]+]qr339/33/3310"&'332737".#"#>3232673fUU#DA=Q[ *K@$F@;0+\ *Lj]SSdc#'##53YL=5FYBI[*5ih,Pp0E &^F !5@@H@ H@ @ H /322/+33++22103#'##5"'&#"#>3232673fhi3TU$--[ +L?7SS"0+\ *Kh&%#(RH(%&&%QJ'M /222/10"&'33273573uuIM  /222/10"&'33273%53uuIM+ @  /222/29910"&'332734#"'632#5>uuR]HFZjQ[pE07c;U (nM #)@@ H@ /2]22/33+2210"&'33273"'&#"#>3232673uu 3TU$--[ +L?7SS"0+\ *K|&%#(RH(%&&%QJ'6+/9910'53E6%!6+/9910573E6!%k& &k& '& J'& +P&P&P&F B&9`#0##]]5&i #/;?3@-3'99? !!?>''>>>/3/3/3/2/93/99014632#"&74632#"&4632#"&%4632#"&4632#"&3&. ".." .. ".." .r- #--# -2. ".." .. 0/!",n` .. ".." .. "..".." 00".." ..".0 0..o!@ /3/33/2/99015!%4632#"&4632#"&3G"-# // #-- #--# -nmm@".." .. 00 "...o\d#4@ #"@ "H"/3/+933/2/99015#5!#%4632#"&4632#"&3nGj-# // #-- #//# -nrmmr".." .. 00 "...oV04.'32> #".54>75$&`1ELIf<#IoMQpEr/Z3O1@{sr}BI`.UsVQr[L`76_`:anHDspa!:wTSV H$7<;DGNVW]h$$7h$9h$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                          uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB01uniFB02uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFC commaaccent breve.cyrcaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmarkuni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lc uni1FEF.short tonos.shortlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BEx          bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.604D@8 8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz S R Q P O M L K J I G F E D C A @ ? > = < ; : 9 N T B H:BJRZbjrz o n m l k i h g f e c b a ` _ ^ ] \ [ Y X W V U p d Z j:BJRZbjrz             ~ } { z y x w u t s r q   v |:BJRZbjrz                            :BJRZbjrz                            J",6@   bcyrlgrek2hebr>latnLMKD SRB kernkernmark  6>FNV^fn|&.6>     jx|8  #j&&&'8''(F( () )<)l)))*,*\***++,+Z+~;;>pB0ElI,I4IP1lll~.6llL.llll....llll..lll    ))     ))          ,             ))     -              1          n L $*06<BHNTZ`flrx~ &,28>DJPV\<<<<<<<~<<<<<<<<PPd<<<~<<<<<<<<<<~<<<<< (  H" X &,28>DJPV\bhntz x  XX&|vll  L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzFFhFhFXFXFFFFFFFXFXF F F@F@FXFXXFXXFXFF0F0FFFFFFXFXFFFXFXFXFXFFFFFFFFFFFhFhFXFXFFFFFFXFX F @F@FXFXXFXF0F0FFF00XFXXFXFF (  HFLRX^djpv|FFFFFFFFFFFFFn. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz00>>,,hhXX00\l4XX>04hh00>0,,ThhXXXX\l400XXTT (  H   jpv|-22<2  !<  !J`    J`      J`     !   J`     ! 4<4J4<  !4J  !Jl      Jb    Jl        !Jb      !n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFdFFFFLFLFFF (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\8FFFFFhFFFFhF F FpFFFhFFFFFFFFF\FFLF F F FF F8FFF F FF\FLFFFFF8F8F8FFFFFhFFFhF F F FFFFFFFF\FFLFFF FF F F F F (  H FFn L $*06<BHNTZ`flrx~ &,28>DJPV\$HD88\ X88$888888$$$HD$ X8$H (  H ( >       $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(pi 2@^p4r|&Tv.8,:dR>TZ`6  . < b 0 H j  @ R  , > l .p(FLZ $7<;DGNVW]h 7h9h:DJPV\`88ppp8LL8\Ppppp`pp\PP```pppLL8\PLpppp (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\&0,ThXXXlhhhXh000,ThXXl0XTT (  H   flrx~888888888n L $*06<BHNTZ`flrx~ &,28>DJPV\FFhFFXFFFFFFFFFF FF@FFXFXFXFFF0FFFFFFFXFFF0FFFFFFFF FF FFFFFhFFXFFFFFFFF F@FFXFXFF0FFFFFhF,FFFFFF (  H:@FLRX^djpv|FF,FFF,FhF,FFFFFFnn L $*06<BHNTZ`flrx~ &,28>DJPV\0h,|hXX,XX0h,|hXXXh0X (  H   flrx~h@,,x|,|@p 8=@̑openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSerif-Bold.ttf0000644000076500000240000131107013402025764025315 0ustar kintelstaff000000000000000FFTMWGDEF}t EhGPOSR-NCZGSUBM,EOS/2ȼ`cmap!E*X6cvt `}Ox;fpgm~a0gasp EXglyfcIfWhhead1<6hhea Rt$hmtx՛(@kern=!Xloca穀>h(Dmaxp D- namep-*l post$$g2prep268DIDs_<̓H̓H !EW    RT/\j3%3f Px!1ASC kF3!`= 9qIv9ZBUlKZ9NVMRFuD8jffh|qkV"d$V##9d9#E[9#V##'9d#9d#smV 3&$Vb9JzXBsFsSF6s39-s39(7s7NssT7>!s('B'P)YRT5XfjfKX3bdVf8f-#Ra{fL9NVO`|dV#V#V#V#EEEE3'9d9d9d9d9d9d3333$+s+BBBBBBBFFFFF99-99Ns7NNNNNdVFsssssBBBdFdFdFdF$S3sSV#FV#FV#FV#FV#F9d69d69d69d69#s39#s<9E9E9E9-E9-Ek-[9#s3s3V#9(V#9(V#(V#*+V#9's7's7's7 '(s79dN9dN9dNq0#7#7#7sm>sm>sm>sm>V !V +!V !3s3s3s3s3s3s$$Vb(Vb(Vb(9s  J#szJ#sdF3JUsS'<Vi<9JX9dA3t.E9#s:9cs79d9dnNsJ*Ns#sW2;C.!V!V ^3h]73S$Vb(,IDDV ) Gm<  $ T$S V##( 'q'7BE99dN3s3s3s3s3sFBBB9d9d69#s39dN9dN,! $ T$S9d6#*#'s7BB9dFBV#V#F91E99d 9dN##73s3ssm>V !nA99#s3#sSiENVb(BV#F9dN9dN9dN9dN$9s778dYV#V >(B=V3 V#F[Is/#7$S.sz3AsSsS55Gk>k""DiSiSq$,ss7s79{-M7999.(777ss70!NNSK---77505~99>k!!sX0D((!>IIIF9dR5Dq6gsJsT$$SSqS/!K!!(("<U4U4r  ! ud @fh>>Xbb99'o/ek!JbbM~~b..3f-Ve___BB{55Bf-_.&{ {7#>_g{V71y#zz*$SVk!K! eJ5F5jdF-9{h\{V"%V#Vb9#9dE9# #'ka9d9(#;CV $O&=h]E$wKk8{'wK7t'Kk8NN-U{-q%KNbHz`LZN('IS{'N'S7tcP9dNd`K#_BnN o'7v(;tM_F 0RBHPF9d^/^+st#s6H"tV#V#f %mdsmEE[#f#9#:9"J#V"% V#9^9#9###9#9d9(#dV :O&9(##'#J#m #BPR56 F766,}s66N6sFG666?6;6u36TFFL6uF>9-9=`6s,66 d*EO7 E07. E797=9dN Z\D%! |vR ddF__+09#6J$;##s)%,%6%69^7#,#,#,  9#6_#V6(6=E0dFV $$&W#-s3 !! !!E#6}9#69#6#s69(BBBV#F<5<59^79R!9#69#69dN9dN9dNmu3:::%6#?6%6&&JRsSB@+`Dm0];|<#Y9cv 9J72}9dsT1TN?=JD1HLbTT1LH-\T\9yy5#^f ;jV3/ 5b3%HZ=+j11HqN#33= =&BR50P55579/855s66N0_sMsMs0DNN;+TT_%OKOF(]-pZL66;+}j++pJ%-#Z$VV(Z" ^k t"K!J)J)}e*V(@[Fk! eV(@K*FssSss5('NM{-s_#ssS6s39(7s7s7>(BSsSFk>k"59-3s-K"B k k&kk%k!h5**K![ k.ye='=''>#Z /yBV"sV"sV"sdF$sS$sS$sS$sS$sSV#FV#FV#FV#FV#F#9d69#s39#s39#s39#s39#s3:9E99#s39#s39#s3V#9(V#9V#9V#9#7#7#7's7's7's7's79dN9dN9dN9dN#s#s#7#7#7#7sm>sm>sm>sm>sm>V !V !V !V !3s3s3s3s3s&&$Vb(Vb(Vb(s3!B9#BBBBBBBBBBBV#FV#FV#FV#FV#V#FV#FV#FE9-E9-9dN9dN9dN9d9dN9dN9dN9dnN9dnN9dnN9dnN9dnN3s3s^3^3^3^3^3$$$$wKwKwKwKwKwKwKwKggk8k8k8k8k8k8iiLL{-{-{{{{{{00NNNNNN}}''''''''[[[SSSSSSSSwKwKk8k8{-{-NN''SSwKwKwKwKwKwKwKwKggLLSSSSSSSSwKwKwKwKwKwKwK9#{{{{{{EE''''HzHz''$$mwSSSSSgh\U LmucM;M55QM*@kkc~~Vff2f5fVK!Jdd#R7 #9 V G 9ds,dW8  'XS%;XX3V=VHF5DX\lVZd391d,dVfdVdVf"g{mmb))s+kUFQ@;@<fBV9(V# #B 9#s39#s3Vb(I-#6I20K{{9V9Vss333#^f#ZNNNN#^#^#^f ;V/b%HZ=11HqN# Z=#bXXXX'XXmzf#:9-WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWW/9wKwKwKwKwKwKwKwK{{{{{{{{ ''''''''{{{{''''9-'$''7KPCC####^_W'K,~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-Aheeehg`N_UA=@U@BUC=BU.==>U<=;U;/;?;; ;>U0=/U/>U-=,U,,>U?=>UJHUGHUF=EUEHUI=HU@@H / 53U3U<0P݀ݰUo_O?@ FP`pG*/_߷ooOBp? 0p/?dO`Ohvu ut`s_pG*oG*nG3U3U@c.3Fba`_4_O^@^ F\\\[Z+/ZZ`ZZZZ3UU3U?OoSJ!POoNNNMG#JG H@H FFG*GGHU3UU3UU3U/_?TS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYsst++++++s++t++t++^s+++sstu+t+t++ss+++++++++ts+ssst+s+ss+stssst+sstsst+s+ststu++s^s+++^ss^ssssss+++++++s++++^s++++++++so=o=L!3|Zdo|3;LZ}dn!& oZdn}q3q3FLdL\jxm\DKZKS gy= JI{ WHjgaAU )% 42$ U4Kam {d/ ' T(T4  p   | txTt<x$|L!L!"p#% %&'(4)+,|-//00T0012 234p506789:H0>?x@P@ABBCCDDDETEdEtEEEEFDFG\GlG|GGHPHHII$I4IpIIJ(JtJJKDKxKKLLxLMLMO OxOP<PQ@QRS(S`SST,TdTTU0U|UUV$VhVWWTWXXXY$YTYYYZ0Z|ZZ[[,[P[t[[\H\\]8]t]]^^^_0_t_``@````a@axaabb,bpbbcLccdTdddeheef<ffg$gLggh h0hXh|hhi iij4j|jjkDkkl@lpllm(mn|o@oorssXsttHtxtu uDuv<vpvww4wXwxxDxyzzpz{l| |}x}~X~Dx0HX|h,<@p84P@xXPh\$TD(T \|4$lDdtl(´t4dĘŔƌƜƬɸH Tdt,<<Ѹdt҄ҔҤҴӄՌ՜DؘL޼߈ߘ|H`pxP@dtl|88p (8$(X,D    PtLl lll`!d#P$\%T&&'`(,() )*H+0,.012234L5567x8@99:;h<`=H>H?8@@A`ABBCDpEGlH,HIJ8KKLLMNTO@PP,P\PQRdSSTUVXWWXY@ZZZHZxZZZ[[0[`[p[[[\\P\\]`]p]]^^8^l^_\`D`x``aaDataabbDbxbc$ccddefhg4ghiTidjLk@l(lmndoDpqrrs`t(ttuvxw0w@wPw`wpwx\xyyyyztzz{D{{|H},}~~`~~~0d<L\pP4`D4`dl ( x, L@$T\\l<x@4D hx8DTD4(lt ˆ(ôXŘ,PTdɰʴDTd̠T`l|$4ЬT҄Xh\Th|אפ׸t؈؜ٌpd8ݬ߬@0D@8,tdLpd0\,l 0pT      `  $<X\0l D(X <T| L| 4\4h 4d  P   !!4!h!!!!""8"p""##D#l###$ $8$d$$$%%4%d%%%&&D&t&&&''<'d''((\((())L)|))* *<*d***++(+X+++, ,@,t,,,-$-X----. .H.p...//8/l//0,0\0001 1<1l112242d22233H3|334 4<4d44455D5x556 667 707H7l777778 888d888889 989\9t9999::,:P:h::::;;;@;X;;;;;<<(<@>0>T>l>>>>>??,?D?h?????@@4@L@d@@@@AA0ATAlAABB4BhBBCC$CDChCCCCDDLD|DDEELEpEEEFF$FTFFFG GTGGGHH(HLHpHHHI I<IpIIJJ<JpJJJKK$KHKlKKKL$LXLLLMM,MPMtMMMN,N`NNNO0OTOxOOOP PTPPPQ$QXQ|QQQR R0RTRxRRSS8ShSSST$TTTTTUU@UlUUUVVHVtVVVWWHWtWWWX$XPX|XXYY,YXYYYZZ4Z`ZZZ[[<[h[[[\\D\p\\\] ]L]|]]^^,^\^|^^^__D__`@`apaaabb0bTbxbbbc`cddde0eteeffDfhfggth hPhhi iPiiijjDjhjjk4kkl(lPllllm mDmhmmn n n n n n n n n n n n n n8noohoxooppp0pqqlqrs<stvxzzz{${h{|$|4~ pTllP,,$0lpTt|hP$  8@<0l8HP,L L|$\ X@4<TDLx4\0ÈhX(ư$LjȄtʠ\ˌ˼LHՀլ$p֜(Tװ4PڠۤHD(tLh(|\x 0\X<,p`d(DDtL0P`p0H`0H`x $<d| $<Tlh$$p(00@P`p,@Tdx$4DT(    h   d   X   H  H848,$ll`T`T\d ddT `D  \  !T!!"X"# #t#$ $`$%%x%&&P&''p'((`())x)*$*p*++x+, ,p,-$-t-. ../$/l/0 0h011\112X23 3X334D445D5560667(7t788p899X9::;(;< <<=8==>4>>?H??@8@@A8AAB<BBC8CCDLDEEhEF FGGdGGHItJ@JJKHKLXLM|MNtOO<OLOP(P|PQHQR@RS0STTT4TLTdT|TTTUV,VWh=@  @ [`k@O0 `/;p`P `/^]]]]]]]]qqqqqqqqqq^]]]]]]]qqqqqqqrr^]]]]??+933310#!"&54632s\+Ea`FEa``FEa`FEa\=#@ ?2]2993310!#!#Nh Nh==b@;!  Y  Y  O ? O  /33?399//]qr33+3333+33910#!##53#5!3!33#3!LLJL5IJJJ356ee{{ss{{Id(08{@K1.' 5'()##(9:6_Y15 -#)//@. _Y((&?22]+3?3_^]q39+3933333310.'3.546753#'.'#4.'>k7]$AKΫf[ d6}fP:!׷f$EOY_?7&5463227>54#"54&'5B[o34n[hhLrF%"FrkUCGC@(    o  ?]]]]9939333210#'-73% ,IF^3^FI _8_@XZ=XVl$ A@$  Y @   Y ?3+3_^]++933310#!5!3!l`kj-,@ Y[[/+3++933310%5>54&'&54632?Z1-LZEUpj4\>K" (TADmK_9@ Y/+99105!KZ/ @  [?+9310"&54632Ea`FEa``FEa`FEaNE@ ??333310#3y֌YNR (@ sYsY?+?+993310!"32#"32HFKJ?@IJGHdTMa8H 7@    tY?+3?3/_^]3993310%!575%3znVVLUVLA@   sYwY?+9?+39993399310)567>54&#"#>32!VIEjX>J+WPZFVd\I|m1iFYML(V@,'$$ )*'uY""sY" sY?3+?+39/+99933933910#"'332654&/57>54&#"#>3 麸 \4W_ymztpYUe]6E+WfHÐRm(E1yywxp!1)D A@"  vY ??339/3+393933310!!53347!T\܆m q  ZpdR=R@+  sY wYsY ?3+?+9/_^]+39933993102#"'3324&#"#!!6꺸 \4'r.uG;dz(E4 FL#Q@+ ""$%uY  sY sY?+?3+9/_^]+993339310#"4632#'&#"6322654&#"藜W+ERd} mkYI8NMJM^L:+4/𞞍u=3@ wY?3+9?99339310#!#!WY5O^DR".T@*#)  /0,,tY,, &sY sY ?+?+9/+99993399339910# 467.546324&#"3264&#"326lbszJ|najPVRHIQVPBC@=54&'&54632OF_]HG_`m?[1 -MWKSrt`FF`aEEa5\>L!!(T54&#"#63 F__FEa`g9_hS`pTA+YƛW`FF``FEa9n{*'+(k{T:Gu@CBAB; - %44HIY >YDY    088!Y8,00)Y0/+?+99//_^]]++3+9933933310#"'#"&54>3232654#"32$7#"$5$! 3267&#"|4dwVdfW`y !^[͒,ְUv+"Yx,flJ}+RvZ %d! _٣P_@rfW)HK(1iH@S   `Y _Y P@ p0]]]]]]qqqqqqq?3+3?39/3+393992239910%!57!!57!!hd"f{IIIII["=&@ ""('  `Y_Y`Y_Y_Y(((O(/(((((((((o(_(?((((((o(_(?(((8(((((O(/((((((o(_(O(/(((((?(((^]]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]]qqqqqqqqqrrrrrrr?++?++9/+993333104&+3264&+32657'5! !%netkfeSuqO ~8uh-pIvIxd+L\@7  _YV  E0 _Yp/]]q?+3_^]_]]]?3]+99333310 !2#'&#"326?3/iaZq0 [Zf=XeCZ<)#1$c= 2@_Y`Y_Y`Y?++?++993310+32> !%#57'5J`NFiY?欬"ptIvI#=@S  `Y-     `Y_Y `Y_YtT@0 ]]_]]]]?+3+?++39/_^]_]3+3933333310?'5!#'&+!73#'!3 ?3!#v[ p_YYP9[IIvId#==@ `Y_o-   `Y  _Y _YO/`@o_O?:`P0_?pP@ ]]]]]]]]]]]qqqqqqqrrrrrrrrr^]]]]]]]]]qqqqqqqrrrrr?+3?+3/_^]+9/_^]_]]3+393333310!57'5!#'.+!73#' G^^ 1AGYY<(IIvI۪<dL"@#$@$p$$$$ $`$$@QQWH$$_$$0$@$8$$$$$$P$$$$P$`$p$$$"_Y  _Y _Y?+?3+9/+3_^]]]qqr^]]]]+qrr933310%#"$5!2#'.#"327'5!~|eW|ZOetijF)12Ql/̮6<#JJ#=s@A   `Y    _Y _Y`P@]]]]qq?2+333?3+3339/_^]+99333310357'5!!'5!!57!#$kܬJuIIIIJJJE= [@9 _Y_Y  p @ 0     _ @ 0 ]]]]]]qqqqqr?+3?+39310%!57'5!,mdJJuII[=*@  `Y _Y?+3?3+93310'5!#"&'33265K+YF*E[II 0`^#)=@ _Y    _Y K +[K4 9{;+ {k[K; P@ ]]]]]_]]]qqqqqqqrrrrrrrrrr^]]]]]]qqqqqqrrrr?3+33?39+393333310 !!57'5!'5EN}J tXc{=IyIdBIIvII"I#=G@(    _Y _Y `Y p@0]]]]?+3+?+3993310!273!57'5!dRZ&IkIvI#R=@      _Y  _Y+ ?/o_O9oOoP@]]]]]]]]]qqqqqqqrrrrr^]]]]]]]]]]qqq_qqqqqqqqrrr?3+3?3+39_^]99333393310!#!57'5! !!57r7#emIIvIrIII '=G@$ _Y  _Y P]?33+3?33+3399332310'5!#!57'5!ݬuŴ#II&6.IIvIdL 0@  _Y _Y?/]]?+?+99331032#"! ! X`>= ^#=@  `Y  `Y_Y  _Y O/`@o_O?:`P0_?pP]]]]]]]qqqqqqqrrrrrrrrr^]]]]]]]]]qqqqqqqrrrrr?+3?++9/+99333104&+326!57'5! !gwOS~FOVIIvI\dL#@ $%  @_Y!_Y%%%%{%% %%%%{%;% %%%%%k%[%D%4%%8%%[%K%;%+%%%%T%%K%;%+%%%_^]]]]]qqqqrrrrrrr^]]]]]]]]]qqqqqqrrrrrrr?+?3+_^]2993339910! 327#".'$32#"dX`2i4>Iqa]jL=V 9]aQ>= #=g@7 `Y  `Y _Y _Y0]]?3+33?++9/+3399333939310!57'5! ! 4&+326 y($fN|8,IIvIRI8u׀mL({@K##)*+0@ %%_YRD %_YWO*?*/*]]]?3]+?3_^]_]]]+99_^]]993333331033 54&'.54632#'&#"!"&'mX-*[muh>Y-f{nuZ sV1BJf(9G`d+J[^C_%KooU'  7=m@B  `Y  _Y@0pP@ ]]]]]]]]qqqq?+3?33+393333310!57#"#!#'&+63][\S1IowI3=G@)   _Y aY pP@0]]]]]?+?3+3993310%265'5!# $5'5!FȘzIIII=@    _Y0 !    $tdD4m;$[+tT$=4P@ p`0]]]]]]]]qqqqq_qqrrr^]]]]]]]]qqqqqqqrrrrr^]]]]]]]]]]qq?33_^]]]]?3+3993393310#'5! '5nGy`=IIIoI=@       _Y 4$tT;$ k;{k4d4;k+P@+p`0/]]]]]]]]]]_qqqqqqqrrrr^]]]]]]]]qqqqqqqrrrr^]]]]]]]qq?3?33+33/_^]33]]993310# #'5! 3'5!{{DuZ:};u;IIII&=@F    4 4DTl4DdtszH]cH@X[H 4DTt;@UELHkT;4d0@p     _Y _Y?3+3?3+399_^]_]qqrrr+r^]q+++qr^]]qqq933333310%!57 '5!'5! !57J6˔sdII$RIIjII1YII$=@|  _Y _Y[{K$tD;k;p`@0]]]]_]]]]]]]qqqqr^]]]]]qqqqqqrr?+3?39_^]+39310!57'5! '5!h2(ȎTIIII2IIb=@    _Y  `YTD4$tbTF4$jvfF6&pdPD4$dTD4$:d4t`@BP@0$tdTD ^]]_]]]]]]]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqq_qqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqq?+3_^]3?+3399333333107#"#!!2673!b]Y r1;ZraQj w`@  /?933310!C)9)CNE@ ??3233103#֍EJ@  ?/93331057'5!JC))Caz,=#@/2?39993310 #3ZHs@ Y/+33105! 㐐X^#@[/]+993310 5!^ % B%@P %%  '&NY #QY NYNY'KP'''`'P'@'''`'@']]]qqqqqqr^]?+?+?3+9/+9/9933339310 !'# 4>?54#"#5>327"a^N~@VzTh&BTaK<0DPBH5'j=4u ^iUP#  p@F OYPY NY ;PpP@0]]]]]]]rr^]]]q?+?+3?+99333104&#"326'5!>32#"%[h&Z@]c`` (H̼ۢ1A]`!-DFZ>@"  OY QY]]]?+3?3+9933310%#"&54>32#'.#"327Z-TqҋH*"B6;`5}b9$(u#^wɬS\!|@M"#NYNY OY PY# ###;#P####p#P#@#0#]]]]]]]rr^]]]q?3+?3+?+?+99333310%#"&54632&='5!!327&#"8 2OY#))/PY8OY ?q?+?+99//33+999333393333310&546327#"'; #"&5467.54#!3262654&#"+#r>OJF3WwIi;SX{kJBAKE?>[Kڜ o+L L3mXuf-T=r?_@Q@@^sssmmsss3T@h NY NY RY$[9tP@0`Pp/]]]]]qqqqqqrr_rrrrr^]]]q?3+??+3?+9933310763 !574&#"!57'5!Eq^-TGBLLV-\`BZ#HBB/T^"ABBB- _@<  0@o  SY @ NY NY?+3?++_^]]]qr933310%!57'5!4632#"&gf`[?@YXA@ZZBBBHAXY@?[YL) U@3  SY@OYPYp`P]]]]]]q?3+?++93310#"&54632#"'533265'5!)Y@@ZYA?Z˻YS@+6?@ZYA?ZYrz"B3p@ NY NY NYiVD6vdVF& ivf&tfF$tdVB0 9{`T+ @,p`P@/o_? ^]]]]]]]]qqq_qqqqqqqqrrrrrrrrrrr^]]]]_]]]]]]]]]]]qqqqqqqqqqqrrrrrrrr^]]]]]]]]]]]]]qqqqq?+3?399+333?+99333333999910 '5!!57!57'5!odflCT<7s])Y`BBBBIPBBB( f@C NYNY    P @   `      ? / ]]]]]]qqqqrrrrrr?+3?+9310%!57'5!gf`ZBBB7-@) $$) )/.,*NY,$ )')NY 'RY!RYv/b/T/F/6/&/ ////////t/d/T/F///h//////f/9/&///////v/d/V/4/$///////y/i/V/D/6// /8//////`/T/D/$/ ////@////p/d/D//////p/P/?//^]]]]]]_]]qqqqqqqqqqrrrrrrrrr_rr^]]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqq?3+?3+?33+33333?+99333933107632632!574&#"!574&#"!57'5!Do8͍^-TABJV ^-TABBUV-\\mZ#HzzBB/T^**7BB/T^'FBBB7T@g NY NY RY$[9tP@0`Pp/]]]]]qqqqqqrr_rrrrr^]]]q?3+??+333?+9933310763 !574&#"!57'5!Dp^-TGBLLV-\\mZ#HBB/T^"ABBBN @X  OY OY$dD4$9$`@@]]qqqqq_qqrrrrr^]]]]]]]q?+?+993310#"&546324&#"326APM<=LOBܩ礭L @O  !NY  NYPY PY! !!!;!P!!!!p!P!@!0!]]]]]]]rr^]]]q?3+?3+?+3?+99333310632#"'!57'5!#"32kĿjlfg}d]NQX|IBRBBB4v&;TL` {@K  !" OYPY NY" """;"P""""p"P"@"0"]]]]]]]rr^]]]q?+3?+3?+3993333103267&#"!57547#"&5463273y]k&UDTfbf bHw[BB]`N+7ao@  @314H0P`p NY NY ?3]33?+3?+_^]_q+99_^]33310>;#'"!57'5!lG68;?=zzxi~7%BBB>(s@F#/  *)# NY NY***o*_*O*/*]]]]]]q?3+?3+9999_^]]33333310#"&'332654&'.54632#'.#"L/B&#r;WURygB i/HEVz*!#/K:7B+-rn%;35D(-!9@  OY @ QY?+3?3+39933310"&5#5?33#327{u6,5MzskA'hABU"<@g NY NY  RY$[9tP@0`Pp/]]]]]qqqqqqrrr_rrrrr^]]]q?3+?3+3?+9933310%# '5!327'5!!Dp^GBLLVw\R#HVBwT^"BB@  NY {[D$dD$;ddTD@0 ]]]_]]]]]]qqqqqqqqrrrr^]]]]]]]]qqqqqq?33?3+3993310#'5!'5!DywBpn3DfBBBB@       NY  YK;) y[K;+ j{kK;/ {k[K;+{o[K;/:t@Fd0$dTD4$p`P@0]]]]]_]]]qqqqqqqqqqqrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrr_rrr^]]]]]]]]]]]]]]]qqqqqq?3?3+33/_^]33993310'5!# #'5!jٶn1HyyFpNBBfBB@F     Pv@P@Y\Ho B@=AH @P@9Bpn3D@`uKQT<+-&:3.oBB BBoI~$Dc(`@         NY  NY dTDndTD[D[K4 8dTDpdT4$p@O? ^]]]]]]]_]]]]qqqqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]qqqqqqqrrrrrrrrr^]]]]]]]]]q?2_^]+9?3+999_^]]33^]333]31035#"#!326?3(k8hHP9~5H-%1B#[@5 ##$%Y_o Y"Y/+?+9/_^]+999333310"&54&'5>546;#";Pgpfq>E;n\^l;E>'jlUcr&WXW^bVYWF)&@@0 t`PD4$kp`PpO0 9p`P@p`?/^]]]]]]]]]qqqqqqqrrrr^]]]]]]]]]]qqqqqqqqqqqrrrr_rrrrr^]]]]]]]]]]]qqqqq??93103FGP#[@5  $% Y_o YY/+?+9/_^]+999333310532654675.54&+532#P>E;l^\n;E>qfqfWYVNbaJWXWrcUmiٌb0@  Y @Y/+32+993310"&'.#"#>32326739zJVS!GA Bu\8wUNVBBDs;>H1oT6EE2sSg8@  @ [  [D4$ktdTDK{TD4;+ @4$p`P]]]]]_]]]]]qqqqqqqqqqrrrrrrrrr^]]]]]]]]]qqqqqqqqrrrrrr^]]]]]]]]]]]qq/^]?+9333103!2#"&546s\ՕEa`FEa`gZ`FEa`FEaY=!^@0 "#OY QY??99//3+3333+399333933310#5$4>;53#'&'27,J\vە\kH63x}-]4e5eY@Tt-TT'>@" % ())"Y @Y/+_^]+_^]993310#"''7&547'76327"32654&a~xgidfCCfheivviifhEEhdjii`EEhfgez{dihkFFidkgxwhgfiijj="@' " !" #$!_Y_Y@$ H@ !@ H!!_Y ""_Y?3+3?+39/+33+2+3+39333333105!'5!3#3#!575!5!5!53pnEVŽBBBBffBBffdF(6@ @ 0       t ` P D 4 $   k      p ` P         p        O 0    9p ` P @     p `       ? /   ^]]]]]]]]]qqqqqqqrrrr^]]]]]]]]]]qqqqqqqqqqqrrrr_rrrrr^]]]]]]]]]]]qqqqq??99//93331033!l%n~n8F@PD6@=9+3$##393@3HG+ =fDSD  D=+  (NY#  / ?    NY/3+/_^]]3+9_^]_]]]]993333339933999910%#"&'332654&/.5467.54632#'.#"4.'>WöL/B&'r7QXSR`kd7tf^UgB i/HEPWcD$wma\'Ka@Z(LbBU*!'0K:;a+28\uKd3[n%;39V%E=M^?n <+@6*S/*D<4 ]5juZ @  Y  yiI {k]M=/ h{m]M?+ {k[M9) {kYI9+ 8{;+@O{k[K;+_O?^]]]]]_]]]]]qqqqqqqqqqqqqrrrrrrrrrrr_r^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqq/^]3+3993310"&54632!"&546320II01FF0IH11FFjG22ED32GJ/0GG02GXR*:o@>!((7/<;Y ($Y  3Y +Y?+?+99//_^]]+33_^]+99339933104$32#"$"&54632#'.#"32?3"32$54$X=@vE)R9pkzIFꡡAü@޼i;w'椣塡SR&o@3" && '(YY $YY    @ H  ?^]+]qr22/++9/++9/9933333102#'#"546?54&#"#5>327Cdt8V-~>7*!+1jSR8>.?/6R^R1+Y[E22 M7@^""+#&#;+;3@?**Y"+Y++#Y% P`p  /Y 7Y?+?+99//_^]q^]3+339/+3+3993393399339310#"$54$32#!57'5!24&+326"32$54$=@ 1^LT^[XFTxh`ꡡü@AW::7sjMt:FRBH椣塡p@ Y/+3310!5!#pbR+@ Y @Y?++9333104>32#"&"32654&bRSSTUR5PnoOQonSTSTTQIsVSttSVsV T@-   Y Y @   Y ?3+3_^]++/+9933933310#!5!3!!5ylG`kk-86F;@  YY?+9?+3999333310!5>54&#"#5632!6MvP):55%>qP,cjnwqSthpOBEtndDliW_- ;E%r@E #&'#YO_o  +; Y Y?3]+?+3_^]_]]9/^]]+9933310#"/33254&/57>54#"#563 ;wgA -6?L@>62o&,>f[OWhbmz̈́FKSBHwLi c^T#@[/]+9333105!^!%#LxU@-   NY  NYRY ]?333+??3+3?+9933333310%#"'!55'5!327'5!!?i8Z6 ^LO__Vw\\?14n-Bt[SOBAa=6@    OY /?+39/9939310###.5463!!!#׹IK @  [/+9310"&54632UEa`FEa``FEa`FEa{Z9D@   P `  @ H @ H 0/]2/+9/+q933310"'53254&'73ZFH?\>E3oZZV,/n^kLC )@ @ Y?+3?299310!575737ZhCCA.B9jQ A@ Y@ H @ Y ?+_^]+]+993310#"&546324#"326jk511565+juvmmNJT *@  Y /3+39933310 #3#3eeJfddJBVvC'|&{ !@0@?55].5OC'&{t{@0@p?5].5`E'|&u36@0@,?55].5|X "U@* ""#$"@ OY  @[?+/_^]+39/99339333102#"&546332?3# 46?EF__FEa`g9_hS`pTA+Y:W`FF``FEa]n{*+c(&$CkN&%+5+5&$vN@ &U%+5+5&$N&%+5+5&$N&(%+5+5&$jN&"%+55+55&$%%+55?55=#&@[&% %%  ##'(&`Y&& # _Y   `Y   `Y_Y%  `Y_Y?+3_^]+3?3++9/_^]3+3?+39/+993333993333339910'5!#'&+!73#'!32?3!57!!57;[ pYYP9[3͘Tz4tGdI[IIYdZ+L&&z N+%+5#&(CVN@ & %+5+5#&(vN@ &s%+5+5#&(TN@ &" %+5+5#&(jVN@ &#+%%+55+55E&,C3N &޴ %+5+5E&,v]N@  &A %+5+5E&,5N & %+5+5E&,j7N &%+55+553y= P@+  !" `Y`Y_Y`Y _Y?++?++9/3+399333910 !%#57#53'5+!!32>iY?ЖJ`NF=IzIa" zp'&1N@ &) %+5+5d&2CN& %+5+5d&2v&N@ &| %+5+5d&2N@ & %+5+5d&2N&, %+5+5d&2jN@ && %+55+55T %@    /]99933210 ' 7  BeDhBFeDeBfFBhDffdo"K@(  #$  _Y @_Y?+?9+999933910%&!273!"'#&#"4'32#lk1mVɾVȽa_ŭ_xu3&8CN&%+5+53&8v1N@ &%+5+53&8N@ &>%+5+53&8jN@ &8)#%+55+55$&<vN@ & %+5+5+=\@3  `Y`Y    _Y_YP]?+3?+399//_^]++99333310%!57'5!3 !#4&+326m8-w $~dJJuII\+@2f@4%$$ ,  43, @) )NY%% OY NY ?+?+?3_^]+9/99993399333310467.#"!57463 "#"&'53;>54&'.ZOFNM=R gj7HX:DB&+D 1@>J*T#Z HB^7JF8iIYSd:6S::gG)vrB&DC&&Ҵ'* %+5+5B&Dv@ &&;&) %+5+5B&D&&&* %+5+5B&D&&.; %+5+5BZ&Dj&&5/ %+55+55B&D&&)/ %+55+55By-<C@D,1@@5A &':'ED&&**#NY6NY*.QYAOYAA QY=OY?+?+9/+?+?9/++9/993333393339102!3267#"&'#"&54>?54&#"#56326267.="34&8ta.}(4N5Ő0]cDG\X'AJ]8^-!JGE"@J@=/R5tzB M"*?=}KlG'YS3v$FJ% S4(VIUPFZZ&Fz +%+5FX&HCw&"%+5+5FX&Hv@ &x!%+5+5FX&H@ &"%+5+5FXZ&Hj@ & -'%+55+55&C & %+5+5-R&v@  &L %+5+5d& & %+5+5CZ&j &%+55+55N%r@@   &' @ HOY#OYPY@']?+3/?+9/3+9/+9933399107&'5%!"&54632&'4&#"326Y_7HB%!dFKI@AHKF]dBl'X|o#0j޻ȥ7T&Q@ &$1%+5+5N&RC&Ĵ%+5+5N&Rv@ &X%+5+5N&R&%+5+5N&R& -%+5+5NZ&Rj&'!%+55+55VJ@(    @Y?+_^]]]99933310!5"&54632"&54632H8NN88NN88NN88NNN88NN88NN88NN88NF$j@:     %&""OY @OY @&]?+?9+999933333399107&463273#"'#.#"'326rݐ_K|vp߉^M-;3M<80OB^z5nz2r/=8|??j<;<&XC&%+5+5<&Xv@ &T%+5+5<&X@ &%+5+5<Z&Xj@ &'!%+55+55F&\v @ &}! %+5+5L3$K@'   %&NY"PY PY NY?+?3+?3+?+399333310'5!>32#"'!574&#"326s &ߴ>B %+5+5d&*N@ #&&. %+5+56<&J>&AI %+5+5d&*N@ ,&#) %+5+56<&JG&>D %+5+5dL&*36ddH6__H6@ \\H6@XXH6WWH6VVH6UUH6TTH6SSH6RRH6QQH6NNH6JJH6@ IIH6@BBH6@ AAH6@==H6<A %+5+5#&+N& %+5+53TB&K&" %+5+5#=#'@n& ' !!$())`)@)P)))& `Y&  &    '@' `Y'' ''   _Y !_Y?2+333?3+3339/_^]+2_^]]2]]+_^]33]q9933333333]]10357#535'5!!5'5!3#!57!5!#$kܬxJTnIIIInJJJT%@g$  &''>' '0'P'`''''' 0'@'''''P''''' OY$"" NY" NY RY?]3+?3+333?+9/3+3_^]]]qr^]993333310#763 !574&#"!57#535'5!3Eq^-TGBLLV-\`KiBZ#HBBT^"UBBgB<&,8N@  &!%+5+5q& &%+5+5EE&,9N@  & %+5+5X& & %+5+5E&,:N@  &%+5+5N& & %+5+5ER=&,v 0%+5-R&L $%+5E&,8N@ & %+5+5- F@+ NY NY `     ? / ]]]]]qqq?+3?+9310%!57'5!gf`ZBBBEg=&,-@   ]5-L&LM,@ 000/0[0o0x00000]55]qq55[&-6N@ &z %+5+5Lj@@  Y[ OY PYp`P]]]]]]q?3+?+/_^]3++933333310#"'533265'5!%53#'!˻YS@+6?L'rz"B!%!#)=&.3p&N3pn@9v   NY NY?3+33?399+333333333999339910_^]] '5!!57!57'5!odflCT<7s])Y`BBBBIPBBB#&/vN& %+5+5(N-&Ov@  &M %+5+5#=&/X(&O  %+5#R&/%#@ H@ Hq %++5?5+(&O;@  @ Hȴ %++5?5#=&/6@ ]5]5+L&O\% @ H @H @ H @ H ++++5#=V@/  @  `Y_Y_Yp]]?+3?3++9/999333310'5!7!273!575ϪlRZ'JxaIITjJ_/Z@5   NY @ NY?/]]]]]]q?+?9/9+39333107'5!7!57z`gfzFBuJ|KBBG'&1vN@ &r %+5+57T&Qv<@ &i%+5+5'=&1   %+57T&Q ( %+5'&1N& %+5+57T&Q& %+5+5 'QX94H H@ H@H H+++5++5(yG"Z@1"  #$ `Y aY _Y _Y ?+3?+?+33?3_^]+93333104&#"!57'5!>3 #"'3325=jfevj߅ZY!)@xpyh UJuIzCA)7L#@h $%% %>T%d%%%%%0%% %0%@%%%%%P%%%%% " NY"NY PY    RY?3+?3_^]+?+3?+_^]]]qr_rr^]]9333107632#"'5332654&#"!57'5!Dp˻YS@+6?=BLLV-\\mZ#H)rzcO"ABBBdE&2N&+5N&R@ &%+5+5d&2N&+5N&R@ &#%+5+5d&2CN@ &{ %+55+55N&R@ &S!%+55+55qE!,@K" ''-.%_Y `Y   `Y*_Y `Yh?3]]+3/+?3+9/_^]3+33/+99333933933310!2!#'&+!73#'!326?3!# 327&#"qY`TpU[ plYYa%9[Yw<Ln9=jTNd WS]0+3j@7/%045!OY)OY0OY00  QY,OY?+?3+9/+?+?+999933393399102!3267#"'#"&5463264&#"326"34.ɹ4rd=g6{u`ۼ``?M4883M?A<,RD MLzxEEnf2#&5vN&+57a&Uv@ &l%+5+5#=&57a&Ul%+5#&5tN!&+57a&U|@ &%+5+5m&6vON)&+5>&Vv@ )&x),%+5+5m&6N)&+5>&V8)&)-%+5+5mZL&6z+8#%+5>Z&VzA+8%+5m&6N@ +&-)#%+5+5>&V=+&-)%+5+5 Z7=&7zim'H'H'H'H'H'H'H'H'H'H' H' H++++++++++++!Z&WzO 7&7UN@ & %+5+5!&WE@ @H@ H++5 7=s@F     0P`p  `Y`Y _Y?+3?339/3+3+3_^]q9993333210!57!5!#"#!#'&+!!63][\S1Izw zI!G@& QY  OYOY P?3]2+3+3?+39333103#5?33#3#327#"&5#!{{u6,5M<{EA'hhABU"zs3&8N@ &*"/%+5+5<&X@ & -%+5+53E&8N@ &2%+5+5<&X@ &%+5+53&8N@ &%%+5+5<&X@ &#%+5+53&8N@ &A# %+55+55<&X@ &!%+55+553&8N@ &f#%+55+55<&X@ &>!%+55+553R=&80 (%+5R<&X &%+5&:N@ &R%+5+5&Z@ &:%+5+5$&<N@ &  %+5+5F&\@ &" %+5+5$&<jN@ &+$ %+55+55b&=vN@ &N%+5+5(`&]v@ &S%+5+5b&=TN@ &%+5+5(`&]p@ &%+5+5b&=]N@ & %+5+5(`&]s@ &%+5+51@   NY PY?3+?+33393104632#'&#"!57mķdB@'dfm%BB  %[@. !!&' #OY OYPYNY?+?+9/3+3?+9/9933333310535'5!!!>32#"%4&#"326 m`# (H̼ۢ[h&Z@]c`NhAh]`!-D1=-P@+, %%",./,*,_Y `Y)*`Y?+3?399//++3393333104&+3264&+326"#63! !%!57etkfeSuqOb2W_, ~8uh-p-;y1xIk#=z  #H@%  %$!!PY!OY OY?+?+?+9/993333104&#"326%#"%!#'.+>32[h&Z@]c`%ۢ M6/*V(H̼1D] ?!-#=5@ _Y `Y  ??9/++399333104&+32633 )57'5Sf{ۍHII  8@  OYPY??+?+9993333104&#"326'53>32#"%[h&Z@]c`zZA (H̼ۢ1A ]`!-DcL5@  _Y_YI?2]+?+3993310 !"'332#"#6$QzZq0 [fLCBZ 1&<)T&.dj(S@+((*")*%%`Y% "" _Y _Y?+?+9///+9333310'.#"#'&#"326?3# !2>325D)Zq0 [Z|iaOXsZ<)#1f=Xe&F(I@&")(*%NY%%  OY QY?+?3/+99//3/+393310'.#"#'.#"327#"&54>32>32rF*H*"B6;`5}b-TqҋSg |Oȋƥ^wɬM$(u3y=3= C@# ! `Y_Y`Y?3++3?+39/93310+32>%!%#57#"#63! J`NFL?NOb2W_KiY"pIk-;y1U=F@%   `Y`Y  _Y?+3?99//++3933310) 4$!3#"#!%#"3pd7Z ]{JI%S\=%F@&  '&OY #OY PYNY?+?+?+?+93333310)'#"&54632&=#"#!327&#"\85Vθ~B#O*@GZN\5Bt{:04cgY؍.}Mi3=i@9 `Y  `Y - `Y?3+3?39/_^]_]3+3+33939332310)3!3!#3!#"#!3I[9PYY_l [vvUI<LM@)  `Y  _Y _Y?+?+99//+_^]9333310"#63 ! 7!&2!ӐZbe" '^BC^VIi&JL%O@*  &'`Y##_Y#_Y ?3+?+39/+99333310%.5!2#'.#"!26?3# $J\븬W+!o6lYtx ,{'4\ m'*J+wxy(XF="R@- #$ #`Y`Y_Y `Y?+?++9///+33933310#"&'33265'5!#'.+!73#'-K+YF*E[^^ 1AGYY< 0`^lI۪<R`@2  OYPY6 F V  ?3]+/39/9933+3399333992399910#?>32#'&#"3# !ÍuO@&-5 E"왱qnyh.dj.d@3..0"("/0++`Y+%_Y(%%% _Y%_Y?+?+99//9+3+93333310'.#"#'.#"327'5!#"$5!24632vD)ZOetij|eZOXs6<#JJL)12QlF=G@$  _Y_Y?3+3?+993339333105! '5!'6 7&'G\}AW$sp $6IIWII8 !Agz3)Y@/"' '+* %%#NY%NY  NY NY?+?+3?+?3?+9/9333310"&54&#"!57'5!763 3265'5!rGBLLV-\`Eq7C9AnwjT^"ABBBiBZ#H{~rq'Bs.a@NY NY?+?+910"&5'5!327}`/*)0 vPBUD6 R E=9@ _Y `Y  _Y?+3?9/3+3+3910!57#53'5!3,mJJ*zII/z#)Q S@,  !" `Y   _Y??+3?39///+393333310)!574632#'&#"'5! )J tXZ]Q'dc{ˤEN}dBII`"IIy:p"_@4    #$RYNYPY   NY?3+3?3+?+399+93333310!57!574632#'&#"'5!7s])YķdB@'dodflCTBIPBBmBBB88@ OY  NY NY?+3?+9/3+3910!57#53'5!3gfww`BB=h4Brh!G@*!  !#"  SYQY?3?++?99333310!#!5'5&#"#5>327@4F`#+<%%)`y3ÙRP.A25+` Xp*F=0\@1&-  -210-_Y0,'  _Y )# aY ?3+3?3393+33333?+9333310%#"&'#"&5'5!327&5'5!3267'5!!aK9BpLAKdq;wec=:^ e"SP,949,AIIK#6AIIKSY DIIJcF=N@' _Y `Y??+9/?399+333399333310##"&'33265'5!'5!uř/d Y=#CF&6?.cVqIII7LTP@+  NYNY NY RY?+?+3?+3?+_^]9933310763 !574&#"!57'5!Dp^-TGBLLV-\\mZ#HBBT^"ABBBdLdZ'K@* "())) _Y_Y%_Y?+?+9+_^]93333310! 654&'&54632! 32#"dJ&DL= N`(@@##  )*NY OY&OY?+?+9+9333310#"&5463 654&'&546324&#"326`df gN&DLLB Bi Q=F@%  ! `Y `Y _Y?+3?99//++39333104&+326%!#!57#"#63! wOS~BF%Ob2W_\VIIk-;y1L (P@+% )*PYNY'PY "PY ?+?+?+3?+933333310#'&#"632#"'!574632#"32@'diĿjlfķcCY]NQXmCBRBBoQv&;#=!Y@0   #"_Y `Y`Y _Y ?+3?99//+++393333323104&+326#!57'5!3 h|7>54&#"#632!26?3Zo Yum~f-Yǭ>hum\+-X3!&ooM&_B[^J?+d`G9(eKB12(7@")*!&&NY& NY?+?+993310467>54&#"#5632326?3#"&2{REH/h BgyTUW=r!&B8J*o-*C43;%ns-*B8:K0"C=U.L%=@ #  &' PY  PYPY?+?+9/+933310"&5463232?3#"&5"32654&W|{X?6+@SY&*';;'';<{ZZyzrѼ(8;(';;'(;!L#E@$  %$OY@ QY PY?+?+?3+3933310"'53326=#"&5#5?33#327YS@+5;{u6,5MLr{5zskA'hAB7=6@    `Y _Y ?+3?+3393310#'&+!57#"#63!7\S1չOb2W_IIm/;y1!"D@#" $#PY OY QY?+?39/+3?+99333310'&#"3#327#"&5#5754632$'d6,5M<{{ķ5jhABU"zskA!o  F7=F@$aY   `Y?+?99//3+333933310#'&+326?3#"&5#"#!7\S1[E*FY(P3][^` w3L)J@' $ *+_Y  _Y' aY?+?3+339/+9333310# $5'5!3265'5!>54&'&54632L0]S&DL7'5!>32p<*-(;46BD`qKQT<+-&:3.,Bp@\pO1<8t*VI~$DcboBBƪD b=X@.  `Y`Y_Y?+33?9/3+3+33939939910!5!5!#"#!!!!267ae5]Y r1;wrzQj.z (`i@< NYOY     NY?+?9///_^]]3+3?+93992991035#53#"#!3#326?3(ϟשk8hHϸ9~5H-h:1h,E_=U@.  !`Y_Y_Y?+?9///+3+393333310"'332654&+5#"#!\,254!#5#"#!!27pƷUHQ)8hH:pwt9FSd 85|<A1`Q;N0lg M&)VL$^@1 ""#&%`Y _Y""wY?+3?+99//3+39399339910357>7!5!654&#"#>323#!Ve#)jX>J+WPZ8R.o3zim1fz2u)=$X@2 $$&% _Y      _Y wY_Y?++?+99//_^]9+933310'5!#'&+>32#"'3324&#"#֭Z\S]J꺸 \4'r.`k;0dI>(E4 $M@) $%& OY   OY NY?+3?+99//9+933310'5!#'&+>32#"'33254&#"#K+ebO<˦ O.h)Oa,-_RB#_Y  %1@ &'NY  OY?3+3?+93310#5?33##"&'332654&'.aVlu!Ec>B$B&325$4&#"A5mOHD758LBB_eìgeo#?Y1??910!#31m+@  ?3?39910!#3#3+⠠s /8@ aY aY   ??99//3+33+3910###535#5333#3/-ӑ쑄=$ &''=$N/&+5$ '&'']:S&G']s# =&/-V#L&/MV(Lb&OM9' =&1-'L&1M7L&QMs&$N&+5B&DE&,8N&+5k&d&2N&+5N&R3&8N&+5<&X3!&8 - &+555<&X'j@00P@ H+]q55]53&8 .& &+555<&X'jv@00P@ H+]q55]53!&8 /" &+555<&X'j@P000@ H0+]q55]53"&8 02  &+555<&X'jC@00P@ H+]q55]5FXM@)  OY   QYOY?+?+99//+_^]999323310"&=!54.#"5>32'265#0m]X7S<;+R}CM!+el5!&$ -B&D'j@>>P&&&@ H&+]q55]55&$ 1B&D';@)/2222@ H2&&`&&&&&@ H&+]]qqqq5+]qq5E&YN'&+5By&dL*^@3  +, ! `Y)!(#%#_Y!! !%%! _Y _Y?+?+9///_^]+33+39933310##"$5!2#'.#"3275#535'5!3|eW|ZOetij)12Ql/̮6<#z}JJ}<,8>C@[*<<,0" !!66B; A,ED-OY >>&!&&3OYBNY;*/ @ #H?PY?+/+_^]33+33?+99//933+93333333333310#"&'#5367.57&546327#"'; 32654&#"!&#27!6 7N&t;S+#r>OJF3WJBAKE?>S8 {C#`gj][5Br?Kڜ o+L L3([sssmmsss*1[[[d&*N@ &&($!%+5+56<&JA&۴C? %+5+5#)&.N&+53p&Nv&+5daL%J@)  '&''  #_Y _Y`Y?+?3+?+_^]93333310"&547$! 32732#"qzJX`/:6= Nc&@!('(((?(((9=H(@/(+H(( ((((_((  OY PY@$OY?3++?+_^]]]q_q++r^]93333310"&547.546323274&#"326rqzIɹџ0:632"654& EkuibEI1IhnBvdt''&1Cw&Ǵ%+5+57T&QC!&!%+5+5&$'v"@ %o+.%%+55+5?55BL&D'v @  >m>A %)/ %+55+]5&vN'&c'*!%+5+5By&v@ D&_DG%+5+5d&v&N@ #&|#& %+5+5F&v@ %&Y%( %+5+5&$~N& %+55+55&D1&(1 %+55+55&$N@ & %+5+5B&D1&1) %+5+5#&(?N'&Ĵ'%+55+55X&H)&ݴ )%+55+55#&(N@ '& '%+5+5FX&H@ )&)!%+5+5&,JN&ɴ %+55+551&& %+55+55E&,N& %+5+5E&& %+5+5d&2N"&" %+55+55 &R#&#%+55+55d&2 N@ "&" %+5+5N&R@ #&#%+5+5#&5)N)&8 ) %+55+55a&Ur & %+55+55#&5N)&)! %+5+57a&U@  & %+5+53&8N%&%%+55+55<&X#&#%+55+553&8BN@ %&^%%+5+5<&X+#&#%+5+5mL&6δ-)(#%+5>&V0-)%+5 7=&7a  %+5!&WG 0%+5AE=L"@@" #$`Y! _Y?+?99//99+93331056$54&#"#63 5,54&'c+W-}:AqSily%ޡ=14ʅ4]׻"f4Ձ(9E"H@' #$$ OY! OY?+?99//99+_^]93331075>54&#"#>325>54'vBH<<-E6DŪlsػxJe"m`& d> |S(:#&+N&!%+5+53T<&K@ !&# %+5+5#LGP@*   aY _Y _Y _Y?+3?+3?+9?+99333310574#"!57'5!>3 瑬mwLJe JJuItE9JSE#.7p@I Q"Li)(!zBCp_Vh6B+S!-%E h#.a@6' ,# 0/))_Y #_Y@ H_Y $_Y ?+/+3/++9/+999333310! $5467.5%3 4&'265!"ɶqk fv/hljueeUj~MN ,P@,. ! ' .-$$OY *OY?+?39/+9993333_^]10!"&57.546732654'74&#"326Hgq)X=>A@X)pjDLIABHKE7EU!h CF~vtFC g"UƤbE=A@"  `Y_Y?+3??+33?933310654&#!5#"#!!2}W]Y ΒKqTYraQjp|LU(EnB@#NY NY?+3??3+3?933310654&#!5#"#!32$mgk8hHPkcP]-%1ooIX&$N@ & %+5+5B&D@ /&&, %+5+5#Z=-|@C (, +,(/.&!-+- `Y --`Y-_Y- `Y_Y?+3+?++339/3+333293333333310?'5!#'&+!73#'!3 ?3!#"'53254&'7!#v[ p_YYP9[ tZFH?\>E$IvId5^kZV,/FZX&.c@7" $+* 0/00 *OY**! ""!!QY !'OY?+?3+2339/+_^]933333310"'53254&'7.54632!327"34.ZFH?\>E!տ0l^X0UT<;+ZZV,/~R~BM+"^km4d!&2 - @'& %+555+555N&R'jA@00@H0000@ H0$$'+HP$$#H$&++q+r55+]]+q5d"&2 2 @ $&$/ %+55+55N&R'Z@ 000000@"H0@ H0*1H@(H&12% -%+5+5+++r5++]qqqq5d&2N@  &  %+5+5N&R@ !&%+5+5d5&2 1 @ $& %+55+55NA&R'J@$@ H$!!!]]5+5$E&<N@ &+ %+5+5F&\@ !&! %+5+5EI@%  QY NY PY?+??+9/9+93393310632#"'#67&5'5!4&#326$%|scO^}`ACBb'+KhXQc@TbCVOBc"-%7EF'0x@A( ," 212 "%%RY% NY NY ++QY  .PY?+??9/9+9+3?+?+3_^]93333332310632#"'#67&54&#"!57'5!763 4&#326$%|scO^}GBLLV-\\mDpACBb'+KhXQc@TbCVT^"ABBBR#H@"-% $X@-   &%&OY  QY @ "PY?+??39/9+9+333993333310632#"'#67&5#5?33#4&#326$%|scO^~{uACBb'+\hXQc=VdBWA'hS"-%L! @ OY PY?3+?+910#"'533265'5!!˻YS@+6?'rz"B7^*5Q@*&&0+ 076"33OY (..PYNY?+?3+3?399+393333310'5!>32#"%#"&54632&54&#"326%327&#"` (H̼ۨ7kDmo[h&Z@]c`#^XPVNPZd5A]`!-C&!z1Ż+8L\!-6x@>"3 ( . 783OY)OY0++OY5%%PY NY?+3?3+3?3+3?+?+99//9939333333210!57547#"&5463273632#"'3267&#"#"32hˊ bHw[iĿjl]k&UDTfbڮ]NQXLB]`N+WCBR2ʴv&;s$L@)`Y ! _Y@ _Y?+3??+33?39/93+310 !57!##7#57!73337gf4iCCd"A~hn#iNII[IhhI1 Wn7d+"*i@> &%!!"#",+&% ((_Y ! _Y?3^]+?39+993393910#'&'326?3#"'#7&5!273&#"|NGZ)4jq0 [Z|KbiaejDJ.0+d<)#1/S%Xe Y=d#=E@$ _Y`Y  _Y `Y ?+3+?9/3+3+399310!!!273!57#53'5!jdRZ&I~~&zkI"zI 7h@9 !   `Y    _Y?+3?_^]39+333/3933333310!##"#!733#'&'%57'4*3][==\2=(@aw^^ g2Id>E;K@)"6((. =<"6++3NY/+  RYNY?33+?+3?3+999331032673#"&'.'.'332654&'.54632#'.#"뼲%!!'#*A?jI <#V B&#r;WURygB i/HEVz*%SL/) zJI#/K:7B+-rn%;35D(-(E7!C@$  #"RY  NY  NY?+9?3+9?+9331035#"#!32673#"./.#(k8hHG6Q#"<(&'A;KmQ-($X<-%1gTTF) .T\QHD?@! _Y   _Y _Y?3+?+39/+93310632!577>5#"#ms}݊j[ZHհ->II OK=c<@ OYNY?+3?+39/3933103577>54&#"#632fSk^gm?g%G펐gB w}ie+s#B=%.f@6 &+#&0/* _Y`Y#+"+"`Y++ _Y?2+33?99//+93+3+3933333103575#53'5! !%32654&+!4&+326" ~8SuqSetkfIz4Ix,zuh-p3=%U@+##  '&  _Y" `Y aY?+?39/33+33+3339933333310# $=#53'5!!'5!326=!ᘘzȘzII&II&z HN#"'*@K)(#)%!,+' '`Y*#*`Y(-### ## _Y  `Y_Y?3++3?+339/_^]_]933+33+3933333310!#7#57'5!733#/373#'#3 ?33'#7#;:㬬YCC[ PYYP9[0W@##}}IvIdYKFX"&){@B') %#$$% ! +* &&OY)$( QYOY?23+?+3339/993+3933333333331023!327#"'#&46"3&7#7'!/tj}`:X7ScKxj<;J`%'$PMRQM!+lFe2-kigg[==@ _Y`Y`Y ?3+?9/3+3+399310##"&'33265#53'5!3ȘK+YF*E[ 0`^vzII*L%H@% '&#SYOYOY PY?3+?+9/3+3+393310#"'533265#53'5!3#"&54632!˻YS@+6?nnldY@@ZYA?Z)rzh0"BlhD@ZYA?ZYIEL *G@$ $$+ ,!"`Y`Y*&`Y?+3?+?+?9939933310"3267&#".=#"$5!273326?TJ.p`ti&nur%:#;%%1v}$ 3Vg3/L 'H@$  ( )OYPY& #PY ?+3?+?+9939933310327&#"#"&547#"&54327332?3Tc`GSQL\d_KiB1xi5?+@ʴ+̳18H  9xmq#=!^@2#" `Y  `Y _Y _Y?+33?++9/3+33?93333310!57#53'5! ! 4&+326 y($fN|8,IIn4IRI8u׀7aX@-  OY  NY NY?+3?+9/3+3?33399_^]33310!57#53'5!>;#'"3җzzzz lG68;?=BBHhHBxi~7%h$= M@("!_Y  `Y  _Y?+3?39/933+33+3339310!!57!53/5!!7'5!3!ZVTȎVOTIIzIIIImF&)O@)$()*+)OY%'*$NY! PY ?3+?3+3333339/33+33910##"'5332>7#53/5!37'5!37#@`uKQT<+-&:3.,ǛYBpWOn3DVvOI~$Dcb7hBBBB&[@1! '(( $QY NYNYNY?+?+99//9+?+_^]9333310 '5!>3232?37>54&#"^ZN~@VzTh&BT]O<0DPcBH5'j=4u \mUP#SkC@"    PY QYNY?+?+?+?9999333310%!'# 4325!4&#"327k}qϸJ!`SWTITWjBB]q kRä_.FC@"   PY QYNY?+?+?+?99993333105!63 #"'!3265#".q]ϸJ!`SWT]djB]q'kRRjW_z %@@"!!&'PY #OY PY ?+?+9?3+933310#'&#">32#"%46324&#"326@'d (H̼ۢķcC`[h&Z@]c`mr`!-Db13G.@  OY QY?+3?3+993310>32#"'332>54&#"3-TqҋH*C8;`5}by$(u#^wɬAN!+*@%RYOY)RY?+?3+9/9+10632#"'#67&54>32#'.#"4&#"326ibfr!g;IqҋH*"B6;`5lYR\M2HJ3dp`C\rtu#^w,9,3SF )J@'$$* +" NY"OYPY)&PY?+3?+?+?+3993333310327&#"#"&=#"&54632&='5!32?x^XPVNPZd}Bd=h@mo`d'ۻ+](!zB&mS)H@&$ *+PY'OY"PY NY ?+?+?+?3+3993333310#'&#"!'#"&54632&54632327&#"@'dg8=!546"34&Q7X_k0'+:+!MCRe6p5G[@7 ?O_ OY   QYOY?+?+99//+_^]993333310"&=!54.#"5>32'265#0m]X7S<;+R}CM!+el5G$-g@6-& "- /.  %&& !RY  QY *OY ?+?+39/9+333/39999933310"&5#"&'.#"5>3 >7327%32658gqշ xpX7S,c.]qW62 o*'>:{RjoeM!+?m1Wodst6>I+a@8 "( -, QY OY  (%QY?+3?3_^]_]]+9/+993310"&54675&54632#'&#"6;#"'3267maӮyH#54&#"#'632o91|Zoss 00?x254&#"#'632?327gq `no91|Zoss 00?x2𚮰ip`3p** ymoSWkhӄvu5/.4 T-4Op wVuF=@ OYQYPY ?3+?9/3+3+339310%##"&'3326=#53'5!3K+YF*E[ʬ6, 0`^zIIgSE'3R@,1*  4'5$PY$ .PY(QY NY ?3+?+?+99?3+39333310'&#"#"'3326=# 43254632274&#"'dB+ n+pqϸV})ķdBWj`SWTImƁo$`q 1:_'äSE'G@%%)("PYQY NY?3+?+?+?999333310#"'3326=# 4327!274&#"B+ n+pqϸJWj`SWTIo$`q kR_'äq6B@"  NY  OYOY?+?+99//+393310%!"5432#'&#"3275'5![mH%R`~wjb34`L,@%@ɺBBEM@)     NY OY?+?3+3339993333310%'>7'5!'5!&'iZH A=87Jed3OH$3 ` e{`BBBBXUduC,>@!  PYOY?++3?3999333310'67&/5!673%7&'UQO{aAPxמag?TW n;1ByuB.{ciQqL@F@$NY  NY RY?+?39+333?+9933331047# '5!327'5!!Dq^TGBLLV\`JBZ#HVBBT^"BBTB7T&U@- $$'(( !!RY!PY$  NY ?3+333?3+?+9_^]9333310!574&#"!574632#'&#"763 TGBLLV-\ķdB@'dEq^B/T^"ABBm?BZ#HB7L._@5)' /00),,RY,$PY!NY PYSY?++?+3?3+?+9_^]9333310#"'5332654&#"!574632#'&#"763 ˻YS@+6?GBLLV-\ķdB@'dEq'rzT^"ABBm?BZ#H9E@$SY OY  NY NY?+3?+9/3+3?+9310!57#53'5!34632#"&gf`P[?@YXA@ZBBIhGB_hQAXY@?[Y-tk7 '@  NY NY?+3?+3910'5!!57___!_RBBBBqB@"     NY  NY ?+3?+9/333/_^]339102>73!57'"#>7'5! i aVgf" i _W` E0BBQ-F B$:@ NY NYNYNY?+?99//+3+3+310467'5!3#!57.75Q=`uugf>PQ##<]BQMBB]<+*.L(@ NY PY ?+3?+9321032?3#"&5'5!?6+@SY`GzrѼZB(F&_@3" ! $$! '(!NY" NYNYQY?2+?+3?+?9/3+393333310"&'532654&+5#"!57'5!!Y9~^$8hgf`bF)&M <BBB1+;7-b@4 $++ ./*% NY' "RYRY+NY?+?+3+?3399+3333393333310!'#"'#"'5!327&5'5!327'5!Do8͍^TABJV ^TABBUV\\R#HzzVBBT^**7VBBT^'BBB7L-_@0$+ + /.*% NY' "RY+NY?+?3+3?3399+3333399399332310#"'#"'5!327&5'5!327'5! Bp8͍^TABJV ^TABBUV\\L#HzzVBBT^**7VBBT^'BBTB7L)5f@6 3.)$$376,RY0,.)"''%NY'$"$NY"PY?2+?3+333?+99?3+393333310"'5332654&#"!574&#"!57'5!7632632YS@+6?ABJV ^-TABBUV-\\mDo8͍LrzT^**7BB/T^'FBBBR#Hzz)LT#M@( !!%$RYNY PY !NY?+3?3+?+?+339933310!574&#"#"'533265'5!763 TGBLL˻YS@+6?\mDp^B/T^"rzBR#HB7L#U@- $%% RYNY  NY  PY?+3?+3?+?+3_^]9933310"&54&#"!57'5!763 32?3[GBLLV-\\mDp?6+@SLѼT^"ABBBR#H zr!F@# NY   NY ??+3?399+3399333310'5!#!57'5!{gffg,cSUa,jywlBBL.%BB1MVR-W:@   NYNY?+?33?9/+3993310!'+3267'5! lG68;C02zzxiW~=;BBB-W=6@   NYNY?+?33?+3993310!'+3267'5! lG68;C02zzxiW~=BBwB-L@@  NY PY ?+3?33?9/+3399331032?3#"&=+3267'5!?6+@SYŔ68;C02zGzrѼW~=;BB7La9@ NY NY ?3333?+3?+993310>;#'"!57'5!lG68;?=zzxi~7%BBB7La=@ NY PY?+3?+?333393310'"32?3#"&5'5!>;);?=?6+@SYz lG6s~7%$zrѼyBxi0*@ PY NY ?+3?3+99310#'&#"!574632@'dfgķdBmBB~L-@  NY PY?+3?+399310632!57#"#~>hgfd'@nBBm9U@.OY OY NY NY??+33?++9/+39333310!#!57'5! 4&+326 `q_hkFTvFIl[BBC?B\LP9P@+  OY  NY OY NY?++?+339/3+?933310)57'5!34&+326kZh_q`NZmIFuUB?CBBcdQK>L4K@( + &&256 )) NY)NY1.PY?+3?3+?3+99933310"&5332654&'.54632#'.#"+32?3ƺB&#r;WURygB i/HEVz?6+@SLѼF#/K:7B+-rn%;35D(-n3zrL(@ PY PY ?3+?3+33910'&#"#"'5332654632'd˻YS@+6?ķcCmrz\L"B@" #"$#PYOY  PY ?3+?3+3?3+33933310'&#"3##"'53326=#534632'd˻YS@+6?ķdBm3h'rzGhL(1@  PY PY?+3?+3339310"&5#"#563232?3|d'@>h?6+@SLѼmzrF)=@"*+'*PY$RY RY?+/+?3+333933310'&#"#&'#"&546327463227&#"'dH-mtg`ķcC4K]RYEmuY_4'apd3+9,(/!<@ OY  QY?/+39/3+3933310#5#534&#"5>3236,5M<{hYABU"zsA'!L9@  OY@ PY ?+3?3+3399331032?3#"&5#5?33#?6+@SY{uGzrѼkA'h<#_@1!!  $%NY OY RYNY?+?+?39/933+33+399333333310!'# 5#53'5!!'5!327!\Dp^^^!Vw\LLGBR#Hh>Bh>Bhh"T^X)u@& ''#*+#   $H@ H    OY?+?33_^]9/++_]33333]39333310 $546?#"#!32654&'!#'&+mжF(KY\wxxw\[K(Lƒ" fxwf "6@ !PYNY QY?+?+?+9933310"&5'5!32>54&#"#5632^,j[=SJ-&%KOeuBn)iѾ;@      NY?3+333?99333310)57 !573#c_GKJJ?^??f;@     NY?3+3333?3993993310% !5733!57 XٶnH@   PY  NY ?3+333/3+993310 !57 !57>32#'&#"3xBpnDsSn0=8<+-&:3.BBBBڥ ~$Dc03@    NY NY?+3?3+3339910!57'5!'5!0lu(tYMjBBBB[B(Lq!O@*" #NYNY PY ?+3?3+3??3+3393331032?3#"&=!5#"#!326?`?6+@SYk8hHP9~5bWzrѼ'-%1({$g@6#""&%NYNYNY?3+33?99//+?+393333999910!#67!5#"#!3>32#"3254&Sk8hHPMIk^oy$wAFg$/Z@1-"($  (01NY  *RY %RY?+/+?39/3?+3933333310&'#"&54632754&+5#"#!%267&#"vg`^$8hHbI-OlN[RYEL0+apd3<1+;u[[BN,9,'0Ih<@ OYOY?+3?+39/393310)577>5#"#>32mknecj'Y@TҔJ ZK .Բ.@Ih<@ OYOY ?3+?+39/393310?.54632#'&#"!¬UBY'jcdokmJ.-K JIh=9@ OYOY ?3+?9/3+393310#"&'3324&/'5!﬑UBY'jcdok.- KZ JFFZ.@ OY QY?+3?3+993310"&54>32#'.#"327:qҋH*"B6;`5}b-Fu#^wYɬM$(dL "L@(  #$?$  _Y _Y?+?+9/_^]_]3]9939321032#"! ! 4632#"&X`[?@YXA@Z>= ^SAXY@?[Y5DF*F@&% $(!!$,+$ =MH?3]?39/]]33933333310"6;#/32654&'2#"&54675.546my **?d`phѠlVSo4-T  4.04uvVw pOq*U@,$+),NY$" OY"OY'NY'?+?+?+?99//+3399333310'.#"#'&#"3275'5!!"5432>32F*H%R`~wjb34`LkOȋƒ@ɺBB@6fgF'H@&! ()%(SY OY" "QY QY?+?3+3?+?+33933310#"&546;'5!3#"&54632267#"ݰyskY@@ZYA?Z/NX?E>zyhaxH"BTzn@ZYA?ZY^`6,+1L7X@/    NY NYNY?+?+3?39+33393333310!5?'5!75'5!dlT7s]Y`LpBBBBPBBTBJ4@    NY  NY OY ?++?9/+39931032?3!57'5![I9K__jBBTL+L@(&  ,-PY)OY#PY NY ?+3?+?+?3+3993333310#'&#"!57547#"&54632546323267&#"@'df b9ķdB]k&UDTfbmqBB]`N^1$h"K@'!! #$!!OYQY   OY?+?99//3+3+3933331075357>5#"#>323#!575$knecj'Y@TҔmz ZK .Բ.zJJ$h"N@(  #$ QY  OYOY?+3?+99//3+39333310%!575#535.54632#'&#"3m䑔UBY'jcdokJJz.-K zS)0b@600$*12NY+NYNY0 'OY "PY?+?+9?+?+?+93933333210%#"&54632&='5!!326?3!327&#"%#"8x@B,9'%/ . 14 1  @?,NY,*(NY*/ ##32#!#67!"3254&x^XPVNPZdk8h8'OY#<:.:RY,.. OY@ 4QY?3+3?3+39/99+99?3+93333310"'#"&5#5?33#3267&54>32#'.#"632'2654&#"0yHZ{u6,&D#=qҋH*"B6;`5]k\HJYR\M2{=>zskA'hAB/%nu#^wP3dp3$,9,L@:r@> 820")8<;5RY5&-PY*&2" " PY0"NYPY?2+?3+333?3+39?3+?+933333310"'5332654&#"!57!!57#5754632#'&#"!7632YS@+6?=BLLV7R׏fķcC@'d:DpLrzcO"ABBBBE'emR#H)(-N@*(  /.(%NY! NY NYNY?+?+?+?3+99933310#"'!57'5!32654&'.54632#'.#"Pif`&5oWURygB i/HEVz*BB'1K:7B+-rn%;35D(-(uI@&   NYNY NY?+33?+?9+39333310357'5!!326?3#"(f`P9~5HU>k8hBB1mQ"K)!@$+*!! $ ??99//910'53# #'5!'53# #'5!hzJ1QQ/8K@zJ1QQ/8K7i,,aF,,gi,,aF,,g<= 2@      ?3?399//33993310#'.+"#!#'.+"#!U%\]%TaU%\\%Taq  4L4$O@*""%&!NY PYRY"NY?+?3+?+3?+3933331047# 4&#"#5632327'5!s>7+@SYFDHOqLmVHkWyrѼM_"BBUB4L-S@,!!.(/'++$PY+ NY PYRY?3+?+3?+3?+3393331047# 4&#"#5632327'5!32?3#"&s>7+@SYFDHOq?6+@SY'<?33?33333?39933310632!574&#"!57'53sO92*(.-379]@((O38Z(((2$A@" "&%<-"  >?33333?33?33933310574&#"!574632#'&#"632r2*(.-37xl@#&<sO92(O38Z((=xv B&]@(,= &;= ,?3?33?39910#"&54632#"'533265'5!=6&%77%&6|n70&!&d+&76''56r} D RG#(2x7@ ;  ><?333?33?339933106;#'"!57'53xZ "#$d"ZIIL"(((  f5@   ;?>?2?333?33993310'+53267'5!xZ "#$d"ZQII2uL"W((8( ,Mf9@  ;? =?33?333?33993321032?3#"&=+53267'5!&  '35n|t[ "#$d"ZQIHQ D }rL"W((2fC@     ; >?33?33339/39333310#!57'5!374&+326@o?9*D:/4C,*F3f($z( ((o;1-&qf1@  ;  ??333?33339/9910'53# #'5! mB+II*Dz.C(( < ((A )Yf)@ = ;?333?3399910'5!'53#"'5332>7(!DvB('9F-30$%&!((9(( eT- K.U\=\=9RR+R5 @   /3293331044#526lH3TwwT0K3HPwTTwPF5 @  /329333103"&5463"AJ1TwwT3H4GPwTTwPH25@ ->?33?339/393310!577>54#"#5>32tgAB -?33?339/3933107.54632#'&#"!ehT\}z405D/329910%# #3D\>D/329910 #3 D+\+rrG^.@ Y[/]2++999331053#'L^!%!^1@ [Y/]++39993310#537L!%!O@ /]9310#3nnOBa@ /]299105!ta^TvX^CE @//]]9310#3nnEBt/399105!tޖbF$w"@//]]9310 5!F % bF$w"@//]]93105!bF % @  ?3/39310#'53#573T6TT6T%T%?3910#'53T6T%Y @   /3293331044#526lH3TwwT0K$3HPwTTwPFY @  /329333103"&5463"AJ1TwwT3H$4GPwTTwPH  /33910753533  /23910##5#5! ~  /910##5#53533wwwwwwwwA/399105!tA'` -@   @Y/]+_^]29910"&'332673TefQW\e`SDFQZ @ Y   /]+93104632#"&[?@YXA@ZAXY@?[Y#) :@#   Y@ HY?_/]+++993310"&54632"32654&VW|{XX{{X';;'';<#{ZZyyZY|8;(';;'(;oR#%@  Y/+/9333310"&54673327ZqzI<J:63232>73Up9!" i ka1OF= i i`X--F$2- E^ 6@  [/]2+3333333331053353^!%%!%%<,@   /239/333910"&557>7327Bgq{I]qW62 o{Au'?m1Wo/  /910  ' 7 HHIDHHI(ffK@     ;=?3?3339933333933310'>7'5!'53.'uG%%#,!=q(( 5 G&!2I " ,>?33?39310!57'53 ==9h(((&u(2@#)*# < ??33?339993310#"&'5332654&'.54632#'.#"mu3m(C(430TWIq[G_'>+*-WXIYf O-# '\FM[B$'W2QfT@#   >;?333?3933333339333105!7'53!57'#5?'-?Rm926?c92?'''' '' '' 27@ > -?33?339/3933107.54632#'&#"!ehT\}z405p~-$@  //]3]29910573#'~>F@  /933310#'573F>F@  /93333107'53#φ>E* @   /32993310#"&546324&#"326*|YY||YY|fB--BB--BY||YY||Y-BB--BBb$@ /]9310%5! %  $@  /2]2339910%5!!5!: %  %  &@   //2^]2339910%5!!5!"L %!%g&@ /  /]3]33310"'&#"#>3232>73Up9!" i ka1OF= i igX--F$2- EI @   /22933310"&54632"&54632UEa`FEa`FEa`FEa`I`FEa`FEa`FEa`FEa=/2910!##`ނ==/2910#5#5!`ނG/291033!YނG/2910!5353ނGF@  /329933103!53ƘFrF@ /2993103!^FבH @  /9933331057!!,%2%,'kl!/]105! % 3!/]105!3!%^D/3]21053#'L^!%!`a:/2105!ta-/2105!`-  /2]210"&'332673efQW\e`SDFQfZ  /104632#"&[?@YXA@ZAXY@?[Yj Z  /22310"&54632!"&546320II01FF0IH11FFjG22ED32GJ/0GG02G+ /233104&#"'632#5>3*HFZjQ[pE0"c;U 2x-#  /2210"&54632"32654&W|{XX{{X';;'';<#{ZZyyZY|8;(';;'(;^r /2]21053353^!%%!%%^D/3]210#537DL!%!O7/10#37nnOBVO /3210#3#3efQPbeTCBU_6/10467#"&LI#+#I?EQqE6, '!/:X_6/105>54.54632LI#+#I?EQSqE6, '!/:X_6/104632.QE?I#+#ILSMY:/!' +7E6B/105>54.54632BLI#+#I?EQSqE6, '!/:XFw@//]q]105!F % Fw@//]q]105!F %BE/10#5#5353EBE/1033##%{A /2105!5! d /10654&'&54632-DVITg]ST,F@MjRwEf  /103"&5463"J1TwwT3H4GPwTTwPH5F/231053533˄F5F/3310##5#5˄=BF /10##5#53533wwwwwwww:u/3105!tߖL!  ?33/10#"'53326=!!˻YS@+6?!'rzL2  ?22/10"&=!32?3!?6+@SLѼzrfo  /]3104632#"&[?@YXA@ZAXY@?[Y  /33310"&54632!"&546320II01FF0IH11FFG22ED32GJ/0GG02G-;   /3210"&54632"32654&W|{XX{{X';;'';<;{ZZyyZY|8;(';;'(;_@o/]]105>54.54632LI#+#I?EQqE6, '!/:X.L+@ /o /]223310"'53254&'732ZFH?\>E3oLZV,/n^k&T  /2210"&54673327qzI<J:632aQQfeFUBDSFRw@  /  /]3]310"'&#"#>3232>73{Up9!" i ka1OF= i iFX--F$2- E: /]3105!t /]3105!1 /32105!5!̗RF@    /3]210"'&#"#>3232>73{Up9!" i ka1OF= i iX--F$2- E_:/2105!t__/2105!_ /10'mMsMMsM` /?10#3Ef  /1044#526H3TwwT0K3HPwTTwPF{F /2210!3!5d7F@ 0@/3]210!!5#nF~i-@  @ H//]3+29/33310.#"#54&#"#>32632 ?(5FPF5)> RnJg<54.5463#44 & w44 & w-2:#QXr-2:#QX!@@H@ H/3++]2105!5!c̗>_/]105!V_ % _/]105!_ %HRy@    /3]210"'&#"#>3232>73{Up9!" i ka1OF= i iHX--F$2- E_/105>54.54632LI#+#I?EQ/qE6, '!/:XH]  /333310"&54632!"&5463253-@A,,?>-@A,,?>b?V@-->=..?@-->@+.?!s%gE @ //]]210"&=3327 RS2)@EWPEN/{A /22105!#!R d1(@H H//]3+]2+105!5!̗VE /3210#3#332732>73{973x:$" i ka6:3x9& i i0_Bj-F]Ai ER#/#@  '!-/2399//3/310"'&#"#>3232>734632#"&4632#"&{Up9!" i ka1OF= i iG33GG33GG33GG33GX--F$2- E3GG34GG3GG34GGRN/1@,####  /  ( /3]299//3310"'&#"#>3232>73"'&#"#>3232>73{Up9!" i ka1OF= i icUp9!" i ka1OF= i iX--F$2- EX--F$2- EH /10'7#'573'7e,%%,,%%,Hll'kk'1F /10'#5'73lk'&&, #/;GS_kw@U!{Q]]KWiic uo9EE3?ϙ-'Wc?χ''?cW /33333/333339////////////33333333333333333333333333104632#"&%4632#"&4632#"&4632#"&4632#"&%4632#"&4632#"&%4632#"&'4632#"&4632#"&4632#"&4632#"&%4632#"&4632#"&4632#"&4632#"&#5#5!!5353##!!33!5!!5!#3#35DxxdP_Nd8dwd8dE88DddddKquffd?d%8?8ddd88y/10#57'53l>>f /32103"&5463"J1TwwT3H4GPwTTwPH`- 1@ &/]23]]]]9/3102#.#"#>4632#"&eaQQfe YAAXY@?[UBDSv@Z[?@YX#E /10''7'77GGGGGGGGzF/10#'573F>zF/107'53#>Fr  /29/3107'53#%573#'5>>=f  /321044#526H3TwwT0K3HPwTTwPFr  /310#"&54632@-,@@,-@,@@,-@@*F /10#7'7'7'37$t#//#t$//䞠vk,-jtqh,+jE#/@ -'!! /3299233310#"&'#"&54632>324&#"326732654&#"|Y5YY5Y||Y5YY5Y|LB--BB--BhB--BB--BY|.((.|YY|-((-|Y-BB--BB--BB--BB$Oo/9/3107#33&?p@oOVw /3]210"$&'332$73lۯ g.01.g wUYGRRGYU_ /2]210"$&'332$73lۯ g.01.g _UYGRRGYU=/2105!5u/3105!53!d@     /3]210".#"#>3232673gF^zi _cgF\zi3*1*@3OK)2)>3_ /3]2102#&$#"#>$l% g.-g &UZGRSFYUSH /10'7!5!'7$,%6%,Hlk'&Es#A@ ## $%! ?><?2?39/993?393333102#'#"546?54#"#5632799 0N#nIS0A(p2:.$$5s(+ ZWRfG:=30't7@   ?<?2?39/939933333102!327#"&5"34&sg@::Kp.+tz1 WM).%=`QpA!2I 1@  @ H ,;>?33?3?+39310!57'53'4632#"& ==97&&54''6h((((44(&76!&*u %@  <??3?3993310# 46324&#"326*{}"5-%%-5"O)ut`bx#f;@ >; ??3?333?399933310#"5'53327'53#sM8+(-.47c@g({38(('u)@    <??3?39993310#"&54632#'&#"327`0Ni+%86FKQW7Tc}iwi&<@ ! A > , <??3?3?3?399333310#"&54632'5'53#327&#"->$}z~BB9>85/4-16<R]((ow v2;@  ,  ><?3?33333?39933310632!574&#"!57'53sO92*(.-379]@((O38Z(((2u+V@'""' ' ,-(*;@ " '' %><?333?33333333?39933393310>32632!574#"!574#"!57'53GV#c#~R93O,493O'33775&II((Ok ((Ok](((2x5@  ;  ><?3?33?399933106;#'"!57'53xZ "#$d"ZIIL"(((&   ;??2?333910"&5#5?33#327RWJWFZww!$*U&JDt'>'( 3 &ff#@   ;??3?3333310#'5!'53\I(!DB(& ((C(( 2Rf2@ >;?333?393333105!7'53!57'#5?'-?Rm926?c92?'''' '' '' (z/931053J#8(J@ o/]9310#5J[#(3E "@  //]]293310"&=3327@@E&*&PEIC@D95I/@  QYQY?2+?+3993310"&'532654&#"5>32UR0b|b-T'&M©M$(FZ&,@ !m!!!]]]55I&5@ !m!!!]]]5j^T@Y/]+93105!?^!s%^ ;@ @ Y/]+3/3233939310"&54632!"&5463253G-@A,,?>-@A,,?>b?l@-->=..?@-->@+.?!s%H&$9kL Hj%++5?5K @  [/+9310"&54632UEa`FEa``FEa`FEa>'(9Ld@(#@H#@H#@H#@H#@ H#@ H#@ HH@ H@%@H H]++5+++5?5+++++++$>'+ 9Lr@<#@H#@H#@H#@H#@H#@H#@ H#@ H#@ H#@ H@H H@%@H@ H++5+++5?5++++++++++>',9Ll@2@H@H@H@H@ H@ H@ H@ H@H H@%@H@H@ H+++5+++5?5++++++++{L&29L@b@H@H@H@H@H@H@H@H@ H H H@ H@ H@H@H@ H @H @ H ++55+++5?5+++++++++++++>'<$9L{@-@H@H@H@ H@ H@ H@ H@H H H@  %@H@HH@ H H+++++5++++5?5+++++++\ L&[9dLx@\1@H1@H1@H1@H1@H1@H1@H1@H1@ H1@ H1@ H1@ H1@ H,+@H+@ H+@H@ H++5++5?5+++++++++++++&k:  %+555H$"=%%=6@  `Y _Y_Y?+3?+3+993310)57'5!#&+KqZ>dIvIkHO@( fv4DT H?+222?33]]]9333310)5!%!;"a#=(b==#=+dL "R@,  #$="&"" " ""_Y _Y?+?+9/_^]]]_]39933991032#"! ! 73#'!#3X`KDDDD>= ^fPddfE=,#)=. HA@!     _Y ?3+333?33_^]9333310%!57!!57 hb$fIIIII#R=0'=1a = #Y@4  $%  : J  7  ?3]33?39/]]q333933331073#'!#3"#!#'&#2?3!33DDKDDJm$SS$pS$S}S$SfPddf4[0йdL2(=P@/   `p _Y`Y _Y ?2+333?++3_^]q993310357'5!!57!(魭kJuIIJJkJ#=3C=Q@+     `Y   bY ?3+9?39+9933333310!2$?3!5 5!#'&+gpB'$S{(=[*s1d: 0fZk 7=7$=<OR=3o@&11 ++45{5D5/5555555d55[55$5D5h555555T55t55555+5K5k55 5555{55@5$5 585555t55k5_55;5K5555T5d55K555555T55;55% " _Y_Y0_Y&@ H@ H"1_Y?+3?99//+_^]+3+33+3+3_^]]]]]]qqqqqqrrrrrr^]]]]]]qqqqrrrrr^]]]]]]]qqqq999333333210#"3!2654&+575#".54>;5'5!32+AxooxAAmyhkhymDƸ̢:JypیnhIIhnȇoyJ&=;6=#"@ !!$%%4%%%%$%4%D%d%t% %l%%%@%%%%%?%%p%%%%%O%o%@%p%%%%%%%?%8%%%%p%O%o%0%%%%%%o%P%?%%%%%%O%o%0%%%_Y   _Y !_Y?+3?33+3339/3+3_^]]]]]]]qqqqrrrrrrr^]]qqqrrr_r^]]]]q93333310!57 $5'5!'5!>5!!a|zz|aJIII{˫qIwJ] L)s@: !!' $##''+*#$_Y_Y! G?3]32?+9/+3?993993333333333310"!3;'&54! 32?3!>54&5͖V=Pmz]\{mP=VʱPi""iϰE&,j7N &%+55+55$&<jN@ &E$ %+55+55Kb&c9@ &&+&) %+5+58A&g9@ /&k/2%+5+5L3&i9@ &w %+5+5f&k9@ & %+5+5&w:@ & %+555555Kb%S@-## &'# NY PY RY?+?+??+99333333310"&543237!!&'#"3267.W.HV/!0GQMA=Dy-g(tӘJKRneȝtL&\@2 # #'( (( $#$#OY$$OYOY??+?+9/+9_^]]93393310!4632!"'4&#"32654&'5>یo-*T1<>76/Ai\|ufXL㺠 ?pd@_ UXvK+@@! )&&,-)NY#NY?+?3+9993993310#'&#"#"&5467.5463232654&'pB#9P?DEO]gGTém]MO[`t9G{,H89oDRtՉɐGBNtU28A.k@? (  0/%%OY OY .++QY?+3?3_^]_]]+9/_^]]+993310%#"&54675&54632#'&#"76;#"'&'32?AdXęA4CZKW*#kI 33JW"12q`c:FZQ@s$s$RC:W W;Pf!Nzc!B@"  "##@ OY/+?99933933105>54&'.54>755$7 cCQ^a֬ByޠVhz(|:iB635)Y_XzZc$yL37@ RYNY???+?+39933310%!.54&#"!'5!>32 HF$d(p~tGF.-COV\RBR>-US@.   PY =M OY OY?+?+9/_^]+_^]99333310! !22!"! 9E;NQLONMAQ(&2- -t&@NY QY?+3?+9310"&5'5!327}t/*)0 voB6D6 R %c`@4    NY  NY?+3?39_^]+393393339910!!'5!$m smjBD\RB5@ QY?+?33939391035'&#"#5>32#Rq#+<%%)TnV:6P@2T` AyFA.ALoQ@*   NY  NYRY ?333+??3+3?+9933333310%#"'!55'5!327'5!!?i8Z6 ^LO__Vw\\?14n-Bt[SOBAx:@ NY?22?+333993933310'5!654'538Ad=O3fBc ^M-!6YueKz6b@8, 3&"/3,780  OY ""#OYE3 ,&"?]99/9]+9/+99333310532$776;#"&'5>54&'.54675.5467Q+^QD/0m()4ofxǥTD_ӷop¼2: m#qEu  1a\Yzl{$h>126%;%Vm*NRMF@%   OY QY?+3??+333_^]9333310%27# 5##5>7##!#+6 r; C0 !dCQi _k;Ǹ-EhzL;@@ QY QY?+?+?_^]99333104632#"'!2654&#"zˈu_ltoXVYS@I:*Ӂn*6z7Lzu#@@ %$%% !OY OY /+?3+93333939105>54&'.54632#'&#"f&OY{;TB]wɹ9`lH*:RhzK`;$C`Ir;iB+19) -NN* 4@   PYOY?+?3/+3933104'326#"54$3!73bsXOUZ`[`w؊Z@QޘΨ1Njr~(2@   QYOY?3+3?+39310#!!327#"&5CQ[9,+6 r;DhAA _zsk4@ NYNY OY?+?+?+93310 '5!32>54&'5|_:C-A^BdFܘ(\IL#V@ !$%i%V%9%"%%%%%%%%%%v%T%F%$%%%i%%%%t%f%R% %@%%%%%%%%t%k%T%;%$%%%%%%%P%D% %%%9%%%{%d%%+%K%%%%`%%%%O%%0%%%%%`%%O%!!OY NYOY??+3/+?3+3_^]]]]qqqqq_rrrrrr^]]]]]]]]qqqqqqqrr_rrrrr^]]]]]]]]]qqqqq93333310#&$546746324&#">|RIem3>6.kjL\ EĹjd LY@. !    ?33?339333333339999331067&/537!#&'!Vh@#+<+wN&0$&Tm; A`';% AYLl@ K4;Kk{k+K[{ t`4k4: [0@ONY  OY?2+3?3+3?_^]]]]qq_qqqqrrrr^]]]qqqqrrrrrrr^]]]]]]qqqq93333310,5'5!3>5!#^vs|wlg| Bo | faB3^S/e@- -"&&10&1F1111111111f1v1T1F1$1411k11111r1d1V1B11 10111111t1111P1$1D1 11t1111P11$141D1:11111k141+11111101P1`11/1111_11 101@11 "NY# QY)?2+3?3+39/_^]]]]qqq_qqqqrrrrrrrr^]]]]qqqqqqqrr_rrrrrrrrr^]]]]]]]]]]]]qq999333210"&5473267'&=332654&'5#"&'#efQM8U #" U8MQfeZ! "\/ߧg[83@@38[g0\"ZVU[fZ&kj&ڴ  %+55+55Z&wj@ & & %+55+55N&R9@ &G%+5+5&w9@ &T%+5+5S&{9@ 0&Q03&%+5+5t'F@%   () OYOY#OY?+?+9/+99333104632#"&532654&'5>54&#"tیo-!:NUX|ufX<>76㺠 ?$p`{y}}l__lp[ajZN!%1K@&'-23*QY"" 0OY?+33?399//9+39333310#!##"&'##"&573267'&=33265'!CQrZ! [ҴqQM8U #" U8MQ7DhZVU[og[83@@38[gttL<a@8 :3)(!/:>=8(!!(8,$RY$  5RY PYSY?++?+???+?9////93333310"'53326=#"&=#&54675#"#46327467332653jYS@+5;lKZ8BFlalNW8BFLr{4ZG@YAhP>3Q*GA[EKP>dLL>@! _Y  _Y _Y?+?+3?3+933310! !57$32#"dX`mL%JJG&V->= NLN@+   _   OY NY   NY?+3?3+?+_^]]]99393210!57.546324&#"326ifAPM<=LOB%BBV%ܩ礭ddL",@ $# " _Y ?3+/3993310>54&/$!2#'&#"SEv{OZXbuA!E13Q,90VCZ>$?KaEg5K(10@   PY /3?+9993310 5>54&'.5;73~)PnmgPHIc h8F:LBT5oTv-_G1/9.7#=L@)    `Y_Y`Y _Y?+3?3++9/+9333310#'.+!#'!!57'5!^ 1AYG^(IIvIBL#F@% OY OYNY??+3+9/+93333310%!'5!#'.+373#'ߍH 1AwHHBڰժBnU=$@    ??9/3993310%#&546!654'53!d >dd 0kVJ3,t.VJ32tNb$@ ??9/3993310!#!3\|v|9)d Ej!8@ ! !#"  bY/+3?9?933310'>3 '654'#467&%#(o'~^w7>XY:;ՠQVJ-1vF>~0B@0 /@ RY/+?99310&#"5632'64''%&''yAvk_nF/QFˮ"oG, [^v]Nv'E=El@;<C6/)"" /-CGFB=50(#%#_Y?2%9++aY aY  `Y?+??39/++3?339/9+333339333310"'.#"#5>32326=#"&'#"&5'5!327&5'5!3267'5![r7]p\6D\j2mdO7BpLApdq;wec=:^ emED$N9$Q.#}y-649,AIIK#6AIIKSY DII97EAm@;0.7)"< ."CB=61(#%#NY ?3%:, ,RY QY  PY?+??39/++3?3399+3333393333310#"'.#"#5>3232=#"'#"'5!327&5'5!327'5!+Е[r7c|H6DRs3Cl8͍^TABJV ^TABBUVRD$?H$L'%"HzzVBBT^**7VBBT^'BBvQ&N@*% %('$!_YaY!`Y%_Y?+3?3+?9/++3933310)57#".54>32#'.#"!27'5!nηit~/x&Y2?<o{dI\qБj г:LII("M@) !! #$QY NY OY !NY?+3?3+?+9/+933310)57#"5432#'&#"327!g)p/H-!-FQnrT`fBK!˵+B';Ex=1_@4/(! !/32*aY(**$'"$"_Y$!!_Y aY  `Y?+??9/++3?+39/9+933310".#"#5>3232654&#"!57'5!632\xo@]p\6DUg1elqbotZE*3*N9$Q,%vgjt:IIuIITO^3Q+5O@*4/(/ (762OY22 ,OY PY @ QY?+?+?+9/+9339910".#"#>3232654'#"&54>32673"327&HeJ8PRD(B=>%HCnzjFTX0o`DUCDgb9 '0'1Cup$+$jRDx^An=m06SWɄsgE:3DDKL(A@# %%")*# _Y_Y?+?+393933310"&5,654&#"#63232654'7~|o7h%-[>zqx9/sd~* ?+Ǭ]lwWLABGRM<@ !   OYQY?+3?+39393310 >54&#"#632327/mfX_J*Hh {3ZԐ,#ٻʥw+Q(/ML"%U@,%# $  !'&# `Y $ $`Y ?+33?3+33399933333310'&#"!5.#"#6327>32 !7,4Ai4+B  -Wa~XB|paaQVbQqq w)G~n_y!$W@.$" $  !%&"$ PY # #NY ?+33?3+3339933333310'&#"!5.#"#6327>32!1& 4l=L: %0#%HJWh|j6*1eaLɖ,s.. B* .hbJXVFy!.G@%"(/0+_Y  _Y %_Y?+?+3/39/9+933310! 4$3232673#".#"63 32654&#"y7UPP5=j\\8UNR5_#,<`T=L;A[[aL0+Q@,)")-,- & OY&& PY OY OY?+?+3/+9/+_^]93310"&54>32673#"'&#"32654&#"5>32ZTIb:Pb.OP0isi]UU]d60hBzF9- ͶxqzpG"B=)W@.& +*_Y" )`Y  _Y?+3?99//3+33+3933310%!57".546;5'5!32'>54&#ǬmaR+9&gn|o__n}ng&9+RadJJ|(2(G(6=tEIRIIRIEt=6(G(2(HR.@ NY OYNY?+?3+3?+910#!57#53!3Rxg`DBhBy.C@$ &," 0/RY+(RY?+3??+3?9993310"&=#&54675#"#46327467332653lKZ8BFlalNW8BFlZG@YAhP>3Q*GA[EKP>PF'C@$" )())  %OYOY?+?+9/?_^]933310! #"'##./.4&#"326PQ 6xucd4F [nt[@BOL==LPAoVw`0 >p` +r߬堫FZ.@   QY QY?+3?3+993310"&54632&#"327:S.b~}b/($MɬM%(L)MdL/CQ@,  QY  QY QY?+3?3+9/_^]]+99392310"&54632&#"!!327#S.b| 7|b-($MzM$(/O@,   QY     QYQY?2+?+39/_^]]+933310"&'53267!5!.#"5>32;R.b}7 |b-T($MzM$(+=L3t'L.@  _Y _Y ?+3?3+99331032?3# !2#'&#"毄Zk_ZZC`PQ_CZ#R=Q@(  _Y  _Y?3+333?39/333+399333310#!57'5! !!57a&#eIIvIIIIO6L3X@. NY NY NY ?3?+3?333+3?+3_^]9933310!#!57'5!!!57{0\__tUU7\BBBFBBB"L#O@("$% OYQY RY ??+?+9/3+39993333310!5#534632#"'32654&#"XXˈu_ltonXVYS@I:hӁn*hmz7SL.@  _Y _Y ?+3?3+993310#"#63 !"'332毄Z^lZ.ZBCCBZt'L%@@   '&## _Y _Y ?+3?3+9/393331032?3# !2#'&#"#"&54632毄Zk_ZKYAAXY@?[ZC`PQ_CZ@Z[?@YXSL%@@   &'# _Y _Y ?+3?3+9/3933310#"#63 !"'3324632#"&毄Z^lZ[?@YXA@Z.ZBCCBZ2AXY@?[Y#&(CVN@ !&!%+5+5#&(jVN@ &#+%%+55+55 >=/p@= !*%$$!01*,aY,,"$!!")"`Y"_Y `Y$?3]+?+3?+3339/+3393333310%#"&'332654&#"!57#"#!#'&+632F%YF*E[ldGQt3Z[\S1{ `^hjIIow(%&FvvN@ &%+5+5dLY@1   `Y  _Y _YF ?3]+?3+9/_^]+93333910!326?3# !2#'&#"! i-[UwWOZy z<)#1e>YdCZmL6E=,E&,j7N &%+55+55[=-=*]@4$& $ +,`Y!!_Y!$_Y!_Y&`Y cY ?3+?++3?++9/+933333104&+326"'332'5!3 )57! ]~DD~L^; G,*Z"ov!^Δ/m)II/Jkn#='o@; $$ ()$_Y#`Y   _Y   _Y?+33?3+3339/_^]3+3?+933333310!57!!57'5!!'5!3 !4&+326J(ؘ\-1;JJJuIIIIv=&|@F '(' " aY"""P"`""" ""`Y _Y?3+333?+3339/_^]q+33339333310%!574&#"!57#"#!#'&+632oaGQt3Z[\S1UZdIIdnIIow(^#&vN@ &m %+5+5#&CN!&ִ!%+5+5:&M@ &F ( %+5+5"_=p@D    `p  _Y `Y P  _Y?2+333/_^]?3++3_^]q93333310!#!57'5!!'5]s]$=JI_IuJJkJH$#=@ +;[ ;i@adHo0POo@DGH`9o@),H@`p?`Y `Y_Y_Y_Y?++?+3+9/+_^]]]qqq+r^]+qqrr_r+r^]]q9333310)57'5!#'&+3 4&+326p] Z7dշIvI({ۍ"=%%=F Kf=X@0     _Y `Y  _Y`Y?++3?3?++39393933910!#!#76'! !8#}}#tPxj=IKJH%#=(='o@$    % )(V)D)6)$))V)v)))))I))&)i))))p)d)P)D)0)))))))))p))4)T)d)))){)4)T) )+)9)))))o) )@)))))))0)P)p))))0)P)p)))))  _Y %$ &&_Y!?22+33333?33339+333_^]qqr_rrrr^]]]]qqqqqqqrrrrrrrr_rr^]]]qqqqq33333393339339339910!'5! !!57'!57 '5!'Yqsplmpsqޙ=I.IIrI~W=IIWIII.^L%R@+$! !&'$`Y_Y _Y?3+?+39/+993393310!"'33 4/57>54#"#63 ̦ \4'z- xt^g5o"+W렊\m(E&y~q1+*#=i@:    `p  _Y  _Y?2+3333?3+3333_^]q993333333310357'5!5'5!!57#$kܬJuII*9IIJJ}SJ#&N@ &'%+5+5#=]@/    _Y _Y?2+333?3+3399399339339910 !!57'5!'5cief|XE{=IyI_8IIvII1I=G@'  cY  _Y_Y `Y?++3?+3?3+9333105!!57! #"'332ĭk[!^q^; G,*Z"IIJJkn/m)#R=0#=+dL2(=S#=3d+L& 7=7:=K@' cY _Y?3+333?3+9999393105! '5!#"&'33267:2(ȎLx{T1d A4$6HvFII2IIߜKu1pXO=3q@&11 ++45k5_5;5K55 5555d55 5+5K5i5555{55D5d5;5/5 555555t55 55K5k55555[5{55@55$5855555d5 5+5K55555t55;55555;5[5{5$55% " _Y_Y0_Y&@ H@ H"1_Y?+3?99//+_^]+3+33+3+3_^]]]]]]qqqqrrrrr^]]]]]]]qqqqrrrrrrrr^]]]qqqqq999333333210#"3!2654&+575#".54>;5'5!32+`xoox`Ay쫇ky頌DƸ̢:JypیnhIIhnȇoyJ&=;(K=[@5 `p   _Y _Y`Y??++3?3+333_^]q99393310%#!57'5!!'5!Q#}0dIuJJkJJ=P@(    aY_Y _Y?3+333?+39/+339933310'5!327'5!!57#".5OqbonZIIXjt:LIIIIO^#=G@4T dP4D jo[@4 d;${4T:pdP +{o$Dt_ @ `Y_Y _Y ?22+33333?+3+3_^]_]]]]]qqqqqqrrrrrrr^]]]]qqqrrrrrrrr^]]]]]]]]]qq933310!57'5!!'5!!'5}l=JIIuJJkJJkJ#K=S@   4T dP4D jo[@4 d;${4T:pdP +{o$Dt_ @  _Y  `Y_Y?+3+3?33+33333?_^]_]]]]]qqqqqqrrrrrrr^]]]]qqqrrrrrrrr^]]]]]]]]]qq93933310)57'5!!'5!!'5!#l#}IuJJkJJkJJ'=U@0   `Y `Y_Y_Y _Y?++?++39/+_^]93333103 )57#"#!4&+326"p3B&,ZkEO"Ip JIۍ#=$]@3 %&&$ _Y `Y !_Y_Y?3++33?39/++333_^]93333104&+3263 )57'5!!57'5!u}zm{ۍ"IvIIpJJuII#=@ +;[ ;i@adHo0POo@DGH`9o@),H@`p? _Y `Y _Y_Y?++?9/++3_^]]]qqq+r^]+qqrr_r+r^]]q99333104&+3263 )57'5!if{ۍ"IvIIL[@2 `Y  _Y@  _Y ?+3?3_^]+9/_^]+93333310!&#"#63 !"$'332! yZ>GuY[ ,h  ZBC1#T)<#L&g@8  !'(_Y$_Y `Y    _Y_Y?+3?+39/_^]+?+?+93333310%!57'5!!! ! !%32#" muG6EK dJJuII6,JD&?= =c@6   `Y  _Y `Y_Y?++?3+339/+3_^]9333932104$)!57#!57.%;#"#)yNw8IIII()~BDP%h@   '&'@3(+H'' ''''_'' #OYOY`   /]]?3+?+_^]]]q_q+9939331067>73363 ! 4&#"326P[šd>FC}s3 QHT@APM<=LOBB>!tG9nܩ礭5!b@7    "# NY  !NYNYNYNY?++?++9/_^]+993333910357'5!2!4&+3263254+5__^lpobi]SBBsu(ɏyPUVa6m3@   NYOY NY?+3?3++993310#'&+!57'5!mK+oXz__7xBBBO@*   NY OY  NYNY?++3/3?++39933333393105!#!#7!#_}i)iq$2PkABZdFXH'@"##"!  '$% %)(T)t)F)4)&)))))))))d)t)P)D) )0)))h))))))))p)d)@))$)4))))))))`)T) )@)))))t))))`)))4)D)8))))))t)k)4)T)))) )P)))))p@1))_))@)"NY# $ NY' ?33+333?339+33333_^]]]qqqr_rrrrrrrr^]]]]]qqqqqqqqqrrrrrrrrrr^]]]]]]_]]]]]qqqqqq9333333333333333933310!57'!57/5!'5!'5!!\KrK^R_0AIKKIA0_R7BB+9B@BBzBB{BB@&`@7## ('&OY,-   OY   QY?+3?+3_^]]]9/_]+993310#"&'532654+53254#"#5632/^xXpnkJW#M"H{b^vV3P#SWe}s|Kv#6f{@I   ++  NY     NY?2+3_^]333]]3?3+3_^]_]33]3399333310!57!57'5!5'5!UU+__U0U__BtgBBBBlBBB6f&@ &'%+5+5,]@.   NY   NY ?3+333?399+3339933399339910 '5!!57!57'5!`hdd\VkU+__U????ZHBBBBGP@, / QY  NY NYOY?++3?+3?+3_^]993331072'5!!57##"&/3gL)u>__!_((MoS!>@!jBBBBm X 63_@1      NY NY?333+333?3+3339_^]933333310!#!57'5!!!57{0\__tUU7\jBBBFBBB6f]@1OY     NY NY?3+333?3+3339/_^]+99333310!!57'5!!'5!!57_!___0___!_BBBB>BBBBNR6f<@  NY OY NY?3+333?++3993310!!57'5!!57_!__0__!_EBBBBBBL SFZF @  t@m+;kdt@$40`;`? o@"H?OY  NY ?+3?33+3_^]]+]qqqrrrrrrr^]]]]_]]qqqqqqqqrrrrrr^]]]]]]q9310#'&+!57#"#K+oNNo+KAA F\GLB%0:i@&6 + %1%;32#"&'!57327&#"#"326@^fCdan#m?$^#f$i@G*<6*DI/632G=1E&A'HBBB'%ͫo@[6zG@$     NYNY OY?++3?3+333/99393310)57'5!!'5!#x___0__ssBBBBBZMI@%   RY   NY  NY ?3+333?+39/+99333103267'5!!57#"&5'5!777Y1___!___8OABBBB!Z'BB6E@ rVfD6$vd6V$hFvpdP4D$Dd8tk$D4d PpNYOY NY ?33+33333?+3+3_^]_]]qqqqrrrrr^]]]qqqq_qqqqqrrrrrr^]]]]]]]]]]qqqqqq933310%!'5!!'5!!57'5!________gBBBBBBBB6O@ rVfD6$vd6V$hFvpdP4D$Dd8tk$D4d Pp  NY   OYNY/?+3+3?33+33333_^]_]]qqqqrrrrr^]]]qqqq_qqqqqrrrrrr^]]]]]]]]]]qqqqqq93339310%#!57'5!!'5!!'5!s_______BZdBBBBBBBxa@:     @ HNY   OYNY NY NY ?++?++39/_^]++_^]93331032#!57#"#!2654+u8]`˦N_No+KJ\[*R5rihs5B BTc6 &k@= &!!'(((. NY NY    &!NYNY$?3++33?39/_^]++333_^]q93333104+32632#!57'5!'5!!57Իc[c`t]`˩__`___!_T5rigs6BBBBBBB6 @ `/t/Op?`/A@`0p? NY NY    NYNY?++?9/_^]++3_^]]qrrr^]]]qqqrrr^]]]99333104+32632#!57'5!umc`І]`˩__T5rigs6BBB3/o@BOY   QY L:/  OY ?+3_^]_]]]q?+39/_^]+933910!.#"#632#"&'53267!._RW?*HO.jt~w-#($M6&i@:!  '( OY  NYNY $OY OY?+?+?+3?+39/_^]+93333310>32#"&'#!57'5!4&#"326l _!___APM<=LOBBBBB9ܩ礭a@4    NY NY NY NY ??++?+339/+9933339310%#!57.5463!!5#";RW[ __!_gTWVOmZ0v@m|N{BBB_T\_FX&HCw#& #%+5+5FXZ&Hj@ & -'%+55+55H.@L '', ,/0`0000/0 ',*,NY*PY ..OY$RY  NY?+?_^]3+9/3+3?3+?+3_^]]93333331035'5!3#>32#"'5332654&#"!57#`JAtx˻YS@+6?7;;IV-\Bgi=Z,:9rz_S"UBB6m&v@ &O %+5+5FZk@>  OY   OY K*:  QY?+3?3_^]_]]q+9/_^]+99333910%#"&54>32#'.#"!!327Z-TqҋH*"B6Sp 9~b9$(u#d>V-LCZ&j &%+55+55L)M #+g@;++'  ,-*NY  ##+NY#NY#NYOY QY ?3+?++3?++9/_^]+93333310!57##"&/332'5!32#'2654+8_((MoS!>@!gL)u"s]`˩c`uBm X BB5rigs6ZTc67"*q@= **& +,!*NY!)OY    NY  NY?+33?3+3339/_^]3+3?+933333310%7!!57'5!!'5!32#!%2654+x__!___!_sr]`˩c`aBbBBBB2BB5rigs6ZTcT%@g$  &''>' '0'P'`''''' 0'@'''''P''''' OY$"" NY" NY RY?]3+?3+333?+9/3+3_^]]]qr^]993333310#763 !574&#"!57#535'5!3Eq^-TGBLLV-\`KiBZ#HBBT^"UBBgB,&vC@ &S %+5+56f&C!&! %+5+5F&\@-@~~H-@||H-@zzH-@xxH-@vvH-@ttH-@rrH-@qqH-@ppH-@ooH-@nnH-@mmH-@llH-@kkH-@jjH-@iiH-@hhH-@ggH-@ffH-@eeH-@ddH-@ccH-@bbH-@aaH-@``H-@__H-@^^H-@]]H-@TTH-@RRH-@PPH-@NNH-@LLH-@JJH-@HHH-@FFH-@DDH-@BBH-@@@H-@>>H-@<=, _Y1 # _Y 6 &_Y?3+3?39/9+333+3933310"'#"$5!2#'.#"327'5!32#"#>3 G-_Z8N{mm{롳N7Zo{O-G==2Rk:̮4>#JJ#$0"?34+͠<@  !  ?3?339///93333310.5!7654'53# #.5!K3 %~7=O398 %p8`^M-!6YuePm8`*=!*c@5''" ,+_Y&`Y  `Y   '_Y?+3?99//3+3333++393333310)57#"#!5'5!!#'.+3 4&+326fW[\W{I 1?II?ϳ ۍ$,e@5) %%.-NY ,NY   OY%NY?+3?3+33339/+?+393333310#!57#"#!'5!!#'.+3232654+`˩_ j&+K#_s)K+*h]mc`ugs6B  BBy 5rTcEL-@G""* *! /._Y"`Y-   _Y   _Y)%_Y?+3?+3?+39/_^]_]3+3?3+93333310 #!57'5!3!2#'&#"!!326?3ڬmU7Zy  i-[UY5JJuII/3CZp<)#178*}@E""' '! ,+OY"OY    NY   NY'%QY?+3?+3?+39/_^]3+3?3+933333310 #!57'5!3>32#'.#"!!327 m_!___pƌH*"B6Sp 9~b-BBBB#dM$( H^@/  !  _Y ?33+33333?39933/3939932239910)57!574'!57!67aPPhPS[b$f&&$ICBB?'IIcA`aA"e@4! " "$#NY!"NY ??3+333?399//3+39399332239910)57'#5754&'#573>7's"b)) i(Gt{oJVI <_? ;-??5 ??fa<8#8EH)/@W./(%&&'/, */$ /(10/&*`Y.*$`Y,* $<$L$ $$ # _Y  _Y ?333+33333?+39/_^]99+3+3?393339933339939910)57!574'!57!!57'5!!!67aPPhPS[bm6$f&&$ICBB?'II JJuIIcA`aA7%+2@O12*'(()2.,2& .2*432(,NY1,&NY.,&&"% " NY"*NY ??33+33333?+39/99+3+3?39333993339939910)57'#5754&'#57!!57'5!!3>7'%s"b)) i(G}_!___i{oJVI <_? ;-??5 ??$BBBBa<8#8.="%f@6!$# % !'&%%`Y  _Y# ! _Y ?+333?3?9/33+3+3393333333310).'!57!5?>75! !ty75!!V#/?/h6i1>/"UXP7!!57'5!!5!!V#/?/h6i1>/"UXi/n_!___m}W@PWr8\H'CC]&I]BSBBBBeBB)Y%EFO@MA-2>*CC>H-K9PQPOL LNJ<@A.-.-`Y..9<<4_Y<aY `Y#`Y'_Y?+?+??+9/+?+39/+92_^]233933310"'&#"3267632#.#"#"&54>3232654/57>54#"#63 #537]bCCBTM>-YE{5z'\h>)SDz~KO?DC!`rxt^g5o"+W렊\pQL _NJZ$-Q%>K/6QY//;!;*PY;3A!$AQYOY?O$!JG GGIEE OY?+33/33/_^]3??9/]+9+9??+9/+33933310%2654+53254#"#5632#"/"32>32#.#"#"&5463#537]5!=imsc=i~u#()$Cdi.kII;rI@l-|II3tLG@%NYNY??3+3?3?+393333310##".''5!336!zhX;'Svnb*2(zj_$OB8pdL (F@"&)*$   _Y_Y?+?+99//3399333310! ! %"'.#"326"632327&dX`{vCZ&>9 YﭮYJsIT%KHC&jD?%,&#C % ֢+,% pL;@  `Y  _Y  ?3?+3?3+9333310#'&#"#'5! >32pP"2D`(InGy!?yaO!^`II;@  PY  NY ?3?+3?3+9333310'&#"#'5!>32y/(&?ywBp/eSO}/@fBBuop&%N"&Ǵ" %+55+55&&"&" %+55+55ZF L 4^@4$ +%$5%6)0`Y,)$_Y!_Y _Y?+?+?3+333?3+333933331032#"! ! '5!'5!#"'5332>f05Bpn3D@`uKQT<+-&:3.<9`oBB BBoI~$DcDF^)5_@5 *0$$ 67'-OY'!3OY!PY NY ?3+333?3+?+?+3339333310'5!'5!#"'5332>#"&546324&#"326@Bpn3D@`uKQT<+-&:3.APM<=LOBoBB BBoI~$DcZܩ礭%r3(@.45 `Y #_Y?+?+993310"&'$%>32"&'>32>5'L'@V\@''>X[ =)#;#Tg<%%;G9`-#]:;T#++##-%ʾvC && \̀%!,4@+%% ( -. PY  PY?+?+93333310"&'.5467>32"&'>32>54&'N(@@('>7 =*!9RKDY9!C'`NN`$`/$$-+#F/#/t!  ;=| fu6I[i@8JQ%4 4@-QVM7 ]\MI>Y9AA F99 ( _Y-0 "_Y?3+3?333+33/39/933?9/9933310"&'# 4$32#'.#"3267332#"#632323#".#"5>54.54632UUԄAҢZ.GV=: ,BI/E NI&8, UTEA6Q199 >1@ H11 " OY& ) QY?3+3?39/933+33/+39/933?933310"'#"5432#'&#"326733265#"#632323#".#"5>54.54632{ppӹkI/&4sjCqBoDjs4&/Ik9nr|F!K}mb0:@ 5xs947--@$3_?A]3$,6.'.'=?JQi3)"+;d & m@ G&IJ9%+5+5=& t@ *&,-%+5+5dLL<@   _Y _Y?+3?3+9/393310'&#"!57$!2|miaZhJJE$[XeCFLE<@   OY NY?+3?3+9/393310'.#"!57$4>32*"B6;`5lyAgfqҋ^w :BB`Ru#  ??99103''#'77'7g'@'Ƥ'@'DsDCsD!DsDDs` /310#"&5463!'4632#xE02EJ7WG00EG83FI05B1FE24E_f|@  /2/3]210.#"+5727>32@80Mm]h^pI' _6/104632.QE?I#+#ILSMY:/!' +7E_6/105>54.54632LI#+#I?EQSqE6, '!/:Xb4@ /]23310"#>323"%. Q_h$lw?2<2{^6'+ )7ESao?@FF#M8bb?i*TT1[Mi[[iM /333/39///33333333310"#4632#4&"#4632#4&"#4632#4&"#4632#4&"#4632#4&"#4632#4&"#4632#4&"#4632#4&3HPwTTwPF53HPwTTwPFT3HPwTTwPF53HPwTTwPFL3HPwTTwPF85FPwTTwPH35FPwTTwPH5FPwTTwPHH3TwwT0K6H3TwwT0KH3TwwT0K'H3TwwT0KH3TwwT0KL/TwwT3H'L/TwwT3HL/TwwT3H0d!2CWkX@0OD-&33>6("XftoID96"}cfo]]ofc}"69DI//9//////////////333333333105654.54632467#"&2#&#"#"&546"&'332>322'654&#"#"&546"&54732632%4632&#"#"&#"'732654&54632pd|x"*"7+3Ad|x"*"7+3AXXk%?$5!"&,MjXk%?$5!"&,M>g;-$-.C;>g;-$-.C]uDIn,F'- (BuDIn,F'/(BXk%?$5!"&,MXk%?$5!"&,Md|x"*"7+3Ad|x"*"7+3AuDIn,F'- (B"uDIn,F'- (Bh>g;-$-.C;>g;-$--C#L2+~@H "!())!,--`-@-P---(!! !!%_Y   _Y ??3+333?399+3333/33/_^]3]q933333310%#!57!57'5!5'5!"&'3326732}.qܬm$aKKaIJ}SJJuII*9IIJfaaf6t+k@8 !)-,(!! !!%NY  NY ?3+333?399+3333/33/_^]393333310##57!57'5!5'5!"&'332673s3UU+__U0U_aKKatBtgBBBBlBBfaaf$=N@)  `Y`Y  _Y?+3?99//3+3+93333310)57#535!3#3 4&+326f;ߴ{Izzۍ# K@'  NY NYOY  ??99//3+3++3993333310535!3#32#!574+326#r!]`˩_Qumc`Nhh5rigs6BõT#=!D@$  "#`Y `Y _Y _Y?+3?++9/+9933310!57'5! '#654&+327' FOkCRm|%wOSg;}VIIvIajFU|F$~L )H@&$ *+!PYNY NY&PY?+?+3?+?+993333310'#"'!57'5!63265#"327' VYfB|K\jlfg}kĿCt$]NQX6$?eD{BRBBB0Icucv&;$% 7@  _Y `Y _Y?+3?++993310!!57'5!3KsIIvIP, 7@   OY NYNY?+3?++993310%!57'5!3!ii?}ZBBB#v%=O@( _Y `Y   _Y ?+3?99//3+3+3993922310#&+!!!57#53'5!Z>d\Kq5zII+zI6mO@) OY NYOY  NY ?+3?++99//3+39933310'&+3#!57#53'5!"+oXz____7xhBB^h2B%E=)`@4! ''*+#`Y!## _Y_Y `Y?+?9_^]+3?3+39/9+933310"&'332#"!57'5!#'&+632kJ^^gKqZ>drE*Z+#~IIvIn;6FP%^@3 ##&' OY OYNYNYOY?+?9+3?+3+9/+9333310"'332!"!57'5!#'&+632ByG-BV 3__7K+oXzYQF)luBBB̺K=)m@)(''"&!  &+*T+@+4+ ++T+t+++++K++$+i+++d+t+P+D+0+++++++++p++4+T+d++++{+4+T+ +++9+++++o+ +@+++++++0+P+p+++0+P+p+++++ '" _Y!cY( $) _Y ??+333?3?3399//3+33+33333_^]qqr_rrrr^]]]]qqqqqqqrrrrrrrr^]]]qqqqq9333399223339933310%##!57'!57 '5!'5!'5! #}olmpsqޙYqI~W=IIWIII.II.IIr)g@)!&'   '&%)+*T+K++4+++++++t+k+++4+jt++++[++D++++++`+T+ +@+++++t++++`+++4+D+8++++++t+k+4+T++++ +P+++++p++_++@+&!NY   RY' #( NY ?+333?3?3399//3+33+33333_^]]]qqqr_rrrrrrrr^]]]]]qqqqqqqqrrr^]]]]]]]]qqq93333333310##!57'!57/5!'5!'5!s-\KrK^R_0AIKKIA0_Pd7BB+9B@BBzBB{BB^RL6\@214)..),4$78,`Y1$'1'1_Y 1'_Y'?2?+?3+9/99+99333310"'532654&'&'33 4/57>54#"#63 n[N<6:UAE \4'z- xt^g5o"+W렊\8EzR6U?:FiE&y~q1+*٩ eEfqR6i@>14'..'+!781QY 1OY_o !$$OY$PY?+?+399//_^]+?33+9333310"'532654&'&'532654+53254#"#5632Fn[N<6:R?,pnkJW#M"H{b^^x:IzR6U?:Dj ,P#SWe}s|Kv#vVfGfq#K=Y@0   _Y  _Y ???+33?39+333933333310%##!57'5!'5! #}zf|XE{ˤcI_8IIvII1IIy,[@0 NY  NY ?3+333?39+333933333310##57!57'5!'5!sVkU+__U`hdd\d?ZHBBBB~??#= W@/ "!  _Y  _Y ??+33?39+333933333310)#!57'5!73'5! enlXlnk{ˤciR8IIvIIhD_IIy,"V@- $#NY NY ?3+333?39+3339333333107'5!!57'#!57'5!73V`hdd\VZPU+__UPZn????6BBBB~J#=!c@4   #"_Y `Y    _Y??+33?3999/3+3+33393333310)!57#535'5!3#'5! ef|XE{ˤci_8IIYzIIz1IIy,!j@9 #"NY OY NY  NY?3+333?+?99/3+3+393333310!57!57#535'5!3#'5!VkU+____`hdd\?ZHBBhBh??? =P@*    `Y  _Y??+3?3399+3393333310)!57#"#!'5! ef|X#A[_E{ˤci_8IIowI1IIy [@0 "!NY  OY  NY?3+333?3399+3+393333310!57!57#"#!'5! VkU+_ C+K`U`hdd\?ZHBB  B~???#K=n@?  `p `Y _Y  _Y ??3+333?3+3339/+_^]q93333310%#!57!!57'5!!'5!#}ܬm$IJJJuIIII6fY@. OY NY  NY ?3+333?3+3339/+93333310%##57!!57'5!!'5!fs__!___0__BZdBSBBBB>BB# =d@5  !  `Y _Y _Y ?3+333?33+33339/_^]+93333310#'&+!57!!57'5!!'5! \R"kܬm$JJJJuIII61 _@3  "! OY NY NY ?3+333?33+3339/_^]+9333310'.+!57!!57'5!!'5!+'c_!__!___0_ BBSBBBB>B(E=-h@8 ##(+(/.`Y `Y _Y*`Y+(#_Y&?2+333?++39/9+?+99333310357'5!632!"&'332#"!57!(魠orkJ^^ShkJuIIw,*Z+sJJkJ6Fx(k@:##(%(*)OY!OY  NY OY (#NY&?3+333?++39/+?+993333310!!57'5!632#"'332!!57_!__0_A@yG-BV*_!_EBBBB)luBB=L-7U@..)3# # ,)98&1_Y6 && _Y-,  _Y ?3+333?+9/999+933310%27#"&'# 4$32#'&#"327.546324&#"6{ihf<3U\B<>==(/e{{P'H NPsdR+L,>@!'*#.-"''_Y '_Y?2?3+?3+3933310"'532654&'$!2#'&#"326?3n[N<6:OAiaZq0 [\m3BzR6U?:Kj ,ZXeCZ<)#/h@fqFRZ,A@"$'**$.-#''!QY 'OY?2?3+?3+39333310"'532654&'.54>32#'.#"327n[N<6:H>qҋH*"B6;`5}b+Z3CzR6U?:Km,›u#^wɬM!(gCfq K7=F@#  `Y _Y  ??+3?+33393333310#'&+#!57#"#!7\S1#};3][IowA@!  OY NY ?+3?+333933310#'&+#!57#"#!K+oNsNo+K[dA $=<LY@/      NY NY?+3?3+333933_^]_]33993310%!57'5!'5!gfBpn3DBBBBBB$=@E   [K{$Dt;;k@1Hp0@` _Y  `Y  _Y ?+3?39/93+3+333_^]_]+]]qr^]qqr93333310!!!57!5!'5! '5!}0,l2(6zII2zII2ILM@*   NY  OYNY?+3?3+3?3+3339_^]_]10!!57!5!5'5!'5!!gfwBpn3DhBBZh>BBBBYGh&K= @> 4 4DTl4DdtszH]cH@X[H 4DTt;@WELHkT;4d0@p _Y   _Y ??3+333?39+333_^]_]qqrrr+r^]q+++qr^]]qqq9333310%#!57 !57 '5!'5! #}6˔IIAII$RIIjII1Y@/  P`p4D vouHpknH@ehH@Y\Ho B@=AH @P@932!327#"&'"34.]O@2K'40l^X7S<;+R~BM!+m4!L")V@-& "'"+*`Y& @_Y #_Y ?+?3+9/93+393333310"'337! !32?3#$"! ]O@2J+J aNSfZZO'?PIh^@$1*!W"*W@.&"' ",+OY& @QY #OY ?+?+339/3+393333310"'3;>32!327#.'"34.]O@2K'40l^X$S<;+R~BM) $m4E=,& N@ (&+3%+5+5d& @ (&+3 &%+5+5#:=,b@6%*$ +*.-*%# _Y`Y+$' _Y `Y?+?9+3?39/9++33393333102!"&'3326&#"!57'5!'5!6lnekJ^^6MX{ˤ62x*Z  k8IIvII1II0 6Fw)`@4#(" (+*(#!NYOY"%NY OY?+?9+3?39/99++333933331072#"'332!"!57'5!'5!lyG-BV3(U+__U`hd)luBBBB~??L=I@( _Y`Y cY _Y??+3?3+?++3933310%#!57! #"'332'5!}.[!^q^; G,*Z"ĭIJkn/m)IItGF@& NYOY QY NY?+3?3+?++393310##57##"&/332'5!s3_((MoS!>@!gL)u>__tBm X BB#E=$m@;  &%&`Y !_Y#_Y  `Y?+?9+3?3+3339/_^]+_^]9333310!"&'332!!57'5!!'5!kJ^^ܬm$*Z JJuIII6Ff"k@: #$OY NY NY OY?+?9+3?3+3339/_^]+93333310#"'332!!57'5!!'5!yG-BV_!___0_R)lBBBB>BB#L=f@6 `Y  _Y  _Y ??3+333?3+3339/_^]+_^]99333310%#!57!!57'5!!'5!}.ܬm$JJJJuIIII6tf_@2  OY  NY NY ?3+333?3+3339/_^]+99333310##57!!57'5!!'5!s3__!___0___tBSBBBB>BBK= I@&  "!  _YaY_Y?+3??39/++3339933310)#7#".5'5!327'5!}#ZOqboKO^|IIXjt:LIIM H@%  "! NYRY NY?+3?39/++3339933310!#7#"&5'5!3267'5!ps___777Y1___!Z'BBOABBA#KR=[@/  _Y  _Y ???3+333?333+39933333310%#%57#!57'5! !R}.7#II mIIvIrI6t3f@5   NY   NY ??3+333?333+39_^]93333333310##57#!57'5!!qs3\0\__tUUtBjBBBFB(O&$ & %+5+5B&D &&ٴ)1 %+5+5&$jN&" %+55+55BZ&Dj2&5/ %+55+55=By#&( ^N@ &*'%+5+5FY&H @ &!)%+5+5<LQ5G<&QjN(&+% %+55+555GZ&jZ*&-'%+55+55&jN@ 4&71%+55+55Z&j4&71 &%+55+55^&jN2&ƴ5/%+55+55Z&j(3&60 %+55+55R=A@" ! `Y_Y?2+?39/3+3933310"'332654&+5#"#!̦\,'z-S/D\YL(cjQjKج!FgT#E&N@ &%+5+56f&@ & %+5+5#&jN@ (&+%%+55+556fZ&j@ (&+% %+55+55d&2jN@ #&& %+55+55NZ&Rj$&'!%+55+55dL Q@, `Y   _Y_Y?+?+9/_^]+_^]99333310! ! 2!"!&dX`'  ^& N @?9=H@6(+H _ OY   OY  OY?+?+9/_^]+_^]]]q_q++r^]99333310#"&54632267!"!.JLC>KH?Cʢd&jN@ %&("%+55+55NZ&j&&)#%+55+55&j8N+&.(%+55+553/Z&j#(&Ǵ+%%+55+55:E&N@  &  %+5+5F&\@ !&! %+5+5:&jN@ )&,& %+55+55FZ&\j@ *&-' %+55+55:&N@ (&r' %+55+55F&\@ )&K( %+55+55&juN+&.(%+55+55MZ&j@ +&.(%+55+55%K=2@ _Y`Y _Y  ??+3?3++99310#&+#!57'5!Z>d#}lqIvI6m1@ NYOY NY ?+3?3++99310#'&+#!57'5!mK+oXzi__7xZdBB#&jN@ 1&4.#%+55+556 Z&j@ 3&60#%+55+55%F=$\@2  &% `Y##!_Y#`Y# _Y`Y?3+?+3?3++9/3+3933310#&+!!#"/332=!57#53'5!Z>d.όz\FG./rūq5z䉖#z$ÉI+zI6Fm$\@2  #&%OY"" NY"OY" NYPY?3+?+3?3++9/3+3933310'&+3##"/332=!57#53'5!"+oXzz\FG./ra____7xh݉#z$ÉB\h4B&Ea=*C@#,+(&!#!_Y'*#_Y _Y ?3+?+3?39+3339910 #"'332654' !57 '5!'5aS54#"#63 3265'5!`nէ`xt^g5o"+W렊Z=I?FnJ%y~q1+*D|tqKJ0m,S@, ( .-+)NY++  OY OY%NY?+?+39/3+33/+933310!"&54+53254#"#5632326='5!mQZӵJW#M"H{b^^x=HI=Qoe}s|Kv#wZpbbpB]K}L!L@(! ! #" `Y _Y!_Y??+3?+39/+3933310%#!574/57>54#"#63 }#}xt^g5o"+W렊\IIy~q1+*;x#E@%"  "#%$ OY OY"NY?+?+39/+393310##4&+532654&#"#563 hsmfJWTc]N%]"Hb^^x_dIXeaPKM}Kv#vV=*X@0  &,+')'_Y))_Y `YcY#_Y?+?3+?++39/+3933310#"&5! #"'332'5!3265'5!x!^q^; G,*Z"~=I?Fx}n/m)IIR|tqKJ=(X@0$*)%'%NY''NYOY QY !NY?+?3+?++39/+3933310! ##"&/332'5!326='5!=QZY((MoS!>@!gL)u_=HI=QoGm X BBpbbpB#=)u@> %+*&(&_Y(( `Y _Y _Y"_Y?+?+3?3+3339/_^]+3/+393333310#"&5!!57'5!!'5!3265'5!xm=I?Fx\JJuIIIIR|tqKJY'w@@ " )(#%#NY%%OY  NY NY NY?+?+3?3+3339/_^]+3/+393333310! 5!!57'5!!'5!326='5!ZY_!___&__=HI=QoGzBBBB>BBpbbpBBcL"C@# $#!_Y !! _Y _Y?+?+9/9+393310! !2#'.#"326='5!xt{WvܢZMZ[xe>No"3̮5=׳ҧJv!B@"#"NY  OY OY?+?+9/9+393310#"&5432#'.#"326='5!0`fH%%d3}eb`MeQ##ƸfkBB =!^@2 #" _Y   aY  `Y_Y?+?+3+3339/+39333310#"&5#"#!#'&+3265'5!x3Z[\Q1=I?FxwZ|tqKJO@) ! NY   OY NY?+?+3339/+3933310! #"#!#'&+326='5!ZYNo+KK+oN=HI=QoG pbbpBBJLR2&X@0#&& #('OY  QY OY ?3+?+39/_^]+99333310.54632#'.#";#"327#"&5467]c{H"M#WJlmpWx^"wK|s}eXR#P3UwF=&C@%## ('#%#_Y%`Y%cY`Y ?3+?3+?++393310#"&'33265! #"'332'5!ԭK+YF*E[[!^q^; G,*Z"1 0`^an/m)ILG$C@%  &% " NY"OY"QY PY?3+?3+?++393310#"'533265##"&/332'5!˻YS@+6?((MoS!>@!gL)u>Rrzm X BBdL4TL`T=:Z1!@ @P`/]]29/3310#54&#"#54753χ &* HC'-''-'1^^ ]U/ # @!@ H e?3+]223104632#"&4632#"&%4632#"&8)'98()8:&':8)(8:''98()8)88)$:9)77)%::%)78(%:9TN e?10#7'7'7VVVVVVVVVVN/ @/ e?3]2104632#"&4632#"&N8('98((8:&'98((8)88)$::)78($::?/&@/ e?3]210374632#"&4632#"&?L8('98((8:&'98((8=pP)88)$::)78($::=o/]2103"&53k^RT`JDP@/]q10'7B;"'@  P@/]q]]99//2310"&5463232654'7#"&'."4z[H5Y5*.@4zXG5V:*.)#b-}JY9L=%4b,~IZ5P9)N+@ 0P` @/]q]21044k^NT`V/10#'73Vo@ @ /3]29/10#52654632#"&^k8)'98()8R`T)88)$:9NX+@ 0P` @/]q]210463"^kN`TNX+@ 0P` @/]q]210463"^kN`TNX3@$ 0P` @/]q2]23210463"!463"^k^kN`T`T?%+7>@"//) 5/?) )@)P))))))H)/+]q3]2233310#"''7&546324&#"326%4632'#"&732654&#"{X3'RgR{XX{{3%%33%%3{XX{RgR'3X{{3%%33%%3RX{RgR'3X{{X%33%%33%X{{X3'RgR{X%33%%33?%0@/ ?   @PH/+]q3]210#"''7&546324&#"326{X3'RgR{XX{{3%%33%%3RX{RgR'3X{{X%33%%33D=  e?29/310#"'#3326=_^% "&6^l g]{ )2+1!@ @P` /3]]9/33103326=3#5.5χ &* HC5'-''-'1^^ ]UH/]210!535#L/10#'73bo/]210#5265^kR`ToX@  /2]22310#5265!#5265^k粦^kR`T`TTy @/]1057'%=}9p:iTN+@ 0P` @/]q]21044k^NT`?%0@/?  @ P  H /+]q3]2104632'#"&732654&#"{XX{RgR'3X{{3%%33%%3RX{{X3'RgR{X%33%%331!@ @P` /3]]9/33103326=3#5.5χ &* HC5'-''-'1^^ ]ULN%@0P` @/]q10#'73NH=@P@/]q]3]10!535oX/]2103"&5k^RT`B"'@  P@/]q]]99//2310"&5463232654'7#"&'.)"3{[I5Z4)-?3{ZF5W8/+)#b-}H[:K<&4b-}G\7N=%-% 0@/?  @PH/+]q3]2104&#"326%4632#"&X3%%33%%3{XX{{XX{R%33%%33%X{{XX{{?` @    /3]q2104632#"&4632#"&b:&'98((88('98((8)78(%::)88)$::?` #/;!@'-  9!3/333]223104632#"&4632#"&%4632#"&4632#"&4632#"&:&'98((88('98((88('98((8:&'98((88('98((8)78($::)88)$::$)88)$::)78(%::)88)$::?1 /329/3105!4632#"&4632#"&G6:&'98((88('98((8)78(%::)88)$::?) @  /329/33104632#"&4632#"&5#5!#f:''98()8<%'98(':fXb)78(%:9*78)$:9uu`R  /3104632#"&`:&'98((8)78(%::T  /333104632#"&%4632#"&:&'98((8:&'98((8)78($::$)78($::N # !/3332104632#"&4632#"&%4632#"&`:&'98((88('98((88('98((8)78($::)88)$::$)88)$::\/310!!H}T/105#5!#FfXbuu` @   ? _  /]3104632#"&`:&'98((8%)78($::`F @  @ P  /]3104632#"&`8('98((8)88)$::{- #@ 0@!!/3]29/]3104632#"&'4632#"&4632#"&`8('98((88('98((8:&'98((8)88)$::)88)$::)78($::``   /]3104632#"&`8('98((8)88)$::H/31053HL/39910!!<L\@?o@H/+]q310!!H`//93103` w ` @  o   f?]3104632#"&`8('98((8j)88)$::`F  /3104632#"&`8('98((8)88)$::y !@   b?2/3933310"&54632"&54632H^^HCcaEH^\JEaaaEF``FEa`FEacCF``  /3104632#"&`:&'98((8V)78($::Z`  /3104632#"&`8('98((8)88)$::y*7@ "',+$(%A gY(a gY _?+?+3931047>54'&546;265432+"3!!.y(#19VL&(w+@ G%$/Hm\h'5*C/%$0 04,$ OP@L@j@ Y0> #8L_$#ab??3?39+393310.#"#"'.'!53254.546?'.54>3267.54632372 .5B%BL ?(9/7@@6nk)%-%Z\ 9S]) a491=]6<#Z ~@@"mKX().J63hEF`,3)T/>PfAP@ 2#_N-v,݆MXS3L .D"9@ "$# gY_!gYa?+3?+93310)!>54.#!"&546323!23ZI/,BY09,-UM" -D{OU.lRCa"F~DDm1A@-  23 ##A gY#_ gY ab??+?+993310%#"&'.'!32>'54.+"54632;2m# B(Q :D75,,f*(PC%  R&d$RD:1- {F=(L~/*=RmKɠNUy//@"10+gY+_b??+393310#"5765/467!"&546323!2y 7'  28><+!)" QUK $  :ҟWw:]cC_& f-E>@2>> FGCC*8b*gY*_?+3?39/933310"57654'&5467!"&54>323!2#"5765'4>32/%0 *3309!CZ>L ?K j GMқ'( 3`iH_,lT-J-TjB`2-,!@fJ;?-w# gY_a??+99310%#"&54.+"&54632;2wB  '9-3*)9j>Z55+YMGw$4Vj/)@  # 10!,jY,_?+3/9310#"'&#"#"57654'&54>7"54>32;2 . s3+'1yFK'@4tA810&?Z6ddGS]\4.I1&Y)>5@;,&,.@?1 b!gY!_?+3?393310#"5765/467#"&546323!2#"&54654'&54677& !N3@K?2=- +%4 s# %+RBo[;HU(N7tPM_M@x) &% &UEQ>\ -*l 5Z:Vj:k@"34-&  4<;33O3_333 33770hY7` ""A jY_)gYa?+?+3?+9/_^]933310!4&'&5467"&54632;2#"'&#"!>54&#"'632j*X 'K6/3N !%-@.,TFKj54.+"&54632;2(_i " =g.:3@,#T'?,bfaC/#n:&(]aE]" 3lqN & "!cgY_?+?99310#"&54.#!"&546323!2N   (-3(I>"E30YMHt 5?}2@   A gY_gYa?+?+9310!!2>54&#!"&54>323!2}? -TWE%oBiyWQ,Y5".VD7@  <"" FE/A ^b?gY?_?+??933310#"&5467>7654.#!".547654'.54>323!2VSjE6)*6hsKUk3X`0.% /, %W*)1)'55?w`C`?7(+44+WJ/7=$h:rSP ;B!;+ =Qb99%,b^';@% )(  A gY_%gYa?+?+393310!4>7#"&546323!24.#!!6^f@,#2<0 )5cQ3u!AToI. @QT(jRE_ 0jr8FfNh/T6T@ !87/44A hY4`(jY(_gYa?+3?+?+9993310!!2>5! +"547654&'"&54632;2>7632T& 9p" =1#]Z2Q5:&+-HReM I$l &:[(L+!"^P5L!&C:F _d3 5d-)@ !/. d)gY)_?+?9310#"57>=5467>54+"&54632;2%-/  9+7B+'A,+;L:l "Sr``^|D/!iS:l ,3#,3@ ((.- A gY _gYa?+?+9310!!2654.547654&+"54632;2#$H ,w('KW92/a +9@ __*%/E)6'sUcY3b-+9@ &-,)hYb# gY _?+3?+933104>323!2#"&5467#"&4.#!326b$)&KTP*uۗLA=25R3EKDM,I/ 6m֑{HX?]H8O3ZI@D;6  \[4L'jYW'_> gY a?+3?3+33933310!3>54.5467".54>32;2#"'.#"!254&547654&+"&54632;2&6$J "*"@5%7F;. &-?>7N #%94')JDI>‘-P@249 5'T[f9(C.C=)A))?:35=;~sL6W[6k=DG?g6Hq<@@ #99)>=%1jY%% c gY _?+3?9/+93310"&546323!2#"&54.#!32#"54&#"#"&5467-3(uM   (1F1B8E. %726 LGTYMDx Kr9"E30[" E>\., *aYgA=9X@& &,;:#j@ Y4 )4)A gY4_gYa?+?+39/+9993310!!2>54&#!32#"54&#"#"&547#"&546323!2J[e2jo"(1B8E/%724  i-3*-TWE%rCiy6!E>[.,,dVo]KCw".j{MC@= :3 '  ON:Ic/I #=I=jYI_?+333?99333310#"&'.#"#"&5467654&'.5463267"&54632;2  +WӚo%. )%(*11#1>KB1L1{3>7!N4/*M)Nֶ!cXO2>4hI80FS(cvReC<;w;1Lc@ 9;5$NM 9I-!jY-_@'!/7!A@ ?$A bc?5gY?_?+??9/933310#"54676322#"&546767>54.#!"546323!5 -b"UB25),4o:2375D-}*-# Nzst,.<-xE-(-26)Zj&)d?V% Cw"N&! a gY _?+?99310"&546323!2#"&54.#y-3(I>%  (TYMHt 5?*30N\S@J>*C&$ * &^] !*M>5>jYY5_&CCgYa?+3?33+393333310! 547.5463232#"'&#"6767.54632#'&#"!767>54&'.54>38^>S6oNB9)5\M< "`3iu-0,7 ;u 93NX3;9/* ^+4 AO9B-7R\ CQ<B  '9-3*)9j>Z55+YMGw$4Vw55+YMGw$4V3`@<@+3&+BA"a;_0  gY_?+3??993310%#"&54.+"&54632;2#".547>54.+"&54632;2`B  ):-3*)9j>R(_i " =g.:3@,#T'?,Z53,YMGw$4VfaC/#n:&(]aE]" 3l3#G7@2$ :-$I)H6gYB_?3+39393310#".547>54.+"&54632;2#".547>54.+"&54632;2(_i " =g.:3@,#T'?,(_i " =g.:3@,#T'?,bfaC/#n:&(]aE]" 3lbfaC/#n:&(]aE]" 3l=m _?9310+"&54767>;2iaD \\ү!  5@=m)!@  +*'_?32993310+"&54767>;2+"&54767>;2sUB w^iaD \\  ,Eү!  5@!R@*   NY NY ?3+333?9/9+93993339910%!573!57'!!HGKII2lUP<<9e:<$'@P %'$$ )($"NYNY"'NY NY  O _ o  ' ' "&NY NY?3++3?99//_^]++3+3+339399222333310'5!#'&+373#'#326?3!575!!57=cmKPBKK^Ri-)K~^u2QBgjBBB3TBy,:Ac@44>8? &>CB-  QY??OY4+ ";;OY%))?23+3?339/993+3+393333310"&=!5.#"5>3263 32?3#"'"7>54&265# 8ta.}(4N5!$CgDG\X'AJ\t8^-JaM@@=/R5tzB M"*?=}C`D+YS3v$FJ`%&R4^kUP5 'c@5$! $ )('NY NY!      NY?+3?9/_^]33+33+39333333310#)57#53'5!234&+3263254+ff____s^lpobi]S8wyB]ZABsu|7PUVaP.@  NY NY?+3?3+993310"54$!2#'&#"326?3gQOvRmS43&B5'7@  NYNY?33+33?+39933104&+26 +'#57'56{r` 1__ȵ BB5'M@'  ! NY  NY  NY ?33+33?9/3+3+39933310 +'#57#53'5#2654&+3  1____2{r`6BNZPBȵ5c@;  NY  O _ o   NYNY NYNY?+3+?++39/_^]+9333310?'5!#'&+373#'#326?3!5__1KPtKKԐRi-)KBBgj&T@.# ('OY  OY  QY ?3+?+39/_^]+9933310#"&'532654+53254#"#5632/^xXpnkJW#M"H{b^vV3P#SWe}s|Kv#  1@  SY NY NY?+3?++9310'5!!#"&54632gf`+[?@YXA@ZRBBBAXY@?[Y8*@ NY NY?+3?3+99310'5!!"'533265_ykLK 0->RAA~CB5Q@* NY   NY ??+33?399+33393333310!!57'5!'5jhI__KBB=BBBBYB5O@*  NY/  NY?3+3?99//_^]99+3993310)57557'5!732?3____F8KB7t6BBcrct636fNR_/@ NYNY?2+?+3993310"/332654&#"#763 ɷSmRvOQƒB&34M&& @    /2/39933102#"&546"32654&7ܩ礭APM<=LOBM&"@  /3/39939221043257654&#"'&M43&BQOvRmSb$ /3/399106!2'#"&547'5#>54&7z5nz2r/=8|??j<;rݐ_K|vp߉^M;3M<80OB0,4`@3&01 065*OY1OY  QY"--OY?2+3?+39/99+?+9333333310"&=!54.#"5>32632#"'32>54.#"265#ɹ 7w\=g6K}Eu`ۼ``?M4883M?ZA<,R> M, zxEFf2D#,\@ *& #.-((PY@ H $OY #?2?+99//+3+999333310#"&5467.54673254&'254#"Ŷ^ShuueUZ4,vv,4G tvLv {U]wmGdf k =1@KUbN (@   @ OY ?+29933104&#"!463 BOK>᧜N (@   @ OY?+2993310# !3265T%=LOB梭+@@!    NYNY  NY ?+3?9/++399333104&+32657'5!2+KYz}WJb_iǺhXrgBBCU@-   NYNYNY?+33?9/9++3?933333105!!"&5467'5!3#";?__[WRYmPUXSgjBBB{N|m@v0v_\U^%<3@  NY PY?+?3+333993310"&5'5!3265'5!Hhvjesn|ZjBBttkrCC리K@  /3/339910)#!2654'!#!73#HBT^"ABRBWDp^GBLLVw\#/(@* *01- /3/33999310)#!2654'!#!73%#"&54632#"&54632&#HBT^"ABRBG22ED32GJ/0GG02GWDp^GBLLVw\0II01FF0IH11FFF -(@'/.$$)) /3/933339910)#3!2654'#!#3!2654'!#3!73#HzzBB/T^**7BB/T^'FBBB|Do8͌^TABJV ^TABBUV\\YZ(`]-D@%   NY NY QY?2+?39/++3933310"&'532654&+5#"#!QS3nnlhXEM3H})$R#X_YYW*#UypA)<@! '+* & OY"OY?+?+9933310"&54757>54&#"#632326?3PQ]Uf0d#KPQ]Uf0f#Kn+rQKFN2n+qRJFN2L)4@  '+*#NY&  ?33333+3?9910"&/#"'533267.5463232?3rdu8447yaOM=# ,A[>^Y22X`<\C, $__!_((MoS!>@!jBBBBm X 2n]0@/  >?333?9/93910!573!57'!38:y\HEse3123C2X#&u@5&%% ## ('!!& [ k { & & !> %/?33322?99//]]333333339333339910'5!#'&+373#'#32?3!575!!57U@<_[AAPl[#@ &tlQd 9ւX[999o2+X B@  !"  />?23?339/33933331057'5!2#74&+323254+RRb̴UY$$ 299af#zhHEx2+X&Y@&#  #('& [ k {  / >?33?9/]3333333933333310##!57#53'5!234&+323254++WWRRRRb̴cUY$$ /gzh9+M9afl.HEx/dX1@   />?3333?339933104&+262#'#57'5iq~UaSRRĩvI992XP@"  [ k {  > /?3333?33339/]]3933107'5!#'&+373#'#32?3!RRA<^@@{l[#@ k9ւX[2XB@  />?3333?39/333393310!'3;##33#"#5! @#[l{@@_<ARR2&[X9uJ!m6@   0??3?339/3393310#"&54632#'&#"3275'5!D۵J^> IOnd[T.*RAX7 }7992XU@ m}[   />?33333?333339/]]399333310!!57'5!!'5!!57eReRRRRQQeR999999u99%2X " / >?23?3391057'5!%RRRR2999u9&iX%@   ?/?32?3399310'5!!"'533265h\yE@ (&6 88+l 992XM@  /  >>??33?3933393333310!!57'5!'5|WO>)RRˁK@X9K9k49999'92X+@  / >?333?3399310!57'5!32?3RR|40@2999u #2jXF@   />>??33333?399333993310#!57'5!!!57)ORR?TIIxO2999 9u99>2rX@@  /  >>??33?39933399333310'5!#!57'5!Y Q-XRR8r ::(c99:!2XC@    / >?33333?39933339933331057!57'5!5'5!#IInRRIIQQ29X9999QS\99u9Z!Bm %@  0??3?3993310#"&546324&#"326B9D@51.B;Ƒ@!m",H@*& ".-(@ H# ?0??399//+3339333310# 5467.54673254&'2654#"RFYddWBT-%ee%-L=Dm bg@hjHw{OfZCWV \ 4*7A fUHRK2X=@    / >?33?9/333392333104&+32657'5!2+DIJ@RZoJf[IX%99xy}92XI@ />>??33?339/3393333310#!57'5! 4&+326m4`WQYjRKb ^M2J99:49=R>F2X3@  / >?33?33339310#'&+!57#"#5A$SEDS%AX88!X/@/ ??2?33333993310 '5!3265'5!Yeb_j([!&99=[b::8!X1@  / ??3?39933339910'5!# #'5!ֺ^>hg<`699=994&Es%&Es$C@ &%" <;??22?39/99?39333310"5'537>3232?37>54&#"%9 K#nIS0A(p244$$5&o(+ZWRfG&3E30(&s@@  A ; <?>?3?3?3?9999333310#'#"463253'4&#"327 _6|nk,92g+36>Y'8&@1dsck9"&As&3:X@#1-78 7%!<;'8-%)<44#??223?39/99993333393333310"=!5.#"5>3263232?3#"'"7>54&265#9RN??_5@[z;n#093'tU`*91D ,<,&'$&1 fO.JKAL%Q.9F*,& M?9=309Oa_Q ,t 1@  >; ,?3?3?399333104&#"326'53>32#"'6?6&8<9:[+zqabog Q sy'89(&+'t&&s3@  <??2?39/39333310"&=!54.#"5>32'265#sg(@::Kp.+&z1 WM).=`QpA&s*6@# ( +,  <%??2?39/93393310"&54675.54632#'&#"6;#"'327{G5;4~mD+"@46*T TELR"n&ZR>E ?.DIL0+)-N Oi0&s)<@!''$ *+$ ( H<??2?39/+93393310"&'53254'+532>54&#"#5632Bn"RLET T*64@"+Dm~3<|&0iO N-)+0LID.?qRZ#K%0<_@,:%4 +& %>="))1 @ H..7 <?3?399//+9333933333310&546327#"';2#"&5467.54+3262654&#"kx&ID%z2*)ͤz>-!4L5J@_V-''-*%%-aa Ca-Nbc-eoF=#5 E'9&1&&<DEE@@EEDDf %@    >;?32?329310'5!##"&54632Y=(=97&&53('60((8((44(&76 2G@ ,@   >;?3?399333?393333107'53!57'!57'53 =<?3?33?33?3933310632#"'5332654&#"!57'53zF|n43' &$(.-3773@Nr} D RG32#"'5332654&#"`0Ni+%86FLPW7Dc}ixg)L1s !@   <?329933104&#"#4632!6-%{}Lwt`)&1L !@   ??32993310# 332651&,6!L&avt-{sA@  ; =?<?3?3?33?3993333310632#"'!57'534#"32BZvr@@S==h9.60iG,C(('X &/#f)_{&@ /3/333993310#!#5!2654'!#5!73@'28['(sL8*(.-37&f*S@!!( (,+'" $ ;?(>?2?3333?3393333339333310'#"'#"5'5!327&5'5!327'5!sLc#~R83O,492N&547724@IId''j(d''j''8'&ff0*&js'=@ & &()<@ !$ ??3333333?999910"&/#"'533267.5463232?3 9E% "I81,$%4)P;d^Vl;Q"8)$/&& $}I !9Wy:Pc_T:wX2) I}(.?#G@  $% !!?-=??3?39/33933333310#4632!"'4#"32654'5>֮nSD1I0!)>8B0.NnaNl$ Z^ U`:P-(g.@= ;?3?99333105337654'53'467&' V3Q$/ 4 )t?(U50 ' $>j"C6)8=%>*3@%(,+(,"??3?339933310#'&#"#"&547.5463232654&''$.&(*.8R;~+2vdC_8./79F#*J+""B)1HxR|wZ&e/NZf]\XFq3t)s"D@  #$?<< ??33??3?3933333310#5.546746324&#">J2+&F@ %uxa_tCFF'/a@5,+ %%10&NY+OY++"RY QY(OY?+?+3?+?39/9++393333310!632!327#"&'# '5!3265'"34.iSK\0l^X7SvAj^GBHPV<;+R~BM!+AU&EBwV\f\ m4 !-R@) ))!"./ +OY! ! !%PY??+99//9923?+99933333310!2>73>32#"%'"#>74&#"326z! i `W(H̼ۢ" i _X[h&Z@]c` E[7!-DY-F1S'2]@0- $($43'$NY'##   0OY +PY?+?+99?99//9923?+99333333310%#"&54632&='"#>75!2>73!327&#"87'5!54&#"Dp _ >9^-TQAV-\_ ?9\mR@GBLLZ#H ;},BB9BB ;}-6B8T^"L %.[@/+ !&0/$"NY$ !!! -PY(PY?+?+99?99//9923?+99333333310632#"'2>73!5'"#>7'5!#"32kĿjl i bT" i bUg}d]NQX|IBRC E3-FB4v&;a&j@< " '( RY"RY"RY "" %%#NY%NY ?333?+3?+9/////+++99_^]333310>;#'"2673!57'"#4675'5!lG68;?=,$ AWWz(( AUXzxi~7%;5BBZ3@B#H@##$%  PY NY?+3?3+99//99239933310'&#"2673!57'"#467>32'd,$ AWWfg(( AWW cCmu;5BBZ3@3,@54(!%NY NY?+?+99910#"&'332654&$'"#67&54632#'.#"3273L/B&#r;WUR/5BAgB i/HEMe2BB6*!#/K:6BX=O0>n%;32C1:~P4&S@+ '( OY    @!QY?+?399//_^]9923+39333310"&='"#75#5?33#2673327& U{u%! U6,5Mzs4? A'h3= RABU"(`+Q@+ -," NY$'    NY ?+9?99//_^]9923+99910"'326?3!5'"#>327#"#!26737~9~5H>5H3`M!k8hH;6H4a: -;8oq? 1n:6os<&1=a@5, ;&5 ' # ?>2OY#)) /PY8OY ?+?+99//933+933333310%#"&''7&546327.+ 4>323!654&#""32654&+#r>OJG0wHj;SI=X{k#JBAKE?>Kڜ o+L L!/mXuf+T?r?C_@Q@@^lsssmmsss2X @   /33/29/3991057'5!35'5!!575#GGGGGGGG2    ,  NF&J@( $ ('  NY!NYOY?+?39/9++39333310"&5467'5!#"#!'2654&/D2bHOH.(j]NF˳'MO?Aܟcd/'?@R=51 ,'++  (=A@14,+22/7::RY:/-NY/""*'*OY%@$'QY=  NY ?3+333?+??3+3/?+?+39/99333333333310!574&#"!57327#"'#7&5#5?33#'5!73763 TGBLLV-\6,5M<^>{?.{uX`(xEq^B/T^"ABBq ABU"X:[kA'hQB8hBZ#HB49@  NY OY NY?+3?9/3+3+3910#!57#53'5!34}_!_}}__}BBRh>BB-t4@ OY NY QY ?+?+9/3+3910327#"&=#53'5!3/*)0 3}tttD6 R vh>BhhLs$+n@9(# )!!,-"OY( NYNY PY %PY?3+?+3?+3?+9/33+33993333333106323##"'!57#53'5!267!"!.kTU jlfggg}TUQZ]NXV|IhBRBBh>B&䙩#:%U@+##  &'  NY" OY PY?+?39/33+33+3339933333310#"&=#53'5!!'5!326=!̾hhhv|ZjjAsnPjnih>BB>CChkrtitt*1@8//..((! 23!    /(OY%"    H @ H  +OY?+?399//++_^]333+333_^]3339333310"$'#53>?#"#!!.'!#'&+3#'267!xHK͟F(KK\  ZNK(LKHtt$uhz" f q_Zu f "whd}yL  ,T@-(( !  .- *OYPY $PY NY?+?3+?3+?+999333310'5!>32#"'5332=#"%4&#"326z` (H̼|ES@+uQS[h&Z@]c`5A]`!-늌r_D1SL\#.Y@1))!$0/#NY#PYNY ,OY 'PY?3+?3+?+?3+?+93333310%#"&54632&='5!#"'5332=#327&#"8|ES@+uKOJF3WwIi;SX{kJBAKE?>[Kڜ o+LOr L3mXuf-T=r?_@Q@@^sssmmsss3Lp&e@8 "" ('%#NY%" "NY  PY NY?+3?3+?39+333?+93333310 '5!#"'5332=!57!57'5!odflCT|ES@+u7s])Y`BB}r[BIPBBB(L.@NYNY PY?3+?+3?+910%#"'5332=!57'5!g|ES@+uf`Z}r[BB7L:q@<%%**6 116 6<;97NY91*% 646NY(4PY ..RY"NY?333/++3?3+?33+33333?+99333933107632632#"'5332=!574&#"!574&#"!57'5!Do8͍^|ES@+uTABJV ^-TABBUV-\\mZ#Hzz}r[B/T^**7BB/T^'FBBB7LT(]@3$ $)** '%NY'$"$NY" PY RY?3+?3+?3+333?+_^]9333310763 #"'5332=!574&#"!57'5!Dp^|ES@+uTGBLLV-\\mZ#H}r[B/T^"ABBBL #,c@6$).-" NY"NY+PY PY &PY?3+?3+?3+99?+?+933333310632#"'5332=#"'!57'5!#"32kĿ_|ES@+uYjjlyfg}d]NQX|Iჾrm&BRBB4v&;7La!T@-    #"NYNY PY ?3+?+3?+?3339_^]33310'"#"'5332=!57'5!>;);?=|ES@+uZzz lG6s~7%}r[BBxi>L5G@(/! '!67/( $$,NY$NY PY?3+?+?+9933310#"'5332=#"&'332654&'.54632#'.#"|ES@+u\L/B&#r;WURygB i/HEVz;rz3!#/K:7B+-rn%;35D(-nL,R@, *( !*.-PY( OY((%PY"PY?3+?3+99//++33933310"&'5332=!#"'5332654632#'&#"!d@+u˻YS@+6?ķcC@'d| rMrz\mLO@+      NY OY PY?2+?+?3+3339933310"&'5332=!'5!'5!!d@+uwBpn3D9|L rGfBBBBL(r@A  ' (!&&("   *)& !$!NY ' $PY( NY?3+333?3+?39+33393333333105!7'5! #"'5332=!57'!57 i^@S*Z|ES@+ui^T,kAAAA6|r[AAA`(L` M@)   "!NY  NY PY?2+?3+9?3+9933310"'5332=!5#"#!326?3[ES@+uTk8hHP9~5H|Lr[-%1cBL(2n@=-22%3 4)NY%% %%0QYNY PY!NY?+?+3?+?3+99//_^]+393333310 32?3#"&=#'# 4>?54#"#5>327"a^u+@SE|N~@VzTh&BTaK<0DPr;H5'j=4u ^iUP#SL|(W@.#(( )* PY&QYNY PY ?+3?+?3+?3+?393333310%32?3#"&=#'# 4325!4&#"327ku+@SE|qϸJ!`SWTITWjBr;]q kRä_SF 1X@. ,*%%32/PY /*((OY(""PY"PY?+3?+3?+3?3+99333332310327&#"#'&#"32?3#"&=#"&54632&54632x^XPVNPZd}@'dd'@Bd=h@moķcCۻ+m~m](,?FLT!)]@3&% * +++ %OY%% "OY QYPY?+3?+?+9/+_^]393333310"&=#"&54632!32732?3"34.|\Qտ0l^Xu+@S<;+L>R~Brm4>LZ7_@3 5)/9") 89.22+PY2QY OY (%QY?+3?3+9/+9?+39333310"&54675&54632#'&#"6;#"'326732?3#"&=maӮyH#54&#"#'632u\u+@SE|1|Zoss 00?x232332?3#"&5#'265#0m]X7Su+@SE|ж<;+R}CM!+rel5-L,"?@!$# SY NYNY PY ?+3?+3?++9310%32?3#"&=!57'5!4632#"&gu+@SE|f`[?@YXA@ZZr;BBHAXY@?[Y3LG(@@"# (*)PY OY (&QY?+3?3+?+393310>32#"'32?3#"&5332>54&#"3-TqҋOVu+@SE|H*C8;`5}by$(u Sra^wɬL'@@" ')( ($PY$PY PY ?3+?+3?3+339310'&#"+'32?3#"&5332654632'd˻u+@SE|@+6?ķcCmDHrrzLM$T@- ""%&$NY$PYNY RY?3+?3+3?+3?+39333310%# '5!327'5!32?3#"&=#Dp^GBLLVw\u+@SE|R#HVBwT^"Br;-L)V@.$#''#  *+#!!NY$ ! PY QY?2+?+3?39/3+99333310"'32?3#"&=32654&+5#"#!QLLu+@SE|nnlhXEM3H}Zr#X_YYW*#Uy%s@@  A > ?<;?3?3?3?999933331053632#"'#3254&#" Cm{ol*92f+35>>'5C䒠@3esbl9'u*w!+%;)??3?39/310632#"'#67&54>32#'.#"4&#"326:>M]i[mD > #,D~STc+'!#:617.V+-#MXfqqfzat'tl2>;,?3?3?310#5754632#'&#"3#!57QVVun;(&&*?32233?339103#"'5332=#53'5!AUUxk>%&(( *7u'C@%();#<? =?33?3?3?999333310#"'53326=#"4632732754&#"7W]J\(@OD_6{ol* 6>92g+0Tu=c dl:&@2 9esck1g?@ = ;??33?33333?3993333107#"5'5!327'5!#sO82*(.-37: ]@d''28''6' 2_9 ,@   ;>?33?39/333?39310!575#535'5334632#"&>=XX9P4('55'(4-((>'>&55&'67'|g; ??2?3910"5'53327E5N'v'SI1&2Eg  >;?32?33910'5!!57_99991''7((2Ue$@   ;>?33?339/33310#!575#535'5!3UK99KK99K2''>((+&C@ ($', ;!! >=?3?333?3?3339333310#"&546;'5!3#"&5463227#" jQXWIUcE@7$&75(&5bU&)%[eH?;G'IA(56'$75'r!%/ , =?33?391032?3#"&5'53 &  '34n|9 HP D |r4'!-I(,> =?33?33?3910#"'5332=#57'53 >JR)3' F=9hKrp D 7('52Ye)@   ;  >?333?339931032?3!57'5!rWlS0"-99=>Ag('*-t2]@+ " 0'""043 -+')<#%;"" >=?22?33333?3?33333933393310"'5332654#"!574#"!57'5363263270& !&O,482N&5477sLc#~Q|- D QGj ((Oj^(('1@IIMr|/g*S@!( (,+'" $ ;?(=?2?33333?333333339333310#"'#"5'5!327&5'5!327'5!sKc#~R83O,492N&5477/6@IIf''j&f''j''4'-t"C@   $#<; = >?23?33?3?3339933310574&#"#"'533265'536322*(-.|m70&  &7sM92(O28r| D NJ('1@(*- t"C@ #!$<;  >=?22?33?3?3339933310"&54&#"!57'5363232?3n|*(-.477sM&  &0-|r28[(('1@9HP D 2we?@ ;  >>?3?33?3333399333310'53##57'53>9\>99/(((((!&)t 5@ < ??3?39/399333310#"&54632267#"3.)z{}4"&,/!%Omm|^`^`^ ,;T%\@ #  &'/"<# ? =???33?33?333?339333333310!575$4675'5!4&'>;>=ɓ=(>7AGH@?IH@N'' ~''tdcqke<e.u3;@* %%145 )?<0-=?22?33?33933310"&=332654&'.54632#'.#"+32?3n|(C'52/UVIq[G_(?U0TUKmt &! &0.|rO,# (\EM[BB)VDYfHP D -- =?33?33910'&#"#"'5332654632 <|n70&  &xk=&Adr| D NJxv /#/%$; ? ?=?22?3??333910"'53326=#"&5#5?33#32743' $QXIWFZvv $*V/ D PH JDs'>'( Tv#e"^@#  $#  ;?>?3?33?39/333333393333333310#'#"=#535'5335'533275#P7 sL88837.-*2(1@i?''?R28.'g(L@ ' #'*) $#  ;??2?39/933333239333310"&546?#"#7!32654&/!#'&+mzo]<-! 48HGHG:3 ! -ESl|'uxWr= XI]RR]JW =rX'g/@ ; ??2?33333993310 5'5!3265'53\>2F|F@J?z'=''ÊACC(( df'Yu1@  <; ??2?33?393310"&5'5332654&#"#5632>tv8YSb3+-48V['u'ukP[ Vzu2`q&  < >?33333?39910!57 #573`?22?33933105#"#5!326?3'@S+Y"I,2]  '-e :@"!; > =?33?33?3393331032?3#"&=!5#"#5!326?$" &07n|@S+Y"IFR D |r]  '~e"J@  $#  ;@ >?33/333?33933333310#67#5#"#5!3>32#7"3254&=1 @S+.*vB9BPHZG\2P/!] KW?-1;l6$#+g;@      ;=?2?3399//3933310"&'532654&+5#"#5!7g GXTTNW8^S+пԠ+.[cef$]$σ &:5@   ,??3?39/399333310! ! 267#"3.: 3.*22*.LְGb  /32210"&54632"&54632353-@A,,?>-@A,,?>?@-->=..?@-->@+.?o%!Gb  /32210"&54632"&54632!53->?,,A@->@+,A@k??..=?,-@?.,??,-@!s%F^- /310.54>54.54>54#"5632\R[.(1)8OF'%   <%#   Up@    /3]9/310#"#"&'332>;pr0^9;#'"!57'53&Y'*$>>99})/H %% % &y/10#'573>Fr@  /99//33107'53#73#'5s>>J;H&$f %+55B;&Dʴ)/ %+55"&%N0&Ӵ'-"%+5+5 &EJ"o=&% '-"%+5o &EU 7$%+5"=&%v״(*"%+5 &E!%+5dZ+&&'zvN.&+5FZZ&F'zv.&+5$c&'N"&%+5+5S\&G$oc=&'%+5So\&G"(%+5$c=&'X%+5S\&G&ϴ#%%+5$c=&'  %+5S\&G4ݴ&"%+5$Fc=&'!%+5SF\&G4ݴ&*%+5#!&( @ %&%#%%+55+55FXu&H'C_ ]5#!&( @ %&%#%%+55+55FXu&H'v ]5#F=&( * $%+5FFX&H "&%+5#F=&( *$1%+5FFX&H&3%+5#Z&VN@ .&"19-%+5+5FZX&|@ /&2:%+5+5#&)N@ "&  %+5+5-&I@ $&! %+5+5dE&*N@ &&*$&!%+5+56<&JA&?A %+5+5#&+N@ %&"%+5+53T&KDX@ '&W$ %+5+5#o=&+ "%+53oT&K@$ %+5#&+jN@ (&+%%+55+553T&Kj*&ڴ-' %+55+55#Z=&+z"3ZT&KzR#F=&+ '%+53FT&K?!) %+5:F=&,! %+5Fw&L% +%+5E &, .0@& %+555+555R&&jοv)@""" p P    ]]qqq55]]5#)&.vN&%+5+53p'&Nv& %+5+5#o)=&.ȴ %+53op&N6  %+5#)=&.%+53p&NX  %+5#o=&/   %+5(o&O  %+5#oE&/'GN&+5oE&O'  &+5#=&/ ( %+5^&O$  %+5#F=&/ R %+5Fs&O/ %+5#R&0vDN& %+5+57&Pv&@ 3&9/2, %+5+5#R&0&N"&´ %+5+57&P @ 7&.4, %+5+5#oR=&0N %+57o&P` .4, %+5'&1N&%+5+57T&Q%&"%+5+5'o=&1%+57oT&Q@"%+5'=&1%+57T&Q<%+5'F=&1 %+57FT&QG  $%+5d!&2  @  & , %+55+55N&R'vT!@000@ H0   ]]5+]]5d &2  @ & , %+555+555N&R'j,#@000@ H0   ]]5+]]55d!&2  & %+55+55Nv&R'C ]5d!&2  & %+55+55Nv&R'v ]5#&3vEN@ &Q%+5+5L &Sv@ %&\!$%+5+5#&3N@ "& %+5+5L &S@ )&5 &%+5+5#&56N'&$ %+5+57a&U@ &%+5+5#o=&5  $ %+57oa&UBv%+5#oE&5' ^N*&+57oa&U'Bm#=&5Ҵ! %+57a&Uش%+5m&6N2&)/(#%+5+5>&V-2&)/%+5+5moL&6%)/(#%+5>o&V)/%+5m &6 @ :&F,9(#%+55+55>&V |@ :&=,9%+55+55m &6 D@ ,&.*(#%+55+55>&V @ ,& .*%+55+55mo&6'N%2&+5>o&V&- 7&7TN& %+5+5!E&Wo%+5]]5 o7=&7  %+5!o&W ,%+5 7=&7 %+5!&W ,%+5 F7=&7  %+5!F&W C%+53=&8 )#%+55<&X? '!%+553F=&8 "/%+5F<&X:  -%+53F=&8 "%+5F<&XS % %+53!&8  @ #&;#/%+55+55<&X'vT!@000@ H0   ]]5+]]53 &8 @5&35%+555+555<&X'j"@+@ H +%% %+5+55+55&9N&$%+5+5&Y&$ %+5+5o=&9 %+5o&Y  %+5&:CN&%+5+5&ZC&ݴ%+5+5&:vON@ &%+5+5&Zv@ &%+5+5&:jN@ &M$%+55+55Z&Zj@ &%$%+55+55&:N@ &2%+5+5&Z@ &-%+5+5o=&: %+5o&Z %+5&&;N%&"%+5+5&[%&"%+5+5&&;jN(&+%%+55+55Z&[j(&+%%+55+55$&<N@ &' %+5+5F&\@ '&2$ %+5+5b&=tN@ &"%+5+5(`&]@ &%+5+5bo=&=~ִ%+5(o`&]%+5b=&=%+5(`&]%+53T&K<! %+5!&Wj &@&&&o&& %+55]]]]55&Z@ &%+55+55F&\@ &2!' %+55+55B&D@ 0& 1- %+5+5%&A@ &%+5+5#Q'V@.%"  %)(" `Y `Y_Y`Y?2+?+?+9/+99333310"'53265!'2654&#"!574! wrusx,; 7]&x}inJqoH&$Bo&D&$ N&+5Bg&D % &$ N &+55B &D  &$ N &+55&D  &$ N &+55B&D ?&$ & &+55B&D o&$'N&+5Bo&D' &$ N &+55B&D  &$ N &+55B&D  &$ N &+55B&D S&$ 0 *&+55B#&D o&$'N&+5Bo&D'#o=&(FoX&H#&( N%&+5FXg&H #&(N$&+5FX&H# &( N $&+55F&H # &( N &+55X&H # &( N $&+55F&H #?&( & &+55FX&H #o&('TN(&+5FoX&H'E&, N&+5-g& IEo=&,-o&L$doL&2No&Rd&2 CN &+5Ng&R %d &2 N &+55N&R d &2 N &+55&R d &2 N &+55N&R d?&2 & &+55N&R do&2'N#&+5No&R'dZ&bv&N(&+5N`&cvdZ&bCN(&+5N`&cCdZ&b CN1&+5N`g&c %dZ&bN(&+5N`&cdoZ&bNo`&c3o=&8o<&X;3&8 /N#&+5<g&X W3L&qv1N*&+5&rv3L&qCN*&+5&rC3L&q /N3&+5g&r W3L&q*&+5&r3oL&qo&r;$&<CnN&Ŵ %+5+5F&\C&̴" %+5+5$o=&<F&\$&< /N&+5Fg&\ >$&<&+5F&\Kb&c7&74 %+5+5Kb&c&&)7 %+5+5Kb&c=&=+ %+55+55Kb&c,&/+ %+55+55Kb&c=&=* %+55+55Kb&c,&/* %+55+55Kb&cO&.; %+55+55Kb&c>&.; %+55+55T&$?5T&$ٺ?5X`'$ٺ $?55X`'$ٺ ?55`&$2 $?55`&$2ٺ ?55&$ 6?55&$ 1?558A&g@ @&O@=.%+5+58A&g@ /&*2@.%+5+58A&g@ F&F4.%+55+558A&g@ 5&84.%+55+558A&g@ F&3F3.%+55+558A&g@ 5&883.%+55+55H'(7'?5H'(0"?5T'( -?55T'( (?55T'( -?55T'( (?55L3&i@ .&#.+%+5+5L3&i@ &+ .%+5+5L3&i@ 4&4"%+55+55L3&i@ #&&"%+55+55L3&i"@ 4&D4!%+55+55L3&i"@ #&I&!%+55+55L3&i@ F&'%2%+55+55L3&i@ 5&'%2%+55+55*H'+ '?5*H'+0"?5T'+ -?55T'+ (?55T'+ -?55T'+ (?55'+ ??55'+ :?55-t&k"&"%+5+5-t&k&"%+5+5t&k(&(%+55+55t&k&%+55+55&k(&(%+55+55&k@ &%+55+55&k:&&%+55+55&k)&&%+55+55H', ?5H',0?5lT', ?55lT', ?55lT', ?55lT', ?55l', /?55l', *?55N&R)&)&%+5+5N&R@ &)%+5+5N&R/&/%+55+55N&R&!%+55+55N&R@ /& /%+55+55N&R@ &!%+55+55L'2%"?5L'25?5T'2D (?55T'2D #?55T'2 (?55T'2 #?55&w@ (&(%%+5+5&w@ &(%+5+5&w@ .& .%+55+55&w&ڴ %+55+55&w@ .&F.%+55+55&w@ &2 %+55+55&w@ @&.,%+55+55&w@ /&,%+55+55H'<'0?54T'< !?554T'< !?554'< 3?55S&{A&A>&%+5+5S&{@ 0&3A&%+5+5S&{G&G5&%+55+55S&{m6&˴95&%+55+55S&{@ G&:G4&%+55+55S&{@ 6&94&%+55+55S&{@ Y& 8E&%+55+55S&{@ H& 8E&%+55+55L'+75?5L'+00?59T'+N ;?559T'+N 6?55T'+ ;?55T'+ 6?55'+ M?55'+ H?55Kb&c+&(+ %+5+5Kb&c @ +& '* %+5+58A&gZ4&14.%+5+58A&g@ 4&g03.%+5+5L3&i"&"%+5+5L3&i6@ "&b!%+5+5-t&k&%+5+5-t&k@ &#%+5+5N&RU&%+5+5N&R@ &-%+5+5&wt&˴%+5+5&w@ &L%+5+5S&{a5&ɴ25&%+5+5S&{@ 5&H14&%+5+5KEb&c'C7&+5KEb&c'C&&+5KEb&c'C &&+55KEb&c'C &&+55KEb&c' C &&+55KEb&c'C &&+55KEb&c'C O&+55KEb&c'C >&+55ET&$&?5ET&$&Ϻ?5EX`'$&ٺ\ $?55EX`'$&ٺ\ ?55E`&$2& $?55E`&$2&ٺ ?55E&$& 6?55E&$& 1?55E3&i'r.&+5E3&i'r&+5E3&i'r 4&+55E3&i' r #&+55E3&i'"r 4&+55E3&i'"r #&+55E3&i'r F&+55E3&i'r 5&+55E*H'+' d'?5E*H'+'0d"?5ET'+& -?55ET'+& (?55ET'+& -?55ET'+& (?55E'+& ??55E'+& :?55SE&{'>A&+5SE&{'>0&+5SE&{'> G&+55SE&{'k> 6&+55SE&{'> G&+55SE&{'> 6&+55SE&{'> Y&+55SE&{'> H&+55EL'+'7?5?5EL'+'/?0?5E9T'+N& ;?55E9T'+N& 6?55ET'+&M ;?55ET'+&M 6?55E'+&M M?55E'+&M H?55Kb&c&&)1 %+5+5Kb&c)&') %+5+5KEb&c'C&&+5KEb&cC*1 %+5KEb&c'C&&+5Kb&c&&.; %+5+5KEb&c'C&$N& %+5+5E&$N& %+5+5H&$?5H&$˝?5EH&$ %+5@  /933910>54.54632M8"*"<59F\)&#&6R?_uE @  OY?+9310"&=3327@@E&*&PEIC@D9@  /933910>54.54632M8"*"<59F\)&#&6R?_uIz@  /323310"'&#"#>3232>73Up9!" i ka1OF= i iIX--F$2- EQ /6@ --1 0 ((,# /22329/332399310"&54632!"&54632"'&#"#>3232>730II01FF0IH11FFUp9!" i ka1OF= i iQG22ED32GJ/0GG02G,X--F$2- EE3&i'r*&+5E3&irE3&i'rE*&+5L3&i@ &G%2%+5+5E3&i'rW>'(jK?5u>'(K?5>'+jK?5>'+K?5#E=&+Q 4 '%+5$@ /333399105!%>54.546326?GE$+$B454.54632D?GE$+$B43232>73>54.54632Up9!" i ka1OF= i iM8"*"<59F}X--F$2- E)&#&6R?_ut&k&޴%+5+5x&k&%+5+5t&k&j޿4!@+_+++]]55]]]5t&k&j޿4!@+_+++]]55]]]5&k&&%+5+5&k&j@_++@ H+]]55+q5E&,9N & %+5+5EE&,9N@ &  %+5+5B>',jK?5`>',K?5 @    /99333105!.546326?K;5A$+$HD$G%!#zbCV8)%' . @    /99333105!.54632N?qK;5A$+$HD$!K%#zbCV8)%' .),@+*   /]29/3/3910"'&#"#>3232>73.54632Up9!" i ka1OF= i iYF95<"*"6O}X--F$2- Eku_?R7%#&(&w@ & "%+5+5&w@ & %+5+5&w'j4-@////_///###]]55]]]]]]5&w'j4-@////_///###]]55]]]]]]5zL&s-&-*%+5+5zL&s&-%+5+5&w@ &$,%+5+5&w'j@ ###]]55$&<N@ &* %+5+5$E&<N@ &+ %+5+5F>'<K?5P>'<K?5H'30?5^ $@  /3/33333910"&54632!"&5463253G-@A,,?>-@A,,?>ϻ1l@-->=..?@-->@+.?G%!^ $@  /3/33333910"&54632!"&5463253G-@A,,?>-@A,,?>f1ۻl@-->=..?@-->@+.?!K%8/93105!?8G%!SE&{' M@ 34;&%=&+5+5SE&{ 34;&%+5SE&{' @ 34;&%=&+5+5S&{@ 0&8E&%+5+5SE&{' L'2.K?5L&2H7?5)L'+>K-?5aL&+vK-?5\E L&+!8/93105!?8!K%@  /933310.54632؂F95<"*"6Ou_?R7%#&(*//3310#*T 0@    //39/9333333310#'7'77'*T7777Y7887 2@   //99//3323333310'7##!'77RJ77}m}8L( 0@     //99//3322333310##'7!(R77J}78}%%@ Y/+3310!5%%@ Y/+3310!5%%@ Y/+3310!5%m+s'BB9R(@ [Y?++3933310467#"&?Y3.MYIUp6\54&'&54632?[1&&LWITq5]>L!$&V=Hlu -,@ Y[[/+3++933310%5>54&'&54632 i?Z1-LWIUojk\>K" (T=Hn+R#@ Y[ ?3++9933104632.qTJVL%'1YAWlH=V&$"K=]5cR%A@   '&##[Y?3+3+3339933333310467#"&%467#"&c?Y3.MYIUp?Y3.MYIUp6\54&'&546325>54&'&54632?Z1%'MYITn@?Z1%'MYITp6]>K"#'U>GmV4]>K"#'U>Go;-#J@%  %$!!Y[$[/+3+3+3339933333310%5>54&'&546325>54&'&54632i?Z1-LZFUo>i?Z1-LZFUojk\>K" (TADnUl\>K" (TADnMR%!@'&#[ ?333+399104632.%4632.MqTJVL%'1YAqTJVL%'1YAWlH=V&$"K=]5֝WlH=V&$"K=]55 @   Y [Y [ tbRD4&tbRD4&htbRD4&dTF2$vfTF68@GtPD4tPD4{P@0^]]]_]]]]]]qqqqqqqqrrrrrrrr_rrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqq/?++++9333910#753%%dBdPjBBjB@u@B5@    Y[ Y [Y[Y[{kK;/ K;+ hK+ {kK4$K;+ 8tK t@ 4 @0^]]]]]_]]]qqqqqqqqqqrrrrrrrr^]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrr^]]]]]]]qqqqqqq/++++?++++933339333910%#5'7'753%%%5D@jR\\Rj@DjV``Vt@DB@u@BDQ{ ^@  v d V 6 &           t @ 4 $   h       d P D 4       p ` P @ 0       p ` @ 0   8    ` P      p `      o _ O ? /   ^]]]]]]]]]]]qqqqqqqrrrrrrr^]]]]]]]]]]qqqqqq_qqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]_]qqqqqqq/9310"&54632frrrttttZ/ #1@ !!$%[ ?22+3399339310"&54632!"&54632!"&54632PEa`FEa`lEa`FEa`lEa`FEa``FEa`FEa`FEa`FEa`FEa`FEa@ //333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332332310###!!!TuO .@    /3/9/3333333310!!5!###uTON*T +3?@4,:0 & 0,A@YA@A2A$AAAAAAAAAvAAIA;A"AAAjAAAAAAAAYAiAKA=A$AAAAAAAAAtAfA9A+AAAAAAAAAdAtAVA)AA A9AAAAAAtAfAIA+A;AAAAAAAAAA@^}AdAVA A)AAAAAA{AoA@AAAY [ Y 27Y.2[.=Y..#Y[)Y?2/+++3/+++?3/+++_^]]_]]]]_]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqq93333333310#3! ! 4&#"326! ! 4&#"326%! ! 4&#"326$31273//363v31273//363k31273//363fa]xptya]xptya]xpty\=@ ?]9310!#h=\=#@ ?2]2993310!#!#hh=c\ = @  ?3322910!#!#!#NhbNhXNh=~J,S@ Y/+93103#~Jddd{|c~J,T@ Y/+9310 #3,ddJ'=&-T/3310!5!"P=??3310+3{x= #/E@%-! '10 YY  $*$YY*?++99//++9333333310"&54632"&54632"&54632"&54632TEa`FEa`FEa`FEa`FEa`FEa`FEa`FEa`J`FEa`FEa`FEa`FEa`FEa`FEa`FEa`FEa:@      /33/9/33333333333103#5!#3###TOON 0@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG 4@    //399//33332332310#'77'*TT~~~ݵqqp .@    /3/9/33333333103#5!3###TONU= B@" Y ??39/]3+33933333310#5!533#3iPb({2 ?=K@)Y Y Y?3+?+9/_^]+9333310 #"/332654&#"#!!6!nqB1AR.-FFw̓\SZR5K=/@ Y?3+9?9939310#5!#!i4ǣSM/  GI".d@7)#  /0,,Y ,,L,\,l, ,, &Y Y ?+?+9/_^]+99993399993210# 5467.546324&#"3264&#"3265A;@NKA:@{|+97%%79+!.../ vB]hQssPi]CborUVVUSLLAKKAEKKZK@+  _/?_o?3]q23/222]9933310632!574&#"!57'53sMS]93+'..477@WO22<28n221@E%A&!@*(LQ@j/}@G$!&&- ((- 10_Y_Y '_Y _Y ,/_Y /(_Y/_Y/?++/_^]+?9/999+3/+++93333333310%7"5432#'&#"'5!#'&+373#'#32?3!J`qr*LIjHHΉ<&L =X0AЭU= hk d{+*06@[&'43.-   16 + '87.4-13 "66_Y "_Y&?22/3+?393/3+993393939393310"'#7&'#7&5!37373#'&'326?3&'/D@)l/"<9lHia +l,e/l5XJZ(1CQq0 [Z22v0q22yT"Xe} <)#1;(!B d+L)Y@."" &&+*_Y% _Y ""_Y?+3?3+99//993+93333310 !2#'&#"'5!>;#'"6?3/iaZzw MI68->+e [Zf=XeCZiz1Bf{`=`T#1#=@$  ! `Y_Y@9H@i  / _ o   _Y `Yi _Y?+3_^]_]]+?+39/_^]3]+]2+3+39933333933103'5!#'&+!73#'!3#!575#0^ byYYoZIیxfIIRL,@.+**((#" "  -.sYsY@/ H@*?O  &sY"" " wY ?+9?3_^]_]+9/_^]]3+2+3+39339222933103#%!57654'#53'#53&54632#'&#"!)4XGʛ6e:%<|W+W^  fe>s@{>x}(1efehO5X_e70l@9  '',, 21/-_Y/' ,*,_Y* RY $RY?333/3+3+?33+3333?+933333331076323632!574&#"!#4&#"!57'5!Do=BB/T^uB T^'FBBB=%)-0@U-++/('#.&  21_Y _Y*&# -)"_Y.0     _Y??+3?399//_^]9222+333333+33+33993333333339339910#!!57#535#53'5!!'5!3#3%!'#35#%3'u:#h)ݬxO~IIeerI+rIIeeee=PY@YV Q B&4:,II4QZ[n[L[\[-[=[[ [[[[[[[[[z[K[[[k[,[<[ [[i[@ehH[[[{[[[Y_H[[TWH[OSHY[;[K[)[[FJH[[[[[}[K[[[k[ [[9[9[[[[[[[I[i[y[[;[)[[ [[[[K[k[{[?[[[[[[[[[ [P[p[[ B,7LL*NYr&T&d&C&$&4&&& &L7?NY|:k:\:;:K::*:: :77NY@ V@ `Y   U`Y_Y _Y #OY?+?+3?++99//+3+33/3_^]_]]]]]+?3_^]_]]]]+99_^]]_]]]qqqqqq_rrrrrrrrr^]]]]]]]+qqq++q+rrr+_^]]]]]]]]]]qqqqq9333333333310"&5#5+!57'5! ?33#327533254.'.54632#'.#"#"&'4&+326wwetp{Yf JUyj%*6B!6fn.ZTM,fB F#*5 6^nR85Hf$(xlmq'cVIIvIZ ^C@MWR"8U@duP!$%#f[lu2Ġ# =&5V@ $$P$$ H$+]qq5='+/369x@C+4*/7.&;:'"_Y7496 _Y0,(/+_Y /4334 $ ?3?39////]333+3333333+33333+33339103#!!###!5!'#53'5!!3!'5!37#37#3'#7#7#9ʡ{{-@ʁuZE}+nuYmJ.d7ZJ! heeeerIIcrIIq+))X!CY@C*1<<*ED> >&&>8A b>.iY>_iYa?+?+?9/9/9333310!".5467632;2654/4632'"&54&+"'"'&!2XT-. 0P= JH ,M>? {K0*>) 3ɢ0=? f702|3(@"-@E!!(# /."NY"OYNY)++OY(&&PYRY?3++3?3+3?+9/3+3?+9333333333333105!#"&54632&=#535'5!3#!327&#"8  %$_Y"!!  #     `Y ?+333?9399399399399+393331057#"#!#'&+77!57575+3][\S1;paw`p`r`p`!IIVaparGi&8FR\@HSA#9M//0G'X '09S ^]A CCP[[_Y<<_Y6J`YSU U_Y6 ,, 60*?339////+99+3+3+339993333333310!"&'#"&546327>756%>7#"'!67>324&'3264&#"326&#"32YVJ>_Vh}c210&@S6oQ">wWh5VuȦS>' 33.m''u6`9?;fqcd3*.:4+-9.6(91$V48;1SCIW ζE ?(m]>W74-o;^b%V}O)YdhUXhl$#!HL 0a@4- 0 & 21 ##*`Y&#0 `Y??+9/99?3+9/9333333104#">#7&54632#"'5332654&'Hk.=.18?ux}0OyVxjL'ȣ`L@+5A18FNXUxp;-Н _tʫRreVh = %+1@`1&$ /'%!! 231`Y0 _Y$ #_Y&P ` / ? O   111  1+`Y_Y  _Y?+3?++9///_^]^]]]33+3333+33+99333333333310!#!57#535#535'5!23#3%'!!%!.+267!XFŬO/R<>YIwkOSeqVIIezeIve1%$e3zJ=CEdd")i@9 !!&"#"+*_Y" @ _Y '`Y_Y @&`Y?+?33++?+9/+39333333310$%53#'.'67'5!#cLfd ZDchbBif g0Bk4̮0@pJJL#/-H"&w@F  $%! #  (' _Y#&_Y ?O "   _Y?3+333?399//_^]33+3333+33933103#!57!!57#537#5!!!%! !'!x.ɣf|hd/",zeII`II`eze@eevz,pL4b@8056_Y_Y2*-/_o --&_Y- _Y?+?+9///_^]92+33+39910!!!26?3# 47#5367#5!>54&#"#6323EfN?\+-XZo Im-bg6~f-YǭtU?3#[TfZj. [Yffe5Rd9Vp;'!,.W b8tR3W@3 .!!' 54311Y$[$+Y'$$ Y [Y?3/+++?3/3+++393993210#3!"&546324&#"326#"&54632#'&#"327 7;8237:8#v?tq6#2>FV_ehIfz|y% S&D@!$  '( $$ $$ ?3?9/9993333310%273#"&=56746324&#">!Ew~OqkUjrH>787uoN՝I [fvl{iwGG'z='+@U ($ ),-&" +  (+#  _Y *_Y?3+33_^]_]3?3+33_^]_]/399//^]]3393333333310'5!#!57'5!%#"&546324#"32!!)ݬu#7QfaafII&"BIIvIxXR(8@P-%  59:Y%Y$Y%?%O%%%@H %% )Y 1Y?+?+9///_^]+]q]+3++399399333210#"$54$3257'5!2!#4&+326"32$54$=@%LT^s^TxnZꡡü@A:7zr:7ZIT椣塡S?-@V!'  #,,''./& Y"',Y*p!#-G 5  G 5  /O/?/]]]?3]]3]]3]22+333+399333339331057#"#5!#'&+!#!57'5!!!57*?4GGGZ!gggOBggpl< l<<<<<s<<J;L){@B$##  !!'*+#$_Y_Y! +o+O+]]]?3333?+9/+33?99333333993310"!3;'&54! 32?3!>54&͖V=Pmz]\{mP=VʱPi""iϰX|HP@,! NY  NY NY?3]]+/+9/_^]+99333310%#"&54632!3267.#">`ۘ5QRa3Vu|8DhK5Au3 h>|@@,92&   &9@?0-) )) ;  ?3/3?339///3333333393992233993333310#3#573!57'!!33254&'.54632#'&#"!"&'vt<=]LJ5d8AFmV>$uj5HH>9)CI$ICV "@    /2999333105673&'#CI$ICV9>HH>9#d^D "@    /99339310&'3#67!59>HH>9#CI$ICV "@    /299933310%67#&'53+CI$ICV9>HH>9d^D2@    /993393339310#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC2@     /299299933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9H<@    /2992999333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>9D*G@&$+,RY  NY '/,]??3+/_^]+39333310 #"&54632374&#"'7632.#"326H|܈]"ky$iONsyN[ahYQp펻.cStT!#\y|H@    /       o _ O ?       ?  :      _ ? /  _      o   ]]]]]]]qqrrrrrrrrrr^]]]]]]qqqqqqqqqqqrrrrr?33?39993310)5!%!;"aXLA=<@   _Y`Y _Y ?2+3?++399331057'5!!57!X魭kLJ)IIJJJ\L9=M@'    `Y    bY ?3+9?39+399393322310!2$73!5 5!#'.%d~g+!MV6=eV>#{cqg0  k)ml`$@ Y?+9910!5$H=ZK =@  [D            j    t d T D          @ 4 $       t d T D   :    T         d P @ 0        p ` P  ]]]]]]]]]qqqq_qqqqqqqqqrrrrrr^]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]qqq/+9310"&54632Ea`FEa``FEa`FEa3bT@b   o O  o O /  O /  9       o   o O /  ]]]]]]qqqqqrrr^]]]qqqqqrrrr/2/9/993933210##5! 3okרZ=P9z".@)# /0&,#P 0_0O0?0/0000o0_0O0?0/000000_0O0/000=00_0O00o0O0?00_0/000^]]]]]qqqrrrrr^]]]]]]]]]qqqqqqqqqrrrrr/^]3]29229939210#"#"&54632>32%"32654&.#"326z֓B`o?BlSB>Yc;]`}yhTNӰۄ~}k~z쌏}~`@ //3993103!!^j8^@  dP4D@ vzH4@orH i@ _cHP4D@KRH4Tt9@;DGH 0p  P`@` /2/3^]]]qr_r+^]]+qqqqrr+rr^]]+]]+qqq9933104>32#4&#"tтwgĠ'@ ()!$$OY OYb)R)D)4)$)))))))))))t)f)V)D)4)$)))i))))))))t)d)T)F)6)$)))))))))))v)f)V)D)2)")))))))))))v)f)T)D)6)&)))9)))))v)@lf)V)F)6)")))))))))))p)d)T)@)0)$)))))))))))p)`)P)@)]]]]]]]]_]]]]qqqqqqqqqq_qqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqq?+3/+3933310>32#&#"#"&'5>733265cFYF95F eFR E:5F jx BAF|Inr  _E{,!8A'aa@Vv@I   YZ j      Y  u//]3/]]3q2+33/_^]]+399339103!!!##5!!5!ƺ+I fH >@"   `p//^]/]]9/99333310!5!5!5HHHV >@"  Y[[`/]q33++/+993333105 !5VHZԏHV D@%  [[Y/+/_^]q++3399333310%!575 5HHsr,Z3 @  /2/39933103 %! {RVf@ Y//+99310!#Վk%"@  //399310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //3993103#"&546323265";N2$! =/'5)%3%Y?+33105! %H@ ??93103#HK"@ Y?+?39310!!#(in"@ Y?+?393105!# (%%HY??+393103!!Hn%H"@ Y?+?393105!3 %H)@  Y??+?3933103!!#iHnnH)@ Y?+??3933105!3# %K,@ Y?+3?3393105!!# i%n%H,@ Y?+3?3393105!3! %nH 7@    Y?3+3??339333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH @ ?2?39933103#3#ّhHK Kj 9@  YY?+?+?9333310!!!!#(iijב" -@      Y ?3?+33993310!###בnn#j ;@    Y Y?+?3?+99333310!!#!!#htjo"j 9@   Y Y?+?+?33933105!5!5!# i(qב) .@  Y?+3?339933105!### ܑב%nj ;@   Y Y?+?3?+33993310#!5#!5!ґttj)F)ޑqH 7@    YY??+?+33933103!!!!iH"ב%H *@    Y?3?3+39933103!!33A$Hn#nqH ;@    YY?2?+?+339933103!!3!!ّK$hH"qH 9@  Y Y?+?+?33933105!5!5!3 iqב)%H .@  Y?+3?33993310!5!333$ב%nqH ;@   Y Y?+?3?+33993310!5!3!3!5!$KqFH >@   YY??+?+?339333103!!!!#iiH"ב"H 3@     Y?+?3?3399333103!!#3#AHnn KH G@    Y @ Y  ?3?3?+?+9933333310#3!!#3!!jt " "H >@  Y Y?+?+??339333105!5!5!3# iqבKH 1@  Y?+?3?3399333105!3#3# 㑑h%K#KH F@    Y Y ?3?+?3?+33993333103#3!5!#!5!A㑑tHK )ޑj @@   @ Y Y?+3??+333393105!!#5! iiq"h 4@     Y?+33?3339933105!!### ב%nnj I@  Y Y ?3?3+3?+3399333310#!5!3!!#!5jtttAޑ"בqH @@   @ Y Y?+3??+339333105!3!5! Aّ"%H 4@   Y?+33?3339933105!333! ב%nnqH I@    Y  Y ?3?3+3?+33993333103!!3!5!5!AH"oHV@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# iiiqב"ב"HI@       Y ?3?33+33?33399333333103!!###!5!33AבHnnnnH b@    @ Y Y ?3?3+3?3?3+3339933333333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#3#3#3#3#3#ghhhhgghhhhhhgg`hhbhh hhahhahhhhhhgghhahhahhhhhhgghhhhhhgg`hhbhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhh"bbbbba```````````c```````````c``````aaaaab^^^^^baaaaa``````bbbbb#`````b``aa`T #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKO3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQ!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  /993310!!!7L17}1mi{/9910!!imi{@  /993310!!!iLPbh//9910!!hL//9910! XVRZ//9910 7L//9910 LRZ//9910Z79e %@  /2?399339910!# 3 #R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow@kPhhTl8xx<|(pp,t ``$dHH L@@D004X\4DLdt|l\ JrrNvBzzF~2jj6nZZ^RRV::> **.v~n^V>..>V^n~vf&fb"&/3/39///////33333333333333333333393333333333333333333333310#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @ /]99102#"54>jnrotjlw)@  /9933103!32>54.#")vwvvvwvu}Avvvuvvw)#,@ $% /993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @  /993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:o@@:6+% %;<("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332933333310"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7<@$.#5 # 8910/+*?*O**/^]]]]]993310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'J@'$$  ()P /^]2/]32993393332210.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8D@#0,!'6!'!9:,*3$$$-  **/^]]]9999333399310&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<4?@!/((5(6$+/     //99//]9233999310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@  //999910./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @    K  /]999310&&'6H zDS%Ut}FiGfY;.@  //]9/9933333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt `@4 !"VC 6% X ///33]33^]]]]33]]39933333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu8O@,    !   //93933333333333310##57573%377~~~.~^[[[[0F^^J\J=m@;  ! _Y _Y _Y    _Y`Y?+3+?99//_^]3+33+3+39333310!273!57#535#53'5!!!! dRZ&IvkIhhoIIhh(\@ OYOY@ H  NY NY ?+3?+9/_^]33/+3+3+39103#3#!57#535#53'5!eeeegfdddd`XhJhBBhJhB#=&/# = Z@1"!`Y `Y  `Y _Y _Y?+3?++99//3+3+9333310!57#535'5! !4&+3#326 F¬OwOS~VII{I\{#F='_@4  $ )(`Y$`Y$$  _Y #`Y_Y?++?+9/+3?+393333310'5! !#326?3#"&54&+326Ϭ($fN[E*FY(P|IRI86^` u׀B.")-0y@B- ..''# 12+*(% %QY.(NY /.    . . !@ NY NY?+?+?99//_^]9999++9993339310&54>7&#"#5>33!'#32775 Qb!7Th&BJ6~p^9DR.|nDPEDD% (g~>4u o0BH& #P''jk @.B@!  QY OY  ?3+3?+39/993310&5#5?333327#"'7# 5{uwp}6,5M@     `Y _Y?+3?3+3?93331035#"#!!#b]Y "}raQj,(`8@  NY NY?+3?3+393310!#!5#"#!!` ik8hHPd-%1I]L ?@! ! _Y `Y`Y?+?+?99?+9933310"3267&#"$5!273!TJ.p~I]ur%: %172Vg'I7@ PY  NY ?3?+3?3+933310'&#"#'5!>32y/(&?ywBp/eSO}/@fBBuoL9@`Y_Y   ?3?9/993+3?3+9910#'&#"# #'5! 3>32P"25C:y{DuZ:};.aO!'RE;IIP9@ PY NY   ?3?9/993+3?3+9910'&#"# #'5!3>32>/()DyyFp_ِ&hSO}-AfBBqs K@* "!NY NY ?3?+?9+39333910#'7&54632'5!654&#"Dyկ+0t_f~n3D <ZZ[tSbsUE_jBB2%I94$##=O@)`Y   _Y _Y?+3?+39/_^]+99333310!!57'5!!73#sGiYY{IIvII<6W@1  NY  O _ o     NY NY?+3?+39/_^]+99333310!57'5%!73#'__ ~&KK&BBBB]I 6@  "!OY OY?+3??+933310 546746324&#">}RIem3>6.kj\ EĹjd 2zy,@ //99]]993310 55yGGܱ$ܱ$0* /9/3103#2#"&546O/HF10FG*xD30FF01FKx% /29/10'7"&54632[6[n0FF11DF[6[F02EE20FD+  /3210!5%#"&54632DxG00FF01F 1FF10FGU /310!53!{v @  //9/3910!#!53[McS7{v @  //9/3910 #5!3!M!7S  %  @ H  //9/9+9310#"&54632!#`FF_]HG_oEa`FF`a)  "@  H  //9/9+9310#"&546323!`FH]_FEaonzEaaEF``9M "@  H  //9/9+9310#"&546323!`FH]_FEaonEaaEF``VB  /32310##5##!B<wBw /23310)33533BTwI"@ //]3]2991053#'LI!%! 4@  Y @Y/+_^]+933310%"&54632"&54632TF__FEa`FF_]HG_``FF``FEa`FF`aEEa"@ /3]2993310!5!5AA"V^=@ ?9/9310!#Vp=!V~=?9/910!#Vo=A-@@/o Y H/+3+_^]105>54.54632륝LI#+#I?EQqE6, '!/:Xi"%!57!!57#5754$32#'.#"!gfgf> @'F,DZBBBBE'Q ru` #57546323!57&#"3#!57˺CgfVH=?qfDE'eBB-thBB3&  @P'@''@'0'']]]qq5R @   /3]2/10#"&533265RGHDK㐡K[YM3'&  3^yf} V ^ N#HZ'h(@  kY_?+39310!5!3!'3w{eN&=N&N&'R=N&'R^&^&^&&m&y&Yf&JYw&BY&+YVj& @@>>>>@ H>+]]q5& 9qN& Y}& V& /T&#&b-&^|////]]5Hq&jI=&|1&q{&3N&YN&R#H&yYw&&}& =& SS@&;;C5UT?$Gb&;1;A jY1_PiY_ ^??+?+3?9993331047654'.54>32;267.54632372.#"#"'.'.#".!% /, %W*)1)'5}# ,ah491=]6< "j#;+2O ?({!+)5*SP ;B!;+ =Qb99#ggNXS3L .D9#Z lwR9C&_TX(!/o2 /210# #6$!3Ux~ mw2 /2103 #&$+ xY2yk @    /]29310.#"#>32`F\l8!ݸw)'35@  /3]931032>73#"&'aE\l:dNX**0jm?" !%)/AOW_jv@ qe*k`MJU]]FPJXB43:??<3BJF`*e + x"..+''+&&#++w #.,]7ttF0b\UnhhGR ?3105>54&'&54632Pb$CO=He/P[0"I8:\`#@@Y/]3+10467#"&LI#+#I?EQqE6, '!/:XX^CX^CX^C^Tv^Tv^Tv+ /233104&#"'632#5>3*HFZjQ[pE0"c;U 2x+ /233104&#"'632#5>3*HFZjQ[pE0"c;U 2xX + /233104&#"'632#5>b3*HFZjQ[pE0"c;U 2x``'`^u/31053ɬ^Tv^TvX^CX^C++``````u ?u |u u Zu `m!u ^8u u~u u z.u kfu WRu #u :u +````- "@ NYNY?+3?+910%!57'5!gf`ZBBB:!-@ ;@ H?+/_]]]+3]233105!"&54632!"&54632t%<9()67':9((7:7*(77('::''87(*7>  /223210"&54632!"&546327573%<9()67':9((7:>d>7*(77('::''87(*7!%@0  @  /22329310"&54632!"&54632#'537%<9()67':9((7:۫L@7*(77('::''87(*7!!}}@ /323310'53"&54632!"&54632 dj%<9()67':9((7:"%!7*(77('::''87(*7w:51@ +   @ H?  +   /_]]]+]q29/105!4632#"&t?R7:ML;9P9JL75NLB5@   /3239/33105!".#"#63232673t-K?6') _.J?6&+ _!&3%0 &@ //393933310!#!5!3e*\* &@ //393933310!#!5!3e*$E &@ //393933310!#!5!3o ZZ"@ //39933310!#!5!3o DM"@ //339/393310!# 7 3f\>Ha4R $@  //39/3933310!#!7!3bG4oaRM$@ //393933310!#73_J^rM $@ //393933310!#5 73fS܈kh/iF @  //39933310!# 73pZzfjFp$@ //393933310!#73p^ZHd(5"@ //339/393310!# 7 3RkGHyN!5 .@ //39/933933310!# 7 3Rka.K- O $@ //39/3933310!#!7!3xtdH^- $@ //393933310!# 73`vcFFH @ //39933310!#73wp=Dg-p$@ //393933310!#73pEsHVH!$&@ //339/3933310!# 7 3=|GHY2#% &@ //339/3933310!# 7 534~X4(5f% .@ //39/933933310!# 7 3C{sVH2}q' $@ //39/3933310!#!7!3cy Q2X/"@ //39/933310!# 73HԈG7%p @  //39933310!#573p={H\2#$@ /3/399933310!# 7 36}MH)Q0) $@  /3/399933310!# 7 530~YAuO/l6 $@  /3/399933310!# 7 3ON,qS-m6 *@  /33/393933310!# 7%3O~t8S-{0@  /3/393310)733+NS.)p @ //39933310!#73pA>S.)O@  //39/9310!#!'!ataoL *@ //339/93933310!# ' 3[H5fy4L *@ //339/93933310!# ' 3UH)hy?L *@ //339/93933310!#5' 3SHhy-^"@ //339/993310!#' 3Q6fy=Lp"@//39/933310!#'3p^iy @  //39/393310!#!5!3pT; (@  //9/933933310!#!5!3a.izT $@  //9/93933310!#!5!35$$@ //9/93933310!#!5!3?P(@ //399//3933310!# 7 3h`axbVL 0@  //99//933933310!# 7 3e`;H`GF &@  //99//3933310!#!7!3fb*]v\^L&@ //9/93933310!#73^'c{L"@ //9/9933310!# 73e[؈scSc[Lp"@ //9/9933310!#73pd]?de[/(@ //399//3933310!# 7 3Gu7TaF?9 0@  //99//933933310!# 7 53Rv8HqGG? 0@  //9///33933310!# 7 3Nw]sX=U8H? &@  //99//3933310!#!7!3mwo V=2?"@ //9/9933310!# 73\w߈5:=?p&@ //9/93933310!#73pWw2-B=+6&@ /33/9/9933310!# 7 3O}4H) 0q5 &@  /33/9/9933310!# 7 53N}<Au 1[l6 *@  /33/9/93933310!# 7 3ON,q -+m6 *@  /33/9/93933310!# 7%3O~t8 -6@  /3/9/93310)7330O~ -Q5p"@//9/9933310!#73pM4 -zL@  //39/93310!#!'!owKzL ,@ //339/93933310!# ' 3oH Kz4L ,@ //339/93933310!# ' 3oH)S@Kz?L &@ //339/9933310!#5 ' 3oHu^Kz-L"@ //339/993310!# ' 3o6RjKz=hp"@//39/933310!#'3po~3232673%573{-K?6') _ cY.J?6&+ _ydo!&3oh%0!%oB ".7@ ## )[@ H/ /22]_]+q29/332310".#"#>3232673'"&54632!"&54632{-K?6') _ cY.J?6&+ _%<9()67':9((7:o!&3oh%07*(77('::''87(*7=  /29/10"&546325!/DE./CA? ;C00BA10C!%}0 7@$9 I (  o@H@ H/3++]q2]]9/310#'537"&546320۫L/DE./CAo!!}}4C00BA10C; !@ @ H/3+]22310"&54632!"&546325!%<9()67':9((7:t`7*(77('::''87(*7і98@ OY  NY NY?+3?+9/3+3910!57#53'5!3gf`BBIhGB_hKb&c'4,@*_*?***)&') %+5+5]]]]55Kb&c'S4,@*_*?***)&') %+5+5]]]]55Kb&c'4,@*_*?***)&') %+5+5]]]]55Kb&c'!4,@*_*?***)&') %+5+5]]]]55KbJ&c'9@4_4?4444&H&&)1 %+5++5]]]]]55KbJ&c'(9@4_4?4444&H&&)1 %+5++5]]]]]55KbJ&c'9@4_4?4444&H&&)1 %+5++5]]]]]55KbJ&c'9@4_4?4444&H&&)1 %+5++5]]]]]55v&k&4-@_?& %+5+5]]]]]55&k&"4-@_?& %+5+5]]]]]55v&k&4-@_?& %+5+5]]]]]55&k&4-@_?& %+5+5]]]]]55t6&k&7@_?@ H&%+5++5]]]]]556&k&27@_?@ H&%+5++5]]]]]55t6&k&7@_?@ H&%+5++5]]]]]55 6&k&7@_?@ H&%+5++5]]]]]55&w'40@_?&%+5+5]]]]]55&w'40@_?&%+5+5]]]]]55&w'40@_?&%+5+5]]]]]55&w'40@_?&%+5+5]]]]]55J&w'9@%_%?%%%%H&"%+5++5]]]]]55J&w'9@%_%?%%%%H&"%+5++5]]]]]55J&w'9@%_%?%%%%H&"%+5++5]]]]]55J&w'9@%_%?%%%%H&"%+5++5]]]]]55t&k&j 9=@)) ))@H)@ H)@H %+55+]q55++]]55t&k&j 9=@)) ))@H)@ H)@H %+55+]q55++]]55t&k&j 9;@'/))))@ H)@H %+55+]q55+]]q55t&k&j 9;@'/))))@ H)@H %+55+]q55+]]q55&w'j L@,///// //@H/@ H/@H& %+55+]q55++]]]]q55&w'j L@,///// //@H/@ H/@H& %+55+]q55++]]]]q55&w'j B@$O//////@ H/@H& %+55+]q55+]]qq55&w'j B@$O//////@ H/@H& %+55+]q55+]]qq55- 0&Lv %+5$DcG&N@*!'(#aY#!_Y_Y `Y?3+?+3?+9?+933310%#"&'332654&#"!57'5!$32cK+YF*E[am54&#"#5632!MvP):55%>qP,cjnwVqSthpOBEtndDliW_J %2@#\l| +A C?33?339/]]3310#"/33254&/57>54#"#563  wgA -6?L@>62o&,>f[OWhb1mz̈́FKSBHwLi cU$~ 3@ ,     @B??339/]]]333107#5!533#3ԨiPb({I{,@@ 6F$C?3]]3?39/99310 #"/332654&#"#!!6nqB1AR.-FF1w̓\SZRI$.@!zYi AC?3?3]]39/93310#"&54>32#'&#"6322654&#"{O[`Z>++8NAApy,".//,1O~́cw}ZXNXV{B@?33?10#5!#!4ǣS/ I".*@[,k,{,,, &A C?3?39/]33310# 5467.546324&#"3264&#"326A;@NKA:@{|+97%%79+!.../ B]hQssPi]CborUVVUSLLAKKAEKKI$.  A HC?2+]2?39/9310'"'533267#"&54632"32754&?oZ>+:8NAApyOB,".//,1IwtցcZXNXT/33310!5!#PK_9P_@    /]]23310632#'7>54#"KX_o \ $,"?B1jC;n*f-HO@( fv4DT H?+222?33]]]9333310)5!%!;"a^ @  /]329/310573#'%573Ld^!!!%^D@  /]229/310'#573%'53Ld^!!%!^@ /]329/9310573#'632#'7>54#"L3JHVF "03%^!!`3.U N" AB/@ @ H?_/]22/+33/333/3310'#573".#"#>3232673Lǵ-K?6') _ cY.J?6&+ _Amm!!!&3oh%0E"@ ?_/]239/310573".'33273XdVIc`N,b!%=i?*4^fE"@ ?_/]239/310'53".'33273dYVIc`N,b%!=i?*4^fE" %@ ?_/]229/99310".'33273632#'7>54#"VIc`N,b3JHVF "03%E=i?*4^fy3.U N" EB#$A@* ?O!  @ H ?_/]+]2239/]33/q3310".#"#>3232673".'33273{-K?6') _ cY.J?6&+ _VIc`N,bL!&3oh%0=i?*4^fCV& &CV& qN&  qN& ?&ZN&& V ^&@ #'3?-@ $1111!7=%7/333333]q22/3104632#"&4632#"&%4632#"&374632#"&4632#"&:&'98((88('98((88('98((8L8('98((8:&'98((8)78($::)88)$::$)88)$::pP)88)$::)78($::_@!@ /33]q229/310!!374632#"&4632#"&_HL8('98((8:&'98((85pP)88)$::)78($::W@ #@ ! /33]q229/105#5!#374632#"&4632#"&fXbL8('98((8:&'98((8uu}pP)88)$::)78($::K,<.#"#".54>7.54>3232>54&' F-?D&BX19X<E{dcwC4YvA8,.[[K]M'?,`t-% H8-NKM+2cnOos;8miTkQEPZ/*OrHtUC_wTa F$79:<;DGNVW]$$7h$9$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~             uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162 tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniF004uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFCnullpi1 cyrillicbrevecaroncommaaccentcommaaccentrotate grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.alt radicalex.xuni00ADuni0309UNI2206circumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildelamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BE x        bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.604D@- 8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz M L K J I G F E D C A @ ? > = ; : 9 8 7 6 5 4 3 H N < B:BJRZbjrz i h g f e c b a ` _ ] \ [ Z Y X W V U S R Q P O j ^ T d:BJRZbjrz       ~ } | { z y x w u t s r q o n m l k   p v:BJRZbjrz                            :BJRZbjrz                            J",6@   Tcyrlgrek&hebr2latn>kernmark 4<DLT\dr $,4 Zhl(z Zt ( !6! !!","\"""##L#|##$ $$J$n336:`=A\AdAn L $*06<BHNTZ`flrx~ &,28>DJPV\d2<222d22d22P2<22<2822<2<2x2d2d2P2x2d2<2x22<222<2<2d2<2d22d2<282222<22<22d2d2d2<222d22x2P2<22<282<22d2P2x2<2d22<222<2<2222 (  H" X &,28>DJPV\bhntzX000XX00XXX|0000l0l0    L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz2Xh2hT2Th2h020h2h@2@hX2XhX2Xh2h2h2h2h2XhX2Xh2hT2Th020h020h2h2h020h2h020h2h2hX2Xh2h2h2hX2Xh2h2Xh2h020h2h2h2Xh2hX2Xh2h2h2h2h2Xh2Xh2Xh2hT2Th2h020h2h@2@hX2Xh2h2h2h2hX2XhT2Th020h2h2h2h020h2h2hX2Xhhhhh2h2h2h2h (  HFLRX^djpv|<F<<FFFFF<FF<x. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzXTT0066XXXXTTX``XX00 XXXXX00TT XXXXXXXXXbXTT0066XXTTXXX XX66TTTT (  H jpv|-(2<2  !<  !J`  J`  J`   ! J`   ! 4<4J4<  !4J  !Jl  Jb  Jl    !Jb    !n L $*06<BHNTZ`flrx~ &,28>DJPV\22,22,22,2,222222,222,22,22222,222,2222,2222,222,22,22<22<22222,22,22,2222222,22222,222,2<22222222 (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\222 22,2222,2 2 2222,2h222 2 22\2H22<222222 2222222222<22<222222 22,222,22222h22 2 2\2H22<22222 222 2 2 (  H FFn L $*06<BHNTZ`flrx~ &,28>DJPV\\4X888884 X84 (  H ( >     $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(d 0B`rJ8f &, .8bl<Nx NLn h   F p  : D ^ | * P  >dr $79:<;DGNVW] 7h9:DJPV\`222 222022$22 2 2 2222222z2z2222H222>2>2222`2 22 2 22H222222`2`2`222 22202$22 2 2 2222z2z222H22202>2>22 2 2 2 2 (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\T0XX,X0,XXXX0XXXXXXTXXXXX (  H flrx~n L $*06<BHNTZ`flrx~ &,28>DJPV\22T22022@2X2X22222X2X22T20202220220222X2222X22220222X22X222222222T22022@2X22222X2T2022220222X2d22222222 (  H:@FLRX^djpv|(F@((F,<hF@FF2FF2xn L $*06<BHNTZ`flrx~ &,28>DJPV\T0XXDhXX0XX0hXXXXXXT0XhXXXhh (  H flrx~##,,,||| p\ =ȃ!openscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSerif-BoldItalic.ttf0000644000076500000240000132456413402025764026457 0ustar kintelstaff000000000000000FFTMWQXGDEF}t\GPOS}Af,C*GSUB͊]HOS/2`cmap!E*d6cvt d6^=pfpgm~a0gasp \glyfChlheadw<6hhea Et$hmtx)(Lkern3ՌlocaV @H(Pmaxpz nameudl post|s`gOprep>!8P u_<̓I̓I v!EW vd  RT/\qu3,%3Lf  Px!1ASC! kF3!`= 9qp929eg}+9G0FV%Eev0VVVFVVF9VJJVs%VxVi39g0s(9499-9's* n*9>sKV3VL{cH%W!XPr+W3dUf(f)#hfKf}@-c0VVVVVV_VFVVVVJJJJJi00009/9/99/#s*     ddsKsKsKsK3Y3VVVVFVFVFVFV0V0V0V0V0FFFF9s(9s(99'9/99/k49V9-9+--9s*s*s*ES*J J J G-V*VV*s%s%s%s%9@>9 sKsKsKsKsKsKVi3i8VVF?QVIVFR(9-V9,Ud*JJK #F N@ns- x9_9>3KM:i3SVS c  r- *V9/J sKsKsKsKsKVV_FFVJ J SV9 Fs*V_VVV0V09o9/J J VV*sKsKs%99s(>QMVV0J J J J i39bs*99VVF{ ZV;VV9GKV*391HHa69 ?!sKs(s(99N`K999-9K9K9'ss*( [ +g di!QW @99sa"cV KK3KJ  9`KK+>->;>e-!- ,ssN8N8~8t(#+9qpUU2E2e>>qW%lly3 ^Z[oEi2rbb]` VT ]C^^..1J^`}oz66KEBB55B+{oC?{F {7#%z2{V71pS0Oy5UV7) H9(VVV9JVVFJ9iPFVfimHd*9NEmT  H.d*'M9N=.s< ^:P;*E!XT+9/E E+E8l  J VEJV"2S-i9UshyOS@(c?&5F_7-9Jq!qYVFJV VFV VVBFs%D}m99VVweVX99m}9J9VFCV9  S5s2 #0sKsK*{q6 s*n9'3 sK3#KK7&11R400/(%*R949/9F6s(*sK3sK !FV*d6Y[ZXr 6fRXTJ 5xH5xHJ J rFt) !FVFQ6+09sKan5 5Xm*m*m`9q66 .EVF9'i7iV94s3#3#s(&s&sXm,}9q69q63#{9-VV_V0IIXS.9sK9sKJ J J 5R3333#1VV_":v{ZUv()F"'7 }JV\FX7{1`J}77B )779N1#%q T;D/ohdD N%=Z+1HhTooD DKI@KK9  *RJ.} -6;"+^K0#^Y 6f%*V\"2U_'>%]coh4L)*I7-vdGJ2UHreFe_eF]Q{h@6\6Q&J&(I![1:E?h4XJ*EX^XWj_cKU0JI[4aQdL[c[LiK 9sd9E?`9na99's*n*x.HH94sKe_?IC&(.NC]]y]']>]p]Q]llFNvNDWXJ/f`c+ c]cmN NNXc,, yVVVVVFV0V0VVV0VF9s(9s(9s(9s9s(999/VVV999j9=9'9'9's*s*s*s*J J J J nnV*VVVs%s%s%s%s%9>9>99lsKsKsKsKsKVxVxVVVVVVVi3s(9>V3VVVVVVVVVVVVV0V0V0V0V0V0V0V09/9J J J J J J J JK JK JK JK JK sKsK3K3K3K3K3Ki3i3i3i3mmmmmmmmVV[V3VQVVHHHHHHBiAiAd*d*d*d*d*d*d*d*+iL#LKLL#LpLp9N9N99;9,9N9N9N+iuAuiuuAupup      0nAiWWAEEEEEEEEi;(;;a++++++++-PPARRmmHHd*d*9N9N  EE++mmmmmmmmVVoVGVeVVd*d*d*d*d*d*d*d*+iL#LKLL#LpLp++++++++-PPARRmmmmmmmVVVVV  Q]d*d*d*d*d*~De~eD9T,s9N9L9N9N9E9EI~D|TsEEEEEEiifi\\3+++++W~0~09U L#d`aM.@kqpFVff0fjf.Ke6X6AVFVF9'/+)V [[xFVsVFkRX%;X !8U--)DDX\VhdGa1dKdjfdjdjf"g{mmb))s+kUFQ@;@<fB9-V9T9s(VXKH4j!20Kh`s99}ssooo#%qdDh?###%q ;hdN%=Z1Hh TZ#h^uiX^^q^^^^^^^mzf#:^^^^9/WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWW/u9mmmmmmmm969696969N9N9N9NEEEEEEEE9N9N9N9NEEEE94EE ++s>hh#h#h#hd#'KsK,~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A\eeehg`N_UA=@U@BUC=BU.=U=>U<=;U;/;?;;;>U0=/U/>U-=,U,O,,,>U?=>UJHUGG GGFAF=EUEHUI=HUP/@Fo@_3_N3?O332 = @ U=U=U   F @/U<0P݀ݰU<_3@u F@@P`GG+Ͻ_o@ F_?N/??_4 @3__0@Л@ 3G? `0@Ж `A @P@)p33/_ @ 30@P@ F3@I FwN<vvv[vu_ t`s_orrrrqGon4nG2U3U3UFb4_4A  @Fa_4`_4_O^^/^^^[Z+`ZZZZU3UU3U/?_SSSQoNNNJJG IG3OH_HGGGG/GGGUHU3UPU3UU3U@3/_?TS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYsst+++++sttt+++sts++stuss++++st+s++++t+++++++s+++st+++st+++++t+stu++++s+sts+st+sts+++sst+++u++stu++stusts+s+++stu++sss++++++++^s^s++^s+++s+++tu+s+++++ssssssss++++s+++s++++s++++++++sQ=o=LL 3Zd|3)7Z}dn Zdn}UV 3Lcyq13FqULZTLfoj-K {h ^^j 9jKZTKp@IR{dVh|HjgaAQgnx6U % 42$ U4Kam {d/ '  tL D d H $ \ L d0d<| xLx\` ( !"4"#p$8%%&'(),)*,0,--@--..`//0p1L223455669T: :;|d? ?@DAABtCLD$DFpFH I JKLMNOxQTQRRRU$UpUVWYZ<[[l[|\\`\]p_`DbcddDddde(ffgg0g`gggh$hXi$iTiiijjLjkkl lPllmxntnnoo4oloppq qPqqqr r8rhs\ssst tPtu,vv0v`vvvy y<yxyyzzHzzz{{D{t{{||4|`|p}}}~~L~|~~~,XHx P@p(T|8h(LpD<t4t4d(T `PLL| <p $TDt,`<x4D|8\HXpD|X(|(8ØTƸ|8ɸ0<Tl˄˜˴8X|̠0Xx͠HX΀Π@ (LpєѸd҈Ҩd|ӔӬ$ք4dה׸$Hlؐش Dhٌٰ@dڈڬ $<T$(<@$\@0Tt0@||4xh8T(l`@Tdt 0   h 0    p` p xP@ !8" "#X$P%L&&'8'()h*@+, ,-`../X0,01234<456x7L89;d?@AhBC<DEEF|GGHHIpJJJJJJKKLKL0LLLM4MMNPNNNNO(O\OOPPPPPQ(QlQQRXST TU@UV,VW0W|X$XYYZZTZZ[[\[\\\\\\],]]]]]^h^^_ _D__``P```a aPabbxbcHccd0ddedef ffgLgggh4hhhhiiLiiijPjjkXkklDlplmmXmmnDnnno0ooop p0plppq<qr rDrrsLst0tpttuu<uvwlww{4{t{|T||}8}}~<~d\@`@(,d8(x h XhT@P`Xhxdt pT$|l4\,0@8lxL|@0x <tT(D@ĐĠX Ȭx˼L|L\lΠΰϸ 0` ِ٠ٰڴܘl8p<H 0DTd<(8HTL ( ,Lph@D<hhdX , , D  \tHl0Tx  P  !t#@%T&'(P)*+ ++,-./`023,4T5$56789:;?@BCCDEdFhFxG$HHIJKxLPM4MOOPPQRSTTTTUVWXhY`Z8[$[\]^l_P_`____```4`X`h`x```aa,aPbbbcc<c`ccdle eDeheeeeff<f`fffgXhh@hdiXjhkhldmlnho opqr rstuvwxy4yz{{|}~T~d~t~~~8  40 `$X<4| p<$\8\XTh4hPD@8 LdD$$xHt p0Xht00@xp`tXĴƐ|Ȱ\0ˤxͬLϜ|0xp(<רD٨h,۠H4lL߬l8\h,|pL0$ X,P4<     x p Pl|dt  !"t# #$%&&'())*@*+p,8,-t.4./0(0l001 1x12<2t2233(3@3X3p333344(4@4X4p444445 5,5P5p5555566@6d66667 7$7H7l7777778$8T8x8888899,9X99999::,:P:t::::;;;4;L;d;|;;;>4>L>p>>>>??,?P?|????@@ @8@P@h@@@@@@AA<AdAAABBBLB|BBCCDChCCCCDD(DLDpDDDDEE E8EPEhEEEEFFGG8G\GGGGHH4HXH|HHHII4IXI|IIIJJ4JLJdJJJJKK<K`KKKKLL@L`LLLLLMM8M\MMMMNN4NXN|NNNOO(O@OdO|OOOOPPP<P`PPPPPQQ8QPQhQQQQR R0RTRxRRRRSS4SXS|SSST T0TTTxTTTUU,UPUtUUUVV(VLVpVVVWW$WHWlWWWWX XDXhXXXXYY8Y\YYYYZZ4ZXZ|ZZZ[ [0[T[x[[[\\,\P\t\\\]](]L]p]]]^^$^H^l^^^^_ _D_h____``@`d````aa8a\a|aaabb$bHblbbbbc c,cLclcccddHdtddde e,eLeleeeef$fPf|ffgg,gLglggggh h,hXhhhii4i`iiiij j,jPjpjjjkkkkl4lmmmmnn(nLnpnnnoXopppq$qTqtqqqrr<rsLtt<t`tttuu,uhuuuuvvw\wwwx x0xPxtxxxxyTyyyyyyyyyyyyyyzLz{{ {P{{{{|<|}}`~~`x$8|8HHDh hHX$8`HPX|0`L` LD<\|Xh |\8`h8¸ƈǠ`T0t̨`͠4΄$ό,АXѼ҄<ӬhHհ8֤אhdTۀ<lܜ,(`P|44TLH,xPltD\<0D ht0D$p(X  `     L   t   8 $dXp(@Xp4Ld4Ld|Pxx$dt( 0\l| 0DXl,@P`pT !!p""p"##d#$ $X$$%H%%&P&&'8''(H(()4))*8**+ +h+, ,|,--\-..X.//h/00T011t122h233t344`455h566\667X788`899`9: :p:;(;p;<>d>?$?|?@@l@A,AAB$BtBC,CCD$D|DE(E|EF4FFG GdGHHxHII\IJ JhJK KPKKLTLLMDMMN8NNO(O|OP$PxPPQ8QRRSpTTTTTU U,ULUlUUUUV V,VLVlVVVVW W,WLWlWWX$XTXXY$YTYYZ[t\\\]0]^T^_```\a4ab bbccdde|ffgxhLhlhhhhhhi i$jjk<kll=@   [tdT@4$pdPD4$itdTD4$td4$t`P@4 9tdT@4$@MtdT@0 td0 ]]]_]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqq??+9/933310#!"&54632_<+Ea`FEa``FEa`FEap\==@"  ?2]qr299333333103#3#TT=#=b@ !  Y  Y {  !!!t!d!T!D!$!!!!!!!!!`!@! !!!!!!!`!P!@!0! !!9!!!!!`!@!!!!!!@!0! !!!!`!@! !]]]]]qqqqqqqqqrrrrrrr^]]]]]]]]]]qqqqqqqqqqq_qrrrrrrrrr?3?399//^]33+3333+3333333333999910#!##73#733!33#3!ɔgeghee{{ss{{d")0@?'&"-. !"!# * 21-& 'sY@ H@H. .sYP"! ?233/]]q+3?3/++_^]32+3999333393339910#'&'#7&'3.5%734&'>ɐ}8Y>KRm@&fԤ@X w[an?g57CWapB4K]dJ!. KRd|Ql#Dh/CGbWh?b.2AZ$ jAR(5@)#/  #76&2Y!&[!+Y!Y [ Y 77}7o7V7677 7777777v7f7I7;7-77 7g7777y7k7[7K7=7$777777{7f7I767 77777777i797+77 777777777i7Y7K7=7777@;77777d7T7+777777t7[7O7?777^]]]_]]]]]]]]qqqqqqqqqqr_rrrrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqq?3+++?3+++933333310#3! 43232>54&#"! 43232>54&#"` Bշ"R9\4(09X2 Bշ"R9\4(09X2f,BrTKNu,BrTKNu2 Q&0;{@F310' 1 6  + =<  NY 0'3##9OY#.PYNY?+?+?+99/+399339333991067'7!!'#"&54>7&54632327>54&#"KF}8ot  }.Pz evقYVδnTVJ)~iŎPuWK9JNNRuX?@@mX?xO=dj7Av,NkIrxKqs6rMT\h\=-@ ?]qr9333103##T=eL%(@  Y Y?+?+933310%&5467 SĵYvxˏhq:)d|ZgL'(@ YY?+?+933310765'7 zɱYL|ZQ,2hv_5 T@  P ?]]910''-7% xw<=~z@='y%1'D$ҳ&}5 E@$    Y @Y ?3+3_^]++99933310#!5!3!l`kjW-"@ [[/++933310%5>54&'&54632Wƽ8R,)GZETgj1\=L"!+SADl+`9@ Y?+99107!+!![/ @  [?+9310"&54632Ea`FEa``FEa`FEaE@ ??333310#3ƌYGR (@  tY tY?+?+993310# 463 4&#"326ܑY7EVy^wEhL5 xh01H 9@   @ tY?+3?3_^]29933310%!?7%3BnVVGUL:@  sYvY?+3?+3/33393310)754&#"#>32!9!2dQYFMW6TZN+la41bL)d@5$! ''!!*+*$uYsYsYP?2/]q+?+3/9/+93393339910"'332654&/?64&#"#>32[-\~8casq`UZBMW6fXѬ(E!sq y ef41wD X@-      vY\ l   ?3?339/]33+393393399239910#!733!6//˝!E "E=f@9   tY vYsY P  ?3/]q+?+9/_^]+39933393102!"&'332654#"#!!6Kzx-\d4(l,]z$?Z EFL&K@( '(#uY sY sY?+?3/+9/_^]+99333310"&54$32#'&#"63232654&#"˼ɴ76W @M/~wNKXk\HGb+4IЪxo)rVD=?@#  vY_?3/]q+9?3393310#!!!WDY#Or%R *T@* ! & +,((tYsY#sY?+?+9/+99993333339910!"&5467.5463232654#"32654#"uS_ š@NީjUfsU]nqms=#f4 "YÏϔ׽ȼK&K@( '(#uY sY sY?+?3/+9/_^]+993333102#"'3327#"&54>4&#"3276Lۮ̴6W A^}.wSGXmRJMj Kb+14?}(Ӭrp'aE (@  [ [?+?+933310"&54632"&54632vF_]HG_`Ea`FEa`t`FF`aEEao`FEa`FEa$0@   [[[?+++93333310%5>54&'&54632"&54632ƽ8R,)GZETgF_]HG_`j1\=L"!+SADl`FF`aEEae\@8Y? `0P` 0P',H?+]qr33]++9933105 e{Zԏv.\@> Y`O Y`?O/]]qr+/_^]]qr+993310!5!5.HH#Q\@8Y? `0P` 0P',H?+]qr33]++99331075 5sr,ZL"q@B  #$Y // @%H[o  Y?+3/_^]]?+99//+_^]]q9+993932210#764#"#632"&54632Q?gk&SAY(F__FEa`493'08`FF``FEa0{qT:F@v; A@0@'7 7GHBYY >Y/3 _o _ o    33+Y3#YHHHHHHHHpH`HPH@H0H HHHq^]]]]]]]]]]]]]]]]?+/+99//_^]]39+++9933933310 #"&'#"&54>3232654#"32>7#"$5327'"CbߤC\E5Uee׳W`y4LPi`4ְE(CM7i?,HTK89JqV ~6gݢ&EFLrf[BA@(B8HU@+   `Y _Y ?3+333?39/3+393992239910%!?3!?! !.vgm=(IIIII[ =$n@; ""%&`Y_Y`Y`Y_Y?++?++9/_^]+999333339993310 4&+2654&+%!?'7! ̮[+| DD L., m=z@@    `Y     _Y _Y0]q?2+333?3+3339/_^]3+399333993339910#?'7!!'7!!?! ɧ  WW  ɨ  ^^ JuIIIIJJJW= I@*  _Y_Yp P   P  ]]]qqr?+3?+3933310%!?'7!Ч ɧ  dJJuII6=:@  `Y _Y@]]?+3?3/+3933310'7!#"'33267e k &٘`6S QJhII01fX=_@/     _Y_Y?3+33?3+3339999393223999310%!?'7!'7! !ղ v ɧ u [@q  'a ~]dIIvII IIS7I|-=P@-  _Y  _YO@H `Y?+3/_^]+]+?+39933310%32673!?'7!q`&uTY ɦ  j kIvIIV=m@7    _Y _Y p]?3333+333?3333+3993333333393310!# !?'7!!!?-ݻ # ɧ  ɧ o ûIIvIjIII"=U@, _Y  _Y ]?3+3?33+33993333333310'7!#!?'7!ɯ  s㵯 # ɧ II&X IIvIJL (@_Y _Y?+?+9933104&#"326"$&54$32`z͂}΄cKt_ωw=N@)   `Y _Y`Y  _Y ?+3?++9/+93339933102654&+!?'7!2!utEiL [ ʨ |xnVIIvIJL*=@ $ +, _Y'_Y `Y  /]+?3+?+993399210327#".'.54$324&#"326z tlD ,4X~j^cӘz͂}΄,31N1k ωt=c@3   `Y `Y _Y _Y?3+33?++9/+999333333339910!?'7! !'2654&+(S ɧ ɓ p*yuEb8,IIvI+I8nr%L+o@! )),- H!@3H !_YP_Y`0@?2/]q+?3/_^]q+99++99333310"'332654.54$!2#'&#"ٲ@X"Q0OdidO0 8YQqW\wR1Gh1Bzl6PA9;EZtN+>bU@  aY _Y?3+333?+99333333107!!267'7!#"$547 k q   -rIIpC II@xx=@    _Y vdV2 pdP@4$itdT@4$t`T4tdTD4$9tdPD4@A tdD0 `0]]]]]]qqq_qqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqq_qqqq?3?3+3_^]993310#'7!'7 .qi #  =IIIoI=D@$    _Y   ?3?39/93+39933_^]10##'7!3'7!^ne 4 jdj  zPII=3II=R@*   _Y  _Y?3+333?39+3339933333310%!?'7!'7! !? @  e <  ` dII_IIoIIlIIi=S@    _Y  _YoK; {kK+ j[K+{k;/_O? :o/_? o@]]]]]]]qqqqqqqqqrrrrrr^]]]]]]]]]_qqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqq?+3?39+393333333310%!?'7!'7! . O | l  .dIIII,IIJ=9@   _Y _Y?3+3?3+333333310#"#!32673!7Ic DY;ɻm,hZ` Qj wr3(@ YY?+?+933310!3+ C)9)CE@ ??9933103SYu(@ YY?+?+933310?'7!j  C))Ca5=#@?329993310 #3ZHgs@ Y/+33105! 㐐^%@[/]q+9910 7!# ^ % I@%   !OYQYNY?+?+3?+?39933923310%!'#"&54$32733267&#"7m;M}qR6PE4(b'c-OJ~IZ :JU+-%gyP;3" !Q@+"#QYNY OY`#]/?+?+?3+339933339104&#"32>"&''7!>32C6$_+aNEzHmV\ mL=KxKiyM>$#ARuMQWͫo8@  OY   @PY?+?_^]+993310"&54$32#'&#"3267H51H6\OPXUK{9,R"9.&k*aSDuD.^A54&#"`J~7,X_z)EwZb 09%?JQ&o e**LTy@G  OYOY 0 @  0   ]]r?3/]q+?399+3?/339933993910#?>32#'&#"3#!ޢ %ֲ[D'@ #5BDE'zƲpkhL +e@6 &$$ ,-&))QY)$ OY   OY- -]]?+3?3/_^]+/?+39993339933103267&#"4632#"&'7332>767#"&$A2#_-k;FJzH&]68$$rECZ7=HucjxF<F2*B(%/2cgIOY( i@< NY NY QYP0]]qqr?3+33?+/??+99333333910632!654#"!'7!av_t ~f[?&j[ mT k\4]B9t(aX3B140F@' SY NYNY?]]]?+?+?+93333310%!'7!4632#"&Qw w[ m[?@YXA@ZZBRBHAXY@?[YL?T@2 SY OY OY/?O??2/]q+?+?+933333310"'733267'7!4632#"&dYO'?4M #ؿ[?@YXA@ZLvy"B-AXY@?[Y`@3   NY  NY NY?+3?+9??+99333333999310 '7!!!'7!_V X \P ƦlD\ mXBBBF3B-64@ NYNY  ? ]]]?+?+933310%!'7!Jw w[ mZB3B'*@ ((%" ",+(%NY(QY QYNY,y,I,, ,,,,,,,,,},k,],K,;,+,, ,h,,,,,,,{,o,[,K,?,/, ,,,,,,,,,,o,[,K,?,, ,,,,,,,,{,[,K,?,+,@T, ,8,,,,,t,[,+,,,,,,,,P,?,/,,,,,, ,,^]]]]]]qqqqqqqqqq_rrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrr_rrrrrrr^]]]]]]]]]]]]]]]]qqqqq???+?+3?+3?+9933_^]3333]3933]33104#"!654#"!'7!>32632!6H#_K cfJ0z$jY HHdYeXh_t ~faP|79t(a_QBb_i]od%_B9t*[@3 NY QY NY Pp0]qqr??+?+33?+993333333104#"!'7!632!6[?&jY NctWt ~faXQBj`4B9t  <@#OY OY `]]]]]?+?+9933104#"32>"&54632}?{KJ:@xF̌̌qs} ִִnL$\@1& %QYNY  NY !OY?+?+3?+?+33339339310#"'!?'7!6324&#"32>‚VE & hc Y}u=2DdbCHyDwծ!_AA32#'"!'7!7O0#:7,Kp4iu wkx LSRB(s@E")*WX"""" "NY  NY *0*]r?3/]+?3/_^]]+99_^]_]q]q99333310#"&'332654&/.5!2#'.#"M+.B@qRb58Bo\yv+B R3LG;d_S-)#ZWA'A &>T n+D7'D85M^>lF@%   OYPY]?+3?33/+39333310%27#"&547#?33#"L1Dnw\s &[5jF#/id.bA'hR&50K0M@) NY QY NY 0q??+?+3?+99333333310%3267!!7#"&546'7!^[@#j m er ct faUQBmf\(Bs=@!  NY ]]]]?2+3?3339310>54.'73#'7J "- SK{= r:2b ! A(\[gB]G@' NY ]]]????+9/93393104/73##'7!3>@$ Cnwg؅P 0~5dp$F A9Yq[fBn4*%y%V@-!"%%"" ' &!%%"NY%NY ??+??+933339939929910#&5467%'7!7>54'73!$'* AHV +f117 V v+! A #S<AU(A AKsAA3F"U@, #$$ NYOY $$]]?3/+/3?+39?3393393310#"&'733267'7!>54.'73QI`L3=1*<-7>;#";z0_Xg7>EQ@_KW559>{q(&!RHUcr:WEV`gP5!=IWF@p` n @0 P@>pPp/]]]]]]qqqqrrr^]]]]]]qqqqqrrrrrrr^]]]]]]]]qq??93103FG)R@, !! %&*+ !"!"Y!!YY?+?+9/+99333331073267>75.57654&+732#x>EPAbHZ458>{/o{8WEVlbhP3,!=HW}j&,!UjlňVbb@  Y  @H Y/_o/O_ @+2H_O?/t?p_?@oOP_@ ^]]]]]]]qqqqrrrrr^]]]]]]]]qqqqqqrrrr^]]]]]]]]]/+^]q+33/+_^]+3993310"&'.#"#>3232673?9zJVS!GA Bu\:q`:BBDs;>H1oT54'#73&54$!2#'&#"!#%^YZX=}u6W MYQG{HCR9JecR5ee!$aBcT' @% )("Y @Y))))d)D)$))))))))p)`)P)@)0) )))))))))))p)`)P)@) ))7))))`)@) )@)0) ))))))))`)@) ))^]]]]]]]]]qqqqqrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqq_qqqqrrrrrrrr/+_^]+933310#"''7&547'76327"32654&a~xgidfCCfheivviifhEEhdjii`EEhfgez{dihkFFidkgxwhgfiijjH="@R! !  ""#$ $!sY !sY!@ H !!sY ""sY?3+333?+399//_^]+3+333+333939333339107!'7!3#3#!?!7!7!73  tm?j K Y% %BB%BBffBBffdFD@ Y      p `   n         @ 0    P @   >  p    P    p /  ]]]]]]qqqqrrr^]]]]]]qqqqqrrrrrrr^]]]]]]]]qq?+?+93331033!l%n%n6B@974@@)=:: 11CD47=7,=7=7=&Y"p"" ""@  Y?3/]+?3/_^]+99//99339339933339910%#"&'332654&'.5467.54632#'.#">54&'L*.B#h6XkZ|ljGO̼k*B c.OTFFQZT.SJJlIiJkL9!).YI:dNCYs#*|Ln%J?/R&-2O_<{'?nB3R1 b?3\jZ 4@  Y P p    /]]q3+3933310"&54632!"&546320II01FFk0IH11FFjG22ED32GJ/0GG02GWR*:@!((7/<; Y ($Y  3Y +Y<<<{<k<[<K<;<+<<<<<<o<_<?</<<<<<o<_<?</<<<9<o<_<?</<<<o<_</<<_</<<]]]qqqqqrrrrrr^]]]]]]]]qqqqqqqqq_rrrrrrrrrrr?+?+99//_^]]+33_^]++99339933104$32#"$"&54632#'.#"32?3"32$54$W=@vE)R9pkzIFꡡAü@޼i;w'椣塡XRI@  Y Y Y ?+?+3?3+933333310#7#"&54>32?3&#"327H6 P]I]\m?C 2#%MbH0;N1,;vbicO%PJT T@   Y Y @ YY?++33?++3393333333103#73#7e}e d|d T{{dBd{{dBr+"@@Y?+99310#!5++`9WR%.>o@""#&#;+;3@? **Y"+Y++#Y% P`p  /Y 7Y@@@@@t@d@D@4@@@@@@@p@`@P@@@0@@@@@@p@`@P@@@0@@@8@P@@@0@@@@o@@@@o@?@/@@@^]]]]]]qqqqrrrrrr^]]]]]]]]]]qqqqqqqq_qqqqrrrrrrrrrr?+?+99//_^]q^]3+339/+3+3+993393399339310#"$54$32#!57'5!24&+326"32$54$=@ 1^LT^[XFTxh`ꡡü@AW::7sjMt:FRBH椣塡 1@!Y/_/]qr+9310!5!#^%R-@  Y Y?+++9333104>32#"&"32654&RSSTUR5PnoOQonSTSTTQIsVSttSVsU U@-   YY @Y ?3+3_^]++?+9933933310#!5!3!!5xlG`kk-(F@   YY_0k_Oo_:_ O0 ^]]]qqqqqqqqrrrrrrrr^]]]]]]]qqqqqqqrrr^]]]]]qq?+3?+3/93333310!7>54&#"#7632!&P--5*.>!vQvNkrI4AtfWJ) F$@ "" &%& YO _ o    YYo&[&K&?&+&&&&&&&&[&K&;&+&& &j&&&&&&{&k&_&K&& &&&&&&&&{&k&[&O&;&+&& &&&&{&k&[& &:&&&&&&[&K&;&@3& &&&&&{&k&[&O&&&&p&@&&^]]]]]]_qqqqqqqqrrrrrrrrrrr^]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqq?2/^]+?+3/_^]9/^]]+99333993910"'733254/?654&#"#7632pjA *AoD?0+4,/>"lYqSU ˄s S15w^P# WFw^'@[/]q+93107!s^!%LNX@/    QY NY NY?+??+?+3?333399333107!3267!!7#"'!767i f[@#j Y 8:O ,H"LjBs)aURBRq1-G | #=3@   Y ??+39/93310###.5463!j!!#׹IhKCP/A@  Y @ H Y ?+/9/++933933310"'732654'73]PE%70/=jV[+PYPa2*Nn Q=cuK C /@  @ Y?+3?29933310!??3 7 e ZhCC<)B}R ,@ Y Y  ?+?+9333102>54#""&54>32l/G*UDWCe}U_e}H\O{DŽwFna]nJT T@   Y Y @ YY?++33?++339333333310%#3#3e|e d{d JBB@C'&{U @H }}H @"||H @yyH @xxH @wwH @ttH @ssH @qqH mmH llH @jjH @hhH @ggH @ eeH @ccH @aaH @__H @^^H @]]H @[[H @ZZH @YYH @XXH WWH VVH UUH TTH @RRH @PPH @OOH @NNH MMH LLH @JJH @HHH @GGH @DDH CCH @ AAH @??H ==H @ <&SAY(ʪ[?gduJF__FEa`{02"`FF``FEa&$C:N#@&%+]]]]5+5&$vN*@&_O?Y%+]]]]]5+5&$mN+@&_O?/%+]]]]]]5+5&$XN+@&_O?/&%+]]]]]]5+5&$jaN &+55}&$S@ %%+55?55_0=#&@x&$%%  # '(##'#_Y `Y &`Y$&   & &`Y!O_o@H%  `Y@P`P` @ H_Y?+3/+_^]q+3?3/+_^]3+99//_^]3+33+3+33339339339933999910'7!#7&+!73#'!32?3!?!!?< u<[lW9YIY[Ud[T =d P }Lp1GdI[IIFPiL&&z@ 0! !!!/ %+]]]5&(C*N@ &g %+5+5&(vN&%+5+5&(N@ & %+5+5&(jjN@ &+%%+55+55W&,CNN@  &_  %+5+5}&,vN@  &  %+5+5s&,tN@  &  %+5+5l&,juN@  & %+55+55=U@0  ! `Y `Y _Y`Y_Y?++?++9/3+39933310#%#?#73'7! !#!!32] YZ  Q`a%XWU'IzI zf&1N@ &' %+5+5J&2C|N@ &C"%+5+5J&2vN@ &!%+5+5J&2N@ &"%+5+5J&2N@ &&1%+5+5J&2jN@&--'%+]55+55 T M@.  `0P` 0P',H?+]qr933310 ' 7  ^eDhBFeDeBfFBhDffo'Y@2!" ()"!$ _Y  $_Y?2+?39+99933339910"'#7&54$3273&#"%4'326ޘtcꙧkHz͂GG}΄xτwK+/:Gt&8CN&!%+5+5&8v N@ & %+5+5&8N@ &V!%+5+5&8jN@ &e,&%+55+55i&<vN@ &%+5+5=^@5  _Y`Y`Y _Y?+3?99//_^]+++3993333910 4&+2!#!?'7!4Yy{*i ɧ  zQ~JJuII4^@3 %&&*)00)562- -"OY-')NY' NY@P ?3/]+?+?+99933393223910#"&'7332654.'&5467654&#"!?632".1F/̷Pp#B*7AM-BGyd 16HW& V-ϯ ux"/a;UqA߆%_T,KJMUro[4SRHB^ꤡ5O_&DC@  &f!$ %+5+5&Dv" & # %+5+5&D@  & $ %+5+5s&D@  &z(3 %+5+5Z&Dj@ &//) %+]55+55&D@  &#) %+55+55 .?i@8"003 ::((@A,6OY ,"=%=QY%OY PY  OY ?+?3+9/+?+3?3+99333933310>54&#"'>323267#"'#"&54$32'467.#"326SM1G#3>c\3gY,W`HN^8TI4j%KSF?,{ Ot=**"$p]Yb 0q{#;?IR\W+%iB}[&%~kuVPo&Fzp- %+]]50`&HCd@ "&N#&%+5+50&Hv"& "%%+5+50&H@ "&"&%+5+50mZ&Hjv@ "&{1+%+55+55/&C@ &) %+5+5/&v@ & %+5+5&@ &V %+5+5/Z&j@ &o%+55+55#)l@<##  *+&&OY OYOY?+3/?+99//_^]+39993939310&'7%#"&54>32&'732>54&#" NY:ԋЄ<9 W H;AwFA?>yJBl$[|oΧ p~ff[`*s&Q@&?"/""-%+]]5+5 &RCk@ &0%+5+5 &Rv@ &%+5+5 &R@ &s%+5+5 s&R@ &#.%+5+5 Z&Rj@ &*$%+55+55dM@+   Y    YYY?++++_^]/+99933310!5"&54632"&54632H8NN88NN88NN88NNN88NN88NN88NN88N$T@.#" "%&#" OY  OY?2+?39+999339229910"'#7&5463273 &#"2>7[kU[h|TuS?{K?xF#=}j@ykOuRnK0&XC@ &4%+5+5K0&Xv@ &%+5+5K0&X@ &\%+5+5K0Z&Xj@ &`)#%+55+553F&\v#&'#& %+5+5YL)@*+#" *""/" #"&QYNY  NY &OY+[+;++++++++++T+D+4+ +++g++++++t+d+D+$+++++++t+D+$++++++++p+`+@++7+++p+`+0+ ++++++`+@++++@++`+ ++^]]]]]]]]qqqqqqrrrrrrrr^]]]]]]]]]_qqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]qqqqqq?+?+3?+?99+99_^]333399310#"&'!?'7! >324&#"32>%d ( h)c r058Uq@5!i(aNHyFwӫ:3AA<8S[g{R93FZ&\jK@ #&2, %+55+55c&$\N@&?/%+]]]5+5&D@   " %+]5&$iN*@&O?/%+]]]]]5+5&D@ &/#}#+ %+]5+5RH&$@ o  %+]5R&D @*P*@*0**d**%+]]]]]5Fi&&vN& " %+5+5&Fv&   %+5+5Fi&&N@ &# %+5+5&F@ &! %+5+5Fi&&N@ (&% %+5+5o&F@ &&# %+5+5Fi&&N@ !&# %+5+5&F@ &! %+5+5&'vN@ & %+5+5&G;@ %44%+5?5=W+@M ++-% ,-OY NY+(!!OY((QYNY?+?+3?+399?+9/_^]3+39333333999910!'#"&5463267#737'7!3.#"3267߳c ;IrmA 'e]SDuD;1!l)K \ mwBBBBRB&/vN@ &δ %+]]5+5-&Ov:& %+5+5=&/ ]56&OA P]55R&/@  %+5?5-1&O;@ %+qq5?5=&/]]5-K&O.@ O?/]]]]]]]]]q5=x@G  _Y   _YO  @H   `Y ?+3/_^]+]+?99//_^]9+39993310%32673!??'7!Reqe%uTY Gk  + kIdb^IIHH@(    @H    NY NY?+?+99//+993310'7!7!?\ msbc V3BuJ|KBG~F&1vN@&/ %+]]5+5*#&Qv?&%+5+5=&1@I %+]5*&QZ@   p 0 z %+]]]]5&1N@& %+]5+5*&Q@ &%+5+5\Q'QM?*?5G&_@1 $!!'(aY_Y_Y`Y?2/+?+3?+?+339933392239910"'3327654#"!?'7!>32V0Y#?x#pܲb ɦ iT(!}`$h UJuIzD@!&*L #W@-  ""$%OY QY  NY ?3?+?+33?3/+9933392239910"!'7!632#"'733267654?&jY Ners!ٲYO'?4Mr6XQBmf%_kryt(aJc&2N@ & %+5+5 &R@ &%+5+5J&2N@ &!)%+5+5 &R%&H@ H&%+++5+5J&2N&'%+55+55 j&R@ &$%+55+55G7E!.@^,%$$  /0`Y  `Y "_YO_o@H  (_Y `Y@ P `  P `  H ?3/+]q++?3/+_^]++9/_^]3+39933933399310"54$32!#7&+373#'#3 ?3!'27.#"|ɿc[n<[m:W9YIY[g Ud[TyaD?L#ҁ#zddN --6u@$' .. 178.OY..4OY#OY@ H H*OYPY ?3+?+?99+++?+9/+993933993103267#"'# 46326324&#"326>54&#"J~7,U]S{鬺O4;K_H/9MeGz)EwZb 09%?GTT&6 N@ .&0,%+5+5b&V-@ +&-)%+5+5P&=&7z4Pl&Wz@/@H+&&7MN@&o] %+]5+5>R&W8;***.%+]5?5&=`@0   `Y`Y_Y?+3?9/3+3+33/39393993399103?!7!#"#!#7.+!! YY=8KWBOBX 0;YZ Izw zI l"i@7 "#$$ OY" PY  OY?33/+3?+39/3+3_^]933993333910#?33#3#327#"&5467#73s &.5&"L1Dnw&fgDA'hhR&50F#/id9h&8N@ &J%0%+5+5K0s&X@ &w"-%+5+5c&8N@ &A%+5+5K0&X@ &t%+5+5&8N@ &M (%+5+5K0&X@ &%%+5+5&8N@ &I &%+55+55K0&X@ &{#%+55+55&8N@ &&%+55+55K&X@ &#%+55+55R=&8KR0&X,@ H %+5+&:N@ &+%+5+5O&ZQ@ &g%+5+5i&<fN@ &)%+5+53F&\|@ #&#' %+5+5i&<j@ &c$%+55+55&=vXN@ &%+5+5L&]vh@ & %+5+5&=N@ &%+5+5&]$@ & %+5+5&="N@ &%+5+5A&] @& %+]]5+5LT-@   OY0?2/]+?93333102#'&#"!>[D'@ #7D msw޽(h@7!  "")*!QYOY   NY "%%OY?2+3?+?9/3+3+3399339933910"&'#737'7!!!>324&#"32>mVuu\ m&/(=KxkC6$_+aNEzH$#hAhIQWͫbiyM>8l=#+c@3+!**"" &,-+!+!`Y++*`Y _Y_Y?3++?3+39/+999333333939910%!?#"#63! %2654&+ 4&+ "Oj#GW9l池˩r`ih324&#"32>mV\ 1"M/0U()=KxkC6$_+aNEzH$#A ?QWͫbiyM>=C@#  `Y  `Y _Y ?3?++9/+9933339910'7%332)?32654&#5 Sf_ ^A|oII"鏟rw "G@# #$  OYQY?+33?3+3?99333399104&#"32>>32#"&''73C6$_+aNEzH=KxmV^ uALKiyM>PQWͫ$#vA Ru`=@!  _ _Y_Y ?3+?+3_^]339310 #"'332$54&#"#6$;5T6Tc;MUBq`4Q+/O9,T%/Fj,E@#' '-. `Y+++_Y+$$_Y$?+3?3+332+3993310>32#'.#"#5.#"326?3# 4$32K+K ?)CW=T6Tb=MUBq,s`^+/9,%/'w)=@$$*+(OY(!PY! NY/3+?+?3/+3993310>32#'.#"#'&#"3267#"&54$32"|K+BB*EZ5H6\OPXUK{9,R`g__#"#!3267.#",c ;IrmA0U-1PM<1 d9.&k*aSDuDU">54&_νp&CI)32#'&#"3#'N @$(1(E"❷q\h.Fj.T@+)#"")/0_Y&- `Y--_Y-&_Y&?+?++99//+3993333310>32#'.#"#5&#"327'7!# 4$32K+K ?)CW=TxȟkD V M,s`^[+| DD L., zF-=@@!   _Y _Y?3+333?+99933107!'7!'6754' C   \Q?qIIWII] !  CY3.%(.f@6$!!* /0$$'QY' NY NY NY ?+?+??+?+3393333333339910%3267'7!#"&547>'4#"!'7!>32<=CLaj csϴƳ !#[:*j[ mT Tlav9 5Fu{'Bswy&9ad3B1jZk\4]9-6OW=U@   _Y@Y _Y?+3?9/3+3+39339939910%!?#73'7!3#Ч aR  RdJJ*zII/zQ q@9  !"_Y  `Y _Y?+33?3+?9933+3?993333399339910%!?>32#'&#"'7! !ղ v #YZ-Q&e,0@q  'a ~]dII` IIS7I|-_@0   OY  NY?+3?339933?3+993333399329910 '7!!!!2#'&#"_V X \P ƦlDEid>'@ &e,XBBBFm,KL@&   OY  NYNY?+?+9/3+393399399103#!#73'7!‰ew wuvwd[ mhBh4BXa@2    PY ?+3?3?9/993233229399392910.#"#76327#!7'7 <70EOG^i U L2pWY Seg:KAQ+'U(=6@C &## -,--32 2782-- #  _Y/ 366aY,)aY?+33?+333/3?33+333339933339333322310%#"&'#"&547'7!3267'47'7!3267'7!!iLkΔy  i Zq/`  h 0/c`  || gPe>,jon8HIIcBc,%&IIa0.-7 DIIJF=R@) _Y `Y ?3?3+?3/3+333993333333310'7!##"&'33267'7!ɯ  s/d5Y 9#AW II&X ._ZqI*K iJLJ!/F@") " 011 %_Y ,_Y ?+?+9/333399333310#"$&54$32>54.546324&#"326c CAM#+#H8BS٘z͂}΄1v+WdwljϙU+,+46UӾt  -F@" /' !./ #OY*OY?+?+9/399333333310"&54632>54.546324#"32>̌y*1B#+#H8BS~ x}?{KJ:@xFִqgR%,+46UGs,3;s}FEL "S@+ !"" #$!!_Y"`Y_Y _Y?+?+?+?+3999333333210&#"327# 4$32!!?vQxk˔Mu2Jק +Qw., z lJJ& L $R@+  %&!OY!OYNYNY?+?+3?+?+999333333210"3267"&%!?##"&54632.?{KJ:IjQR$n  hؔ?0Ϫ̌WBbs} JAAִ@[= S@*"  !" `Y `Y_Y?+3?+399//+93333993310!?#"#63!2!'2654&+L [ &Oj"GW9j,utEiVIIj-:y1nxnL -`@3!./'& .&$$QYOY@ NY *OY?+?+3?+?+333333993310#"'!?>32#'&#"6324&#"32>‚VE( h%Բe>(@ 'e,0zu=2DdbCHyDwծ!:3AApοmiy="u@>"!  #$"`Y !`Y" "  _Y_Y_Y?+3+?+399//++39933333399310%!?'7!3 !#72654&+Ч ɧ  'ٓ pX.yu*adJJuIIU+I`nr-LL,h@>") -." P_Y0)))P) ))$_Y?+3/_^]q?+3/_^]q9999333310"&54>7>54&#"#632326?36gt?jxqNY8ҪYGd<^0SX?\bu^46@T=FTJ?+u|@/C^FE. ' )Z@1#*+'##p# ##''NY'  NY?+3/_^]]?+3/_^]999933331074>7>54#"#7632326?3#"& =p|Tg,h.E&f{=psX#%M@' ##  &'  OYOYPY?+?3/+?3+3393399339910%27#"&547#?!2#'&#"3#"L1Dnw\s xFfe>'@ &0J[5jF#/id.bA!omuhhR&50F&= A@   !"`Y `Y ?+3/?+333399333310326?3# 47#"#!#7.+H<*K=Y5k =8KWBOBX 0;EFD9Gw ,\@-.,)"## )-."&& aY& ,,_Y?3+33?+9/39933399333333107!!267'7!>54.54632#"$547 k q 04]s#+#H8BSW-rIIpC IX4,+46UG4@xKG+h@4 -)&##,-((&NY(@ NY??+?23?+9/39933939933333310%3267!>54.54632!7#"&546'7!^[@#j ";Z#+#H8BSdm er ct faUQX%,+46UGy)Bmf\(BsM=*i@6("$$%%%+,%%_Y# ""##_Y?+?333339/_^]3+399933333332210%254&'!#'&+# $54%7#"#!|q.C-B"PC +6UPVSWdZ k%㘻8$krlҮ]Q(I@% # )*#&&`Y&  _YaY?+?+3?+399333333310#"$547'7!!267654#"#7632]`-r k q c a!G2K+ThsDO@xIIpC8CzseiLV@,  `Y   _Y _Y?+3?+39?3+933333333310%!?'7!>32#'&#" . O | /2ahPpK+K 29V*dIIIILZ)BA3F&6@ '(PY OY?2/+?3??3/+933310"'73326?'7!>32#'&#",YH*</7{54+7#"#!327bbRQ b8j:H1 ow@~wn@F @:n<A1TECX6}ZX M&)L ]@  "!!@Y _YvY?+?+39/3+333933999910)77!7!654&#"#>323#!9!e[dQYFMW6TZ_Tzla41zp=#O@)!""  $%`Y!vY_Y_Y ?3+?+3+9/+99339333102!"&'332654#"'7!#7.+6Kzx-\d4^ai ZK\ !l>4 E'QIR +"Q@) !!""$# OY OY NY?+3/3?3/+9/+3933933310'7!#'&+7632#"'332654#"#Ջ 327654&#"i zm Ijjp,&%j;LBBmWxyekRMZcX1@ ??9310!#31A @ ?3?3993310!#3#3A⠠s /Q@+   aY aY   ??99//3+33+39333310###535#5333#3/-ӑ쑄= v&''=N.&+5 -&'']f&G']1 =&/-L"&/M-Lx&OM9 K=&1-L&1M*L&QMs&$tN&+5&D#&+5&,tN&+5/& &+5J&2N!&+5 &R&+5&8N &+5K0&X&+5!&8 . -&+555K0&X'j&8 /& )&+555KBq&X'jv^&&8 0' )&+555K0&X'j@ 7@ H7H+55+5&8 1' /&+555K0q&X'jCr@ 7@ H7H+55+5G!&$ .I #&+555&D'j5&$ 26  &+55&D'@ ))@ H)+q5_0c&YN*&+5&C&+5FL(\@#)*"@Y_Y&&_Y& _Y?3+?+99//+33+39933333104$32#7&#"32?#737'7!3## F7Txȟk V ! z>̮[+z} DD }z., L&3j@6'& -.%.. 45&&NY"OY0OY-*QY?+33?+?+9/3+399333339992210!767#"&546323##"&'733267!3267&#" =Hu?ߟ]68$$rELXIA2#_-k;FJzHz/IOY2*B@[wh(%/<68jxF<FF&*N$&+5L&J/&+5&.N&+5-&Nv&+5JRL&2 R&RJRc&2'N&+5 R'&R.1H1H1H1H1H+++++VE(&yN#&+5F&Tv"&+5L X@/  [Y OY OYSY?++?+3/++3933333393310"'733267'7!#73%dYO'?4M #զLLvy"B-X!%! v=&'==&']&G]F&*vN&&+5L&Jv1&+5=+@H ()) ' $$,-!_Y! (`Y_Y     _Y )_Y?+3?3+33399//_^]++?+993339399333339910#?'7!!'7!3267'7!#"&547! ɧ  WW  J@Qo_s s=^ JuIIIIRD.;C}sJsvw%!\JEYLZ@@ Y @Y _Y_Y?+?+?+33?+993333910!?'7!>32"654&u0  #XlY@=PEI1Ihns_G@vFG[j&1C7N&+5*&QC&+5&$'SvJ;@'?+/++%?+/+++-%?%+]55+]]]5?55]]5*&D'v-@ ,&&)/ %?  # %+]5+55+554_0&vN'&T'*!%+5+5&v@ @&@C(%+5+5&vN@ (&(+%+5+5&v@ %&%(%+5+5&$N &+55&D +&+55&$IN &+5&D-&+5&(N '&+550&H -&+55&(bN)&+50t&H^/&+5W&,N &+55o& &+55b&,LN&+5/&&+5J&2N )&+55 &R &&+55J&2N+&+5 &R|(&+5&5N *&+55,&Ux &+55&5TN,&+5*/&U&+5&8*N (&+55K0&X %&+55&8N*&+5K0&X'&+5%L&6a&V&=&7l&WēEL"V@#$ #!@Y_Y _Y?+3?+9/+9933939933107$54&#"#63 7$54'>~mMW6 xi{y*rf=14A%|&f;0(E"!R@)"# " OYNY OY?+3?+9/+993393993310?>54&#"#63 7>54'D9>AHE.BkmoebUe*GI&H_"S pz6m&+N&+5(A=&K &+5L_G!_@1  "# aY_Y _Y_Y?+3?+3?+?+33993333339910?654&#"!?'7!>32 MBf ɧ b ߨ LJS@;Le JJuItP.#j JE7%3>@D!-," ,,""%4%8%%@&?@$"NY$0OY,))QY54&#!7Ic DY;&NSp Qj[d`XR+p>GIrEA@    NYNY?+3?3/+3?333333310>54&#!7#"#!3 ]YZs`F6iDK2 6Vf&$pN&+5&D)&+5P=&(z0P`&HzJ!&2 . .&+555 &R'jJ5&2 3 +&+55 #&R'&@ "H@ H+]q+qq5J&2N'&+5 &R$&+5J5&2 2 +&+55 _&R'J@$$$$$]]qq5ic&<N&+53F&\l&&+5bEN!N@' "# OY QYNY?+/3+3?+?9333333310'7!732#"&'#67474+326[ m hun}9$h:uz)2%.3BCZOeN<9Jg(B 9;,*E(3q@: ),$$45"1OY++QY$ QY NY ??+?+33/3+3?+?9933333333333104#"!'7!632732#"&'#674764+326[?&jY Nctp" hun}9$h:u{z)2%.aXQBj`4ZOeN<9Jg(tLB 9;,l#e@3  $%PY OY @ !PY?+??3+39/3+39333333333310"&'#67#?33#3274&'3262fq3']Drgs &Woy9<DO<5OX=A'hUJ_v% e L,@   OY OY?2+?+9333310"'733267'7!dYO'?4M #Lvy"B-!/<t@>0()) 65 "=>,OY(%%QY NY9OY5 33QY?+33?+?+?+33?+9993339399310"&54632737'7!3632#"'74&#"32>327.#"q\:  . MwxwC6&K+aDDtG7/EdaDDsE05EARX`ΥGY_iyO<hjx&L!.:s@>"())65/ ;<(%%QYNY 8OY 522QY,OY?+?+33?+?+?+33933393993102>32#"'!67#"&54632675&#"%4&#"327xJuLE( HI;HveA1Y1h;?p{=2#J-b0:l*sFWԬ!:3AuMNZ-jxHC8iyI<0/Hs!@M    "#_Y`Y!    _Y??+33?39/93+3?+39993339339933339910%##7#?33!?# 3 #%'.YVVg3m=\kIIhhI'SII[ O8nFi!*a@3$% ,"+,%%' '_Y  $_Y?333+33?333+3393392910"'#7&4$3273#5&'326?3&#"vehz\hz5T'RYb=MUBq_-;5.ȑ7w ]9,%/f {=d=W@ _Y@Y  _Y ?+3?9/3+3+399339939910!!32673!?#73'7!Ja_q`&uTY `T  z kI"zII< Q@( !"  `Y _Y?+3?3+333399399333991037##"#!733#7'7#7Ew=8KWBNN8BX | ?޳+;'Tow^^`BIZmE:S@*4'+ ';< 4))1NY,) QYNY?33+?+3?3+999933333931032673#".'&'332654&/.5!2#'.#"'%#9 7%=Re< "!_1.B@qRb58Bo\yv+B R3LG;d_S-)+`R6( 6TfbPZWA'A &>T n+D7'D85M^E!I@% #! "QY  NY  NY?+3?3+3?+3333333310#7#"#!32673#"./.#:F6i54&#"#6hO Xvaa?p>8[.ô7>II Ĉ#(HZF@" OYNY?+3?+3/9/39933333103?7>54#"#632h j3V]i7?l BG01c B T@+zPB =$,@",++## '-."@0Y,,`Y ,,, +`Y _Y _Y_Y?3++?++99//_^]^]+93+399333399392910%!?#73'7! %2654&+!! 4&+ #J池˩r) !ih"#''"% "()#`Y ## " "_Y  ''`Y_Y?+3+3?33+39/3+99333333393993310'7!733#7'373#'#32?3!#7#?3'#w [\<[;m9YIY.Ug[TQP &=Id}}If$*p@;('!" %+,'""OY(  PY ?+333?3933+399333333399103267#"'#&546;37%4'>`UJ~7,X_xViRjVX ?oCG|!9%?JQ*Z&JdZ ȁ&x6=Z@   @Y  `Y _Y?+3?3+9/3+393339939910'7!3##"'33267#73e k S&&٘`6S QJhBII*z01fXvzL?%U@,  &'#SYOYOYOY ?3+?+9/3+3?+9333333103##"'733267#73'7!4632#"&opR#رYO'?4MY6 [?@YXA@Zh)vyh0"BHAXY@?[YKEIL ,P@) ** $-.$'' `Y'_Y _Y?+33?+??+399333399310"327&# 4$!2%32?3#"&546`oFM`8l789L*>P/gG-N u$m\.5<20L')M@'$%% *+$!!QY OY'OY?+?+3?+3399333399310232?3#"&5467#"&5463267&#"۷ h?@(cJ %9HveA1"i,i;Np*<'uq$LL\-jxO<=="o@9"!! $# `Y"  !`Y _Y _Y?+33?++9/3+33?99339339933310!?#73'7! !'2654&+(S Rc ɓ p*yuEb8,IIn4I+I8nr,[@. OY NY QY?3+33??+9/3+339339939910>32#'"3#!#73'7!7O0#:7,Kp4 IJ:u wkx LSJh^hHB*= @2    !"  _Y  @Y     _Y?+3?39/_^]933+3333+3339333399399339929910%!?!73/7!!7'7!3!'! . O5 | 3h  k0dIIzIIIIzc3F),y@=+ ",***-.".,OY* 'NY OY ?3+?3?+39/933+333393393399999999103##"&'733267#73/7!!654.'737#'3l`L3=1*<-54&#"q gZ Z /du{~f\rSr;B(*6wh.&,>L?BH?nmI6t4u u<; D1I@%  ! OYQYNY?+?+33?3+?993333310'7!>32#"'#4&#"32>m[;M}qR6E4(b'c-OJ~IR :JUի-%]gyP;")M@'""##*+"QY OY &OY?+?3+?+3399333333910"&'!2#'&#">324&#"32>mVFde>'@ &,J)=KxkC6$_+aNEzH$#mt|AQWͫbiyM>_0@  OY PY?+3?3/+9933102#"&'332>54&#"'>H51H6\OPZSK{9,Rźޠ 32#'&#"!'3267.#"rmAe>'@ &c,c ;>9.&k*aSDuD.m32;DroER^0$0>EakbWK`w grJc>0O%LJG C@" !"OYOY PY?+?+9/+99333331074>?4#"'>32#"&326J~7,X_ ~)DxZa D9%?JQکoZc**.7q@<2 %%/(89""RY/OY'((OY,,5OY, PY?+3?+9///3+3++3993333933331074>?4#"'>3276?3267#"&547#"&326J~7,X_)[V*T"*TV\Fq ~)DxZa D9%?JQ#.s"s851Tr`W$oZc**9g+Z@/ ))%"",-%PY OYPY?2+?+3/_^]9/+99999333210"&'732654'+732>54&#"#7632*b.%kyo{P+,7l8GHA^<4A%rbiBV<,G3qhd  iC;;.$oaWw&dQ@{@A >>")&55//8:""AB.2+2RYPY87#7NY&#+##+OYPY?2+?+3/9///3+3++3999933393333310"&'732654'+732>54&#"#7632>73267#"&547*b.%kyo{P+,7l8GHA^<4A%r[V*T"*TV\.-BV<,G3qhd  iC;;.$oa)s"s851Tr`W"*Y/dQ6p,A@#) ##)-.K?&H?3]?39/]]399333310"32654&'#732>54&'2#"&546ɠqfYdA**ylw;iD\ٲӘar:5).  5/*.tkc]I'[Y@,  PY   OY OY?+32/+9/3+393339939910'7!3##"'3326?#73u  ku)ј`6S QEMIIIgz01`^zL"*7c@4+21## 891%%((.QY(OY  OY 4OY?+?3+?3/_^]+?+3399333399331046327!2#'&#"#"&'7332>767#"&%3267&#"JPEfd>'@ &e,&]68$$rECZ7=HuA2#_-k;FJzH72Xm(%/2cgIOYjxF<FLJ $H@$# ""%&"NYOY OY?+?3/+9/+3993333310"&54$32#'.#"32?'7!Ԗ?YF;!-H .=(bV3U.. )\  P4ʬ  ({LyFBB@?E,Z@-      NY  OY?+?333?3+3339933333933910%'>7'7!'7!4'=P8ZKF  j]Y` 3 S ;$  cw`BBBBX32@ &e,-av_t ~f[?&j#κd>m4k\4]B9t(aX(L -U@,%&&( ' - ' ./+OY+'OY%" "QY ?+33?3/+??3+993393339910#'&#"632#"'733267654#"!>32@ &e,-avv#ߴXQ(@6Ur[?&j#κd>m4k\4]lr{t(aX0[@/  SYOY  NY NY?+?+9/3+3?+933993339910%!#73'7!3#4632#"&Qw wJ:[ mJ[?@YXA@ZZBhGB_hQAXY@?[YN"kKW@-   QYQY   NY NY ?+?+99//3++393399399102>73!&#"#>7'7!i#zZRw wx h#aT[ m$;0B $OB6c@4 NYNYNYNY?+?+99//+3+3933993339103#!.5467'7!7Mw w\:GpKV[ m$!!9^QMB L9GtB$6L6.@ NY OY ?+3?+933331032?3#"&547'7!#1"?@(UZ [ m NAr84ZB,<-F%r@; "" &' NY NYNYNYPY?2+?+?+?+339/+3999933332239910"&'732654&+7#"!'7!!Y3ynu^ t8l;ew w[ mV n$F)&M {z<B3B1+2K*_@1(% ""+,'%NY' QYNY?3?+?3+333?+9993333333322310%32>7!3267!!7#"&'#"&547'7!^H#_K c fJ1|!j Y HdYeXh^t faP|73s)a[RBb_i]od%`BsKL*e@4(%" ""+,'%NY' QYNY?3?+?3+333?+99933399333333310%32>7!3267!!#"&'#"&547'7!^H#_K c fJ1|!j X hFaYeXh^t faP|73s)a[RBR]Zi]od%`Bs'L4e@4 2%*""56(/OY+(  QYNY?3?+?3+3333?3+999933333332233104#"!654#"!'7!>32632#"'7332676H#_K cfJ0z$jY HHdYeXhu#ߴZO(@8WraP|79t(a_QBb_i]od%_krstL%V@- # &'# NY#QYNY OY ?3+?+?+33?+9933333333104#"#"'733267'7!632!6[?&q#޲ZO(@7VY NctWt ~faXrvBj`4B9t*L{'R@* #() OY  QY NY ??+?+33?+39933333333104#"!'7!63232?3#"&5476[?&jY Ncts 1"?@(UZ laXQBj`4u<4NAr,B`taN@' NY NY ?3?+3?33+33993333333310'7!#!?'7!c : c}>nc b[ NkRCCBBC  V)@I   %$$ *+"OY OY  O _ o   OY %%OY'OY?+?3/+33?+3/9/_^]+?+99933933399310!2!#7&+373#'#32?3! 327&#" 22?V=0LF5(J8J8_`U&7punT<\\I^__L L)=%q@=  $# &'#OYNY$ OY  NY?+3?3+3?3+3+3999333939310!?.54%'7!4&'$):c & j:1"3a  l3^RbO5*BBL'%BB)soA3@  NY  ?3?32??+33333310%#"'3267!!X5S0#:7,Lr1i u iz QOPTB94@  NY ?33/32??+33333310%#"'3267!!X5S0#:7,Lr1 u iz QOP6BFB@    OY ?+3?33/33?393333991032?3#"&546#"'3267!"E&0@'Cg-5S0#:7,Lr1i zm'3iz QOPTHL,2@  NY  ?332??3+33333310>32#'"!'7!7O0#:7,Kp4u wkx LSBF,I@$! !NY OY ?+3?+3?33393333331032?3# 47'7!>32#'"E&0@'Cg u w7O0#:7,Kp4wzm6ABkx LS_Hi1'@  OY  ??3/+9933310#'&#"!>32 @ &8Zje"d>mt8QL5@   NY OY?+3/?+393333102!?654&#"#76@ c & j .('0@(Eő0:nBBF&GLmh@6 OY OY NY NY??+33?++9/+999333333999310!#!?'7! 4&+326i84m % cd fg Md>!o}BBCLBOJiik@7  OY   NY OY NY ?++?+339/+9?99333339339910)?'7!34&+326i oMC:* l[  u48BP]!>vxBsFCBBF>eF5S@*/"& "67/$$,NY(($ OYNY?3/+?+3/?3/+999933333310#'32?3# 47332654&/.5!2#'.#"$E&0@'Bh T n+D7'D85M^LT8@ OYOY?+3/?3/+933333102#'&#"#"'733267>[D'@ #7D#޲ZO(@7V mswrvqLT#J@& $% OYOY OY?3+3?3/+?3/+93333333103#73>32#'&#"3##"'733267L Ӻ[D'@ #7D#޲ZO(@8Sh½mswh'rw F!<@ "#OY OY ?+3/?+3/933333104&#"#763232?3# 476.('0@(Ed sE&0@'Bh r GLm0:{H=zm6AF@FT!+]@2$    ,-),&QY $ "RYOY?2+??+9/9+3393399333102#'&#"#&'#"&546327>27&#"[D'@ #7D^m ?[hV -NC^Ye=mswϞwUc?/2kaq3$++@0#)D@! OY PY?/+9/3+39333939910"'>323#7#73654&"L8>nw\s &[1F%-id.bA'hR&23HlE@"  OY@ OY ?+3?3+3933399391032?3# 47#?33# E&0@'Cg s &zm6AoA'hqHE$x@=# ! %&#OYNY QY NY?+?+3?+9/33+33?993993399399339910#!7#"&5467#73'7!!!326?!E\:m er ^^9t JMI Hv[@# hBmfKh>BhhaUQ"X)w@C %''*+   #NY% OY?+?3_^]2+33_^]33_]399993333332210"&546?#"#!32654'!#'.+JDB7K=L_pc[s" KC8N;Vgk;6V;7c"B@!   #$OYNYPY?+?+?+3/999322310"&546'7!324&#"#7>32TZ ktG=).5K!8>%leABn?<*kX_ m5@  NY ?3/+?3339393310! #&54736 "(2 S{= 2b &- A(\B?U@*      NY?3/+?39/33333939333333107#&54733!# @$ Cwg(P ~dp$F A9YqB4%yAf!G@# "#"NY OY  ?/3+993/+3393393310'47>32#'&#"! #&Q`L3=1*<-32"32654&s^%"^FF6i  ."", $,,12*1-%+%NYQY#.."NY ..+**+RY??+?3/99//9+3++333393333939910267&#"#&'#"&54632654&+7#"#!Ow)E\Ye<m hVot^ t8l;H2 n$BN,@0"*Sc0+akaq3D)}<1+2H@# OYOY?+3?+3/9/3933333310)?7>54&#"#>32j ZnLI9b,DY/NRܺOJ Ɇ- *6@3J@$ OYOY ?3/+?+39/3933933310.532#'&#"!?@ktV;/Y [euJ Z $$.Kp|JJ]E@"  OYOY ?3/+?9/3+3393933310#"&'33254.''7!PktV;/Y [euJ Z  i$. Kp|JJE*@  PYPY?+?+339310 4632&#" 3267ursN0*gdVV{d2aK=Ek')#U%xpF+7JL ):@ &&*+ ""OY"OY?+?+9/399393210#"&5463274&#"326"$&54$32YAAXY@?[ژz͂}΄c@Z[?@YXht_ωw#b@3##   $% NY  #NYNY?+?+39/_^]+99933333939910#?'7!2#4+32632654+/ c[ lR=3?^d5BB`fb|q}<4sDea{ Z,F@(  ##))-.?OH&?3?3]9/]9393333910%2654&#"?3#"'"&546?.54632tɠsfYe@**ylw;iC]ٲݘar<3).  4/*.tkc]Iٟ 1.V@, &'',0-,,/0 NY ,')'NY))OY$OY?+?3+9/+3/3+9933333310"&54$32>32#'.#"#'.#"32?'7!Ԗ~M!~K+BB*!8H .=(bV3U.. )\  P4ʬƒ({LyFBB@q@; OY     NY NY?3+333?3+3339/_^]+99333993339910!!?'7!!'7!!?<[ 6 b[  c9b9[  c[ 5 cBBBB>BBBBF?'\@0""() (%SYPY RY OY?+?+?3+3?+339333333310'7!3##"&546;267#"4632#"&֠ sv.x~NiER3[?@YXA@ZH"BTzeXs^`?1$*,AXY@?[YLT@,   NY  NY?+3?39?+99339329933310 !?'7!7!!_V \P :lD \ BBB;FB>5@  NY OY?+3/?+39933310%32?3!?'7!RlMWKL c[  gBBBL$ ,Z@0!('-.'$QYNY OY *OY?+?3+?+?+33993333931027>32#'&#"!67#"&5463267&#"Cg!ӹ[D'@ #7D\ I9HveA1"i,i;NplmswZAuML\-jxO<=$h@4 &"##%&"PYOY#OY?+3?+3/99//33+39339933993310)?#73?>54&#"#>323#j *nLI9b,DY/NRܺJz Ɇ- *6z+#c@2!"!!$ %!!OY##PYOY ?3/+?99//33+3+3393993333991037.532#'&#"3#!?#@ktV;/Y [euJ * x$.Kp|zJJ,3@G2-- &%%.45//NYNY&) )OY -%%"QYNY?+3/?+333?3+3?+?+399933333993399310!'#"&54632?'7!!326?33267.#"#"7;IrmA . V/ S8| RHJ9.&k*aSDuD5[F6iOU.^A6blvP;&F~4B@T5&&,-..22 <;; "(CD'&NY11.NY1PY((NY NY?OY;88QY2?2+3?+?+?+3?+?+9/+39993333399233923310"&54632?'7!!#"&'732654&+7#"!'3267.#"rmA . V n$Y3ynu^ t8l4ic ;>9.&k*aSDuD.^A1+2)&M {z<32+#7!'3267.#"#""32654&rmA . V/ )S^?Js^%"^FR;>9.&k*aSDuDF:mYdc5=$.^A6~TE^q@EOUvlvP;&q*43#*>8g@6/2255,))  &&9:)2/2OY-@,/ ##8NY# NYH9 ?3/]]+?+99?3+39993332323310%2654.'.54632#'.#"#!"&547#?33#3X[-NfOl+B F-v0DQH%TnwXs &W:-]H<1*4AR n+{/,+3Na>id.bA'hx.<>L)n@9$ '' #"*+OY$$OY @ "  PY?3+3?3+3?3+?993333933339910%#"&547#?337>32#'&#"!27#[Snw\s & Ӻ[D'@ #7D%!~[5#id.bA'~msw R&50>( @@K9<88??633 *0%0%AB3<932#'&#"!632#"'733267654?&jޢ %ֲ[D'@ #5Bers!ٲYO'?4Mr6XDE'zƲpkmf%_kryt(a-([@0'(($  ##)*# &$NY&#(NY#  NY ?+3/_^]]?+?+9999933322310%2654.'.54632#'.#"#!'7!X[-NfOl+B F-v0DQH%U[ m]H<1*4AR n+{/,+3Na>3B-X@/    NY NY  NY?+3?3/_^]+3?+993333339910!326?3!'7!#"6 S8| RHJ[ mgP6i63B0,K)@T! ()('""     *+))''"""$((!  !! $ ?333?399//333333/33333333/3999333333333223933333310'73# #'7!'73# #'7!nRG4QSQx,8OHRG3QSQy,8NH7i,,aF,,gi,,aF,,g(= 4@     ?32?32339993910#'.+"#!#'.+"#!Ug_HTQaUd_HSPaq  L0'V@,# () OY  QY NY ??+?+33?+39933399333310%3267!!#"&547654#"#7632|[:)j m kUierBL?@(VY#abQBdm[mf%eu ^r}9RsLe4\@/ 0*''!056**-QY-!$$OY$ OY ?+3??+3?+33993333993333104#"#76323267!32?3#"&546#"&5476F?@(VY #[:)j F?@(UZ/Uier8 pr9@s)abQ c)prtBm[mf%e?582L@ ,> ><?332?3??3333393339910632#654#"#'73&^9H>F=7&`@73u=:)(VI:V2(182#T@#$% %!->> <?333?3??333333933339910#'&#"632#654#"#>32'< ]9H>F=7%a@o|p=$A%u=:)(VI;U4swx +;@   , ;=?22?3?3933333310"'73327'7!4632#"&6.& ?a`gt7&&54''6+ G #(uz(44(&7682u8@  ; > <?332??3339333310>32#'"#'73& ^0#!,C!?ZF@HR+4(#f8@  > ; ??332??3333333310#"'732673# ^0#!,C!?ZF@HR+4f()fA@ ;? =?33?3333?333333991032?3#"&5?#"'732673C*&)=ZT ^0#!,C ?l IA RU#@HR+4f0(2f[@$     ; >?33?33339/3999333333939910)?'7!374&+326BVAP7G"r08%GHf( `( ((*%=#&Zf5@ ; ??333?333/33393104&'73# #'7337>'(G>Pg0L?33?339/3933333310!?764#"#7>32tj6BN?D)542an|l/e2,5-`ci2?@ > -?33?9/333393333310.54632#'&#"!?$9M3{254?FQ_@6dtk{i]`- ,,eQ!>D"@/329393310%# #3D\>D"@/329393310 #3 D+\+rrGq^8@" Y[/]q3++939331073#'q զL^!%!^5;@# [Y/]q++39393310#73%5զL!%!O*@@`/]]q9310#3nnOB&@0P/]]q293107!t^v^CE/9310#3nnEBWKY/+33107!tFdw/3310 7! F % Gx/32107!<sG!% @ ?3?3933310#'53#573T6TޖT6T%T%%?39310#'53T6T%Y @   /93331044#526WH3TwwT0K$3HPwTTwPFY @  /9333103"&5463"J1TwwT3H$4GPwTTwPHl @  /33933310753533ll @  /23933310##5#5!~y 0@    /9/33393333310##5#53533wwwwwwwwAq/232105!tA^ 2@  [//^]q2+39310"&54733273xy5y^}x%)3qf  @ Y D T t  4 T t    T       d 4   k   t D    d T   t d +  ; k _ D 4        t @ 0      0  ]]]]]qqq_qqqqqqqqqrrrrr^]]]]]]qqqqrrrrrr^]]]]]]]]qqq/^]]qr+93104632#"&3[?@YXA@Z AXY@?[Y# >@&  Y@ HY?_/]++++933310"&54632"32654&W|{XX{{X';;'';<#{ZZyyZY|8;(';;'(; R,@ /  Y ?+/_^]93310"&54673327mtG9 *h4:\RfcC'1v6qS5^B9sm@J / Y    @ Y/?_/]qr2+_^]_^]+_^]39310"'&#"#3232673+U`1!&*cC5T.4%*c&BX-4?0&-3=^ 4@  [ /]q3+393331073373^!%%!%%Zz<2@   /233/933333310"&547?>7327V\P#[VVE/aX'#Au's"s`$Tr/ @   /329910  ' 7 /HHIDHHI,fB@    ; =??3393333933393310'>7/737654&'7T *$8 ]4 f,@&)4: 'l"'o2%@  ,>?3?3933310#'73H7h((E'v%5@ &'' < ??33?339933393310#"&'7332654'.5432#'.#"zz&s' &D2:Bd?3/3?33999333339929910#&54?/737>54'73#c Ry3c=! S|4R#' (C'3#' -Eh 'r2?@ > -?33?9/333393333310.54632#'&#"!?9M3{254?FQ_"6dk{i]`- ,,zY//+93310!!5!Uz&@  Y//9/+933310!!5!3S̑NUz&@  Y//9/+933310!!5!3SUz&@  Y//9/+933310!!5!3SNUz @ Y/+/9331035!3SUbIp@ /39331033!bi~pibIp @  /9/3933310#3!ii~}p|i]I @  /223393310#73%զLq!%!``0@  KY@KY/++9333107!7!thtʖԖQ "@ /22939331073#'5G>p"@ /329393310573#'>VFc@  /3933310#'573cI>TFa@  /39333103#57'T > F @   /32933310"&54632"32654&W|{XX{{X';;'';3*HFZjQ[pE0"c;U 2x#~ @ @ H?_/]2+210"&54632"32654&W|{XX{{X';;'';<#{ZZyyZY|8;(';;'(;o^ #@[/]q2+31073373^!%%!%%^#@[/]q3+310#73%զL!%!O @[@`/]]q+10#3nnOBOd'@[@`/]]q3+310#3#3~nnnnOBBz^ #@[/]q2+3107!!7!I~8^ %  % ^ 0@Y [Y/]q++33/+10"&547332734632#"&xy5y[?@YXA@Z^}x%)AXY@?[Y_#@ Y[ /]q3++102#.#"#>yeZPPn%ew%(TCBU66#@/_/]]q10467#"&6ĵ YQ!JF>K| E=+ $2;G66#@/_/]]q107>54.54632ĵ YQ!JF>Kv| E=+ $2;GK6z#@/    _   /]]q10.54632z"&* fQ7A .%E#E~a\p066#@/_/]]q1027>54.5466FĴ [P!TAB| E<+"1EF:w@ [/]+107!" F % EG,x@ [/]+107!EsG!%BE[/+9/310#5#5353EBE[/+9/31033##%AY[/++105!5!; d~/104.5463276!'!iQIU,$HZVEAcXEf  [ /+103"&5463"J1TwwT3H4GPwTTwPH5F/231053533˄F5F/3310##5#5˄=BF   /9/33310##5#53533wwwwwwwwGu/3107!sߖL;Y /2+10"'73326?!ZO(@8W'!!"LrsۻL Y/+310"&5467!32?39%!' 1"?@(VL><4NAroI @  /]333104632#"&[?@YXA@ZAXY@?[Y+wg  Y/3+310"&54632!"&546320II01FFk0IH11FFwG22ED32GJ/0GG02G{J!  H /3+210"&54632"32654&W|{XX{{X';;'';"@   Y/]+_^]2102#.#"#>yeZPPn%esw%(TCBUg&@Y [ Y  /]+++10"'&#"#3232673XU`1!&*cC5T.4%*c&gX-4?0&-3=/3107!t/3105!1 /32105!5!̗F"@Y [ Y /+++10"'&#"#3232673U`1!&*cC5T.4%*c&X-4?0&-3=`z/2107!t`_./2107!_  ??10'mMsMMsM` ??10#3Ef /321044#526H3TwwT0K3HPwTTwPF{F /2210!3!5d7F /3210!!5#nF~i@  /3233210.#"#54&#"#>32632 ?(5FPF5)> RnJg<54.5463#44 & w44 & w-2:#QXr-2:#QX /32107!7!c̗^>@[/]q+107! ^ % %^ @[/]q+107!%s^!%zBUs<@+ Y [Y/?_/]qr+++10"'&#"#3232673GU`1!&*cC5T.4%*c&BX-4?0&-3=aQ/105>54&'&54632aƽ8R,)GZETg1\=L"!+SADlT < Y @[@`/]]q+3/3+310"&54632!"&5463253G-@A,,?>-@A,,?>Qqb@-->=..?@-->@+.?!s%2ET /210"5?3327C(HEz-&'L/{AY/2+105!#!R d1 /32105!5!̗VE[/3+310#3#33232>734632#"&4632#"&{Up9!" i ka1OF= i iG33GG33GG33GG33GX--F$2- E3GG34GG3GG34GG}N+)@  %  ( /3299//3310"'&#"#3232673"'&#"#3232673cU`1!&*cC5T.4%*c&VU`1!&*cC5T.4%*c&X-4?0&-3=3X-4?0&-3=H  /329/310'7#'573'7e,%%,,%%,Hll'kk'1F /332210'#5'73lk'&&, #/;GS_kw@W!{Q]]KWiic uo9EE3?-'Wc?''?cW /33333/33933333339/////////33333333333333333333333104632#"&%4632#"&4632#"&4632#"&4632#"&%4632#"&4632#"&%4632#"&'4632#"&4632#"&4632#"&4632#"&%4632#"&4632#"&4632#"&4632#"&#5#5!!5353##!!33!5!!5!#3#35DxxdP_Nd8dwd8dE88DddddKquffd?d%8?8ddd88@  /3333310#57'53 >> @  /3333103"&5463" J1TwwT3H4GPwTTwPHp`@@#  YO @Y/+_^]+23293102#.#"#>4632#"&ye aBQr eEYAAXY@?[w%(CTDSv@Z[?@YXEd *@    /32339/3333310''7'77dGGGGGGGGF@  /3333310#'573 F>F@  /33333107'53#憆>F8@    /39/32333333933107'53#%573#' >>= @   /33331044#526pH3TwwT0K3HPwTTwPFr  Y ?+10#"&54632@-,@@,-@,@@,-@@Ff7@    /9/99333339/9333310#7'7'7'37Y$t#//#t$//䞠vk,-jtqh,+jE#/!@-!!'' /3223333310#"&'#"&54632>324&#"326732654&#"|Y5YY5Y||Y5YY5Y|LB--BB--BhB--BB--BY|.((.|YY|-((-|Y-BB--BB--BB--BBOo/9/3107#33?p@oOVw@ Y /3]+10"$&'332$73lۯ g.01.g wUYGRRGYU_/@  @Y/]q+23310"$&'332$73lۯ g.01.g _UYGRRGYU=/232105!5u/332105!53!dC@3    /?_@#H/+]qr3]210".#"#>3232673gF^zi _cgF\zi3*1*@3OK)2)>3_!@ /]q3]2102#&$#"#>$l% g.-g &UZGRSFYUSH /10'7!5!'7$,%6%,Hlk'%Kt)<<?>?3?333?3?10#'#"&54>3273327&#"A!Y1FYY`UA1!c./;;0E_h"R)6ffhgF@SR0%t < ??33?39/310327#"&54>32>54&#"mGR.~=qiUPX]Fa(HTt )9&)4pbdhEY?w2 ,;>?3?3?310#'73'4632#"&MGZ7ۍ6'&55&'6h(''55''55&)u < ??3?3104#"32>"&54>32K&I.-#&H*hyT_hyZSEKYցk`]k$of(; ? >;??3?333?31032673#7#"&546'73C7'_@YA^8I;F=:V2d(jx=A 7K'IO%Lt <??22?3310"&54>32#'&#"327'esXY$i#+ 7Jj;,HQj%ndpa g$LB9&]&v"+> , <??233?3?3?310"&54>32?'7!#''3267.#"ZDSNUE$`;!Z)&?: 0?Y&i]jhJ'$W-6H@/$J 2_&,> ><?332?3??310632#654#"#'73 ^9H>F=7&`@73u=:)(VI:V2(1y2u(2#&>@  ;;>?3?3?333333?3104#"#654#"#'73632632#6>+$U<= ,K?Y5Ut/BTw4?>F> :k0UD:S6(et7@wC< '(UD2Nu ; > <?3332??310>32#'"#'73n ^0#!,C!?ZF@HR+4($ ;??3?3331027#"&546#?33#+!W)AH=EUTW^ _7 o*>=*L'?1=5&Ug;??3?33107654&'73#'7Zy(!1I{$gw:2'7Mj (2jf#$ #>@  ;>??339?310#&54?/737>54'73#)c Ry3c=! S|4R#' (C'3#' -Eh 'P)@[?_@!H/+]+93107!s!%UI @  /29/93310"5?3327(HEz-&'L/V1@  PYPY?2+?+3339310"&'732>54&#"7>3 T&[fUjjg1U(%MzqkM"*&@###j###]]]]q5V&5A@###j###]]]]q5$T|5@ @[@`/]]q+933105!{T!s%T X@  Y @[@`/]]q3/+3/+3333393310"&54632!"&5463253G-@A,,?>-@A,,?>Qqb@-->=..?@-->@+.?!s%H&$9uVHJ%++5?5KCg>'(9 V-@%Op/]]]qq5+5?5]>'+9V-@%`?]]]]]5+5?5F>',9V5@%O//]]]]]qq5+5?5L&29V' 6@%O]]]55+5?5>'<9V״%+5?5L&[@9V5-@++%_o_/]]]]]]q5+5?5(&k:0""]555H$ =%=C@#`Y   _Y_Y?+3?+3/_^]+3933310)?'7!#.+i ɧ7S dYIvIk TH<@  Y?+99?332293393310)73 !Dx@PS=(==m=+JL (N@*%)*#=(&(( ( (( _Y _Y?+?+9/_^]]]_]3993992104&#"326 54$3273#'!#3⒤x$.DPD.DPDKw^.ˉx fdddfW=,=.H;@  _Y ?3+333?3339393310 !?3!?Ԑ u n| QIIIIV=0=12= #c@%%$  < L    #@ Y0 L ?3+3/]3/+9/_^]_]]r33/391073#'!#3"#!#'&#2?3!33-DTDs2DTDpDSb:SlUHShBRP fPxxfRoDJL2m=H@% _Y`Y _Y ?2+333?++39933333310#?'7!!?! ɦɦ Ȧ IvIIIIkI=3=_@+       `Y  Y ?+9?+99/_^]3333393310!2$?3!7 7!#7&# )e#V\l?Zf=D( D^#Yc&=7i=<F/=/@,)! **//% %10_Y!)_Y@ H@ H-*/-/_Y- _Y?+3?+399//++3+33+39933939339102654&+ ";#"&54!37'7!32!#!?ݔp so)~G. h =w @1 iIIi߼zII=;='v@;  #$$'()_Y'#  _Y _Y?+3?33+3339/3+3933993333333339910%!?"&547'7!'7!267!!e G -u @ }\p  p~J 7'dIIF5IE;i}IIIL*`@2%$("$+,%_Y$?333?+9/_^]3339333333333310"!3;7.54$3 32?3!654&_|q.-B"PC `&D6UPVSdlrk!䛻$kԮl&,juN@  & %+55+55i&<jN@ &$%+55+55&c9@)&))I), %+]]5+5R&g9@ 0&03&%+5+5*K &i9K@&"%+]5+5N&k9@&%+]]]5+5E&w:@ q,&%+555555(`@0 *! )*''$OY$PYNY?+?+?+9/3333?933333939910%!&'#"&546327!4&#"326?  Ib0\ %Y+,J?AmE5)GLAAWusnƪ((:ΜqiBL *`@0$$!! ( +,+%$%$OY%% OY OY?+?+9/+9?333333993399102#"'!6"32>54&'7>54&m~pJR-FI6V.9pDoa< w00adG[ab^h LT7@   NY  ??33?+393333310'67&/7!>54&'7O')JR.3 6+",+'  +KhL S HіAb2Zp#(A +\@0)&$$ ,- OY&NY  OY?+?3/9/_^]++999393399310"&547&54632#'.#"'2>54';p&CI);#"'327#"&546?.546&E/*DH'HZ/! CKHoMD/`gxDMs[Q0S  { 1JL`DRF{hkAw.Y@  @  QY@Ho ?3/]++99?9993339933104%55$7'>54&'../%a\E[1EG H dY*@RCo9N\620/*K @@!  NY QY?+3???+993333333102!47654#"!'7!64er`#[[?&jY Nmf%_aZ-f!gn.aXQBM O@+  !"OY =M OYOY?+?+9/_^]+99333333102 #"&546"!654&32]؎d|4uA"94i1pdwXÃz}.N"6@ NY PY?+3?+_^]9333310"&547'7!327Xan\ m|D*5 :[U,oB?5N#636.bU@*      NY  OY ?3+/?399+399333999993310!!'7!b p` <\ mT?IORB!XE@" PY NY?3+?3/+993299233910 !7'.#"#7632#(2 =:0EOGir U Q+uke S+KAL0S@*    RY NYNY ?3+?+?+33?99333333333107!3267!!7#"'!767K f[@#j Y 8:O ,H"LjBs)aURBRq1-G | Y<3f@. &  45&H@HRY&'&'QY2 &&??9/99+9+99++9933393210'654&'.546?.546?7!276;#"/@PLлlpCWMF@O1  *I4ah8k6KBl+,+% Xz C rrTj  *}0E0C R L@'  !"OY PY?+??3/+333393333333310"&547##7>7##7!#327 mkkn?0JH(pxUI;#jD$4-VZ,a;-@h1R#C(4L=@  PY OY?2+3??+3333339310"&'!>32'25#",WP%ޅyCKN<<iG:} :@  !" OY  ??3/]+9999339210'>54'.54$32#'&#"BVznM>(K-TI\CF)(|\i4K(Q0Y!)~.%+;4 7@    OYOY?+?3/+3993399210%254'"#"&5)73k0eXLj0 eVM=O-å`u֒&*I@%   OY  PY?+3?3/_^]+3933333310"547##7!!327kUI;\j"-6!6,ah4&)#609E9@  NYOY?+?+?993333910"&5467'7!3254&'7.1u }<$E>gr.#)TAz7>">54AJJdʍMX2PFjW37joAư]ˮR"V} Pi`_ .LL@%   !  ?33?339033339933999910.'736?!#&'!765 :: [H}F10! l>n!, AHjw' /$Ae!TTLei@5    ! NY OY ??3+3?3+3/_^]993339333333322310##"&547'7!33267e _[!KI EX f] cLˈjgA ]>NAB@RdE+|/E@"&, ," 01// !))PY?3+33?39/99393931032654&'7#"'##"&54$732674?j HTDdwORnЍ9>` gKG9=+x]Z ti{"@AdwVI=R80I":(# Bn.{m}oFrwrkDD5,L!D@  "# _YY?2+?+3?399333333102#'.#"!?654 hrR*[ /-X%C . Loy5<b8L?y;+IIQOS05K^lL'2o%?5,&j .&+55 Lay [@5   !"PY OY  OYOY?+?+??+?+993393310#.54$74'6)OӎKKЏOʢPByxKӧ\Ӧ-)taw9.3Y@-'3&3  45--PY33 'OY?3+33?39/9+399933393310#!!#"'## 46732>54&'!32674?`PCRJqщ9>` HTD?a;29oG9>==722AB5-,,0$'' QY'< 9QY OY?2+?+3??+3?9933339993333323310"'73326?#"&547#'46?65.#"#>32%>7332673XQ(@5T aV,_029P F_bV-cb9P E3$Lrw4ktN~YImShR7MIQ=ntNW Ik];Q=JLL#A@!  $%_Y_Y _Y?2+?+?+399933310&54$32!?4&#"326c< z͂}΄*ωJJt L @@!!" OY NYNY?+3?3+?+99933310!?.546324#"32>D h@s=o[}?{KJ:@xFLAZ#Ǝִ/s}EdcL$.@! %& ! _Y ?3+/99993333104&/&54$32#7&# 7>wmu3ZuMTf:eO.N*6PRCZfq5!;EU;u54&'.54$;73qd,S^[YfOHPhPF>:v~2D1ZE0_&N4)1(t/4=V@,  `Y `Y _Y   _Y?+3?+3+9/+39933339910#'!!?'7!#7.+$3YW [ ɧ W@^ 1I]IIvILI@%  OY  OYNY??+3+9/3+333339310%!'7!#'&+373#'Rl `4HlKa=HOHBڰժB;=2@   ??9/39333333310%#&547!654'73!>U BgT BY F J FL)F J FN2v0@ ??9/39933333310!#!3\|T|9)dSE]j!W@% !!  "#_Y Y!!/3/+3??/+9999333333333310'6$32'654&'#>7&%#g| Rrm-*>R`VOQXHvW~1B@ b@2  @RYOYQY/+/9////++99993333333310&#"7632'6='%&''|{ Wtd^2 %1ˮ"oG_,<%v^MviE<=I@M? &##,--3 2 2JKC;aYCC66H`Y?62-- #  _Y/ aY,))aY?+33?+33?33+33333?3+9/+99933333333222310%#"&'#"&547'7!3267'47'7!3267'7!#"'.#"#7>3232iLkΔy  i Zq/`  h 0/c`  |-Ga.]}"\$9FJ\/Pe>,jon8HIIcBc,%&IIa0.-7 DIIkD$N9%Q.#E>@C3$%%' & &?@7/RY77**7!3267!#"'.#"#7>3232nHdYeXh^t fH#_K c fJ1|!j .Ga.]}"\$9FJ\/|b_i]od%`Bs)aP|73s)a[RD$N9%Q.# UQ&a@2&&!   '(!&$&_YaY $ _Y `Y ?3+?+3?9/+33+399933399310#"&546$32#'.#"327'7!!?{߶ρ2x+Y .Wtropi lʧ \ sy:LIIJJhrW@,  PYNYOY ?3/+??+9/+3399933399310#"&532#'&#"327!!{[`1H !4_9OUKc [ NĹ N#|}v"%ByEE=4s@<*))$ #2/#/56**,aY,,!&)$&$_Y&#!#_Y aY !`Y ?2+?9/++3?+39/+339933333339910"'.#"#7>323267654&#"!?'7!632Ga.]}"\$9FJ\/t#J dWph ɥ  K퍹A-ED$N9%Q.#E5BO:IIuIITO7j*4m@8 ."##'% '3''561OY311 "% +OY PY PY?+?3+?+33?9/3+39933333333310"&'&#"#>323265'#"&54>32673"327&=iI*&PeD(<67%ekyz^nT_r%X @@~mLf9;dm $9!1Cup$+$DeQF~Hp36ZTigT?*9BOdL-C@!%** ./  _Y("_Y?+3?+3993993333310"&547,654&#"#63232654'7% FEjY7o+M[8ţ9h huw#;y25p̘hi* ?+]|kg`B'cU`>3B>VXb$;@"%& OYPY?+?+399399333310 47,654&#"#6323278_!MG`QGH1DmtwHd0&dhk,#mk0(wj+=29SL"%Y@# $ %! &'@Y #  $ $`Y ?+33?39+333993333910'&#"!7'.#"#6327>32 !(5?zH9NO%8%$SW:d`u`-^{p]:8RX`MqqeNG4r`k@!$U@-" # $  %&OY "  # #NY ?+33?39+333993333910'&#"!7'&#"#6327>32!4iTe TX&SFH2LY>`PD*>>h`I2Ts..l /XiWVTc -S@*!!'./,*_Y _Y aY $_Y?+?++9/+3399333310! 4$3232673#".#"63 324&#"teSR3=w\$e8RJO5_<|}A_}J=A[ð$a&L(I@&  &&)*#OY##PYOY OY?+?+?+9/+99333310 4$32673#"'&#"32654#"7632;"ZRIn:"Xb.NN/ZKUi64 ]rq F9- G35=)g@4 &)*+_Y" )`Y_Y?+3?9/3+333+393399333339910%!?".54>;7'7!32'>54&# nWK/SY>tW_ k `dm~EF;67l<3Q.IIH?J}C6+L/)"FOF@$    NY OYNY?+?3+3?+9339939910#!?#73!3= kUj dEDBhBy93`@0 *1* % %45 (  #QY 1-QY?+3??+3?993333999933333210"&547#'46?65.#"#>32%>73326739aV.`029P F^bV-g|029P FktN~`InPhR7MIQ=ntNW ImY;MIQ=7F ,9@& -."OY))OY?+3?99?+99333310"&'#./.5$324#"32>f1pw8F[iq̌x}?{KJ:@xFNJH^P0UJ#- ִs}-4@   PYPY?+?+933310 4$32&#"3267rN0*gdpU{d2aK=k)#U%pF+7L?MJL!?@   "# `Y _Y_Y?+?+9/+99333310"$&54$32'267!4&#"!cg7 U2ωwgIM!wU@1 PY  PYPY?+?+9/_^]q+93333910"&5!2&#"!!327'V$ ^~$7pl{\ 1";*"Mz/(wnJ"*6a@<  PYO_O_o  PYPY?+?+9/_^]q+339339102!"&'732!7!654&#"'>V$ ^G7pl{\ 1ŷ*"M*z.)wnJ"*=YLFiL&V=a@0    _Y  _Y?3+333?39/333+3993333933223310#!?'7!!!?0-׻ # ɧ  ɧ o ûIIvIIII"LG%g@5 &'"PY NY NY?3+333?+3?3?3+993393333222310'7!!!?##"&'7332[ Wz_ YQ 7 `v90/F.L`F&A)= '_SB?BBBϿV $ L"Y@/#$  !  #PY OY !OY?2+3?9/3+3?+3339399910"&'3#!7#73>32'25#",WXX%ޅyCKN<hhiG -K.@   _Y _Y?+3?3+993310 #"'332$54&#"#6$;5T6Tc;MUBqK4Q+/O9,T%/FiL *D@!',+, _Y' "_Y ?+3?3+9/393339310#"&54632 4$32#5.#"326?3YAAXY@?[5T6Tb=MUBq@Z[?@YX 'w4+/9,%/ -K *P@+'+, _o  _Y' "_Y ?+3?3+9/_^]q3993932104632#"& #"'332$54&#"#6$YAAXY@?[1;5T6Tc;MUBq@Z[?@YX4Q+/O9,T%/&(C*N!&+5&(jjN@ &+%%+55+55L=2@Z %-00 34#+`Y&& &&#aY P`   `Y_Y?+3?+33/39/_^]qr3+3?3/_^]+933392239910"!?#"#!#7.+632#"'3327654& qn ~ GFKWB=X NcGD%קV3S=&"afIIow m=GUr&o+Xa&FvN&-%+5+5FUL![@1 #"#`Y/  _Y _Y@?2/]+?3/+9/_^]q+933333910 4$32#5&#"!!326?3e˚5Tq2p7MUB$w ZnF+=(T%L6W=,l&,juN@  & %+55+556=-="*t@7#$$"" ((, +#`Y $`Y "_Y _Y`YY ?3/+?++3?++9/+393993339933310! #"&'332'7!32)?32654!Ndl-X#@,VrM  V1( ^km%!III"鏟_= (@L!"" &&  *) _Y!`Y`Y  _Y "`Y ?3/++33?399//_^]3+3++3339933399393993399107!32)?!!?'7!!32654! g VX ^E^ ɧ a WW]CIIIJJuII鋣"=)@H" !! ''*+ $ aY"$$$P$`$$$ $$!`Y _Y?3+333?+33/39/_^]q3+393333339910%!?654#"!?#"#!#7.+632 7a~n ~ GFKWB=X NcGdII7|&IIow m=?&.vN&%+5+5m&&C!&+5O&N@ $&'! %+5+5Lk>S@+   _Y _Y `Y??3++3?3+33399333333910%#!?'7!!'7!C_ɩ  Ȧ { ɦKIvIIkIIIH$=Y@/  `Y  `Y _Y `Y _Y?++?+3/+9/+9933399331032)?'7!#'.+ 32654&#E_ ɝ7S&Wh^A|IvI 鏟rw =%=FeK=X@/    _Y`Y  _Y`Y?++3?3?++3393399333310 !#7'7!#4Xqf + ϒW9a1K jII=(='@G %'&     &'%%)(% _Y & "'  _Y ?33+333?339+33333999333339939933310%!!?'!?'7!'7!'7!  ZU T>3s uJ  {S^ 1 \g  g'II{8!II4IIIII IIpK,d@4 **'$$$.-'_Y-! !!_Y! _Y?2/+?+3/_^]9/]+93939993310"&'332654&/?>54&#"#>32GQG)V v3jb|PQ-n >V1nJ࿳, nf SZ }m=|@E    t       _Y _Y?2+333?3+3339_^]]_^]]]99333993339910#?'7!7'7!!? ɥ } p  ɨ   JuII3IIJJWPJm&N@#&&& %+]5+5=e@2      _Y_Y?3+33?3+333993399333993339910%!?'7!'7! !ղ v ɧ u Y0q  n ~GdIIvIIIIJ@Ip;=]@' _Y  _Y`YY?2/]+?++3?+339333933310"&'332'7!!?# Y-X#@,VrM  ɧ Ndm%!IIJIkkV=0m=+JL2m=S=3FiL&&=7O=K@  @Y _Y?3+333?3/+93333933107! '7!#"&'3327 e   ڃ]O@)   _Y_Y `Y??++3?3+33399333333310#!?'7!!'7!"_.Zɩ  Ȧ { KIwIIlII0=!^@/ ! !"# aY !_Y_Y?+3?3+3339/3+3993339933310%!?# 47'7!327'7! H>M~ 6 P 7iYq~m dJJ&P2[:II^lII 4=c@2   _Y  `Y_Y?+3+3?33+3333399333333933310%!?'7!!'7!!'7! ɩ  ǩ  Ȧ { dJJuIIjIIjIIK 4=l@7   _Y  `Y_Y??+3+3?33+33333993333393333310#!?'7!!'7!!'7!_.ɩ  ǩ  Ȧ { KIvIIkIIkIIS=W@/  `Y `Y_Y _Y`Y?+3/+?++9/+933339910#"#!32)?32654&#x5"LWCV` ^B wII"鏟sv= %k@7"   '&`Y `Y_Y  _Y ?3+333?3+33+9/+99333993339310%!?'7!%7!32)?32654&#n ɧ   VV ɿ_8 dJJuIIIIIv钜sv=L@( `Y `Y _Y _Y?+3?++9/+99333399107!32)?32654&#  V` ɿ_B IIIv钜svL [@1  !"`Y/  _Y   _Y?+3/?3/_^]+9/_^]q+99339210 #"/3327!7!74&#"#6;`5T6{T)*qCU:L'Q+6(nFQ669L-q@= ' /.#_Y`Y     _Y _Y *_Y?+?+3?+39/_^]+?+933399333310".57!!?'7!!6$324&#"326I^ ɧ  W'.}tw{t}oJJuIIx_w=i@6      `Y`Y_Y  _Y?3+33?++9/+999333399939310%!?#!?&54$) #"3 Ts uz-\< `M¦IIII`ͽIL}D2B *=@ $ $+,( OY(!!OY!??+399?+993339104#"32>%7>733>32#"}?{KJ:@xF?+yklF[O4r̃qs}$ &%vHD^oִ o(X@. #  )*  NY     &NY OY?+?+9/_^]+999333333910#"&5463232654&'7>54&#"BܿʎoyNCBD_N&=0 M ǻkYY*y wYTOh*}k.?"J@% #$  PY   PY?+3/?+3/_^]9999333310327#"&5467>54&#"'>32ň`?D:ou-恖DC=2Vh0@ci3#TQDNX:nh>[L9BN:EKp#):@ ##*+OY OY &OY?2+?+?+993392102.#"'>32#"&54632654&#"#'\ XY<>v$…hH;I}HIBCzIxm` Եuflcn0`HtA@y3 /0021!,,1 8'BC88B6>OY996102//NY/O_O_o )&$@)$PY)OY@PY?+_^]???3/+?+9/_^]q3+3/??3/+33939333993399333104&#"'632333>32#'.#"327#"&547####"'332>A3Vp,HH-|z*D78nA@4Vp,GG,|z*D78nA]n~^?"BW-n~^?,7S-(h@7( %%%)* )(OY  " ""OY" PY ?3/+?+3/_^]9/^]+93393339910#"&'732654+732654&#"#7>32L\P@(z_fnoXdAELD:K*ib:xgfJ6.P<_Ygcc;H4g yjgK0XK0&X@ !&x$%+5+5*8c@1      NY  OY ?3+/?39933+33?99333333999310!!'7!'78 ^V {4\ mTh ?IsRB!AF@% ! NYNY PYo ?3/]+?+?+393339310&#"#"&'7332>7>32!)@YD+Q6hW&A)= 3L/;|ѕ` ^ 6w $^ޥ̬B8c@3 ! NY PY NY?+?3/+33?3+3339339333310!##"&'733267'7!8Y 9Ls,54#""3267&>32#"'!>7#"&54632'7vAwI~3>AAxHw!5"9E-aE~݋SA;n ; of~݋T?C| L< (}]ΤAJ&'&:2A[Kh!R@*  NYQYNY /?+?+3?3+9933333333310%3267!!#7#"&546'7!^S8!i m Yĭbp ct gaPLBhra[(Bn#M@' QY  NY NY ?+?3+9/3+9933399333103267!!#"&546'7!iQ?%5 m QLlgo 1t 3^Y/BbclmEBsKf)_@0 ''%&&  *+&NY ""QY NY ?+?3+333?3+39933339333322310%32>7!!7#"&'#"&546'7!3267![)c`g m _per ct f[Cf faF*BBaUmf ]-Bs)aICsKha.m@7!$$ ,,*++  /0+ NY ''QY NY/?+?3+333?3+3993333933333322310%32>7!!#7#"&'#"&546'7!3267!'/,b\ g m YĭWq fl ct f'/@h f01E~0BBhX^ne ]-Bs)01KCs&$e@  ""  %&NY@H  OYOY?+?+3/_^]9/+]+993333333102#"&5467#"#!62654&#"ͲrJ@GK3,f6M?JQK+<LEq  ) op^f Pcky1Oq@! NY@HNYOYNY?+?+?3+9/+_^]+99333932239910%!!632#"&''7!3254w w O<+YDw0G-1ZB}:BDi1gW@  NY@H NYOY?+?+9/+_^]+9933339910632#"&''7!3254<+YDw0G-1@}:BDim@@  OY  PY(H@ HOY?+3/+_^]?3++9/_^]+339933310"#632#"'73267!7!74&z*9FK2qʆ*:Ljh>Tb!ûnK#g<4$d@7   &%OY OY    NY !OY?+??+9/_^]+?+933399333310"&=7#!'7!36$324#"32>vJ[ mI|-¦Ɗss;wID6(p|6(?IRV40L/Z&j@ &o%+55+55L?M$.g@:&''$$ ,, 0 /%NY"")OY"NY PY ?3/+?+?+9/_^]+39393339910#"#"&'7332>7>32632!"'32654&@YD+Q6hW&A)= 3L/;z@(.H~E$,NSMi6w $^ޥ̬~,jukXh6}@4      ! NY  OY@HNY OY ?3+3?3?+33399//+_^]3+33+3993339939339939910632!"'!!'7!!!32654&*04FJo II+%I-'V_TA~,[RBaDitlc^( "}@C ""  $#OY""NY" NYQY?]+33?+33?+9/3+399333339399910!#632!654#"!#737'7!+er_t ~f[?&j[ mgQmf%_B9t(aXKgB*8&v@ & %+5+5K0&XC&+53F&\u@ *&-' %+5+5KL0^@0 NY QY NY ??+?+33?+/?9939333322310%3267!!7#"&546'7!!^[@#j Y er ct f5aUQBmf ]-BseDFL;^@/*"00<=_Y99_Y49%  _Y)-?333+3?3+39/+39993333332104$32#7&#"327'7!32>54&#"#>32#"&'# FI1Ka~okD B F@l΍If9G(my{S z>̮[+| DD tm[4&' '<@)$() ''!?3?3399339933333310'&547!7>54'73##&547!  JQ)>?[v:{8 HrE\K(&BT2L1@-#\e\=3)BI=="+s@># $$!""(,-#`Y  `Y   $`Y_Y""_Y?+3?++99//3+333+99333993339107!!#7.+32)?#"#!732654&#  5\ T8` X:[5 _B II?ϳ éI 1?钜sv* *o@9((!  +,&$ $NY NYOYQY?+33?+??+9/3+3999333332239910>73632!"&547#"!'7!2654&#"0_X,N4raKp4iu w?69E#&0_h) LSRBopg] Pc~fL1@F#'/3 "'' 23_Y%`Y"     _Y _Y /*_Y?+3?+3?+39/_^]3+3?3+993333339933910 47#!?'7!3!2#5&#"!!326?3[^ ɧ a W<@e˚5Tq2p7MUB$=+JJuIIH ZnF+=(T6Q(~@G   !!')*OY OY       NY #PY?+??+9/_^]q3+3?3+999333393339910"&547#!'7!36$32#'&#"!!3267Mo F3F81H1WS};eK,A,IRBs8d>($:?!H"w@;!     #$!_Y!!  _Y?33+33333?39/3+33999939922333939910!?654'!?3!?67 +4C0L T0;r n| ~8T{M'fSBB!b6!IIIIo@BH+!x@<!   ! !"#NY ! NY ??3+33333?39/3+33999939933333939910)?#?4'#?367 s 1IO $ .8* KI{EDX M?/3??5)??fk?50B$H,2@a#""10-  $%%&/0,, 0''340%/11#-#`Y # ##"_Y',, _Y*?333+3333333?+39/_^]+33333?399999399229933393993339910!?654'!?!!?'7!!3!?67 .4C0L T0;r n+^ ɧ a W'T| ~8T{M'fSBB!b6!IIJJuII_IIo@BHZ%+@g &+(  !""#*+ +$$,-+"*&& ( OY      NY  $NY?3+33333?3?+9/_^]q+3/333/3?399999399229933393993339910)?#?4'#?!!'7!!367s 1IO $ .8* K7Mo F{EDX M?/3??5)??]IRBsk?50B=!$v@<$ " #   %&$$`Y  _Y"   _Y?+333?3?9/33+3+3399933333333322310)'!?!?>77! ! ?=` `iUv xd577! !:.MK=c 6 n=&91. \mRit  ivG-3R!lY CC]+BB|^)eBB&U3 J=.1@W#""1%%$ /) 0'' --23 #`Y/) # ##(%11"_Y&- _Y?3?3+33333?3+33339/_^]33+33999933333333332233339910)'!?!?67!!?'7!!7! ! =?=` `iUv xuI^ ɧ a W 57!!'7!%!]  ivG-3R .MK=c 6 n=&91. \I$54&#"#>32#73%B0-^O3p'#\ ^;)WL|xjb|PQ-n >V1nJ࿳{KզL@B#.Q#>I&Dh{nf SZ }V`!%!F5>G@CBAFF??C6 C : 33HI,HGDBD[FBPY6! ! OY!!!,00(OY0OY ??+?+399//99+9+?3+33393399939331032>32#.#"#"&5467>54+732654&#"#7>32#73%9.'HP]=NL"H F2&ISdAdmeOnoXdAELD:K*ib:xgL\զL=?(0(*7;$*$vryXWgcc;H4g yjgfJ!%!R=&@A &# " "'("_Y&_Y _Y_Y?+3?+9/3+3?+33?999333339939933310%!?#".''7!;'7!267!!e G c"R V%]W p  p~J 7'dIIT-I̫}IIITLed@2    !NY OY ??3+3?+3?3999333339939933310##"&547'7!33267e _[!KI EX f] cLjgA ]>NAB@Rd\EJL 1O@'!!  23.Y)@Y.).)$_Y_Y?+?+99//++99333310"$&54$32"'.#"3274&#"6323276c3tt?Q&6@:];_Gsu>Q&88 ωw$K("]S2;2J)"B  -H@&$  ./+RY&RY+&+&!OYOY?+?+99//++99333310"&54632".#"32674#"632327̌̌#2+($.J:K5F}C$1"2+(&.ִִ % <@s}<1%xL=@ _Y Y?2+?3?+3393933102#'.#"#'7!>bI0P *Hs3qi # BkLc[IIxr29@  PY NY?2?+?3+93393310'7!>32#'&#"= ,DdTI'J'&G'6gBruo}/@x&%QN &+55&&)  &+55JF L @f@50!5514(119AB=131_Y>35!0%-`Y)%_Y _Y?+?+?3+?33?3+3933993332933104&#"326".54$32#"&'733267'7!>54.'73${st|syBTܞQI`L3=1*<-?:.0.NY;02-"*OY&"OY OY ?+?+?3+?3?3+3933399933223104#"32>"&54632#"&'733267'7!>54.'73}?{KJ:@xF̌̌QI`L3=1*<-32"&'>32>54&''8տeI)'6+G 2 ׅC#>}y.`/#$h$--##/!"5$K 9 w+Y@-!% **%!(,-*@ PY %#!@!PY?3+3?3+399393333210"&'.54>7>32"'632654')A @()? >C%|V%=C%~O&`1%ƞ#..%ɚ$0t86ڱ9.9/$25F -u#\@2VGAM,3MG:G:]^/RKR_Y3OO7K\AA'YDY_Y>D K@Y Y!![?+_^]+9/+?3+333?333+3999333933331032;#".#"7654.5463232>54&#"#>32#"&'# 4$32#7&#"3267.99fjsF!Kve[09K+ }@2'4LHqגPf9G(my}iVsI1Ka~obMX-7-'.';A1Zx3=%10|B>l[4&+>36z>̮[H8)/4GX@ KSSNHH,==5&5 2 2YZ><K@8Y5>>K77DY77/77@ H7VKV[K( OY,/ #PY?3+333?33/3+3?++_^]+9/+9993393333310"&'#"&54632#'.#"326733254#"#63232;#".#"7654.54632&m(Dh|k{1I +<`9SWHBgFW4/KI1lW99fjsF!Kve[09K+ }@2'4MCFJĹ$\ud:H51H6\OPaV<7AAP"32s@80Ml]h^pI' Qy@ /333310$54632WQ>BW"&) zOcD:$-#?T66@ /3333107>54.54632ĵ YQ!JF>Kv| E=+ $2;Gb1:@#  dY OY/]q]+9/+3310"#>323"'./#Ӷ_h$œ2<2{^3*+ )7ESao@O^PPXJ . 4&&Jf36}oX]6o]]o6//9////33/23/33339333333333333105654.54632467#"&2#&#"#"&546"&'332>322'654&#"#"&546"&54732632%4632&#"#"&#"'732654&54632pd|x"*"7+3Ad|x"*"7+3AXXk%?$5!"&,MjXk%?$5!"&,M>g;-$-.C;>g;-$-.C]uDIn,F'- (BuDIn,F'/(BXk%?$5!"&,MXk%?$5!"&,Md|x"*"7+3Ad|x"*"7+3AuDIn,F'- (B"uDIn,F'- (Bh>g;-$-.C;>g;-$--CLm*@%)"((  +,))!%%@%Y%@_Y  _Y  ??333+333?+333333+9/9933333993339993310%#!?!?'7!7'7!267#"&'7}{  ɥ } p  @F|FRP|.!dJWPJJuII3IITg~%z(Kh! (z@>  & #  )* PY%@%#NY%QYNY??+?+33?++9/9933333333393310267#"&'73267!!#7#"&546'7!F|FRP|.!S8!i mfĭbp ct gg~%z(aPL&ra[(Bn=^@  `Y@Y  `Y _Y ?++?99//3+3+993399339103#32)?#73732654&#:` _B =zIzH钜svam "Y@/   #$NYOY  OY ??+99//3+3+99333939910%254#"%47#737!3#632#"&!<Fhrr&&`ND˱M PcnvH6hh ="|@A!" $#$!!`Y `Y _Y _Y?+3?++9/3/+3/3333933399392910!?'7!2'#654&+327' L [ ʨ svaO{ivaEutEiOhLaVIIvI:vFUuZx,vnL,@E,+ &  -.& %% -%##QYNY NY++)))OY?3/33+3/33?+?+?+333333399992910'#"'!?'7!632>54&#"327'‚meNqVbVE( hc Y}uC^*.=2DdbC:2kwRzD'!:3AA<1rKhiy-N ;@   `Y_Y _Y?+3?+3/+3933310)?'7!3!i ɧ@_32wyrO1+D:ou-恖vbOr?=2Vh0@cb1DPCDNX:nfz=uD4e9BN:EKpE=)m@'(("*+`Y'%%@Y`Y_Y(_Y?+3?+3+9/+33?3+993333339910)?'7!#.+63 !"&'3324&#"i ɧ7S dYEgQl,^PkuqIvIk |-d(Zl7 {5F#_@1"!!$%""OY!OYNY OY ?3+??+3+9/+33993333339910!"'33265!"#'7!#'.+6H⊋2G;VDEy 2Kd ?jӵ)BzRAK=)@R     %'&&% $$*+)$_Y  %! &  _Y?+333?3?3399333333+33333?99933333339939933310!#!?'!?'7!'7!'7! #2ZU T>3s uJ  {S^ 1 \g  g'؝_{8!II4IIIII IIphtD@P233546 1!/ /;*''4EF;;E,$PY,,926 6NY **99AOY<<)94PY?+333/???3/+39/3+33/+339933993333333993399104&#"'632333>32#'.#"327!#"&547####"'332>A3Vp,HH-|z*D78nA@4Vp,v<:GG,|z*D78nA]n~^?"BW-n~^?,7S-RK<v@< 77::41.'44..=>' =1_Y   +'++"_Y+7 _Y ?3+3?+3/39/_^]+9333933399333310"'732654&'&'332654&/?>54&#"#>32oPG>?I6.r)V v3jb|PQ-n >V1nJ࿳08R6UQE8Q ", nf SZ }W;qR8@J"5". '559:.98#"#"OY ##L#\#l# ##2. ..22*OY2OY OY /+?3+?+3/_^]9/^]+9333933333339910#"'732654&'&'732654+732654&#"#7>32L\08oPG>?I=2`(z_fnoXdAELD:K*ib:xgfJzW;q6UQE6XEP<_Ygcc;H4g yjgK=c@5    _Y   _Y??+33?3+39?933333333310!#!?'7!'7! #A}GR v ɧ u Y0q  _p;/IIvIIIIJ@*h8Y@.    NY  ?33?39+3393333333339910%!#!'7!'7!fę{4\ mTh  ^B&sRB!A?=!@M  ! "# !  ! _Y_Y?+33?3+33399//999993?993333339993339339910%!?'7!73'7! !#'ղ v ɧ u [/n3q  'a ~ n>]dIIvII~ IIS7Id3-*8@F        NY   ?33?399//93+3399399993333393333993939910!#7!'7!?37'78 ^V Z*Y4\ mTZ+Zh ?I?SRB![A=!@/  !"# _Y! @Y _Y?+33?39/993+333+333?993333399339910%!?#737'7!3#'7! !ղ v  u )@q  'a ~]dIIYzIIz IIS7I|-@E     OYNY NY   NY?+3?99333/+?+9/3+39933339329399103#'7!!!#737'7!`_V X \P ƦlD]\\ mhXBBBF"hB`=u@;   _Y `Y _Y?+33?+33+339933?993333333999310%!?#"#!'7! ! v ΠAG[B [@q  'a ~]dIIowI IIS7I|-i@5   NY NY NY ?3/+?+399333+3993333339329910 '7!!!"#!eV X \P h>8j;H2&wBBBBRKm=r@9  `Y   _Y _Y ?3+333?3+3339/+?9933993333339910)?!!?'7!!'7!#l ^^ ɧ  WW  ؝_JJJuIIII6h.c@2    OY  NY NY?+??+9/+?9933399339933310%!#!!'7!!!fJJp I& "!/,,!!12&&)QY)OY$$"NY$!NY OY ?3+?+??+9/+?+339993333399333310!"'33265!!654#"!'7!>326\≌2G;V)6t ~f[:*jY NUict#;ӵ)BB9t(adQBm[j`6 EL/<Y@-7" %:00.++%=>(3_Y(( _Y: _Y  ?33+33?3+9/+99933333333210%27#"&'# 4$!2#'.# ;7.54324&#"6z{qn^ .Uk1ȨMYï*'5a9/'bhS,7)3   u-g/|I[VXoÂY%O+5Y@-,*/11%   673OYOY /"OY*(?22+33?3+9/+99933333333210"&54$32#'&#".54632327#"'654#"ؖ,BJ\_Z-.maOHD 0y8X*4)c)+6 (/ۂ'xA}j^+;?+Zh\|FRiL/Z@/-*$101"'`Y"- _Y _Y?3/+?+3/_^]3?+933399333104$32#5.#"326?3#"'732654&'&F5T6Tb=MUBW&/{oPG>=L99w4+/9,0S4p6UUM9T 'Ro,L@(*'!-.$OYPY* OY  ?]+?3+?+999933332104$32#'&#"3267#"'732654&'.H51H6\OPXUK{9,&2oPG>?J33kjJ"32632!HfH#_K cfJ0z$jY HHdYeXh cmf9t(aP|79t(a_QBb_i]od ]&i=<7LCS@)     NY NY?+3?3+333993333333310!?'7!'7!c  j[>  t8j 7 GdBBBBBBYi=s@%   _Y @Y   _Y?+3?39/93+3+333933333993993310!!!?!7!7'7!'7! 06 . 68 | l  .zII2zII,IIJLCo@8    NY OY  NY?+3?3+3?3+3339933333993993310%!!!?!7!7'7!'7!GX=c  j=` >  t8j 7 GdhhBBZh>BBBBYK=p@9     _Y  _Y?3+333?39+333?9933333339939910)?!?'7!'7! #t @  e <  `؝_I\II_IIoIIkh'U@*$''"###() (" #& ?33?3393333933399993310!#&5467%'7!7>54'73!u$'* AHV +f117 ffv+! A #S<AU(A AKsA&4K=h@5 _Y  `Y _Y??+33?+3333?+399333333333310%#!?#!#7&'!'7!2؝_.T y cIk w kJJh!"`@1"    #$ !!OY!QYNY ?/?+?+?+333993333333333310#/3267!!#7#"&546#!zK>RS7(i mfĭPcbp _EHK3y 8n.aaL&gZra[  K0=#h@5 ## #$%#_Y aY  _Y??+3?39/3+3+33399333339933310%#!?# 47'7!327'7!|}4z H>M~ 6 P 7iYq~m d J&P2[:II^lII#hb@1  QY NY NY?+?+9/+33?/99339933333310!#"&546'7!3267!!BQLlgo 1t 3Q?%5 mfbclmEBs,^Y/&0=&@B    !!&&'(&!_Y aY  #_Y?+3?39///3+3+33399333999339939933310%!?#7# 47'7!367'7! HZ`%n#~ 6 P 7^n_Rem dJJ P2[:II[3lII#"{@?    #$QYNY NY ??+?+9///+33399333999399339933310;3>7!!#7#"&546'7!iQ=Z6-L5 m Q?FZ9@go 1t 3^Y!e3/BS0plmEBs`= ]@/  "!  _YaY_Y?+3?39/+33+333993339933310'7!63 !?654&#"!?w ~ H 6 7iYq~m JJe=8UII7[3g^II( K&L$,N@'("" + -.   `Y(%_Y_Y?+3?+9/3+339933333310%2?3# 57#"'3376$3 !"!65Д:Z?_J4@D+\D% '.Q^C&%')ksQE~eHP"+N@'#& ,-OY# )OY  PY?+3?+9/3+3399333333103267#"&57"'37>32>54&#"PJ~7,X_J0@ @+nz)EwZb 09%?JQ<yo e**&L'/^@/+%% .   01#`Y+ (_Y _Y  /?+33?+9/3+3399933333222310%2?3#$=7#"'3376$3 !"!65Д:Z?33_J4@D+\D% '.Q^6 " &%')ksQE~eHP%.b@1&) /0OY&##,OY# PY?+33/?+9/3+33993333339333103267#.57"'37>32>54&#"PJ~7,BQ43J0@ @+nz)EwZb 09%?8Q # <yo e**W=,&}N/&+5t&\I&+5D=*@@ )* *  $+,!`Y* ((`Y _Y_Y?+3?3+3339/+33?+9/993333333993310%!?'7!'7!!"&'3324.#ղ v ɧ u [(q  %Ql,^P7sg*odIIvII II<|(Z??TR,F h@5   !"NYOY OY ?3+??39/+33+33993333333993310 '7!!"'33265!!'7!eV X \≌2G;VE>\ mwBBӵ)B,RBK=d@. ! _Y  _Y`YY?2+?++3??+33933333933310"&'332'7!#!?# Y-X#@,VrM  ɧ}| Ndm%!IIIkkh!E@$ !# "!NY!NY PY ?3+?+?/?+393333310&#"#"&'7332>7>32!#)@YD+Q6hW&A)= 3L/;|ѕmf^ 6w $^ޥ̬&Em=%o@: #""&'`Y "_Y_Y`Y?2+?+3?3+3339/_^]+99333333339910"&'332>7!!?'7!!'7!DLt,^PlcG(^ ɧ  WW  ;E+ZkJJuIIII6F.q@@OYO_O_o NY OY?3+??+9/_^]q+?993339933339910#"'33267!!'7!!.,2GT,av"FJp IM~ 6 P 7iYq~m ʧ K&P2[:II^lIIJ#h_@0   NYQY  NY ?+??9/+33+3/99333992333310#"&546'7!3267!!!7Llgo 1t 3Q?%5 m YJbclmEBs,^Y/BhKV=r@9     _Y _Y ?3?3+333?333+3?99333333333393310!?# !?'7!!# û-ݻ # ɧ  ɧ}|I"zIIvIjIh8!l@7  !!!#" NYPYNY/?+?3?3+?+33339333333993333310%!###"&'733267'7!!mfĸ9LsP@DT9&A)= &Y54&#"'>32ň`?D:ou-.+d1*DC=2Vh0@ci3#TQDNX:.,nh>[L9BN:EKp&jN 2&+551OZ&jV *&+55F4=%v@"%!!&'%@!Y"!`Y_Y_Y `Y?3+?+3?+3+9/3+339333339939910%#"'7332?!?#73'7!#7.+!!(|[A#G/q# aR W@^ 1IQ7d䇘#z$ÉI*zI9zF5o@9 0(%*"*"67%(''- 3-PY* /3 PYOY?3+?3+?399+99//999333993339910'327#"'7332?#"&5467'7654&#"'>32ŀiOo+)D:ou-3x]?"G/q#jz[P^A=2Vh0@cd3/JDDNX:ߊ#z$è3nd<03g9BN:EKpE=*m@9 *' +,$_Y _Y * _Y?+3?39+333?3+993993322993310%!?'7!'7!#"'332654' @  e <  `5v䂆l0VA*Ux6dII_IIoIIz9ke${\GE4Z@/1$$ !65) 5'.OY*'! NY ??+39?3+333339993993310#&5467%'7!7>54'73#"'332654&'$'* AHV +f117 wa޵S1H EVlB.v+! A #R=AU(A AKs羍#/lPI[="@) ! "!#$  _Y" @Y"  !!_Y?3+333?39/933+33+3339939933299339910%!?'!73'7!'7!!!!? @ . e <  Hl dIIvzoIIoIIzsII+p@9+((!' $!!,- ,+(NY+$$'OY NY ??+39/+3333?+3333999299333310#&5467%!73'7!7>54'733#!$'* AHV +f117 عV v+! A #S54#"#6323267 M7\Ͻ agwvv3u'MW6̹@(JX_y 1+r"%,=CvzZM.S@++ $' /0'OY !!OY! NY ?+?+399//+9999333310%267!#".'.+732654&#"#76329:/$ ~_[UnoayPE#_:K*qxgCT)9;Z\ ɮ4sr[QglZ;Hgyjg\VnO(vKL(_@ ##& )*&$&_Y@Y$" _Y?+3??9/+9+393333333104&/?>54#"#632#!?6Ragwvv3u'MW6̹1|}4z - X_y 1+i- J5($Z@-$$""" %& OY OY$NY/?+?+39/+99999333333310%##?4+732654&#"#7>32Ys@y+noXdAELD:K*ib:xg<`d>gcc;H4g yjg$9=*j@)"#(# ,+(#%#_Y %%`Y%@ Y _Y ?+?3+?+9/+3393339933333310%3267!!"&547# #"&'332'7!@@(}km%!IIQD0V@+%&&' ..(''21&&++"NY+NY PY ?3+?+?+9/3939933333310.'"#"&'733267>323267!#"&547DAYD+0GFT?&A)= &gC;7ovm9:/$ »^7v݋? $Ϊ e,3sZ\ ɮ{w6+=(@C &!&  )*#_Y#`Y    _Y _Y?+3?3+33399//_^]+?+999333399333339910!!?'7!!'7!3267!!"&547^ ɧ  WW  @*)@I  NY OYO_O_o NY??+99//_^]q+??+993333339993339910!'7!!!3267!#"&5467~Jp II tm9:/$ »[RBaa,3sZ\ ɮ{w-FL @@ !"_Y_Y _Y?3+?+9/+399333104$32#7&#"32>7'7!! F7TxȟbuL V 7 z>̮[M DD  "!@@  "#NYOY OY?+?3+9/+39933310"&54$32#'&#"326?'7!ǒ-H G`_VOJT\a  _#Ȭ=@}}SBB-Ϻm=#M@'!!$%_Y `Y?+333?+9/933333310#"#!#7.+3267!#"&547U=8KWBOBX 0; EBu{F>(';u@< 7(#.//1#00<=4+NY4  QY //NY?3?+9/?3+3333?+999933333333332233104#"!654#"!'7!>32>323267!#"&5476H"XH cfJ/o&jY HGcYeHcXh> 2144/$ 9 aM|:9t(adQBa`i]eaod%_7818V` ɰyy/9,Q3LR /'b@3   %  () ""OY OYPY?+3/?3+9/_^]+99933339910%27#"&546?.5!2#'&#";#"y,R`ͼqEV:g\+H .>\aWJimWh^?IRwvnaE }0lfwek^D>F='V@'$# # !"")(`Y  _Y#`YY?2+?++3?3+393339333210"&'332'7!#"&'33267# Y-X#@,VrM  'L&5YB*NqNdm%!II0 0lRakL)>@ )*+! *&OY"NY PY ?3+?+?3+33933310&#"#"&'7332>7>32#"'733267)@YD+Q6hW&A)= 3L/;|Ѭ"XQ(@8`^ 6w $^ޥ̬1rsJL4LT=:]Z)!@ @P`/]]29/3310#654#"#7>?3 <)%NNq7-)+'1[W ^^t/ # @!@ H e?3+]223104632#"&4632#"&%4632#"&8)'98()8Z:''98()8;&'98(':)88)$:9)78(%:9&)78(%:9Nu e?10#7'7'7uVVVVVVVVVV/ @/ e?3]2104632#"&4632#"&8(&;;&(8/:&':8)(8)87*%9:)77)$::/ $@/ e?3]2104632#"&4632#"&38('98((8/:&'98((8FE)88)$::)78($::po /]2103"&547Rx$$D^P@/]q10'7^ע\B$%@  P@/]q]3]299//10".5463232654'7#".'. %->.2kK*?/ $+->`hJ*<-#))*",ZP8Ik1:=%'%*Z(iRj.@6,FN +@ 0P` @/]q]210654#72Nx$$X/10#'73Ͼo% @ @ /3]29/104632#"&%!72678)'98()8'bh o)88)$:9BU_N+@ 0P` @/]q]210!"'VgfN?ZZN+@ 0P` @/]q]210!"'VgfN?ZZ7N 3@$  0P` @/]q2]22310!"3!"'Vgf'VgfN?ZZ?ZZJ%+7>@"5) /##/?) @PH/+]q3]22333104632#"''7&%4632'#"&%4&#"326%4&#"326{XX{{X1'TZG{XX{Dm;)/X{+3%%33%%3/3%%33%%3RX{{XX{Gn>$8X{{X3+N\G{X%33%%33%%33%%33J%0@/?  @ P  H /+]q3]2104632#"''7&%4&#"326{XX{{X1'TZG+3%%33%%3RX{{XX{Gn>$8%33%%33=w  e?29/310#"'#3326?wk[.> #&&6hb g]{ %6+R!@@P` /3]]9/33103326?3#7&54 ")%NNq5:(,'1[W ^^u)/]210!737);!#D/10#'73ѻo//]210!7267/%bh RU_o @   /2]22310!7267!!7267'df 'df RU_U_y @/]10?'%sB9p7iN/ +@ 0P` @/]q]210654#72Nx$$J%0@/?  @ P  H /+]q3]2104632'#"&%4&#"326{XX{Dm;)/X{+3%%33%%3RX{{X3+N\G{X%33%%33R!@@P` /3]]9/33103326?3#7&54 ")%NNq5:(,'1[W ^^uNu%@0P` @/]q10#'73/ѻN=T@P@/]q]3]10!737T9!{o /]2103"&547Rx$$1B$%@  P@/]q]3]299//10".5463232654'7#".'.%->.2kK*?/ $+->`hJ*<-#))*",ZP8Ik1:=%'%*Z(iRj.@6,% 0@/?  @PH/+]q3]2104&#"326%4632#"&3%%33%%3{XX{{XX{R%33%%33%X{{XX{{? @    /3]q2104632#"&4632#"&:&'98((8/8('98((8)78(%::)88)$::? #/;@  '-9!3/333223104632#"&4632#"&%4632#"&4632#"&4632#"&m:&'98((8V8('98((88('98((8;&'98(':08('98((8)78($::)88)$::$)88)$::)78(%:9)88)$::`? /329/3107!4632#"&4632#"&`= ;&'98(':08('98((8)78(%:9)88)$::J? @  /329/33104632#"&4632#"&7#7!#L:&':8)(8/8)'98()8\H\)77)%::)88)$:9uuR  /3104632#"&:&&;;&(8)77)'8:}FT  /333104632#"&%4632#"&}:&'98((8:&':8)(8)78($::$)77)$::N` # !/3332104632#"&4632#"&%4632#"&:&'98((8Z8('98((88('98((8)78($::)88)$::$)88)$::/310!!F}%/3107#7!#gVbuu7 @   ? _  /]3104632#"&7:''98()8%)78($:97F @  @ P  /]3104632#"&78)'98()8)88)$:9B{ #@ 0@!!/3]29/]3104632#"&'4632#"&4632#"&8)'98()88('98((8:&':8)(8)88)$:9)88)$::)77)$::`m   /]3104632#"&T8(&;;&(8)87*%9: /31073''=L/310!!;L7@?o@H/+]q310!!G)`//10 3)V` w7  @  o   f?]3104632#"&78)'98()8j)88)$:97F  /3104632#"&78)'98()8)88)$:9  b?2/310"&54632"&54632G__GDa_?G_^HCc``FF`bDDb`FG_bDEaN  /3104632#"&N:&'98((8V)78($::Z  /3104632#"&8('98((8)88)$::1\*%gY_%!gY!a?+3?+10'46;267>32+"3!!&54767>F^L& PG#4 P+&=5y\]; C/u{/%-0:q kO7!3Tod /]310##?#7!L+ݠ%J/3267&54>32372%5&(1?_"?VZK/uE6.$eNFcђEl4T4#1!% gY_ gYa?+3?+10)!654&#!"&54>323!23{/1>(9y?/ 3'cIK% 7V-!D9;gC:RJHVCF/.+../A gY.a&b gY_?+??+9102?654&+"54>32;2#"'.'!''%7R#89_GP! ) 'Ekj-`8sY$)+?+׺bm-66)M4E98Xq)b gY _?+3?10"&54>323!2#"5476?>7I  #!#%>9R:O7c?@5`< ^fd2&F *ܔx^3N(?%>> 2b gY _?+3?39/10"&54>323!2#"5767>7#"56767>32!H3!4 '% 5a.AH*- /x# '+GWRKH/^D% $9=^Aqb77+xs2 -݌2B= 8d 72=/Ta gY _?+?10"&54>32;2#"574*"5#VA57 "R@A-iM+08 )   DD,)jY)_?+3/10#"'&#""547>7>7"&54632;2D %9/ !u )HfbVL% `KEfCb12= >֯f?L.  B/q;!'b 33gY_?+33?310"576>7#"&546323!2#"5?67>7!9 *%#YGM8I$* 2! 2W# 8(L> LG Iur=GH>2r$ !y.51 X)UZV(JvO?"<O5-h@Y00O0_000 005`!A jY_(gYa?+?+3?9/_^]+103654&5467"&54>32;2#"'&#"!654#"'>32;B<0$5 ->E8 $L ?}DQIOyL`k(KNd>~Hk5>&Z< ;D/cQBRdm})_Ro# $##gY#_?+9102#"&547>54&+"&546323FT5,;e{  ]=733G#m>8Bi_E7  A>9+ @MPhq c gY _?+?10"&546323!2#"57654&#F;H'%B5 +  &T;NC 76KK(A;""A gY_gYa?+?+10254#!"&546323!2!ʹKHdCA ^5b$gY$_?+??10"&5467>54&'&54>323!2#"&5467>54.#P: !&81@5%/l!.(A4* 46[9  79p:Q7Ex?=N1/>/XpILnH0"D&'! A gY _&gYa?+?+310"&546323!2!>>54.#!V;kRJh#35AoQCRDOG !`mH2JVY6@BcIR6?+5//A hY/`!jY!_556gY5a?+3?+?+9910267654&# +"57654#"54632;2>? !++"P|$1V gh8"%-@E oe\i^Vjt|7sHt:3'(Yi4 %dO7dgY_?+?10"&54>32;2#"5467>7>7>54&#-9#  8'    !   f    RF;+Q?& '# -  (/.2!]}wT  .@]D:7H0!  9+%gY_gYa?+3?+10!!25'.547654+"&54632;2A!%y%A984I 323!2#"&54673!2654&#;5!6 ~orkPMR3J3hH! |`Լ^PRW.M 5A5jYA_W)()gY(a?+3?3+33102654>7>54+"&54>32;2!3>54.5467"&54>32;2#"&#"/-; ;:.!/%F}y *=*z 6ThwRm)4=)[<!mBAM8T(DECGM)8UF4A2U5+'$G,"*)aA/RI=q@+*6jY** c$ gY _?+3?9/+10"&54>323!2#"&57654&#!32#"574&#"#"54675)#0&@H,!  %6Y)M@V#'3T 'weTAB*oF47)^' E;"a":?:'7-m|N;7jY:1:;gY:a$1$gY1_?+3?+9/+102>54&#!32#"574#"#"&5467#"&54>323!2!HcOV^&5($*:V] YM 4*#2'os0w{WbXP< 'oM'9=:(pEAD,kF:5{`B1 $c9/jY9_ jY _?+3?+?91067"54632;2#"'&#"#"=67>54#"5463232`kXQ9H/)& +'Q#R "Y':^K"+I?7#"&54632;2#"'&#"!XM(1""^E /y%/T8P.D!1;@3' /^)]x  A8 s 6t%T%@G'20DS;40>12$y ߚ&# { <%<"A bc<0gY<_?+??9/102#"57>2#"&54?>54.#!"&54>323 !$  6,ZAF%ZaD7C,,&PD.HTM@#3' !!FXpYx=-H%10=/3s\2! ?N(eHh a gY _?+?10"&546323!2#"57654&#F;H'%B5  O } &T;NC 76K =;"Z33;PFPjY) F_7TTgYa?+3?33+3104'&54>32!5467&54632#"'&#"6767&54>32#'&#"!>7> #Q): NX/4j@uSn!)LJ! 3I2& ^A8D&8 /67- 3ąbJK0u`*M7 SABMg@.ʓAQE}&6&u dV c#XC$,9/o5PMAf8. . gY a6 6gY _?+3?+3310!327'&5467#"&54>323!2#"547654&#!P5\ ffI@&4!%__'&E  *V9LS]&B7-^?IyUDK*eB #+epc"# tg];AT&o& o&  Dm _?102+"54>3HKkD /D])m im!IlHD!m+! +_?32102+"54>3!2+"54>3HKkD /D])HKkD /D])m im!IlH im!IlHIMT@*   NY NY ?3+333?39/+33939339999107!?3!?'!! JװE H o-xp<<9e:<@+$'@`'%&&  $)$$($"NY'NY NY''/' O _   O _ o  ' ' "NY&NY NY?3++3?+3?99//_^]q^]+++3333339339933999910'7!#7&+373#'#326?3!?!!?^ m,KPX:'K5K=^Ww2HK> 'ХZ xiKQBgjBBB3T,=o@91 ..8&&>?- ;#;QY#PY 114OY** 4 OY ?+33?9/+93+?+339993333992210326#"&54>?4&#"'>3 >32#"&32>54&#"1G#3>c\3gY,W`HN^6TI5i%KSF?,{`**"$p]YaDq{#;?IR\Wծ#B}[%&~kuV (v@B!(( % )* NY!O _     (NYNYNY NY?++?++9/_^]q33+3399333339329910##!?#73'7!234+3263>54+WOlW c=__9[ R=3JX_52[q} bRBgjB;@ SYNYNY?+?++93333310'7!!#"&54632c \ [?AXX@AZRBBAXVCAY\50@ NY NY?+3?+9333310'7!!"'733267u  oa9E&K -,K RAA~DA*^`@0      NY   OY?+??9933+3?99333393399310!!'7!^ p` <\ mT?IORB!>_@/   NY NY?+?99//399399+399399339910)??'7!732?3 b)ihJ[  -FKZKB7t6BBcrct8Y@-! NY PY ??3?3/+?+33339333399333310!##"&'733267'7!8Y 9LsP@DT9&A)= &Y|n?4#"'>3263 !"'#"&%32654&#"'326-J~7,U]SZVTO4;L_G/9MdH~)DxZa D9%?GTQJlUSodQQYc**L#,u@= '+#' !-.))OY  $OY OY@#OY?++?+9/_^]+9399333992292910#"&5467.546732654'2654#"j]J[ذ|q:F>/VBHCWZz e`Z%hMxwjZBrs kRBmkg[rl~ֆ6(@   @ OY ?+2993310654&#"!6$3 C8Sk$,hؚUMLGT;(@ @ OY?+2993310# 47!3267-@6Yn#RFTRHI"D@#  NYNY NY?+?9/++399333399102654+'7! +f{4Ge jŋz0 Ċwr<RBiVCd@5   NY  NY  NY OYOY?++?+9/+3?+993339933393104632!#!?.%;&#"xDN[ Db TFP [JGDQ ZeB{AS#|LTar f+]@0   NY NY NYNY?+?+9/3+?+993393299333107!!"&547'7!3#";_ kV~O Ctw6FmZqIGgjBTy@c@v0vj>E>@ @OY NY ?+3?+3293333310#'&+!?#"#2KlN QoHK2AA ^A@  NYOY?+?3+3339933333310"&546'7!3267'7!RZ  mROZUl 8 cU7z!< BB-2a|CCK6@   ?3333?332993333310254&'%7'#"'%'aX2Bj`0YlBt[?&R |Y ctGt N# 1[@- .$$"&&.23-/) ,)$ ?3333?399//3333?93333333310"&54632"&54632254&'%7'#"'%'0II01FF10IH11FFaXBj`0YKBtG22ED32GfJ/0GG02G[?&X Y ctMt T^ *f@6' '+, (%?"O""""""/3333/]]q3329/333399333333333310%254.'%3254&'%7'#"'%'aP|7?t(a_ Bb_h^od%__Bt/H#_K Q SJ0z$W Y HdXd\hKtT 1@  NY ?3?3+339393310>54.'73#'7@ "- SK{= r:2b ! A(\[gB+P@(    NY ?333?3+9/33393333333104/73##'7!3>o@$ Cnwg؅P 0~5dp$F A9Yq[fBn4*%y;@    NY@  NY?+3?+333333310#7#"#!326?3:F6i54#"#632326?3kQ]p/h@K.}Q\r1l@K.l`brjVp2l`dqkVo2(C@  & )*"NY% ?32+3333?993393310"&/#"'733267.5463232?39ek.*>A`PG$= ,@bRb?ӬEv,SB,#:<%R6:66:6{;\MЀnTvUC{*% 0@   OYNY?++?3933310'7!#'&+#y 3Ki^%RA=@       NY?3+333?3339393310)?!?3# gl[ KɰF?^??f\AK@' NY QY NY ??+?+33?+993333333104#"!'7!632!6.[?&jY NctWt ~faXQBj`4B9t"8'y@= $%%! )  ()  NYNY$ %NY?+3?339/3+3+3339333339399339933103?"&54?'7!3'7!267!# ,@ '-T?KQ  ZKL-' H , @(&B.#LaBBYoB@2]^M@  0  >?33333?39/393992239910#?3!?'!3>AS%nA^,,,,c2W#&@?&%#$%%  ##'((#!!& _ o  & & !>% /?3333?399//]3333333339933999339939910'7!#7&+373#'#32?3!?#!??U$76gx4"5+67w2<73aj%ZKC! +͂ X[ ,,,.0W#W@$ !!%$%_o/>?33?339/]399333993393310254&+2654&+'#?'7! IF52+d`\ZD:lkxd`#ia[h9=tX]ILF,,Sf cP~x.PW'k@.")'&& ()'_o& />?333?339/]3333393993399339333310'#?#73'7! 3#'2654'#654&+k8N N3d`#i Y?d`b8IF52.,AM,y2M4W~xBX]l9='0W1@ />?33?3333933310+262#'#?'7vJukxdb,,>2BWS@$   _ o   > /?332?3339/]333933399910'7!#7&+373#'#32?3!?(ew$66S4#5,57n2>62bj,͂ X[ ,%2WO@"  _o/>?333?3339/]399333999210!73;##733#"#7!,7-6#5+64}9*7$jxd2 6[X' ,Sc&`;@ !? 0?33?39/339933333104>32#7&#"32?'7!#"&cꗐ!3Jv^WmWMA)dgR.l{%h7o΄~~))62Wg@+   _ o     />?22333?333339/]393339933339910?'7!!'7!!?!iydj4%4dkxej99e2-,,*,,S--A-2$W -@  />?33?33933310!?'7!9eiydjn--,,4'X+@   ?/?32?339333310'7!#"'733267et^VX=!21*? ,,l99)2Wl@   >@   />?332?333339933?93339933933310!?'7!'7!#Kkzjydyd7ZDSP8n,,,,:,,T,~*2W/@   / >?333?339933310326?3!?'7!MDH F25ujydyr ,,,72Wa@     /> >?3?33333?33333993393333223310# !?'7!!!?qijyd'cAjyevuq2,,, ,S,,{-2WK@ /  >>?3?33?33333993333333310'7!#!?'7!ijEmijyd,,,,,2W`@      /@ >?2233323?333333399333993339910?'7!7'7!!? gxc~kWwdkyekZd2-,,,,S--/0-d&` '@ 0 ??3?39333104&#"32>"&54>32\QH{OYPI|Qߖu֋x,rvqqtm~zJ'[q!*_@'!%) +,%,''_o" ?!,?22/3?39/]39333339339992910# 5467.54%32654'2654#"Iyj[h~JXT VHGB]dlrwqV| YIa T>=N?<>fdc.ihɊ22)W[@. /?O?O /  >?33?339/]q393339933102654+!?'7!2#\i)? .jaye?maB,,,niH2OWW@     />?3333?339/3399333339329910!?'7!2#'2654&+2ecxdAdayX}dnIF*:,,,gd\,UBaXNE2IW=@    />?23?3333339933310?#"#7!#7&+x%?H-4''5=J$x}2, X,'W=@  ? /?33333?333339333107!3267'7!#"&546sjD `{Si^QH+,,vP&ge,,1x> X]@$     / ??333?333339/39333933333310# #'7!3'7!%9^?3?333?3?933333310#'#"&54>3273327&#"&A!Y1FYY`UA1!c./;;0E_h"R)6ffhgF@SR_-|E@ >><<?3?333?3?339333310'73>32#"'#4&#"326A!Y1FYX^UA1!./;;0E_9"R)6ffhgkF@SF%tc],|)9i@++. 4$$;:;*77!<@  <@ . 1( >?33333?9/333?33393333933310326#"&546?4&#"'>32>32#"32654&#"Mf)O=XX[=6-D!5{9*4a3M]]^NF-1BFj/!J> Z;z*E6St )FH"&-0k>.p\hg(B>vH>6{$ C@  <, ??3?3?33393339933104&#"326"''73>32.,<: 0A]n7 X1GVQH?S *'",9k^hi@&"M@  $#$> , <??233?3?3?3933333910"&54>32?'7!#''3267.#"DSNUE$`;!Z)&?: 0?Y&i]jhJ'$W-6H@/$J \%Ft9@   < ??33?39/333393310327#"&54>32>54&#"FmGR.~=qiUPX]Fa(HTt )9&)4pbdhEY?wQ%;t9@    ? <?33?39/39333331046?4#"'>32#"&%326QmGR/|>lnUPX]:J](HTt )9&*3kgdhE Y=wJ%+t(M@ " &&)**"_o?<?22?9/]393333933399102#'&#"73#'327#"&546?.546cB)1+6!F- +R].)UMhgeRL%2tE61#. I`,.:)[UF=U?*FR(&5s(I@ &&#!!*)*#( H<??23?339/+399333993310"&'732654'+732>54#"#7632BhIOMO5T! T%0\@'"+Fnwxf&0F=8 N >)GL?9k,Z]l!+}t 'G@" ) ()""%?= <?3?33?333933333399103267&#"4632#"&'73326767#"&,:@",C]jg6w !2Q9B "[.EVH@*$]|uO2AV^&,9k1af/@ >;?3?3233333310'73##"&54632GZ7ۍ6'&55&'60(''55''55E2^@   ,@  >;?33?339933?3333393393299107'73##'73470dA)7b''(*(?2u(j@  &# *)*#&>@  <;>?3?3?3333333?393333333393333104#"#654#"#'73632632#6+$U<= ,K?Y5Ut/BTw4?>F> :k0UD:S6(et7@wC< '(UD4,u"L@!!$ #$= <;>??3?323?33933333333310"#'73632#"'73327654%a@X5^8I@i6.& ?E U4(ix>AKvx D D:J%tt '@ < ??3?39333104#"32>"&54>32K&I.-#&H*hyT_hyZSEKYցk`]kE%Bt-@   ?<?23?333393102#"&'7332654&#"'6jesXY$j"+ 7Jj;,HQjtndpa g$LB9&]^Los#@    <?32933310654&#"#>32"/7 L`1--g*3W&hL#@  ??32339310#"54733267h  66L)2g,,+vt*s!O@ "#<; =??333?3?3?333329333910#"'!?'736324&#"326PW5(`><JVGT))<;'B[je'''$SbmvH@P_%9@   ;??32?333933333991027#"&546#?33#:+!W)AH=EUTW^ _7 p*>=*L'?1=K$fJ@ ; ? >;??3?333?33333393331032673#7#"&546'737'_@YA^8I;F=:V2d(jx=A 7K'IUq?@   <?333322333333393310254&'%57'#"&%'5:V2(jx=A 5'UI7&`@YA^8I?2?3333333?3?393333393333333107#"'#"57'73327'733273JdR?6D@*;HD?(7SZ524@IIu1d'}#G,}#G'J%jf3@ ;??3?333393333107654&'73#'7Zy(!1I{$fw:2'7Mj (I&s(F@ & )*<@ "% ??33333?9993393310"&/#"'733267.5463232?3(;AD33*2($$687)}hNX'?X2(#$2&$ 9 }I 32#"'4#"32654&'7>boiU1502b)GU7> IN.NXNX UZ^ g9I:y4-kg;@= ;?33?9333393333107337654'73'67&'4.s=&U+9?(e3$'>Xo @Q%'?@%# ()# )%, ??3?339933393939910#'&#"#"&547&5463232654''0*4F+.4T^my?oDZVK7T[7DJ7)8G,0`@dRg]fDV[mVphhJ,d)s U@ " !"<< ??3333?3?393339333999910#7$5467>324#">J- =T^=cMX[ë,;==R,)͜ 7 w \Van]U|f,fH@   = ;?3?3933333339939910.'73673#&/#76&R (y 3|*GbgC`dn '8G#d'6 L'2Lu>)?/@ EI?3?3393333107654&'73#'7Zy(!1I{$x:2'7Mj (H(}G~A+9@,-% ,G(I!F?2?39?3339333102#"'##.'.5474&#"32>CKg!>]cM$*3Be2>7"03+ .6-d[c38/ 5,0  7qTRlg0/a2**YCtWiF.uK+4r@; ,''&%%&/ &56)2OY)&,OY,,NY%" ""QY?3+3333?+9/+??+9993333333223103267# '#"&546'7!3267!632>54&#"J~7,X_=bjer ct f=1#j RFz)EwZb 09%?JQރ_mf\(Bs)aTQo e** $2g@7+,,,  %!!34QY  QY   (QY /OY?+??+99//+33+9933399333910"&''"#>?!32>73>324&#"32>mV h#wZ & i#zV=KxkC6$_+aNEzH$#Y$OU%;MQWͫbiyM>'5}@D !!./ %%7(67$!NY$ QY  QY   2OY.%%++QY?+33?+??99//+33+?+9333333939910"&54632>7'"#>?!2>73!'3267.#"rmA i#wX&i#xYc ;>9.&k*aSDuD.-/$OU%;L?#?>32#'&#"3#32673!.,AmZ% %ֲ[D'@ #5B< ,/AmZ<7E'zƲpkh;5 /-:G@_  G =BB458,++.."'(( HI=5;"77QY' ;QY%;;;++(NY +G0DDQY??3+3333?33+99//33+39922+3999993993399339399339939910"'!&+!#67'7!>32632673!4#";762>54#"Yqp6F`N? W'r:Y HHdYeXh# W$v2t ~3ZH#_K cqpJ2x/Lk{QNBb_i]od)ySBaP|7=.qtM*' aPt"-@D )   ,##  ./ ) QY))%%QY ,,QY NY?+3??9/3+3+33/33+399339933993339939910!&/!#>7'7!63267%4#"6tUB.t ~5]EH@^SA6Y Nct$ [,o\ _E%C;}-B,@kr!;},6Bj`,!aJu(?L%2q@=&34,+!!3+!!)#)QY#NYQY QY/OY?+?99//++?+?+333333393999310#"'2>73!7'"#>7'7!6324&#"32>‚VE i"xW  i#yXc Y}u=2DdbCHyDwծ!cz$;3$O32#'"2673!'"#>?'7!7O0#:7,Kp4,.ApX6M)/@nZ*u wkx LSq;53@B1X@-  QYQY OY??3+99//3++3993333993910#'&#"2673!'"#>7!2 @ &e,'2AoZ6M)/@mZUdd>mu3=3@c*2L@''/34'1.'$NY NY?3+?3+9339933333310#"&'332654/&#"#67&5!2#'.#"3273M+.B@qRbT{DMK)Y )#ZWAB6$-H(4 n+D7<4'*J)l,m@; (*&**  -.OY("QY(&QY((@PY?+3?399//+33++393339333910%27#"&5467&#"#>?#?33#32673"L1Dnw  &*c"_'s &= %*cB5jF#/id54?A'h3=M 50*j@7"# ),#+NY QY  QY ##NY)?2+3?399//+33++333333333999910#7&#"#>327#"#!2673#"'326?3: 10_'k$F6i%#"'>32#'.#">32A2#_-k;FI{H$]68$$rECZ7=HujxF<Ω*(%/2cgIOYE8^b@!     ;@ >?22333?333339/399333993339910?'7!37'7!!?#EISEI$$EISEI''E8    ,  F&S@)! '($'  NY!OY?+?399333+3333933393310"&547'7!"#!'2654&/[ 7T7`:H1 pl|\~=F-MO?AܟcCn/WcA@b255/<;877%/=>>AA/ / BC=<-*+>@>NY@2;8;OY7@58+$"("PY(NYQY?+33?+??+3??3+3?+99993333393993339391073>32!654#"!327#"'#7&547#?33#'7!x@bWV^t ~m67v.jo5&"L1Da8#zc\s &Mb][ m7\h^e;ZB^\(Txlyv50F#/''n(7.bA'hQBV@-   OY     NYNY?+?+9/_^]3+393399399103#!#73'7!}~;w wK}~8[ mhBh>B'Z@/   OY  NY PY?+3?+9/_^]3+393399339910"&5467#73'7!3#327Xa'st8\ mH"D*5 :[U h>Bhh5N#636nL'/@I#((01.$%  0-++QY$OY. NY NY OY?+?+?+9/_^]33+33?+3333393999333103##"'!?#73'7!632267!4&#"!YX2VE( h_^:c Y}uV5C=2Dd/w30h!:3AAhC<>Úiy'{@@#&&  "!!() NY#OY  OY?+?39/_^]33+33+333993399399399339910"&5467#73'7!!'7!3#'26?!ed2Z  m3L2l 8 c37OZz5lh>BB>CChnoa|tl9)1@C-% !(%%23//2  QY.(OY% NY"   *OY?+?399//3+333+33+3333333393399333310"&57#73>?#"#!!54'!#'&+3#%267!HK* F:K?G;׌"KJKH]q $d(hy" ff "vhdx?b[L"0b@3 )**!#12OY) & &QY NY!!-OY?+33?+?+33?3+9993932239910"&''7!>32#"'7332?4&#"32>mV\ mL=Kx|l%FO(@t+?C6$_+aNEzH$#ARuMQW[ʯrWbiyM>L#1n@; +* !! 3$23 NY OY NY.OY*!!''QY?+33?+?+?3+?+933333933310"&54632?'7!#"'7332?#'3267.#"rmA . c)FO(@w(;>9.&k*aSDuD.^AwӦr[OUvlvP;&LV(h@8&''(% ( )*&OY"OY(OYOY ?3+?3+3?99//3++9933399333910#?>32#'&#"3#!#"'7332?!!ޢ %ֲ[D'@ #5B_!FO(@w(mDE'zƲpkh䣼r[LD0=t@=17+))88>?7++4.4QY OY OY  .%OY :OY?+?3+?99//+3++3399333399339933104632!#"'733267!#"&'7332>767#"&%3267&#"6JnYFO(@6<c&]68$$rECZ7=HuA2#_-k;FJzH72*OLrp(%/2cgIOYjxF<FL t@>  !"NYNY OY NY?+3?3+?+?9?+99333333339329910 '7!#"'7332?#!'7!_V X \P#~ZO(@w(lD\ mXBB}ĵr[F3BL6:@NYNY OY?3+?+?+933333310%#"'7332?#'7!Jw#~YO'@w([ mZ}ĵr[3B'L7y@?, &44%%"5""895%NY5*1OY-*  QYNY?3?+?3+3333?3+?+99933333333332233104#"!654#"!'7!>32632#"'7332?#6H#_K cfJ0z$jY HHdYeXh_t%ZO(@w(faP|79t(a_QBb_i]od%_}·r[9t*L&e@5 ##$$'($NY$ OY QY NY ??+?+33?3+?+993333333333104#"!'7!632#"'7332?#6[?&jY NctWt&ZO(@w(faXQBj`4}ȱr[9tnL$1j@8%23+* 2* ("(QY"NY.OY OY ?3+?+33??+?+33333339933310#"'73326?#"'!?'7!6324&#"32>LH(EZO(@32#'"3#"'7332?!'7!7O0#:7,Kp4W!yZO'@v(u wkx LSr[RBL8W@,2%)%9:2''/NY+'NY OY ?3+?3+33?3+9999333333310#"'73326?#"&'332654&/.5!2#'.#" 0yZO(@T n+D7'D85M^Ls,Y@.( '' )  -.OY( OY((%OY"OY?3+?3+99//+3+993333339910"'73326?!#"'733267>32#'&#"!FO(@(@ 'e,!r}nMrv\mL#N@(  !!$% %#!NY # OY OY?3+?+3?3+333393393310>54.'73!#"'7332?!'7J "- S4#DQ(@v( = r:2b ! A(\ÏrGgBL2j@8*22"#11!""34 32"NY2'.OY*'! NY ??+39?3+?+33339339933339910#&5467%'7!7>54'73#"'7332?#$'* AHV +f117 VDQ(@v(v+! A #S<AU(A AKsA|r[L O@(  !" !NY  NY OY?2+?3+3?3+333339333310"'7332?!7#"#!326?3,DQ(@v(F6iT;JU+-%gyP;3"LF)7b@4*'01 $$ 89""OY" OY 4OY0''--QY?+33?+?3+?+399333933310"&546327!2#'&#"32?3# 4?3267.#"r$fEgd>'@ &e,E&0@'Bh 5@9.&k)aQ!DuD. jm~P5zm6@EUvlvO;'.L)2[@/*# -#34*OY** ''0OY' PY OY?+3?+33?+9/+99333333310326732?3#"&54?#"&54632>54&#"^J~7,( W?@(UFlewqz)EwZb 09%?F#rru>T^7&o e**L@l@7: >>77AB/##) B:PY244PY4(,,%OY, OY?2+?+3?+339/+933333939339102#'.#">;#"'32732?3#"&5467#"&546?.546&E/*DH'HZ/! CKHoMD/' V?@(UFlek{xDMs[Q0S  { 1JL`DF$rsv>0{hkAwL7r@?!&4489 -8"!"!OY""" ""-11)OY1 OYPY?33+?+3?+39/_^]+9339393310#"'32?3#"&54?32654+732654&#"#7>32!L\WSV?@(UFle&z_fnoXdAELD:K*ib:xgfJ)rsvGI<_Ygcc;H4g yjgLl,5t@>0 #&-'67'--OY **3OY* OY  PY?+?+3?+9/_^]3+39933333333331074>?4#"'>32332?3#"&547##"&326J~7,X_o W?@(VEleX3飊 ~)DxZa D9%?JQ'&F#rru>ToZc**4L$P@*% &"SYNYNY OY ?+3?+?+?+39933333310%32?3#"&5467#'7!4632#"&Qw V?@(UFle[ m[?@YXA@ZZF%rsv54&#"'>E[V?@(UFle@H6\OPZSK{9,Rźޠ'rrxFIt32#'&#"KV?@(UFle Ӻ[D'@ #7DA[)rrx!H}mswuKL)V@-'$! !*+&$NY&NY OY??+3?+??+39933333333310%3267!32?3#"&54?#7#"&546'7!^[@#j m(W?@(UFle er ct faUQCrru>T;mf\(BsL-n@8"**, (./(.!,, NY,,)+#)#NY()  OYPY?3+3?+3?3+39/+3333939933310#"&'32?3#"&54?32654+7#"#!K,q+V?@(UFle&9I[ N8j:H1  /)rsvGI!cZ<A12_-|d?%<t*;w +'+? ;?3?39/3104>32#'&#"632#"'#67&2654&#">YZ+e + 7,P3CBCQyfm9=0 +6/-:46o` g#IO">4J\;*7TF)M!'-C'r$e@) #%& & ?,?2?399//99299333339393993310&'77#"54632&'72>54#"^/5 ZU {֬'/ :#=*>"<( (A9cJCwɜV32#'&#"3##aek6)& (| {&*Iwj C @L^?gI@ ;> =?33?333?33933399399103#"'7332?#73'7!4UY k=#&<r rOXE@r)((*~u)W@"  +(*+;"%%< ?=?22?333?333?9333333910"'73326?#"54>32732?654&#"KW(=LW !f5MWld15I ,"<`*c _q:&jh@2xH93&B=~jC1gL@ =; ;??332?3??3933333339910#"547'733273#7N>5DB.1R7&g@wd'}!I'2P@  ,@   ;>?3?39/333?3933993993310#7#737'7334632#"&"#<-W W#7,P 5('44'(5-(>'>$75&'68y'g%@  ; ??2?3933310"547'73327BCK+ M'jv'S-1 '2g %@   >;?3?3933310'7!!?7;Q7:1''7((>2e  ;>?3?39/333103###737'735K K$H-K L"7p>'>(p+&O@ $  '(, ;!! >=?3?333?3?3933333333310#"&546;'7!3#"&5463227#"kGLhQUY`cE R7$(65)$7DbU)0Xh93EX'IA(58%$75'r'Q/)@  , =?33?3933331032?3#"&547'73%'36^h6.' D [W!4'#-7@,> =?33?3?3933333310#"'7332?#?'73<\S+.' D >6hKso D 7('2Ye-@   ;>?33?33393331032?3!?'7!lT04--;Q7=Ypg(''-t-o@& )%+))/!./%!!'#<;>=?22?3?3?33/3333393333339933333310"'73326774#"#74#"#'73632632T8.& 8L?*;IE>(7TZ4JePM- D DT#G -d#G('1@IIu1Mp~F/g#n@  ! % $%; ;@ ?!=?2?33333?3?393333393333339910#"'#"57'73327'7332737JdR?6E@+9IE?(7T5/6@IIt2f'{#G /{#G'v-t"Q@ $ #$<; = >?2?33?3?33393333333331074#"#"'733267'73632EB,3Xm8.&  2a4K?72!Ip~ D OI('1@v(D-t&Q@$( '(  <; ># =?22?3?3?333933333333310"&54774#"#'7363232?3[^hIB,3J2Z4KP&&3-]W!I[('1@v9# .' D %eM@   ? >  ;?33323?3?339333333333310'73'73##"'73326772<;Z\#VH !6/(((NǣZ J&dt 7@ < ??3?39/333393310#"&54>32267#"3654dNeoeMe46s/2 pcgdqbnlX,++`^9)\,CT&e@   &  '#(/&<  ? =?33?333?333?3329393393910!?$546?'7!%7>54&'C#<?#;(@>Wc-7C 8D.u6I@4((8."78" ,?<30=?22?33?339993333333310"&5467332654&'.54632#'.#"+32?3_f%( ='9=8;I9hG\( :.4=7F=| 3&&3.^UO5)!J1_rB*% "D5jyJV D f-/@ - =?33?3393333310'&#"#"'733267>32 <vn7.&  2vk=$Adq} D OIxv `/"I@ #$; ?=?22?3?333933333339910"'733267#"57#?33#3277.' 3AI[\Zv vB/"-m/ D Frn s'> 8 Tx+#e#w@,% ""  $%  ;?>?3?333?39/333333393993399339933910#5#"547#737'7337'7332?#j#4ڀJ8 8"5+"0+7 .12(1@w?''?dI 'g(U@"#&&* )* #" ;??2?3333333333933333993310"&546?#"#7!32654&'7!#'&+:^<#-%!+DLvW\'-!- ER[j'f^h= yY|qg/J=hJ|]'g?@  ;??2?333339333333310"57'7!3267'73G8<2H8hDM 9HA9&'-=''a>FC(( m'u";@$ #$<; ??2?3?33933333910"&547'7332>54&#"#76321`d16FJBn<+%-6:FH1_'[X&'u!JdL:/ VRMCD28s4@  < >>?2??3333393310#&5473~Zy(!1I{$2:2'7M(2&e3@   ; >?223?333322333107#"#7!32?3 W@S#+YP36,62]  -e!I@ "#;!> =?33?333?3339933333331032?3#"&547!7#"#7!32?-2&&36^h X@S#+YP36# U D [W9] e"V@ !#$ ;@ >?333333?3339933333333310#67#7#"#7!3>32#7"326540-1X@S#+.8B45`L2W]/82P*&] LV4&:Dl .+`gC@   ;=?2?3339/333333339310"&'732654&+7#"#7!7bCX_qL<8^S#+TZ+.lNL$]lQc& 7@ , ??3?39/333393310#"4632267#"3654`k`h3M 3GږְMzK,G `@ Y@ @"Y /    ? _  /]q++333339310"&54632"&54632353-@A,,?>-@A,,?>?@-->=..?@-->@+.?o%!,G `@ Y@ @"Y /    ? _  /]q++333339310"&54632"&54632!53i->?,,A@->@+,A@k??..=?,-@?.,??,-@!s%F-0@&&! +./3333333333310.54>54.54>54#"5632KR[.(1)8OF'%   <%#   U?@'     Y/]q+_^]233310#"#"547332>;r/dCH]*\u)VcwKg'-0%+1+5+D!@ / KY/+_^]10!5!73D!;널DK@ Y//]+10!'53!D!;)DK@ Y//]+10#'!5!D;rߩDK@ Y//]+10!#57!Dq;Q)D +@Y @Y/+_^]+10#''53%D;;uw)uwD +@Y @Y/+_^]+10%#5773D;;wu)wu F!@  /3332233/310>;#'"!?'73),a(!*C$;;47})/H %% % &y/93310#'573>Fr@   /9/93233107'53#73#'5s>>JJH&$J&DX &%N.&+5&ETo =&%o&E =&%&EFPi&&'vNz$&+5P&F'vz&'N!&+5&Go=&'o&G=&'&G=&'&GVJ=&'!J&G!&( V %&+550u&H'C_!&( V %&+550u&H'vJ=&(J`&HTg=&(g`&HP&('zlN/&+50P&H'z4&)vN"&+5LT=&I!&+5Fc&*N$&+5L&J/&+5m&+N%&+5( &KDX%&+5om=&+(o &Km&+jN (&+55(#&Kj, (&+55Pm=&+ziP &KzJm=&+ (J &K0gW=&,9g0&L^W &, /40 &+555/&&jv@H+55&.vN&+5'&Nv&+5o=&.o&N=&.*&NNo=&/lo6&Ooc&/'GNl&+5o&O'&+5=&/j6&OLJ=&/=J6&OV&0vN&+5'&Pv:0&+5V&0XN"&+5'&P4&+5oV=&0'o&P&1N&+5*&Q#&+5o=&1*o&Q=&1*&QZJ=&1*J&QJ!&2  '&+55 &R'vT ]5J &2  '&+555 &R'j,+@11@H1p]qqqq5+]55J!&2  '&+55 v&R'CJ!&2  '&+55 v&R'v&3vcN&+5nL&Sv*&+5&3N#&+5nL&S.&+5&5N(&+5*,&UP&+5o=&5o,&Uoc&5'N.&+5oT&U'E=&5,&U%&6N5&+5&V#2&+5%oL&6o&Vd%G &6  =&+55*&V | :&+55%) &6  /&+55,&V  ,&+55%o&6'N5&+5o&V&#d&&7TN&+5>l\&Wo&=&7>>ol&W1&=&7l&WyJ&=&7lJl&Ww=&8 Kw0&X{g=&8*Kg0&XJ=&8RKJ0&X!&8  &&+55KA&X'v]T &8  8&+555K0&X'j@222@ H+q55]]5x&9N&+5s&Y{&+5xo=&9zo&Y&:CXN&%+5+5O&ZC,@ &=%+5+5&:vN@ &%+5+5O&Zv@ &%+5+5&:jN@ &>$%+55+55OZ&ZjM@ &x)#%+55+55&:N&+5]&Zh#&+5o=&:o]&Z&;N%&+5&[/&+5&;jN (&+55Z&[j 2&+55i&<N&+53F&\,&+5&=.N&+5;&]<&+5o=&=Vo&]u=&=&]( &K\>&Wj]&Z3 &+553F&\q #&+55&D*&+5LT<&A&+5Q(h@ #  &&)*# @Y   `Y_Y`Y?+?+?+9/_^]+999333333910"'732654!72654&#"!?6!2>hGf<zax. +N  7]x[inJ oH&$=o&D&$ PN&+5g&D *&+5*&$ +N !&+55g&D h .&+55&$ -N !&+55&D b .&+55&$ -N &+55&D b (&+55&$ -' &+55&D b (&+55o&$'mN=&+5o&D'&$ -N &+55&D h &&+55&$ -N &+55&D h &&+55&$ -N &&+55&D h 3&+55 &$ -0 )&+55&D h 6&+55o&$'oN=&+5o&D'o=&(0o`&H&( RN&&+50`&H b,&+5&(N&+50s&H"&+5,&( -N *&+550g&H h 0&+55&( -N *&+550}&H h 0&+55&( -N $&+550$&H h *&+55>&( -N $&+550&H h *&+55o&('N$&+50o&H'W&, MN&+5/Gf& @@H@H@ H+++oW=&,Zo0&LJoL&2 o&RJ&2 N(&+5 &R %&+5J&2 N ,&+55 t&R u )&+55J&2 N ,&+55 &R u )&+55J&2 N &&+55 1&R u #&+55J&2 ' &&+55 &R u #&+55Jo&2'N$&+5 o&R'J&bvN5&+5 &cvJ&bC|N5&+5 &cCkJ&b N:&+5 &c J&bN0&+5 s&cJo&b o&co=&8Ko0&X &8 N'&+5K0&X $&+5&qv N2&+5KG&rv&qCN2&+5KG&rC&q N6&+5KG&r &qN-&+5KGs&ro&qKoG&r i&<CEN@ &%+5+53F&\C@ #&c$' %+5+5io=&<K3F&\i&< %N&+53F&\ !-&+5i&<N&+53Fs&\~#&+5&c&c)&+5&c&c /&+55&c =&+55&c /&+55&c N&+55&c @&+55T&$H?5T&$/?5[f`&$d "?55f`&$d ?553`&$ "?55Q`&$ ?55&$] 3?55&$9 /?559&g>&+59&g0&+5K&g D&+55K&g 6&+55&g D&+55&g 6&+55BH'(7%?5iH'(0!?5AQT'(X +?55iQT'(X (?55QT'(X +?55AQT'(X (?55*K &i-&+5*K &i&+5*K &i 3&+55*K &i %&+55*K(&i" 3&+55*K&i %&+55*KA&i D&+55*KA&i 6&+55+5H'+ %?5i5H'+0!?5#T'+Ϯ +?55KT'+Ϯ (?55T'+Ϯ +?55#T'+Ϯ (?55p'+ <?55p'+ 8?55N+&k!&+5N(&k&+5&k '&+55;&k &+55,&k '&+55N&k &+55N4&k 8&+55N4&k *&+55+H', ?5iH',0?5AT',X ?55iT',X ?55T',X ?55AT',X ?55p',X ,?55p',X (?55 &R)&+5 &R&+5 &R /&+55 &R !&+55 &R /&+55 &R !&+550UL'2%'?5nUL'25#?5AT'2X -?55iT'2X *?55T'2 -?55AT'2 *?55E&w+&+5E&w&+5E&w 1&+55E&w #&+55E&w 1&+55E&w #&+55E&w B&+55E&w 4&+55iH'<'0?5(T'<S !?55T'<S !?55a'<S 1?55+|&{>&+5+|&{0&+5+|&{ D&+55+|&{ 6&+55+|&{ D&+55+|&{ 6&+55+|&{ U&+55+|&{ G&+55L'[4?5-L'[0?5-T'[XŮ :?55A-T'[XŮ 7?55eT'[ :?55eT'[ 7?55Re'[ K?55Re'[ G?55&c.&+5&c .&+59&gZ5&+5G&g5&+5*K &i$&+5*K &i6$&+5N"&k&+5N&k&+5 &RU &+5 &R &+5E&wt"&+5E&w"&+5+|&{C5&+5+|&{5&+5E&c'E&c'E&c'E&c'E&c' E&c'E&c'E&c'ET&$'pb?5ET&$'Wb?5oEf`&$d' "?55Ef`&$d' ?55GE`&$'X "?55eE`&$'X ?55E&$']b 3?55E&$'9b /?55*E &i'*E &i'*E &i'*E &i' *E(&i'"*E2&i'"*EA&i'*EA&i'+E5H'+' %?5iE5H'+'0!?5#ET'+&Ϯ +?55KET'+&Ϯ (?55ET'+&Ϯ +?55#ET'+&Ϯ (?55pE'+& <?55pE'+& 8?55+E|&{'+E|&{'+E|&{'+E|&{'k+E|&{'+E|&{'+E|&{'+E|&{'EL'['4?5-EL'['0?5E-T'[X&ŮC :?55AE-T'[X&ŮC 7?55EeT'[&{ :?55EeT'[&{ 7?55REe'[&{ K?55REe'[&{ G?55&c)&+5&c,&+5E&c'E&cE&c's&c)&+5Es&c'&$iN&+5c&$\N&+5H&$?5H&$C?5EH&$b @&@  ?_/]9333104.54>327>! <(.: KJ4 :5GF.E @  OY?+33310"5?3327327>! <(.: KJ4 :5GF.QI#z,@ Y @Y/++9310"'&#"#>3232>73V`1! h#b5T.4i'IX-$O0&-$;]QA /K@%-  10(Y ,##Y#@Y /2+3+9/+93333310"&54632!"&54632"'&#"#>3232>73&0II01FF0IH11FF1V`1! h#b5T.4i'QG22ED32GJ/0GG02G,X-$O0&-$;*E &i'*E &i*E &i'E*KSs&i&+5*ESs&i'~%>'(,K?5D%>'(,K?5~>'+,K?5D>'+,K?5Em=&+ T4@ ?_/]933333107!%4.54>3276y9#"<+1= $G%! 7!>7MJ+,4@ ?_/]933333107!'4.54>3276z#"<+1= $!K% 7!>7MJ+sG'V@1##%%()Y% Y +%%%%%@ H%%/_]+]q+9/+93933310"'&#"#>32326734.54>3276=W_2#i'`4L G!"i'!:*.; }W.&M+?'I3!;4GF*N&k&+5L&k&+5N&k&j4@H+55N&k&j,4@H+55E s&k&+5E i&k&j@@@H+qq55&,kN &+5c&,rN&+5~>',,K?5D>',K?5|2@   ?_/]933333107!.54632yytaD06N(<@$G%!hMSq-&E%)T2@   ?_/]933333107!.54632zԜytaD06N(<@$!K%hMSq-&E%)sG'T@0'$()Y Y +@ H/_]+]q+9/+93933310"'&#"#>3232673&54632=W_2#i'`4L G!"i'ZB,6C,9<}W.&M+?'Ik6Pk*$E&E&w{&+5E&w &+5E&w'j4@H+55E&w'j4@H+55L&s)&+5L&s&+5Es&w&+5Ei&w'j@@@H+qq55i&<N&+5ic&<N&+5H>'<?5fH>'<m?5iH'30?5\^ F@ @Y /]q9/3+393339310"&54632!"&5463273-@A,,?>-@A,,?> l@-->=..?@-->@+.?G%!\^ 5@ Y /9/3+393339310"&54632!"&5463273-@A,,?>-@A,,?>Ell@-->=..?@-->@+.?!K%38=4@%/Oo?_/]q93107!8G%!+E|&{'M+E|&{+E|&{'+|s&{0&+5+E|s&{'~L'2K!?50UL'27!?5~eL'[K.?50L'[7.?5EL&[8x7@([/Oo?_/]q+93107!z8!K%97&@ ?_/]933310&54632[B,5C,v6Pk*$E/$*//3310#*T 0@    //39/9333333310#'7'77'*T7777Y7887 2@   //99//3323333310'7##!'77RJ77}m}8L( 0@     //99//3322333310##'7!(R77J}78}%%@ Y?+3310!5%%@ Y?+3310!5%%@ Y?+3310!5%As'BBkQ@ Y?+933310467#"&ƽ8R,*FZETg1\=L"!,SADlaQ@ Y?+9333105>54&'&54632aƽ8R,)GZETg1\=L"!+SADl#-"@ [[/++933310%5>54&'&54632ƽ8R,)GZETgj1\=L"!+SADlR @  Y ?+9333102.546>Kb6-[MR<4^..7]]-yQ%6@  &'#YY?+?+9333333310467#"&%467#"&ƽ8R,*FZETgƽ8R,*FZETg1\=L"!,SADlW1\=L"!,SADlQ%6@  &'#Y#Y?+?+93333333105>54&'&546325>54&'&54632ƽ8R,)GZETg\ƽ8R,)GZETg1\=L"!+SADlW1\=L"!+SADl+-%:@    &'#[&#[[&[/++++9333333310%5>54&'&546325>54&'&54632+ƽ8R,)GZETg\ƽ8R,)GZETgj1\=L"!+SADlW1\=L"!+SADlR&d$ =@    Y [??+3+3993333310 #773%%BMl^**vB@u@B%x@@     Y  YYY?+3+3/9?+3/+3993333333333310%#7'7'773%%%_*8|=m^**v;@p*t@DB@u@BD` @  ?/]]9310"&54632urrrtttta/ #:@ !!$%[ [ [?+?+?+99393210"&54632!"&54632!"&54632Ea`FEa`lEa`FEa`lEa`FEa``FEa`FEa`FEa`FEa`FEa`FEa@ //333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332332310###!!!TuO .@    /3/9/3333333310!!5!###uTON.R'4@M@.("A;G5  "5;ON>JY9>[9CY9%1Y %[ *Y Y [ Y OOzOkOTOEO6O&OOOOOOOOOtOeOWO8O)OOOgOOOOOOOwOXOIO:O#OOOOOOOOOzOfOWO6O'OOOOOOOOOwOWO8O)OO@} O7OOOOOOOxOiOZOKO54&#"#"5463232>54&#"%!"5463232>54&#"Ė >Ȭ~JF1P,"*1K+ͫȬ~JF1P,"*1K+S >Ȭ~JF1P,"*1K+f.:zjNEIlzjNEIlƝ.:zjNEIl\=!@?]933310!#h=\=1@ ?2]29333333310!#!#hh=\i= )@  ?33229333103#3#3#=TTT=pJ_Su@YY@tdRD4 pdTD4+hdPD4 4$kTD7k[Kt[D+tD$^]_]]]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]_]]]]]qqqqqqqqq?++339333103#7d|d S{|cBJ T]@YY@{k]M=- {o[ g{k[O?$[K+t;7tdT{4k;+_^]]]]]]]]]]]qqqqqrrrrrrrrr^]]]]]]]]]]qqqqqrrrrrrrrrrr^]]]]]_]]]]]]]qqqqqqqqqq?++339333107#3d{d JB=&*!@o?/]]]]]5555T@ Y/+3310!5!"P=@ ??333310+3{x= #/]@3-''! 01 YY  *Y0 **$Y*?+_^]+99//++9333333310"&54632"&54632"&54632"&54632DEa`FEa`Ea`FEa`Ea`FEa`Ea`FEa`J`FEa`FEa`FEa`FEa`FEa`FEa`FEa`FEa:@      /33/9/33333333333103#5!#3###TOON 0@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG 4@    //399//33332332310#'77'*TT~~~ݵqqp .@    /3/9/33333333103#5!3###TONx= Z@1   Y      ?3?339/]q333+393339923910#7!733376ʎ]P( b({C0 w=R@)YY Y ?3/+?+9/+3933393333102#"'733254#"#!!6\u^eA#DsA+CH!0sdw˒j=1@  Y?3/+9?3393310#7!#!A)4 JDB. F *d@7 ! +,&, ((Y L\l Y$Y?+?+9/_^]+99333393339910!"&5467.5463232654&#"3254#"6>ofX+4jo@4< %56_-0\DC.S=l_ctY6j|_ToZ,%g 60izKZ@ /?_oP/?oT/O_ @DMHpO/_   Y   Y @Y?+3_^]+3_^]3/+9_^]]qq+qr^]qqqr993333333104#"#'73632#64$[@X5`9J :U3'ix$(JUqdX< *,LFj8)H7H;?CL= ͼ50A U= hk =F{i+28@V83 56 /!. ( 9: 6688//`Y.3355!!##_Y  (?223332+3333?32333+333933933393910"'#7&'#7.54$;7373#5&'326?3&'DK?SH5.ZSmmo#ASBpGSLXN5T)2=Tb=MUBq_ߕD-14: | Hw} 9,%/uY0#@ FiL.j@0' . +**/0 @Y--+_Y-#_Y **Y?3+3?3+/+3/33+399333233310>32#'"6?3# 4$32#5.#"'7!7O0#:7,Kp4;REU:q5T6Tnjeu wAkx LS=%/'w4+/Ҟ*GBi=@u   !/  tY   sY  / O  ? O     sY tYsY?+3/_^]+?+399//_^]q3+33/_^]+3/_^]39339999339103'7!#7&+!73#'!3#!?# @^ `ya8YEY! ZIیxfIIL(@_(##*%&"  ""*) &sY&%"%sY" &P&`&""?"O" &"&"sY vY?+9?3/_^]+99//_^]]3+33+3933333999339310!!?>5'#73'#73&54$!2#'&#"!!3n%^YZ$m?=}u6W MY{HCRefe('5efe'0@M   !""(.+((12.+_Y.#%% aY!_Y ?3??+?+33333333?+99933333333399333333104#"##654#"!'7!>323632!6H3B[cpAJ0z$jY HHdLa pLYXh_t ~faIht(a_QBb_NJq'od%_B9t=%)-03@v/('0-*2,+13"#3&).0  0  54_Y2 _Y#&* ")-_Y.   0  _Y3?3?+3?3399//_^]3+33+3+339933993333999910#!!?#737#73'7!!'7!3#3%!'#37#%3'#Us`E # D A A  A ]YY^ uh~IIeerI+rIIeeee'z=T]@l4!1$$]U%%+1Y>87;;5 RRY*L*^_sY;8;sY58U$tYU 8UU8-*-]tY-+sY-%*(*sY(AIIsY0D@DDD?33/]+3?+3?++9///_^]+3+33/_^]+993393333333332233399102#'.#"#"&'#"&547#7+!?'7!2?33#32?332654.'&54632654&+gz$B @#0=\nL)C'PsefAepKv  ]a F?Wj%A,6BC38F+Ic_$P"-(3"+7I.|}2NU/q'cVIIvI_E ^&)M.)01=q~Jky/=&52V+='+/369@|9,/7  7 1 22330   7 +(64 4'!*)54""''4.-87 :;"_Y96 _Y0,(3/+_Y / $477 ?333?399//]333+33333333+3333+33393929339393993939103#!!###!7!'#73'7!!3!'7!37#37#3'#7#7#bV^`eM26 4 0dF  zfRaX#f($heeeerIIrIIq?::)"C=@ C C--C>A bC6iYC_iYa?+?+?9/9/10)"&547>32;267>322#"5654&+"#"57Bn;/VP D"QjORCMp;4V>* B WtPU &( 5=  \0?d$.(7 | b0>7Ca!/@I"/ //1)01OYNY"%%OY/ , ,QYQY NY?+?++33?3+3?+9/3+3933333992339107!!'#"&5463267#737'7!3.#"3267@*c ;IrmA 'e]SDuD;1!l)㏏h 756%>7#"'!67>324&'3264&#"326&#"32mVJ>_Vh}c210&@S6oQ">wWh5VuȦS>' 33.m'u6`9?;fqcd3*.:4+-9.6(91$V48;1SCIW ζE ?(m]>W74-o;^b%V}O)YdhUXhl$#!xHL 0r@:0..%12 1 # #*`Y&#0 0  `Y ??+9/99333?3+9/33393399399104#">#754632#"'7332>54'UFL%Zh}jlٽlk8az/@o{^J'@.K+)sm|}|;-НIpZ>}irJdR=!',1@j.*%''3 ,+$#-1132,`Y+ _Y$ # _Y- `,    @ H, ,1`Y_Y_Y?+3?++9///+_^]^]]33+3333+33+9339393333333310!?#737#737'7!23#3##!!6527!!&+ L [ w #sQ FW;a WQ40EVIIezeIre :4erz0;̆Fd'z@A#$  ()##`Y_Y@$$`Y ?33+3?39/+3+39933933333293104$?3#7&'67'7!#7$%Flf7TvoXD . Mf7}ˊt r :̮Wq#| DD LR &H#&@g#"%$$   !&$$'(_Y#" _Y%  / @P  $ _Y?3+333?399//_^]]]]33+3333+3393929393910%!?#737!7!3!#3#!?!'!3.vgA'3uHm=(|>'III`eze@ezeII[vv1L4@X!$$2+ 4256!_Y_Y$/ /o0+//&_Y/ _Y?+3?+399//_^]]]]993+33+3933339107367!7!>54#"#6323#!!326?3#"&547iAyq>tMY8Ҫ+fXibS^0SX?\weR?e5CR9J?+lVeS>e.rLE. '\HFdi&a@3  "# ('(##`Y @""`Y?22+3?33+3933393933910$54$?3#5.'>?3#rf5T4Qa6MUBYsfꏆˎx$r+*.p:'/ {]AR9@# * *3##;:99 6Y' ['/Y, ,,' Y [Yd;T;D;6;&;;;;;;;;;;v;V;6;$;;;j;;;;v;d;V;F;6; ;;;;;v;I;$;;;;;;;;;v;V;F;6; ;:;;;;;;{;m;Y;I;9;);; ;;@J;;;;;;;{;k;];;;; ;;;;;;;;;O;;;]]]]_]]]]]]]qqq_qqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqq?3+++?33/_^]+++3/993333339910#3! 43232>54&#"#"&54>32#'&#"3267`8 Bշ"R9\4(09X2R:Inr0}/%6 +C:j=C?9[+fu,BrTKNu5?zy؁-jlT]))S)g@8'#$ +*sY$sY$$  sY    sY?+?3/_^]+9/3+33/+99333331023273#"&5467767>"654&rY^+pFE1|ku"Qz n]\6GM.Sl`X+"՘rp0I Ld|GF@I=!.@Y  %,,%/0")""/")) ")")_Y$4   _Y,< ?33]+3?33_^]]+33?399//_^]]33933333333333310'7!#!?'7!!!2654#""&54>325  uf $ ɧ G=F\SCZCe}U_e}II&"BIIvIx1Ä{wFna]nXR(8@Q-% 59:Y%Y$Y%?%O%%%@H %% )Y 1Y?+?+9///_^]+]q]+3++393333310#"$54$3257'5!2!#4&+326"32$54$=@%LT^s^TxnZꡡü@A:7zr:7ZIT椣塡?-@m!'#,,''/."- & Y# ,'Y*ݿ//////o/_/O/////9///////]qqqrr^]]]qqqqqqrrr?222+33333?33+3333/39993339331057#"#5!#'&+!#!57'5!!!57%+>4GGGZ!gggOBggpl< l<<<<<s<<J;L)g@5$##' '!*+#$_Y_Y! ?3333?+9/+33?993333993310"!3;'&54! 32?3!>54&͖V=Pmz]\{mP=VʱPi""iϰX|HP@) !wY   wY wY?+/+9/_^]+9/99332310%#"&54632!3267.#">`ۘ5QRa3Vu|8DhK5Au!h>@E   2%%8*88?@ /, 2(; (( ;?339////9933333223399333333333333933999910#3#?3!?'!!332654&'.54632#'&#"#"&'vt[?:`'oV:5]8afIm\Zsh"55SUXMjZ]A+6,,,,uu(ZF*7%bHo,F9'4$cH8N@)  NY NY NYNY?+3+?9/++39933399910%!73;##33'7![ ,KQ^{:'K5K=  cZBGg+jWBBUC'H&{ uq-F'T&tuq-C'^&{;L@1O/ O ?  o_]]]q5]]]5]]]]]555?555)F'^';up@L 111111111o1_1O1?11O/o_]]q5]]]]]555]]]]]]]]]]]]]5?555D='^';B@* 7@ H7O/o_]]q5]]]]]555+5?555='6';=P@4 5o55O/o?]]]]]q5]]]]]555]]5?555V5d^D "@    /93339310#&'5673!9>HH>9)CI$ICV (@    /3/3939333105673&'#CI$ICV9>HH>9#d^D $@    /93339310&'3#67!59>HH>9#CI$ICV &@    /2/393933310%67#&'53+CI$ICV9>HH>9d^D2@    /933932339310#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC@@     /3/3932/393933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9HL@#    /3/3933/3939333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>9D*@s$+,RY  NY ',,,o,,_,@, ,,,_, ,,8_,?, ,,,_,?,,,_,?,,,^]]]]]qqqqrrrr^]]]]qqqqqrrrr??3+/_^]+39333310 #"&54632374&#"'7632.#"326H|܈]"ky$iONsyN[ahYQp펻.cStT!#\y|H2@ ?3333?339333310)5!%!;"aXLA=@  _Y`Y _Y p`@0 `0 pP 9p`@`P]]]]qqqqqrrrrrr^]]]]]]]]qqqqqqqqqqrrrrrrrr?2+3?++399331057'5!!57!X魭kLJ)IIJJJ\L9=@q    `Y    bY P _0?:pP _^]]]qqqqqqrrrr^]]]qqqqrrrr?3+9?39+399393322310!2$73!5 5!#'&#!d~g+!MV6=eV>g0  k)m`Z@ Y?+9910!5ZH=hK @  [/+9310"&54632Ea`FEa``FEa`FEaGvT @  Y?3/9/+3910##5! 3kרZ=Paz".@)# /0&,#P 00o0_0O0?0/000000o0_0O0?0/0000000o0O0?0/000;00_0O0/00o0O0?00_0/000^]]]]]qqqrrrrrr^]]]]]]]]]]qqqqqqqqqqqqrrrrrrr/^]3]292299399210#"#"&54632>32%"32654&.#"326zҍ@]iA@iP@32#4&#"tтwgĠ'@ ()$Y!@H!!_/?oO Y @H r)b)R)B)2)")))))))))))r)d)T)D)2)$)))i))))))))t)`)P)D)0) )))))))))))p)`)T)D)4) ))))))))))t)T)D)$)))@c9))))t)d)T)$)))))))))))p)@)0) )))))))p)`)P)@)]]]]]]]]qqqqqqqq_qqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrr_rrrr^]]]]]]]]]]]]]]]]qqqqqqqq/3/++/_^]qr3/++9310>32#&#"#"&'5>733265cFYF95F eFR E:5F jx BAF|Inr  _E{K!WA'aa@@37@ccH7@aaH7@__H7@]]H7@[[H7@ZZH7@YYH7@XXH7@VVH7@TTH7@EHHH7@==H7@;;H7@22H7@00H7@..H7@,,H7@''H7@%%H7@##H7@!!H7@H7@H7@H7H7H7H7H7H7@$ H      p ` P @  ]]]]]]]]]]55++++++++++++++++++++++++++++++j"u@J Y`O   Y`    ? O  /]]qr3+33//_^]]qr33/+3993333103!!!##5!!5!ƺ+I fH B@%   `p//^]/]]]9/93333310!5!5!5HHHj" K@-  Y Y? 0P?]33]++?+993333105 !5jHZԏHj$ K@-   YY? 0P?]33]++?+99333310%!575 5"HHsr,Z3 &@ //933393103 %! {RVf"@@Y?+93310!#Վk%"@  //93310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@4t`$4To@knH`cH@Y^Hdt@AJNH p;0@0`p_ //]]]qrr^]_]+qq++qrr+r^]]]]]]]]q933103#"&546323265";N2$! =/'5)%3%@bY?p @;P@/_]]]qqqqqrrrrrrrr^]]]]qqrrr^]]]]]]?+33105! %QH@ ??93103#HK"@ Y?+?39310!!#(in"@ Y?+?393105!# (%%HY??+393103!!Hn%H"@ Y?+?393105!3 %H)@  Y??+?3933103!!#iHnnH)@ Y?+??3933105!3# %K,@ Y?+3?3393105!!# i%n%H,@ Y?+3?3393105!3! %nH 7@    Y?3+3??339333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH @ ?2?39933103#3#ّhHK Kj 9@  YY?+?+?9333310!!!!#(iijב" -@      Y ?3?+33993310!###בnn#j ;@    Y Y?+?3?+99333310!!#!!#htjo"j 9@   Y Y?+?+?33933105!5!5!# i(qב) .@  Y?+3?339933105!### ܑב%nj ;@   Y Y?+?3?+33993310#!5#!5!ґttj)F)ޑqH 7@    YY??+?+33933103!!!!iH"ב%H *@    Y?3?3+39933103!!33A$Hn#nqH ;@    YY?2?+?+339933103!!3!!ّK$hH"qH 9@  Y Y?+?+?33933105!5!5!3 iqב)%H .@  Y?+3?33993310!5!333$ב%nqH ;@   Y Y?+?3?+33993310!5!3!3!5!$KqFH >@   YY??+?+?339333103!!!!#iiH"ב"H 3@     Y?+?3?3399333103!!#3#AHnn KH G@    Y @ Y  ?3?3?+?+9933333310#3!!#3!!jt " "H >@  Y Y?+?+??339333105!5!5!3# iqבKH 1@  Y?+?3?3399333105!3#3# 㑑h%K#KH F@    Y Y ?3?+?3?+33993333103#3!5!#!5!A㑑tHK )ޑj @@   @ Y Y?+3??+333393105!!#5! iiq"h 4@     Y?+33?3339933105!!### ב%nnj I@  Y Y ?3?3+3?+3399333310#!5!3!!#!5jtttAޑ"בqH @@   @ Y Y?+3??+339333105!3!5! Aّ"%H 4@   Y?+33?3339933105!333! ב%nnqH I@    Y  Y ?3?3+3?+33993333103!!3!5!5!AH"oHV@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# iiiqב"ב"HI@       Y ?3?33+33?33399333333103!!###!5!33AבHnnnnH b@    @ Y Y ?3?3+3?3?3+3339933333333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#3#3#3#3#3#ghhhhgghhhhhhgg`hhbhh hhahhahhhhhhgghhahhahhhhhhgghhhhhhgg`hhbhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhh"bbbbba```````````c```````````c``````aaaaab^^^^^baaaaa``````bbbbb#`````b``aa`T #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKO3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQ!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  /993310!!!7L17}1mi{/9910!!imi{@  /993310!!!iLPdh//9910!!hL//9910! XVRZ//9910 7L//9910 LRZ//9910Z79e E@   I )    i  h  y i Y I ;         v )    V 6  7   v d R D 4 $           t d T D 4      { o O ? /   ^]]]]]_]]]]]]qqqqqqqqqqqqq_qrrrrrrrrrrr^]]]]]qqqqqqqqqrrrrrrrrr^]]]]qqq/2?3933399333310!# 3 7R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow@kPhhTl8xx<|(pp,t ``$dHH L@@D0044DLdt|lX\\JrrNvBzzF~2jj6nZZ^RRV::> **.v~n^V>..>V^n~vf&fb"&/3/39///////3333333333333333333339939333333333333333333333210#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @ /]99102#"54>jnrotjlw)@  /9933103!32>54.#")vwvvvwvu}Avvvuvvw)#,@ $% /993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @  /993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:o@@:6+% %;<("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332933333310"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7<@$.#5 # 8910/+*?*O**/^]]]]]993310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'J@'$$  ()P /^]2/]32993393332210.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8D@#0,!'6!'!9:,*3$$$-  **/^]]]9999333399310&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<4?@!/((5(6$+/     //99//]9233999310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@  //999910./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @    K  /]999310&&'6H zDS%Ut}FiGfY;.@  //]9/9933333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt `@4 !"VC 6% X ///33]33^]]]]33]]39933333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu8V@X  !      //9/////39393933999339293392910!##??3%377%~2;~2'M'5~,G:~1'M'MG[[[[0F^^J\^_J= @I !" _Y_Y_Y?O _Y?+33?99//_^]]3+33+3+3993393910!!!!32673!?#737#73'7!]v vCq`&uTY D A  iee kIeeqII-6|@I     OYOY?@ H NY NY ?+?+99//+_^]3+33+3933939103#3#!#737#73'7!de edVw wfed deT[ mXhJhB>hJhB=&/=!o@#  ! #"!`Y  @Y ! !  `Y _Y _Y?+3?++99//3+3+93393993310!?#737'7!2!'2654&+3# L [ , ,utE*)VII{Inx{F=#,e@5# +"'-.,`Y,,""_Y"+`Y_Y `Y?+3?++?+9/+39933333399310#326?3#"&547'7! !'2654&+(S+P<*K=Y5k ٧ ɓ p*yuEb8,.HH:;I+I8nr.#*}@?)''(( ((+,(  OY'$$QY NY?+?3+333?333+33?9933399333329910%!'+#.54$32373&#"2677m;MmJV1/p6R6PF"$J~Iy(b'LZ :JUz+p{%J1q P; T.!h@5#! "# "!!OY@  PY?+33?393+333933393393310%27#"'#&547#?3337#"L1DP6n\s &p5XjF#/~+B.bA'%l50Km=r@9    `Y  _Y _Y?2+333?3+3339/+?9933993333339910#?'7!!'7!#!?! ɧ  WW  |}4x ^^ JuIIII JJ(,[@/  NY  NY QY?+33?+??+99333333339910632##654#"!'7!av_Ys@f[?&j[ mT k\4]`d9t(aX3B1K=t@:   @   _Y_Y?+3?3+3339933??9933333333999310%!?'7!'7! ##ղ v ɧ u [@q  'ax}}4R]dIIvII IIS7|-f@4 NY @ NY?+3??9933?+9933333339329910 '7!##!'7!_V X \PXiJ:lD\ mXBBZdF3BK=@@     _Y  `Y?3+3??+3333933310#"#!!#!7Ic DY;}4 QjrA@    NY NY?+3?3/+3333933310#!7#"#!!3iJFF6i32#'&#"#'7JOhTI'J'WG#{= re}ogB\La@  !  !@Y  _Y ?333?+39/3?3+933933333310##'7!3>32#'.#"^ne 4 jd4qgaI/P *1AB!PII=fv>&TDW@,     NY PY?2+?333?+9/33939333333102#'&#"##'7!3>TI'J'EA54#" '67&54632>54.'73+0&%HgaUWO "- SK'6 L.4Z^(/PAzG7>">54AdʍMX2PFjW37joAưλR"V} Pi`_ .2zyH@' YYY Y/+/_^]+99//++333310 55yGGܱ$ܱ$0*!@  Y/9/+3333103#2#"&546O3DE20FG*xF/2FF01FKx%@  Y /+333910'7"&54632[6[n0FF11DF[6[F02EE20FD+!@  Y /3+339310!5%#"&54632DxG00FF01F 1FF10FGU7@ @K@Y/]q+33210!53!v "@ //9/3933310!#!53[McS7v "@  //9/3933310 #5!3!M!7S  ,@  @ H  //9/9+933310#"&54632!#,`FF_]HG_޴Ea`FF`a)  (@ H  //9/9+933310#"&546323!`FH]_FEa޴nzEaaEF``h9hM (@ H  //9/9+933310#"&546323!h`FH]_FEa޴nEaaEF``VB @@   K@Y /]q3+33339310##5##!B<wBw +@  KY/2+33339310)33533BTw`I*@ /]3]2339331073#' զLI!%!s, 4@  [ @[/+_^]+933310%"&54632"&54632F__FEa`(F_]HG_``FF``FEa`FF`aEEa<@  K@ Y@KY?+_^]+333310!5!5AA"^l=?9310!#=!~k=?9310!#=A}+@ @Y@P/]+93331027654.546o323!&#"3#!ю !5c AT,DE'eB&ho& @P'@''@'0'']]]qq5o@   /3]210#"&5733267̘wD\ ㋦x/-yYMo'R&  R%qN d D hf?3hkY_?+310!7!3! 3'wJJ{e && &'?&'?%&%&%&T&F&q&yYN&5Y&!YD&Y&^@?>>@H>@ H>++q5& #hq& Y& d& R&9&N7&J|////]]5=q&dI&|)&{ &h&Y&?f&VYT&&& &h'T;A%I A ^IbRjY_'=3=jY3_?+3?+??991047654.54>32;267.54>32372.#"#"&'&'.'"&h] %81@5*z!.g 9.''48\,2#2/"CU  B&04"鶐3Z=  .0x#%v>I3:4T4#1,$a' `P8:&YL=Y.j2   KY /+3310#"#6$!3Qn ky2   KY/+333103 #&$!# `VA2wm &@  Y Y /+9/+3310.#"#>32\F\o>;x)'35(@Y @ Y /+9/+331032>73#"&'^E\oA/wNT**0lk?" !%)/AOW_jv@ qe*k`MJU]]FPJXB43:??<3BJF`*e + x"..+''+&&#++w #.,]7ttF0b\UnhhGR)@ @Y?+93331027>54.546GT`s ' RRQF5PZ/#"* ;@`4#-@ @Y/]+933310"&5467B^C^C^C^v^v^v+$@  /3233393104&#"'632#5>3*HFZjQ[pE0"c;U 2x+$@  /3233393104&#"'632#5>3*HFZjQ[pE0"c;U 2xX +$@  /3233393104&#"'632#5>b3*HFZjQ[pE0"c;U 2x^B9s^B9s^q^u/3331053ɬ^v^v^C^C++^B9s^B9s^B9s^B9s^B9s^B9su ?u |u u Zu ^B9sm!u ^8u u~u u z.u kfu WRu #u :u +^B9s^B9s^B9s^B9s/(@ NYNY?+?+933310%!'7!Lw w[ mZBRBZ!&@   /3233333993107!"&54632!"&54632s%<9()67':9((7:7*(77('::''87(*7> *@  /223233339310"&54632!"&54632?3%<9()67':9((7:I>7*(77('::''87(*7!%@^  :@ !/ /223]29/33393310"&54632!"&54632#'737%<9()67':9((7:G@7*(77('::''87(*7!!}}@*@  /323333339310'73"&54632!"&54632Dn%<9()67':9((7:"%!7*(77('::''87(*7wa5+@ Y @ Y ?++3393107!4632#"&s5O98NM7?K8KN66LK_5R@   KYK@ Y @KY /3+_^]+9/+33333107!".#"#>3232673s-E91'0_ xV.E91&2_=!&3vk%0 &@ //393933310!#!5!3e*\* &@ //393933310!#!5!3e*$E &@ //393933310!#!5!3o ZZ"@ //39933310!#!5!3o DM"@ //339/393310!# 7 3f\>Ha4R $@  //39/3933310!#!7!3bG4oaRM$@ //393933310!#73_J^rM $@ //393933310!#5 73fS܈kh/iF @  //39933310!# 73pZzfjFp$@ //393933310!#73p^ZHd(5"@ //339/393310!# 7 3RkGHyN!5 .@ //39/933933310!# 7 3Rka.K- O $@ //39/3933310!#!7!3xtdH^- $@ //393933310!# 73`vcFFH @ //39933310!#73wp=Dg-p$@ //393933310!#73pEsHVH!$&@ //339/3933310!# 7 3=|GHY2#% &@ //339/3933310!# 7 534~X4(5f% .@ //39/933933310!# 7 3C{sVH2}q' $@ //39/3933310!#!7!3cy Q2X/"@ //39/933310!# 73HԈG7%p @  //39933310!#573p={H\2#$@ /3/399933310!# 7 36}MH)Q0) $@  /3/399933310!# 7 530~YAuO/l6 $@  /3/399933310!# 7 3ON,qS-m6 *@  /33/393933310!# 7%3O~t8S-{0@  /3/393310)733+NS.)p @ //39933310!#73pA>S.)O@  //39/9310!#!'!ataoL *@ //339/93933310!# ' 3[H5fy4L *@ //339/93933310!# ' 3UH)hy?L *@ //339/93933310!#5' 3SHhy-^"@ //339/993310!#' 3Q6fy=Lp"@//39/933310!#'3p^iy @  //39/393310!#!5!3pT; (@  //9/933933310!#!5!3a.izT $@  //9/93933310!#!5!35$$@ //9/93933310!#!5!3?P(@ //399//3933310!# 7 3h`axbVL 0@  //99//933933310!# 7 3e`;H`GF &@  //99//3933310!#!7!3fb*]v\^L&@ //9/93933310!#73^'c{L"@ //9/9933310!# 73e[؈scSc[Lp"@ //9/9933310!#73pd]?de[/(@ //399//3933310!# 7 3Gu7TaF?9 0@  //99//933933310!# 7 53Rv8HqGG? 0@  //9///33933310!# 7 3Nw]sX=U8H? &@  //99//3933310!#!7!3mwo V=2?"@ //9/9933310!# 73\w߈5:=?p&@ //9/93933310!#73pWw2-B=+6&@ /33/9/9933310!# 7 3O}4H) 0q5 &@  /33/9/9933310!# 7 53N}<Au 1[l6 *@  /33/9/93933310!# 7 3ON,q -+m6 *@  /33/9/93933310!# 7%3O~t8 -6@  /3/9/93310)7330O~ -Q5p"@//9/9933310!#73pM4 -zL@  //39/93310!#!'!owKzL ,@ //339/93933310!# ' 3oH Kz4L ,@ //339/93933310!# ' 3oH)S@Kz?L &@ //339/9933310!#5 ' 3oHu^Kz-L"@ //339/993310!# ' 3o6RjKz=hp"@//39/933310!#'3po~3232673%?3T-E91'0_uX.E91&2_6o!&3qf%0!%oT !-=@+%% ."" (Y /3+39/33333933310".#"#63232673'"&54632!"&54632h-E92'0_6-F91&2_6l%<9()67':9((7:o!&3%07*(77('::''87(*7W %@   @ [ /+2333310"&546327!/DE./CA% ;C00BA10C!%}; 0@  @H@ H/333++2339310#'737"&54632;L/DE./CAo!!}}4C00BA10C9 5@  [/3+33333933310"&54632!"&546327!%<9()67':9((7:s`7*(77('::''87(*7і#L@& OY  NY NY?+?+9/3+39339939910%!#73'7!3#Qw wJ:[ mJZBhGB_h&c'I4&c'4&c'!4&c'S4J&c'IJ&c'J&c'!J&c'S6&k& 46F&k&@46&k& 46-&k&4N6&k&"NV6&k&PN6&k&N86&k&(E&w'4E &w'4E&w'4E&w'4EJ&w'EJ&w'EJ&w'E J&w'N&k&j +@++@+ ++@ H+@H+55+]]]]55N&k&j +@++@+ ++@ H+@H+55+]]]]55N&k&j @H+55N&k&j @H+55E&w'j +@55@5 55@ H5@H+55+]]]]55E&w'j +@55@5 55@ H5@H+55+]]]]55E&w'j @H+55E&w'j @H+554 (&Lv<@   ]5]]5DG&[@/ $!!'(aY_Y_Y`Y?2+?+3?+?+33993333333310"'3327654#"!?'7!>328V0Y#?x#ܲ y ɦ i(D!%`$h IJuIzD@!~F=!c@2!  #"!!_Y_Y_Y ?3+?+3?33+339399333333339910'7!!"&'3326?!?'7!ɯ  @,.KC"m굯 # ɧ II  xk}I IIvIG'`@1 % ()  _Y !_YaY _Y ?+?+33?3+9/+39933333333104#"!?'7!632!"'332>76J b` ٽ H7ю,G _g Eh]AA"Iz-Bg(9[.E   AC?3?3333210#"546324&#"326WpWnҝ&2E8C6D6Ԓ"PSP/ S /@   AB?33?39/33333107!??3W 7 e ZCC<)BS6)@   AB?3?33333333107!7>54&#"#7632!P--5*.>!vQvNkSrI4AtfWJF-$?@  ""% AC?22?339393333339910'"'733254/?654&#"#7632PpjA +@oD?0+4,/>"lYqSUF˄s S15w^P# WFwPy :@    @B??39/3333333339107#7!733376ʎ]P( b({CH$y9@@ C?33?39/33333333102#"'733254#"#!!6 u^eA#DsA+CH!/9sdw˒F-#;@ $"  AC?2?339/33333333310'"&54>32#'&#"63232654#")ryll\Q"<#+IqLI^eV5:\&: Fv'l^|`B+Ty%@  B@?33?333310#7!#!A)4 JBF- *U@% & &! + ((_oA$C?3?39/]393333333392910!"&5467.5463232654&#"3254#"-6>ofX+4jo@4< %56_-0\DCլ.S=l_ctY6j|_ToZ,%g 60izF($9@ %#!! CA?2?339/333333333102#"'733267#"&5464&#"32765pilcR"<(1HnIK\l/)1>X.9v"pedt|c:T@ Y/+3310!5!#P+`9s_6@       /]q]293333310632#?654#"HUQWccB'Y=?3o839H1^:3TH8@  Y/+33/3339393310)73 !Dx@PS_@@%   @ H    /]q3+29/33323933103#77%3#'XB/ !!>_B@&   @ H /]q3+29/3333393310#'73'#7%3B? !!_N@,  @ H /]q3+39/3339333333107%3#'632#?654&#"1A9??QE 2?&2_!!\-&.6D ,AIf@A Y Y//?_/]q32]+39/3+339333310?3#'%".#"#632326730{+C:6F //*D;7(1/.A!!{{&7&$1K'Q@4  Y@ H/?/]q+]+9/33393103#7"&547332673=B7xHfUS|J kY:?>;tK'Q@4  Y@ H/?/]q+]+9/3339310#'73"&547332673MBxHfUS|J kY:?>;tK'"W@6  #Y @ H/?/]q+3+9/3333933310632#?654#""&547332673R=1::I@.6$38xHfUS|J& +2D kY:?>;tLH#e@A" $Y ! Y Y @H @ H ?/]q++++99//9/9+333310".#"#63232673"&57332673y+C:6F //*D:7(1/.s6hUVy6,2&7&$1^P#/34.& && hq&  hq& =h?'&qhN'&h'& d %&T@< #/;?/@ <'----!3=93/333333]q222/3104632#"&4632#"&%4632#"&4632#"&4632#"&3:&'98((8Z8('98((88('98((88('98((8/:&'98((8FE)78($::)88)$::$)88)$::)88)$::)78($::p@#!@   /33]q229/310!!4632#"&4632#"&3Fu8('98((8/:&'98((8FE5)88)$::)78($::p@##@ !/33]q229/107#7!#4632#"&4632#"&3 gVb8('98((8/:&'98((8FEuu-)88)$::)78($::p,<.#"#".7>7.7>3232>76&'@-?S 2G(/C$idc`!QpG* Dk[K J$;M'H<16b;90 H8-NKM+2cnOos;8miTkQEPZ/*OrHtUC_wK-7!32>7!!7#"&'#"&546'7!3267!#[)c`g m _per ct f[Cf fYaF*BBaUmf ]-Bs)aICsKY7!3267!!7#"&546'7!Z[@#j m er ct fYaUQBmf\(BsM $:<;ADGNW]$$7$9h$:D$<$Yh$Zh$\h$h))))$D//7/9/:/</\/3333$h595:5<5\7D7D7D7h7h7$727DD7FD7HD7L7RD7U7VD7X7Z7\99999h9h9$h9D9H9L9R9U9X9\h::h::h:::$h:Dh:Hh:L:Rh:Uh:X:\<<D<D<h<D<D<$h<DD<H<L<R<Sh<T<XD<YDIIIqUUULYYZZ\\;;K;R;VX;WB;X;]B;e;oh;y@W@]ACADhAGhANhA^FA`AaAcFAfFAiAkAlAnAqFAuFAxFA~FBWDDKDRDVXDWBDXD]BDeDohDyDhFFFFCFDFGFNFkGGKGRGVuGWBG]BKDKGKNKWK]MKMRMXhM^McMfMhMjMpMqMuMxM{M~MNNKNRNVXNWBN]BR;RDRGRNRWR]TTTTDTG TNUvVFVFVFVhVhVCVD^VGdVKVN^VRVXV[V^FV_FVcFVfFVgFViVkVnVqFVuFVwVxFVyVzV|fV}V~FVWFWFWFWFWFWCWDhWGWKWNhWRWXW^FW`WaWcFWeuWfFWiWkWlWnWqFWuFWxFW~FXDXWuX]uZ^ZcZfZjZqZuZxZ{Z~Z[W[]]C]Dh]G]K]Nh]R]X]^F]`]a]cF]fF]i]k]l]n]qF]uF]xF]~Ffmfrfvfyh^h`hchehfhihjhkhlhohqhrhuhvVhxh{h~hl^lclflhlplqltlulxl{l~lmbmfmhmpmtmumwm}mp^pcpfphpppqptpupxp~qmqrqvqyrqsyv^vcvfvqvtvuvxv{v~vxmxvxyy^ycyfyhyqytyuyxy{y~y{r{v{y~m~r~v~yrvyf3L1L/Rwf3ff's{3\'''L33L5`oLm3}333m}3f{b3m)3?m}AAA3Am3A}3hhVhWhLnV' P%jz{  S n@  . d 5  k    8 6\ 8  44  ( 5 b 8 \  j  4 5Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Liberation SerifLiberation SerifBold ItalicBold ItalicAscender - Liberation SerifAscender - Liberation SerifLiberation Serif Bold ItalicLiberation Serif Bold ItalicVersion 2.00.1Version 2.00.1LiberationSerif-BoldItalicLiberationSerif-BoldItalicLiberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Liberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Ascender CorporationAscender CorporationSteve MattesonSteve MattesonBased on Tinos, which was designed by Steve Matteson as an innovative, refreshing serif design that is metrically compatible with Times New Roman!". Tinos offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.Based on Tinos, which was designed by Steve Matteson as an innovative, refreshing serif design that is metrically compatible with Times New Roman. Tinos offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.http://www.ascendercorp.com/http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlhttp://www.ascendercorp.com/typedesigners.htmlLicensed under the SIL Open Font License, Version 1.1Licensed under the SIL Open Font License, Version 1.1http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL!   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniF004uniF005uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFCnullpi1 cyrillicbrevecaroncommaaccentcommaaccentrotate grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.alt radicalex.xuni00ADuni0309UNI2206circumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildelamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BES_TES_PEx        bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.60FVR J   8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz N M L K J H G F E D B A @ ? > < ; : 9 8 7 6 5 4 I O = C:BJRZbjrz j i h g f d c b a ` ^ ] \ [ Z Y X W V T S R Q P k _ U e:BJRZbjrz        ~ } | { z y x v u t s r p o n m l   q w:BJRZbjrz                            :BJRZbjrz                            J",6@   Tcyrlgrek&hebr2latn>kernmark 4<DLT\dr $,4 Zhl(z Zt ( !6! !!","\"""##L#|##$ $$J$n336p:0=lA,A4APn L $*06<BHNTZ`flrx~ &,28>DJPV\d2<222d22d22P2<22<2822<2<2x2d2d2P2x2d2<2x22<222<2<2d2<2d22d2<282222<22<22d2d2d2<222d22x2P2<22<282<22d2P2x2<2d22<222<2<2222 (  HP" X &,28>DJPV\bhntzX000XX00XX|0000l0l0  L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz2Xh2hT2Th2h020h2h@2@hX2XhX2Xh2h2h2h2h2XhX2Xh2hT2Th020h020h2h2h020h2h020h2h2hX2Xh2h2h2hX2Xh2h2Xh2h020h2h2h2Xh2hX2Xh2h2h2h2h2Xh2Xh2Xh2hT2Th2h020h2h@2@hX2Xh2h2h2h2hX2XhT2Th020h2h2h2h020h2h2hX2Xhhhhh2h2h2h2h (  HFLRX^djpv|<F<<FFFF<F<F<F<x. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzX,T0066XXXXTTX``XX00 XXXXX00TT XXXXXXXXXbX,T0066XXTTXXX XX66TTTT (  H  jpv|2<2  !<  !J`   J`    J`    !  J`    ! 4<4J4<  !4J  !Jl    Jb   Jl      !Jb     !n L $*06<BHNTZ`flrx~ &,28>DJPV\22,22222,222222,222,2222222222,2222,2222222,22,22<22<22222,22222222222,22222222,222222222 (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\L222 22,2222,2 2 2222,2h222 2 22\2H22<222222 2L222222222<22<2L2L2L222 22,222,22222h22 2 2\2H22<222 22 222 2 2 (  H <FFn L $*06<BHNTZ`flrx~ &,28>DJPV\\4X888884 X84 (  H ( >      $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(f,>\n:xHj &,"LV6\ nT^d~  R   2 \ f  6 ` \  : l ,BHZp $:<;ADGNW] 79h:D<YhZh\hh$D79:<\$h9:<\DDDhh$2DDFDHDLRDUVDXZ\hh$hDHLRUX\hhh$hDhHhLRhUhX\DDhDD$hDDHLRShTXDYDIqL KRVXWBX]BeohyW]CDhGhNh^F`acFfFiklnqFuFxF~FW KRVXWBX]BeohyhCDGNkKRVuWB]BDGNW]KRXh^cfhjpqux{~KRVXWB]B;DGNW]DG NvFFFhhCD^GdKN^RX[^F_FcFfFgFiknqFuFwxFyz|f}~FFFFFFCDhGKNhRX^F`acFeufFiklnqFuFxF~FDWu]u ^cfjqux{~W]CDhGKNhRX^F`acFfFiklnqFuFxF~Fmrvy^`cefijkloqruvVx{~ ^cfhpqtux{~ bfhptuw} ^cfhpqtux~qy ^cfqtux{~mvy ^cfhqtux{~rvyf3L1 L/Rwf3ff's{3 \' ''L33L5`oLm3}33"3m}3f{ b  3      m)   3  ?  m}3m3}3hhVhWhLf$)/3579:<IUYZ\;@ABDFGKMNRTUVWXZ[]fhlmpqrsvxy{~A  n L $*06<BHNTZ`flrx~ &,28>DJPV\`2 22 222022$22 2 2 2222222z2z2222H222>2>2222`2 22 2 22H222222`2`2`2 22 22202$22 2 2 2222z2z222H22202\2>22 2 2 2 2 (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\T0XX,X0XXXX0XXXXXXTXXXXX (  H  flrx~ppn L $*06<BHNTZ`flrx~ &,28>DJPV\X222202,2|2X2X2,2222X2X2@2222222202222222X22X220222X22X22222X2X2X222202,2|2X2,2222X22022220222X2d22222222 (  H:@FLRX^djpv|0(,F(X(@Fh<hF@FF2@F@F@2xn L $*06<BHNTZ`flrx~ &,28>DJPV\XXh,dddXXXh,XXh,dh,, (  H  flrx~d##,| p\ =ȃopenscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSerif-Italic.ttf0000644000076500000240000132443013402025764025646 0ustar kintelstaff000000000000000FFTMWGDEF~t9\GPOS4f BGSUBЋ]<OS/2`cmapx>*xFcvt d!J{= fpgm~a0gasp \glyf9rhDmheadK<6hhea t$hmtx *(`kernPloca?(dmaxp!F namePT post8 gprep8t-W _<̓I̓I K!EW : Kd  RT/\>9J3,%3Lf  Px!1ASC F3!`= 9\u9WHfDLU9OI Sx+<_fff#\xVrqVsVgqsksusv9`H/=L?>?9J9r9%;9mJI=DS9ZfV1U3%3 3$TTi_3 Bv5\ofLv3d_f1f)/yrfE{r HHwXnVrVgggggf$su======V??????9m9m9C9b9I=====dtffffUpU===Vr?Vr?Vr?Vr?>>?????qqqqxJ9C9P9m99mr9%V;;s9ms9@smsKs9VIVIVIIg=g=g=gV=S Ss9sOs:ffffffV1suUsusss9LK>LLV/Vr?=>@>3$j6qkJ9mV;9<wEXVIggE=fgh=M>"$"9s29Zs]fouUsSS $.?  :>rm9I=9mg=fffff.==nV?qqV;g=g=S9% :>qVI=nV?==??9y9Ug=g=/Sffs9Z!JF>'Qes=?g=g=g=g=suY9I99%/+Vrss\}iOa9%r='s+UU=ML>> //')gG9=bfJJ99y&9)9B9YkmffJIk=c=OV6=HiKKK99(#).h V  JJPJ gpE>=E9DDJJP >\> >{ZZZ\mmTJJEzEzQGq \.1>q_-I-ff7ffon9g9k z{S/WemJBD-bbys((rr! QKK..E{m^k S2jjj3* 2`&)}!5w 2#.[e3IxDj1Shapxe_f[t=_3oV7H9JsgVaV!gssue,su3=',I9y[3='%<',=BId9yKwmF= ?==-[m=\zD9Ea=[DJ[uu$/3Dg=V7"MvL-EXG'g0~V-V$2.]="D-=9%g9=9pVqbrVVqV`Zrk^dPb`TPkgVrsbowXXhG=.BB=Zy?) =?q)ff;}E=I?JU7f9 T T'9kJJ;??JE}?9r9b9%oEJ;fUT gNfEVIdmV'@m maCg=\kq\kqg=BhE hvF gVrI<rj+0fJE)Tq)P;P;P;8fEE",V)Vr?sJsuFsa =99J__Tq)PEk}(E99m==nV??j/j/Tq) ffg=g=g==.bYbUbY9)kJ)}>i}>7-r(Z:&ErGnZJ#})k}qDV1oV7Vd{{#``1N``9VuD!uD u;dDuX 'j%d1+#1Huuh h0VVV.C=EB9/D2 f=*(*("V.D=FE7+ gqV}+^76f-D1mIFEOT[]Z]DADAhMeN2DDIDiK{K0w00w(n'{wxnkBISDq@uV~*~Iw`I{IwC XXr=chF>h;vqw'DX=FFq'_f>9% 9X&9#1)L>U;9JIE==>?').9rK+f0vRvddmXDDDDDDD++***-I{dXXbXX=xxx<Iy+//////2D=LL*Vr?>>>>8???9qJJJJ9>9mV;V;V;s9+s9+s9s9^JJJVIVIVIVFg=g=g=g=Ss9Zs9Zs9sr9f0@ffkkV1V1V1V1V1suYsssJ9ZV1Y=9y============????????9m9>g=g=g=g=g=g=g=gE=gE=gE=gE=gE=ff]f]f]f]f]fsuUsuUsuUsuU3=3=3=3=3=3=3=3=GG',',',',',',;''IIIIIIII;''FF9y9y9/9T9f9y9x9yrr;''ED======s&J"[[[[[[[[;POIDDDDDDDD>c"AB3=3=',',II9y9y==[[DD3=3=3=3=3=3=3=3=GG////////;''32DDDDDDDD>cAB3=3=3=3=3=3=3=bt:T///I/WU9y9N9b9b9@9rV  [[[[[[susuK;>DDDDD, U L?.1>s,s1sSs>DM;U\oRVtff%f~f6NWIFxVpVrJVq 9Vs)qVr'U*v~%XE1H=HD.r\fVd391dXdmfdadaf"g{mmb))s+kUFQ@;@<fBs9:s9HJV;srte1EDm=/W. 7i=e2r!uDXuX!uD ;uj%d11Hu u1d5D2D6///X{{//{{{{{{{mzf#:{{{{9mE EWWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWWJs9/3=3=3=3=3=3=3=3=9G9G9G9G9y9y9y9y[[[[[[[[9j9j9j9j[[[[9rVR L #KKKHuu Tf< ~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q. 8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A`@ehg`N_UA=@U@BUC=BU.==>U<=;U;/;?;;;>U0=/U/>U-=,U,>U?=>UJHUGHUF=EUEHUI=HUP/@o@@)P(P<<@6<<GP)P)<P5P53333 @< FU<0P݀ݰU3PPPP=O<O) @)/?P) G ^) @ 4@3$(FP$?P)_op 0@ЮP)=U<@.)U/`p3UP)S<J<@!$FGJJ<)S)?O@J< P=P=P=)=;S<)<vu<uts*sP)@p)on+nG* U3U3U)_3@$'Fa+0F@ a#F`_@_P)@]F\G [Z0ZG)U3UU3U?OoRQ/QP)PPOO/OKG3JGIG<HG8GG/GGGGGUHU3UU3UU3U/_?TS++KRK P[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYsst+++++++su++++ut++^s++++++++++++++++++++++++u+s+++u^s++++++^s+s+++++s+++++++sstus++++tuss+s++++s++++st++++++++++^s^s++^s++++++++++++++++++ssssssss+++++++++++s++++++++sH=o=LLFPi}wPPZZP`7P{mPFX2FjM=ffJfPBBtFF<}RhvBR ~l:VDgpV.LHjgaA/0gXFrnjU )% 42$ U4Kam {dN+x t P d TTTH\hlpTT !"#$ $%&<''(4)*X+4, ,-X.00T1,3355@7P779:t;<;<=>H?$?@lAXB(BCDDDEFHFGH@HIJlKDL(LMMNOxOQ@R<ST4U\UVY$[X[\\\__`D`b@cef@ffg@gh hhi,i|kkll8lllmo,oToooppLp|ppqrr8rhrrsstttuuLu|vLwLwpwwwxx<yLytyyyzz8z\zz{{{||8|`|},~~0~X~~~LtHp$T| Dt@p Hx P<x <0d<Tl(X,\4 H`8h 0`HpDh0`<p,\ <`4 Xx<Ll,|H0xDDxH |lL| „lT@ǐ\ ʨ\D Τ4H0PhрјѰ(LlҐҴ$dӌӬDx(PՐմ 0@d؈جلPtژڼ0Hlې܈0Ttݜ0`ވެ<`߄ߨ8\4X|0H x@dLp(4LpD<D<D4Dd< tpDx   h  (<h0X@lH$ !H!X"h#8$0$%(%&H&'\'(x)8*(*+p, ,-.,//0112t334567@789(9:;l>?@AXBhCE FGHhIJ`KL4LMNO4OPQQxRRStTT,T<TLT\TlTUUV(V8VHVVW<WWX,Y Z4ZdZZ[[H[|[\\X\\]]]^x^_ab,bcDcd8deef fXffgg`gggh4hphhi\iij<jjjk,k`kkl l\lllmm$mHmmn(ntnooToxooplppq@qqqr rPrrrs(sXssst,t|tuu`uuv<v`vwwDwwx(xxxy yyyyzzTzz{${`{{||0||}H}}}~0~X~D <tL| D0d,P @Dpl`PDp@|<( 0@P0@ p$4D<dxd844D|`Ldh@@hp84< @P0pøżƀnjȈX͸Όpрѐ4ӐX րְ8hؘ|ٌٜ$@pݔސޠ|ߌߜ\lXl4DTdtpH,(@0@h,Tdt ` hL\l           !!!!#$0%%') )D)\**+X++,@,,.p0<1X2\33456067P8,9,:;4<=>?@,A ABCDE@FFGH@ILJ`KLMxNDNOOPQ\R(S STUVW@X<Y(YZZ[\]]^^<_P`8a abcdd@def|gLh h0hThxhhhhii(i8iHiliiiij jjkk4kXk|kklm@mdmmmmn n0nTnxnnnodpp@pdqTrps|ttu|vhww$x y zz{|}~dT<\lH ($dTDDxd0\$Xt@ h$\\ 8p4h88|tDH\xhTX8T|P,$ tl4L  ,°pDTdP`ǬȈ ɴd ̐Hʹ`ϼ<Ѩ\|ԴLt ظPt|\ވdt$p(@$(\d88P<`XD4XdTLh     `L@H@pp8T H !!"T"#$ $%%&'(P()*p+L+,-h.D./001<223D344455T5556H6677h7777788848`888899 989P9h9999::0:H:`:x::::;8;\;;;;;<<@=`>\>t>>>>??4?X?p?????@@(@@@X@p@@@@AA0AHAlAAAAABB BDBdBBBC0CTCCCCDD<D\DtDDDDDE E@EXEpEEEFF F@FdF|FFFFFG G$G<GTGlGGGGHHPHtHHHHI IPIxIIIJJ4JLJpJJJJKK4KTKlKKKKKLL LDLhMDM\MtMMMNN(NLNpNNNOO(OLOpOOOPP$PHPtPPPPQ Q0QTQxQQQRR,RPRtRRRSS S8SPShSSSSTT@TdTTTTUU@UXU|UUUUV V$V<VTVlVVVVWW,WPWhWWWWXX(X@XXX|XXXY Y0YTYxYYYZZ,ZLZpZZZ[[$[H[l[[[[\ \D\l\\\]],]P]t]]]^^(^L^t^^^__<_\_|___` `0`T`x```aa<adaaaabb@bdbbbbc$cLclccccd dDdhdddee(eLepeeeff$fHflfffg g4g\gggghh4hThthhhii$iHihiiiijj(jHjtjjjk kLkxkkkll l@l\l|lllm mPmmmnn0nPnpnnnnoo<ohooop(pXppppqq(qLqlqqqqrrprss,tt t8tXt|tttuu,uDuv<vw w,wTw|wwwxx,xPxyHyzz8z\zzzz{{8{\{{{|\|}0}P}h}}}}~~8~\~t~< l|(@\`4X$LX$P0D@p8T$p,|p8H$ 4\\(p,X T8DP0ôXĈĘ44l\@XϸTx,\Ҡ$hӸXԨhհl@טl0ٔ\4ۼ(܌݈tLt PdX,\D|dL0d8dp$4 H     h   , |  8  L4d <Xl `x0Hl$H`$`x 8D|Xh ,x   0 @ P p        !!! !0!D!X!l!!!!!!!""","@"T"d"t"""#P#$L$%%%&(&|&''p'((`())`)**P**+L+,,P,,-D--.<../(//000x011l122x233l344t45,5|56$6|6747|78 8l89$9x9::\:;;t;<8>>?$?x?@4@@A AhAB(BBC(CxCD0DDE<EEF0FFG8GGH<HHI8IIJ<JJK$KKL0LtLMMpMN$NpNOO\OPP\PPQHQQR@RRS4SSSTTXTUUVPVWHWWWX(XHXhXXXYYDYxYYYYZ,Z`ZZZ[[([H[[\\h\\]<]]^_t```aabbxbcxcdTdee epeef fgg|ghlii,iDi\itiiiiijkLklmPmP= ]@   [;/k[; m[K4k[K;$tdTD4 9t`TD4p@ p`P]]]]]]]]]qqqqqqqqqqqqq_rrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqrrrrrr^]]]]]]]]qqq?+?9/93333310%#"&546323#E44EF33F^\1HH13FFH\c=Q@ { I 9 )        ; +   i     { k [ +      k [ O        k [ K ? +   9     [ K /      O ?      o _ O ?  ]]]]]]]]]qqqqqqqr_rrrrrrrr^]]]]]]]]]]]]qqqqqqqqqrrrrrrrrrr^]]]]_]]]]]qqqqqq?2293333333103#3#œJœJ= =C@    ! Y   Y  !!!!!o!?!!!!!!!!_!?!!!!!!!_!?!!!9!!_!?!!!`!@!!!`!]]]qqqqrrrr^]]]]]]]]]qqqqqqqqqrrrrrrrr?333?33399//^]333+333333+333939993939393910!#!##73#7!3!33#)!hʘip h5hob5o g[[g3giig3d$,3{@F-)0 % $$4500 -0)%" *"sY!"@""1 1sY ?33/]+3?3/_^]3+39_^]9999392103.546?3#'&'#7&'4.'>LA%Sfm?R1A>oUqDR$GI_}KXOt~s5@AC\sN"2 NbxMY21K=% =_. u5R)7@ 1  *&&89$-Y$[4YY [ Y e9T9D959%99999999U9C909"999j9999999i9T9B909"999999999v9Y9D929"999999999i9Y9I949$9999999999v9I999@J+9999999999f9I99999999T9;9+999_]]]]]]]]]]_]qqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]_]]]]]]]qqqqqqq?3+++?3+++99393333210#3 4>3 4&#"32> 47! 4&#"32>>no_ CL>INb9:FMh;% AG ax?INb8:FMh;ft/=PTkWLRk.Bo~vQUjULRkW1R&0=9@*418 11 0'   >?  PY 0'4##;PY#-PYPYs?c?R?B?3?#???????????t?e?S?@?2?"???i????????r?`?P?B?2? ???????????v?b?R?D?6?$????????@???r?b?T?6???9????????r?`?R?D?4?$???????????p?`?@?0? ??????_?O???]]]]]]]]qqqqq_q_qqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]_]]]]]]]]]]]qqqqqqqq?+?+?+99/+399393393931067'7!!'#"&54>7.546323267>54&#"`MX&  y quԀO>.εnUwdO=3b4dUifNPrUAnƭ556WF\u8Y~BAw9vOJT?wB1BY?\dr\=@?/_O?m`?/_:?/_O]]]qqqqrrrr^]]]]]qqqqqqrrrrrrrr^]]]]]]]]qq?9333103# œJ=HL(@  Y YtdT@4$dPD4$iTD4@4$O0 9p`pO]]]]]]]]qqqqrrrrrrr^]]]]]]]]]q_qqqqqqqqrrrrrrrrr^]]]]]]]]]]qqqqqqq?+?+9333107&5467 ϵ[vZTy4ܰ,dTFLk@   Y Y4$D$mp`Pp`p=_O?/oO]]]]qqqrrrrrrrrr^]]]]]]]qqqqqqrrrrrrrrr^]_]]]]]]]]qqqq?+?+9333107>54&'7 at`oqԲ[LTE꣮HT~ۧfN=@ 0  ?]91073% %#'%@;+/=@L@/+@H)GbaHÏc -@  Y ?33+3393333310#!5!3!gXguVfVfD#@ Y[?++933910%5654.54632'/'D5=H*+M;m+*69ZL`/@ Y ?+99105!LUG @   [?+9310%#"&54632GE44EF33F\1HH13FFF@ ??333310#3nlZOR (@ sYsY?+?+993310 463 #"326ZݽV^M_Wwqe "tlI$H /@    sY?+3?3/9933310%!7%7%3 /  4P55Fa5LB@"  sYvY?+3?+3/_^]39993310)?>54&#"#632!5qtp7y)@B-~|kb+睘L+l@: )&)###-,&sY,   sY  sY`?2/]+?+3/_^]9/]+93993999310"&'332654%'?>54&#"#>32eYI%B !>sho6u,@B-f~Oѯ"/R nowD J@%    uY  ??39/33+3933339939910#!733!77_44xrh =`@<sYo vYsY  ?3/]+?+9/_^]+93333102!"'33265!"#!!6&B $:l]`uKr+TSL'A@"! ()$tYsY sY?+?3/+9/+933310"&54$32#'&#">3232654&#"ݺУ))B Y[0LHppkags5<-4mm>rxF=7@  vY?3/]+9?3393910#!#!B8>ˋ=M+R)^@1  ' !! *+ sY $sYsY?+?+9/_^]+999939393310!"&5%.5463 2654# 2654&#"vVb ü4@UZ͞KW\WD"f4F\w[a]]b<L(?@!" )*%tYsY sY?+?3+9/+9333102#"'7332#"&54>4&#"3276Uͦ稵'B "i9(RErhpkobLZ6݌002vQԽ~y=r (@ [ [?+?+933310%#"&54632#"&54632{E44EF33FE44EF33F\1HH13FF1HH13FF_" 5@ Y[ [ ?+?++93333910#"&546325654.54632"E44EF33F'/'D5=HG1HH13FF+M;m+*69ZZ@7Y 0@`p0P`(1H?+]qr33++9933105 )2gyygX@: Y @P Y P/]qr+/_^]qqqr+993310!5!5GGffffZ@7Y 0@`p0P`(1H?+]qr33++99331075 5)gg+2#L!}@L #"Y?O @%H@H[   Y?+3/_^]?+99//++_^]q9+99339333310#7>54#"#763 #"&54632P!so<$2Bn};E34EF32F^N,BS 1HH13FEx{T=H@6C%((H>/IJ="?YEEY+Y""""  2Y :YJJJJJJ/JJJJ_JJJ@J`JPJJJJJJ]]]]]qqr^]]]]]]qqqqqqr/+?+99//_^]]3/++3+993333333310#"$5! #"547#"&54>;232654!"3267'"3267PqAWCHO=o$&0r%%tpכ&Ȕ1iP8=n_X޾32KWYm[w{-n@%"SЫM_Y>4Ho@>   `Y _Y ]]]]]]?3+333?339/3+393992239910%!?3!?! ! p} % @R55555}hu=%~@G !!'&`Y0`$_Y`Y  `Y_Yp']?++3/?++/9/_^]+99933399993332102654&+2654&+?'7! !%¥Xd Ѩ 'hdbzT55捸 riLT@1  _Yo     _Y?+3/_^]?3/^]]+93333310 54$32#5.#"326?3}-A>`rDHA=s |3ۮ+/D5*/=<@"  _Y`Y_Y`Yp]?++?++99333310!#3  #%#?'7̠h&C:CU Ч {k|55=}@H    `Y `Y _ o -     _Y `Y_Y?+3+?3+9/_^]_]]q3+3+393339910'7!#7&+!73#'!! ?3!?r 9Bm]j<@I@aUeBR 5d5= @ `Y_o-   `Y   _Y _Y9p`P@0 p`P@0 qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]?+3?+3/_^]+9/_^]_]]3+393339939310!?'7!#7&#!!73#'\ Ѩ  9Blc;=H=Z555ѠdqL!X@0 "#_Y_Y o   _Y?+?3/_^]+9/+393333310 54$32#7&#"3267'7!|3Cӱ͸Y??  Kz32#"&'732654&#"1,JPG}X?:gfc]N;>H-GrOR`Ϯ-'+0p{N=?wZ@8   PY  / QY]]q?+3/_^]?3/^]]+993310%#"&54$32#'&#"327Q[G4-7?i`dΏKW?d>"h@:$#" $PY  RY  OY OY$$$?$qqqq?+?+?+3?+33333333393106'7!!7#"&54$32.#"3267@Dq{^0#J5^dXK8=0k---kIB?_!E@$ "#OYPY QY#q?+3?+9/+993333103267#"&54632>54&#"_kiZB\\{=:F`I='*NT!qq8HrL%z@& PY PY0 @ P  @$!H o_@]]]]]]qrr??3/+]+?3+39333332310##?>32#'&#"3# (M>#17=FL 1'BriTL,N@)$ ,-.!)QY% %%! PYRY?+3?+?3/_^]+99333333310%267.#"%#"&54$32#"&'7332678An&%*dbYEHG32!654&#"#7v jPXefif04K8oH-Liomf:-F'-8}[rLJ@* SYOYOY/]qqq?+?+?+93333310%!'7!#"&54632$+>@-,@@,-@F-f-3,@@,-@@%LL@X   SY OY PY>N^p`P@0 o@]]]qqqqqqqqqqqqq?2/]+?+?+933333310"'733267'7!#"&54632;QO!/,AK3$@-,@@,-@Ln--,@@,-@@;{@F     OY  OYOYo_O?]]]]]]?+3?+3/?93/+33339933339910'7!'7!##+1^$Qbڔ>H-8---ߋm :@  OYOY   ]qq?+?+9333310%!'7!+F-H-Jq.y@A $  )("##%$$0/@00 ),RY,'%OY'$ OY RY?+3?+???+?+3_^]]99333333339333310>32!654&#"#654&#"#'7!>32iDOTa f g*-,zc cf,/,b cvFMXaazkeG-Fy--7T9F#-7Y8f-cxoIK@'  OY RY OY ??+?+33?+9933333333104&#"#'7!>32!604J9nvTWefif-8~]g-llmf:-F= ,@ PYPY]?+?+99331032>54&#""&54632i^[`ib[^ȊȊTյյL$P@*$ %&PY !!RY OY OY?+3?+?+3?+993333333107!?'7!632#"&'32654&#" 0Byg y.c>jcbYK58Z//-Ѭ r0o|N=DL D@# "!OYPYRY?+3?+?+99333333310%267&#"!#"&54$32!6H/yffc[[QMJF?yEk(tx:E+/}WS#G@  OY  RY@ H]?2/++3??+3933333102#'"#'7!>2,+&PGkvKzdf-q|%Q@, &' PY  PY!?3/]+?3/_^]+9999993310#"'733254&'.54632#'&#"Ê)-_<]iebq%/?gRbTuh`>,;\31wP#l8KO6R<6|ZbU@. PYQY]]qq?+3/?33/+393333332310%327#"&546#?33#-#IO{~O[ h{@%a--/W`VOJ-'T\fI@&  OY RY OY ??+?+3?+993333333310%32673!7#"&546'7! 04K8ovSXef fof-8}[x-knmfMP-~V@4    OY@P$4t _?]]]?3]]qq?3+39939332104&'73#'7!6*SYIq @'%,-(X[z-$h1G@    @0:H@ )H@H  OY?2?+39+_^]_]+]]qq+93333333310##'733654&'73B|Ff5Kz9*Skz-=YrK%,-(D~%\@0" ! ! &'&"  !!OY! OY ']?+3?3+9339399399399107#&5467%'737>54&'73!*?Jk|@4)t73T - RD-v=F -;H-5EUFz@F  ! ! QY. OY ?22+?3/_^]+3/3_^]_]]]333939333310!654&'73#"'73327'4@*StrLQD%-9-p$pQ%,-(Oe¢L`RZn@7     PY`p   PYH?2/++9?3/_^]]]q+93339339910#7#"#7!326?3 48j7/-d8j#L/H-/1%!)N@(( %  +* Y ))(Y)Y?+?+9/+99333339310"&547654&'767>;#";oml4V^)4>[`;[FR;>qd#.'#$QQ-&/mj^fN*#/ Fq@ ??93103 fFG$!)N@(&%% !!*+ !"!"Y!!YY?+?+9/+9992223331073267>75.57654&+732#$>[`;~^ES;AI>4^Vp~4~/mjN`hO4J,!EE/&.&WM-xrًT4No@    Y@(H@5 H Y?O/_o @/2H/+]qr+33/+++3993310"'.#"#>3232673'jJa&MN ev8wKVS#ENg@jy?9m:?H1iLg: {@*  o@$*H@ H @ [;/[K;+ mK+{k_O$t`T@4$9tdTD$P@0 p`/]]]]]]]]qqqqqqqqqqq_qrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqrrrrrrr^]]]]]]]]]qqq?+?9/++_^]933333104632#"&#3HE44EF33F^H1HH13FFR= @K   "!sY/  tYO_o?3?399//33/]+333/_^]+3993993929310#7.546?3#'&'67%`EO!R Rk-78\[>S +8 Y$L%f@6 "" '%& sY sYp %%vY?+3?3_^]+9/3+333933293310%!?>54'#73&54632#'.#"!!{\[[슓-A e2 ccuGDN6bR_X+ʌRhBWJiF)@#*+4+D+d++++++@0[dH +++K+ +@+`+++++++ +@+`++ +7JH+@H&tY  tY/]q+_^]+++_^]qr_^]]]+]99331047'76327'#"''7&732654&#"PkJhlllHmRRmHlgijHkP`ONxyMQgkJmRRmHmnljHkPPkHjiMPyyN_=$@X  ## &%sY sY$ # "sY    @ H  sY?+3?399//+_^]q3+33393+3+3339239333333339910!!?!7!7'!73'7!'7!3!\( (_  iv Z mR55R#Ro55t55R Fq)@ Y?+?+93331033 fff!l%nBm4@b@*>2;;'/558AB2>8'8>$Y! Y?3+?3+93399933339910%!"&'7332654&'.5467.54632#'&#"4&'>dM7)-x>vyeupk_Qt$-AmWf(Gn[S.eVFXtQEE*i_@kB?Vz4wJ#l8QU(=590M_:?6V.mY@U!ej3 @   Y@7BH'G @ Hh8(scSD4$ip`RB2$rdP@2"rbRF4"@x9vfTD4&tP@4 p`P]]]]_]]]qqqqqqqqqqqqqq_rrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrr_rrrrrrr^]]]]]]]]]]]]]]]]qqqqq/+^]qrr+r3+3933310#"&54632#"&546328**::**88*)<>'*8*;>'*::**;<)*::vR8}@50#6)#9: : :9::p:::):9:::::::@9W\Hi:B:$:4:::::::r::T:d:2:B::$::@:@:?H::::::::.2H:@%)-H::::::d:t::P:::::@ H:: :@F H&-Y.***&!515A555!555 55 2Y&&   & &  Y Y?+?+99//_^]]+3/_^]q3/]++_^]_]+]qqqqqq++rrrr+_^]]]]]]]]qqqqq+qqrrrrr^]q9333104$32#"$732$54$#""&54632#'&#"!2?3v=@F ⧧}s1Rv J1|Aü@ߥ "i332?3&#"327%V ThFXWiAC ,6UkZ=GD'JYwakcO*oJT H@!   [[ ?33333+3+399339333103#73#7== ;== TudBdudB,@_ @Y?+_^]99310#!5gfL`/vR5>@(%%&500-;"!!&411--6&6?@':):Y0; ; Y1!&$&Y4$)) $$$$);$$;) Y Yx@i@(@@@@@i@G@8@(@@@i@@@@@@w@e@V@F@7@(@@@@@@@@r@`@T@4@ @@@@@@@o@_@0@@@9@@@@@@Fo@P@?@@@@@@@@`@?@/@@@@@@@O@0@/@@]]]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]_]]]]]]]qqqq_qqqqq_qqqrrrrrrrrrrrr^]]]]]]]]qqqqq?+?+9///_^]q^]3+33+9+39939933333393333104$32#"$732$54$#"!57'5!2#74&+326v=@F ⧧r`hJZXTVs?Cj[Aü@ߥ "++)sjMp+]YIJ @ Y?+3910!5!#^R-@  Y Y?+++9333104>32#"&732654&#"RSSTURf{UXyyXU{STSTTQYyzXYzy_ _@5   YYP @Y ?O?]3+3_^]++?+9333333310#!5!3!!5ngXgGuVfVfff1F @   YYK;+{k[ l{k_OOo_O?:O?o_?/`]]]qqqqqqrrrrrr^]]]]]]]]]qqqqrrr_rrrrrrrrr^]]]]]]qqq?+3?+3/933339310!7>54&#"#7632!#ҖJ87>:&7qQt~`R4E!bfWam) F'B@"% )("YO_o  YY))o)_)O) )))m))o)_)0) )))))o)_) )))p)/)));))))O)?)))))))?)/))))))))@)0)]]]]]]]qqqqqqqqqrrrrrrr^]]]]]qqqqqqqrrrrrrr^]]]]]]]q?2/^]+?+3/9/_^]]+993.3939310"'7332654/?>54#"#7632pj7I%ggU WHWzA6&7jVsrq_b p ^d{ AV\lf^PZq WFw^b@[  _K+ k[K;+jkK{[K+ k :t`T@0$pdT@$]]]]_]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqq/^]+931073o^!%LT@,   OY OYRY?3+3??+??+993333333333310%#"'#767'7!32673!ϐrj1H"L2sL@0.|N-G |!-t.EMB3-y=;@    Y ??+39/93993310###"&5463!^^  7ӻ5-CrU8@ YY/+/9/+933933310#"'732654&'73H=01=LDADV!PWbuK79,;RRE(B /@   Y?+3?9333333310!?7%3 &nHV11q:/rR *@ Y Y ?+?+933310"32654&"&54>32No;5Po;e}U_e}QX~UWna]n JT L@#   [ [  ?33333+3+39933933910%#3#3=A=# =B=$ J~B~BHB'&{"$@P ]]]5]55?55HB'j&{tG`]5?5wF'&uN#,@-..p@ ]5]]]5]55?55XX$!@,  "#Y@0@P@@!+.H[Y  @6#&##########v#d#V#F#&##m###f#T#D#4#"#########d#D# #########t#d###;###[#K#?#+######p#`#T#@#4#$#######_#@##]]]]]]]_]qqqqqqqqqqrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqrr_rrrrrrrr^]]]]]]]]]]]]]]qqq?3/^]+?+99//_^]+]q]+999933333103326?3# %74632#"&QP!tn;{)2B;E34EF32FF*B%fR 1HH13FE&$CN@ &%+5+5&$vN&]%+5+5&$8N@ &%+5+5&$^h@&)%+]5+5&$jPN@&%@%%%+]]55+55*@M   $ +,!_Y(  `Y( _Y,,,,,,]]]]]]?3+333?3999/3+33/+99393992339910!?!!?.54632 !4&#";267-} % @͇ p&-wTTwCH33HE10K9\<55}55V3Twwu3HH32IFn=#&@w $%&&### (''$`Y%$`Y_o- $$! & _Y `Y  `p!!`Y!!#_Y?+333/+3/_^]?3/^]++399//_^]_]]3+33+3339993339939999233310!!?'7!#7&+!73#'!! ?3!?!d n X A9Bm]j<@I@aUeBR kw}555d5rUiL&&z]$ %+5&(CN@ & %+5+5&(vN&"%+5+5&(WN@&@ %+]5+5&(j8m@ &.%+55+55&,CN@  &a  %+5+5`&,vN &  %+5+5+&,-N@  &  %+5+5&&,j.m@ &  %+55+55=@S   ! _Y?Oo?O @$)H `Y_Y `Y _Y ?++?++9/+_^]q3+3993333333310 #%#?#73'7!#!!3 CU `a _w^h&C=5%R'5Rk&1h@ &* %+5+5g&2CN@ &"%+5+5g&2vLN&,!%+5+5g&2N@ &"%+5+5g&2h@ &(4%+5+5g&2jm@!& 00%+]55+55$eJ A@) 0@`p0P`(1H?+]qr910 ' 7  GXJVZGXG`HZVJXHHo)k@:#"   +* &_Y""#  H _Y H?2++?3+99_^]]+93333910"'#7&54$32734'326.#"읭wnZ蛩suZ%0a`!21`҆rTu^KSzrW1KR6&8CiN&״!%+5+56&8v=N@ & %+5+56&8N@ &E!%+5+56&8jm@ &p/P/]/%+]]55+55u)&<vN@ &%+5+5=h@:  _Y`Y`Y _Y?+3?99//_^]+++399333393310 4&+2!#!?'7!6p,! ћ  feճ55554b@5 $%%)(//(/561, ,"PY,&(OY& PY >  ?3/]]+?+?+99933393223910#"&'7332654&'.5%654&#"!?>329E@>>"- O3Vb=??>/LL+"ֳj>7Y84tJ^&vd;`32nE8U<^L-߼FZ-W=&DCn \ # %+5=&Dv " %+5=&D # %+5=e&D@ P))5 %+]5=3&Dj 1 %+55=&D % %+55?(!1:\@/8')'22 /<;8OY 5++PY" QY /33+33?3+39/+99333933310327#"&'#"&54$32632267&57&#"4&#">(yg|*PEj>x)]s_.r4YW[bR610[![e 6?d*NYNZ0+Ji >28%'Bny5=?Uw&Fz#  %+5?_&HC? V#&%+5?&Hv!"%%+5?&H "&%+5?3&Hj 4"%+55m&CL  %+5m&v  %+5C& V %+5b3&j c%+559)f@9  ''*+   PY #PY?+?+9?_^]9/3/993933310!"&54632&'?&'7%"32>54&NjgXhYnw&_ixXZk^XZiʫ0u`J$N,Y^sS熃トIe&Q &2%+5=&RCS 9 %+5=&Rv %+5=&R k %+5=e&R &2%+5=3&Rj .%+55t- J@) Y@P`  YY?+3+/_^]+99933310#"&54632#"&54632!58()88)(88()88)(8}G'(88((88(88((88ff'V@1!" )(!$ OY  $PY)]?2+?39+9993333910"'#7&5463273"&4'32>\wkQ]uhO[Z 4] 4i[\HjKhD4.b?5[f&XC8@ _ %+]5f&Xv %+5f&X R %+5f3&Xj n.%+55UF&\v% # %+5pL$@&%$ %OYOY PY !!RYt&b&P&@&4&$&&&&&&&&&&&t&`&T&@&4&$&&&i&&&&&&&&t&d&@& &&&&&&&&&&t&d&T&D&4& &&&&&&&&t&d&T&D&4&&9&&&d&&@'&&&&t&d&D&&&&&@& &]]]]_]]qqqqqqqrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqq_qq?+3?+?+3?+333333339310632#"&'!?'7!32654&#"c0b 2B{//_&G P@ 300%+5?5=>Q+{@?%  ,-++ PY !PY(RYOY OY ?+3//+?+?3+9/+33339939939933310?5!7!7'7!3#!7#"&54$32.#"3267 (D(ttq{^0#J5^dXK8=RUT-T--kIBD&(RN@ &%+5+5?&H "$%+5&(>N@ &(%+5+5?w&Hj %.%+5&(cN@ &"%+5+5?_L&H ("%+5m=&( p%%%+5?m_&H*++ %+5&(\N@ !&#%+5+5?&H )%%+5q&*N@ "&"&%+5+5L&J -1$%+5q&*N@ "&%.%+5+5Lw&J 09$%+5q&*N@ %&("%+5+5LL&J 3-$%+5qLL&*%"%+5L&J  -0$%+5#&+N@ & %+5+5x&K.@ !%+54#=#'@o &' ! !!%$)(%& &_Y  ' `Y$'  /  '?'O'  ' '   _Y !_Y?+333?+33399//_^]^]3+3333+333??339939933393399233910#?#737'7!!7'7!3#!?!7!''w'' ccL''5mR5555R5555J$}@D&" ## $$%&$OY RY    PY HOY?++?9/3+_^]3+3?+?993922232333333310#737'7!3#>32!654&#"# {|v )3PXefif04K8oZR-RLiomf:-F'-8}[f&,<N@  &" %+5+5Ce& %+5SD&,.N@  &  %+5+5P&  %+5S&,2N@ &`P@ %+]]]5+5mw&  %+5m=&, մ%+5mL&L-@'@H'@H'@H'@H@ H%++5++++&,AN@ &  %+5+5m(@ OYOY?+?+933310%!'7!+F-f-P=&,-s2!H!H!@ H  ` @  ]]]]5+++rLL&LM<3@$ Hp/@]55]]]]]]]]55+&-N@&0 %+]5+5%Lv@H  OY PY^   .   Y[/]3++?3/_^]q+?+_^]39933339331073#'"'733267'7!OՋ/QO!/,AK3$^!!n--L=&.;L&N;j@:      OY OYOY?+3/?+3?+/?9_^]]9333339910'7!'7!##և1W^$Qbڔ>g----ߋ&/vN@ &%+5+5m&OvK@   %+54L=&/U@L &O=&/ /  $%+5?5mj&O P@ %+5?5=&/zK&O@ _O]]]5=z@;     _Y  `Y _YP`H ?3/+]q++?99//9+3393933399339910%3273!??'7!Tb־koAV, Oq < ^5l`k}55dQ@)       OYOY?+?+99//993333333333107!?'7!a\Ɓ+q^q-h`g-&1vN@ & %+5+5I&Qv %+5L=&1%+5IL&Q&1N@ & %+5+5I&Q #%+5IR'Q&@O ]]]]q5]]5;G*}@!"!! )&&,,+$@Y"$!! _Y _Y `Y?2/+?+3?+3/?3+33_^]993339233993310"&'73327>54&#"!?'7!$3 >E~)*A S*!pgcSp  Ѩ k<OPo-/+Y\=8555HxA<IL$d@7%&&/&O&& "RY"OY PY?3/+/??+?+33_^]9933392239910!"'733267654&#"#'7!>32mCQO!/,AKw04J9nvTWef$sn-8~]g-llmgD&2N@ & %+5+5=&R %+5g&2N@ &!*%+5+5=w&R@  (%+]5g&2N@ &'%+55+55=F&R %%+55glD ,@V*$# #-.`Y?O !_Y`p`Y&_Y`Y  ?3/]+3/+?+3/_^]3/+9/_^]3+3933333399310"54$3!#7&+!73#'!! ?3!'27&#"_ 9Bm]j<@I@aUeBRNqLB|dG=(!/8e@4- &0&&339:0OYQY6))PY "PY?+?399+3?3+9/+993393399310"&54632>32327#"''2654&#">54&#"U~㏡J0_jz{ ROy5JYE>KS@.#Q&BObZ_c `(fTd*Risgr}<=&5vN&4 %+5+5S&Uv  %+5L=&5 L#&U&5JN@"&$`$P$$ %+]]]5+5SW&UN s %+5&6v5N.&.1-%+5+5O&Vv &)%+5&6N@ .&.2-%+5+5.&V0 &*%+5UL&6zB3.-%+5U&Vz+&%+5&6N@ 3&51-%+5+5a&VX -)%+5U=&7zUb&Wz@/@H/@H/@H/@H++++&77N@ &^ %+5+5O&W .P* **]5?5=@F  p    `Y_Y( _Y?+3?9/_^]3+3+33/_^]333939933333993103?!7!#"#!#7&+!! `A`3_@C8.8D Z1`Da 5%R ;R5bz@A  !!!!! PYPYQY?3/+?33/+39/3+3_^]333933333333333310%327#"&54#73#?33#3# ,#IO{~O[3ww1{@%12--/W`V>T-'TT6&8N@ &9'3%+5+5fe&X t&2%+56D&8N@ &F%+5+5f&X d%+56&8N@ &U )%+5+5fw&X t(%+56&8N@  &9#%+55+55f&X W"%+556&8@N@ &&%+55+55fU&X %%+55m6=&8fm&X $$ %+5E&:KN@ &;%+5+51G&Zd ~%+5u)&<FN@ &M%+5+5UF&\X  $ %+5u)&<j+m@ &>'%+55+55&=vLN@ &%+5+5K&]v  %+5&=N@ &%+5+5L&] m %+5&='N@ &%+5+59&]0  %+5L%?@# /?@ H PY ??+3/+_^]3933310"#>32#'&j>H&M>#1RprL(R@, ")*PY % %RYPY OY?+?9/3+3+3?+93333310'7!!!>32#"&'#7332654&#"1,&0"PG}X?:ged]N;>H-T`R`Ϯ-'T0p{N=>=#,W@. ,""' -.,!,!`Y,, "`Y+ `Y ??3+3?+9/+9933333103?#"#63! !-2654&+2654&+{ 6Oj"GC6i`'dT¥X5.:y 1捸 Tzhd=L=%D@$ $$&'PYPY RY ?+3?+?3+93333310#'.+>32#"&'2654&#" A)Q.PG}X?jed]N;>j:= rOR`Ϯ-'p{N=0U=8@    `Y  `Y ?+?9/+393331032)?'7% 32654!Bg d8dر=5.??R˒L !8@ "#RY PY ?+??+39333310%2654&#""&''7%3>32ed]N;>j:ZX?m  2JPG};p{N=0O-'1GrOR`Ϯ/&L3@  _Y_Y?+?+9993310"'332$54&#"#6$3 -A?arDHA=s q63%+/bD5;*/r j,K@'!' !-,,.*`Y*%'%%_Y %_Y?+3?3+92+33933310#'.#"#5.#"326?3# 54$32>32BB*EZ7A?arDHA=sq} u~KX`^+/D5*/ |?&K@'! '&&($PY$! PY QY?+3?3+92/+3933310#'&#"#'&#"327#"&54$32>3212?K&7?i`d΍Q^Xm&sM>{tܮ?d*KW=>=<@  _Y`Y  `Y?3+3?3++393310!#3 #"#63! #%#??̠h&C6Oj"GC6i`<CU {k".:y 15@= I@(  ! `Y`Y _Y`Y?++?39/++33933310;#"!"&54$!3#"#cP Ч ZQ#]AC(lb5M5b5 5>= &Q@+ %'(%&& PY&PY RYOY?+?+?+99?+39333310.#"3267!7#"&54$326#"##J5^dXK9=lq{^G/y_6C-EkIBJ --1 3G"0M@(+'..' 12++#PY PY?+?+933933339910"&'332654.'&54>32">54&E:@-7Y+ek>n~蔖W@`UMEH"bG"ZK";@W􈵟@Ml:U~F/iz];=y$?=^@3   `Y _Y`Y_Y`Y?3++?+3+9/3+339333310)3)!#3!#"#!S+BP`;@H@j]pFB8 ѧb# A5bj^L"I@& " #$`Y  _Y _Y ?+?+9/9+933333331074&#"#>32#"54732qM=B:k 6W/+% u"}jZPH>6M(K@( #)*_Y"&&_Y&_Y ?3+?+39/+9933310%.54$32#'.#"326?3#"&6v.B v5l`8'LB=/^1l+cg R +E=W@.    `Y_Y`Y`Y?3+?3++9/3+3333393310#7&#!!73#'!!"'73327'7!Blc;=H=CiPf*A R,! !Ѡd<. 5R*@%  sYsY   !H @ H p`@0 p`@ `P@ ;p`0 `@ @]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqrrrrrrr??3/++^]+9/3+3993339333310#?>32#'&#"3#ի ([?/7-<'&2"蠸`1^T%qj.]@0+$$+/ 0$!_Y!!((_Y( `Y _Y?2+2+?+9/9+33393333102>32#'.#"#7&#"3267'7!# 54$v~K+BB*"@Cӱ͸WB?  K|L%f2)a66\9/zkE=Y@.      _Y  _Y?+?39933+3333933333310'>7'7!'754'7 D=SU   $)Ax=5Ѿ\ jŘ55-5rjwF$J*V@." ' +,"$RY$OY PY OY?+?+??+?+39333333310%327'7!!"&547654&#"#'7!632=SP%j2x1904I:ov X"ef6H[Y-UqjE'-8y_H-mf+m O=K@&   _Y_Y _Y?+3?9/3+3+333933310%!?#73'7!3#qhYYP55SR55RQ#g@7   %$ `Y_Y  _Y?+3??99+3?3+339333339310 '7! !!?>32#'.#"w   eK uckU+B:#>Zvx559)5_55=u`^;[@0 OY PY ?3?3/+?9+339333339310!##>32#'&#"'7!yڔ>&͓N>$11@Ir^$Qbߋ{v}--<A>@ PY OY OY?+?+9/3+3933310#!#73'7!33jvi+u-TS-hDW@0   !     QY ?3?+3/9333333293310##7'7.#"#76327G Ua!Vۭ'tk@1#01OG[]tM-J+qr-kY S^{rXh<0f@!00$ !!12 0"_YY+@ Y_Y?+?+?+?+3393399333333310!7#"&5#"&547'7!32>7332>7h| !QXfpO[bp~ C d4j  j6k <5s~r{vAL5c2{tj?c95- tn<E=D@"  _Y _Y ?3?3/+?33+3333993310##"&'733267'7!'7 a#,u)F$ @  RY OY ??+?+3?9933333104&#"#'7!>32#604K8nvTWef-8[g-llmf$gLgv!/G@$) "01 _Y %_Y,_Y?+?+9/+33399333310"$&54$32>54.546324&#"326Zެ B>="("H79MvZͨɦқD% 9DDLV;T^rTz=-G@$ ' ./OY *PY #PY?+?+9/+33399333310#"&54632654.5463232>54&#"Ȋp-s"("H79Mi^[`hc[^?Gյe^8C% 9DDLY[gE2L#F@&!$%`Y_Y _Y _Y?+3?+?+?+933310!?##"$&54$323!267&#" {iIxT1Ƶc55NcZ)^=K.!B@$  "#PY PY PYOY?+?+?+?+933310##"&546323!2&#"C*ҥǎ.ww4cHCPa_fK Ե /|>=H@&  !`Y `Y _Y?+3?3/9/++3933310 4&+!#!?#"#63!2pO 6Oj"GC6i`herB55.:y 1L!.Y@/( 0 /" ++RYPY OY $$PY?+3?+3?3/+?+333393310#"&'!?>32#'&#"63232654&#"–.c 0By&N>$16AH7y?>jcbYK58wѬ Z//_rw̱X0o|N== i@8   "!_Y `Y `Y  _Y?2+3?99//++3+3339333339104!#3262!#!?'7!e 7 Ѩ 8 /ë짞U5k5555r" L)J@%$&&* +  _Y&&!_Y?+3/?+3/9933933310"&5467>54&#"#632326?3ϽֈEyt?A1ŢӵPzY0CA7ZD>LkLR]J+E5UXitG0!&$,A@!  &.- *&&**"PY* PY?+3/?+3/999331074>54&#"#763232?3#"&$2RhnhR2GH3_=/$g2QgmgQ2xWH-)3GSnH+! /I:8BmxgOgC)! 4O?Dv=UL *F@% "(+,PY$PY $PY(( ?3/+?+9/3+93333102654&#""&547#"&5463232?38[:.=GI dI_3216AFa-#IO3xNO[ h{ &N>rsT^'--/$3`VOJ-&GK=N@'   !`Y `Y?+3/?+33/33393333310#7&+32?3#".547#"#8D Z1qZ17B+TSI 3_@C8=z#~1Lj9H;-U@&"%%+. /+"_Y_Y- 'Y?+?39/++333339933333310>54.54632#"&547'7!!267'77`{"("H79M`V(  , =W1% 9DDLIi(72)5560)5f,^@1*'$$- . PY  ))'OY)!RY!OY??+?+?+99//+3339933333310%32673654.54632!7#"&546'7! 04K8o#"("H79MhvSXef fof-8}[xAU% 9DDLh5-knmfMP-~=*`@2$ "("$+ , ""##aY%%_Y#_Y?+?39/3+3+33/33393333310%24&'!#'&+#"$54?#"#!y!/'B PHê;URBM/W̰A%Wo(H'oJaQ(S@% &##)* `Y  _YY?+?+3?+3/9333333310"&547'7!!267654#"#7632  ,of?;L+_ks` g(72)5560x$|de)FuLT@ @Y_Y    _Y ?+3?993+3?3/+339933310#'&#"!?'7!>32B60:@#O N # ¼D?gUL:?5@5555egUF!E@# #"QY QY?2+?93?3/+3333993310"'73327'7!>32#'&#"QD%-8-p2IiW<$/,Ei0YmF`RZ-$}zoRTmP=e@5    _Y_Y    `Y ?3/+3?3/9/3+3+33933333310!7!#"#!!!32673!7Ty_DE8i"Ow,hF]3T=VT ^e@5    PYPY    PY ?3/+3?3/9/3+3+333393333107!#"#7!3!32?3!7-8j7/-dzKL/Hd TN1T/-EO=!P@) #"`Y _Y?2/+?3/9/3+3339333310"&'3324&+7#"#!(cU3C #go YCE81E";(<9N?=RѢ E=O@( !`Y _Y?+3/?3/+9/3339333310"$5%7!#7&+# 326?3V+18ETEo꧛`3=C54&+7!"#7!32>7cǺxrwF8l7/, mE9`TRE HN?7-O1\IDV3*/L#X@+" #  $%_Y_Y""Y?+3?+3/9/3+3933310)?>7!7!654&#"#6323#!5İ=<Rtp7y)@B-~caBر}NRla+RM}=#_@2 !!$%_YvY_Y_Y?2/+?+3/+9/+3339333310"'332654&#"#'7!#7&+632j'B &y6ˮrl\N`h MCBmաKij+uJ5T!!b@3 #"  PYRYQYPY?2/+?+3/+9/+33333933310"'7332654#"#'7!#'&+632)-CNMEA ;Blg+UZ>H~r"@vl$@PY  PY?3+3?3+10#?33#!"'7332654&'&54{@%9H@@|%0U6K[=FX-'Tc9bB<M>,NJ7eB{"L@@    QY OY??+?+3?3399333310!?'7!6327$54&#"+$ur $3TG=uL--⛀GlV\kMn?93103#3bb@  ?32993310!#3#3bbbbs O@(   _Y _Y   ?99//3+33+39333333310###535#5333#3bb TT8TP= K&''=N1&+5 &'']>:&G']1P=&/-sL~L&/MwmLD&OM= 3=&1-VLaL&1MZIL L&QM(&$r&+5=&D%&+5Y(&,P&+5m&&+5g(&2$&+5=&R"&+56(&8#&+5f&X"&+56!&8 3I 0&+555f&X&jx@ 555 H+55]]56&8 4*& 8&+555f&X&jxv;6&8 5& ,&+555f&X&jx&@5/5555 H+55]]]]56&8 6& 2&+555f&X&jxC) H+55.N"?@" #$OYPY QY?+3?+9/+93310746$?4&#"'>32#"&32>.kiZB\\{c=:F`Y_ I='*NT߳qxq9Gr!&$ 3 &&+555=&D'j@ 777 H+55]]5!&$ 7 &+55=&D'" H"+5n0&:*&+5?(&S>&+5qL)_@2 &##$ *+$%$_Y%')'_Y%)%) _Y _Y ?+?3/+99//+33+3933333103## 54$32#7&#"326?!7!7'7 "|3Cӱ͸WB  J6T9/z;/dbYTAOf-B>+Tqc)~OvHM>j lq&*N(&+5L&J3&+5&.N &+5;&Nw&+5gmL+I@(%  ,--!_Y`Y(_Y?3++?+_^]9333310#"&547&54$323274&#"326P`\i\Zޡ@>9.+Yͨɦ1aUk_$҇Ya6;iz=m*I@( $ +,,'PYPY PY?3++?+_^]9333310#"&547.5463232732>54&#"P`\i]r҅A>9.+di^[`hc[^1aUk`ҨյZb6;}gmD&N/&+5=m&.&+5Ea&yN(&+5E&T$&+5%L&&+5 K=&'==&']>&G]q&*vNN'&+5L&Jv2&+5_=)g@6' !!'+*%_Y%`Y     _Y _Y?+3?3+33399//+?+3933333310!!?'7!!'7!32673# 5?%+5&vN@ *&*-%+5+5&v (+%+5&$N &+55=&DR *&+55&$#N&+5=w&D+&+5&(N '&+55?&H -&+55&(*N(&+5?w&Ho.&+5&,N &+55yF& &+55&&, N&+5Uw&z&+5g&2(N )&+55=&R '&+55g&2N*&+5=w&Ry(&+5&5N (&+55/#&U &+55&5 N)&+5S#w&U&+56&8PN (&+55f&X# '&+556&8N)&+5fw&X(&+5LL&6L&VL=&7ZLb&WCEL#K@& !! %$!  _Y?3?+3/9/9339333310%7,654&'7,54!"#632+5}vlPV▚@B.fi#R)k *R.G=e*E G@$  "! PY?+3/?39/9339333310?>54#"#6327,54' Қ2U I7/|kq ' O@&œ nwJ^>L@0׿(#&+"&+5J&K#&+5LL"[@"$#  @Y_Y_Y"_Y?+3?+3?+?+33993333310!?654&#"!?'7!>32 CMlJϦl1n} 55>L"0;s@?1*1 *#6< =!&PY!--RYQY4RY9PYOY?+?+??99//+++3?+399333333339106'7!632#"&'#6?#"&54$32.#"32674&#"326@D,jhhem<*I4x7{^0#J5^dXK9=$:30.g-:0k-# ]JXpUB8_g7-kIB'+ ,u2'h$/\@3-$"( " 01+_Y  $@ H %_Y ?+?33/+39/93+93339310#"$5467.54$732654'2654&# ;įw ˠnh $vpdPyε#)o{we7#0M@)+ ! $ 12! 'PY -PY?+?39/9+393339310#"&547&546732654&'74&#"32>źy BU-~_fcaZ]\[¥91n*&7Q;`'Dt")QwE=K@&   `Y _Y?+3?3/+3?33933391037#"#!!2'>54&#a_DE8iagm^=Vm][Ol954&# 48j7/-dΰcP}-/1[UMh7>a:DL&$gN&+5=L&D"&+5U=/@I%%# -((** 10!!$$`Y `Y_Y%_Y_Y,**?3/3++3?+3/+9/3/+3/393393332310#"'732654&'7!?'7!#7&+!73#'!! ?3!H=01=LDA8 Ѩ 9Bm]j<@I@aUeBRQVfqK79,;~55d7R?U_+5V@/, /%)67,OY$$(PY((!QY(2PY?+?3++99//+93333310#"'732654&'7.546323267>54&#"6H=01=LDA1{kiZBYXQV=:F`fqK79,;o!q\Y_ I='*KT#Rmq9Grg!&2 3+ 1&+555=&R'j@ 777 H+55]]5g!&2 8+ "&+55=&R'@ 5@ H5+5]r5g&2N!&+5=/&R&+5g!&2 77 %&+55=&R'" H"+5u)D&<3N&+5YF&\L# O@*   "!QYRY OY PY?+??+99//++3993333310"&'#6?'7!63274&#"3265^q@'I3y+''jg:36)h-:LOH>Ye&-$ ]JXp'+ -t2IL+)4j@9 &!/$5*6$!&QY-RY!!2PY RY OY ??+?+3?+99//++?339333333104&#"#'7!>32632#"&'#6?64&#"32604K8nvTWef%'jgh^q@'I1{:32,g-:-8[g-llmf= ]JXpOH>Yg.'+ .t2b&]@0! ('QY RY  $PY  PY?3+3?+99//++?333933333310#?33#632#"&'#6?4&#"326{@%[&%jgh\r?(I4xh:3..f-:X-'T ]JXpMI;[et'+ -t2%L,@  OY PY?2/+?+339310"'733267'7!;QO!/,AK3$Ln--/+9b@4993%3%:;/PY66RY!PY( (RY OY?+?+3?+?+3?+9933933333106'7!>32#"'#"&54$3232654&#"'.#"3267@DLPG}p|{^S:ged]N;>#J5^dXK9=0k-GrOR`Ϯ-0p{N=kIB+L#0=g@71'7..7>?!3PY!::RY*PY $ $RY OY?+3?+3?+??+3?+99339333310%!?>7#"&54$323632#"&%267&#"!32654&#" 0By$&NH\My.chH/yffc[[>jcbYK58Z//>;D*Ѭ r(tx0o|N=s#@N  #" %  %$ _Y`Y"   ??3?39/993+3+33333399339339910#7#?33!?!# 3',cV p3c} % @N |Qp!B0 hh5.ql55q5u^Zri!*l@; )(!(  &+, )(!_Y"_Y ?3+?+393399333393333310#7&4$3273#5&'326?3#"'"&[}ds\ae-A&5'crDHA=sq'VR}ϐ)| ۮND5*/>q$=d=R@+ _Y_Y _Y?3+3?9/3+3+339333310!?#73'7!!!327V, g[ < [Jf־ko5IT55T@D    ! _Y   `Y ?3+33/3?9+333393393399333310##"#!733#7'!?#&(c+r3_@C8NcN<8D nw B1=W@;^^_55wWL9`@2)4$&. 99 4&:;.77PY7RY,PY''?3/+?+3/?3/+9993399333210#'&#"+32673#".'.'&'733254&'.54632/?gRbTuh`+(.: -"/Jh?5&&2)-_<]iebnl8KO6R<6|Q)cU9. 9lvFR ,;\31wP#L"O@( !!$#" PY PY RY?+3/?+?3/+33399393310732673#".'.+7#"#7!6K2"1%.: -"/5#"#>gQ [YDB@B.P8755 ,%!'i@@@   PYOY?+3?+3/93933103?7$54#"#7632i9<o[@B-2-? 01+z`-=$-s@A(-",,## /."_Y--`Y-- ,`Y_Y  #`Y _Y ?++??++99//+93+3933393310!%#?#73'7! 2654&+!!2654&+ * '.W'T¥X# 5T\5zThdO6=(f@"& % )*&_Y !@Y _Y ?3+333?+9/33+3399333333991073'7!!'7!3##"&5467!26?!OZ  ZZ  Z$(+,%% T5555T74aHN"'*@a  !"%$ ) (*'()$"! ,+ (%''`Y *#*`Y## _Y_Y`Y?+?3/+?3/+9/33+33+939333333333333393310#7'373#5#! ?3!#7#?'7!733'#7#9B,l<@I@UeBRQ[P Ѩ -[a\sPۘu=dAd}}55(.4u@E/ 1 ) +,"#   65 .OY,+#12" QY%PY ?+?+39/99+33339339310#&5463233267#"'67&#"74'>JV}$*V:>ȭ4QZB\\Q?`VF`}OF IHY̧!P*'='*NTp r]: [)l=T@,   _Y `Y_Y?+3?3/+9/3+33933331073'7!3#!"'73327bZ  Z)Pf*A T)!HT55T<.%L"L%\@0   '& PYPY#SY#OY?++?3/+9/3+333933331073'7!3##"'733267#"&54632,=3JU$QO!/,AK^:@-,@@,-@TX-bTn%,@@,-@@rKL /O@(. 0%''1&&**#`Y*_Y_Y?+3?+??+3/33993333310"327.#".54$327332?3#".54WHO+kBa) 89Z17B+TPJ" [jIG7-:1CzVK=L,O@( $!!-(**.  PYQY))&PY?+3/?+3?+?33993333310%267654&#""&547# 46327332?3=oA1RG]QOv|*~NkV3%./#UN35xRgx|_€P+EAmn8m= h@9    "!_Y `Y  _Y`Y_Y?++?+?9/3+39+3393333331073'7!2!#!?%2654!#Ug  Z ZmeLZH5T5L55Z'#S@+   PY OYRY?2+3??+9/3+33393333102#'"3###73'7!>2,+&PGJKww?vQzdhTTTf-yt+)= x@D   !"  _Y  _Y  _Y?+3?39/933+33+333393393910%!?!7!/7!!7'7!3!'!a N = # ;}  P55T5555T_-]von*?Eu##= E@#!" PY QYOY?+?+3?+3?99333310%!7# 463273 4&#"32676NkMRG]R=oA1--lP-EAmQgx35tM E@#!" PY QYOY?+?+3?+3?993333107!63 #"&'#32654#"wNkMRG]R=oA1-lӠEAmfgx35xL*E@$ $ +,''RYPY  PY?+?3/+?+39333310"&'>32#'&#">32%32654&#"X?(M>#17AFPG}:ged]N;>-'rstzGR`Ϯ0p{N=P4@   PY QY?+3/?3/+93310>32#"&'33265#"Q^G4-7?i_c΍#KW?dw ._@1&#-#&!0!/#RY*..**PY*QY!?+?+3/9/+993339333310%4&#"326'&#">32#"'#67.54$32RYzlOu|S?i`dBYp|ҩ\7$I-JB0-*4YCIN?69b[roUYn!_$ >L .T@-& *,,/##0" OY"PY  RY,,(PY?+3/?+3?+?+393333310.#"3267"&547#"&54$326'7!32?3#J5^dXK9=v|1{^G@DV3%./#UEkIBY|a𱹙-0k-;n8m>( ,N@)% -,,.*PY*#PY#  RYOY?+?+3?+?3/+3399333310.#"3267#'&#"!7#"&54$32?>32#J5^dXK9=y11@Iq{^G&͓N>EkIB{v--( S !A@" "#OYPYQY?3/+?+9/+9333310"654&#"&'73267$54>32Ob g`3"3;XfweRbu @;<29#"MI/O"A@" #$OY PYQY?+?+9/9+9333310746$?4&#"'>32#"&32>/kiZB\\{c=:F`Y_ I='*NT߳qxq9Gr/+5j@73'00$ 67!!PY , QY'00PY ,PY?+?3/9/3+3+9/9+3/393333310"&54>%&#"'>3 >73267#"&547'267?{rZB\\=..VZ+Y("JU]4sRc=q\N~='*NT ~'w@<'La`W%#5߳Mwb9G)$/[@2) " 01&&OY  PY//,QY?+3/?3/+9/_^]+9933310%#"&546?.54>32#'.#">;#"'3267˓wPFjkn$0%R'\v1. 8S_hWGzGwnmX@O|F$qn^2K` sRMX)0-d@9##(/(.  OY  L \ l   &&+QY))&PY?+3/?3/+9/_^]+939333104&'+732>54&#"#7>32#"'732642I  !IUVR+_97&:tJN\ȩ{l=Y ` qLJMl wjHiH`<8bC|@E390##96>**E>D6))&-- 2  OY  L \ l   <54&#"#7>32>73267#"&547#"'732642I  !IUVR+_97&:tJ"V)-"C,(uJJ])'N\ȩ{l=Y ` qLJMl re # ~(>8+=OWSW2#{8iH`<8bG-V@2* $$ *./!  OY L\l ''RY'RY?+?+9/_^]+9933310"32654&'#732>54&'2#"&546Guo|m[dAy~sH~pG\ͣГ%]yZK9K ` T@>CxbdhHշ[hU@*  PYPY  PY ?3/+?9/3+3+33339333103#!"'7332?#73'7h |Pf*A T)!&| 5?T)<.T5E((7\@0 6-"" 8''9((%%PY%2PY!)QY PY ?3/+?3+?3+?+3/393333310'&#"#"'3326?# 46327>32267654&#"1@H&s/7 !`+!Nk!%ʗN>$=oA1RG]R{sqP-EA35t^gxE+K@'* $-, PY&QY PY?2/+?3+?3+?93333310"'3326?# 4632734&#"32676s/7 !`+!Nk&RG]R=oA1EqP-EAmORgx35t=!F@$ "#OYPY OY?+?3/+9/+3933310"&54$32#7.#"327'7!͐??&> `3qkZL.oq\7P "*--&E$U@,      OY PY?+?3+339933393333310%'>7'7!'7!4&'H8Nl[\^ po LX--}--5@f^KbU@,    OY PY?+?3+399333393333310'67&'7!67374'%IhA7;}e X6kYn --fLE@#  OYRYOY?+?3+?+?9933333310!7#"&547'7!32673vO#RYee`og/4J9o-iolf"^--s3,8|\xJ&H@& "" '(RYPY %OY?+??3/+?+39333310)654&#"#>32#'&#">32f04K8o&̓N>$11@I9PXefiFy--8}[{viomf;JL0Q@+% ++12%(RY( PYPY?2/+??3/+?+393333310"'733267654&#"#>32#'&#">32QO!/,AKv04K8o&̓N>$11@I9PXefl$Lny--8}[{viomf+&LQ@+ SY  PY  OY OY?+?+9/3+3+9333310#!#73'7!#"&54632&?K?+K@-,@@,-@T-Tf-T,@@,-@@yk- 3@  OYOY?+3?+3339310%!?'7!!nsypwF-- --)OJ@$OYOY?+?+99//993339933310#'!&#"#>3'7!327O*]y!+/dI`+{@-*6\f -A^BR@*   PY    OYOY?+?+99//33+393333310#!.5463'7!3%7"P[=IvIY+v&'8 9- O;Oj-C':YL 4@ OYPY?+3/?+99333310"&547'7!32?3Kv|!+V3%./#UL|@-;k;mmE$\@1 !! %& PYOYOYQY?2/+?+?+?+93339333310"'732654&+7!"!'7!!-j҅zK8k6m+T F8E0M˰1-H-4"1ԓfz,T@- '!!"" -.&#OY&! OY 'RY*?3+333?+?3?+933333310%#"&547'7!32>7332>73!7#"&[HLUa`ogV,zc cf[,~c cvGMXaftif&\.-s3dT9@#dV7@-dvmfLz-X@/(&!!""./(+RY+&#OY&! OY RY?+3?+?3?+?+3933333310%#"&547'7!32>7332>73!7#"&[HLUa`ogV,zc cf[,~c cyWJJXaftif&\.-s3dT9@#dV7@/fqmJL]6_@2& !, 522!78,&&)RY/)$"OY$!PY?2/+?3?+?3+33393333333310"'733267654&#"#654#"#'7!>32>32QO!/,AKv*-,yd cf[,a cvFMXaGLU`kCLny--7T:F#dX9f-cxnmevjf2sL'R@+' ' )"($PY  OYRYOY?+?+3?+?3/+3399333310'7!>32!654&#"#"'733267vTWefif04K8u$QO!/,AKg-llmf:-F'-8[cnIL (P@) )$&&*  RYOY&&"PY?+3/??+?+333993333310"&54654&#"#'7!>3232?3Sv|0K04K8nvTWefnV3%./#VL|O'-8[g-llmf+k;mkDK@%   OY QY?2/+?33+33?3333993310"'7332'7!'7!#/06#, 8^..q5OewY{am%?!, -|>--==+*@O(! !+,PY L\l  PY $OY"PY!  OYPY?+3?+3?++?3+9/_^]3+39333333310!"&54$3!#'&+373#'#32?3%7&#"ܒ +7=~WL7;=Y!7re}ŵnp F~OW/B@! $,,$01!((OY( ! QY!?3+33?+9/9333310%2654&#"32674?3"&'##"&54$32÷F( ) YX`z7dU~lWĹrd<4OZv]tkbZeW«rя6L#*a@3' $+, OY & PY 'PYOY?+3?3+3?3+3?+39333333310?.5467'7!%4'>>DE=iYOSVWSL-\ Ҩ --} Ӫ - ~ 4 z7@    RY OY?+?3+3?9933310!7#"'73267әvQU2,+&PGk-ytzdh(7@  RY OY?+?33+?3933310!7#"'73267(vQU2,+&PG-ytzdILA@!   RY PY?+3?33+?93333310"&54#"'73267332?3ev|9PT2,+&NKmV3%./#UL|L2souih l>mL#5@  OY  RY?2+3??+33933102#'"#'7!>2,+&PGvQzd-yt=L# I@% ! "RYOY PY?+3?+?3+33399333310#'"32?3#"&547'7!>32+&PGvV3%./#V>v| vQU2zd`k;m|G&-yt#@  PY??3+3393103>32#'&#"^(M>#17CFmr{9,@   PY ??+399333310!654#"#7632!gV3%./#_5v|SIk;m|G/HPP@,   OY PYPYOY??++9/+9?+9333310#'7!2#4&+3265Fx|zh`bGBK}lf-puj!-,VFmi Z@0OYPY  OY PY?+?+39/+9?+39333310#!'7!332654&+xJ`z ;u8 oӁadKBnLf---xoAOL4Z@//) 44 /6 5)22PY2PY'PY""?3/+?+3/?3/+99339333310#'&#"#"'32?3#"&5433254&'.54632/?gRbTuh`7CV3%./#V>v|E-_<]iebnl8KO6R<6|Q Dm|nS,;\31wP#L!0@ PY PY ?3/+?3/+333310#'&#"#"'733267>3217?F$QO!/,AK'M>ron7L!#K@(  ##%$ PY!!PY!PY?3/+?3/+9/3+333910#'&#"3##"'73326?#73>3217?F$QO!/,AK'M>ro_TenTK!F@"# " PYPY?+3/?+3/339933333310"&54654#"#763232?3Cv|0RV3%./#_5v| bV3%./#U|Ok;m|Ak;mEE(S@+$ *) &RY  PY"PY ??+?+9/9+33333933310#'&#"#&'#"&54632>32327&#""17?F QI )WP^l2%'M>3(%y#&4=Rro=&dX8PE\~ 4[' 9?@   PY  QY ?+9///+3993333104&#"'>323#7#736P-#IO3xNO[ h{@%a--/$3`VO-'T%_(LbG@#  PY@ PY?+3/?3+339933333310#32?3#"&547#?3bעV3%./#U?v| {@%Tpk;m|G-'#&a@2$   '(  RY%PY OY OY?+??+9/33+33?+39933333331073'7!!33#!7#"&5467326?!#i54&'!#'&+?0:7:BWNmab\72>~!5 f vcpk\s f 5|xh"C@# #$PYOYPY?+?+?+393333310"&547'7!32>54&#"#7632g| cos Nv?H@0&B1$EMe]A9?-o9#cۅep{½ |.@   OY ??3?+93333107#&5473! *SIq @%,-(X-jh-L@'      OY?2?+?9/9939333333331033## #&547B|>FfKz9*Sk-]{rK%,-(D DfG@$   ! QY OY?+?2/+93339333310) #&547>32#'&#"e@*SsLQD%-8-pjpQ%,-(OàM`R pR@+   OY  OY?+3?39+333393333310%!?'7!'7!95j}vtInF--)--y-- Li"`@2  $#  PYPY PY?+3/?3/+3?3/+33339333310"&547!7#"#7!32?332?3v| 48j7/-dzKL/VV3%./#UL|7~-/1/_Gmq5%k@7## '&PY  PYPY?3+33?3/+39/+3339333993310!#67#7#"#7!332#"32654&7')H"$ 48j7/-dQIYw9I\f.:UV9-/1 R@_h [^:2.EK@&  PY QY?2/+?39/3+3333933310"'732654&+7!"#7!-j҅zK8k6/, F8E0M˰14"1ԓE'3w@? + %##'% 514PY  +% + .PY (QY??+?+9933?3/9/3+3333393333310&'#"&54632>54&+7!"#7!%267.#", ΋p> xK8k6/, FJf6;TUpgL.Sxg^\O>i614"8Fa23OVN>7GtL@&  PYPY?+3?+3/93333933310)?7654&#"#7632H \If`h2BjvS5 {}HB(PG@$   PY PY?+3?3/+9333933310#'&#"!?.54>32BQG\ Sz犹kG 55>;G@$     PY PY ?+3?3/+93339333103325/'7!#"'BQG\ k Sz犹,G  55)> L8@  !PYQY?+3/?3/+39933310327#"&547>32#'&#"΍Q^2|B0-7?i#>Ld*KWE ?_gL )9@$*+'!'!PY PY?+?+99//933104&#"326"$&54$32#"&54632ͨɦȡZޡ @-,@@,-@@zh҇r,@@,-@@E7 ^@7  !" PY L\l  PYOYPY?+?++9/_^]+993333103'7! 2!72654+32654&+Ey5~unhrqu>MijgJU`f-ei_S`kcox,F@% #** #-.  OY ''RY'RY?+?+9/+9933310%2>54&#"6;#/"&546?&54>32{xfsody"?brsUhai^rTC;G ` ZC?Jp_(KS=-\@0"( ".--/+PY+&OY&& PY&OY?+?3/+9/+32/+339333310#'&#"#7.#"327'7!#"&54$32>3212?J> `3qkZL.oq\7P^͐_^&sM>{s "*--&EG@$  PY  OY OY?+??+9/+?99333310!!#'7!!ÒoEsLsLF-Qg-WEL'V@- "" ) (%SY% PY OYPY?+?+9/3+3+3393333103##"&546;'7!3267#"#"&54632vX_pY3+$@S [GJ@-,@@,-@eTR?Yl--!'eQ>,@@,-@@L\L@(        OY OY?+?+3?39393333310!!?'737\ϤT^Q&bڔ>-a-- -!TD 3@  OY PY?+?9/+3993310732?3!'7!~NM?@xS f--DLF -P@*+$ . /PY'PY!!RY OY ?+?+3?+?3/+3399333310#'&#"!67#"&54$327>32267&#"#17?FyENH@p'M>]H/yffc[[ro`/}WK;D*&(txt#a@2"" %$!PYPY"PY?+3?+3/9/933+3333933310)?#73?654&#"#76323#H ",If`h2Bjv""5T {}HBTP"_@1  #""$PY   PY PY?+3?3/+9/933+3339333310#'&#"3#!?#737.54>32BQG," ""z犹kG T55T>>)0n@;#00 )*)12++PY OYPY & &RY 0 PY ?+3?+3?+?+?9/+39333333331032?3!7#"&54$326'7!.#"3267#"zKL/H{^G@DV#J5^dXK9=~8j7^1/-0k-gkIBi>E{1?@E9%1+? ?%@A1PY1/-OY/)5PY) <"q .<C@I6%"CC< &=##& <D++E$>">PY(PY((" OY 2PY99RYC%%PY ?3+33?+3?+?+?9/++333933333333310"32654&#67!7#"&54$326'7!!332#.#"3267#"a9I\f.')H"${^G@DV6QIY#J5^dXK9=~8j7^ [^:2.:UV9-0k-1 R@_hEkIBiZN"4^@12## /)56)PY 22PY@ 'PY?+?3+3?3/+9993333333310#!"&546#?3!632#'&#"3!254&'.547##lO[ h{@%E[o%/?gRbTuh`-#P]ieb5e`VOJ-'#l8KO6R<6|--;\31wPgAaZLu+5j@8 3$,,!1%% 6++7)PY)3$3PY#@!$/QY PY ?3/+?+?3+3?3/+33933333333310#'&#"#"'73326?#"&546#?337>32327#R17?F$QO!/,AKWVO[ h{@% 'M>-#<3arono)`VOJ-'14--^Z!9E@G&#)) /@:/1F88G/@ =RY 59955PY5&#&PY"@ #,QYCQY?+?+?3+3?+3/9/99+333393333333310'&#">32#"&'#"&546#?33#3267&54$32 4&#"326?i`dCXn~ԧ_6M{NS\ h{@%a-#*`!B0-RYK5kMu|?32#'&#"!>32m$QO!/,AKw04K8n (M>#17=FTWef+n-8[X 1'Brillmm=(M@) #)*# PY OY PY?+??+?3/+999333310#"'!'7!3254&'.54632#'&#"~x+h]iebn%/?gRbTuh`H-];\31wP#l8KO6R<6|mJ@' PY PYOY?+?+3?3/+393333310'7!!32?3!#"Z+T7zKL/H8j8]H-1/\TF=/@K  ! #" $)$!0-'--1!$$"" * ?33??3399//339/339/3333333933333333333333333310# #'733654'73'# #'733654'73,T/tEY3S'-9y,T/tEY3S'-9\["fR./ /f\["fR./ /f"= J@'  /? 0   ?33/]3?33/]333333933310#7.+"#!#7.+"#!De_NCJ9Dd_MCJ9  L'S@*!! '' )('PY# #RY OY?+?+3?+3/?339933333310!7#"&54?654#"#76323267veOZef'V3%./#_5v|!)dK8p-,Lhtoh)k;m|E.i}[xLH3]@/ $$ **.++54*PY & &RY 0PY?3/+?+3?+3/?3339933333310#"&5467#"&54?654#"#76323267332?H#U?u|&OZef'V3%./#_5v|!)dK8pV3%.-]htoh)k;m|E.i}[xk;mz2B@    ><,??33?3339933333310'73632#654#"# G4enz?N=<+h$Cc] _.]L?33?33?333933333310#654#"#>32#'&#"632}=<+h$CckzX1#)*enz?N2][ <?223??333933102#'"#'73>/h*Ac\G0puLI< HF#f3@  ; ?>?3?333?3932310#7#"'73267\G0p3/h*@fHFLI<r,f;@   ; ?=?22?333?339933310"&5467#"'73267332?3BO0m3.h*Bci 43,IP??9///9333339333310+'7!3732654&++;y\IV$GBGX:<-(eB.[`  $CH&0q&fL@    ; ??333?3393339333333310# #'733>'4&'73p(J*f>O-IMPr2&sXh&&^)bf?@ ! . ;?2?339933333993331037654&'73#"'7332?'_W&r2IML.0* !QZmDfIE/ ,Xpy]- y91\= \c=.DiR1DlR>DaRq5< @   /99331044#526H3TwwT0K3HPwTTwPF_5* @  /9933103"&5463"J1TwwT3H4GPwTTwPHI2p8@  ->??33993333993310!?7>54&#"#76327,^r>9O<'[ndtn2}2 ; |JK+b(re28@    ->??33993333993310#'&#"!?.54632w'0NOm{*7}2JPoTc*s rU&`7!O@ /32993310%# #3gyyg2)@ /32993310 #3 +2+gG)^2@ Y[/]3++939331073#'Ջ/^!!^ 5@ [Y/]++39393310%3#7<Ռ!!O/9310#3nnOB%E@2Y/O_@7FH <@7:Ht`4DTP(H@ H/]++]q_rrrr+r^]]+]+qq+qqr+r_rr^]]]]]]]]]]]q+10 73˞^ %!E/9310#3nnEB`/399107!tmmL }/9310 73˞L %!nL<}/931073noL!%g @  ?/910#'53#573T6TޠT6T%T%?9310#'53T6T%Y @  /99331044#526lH3TwwT0K$3HPwTTwPFY @   /9933103"&5463"AJ1TwwT3H$4GPwTTwPH @  /33993310%!53533odon @  /23993310##5#5!odoBn (@   /33399333310##5#53533odoodo!oonooV/299107!tVmm_!w1@  @Y/]+_^]2910"&57332673t~JeTV}J_vj8AJK@ksDL G@3  Y@:BH@Pp0@ H/+]qrr+r+9310#"&54632D@-,@@,-@,@@,-@@ 2 4@! Y @ H Y?_/]]+++910#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GFzm5@ Y p0/]q+/933310#"&54673327P`\iD>m*0>9.+1aU?{3/r96;{_*eG@)  Y  /   @Y /]2+_^]+3933310".#"#>3232673<0I?;! )4 uY0J?; *84 u_+5+(8s+5+0F}tS^Z @    y j Z I : +           y i X I 9 )   i        y i Y I 8 )           x h X H 9 )          x H 8 (   9       @ou c R B 2 "           p b R @ 0           p ` P   ]]]]]_]]]]]]]qqqqq_qqqqqqqqqqqrrrrrr_rrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqq/^]3]293331073!73S^!%%!%% 5*@  /22/393393310"&547?>7327 U]O+VZYM(__X%#?Y' 2fs/   =/9310  ' 7 HHIDHHIe(fX@'   ;.?3?33933333933333310'>7'7!'734'w+"736]XW8B ui?nS~ PLj2m2f%@  ,>?3?3339310#'73^ŏN\+J&u#;@ $% < ??33?339933933310#"'733254&'.54632#'&#"rvUS )C7@<;i`=d '?33?3399333339333310#&54?/737654&'73#'o Rg@WKE j RsFef&dMGC  $Nx b&'28@    ->??33993333993310#'&#"!?.54632w'0NOm{*7}2JPoTc*s rU&zY//+93310!!5!Uz&@  Y//9/+933310!!5!3S̑NUz&@  Y//9/+933310!!5!3SUz&@  Y//9/+933310!!5!3SNUz @ Y/+/9331035!3SUbIp@ /39331033!bi~pibIp @  /9/3933310#3!ii~}p|iyJ|@   /2239910%3#7N<Ռ!! ~L@  /3239107!7!tftmmmmDR( /329910#'53737z''( /329910'#573'zzrEg@  /9310'573LEzz''rEg@  /9310#57'53E''z!E @   /32993310#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GF/9910%73˞ %! @   /22339910%73!73ԔEՔ %! %!   @  /223910?3!73 !%%!%%Q@     /333/223910".#"#>32326730I?;!+64 vX0J?; *84 t+5+/Hs+5+0F|uVN_=@ /299310!##Bn=n_=@ /299310#5#5!_nBnKE@ /29931033!KnynKE@ /299310!5353nEnE@  /323293103!53CڄErG/2329103!C^G}g #@ /9393310'57!' 'l'kd!/1073˞ %!E!/1073Eo!%^/3]21073#'Ջ/^!!{_*emu/2107!summ^t/2107!^mm_!w@ /2]210"&57332673t~JeTV}J_vj8AJK@ksDL  /10#"&54632D@-,@@,-@,@@,-@@j3   /3210#"&54632#"&546328**:;)*88*)<>'*8*;>'+9:**;<)*::+  /32104&#"'632#5>3*HFZjQ[pE0"c;U 2x 2   /3210#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GFS^Z /2]21073!73S^!%%!%%^ /3]210%3#7<Ռ!!2O/10#3nnOBO /3210#3#3-nnnnOBB^q @ /2]210 73!735˞k˞^ %! %!_#@  /229/10"&57332673#"&54632s~JdTU~J@-,@@,-@_sl9BIIBH,@@,-@@_w@  /3]2102#.#"#>,u|JdTU~Jwvi9BIIBj`]/10467#"&js~"6'3?Vt&?&3""&,Cj`]/105654.54632]s~"6'3?PVt&?&3""&,Cj`]/104632.j>4'6"~rP'*8*;>'+9:**;<)*:: E   /3210#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GF2L/105654.54632d|x"*"7+3AXk%?$5!"&,MU /3210#"'732654&'73H=01=LDADV!QVfqK79,;RRm  /210#"&54673327P`\iD>m*0>9.+1aU?{3/r96;`E/10#32nnEB&F /32105!#!&Fr)&@ H /]333+22310265332653#"'#"&534GPG43HPwTf==fTwPGI21JH3TwQQwT1JDv@ /]2]210%3#7<Ռ!!Dv@ /]3]21073#'Ջ/D!![s@ /]3]210"&57332673Lt~JeTV}Jj8AJK@F^@ /]2]2102#.#"#>t~JeTV}Jvj8AJK@}~,@     /]3]310".#"#>3232673>0I?;!+64 vX0J?; *84 t~+5+/Hs+5+0F|u#~/3107!tmm~/3105!mmE~@ H/]3+2105!%5!Emmmm!+1@   /   /3]210".#"#>32326730I?;!+64 vX0J?; *84 t++5+/Hs+5+0F|u5t/2107!ttmmwt{/2105!wtmm /10'mMsMMsMM/10#3db2E  /1044#526SH3TwwT0K3HPwTTwPF#F /32103!53#݄FrEB /3210!!7#3Vzzyz.@  /333/33310.#"#54&#"#>32632 ?(5FPF5)> RnJg<3232673F0I?;!+64 vX0J?; *84 t_+5+/Hs+5+0F|ue3X/105654.54632Xs~"6'3?#Vt&?&3""&,C3^v  /339/310#"&54632#"&5463273v2&%55%&2p3%&55&$4h&56%'34&%65&&43!C%IE? /210"&54673327^-,#t!0$HE/&˶( 0 A /22105!#!V&rE~ /32105!%5!EmmmmEA /3210#3#3nnnnEBBE8 /310#5#5!8nBEd/+@   /99//992233331032673#"''7&#"#>327*5#,:4 tY8;MOS5$ )4 uY8;LP)4B|u(i1r)(8s(i0 H#/@  ' !-/9333310".#"#>3232673#"&54632#"&54632Z0I?;!+64 vX0J?; *84 t3&$44$%4U3&$44$%4+5+/Hs+5+0F|uk$43%%44$43%%44xU#1%@  ++.&&"/33/3332223310".#"#>3232673".#"#>3232673h0I@;! )4 uY0J@; ,:4 t0I?;! )4 vW0J@; *84 u+5+(8s+5+6@|u+5+(8s+5+0F}tg  /329310'7#'573'7 '' '' gll'kk'EF /332105'73'j&jE' ' #/;GS_kw@W!{Q]]KWiic uo9EE3?-'Wc?''?cW /33333/33933333339/////////33333333333333333333333104632#"&%4632#"&4632#"&4632#"&4632#"&%4632#"&4632#"&%4632#"&'4632#"&4632#"&4632#"&4632#"&%4632#"&4632#"&4632#"&4632#"&#5#5!!5353##!!33!5!!5!#3#35DxxdP_Nd8dwd8dE88DddddKquffd?d%8?8ddd88/103#57'zz'  /103"&5463"TJ1TwwT3H4GPwTTwPH_  /329310#"&546322#.#"#>E@-,@@,-@2t~JeTV}J,@@,-@@vj8AJK@Et =/10''7'77tGGGGGGGGE/10#'573Y'zzE/103#57'2zz'DE@   /3/32/310573#'3#57'zz'?zz'  /1044#526H3TwwT0K3HPwTTwPF^  /10#"&546323&$44$%4$43%%44L /107'37'#7'7 N N Ha_G10G^bH1jEF+@ ) # /3992233310#"'#"&546326324&#"326732654&#"FwTg<3232673gȻJa4gǻJa4^+5+A6p+5+@6q_w@  /3]2102#&$#"#>$l' J+,J 'wFSCHHCTESg /10'7!5!'7B ' ' gldk'h+{z <?>??33?3310#7#"&54>3273.#"327DeUHXY[HA p(=c:5-ATb^kk^gjH [S@MT,_{ <  ??33?393103267#"&54>32>54&#"_ϥ6[(/:gcWRMVu%#?lTq ,%*7pbdgF^E"+9g ;>?3?210#'737#"&54632z^\M%&&&&c ''''a,~{ < ??3?31032654#""&54>326?9TzU|rdwR\ewQVk`]mp*ml; ? >??33?31032673#7#"546'73,<-h"Bd\Gdoz=C==J8{t~1bIx,f{ <??33?3310#"&54>32#'&#"327"-y:^lYT&b"! (=9g:|T^*7ndlc h&WZ<e+ '<  ? >-?3?3?33?310?'73#7#"&54>32&#"327"]DeUHXY\<-4:c:5-GNm0^kk`hhL\Q@MT_8f ><-??33?3310'73632#654#"#G4enz?N=<+h$Ccc _.]L?33??3333310>32#654#"#654#"#'73>32-f,3:>O> 4+r;d=6,u;d\G+h.5:>E@= )]U<?223??102#'"#'73>/h*Ac\G0p{LI< HF,;??33?33310327#"&546#?33#G(4 IL33AJPR& : 4=0&k27f,vl; ??3?3104&'73#'7376r1,qDW'4PjIA[8l#"@   ;>?3?3993310#&54?/737654&'73#'Ao Rg@WKE j RsFef&jMGC  $Nx b&'^@s_K@y|H@kpHjKkK[{ k:@HLHt`T0@$@"(HpTd@@H/]]_]]]+qqq+rrrrrrr+r^]qrr^]+]+]qq1073h^!$%E/10#7hv!% tEj /210"&54673327-,#t!0$HE/&˶( 0 T-@QY QY?3+?+39310#"&'732>54&#"'>32T`0.3~Uc\jdU@$Q^=]E**:@-3KW={&:@$p$P$D$ $$$]]]]]]5T&5@$p$P$D$ $$$]]]]]]5_"^:@x_K@y|H@kpHjKkK[{ k:@HLHdtPD 0@"(H`pDT0@'Hpo Y/]+_^]]_]]]+qqq+qrrrrrr+r^]qrr^]+]+]qq931073h^!$%3^v b@ Y @$Y@7BH @@ H/+]qrr+r3+33/+93310#"&54632#"&5463273v2&%55%&2p3%&55&%3h&55&&44&&55&&44!C%I&$9. H @ %@H+55+]+5?5-CUN>'(9)@% ]]]5+]5?5>'+9)@%]]]]5+5?5>',9)@% ]]]5+]5?5L&29'  H@ %]55++5?5>'<9H@}}H@{{H@xxH@vvH@ ttH@rrH@qqH@ooH@llHhhH@ eeH@ccH@'bbH@``H@__H@ZZH@WWH@VVH@TTH@JJHHHH@ EEH@CCH@BBH@@@H@>>H@ <'%+55+55=U&c9 h-0 %+5,%&g9 .1$%+5IK&i9B !$%+5yf&k9,@`P@%+]]]5[n&w:@ f-%+555=U,z@C%  -.+ @ +++ ++(!PY(QYOY?+?+?+9/_^]3/3/_^]3?3333339933310%#.'#"&54>32?34&#"326?Qp@l'&m#OS^NMESX--.>{ƪs[(,ٚBznQL*f@4! $(,, +%$%$PY%% PY PY?+?+9/+9?333333_^]939333102#"&'#6"32654&'7>54&m~N*S-`nN#y@xV w+aPRη}|Nǭ]i%LT>@ OY ?3+??3933993333910733654&'73'>7&'%P0b#8T0) J$Z,-`@$- &SJ >[<+f@7&$$ ), ---/- &OY  PY  PY?+?3+9/_^]+3_^]39933339910"&547&54632#'.#"'2>54'钼n#/P-WlGr^X|؂VKeG}&mSS5vq`sOku4~,%-c@$ +(+$./@% H!QY(OY  ! PY?2/+?9/_^]+9+3/+33933102#'.#"6;#"'327#"&546?.546&@.$0S-`t7#x934"QTbW ϔxBNsfZ5X g pOTV`0{hlCuB!b@"" #   @QY F4 ?3]]33/]+?99_^]]^]]3933104%55$7'654&'.B4(֗Y0bghi\[@%XQrFY7M6[Hg47Fr3:"IK \@5  "!""p""/"O"_"  RY OY ??+?+3?_^]]]9933333333104&#"#'7!>32#47654J9nvQZfjX#\-8~]g-ione$aZ-f!g d B@#   PYPYPY?+?+9/+99339102!"&547"!6532yhx}OoS)"v9っNۓPx|NΉAy6@  OY QY ?+3/?+93333310%327#"&546'7!*%<@/mEGQ k+p--/$3`VQU-]KY@.     OY   OY ?+??39+333333933333910 3##'7!AeoΛ?s--mg-DR@,   QY?+3/_^]?33?933^]9333310"#7632##7'.]#01OGDU4 UaNۭ'@D S4s{K-,(+zfJN@'   RY OY ?3?+?+993?33339333310332673!7#"'#`@5>=v`sFK8Qԅ)/B4*-]<+2YFl5@0 $* 67'-'-PY4@.H24b4 ( 8 g H 6 4 N'' ''1g47Fr35&&Yzdf"1B[9Tr j .CV:!4=R 1"`@4  #$ PY   QY ?+3/??3/_^]+333393333333310%327#"&547!#7>7##7!#$<@/mEGQbn=5NH$uF9:`--/$3`V.[-;-CӀTULJ@&  QYPY?+??+93333333_^]9310"'#>32'254&#" zpQ!ڧz└pb3Sq*6ܿPٌ-0=G!?@  "# OY H ??3/++99393310'654&'.54$32#'&#"0bghi\[~o%72[O`\7M6[Hg47Fr3:"w*%Ё+=3 7@  PYPY?+?3/+333993310%2>54'"#"&5)73UN3jozވ,6L94;y蓢׶ *t-U@ /?o PY@ HQY?+3?3/++3_^]339333310%327#"&546##7!!B1J0lGHQ hF9:aZ$.(6`VOJT_[nA@"  OYPY?+?+?_^]993333310"&547'733 4&'7NMd\R#*%atSd{-UBdqm8Ə=L5$Q@+" &%&  OY PY?2+3??3+3_^]93333333102#.54>7>"64&)JjJj|QrBl^7Dl9Ư]Ŵ?%dQho ?pk\L#@L   %$RYd     RY?+?3/3?39_^]]^]]]3/+333399333339939910.'7373#&'#7>c 69mx{,!}=ENY__YG!, -H]1'"/$-dX}q!(n~zLk@7     OY PY??3+3?3+3/_^]]9933333393333310#"&547'7333>7!jJIM] ejσg_[BHL?Y-N0YulE-DL/G@%',  ,#011//"))QY?3+33?39/_^]933931032654&'7#"&'##"&546732674?B) YJp]]z 6-%+55=&R9M %+5[n&w9 %+5DL&{9@7@H7@H7@~~H7@}}H7@||H7@{{H7@zzH7@yyH7@xxH7@wwH7@vvH7@uuH7@ttH7@ssH7@qqH7@ppH7@ooH7@nnH7@mmH7@llH7@kkH7@jjH7@iiH7@ggH7@ffH7@eeH7@ddH7@ccH7@bbH7@``H7@__H7@]]H7@\\H7@ZZH7@YYH7@XXH7@VVH7@UUH7@SSH7@RRH7@OOH7@NNH7@LLH7@KKH7@IIH7@HHH7@EEH7@DDH7@BBH7@AAH7@>>H@=7@;;H7@::H7@88H7@77H7@44H7@11H7@--H7@**H7@''H7@##H7@ H7@H7@H7@H7@H03%+5++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++J'G@%$$!( )!PY PYPY?+?+9/+93393310%2>54%7$4&#""4$32K}E CMPx̓ ܯ'ROtxqDcq N uVgXKX|at {[G'4[@/$((.5 6OY $2$PY 22 PY*PY?+?+9/3+3?+3399333333104>323##"&547'733267#"&4#";>.RScg 88B,NMd\R'F1y_S,Q0N[3*c[nl4X{T^Y{-UBdqm|G{IEEFuL#A@! $% _Y`Y?2/+?+3?933933102#'.#"!?654 66iH'; ,1<'< Kn| <4L'o31g55ra5)+:L'9'?5u&jPN 3&+55/L#L@' $% PY  PY??3+3?3+3?9333333310.54673 %4&'>:JRnRJ]VVXf`TWWLث7 թ_}7 { 31T@-.-+" ! 23!!.PY( QY?3+33?+339/99333310##"&'##"&547##732674?332654'!ʈ]zT{_]hT«Srd<44O]tg1DLGA@H11 ."<95577<"(BC925AA511((++$RY+>RY PY?3/+?+??+9/933?9/93393333333933310#"'73326?"&5467#'467>54#"#>32%>733267G7$QO!/,AK OK)\db@!  $% _Y _Y _Y?+3?+?3+933310!?&54$324&#"326 =Zޡͨɦ55Y !҇Pz=L :@ !"PY PY OY?+?+?3+933310!.54632 32>54&#"[Ks҃=i^[`hc[^y-͚յˆniL#4@  $%  _Y?3/+993393310'>54.'&54$32#5.#"U믯fnNVs7AZG&96>@b3ۮ+/7 4@ !"PY?+3993393310"'>54&'.54$;73|t/d{fbhkRS^K94Xw@S6^Kg/9$QB46#l=U@+  _Y `Y  _Y?+3?9/3/++3/33339933310#7&#!!#'!!?'79Blc,=C\ Ѩ =555LL@'  PY PYOY??++39/3+3333339310#7&+373#'##'77Bi؇e<=I=pȠj-M=4@   ??9/]39933333310%#'47!654'73!IB7%#'6$32 '654&'"6V!ߙ[dZOej9{.(de-\IXHpUBH@( QYPYQY?3+99//99++93910&#"'632'6=''.''Ȏ˴ .cw" &#";O!{ &WAnWXFh=Fv@% 'FF-11*':!7'7GHF8,,*_Y,!!A3$3Y$  @ Y`Y?+3/+??3+333?+333993333333910#"'.#"#7>323267#"&5#"&547'7!32>7332>7h&񰊔Ou323267#"&5#"&547'7!32>7332>7z#ݬ;xGIx32#'&#"327'7! ZiPlnaR*A@`hu{is  Ѩ51(!1κ~6J55bg$P@(   ! !%& RYPY"OY?+?3+9/3+?9933339310!>7#"&54632#'&#"32673[G N>$11@PA,,0/*{*-EV=1n@, %% 3 2,.@Y..#(+&(&_Y( %#%_Y#  @ Y`Y?+3/+??+3?+39/+339933310#"'.#"#763232654.#"!?'7!632VӸ~y?j=G}#-"r|Ea4yrYooh ϦB [}jWD"!FA54'#"&54627&#"j* D$:2~_H*))A6ADDEDLr?v:^|Py>FZUbG(1H>?nv:2vdYq_P<-6-L+K@&#( (,-  _Y& _Y?+3?+3/9939333310"&547,654&#"#63232654'7 KOqld>B-V0{'-p͖t~4*em&nouC29=UX"G@$  #$ ""PYQY?+3?+3/993933310327#"&547,654&#"#7632C32 !(9o`S^S.>430XA0duWsQ:ZRe[]1^NdžD..~E2XzIyoe.v#&]@0% $&  '""($$ PY  %PY ?+?3+33399333393333310'&#"!76.#"#76327632!# 57a1GX}h6.)&;/$BXu*,pX<$@o;E!!D<opps]$4Z@2,,"5"6!@Y% %_Y @ Y/_Y?+?+9/+33+339933310".#">32# 46$3232673"324&@YPV54+!?#".546;7'7!32vuG<>32%>7332673#"&54679\db@!*#12vY - -PY &PY?+?+3?9+9333107$32#"&'##./.4&#"32>-ȊllWY.2 bbuBhe[^i`Zatزm`v?o] $>6- h={-@QY QY?3+?+393104632&#"3267#"&=]7.wc\jdU@$Q^tWK*d@-3KW%LLMgL={?@!  PY QY QY?3+?+39/+3933104632&#"!!3267#"&=]7.ws'8jdU@$Q^tWK*dP3-@-3KWT?@!  PY QY QY ?+3?3+9/+3339107!74&#"'>32#"&'73267Y7jdU@$Q^`0.3~Uv%PM@-3KWʾ]E**:=pLqiL4@ _Y _Y?+3?3+33993310 54$32#5.#"326?3|-A?aaN>A;"|3ۮ+//+3=a@0      _Y _Y?3+333?3+39333339933393310#!?'7! !!?8# 8 Ѩ OL>[ Ѩ :G555C5b551bMY@- OY OY QY?2+?+333?+?333339333910"'73326'7!3!# 806#, 1bG8do'IpJO_M!,%--/XrL"L@(   $ #QY PY PY?+?9/3+3?+393333310"'!!#7#73>32'254&#" zp"0 zz!ڧz└pb3S0e*TTܿPٌ-&L:@ _Y_Y?2/+?+3/933310"'332$54&#"#63 -A?a#aN>A;A~3%+/m/+%3qiL&]@ p!0!!!]]]5&L&@ p!0!!!]]]5&(CN!&+5&(j&!.%+55+55L=2@%  -00 %34#+`Y&&#@%Yp   `Y_Y?+3?+33/_^]39/]+3?3/+933333333333310"!?#"#!#7.+>3 #"'73327654&u 3_?C7t7D }1KTBa \ ̤K+BB*!n rg55; Y#;Cn>6Xj &Fv^}&%+5+5riL"m@? # $`Y <L _Yo    _Y@P`?2/]+?3/_^]]+9/_^]+3399333310 54$32#5.#"!!326?3}-A>`6/ rDHA=s |3ۮ+/ZEID5*/L6=,&&,j.t@ &  %+55+55=-=!)@= !!"## ' ++ +P+ *!_Y"`Y## `Y@Y#`Y `Y?++?3/+?+9/_^]++33_^]9333333333331032)?! #"'7332'7! 32654! cRff\3-2[qQ  kdlر鱟5.z/Y%555˒= (@P  !""  & **0* )!`Y ""`Y  _Y _Y?+3?3+333?+39/3+33_^]93333333333333333310!!?'7!!'7!32)?32654!d Ѩ  ]_  [ 'dlر5555555.,˒=*@ '((!+,$$@0Y   _Y p   `Y (_Y?+3?+33/_^]3?+39/_^]+399333333333333103?#"#!#7.+63 !?654&#" 3_@C8t8D !f1JxY A  @ oyB+v 5; Y>1U55nU#je g5&vN& %+5+5%&CvN!&+56& N@ &&v(" %+5+5`%=q@   @ _Y _Y `Y?+3+3?3+333?393333333333310#?'7!!'7!!# Ч  wΧ  Ч A555l55b5`H$=u@@  `Y#  `Y  _Y `Y _Y?++?+3/_^]+9/_^]+3993333333331032)?'7!#'.+ 32654! ћ *A)Qidر鱟55 ˒=%=F``t=^@$     _Y`Y@   _Y`Y?++3?3?++33933333333310%! #76'7!#,7{AB4  аdAZZ`k855b$=(='@O!"" ' ' )(  !%"'%'_Y% _Y ?33+33333?33+3339_^]33339333339333333310'!? '7!'7!'7! !!?X |,ބ Y Xo  okP ` E'u N 7  ]555y55r55B 5E55K)f@; '!!'$+*$_Y/p _Y_Y?2/]+?+3/_^]9/]+9393310"'332654&/?>54#"#632Q%B !:r5(>B-ѽ+ sR )~%=j@6    _Y _Y?2+333?3+3339339933333333310#?'7!7'7!!? Ѩ    Ѩ 555Ky<55b55{E5%& N@ $&& %+5+5=x@=&     _Y    _Y ?3+33?399+33333933333399993310_^] !!?'7!'7  eX Ѩ  bw =59)5u5555.5=]@)  _Y _Y `Y Y?2/+?++3?+33399333333310"'7332'7!!?! Y\3-2[qQ  Ч nRf/Y%555b55z=0#=+gL2+=S=3riL&=76=|@3    w T C 4     @Y _Y?3+333?3/+99_^]]]]]]3393333333107! '7!#"&'733267    S1Y!- 3Ha55855ܞIaowD=-@A )'((-+-##-.//@/p/ _Y'_Y  @#H@H@ H+(-+-_Y+_Y?+3?+399//+++_^]3+33+3_^]93333333333333333310 4&+  ;#"&54!37'7!32!#!?D|Me$  [ , U}55}55%=;`$=k@5    _Y _Y`Y??++3?3+33333993333333333310%#!?'7!!'7!dA"f Ч  wΧ  P$555l55= ~@    !"@Y   _Y_Y?+3?3+3339/_^]+3399333333333333310)?#"&547'7!327'7! Q>  ?|r  Ѩ5Y@YW55N;555b=@N    P  _Y  `Y_Y?+3+3?33+333333_^]q393333333333333310#?'7!!'7!!'7! Ч  #Χ  $Χ  Ш 555l55l55b5`=@\  f/O 0@   _Y `Y_Y??+3+3?33+333333_^]q^]39333333333333333310%#!?'7!!'7!!'7!*dA" Ч  #Χ  $Χ  P$555l55l55G<=k@<  `Y#_Yp  `Y`Y _Y?++?+3/_^]+9/_^]+933333331032)?##! 32654! 3K@C8 idر鱟5;5˒X=$@R $$ $""&%$!_Y!_Y`Y#`Y`Y_Y?+3?++9/_^]+?+3?+33393333333333333310'7!32)?32654!!?'7!u  [ 'dر^ Ѩ  555.,˒5555U=`@3  `Y#`Y`Y_Y?+3?++9/_^]+3993333333310'7!32)?32654!u  [ 'dر555.,˒. L`@6 !`Y _YP`o  _Y ?+3/_^]]?3/]+9/+93333310!7!"#63 #"&'332! 4q=B:0sq2A,y0%IZ%3";)<2L .u@>  (!  0 /$_Y`Y _Y _Y +_Y?+?+3?+39/+?+393333333333310".547!!?'7!!6$324&#"3265c Ч  ]^((A菶C@5555sJo=}@E `Y?O  `Y _Y _Y?33+33?++9/_^]+3333933333333310 !?.54$)!?#";Y dr W ћ Zu׺L5)xǺ5b55=DZ= .E@%((!/00,PY,%! % PY%??+399?+_^]39331032>54&#"%>733>32#"&dXWZc]WW4aD2>giQqO6)'2mT;"NZ1 4LtZs׳?U&@ ! '((((( @3(HOY/?O_o   $PY PY?+?+9/_^]q+99+_^]9333339910#"&5463232654'7>54&#"&废鏁wʰdu;dD7g p\Z*tiX #bg8H)#i@@ $%%%/%   ! !!QY! @ H  QY?+3/+?+3/_^]99^]]^]933103267#"&54>7>54&#"'632񊢑ZXGJ4܀:~uZSDy{"ƀe61YQPM6&*pD]K0(^PD?T,j='<@ % ()!PY PY PY?+?+?+9933102&#"'632#"&546"32>54&NApÜ<3 333>32#'.#"327# 47####"'7332654&#"MGFG.쎈_!7?&KMWDkuDJJK.쏈_!7?&JORIku$QQ>2P3p wwd*KWZ3=J3p p~d(x@I%%** )(PY L\l """PY" QY @ H ?3/++?+3/_^]9/^]+93_^]93310#"'732654+732654&#"#7>32LWǩ{twxyivVR&]#97&:tJrheH`<8icShhJMl xiffXf&X  v& %+5;s@>   OY   OYOY?+3?+3/?9_^]3/+39333333339910'7!'7!##sWV$QbBg----r5F@%  !!  OYPYQY?2/+?+?+3_^]9933310"'73326>32!&#"00#,,Oa(ZyjRo1;Q;''?H]!.WA-i 7oޘPl@;   / OY OY QY?2/+3/3?+333?+3_^]933333333310"'73326'7!3!#+06#, 0^LB8do'Ip1?Rc!,*--/bE[@1  _o  PY  OY OY?3+?+39/+_^]99333333333310!!#'7!!oELsLuF-Qg-W=RIQLS?wFJqPUF\7Lw 2>@H >32&# 9++?@@25/5PY/&<(7332>73!7#"&POTb e -g/11g cf133ebvGU^hazkeQK-y-7Z6@#-7_|5@-`{oTh1@L  )((''&&%,+#$$*%%233_33 ,/RY/+&OY+)$ OY RY?+3?+33??+?+3_^]]9333333333333333310%#"&546'7!32>7332>73##7#"&POTb e -g/11g cf133ebvuüGU^hazkeQK-)p -7Z6@#-7_|5@;`{o9%M@($ &' " "OY PYPY?3/+?+9/+393333310"#!7632!"&54>73254&#"I$PJ7/<&Y`P:mnfg`z~CdY  ړ {Pz~hdWJ! f@6 !"" OYOYPYOY?+?+?3+9/+3_^]933333333310!632#"&''7!"3 54!әjaO/11bEn/-{N-Ft JgN@(  OY OYPY?+?+9/+3_^]9933333310632#"&''7!"3 54NjaO/11bEn/+{N-Ft <x@L  PY L\l  QY@H@ H  /    PY ?+3/_^]?3/+++9/_^]+_^]933310!654&#"#632#"&'73267!ke`RE7.oX3"tf)0Ⱥ;39?;g$h@<  %&!PY PY  M ] m   OY PY?+??+9/_^]+?+933333333310"&57##'7!36$3232>54&#"OL1L)ĦȊi^[`ib[^յ9Qg-Wյh^ d@5  /  PY PYOY ?33+3?+9/+33_^]93333333310&#";##?.54632=Kswh]oQATI\0LWlcS_l-nQ -?_&HC?'&+5?3&Hj 4"%+55JL-@R#! ,)).///// !PY &#&RY& HOYPY?2/+??++?+39/_^]3+3_^]9333333333333310"'733267654&#"##737'7!!!>32QO!/,AKw04K8o‹v )2PXefvCLn'-8}[US-SLiomf!]esEW "@  ]399333310'7!#'&+#73y/7h[fDof-^!%?w@R   *PY L\l   PYO_  QYO_o?3/]+?3/_^]q+9/_^]+_^]9333310%#"&54$32#'&#"!!327Q[G4-7?ir'ZΏKW?ĠP/AdVrLLb3&j c%+55%LLM3 2h@8 '& 2,,2 44/4 3')OY))$/PY/$ PY$QY?3/+?+?+9/+33_^]9333333310%254#"&#"#"'7332>>32632#"&'*8Fg6AZB&+ENfL50#,#:GS-d~g\CRZO,?p* 9sޘP!'L B {Ew!{@F  "##0#@#P#PY@HOYOY PY ?+??+39/+3/++_^]9333333333333310632#"&'!#'7!!254#"CRZO,HwLsLK+8Fg {Qg-WpJ$@E  " ##$$$&%$OY RY    PY HOY?++?9/3+_^]3+3?+?993333333333333910#737'7!!!>32!654&#"# v )2PXefif04K8oUS-SLiomf:-F'-8}[;&v %+5f&XC8!&+5UF&\ w *$ %+5Thf@5  !OY RY/  OY??+?3|/_^]+3?3+99333333339310#32673!7#"&546'7!(w}04K8ovSXef f-f+C-8}[x-knmfMP-~gL;g@5-**3 3$: :$<=0(0_Y,,(::_Y!(6!6_Y!?3+33?39/+33/3+39333993310!32$54&#"#632#"'# 4$32#7.#"3267' Y'UR=6C2ӭFƶ3E-SƶR0Y6)b51 <<<+s<15l)N%&C@!   ##'(#   ?3?33993333933333104'73##&5473&5473>>V~=x=a Z43%E-&I[*UM(+<O=<kH(+<O=Q YE2=(k@: "   )*(#%#_Y`Y !!`Y!!!%_Y`Y?++?99//3+33/3++3933333331032654!!#7&+32)?#"#!7'7!dرK8D Z;: _@C8 l ˒5;e55I*\@1$ +,QY''OY OY "PY ?+??+9/+3?+393333310632!"&54>7# #'7!6!3254&#"F,QP:mn nvCg`z~;lMl|Pg,rz~hdWL2@L "''-//#  4 3_Y%`Y" <L    _Y _Y //*_Y?+3/?+3?+39/_^]3+3?3/+333933333310 547!!?'7!!!2#5.#"!!326?3 c Ч  ]>:-A?a6/rDHA=s F45555$I3ۮ+/ZFHD5*/mt+l@:# $,++-(PY( #PY##!!OY!OYQY?+3?+?+9/3+3?3/+3393333310#'&#"!!327#"&547#!'7!3>32G7?ir'Z΍Q^ C+H#nB0?ĠP/Ad*KW?;-f-hl &H#a@0!#%$#! _Y ?33+33333?399333393333333310%!?!?654&'!?3 67& % _=a2ai1 -0 pfB555 |e--:"BN55hDy>!e@3 !#"!RY OY ?33+3333?+99333393333333310%!?!?654'!?367 LHLCF#E hN2_---[?|--"'G/--n9W_4H-3@J)"/*13.--" 5 14.+)`Y3/)) %(#%#_Y%" "-" "_Y  ?333+3333333?+39/33+33?39293333333333310%!?!?654&'!?!!?'7!!3 67 % _=a2ai1 -0 p] Ч  cB^fB555 |e--:"BN555555hDy>m'-@G#)$+-(''./+(%-))##PY##!!OY! 'OY ?333+333333?+9/+3333?399333333333310%!?!?654'!?!!'7!!367 LHLCF#E h@A+JN2_---[?|--"'G/--t-f-^9W_4=$'c@%' #&#% )(  _Y% '@Y _Y ?+3?3?+933+3393333310).#!?!?>77! !?#wf fTre von`5ωAPPE"T@- "!  $ #OY  "PY ?33?+9/33+3393333310!#'.'##?>77! !.dVNNbtD}\mZi` 8 VqL%3W& jgES~-a.fBB6iw3 "=25@"' 5) 24++2-3( ) 763**5@%Y* '`Y-''#&!#!_Y#   _Y ?3?3+333?+39/3+33?+939333333310%!.#!?!?>7!!?'7!!7! ! " ?#wf fTre NG#Fc Ч  ]on`5ihJ5555PPEm(+l@< +*!((!#) ,- +PY  PY#)OYOY?33?+?+9/93+33?+933333310%#'.'##?>7!!'7!!7! !.dVNObtD}\K.Aҙ+J 8 VqL%3H& --jgES~-a#-f-^`BB6iw3aEGP@H79)E2?K?EBP-9RQINNJP54#"#632%3#70=>$McD=+bFu.a%"- ];7ai}Rp1RK/xr5(>B-ѽ,8ժ vWBV(,S=J*3*yj sR )~!!EP@` ' ';# GR1GGQE4PYE9@QY99=$ PY  M ] m   ..KOY.*NOY* PY?3?+3/9/_^]3?+?+9/_^]+9?3/+?+333933310%3#74+732654&#"#7>32#"'&#"32>32#.#"#"54>32326z,8ժxyjuVR+_97&:tJwcLW)6<Jf@4*MQZ8WD!- J3,MOV5QG3N#\m!!SgiJMl wjkeH ZEE+3+'9>%-%XL[=#^@1  $% _Y#_Y _Y?+3?3?9/3+3+333393333310%!?"&''7!'7!>7!! KqBmv :IG;x  xI: ~;)P55s5@55[5CL L@'   OY PY??3+3?+3?3393333310#".''7!33>7!#JU^0r "}#U E.L3mv-n.p-vgL&6S@ + 3+378 Y@Y'//#_Y/'_Y'?+?+9/+33/3+9933331032#"'.#"7>323267654&#""$&54$32/ɦ)5@8tt?Q&7}$ B:su>Q&5"ͨ|ԟ,ZޡI1>K("&M4:J)"'(5҇r=!/H@%%,%,01QY QY"))PY)"PY"?+?+9/+3/+993333103267#".#"7632327654&#""&54632i^q$P60LB?"17 S40KB>#42hclȊȊTթ6 % <4%:#:յյkYL?@   @Y  _Y  ??+39?3/+3399310#'&#"#'7!>32.B5Dq73  KxUL:ca 55-#.@ PY  ??9?3/+3399310#'&#"#'7!>321"-F%Iq VEYMH{7;z-$,oZkY&%#O "&+55&&  &+55gFL <i@52;,::;2="))>,::>07@Y330;_Y&_Y _Y?+?+?3+?3/+333339333333104&#"326"54$32!654&'73#"'73327'u䉫FӚ뀶K@*StwKQD%-8-p@vv&̃u$pQ%,-(OeʛK`RZ=F& :e@6309*8890; ''<*88<.5QY11.9OY$ PY PY ?+?+?3+?3/+3333393333331032>5#""&54632!654&'73#"'73327'_^[[ZZ@*StwKQD%-8-pTӷӷ$pQ%,-(OeʛK`RZh3C@!' 45#`Y @*00_Y-- ?32/+3?32/+39933104$7>32#"&'&7>32>54&'#"&'hN 7##8  6##7 Ȩ3 5󗪍 5 "5 () y '''Դ"#s"%EW 2@@' 34 @PY)//PY,, ?32/+3?+2/993310467>32#"&'.7>32>54'#"&'E~ 6##6 6#"7 WP 5!!6 VV 6##7 WVv ''ү ''ӌ} $% &' hv"X@41LOO19G9+GUU&+YZ?&@Y??(/J6/6_YN33/@Y/ / @YR/C<(<_Y#(?3+3?3+3/9+3/3+39/+93393331023#"'.#"#>7654.54632"&'# 54$32#7&#"3267332$54&#"#>32>]yy]@5rx<`-6Js| z:+%0x8˷Nи3C`caB;f8C3xhvTUnF"#[h#8%0'.3OH"~5#"#7>3223#"'.#"#>7654.54632D~ᢸzڀk|+7D&urY"8 ~ZnZ.9E7+4kH]yy]@5rx<`-6Js| z:+%0͵ߢ^EF] ̳TUnF"#[h#8%0'.3g& PNE&+5&d \rLjL@@!  _Y_Y_Y?+3?+?3/+33993310%!?$54$32#7.#"`G <}.B?`,p55Q }3ۮ+/ ILh@@"  PYQYOY?+3?+?3/+933310%!?.54632#'&#"=P>@.-7=c[^S?--\ !?n W@1         ?9////99339333310''#'77'73uq,c,q, bEEUE#EUEEUEE:Mr /9/310#"&5463!54632#!8*)<<8c:**898*;<)*: *::*)<_fw /29/3102#&#"+5727> J~!O6ov]h]o8Xw#"FnU,(rNJ/10.54632F _j@5*98$>/pNEP1#>0j`]/105654.54632]s~"6'3?PVt&?&3""&,Cbz@ /]23310"#>323"%. ]h}3jgPPg`;%+ )7ESaoh@5Q' JFF#MmC322'654&#"#"&546"&54732632%4632&#"#"&#"'732654&54632pd|x"*"7+3Ad|x"*"7+3AXXk%?$5!"&,MjXk%?$5!"&,M>g;-$-.C;>g;-$-.C]uDIn,F'- (BuDIn,F'/(BXk%?$5!"&,MXk%?$5!"&,Md|x"*"7+3Ad|x"*"7+3AuDIn,F'- (B"uDIn,F'- (Bh>g;-$-.C;>g;-$--C`%+@A  -,))! !&&`Y&_Y   _Y??3+333?39+333+_^]9/3933333310#!?!?'7!7'7'267# '7% ѰdA" Ѩ   MTL@9m^2Z=5b$5{E5555Ky<5ftxGUYfh +q@:""+))**+,-)  QYOY%%RY+OY??+?+3?++_^]9/?9333333310267# '7##7#"&546'7!32673TL@9m^2ZauüSXef fof04K8oftxGUYk;knmfMP-~(-8}[xU=P@)  `Y `Y    `Y?+3?99//3+3+3993333310)?#73733#32%32654!U ?vdر5.ZZW˒Jg H@%  !"OY PY    PY?+?99//3+3+993333310#"&'#73733#632%"3 54ga(((aja\bEp/7@SS?t=!o@< !!  #"!`Y  `Y _Y _Y?+3?++9/9933+39933393310!?'7!2'#'27'7654&+O Ѩ TF`z]jEjFpB555we54&#" 0Byg yuftCx~.c>jdSbCY6?YK58Z//-\:N r0Lx9lOko|N=6 C@#  _Y `Y   _Y?+3?3/++333339333103!!?'7UA;8 Ѩ =SVi555E @@%   / O _  OYPY??3/++_^]3339333103!#'7!7'ږyf-=Y@-   _Y`Y   _Y?+3?99//3+3+3333339933310)?#73'7!#&+!!( hY 2A aX|h5OZ5Z))]@7($ $*+(OYOY( (! !QY! QY ?+?+9//////++933910>54&#"'632'3267#"&54>7'7p 5 >YW+yf 55Ei%[@1 !% %!&'RY!$$"OY$PY$!PY?3/+??3/++9/+393333310#'&+632#"'33254&#"#'7!7 lX]q|/7 ?TWXB4*x/ m}U7f-`=)@N!  (()"'')%%+*'" _Y !(  $)  _Y ?+333?3?3393333+333333393333333933310%##!?'!? '7!'7!'7! dA"xN 7 N |,ބ Y Xo  okP ` E&<$E55]555y55r55B )hRC@K4/> ,,-( $"!!->4DE$#22:PY2 5+//OY 5CC5 -&QY& AAQY?3+3??+?9////3+33?+993333333333310>3 333>32#'.#"327## 47####"'7332654&#"KHFG.쎈_!7?&KMWDkuWPJK.쏈_!7?&JOWDku$NT>2P3p wwd*0Z3=J3p wwdmK8h@8 #%61++1.6% 9:._Y4(`Y44_Y 4%%(( _Y(?+3/?33/++9/+993333310"'732654'&'332654&/?>54#"#632`H&0BNcT%B B-ѽMm19SD !sR )~ Ai[{m8w@D!#61**1-6# : 9.PY L\l 4'PY44QY 4##''PY'?+3/?33/++9/_^]+939333310"'732654&'&'732654+732654&#"#7>32`H&0BN8DLM{lxyjuVR+_97&:tJwcLWMm19SD?R5<8bjSgiJMl wjkeHAi[{`=_@2 _Y _Y??+33?399+33333933333310!!?'7!'7! #eX Ѩ  bw  dA"u5555.559)$;hQ@+    OY OY?3+33?993+3933333310'7!'7!###sWV$QbuüxBg---;r= s@=   "!_Y     _Y??+33?399//9+3333393333993310 !#!?'7!73'7  =SNX Ѩ  b.W w =59)5At5555ve5;c@5  OY OY ?3+33?99//93+93333993310'7!?37'7!###և1W~!W^$Qb+S7z>g-xe---|7p Φ Ч P RL+yf 55m55555YW,E6m@;.(() ! )78.$1$RYRY1,*OY,)OY PY ?3/+?+??+?9/+3+39333333310>32#"'33254&#"!654&#"#'7!>327>Mq|/7 ?TQR>0f04K8nvTWefFKd/ m}T8-F'-8[g-llmf=rL0<o@:/:":"1%1, 7%% =,,>/")3_Y")) _Y _Y :_Y?+3?+?3/+9/9+3393333993310%27#"'#"54$32#'.#"327.546324#"6Gji2QPFhjq䣂)A !f9,#5Euown<_4/%l}<'8%$|".W>xZ&<)k,8f@6- "0+033 '9:0))#PY)6PYPY PY?+?3/+9/+?+393993333310"&54$32#'&#";&54>32327#"'>54&#"w)7AkaavrVLJfzi]D8 IhD9C&!GM+*7E);P_Zfc84*2Ab+gX Ci[{19SD|&! ?d`=M@$  `Y _Y  ??+3?+33/33399333310#7&+#!?#"#!D Z1bA"P 3_@C8.k+5;Jhq/g@3& ,,01& #RY)#OY/OY??+?3?+?3+33399333333933310%##654&#"#654#"#'7!>32>32quüg*-,yd cf[,a cvFMXaGLU` f-;Fy--7T:F#dX9f-cxnmevjfGu)=<FL9M@( OY OY ?+3?3+333939333310'7!!?'7!Nr^$]FI`yQg nhc--A//--a)=a@3   _Y _Y   _Y?+3?39/93+3+3333933333310!!!?!7!'7!'7!o@ @| # ¼  T55lT55s55 L9a@3     OY PY OY?+3?3+3?3+33393933333310%!!?!7!'7!'7!x;`yBcg ngr^$]GTT//mT--c--`%=m@9     _Y   _Y ?3+333?39933+33333933933310#!?!?'7!'7!dA" s K ̓  ?  _$555^@55g55h~'H@$ #$ )($   #!?3?39933339399333107#&5467%'737>54&'73##*GBk|@4(ֿyuü73T - V=-v=F-  ?|r =5b+5Y@YW55N;559hY@+  RY OYOY??+?+9/3+?993333333310%###"&546'7!32673duüUef 4o304K8<-;mfN+-~(-8}[T='s@$ ! !  %%()%_Y$"@Y   '_Y?+3?39///+33+33339933333993310!?#7#"&547'7!367'7 Ѩ Qzy&Z%>  ?WZWnr =5b55;Ң@YW55N; )59$n@7  $$&%#$  QY   OYOY?+?+99//93+3?939933333993310!#7#"&546'7!;73>7vUZaT"$ef 4o304 0T+9d <-u7umfN+-~(-8c5T="\@ !$#  @Y_Y! _Y?3+333?+39/+33993333310)?654&#"!?'7!>32 F nx`r Ч , OfCG5:0`\-x5555?#->NpJKVL$-\@/( #+#./`Y(  _Y  %_Y ?+?+3/9/3+3/3933333310"&'73;6$3 !326?3# 7"!654&2U+B%>XB %`EC@:v*HO 4柂UA:1)B~1$.X@-% "("/0OY% QY +PY ?+?+3/9/3+3/393333310"&'733>323267#"&54?>54&#"2U'B$?9s{kiZB\\=:F` ۙ}q\Y_ I='*NT+(?q9GrVL&/i@6* %"-"%01`Y* !"@"""_Y" '_Y ?+?+3/39/3+3/39333333310"&'73;6$3 !326?3#&57"!654&2U+B%>XB %`EC@:6s6*HO 4柂UA:O 4 B~1'1c@3( %"+"%23OY( "!@QY .PY ?+?+3/39/3+3/3933333310"&'733>323267#.54?>54&#"2U'B$?9s{kiZBGZ6s7=:F` ۙ}q\Y_ I='*=X 8+(?q9Gr=,& N0&+5)R& ]J&+5O=,}@&&', ,**.-,''% " _Y@Y&)"_Y_Y ?3/+?+3?39/99+3+33333939333310632!"'73324&#"!?'7!'7!J(D+zC؃qdM Ѩ  r|  13+/4_kK5555~55EO%h@7 % %&##'% OYQY"PY ?3/+??39/99+3+333939333310632#"'33254&#"#'7!'7!10y/7 ?cee-DaBsWV$Q / Mg---`=c@   @ _Y @ Y _Y?+3?3/+?+33?333993333310)?! #"'7332'7!# nRff\3-1[qQ  ЧdA5z/Y%555b+h5!L@(!! #""PYPYQY!OY??+?+?++3/339333310%##&#"#"'73326>32uü1;Q;''?H]F00#,,Oa(ZyjR-;i 7oޙO!.WAE#=$i@7  ""&% `Y "_Y$_Y_Y ?3/+?+3?3+3339/+3393333310!"'7332!!?'7!!'7#:(D+zC3KcϦ\w\=53+/&55555(EQ@* PYOY PY?3/+??+9/+?93333310#"'33267!#'7!!(y/7 ?cvALsLuF|/Qg-W`#=h@3   `Y_Y _Y??3+333?3+3339/+399333333310#!?!!?'7!!'7#ϦdA"ccϦ\w\=5b+5555555EhX@+ PY OY  OY??+??+9/+?99333333310##!#'7!!ouüELsLuF;Qg-W`="h@  #$ @Y _Y"  _Y?+3??3+3339/+399339333310!#7#"&547'7!327'7 Ѩ ABQ>  ?|r =5b5`Y@YW55N;559hR@!  RYOYOY?+??+9/3+?9933333310%###"&546'7!32673diüUef 4o304K8<--hmfN+-~(-8}[T`=e@2 _Y  _Y ???33+333?333+33393333333310%#!?# !?'7!!%dA" W#罰 8 Ѩ ~V 5+515555bha@1! OY QY OY??+?3?3/+?+333339333333310%####"'7332>'7!3uü'Ip1?SdH06#, #AKm8d-;/a!,m-m O&$ TN&+5=4&D '&+5&$jVN "&+55=3&Dj .&+55n=?(&( RN$&+5?&H *&+5j^LQ/Oj^&QjN 2&+55/O3&jQ 2&+55&j{N 7&+55)R3&jS Q&+55&jN 9&+553&j 8&+55 = P@)  !" `Y_Y ?3/+?3/9/3+3339333310#"'332>54+7#"#!bҗ3C y]i\evYCE7%@;(7>54&#"'632񊢑ZXGE=MRpö.1:{q^SDy{"Ɓe61YQPM1+*H%OpD]J1'^QD?T,jX&jWN 4&+55J!3&jT 0&+55L='j@9 #!('') !"!`Y""&&$_Y&`Y& _Y_Y?3/+?+3?3/++9/3+33393333310#.+!!#"&'73326?!?#73'7!A 9X|h#k!]!/,@K hY  Zƕ n}h5OZ5)L8w@?*''050 85 59:PY2 22QY2$,PY(($ QY ?+3?3/+?+3/9/3+39399339993107!>54&#"'6323!3267#"&'73326?#"&54673fQGSDy{"Ɓ?GwQXGE=1m!]!/,?J{SQT!VJD?T,jjFh*T+TPPM1+*鏔 nvIpRe&L%=)y@@ % &'' +* '%"%_Y&)"_Y `Y ?3/+?+3?39+333339399332999310#"'7332654'!?'7!'7% l5phK+BB*^t-s K ̓  ? =5ftdxgL55^@55g5L~3Y@."  #''1..54#1+! PY?3/+??3933999399393310#"'7332654'#&5467%'737>54&'73֥T9#/9Zv+73*GBk|@4'րIKmy_ZiY5E - V=-v=F-<ۣ%=!@G  #"_Y`Y ! _Y ?3+333?39/993+3+33333939333910!!!?!?!7!'7!'7% wvԔ s K |^  ? =5Z5555UZ55g5~+b@5* &)##'*- ,)PY&   *OY?+??39/993+33399393310)#&5467%!7!'737>54&'733#J73*GBk|@4'۬t5E - V=TG-v=F-3Dcx`/[ 5 Ч ړ7uh5KE55b5yh>G}S=!/d@5&(&"!" +! 01_Y,`Y!! $ $`Y `Y?+?+3?99//++393333993310#"'#"&54>;'7!3267327&547#"S=)ƘaIV[ 5 HBivAn.x`߾N&(yh55_F'UDm^$5U9Y K>t"1`@3//"** #" 23OY""&PY- -RY PY?+?+3?+9/?+9333393310#"&'#"&54$326'7!326?.#"327>t ù eF{^G@D FK^n#*#J5^dXKxddl]-0k-3+QPIk2!K,U@- +$$+'-.'_Y !!!_Y! `Y ?+?+3/99//+99333310%2673#".'./?>54&#"#632BZhA=)οyQvxm5(>B-^l;FmHR ^c) Gr-U@-%-%" ./" PY- - PY)PY?+?+3/99//+99333310#"&'.+732654&#"#7>32326? ùHVxyjuVR+_97&:tJwc4-^n#qwTSgiJMl wjkoF%`K'`@0%%% ()" _Y _Y_Y??+?+3/9/+99333333310%##654&/?>54&#"#632dA"5 ~k5(>B-  P+/>8js R Vk)cB/Zt)a@1))&&&" *+# PY PY)OY??+?+3/9/+99333333310%##7654&+732654&#"#7>32aA*^PxyjuVR+_97&:tJwcLR 6>-BHSgiJMl wjkX=)=*\@!&'',+&&_Y @ Y "`Y?+?3/+?+339/3393333310"&547! #"'7332'7!32673nRff\3-1[qQ  fSg{A=)wBT`z/Y%555^F'HQm߾-N@' ++/"..))PY)"QY PY ?+?+?+9/3/3399333310%326?3# 547&#"#"'73326>32ÔSY## Z1;Q;''?H]F00#,,Oa(ZyjRi ۡoĪǟCM 7oޙO!.WA3s=)b@4""''+*'"_Y `Y  $_Y `Y ?+?+3?399//++3333933333310%32673#"&547!!?'7!!'7!fSg{A=)̣-cϦ\w\ HQm߾wBT555555^FEXS@,    PY PYOY??+99//+??+9333333310!#'7!!3326?3# 546LsLuFi FKSY##Qg-W4-QPoĪǟPrL"F@$ $#_Y _Y _Y ?+?3/+9/+3933310'7!# 54$32#5.#"3267  %)}-A?a!55 |3ۮ+/᬴G!F@$ "#OYPY PY?+?3/+9/+3933310"&54$32#7.#"32?'7!ŬҐL9&>u6wf. C/F &C,-(/=!M@'"#`Y  `Y ?+?9/+33/3933333310%32673#"&547#"#!#7&+wfSg{A=)̣3_@C8.8D Z1HQm߾wGOd;RJ-<i@62,&&'88'=>2,,!/!RY'5/*(OY*' PY ?+?3?+?39/+33/39333333933310%326?3# 547654&#"#654#"#'7!>32>32FKSY##5 *-,yd cf[,a cvFMXaGLU`. QPoĪǟ7O'R-7T:F#dX9f-cxnmevjf24#MR)$)a@8#  *+  PY L\l PY))&QY?+3/?3/+9/_^]+9933310%#"&546?&54>32#'.#";3267Չkmn$0%R'^tUMkjhWGzGzkh3RG$qtbHJTeZMX)0L=#Z@ !!%$!#!_Y#`Y#@ Y `Y?3/+?3/+?++3333933310!"'73327! #"'7332'7 Pf*A T)!nRff\3-1[qQ =5"<.z/Y%55L5)D@" &&+**$ PY$QYPY?2/+?+?+3/33993310"'733267&#"#"'73326>327QO!/,AK1;Q;''?H]F00#,,Oa(ZyjR!Ln 7oޙO!.WA-qL4DLTE=:1GZ+ @   H/+]293310#654&#"#7>?3e !%21 d SCeoL .6/1^V ^^rNu #(@ @ H!e?3+]q223104632#"&74632#"&4632#"&- #--# -. ".." .. ".0 .o -- ".." -- "..".."".0Nq e?10#7'7'7qwVVVVVVVVVVN  @ @H@ Hxe?3]++2104632#"&4632#"&%. "0/# .'0 0/!".m"--" ..".0 0.N &@ @H@ Hxe?3]++2104632#"&4632#"&3-" 00 "-%- #--# -CoDm"--" .. 00 "...n /2103"&547cYR BHj}q !XL e?10'7LP!&@    e?399299//33102654'7#"&'.#"&54632;3+%T_G5L'''3+%T_G5L'''205?!dIc6IF"205?!dIc6IF"oN} e?10654H%bZN @Ik~p#@Pa?]10#'73ϕ) "@ H /3+]29/104632#"&%!727. !/." .m(^ 0/!"...jN}e?210!"(?N/kN}e?]210!"(?N/kVN} @ e?2]22310!"!!"(?jp b(>jp N/kac/kacP+7%@5))/ #/?O/3]2233310"''7&54632!"&54632'74&#"326%4&#"32634fCbqRQonQrqRQo=R; .:&&:8((8):&&:8((8XTR&2QqrPPqnSQqrP7'46;267>32+"3!--^2AaL&NB-T  M!TL1,ZmH <*ESV.I4 w  /3310##?#7!d m-͠kJ/>%10a bhYE_?3+3??391067"&54>32372&#"#"54'!732654.546?'&54>32ŗ15#2+\-2)!7Y-"5 Z_]\#)#' j#rg@o# 0 >;n*0D0%3*:4%;2#D5!}A9~M/SPS/;H?"8CQ0d@'3>&K4%lN!% gY_ gYa?+3?+10)7!654&#!"54>323!2 3TT5Z'9`j- 'eQ)AGbo5'\#J3 32;2-$RN|5 &5T. 9'^>P/Z.+-D%$R(K9$'+?+׼1g`S>lu'b gY _?+3?10"&546323!2#"576?67?+A 'J FK+j )(FS0/2k8 D +(AQODf'>%== 1b gY _?+3?39/10"54>323!2#"57>767>7#"5676?67>32)d, %A *#  !k+ 0=+ 0d *!%fgE3%0!9cf55M7#Fh= 8J65 >b5:-Hu!gY_?+/104&+"&54632;2#"576H$&)6*? HE< 4$  &2/0m &362 2dT) gY _?+3/10"54>32;2#"'&#"#"5476?>{"3 's}*J &(n * %=d-F/  g#Vkt4'EH SXoD:/_gY_?+3?310#"54767>7#"&54>323!2#"547>7>7MH-d B[V)>3!+ %3 E5D '7(L츔TQ  5^Q63H/#-B :CE, e.9W(2gY(gY(_@_o/  9A gYa gY `?+?+9/_^]_]?++10%54&#"'>32!65/4>7"54>32;2#"'&#"^9BTi9Yai+S!.As/ &Nq "I- eX^#Wdeo|i_(F/ _acPa'" gY# _?9+10"&54>32;2#"&567>54E!,  J[=8ko !^["(*5!L. 7H(ffG% ?xC)uq#c gY _?+?10"&546323!2#"&57654&#B.= L?  6  "&32,m *1>0?1" A gY_gYa?+?+10#7!267654&#!"&546323!2?SSf'zRt9.D 'f2C{T430e @@A 0b!gY!_^??+?10"&547>54&'.54>323!2#"&54>7>54.#;+P! 4 DR3U0#/RD;~.%Btzk*1I!37 !!@0 'Fvi7E[dwV1 1,5{mTEYMF,'X''#  A gY_'gYa?+?+310!>7"&54>323!2654.#!`Af\"T A< , %_g-/@6;F\>3'bEA\38E- !*aԓ^3<R{fB82:A: gY:+gY+_ABgYAa?3+?+/+9910%267654&#"+"=767654&'.54>32;2>7>32!7B&#';zeح%)&u $06-( )$S  ZNN&?l +"%/+$D- k;%|^&ފ'd,dgY_?+?10"54767>7654+"&54632;2/,p#84'C5@ !{0.,1 Zd(CyPq*K /8)l %X:#`RA K?)"A gY_gYa?+?+10%!7!25'&5467654+"&54632;2<-R%'$=E!98> 54+"&54632;2!73654'&5467"&54>32;2#'&#"I]983@ )Cp4JR$(/)#/m1o_,02l~#{sG%E #c. gY: _?3+33?910"&54632;2#'&#"#"=>74'.54>32;26}*0J 63@;# 7xdOA,+(4 >:*<<*.5-89+Z6d2*1q $2 Y)Wt\ol' ?oe?,#%O6+/*4Be[B|]=M7@ IMD'L5@*5*gY5_LMgYLa?+?3+3399310%254&'.5467654#"&54>32;2>7"&54632;2#"'&#"!7 Vn9+ P>-+ %4z&'>WcZB5= 5@67654.#"57>7>32FA2A #AF)yh8*#!M87:   '-52/d BY]S@e1)1@-4V&[D-  =(u gY_?+/102#"57654&#!"&546323L?? "&?-< 'm*1D5 %#%2-2m[2"=I=hY. I_Y9gY9a?+3?33+310&54632#'&#"!6767>54&'.54>32!467.5463232#"'&#"7ZK 91_&#SI}A@' $7 )7PYtJ ""(H0 ! <1w<> 1&3f #$"aZÛy91b + gY+_gYa?+3?+3?10"547654&#!#73274&547#"546323!2y #iAJXfi2$T\rv#o? $.aZ&& %= Z0N?fAWXw= WH~i/b !)cbeFm, u&& '&  hm _?102+"54767>3HKk#/ m im! Sh%m* *_?32102+"54>3#2+"54767>3 HKk# 2Jd*HKk#/ m im!LtJ im! SV_P@*   PY OY ?3+3?39/+339933933107!?3!?'!! hפq l t)"---n--jV#&@P&% $ ('!PY!#OY!&PYPY&&  PY% OY OY?+?+3+399//33++?++333933333333910#!?'7!#7&+373#'#32?3!?edCi+?\r|6>>TG?:$l;D@--%-np -Kz."2;d@5*9(*(3030 <=,6 6PY9OY  #RY QY?+3?+?39/99++39339933331074>7654#"'632>32#"&'#"&"32654&3267.M8g|*PEj?v*_s.r4YW[bR10["Zd 6?<(*NYNZЫ+Jh>28%Bnyb6<Z%`@3 ! &' PY %PY OYPY?+?++9/33+3339333339910#)#73'7! 2654+32654&+ZaFhN~~=y5JErqt?MijgJU` P9dPZ-KrG`jco6>>TG?:f-np /`0@ OYOY?+?+2993310'7!!4632#"&G>@-,@@,-@f--,@@,-@@F,@  PY OY?+?3/+993310'7!#"'7332676o9e?$7 3*5 f-z4DD L@(   OY    PY?+3?99//9+39333310)?'7!732?3?Lx;A~NM?dNPN--xPx fX=R5@ OYOY?2+?+333993310"'7332>54&#"#7>32)&; t@jl2=-~?.#8 α( )@ HYHY?++993310%2654.#"%#"$&54632յյi^[`hc[^ȊȊ(0@  QY HY?+/+933104632'53654.#"'.(ʸ&8#ܔ󪊧%=T}wh~N';;.O"t'Q@0!"$ $ ()"! HYHY?3+?3+99333910'#"$&547'5632327%"654.4HjKjrC5b,=7,[v[wkQ]uhO[Z 5^ 4i[\.!/8e@700&3-3- 9:0OY  QY 6PY )PY"PY?+?+?+?+39/99+933993102#"'#"&54>7654&#"'6326"32654&326~㏡J0[jzy ROM85JYE>MP@.#SŶڧCNa[^d ANfT<(*Risgrb~<=N%.^@&-%"("/0+PY &PY @ H%%?23/+3?+9/9+3933399310#"&5467.546732654&'254&#"-!qsWfhňLPƧ cRNFdp;CZb Y#oIYOuik\>jQSLBFtu5@ CTD&@  PY?+2993310>32#654&#"D㊦ hcv؍~յ9*F@=&@   PY ?+299331032673#"&547 i^u㇦@D䶎{յ(:E5@@"  PY OY PY  OY ?+?++9/+993331032654&+!'7!2+8;_k3yѻ3t|\Wf-x^ [@0     PY PYOY OY ?+?+?+9/+9393333310&#";##?.54632=Kswh]oQATI\0LWlcS_l-nQ -+[Z@/  PY OYOY PY ?+?+?+9/+9393333310#"327#"&54>7'733'7^ov[ABIyEL㓔?vȒkW\skI}Yn-lM-gE@#  PY OY ?+3?+33333933310#'&+!?#"#07 \JCM_I70-- f?@  OYQY?+?3+333399333310"&547'7!3267'7!ⱨ _qz] bwQzaq1<--:'|r,--ڧV"rA@     3/3323223393333310%2654&'%57'#"&%'A-8}[f-knmfM-E~04K8ovSXef fof+"&r'3U@+++%1   145"(.  53/33232233993333333310%2654&'%57'#"&%'2#"&5462#"&546M-8}[f-knmfM-Ei*;>'+9:**;<)*::04K8ovSXef fofp8**:9+*88*)<>'*8OZv-T@)" (!$&+&! ./$''""%#  .3/3329/33233933333333310#"&%'32654.'%53254.'%57'evjfG-Fy--7T9F#dV7f-cxnWGLU` f -g*-,zc cf[,~c cvFMXaYZ]M@' PYQY?3+?3/9/3+3333933310#"'732654&+7#"#7!ũ{qqi-TV&7/, n{1`<8ufSb-O1 %a@1 !# #&' PY##PY?+3/?+3/993393333993310"&54%?>54&#"#763232?3$4jqe]iT@B-4eT@B-td#q \[BD1+wa#q1+)?@! %'' *+#PY& ?33/3+3?93393310"&/#"'7332>7&5463232?39ey+6?]WF#/+7MKDm?o#YC7":/#RJN0;FGo;QϯpJx DBoD> (@  OY PY ??3++339310#'&+#'7!7 lXxf-mL7@   OY ?3+333?3339933107!?3!?Ut omw ] FF--n--IQE58Or&j@5 " "' (&OY"  OYOY?+3?3+3339/3+3?3993333933310%!?.5467'73'7!>73i~s1(T- OfymOdn4]'ŹF--|h),B' -->nm',ݚ53D]E@    0 >?3?39/933339933910#?3!?'!!CrKV'{dS  z3V#&s@/%&$ ('#$!$$ !>& />??333?3399//93333333393933333310##?'7!#7&+373#'#32?3!?31\N`"(07$&,&:<='1iGK  `a ]/$V$I@  %&$ $>/>??3?39/393393333102654&+2654&+?'7! #'vaMZ_5Uslieo<P}dJi_\fNa?;nYhRI6 Tn `Nx]/MV )V@ )) $ *+>@  )  >(/?3?339/33333?933333991073'7! 3##'#?2654&+2654&+{ u6dJq }XP>slieo>?33??33993310!#3262#%#?'78azHVgi}d K D3,VL@    > /?333?3339/333933333310'7!#7&+373#'#32?3!?0e[#'08$&+':<<(1h'`a h3vVP@    />?333?3339/3333933333310!73;##733#"#7!(6:$&+&83*("Zi~d3ԕ Ha`:<(_!5@" # 0??2?39/3333993310"&54>32#7&#"326?'7!|㔋(L~k`{n9l"&d)Q-K({$c=tӈ}! "3VQ@     />?2?39/993333333399333310?'7!!'7!!?!i|cBk7z7cBj|ck;;c3 << R M3V +@  />?33?3339310!?'7!/ci|cAkc e'V)@    ?/?32?33993310'7!#"'73327d5^W/M@'2U'TqN3VO@   /   >?333/3?39933339333310 #!?'7!'7] PU5qh~eBj:HVM F ND3V-@   / >?333?3399331032?3!?'7!'iIB'3h~eWg D3VI@    / >?333?33393333393310# !?'733!?rjh~e{fi}doq3} e< I3VJ@ /   >/??3333?3333399333310'7!#!?'73ji:wii}e' ^ D3VU@    / >?223?39333333333399333310?'7!7'7!!?Di}dAideAi}dje(d3 $< E) '_ %@ 0 ??3?39933104&#"32>"&54>323|cZ]ycYat҆{%z{rwvs邴xi' p#.S@'#!!,'/0##* $ ??39/9333333933339910#"&5467.546732654'2654&#"AuiXeWqtDUXH`los{`VapQx YHMwCdZd P>Xt0WE{iijljCIHKK3 V6@   / >??339/9333393310254&+!?'7!2#VXYC /a~eBVP6 mgK3+VN@  />?3333?339/3993333310!?'7!2#'2654+\6ka~e?҈XkxY< e]2 `6fa3EV;@    />?23?333333993310?#"#7!#7&+|nB'(""):v|}3  }} A ' V9@  / ??3?33333399333310'7!#"&547'7!3267\ijTVdAjUr' pl$!rf VK@     ?/?3?333333333393310# #'7!3'73&W'tDaTZcH (2w&t7@    <?>?3?33?339933310#7#"&54>3273.#"327+CeTHXX[HA p' \}5-EO]]jk]hkH ă@MT$r=@  > ?<;?3?33?3?9933331073632#"'#32654#"T\` d].1+WhcBLKAMɬPA >HÕ>y{w'u=@   ; <?>?3?33?3?99333310#7#"5463273 4&#"327>nT]_ d\/1*VicAM$NAMɦPAc>H>An&^u.6U@ /&"$$ 7,8(1144 ? <  <?33?3?39333339333310467654#"'>32632#"'#"&"32>54&3267nnHUBe.,?3?3?33?3333339310?'73#7#"&54>32&#"327'"\CeTHXY[<-4:a;5,GNg0]jk`ghL[P@MTx'Wu3@   < ??33?39/333993310327#"&54>32>54&#"W˨Rf5|8gcWQMV{$#?lQs +<-4pbcgF _B"+n'Mu3@ ! ?  <?33?39/33339931046?4#"'>32#"&%326n˧6[(8{6fdWRMUn|%#?lRs +%/2pbdiF _B"+k'4u+?@%  ,-""<+(??33?339393393310#"54675.54632#'.#"6;#/3267by[G*/cR@ 09E9F' 2B37;76KX@d1-H[uD C7A:E0,7"B'u';@"( )%# ? <?33?339393393104&'#73>54#"#7632#"'7326# )5d5/"!SBdd15xePHZAL'6: C0ZAzH?h+ @)Z`:#!;S.t &9@" ' ($ =< ??33?3?3333399331027'&#"7#"&54>32#"&'73327LGTB!*\1'n+LX[[Lxd6m$ 1ZqTr Ń;?3?323993310'73#4632#"&_\M%&''&=&&&&u3H@   > ;,??33?993339333310'73%'73##Qg81:Y%d]S~3u-T@ (""# #. /((+<&; #>?333??333333993333933310>32#>54#"#654#"#'73>32]-f,39;N=4+s;c=7,t;d\G*h.5:>E@=6]  =?33???3332239339310#"'733267654#"#'73632zB)3, (,G<,i"Bc[FbpzQpBMRQ=M7 sw'u %@ < ??3?333931032654#""&54>32>9Tz6a9rdwTZdwTQVVρka\ka\`'Nu+@   ?<?33?333399310>32#"&'7332>54#"1x7^lYS'c ! &>9f;{U^-4ndkd h&V\<{Nu!@   <?32339310>32#654#"{}dwlzFrNk!/ow'N!@   ??3233931032673#"&57>9Hsl|dwN&)QVjk; .u#C@ $% < ;=?33?39/3?3333933310!?'73632#"'32>54&#" `H> hUIWZ[B&???33?33339331032673#7#"546'73;+f&Cc\Gdnz?C= =G:{t~'kTGC>@    /33232233339333310254&'%57'#"&%'5E ;@ %%(??33333?333?3393333933310#"&546'733267332673#7#".g*3:AC= 3+q ;d>7+r ;d\G.f,o@B?= uTh&u&B@ "$$ '(<@ # ??33333?93393310"/#"'733267&5463232?3Dm1!&Q?1' 2C/ZmNJWJm 7)$*&\$*+ xC );|qSuYI8xc1 Cz >.&B@  '$(=!!  ?-?2?3939?339333102#"'#>"32654'7>54&WhhP7'h~/;!q2^(%;Kj& cv)8(@Bv')?@'$""* +$$ ,??2?33933393993310"&5467&54632#'&#"'2>54'NesWphEJ =4@*DnGR4N,Vcl='ses(^UKRvA12 FDpST/@GpP gKOw.v L@ !"< ?=<?2??333?3393399333102#7&5467>">547GY,@-یq HUx@M7!&Afnvbh ؐ%{n]U19H.fR@"   = ;?3?933333993333999910.'73673#&'#7'W "nB^ds8Ad \ KSq*K] >ԌLx)@  EH?3?32993310#'737#"&54632p^\M%'&&' ''&&L2@    E HF?222??33393102#'"#'73>s/h*@c[F0pLI< IE>9@ E I H?3?33?333329331032673#7#"546'73b;+f&Cc\Gdnz?C= @=G:{t~'kT@-@     E I?3?333933104&'73#'7376r1+rCV&/5NjJ>G"&D@ $  ('G!!  IJ?2?3939?333933102#"'#>"32654'7>54&cWhhP@G E?3?9333933333107337654'73'>7')~/;!q2^(%;dj& cv)8(@BC+/@-%,(( I"F?3?3333399310432#"&'##&/.4&#"32>,dwTZDR  B`}; pEu]?">54GY,@-یq HUx@M7!&Afnbh ؐ%{n]U19H_GJ@   G E?3?393393999933107.'73673#&'#7W "nB^ds8Ad \ KSq*K] >Ԍf.8p@=/''2!!()2 )9:*5,5PY/OY//,(OY$RY QY?+3?+?+??9/9++39333339933103267#"&'#"&546'7!32673632>54&#"ǙkiZB\\[]ef fof04K8o {=:F`Y_ I='*NTu{mfMP-~(-8}[xF_qq9Gr)6W@/0 **' 87&#OY,PY33RY?+3?+?+933933333310"'>32#"&'&#"#>37'7!3267332654&#"PG}X?& +64 vX,)8(*84 t:ged]N;> OR`Ϯ-'"/HsS-/0F|uy0p{N=>+9d@6,"3 "):);(%!!OY!/PY66RYOY?+?+3?+?+9333933333310'!7#"&54$327.#"#>327'7!32673.#"3267q{^G0+64 vX D/#*84 t#J5^dXK9=R--/Hs ]-0F|ukIBL%/[@1'#$- 1 0&#&PY ,)#PY??3/+?3933+333393333310"'#&#"#>32#?>32#'&#"3#32673q0#+64 vX !. (M>#17=F>-%*84 tTo$/Hs1'BriT$0F|u0>J@C<AI+&44# L#K++7E.ERY.# ??A<))'OY)OY?+?3?+933?3+333339933333339333310>32673!#"'#.###>7'7!>32>54&#"%2654#"7iGLU` !M4'1 8|7'7!>32673!.'4&#">IML4\G7vTWef0K#4`B-88_XT.N04K8 8_WU.& IGz;-llmf!OQw-?"'$ C-8[;"'$ E%L/<e@50'6->=,""2PY"99RYOYOY?+3?+?+3?+99333933333310"'!?&#"#>32'7!632#"&'3267332654&#" By/#+64 vXg y.c2#*84 t?>jcbYK589//#/Hs-Ѭ ;a&0F|u0o|N=#)R@)!' + *RY &OY??+9933?3/+333399333310"'#&#"#>32'7!>32#'"32673^:K.&+64 vX3vQU2,+&PG-%*84 tH%/Hs-ytzd$0F|u&B@ $ ( ' #PY??3/+99333339933310"'#&#"#>32>32#'&#"32673;L0#+64 vX+M>#17CF-%*84 tH$/Hsĺr{$0F|u 6[@0$! /5)5!3738525&PY## PY?3/+?3/+99333933333310#"'733254&/&#"#>7&54632#'&#"72673Ċ)-_,6X$+%/H_d*3#l8KO3/4J0F62b1W@,)%"/ &&32(%(PY. #@"% QY ?+3/?39933+33393333310"'327#"&5467&#"#>32#?33#32673T-#IO3xNO[$*"+64 vX/{@%?5$*84 tR!--/$3`V9/Hs-'T)0F|u*e@4  "  (, +!PY'   PY ?3/+3?3/9933+3339992993310"'32?3!7&#"#>32#"#7!32673.'zKL/Hd #+64 vX.(ƕ8j7/-d!*84 tO/-/Hs1f0F|uL *J@& %""+,$$''QYRYPY?+?9/+3+3/9333310"32>54&>32#"&'>32#'&#""8AnK;"dbYHG7'7!"#7!32654/OŃG \8k6/, em]Q̽Dυc5E1ƍ}Jsݳr"+@@d71 .  (++%!",-23354==4"BA5233:07:RY:0.OY0"+(+PY-,&@%(QY @???+3??39+3?+?+39/99333933939333399333310%!654&#"#327#"'#747#?33#'7!73>32f04K8o!-#IO3xNp)Qfc{@%SLv 1d% PXefi--F'-8}[ 3--/$3[[.X--'T+-+iomf;,O@)    OYPY OY?+3?9/3+3+333933310)?#73'7!3#syA=pw=An-pT\--T#M@(   PYQYOY?+?+3/9/3+39333331073'7!3#327#"&5467#>+J%<@0lEGQ T\-^T](--/$3`VVL&/p@<%/. 10OY&PY."PY* *RY OY?+?+3?+9/33+33?+39333333331073'7!6323##"&'!?3267!%4&#"!#t>g yBD7ۺ.c 0Byj>ju(AYK58!T\-94T Z//#0ͮo|N=1f(f@5#"'$  )*OY$ PY QY?+?39/33+33+33339333333333310#"&5467#73'7!!'7!326?!׮vv=qz==wQz=uvq(T\--\--T|r|~*5.5@L&##2,44 ,-  76"&RY3 PY,  OY'  /PY?+?39/93+333+33+33/33393333333299333310#"&57#73>?#"#7!!74&'!#'&+3267!'ָGK)Ћ?0:7:Ba#Db\72>~L(Wȣ2T|5 fi%\s f 5| TᙆILL$1Z@0+ %% 32.".RY"OY'PYPY ?3+?+?+?99+3933333310#"&'73326?#"&''7!>3232654&#"dY2m!]!/,?J{X?,JPG}6:ged]N;>w\Ꮤ nvN-'-GrOR`Y0p{N=>L#1^@2$!! + 23#!OY#'PY..RYOYPY ?3/+?+?+3?+?+39933233310#"&'73326?#7#"&54$326'7.#"3267q"m!]!/,@K{^G@7#J5^dXK9= n}h-0k-kIBUL%&Q@* ( '"PYPYPY ??3/+?3+3?3/+33339333103#?>32#'&#"3##"&'73326?c (M>#17=Fѯk!]!/,@KX1'BriT n}hLP/=x@?;'!44. ..'>? PY/PY//$++7PY+!0$0RY$QY?3/+?+3?+99//+3/+339393333310#"&'7332>7!#"&'73326?#"&54$32267.#"Pm!]!/,)9,c%X9-$Qz'HGj l;L"j@: "!" #$ OYOY"OY PY?3/+?+??+?9+33933393310%#"&'73326?##'7!'7!"m!]!/,@Kڔ>1^$Q- n}hߋH-8--L :@ OYOY PY?3/+?+?+9933310%#"&'73326?#'7!"m!]!/,@K+- n}hH-JLq<p@:&&*''171122>=77!,:,RY:53OY5'2 OYPY?3/+?+?3?+?3+33399333399333310>32#"&'73326?#654&#"#654#"#'7!>32iGLU` f"m!]!/,@Kg*-,yd cf[,a cvFMXaevjfG n}hFy--7T:F#dX9f-cxnIL*V@.! ''+,!$RY$OY*OY PY?3/+?+??+?+393333310%#"&'73326?#654&#"#'7!>32"m!]!/,@Kf04K8nvTWefi- n}hF'-8[g-llmf:L'4p@<( #.65#%%*PY%PY 11RY OY OY?+3?+?+3?3/+?+3339333333107!?'7!632#"&'73326?#"&'32654&#" 0Oyg ykDm!]!/,?J%.c>jcbYK58Z//-Ӯy nvւ r0o|N=EL# N@(  " !RYOY PY ?3/+??+?3/+3333393310#'"#"&'73326?#'7!>32+&PGm!]!/,@KLvQU2zd n}hf-ytL6\@11$ ,)) $781''.PY**'PYPY ?3/+?3/+?3/+99933333310#"&'73326?#"'733254&'.54632#'&#"3m!]!/,?J_)-_<]iebn%/?gRbTuh`,Vݏ nv5>,;\31wP#l8KO6R<6|L!.j@6  .(( ..0# / PY PY  ,,PY,%PY!!?3/+?3/+99//+3/+3333933993310#'&#"!#"&'73326?!#"'733267>3217?F%m!]!/,@M$QO!/,AK'M>roӏ n~~Zn7L#T@,#  $%OY#PY PY?3/+?3+?+39333393310%#"&'73326?!'7!654&'73$m!]!/,@Mq @*S<͏ n~~Tz-$hY%,-(XL~4i@9 )&0/1 & 650OY0#+PY''# 1 OY ??+39?3/+?+339399993333107#&5467%'737>54&'73#"&'73326?#*GBk|@4(t"m!]!/,@K73T - V=-v=F-1*"vlx k=L\"1W@-# 2 3&PY, ,QY OYPY?+3/?+?+3?+?3399333310"&5467#7# 46327332?34&#"32676aXNkqX'3/#=RG]R=oA1L^[>lP-EAmvlxKgx35t>L( 8^@2+&33+988:6PY6/PY/& ( RY(!!PY!?+3/?+3?+?3/+33933333310.#"3267#'&#"32?3#"&547#"&54$32?>32#J5^dXK9=y11@IV3%./#U?v|1{^G&͓N>EkIB{vn8m|a𱹙-(?L)3[@0* !-!4(5*OY** 0PY QY ))&PY?+3/?+3/?+9/+339333310#"&5467#"&54632326732?>54&#"#=CaX){kiZB4X'3Q=:F`^[?X!q\Y_ I='*Glxq9Gr)LAu@@/ !66( B=??C$,$,OY $$ $$PY552QY>>;PY?+3/?+3/?3/+9/_^]+9339333310"&5467#"&546?.54>32#'.#">;#"'326732?3aX%vwPFjkn$0%R'\v1. 8S_hWGzG. X'3/#=L^[@EwnmX@O|F$qn^2K` sRMX)0.P&lxL?|@G ";= /))/+="A7@,OY L\l 2&2 QY2""&&PY&<<9PY?+3/?+3/?3/+9/_^]+9339333310"&546?32654&'+732>54&#"#7>32#"'32?3maX*{l42I  !IUVR+_97&:tJN\rk X'3/#=L^[@<8bj=Y ` qLJMl wjHiH0J&lx.L+-7e@51." (%%"8,9 ..OY$ QY 4PY --*PY?+3/?+?+39/3+333933333310#"&547##"&546$?4&#"'>32332?32>+#=CaX k+۱{kiZB\\agX'3=:F`^[,>fq\Y_ I='*NT!232#"'32?3aXP7?i_c΍Q^_f X'3/#=L^[?ʮ?d*KWOlx+L!+R@)%%++-,,)PY)PY "PY ?+?+3/?3/+3/3333993310#'&#"#"'32?3#"&54633267>3217?F|$ * X'3/#=CaX@/,AKu'M>roF?lx^[AfnfLi,_@1 !!""-+.!OY RY #OY ,,)PY?+3/?+?+3?+?339933333310#"&5467#7#"&546'7!3267332?i#=CaXSXef fof04K8ovX'3^[AknmfMP-~(-8}[xvlxL/i@7$+- -10"" QY"PY,,)PY?+3/?3/+3?3/+9/33933333310"&546?32654&+7#"#7!#"'32?3EaX*{qqi-TV&7/, n{rk X'3/#=L^[@<8ufSb-O1 `0J&lx$s:@  > ?<;??33?3?9933331073632#"'#32654#"T]` d].2*Xhc%B("LAMʭPA >H– @&u)@   <??33?33399310#"&54>32#'&#"327V-y:^lYTSW! &>9g:{U^*7ndlch&WZ<vu*I@ ""+ )),  &<??33?339/93339393104#"326'&#"632#"'#67&54>32,f^JaFJ2 (=9g:RoID}fs6&,,YT&b"96T/&h&WZ B>3D[C?*V@+7lc #(N@& )*-@ ,"??3?9/993?3933310#"&54>32&'?&'77"32>54&ŧdxQ\=6? 8?lC 8@Qu@94]7?zfZYwIg9O-/3]8E3~OUNQQUv&Eu'?@#( ) &$!?<?33?339/3933933104'+732>54#"#7632#"'732=;R 2T(7e4/#!SBde15xfPJXN9 B0[AzH?i+ @)Z`:$",i<@ ; -=??33?33333933310##?>32#'&#"3#cafoa0# !*'}~,(~ vE LS^2m)fI@  .;?33?339/33339333331073'7!3##"'7332? zJe5^Jd d/M@'2R]3 Z3%Tr(u&G@  '(;< "" ?.?2/2?33?3?3993323310"'73326?#"54632734&#"327>/LQ!/8NT T]` dd1+WhcBL%(ddsDMʦPA~>HÕ>D,fA@  ;?=?3?33?333933333310#7#"546'73326736G0dpy@C> ;-i"BdV l~#qT?3?39/333?33933310###737'73#"&54632 l&^-l l&M-R&&&&e22''''&f)@  ;??33?3933310327#"&546'739#( BE-.DMC 4=0 ~02f +@  ;>?33?3339310#?'733BITCG\2fJ@      ;>?33?9/3333339333310#?#737'733#pH'` `%CH$^ ^'B222(`'I@ "  ) (%0 ;.?3?9333?33339333103##"&546;'733267#"#"&54632*S T`F58QF6hS"0 7*-&''&2LO1&4BG2;%'''',+@ ,=?22?33933310"&547'7332?3MBPN 40,IP"rA"QBx ,2@ ,> =?33??39933310#"'7332>7#'73 }#6 #NMrqB?x+28f +@   ;>?33?3333931032?3!'7!NC8.&'\H[dt ,u3`@ ) "4/ 2//5)##,&<!;>=?22?3??33333333393399333310"'733267654#"#654#"#'73>32>324, )- G 4+r;d=6,u;d\G+h.5:-f,3:@+,qBRNUE@=!I,f*U@ &$ + ,!$= ;&)??33332?333?33933333933310#"&546'733267332673#7#"(f23:AC> 3)r <;??33?3?33333993333310'73632#654#"#"'733267Gdoz?N=<.i!F+4, )- =t.][ "=?22???3333993333310"&547654#"#'7363232?3BP-<.i!Bc\GdozL 40,IP4L;  ;??22?3333??3393333310"'73327'73'73#j @5D=HI\:#U&P 9~X}ʞ&u /@  <??2?39/333393310"&54>32'3267!%4#"!dwR\ew?9EqGzAk;&k`]mQVh\t^, &a@&$ !!'( $#   ,=?23?99//33333333393393333310?.546?'7!%4'>b%Zl)^$c*]kLY$^eWNngWRl,e}g]`Ӗ ,?u3I@$".( ."43351<=&"??33?33?333393333310#'&#"#"'32?3#"&546733254&'.54632) '32R )(viO2. (- rra.&D LTdoqBNR} ,'I@ " (##)%% ";? =?33?33?333393333310327#"'7332>7#"&546#?33#%'4 +2. #32@IOR& : ?qBCm=0%m27$f"Z@   # $?@ ! > ;?33?39/33333?3339333333310737'733733##7#"547326?# ?$C-,d,B B'GdozM<-h"922t~=J8N& f(a@)"  && )* " # ;??2?3393333333393333993310"&546?#"#7332654&'73#'&+pyn &E*#!#'Ogc5=! -A%NX&bZc = _d1K= `J{&*f;@  ;??2?33333399333310"546'73327'73>DJ7p;GI;& bdNff&u!>@  "#<; ??2??333933339310"&547'7332>54&#"#7632]ES;CET XP80"((0Z&8<%%Yv7O%VgE; I{ l2r9@      < >?33?33993393310#&5473#r1,qDW'4PAx2Tf=@   ; >?223?333339333107#"#7!32?3xRYS!ovI-.+2QXx,f!L@  "# ;>=?22?333?333339333310"&547!7#"#7!32?332?3$BO RYS!ovI-.333,IP MQX<'QBx xsf#X@!!!  $% ;>?3333?3339/3393333910#67#7#"#7!3632#7"32654&A, RYS!o1qq-5]YHMVd7>2%17Q2&7@o#<(fB@  ;.?22?39/33333933310"'732654&+7#"#7!~K@jl~NK-S!(P.ziWcQ& 3@  ?-?2?39/3393323102#"&546"!654&3267_aTh\XR_BT&)QFa#˗80zDP[bzT_5  /3299//10#"&54632#"&546327352%%44%%2 2%%55%%2g%55%%44%55%%44>%!_+  /3299//10"&54632"&54632%73%22%%44%22%%55mz 5%%44%%55%%44%%5!A%yE8)/99//10&54>54'&547654#"'632&% .- *JE:  "  +_w@    /3]9/310#"&547332676;hk~Be3QVHsEEt] S+)eW< )E/@ //3]10!5!730.p/@ //]310!'53!0./@ //]210#'!5!.xФːp/@ //]210!#57!x.[/ @//33]2310#''53%..vvvv/ @ //33]2210%#5773..vvvv2E@   ?3/233102#'"#'736 WV&d=KU%ExWn/10#'573㓓s'zzDE@   /3/32/310#'5373%3#57'pz''Zezz'EH&$=E&D&%DN)&+5L&E=&%uL&E=&%*&ErUi&&'z]v)N8&+5?U&F&z#v&'N&+5>&GM=''p%]>'G@ 000?0qqqq=&'>&GC9=&'>9&G D=&'v8D&G!&(  &+55?q&H&uC"&+5!&(  &+55?q&H&uv"&+5D=&(0D_&H~=&((~_&HU&KN0&+5?Uw&p6&+5&)^N&+5L)&It&@%%%%%%o%_%@%]]]]]]qrrqD&*N%&+5L&J0&+5#&+N&+5J&KHN &+5#=&+J&K#]&+j* +&+55J&KjN ,&+55U#=/@E)), ,&&  110(`Y _Y,,)&!_Y_Y$?3++33333?3+3339/+3_^]399339333310#"'732654&'7#?'7!!'7!!?!#H=01=LDA8Ϧ\w\Ϧ ccQVfqK79,;~55555b55557RU0e@6,,- "%%21"OY"((RYOY--PY?+33?+?+3?+393333333310#"'732654&'7#'7!>32!654&#"#UH=01=LDA8#v X"PXef gf04K8o+QVfqK79,;~H-iomfH-F'-8}[7R[#=&+J[&K~=&,>~L&L&, 4' '&+555mr&&jv7  &+55&.vN&+5;"&Nv&+5=&.;&N=&.0;&N/=&/B+ &OVD&/'B1N+&O'=&/ &OqD=&/?^D &O&0vNN&+5Jq&Pv4&+5&0 N&+5JqL&P2&+5=&0Jq&P&1N&+5IL&Q&+5=&1I&Q=&1I&Q?D=&1]FD&Qg!&2  -&+55=&R'vPBg!&2  -&+555=N&R'j(0@H&888]]55++qq5g!&2  !&+55=v&R'C!H&++5g!&2  !&+55=v&R'v !H&++5&3v_O&+5L&Sv*&+5&3DN&+5LL&S(&+5&5NN &+5S#L&UA&+5=&5#&UD&5'=N4&U'=&5#&U&6N1&+5L&VE)&+5L&6&Vj: &6 P 3&+55&V +&+55 &6  4&+55U&V  ,&+55&6'NL&V'jE&7'N&+5Zb&W=&7+Zb&WF=&7ub&WqrD=&7Db&W6=&8f&X~6=&80~&XD6=&8@D&X6!&8  ,&+55f&X'vK6!&8  ,&+555f&X'j$@###@ H#H+5+qq55k&9M&+5e&Y&+5k=&9p&YE&:CN&%+5+51G&ZC 5%+5E&:vN@ &%+5+51G&Zv %+5E&:j?N@ &;'%+55+551G3&ZjJ p+%+55E&:`N&+51GL&Z}&+5E=&:a1G&Z%&;nN&+5L&[3]%&;j^N +&+553&[jx?]u)&<FN&+5YFL&\&=%N&+5*&],&+5=&=0&]w=&=&]J&KBZ&Wj1G&ZX &+55YF&\n=&D)&+5L'&A&+5QQ*W@/ (""(% ,+% `Y `Y_Y`Y?2+?+?+9/+93933310"&'732654𑯎&#"!?>$32,W1sr! 귘 E$xyZdt5ܬ }H&$`=&D&$ N#&+5=f&D /&+57&$ N !&+55=x&D  -&+55&$ N !&+55=&D  -&+55&$ N .&+55=&D  :&+55&$ ' &+55=&D 0 '&+55&$'`8N&+5=&D'&$ N &+55=&D # %&+55&$ N &+55=&D # %&+55&$ N &+55=&D # &+55 &$ 0 )&+55=&D # 5&+55&$'CN`&+5=Y&D&}=&(?_&H&( N,&+5?_&H 2&+5&(;N&+5?e&H"&+5&( N *&+55?z&H ! 0&+55&( N *&+55?&H ! 0&+55&( N 7&+55?7&H ! =&+55>&( N $&+55?&H  *&+55&('N"&+5?&H'&, N&+5m:f& &+5=&,W>L&LgL&2=&Rg&2 :N.&+5=&R ,&+5g&2 .N ,&+55=&R 3 *&+55g&2 /N ,&+55=&R 3 *&+55g&2 .N 9&+55=I&R 3 7&+55g&2 ' &&+55=&R ) $&+55g&2'N/&+5=&R'gv&bvN5&+5=&cvgv&bCoN5&+5=&cCgv&b YN?&+5=&c gv&bN0&+5=e&cgv&b=&c6=&8f&X 6&8 8N-&+5f&X ,&+5&qvN3&+5f&rv&qCsN3&+5f&rCV&q 8N=&+5f&r &qN.&+5fe&r&qf&r u)&<CN@ &%+5+5UF&\C }!$ %+5u)=&<CUF&\u)&< N%&+5UF&\ 0&+5u)&<JN&+5UFe&\ &+5=U&c3&+5=U&c;&+5=U&c 3&+55=U&cs ;&+55=U&c 0&+55=U&cs ;&+55=U&c 3&+55=U&c S&+55I&$2?5I&$̟?5N\&$d ?55N\&$d ?55\&$ !?55\&$ ?55=&$ ?55=&$ .?55,%&g4&+5,%&g<&+5,<&g7 4&+55,<&g <&+55,&g_ 1&+55,&g7 <&+55?'(?5;?'(/?5R'(/ ?55'R'( ?55R'(/ *?55'R'( ?55IK&i'&+5IK&i/&+5IK&i '&+55IK&i_ /&+55IK&i $&+55IK&iv /&+55IK&i '&+55IK&ix G&+55>'+?5;>'+/?5R'+/ ?55'R'+ ?55R'+/ *?55'R'+ ?55F='+x ?55F='+P 8?55y&k&+5y&k #&+5/a&k\ &+55Ta&k4 #&+55f&k &+55y&kk #&+55x'&k &+55y(&k ;&+55>', ?5;>',/?5R',/  ?55'R', ?55R',/ ?55'R', ?55E=',w  ?55D=',N '?55=&R"&+5=&R*&+5=&R~ "&+55=&R: *&+55=&R &+55=&RX *&+55s_L'2?5_L'2̉!?5&R'2S ?55JR'2* !?55R'2,* ,?55"R'2, !?55[n&wd!&+5[n&w)&+5[n&w< !&+55[n&w )&+55[&ws &+55[&w, )&+55[&ws !&+55[&w< A&+55>'<?5PR'<X0 ?55OR'<X/ ?55I='<XS 0?55DL&{h6&+5DL&{>&+5DL&{D 6&+55DL&{ >&+55DL&{ 3&+55DL&{6 >&+55DL&{x 6&+55DL&{P V&+55GL'[*+?5GL'[̢.?5>sR'[k +?55csR'[C .?55R'[,+ 9?55"R'[, .?55A='[,s +?55B='[,L F?55=U&c2&+5=U&c$2&+5,%&g3&+5,9&g3&+5IK&i&&+5IK&i7&&+5y&k&+5yx&k>&+5=&R!&+5=&R$!&+5[n&wi &+5[n&w &+5DL&{5&+5DL&{5&+5=EU&c'4=EU&c'4=EU&c'4=EU&c&^4=EU&c'4=EU&c&K4=EU&c'4=EU&c&y4EI&$'4,2$?5EI&$'4,̟'?5EN\&$d'4 $?55EN\&$d'4 '?55E\&$'4, 2?55E\&$'4, '?55E=&$'4, $?55E=&$'4, ??55/E&i'4/E&i'4/E&i'4/E&i&_4/E&i'4/E&i&v4/E&i'4/E&i&x4E>'+'4|?5;E>'+'/4|?5ER'+'/4 ?55'ER'+'4 ?55ER'+'/4 *?55'ER'+'4 ?553E='+'e4 ?552E='+'<4 7?55DEL&{'h4DEL&{'4DEL&{'C4DEL&{'4DEL&{'4DEL&{'64DEL&{'w4DEL&{'P4EGL'['4v*<?5EGL'['4v̢??5>EsR'['4k <?55cEsR'['4C ??55ER'[,'4+ J?55ER'[,'4+ J?55AE='[,'4s <?55BE='[,'4L W?55=Uw&c-&+5=U&c0&+5=EU&c'4=EU&c4=EU&c'$4=Ue&c-&+5=EUe&c'4&$;N&+5D&$IN&+5H&$[?5H&$˂?5EH&$4b3m$@?_/]]91027654.546.32326738**:;)*88*)<>'*80I?;!+64 vX0J?; *84 t*;>'+9:**;<)*::+5+/Hs+5+0F|u/E&i'4/E&i4/E&i'J4IKe&i!&+5/Ee&i'4>'(,h?5W>'(,_?5O>'+,h?5UO>'+,]?5E#=&+4!)@?_/]32391027654.54673)6u !Bx:3bs-?)6,3 %!!8)@ ?_/]3239107654.5463273v !B0)6 x#`u-?)6,3:!$%!}(3@)&&*%"?_/]222/33391027654.546".#"#>3232673)6u !B0I?;!+64 vX0J?; *84 t:3bs-?)6,3+5+/Hs+5+0F|uyw&k&+5N&k&+5b&k\ 2&+555b&k\ 2&+555@e&k&+5r(;&kͼ $&+555S&,2N &+5TD&,/N&+5&=',,f?5V&>',,^?5 !-)@ ?_/]3239104632.73 U;&/C)h ^]ЖMa%!>1"?W_ %! !a)@ ?_/]3239104632.73 U;&/C)h ^]yMa%!>1"?W_!$%!(3@% )*  &&?&_&&&/]222/333910".#"#>32326734632.0I?;!+64 vX0J?; *84 tU;&/C)h ^]+5+/Hs+5+0F|uMa%!>1"?W[w&w^&+5[&w_&+5[n&w 8&+555[n&w 8&+555L&s &+5L&s(&+5[e&w&+5[;&w *&+555u)&<JN&+5u)D&<IN&+5='<r?5K='<S?5;w>'3/?5^I 0@  /]3333339310#"&54632#"&5463273I2&%55%&2p3%&55&$4v&56%'34&%65&&43?%!^I 0@  /]3333339310#"&54632#"&5463273I2&%55%&2p3%&55&$4h&56%'34&%65&&43!C%>^@/]]991073Ԗ^ %!DEL&{'j4DEL&{4DEL&{'4DLe&{0&+5DELe&{'4L'2,!?5L&2!?5L'[,.?5L&[.?5,EL&[4^:@/]]991073h^!$% ! @ ?_/]9104632. U;&/C)h ^]Ma%!>1"?W*//3310#*T 0@    //39/9333333310#'7'77'*T7777Y7887 2@   //99//3323333310'7##!'77RJ77}m}8L( 0@     //99//3322333310##'7!(R77J}78}@ Y ?+3310!5ff'@ Y ?+3310!5'ff@ Y ?+3310!5ff^'BB.DiR#@ [Y?++993910467#"&.'/'D5=H탷+M;m+*69Z1DlR#@ Y[?++99105654.54632l'/'D5=H+M;m+*69Z#@ Y[?++933910%5654.54632㦕'/'D5=H*+M;m+*69Z>DaR#@   Y Y?++9333102&546-7[0+kR1)Y$*"W3MKm,DR!?@"# #[Y?3+3+33399933910467#"&%467#"&ɦ'/'D5=Hc'/'D5=H탷+M;m+*69ZO+M;m+*69Z1D R!?@ "#Y[?3+3+399339239105654.546325654.54632l'/'D5=H'/'D5=H+M;m+*69ZO+M;m+*69ZS+!;@  "#Y[?3+3+39933933910%5654.546325654.54632'/'D5=H'/'D5=H*+M;m+*69ZO+M;m+*69Z>DR!@ "# ?229102.546!2.546-7[0+|lk-7[0+|lkR0*Y$*"W3M(Zm0*Y$*"W3M(Zm$ S@*      Y [ ??+3+39933333333310 #773%%.k[Xxh /+a+/%@5   Y[ @   Y [?+3+39?+3+3999333339333332333333107'773%%%%#7j'[Xxh'o,_gtZ/+a+//+`+/o  /910#"&54632ofeeffffD #:@ %$![[ [?+?+?+93239310%#"&54632#"&54632#"&546326E44EF33FE44EF33FE44EF33F\1HH13FF31HH13FF31HH13FF@ //333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332332310###!!!TuO .@    /3/9/3333333310!!5!###uTON;R +9FT/@3! ,N324&#"32>#3"54>324&#"32>"54>324&#"32>xV|1[x18GS05??M3eppHV|1[x18GS05??M3V|1[x18GS05??M3zjT}=IF^VJKafzjT}=IF^VJKazzjT}=IF^VJKa\=@ ?3933103#ŬJ=\h=/@ ?2233339333103#3#ŬJŬJ=\="#oJXT-@[[?++339992103#7== TudBRJ<T-@[[?++339939107#3=B=$ J~B==&T@ Y/+3310!5!"P=??3310!#3fd=t5k #//@$* *01 '-!?99333310%#"&54632#"&54632#"&54632#"&54632fE44EF33FE44EF33FEE44EF33FGE44EF33F\1HH13FFc1HH13FFJ1HH13FF?1HH13FF:@      /33/9/33333333333103#5!#3###TOON 0@   /3/9/3333333310!!!##:QTN//333210#!*T&n@ //9/3322310##*TG 4@    //399//33332332310#'77'*TT~~~ݵqqp .@    /3/9/33333333103#5!3###TON= \@2     Y  /  @H  ??39/+]33+339933339939910#7!733#! k`ya&g% y=P@*YYY`  ?3/]+?+9/+3393333102#"'733254#"#!!76Pjf9OΝ95HF(7j^p֏p ~=5@  Y_o?3/]+9?3393310#7!#!8($ aWB6 G&g@;" %  '!( Y , #YY?+?+9/_^]+99339333_^]10!"547.546322654&#"2654#"VK7?*7[S?>JQhVzT=6G7z~gn;>][ggNZh@6    Y Y Y  @ H /+]+3/+?+33/9999333333399104#"#'73632#6*IMBYFbky;O= )r-tx/-]D?7@    FIH?3?33?333393310#7#"&54>3273.#"327DeUHXY[HA p(=c:5-AT^kk^gjH [S@MT?3@ !  F  I?33?39/3333993103267#"&54>32>54&#"ϥ6[(/:gcWRMVu%#?lTq ,%*7pbdgF^E"+? %@ F I?3?3339310732654#""&54>32\?9TzU|rdwR\ewQVk`]mL#N@   %$  EH?33?39339333999910#&54?/737654&'73#'#o Rg@WKE j RsFef&MGC  $Nx b&'?3@ !  I  F?33?39/33399331046?4#"'>32#"&%326 ˧6[(8{6fdWRMUn|%#?lFRs +%/2pbdiF _B"+x3~@C"**3 (##%-//% 345*313_Y)")_Y'$"!_Y"".1 _Y?+3/?399//3+3333+3+3933333333310#"&54$32#5&#";'7!#7&+373#'#32?3!?3ܒ&=Zu{m}Ay+?\r<.>6>>TG?:϶$8󝌣u-np -p{g)06@U 5 1 --15,)2'4$42,**78%",24-"_Y$') ""15--_Y ?23/+9?3/9+92399339333339333310#7&4$;7373#5&'326?3#"'#7&' &Pq}@PBsGPL-A'3:CrDHA=sqKLAPI6-?F'3Q.܏%|} ۮ}D5*/ Ŭo$$ riL.q@" &&)++/ 0""@Y_Y!_Y &&_Y++?2/+3?3/+9/33++339333339310 54$32#5.#"'7!632#'>?3}-A?a~~nv#,+&C?DpEHA=s |3ۮ+/(r- zZwB5*/A=@z !   ! sY tY?Oo?O @$'HtYsY  sY?+3?+3/+99//+_^]q]3/]+3/_^]3+33933939939910!!!?#73'7!#7&+!73#'(' ' 9Blqam;=H=dR55Rn5۠dL)@U#&&")  *+&sY#" sY   / _ o    sYp ))vY?+9?3/_^]+99//_^]^]3+33+33933333310%!?67#73&'#73&54632#'.#"!!3#{S슓-A e2__u@|R.DR_X+ʌRrRLGJq3@!)**( "30045"%@Y ((-)% _Y 3_Y?+???+?39933+3399333339333993310%!654&#"#7#654#"#'7!>323632q g*-"b,ccPt8[,a cvFMV`PKFU` f--Fy--79.­G}C, dX9f-cxig0jfG=%)-03@Z- (/.,.'*32&& $2, $"5"4$"$_Y3_Y*&-)_Y.  "1  _Y0 ?33+33?3?99//333+333333+333+333993333333333393910737#73'7!!'7!3#3##!!?7!'#37#%37#=$G -F  G$WagI 8 IxjR$^Ɖ[RR5"55qRRa55RRWg=HY@IJJPOV @2,F7F2# O M[MZ,F2@5 sY55=sY8 885ItYO_ @H55RMRPsYRtYRJOMOsYM )sY$$ tY?+3/?3/+?+3?++99//+_^]r+3/_^]+3/33/+393933333333339910 4&+"547#?33#327!"&'7332654&'.54632#'.#"!?'7!2!pJ]d? IB+5#>!%-N5IKLSOQ\#/E+8F?dRQO Г he&#'Je,W3$n(C=+>V>jrm:/ 1+#Z>u"B555 =&5(V, E='+/369@Y/9 0-1(5*!&&4(-7 :$$;&!!_Y96 _Y0,(3/+_Y'  #477 ?333?399//]333+33333333+3333+3333393333333310#!!###!7!'#73'7!!3!'7!37!37!3'#7#7#^-?VAO0LhNg_RRRR55q55q79&J=@ 6 6BB60A b6'hY6_hYa?+?+?9/9/310)"&547>323!2>7>32"#"&57!2#"574&#X78 ZA T$4JX: F B=O\? J .,Z X#*0<;!#$ TCyg0J"t~-]6B #/%- : Q!/}@B)/ 10 PY   %PY QY,RYOY OY ?+?+?++?+9/99/3+33339333333107!675!7!7'7!3#!7#"&54$32.#"3267(D(ttq{^0#J5^dXK9=ffH_T-T--kIBPL.@~ *,-&&/00()(sY)-.-sY.)_))O))))))../...../._.o..... ).).##sY# sY?3/]]+?3/+99//_^]qr]qr3+33+33393939931032#7.#"!!!!326?3#"&57#7367#7N.Jc)D&m<<^ dqR)5C5pi j= +/QNVRe<)?8RYKQ=#t@? ! !%$!!_Y _Y#_Y ??+3?39/33+33+3333393339310!!!#!?#73'7!7'7 >IO qCX `c  bw =59eR5p755 R,55+5=#|@D!  $%  `Y   !_Y?+3?933333333+33/33393333103???#"#!#7&+77 GR3_@C8.8D Z1CV 5dRddRe;cRddRd5)i:FV_@IM#W#WT\\G'3-A T7;7 -'*`aG3-*'>`YY W#M3'0#M   0^^P_YDD_Y?+3??+?3/99//9999333+333933333333993310#"'#>7>32".'#"&546327756%7674&#"32632654&#"32lV8&2 q$~4F`n?&LX]eP&V =X60&M0JP|UHL\XGI],I>2E39Suzg@I+=fo6M=9&ĕQ82>FKI>PPe/:S%MRCiaqt^atx Cp-@> &&+UJL%0t@>, %/# &21 _Y%//  )`Y ?2??+9/99333?3/+3339333333310 #&54>32#"'7332654'4&#"\D_,6X_`k,>צN>$11X]KF;6U]#8_ueh]Rن{>IOHl =!(-2@e- &0/+1!$! 43- `Y,@ H_Y&%_Y0!P-`- --/`Y_Y _Y?+3?++9///_^]]33+3333++33+3393333333310#3#+!?#737#737'7!25'!!6 7!#!& Q DR7O |  | T1>R;?R|B55RR5}q7Ѧ{qd (|@B %$ $ !!)*% %_Y_Y  @ $$_Y ?3+3?33/9/+3+39333933333310#7&54$?3#7&'>7'7!RaR3CyR8?  Kcբ q 8bC1$a66\d 4H#&@V#&$%$% "    ('_Y_Y # _Y$ 0@&?3?399//]33+3333+33+33333933333933310737!7!3!!3#!?!!?7!'!7!#W!7rO H} % B pğ+3NRRCRR55n55nRR8L6@b!$!$6 4 ,.!$''44."87_Y!$!_Y6$ '#1$$$$ -- -11*_Y1 _Y?+3/?+3_^]99//]993+33+3339393339910#!!326?3#"&547#73>7!7!>54&#"#6328[k>0jzY0CA7Zi%Pt2MReyt?A1ŢDCR@@#RRitG0!&qTR=KR0{[R]J+[rdi%r@; "!! &'" "_Y @ !!_Y?3/3+3?33/+3399333933333310#7&54$?3#5&'>?3RcR-AzdDHA=hm]զs 0ۮTDB3&/ 'a b]5R8@3$* *$9:y:h:I:Y:::):: :::::::::}:I:8:):::i::::::::|:k: :::::::::{:\:l:6::::::::?BHO:_:&::9::::::k:{:=:M:]:/::@k&*H::y:K:[:k:?:+::::::::y:;:[:k:-:: :  Y [Y885!5Y(![(/Y0,@,,,((??3/3/]+++3/?+++_^]]]]]]]]qqqqqqqq+rrrrrrrr^]]]+]]]]q_qqqqqqqqqrrrrrrrrr^]]]]]]]]]]]]]qqqqqqq933333310#3 47! 4&#"32>#"&54>32#'&#"3267>no AG ax?INb8:FMh;*=Fxohof%- *HBtB.r5f.Bo~vQUjULRk4@t~u${,cf&#*KS(l@8 '$# *)sY$sY$$  tY    sY?+?3/_^]+9/3+33/+99333333333331023273#"&5467767>"654V_+pFE1|ku"Qz n]\6DMShfX+"՘rp0I LgyGF:=#0@C    '!..' 21$_Y+_Y@ H++ _Y  _Y@ Yp ?33]3/++3?33+3399//+++39333333333333310%!!'7!#!?'7! "32654&"&54>32'  Wǰ 8 Ѩ XNo;5Po;e}U_e}ff55555QX~UWna]nvR09b@66!!&1--&:;!&$&Y6 Y5')'Y$6))6$  Y Y?+?+9///+3++3933333104$32#"$732$54$#"!57'5!2#74&+326v=@F ⧧r`hJVs?Cj[Aü@ߥ "++)sjsxYIJ~=,@!!&   )"++.$''&&-.% Y! ! !, +&Y)Ii" ...V.).. .i.....i.F.&.......v.Y.D.6.$..........{.k.].K.9.).. .9........{.V.@GF."..........._.O.?......`.P./.]]]]]]qqqqqqq_qqqqqqrr_rrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrr^]]]]]]q?33^]]222+333339_^]]+333993333339333333333931057#"#5!#'&+!#!57'5!3!572)),mhhffl+ }} V+++)G)P++`L)r@>'!$## +*$_Y_YaY  p  #?33/]3+3?+9/3+39933993333332210"!3;'&5! 32?3!>54&ܸB9PH LCCL HP9BJe!!eWX|H`@6 !! sY -]m}   sY sY?+/+9/_^]+9/_^]99333310%#"&54632!3267.#">`ۘ5QRa3Vu|8DhK5Auh=@E =2%8-**8%= >? /(++((( ;; ?33?33/39///33/333333933333333910#3#?3!?'!!332654&'.54632#'&#"#"' jk4CsKV'{e`'\9ffHaWRkX'.VPVIaVSV5  yas*_Q0H0*fDnog%NF,D0+eCw8e@3 PY PYOYPY?+3?+3/+9/+3339933393310!!73;##33'z/*?\q<->5>@--Sn/pg!EB&{'Tuk?51F&t'Tuk?5HB&{'l0@{/]]555?555=F'0'lu$@d(({/]]555]5?555H=&#'0l$@%dEE{%/%%]]555]5?555=&'^@?{/     { O ;    @H+5]]]]]]]]]]5]]]]]555?555T5d^D @    /93310#&'5673!9>HH>9)CI$ICV %@   /299933105673&'#CI$ICV9>HH>9#d^D @    /93310&'3#67!59>HH>9#CI$ICV %@     /29993310%67#&'53+CI$ICV9>HH>9d^D'@    /9333310#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC=@     /2992999333333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9HG@"     /29929993333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>9D*G@&$,+0H@ PY 'OY?+?+3?+3/9333310 #"&54632374&#"'7632.#"326H|܈]"ky$iONsyN[ahYQp펻.cStT!#\y|.H5@ `Y?+333?339939310)53 !vݾp&P\rL&=<@  _Y`Y _Y ?2+333?++399331057'5!!57!r%L5R5555G5\L%=H@% `YaY ?3/+9?3/9/33+99310!2>?3!5 5!#'&#!?)ac_M8 9BJBQB*slK'bJK Ou@ Y?+9910!5Gff=- @   [ ?+9310#"&54632F33FE44E3FF31HH3bT&@ Y?3/9/+99910##5! 3okרZ=P9z".p@ #) 0/&&Y  #,,Y 0000{0k0[0K0;0+00 000000000{0o0[0K0?0/00000000000{0k0[0O0;0+0009000000_0O0?0/000000o0_0?0/0000O000]]]]]qqqqqqqqrrrrrrrrrrrr^]_]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqq_rrrrrrrrrrrr/^]3+3/39_^]]+39939210#"#"&54632>32%"32654&.#"326z֓B`o?BlSB>Yc;]`}yhTNӰۄ~}k~z쌏}~`/993103!!^j8^d@d  TdtF4"dtVD&6ivb@[^H@@LPH$@-AGHvTdB4"9@,2H$@#'HtP@H_ /2/]]]+]_qqq+qrr+_rrrr^]]]]]]]+]qq+qqqqqrr+rrrrrrr^]]]]]]]]]]qqqqq9933104>32#4&#"tтwgĠ'@ ( )$QY!@H!!_/?oO QY @H v)d)T)D)4)$)))))))))))v)f)V)F)6)&)))i))))))p)`)P)D)4) )))))))))))t)d)D)0) ))))))))))p)`)P)@))9)))@<))0) ))))p)P)@)0))))))`)P)@))]]]]]]]]qqqqqqqrrrrrrrr^]]]]_]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrr_rrrrrr^]]]]]]]]]]]]]]]]qqqqqqqq/3/++/_^]qr3/++339310>32#&#"#"&'5>733265cFYF95F eFR E:5F jx BAF|Inr  _E{X-83#@"# /0 450&&Y@(H@$ H,#,Y,,,, ,  Y@(H@ H Y/ 555o5O5/555555o55555_5O5?5/559555_5?555555p5P505]]]]]]]qqqrrr^]]]]]]]]]qqqqrrrrrrrr/^]+33/+++3/_^]+33/+++39933333310"'.#"#>3232673"'.#"#>3232673+jJa&MN ev7xKVS#ENg@jRjJa&MN ev7xKVS#ENg@jy?9m:?H1iLfy?9m:?H1iLm&k@E  Y @P   Y P    /]qr3+33//_^]qqqr3+33/9103!!!##5!!5!3: {3Q}fff4fN :@   /@/^]/]9/99333310!5!5!5GGGffNffffa Y@7  Y Y0` P`/O?]]33]q++?+993333105 !5a)G2gyygTffa Y@7  Y Y0` P`/O?]]33]q++?+9933331075 5!5c)Ggg+2ff4 (@ //993393103 %! {RV/99310#!PguVf"@  //99310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@P`/OjOo 0_0@o@9P`/p/?_ //]]]]]qqqqqrrrrr^]]]]]qqqqrrrr^]]]]]qq993103#"&546323265";N2$! =/'5)%3%@bY?p @;P@/_]]]qqqqqrrrrrrrr^]]]]qqrrr^]]]]]]?+33105! %QH@ ??93103#HK"@ Y?+?39310!!#(in"@ Y?+?393105!# (%%HY??+393103!!Hn%H"@ Y?+?393105!3 %H)@  Y??+?3933103!!#iHnnH)@ Y?+??3933105!3# %K,@ Y?+3?3393105!!# i%n%H,@ Y?+3?3393105!3! %nH 7@    Y?3+3??339333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH @ ?2?39933103#3#ّhHK Kj 9@  YY?+?+?9333310!!!!#(iijב" -@      Y ?3?+33993310!###בnn#j ;@    Y Y?+?3?+99333310!!#!!#htjo"j 9@   Y Y?+?+?33933105!5!5!# i(qב) .@  Y?+3?339933105!### ܑב%nj ;@   Y Y?+?3?+33993310#!5#!5!ґttj)F)ޑqH 7@    YY??+?+33933103!!!!iH"ב%H *@    Y?3?3+39933103!!33A$Hn#nqH ;@    YY?2?+?+339933103!!3!!ّK$hH"qH 9@  Y Y?+?+?33933105!5!5!3 iqב)%H .@  Y?+3?33993310!5!333$ב%nqH ;@   Y Y?+?3?+33993310!5!3!3!5!$KqFH >@   YY??+?+?339333103!!!!#iiH"ב"H 3@     Y?+?3?3399333103!!#3#AHnn KH G@    Y @ Y  ?3?3?+?+9933333310#3!!#3!!jt " "H >@  Y Y?+?+??339333105!5!5!3# iqבKH 1@  Y?+?3?3399333105!3#3# 㑑h%K#KH F@    Y Y ?3?+?3?+33993333103#3!5!#!5!A㑑tHK )ޑj @@   @ Y Y?+3??+333393105!!#5! iiq"h 4@     Y?+33?3339933105!!### ב%nnj I@  Y Y ?3?3+3?+3399333310#!5!3!!#!5jtttAޑ"בqH @@   @ Y Y?+3??+339333105!3!5! Aّ"%H 4@   Y?+33?3339933105!333! ב%nnqH I@    Y  Y ?3?3+3?+33993333103!!3!5!5!AH"oHV@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# iiiqב"ב"HI@       Y ?3?33+33?33399333333103!!###!5!33AבHnnnnH b@    @ Y Y ?3?3+3?3?3+3339933333333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#3#3#3#3#3#ghhhhgghhhhhhgg`hhbhh hhahhahhhhhhgghhahhahhhhhhgghhhhhhgg`hhbhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhh"bbbbba```````````c```````````c``````aaaaab^^^^^baaaaa``````bbbbb#`````b``aa`T #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKO3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQ!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  /993310!!!7L17}1mi{/9910!!imi{@  /993310!!!iLPdh//9910!!hL//9910! XVRZ//9910 7L//9910 LRZ//9910Z79e S@   t d @ 4 $        ` T D    i    [ D $        p d T $       t P D 4   9    p O 0       ` P /      o _ 0  ]]]]]]]]qqqqqqqqqrrrrrrrr^]_]]]]]]]]]]qqqqqqqqqqqrrrrrrrr^]]]]]]]]]]]]]qqqqq?3?39993310!# 3 #R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow@aTl<|Ph8x,t(p$d ` LHD4@00@4DHL`dptxh|Xl\JrrNvBzzF~2jj6nZZ^RRV::> **..>V^n~v&fb"&/3/3933333333333333333333393333333333333310#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @ /]99102#"54>jnrotjlw)@  /9933103!32>54.#")vwvvvwvu}Avvvuvvw)#,@ $% /993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @  /993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:o@@:6+% %;<("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332933333310"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7<@$.#5 # 8910/+*?*O**/^]]]]]993310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'J@'$$  ()P /^]2/]32993393332210.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8D@#0,!'6!'!9:,*3$$$-  **/^]]]9999333399310&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<4?@!/((5(6$+/     //99//]9233999310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@  //999910./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @    K  /]999310&&'6H zDS%Ut}FiGfY;.@  //]9/9933333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt `@4 !"VC 6% X ///33]33^]]]]33]]39933333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu8Sq@A  !     ///9333333/933333333910!##??3%377%`8>`8X:`3h=`6X Yi=>YYYYG\YY YYm =i@6 !   _Y_Y _Y   _Y?3/+3?99//3+33+3+339933333310!?#737#73'7!!!!!327V, I$G < Gt$tH־ko5RR55qRRg:Ae@  OY OY @ H  OY OY ?+?+9/33/+3+3+3393333310#3#!#737#73'7!A ]i ]+i:JJJ-\JJJ-=&S@,""% ('_Y &&"`Y_Y?++3/?9933+339333310!?&#"#>3'7!32673#"'327V, f!+64 vXR < d.%*84 tZQ־ko5B/Hs55%0F|u6= ^@4  "!_Y `Y_Y  `Y_Y?++?99//3+3++339333331073'7!2!#!? 4&+3#k 5 O 43 0|J(5B55,eJK=(p@<   ' (%%(')*'  `Y !!_Y!`Y!`Y (_Y ?+?+3/?++9/+99333333393102654!#!#32?3#".547'7!2he фqZ17B+TSI ܨ 5L#~1Lj9H5T.$+o@? '"#& %% &"-,))RY #&"' OY  PY ?+??+?9+33393333333310#.54$32373!7#"'"&'327IFBN2H*(-6q! Sd`.v{'} &q#t1o "-o@0Hm.!j@8   # "!!PY  @  QY ?+3?39+33333993339910%327#"'#&546#?3337#-#IO3xN],F h{@%H0ܙ--/$3?ZOJ-'N}`#=SJhH@%   RYOYOY?+??+?+39933333310%##654&#"#'7!>32uüf04K8ov jPXefi-;F'-8}[H-Liomf:`=K;hV@/  OY   OY  OY ?+??+?9+3393333310###'7!'7Qbuüxڔ>1^-;ߋH-8-`=A@!     `Y _Y?+3?3/+33933310#!7#"#!!A"a_DE8i `^=VmhC@"    PYPY?+3?3/+333933310!#!7#"#7~ü 48j7/-1-/rwL !?@   "#_Y_Y!_Y?+?+3?+?9933310"327.!7#".54$3273WHO s kBa)" 95Wj&Lc@    @Y   _Y ?333?+39/3?3+3393933333310#'&#"##'7!3>32B6?\'?^Aq  .W)cmQUL:VU~ 55Xe^r61sT@+    PY   ?333?9/3?3/+3393933333310#'&#"##'733>32P1"4X8B|Ff5Kz1\cONG{\f<kz-=Y_n2*U@,%"   +," (PY?3?+9/9?93333339933310#'67&54632654&'73>54&#"SYIjYnp\}^EEeQJ@* 1=$&mX[12F12TBrE7E{;jW%,-76(M,%==X@, `Y  _Y   _Y?+3?+39/3+33393333310#'!!?'7!!73@d Ѩ  ];@5555DGI@$   PY  OY??+39/+33393333310!#'7!!73#bMrw=4-G-If--k=5!?@  "# PYPY?+?+3?39933993102!"&54>7>"64&)i}OtBl^7Dl8Ư˾?%dQho ?pkX@  //9991077K32у΃/  /103#2#"&546mm-@@-,@@ >/,@@,-@  /2210'7"&54632MDM`,@A,,?@MDM@,-@@-,@/! /310!5%#"&54632@-,@@,-@mm-@@-,@@W_{ /310!53!}v @ //9/39310!#!53[c Uv @ //9/39310 #5!3!]Uf!"@   //99//3993103##"&54632)ڦ^}E44EF33F!1HH13FFf!"@  //99//39103##"&54632&^*yE44EF33FB1HH13FF.M"@  //99//39103##"&54632^)yE44EF33FB1HH13FF i  /32310##5##!}}Oc7c /332103!33533h}}ciL~@  /323991073#'Ջ/L!!'  @  /99//993310#"&54632#"&54632'E44EF33F^E44EF33FH1HH13FF1HH13FFe~@  /323910!7!76AAffff=/93103#BJ=S=//39103#BůJ=zL[@1  OYPY PY@ P  ??3/]+?3+3?+99333333333310##?>32#'&#"!!! )cQ#B&KZh!әL 1'Brz-XLK@' PY PY OY?+?3+3??+993333333310%!5&#"3###?>32&K\k  m-F-<|T 1'BT 2L%7@ Y/ Y H/++_^]+933105654.54632%u~~"6'3?Xr&?&3""&,CrU>@ YYYH/+++_^]+933910#"'732654&'7H=01=LDAyPWbuK79,;GRW*' @ //99//333310##*TTT'88W' ,@   /23/333333331053#5!#3WM6MMMW'//33310#TxW*'//33310#'*T'0}W'@ //3333103!*'O&&  `&&]5#@ /3]]210#"&54733267#ANPk ㏚p K@kS0& ' N`uDf  X uyXFhgY_?+310!7!3!%3!LLT&&&'V&'V&{&{&9&P&u&je ++]5Df&5e BB]5&'e %%]5T&e --]5&L===]]5'& 7Z &&]5uq& e '']5& &  DD]5f&?&jL&N,,,]]5dw&PM @@]5&wz AA]5=&@_QQQ@Q0Q QQ]]]5]]5{!&u&e ""]5&Vy&^e ==]5u&b&b& b&L5@(!Gb=*5*hY5!!LgY!_^??+3+3?9910"5467>54&'&54>32;267"54>32372&#"#"5&'B+#!/ 4 J(&&'m*29 ݠe#3+\,2)7[-#4 WgS~;7 ,!@0  34Y"+:ѽhZE/%1,A-%>,#D11w%2 /210#"#6$!3^x~ v2 /2103 #&$+ x^2v @   /  /]29/310.#"#>32`F[q> ܺw).2}5@/ /3]9/31032673#"&'aEmzNX*4Cfq5" !%)/AOW_jv@ qe*k`MJU]]FPJXB43:??<3BJF`*e + x"..+''+&&#++w #.,]7ttF0b\UnhhG7##7!# $<@/mEGQbn=5NH$uF9:`--/$3`V.[-;-CӀTUbX 9@    Y/]+_^]9/993310267# '7TL@9m^2ZftxGUY2d="@ Y[?++399105>54.54632dCP&#7+2Bm%?*0''&)N6`)*@ Y@ [/]++910467#"&6u~~"6'3?Xr&?&3""&,C/^C/^C/^C^v^v^v+  /32104&#"'632#5>3*HFZjQ[pE0"c;U 2x+  /32104&#"'632#5>3*HFZjQ[pE0"c;U 2xX +  /32104&#"'632#5>b3*HFZjQ[pE0"c;U 2x{_*e{_*e_!w^u/1053ɬ^v^v/^C/^C++{_*e{_*e{_*e{_*e{_*e{_*eu ?u |u u Zu {_*em!u ^8u u~u u z.u kfu WRu #u :u +{_*e{_*e{_*e{_*em(@ OYOY?+?+993310%!'7!+F-f-E! /329/3107!#"&54632#"&54632sW2%%44%%22%%55%%2mm%55%%44%%55%%44A /399//310?34632#"&%4632#"&N2%%44%%2=2%%55%%2s%44%%55%%44%%55AC  @ /3299//3310#"&54632#"&5463273#'72%%44%%22%%55%%2{=%55%%44%%55%%440{{!! A /399//310'73#"&54632#"&54632 A2%%44%%22%%55%%2s%55%%44%%55%%44E! /29107!#"&54632t@-,@@,-@mm,@@,-@@!@ @ H /3329/+33107!".#"#63232673t/KBHa4R $@  //39/3933310!#!7!3bG4oaRM$@ //393933310!#73_J^rM $@ //393933310!#5 73fS܈kh/iF @  //39933310!# 73pZzfjFp$@ //393933310!#73p^ZHd(5"@ //339/393310!# 7 3RkGHyN!5 .@ //39/933933310!# 7 3Rka.K- O $@ //39/3933310!#!7!3xtdH^- $@ //393933310!# 73`vcFFH @ //39933310!#73wp=Dg-p$@ //393933310!#73pEsHVH!$&@ //339/3933310!# 7 3=|GHY2#% &@ //339/3933310!# 7 534~X4(5f% .@ //39/933933310!# 7 3C{sVH2}q' $@ //39/3933310!#!7!3cy Q2X/"@ //39/933310!# 73HԈG7%p @  //39933310!#573p={H\2#$@ /3/399933310!# 7 36}MH)Q0) $@  /3/399933310!# 7 530~YAuO/l6 $@  /3/399933310!# 7 3ON,qS-m6 *@  /33/393933310!# 7%3O~t8S-{0@  /3/393310)733+NS.)p @ //39933310!#73pA>S.)O@  //39/9310!#!'!ataoL *@ //339/93933310!# ' 3[H5fy4L *@ //339/93933310!# ' 3UH)hy?L *@ //339/93933310!#5' 3SHhy-^"@ //339/993310!#' 3Q6fy=Lp"@//39/933310!#'3p^iy @  //39/393310!#!5!3pT; (@  //9/933933310!#!5!3a.izT $@  //9/93933310!#!5!35$$@ //9/93933310!#!5!3?P(@ //399//3933310!# 7 3h`axbVL 0@  //99//933933310!# 7 3e`;H`GF &@  //99//3933310!#!7!3fb*]v\^L&@ //9/93933310!#73^'c{L"@ //9/9933310!# 73e[؈scSc[Lp"@ //9/9933310!#73pd]?de[/(@ //399//3933310!# 7 3Gu7TaF?9 0@  //99//933933310!# 7 53Rv8HqGG? 0@  //9///33933310!# 7 3Nw]sX=U8H? &@  //99//3933310!#!7!3mwo V=2?"@ //9/9933310!# 73\w߈5:=?p&@ //9/93933310!#73pWw2-B=+6&@ /33/9/9933310!# 7 3O}4H) 0q5 &@  /33/9/9933310!# 7 53N}<Au 1[l6 *@  /33/9/93933310!# 7 3ON,q -+m6 *@  /33/9/93933310!# 7%3O~t8 -6@  /3/9/93310)7330O~ -Q5p"@//9/9933310!#73pM4 -zL@  //39/93310!#!'!owKzL ,@ //339/93933310!# ' 3oH Kz4L ,@ //339/93933310!# ' 3oH)S@Kz?L &@ //339/9933310!#5 ' 3oHu^Kz-L"@ //339/993310!# ' 3o6RjKz=hp"@//39/933310!#'3po~3232673#".#"3#7H{S,OH?); 4zT,OG@VxBO`(!O_J ^!".)@, @ H & @ H/333/+332+210>3232673#".#"#"&54632#"&54632H{S,OH?); 4zT,OG@V4%%55%%4=4%%55%%4O`(!O_J2%44%%55%%44%%55sb /2/9/1073#"&54632o83$$43%$3b!%$33$$44= !@ @ H@ H/33/+3+21073#'7%#"&54632=83$$43%$3i{{!!K$33$$44J! @  @ H /3+22310#"&546327!#"&546324%%55%%4t4%%55%%4%44%%55mm+%44%%55/A@"  PY  OY OY?+?+9/3+393310%!#73'7!3#M=+JF-T\-^T=U&c')P-- H-+q5=U&c')P-- H-+q5=U&c')P-- H-+q5=U&c')P-- H-+q5=U &c'=U &c'=U &c'=U &c'G&k&)P H+q5G &k&)P H+q5G&k&)P H+q5G &k&)P H+q5y &k&y &k&y &k&y &k'[&w&Zq)P H+q5[&w&Z])P H+q5[&w&ZN)P H+q5[&w&ZN)P H+q5[ &w&X[ &w&X[ &w&X`[ &w&Xej!&k&j'C@ -@ H- H+55+5j!&k&j'v@ -@ H- H+55+5j&k&j i*@--?--@ H- H+55+]]]55j&k&j i*@--?--@ H- H+55+]]]55[!&w&jM'}C@ 6@ H6 H+55+5[!&w&jM'}v@ 6@ H6 H+55+5[&w&jM *@99?99@ H9 H+55+]]]55[&w&jM *@99?99@ H9 H+55+]]]55r &&LvZ0 ]]5DdG&c@  %""('@Y_Y_Y`Y?2/+?+3?+?+3399333339310"'73327654#"!?'7!6$32f*A T)!Թ Ѩ k~g PD.^(,u555@V~4NI<E=!e@3 #"_Y!_Y`Y ?3/+?+3?33+3393339933339310#"'73326?!?'7!'7 K+BB*g$ǰ 8 Ѩ  =5߹qy5555RcG'b@'  % () _Y "_Y@ Y _Y?+?+3?3/+9/+39333333104&#"!?'7!6$3 !"'7332676eoK f k~g8 H3ү)DZ-G`auS55A5@V6Lg3Z(E) AC?2?310'"46324#"326>XrZh^=SA+/CT>Eۏ\~uGX+V  AB?33?9107!?7%3Z &nH11q:/VW AB?33?33/107!7>54&#"#7632!ҖJ87>:&7qQt~V`R4E!bfWamIV'!"AC?22?3393910'"'7332654/?>54#"#7632'pj7I%ggU WHWzA6&7jVsrq_bIp ^d{ AV\lf^PZq WFwU({ !@   @B??39/3333107#7!733#!k`ya&gE&z@ C?33?39/3102#"'733254#"#!!6ob7/SD/BH(&1l`u׌ pF0$!! AC?2?339/3310'"&54>32#'&#"63232654#"ugmRh7+JQhVzT=5G7tgn;>][ggF%$!! CA?2?339/33102#"'733267#"&5464&#"3276,ugmRh7+70;pKK@   @ H/+399//310#'73"&57332673B&wJfUS|J ia):?>;pKK!@ @ H/2+299//310"&57332673632#?654#"CwJgTU{J=1<8FC.6$3Kia):?@9pp-*/D HL$#@! @ H /3+229/333/310".#"#63232673"&57332673+C:6F //*D:7(1/.qx6hUVy62&7&$1ZT#/34.el& & PP]5& uq& uq& /&&& &92 #/;?!@<3!9@999=-'/3333]q222104632#"&74632#"&4632#"&%4632#"&4632#"&3. ".." .. ".." .- #--# -V-" 00 "-%- #--# -CoD` .. ".." .. "..".." 00"--" .. 00 "...n!@@ /33]q229/310!!%4632#"&4632#"&3 E-" 00 "-%- #--# -CoD5j>"--" .. 00 "...n#%@ @! /33]q229/33107#7!#%4632#"&4632#"&3SoEk-" 00 "-%- #--# -CoDujju"--" .. 00 "...n+@>32&#"#".7>7.3267>.'.'r A`zEDd<+fQf-F,4K)Za_T\|Q$7# *O!;%/PD%CDI+5ho|Inz@5ihisK'JLQLzW/7332>73!7#"&*POTb e -g/11g cf133ebvGU^hmm9azkeQK-y-7Z6@#-7_|5@-`{of7!32673!7#"&546'7! 204K8ovSXef fofmm8-8}[x-knmfMP-~L5 >$;DGNh$$7$9$:$<$Y$Z$\$)))$//7/9/:/</\/3333$595:5<5\77h7h7h77{7$h727DD7FD7HD7L7RD7U7VD7X7Zh7\h99999{9h9$h929D9H9Lh9R9Uh9Xh9\D:D::D:{:{:$q:DD:HD:L:RD:U:X:\D<D<h<D<{<{<$q<DD<HD<Lh<RD<SD<T<XD<YDIUUUUFUGUHUJUKURUTULYhYhZhZh\\;;K;R;V;WX;X;]X;e;o;y@WAAC;AD9AGsAKAN9ARAXA^FA`AaAcFAfuAiAkAlAnhAqFAuFAxFA|;A~FDDKDRDVDWXDXD]XDeDoDyDFFFCVFDFGFNFkGGKGRGVGWsG]sKDKGKNKVKWK]MKMRMXXM^McMfMhMjMpMqMuMxM{M~MNNKNRNVNWXN]XRDRGRNRWR]TTTDTGLTNUvVVhVhVVVCZVDhVGVKVNhVRVXV[V^FV_VcFVehVfFVgFViVkVnVohVqFVuFVxFVyhVzV~FVWFWhWFW}W}WC;WD9WGsWKWN9WRWXW^FW`WaWcFWeWfuWiWkWlWnhWqFWuFWxFW|;W~FXDXWbX]bY{YZ^ZcZfZjZqZuZxZ{Z~Z[W[]]C;]D9]Gs]K]N9]R]X]^F]`]a]cF]fu]i]k]l]nh]qF]uF]xF]|;]~Ffyh^h`hchehfhihjhkhlhohqhrhuhvshxh{h~hmwp^pcpfphpppqptpupxp~qyrh!vh!xmxyy^ycyfyhyqytyuyxy{y~y{y~yyf3L13L/Rf3f'{\L33L5`o`Lm3}333m}3f{b3m)33333m}AAA3Am3A}3VWLnV'FDzQ ) n  . : 5  A     8 6M .  , [ (   8 8 \ j i 4 Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Digitized data copyright (c) 2010 Google Corporation. Copyright (c) 2012 Red Hat, Inc.Liberation SerifLiberation SerifItalicItalicAscender - Liberation SerifAscender - Liberation SerifLiberation Serif ItalicLiberation Serif ItalicVersion 2.00.1Version 2.00.1LiberationSerif-ItalicLiberationSerif-ItalicLiberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Liberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Ascender CorporationAscender CorporationSteve MattesonSteve MattesonBased on Tinos, which was designed by Steve Matteson as an innovative, refreshing serif design that is metrically compatible with Times New Roman!". Tinos offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.Based on Tinos, which was designed by Steve Matteson as an innovative, refreshing serif design that is metrically compatible with Times New Roman. Tinos offers improved on-screen readability characteristics and the pan-European WGL character set and solves the needs of developers looking for width-compatible fonts to address document portability across platforms.http://www.ascendercorp.com/http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlhttp://www.ascendercorp.com/typedesigners.htmlLicensed under the SIL Open Font License, Version 1.1Licensed under the SIL Open Font License, Version 1.1http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL!d   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                     uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniF004uniF005uniF00AuniF00BuniF00CuniF00DuniF00EuniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFCnullpi1 cyrillicbrevecaroncommaaccentcommaaccentrotate grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.alt radicalex.xuni00ADuni0309UNI2206circumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildelamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BES_TES_PEx         bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.60FVR J   8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz S R Q P O M L K J I G F E D C A @ ? > = < ; : 9 N T B H:BJRZbjrz o n m l k i h g f e c b a ` _ ^ ] \ [ Y X W V U p d Z j:BJRZbjrz             ~ } { z y x w u t s r q   v |:BJRZbjrz                            :BJRZbjrz                            J",6@   Tcyrlgrek&hebr2latn>kernmark 4<DLT\dr $,4 Zhl(z Zt ( !6! !!","\"""##L#|##$ $$J$n3l3t6 9=@@An L $*06<BHNTZ`flrx~ &,28>DJPV\d2<222d22d2x2P2<22<2`22<2<2x2d2d2P2x2d2<2x22<222<2<2d22d22d2<2`2222<22<22d2d2d2<222d22x2<222<2`2<22d2P2x2<2d22<222<2<2222 ( H" X2 &,28>DJPV\bhntzXXXXXXXX  XX|XXXXXlX    L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzX2Xh2hT2Th2h020h2h@2@hX2XhX2Xh2h2h2h2hX2XhX2Xh2hT2Th020h020h2h2h020h2h020h2h2hX2Xh2h2h2hX2Xh2hX2Xh2h020h2h2hX2Xh2hX2Xh2h2h2h2hX2XhX2XhX2Xh2hT2Th2h020h2h@2@hX2Xh2h2h2h2hX2XhT2Th020h2h2h2h020h2h2hX2Xhhhhh2h2h2h2h ( HFLRX^djpv|FFFFFFFFFFFFF. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzXXTT006XXXXTT``XX00 XXXXXX00TT XXXXXXXXXbXXTT006XXTTXX XX6TTTT ( H   jpv|2<2 !< !J`    J`      J`    !   J`    ! 4<4J4< !4J !Jl      Jb    Jl       !Jb     !n L $*06<BHNTZ`flrx~ &,28>DJPV\22,2222,2,222222,222,2222222,222,2222,2222222,22,22<22<22222,2222,2222222,222,22,222,2<2222$2$222 ( HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\222 22,2222,2 2 2222,2h222 2 22\2H22<222222 2222222222<22<222222 22,222,22222h22 2 2\2H22<22222 222 2 2 ( H F<Fn L $*06<BHNTZ`flrx~ &,28>DJPV\X\BX8X8888X X8 XX ( H ( >      $*   $*   $*   $*   $*   $*   "   $*$*$*$*$*$*$*$*$*$*$*$*$*"("(>b<N`X^*Xv.4*4^h>>DN|l*@f d  . 8 n  ( 2 D z  L z  < V h r ($;DGNh 79:<YZ\$79:<\$9:<\hhh{$h2DDFDHDLRDUVDXZh\h{h$h2DHLhRUhXh\D DD{{$qDDHDLRDUX\DDhD{{$qDDHDLhRDSDTXDYD FGHJKRTLhh KRVWXX]XeoyWC;D9GsKN9RX^F`acFfuiklnhqFuFxF|;~F KRVWXX]XeoyCVDGNkKRVWs]sDGNVW]KRXX^cfhjpqux{~KRVWX]XDGNW]DGLNvhhCZDhGKNhRX[^F_cFehfFgFiknohqFuFxFyhz~FFhF}}C;D9GsKN9RX^F`acFefuiklnhqFuFxF|;~FDWb]b{ ^cfjqux{~W]C;D9GsKN9RX^F`acFfuiklnhqFuFxF|;~Fy^`cefijkloqruvsx{~w ^cfhpqtux~h!my ^cfhqtux{~f3L1 3L/Rf3f'{ \ L33L5`o`Lm3}33"3m}3f{ b  3      m) 3   3  333  m}3m3}3VWLb$)/3579:<IUYZ\;@ADFGKMNRTUVWXYZ[]fhmpqrvxy{~A  n L $*06<BHNTZ`flrx~ &,28>DJPV\2 22 22222$22 2 2 2222222z2z2222H222>2>2>22>22 22 2 22H222222222 22 2222$22 2 2 2222z2z222H22202\2>22 2 2 2 2 ( H n L $*06<BHNTZ`flrx~ &,28>DJPV\XT0XXXX,X0XXXX0XXXXXXXTXX,XXXX ( H   flrx~n L $*06<BHNTZ`flrx~ &,28>DJPV\X22T22022@2X2X22222X222T20202220220222X2222X22X220222X22X22222X2X2X22T22022@2X222222T2022220222X2d22222222 ( H:@FLRX^djpv|F,FFXF@FhFFFFFFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\XT0XXXhX0XXX0hXXXXXXT0XXhXXhhXX ( H   flrx~h#T@@,,,,,,|||@Hp 8=ȃVopenscad-2019.05/fonts/Liberation-2.00.1/ttf/LiberationSerif-Regular.ttf0000644000076500000240000136640013402025764026045 0ustar kintelstaff000000000000000FFTMarGDEF}t 8GPOSaXiCRGSUBM,OS/2Ơ`cmap!E*X6cvt ^R1;fpgm~a0gasp (glyfbfhead8<6hhea [ t$hmtxQ(@kern2GdlocaՖd>(Dmaxp  name6:y -L postڃ8g7prepg8D.P_<̓H̓H :!EW :  RT/\d3%3d Px!1ASC@ F3!`= 9D%XF9NqVZBdfNL9NZb(wXNB99jffhj^mV;VT;;s;T;J+;;;;Ts;TV;s%+-b9JwHNJP?X9+9'9)9+/N!J)T97T9y`?X5#ufLX3bdUfDf+BfB{%RBBJTVT;;;;6J?5;TTTTTT++++sHHHHHHHVHNPPPP99+99N/NNNNNdUFHHHVTNVTNVTNVTN;,J5J;P;P;P;P;PTXTXTXTX;;9969J9+J9+Jk++9;'';9);9);@G;)+9;/;/;/;/TNTNTNTNV;)V;)V;sTsJsTsT%9%k%9++++++b7b7b791%;$VqVTN55CD?fT]swT)#;;9!6h/TT;NfJN3=!s;s|AP99%5+Vj+?b7P+P?FPZ*4`.?  ; T;J;;r);;9/H9TN+++++GHHVHTTX;'TNTNP+!9 ; T;JTX;{";/HVHTF'H;P;P969TNTNV;V;)++sT%9K)M;3;JHNb7H;PTNTNTNTN9)/91J.JVT)%T7E.)V6+;P+9TJV;)/J/H?HJJGGP\O\;;DJJ;))9'-9V99)9))9 9 9+/N EDKmN)):%%T}99dX77!dDdNT%D;H%9 p%JdDkJJJ1M?)z)!<aa&3>3Y!m`eo chSSwww995}/XTPbbVw9.&.&H5V44RR___5@9 U#gV_Q#0>S n9E_?@N9j39wJ'V;;%N;b;TJ;;;%nT;s;P%>-j?1N\O/ '-1NM\OPY/ `'-'6JZN +KPN7-ODP'NDP++6ED{TNVT\Ks;j n9 F+EJLVWV@CAFN{`N9T=N=+sHVT;/ VqVTVq;;%;HTsJ?+;%V;;A;;V;;u;+a;;V;m;;T;s;VT%ARS-;3;;=;;Hq9;VH`%H%P):H%H%%/H%NH%!N/KH%)#)##$`%%oE$PPH%oNT9+9 9%%H%H$ a`^XJk:CJ:+12 J{:)TNT NHF VE a`VTF+0;H%;-s;!;+;H% ;%+a):V;%V;%V;%I%;H%;%B;P<VR3VTN%-`*-333;__J+V;%m;H%;H%3;/9)HHVH;PTGTG+a):T!;H%;H%TNTNTNHqoEAAA3;H%;`%;H%--DJnD*JkmfnfA;M"TN%])EmTJD+m^`Nh)'\DH^jb\'D^H===\\\95`f ;wV39 =b3%V1=+o11HwN+33N N)VH%.2%2%%):9+_Q%/H%N<U>M:UN~7NN%L9 %=5 %7):.=OGH%H%%:`N,p*+=v-*++5R)A*X"*G*.n0&0&'z}' $ $!h'O%1A3N% N#N#}-#'r,Z,B3 +$#BO3.ZB5 ^&$BJ997L3=!9+'+!L9dJ?X'9)9+/!)Te7H/JJP\O\;G9+N :9  M(!"O u*Q6QOO*#1*8"N#$-,%S*Z1*18n8 (%@HV;V;V;VTN;J;J;J;J;J;P;P;P;P;Ps;?TX;;;;;9J9;';';';9);9;9;9;9+;9+;9+;/;/;/;/TNTNTNTNs;!s;!V;)V;)V;$V;#sTsTsTsTsT%9%9%9%9+++++--b7b7b79H911HHHHHHHHHHH;P;P;P;P;;P;P;PJ9+J9+TNTNTNT"TNTNTNT;NT;NT;NT;NT;N++5+V5+V5+V5+V5+V1N1N1N1N1N1N1N1NTTTTTT\O\O\O\O\O\O<<<</ / / / / / / /       '-'-''''''NNNNNNTT00***DPDPDPDPDPDPDPDPoooo1N1N\O\O/ / '-'-NNDPDP1N1N1N1N1N1N1N1NTTTTTT/ / / / / / / /       DPDPDPDPDPDPDPDPoooo1N1N1N1N1N1N1N/ / / / / ;AA''''''5AA 333DPDPDPDPDP/2jU L?bVVb??sM-eUoUV9ff/f&f"#0& $N%R &.VTVTy9+0,;"%)"s"Ts,VTfmy;X`%XUeBDBUWw?D-r\fVd3M1d9dUfdUdTf"g{mmb))s+kUFQ@;@<fB209)s"V;H9;;'b7T F; %OS:U9qVqV2s?s?333`f+ZNNNN```f ;V9b%V1=11HwN+ 1=dD2D2wwwX5wwmzf#:9+ WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWW>O91N1N1N1N1N1N1N1N''''''''''''9+;;;L\%N!kk`H__M,~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,- PAbehg`N_UA=@U@BUC=BU.==>U<=;U;?;O;;;>U0=/U/>U-=,U,,>U?=>UJHUGHUF=EUEHUI=HU`?@ P)O_0P`p  8=U=U<0P݀ݰU 0p/O`P`/.G' FOL=NAMMM/MOMoMMLL/L@8_ +{pvvsP)on+nG*3U3U@Ib%(F`_@_P)[Z0ZG)3UU3U?OoRPQPPP@P FOO/O@eK!(F`JpJJIF)HG8GG/GGGG_GGFFF@F)/F@F!FHU3UU3UU3U/_?TS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYsst++++++++sstu++s+u+t++^s++++++++++++++ssssssst+++s+++sssssss+ss++s^s+++^s^s^s^ssss+sssssssss+++++++s++++s++++++++s^H=p=L]FPiuiPZZP`PPm{1o1MffJf/^tFF<}Shv= }JAl T/HjgaAU )% 42$ U4Kan_=m {dNDpx L $ |  ,\Lh(Xd !"#%8&0'))*+,(--.0412(3457789:T:;>?A`CDEGH(HK<LXM`NPO0OPQ,RSUV<XYtZ$[\l\]^T_`abd<eghjllm nnp p|q rtt(uvvHx$xxy{|} }TPDx@p4d PD8lPxH<d8`|h0 HlDp@p<h,\@h<$Tx@ 0X$\@X|8Ht $|L Lp$Hl<`8\hl8d(d4`4XxD88t8T|8ƈlHʤẗ̠́(Ϡ|8Ҭ\4l|0d٠lD \߄8p04H$D\t4d P ,dDl <l(T( T4h0d,\$TP 4Tl(,H <<$\(XH @ H p |  < \ h0x8(X , !"L"#$$&&'p(d),)*x++,-X...t/4/0L1,2244566 6789 9:H:;h;?@?@pA@ABHCCDDEF0FGxHDHIJKKL4LMNOdP,PQR$RSTlUhVWXYZ[\]t^__`a\bbc cd0depfff(f8fHfXffg|hhh(hphijPjk|kkkkl0lhllm8mmn nhnnp8pq4qsstHtu4uvpvw8wwxx\xxyy`ypyyz<z|z{${{|X|}}@}t}}~(~|~~ 0` THL\@X|@0$L@|(Pt|DtL <pX,dd@8444d<x t8L @(P$h<@Ltx8H<LX4XLl84TD4D |`ńŬǜ8\ȐX0@̐<tlϼtL|4פDڰh<݄ܰ<޴߄4DTt0,\|xpTT 0@P`pTd(tT|H(dtt4LL\  H    t $  ,<8<pth|   !"#%(&'()|*d+,+,@,t,-./p0H2334 45\6 6h677p79;<=>?,@@AdABhC CDEG,HpIJdK8L$MMNOPQR`S,STUVWXYDYZpZ[[\]^_`<aabchdd(eefggijxkxlpm,mnopqTrrstdttttuu<uLu\uuuuvvDwy0z\{|<|L}D~Tlt$Pl||pP0x\DhDXhx P,l@ H|x,HX0\|Tx  ddpÜŴ8ǠȄdLDˤHЄҐdTհp,<8ظلhhܸp(ޤ(ߨl|H(8X4h(L8 4@80\`Lh0,0@   <  t (  @XpX$X8 !"x#T$%&T'(h)h*,++,-.X/X0<1$134$5 567<8899:;<8<=X> >?L??@xA4ABBxCpDXEEFHFGH|HIJ\K(KL0LMMNO$OPPPQRRTRRSShST(ThTUU4UdUUUVV(VTVtVVVW W4W\WWWWX0XPXXXXYYDYtYYZZ0Z`ZZZ[[D[x\]^^@^h^^^__H_p___``8`d```aa0a`aaabb@bpbbbcc@chcccdd<dpdddeeDeteeff(fPf|fffggLgtgghh8hlhhhii8i`iiijj(jPjxjjjk$kTkkkl$lLltlllmmHmpmmmn nPnnnooHoxoooppDplppqq0q`r4r\rrrssHs|ssttLtttuu4uhuuvv8vlvvvww8whwwwx0xdxxyy4yhyyyzz<zdzzz{{H{|{{||L|||}}$}<}`}x}}}}~$~L~t~~~ 8\t Hx@p4h8Xx,PDx,PL 0Tx8h8l 0Tx T8\(\,` P T<`8h$TDd0\0\4Tt$P|,LlDp Lx$Ll<\0$<\<d\ P@p4tDt4X|4$Ll(Ld x<L|<h Lt|4|Ø8Ŝƀ`\Pʨ(˘D͸@ӀԸֈָ<Tڈ۔t  H8`ThLlx\l(x 00$h<(<HH8D|@L<LP$| P   x  @     p lX0X4dX&X&'()))* *<*h*+d-./0$142h3d4H5 5799:X:;<`=(==>?@AABlC8DDEEFDFGH`HIJ4JJKLKKL@LLM`MNNdNO OtOOP0PPQQ\Q|QQQQQQQQR R\RtRRRRRSSDStSSSTT(T\TtTTTU(UXUpUUUUVV(V@VXVpVWWX<XY[p[p\\\]P]`]p]]]]^^|^^___$_L_\_l_|________` ` `4`H`\`p```````aaa0a@aPa`apab,bc$ccdxde eteffhfggXgghXhiiHiijDjjkHkkl<llm4m|mn n|no(opoppdpq qpqrrdrsslst$tttuutuv,vtvwwdwxxpxxyTyzzlz{ {d{| |h|}0}}~~p~,`  p(4(0404|x(l hhTT@8,8dDTt4Tt4Tt4T(`X\L`\0@Htx(8P(D= @    @ [F6&p`PD4$9p`TD4dT@0 ]]]]qqq_qqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]_]]]]]]qqqqrrrr?+_^]?933310%#"&546323#E44EF33F>^\1HH13FFH\=@    i Y K        y 6 &    t f R @ 0    :    p d T $       d @ 4 $    p ` P O /  ]]]]]_]]]qqqqqqqqqqrrrrrrrrr^]]]]]_]]]]]qqqqqqqqqqrrrrrr?2^]29933103#3#>JB>J=%=@U   !  Y Y   ?3?399//^]]33+3333+339993333999910!#!##53#5!3!33#)!NhNMiN: LhK5LhL9b59 fZZf3giig3Xd(/7@Y0-'4' (())##895sY)#, 40 @- sY(&`909 9999`9@9]]]]qqqr?2/2+3?33/_^]9+3993393332210.'3.546753#'.'#4&'>k7B"Yw`L7ͪRAy>_׷R6anv'J^dk,@)I6)/:Ne>%*#"= ^z2T;S=' jFdR $0\@6+ %  21Y [ Y "(Y"[.Y?2/+++??+++99339333310#3!"&5!24&#"326!"&546324&#"326nodGS[WOPVZT/S[WOPVZTfoNR$-81@'(0.4.  +:9  PY '(0""6PY"%PYPY::::p:P:@:0: :::p:::P:@:0: :::::P:0: ::::P:@:0:::@:::p: ::::::^]]qqqrrrrr^]]]]]]]qqqqqqqrrrrrrrr^]]]]]]]]]]]?+?+?+99/+3993393339391067'5!!'#"&54>7&5463227>54#"CzaɋLwhH|}ٙ i^ aU+i\;NrW8ƥ555]Rac3~-nt$EdJ`V\=5@ yI9V) hD6$vfVF6p`P@0$8pP@0 ^]]]qqqqqqqqqqq_qqqrrrrrrrr^]]]]]]]]_]]]]qqqqqqqqqqqqrrrrrrrrrr^]]]]]]qqq?^]93103#V>J=ZLh@   ??993310.5467FqihzCATiQOjTFBLP@  ??9933105>&'5BqFCzhhLTA5$FTkdN=%@&       @ H $vf@2"vbP@4$9tdP@4$p` `]]]]qqq_qqqqrrrrrrrrrrr^]]]]]]_]]]]]]]]qqqqqqqqqqqqqqrrr?+993933321073% %#'%d@;+/=@L@/+@H)GbaHÏcf %@  Y ?3+3933310#!5!3!ugXguVfVfN,@ Y[`]]/3++933310%5654&'&54632%DD5@O1*M8p #@69\L`/@lY0$tDp`P@0 9p@]qqqqqqqqrr^]]]]]]]_]]qqqqqqqqrrrr?+99105!Ly @   [?+9310%#"&54632yE44EF33F\1HH13FF9F"@<`qq^]??9910#3ddbZNR @@& sYsY@`@]]]]qq?+?+993310!"32#"32Hܸzrt|HdTMaB#H K@-   @ sY@    ` @ ]]]]qq?+3?_^]93310%!5%5%3s/4P55Fa5ZL`@7  sYvY@`@]]]]qq?+3?+3/_^]999333310)57>54&#"#632!˺Iv5p+#BWYd΅+pűL[bL*@Q(%%+,(sY/# ##sY# sYp@,,,,`,@,]]]]qq?3/]]+?+3/_^]9/]+999393910#"'332654&/57>54&#"#>3 㾪 B-'>qlu5t,#BcGm+ R {(D R@/ uY @`@]]]]qq??39/3+339933310#!533#!*s ''r2]w=r@E   sY vYsYp   @    ` @ ]]]]qq?3/]]+?+9/_^]+39333102#"'332654.#"#!!6徕 B-,{8@v[W`l+|<TXL$x@G"" %&""  tY  sY   sY@&&&&`&@&]]]]qq?+?3/_^]+9/_^]+3399333310#"4632#'.#"6322654&#"~㕒B#!p-bylgp`J:#Vߝ2=Q@/ vY@    ` @ ]]]]qq?3/]]+9?9939310#!#!B>K=MNR".g@;)#  /0,,sY,, &sY sY @0000`0@0]]]]qq?+?+9/+99993933210# 467.546324&#"3264&#"326k[r}TmWm͋}tv)lmjgdmpin(*~)(o͠0~y{BL"x@G #$ tY  sY  /   sY@$$$$`$@$]]]]qq?+?3/_^]+9/_^]+33993333104632#"'5332#"&"327BA# l7 x~y"U53 @y [ [td@0$9tdTD p`P@]]]]]]]qq_qqqqqrrrrrrr^]]]]]]]]]]]]?+?+933310%#"&54632#"&54632E34EF32FF23FE43E\1HH13FE3FF31HHj h@A Y[ [ ?]]]]]qqqrr^]r?+/3++93333310#"&546325654&'&54632F23FE43E $DE4@PH3FF31HH*M8p "A69[f1@/?o/]q339933105 f)2gyygf@@$ Y@Y@ H/+]q+_^]+993310!5!5GGffffh!1@/?o/]q3399331075 5h)gg+2j9L"@ $#Y @ [  Y{$k$_$O$;$/$$ $$$$$$$$${$[$K$?$/$$ $h$$$$$$$$o$;$+$$$$$$$${$k$_$K$$ $$$$$$$$p$`$T$D$4$$$$$8$$$$$$p$@1@$ $$$$$$p$P$ $$$$/$$$^]]]]]qqqqqqqrrrrrrrr_rrr^]]]]]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqq?+3/?+_^]9/+93310#7>54&#"#563 #"&54632PVNjpR#B9ME34EF32F^Ny1+ 1HH13FEm{T>I@700D%)?I)JK,YFY"@Y_o """" 3Y >;YKKKKKKKKKKKK@K@KpK`KKKKKK^]]]]]qqrr^]]]]]qqqqqqr/+3?+99//_^]^]++3+999933339310#"$5! #"547#"&54>;232654!"3267'"3267PqAWCHO=o$&0r%%tpכ&Ȕ1iP8=n_X޾32KWYm[w{-#r%"SЫM_Y>4H_@   `Y _Y tdTD4$tdTD4$9tTD4$pP@0 pPO]]]]]]]]qqqqqqqqqq_qqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqq?3+333?339/3+.3939939910%!573!57!!Gɾ۪ɴ55555}hu;=&@ ""('%`Y%  `Y _Y`Y_Y(((p(`(@((((`(P(@( (((`(0( ((:(P((((((((p(P(@(]]]]]]qqqrrr^]]]]]]qqqqqqqrrrrrr?+?++9/_^]+9?+93333104&+3264&+32657'5! !%ۢee쑃T{p55vTL>@! _Y   _Y@]?+3/?3/_^]+993310 !2#'.# 326?3^XBF`r;%Ac@Zc3ۮ+/7.?;u= L@/  _Y`Y_Y`Y?@ p]]]qr^]?++?++993310!#32 !%#57'5xsf""{"55;}=n@F  `Y_ o -     `Y_Y `Y_YpP@]]]]]?++?++9/_^]_]]+93310?'5!#'&+!73#'!! ?3!;B pj@@P9B55d;)=@ `Y_o-  `Y _Y _Ytdt`TDtdT@0 9q_qrrrrr^]]]]]]]]]]]]]]qqqqqqqqrrrrrrr?+3?++9/_^]_]]+9333310!57'5!#'&+!73#'B p==Z555ѠdTL @ !" _Y _Y _Yv"f"F"&""""""""P"D"4"$""9""""""D"4"$"""p"`"@" "]]]]]_qqqqqqqqqr^]]]]]]]]]]_]]qqqq?+?+9/+39933310%# !2#'.# 3267'5!taUCEkT0F&4`C`]<15(}66;=@n   `Y ? O    _Y _Y4$:dDD4$pP]]]]_]qqqqqrrrrr^]]]]?2+333?3+3339/_^]+99333310357'5!!'5!!57!;w55555b5555Jb=  @ _Y_Y  p d T D         T D 4 $        p ` T D 0 $   ;    t d D 4       ` P 0       ]]]]qqqqqqqq_qqrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqrrrrrrrrr?+3?+3910%!57'5!謬P5555+=@x  `Y  _YO//<o? _]]qqqqqrrrr^]]]]]]qqqqqqqqrrrrr?+3?3/_^]+99210'5!#"'53325RgOBF*55†u;=@ _Y    _Y dT;tdD4dTD4 9@p@0 P]]]]qqqqqqqqq_rrr^]]]]]]]]]]]qqqqqqqqrrrrrrr?3+33?39+333933310 !!57'5!'5I6=Ӭ=5@"5;5555x5;h=8@   _Y _Y `Y tfVF&vfTF&vfTD2 9d4p@0 pP@]]]]]]]]qqqqqqqqq_rrrrrrrr^]]]_]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrrr?+3/_^]+?+399310!273!57'5!wd>A嬬<h55;=@   @6 H  _Y H _Y?]]]]]]?333+333?3+3+339+933333310!#!57'5! !!57^#75555b551;=W@0 _Y  _Y ?@ ]]qr^]?33+3?33+3399333310'5!#!57'5!ɬaŴ755555TsL 6@  _Y _Y?@ qq^]?+?+99331032#"! ! %DL"CA];!=@  `Y `Y_Y  _Y o/oO?/o_8/?^]]]]]]qqqqrr^]]]]]]qqqqqqqrrrrr?+3?++9/+99333104&+326!57'5! #ZbhN˟B555uTL $V@/  %& " ""_Y" _Y&?@& &qq^]?+?+33_^]]299339921032#"! 37#".'# %BN2X|n^B /g_;S=n@>    `Y  `Y _Y _Y  p @ ]]]r?3+33?++9/+3933339310!57'5!2! 4&+326՟Ck L555&5L}ÅL-Y@4''/.**_Y*_Y//////0/ /]]]]qrrr?3+?3+9999333310332654.54632#'&#"#"&'A#%X=c~~c=բA#f=cc=lUi/H~H^A-.8V]+Jm`AV=,/;[`&!%=<@     `Y _Y?_? kpOo_@0_0;_O0p_0 p?/]]]]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]qqqqqqqqqqqrrrrrrrr^]]]]]]]]qq?+3?+33/_^]39310!57#"#!#'.+;3]CDx15; k5+=@`    _Y `Y ?dTD4$t4$pP]]]]]_]]qqqqqqqqqrrrrrr^]?+?3+333993310'5!# $5'5!!265ɬc55455=@    _Y _O?p@;`P@0 pP@0 ]]]]]]]]]]]]]qqqrrrrrrr^]]]]]]qqqqqqrr?3?3+3339333310#'5! '53ߗ=5 55%5=O@   H  _Y @ H dVfVF6&ipdpdT@4$P@09pO/]]]]]]]qqqqqrrrrrr^]]_]]]]]]]qqqqqqqqqqqqrr_rrrrr^]]]]]]]]]]]qqqq?3333+3?3+3333/3/3+993310# #'5! 3 '5!^55Du?i-\0ud 55O^55-=@l  _Y  _Y_O?p@;@ p`]]]]]]]qqqr^]]]]]]qqqqqqrr?3+333?39+3339910%!57 '5! '5! !57=J{)7͘תP55^@55b55 X55=o@E  _Y _Y?P@P pP@0]]]]]]]qqqrr^]?+3?39+3339310!57'5! '5!F)7n@5555k55bs= @    _Y `YpdTD4$tTpP0 90 p@ pP?]]]]]]]]]]qqqqqqqqqrrrrrr^]]]]]]]]]]]]]_qqqqqqqqrrrrrrrrrrr?3+3?3+3933107#"#!!2673!b]E "t1;F ^=Vm `@ YY; +    K ; +   i  [ K    k [ ; +        P  9   @   ]]qqrr^]]]]]]_]qqqqqqqqqrrrr^]]]]]]]]qq/+?+993310!)/))/9F@tTD4dPD4$p`P@09`P@ p`0 ]]qqqqqqqqqrrrrrrrr^]]]]]]]]]]]]q_qqqqqqqqqqqqqrrrrrrrrr??9933103#bdFJ@ YY@     O  i    _ O    o _ ? /         P  9 `  @   ]]qqrr^]]]]]]]]qqqqqqqrrrrrrrr^]]]]]]q/+?+9933105%%5!J)/))/a=I@+N `P]]]]]]q^]?2/393333103# #1gf=H)^@ Y/+33105! ffw_@[/p`P@ P@0 p`08P@0 p`/^]]]]]]]qqqqqqrrrr^]]]]]]]]]]qqqqqqqqqqrrrrrrrrrrr/^]+993310 53_ %!Hq%m@?%% '&%" "QYPY  PYPY'_'@'']qrr?+?+?39/_^]+9+393333102!'#"4>?54&#"#563267њurIGJdS"8_Dc2~-^r^{Aa\/u#^n @Q PYQY PY@9`@` ]]]]qqqqqqqrr^]]r?+?+33?+99333104&#"326'5!632#"&';tTu|/dVN .-6N&NN`@< PY QY>@0 @_]]qqqqqrrrr^]?+3?3+993310%# 4632#'&# 327N1Z7ه7+Stl9$)/hԵ!J@O PY PYPYQYGP@0 @` ]]]]qqqrrrrr^]?+33?+?+?+99333310%# 432&='5!!327&# qloDtqZYrFZ!--;'PF@ZPY  PY QY p`P>P@0 qqqrrrrr^]]]]]]]]]?+?+9/_^]+993333103267#"&463 "!4&=g600Vοiho\P 8.fR?6@ PYPYPY td+kdK[+tTD:td4$p@ p]]]]qqqqqqqqq_rrrrrrrrrrr^]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]]]]qq?3+?3+3?+3933310#5754632#'&#"3#!57ᢢMB1-"0?4X1'B{pT!--!XF'4@@,//>8( &# AB5PY++ &#   ;PY 2PYBBBBtBdBTBDB4B$BBBBBBBBBBtBdBTBDB$BBBBBBBBBBBdBDB4B$BBB9BBBBBBdBTBDB4B$BBBBBBBtBdBTB@B4B BBBB@"BBBBBBBpB`B0B B]]]]]]]]]]]]qq_qqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrr?+?+99//933+9333333310#"'3!2#"&5467.57&5463274&#!3262654&#"f¶RF?H6uH`9Nú%t#C)FG*5|m[^hib`tiUvm5gE\5Jٚ o+Kl9@$o0VK|u}qrx@y   PY PY RY9p`P@0 p`@p`]]]]]]]qqqqqrrrrrrrrrr^]]]]q?+33?3+333?+99333310>32!574#"!57'5!FH?z|rk}^dw2h.)<--^---+L @f  SY@PY PY9p`P@P p`P@]]]]]]]qqqqqqqrrrr_rr^]]?+3?+_^]+933310#"&54632!57'5!{@-,@@,-@ +,@@,-@@:-- -LL @  SY@PYPY mK;+ {[K4{ ;p`P 0 p`P^]]]]]qqqqqqrrrrr_r^]]]]]]qqqqqqrrrrrrr^]]]]?3+?+_^]+9333310#"&54632#"'533265'5!@,-@@-,@ >S/!2;<3,@@,-@@m~-'@M @` @P=0P`PpY]HMUH59H@"+1HPY PY PY?+3?39+333?+++++_^]qr^]qr9333339310 '5! !57!57'5!XbLuXfV{dw1-------) @p PY PY      t d $   9   p ` P @    P      p ` P @ ]]]]]]]qqqqqqrrrr_rrr^]]]]]]]]]]]?+3?+910%!57'5!oFF---+1@ !((--! 321.PY1(! -+-PY+ RY '%RYv3V363$333333333b3P3D303$333h3333t3@343$33333333d3P3D343$333333333k3;3 3338333`3T3@343333333t@+3T3@343333333p3P333^]]]]]]_]]qqqqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrr^]]]]]]_]]]]]]]qqqqqq?+33?+33?33+33333?+93333310>32>32!574#"!574&#"!57'5!FK@EuMDyUEE?BUUXVww`+:49+B--X 6A--XSY-- -/@} PY PY RY9tdTD4$p`@p`]]]]]]]qqqqq_qrrrrrrrrrr^]]]]q?+33?3+333?+99333310>32!574&#"!57'5!DM:z|rk}QUZjqq `,9--XS_-- -N @ PYPY P0p`@ ;pP@0 `@`]qqqqqqqqrrrrrrrr^]]]]]]]]]]]]]qqqqrr?+?+993310!"&546324&#"326Hڴ~uwº!L!@Q  "#PY PY QYPY@###90####`#@###`#?#]]]]qqqqqr^]]r?+?3+3?+?+3993333310'5!>32#"'!574&#"32k*Iqf@wd}uNYjf-7$,H)//N!JLx@I PY QY PY@   9P   ` @   `  ]]]]qqqqr^]]r?+3?+33?3+993333103!5747# 4323267&# -Fhq kpo+;sYr//aFS% )Q@-  PY PY _@qrr?+3?+?333_^]3992310#'"!57'5!>3+:22Bww <<nB-- -u2\T(Y@4! )* !PY PY*p*`*P* **_*O*]]]qqqqq?3+?3+9999333310#"&'533254/.54632#'&#"ӱF0-1Kx™Ye\2g/*5rQUMNZ?#Dz4!DcF|m/PD9N2.CV-G@'  PY  QY?/]]]r?+3?33+39922310"&5#5?33#327N`_{}e?;0:S#rg-'TABA@_   PYRY  PY 9@0 p`@p` ]]]]]]qqqqrrrrr^]]]]q?+?3+3?3+39933310327'5!!'#"'5!9|l3wG?x --L'9f-o@  PY  tdTD4$tdTD4$tdTD4$9tdTD4$tdTD0 p`]]_]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrr?33^]?3+333993310#'5! '5!-J}`\Zz--w--@  H  PY @ H TD$tD0$dT9T@0 `P@0 p_ ]]]]]]]qqqqqqrrrr_rrrr^]]]]]qqqqqqqqqrrrrr?3333+3?3+3333/3+993310# #'5!3'5!NJoT՚fhlz--e--@e   @adH$4Dd $D 9$d$!H@*H@0   PY   PY ?3+333?39+333_^]_]++qr^]qr+933333310%!57 !57 '5!'5! V}m5o}ЁRl5---M------.F@      PYQYtfVt`PB2$htfTF2"rbRD4&tbRD4&8r@WfTF2$tdPD4pO^]]]]]]]_]]qqqqqqqqqqqqr_rrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqq?2+?3+33333_^]3993310"'5332>7'5!'5!NL/!74XI7`^bA`tF`[MhXYgM[>'uu-&/mj_ajm/F@fVF6&vfVF6$itdP@4 p`T@0 `P@0 9pdTD4$p`P@@0@]]]]]]qqqqq_qqqrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrr_rr^]]]]]]]]]]]]]qqqqq??93103fFG"G@$  #$ YYY/+?+9/+999333310532654675.54&+532#>[MfZXhM[>lk}/mjNa^Jjm/-tvً9N4@ Y`@ Y 0]/+_^]+9910"'.#"#>3232673 jJa&MN ev8wKVS#ENg@jy?9m:?H1iLf @ @  P   @ [F6&p`PD4$9p`TD4dT@0 ]]]]qqq_qqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]_]]]]]]qqqqrrrr?+/_^]q9333104632#"&#3E44EF33F>^H1HH13FFQ= @   !" PY  QY  "`"P"@" """"""P"@" """"""@"0" "";"""P"@" """""@" """""""@""]]]]]]]qqqqqqqrrrrrr^]]]]]]]]qqqqqqqqrrrrrr??99//3+333/+39939333210%.546753#'&'327#Rw7+BZl#dRnw $ !<+yL%@o  "" &'@'`'' '@'`''''' '@'`';' '@'`'' '''''  sY sY %%vY?+9?3/_^]+9/3+3_^]qr^]qr93399310%!57654&'#53&54632#'&#"!!H!C8vwA#]dHWu@|}/b6R5Rm=YJ`F):@#*+ YP @&Y/+_^]qq+99331047'76327'#"''7&732654&#"{PkJhlllHmRRmHlgijHkP`ONxyMQgkJmRRmHmnljHkPPkHjiMPyyN=$@*#!  &%_Y"_Y _Y$ @ H @ #@ H_Y?+3?39/+9993+2+3+3+3933333333310!!575!5!5'!53'5!'5!3!udŃ{Ph R55R#Ro55k55RF@ t d T D 4      t d T D   h       t d T 0            t d P @ 0        p ` P @ 0    8     t d T D 4     p ` P @   @   P O /   ^]]]]]]]]]]qqqqq_qqqrrrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]qqqqq??99//93331033fff!l%nhm:H@_F7BB,?;;#44IJ,?F!!)PY$$!!/!?! ! PY@J JJ@J JJJJJ0J J]]]]]]qqrrr/3/]+/_^]]3/+99999393329910%#"&'5332654.5467.54632#'.#"4.'>JO%-'}2RhBj5Wj+B:)`F.A6< d?Ej @  Y(HhzjZK;+ {k]M=/ h}o[K;+ }m[K rbTD4&8@XtfTD6&P@0 /^]]]]]]]qqq_qqqqqqqqqr_rrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]_]]]]]]]]qqqqqqqq/^]3+3993310#"&54632#"&54632j8**::**88*)<>'*8*;>'*::**;<)*::XR8m@=)70#7#:95 2Y&-Y*&  / &&  & &  Y Y?+?+99//_^]^]3++399339933104$32#"$732$54$#""&54632#'&#"!2?3X=@F ⧧}s1Rv J1|Aü@ߥ "i30+Ry/*,:GRYS%> *USRWPo;z +%6*'uJT @    [fUE6&wfVF7'itdRB4$vfP@2"tdVB4$9tfT@PF6kTD0$t+_^]]]]]]]]qqqqqqqqqq_qqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrr_rrrr^]]]]]]]]]]]]]qqqqqqq?3+39933103#%3#uNQQOQQd{{dBd{{df @Y@?]+99310#!5gfL`/XR5>@{500!6-411-;!!&&@?1&!$!Y4$0 ; Y':):Y$$ $$$$$$$)) $;));$  Y Y@@@0@@@@@@`@qqqq^]]]q?+?+9///_^]^]]qr+3+33+339933933993393104$32#"$732$54$#"!57'5!2#74&+326X=@F ⧧r`hJZXTVs?Cj[Aü@ߥ "++)sjMp+]YIJ @ Y/]+3310!5!#^bR@ Y    @YtDp`P@0@p`0p`P@0 ]qqqqqqqqqrrrrrrrr^]]]]]]]]_]]qqqqqqqqqqr?+_^]]q+9933104>32#"&732654&#"bRSSTURf{UXyyXU{STSTTQYyzXYzyU 1@  YY ?3+3/+933310#!5!3!!5dgXgGuVfVfffD7F>@   YY?+3?+3/999333310!57>54#"#5632!7 nd['=57nP[y`d[q{Q!bodai+ ?F(@'$$)*'YO_o  !!!Y! Y**********t*d*D*4**B*******p*`*P* ******]]]qqqqq_qqqrrrrr^]]]]]]]]qqqqqqq?3/^]+?+3/9/_^]]+993999310#"/332654&/57>54&#"#5632?in7H%`PHZVVD9;P@17oMb[j~p IaNKAENM>fg`Kj_5@[ )fV6&vfF6hvVFV6&rbP@0 8p`P@4$TD0 @#p`/^]]]]]]]]]qq_qqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]_]]]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqq/^]+93331053_!%BLY@O  ! PY  PY@??RY !!!p!`! !]_]]]]r?3+3_^]]??3+3?+99333333310%#"'#565'5!3267'5!!0[z9w="2o`363yS:N-Cw!-tWi0'--=@w    sY pP0``@ 9pPO/?]]qqqqrrrrrrrr^]]]]]]]]qqqqqrrrr/3?+399/9939310###"&5463!+^^  7ӻ5- @  [ /+9310#"&54632F33FE44E3FF31HHL@ @H  rbTB0 rdTB4$rbRD2"9p`TD0tdT@4@#$p`P]]]_]]]]]qqqqqqqqqqqqqqqqrrrrrrrrr_rrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrr/^]3/+9/39939910#"'532654&'73lL>L<6PH)V[g\nJ ;-1>R XBB '@ @ Y?+3?39310!57573w%HV11q:/%VR @ Y@ H @ Y ?/?loO?@?;`_/`0]]]]]]qqqrrrrrr^]]]]qqqqqqqrrrrrrr^]]]]]]]]]qqqq?+_^]+]+993310#"&546324&#"326VJRMFGLRJ-kfimRJT @    [ fUE6&wfVF7'itdRB4$vfP@2"tdVB4$9tfT@PF6kTD0$t+_^]]]]]]]]qqqqqqqqqq_qqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrr_rrrr^]]]]]]]]]]]]]qqqqqqq?3+3993310 #3#3QQNgQQOBBrB'T&{ѵ@__H^^H]]H@ZZH@TTH@SSH@RRH@KKH@HHH@ FFH@??H@ ::H@33H11H@ ..H@''H&&H%%H@ ""H@H@ H@H@H0@p?55].5+++++++++++++++++++++++BB'T&{t{@0p?5].5JUF'T&u%@ _ p0@.?55]].5].5TX#"@$#Y @ [  YI$9$)$$$$y$i$V$)$$ $i$$$y$i$Y$F$ $$$$$Y$I$9$&$$$$$$$$v$b$P$@$4$$$$8$$$$$$$$t$@$4$$$$$$$$$$t$T$ $$$$$@$`$P$/$$$^]]]]]]]]qq_qqqqqqqqrrrrrrrrrrrrrr^]]]]]_]]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]qqq/+3/?+9/_^]+99399333310332?3# 46?4632#"&PVNlpR#BX:NE42GH13FFx1+T 1HG24EF&$CDN&%+5+5&$vN@ &I%+5+5&$yN&%+5+5&$wN&(%+5+5{&$jm&%%+55+55&$~(%+55?55=#&@&%% ! ! (' ##`Y#_Y#`Y$`Yo=&$$$ % `Y  _Y   _YV(F(6(&(((((((((((v(f(R(D(4($(((j(((((((p(d(P(D(0($((((((((((d(0( (((((@s((t(d(P(D(4($(((9((((k(K(;(+((((((((P(@(((((((P(?(((^]]]]]]]]]qq_qqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrr_rrrrr^]]]]]]]]]]]]]]]]qqqqqq?+3?+3/_^]+399//_^]]]]+3+3?++3/993933999910%7!!57'5!#'&+!73#'!3 ?3!ۘdϞnA!pԉ@@P:A75}555d-^TLL&&z `!%+5;}&(CN@ & %+5+5;}&(v:N@ &F%+5+5;}&(N@ & %+5+5;}{&(j'm@ &.%+55+556b&,CN & %+5+5Jj&,v5N@  &G %+5+5&,N@  & %+5+5?j{&,jm& %+55+555u=@     ! _Y?o`Y_Y _Y`Y!!!!!?!/!!!!_!0!!8!/!!!!!O!0!!!!!!/!!^]]]]]]qqqqqqqrr^]]]]]qqqqqqrr?+?+?++9/_^]3+399333910 !%#57#53'5!32!#w{ xϢ=5%R'5R/!$;&1N@ &) %+5+5Ts&2CoN&ϴ %+5+5Ts&2vN@ &\ %+5+5Ts&2N@ & %+5+5Ts&2N&!, %+5+5Ts{&2jm&) %+55+55J '@  //]q933310 ' 7  BGXJVZGXG`HZVJXHHTso"v@/  #$  _Y@ H _Y@ H@$q?3/++?3/++9_^]]99339910! 73! '#7&&#"4'32T{sywAl}@8jqͲnͰZa"+&8CsN&Ӵ%+5+5+&8vN@ &u%+5+5+&8N@ &%+5+5+{&8jm@ &+%+55+55&<vN@ &x %+5+5H!=@  _Y_Y_Y/_Yo/oO?/o_/8O/_/^]]]]]]]qqqqqqrrrrrrr^]]]]]]]]qqqqqqqrrrrr?+3?99//_^]+++3993333104&+326 +!57'5!Zbh闬 l>uּ55551@"", ', ,32@""""//%PY//(+PY(PY3_3@33_3?3 333?33393`33333@3333 3]]]]qqqqqrr^]]]]]qqqqrrr?3/+?+?_^]+9/_^]9999339933310#"&'533254&'.54674&#"!574632m-_L1O[VT>"-!O3QWSU~|VkΌ $B:Io@=h^&Qx;9cl-߼Hq&DCG'* %+5Hq&Dv F&) %+5Hq&D}&* %+5Hqd&Ds0; %+5Hq&DjsP88& %+]55Hq&D,& %+55H*6=@[5$1:-11;;**>?:PY:: ::& &7PY&$"PY1PY--+ "+QY QY P?/?]r?+?+?9/_^]93++39/?+9/_^]+9933933933103267#"'#"4>?54&#"#563263227.="!4&3kX602S\IGJdS"8{FXks __WhWZ|t; 8 -^{Aa\/u#JNRD`0^nNLN&Fz 3%+5PF&HCy!%+5PF&Hv  %+5PF&H !%+5PF&Hj} /%+55&C Ĵ %+]5+#&v 8 %+5`& %+5%&j %+55N&d@4 ! !  '( PY$PY?33/?+9/3+9/9993393299107&'5%!"&54632&'4&#"326gt —HmX0~vwNJ$N,Y^sz#0#ȳӮ/d&Q'2%+5N&RCƴ%+5N&Rv `%+5N&R%+5Nd&R!,%+5N&Rj)%+55U F@% @@ Y0  ?]+3/_^]99933310#"&54632#"&54632!58()88)(88()88)(8}G'(88((88(88((88ffF"q@6    #$ PY @H PY@ H$r?3/++?3/+9+99939322910!"'#7&46327&#"4'326{uHaVlwܕeT>|uk32#"'!57y}uNYj|z/*Iqf@wø!>-8$,H)//F&\j / %+550&$N&%+5+5Hq&D|&( %+5&${N&+5Hqw&Dr )1%+5mH&$I@oO ]]]]]5Hm&D ))%%%+5T&&vN!&+5NN&Fv@ p`l%+]]5T&&N@ !&k %+5+5NN&F 2%+5T&&N@ &d"%+5+5NNL&F D%+5T&&N@!&`$h$%+]5+5NN&F@ 8%+]5;u&'N&  %+5+5J&GQW2))H2((H2''H2&&H2%%H2$$H2##H2@ H"c""%+]5++++++++5u= !H+J%w@C  !!&'PY  PYPY$PY !@QY ']?+3?_^]+?+9/3+3?+99339210%# 432&=!5!5'5!3#!327&# qloDtqZYrFZ!qT-T-;';}0&(N@ &%+5+5PF&H %+5;}&(N@ &'%+5+5PFw&H  (%+5;}&($N@ &"%+5+5PFL&H #%+5;m}=&(Y ++%+5PmF&H& ,,%+5;}&(%N!&$%+5+5PF&H % %+5T&*N@ &&!%%+5+5XF&J AE%+5T&*N@ !&@!!]5+5XFw&JT&*N@ $&'!%+5+5XFL&J GA%+5TLL&*U  $!%+5XF&JQ ۴AD %+5;&+N@ !& %+5+5&Kv?HHHH@ H&" %+5++++++5;=#'@,'  ' !!$())D)4)D))))@]:=H)P)p)))&&& _Y& &     '@' `Y''    H _Y !_Y?2+333?3++3339/+2_^]]2]]+3_^]3]]_]+qr9933333333]]]10357#535'5!!5'5!3#!57!5!;w5mR5555R5555%ӹ @! H!  &'' ''E0'''''@+0H'''' '''"H'@ H PY@4 H $ """ H$"PY$  PY RY   ?]+33?3+333?++_^]9/3++3++_^]qq+r^]9933333+10!!>32!574#"!57#535'5!FH?z|rk}^dw2Tbh.)<--^--T-&,N@  &!%+5+5bd& %+50&,N & %+5+5X&  %+56t&,N &%+5+5=w&  %+5Jmb=&,L :%+5+mL&L .% %+5Jb&,N@ &  %+5+5+ @W PY PY  9  p ` P @    P       p ` P @ ]]]]]]]qqqqqqqrrrr_rr^]]?+3?+9310%!57'5!q+F-- -J=&,-" H ]5++LL&LM2c5H5H5H5H5H5H5@ H/p//@ H/]55+]]55++++++++<&-N@ &%+5+5La@  Y[@PY PY mK;+ {[K4{ ;p`P 0 p`P^]]]]]qqqqqqqrrrrr_r^]]]]]]qqqqqqrrrrrrr^]]]]?3+?+2++9333310#"'533265'5!%53#%>S/!2;<3Z8'm~-!!;L=&.]  %+5'L&N_  %+5'k@; 0P PY PY PY?+3?39+333?+_^]q99333939310 '5! !57!57'5!XbLuXfV{dw1------!-;h&/vN&@ 6> %++5+5)0&Ovv &+5;Lh=&/  %+5)L&Ou  %+5;h=&/$@ H5%+5+G&OQ&HH@ H] %+5+++;h=&/)&O H++h=f@9      _Y `Y_Yp]?+3?+3/+99//_^]9]933107'5!%!273!57+<3d>A嬼m{55^5n/@   PY   PYtd$9p`P@Pp`P@]]]]]]]qqqqqqrrrr_rrr^]]]]]]]]]]]?+?99//_^]9+3933333107'5!7!57Fg-@p^p--h;&1vN@ &v%+5+5/&Qv;L=&1.  %+5/L&QT  %+5;&1N&%+5+5/&Q'QN;:/H! H!@H@H@H H++++5+5+;G&Z@1 && '($`YRY  _Y _Y ?+3?+?3_^]+3?3+993923104&#"!57'5!6$32#"'53325BvVq第ku gRgOBF*<9555BTu/LA#g@; $%p%%%%/%O%  RY PYPY PY?3+?+3?+?+33_^]]99392310#"'5332654#"!57'5!>32A>S/!2;>H+@ ;;H+@88H+@ 77H+@55H+@44H+@11H+@..H+@--H+,,H+((H+''H+@ $$H+@!!H+@ H+@H+H+H+H+@ H+@H+@ H+@H+H+@H+@ H+@ H+@ H+@ H$@H$@ H$++5++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L-&Wz-@22H-@ H-@ H-@ H++++%&7N&+5G&Wj  %+5%=)@ ??_ kpO_o0@_0;O_0p_ 0p/?    `Y_Y _Y?+3?9/3+3+33_^]3_]]]]]]]qqqqqrrrrrr^]]]]qqqqqqqrrrrrr^]]]]q933310!57!5!#"#!#'.+!!;A3]CDx1D5%R ; R5-q@A         PYPYo @ H @ QY?2+3?3+_^]]2+3+3_^]]r993333310"&5#53#5?33#3#327N`_xx{}e?;0:S#rg,T-'TTABA+&8N@ &$#.%+5+5d&X !, %+5+0&8N@ &%+5+5&X  %+5+&8N@ &*$%+5+5w&X " %+5+&8N &@ 6. %++55+55&X %+55+&8N@$&P]]55+55&X   %+55+h=&8.  %+5m&X  %+5&:N@ &$%+5+5&Z "%+5&<N@ & %+5+5F&\ ! %+5{&<jm@ &' %+55+55bs&=vfN@ &f%+5+57T&]v 3 %+5bs&=N@ & %+5+57TL&]y@  %+]5bs&=!N@ & %+5+57T&]s %+516@   PY PY?+3?3+_^]93310%!574632#'&#"b,LC1-"0?4N!--!{p%W@- !!&'#PYPY  QY OY?+?+339/3+3?+993333310'5!!!632#"&'#534&#"326/+dVNu;tTu|H-T6N&'TD %=-a@2+(!( (./$`Y+  `Y !!$_Y?3+3?99//_^]+9+3999332239104&+3264&+3267!%!57#"#63! pۢeT6Ob2C_쑃{p5-;y 1v;!=R@,      `Y  _Y `Y _Y?++?+39/+_^]993339102#!57'5!#'.+4&+326? A9)Nhb齸55 ~= "M@'   #$ PY QY  PY?+?+?+3333993339104&#"3267#"&'!#'.+632;tTu|VN A9)Nd &  6N$T=9@  `Y  `Y_Y?++?9/+99333310#!57'5%3324&+326TԬE?ȡo5T?~ B@!   PYQY??+33?+33993333104&#"326'573632#"&';tTu|2dVN Ю16N&qL.@ _Y _Y?+3?3+993310 !"'33 #"#6PFlBF`r;%AL3%+/.=$47.;?T<j)=@ "*+'`Y#_Y _Y?+3?3++9933310#'.# 326?3# !2>32#'.#"BF`r;%A^XuOBF*+/7.?c@Zc NZ#@@   $% PYPY QY?+?3/++?9933310#'&# 327# 4632>32#'&#"77+Stl1Z7bgsnLC1-"0?4/hԵ!<$){p5u=57= B@" _Y`Y  `Y?+3?9/3++39933310!#32#"#63! !%#57fxC6Ob2C_sf""{"k-;y 15C\=E@%   `Y`Y  _Y `Y ?++?39/++399339210;#"!"&546;#"#! QP&9A k~5 55bD= !Q@)   "#PYPY QY OY ?+?+3?++3/993339210327&# !'# 432&=#"#!qZYr qloy\Ct;'FZ! ?Gi -D@#($$+./((!PY PY?+?+99393339910#"/332654&/.54632">54&⺠`i /00VY\EJi㿳ժlWpq]l'tl{ ni'IB3[4Ic˧4Q|𣕖M-f=<@ `Y `Y?+3?9/3+393310)3)!#3!#"#!B9P@@jm Bb# A5bTtLK@* @ `Y_Y_Y?+?+9/+_^]r933310"#63 ! 7!&2!`FBZWI/+%3^UJ=&0]M*[@2 %%+,_Y-  %(( _Y( _Y ?3+?+39/_^]_]+99993210467.54632#'.#"326?3#"$]ӔB!%x7}it5)+B m+} R+wE)= Z@5 !" `Y_o- _Y`Y`Y?3/+?++9/_^]_]]+933310#'&+!73#'!#"'53325'5!)B p==uRiOBF*Ѡdt5}R`@7 PYPYP `  `@]]]]q?3/]+/39/993+393333310#?>32#'&#"3#ۉ [?/!7.;%2"衷`4e~T%TPj-Q@*!'./-(*(_Y** `Y _Y $_Y?+?3++9/+3933310%# !2>32#'.#"#'.# 3267'5!taUvOBF*CEkT0F&4`C`]%15(}66E=>@    _Y `Y?+?39+333993310'>7'5! '5&'.QH B1> :+=5w b55%5br>))N@) "''*+%#OY%RYOY  OY ?3+33?+?+?+993932310"&54#"!57'5!>323265'5!7^dw2H?z|mWWm3---ih.)<]^tt^Y-U$@ _Y `Y?+?+99310"&5'5!327XVdF1/#@jrg-I32#'.#"'5! !ӬQbkZB@#>I6=O55>u`^+55@"5;#\@0   ! !$%OY PY!  OY?3+333?+?9+399993332310!57!574632#'&#"'5! V{dwLC1-"0?4bLuXf---{p}---!B@!  PY  OY OY?+3?+9/3+3933310!57#53'5!3oF--[TS-hT6>@    QY?3?+99//99933310!#5'5&#"#56327"6F_(1EOWm+JB"^b!Nr, Sfsr0, -j=1O@'! ''. .23-(   _Y*.$ bY11 ?33/+33?33+33333993393210%#"&'#"'5!3267&5'5!3267'5!!+W>H{UDΌKV$2؋VU+%΁L/649-@55 SY 6A55 SY o55b5hE=D@" _Y _Y ?3?3+?33+33993333310'5!##"&'533265'5!ɬaŗ-vF>$32!574&#"!57'5!DM:z|rk}QUZjqq `,9--S_-- -TsL ]@5@ _YL?  _Y_Y?+?+9/_^]_]+_^]r99333310! ! 2!"! TDL { ]6T &U@/!  '(@((( (_Y $_Y _Y?+?+9/+_^]r99993333210! ! 654&'&5463232#" 4f%DD5=Rj]W7A #@69W@"CANQ&E@#!  '(OY PY $PY?+?+9/+99993333210!"&5463 654&'&546324&#"326Q!H g\%DD5=R~uwj`4> #@69WºJE<LL@)   `Y_Y _Y _Y?+3?3+3?+?+933310!57## !! 3267&aUxS+55NcZbA`]A)fNL[!F@%  "#PY PY PYOY?+3?+?+?+9939321057#!"&546323!265&#"́H/}}5hnuwL/ /|==F@$  !`Y`Y_Y?+3?99//++3993333104&+326 +!57#"#63$bh˟6Ob2C_;uB55-;y 1!L ,R@+,!!&&-.*PY*!&$&OY$PYQY?+33?+?+3?+9933339104&#"32#'&#">32#"'!574632}uNYj1-"0?4*Iqf@wMB!{pT$,H)//_;h="b@3 "  #$!_Y`Y"`Y""_Y?2+3?99//++3+39933333393104&+3262!#!57'5!r՟8Å&5k5555r|L,:@$,-.$_Y,'_Y?+3?+39993310%#"&54>7>54&#"#632326?3Tm2^opf#A=c~~c=W*#A3!&W|`CH'rQ`mJ+]V8.-A^H~F1A'7@"()&&PY& PY?+?+99993399104>7>54&#"#563232?3# A#A[OLUQr5*/g2]cYxK1-.I>WD.1M9DP/m|GcC!4zDPA=UE&?@ $ '(PY!PYPY?+?+9/+93333310#"&5#"&5463232?32654&#"BM154&'&546321cʹe[%DD5=Rv1455)5!T( #@69W([@/ # )*PYOY& RY OY?+?3+?3+39/+99333333310!'#"'5!327'5!>54&'&54632wG?x|l3WN%DD5=Rq3-L'9f-`- O% #@69Wj=)O@''!## *+"aY !!""_Y?+?39/333+3993399332210%2654&'!#'&+! 4?#"#!ܸ9B9PH  HP9B9AWe!!eJ+Q"7@   #$ _Y `Y?+?33+339933910 $5'5!!2654&#"#5632cD>:#LZk`g8455x^`@rL1@  _Y _Y ?+3?33+39910'&#"!57'5! >32!6:Z*)7.AZUQ:IH@5555m_Ff$@@!%&$&"QY" OY QY ?+?+39?+3339310#'&#"#"'53326?'5!>32f/' ,HW"$A`tKNL/!7Kv1`k.lW@oQU54&+5!"#5!327Au\FL8h/0?~}l1EN ::J?-O1$@P- tu}o!<$)ZL#O@)! $%  _Y!_YbY?+?+9/3+3939939910!!57>7!5!654&#"#63231˰(A,v5p+#B@ZADRl+vR*=#B@# !!$%_YvY_Y_Y?+?++9/+99993310"'332654&#"#'5!#'&+632 B-,{8~[K`MB pԡfi+J5T4E#G@' !!$%PYRYRYQYPY?+?+++9/+99993310"/332654&#"#'5!#'&+632@ t6sNJEB pgUWۃewr^r"@.%3@%'&%"%PY" PY ?3+?3+393310#"&'533254.'.=#5?33#O(CxbF0-1Kx)C}a{}e?.<)+/dD2B,+.a-'TEJ@'  OY QY OYOY?+?+?+33?+99333310!57'5!6325654&#"=?ЈjV+PNNE--ì4GZ1w#@X?93103#3bb@  ?32993310!#3#3bbbbs C@!  _Y _Y   ?99//3+33+393333310###535#5333#3bb TT8T=; :&''=N0&+5; &'']HJT&G'];=&/-;LlL&/M)L&OM9;=&1-;LPL&1M/LL&QM&$~N& %+5+5Hq&Dp,&.* %+5+5&,N@ & %+5+5e&@ &%+5+5Ts&2N@ &  %+5+5N&R@ &%+5+5+&8N&!%+5+5&X@ & %+5+5+!&8 -@,&%+555+555&X'j'@/@ H/`&&&&&&]]]qq55+5+&8 .&@4&1%+555+555r&X'jv+&8 /'@(&95%+555+555s&X'j@ 4@H4@ H4++5+&8 0'@.&1%+555+555r&X'jCrG=;@PY PY QY ?+?+9/+9939221054.#"5>32# 5265!=g600VϾihon\P 8.Rd!&$ -@ && %+555+555Hq&D&jss'@>@ H>`&&&&&&]]]qq55+5!&$ 1& %+55+55Hq&D&pr)&+50&N@ *&(*!%+5+5H&^@ A&?A*%+5+5TL(V@- ')*_Y'&!#!_Y## _Y _Y?+?+99//+33+39333310## !2#'.# 32675!5!5'5!3taUCEkT0 &4`C`]<15(T66F,8@G@L= 9? E "6!0D9))HI-PY=EPY?*==%RY=3PYAPY?+?3+?+9/33+339/3+999333333332239310#"&'#5367.57&546327#"'3!232654&#"4&#!!267!/Xj"t9Nú%t#C¶RF?H6)m[^hib`FG?N }jpqiTDR\5Jٚ o+Kt,Tg}qrx9@7OL>HBT&*N@ '&)%%+5+5XF&JG&ԴIE %+5+5;&.@N &"%+5+5'&Nv &ٴ" %+5+5TmsL%K@)  &'@'' ' #_Y `Y_Y?3++?+_^]r993993210"&547$! 32732#"vox;DL$GC<8DKmsfXOcJHKJO@.3"CANm%@#  &''''''''?'''@AJH?''' '@''''@%.HPY PY #PY?3++?++_^]qrr+r^]q993993210327#"&547.546324&#"326$GC<8Ddox;ڴ~uwF/NFJO@.sfWP ºTms0&N@ )&') %+5+5Nm&@ )&')%+5+5+E&yN@ && ($%+5+5!ES&Td@ &&($%+5+5LU&@ &o%+5+5; :=&'=; =&']JT&G]T&*vN@ &&G"%%+5+5XF&Jv@ F&XBE %+5+5; =&j@:&&!!'(`Y_Y?O    _Y _Y$?3+33?3+33399//_^]++9939332310!!57'5!!'5!3265'5!# 第w`dXkx|555555qau]Y-U"E3LJ@'  `Y aY _Y_Y?+?+?+33?+99333310!57'5!632564&#"kƪrh~E5Y5>am ;'&1Cn&ȴ%+5+5/&QCj"&" %+5+5&$'~vJ!@ (l,.%%+55+5?55Hq+&D'v@ U?A,&%,& %+55+5&v@N,&C'*!%+5+5H&v Z>A)%+5Ts&vN@ (&\#&%+5+5F&v a#& %+5&$N& %+55+55'q&Dq1&.+ %+55+55&$N& %+5+5Hqw&D@ 1&1) %+5+5;}&(N'&δ$!%+55+55PF&H(&%"%+55+55;}&(]N@ '&'%+5+5PFw&H@ (&( %+5+5&,N&Դ %+55+55:&&%+55+556t&,UN& %+5+5.w&& %+5+5Ts&2N"& %+55+55N&R"&%+55+55Ts&2N"&" %+5+5Nw&R"&"%+5+5;S&5N*&E'$ %+55+55&U &%+55+55;S&5gN*&*" %+5+5)w&Ut@  & %+5+5+&8N$&!%+55+55&X"& %+55+55+&8N@ $&#$%+5+5w&X @ "& " %+5+5LL&6nҴ2.'%+5TL&V-)%+5%L=&7']L-&WKE3L$A@! #! !#%&#  _Y?3?+993399933310%5,654&'5,54&#"#>3 3F\7,N7#BX'S!R$ʖ *R,պHME >@  !" PY?+?9333993931075>54&#"#6325$654'X^2P+7|P@#ug oD&@*¬2;&+"&$ %+5+5)&K@ $& &" %+5+5;L&GQ@*  bY_Y _Y _Y?+3?+3?+?+33993331057#"!57'5!>32܊第mOL5.h555L=ƺ5JE *5u@=+7!& 06700..RY3PY OY )PY&$QY?+33?+?+?+?9/33+33993333333310 432&='5!632#"'#67'5327&# 4&#"326loD,.evqa;1IapqZYrO;C4(A<*0!- lSNb9WcUΆ'o$5 MR.Hh#,r@$*&* &  -.`Y((`Y@ H #`Y $`Y ?++99//++93+99993332999910! $5467.5467! 4&' ! ˤqkfv9ShLjvZiY$n8/ꛔN)J@&$  *+!!PY 'PY?+?39/+93993933210!"&57&5467324'74&#"326Hqc)IlnI)cq}uv7@ZJ]**MM**\KZñͭbEh=4@  `Y_Y?+?+?933310654&#!5#"#!!2%|]E ʭ~ofP]^=VmmkIX7`.;@  PYPY?+?+3/933310>54&#!5#"#5!32KC8h/С|3\5NW-/1ggGS&$N& %+5+5HqL&Do)&,& %+5+5;L}=0n@?"**% //12")`Y_"o"-""" ""!!`Y*_Y _Y?+?3+3?+39/_^]_]]+99932310!#"'532654&'7!57'5!#'&+!73#'!! ?3[glL>L<6PH$B pj@@P9B@ XI\nJ ;-1>55dPLF)0W@.-  #.)#)12-PY-- &&*PY&PY QY ?+3?+?+9/+99393323103267##"'532654&'7.5463 "!4&=g600V [glL>L<6PH οiho\P 8., XI\nJ ;-1>xfRTs!&2 -@*& %+555+555N&R'j'@/@ H/`&&&&&&]]]qq55+5Ts!&2 2@ &%0 %+55+55N&R')@..@ H.@]]]qr5+]5Ts&2N@ & %+5+5N/&R@ &%+5+5Ts!&2 1@ & %+55+55N&R'&+50&<N@ &" %+5+5F&\@  & %+5+5)EQ@)!  ! RY OY PY?+??+9/+333393333310632#"'#67''5!4&#"326o&4evqa;1IaF;C4(A<*0W lSNb9Wc-U$5 MR./E'2w@?( 4#-#34&$OY&#!#OY--+ +RY !0PYRY?+33?+??9/33+33+3?+99333333310>32632#"'#67'4&#"!57'5!4&#"326DM:z|,.evqa;1IaQUZjqq ;C4(A<*0`,9 lSNb9WcAS_-- -6$5 MR.j$Z@. %&PY RY @ "PY?+??39/33+33+3993333310632#"'#67'#5?33#4&#"3265*0evqa;/Ia{}e?;C..z*0O lSNb5ZdT-'T1$5 .L&@ OY PY?3+?+93310#"'533265'5!>S/!2;<3'm~-J&2j@9.."" ' 34*QYOY#PY %PY  QY0PY?+?+?+?+99//?+?+99393333210#"&'# 432&='5!632327&# 4&#"326XOfloDdHYrD;t~K|.M!-6N} JL!,6@E"(( 3 -780QY)PY+PY%QY OY 3OY5PY?+?+?+3?+?+?+99//?+993933333210#"'!5747# 43273>323267&# 4&#"32qf6 kpoZF+J;sYr3}uNYjH)//aFS+^!) n!s$}@C!! %&`Y"  bY  _Y  ?3+333??+99//9993+39333993310)57!##7#5733 3'7ɴqCcCɾ`cWx}Y`5s5hh5-rkuVZ"T (@J! $#)*`Y#bY## $`Y `Y  &_Y _Y?+?+?++9/////++999393929310"'#7&5!273#'&'326?3&# P[a^XbxDaKB+8pr;%A" YO:S&Zc ۮN7.?Ƙ*=d)h=K@& _Y_Y    _Y ?+3?99//3+3+39933310!!!273!57#53'5!w|d>A嬾<T5IT5%u@<      !_Y  `Y ?3+33333?9///3+399939933329910##"#!733#/!57#&c3]C=c=rDR1P@;^^ _55xXTE9V@+2%+%%:;,,((/PY(  RYPY?+?+9/?+99//99992233310+32673#"&'./533254/.54632#'&#"ӱ*+5).2-0b-??.i-1Kx™Ye\2g/*5rQUMNZ?#)eX;. feW Dz4!DcF|m/PD9N2.CV7E"H@$   #$RY PY  PY?+?+9/?+9/9999231035#"#5!32673#".'.#78h/5O>;;%.2-05!"#W螃#BZH755 bQ):@    PYOY?+3?+9/99393103577654&#"#5632:{zpR#B-? &tm1+{#-6=%.@J +#&  /0/_Y#+"+"`Y+ ++ *`Y _Y _Y?2+3?++99//_^]]+93+3_^]9993322339103575#53'5! !%32654&+!4&+326;e쑃TmVۢ5T\5v>T{p+=$U@+  %&  _Y _Y !`Y?+?39/33+33+3339933333310# $=#53'5!!'5!3)!265ɬcT5555THN;}"'*@M(#%   !!+,%' '`Y*#*`Y_#o#-### ## _Y (_Y?3+333?+39/_^]_]]3+3+339993332323310!#7#57'5!733#/373#'#! ?33'#7#N;[:-CaC`B -l@@P9B>uu}}55dAdPF$)-@I)!%%'(-",# #"('*./)!)PY-!! !!'QY,##PY  ?33+33?3+39/_^]3+39933933333323310%.546323!3267#"'#"3&#%4'a^ο>4wV{B`600VSHwVOhol#@e(U2ݳ VYR$ 8.Ϩ8RY&PN+=E@# _Y_Y`Y ?3/+?9/3+3+39333310##"'53325#53'5!3RgOBF*uT55LL%P@) &'#SYPYOY PY?3+?+9/3+3+933333310#"'533265#53'5!3#"&54632@Q/!2;<3@,-@@-,@m~TX-bT%,@@,-@@TEOL 'B@"' !() ##`Y#_Y_Y?+?+??+3993333310"3267&# !273326?3#".5DEzy[Q3*FBOhQ%L41Ac@Wf%vΆJE %L@& &' PYQY% !PY ?+3?+33?+9933333103267&# #"&547# 4327332?3;sYrQ@ kpoZF<;2!/ӿ `FS+ƌ~m;S="e@4 #$ `Y  `Y _Y _Y?+33?++9/3+33?999333322310!57#53'5!2! 4&+326՟Ck L55ZH5&5L}Å)R@)  PY  OY OY?+3?+9/3+3?33399333310!57#53'5!>;#'"3FBwwww <<+:22--fTf-u2\nT= K@& !"_Y  _Y _Y?+3?39/933+33+3339310!!57!5!/5!!7'5!!!~7{uw g<@55T5555[QF%(U@+"")*"OY(PY#& QY?3+?39/9933+33+3339993310#"'53326?#53/5!!7'5!3!A`tKNL/!7Iv3a`[@Y^b_?~$J`wH.T----TQE%V@,   &'% "QY OYOYPY?+?+9/+?+333999323310"&5'5!63232?37>54#"urRGJdS"8aDc2~{-^rey;a\/u#anJG@$  PY QYOY?+?+33?3+?99333310%!'# 432534&#"3267vϸVz,nsoaoIz<--l 7>\з26HG@$ PY QYOY?+?+33?3+?993333105!63 #"&'#324&#"Hv]ϸVz,naoIz<-l'7>\fP26 &?@ "  '(""$$QY$PY PY?+?+?+3399333104&#"3267#"&'4632#'&#"632;tTu|VNMB1-"0?4d &{pq`N??.@ PY QY?+3?3+993310>3 #"'33 4&#"?.\ه7+St D,x#*/ԵHf(X@1  )*"RY/  PY $&QY?+3333?3+9/_^]+93310"'#67&54632#'&# 63274&#"326x)I8Eه7+St XhinSlspT[mt/cX;mzbn|332# 5265!=g600VϾihon\P 8.RdP&/g@6$$1) '' 01) !PY( PY !  !  QY ,PY ?+?+9////+3+3993333339310"&5#"&5&#"5>32>7327%'32658es.Ͼ02600V*7X7?VA(sp]^joz[nǿ' 8.ok ?ql|'Jc5\ҥO!g; -]@2 $""$ ((./$ QY    ++QY+PY?+3?+39/_^]+999393310732654&'+532>54&#"#'632#"';]AwHED 08Cmd/`90ѸgyĶωjXGd `\EPYq$p=}[Z;?k@;$272,  @=A:PYQY2OY:22: ,//'PY/ QY ?+3?+39///++9+39999333310"&5#"'532654&'+532>54&#"#'632>7327es3gyĶω]AwHED 08Cmd/`90 X9=VA(szf3}[ZAjXGd `\EPYq$se ( ?uh|'JcDF.H@%"+ %+%/0!QY((RY(RY?+?+9/+999393210"32654&'#532>54&'2#"&54>dWXcrvk3p yjtoSWkh%NlmMPD;S  ` M:DNOp wVuE]E@# PYPY PY?+3?9/3+3+39933310%##"'5332=#53'5!3]RgOBF*ʬH?uT55?JE'4W@.2+! 5'6'$$PY$/PY +(QY PY ?3+?+33?3+?+339333310'&#"#"'3326=# 432546322674&#"e-"0?4u7+%d+pyϸVz,LC8E{?nsoa{pq 7>.9AзJEs (M@' & )*'&##PY#QYPY?3+?+33?+3?999333210%2674&#"#"'3326=# 43273E{?nsoau7+%d+pyϸVz,N.9AзSq 7>\;B@!  OYPY OY?+?3+9/+39933910%#"&54632#'&#"3267'5!Gۓ>S0bsqX-A-?--E>@     OY PY?+?39+333993310%'>7'5! '5!&'STE=0L`\Z=$-oa OX--}--5tQ$<@   OY  PY?+3?39+3993310'67&'5!6737&'{iy*jG\j xQe:S̥ -zLH@% OY OY RY?+33?3+333?+993331047#"&5'5!3267'5!!R32P}^dwLC1-"0?4H?z|r-^--{pRh.)<-)Ls/Q@*# --01&)) RY) PYOYPY?+?9/+3?3+?+39933310"'5332654#"!574632#'&#">32J@Q/!2;<^dwLC1-"0?4H?z|Lm~--{pRh.)<)&LP@) SY  PY  OY OY?+3?+9/3+3+93333310!57#53'5!3#"&54632q+@-,@@,-@--fTf-TT3,@@,-@@-kV +@ OYOY?+3?+39310%!57'5!qrsuurF-- -- X@ !QY@ H@ QYOYOY?+3?+9/+3+2+933310'!57&#"#>3'5!32673!$/QIF! $/OX--p)7\f -A*4_b)V@, PY PY  OY OY?+3?+99//+3+3993333310357"&5463'5!3#5)@``@Fj.!!.-^DD^-Q9-"./)L(@OY PY?+3?+39310"&5'5!32?3򒗠F<;2!/QLo-~m)E>&d@5$&&'(OY$$PY$" OY"OY QY?+?+3?+?+9/+3933932310!"&'53265!#5!"!57'5!!蔜7\/*IFL8hF#֨H*#< _----1 0Q@(  - -12-0,'  OY)# RY ?333+3?33+33333?399933210%#"&'#"'5!3267&5'5!3267'5!!W;EuMDy$5UU),wwL0549+Bj-- 6Aj--SY --- L0Y@.!' . .12-(   OY*$ RY .OY?+?3+3?33+333339993333210#"&'#"'5!3267&5'5!3267'5!R9EuMDy$5UU),wwL-749+Bj-- 6Aj--SY --,-+L9e@5+!!1 &7&7:; .RY1++4.)'OY)!&$&OY$PY?+3?3+3?+?333+39993332310"'5332654#"!574&#"!57'5!>32>32w@Q/!2;<EE?BUUXVwwK@EuMDLm~ 6A--XSY-- -L+:49+B)L$L@( ""%&RYOY PY "OY?+3?+3?+?3+99333310!574&#"#"'533265'5!>32L}QUZ@Q/!2;3232?3QUZjqq M:z|<;2!/QLS_-- -L,9~mD@" OY  OY ?3?+3?33+3399333310'5!#!57'5! |Yvazvv5f--1-- -|NE(R@-&  )*PYPY#OYOYPY?++?+?+9/+99933210!"&5463!#'&+373#'#32?3%7&#"7=d77W-7 LX!7np F׺K,@@ #*#*-. &&PY& PY ?3+3?+99/99933210%2654.#"3267'&=3"'##"&5!2_loĄnlZOf &#II3& Eln݉vm65447Y NL%a@2#&' OY "PY#PYOY?+3?3+3?3+3?+399393333321057.5%'5!4&'>CjjwtmintqqL-^)--zA+-.ȸ=@    OY RYOY?+?+33?+3993310!'+53267'5!o <<+:22wwu2\n---=@    OY RYOY?+?+33?+3993310!'+53267'5!o <<+:22wwu2\n---LE@# OY RYPY?+3?+33?+39933310"&=+53267'5!32?3B=+:22w<;2!/QLĚ4Xn--@~m)L?@  RY OY   OY?+3?+?+33993310'"!57'5!>;m:22Bww <<n---u2\)L=@  RYOY PY?+3?+?+393310'"32?3#"&5'5!>;m:22<;2!/Q@w <<n~m-u2\q*@ PY OY ?+3?3+99310#'&#"!574632q1-"0?4@LC{p--:-@   OY PY?+3?+399310632!574&#"#:BM@4?0"-11--%q{%_@2    PY PY OY OY?+33?++9/+3?933339310!57'5!2#4&+326HR}}aWdfsVZqd-- -|^-dUW%]@1   PY  OY PY OY?++?+339/3+?933339310#!57'5!332654&+sWaZ}}d7vcdqZ^|- ---VcfXTE5U@+ '! 6.4!4!67--1$1*PY1&$$PY$PY?+?+99??+9/99999323103254/.54632#'&#"#"'32?3#"&51Kx™Ye\2g/*5rQUMNZ?#8A3@0"-1CLDz4!DcF|m/PD9N2.CV? Vr{ E/@ PY PY ?3+?+3933310'&#"#"'5332654632-"0?4MB1-"0?4LC{p{p>E#F@#!$%PY!PY PY?3+?3+9/3+393333310%#"'53326=#534632#'&#"3MB1-"0?4꥕LC1-"0?4>I{pTK{p_T/@  PYPY?3+?+3933310563232?3#"&54&#" CL3@0"-1BM4?0"-ir{q{E *M@)$ $$+,"RY$""((PY (PY??+?3+9/9+9333333103267&#"#'&#"#&'#"&546324632*0*@1-"0?4aI1;`ryb3'LC#.RM 0{p=cW9aOWh 4-8@ PY QY?+9/3+39933310#5#534&#"5>323K?;0:S#8`_{}TABArgm-'LI<@  PY@ PY?+3?+9/9333310"&5#5?33#32?3{}e?<;2!/QL-'TN~m"_@1   #$OY PY RYOY?+?3+?39/33+33+399333333310!'#"5#53'5!!'5!327!fwG?hhx3n|lx-L'9T\-^\-^T7X)O@' #''*+ # RY$ PY?+?39/3+333999933332210"&546?#"#7!32654&'!#'&+-?.(7r||q7(4>ƕ5 ff 5Ȕ9@ PYOY PY?+?+?+39993210 '5!32>54&#"#5632x]M_U0"-1CLj<>-dԆ{ͫ3@     OY?3+333?9993310!57 !573JZyJ`-u--~-A@       OY ?3+333?39/993993310!57 # !5733T՚h;NJEo-{i--~l-fB@!  QY OY?3+3332+9993310!57 !57>32#'&#";boA`tK)S/!7Iv3f`-m--J`wH-9@    OY OY?+3?3+33399310!57'5!'5!jԑ9gvqL --)--y-7E^"M@)  #$PY PYPY?+3?3+3?3+39333310"&=!5#"#5!!26?332?3ϖ8h/9~3/3@0"-1CE -/1fr{7q$V@. "%&PYPYPY ?3+33?39/++3933333310%>32#!#67!5#"#5!%"3254&Cnbw~H8h/zEPbQW^BMT;-/1e):!ESK@'  !PYOYQY?+?39/+3+399933310"&'532654&+5#"#5!la10HK)8h/E*#<14&įES%1c@7/!!23PYOY  )# ,PY &QY??+?+9?39/+3+39333310&'#"&54632654&+5#"#5!%267.#" ϖvҠK)8h/j9V-BRLaxL,+^m]rAW14&įz>Oa84HVJ5=NdI<@ PYPY?+3?+39/393310)577>5#"#>32Hzy|#BDM˦5 bQ+.D)>@  PY PY?+3?+39/39993210#'&#"!57.54632)B#|yzH謟ODaQ 55+dI@@ PYPY?+?3+39/39939310"&'3324&/'5!ODB#|yzH+Qb 558NEN,@  PY QY?+3?3+9310 4632#'&# 3277ه7+Stl1E/hYԵ!<$)TsL "=@  #$   PYPY?++99//9939321032#"! ! #"&54632%DL@-,@@,-@"CA]S,@@,-@@%%h@: ! &'' PY  %PYOYPYOY?++?++9/_^]+9_^]9939323910357'5!2#'2654&+32654&+%}}ݷmdzjjxmozf- -nu`hff{PXd_QP`QODF-H@% %!%++./"QY((RY(RY?+?+9/+999393210%2>54.#"6;#/"&54675.54632dXWesiy ?dixqlVSoیNlkNME;L ` R32Q1-"0?4>S0bsqXrw jmMB{p̌?--A%l@?0OYPYO_o  OY ?3+333?39/_^]++333_^]99333310'5!!'5!!57!!57}r}rrk}Hrk}f--\----q--E L(P@) % )*SY & &PY  OY !PY?+?+9/3+3+93333310#"&546;'5!3#"&54632326=#"} w`rrjY3@,-@@-,@v4)5#"#>323#!575jHzy|#BDM˦ڬT bQ+T55D)"V@+  #$  PY  PYPY?+3?+399//3+33999333210!575#535.54632#'&#"3IڟODB#|yzH55T+Q TJ<%,i@7,, !&!-.,PY''PY  OY$PYQY?3+?+?+?3+3?3+39999333333210%# 432&='5!!!26?3!327&# #"qloD9~3/qZYr%8hFZ!-1;'JEN2<@I3*%8-, ,800=>--OY--*,*PY*(&OY(!;PY#!6QYOYQY?+?+?3+?3+?+?+39/+39993333333210"&'532654&+5#"!'# 432&='5!!327&# ga10HK)8ht qloDqZYrE*#<1-FZ!-4&į'Jq 5=@N$!8//%4 #;#4++>?(6PY((5!8$5$PY/5# ! PY!OYPY2@QY?+3?+3?+?+3?3+339/+9993333333333210327&# #"# 432&='5!!3>32#!#67!"3254&qZYr%8hqloDCnbw~H zE;'kZ!-1bQW^BMT;e):>!2T@, &&","34, PY % %PY@ )PY?+?3+3?3+9993333310"5#5?3!632#'&#"#47#3!254/.X{}e?.CRg/*5rQUMNZ?#15@8™Ye\2-'m/PD9N2.CV?^@\G2z4!DcE)1Y@.!//," 2(3)&&PY&.!.PY!*QY PY ?3+?3+?3+3?+339993332310'&#"#"'53326=#"&5#5?335463227#-"0?4MB1-"0?4Z_`_{}e?ҥMB/8;{p{pp#rg-'1 AB0:a@2 '!8..;<%PY!+1RY++ PY@ 5QY?3+3?3+39/+?3+99399322310"'#"&5#5?33#3267&54632#'&# 632"32654&y/a`_{}e?;0.DFه7+StsvlTsigy4Erg-'TAB-#r/c^D|xdn|MXD23<?L;w@?0!2' 99<=2255 RY50PY!0%,PY(%PYPY?2+?3+333?3+?3+3?+3399393322310"'5332654#"!57!!57#5754632#'&#"!>32@Q/!2; $))*+# ""   )$$&??399//3333339/333333339/3339333310# #'5!3'53# #'5!3'5342K,i8gF42K,i8gFaTVbaTVb<= 8@ /? 0   ?33/]3?33/]3993310#'.+"#!#'.+"#!D%\:\%CaD%\:\%Ca  aL'S@+ $ $()$!OY! PYRY%OY?+?+33?+3?+39933331047#"&54&#"#56323267'5!I=z|<;2!/]4QU*)qLmKM*;j~mS_ --+-aEX0[@/+##12*..'PY.# OY  PYRY?+33?+3?+3?+999333331047#"&54&#"#56323267'5!32?3#"&I=z|<;2!/]4QU*)q<;2!/Q@;FF*;j~mS_ --9~m&2p?@  ,  ><?333?33333?9933310>32#574#"#57'53&u$DKcEBLGT2('lg?32p&H@ $$ '(!<0-$ >?33333?3??333933310574#"#574632#'&#">32}KcEBLGdX1%*&u$D2lg?4 {J KT22(',` 1@ ;= 0?3?33?39333310#"&54632#"'53325'53'&&'[W'0GT''''uz xB@32u7@  ; ><?2223?33?993310#'"!57'53>3#S`GG+v"uB [F"3#f4@    ; ?>??3333?33993310'+5327'5!+v" "IFa HH2F"3B ,f=@ ;  ?=?22?3333?339933310"&=+5327'5!32?3W["}# "IFa HH.,zu\6BBx !2RfS@      ; >>?3?3?33339/399933239310+57'5!3732654&+/@fnKKSS&tp )Yf9@    ;.?22?399333393310"'53326?'5!'53n,0!4E:YX;4`) y9VE+v ч_e\[=o\=FTDRDR5 @   /93331044#526lH3TwwT0K3HPwTTwPF5 @  /9333103"&5463"AJ1TwwT3H4GPwTTwPH 27@ ->?33?339/39993310!577>54#"#5632g,RJ~JI(kdtze^g2 ; tp0c,t27@  - >?33?339/39993210#'&#"!57.54632'IJMP+gg_dytdkc0sq  v,ch!!S/@ /32933310%# #3/gyyg2)S/@ /32933310 #3 /+2+gG)_@k Y[/_ /    o ?   O   9  _ /    ?     O  ]]]]]qqqqqrrrr^]]]]qqqqqrrr/^]2++999331053#%8_!!_@l [Y/_ /    o ?   O   9  _ /    ?     O  ]]]]]qqqqqrrrr^]]]]qqqqqrrr/^]++39993310%3#5J  8!!O/9310#3nnOBu@Yo_O?/o?oO?9o?P ]]]]]]qqqqqrrrrrr^]]]]]]]]]]qqqqqqqqqqrrrrrrrrrrrr/^]+99105!tumm_5vw_CE/9310#3nnEB`/393105!tmmwFw/9310 53F %!wFw/9310 53F %! @ ??933310#'53#573T6TT6T%T%?9310#'53T6T%Y @   /93331044#526lH3TwwT0K$3HPwTTwPFY @  /9333103"&5463"AJ1TwwT3H$4GPwTTwPH @  /33933310%!53533odon @  /23933310##5#5!odoBn 0@    /9/33393333310##5#53533odoodo!oonooV/293105!tVmm5_sw /@   @Y/]+_^]29910"&'332673TJqTTpJ_CHHCsL @  Y   { [ +     k [ ;        p ` P D 4    9        t d T D 4          p @ 0      ` P  ]]]]]]qqqqqqqqqqqq_rrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqrrrrr/^]+9310#"&54632@-,@@,-@,@@,-@@5 >@&  Y @ H Y/Oo/^]+++993310#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GF}m 3@ / Y 0/]+/_^]993310"&54673327dox/+mGC<8Dmsf5i,!h)JO@.^d,@  / ?   //^]3]29910".#"#632326730QHC! '40QIC +0 4^+5+-2+5+2D_ @  [ )y f V F 6 $       v f )  h        t d T D 6 "           d R D 4 $        p ` T @ 0 $   8    t ;         o @&P @ 0        /  ^]]]]]]qqqqqqqqqqq_qqrrrrrrrr^]]]]]]]]]_]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]qqqqqqqq/^]2+33333331053!53'_!%!%5 @  /32933310#"&5?>7327sKes|I% X9=VAbJcz?Y' ?uh|/ @  /3933310  ' 7 HHIDHHI(kf<@   ;.?3?393333993310'>7'5!'53&'jV%/:ZY6 &0 uj+bs~ FVl02> " ,>?33?39310!57'53a``\&u$3@ %& < ??33?339999993210#"'533254&'.54632#'&#"kgaK.GtBOHJgUHS E03ARHKTVO)d-6N@JV{B0))2S2NfB@   ;@   >?33333?33333993310#57'#5?/5!7'53NKNABKm}NAM   27@  - >?33?339/39993210#'&#"!57.54632'IJMP+gg_dytdkc0sq  v,zY//+93310!!5!Uz&@  Y//9/+933310!!5!3S̑NUz&@  Y//9/+933310!!5!3SUz&@  Y//9/+933310!!5!3SNUz @ Y/+/9331035!3SUbIp@ /39331033!bi~pibIp @  /9/3933310#3!ii~}p|iEw@  /229310%3#5I  8ډ!! L@  /329333105!5!ttmmmmVD+R@  /3293910#'5373z''@  /3293910'#573'zzE@  /933310'573Ezz''E@  /933310#57'53E''zE  @  /32933310#"&546324&#"326 wTTwwTTwPH33HJ10KTwwTTwwT3HH34GFw@ /]9310%53 %! $@  /2]2333310%53!53"Y %! %! "@  /2]2332310'53!53'!%!%}4@ Y   @ Y /+_^]+9310".#"#632326730QHC! '40QIC +0 4}+5+-2+5+2DL *@  Y @Y/++933310#"&54632#"&54632@-,@@,-@@-,@@,-@,@@,-@@,@@,-@@=@ /293310!##Bn=n=@ /293310#5#5!nBnE@ /29331033!nynE@ /293310!5353nEn&E@  /329333103!53&ڄEr&G@ /2933103!&^G}g (@ /9/393333310'57!' 'l'kd!/331053 %!H!/331053H!%_DL?321053#%8_!!^du:@ Y//^]+105!tumm Y/+105!mm_w !@  YL?+_^]210"&'332673JqTTpJ_CHHCsmL @  Y//^]+10#"&54632m@-,@@,-@,@@,-@@E @  Y//^]3+310#"&54632#"&546328**::**88*)<>'*8*;>'*::**;<)*::+&@  /3233333104&#"'632#5>3*HFZjQ[pE0"c;U 2x55 @  //^]3210#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GF_] L?221053!53'_!%!%_DL?3210%3#5  8!!O7@ //^]10#37nnOBVO@ //^]3210#3#3JqTTpJwCHHC~`p L?10467#"&pd|x"*"7+3AXk%?$5!"&,M`p L?105654.54632pd|x"*"7+3AHXk%?$5!"&,M`p L?104632.pB2+7"*"x{eH;L,&"!5$?%k` L?105654.54632d|x"*"7+3AHXk%?$5!"&,M4Fw /1053F %!4Fw /1053F!%RE/9/310#5#5353nnEodoRE/9/310##33nnoBoq| /210!5!<}GA /10654&'&54632%DD5=RDY #@69WKv5Ef  /103"&5463"J1TwwT3H4GPwTTwPH_E/2310!53533odoEn_E/3310##5#5!odoBn_E   /9/33310##5#53533odoodooonoo:`/3105!tmmL /29/10#"'53326=3>S/!2;<'m~L /29/105332?3#"&5<;2!/S>~ml   /3310#"&54632l@-,@@,-@,@@,-@@n   /3210#"&54632#"&546328**::**88*)<>'*8*;>'*::**;<)*::5E   /3210#"&546324&#"326wTTwwTTwPH33HJ10KTwwTTwwT3HH34GFy/105654.54632yq!)!6*2@n =,Z""+-G@L /3210#"'532654&'73lL>L<6PH)V[g\nJ ;-1>R X9m /210"&54673327 ox/+mGC<8Dmsf5i,!h)JO@.E7/10#37nnEBFq /32105!#!&Frn& @ H/]3+223210265332653#"'#"&534GPG43HPwTf==fTwPGI21JH3TwQQwT1JEDw /2210 %3#5  8ډ!!EDw /321053#%8E!!\t @  /3]210"&'332673JqTTpJ\CHHCF^  /22102#.#"#>JqTTpJCHHC~~D@    /3]310".#"#632326730QHC! '40QIC +0 4~+5+-2+5+2D:~ /3]105!tmm~ /3]105!mmE~ H/3+2105!%5!Emmmm+D1@   /   /3]210".#"#632326730QHC! '40QIC +0 4++5+-2+5+2Dt:/2105!ttmmt/2105!tmm /10'mMsMMsMM/10#3dbEf  /1044#526H3TwwT0K3HPwTTwPFFq /32103!53݄FrUE /3210!!7#3Vzzyzi@  /3233210.#"#54&#"#>32632 ?(5FPF5)> RnJg<#"&54632JqTTpJ@-,@@,-@CHHC~-@@-,@@#E (@   /329/32333310''7'77GGGGGGGGEz@  /333310#'573zY'zzEz@  /3333103#57'{2zz'ES4@   /99//33333393310573#'3#57'6zz'?zz'f @   /33331044#526H3TwwT0K3HPwTTwPF\  /3310#"&546323$#33#$3#33#$330E2@    /993333339333107'37'#7'7$Z$$Z$RcaQ,+Q_dR,En+<@  & ,) # /3223333333939910#"'#"&546326324&#"326732654&#"nwTg<c[@ /9/33333107#33 ?cn?cc.w@ Y /3]+3310"$&'332$73l٧ J+44+J wETCHHCTE_w*@   YL?+_^]23310"$&'332$73l٧ J+44+J _ETCHHCTE=@ YO?+33105!5mma@ Y/+33105!5mm^!d0@ Y  /   @Y L?+_^]+10".#"#>3232673gȻJa4gǻJa4^+5+A6p+5+@6q_w@ Y L?3]+102#&$#"#>$l' J+,J 'wFSCHHCTESg /9/310'7!5!'7B ' ' gldk' ,y#'#! >><?22?39/?333102#'#"54>?54#"#56327^UG Dj1X^UW?/"dOP9V;GyNL8D?3?39/310327#"&532'"34&wWXDR`7|ف7T yf"%1k\n8f  ; >?33?3210#"&54632!57'537&''&a`P$''''#,{  <??3?310!"&5!24&#"326lJRNGGNRJUח&vnrz,!l'; > >?3?333?33310327'53#'#"5'53t`IBUG"t*Hg.&p,{ <>?3?3310# 4632#'&#"327i8YX!/HagVCZ*dm,-> - <>?332?333?3?310#"4632&='53#327&#"qEZD@_EߜE52Hb6!1 8%+-  ><?333?33333?310>32#574#"#57'53m&u$DKcEBLGT2('lg?98{-?*,;@ $ ))'>@ !!##<?3322333?33333333?310>32>32!574#"!574#"#57'53*j$_"*)IT`g TSfE>TGG>$A)hg 'hgBE8{+; ; ><?2?33?3?3310#'"!57'53>3#S`GG+v"{B [F"3_,  ;>?2?33310"&5#5?33#32799JK=%$'-K,E=2'( ' ,3l"@   ;>?3?3333310#'5!'53,:ZY6,z 8&l3@  ;@   >?33333?33333310#57'#5?/5!7'53&KNABKm}NAS   _@cP`$4Drd0@$$tT 0@B@>AH@ 8=H@ 25H@ ,/H$4@ &)HDT@' %H 0`p/L?^]]]q_q+q+r+r+r++^]]]]qqqrrr^]]]931053E_!$%E/9310#5Ev!% E @ /293310"&=3327;68t&* ?EIC@2??(@ QY QY?+?+993310!"&'532654&#"5>3 ?7\/*ID,.\*#< е<#*@@&@ oO]]]5NN&5@ oO]]]5j_@cP`$4Drd0@$$tT 0@B@>AH@ 8=H@ 25H@ ,/H$4@ &)HDT@/ %H 0`p/oL?]^]]]q_q+q+r+r+r++^]]]]qqqrrr^]]]931053E_!$%3_v?@ Y L?33/^]+39333931053%#"&54632#"&54632 162&%55%&2p3%&55&%3_!B%]&55&&44&&55&&44I&$9 H%++5?5-y @  [ /+9310#"&54632yF33FE44E3FF31HH'>'(9Ap H'@%_O]]]]]]]5++]5?55>'+9Up H'@+%O??/_O]]]]]]]]qqqq5++]5?5>',9B` H"@%H+]]]]]5++]5?5sL&29%@p` H+]]]]5?5S>'<9F@p` H@ %_O?]]]]]]5++]]]5?5L&+9),**H* HY**%+++]5?5:&k:)%+555H$;=%;^=>@!  `Y  _Y_Y?+3?+3_^]+993310)57'5!#&+wĬA>d55hNH9@ QY?+399?33993933210)'3 !wݾp&P\;}=(bs==;=+TsL "d@;   #$$?0$P$ /_= _Y _Y?+?+9/_^]_]qr3q^]9933991032#"! ! #3!73#'%DL@@j@@"CA]dJb=,;=.HG@$ F   _Y ?3+333?33_^]]993393310%!573!57Gо۪ɴuP5555];=0;=1n= $d@="%& //_? @ aY?33+?33_^]q9/^]]qrr399910% ?3!33"#!#'&##3!73#'P9BB9#sl4BB4p@@@@v KŎdTsL2;=l@  @):=H P_Y`Y _Y ?2+333?++3_^]_]+]q993310357'5!!57!;P555b55m5;!=3PA=M@)     `Y   aY ?3+9?39+3_^]9993210!2$?3!5 5!#'&#!mh%!9B"RB*p3 J<hO%=7=<>=(1@e(- #)  32@333/_Y(,,_Y'//_Y@ H0@P_Y?+_^]3?99//_]q+3+33+3+_^]3_]9933933310%!575#".54$;5'5!32+72654&+;#"Gqzghy֓rC=B5!!N޶z:":zP55K5a55[5jL)@e$##' '!*+#aY#$P$ $_YP _YxI _Y!  aY?+3_^]3?+_^]_]9/^]]]]+_^]+_^]?+9933339933333310"!3;'&5! 32?3!>54&ܸB9PH LCCL HP9BJe!!eW?j{&,jm& %+55+55{&<jm@ &' %+55+55N&c9@ O((+ %+]5O!&g9 i.1%+5 L&i9 Y %+5-&k9  %+5&w:@ 0%+555N'M@)!  ()PY $QY ?3?+?+?99333399310%#&'##"&5432373.#"32>%H\pIͺ/F>Z9Crd^N<_O--vi4($OLL&S@* ## '( $#$#PY$$PYPY??+?+9/+999333993910#4632#"'4&#"324&'5>*ѩ…l˼zbapv䖛}La 5'&ANLZ ,@  """! ?33?333]993310533>54&'53'467.'<;#. W .XP#-U6~%)0-;\OM YY}EMx+Q@- -)%,--O--- ) "PY PY?3+?+99_^]99339293104632#'&#"#"&5467.32654&/a/*5fQUUsվmT|rmvVcupm/PD7svuՇ˸.`/vT0O!-c@6'  ! ./ ""QY*PY' -**QY?+3?3_^]_]]+9/+999933210%#"&54675&54632#'.#">;#"'3267!Ϸygб09a.dmC8( DEHwE\FZ[}=p$qYPD]` eFZhY" [@3  !"RY/ OY/^]+?9_^]]+9999333333105>54&'.5455$7 "PHhfî /޸_2c~{}Ra4AM6::'?NrDH_=c LB@!   RYPY?+?+33??993333310!632#&4&#"#'  ΀~!R]`_x5-:dXZCf`~ G@% PY PY PY?+?+9/+_^]99333310#"32"! 2!~fLY)lusmKaiqpbsIH-6@ 0  PY QY ?+3?+_^]]93310%327#"&5'5!X/&.C#n3US+AAArg-'X@/     PY   PY ?+3?39+3_^]99333993310 3 !#'5!DuTf܄w--ng-6D@% O  QYI?3]3?+39_^]9933910#5'&#"#5632#%"-Hf(1EO]t8NB"^b! Sz0, -JB@!   RYPY ?2?+?+33?99333310!'#"'#3327wqO6j~-Vj//b`-nJ@"    PY4DD  H?3+?33]q?+3_^]9933104&'53#'53>1;GG"#,0 -!.P|[z- ZLZc4@$"2"%'/%)/ 56'/.)*)QY*. @7H` R  H 2%.!QY.OY/^]+?9/+99+_^]^]]]++9999339339233106;#'5>54&'.54675.54%55;$7Hc4 1Y~M|PH]quTjF~t" j 3yBS6"fXa4AM65?,}A !]\aV%tWNRC@%   QY PY@ P  ??3/]+33?+393310#5>7##7!#327#"5k3 4+*090&5T0X*-6QrZ؀T~AAA#L;@  PY QY?+?+?_^]99333104632#"'#2654.#"reuu|~|~D{Ql1͂l*6𹮎f(+K!P@,   "##?#    PY OY  /^]+?+39_^]^]99339910"5>54&'.54632#'&n4hopQG]]ٯttp7+B|FY:&eXa6B M79:,"ف1N19@  PY@ PY ?+?+39933333103!#"54$3!2654&'"9]c]UqB:ʕQsʷ<ƹ- ;@   QYPY?3+3?+3_^]393310#7!!327#"&509h)Cn2XjXT~A#knB@%/ OYPY PY?+?+?+_^]9933310"&5'5!32654&/xia|q3C!-ndt֮(I!OLN"W@.   #$$   PY OYPY??+3/+?3+3_^]933333910#.546746324&#">j`SzqXPoL"I$dLS@*    ?  ?222?3339]33939933999910.'#57&'5373 + [:K i] 3"LPx!IE-EK2'/$-LT@,  ` PY PY  ??3+3?33/+3_^]9933933310%$5!#.5'5!3yHjxj<-]&-P+c@6$$!!,-p-P--- "") )QY OYOY?+3/+?3+39/_^]]]q93333310%5#"'##"&5473267'&=3326?ꮝIIрk^54&#""&54632(䖛}bapwѩ…lDANȌXɿ9  *M@) '*+,$PYPY OY) PY?+?2++3?+9933393210#"&5'5!3265#"&546323'4&#";ʼxpmxYwq8;B:B[X!-nesHT͐g`+L3@  _Y`Y?2+?+3?3993102#'&#"!574$#5 66mbC2+f_pէRL1yip55i59 L'09*!?5+&js-&0%+55+55ELX@/   /PY PY??3+3?3+3?_^]993933333210$46734&'>bnbpzzpBrxvtL63]Ҿ5.L@%"* /0 -PY'QY?33+3?3+339/9993332210#"'##"&57##7!#3267'&=33265'!II09k^)((,!$$RY$9 5RY PY?2+?3+3??+3?99339993333310"'53326="&=#&54754&#"#4632%467332653>@Q/!2;<lc AG<>7hVlc0 AG<>7Lm~H?C(G@n}UC^J$GAwbUCTLsL>@ _Y  _Y _Y?+?+3?3+99933210! !57$32#"TDL55T^9"CANL>@   PY OY OY?+3?3+?+99933210!57$46324&#"326ڴ~uwF/--_,ºTnL$2@  %& "_Y K?3?3+9999333105>54&/$5!2#'.#"%\g{ECUtiMBF`z}B&BL_Ak0FOA8Q)7Z=>[3ۮ+/K.@    PY?+29993310"5>54&'.5;7384hopQG]]ٯ r89XFY:&eXa4A M79:, :l;)=X@4 `Y_o-  `Y _Y _Y?+3?++9/_^]_]]+93310!57'5!#'&+!#'B p=Z555E~7@  PY  PYPY??++9/+93310%#'5!#'&+373#'Q_B pԇ==|5Ѡd=$@   ??9/993310%#&546!654'53!Z JWZ A __-3,XtA_-3.@tj2'@ RY??9/+993310!#!3R^^y Ej"@@! "  #$ bY_Y  ?/39++3?999933310!467&$'#'>3 '654'"̴pd'~^>9BYZdl \IVJ-1yXIE0;@   QYPYQY/+3?9++9999310.#"5632'654''&''V~AhR545K2(<(2ag!H{UDΌKV$2؋VU+%D"!G@32#'&#"327'5!զ\]]]B(=H=lv㬟5 dʁc%14R55bE&U@, $ $'( #OY RYPY$OY?+3?3+9/+33?+99933210!5747#"54>32#'&#"3267!RSDcwLC1-"06T01%w-Qi-.7q{b 3--LE=,f@6( !!-.((**bY**$'"$"_Y$!!_Y bY `Y?+??9/++3?+39/+3399333310%#"&'&#"#56323 !"!57'5!632tב:nEpHp-gJi5l5զС $CG@32673"327&A_H9# A,CCM6XVDk?H~S#I5]Q\XC{Q )1)6C'/'cs8e9>o??9\\gL?7HuWL(H@# %%)*## _Y_Y?+?+39/993999933210"&5,654&#"#63232654'7GyA{,#ALy0&lfĈ* +ȫd^^MI9FRM;@   !  PY QY ?+?+3993999932103267# $54&#"#5632xC&,X`=po\)1p <#*њ.oٻֲCL(+?@* + ,-)! `Y% *`Y ?+?3+33399993310'&#"!567'.#"#6327>32 !7,:;g4Hyhz|:14% (7Bas\n^D>g[a`bD..h<;ryoeAe#&7@#'($ PY  %PY ?+?3+333999910'&#"!56.#"#56327632!6' ,FU$nuX[(A), '/@WsCAiTW@ؠ@o9D!!G6oltsFQ!/H@$''-   01% "_Y `Y*_Y?+?+39/+3399932310"'&#">3 ! 4$3232673"32654&Gpp;%ot66RYXBIp-n?{a̺RObR8H?@ZPA/N+=@$)),-&!PY&&QY PY?+?3+9/+99992310"&54>3232673#"'&#"32654&#"5632*^#H_-M]+LM-vMCSv{ F9, Ըʁzw<(=)Y@.& *+% " _Y _Y&" _Y?+3?99//3+33+393333310'>54+!57#".546;5'5!32b^9+>=+9^bsijrBn:*(G(j`55j(G(*:nBDG55F8@  OY PY OY?+?3+3?+933310!57!5!!!+X-T-eTg/Q@)-++ % %01%((!RY(,-, RY ??3+?9933?+39999333310!#&54754&#"#4632%467332653#"&=AG<>7hVlc0 AG<>7gWlcG@n}UC^J$GAwbUC?C`E(7@ ##)* &PY!PY?+?+3?99932310! #"&'##./.4&#"326`o# ?oqaa22 `kwYv~oVkbH) +QF .l`NN1@ QYQY?+?+33993310!2&#"327# NZ3ll1Z7(%32JS.&}A7 =~).V)$< P<$)H!=LTL6@ _Y _Y ?+?+99//993310326?3# !2#'.#"%r;%AmEA%;t7.?gIIg?.7;=[@-    _Y  _Y?3+333?339/3+3399333393310#!57'5! !!57g# 7p:G555.5b55x/Lp@<   OY  OY RYOY?3+3+3?9/+3??+3_^]]99933332310'5! !!57#!57sMBrri6^sf-W---0b-- L#O@("$% PYPY QY ??+?+9/3+39993333310#5#534632#"'!2654.#")zzreuu|0W|~D{QlT͂l*T:f(+qL6@_Y _Y?+?+99//993310!"'332#"#63 A%;tr;%AFl?;.79*,77.;?TL&@ O"/"""]]]5qL&@ O"/"""]]]5;}&(CN@ !&!%+5+5;}&(js@ &.%+55+55%LA=.n@<' ..  /0$,`Y'$RY   `Y  _Y ?+3?3_^]3]+39/+33?3+93923104&#"!57#"#!#'&+632#"'53325udv3ZCHDS1wDZRgOBF*늏g55;Y>u;^&FvUN@ &q%+5+5TL[@2    `Y <L  _Y _Y ?3/+?3/+9/_^]+_^]99339910!326?3# !2#'.#"!mr;%A^XBF` F7.?c@Zc3ۮ+/L6Jb=,?j&,js& %+55+55+=-=!*o@>''!! " +,, &`Y '`Y!_Y_Y`Y bY ?3+?++3?++9/_^]+_^]9939933310! #"/332'5!32#!574&+326H!Xf^;-/2[u%Ԭr/Y%5555~;= )@M&&!  *++ `Y?O _Y%`Y   &`Y   _Y?3+333?+9/_^]+?+339/_^]+_^]993933323105!32#!57!!57'5!!4&+326y$第UJD55565555}~%=%e@6## &'""  RY  `Y    #_Y?2+333?3_^]3]+39/+33933310!57#"#!#'&+632!574&#";3ZCFDS1wũ$tdv5;Y>Y55g5;]&vN@ &K %+5+5;!@  "##D#4#D####@4:=H#P#p### @_Y  _Y ?222+333?333+33_^]]_]+qr99333310357'5!5'5!!5753;w5557(55b55_55 %!A&N@ &!) %+5+5;L={@  @-:=H P _Y _Y `Y?+3+3?3+333?_^]_]+]q99393210357'5!!'5!!#;wEAF555l55b5LH$;!=`@5      `Y  `Y _Y `Y _Y?++?+3+9/_^]+_^]993339102#!57'5!#'.+4&+326? A9)Nhb齸55 ~;=%;^=FLC=H@'     _Y`Y  _Y`Y?++3?3?++399339310%!#76'5!#lzyaAAaZZLl:55b;}=(+='@D "' "" '')("'%'_Y!  % _Y ?33+33333?339+3339933933333939310'!57 '5!'5!'5! !!575y`TɄT`y#\555r55r55B 5155aM*V@-(%%+,(_Y ""_Y" _Y?3+?+39/_^]+999393910#"'332654&/57>54&#"#632ݵ B+#7x}i}7} !Bݤm+ R z!+;=@  @4:=H P _Y   _Y?2+3_^]333?3+3333_^]_^]_]+]q99333310357'5!5'5!!57;w5557(55b55_55;&N@ &'%+5+5;]=t@?  _Ye     _Y ?3+33?39_^]_^]]+333_^]99333993310 !!57'5!'5#WHӬW=5<&5K5555}52=F@% _Y _Y `Y bY?2+?++3?+39939310"/332'5!!57! ^;-/2[u%n!X/Y%555b55r;=0;=+TsL2;=S;!=3TL&%=7A=A@    bY _Y?3+333?3+9999339105! '5!#"&/33267A-dIs{R-X -17IF55L55٢KaqS=(1@h(-) # 23303p33/_Y(,,_Y'//_Y@ H0@P_Y?+_^]3?99//_]q+3+33+3+_^]3_]q9933933310%!575#".54$!35'5!3 +72654&+;#"a VW b1*ü0)P55jڒ}55}ϒjNȾ-=;;L=u@@+:=H P  _Y _Y`Y??++3?3+333_^]_]+]q99333310%#!57'5!!'5!ߴAkewP555l55=Z@.   !! RY  _Y _Y?+3?3+3339/+33_^]9933310)57#"&5'5!3267'5!bC˲|+j5$,55q55b;=@  4$4@4:=H0@`  _Y  `Y_Y?+3+3?33+33333_^]_]+qr99923310357'5!!'5!!'5!;555l55l55b5;L=@ 4$4@6:=H0@`   _Y `Y_Y??+3+3?33+33333_^]_]+qr9933393310%#!57'5!!'5!!'5!+AkP555l55l55=b=\@4 `Y  _Y   `Y `Y_Y?++?+3_^]+9/_^]+933310#!57##!324&+326b3IC՗ǡhbs5;5›~;=%d@5 &'`Y % _Y"_Y`Y?3++33?3+3339/_^]+9933393104&+3262#!57'5!!57'5!Ԭ5h謬k~555g5555;T=T@.   `Y _Y`Y_Y?++?+39/_^]+_^]99333104&+3262#!57'5!Ԭ5k~555qLO@+   `Y < L   _Y_Y?2+?+39/_^]+99339910"'332!5! #"#63 BA%5}D `FBTI?;)<.Z/+%3;L%l@<  &'_Y `Y <L _Y _Y #_Y?+?+?+3?9/_^]++39933393310!! ! !!57'5!32#"oK26第?mRG5555#B?=]@0 `Y `Y _Y _Y?3+33?++9/+399333939310 !57.546)!57;#"2|R喴ѺL5%É5b55}=HqD`'<@"## ()%PY PY`/]]?3+?+993331067>733>32! 4&#"326`[Ơ\< 22aa: #pHT~uBAOY2 Kbkº`%%n@@ ! &'' PY L\l %PYPYPYPY?++?++9/_^]+9_^]993393910357'5!2#'2654&+32654&+%}}ݷmdzjjxmozf- -nu`hff{PXd_QP`QO%C@'  PYPY   PY?+3?3_^]++_^]99310#'&+!57'5!7+oXC}}-- -t^@4     PY   PYPY?++3/_^]3?+33_^]99333393105!#!#767!#rAWnWAQqi c-->tgPFH'@P "' "" '')( ))))   PY!  '"PY%?33+333?339+33333_^]]9933933333939310'#57'5!'5!'5!#!57vLJe2XqUETqX2eJLTUsf'---b--`---f--:(n@@(%%)*(PY,\l|* ""PY"  QY?+3?+3_^]_]]9/]+999393910!"&'532654&+532654&#"#5632!Un`J\pZxyVeYj)X$7o`NqM*<\fLYS\R[^zQo%c@60@` PY  PY ?3+3333_^]?3+3_^]333_]99333310'5!5'5!!57!57}r}rrk}Hrk}f--s----<$`--%z&%d@4  PY  PY ?3+333?39+333_^]99333939310'5!'5! !57!57}rbLuX\Vzrk}f--`----h--P@+     QY  PY  PYPY?++3?+3?+3_^]9939310726'5!!57##"&/3,K+*rrk}+-?\D!7-V ----e 5 /Y@.    PY PY?3333+3?339+333_^]]99333310'5! !!57#!57sMBrri6^sf-W---0--%o@@0PY L\l PY PY ?3+333?3+3339/_^]+_^]99333310'5!!'5!!57!!57}r}rrk}Hrk}f--\----q--NR%H@( 0 PYPY PY?++3?3+333_^]993310'5!!57!!57}rrk}Hrk}f------!LSNNFaK@   @ HPY  PY ?+3?+33+3_^]9310#'&+!57#"#a7+oX&C%Xo+7-- F\KL%.9x@A4* #&/##:; ;0;; PY1--PY  PY4*(77PY?222+333?+3?333+3?+_^]]993393333310"&'!57547# 432'5'5!632327&#"#"326)Y|jw^eòF\sZpԺMA@H3M@R"bYHF//cFE&-@}$r[%tW@1   0P  PY PY PY?++3?3+333/_^]]99333310357'5!!'5!#%}}r}rtAa- ---->^@2   RY/   PY PY?3+333?+39/_^]+339933310327'5!!57#"&5'5!BMCe}rrk}m:qz}r(>P!----=5)|A--#]@3  @P PY  PYPY?+3+3?33+33333_^]99339310357'5!!'5!!'5!#}}rz}ry}r}- -------#Vj@< @P_ PY  PYPY?+3+3?33+33333/_^]^]99393310357'5!!'5!!'5!##}}rz}ry}rtAa- ------ $c@!  PYO_o  @ HPYPY PY PY ?++?++3+9/_^]+93331032#!57#2654&+U}c}}w5+7wvQ-v|- [a_Q%0%m@= %  &'% PY PY  O _ o    PY# PY ?3+333?3+9/_^]++33993339310%2654&+32#!57'5'5!!57wve}}wi}}}rrk}P[a_Q\-v|- -F----%h\@6   PY  O _ o    PYPY PY ?+3?++9/_^]+_^]9933310%2654&+32#!57'5wve}}wi}}P[a_Q\-v|- -E!g@=PY L\l  QY+{  PY ?+3_^]_]?+39/_^]+99339910!.#"#632#"&'53267!{zjH(7wT `n/+<$%q@@   &'PYPY L\l    PY PY #PY?+?+3?+39/_^]+?+9939332310!"&'!!57'5!!>324&#"326Hrk}}r ڴ~uw-- --ºe@5   PY PY PY PY ?++?3+339/_^]+3993339933103#57.5)!57##";Qdo}}b{fzou-n`---M[YPF&HCy"&"%+5+5PF&Hj /%+55Ls-@; H &&+ +./p///// +&(&PY(PY %@%##RY --PY@ H PY?+?_^]9/3++3+3?3+?+3_^]]9939233+1035'5!!!>32#"'5332654#"!57#2H?z|>S/!2;<^dw-Ssh.)<=m~'--%&v K %+5NNm@@ PY L\l PY +    QY?+3?3_^]_]+9/_^]+_^]99339910%# 4632#'&#"!!327N1Z7ه7+StVl9$)/Pū!TV+LL 4&j %+55LLM#,q@B ,,'-.+PYO_o ,PYPY  PYPY QY?2+?++3?++9/_^]+9939339310"&/3326'5!32#!57!%2654&+!7-,K+*}wi}+-?\wve 5  --v|-ed[a_Q% )@G)) $*++(PYO_o  PY )PY PY?2+333?+?+339/_^]3+3_^]9939333231032#!57!!57'5!!'52654&+}wi}rk}}r{}wve-v|-q-- --\-[a_Q%Ĺ@! H ##&'' ''E0'''''@+0H'''' '''"H'@H#PY! RY %%PY@ H PY?+?_^]9/3++3+33?3+333++_^]qq+r^]9933333+1035'5!!!>32!574#"!57#2H?z|rk}^dw-Ssh.)<--J'--%&v =%+5%!k@:"###0#OY @ OY ?333+333_^]?333+333_^]99333310'5!5'5!!57!57 53}r}rrk}Hrk}f--s----<$`-- %!Fz&\&,H, H,@ H ( %+5+++$mb@60PYPYo  PY ?3+333/_^]]/+3+3_^]99339310'5!!'5!!#!57}r}rr`3A4U}f-----m-` L8Y@.066(" "9: -%-_Y77_Y))%%33_Y?33+3?39/33+3+399393210!32#"#63 !"'# !2#'.#"3267'0TU6C*޿)C6UǼT06(1'?,51 <<<`C`]<15(!.@"#  ?333?33339933104&'53# #.53.53>c1/== %+ %o,0 -!.Uw[*Pm8`;rk5`R K=!*j@;''" +,_Y&`Y  `Y `Y  '`Y_Y?++?99//+3+3333++393333310#!57#"#!5'5!!#'.+324&+326ԬSC5DNȡo5;d55d ~ )f@7))$ *+OY(PY   PY )PYOY?++?3+339/33+?+393333310#!57#"#!'5!!#'&+322654&+i}Xo+7:}};7+oXwEwve|- --ev[a_QJRL-q@<,$  ./!)_Y$!`Y,_Y_Y _Y ?+3?+3?+39/3+3?3+9993332310!326?3# !!57'5!!!2#'.#"!r;%A謬 ]DBF` F7.?_:55553:3ۮ+/:B)g@8$$)" ")*+$)')OY##PY'QY PY OY?+3?3+?+?9/3+3+393333310'5!3>32#'&#"!!327#"&'#!57}r ̇7+StVl1Zrk}f--/Pū!<$)--Ha@0   !_Y _Y ?33+333?399//3+39999399339910)57!574'!57367  s~eeoо۪*5C--1E55w? Bg@4   !OY    OY ?33+33333?399//3+399399339910)5754'!573!57 67eS\frx\Pec#"a-F--l--iE:_`:J)H)/@L$.- %&&,-- ((01-&$`Y.,*$$ # _Y ( _Y ?333+3333333?+39/933+33?399939929932993310)57!574'!57!!57'5!!367 ) s~eeo߬謬B۪*5C--1E555555w? B:)/@H$$)+*!"!/**!) ) 01$)')OY##PY/+-' '*OY?+3?3?3339/933+33+3333399939929933993310'5!!3!57!5754'!57!!5767}rƄrx\PeeS\fErk}lc#"af----iE--F--t--:_`:1H$'i@7' & ##()  _Y% ''`Y# _Y ?+3?3?+39/33+3999333333210).#!57!5?>75! !xDx޶xExzxcxsKXOuYRWzb7E55A5ȎCPP!;g2T#&i@7& % ""'(  OY$ &&PY" OY ?+3?3?+39/33+3999333333210!#'.'!57#5?>75!!TV,m[|a}\j.UXP@Yy`8^vVDPW'v[--vV{,b/fBB.^/J }H25@D%5'+& 4** '1167 %`Y3+%%!*55$!_Y(! 1_Y ?3?3+3?3+3339/33+3399933333332310).#!57!5?>7!!57'5!!5! ! }xDx޶xExzxA_5>謬LXOuYRWzb7E55A5-5555PP!;g:H14@D%4'+& 3** '0056 %PY2+%%!*44$!OY(! 0OY ?3?3+3?3+3339/33+3399933333332310!#'.'!57#5?>7!!57'5!!5!!HV,m[|a}\j.UXP#>(rk}}r8^vVDPW'v[--vV{,Hg#-- --_BB.^/EHQ@J.<%54&#"#632#"'&%3#5RHXWE*TExn.p*-h>)SDz~r2NH)knui}7} !BݤIJC?>  8hQJb$0S3232654&+532654&#"#5632!"'&#"%3#5K><:^YKN-X;(BGU9g?l=3Q#NSk_xyVeYj)X$7o`NYj)9?;K   8ڳS[*D'9>%-%}Iq=idWbS\R[^zQoyX _췷!!=$X@. # %&_Y  _Y # _Y ?+3??39/3+3+39993333210!!57".''5!'5!>5!z޶PymQz:5eD":V55Bs5@55[LG@$ OYPY??3+3?3?+39993333210##".''5!33>5!zզUgD-bwq+$)"}r v_3mv-n.pTsL ,H@&*-. 'bY"bY " "_Y_Y?+?+99//++99333310! ! %"'.#"32">323267&TDLTvCZ&7v;<8sIT%3x ]K&$'@4:58J*!%N (H@&&)* $QYQY  PYPY?+?+99//++99333310!"&54632".#"3267"632327.H.NFA!1/u~D{uC5.MFA!2- % ٽ65%ñQL/@ `Y  _Y  ?3?+3?3+99310#'&#"#'5! >32QB!63C@<3ߗK:rUQ:'WI 55%&8@ PY  OY ??+39/?+399310'&#"#'5!>32k-"%+8J}`-w_MB{39z--wpcQ&%N#&ʹ  %+55+55&&"& %+55+55TLL"-U@-((##. /+_Y+% _Y% `Y _Y?+3?3+?9/3?+?+399933210%'5!>32#'&#"#32#"! ! `vϏ$bPK/-%Q$l?#X--uYG}^T!D@_NL0 -T@- .$/-")PY&"OYPYPY?+?+?3?+3?3+?3933310!"&546324&#"326'5!>32#'&#"#vf̴nwshirvo9`vϏ$bPK/-%Q$løX--uYG}^H.F@!& ,# /0 @bY),@&,,aY/+3/+39939333210%>32#"&'$>326'#"&'H^ 8##9 0/ 9##8 5 5 5 4z. ))  (( ]:## %#""FA -F@!"++%%  ./@RY+(%@%RY/+3/+39939333210#"&'.5%>324&'#"&'>32>Aj 9$#9  9#$8 δsv3 4xopx 4 3yqI1!+* 1 ** ٷ "ƽ"! (vF`t@D iettnnPP\1<\ B BuvQNNG\qqGeXGG G@\6_Y;?,!!_Y&?333+3?333+3_^]29/9/3999339333310"&'#".5!2#'.#"32>?32>54.#"#>3 23#".#"#>5>54.54632vSS̀`)mZC6U\d4Na2leZ A Xdk3aN4d[U6CZm*`[*JC@CJ+h]2UKC?? 8SJ5S2K229$1&*>BMMBW`] 15A:":P./P:":筫A51  W%,%n%AJ=gJ*@0%8("'?9EF`tx@>iettnnPP\9\ A AuvOP\qqeXGG G\e@3PY8<+  QY%F?333+3?333+3_^]29/29993933310&'#".54>32#'.#"32>7332>54&#"#5>32#23#".#"#>5>54.5463200mcl:9dNAy27+H&_a"EiG0UB. 8 /BU0GiE"a_&H+72yANd9:lcg*JC@CJ+h]2UKC?? 8SJ5S2K229$1&*>RRRR@~y|y; Zd6-; ;-6dZ ;y|y~@,%,%n%AJ=gJ*@0%8("'?9` & N@ C&EF"%+5+5& @ ,&./%+5+5TLL<@   _Y _Y_Y?+3?+?3+9993210%!57$!2#'.# ^XBF`!,p55Q b4Zc3ۮ+/FL<@ PY RY OY?+3?+?3+9993210#'.#"!57.5432 7*+X4tUʏ/'ڻ +--] F_@1          ?99999333399933333310''#'77'73qJʱdKɯbEEUE#EUEEUEE:Mr /333310#"&5463!54632#!8*)<<8c:**898*;<)*: *::*)<_fw@   L?2232102#&#"+5727> J~!O6ov]h]o8Xw#"FnU,(`p@  L?23333104632.pB2+7"*"x{eH;L,&"!5$?%k`p@  L?23333105654.54632pd|x"*"7+3AHXk%?$5!"&,Mb4z'@  Y YL?+3/+3310"#>323"%.]h}3jgPPg`;%+ )7ESao@O^PPXJ . 4&&Jf36}oX]6o]]o6//9////33/23/33339333333333333105654.54632467#"&2#&#"#"&546"&'332>322'654&#"#"&546"&54732632%4632&#"#"&#"'732654&54632pd|x"*"7+3Ad|x"*"7+3AXXk%?$5!"&,MjXk%?$5!"&,M>g;-$-.C;>g;-$-.C]uDIn,F'- (BuDIn,F'/(BXk%?$5!"&,MXk%?$5!"&,Md|x"*"7+3Ad|x"*"7+3AuDIn,F'- (B"uDIn,F'- (Bh>g;-$-.C;>g;-$--C;L+@D ())"!!,-(!! !@%_Y@_Y  _Y ??333+333?333+333+_^]299933333332310%#!57!57'5!5'5!"&'332673A2第wh]]h<5_555557(55b`gjjg%t)z +@B# $+++,-*%"OY  @OY@'$+OY#?333+333?333+_^]2+33399933333332310"&'332673##57!57'5!5'5! h]]hRA2}Hrk}}r}rbgjjg>-<$`-- --s--;T=M@)  `Y `Y    `Y_Y?++?99//3+3+993333310#!57#53533#324&+326TԬȡo5ZZ~-M@)  PY PY    PYOY?++?99//3+3+993333310#!57#53533#322654&+i}wEwve|-SSv[a_Q;!= g@:   !"`Y_YaY `Y _Y _Y?+3?++9////+++99333999910!57'5! '#654&+327'˟{r;~pq'bhMwB555unq<}<PqH{Cx!L*t@=)%%    +,OY) 'PY$"QYOY?+?+33?+9/9?9/+3993339939910'5!>32'#"'!57654&#"327'k*I{{9_qf@wt.}uNYjf;f-7$,z:=H)//th!C; 3@   _Y `Y  _Y?+3?3++9933103%!57'5dA#Ĭ=SVh555+ 6@   PY PY PY?+3?++3993310!57'5!73qH-X-- -;^=I@%   _Y`Y _Y?+3?9/3+3+399922310)57#53'5!#&+!!wĬA>d|5OZ5Z%W@. PY OYPY  OY ?+3?++9/3+3_^]99333910'&+3#!57#53'5!+oX֚C}}}}T--{TQ-;E=)]@0(("*+_Y'%bY _Y(_Y?+3?3+39/+33?3+999932310)57'5!#'&+632!"/332&#"wĬA>d⁠ZD3Cp55FO3+/&0-x%E'_@2# # () QY !&&$OY&PY&#!#OY!PY?3+?+3?3++9/+33999932310#'&+>32#"'3324&#"!57'5!7+oXE6y7+Hb떎OkC}}R#'/-- -L+=)@M(! ")(' ' ))*+'"" _Y!( $) _Y ??+333?3?339333+33333999993332333333310%##!57'!57 '5!'5!'5! +Akk#y`TɄT`<155υ\555r55r55Bt)@X(! ")(' ' ))*+ ++++ '"" OY!( $) OY ?+333?3?339333+33333_^]]999993332333333310%##!57'#57'5!'5!'5!Aa+TULJe2XqUETqX2eM6>f---f'---b--`--amM9@[/,7,,7& 2 2:;5  _Y/_YoO_oO/_o)`YK&))!_Y)?+3?+99//_^]qr]+9+33993933910"'532654'&'332654&/57>54&#"#632dD8-h-- --`--;]= |@B  !""   _Y  _Y ?3?+3?399//933+333_^]933339333310)#!57'5!73'5! ]ZӬZpWB~K5555D55<&%"@C  !!#$$OY  !  OY ?3+333?399//933+333_^]933339333310)57#!57'5!7537'5! VPfrk}}rfPbLuX\-72W-- --`n܆--;]=!q@;   "#_Y `Y    _Y??+33?39/993+333+3339333333310)!57#535'5!3#'5! ]HӬWWK55}Z55Z}55<&%!{@?   "#OY   PYOY  OY ?3+333?+?9/3+39933+39933333993310)57!57#535'5!3#'5! Vzrk}}}}#bLuX\-h--P-P--%R=f@7   _Y    _Y`Y?+3+33??933+3393333310#"#!'5! !!570WD$WWHӬ ;5}55<&5K55k@8   !OY  PY OY ?3+333?+3933+339333993310)57!57#"#!'5! Vzrk}#Xo+7drbLuX\-h-- -`--;t=@  t:=H@:'*H P`Y?O  _Y  _Y K??3+333?3+3339/_^]+_^]_]++]qr9933333310%#!57!!57'5!!'5!Aa第w6>55555555]%t6i@8 0PY OY  OY ?3+333?3+3339/+_^]9933333310%#!57!!57'5!!'5!6Aa}Hrk}}r}r6>-q-- --\--;= b@6 !"_Y`Y?O  _Y ?3+333?39/_^]9++3339333310#'.+!57!!57'5!!'5!DN5第w( k55555555%f@;  !OY PYO_ OY ?3+333?339/_^]++3339333310#'&+!57!!57'5!!'5!7+oXrk}Hrk}}r}[--q-- --\-;E=-g@5+ ##((./_Y" bY *_Y+(#_Y&?2+333?+339/+33?3+9999333210357'5!632!"/332&#"!57!;P⁠ZD3Cp555?O3+/&0-y55m532 y7+Hb떎7lrk}vrk}}r=5(/---- --P"RL*6K@&1  +& &78#._Y## _Y _Y ?3+3?+9/3+9933993210%27#"'# !2#'.#"327&46324&#">43(1K@&).! 230PY  PYPY%?2+3?+9/3+9999333210"&54632#'&#";&5463227#"'>54#"҄7+Np~kk%H>W0E- =<L9@  OY OY?+3?3+33399310%!57'5! '5![`\ZHJ--!--c--=w@I ?   @Pp  _Y _Y _Y?+3?39/93+3+333_^]qr^]933310!!57!5!'5! '5!!}-7nFm55lT55k55"LO@(    OY   PYOY?+3?3+3?3+3339933310!!57!5!'5! '5!![K`\Z--nT--c--T-L=@g  _?O@p;@ `p _Y    _Y ??3+333?39+333_^]qr^]]qr99333310#!57 !57 '5! '5! AkzJ{)7͛L555^@55b55 Xt@W  @adH$4Dd $D 9$d$!H@-H@0  OY    OY ?3+333?39+333_^]_]++qr^]qr+99333310#57 !57 '5!'5! a}m5o}ЁRl2tt-M------2>*L+=O@)    `Y _Y??+33?3+3333339333310#!57#"#!#'.+!'5!Ake]CkD7wL5; u55b-tR@  K@  PY OY?+33?3+33333?9333310#!57"#!#'&#!'5!|Aa}V0+7v7+0V}rtt- --L=!Z@.  ! "#  _Y bY  _Y??+3?39/+33+333993333310#!57#"&5'5!3267'5!AkbC˲|+jL5$,55q55bt \@-  !"  OYRYOYK??+3?39/+33+333993333310#57#"&5'5!327'5!a}m:qz}rMCe}rtt-=5)|A-->P!-->=%_@2 $$&'#_Y  bY $_Y?+3?39///3+3+33393333310)57#5#"&5'5!367'5!nvZ˲hyZP5*55q#55b%Y@/ ## &'"OYQY#OY?+3?39///3+3+333933310!57#5#"&5'5!35367'5!@}UBT!*qz}rMCT?X}rr-=)|A-->P---;=R@+  _YbY _Y  _Y ?3+333?+399//++9933310)574&#"!57'5!632|]謬,؊ɴ5-x5555?PpKL 'S@,$ % ()`Y$ _Y !_Y ?+?+9/_^]233+39333310"'53;! !!26?3# "!f:B0+>]P=4fKB{OOT74/+3DA&$J@&  %& $PY $$ QY PY ?+?+9/33+399322310"!4&! !3267#"&#"'533ho\ ji=g600V̬P,1-)ufRP 8.{L$+Z@.( #$)$,- `Y( $"@""_Y"%_Y?+?3+39/3+339993322310$#"'53;! !!26?3#"!f:B0+>]P=4fKBfs>{ !4OT74/+FA& 'T@+$%() PY$ @ QY!PY?+?+9/3+339993322310! !3267#.5#"'533"!4&3 ji=g60)NsP,1-)ho\)fRP 8+6{LJb=,+'5@] "" '233,+ +'76""'%'_Y!   %2++ +(@(/_Y( @ _Y ?3?33+33333+_^]2?99333333+33399933333333333210'!57 '5!'5!'5! !!57"&'3326735y`TɄT`y#`h]]h\555r55r55B 5155`gjjgz'5@; "" '233,+ +'76 77772++ +(@(/OY(L@*""'%'OY!   % OY ?3?33+33333?99333333+333?+_^]2]]99933333333333210'#57'5!'5!'5!#!57"&'332673vLJe2XqUETqX2eJLTUNh]]hsf'---b--`---f--gjjg;E=,q@;&',, -.,''% " _Y&bY&)"_Y _Y?+?9+3?39/93+33+3339939332310632!"/33264&#"!57'5!'5!qSD3Cq`wӬ/13+/kK5555~55%E+q@;$%** ,-*%%# OY$QY$' OY PY?+?9+3?39/93+33+3339993332310632#"'3324&#"!57'5!'5!E=y7+Hb>S3rk}}rvbLu/1-- --`--LC=N@( _Y  bY _Y??+3?+?3+33999333310#!57! #"/332'5!A2n!Xf^;-/2[u%L5r/Y%555bt Q@* !"OY PY QY OY?+3?+?+3+3999333310##57##"&/3326'5!/A2}+-?\D!7-,K+*rt-e 5  --;E=$i@9 %&`Y?O !_Y#_Y _Y?+?3+3?3+3339/_^]+999332310!"/332!!57'5!!'5!D3C第w3+/&55555%E"o@?#$PYO_OY!OY PY?+?3+3?3+3339/_^]+999332310#"'332!!57'5!!'5!ry7+HbHrk}}r}/-- --\-;L=j@9 `Y?O  _Y  _Y ??3+333?3+3339/_^]+9933333310%#!57!!57'5!!'5!A2第w<55555555b%t)r@> PYO_ OY  OY K??3+333?3+3339/_^]+9933333310%##57!!57'5!!'5!)A2}Hrk}}r}r6>-q-- --\--L=!X@-  "#  _Y bY  _Y?+3??39/+33+333993333310)#7#"&5'5!3267'5!kAbC˲|+jL$,55q55bt [@$  !"OY RY K OY?+3??39/+33+333993333310%##7#"&5'5!327'5!aA}m:qz}rMCe}r--t=5)|A-->P!--;L=e@3 _Y     _Y ???3+333?33333+39993333332310#!57#!57'5! !AA2#7L515555b/t^@/ OY   OY ??33+333?333+39993333332310##57#!57'5! !AA2i6^ssMBrt-0-- -W-)O&${N& %+5+5Hqz&Dr&&)1 %+5+5{&$jm"&% %+55+55Hq&Djs5&8& %+55+55=H;}&(N@ &'%+5+5PFz&H@ & (%+5+5TtLQG=Tt{&Qjm,&/ %+55+55G=&j`,&/%+55+55+\'3?@S "" '.((4: :'A@""'%'_Y!   %1=7=aY+7 @ _Y ?3?33+333332+3?99333333+333999333333333310'!57 '5!'5!'5! !!57#"&54632#"&546325y`TɄT`y#v8**::**88*)<>'*8\555r55r55B 5155*;>'*::**;<)*::'3?@_ "" '.((4: :'A@ AAAA ""'%'OY!   %1=7=SY+7 @ OY ?3?33+333332+3?99333333+333_^]]999333333333310'#57'5!'5!'5!#!57#"&54632#"&54632vLJe2XqUETqX2eJLTUd8**::**88*)<>'*8sf'---b--`---f--d*;>'*::**;<)*::a{*6Bi@71++7=%%(=CD4@:@aY.:"@(_Y""_Y" _Y?3+?+39/+92+39993333310#"'332654&/57>54&#"#632#"&54632#"&54632ݵ B+#7x}i}7} !Bݤ8**::**88*)<>'*8m+ R z!+*;>'*::**;<)*:::(4@o@>/))5;%%(;  AB,>28"@(PY L\ ""PY" QY?+?+39/_^]+929993333310!"&'532654&+532654&#"#5632#"&54632#"&54632!Un`J\pZxyVeYj)X$7o`Nx8**::**88*)<>'*8qM*<\fLYS\R[^zQo*;>'*::**;<)*::T= P@) !"_Y`Y _Y?2+?3+39/+399933310"&'332654&+5#"#!UKC%KHBvTE#;,8Q=Q9 ֲ!EST;0@   !!!!!!!!@3:=H!! !P!!`Y@ _Y  _Y ?222+333?333+333+_^]_]+]q9993332310357'5!5'5!!575!;wt5557(55b55_55mm%l@9 !!!0!OYQY@ OY ?333+333+?333+333_^]9993332310'5!5'5!!57!575!}r}rrk}Hrk}Atf--s----<$`--/mm;\'3@! "(. .455555555@6:=H55 5P55%1+1aY+@ _Y  _Y ?222+333?333+3332+3_^]_]+]q999333332310357'5!5'5!!57#"&54632#"&54632;w8**::**88*)<>'*85557(55b55_55*;>'*::**;<)*::%'3x@?"(..455505OY%1+1SY+@ OY ?333+3332+3?333+333_^]999333332310'5!5'5!!57!57#"&54632#"&54632}r}rrk}Hrk}8**::**88*)<>'*8f--s----<$`--d*;>'*::**;<)*::Ts{&2jm&&) %+55+55N&Rj&&)%+55+55TsL Y@3@ _Y?O  _Y_Y?+?+9/_^]+_^]r99333310! ! 2!"! TDL { ]6N }@/ 0? @@%(HPY  PY PY?+?+9/_^]++_^]qr^]q99333310!"&54632267!"!.HHvzv ~mԶ:Ts{&jm(&+%+55+55N&j(&+%+55+55q{*6a@2%+1  178(4.4aY".@ `Y _Y_Y?2+?+39/+2+39993333310"'332!5! #"#63 #"&54632#"&54632BA%5}D `FBTI8**::**88*)<>'*8?;)<.Z/+%3+*;>'*::**;<)*::E!'3`@2"(..45PY QY%1+1SY+ @ PY ?+32+3?+9/+9993333310!.#"#632#"&'53267!#"&54632#"&54632{zjH(7wT `n8**::**88*)<>'*8/+<*;>'*::**;<)*::A0!V@+   "#bY`Y@ _Y?3+333+?3+939999332105! '5!#"&/3326775!A-dIs{R-X -17IFt55L55٢KaqmmF&\@  & %+5+5A\)5b@1$*00  67bY'3-3aY!-@ _Y?3+3332+3?3+93999933332105! '5!#"&/33267 #"&54632#"&54632A-dIs{R-X -17IF|8**::**88*)<>'*855L55٢Kaq *;>'*::**;<)*::F&\j@ ,&/%+55+55A#)e@4$''!  *+bY&    $@ _Y?3+3332_^]2?3+93999933332105! '5!#"&/33267%53!53A-dIs{R-X -17IF('55L55٢Kaq!%!%F&\@ (&L'%+55+55\+7v@=& ,22  899 )5/5aY#/ @ _YbY _Y?+3?39/+33+3332+3_^]99933333210)57#"&5'5!3267'5!#"&54632#"&54632bC˲|+j8**::**88*)<>'*85$,55q55b*;>'*::**;<)*::*6n@8%+11  78(4.4SY".@ OYRY OY?+3?39/+33+3332+399933333210327'5!!57#"&5'5!#"&54632#"&54632BMCe}rrk}m:qz}r8**::**88*)<>'*8(>P!----=5)|A--D*;>'*::**;<)*::;L^=:@  _Y _Y  ??+3?3+39933310#&+#!57'5!^A>dAkk55%t<@   OYPY OY ?+3?++39933310'&+#!57'5!+oXAa}}>- -;\%1=u@;,&&28 8>?/;5;aY)5@`Y% _Y"_Y?3+333?3+3339/+2+399993333323104&+3262#!57'5!!57'5!#"&54632#"&54632Ԭ5h謬8**::**88*)<>'*8k~555g5555 *;>'*::**;<)*::%0%1=w@> ,&&28%8  >?/;5;SY)5@ OY PY % OY#PY?+3+33?39/++3332+39999333332310%2654&+32#!57'5'5!!57#"&54632#"&54632wve}}wi}}}rrk}S8**::**88*)<>'*8P[a_Q\-v|- -F----d*;>'*::**;<)*::;E^=&_@1 " '(#%#_Y ! `Y!!% _Y_Y?3+?+3?9/3+3+399993322310#&+!!#"'5332>=!57#53'5!^A>d|qr>>1-,+Zƚ{/fU5OZ5%E&e@5  "''( ! PY!!%%#OY%PY% OYPY?3+?+3?++9/3+399992233310#'&+3##"'5332>=!57#53'5!7+oX֚qr>>1-,+}}}}T{/fU-{TQ--EJ=)[@1 '*+$`Y _Y _Y?+3?39+333?3+999333210 !57 '5! '5! #"'5332654'zJ{)7rg^^OBF*L^aX55^@55b55 ߗf[p_mE(\@1!#(()*(##!!OY"%OY PY ?3+?+3?39+333999333210#"'5332654&' !57 '5!'5!DxP;/ 5O`48m5o}ЁRl²mmT8V--------=!c@2   "# _Y `Y!  _Y ?3+333?39/33+33+3339999333210!!57 !57!5!'5! '5!תzJR~)7Z5555UZ55b55!c@2  "#OY PY  OY?3+333?39/33+33+3339999333210!57 !57!5!'5!'5!!#=}m-o}ЁRln-M--TG----Tw-D]=D@$ `Y _Y`Y _Y ?+3?++9/+9933310;#"%'5!!"&5463 5k~555b5JGD_= -O@(&&./_Y% `Y"  `Y) ?3+3?9/3+33+3993933210!27&5#""&546;'5!3265'5!#"&' (ygB|5Tf`ZM~<k$T ʹ55_y55$*NJ#0W@.$,,  12OY " OY""/PY 'QY PY?+?+?+9/+3?+993933210#"&'# 432&='5!326='5!3267&5&# ro(SRloDW^^X}=~/Yrd;>B7!-~-/Mtm\M.Z@.! * /0+-+_Y! _Y- - _Y'`Y?+?+399//+9+3999933910#"&5%'57>54&#"#6323265'5!\˻яzr~8!B复Z``ZR w!+5fg0`@2" &, 12-/-OY" PY/ / PY)PY?+?+399//+9+3999333910#"&54&+532654&#"#5632326='5!gro[xyVeYj)X$7o`N`cX]^X}dULS\R[^zQogQky~-ntQM#P@) ""$% _Y _Y#_Y?+?+39/+9999333310%##4&/57>54&#"#632QAaţ~|~8 !Bꤍ6>w}R u!+ftz$T@*  $$%& PY PY$OY?+?+39/+999993333910%##4&+532654&#"#5632zAapZxyVeYj)X$7o`NUn6>LYS\R[^zQoqM4=*W@-  &+, _Y')'_Y))bY#`Y?+?+?9/3+3+33993993310#"&5! #"/332'5!3265'5!4ɱ!Xf^;-/2[u%Z``ZZr/Y%5555,^@1 "(-.!OY)+)OY++ PYQY%PY?+?+?+9/3+3+3993993310#"&5##"&/3326'5!326='5!r+-?\D!7-,K+*rW^^X}de 5  --Ӏ~-;=)^@/ %*+&  `Y(_Y" _Y?3+33?3+3339/3+339939332310#"&=!!57'5!!'5!3265'5!ɱ第YZ``Z5555555":)^@/ %*+&  PY(OY" OY?3+33?3+3339/3+339939332310#"&=!!57'5!!'5!326='5!:r4rk}}r}rW^^X}de-- --\--Ӏ~-TL!B@!  "# _Y  _Y _Y?+?+9/3+39933310!"$5!2#'.# 326='5!ͨ^XBF`負4Zc3ۮ+/Ѻ5N}B@!  OY  PY PY?+?+9/3+39933310# 4632#'&#"326='5!)vs7+S`wdr]Nicz(/~B--%=!U@-"# _Y   `Y  `Y`Y?+?+3+39/33+393310#"&5#"#!#'&+3265'5!ȳ3ZC`DS1Z``Z^;5!K@'"# OY   PYPY?+?+39/33+393310#"&5#"#!#'&+326='5!r9Xo+7k7+oX:W^^l}d ~-]MRE(Y@3   %%)*PY L\l  PY #QY?+?3+9/_^]+99993210 4675.54632#'.#";#"327`nUN`o7$X)jYeVyxZp\.LroQz^[R\SYLf\<*E2=%F@%""&'"$"_Y$`Y$bY`Y ?3+?3+?++399939310#"'53325! #"/332'5!2RiOBF*n!Xf^;-/2[u%tr/Y%55L&F@%""'("$"OY$PY$QY PY?3+?3+?++399939310#"'533265##"&/3326'5!\@Q/!2;<+-?\D!7-,K+*fsm~e 5  --TL4JLT=:ZD!@ @P`/]]29/3310#54&#"#546753f&03'dCFfHC/6..6/1XZ ^^ [W+N #(@ @ H!e?3+]q223104632#"&74632#"&4632#"&+. ".." .. ".." .r. "--" .o -- ".." -- "..".." 00mN e?10#7'7'7vVVVVVVVVVV^N "@ @ He?3+]q2104632#"&4632#"&`. "0/# .0 0/!".m"--" ..".0 0.`N (@ @ He?3+]q2104632#"&4632#"&3'." 00 ".. !/." .om"--" .. 0/!"...nN/]2103"&5DtfR\ijhX e?10'7P+! @    e?]99//3310"&5463232654'7#"&'.%9mRA/Q5(7 %9mQ>2S4,19&%@H&xAR5J9/&%@H)uAR6I>*Ne?]21044oqhN\hmB/10#'73B)@ @ /3]29/10#52654632#"&ev. !/." .Rji\ 0/!"..NHe?]210463"fsNme_NHNH@ e?2]22310463"!463"fsIfsNme_me_'T+7'@55#//)?)O)) P##/]3]22333104632#"''7&732654&#"'#"&546324&#"326TpPRqsP0.NKP`8()8:'&:PKN.1PrqQPq`:'&:8()8NPrrPRoPLP&<(88((88,8&PLPpQQqqM(88((88T@/?OP  /]3]2104632#"''7&732654&#"TpPRqsP0.NKP`8()8:'&:NPrrPRoPLP&<(88((88\N@  e?]29/310#"'#3326=WW"ee !0&2Xf fL -72D!@@P` /3]]9/3310#5.=3326=3EFfCFd'30&ffZZ \\ Z[1150051H/]210!535#j^/10#'73j/]210#5265ftRjj[H@ /2]22310#5265!#5265grgrRjkZjkZb @/]1057'%㍪3P3L\N'T@/ ? O  P/]3]210'#"&546324&#"326VPKN.1PrqQPq`:'&:8()8N8&PLPpQQqqM(88((88D^N e?10#'73NHNe?3]10!535jHP= @ /?O /3]2104632#"&732654&#"sPQpoRRqc8((8:&&:RPprNOtrQ(88((88P @ @ /3]q2104632#"&4632#"&P/!".0 00 0/!".b!/0 ..".0 0.- #/;'@39!@!!!- '/33333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&. ".." .. ".." .r- #--# -I. ".." .0 0/!".` .. ".." .. "..".." 00".." ..".0 0.@@ /3]q29/3105!74632#"&4632#"&G8-# // #-- #--# -mm@".." .. 00 "..!@@ /3]q29/33105#5!#74632#"&4632#"&nGj-# // #-- #--# -rmmr".." .. 00 "..PB  /3104632#"&P/!".0 0!/0 ..=D  /333104632#"&74632#"&0 0/!".. !/." .".0 0." 0/!"..= #@!@!!! /333]q2104632#"&74632#"&4632#"&."".0 0. ".0 .u0 0/!".b".0 0/!".."".0 .. 00\ /]310!!H}j\ /]105#5!#5oHkujjuP @    /]]3104632#"&P0 0/!"._ 00 00P #@ @!!! /3]29/3104632#"&4632#"&4632#"&. ".." .0 0/!".0 0/!".`".." ..I 00 00H".0 0.qP  /3104632#"&P0 00 0#--# --7/310537nL/39910!!<L\f@ ?/]]]310!!Hfk`//93103` w,P @    /]3104632#"&P0 0/!".| 00 00P !@  b?3/3933310%#"&54632#"&54632E34EE43EE34EE43E\1HH13FF4EE41HHP  /3104632#"&P0 00 0f 00 "--jP  /3104632#"&P/!".0 0!/0 ..,7@ %).-'*'A gY*agY_?+?+393107467>54'.546;2654632+"3!!. )(8QL&)w-R2 !!3-!"!VXe/X=, Y.wV;6: .s5 /]10##57#5!m͠k`JF@)$ 9-0) KL;H;h@ Y-9 4H_! a?33?39+393310&#"#"'&'!53254.546?'&54>3267"&54632372% 0[7?* bI@*.-+k-%-%YM5>&  m;F6\6=,"%+|E6"B0EaD2gB-bA?b/6&?0DXlAE7#IF!@,.נ{;3,S C#5@ %$ gY_"gYa?+3?+9310)7!>=4.#!"&546323!23Z5T/54.+"54632;2b 'P[ 49@-*f' B'M@!  R'd.H t4'4Z676-S8s2Y50)=RmK̝QVy*)@ ,+b%gY%_?+?9310#"5765/467!"&54>323!2yg j 1:3- -  T%(H GaBE6<& f-E6@3=!=GFCC*8b*gY*_?+?39/93310#"57654'&5467!"&546323!2#"5765'4>32/%4  2)09,C>4B 4B  &M9++"+ 4o{#Gg=E6.U4>B`2,-!@fE;A1m&! a gY_?+?99310%#"&54.+"&54632;2m7  +;00)>I>Z9:2D35R  5?w-)@  " /. +gY+_?+3/9310#"'&#"#"57654'&54>7"54>32;2 01X*%" -s :_NH2(C]GiiZQT\8}'>$&)<5@(1(>= #b.8.gY8_?+3?393310#"54654'467!#"5765/467#"&546323!2)>##'E $$:* V@K?3<,+%6::3gY:`$gY A gY_,gYa?+?++?+9933310!4&'&5467"&54632;2#"'.#"!>54&#"'632j*X '"?H/ -NE@   C8I)\HKVBu] 6I2awο[}!t3'"$@ $#gY_?+999310#"&54?>54.+"54632;2([` EJ/@s, 'ZP7NscF)5g;*,w1R "(_qN & "!cgY_?+?99310#"&54.#!"&546323!2N-  ,00)I>083D35R  5?} 2@ "!A gY_gYa?+?+9310!7!2>54.#!"&546323!2}<5OY6.^VV.2*-TWE%o8fqmFE4/T ".VF7@  ?## HG1A ^bB gYB_?+??933310#"&546767>54.#!"&547654&'.54>323!2VWcJ."%-FU%W]^1O+,"% )' V%'/''77#"&546323!24.#!!6^f:$#2<+ )IcQ3^!CTEJ, @TBO$F3,U 0jLLt}ș9T;T@ %=<499A gY9`."gY._gYa?+3?+?+9993310!7!2>5!"+"547654.'"&54632;2>7632T/{! JG )f[,?5:$/_RiT Mg2Vu4|+ $*MB.I &>?Fak4 =d()@ (*) d$gY$_?+?9310#"57>467>54+"54632;2( V 9@y)'{A,;L'-uۗREG25) %1KTP*b5IPKM{Zo֑sV2?,]6~V]#Nje3YG@B94 [ZJ%gYV%_; gY a?+3?3+3933310!737654.54?"54>32;2#"'&#"!254'&54?654+"&54632;2D& 5)1)& ;780  2+,1 :@%39' -;AD#MٿLQQ}<$3bjyKBP88& )/)%; $,>uh9<FE>UKL7=8-\ 6Vw<I@ <(/(<>=% hY8c,8,gY8_?+3?9/+9993310#"&54.#!2#"&'4&#"#"&5467#"&546323!2# *36Y7T26& )826PD4.8, \J16%/(61Bl ., *tFZM<3*c Rk=<X@ (.(>=%!h@ Y7+7+A gY7_gYa?+?+39/+9993310!7!2>54.#!;2#"54&#"#"&547#"&546323!2Ŝ4I[92P_3P%0!18'"6d504,+RYE%r:lqr7!5511g"3a@:3/^  .o{GE@58.#IH5Cc 8*CC8gYC_?+333?99333310#'&#"#"&5467654&'.5463267"&54632;2 +Tͧl$ & '%(?9, D/5@E- CE4>2;>60"@)Gɰ!1dUJ4B&[)9-(6M;lmgu;0/d)01LW@ ;>8 ) NM ;I&?I?gY2I_gYa?+?3+3399393339910#"'&#"!7!254&/.54?4&#"&54632;2>7#"54632;2 RTO(Ƣ(49xq 8616* )3ED9KPp, @ @:$: BA>>,A b7c,!gY,_?+??9/933310#"&546?>54.#!"&546323!2#"54>32&Fqc? 1#/hq>b\:=+5+ 0O6E% D yk/<2I>;2(3,6)WJ(?QY[*f3A06S-X5N&! a gY_?+?99310%#"&54.#!"&546323!2N7  ,00)I>Z883D35R  5?N`R@OA,F)&  ),baRA,gY^6_)FFgYa?+3?33+33393333310!&5467&54632#"'&#"67.54632#"'&#" !676?>54&'.54>32AW5V- )VbP,=*%,hM(o4iD5.S /tN>6@ >'/'@?#a ,9,gY9_?3+3?393310%#"&54.+"&54632;2#"&54.+"&54632;2N7  ,>/1)?e97  +;00)>I>Z883E22U  3Ww9:2D35R  5?3V@9@,3,&B#54.+"54632;2V7  ->.0' ?e9P([` EJ/@s, 'ZP7Z881D3/X 3WRNscF)5g;*,w1R "(_3'w#F9@$292, HG))BG7B7gYB_?3+39393310#"&54?>54.+"54632;2#"&54?>54.+"54632;2w-XN  EJ/B s, 'ZP7/([` EJ/@s, 'ZP7;ZLU4#5g;*,w1R "(_UNscF)5g;*,w1R "(_Nm _?9310+"&54767>;2HV3# <\Y  -#@Nm+!@ !!-,)_?32993310+"&54767>;2+"&54767>;27GL! w>HV3# <\m  ,EY  -#@W@+  PY OY ?3+333?339/3+399939939910%!573!57'!!Rj<GwZzVW---l--{#&@Q&%%!  !('%  PY&PYPY & o&O_o &&  OY#?3+3333?99//_^]]99+++393933339939910%75#!57'5!#'&+373#'#32?3!hi`m?\s>>إT(? h---%-np zH*6=m@<;1::5))>?7&7PY;*;PY1**/*_*o*** $"&+ QY ?33+3?3339/_^]3+3+399993933321054.#"5>3263232?3#"'#"&="7>54265!^3lY602S\RGJdS"8{FXs a<_WWZww= 8 -ey;a\/u#JNRD`0an唸% )h@<%!   +* PY!  O _ o   )PYOY PY OY?++?++9/_^]33+339993333210##!57#53'5!22654&+32654&+ppW~~~~ݷp{jjxmozf P5{-vPZ-nu:GVc_QP`PM.p.@ OYOY?+3?3+993310"$5!2#'&#"326?3퓱=`Q$ ;O&8#% 8@  OYPYOYPY?3++3?++9933104&+326 #%#57'52ŻjdN~~ܻ- -%f@;   ! PY  O _ o   PYOY  OYPY?3++3?++9/_^]3+3993922310 #%#57#53'5#32654&+~~~~dNŻj-vPZ-`Pƻ%,\@5  PY  O _ o   OY  PYOY?++3?+339/_^]+99992310?'5!#'&+373#'#32?3!%~~?\s>>إT(? - -np :(\@4(%%)*PYO_o ""PY" QY?+?+39/_^]+999393910!"&'532654&+532654&#"#5632!Un`J\pZxyVeYj)X$7o`NqM*<\fLYS\R[^zQo+E :@   OY SY OY ?+3/+?+39333104632#"&'5!@-,@@,-@ 砅,@@,-@@{f---6*@  PY OY?+3?3+93310'5!#"'53325 DuI[C7 4Uf--hKzx%\@.   OY   OY ?3+333??9933+3399993332310'5!'5! #!57}rb@ukm^}f--a-- -Y--,P@)  OY PYOY?++3?99//9933+39933310)5757'5!732?3}}|ΰ|N+?-NPN--xPx /b@3    OY OY?3+333?3?3+333_^]]99933332310'5! !!57#!57sMBrri6^sf-W---0--%_@20OY OY ?3+33333?3+3333_^]99333310'5!5'5!!57!57}r}rrk}Hrk}f--s----<$`--NR<~/@ OY OY?2+?+3993310"&/332654&#"#763 ML; $Q`=#8& >| &@SY SY/+/+993310 #"&546"32654&(º|Hڴ~uw:;}'@ SY/3//+99333310%57654&#"'.54328#&H=`Q$ ;OIS"U@/   #$ SY  SY/3+/39+99993322910%!"&547'563 %27"654&}@y;{ѡ[T]DLđwܕeTh{uHaVl>|uk32632#"'# 52654&#"!265!m3+/Nacc_nabmqjk`eSȫ 8 -RdǸ7F#,z@F*  &&  -.((PYPYO_ $PY #PY?+?+9/_^]9/++9399939329310#"&5467.54673254&'254#"Ԩ^ShuueUZRFFRm rxLv {U]wmGfd QE8HUƶh^N &@ PY ?+2933310#4&#"#4632~tüN *@    PY?+29/933310!"&533265Hشw%hD@$  PY  OYPY OY ?+3?++9/+993331032654&+!57'5!2+HevweB}}VwQ_a[- -7tfy\@0  PY  OY PY OY ??++?+339/+3999333223103#57.5)!57##";Qdo}}b{fzou-n`---M[YV@.     OY PY  PYOY?++??9/3++3399933322310) 467'533'5!#";hrodQ{}}uozf`n-lM--Y[a7@  PY OY ?+3?+3339310#'&+!57#"#a7+oX&C%Xo+7-- 93@  OY QY?+?3+333993310#"&5'5!3265'5!vu恄|Qfڪ4--{s,--%2@ RY RY/+3/+993333310254'!#!73)#Ŭ-f-L'9-|l3wG?x5!".O@&&&  ,,/0#))RY RY/+3/+99339993333322310254'!#!73)#2#"&5462#"&546-f-L'9-*;>'*::**;<)*::|l3wG?x8**::**88*)<>'*8%2P@'+& (  34"RY"". ).RY) RY /+/3+9/+3993333333310#!'!254.'#!'3!2654'!#3!730549+B--W 6A--XSY-- -W:EtMDvzyEE?UUYwwYZ7T]:N@(     OYPYQY?+?3+39/+399393310"&'532654#"#!DJ\|dh+7x*<\f\n5G 5j='A@!% ()  PY%!PY?+3?+39993333310"&54757>54&#"#563232?3ڼ3XbpoeK#B3YalseK#B{oq OSQL1+{oq OSON1+G*9@ ( (+,  $ PY' ?333+3?933999910".'#"'5332>7.5463232?3^5J+4{fW@/' ,6HB5{a~z_1cL, '/@"1e;IDo;Q\\č H>o%7@  OYPY OY ?+3?3++_^]99310#'&+!57'5!7+oXC}}-- -N%E@% 0 OY  OY?+33?3+333_^]993310'5!!57!!57}rrk}Hrk}f------%h85#\@.  $%#OY  OY OY?+3?33+3339/3+39333333310%!57.='53'5!>53prsuY]iurj^XF--,kp-->nm',ݛO@+      OY QY OYPY?++3?+33/+3_^]93310726'5!!57##"&/3,K+*rrk}+-?\D!7-V ----e 5 2a]V@   0@   >?3/3333?39/3393993339910!573!57'!![rflPQR  y2W#&o@+&% % ! '(&_o&&#% /@ !## >?3333/3?333399//]339333933991075##57'5!#'&+373#'#32?3![}_RcU'9R&&m0#' [R  `a Nk,.W$K@ %& _o/##>?33/3?339/]3993339104&+3264&+257'5!2#%HYk}b[?33/3?339/]333339333339910#%#57#53'5!234&+24&+326bhvvhp=3o~?333/3?339933104&+3262#%#57'5гlHchhhʦI>  +2WC@ _ o   > /?333?3339/]39339107'5!#'&+373#'#32?3!+hh\(9''ڟ/"' }R `a =2W@@  _o/>?333?3339/]393310!'3;##533#"#5!} '"0''ڄ3(\hh2Օ Ha`; :-&L`5@  0??3?339/339933310#"&5!2#'&#"32675'5!(Z0ng)O\6$c>!!*2ZWI@     />?22333?333339/39933331057'5!!'5!!57!*hhCh{gAgggh2  < ; S +2mW '@  />?33?339310!57'5!ghhBgb  &W%@  ?/?32?3393310'5!#"'53325g5[7_=J2'8T' Yv@Sr+2sW`@    /@    >?3/333?39933333399993332310 #!57'5!'54]XWmthhChPW H W  { 52W)@   /  >?333?339931032?3!57'5!}6%' hhX7?  )2'WT@     /@  >?3333333?3333399933332310#!57'53 3!57 lhhhhl2|  d ; A2yWE@ /   >/?32?3333?3399333310'5!#!57'53lg:lhh'  \  *2ZWP@    //@ >?2233323?33?3339933331057'5!5'5!!57*hhCh{gAgggh2  - ; M  "&5` %@  ? 0?3?399331032654&#"!2#"&~í&p#,R@&** &&#  -.((#$ ??3299//399399939323910#"&5467.54673254&'254#"zz`WexwgRe}H<=G"fp `dLi gVuyztSj cFTS 6 @4BM "^X*2W7@   /  >?33?339/399333104&+326!57'5! # `j;?ea`h0'heTZ  }*29WM@     />?3333?339/3399333339310!57'5!2#74&+326z`h\\IWYqgklZ  gpSu a\NQ2W3@    />?23?3333931057#"#5!#'&+5()=2  }} @ .&rW/@   / ??3?33333993310'5!#"&5'5!3265lhgAgmhuy'   mnojyW8@   / /333?393333993310# #'5!3'5!, F3vѶ} F+ .7 && s#C@ ## $%#! ?><?22?39/3?33393333102#'#"54>?54#"#56327^UG Dj1X^UW?/"dOP9V;GsNL8D3232?37>54#" ^VF ^1fTW<2"fNO;V>D&MM}8 $TTXqF{!:Aj!'&RuB@   ;  <?>??333?333?99333310#'#"4632534&#"327R Ek}nf1ddMA:CUDMAMF7mzor>&u&17V@6%,505%8922 "?@ ,6&& ?'  <?3333?39/3?3339333331054&#"563263232?3#"'#"&=%"7>54265#^GNDRN`7Uv1X^UW<2"dGe)5^ij&EMOP9W:3M6eO".MM , <??332?333?3?399333310#"4632&='53#327&#"EZD@_EߜE52H\6!1 $&u5@   < ??3?399//99333310327#"&532'"34&WXDR`7|ف7N yf"%1k\$&u3@   ? <?3?39/39933331054&#"5>32#"=25#WXDRa7|ف5M yf"1g`&u)8@$ ) *+ <'??3?339/3993310#"&54675&54632#'.#"73#"'327R}nuFAo~iZH":;BJ"p),RGT]\6ZS5K'XDLuD 50Q9 ;+6?!&u(8@## ()* &?<?33?39/399331032654&'#53654&#"#'632#"'!ZWGR,)JB<:"HZi~nDCuo|R?6+; 9Q05 DuMCY&M2R[6')A%1=`@,),,;5&$!  >? )2!$))8"</.?3?3399//9233999333322310#"';2#"&5467.57&5463274+3262654&#"um5&&, [Xrz9,3^^wmB-S(T KMldB65BB87ad O OF_pFB(@9!k-_bCW.HA3-PtKLLGGLLK8+f -@   > ;?33?329333104632#"&'5!#b&''&a$`Py&&&& %2t^@ ,@  >;?33?399333333?3999933323107'53#57'#57'53:F=4J!!<?333?33333333?3323393333310>32>32!574#"!574#"#57'53*j$_"*)IT`g TSfE>TGG8$A)hg 'hgB3, u!G@ "#<;> =?33?33?3?333933310#"'533254#"#57'53>32 [W).GW<9LDD!i!uz xBk?.'%&.u %@   <??3?3993310!"&5!24&#"326.lJRNGGNRJOח&vnrz &u'@  ?<?3?33993310>3 #"'533254&#" i8YX!/HagUDG֍dm#N,u !@   <?329333104&#"#!2KQNGlNvn'#&,N !@    ??32933310!"&533265,lGNPLNؗqw-,OuG@  ! =<;?3?333?9/33399333310'53>32#"'!574#"32t@R.kwz@AcGoG.9<<! D> #&e-@   ;??2?333933310"&5#5?33#32799JK=%$'-K&E=2'( ' '&hf=@   ; ? >?3?333?3339933310327'53#'#"5'53`IBUG"t*Hg.&p+Yl*@  /33/3993333310254'!#5!73#!#5gB .&`IBUG"t*H,#f-]@ ##** ./*->@ )$ & ;@ !##??3322333?33333333?393333310#"'#"5'5!3267&5'5!327'5!#*j$`!2z'IT`a U SfE>TGG`$A&sg  'sg &`f3@   ;??3?33333993310#'5!'53H,:ZY6&z ,2a'8@ & &()!$ /33333/9/93999910"&/#"'533267.5463232?3>G!J=2(1:(G=^LIb:L-<,*2(-##,) zC &>M{9OeeO8wR@$ Cz 3,!&L@  #'( ##$$?-=??3?3339/39999332310#4632#"'4&#"3254&'5>dx~hrOB\S|oWH8=OBCUSdVF,;maOljZy~ ~GX{[c/[ ,f5@ = ;?33?933999332105337654&'53'47' *[f#t4_AK^lV,&3v}j|$& *?@ ($$+,(( "? -?33?393999939923104632#'&#"#"&5467.3254&/hS=W!<133XRH{vsrj5>GH69UDEM{A0)"DGCR~}o/WY\lIk0 }#,v"F@  #$ < ?=??333?3339933393310#5.546746324&#">v?cv92TSHE^g41CVR, +ruwt oU] )t z,/f<@    ;=?3?399999323310.#57&'53673ry -@  E H?33?32933310#"&54632!57'53&''&a`P7''''#3K9@   E HF?2223?33?3993310#'"!57'53>3#S`GG+v"B [F"3.?o;@   E I  H?33?33?3339933310327'53#'#"5'53`IBUG"t*Hg.&p?a1@   EI?3?33333993310#'5!'53I,:ZY6z 5E#&D@  #'( ##$$JG??39/39/39999332310#4632#"'4&#"3254&'5>dx~hrOB\S|oWH8=OBCUSdVFE;maOljZy~ ~GX{[c/[ E3@ G E?3?933999332105337654&'53'47' *[f#t4_Ad^lV,&3v}j|&E.$3@ %& "GF?3?9/39999323107463 #"&'##&/.4&#"326&Dh"KPH"tG~JRFNRJ+B9vN& 2, %zow$E"D@ #$ E IG??333?33399993333210#5.546746324&#">w?cv92TSHE^g41CVRE +ruwt oU] )t zE0.@   EG?3?39999910.#57&'53673r35'5!3274&#"3263 eU! dVN& )34 eU/I#U;tTu|pmN&'-6rlf-#b  JP*4u@@+ 00''56*'OY*$RYRY$  $OY1 3PY0.QY?+33?+33?+9////++?+9933333310%# 432&=&#"#>325'5!3273+'!327&# qloK")34 eU" D$!U4 eU tqZYrFZ!q$-6rl m-bpm?-;'2c@7+'(34#PY *PY-RY RY00'PY?+3?39////+++3?3+9992223310"'!57&#"#632#5754632#'&#"3#326737" '4MB1-"0?44%+0 4T!--!m$-21'B{pT$2D.7FQ@SP((3C@I"8 "--RS#'8RYP'RYCI818PP81+664OY6("-+-OY +;MMRY@O ?33223+3?33+33333?+9////99++999993333333223310>32>32673!575#"'!57.+!57#67'5!54#"3%254&#"6FK@EuMDB4tyU%8BdUVwG4xwEE?dUuUUX*`+:49+B >~C--+--A,w--g"=~DV- 6A++SY+7q@=,' 1 891RY,RY$1 ,, 1$**(OY*  OY75RY?+33?3+333?+9////++99333333310>32>73!575.'!57#>7'5!54&#"DM:z|(,4 K;rk}5ea]+jqH4 J;q 4fa\,QUZ`,9?Px--$+* --x!OTt4-$+* S_L.8t@@5'/9:57"7PY)RY RY,,$"42QYOYOY?+3?+?+33?39////+++39933333310"'!575&#"#632'5!>32#"'326734&#"32m@w6" '4k*Iqf7$+0 4}uNYj9//#-2-7$,H)+&2D!+d@6$,-# RY&RY RY))OYOY?+3?+9////++?3+3399333310"'!57&#"#632'5!>;#'"32673rBw6% '4w <<+:226!+0 4H--g&-2-u2\n#2Dq)O@+$*+ RY"RY "" ''PY'OY?+3?3+9////++9933310#'&#"32673#"'!57&#"#632>32q1-"0?45%+0 4@4$ '4 LC{p%2D--i$-23D@!)/""45% %-PY)% PY ?3+?3+99//9999333310"#67&54632#'&#"32673#"&'533254.(&4 Gg/*5rQU+N2('4 AF0-1Kx,Q%59.E|m/PD+?.L&378LD1D2K--T@.&"./%"%PY(RYRY++ @" QY ?+?39////+++3993333310"'327#"&=&#"#632#5?33#32673j;0:S#8`_0" '4{}e?<$+0 4RABArg -2-'T)2D7T+_@3#"  " ",-%RYRY((  PY  PY ?+3?+39////++999929939910"'!26?3!5&#"#>32#"#5!3267347;9~3/3$45 4 ne2=8h/1)17 4 oO-4C}u!1m3C{vL'4@p@<(8>,//#&  AB&#5PY++ RY#++  ;PY$ 2PY?+?+99//99+3+3399933333321046327.#!"&54>32#"&''7&3!>54&#""32654&¶RF?H6ꘓuM[9Nú%r!#C)FGl*5|Mm[^hm^\xtiUvm5kA\5Jٚ o+K9@$o0VK|}qx~~~38a^F@      /33333/3333399//9933331057'53!5'53#575!3GGGGFFGG8      =Dw'W@, $ ()  PY$PY?+?393+393399939932310"&5467'5!"#5!32654&/ԺX"8h/ӰUIWmxu9HvDD˵c5E1a`{bP"` ?@S730(=8", , @A=8=8)?>>;;9OY;773-636PY2@03*)& & QY &RY?+33?3/3+33333??3+393?+9/399339999333332223310>32!574#"!57327#"'#7'#5?33#'5!73nH?z|rk}_dwm;0:S#8o08f{}e?2udh.)<--^--ABAOO-'T*1-+C@"  OYPY OY?+3?9/3+3+3933310)57#53'5!3#suurr-pT\--T+D@"  PY OY QY ?+?+9/3+339933310327#"&=#53'5!3X/&.C#n3US+AAArgT\-^T!L$*z@?(# )!!+,'%QY"PY(OY  OY #PY?+33?+3?+9/33+33?+33993333333310##"'!57#53'5!>3232!"!F ׿qf@wmmk*I F BYjuN H)//#T\-7$,1{!!R9$U@+##  %&  OY" PY QY?+?39/33+33+3339933333310#"&=#53'5!!'5!326=!vvvu|Quu&vT\--\--T{s|yN*1|@D//  $..(23$RY/PY( % /   +PY?+?399//_^]33333+33+393333333310#"&'#53>?#"#7!!.'!#'&+3267! HJ?.(7jv G uj7(4>K䋓WT5 flkf 5TᆙE".Q@,**"# "/0,PYPY)&QYOY?+?+33?3+?+9333310'5!632#"'5332>=#"&'4&#"326/dsqr>>1-,+dVNu;tTu|H-6N{/fU6& JE",h@8#(( -.OY)+PY(&QY OY PY?2+?+?+33?+33?+933333310"'5332>=#'# 432&='5!327&# >>1-,+ qloDtqqZYrE{/fUFZ!-'?E*d@4"&& '#'+,PY%PY"& PY PY?+?9/+3?3+3?+9/999322310"'5332>=!57#5754632#'&#"3#o>>1-,+^MB1-"0?4qE{/fU-! 1'B{pT!XF:GS@L(035* 77UBQ*'K55'*!!TUPY(HPY6 PYHH66H-$??RY?-NPY1-EPY?+?+?+39///9++3+3999333233910%"'5332>=!#"'3!2#"&5467.57&546327!4&#!3262654&#">>1-,+RF?H6uH`9Nú%t#CuqFG*5|m[^hib`{/fU kltiUvm5gE\5Jٚ o+K!9@$o0VK|u}qrx'E(w@=##""% "$$)*"OY##OY$OY PY?2+?3+333?+?9933+399993333239310"'5332>=!57!57'5!'5! >>1-,+V{dw1bLuXfqE{/fU----8--)E<@ OY OY PY?2+?+3?+9333310"'5332>=!57'5!->>1-,+sFqE{/fU--+E@y@>0&&= +<+=!574#"!574&#"!57'5!>32>326>>1-,+EE?BUUXVwwK@EuMDyqE{/fU-X 6A--XSY-- -L+:49+B/E+]@0 ( '',- ##RY#OY'OY PY?2+?3+333?+?+339993332310"'5332>=!574&#"!57'5!>32>>1-,+}QUZjqq M:z|rqE{/fU-XS_-- -L,9!E(2j@8/ %%)##34. ,QY OYOYPY% 1PY?+33?3/3++3?+?+3399399323310"'5332>=#"'!57'5!>324&#"32>>1-,+jqfJwk*I=q}uNYjE{/fUWH)//-7$,v!)E#U@, $%RYOY OY PY?2+?+3?+?3+33993333310"'5332>=!57'5!>;#'">>1-,+ww <<+:22qE{/fU- -u2\nBTE7Q@*, $4489,"")PY%"4 PYPY?2+?3+33?3+9999933210"'5332>=#"&'533254/.54632#'&#">>1-,+XF0-1Kx™Ye\2g/*5rQUMNZ?#qE{/fUGDz4!DcF|m/PD9N2.CV?gE`.T@+ +* "++/0* PY**&PY"PYPY/+3?3+?3+9/+9999223310"'5332>=!#"'5332654632#'&#"!}>>1-,+MB1-"0?4LC1-"0?4q{/fUk{p>{p͚EM@' !OYPY PY?3+?+3?3+333999933210%!#"'5332>=!'5! '5!N?qr>>1-,+}`\Z<͚{/fUkz--w--E*j@8' $ $&&+,$OY%!&OY PY?2+?3+333?39+33399933332310"'5332>=!57 !57 '5!'5! >>1-,+}m5o}ЁRl5nqE{/fU-M------.7ET"M@' $#PY PY PY?2+?+3?3+339999933210"'5332>=!5#"#5!!26?3q>>1-,+=8h/9~3/qE{/fU-/1+HEv*4e@5/44(  56+OYPY1QYOY($PY?+3?+?+?+9/9+999333333210"&=#'#"4>?54&#"#563232?33267unrRGJdS"8{u+,-1>_Dc2E^rey;a\/u#~Ve/{^nJE,_@1& ,, -. #PY ,)QYOYPY?+3?+?+33?3+?99333333310"&=#'# 4325332?34&#"3267punvϸVz,t+,-1>nsoaoIz\Ve/{з26JL /\@0$* $01-PY -))''PY' ""QY"PY?+3?+33?+33?3+9933333310327&# #'&#"32?3#"&=# 432'4632qZYr1-"0?4<;2!/Q@ploLC;'O{p^~mhUCPE&#*W@-'(""+,'PY'' $PY QY PY?+3?3+3?+9/+9993332310326732?3#"&=#"&463 "!4&=g60+,-1>>unihοiho\P Ve/{#fROE&<k@:+:$  1 1=> #&#&QY ## ##PY1..QY:6PY?+3?3+3?3+9/_^]+9999333210"&=#"&54675&54632#'.#">;#"'326732?3unrygб09a.dmC8( DEHwE\+,-1>E,[}=p$qYPD]` eFZhVe/{;E <l@;1& &(; ,,=>(QY  /#/QY1/ ##PY#:6PY?+3?+3?3+39/_^]+999933210"&532654&'+532>54&#"#'632#"'32?3un]AwHED 08Cmd/`90ѸgyĶr+,-1>EjXGd `\EPYq$p=}[,Ve/{GE'.Z@.,+ %  /0, ,PY QY(PY%!PY?+3?+?+9/3+3399933333210"&5## 5!54.#"5>32332?3265!"un˯B=g600V\+,-1>Phon\ERP 8.Ve/{+EL$M@(  %&"SY OY  OYPY?+3?+3?++933333310"&=!57'5!32?3#"&54632uns++,-1>@-,@@,-@E- -Ve/{,@@,-@@NEN&@@! '%'(PY QY$ PY?+3?+?3+99993210"&533 4&#"5>3 #"'32?3Hun7+St D,.\_n+,-1>E/Ե<#*{Ve/{ E)A@! ")")*+)&&PY&PY PY ?3+?+3?+39992310'&#"#'32?3#"&5332654632-"0?45+,-1>>un1-"0?4LC{pimVe/{]{pE%Z@.!   ! &'"$"OY$ RYPY?+3??+333?3+39933333310327'5!32?3#"&=#'#"'5!9|l3w+,-1>>unG?x -Ve/{L'9f-:E*b@3 ( +,  OYQYPY($PY?+3?3+3?+9/+39999323310"&532654#"#!#"'32?3un\|dh+7xXX+,-1>E\f\n5G 5jVe/{9#drE@ >  ?<;?3?333?333?9933331053632#"'#324&#"9 Gj{og1ccMB:CSFKAM䓠F7 mzor>&u'@   <??3?33999210# 4632#'&#"327i8YX!/HagVCT*dmu(7@$  )*" <&??3?339/399333310"'#67&54632#'&#"63274&#"326!sC , ")YX!/HL_KWb+89T<-\?9&C.;SCFqd6"AI;?M%5U*&($`@(    %& "?,?3/3?399//39999339993332107&'57!"&5!2&'4&#"326y>EmPtB5 QCKQMHHMPLO,/4]8EꎈnLgwmehp&u)?@!  $$*+ '?<?33?39/399993391032654&'+53654&#"#'632#"']TGR,)p"JB;:"HZi~oDCun}R?6+; 9Q05 DuMCX'M2R[6(2;@  > -;?333?33?339933310#5754632#'&#"3#!57aadX1%*yS4( {J KT^2-(f=@ ; .?33?9/333339333310##"'5332=#53'5!3d9^Tr3 Y(u $E@ "  %&#;" <?.?33?333?33?9993332102754&#"#"'53326=#"463273TEMA:@|MS!39NBGi}nf1 Ya>mzor2dctDMF7",lf?@    =  ;??333?33333?993331047#"&5'533267'53#%t&HKEKd$SLHT% 'UQsg  2I`D@  0@   ;>?33?39/333?393333310!575#535'533#"&54632a`llPmg&''&322''''*&Tf   ; ??3?393310327#"&5'53&B#32P&( ' E=62$f '@  ;>?33?339310#57'53EFFE\2@f=@   ;>?33?9/33333933310#575#535'533#&F``FE__E222(`'C@ $ () %%  ;!.?3?39/3332933333310#"&546;'533#"&5463232=#"2SF;CE?5TSM'&&' K6&'LO9-.9G2[''''Qh,", =?22?393310"&5'5332?3+W[`H.,zuBuBx (>5@  , >.?2?33?39333310"'5332>=#57'53%&``aH( {J ?2LrbQ#2f)@   ;  >?333?339931032?3!57'53JiB8&7KKK(t1,wu4a@' "2"256,''* /*<#%;"" >=?2?33333?3?333333399993332310"'533254#"!574#"#57'53>32>32).G`g TSfE>TGG*j$_"*)[, xBg 'hgB.$A)Luz*,f-^@%% * *./*% ';@ " $$ ?+=?2?3333333?333333339993333210#"'#"5'5!3267&5'5!327'5!&j'`!2z'IT`a U SfE>UGG,3&A&sg  'sg,xu"G@   #$<; = >?23?33?3?33399333310574#"#"'53325'53>32KdBB[X).GD)m$HKE2hkuz xB@.%UQ8,u"I@  #$<;  >=?22?33?3?33399333310"&54#"#57'53>3232?3zW[dBBLDD)m$HKH.,zuk?.%UQ-Bx "2nfF@ ;  >>;??3?33?333399333310'53##57'53JG:IGG<Gm#&,u 5@ < ??3?39/399333310!"&5!2267!"!.,NLFMIH/KOח&tszl_rkf$,n#Y@!$%!!?  , <=?23?333?33?333993933333210575&75'5!4&'>``$aaAFH?r??333?39/333333399333333310#'#"=#535'5335'533275#'G"t*>>HUBIB9.&m22fg,&_f(S@"# '')* # $ ;??2?39/33333339999233310"&546?#"#7332654&/3#'&+En[&D*! EJWZZWJE !0?&[n&vw\v = `Pd[[dOa = v\%&vf/@   ;??3?33333993310#"&5'53325'530slsrGFJ54&#"#56324Hf6Y484%1]XEw&XoIb[c I{ uzkV2`r1@    <  >?33333?399331057 #573ZYZ6-92y *2f5@    ; >?223?333993333105#"#5!326?3*6Sʥ G2Qv8(f"E@ !#$ ;> .?22?333?3339933333310"&=!5#"#5!326?332?3`Xd6Sʥ G ))(Qv?pMTL J{ 8gf#S@#!$%/?; >?333?39/]333993333310>32+#67#5#"#5!%"3254&-u=ABOL , 6S+bIc$bSU>-58'/.(Qxx='(fA@    ;.?2?3339/3399393310"&'532654&+5#"#5!;oG^pj_Z-S؞($]mbqQЂ%& 5@ -??3?39/399333310#"&54632"!.267!tzno~D8@HEB50ŞC_A9@ Y YL?2/+3/+3333931053#"&54632#"&5463212&%55%&2)3%&55&%3_>%! &55&&44&55&&44_A9@ Y Y L?2/+3/+33339310534632#"&4632#"&X12&%55%&23%&55&%3_!B% &44&&55&44&&55EQ,6@* %% - *,/329333933310&54>54.54>54#"5632O" ,#1QEA    (!  _fw,@  Y@ YL?++333310#"&'332676;fh`k9X+iqJ~!O7nv] S,(##E:@ YN?+3310!5!73:0.p:@ @YN?+3210!'53!:0.:@ YO?+3310#'!5!:.xФːp:@ YO?+3310!#57!:x.[: !@  O?23233210#''53%:..vvvv: #@   O?33233310%#5773:..vvvv@E)@   ?33233333310'"!57'53>;&VjOO!% J (L>z@  /9333310#'573zs'zzES2@    /99//923333399310#'5373%3#57'ٕz''Zezz'EH&$ %+55HEq&D۴,& %+55;&%&N*&-'"%+5+5&E!&+5;=&% -'"%+5&E $%+5;=&%(*"%+5&E !%+5TL&&'zvN1&+5NLN&F'vz;u&'hN& %+5+5J&GP;u=&' %+5J&G$%+5;u=&' %+5J&G !%+5;u=&' %+5J&G "%+5;Eu=&' %+5JE&G#%+5;}!&( \@ &%+55+55PFr&H'C;}!&( \@ &%+55+55PFr&H'v;E}=&({ !%+5PEF&H "%+5;~}=&( $&1%+5P~F&H '2%+5;L}&N@ 1&4</%+5+5PLFw&~@ 1&4<#)%+5+5;)&)N@ &- %+5+5?&It@ &" %+5+5T0&*N@ $&("$%+5+5XF&JD&BD %+5+5;&+N&"%+5+5&KN@ !&a$ %+5+5;=&+ "%+5&K $ %+5;\&+jN+&.%+55+55&Kjs@ -& 0 %+55+55;L=0@ ' ( / /122t222222:=H2@E'*H22 2P22'`Y'?'O' ''#.)&!#!_Y+#/ bY  _Y _Y?+?33+33+3?3+3339/_^]+_^]_]++]qr99933332310)57!##"'532654&'7#57'5!!'5![glL>L<6PH$ܬw555@ XI\nJ ;-1>55555bL2@ '"0"0344 44E044444@+0H4444 444"H4@&H,RY,%#OY%0"" RY" "OY PY?+?33+33+3?+?+++_^]qq+r^]9993332310!574#"##"'532654&'7#57'5!>32P}^[glL>L<6PH$w2H?z|r-^-@ XI\nJ ;-1>--ih.)<-;\=&+'%+5\&K !) %+5~=&,Z ! %+5~aL&L +%+5Jb&, .V&@'&$ %+555+555:r&&jv;&.vN@ &%+5+5'!&Nv@ &3 %+5+5;=&. %+5'&N   %+5;=&. %+5'&N  %+5;h=&/k %+5)&O %+5;h0&/'kN&+5Ds&O' &+5;h=&/g %+5X&O  %+5;Eh=&/ B%+5E`&O  %+5;&0vIN@ &# %+5+5+&Pv@ 7&F360%+5+5;&0-N& %+5+5+L&P5&820%+5+5;=&0L %+5+&P 820%+5;&1N@ &%+5+5/L&Q &# %+5+5;=&1%+5/&Q # %+5;=&1 %+5/&Q   %+5;E=&1%+5/E&Q " %+5Ts!&2 @ &&# %+55+55N&R'v@Ts!&2 @&&# %+555+555NN&R'j@Ts!&2 @ & %+55+55Nv&R'CTs!&2 @ & %+55+55Nv&R'v;!&3vN@ &5%+5+5!L&Sv@ '&T#& %+5+5;!&3N@ &-%+5+5!LL&S@ %&#(" %+5+5;S&5N"&% %+5+5)L&U2@ &)%+5+5;S=&5 % %+5)&U%+5;S0&5'!N+&+5$&U' ;S=&5ô " %+5#&U]%+5&6N@ 1&4.'%+5+5TL&V6,&/)%+5+5L&6(4.'%+5T&Vy/)%+5 &6 DP@ ?&Y4>'%+55+55T&V @ :&C/9%+55+55 &6 D@ @&B>'%+55+55T&V @ ;&=9%+55+55&6'(N=&+5TL&V&6y%&7N@ & %+5+5-&W%+5%=&7t  %+5-&WV 5%+5%=&7u  %+5p&W6 %+5%E=&7t  %+5E&WJ )%+5+=&8 +%+55&X ) %+55+~=&8 #.%+5~&X !, %+5+E=&8 %+5E&X  %+5+!&8  @ (&&%%+55+55&X'vJ]]5+!&8  @&&%+555+555&X'j@ @ H+]55&9N@ &.$%+5+5d&Y@ &-$ %+5+5=&9 %+5&Y  %+5&:CN@ &%+5+5&ZC %+5&:vN@ &j%+5+5&Zv k%+5\&:jN@ &+'%+55+55&Zj &'%+55&:N@ &.%+5+5L&Z@ &-%+5+5=&: %+5&Z %+5-&;N@ &"%+5+5L&[@ &" %+5+5-\&;jN@ +&.%+55+55&[j@ +& . %+55+55&<N@ && %+5+5FL&\@  &+#%+5+5bs&=!N@ & %+5+57T&]s@ &%+5+5bs=&=B״%+57T&]%+5bs=&=l %+57T&]%+5&K ! %+51&Wj)%+55&Z@ &,%+55+55F&\@  &(#%+55+55Hq&D@ 0&1- %+5+51&A@ & %+5+51GQ)V@,$ !!''*+$ `Y `Y_Y`Y?+?+?+9/+99993329310"'53 4&#'2654&#"!57432Xr aUv 7I&Zs_t5SdvH&$Դ %+5Hq&Dϴ,& %+5&$ N@ & %+5+5Hqf&D @ /& &+ %+5+5&$ N@ %+55?55H&D @ 4&]-( %+55+55&$ N!&! %+55+55q&D 4&*4 %+55+55&$ N@ &! %+55+55Hq&D @ .& '4 %+55+55&$ '&ߴ&1 %+55+55Hq&D .&9D %+55+55&$'yN&+5Hq&D&}&$ N&$ %+55+55Hq&D ,&/7 %+55+55&$ N&$ %+55+55Hq&D ,&/7 %+55+55&$ N& %+55+55Hq&D &&)1 %+55+55 &$ 0*&( %+55+55Hq&D =&0; %+55+55&$'yN&+5HqY&D&};}=&(t "%+5PF&H &#%+5;}&( yN@ %&$!%+5+5PF&H @ &&0"%+5+5;}&(N@ &&1%+5+5PFd&H@ &'2%+5+5;}&( sN@ *&n#%+55+55P&H @ +&g$%+55+55;}&( sN*& *%+55+55F&H +&!+%+55+55;}&( sN@ $&T*%+55+55P&H @ %&M+%+55+55;}>&( sN@ $&/:%+55+55PF&H @ %&0;%+55+55;}&('Nt&+5PF&H'Jb&, ZN@ &  %+5+5+f& & %+5+5Jb=&,W   %+5+L&L%+5TsL&2  %+5N&R %+5Ts&2 N@  &  %+5+5N&R @  & %+5+5Ts&2 N@ %&\ %+55+55N&R @ %&X%+55+55Ts&2 N%&% %+55+55"&R %&%%+55+55Ts&2 N@ &B% %+55+55N&R @ &>%%+55+55Ts&2 '@ &*5 %+55+55N&R @ &*5%+55+55Ts&2'N #&+55N&R'T &bvN'&+5NQ&cvT &bCoN'&+5NQ&cCT &b N0&+5NQ&c 0&+5T &bN1&+5NQd&cT &b-' %+5NQ&c-' %+5+=&8%+5&X   %+5+&8 N@ "&)%+5+5&X  & %+5+5+1&qvN)&+5&rv+1&qCsN)&+5&rCV+1&q N2&+5&r 2&+5+1&qN)&+5d&r+1&q/) %+5&r /)%+5&<CRN& %+5+5F&\C| ! %+5=&<  %+5F&\&< %N@ &W %+5+5F&\ !@ &&"%+5+5&<N@ &9* %+5+5Fd&\@ &-'2%+5+5N&c+&,( %+5+5N&c6&(6 %+5+5N&c+&,> %+55+55N&c6&(> %+55+55N&c+&,= %+55+55N&c6&(= %+55+55N&c+&CN %+55+55N&c6&CN %+55+55J&$ź!?5J&$ź?5E]'$ !?55E^'$ ?55E^'$ !?55E^'$ ?55Eh'$ !?55Eh'$ ?55O!&g@ 1&Q2.-%+5+5O!&g@ <&%.<-%+5+5O!&gx@ 1&2D-%+55+55O!&gx@ <&.D-%+55+55O!&g@ 1&=2C-%+55+55O!&g@ <&=.C-%+55+55>'(*?5>'(?5R'(Y *?55R'(Y ?55R'(Y *?55R'(Y ?55 L&i@ &+ %+5+5 L&i@ (&+( %+5+5 L&i@ &+0 %+55+55 L&i@ (&+0 %+55+55 L&i@ &B/ %+55+55 L&i@ (&B/ %+55+55 L&i@ &+5@ %+55+55 L&i@ (&+5@ %+55+55>'+*?5>'+?5R'+Y *?55R'+Y ?55S'+Y *?55R'+Y ?55h'+Y *?55h'+Y ?55-&k&%+5+5-&k̾&%+5+5&k&'%+55+55&k&'%+55+55)&k&&%+55+55)&k&&%+55+55W&k&,7%+55+55W&k&,7%+55+55{>',?5{>',?5R',Y ?55R',Y ?55R',Y ?55R',Y ?55h',Y ?55h',Y ?55N&R@ &%+5+5N&R@ %&%%+5+5N&R@ &-%+55+55N&R%&-%+55+55N&R@ &,%+55+55N&R@ %&,%+55+55L'2%?5L'2?5R'21 %?55R'21 ?55R'2i %?55R'2i ?55&w@ &!%+5+5&w@ &&&%+5+5&w@ &.%+55+55&wd&&ٴ.%+55+55&w@ &G-%+55+55&w@ &&)-%+55+55&w@ &.3>%+55+55&w@ &&3>%+55+55>'<?5R'<c ?55R'<c ?55h'<c ?55P&{O@ /&0,%+5+5P&{O@ :&,:%+5+5P&{@/&0B%+55+55P&{:&˴,B%+55+55P&{@ /&;0A%+55+55P&{[@ :&,A%+55+55P&{Y@ /& GR%+55+55P&{Y@ :& GR%+55+55.L'+8?5.L'+-?5R'+  8?55R'+  -?55R'+} 8?55R'+} -?55h'+} 8?55h'+} -?55N&c[-&*- %+5+5N&c9@ -&), %+5+5O!&g[3&03-%+5+5O!&g9@ 3&c/2-%+5+5 L&i& %+5+5 L&i9@ &a %+5+5-&k&%+5+5-&k9@ &"%+5+5N&R[&%+5+5N&R9@ &+%+5+5&w[&δ%+5+5&w9@ &K%+5+5P&{1&ʹ.1%+5+5P&{9@ 1&D-0%+5+5NE&c'NE&c'NE&c'NE&c'NE&c'NE&c'NE&c' +&+55NE&c' 6&+55EJ&$'ź/?5EJ&$'ź$?5EE\'$& !?55EE^'$& ?55EE^'$& !?55EE^'$& ?55EEh'$& !?55EEh'$& ?55 E&i'8 E&i'8 E&i'8 E&i'8 E&i'8 E&i'8 E&i'8 &+55 E&i'8 (&+55E='+'L*?5E>'+'L?5ER'+Y& *?55ER'+Y& ?55ER'+Y& *?55ER'+Y& ?55Eh'+Y& *?55Eh'+Y& ?55PE&{'OPE&{'OPE&{'@PE&{'PE&{'PE&{'[PE&{'Y /&+55PE&{'Y :&+55E.L'+'8?5E.L'+'-?5ER'+ &Y 8?55ER'+ &Y -?55ER'+}& 8?55ER'+}& -?55Eh'+}& 8?55Eh'+}& -?55Nw&c(&+3 %+5+5N&c+&)+ %+5+5NE&c'[NE&c,3 %+5NE&c'9Nd&c(&2= %+5+5NEd&c'&${N& %+5+50&$N& %+5+5H&$?5H&$9?5EH&$   %+5!!@  M?29333105654.54632d|x"*"7+3A Xk%?$5!"&,ME @ PY?+93310"&=3327;68t&* ?EIC@2!@  M?29333105654.54632d|x"*"7+3A Xk%?$5!"&,M^d;@  Y  /   @Y L?+_^]+9310".#"#632326730QHC! '40QIC +0 4^+5+-2+5+2Dc".f@5#)) /0 Y  /   @Y  @,  Y&L?3+3_^]+_^]+93933310".#"#63232673#"&54632#"&546320QHC! '40QIC +0 4 8**::**88*)<>'*8+5+-2+5+2D*;>'*::**;<)*:: E&i'8 E&i8 E&i'89 Ld&i@ &H$/ %+5+5 Ed&i'8>'(.?5>'(09*?5>'+.?5>'+09*?5;E=&+3 Q '%+5A!i-@  M?2933333105654.5463253!d|x"*"7+3AɻE Xk%?$5!"&,M %!A!i-@  M?2933333105654.5463253!d|x"*"7+3AHE Xk%?$5!"&,M!$%'N@+ &&()"Y  @%Y/2]+_^]+939333105654.546327".#"#63232673d|x"*"7+3A0QHC! '40QIC +0 4Xk%?$5!"&,Mq+5+-2+5+2D.w&k&%+5+5J&k&%+5+5%&k&j{%&k&j9Ud&k&&%+5+5UF&k&j5s&,N & %+5+50&,N&  %+5+5|>',.?5>',09*?5A!i-@  M?2933333104632.53AB2+7"*"x{eɻE ;L,&"!5$?%kz %!A!i-@  M?2933333104632.53AB2+7"*"x{e(E ;L,&"!5$?%kz!$%'L@* &&()"Y  @%Y/]+_^]+939333104632.".#"#63232673B2+7"*"x{e0QHC! '40QIC +0 4;L,&"!5$?%k+5+-2+5+2Dw&w@ & #%+5+5&w@ & %+5+5&w'jl&w'j9L&s& %+5+5L&s*&*%+5+5d&w@ &""-%+5+5F&w'j 9@ H9+5&<N@ &7 %+5+50&<N@ &8 %+5+5>'<B.?5>'<l9*?5:?'3?53_v3@   Y L?2+39333931053'#"&54632#"&54632i15%&22&%55&%33%&5_>%!]&55&&44&&55&&443_v3@ Y L?2+39333931053%#"&54632#"&54632 162&%55%&2p3%&55&%3_!B%]&55&&44&&55&&44_@ L?]931053ɻE_ %!PE&{'PE&{ S07%+5PE&{'9Pd&{M@ ,&6A%+5+5PEd&{'MyL'2.?5L&2h9*?5L'+.-?5L&+@9*-?5jEL&+;_@cP`$4Drd0@$$tT 0@B@>AH@ 8=H@ 25H@ ,/H$4@ &)HDT@) %H 0`p/L?]^]]]q_q+q+r+r+r++^]]]]qqqrrr^]]]931053E_!$%!@   M?29333104632.B2+7"*"x{e ;L,&"!5$?%k*//3310#*T 0@    //39/9333333310#'7'77'*T7777Y7887 2@   //99//3323333310'7##!'77RJ77}m}8L( 0@     //99//3322333310##'7!(R77J}78}@ Y?+3310!5ff@ Y?+3310!5ff@ Y?+3310!5ff^'BBFT@z [Y `hp?P`/8P/^]]]]]]qqqqqrr^]]]]]]qqqqrrr^]]]]]]q?++39310467#"&Ŝ&CD5=R燹-N8p#A68WDR@y Y[ `hp?P`/8P/^]]]]]]qqqqqrr^]]]]]]qqqqrrr^]]]]]]q?3++9333105654&'&54632埒%DD5=R*M8p #@69W$@ Y[/3++933310%5654&'&54632㟒%DD5=R1*M8p #@69WDR&@  Y [?+3+9333104632.Q>5DC(JX96@# p8M*bF7T!`@ "#Y[Y;#$#########[#D## #j####t#d#;#######d#4#$#######k#T#D## #:####[#K#;#$######{#k#T#D# ######t#d#;#+###_]]]]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqqqqrrrrrrrrr^]]]]]]]]]]]qqq?++33/33/+993310467#"&%467#"&&CD4@P\&CD4@P燹-N8p#A68[F-N8p#A68[VD+R!O@*  "#YY[#p#]]?3++3/+3399333333105654&'&546325654&'&54632%DD5=R%DD5@O*M8p #@69WK*M8p #@69\V+!f@  #"YY[[#K#?########_#;#+## #j######;#######d#[#K#$#####k#T#D## #:####{#k#[#K#4#$######{#d#T## #####p#P#/###^]]]]]]_]]]qqqqqqqqqrrrrrrrrrrr^]]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]]]]]]]]qqq/3++3/+339933333310%5654&'&546325654&'&54632%DD5=R%DD5@O1*M8p #@69WK*M8p #@69\bF7T!3@ "# ?333293333333104632.%4632.P@4DC&\P@4DC&F[86A#p8N,F[86A#p8N,? @   Y [Y [ o/oO/:_@`@ ]]]]qqqqqqrrrrr^]]]]qqqqqrrrrrr/?++++933910#753%%dM.I?`+/` /+a+/?@   Y[Y[ Y [Y[_O?o?;_@`p`@]]]]]]]qqqqqrrr^]]]]]]qqqqqqrrrrr?++++/++++9333393339107'753%%%%#5II?`+/`CMMC`/+`/+a+//+`+/sZ @          p ` P @ 0   l    @ 0      p @      ` @ 0  ;    o @    P /   P @  ]]]]qqqqqrrrrrrr^]]]]]]]]qqqqqqrrrrrrrr^]]]]]]]]]]]]qq/^]9310#"&54632Zfeeffff' #7@ $%!  [@% %]]?33+33933310%#"&54632#"&54632#"&54632E44EF33FE44EF33FE44EF33F\1HH13FF31HH13FF31HH13FF@ //333310#!*SmOM)/3/333105!#MSO@ //9/3322310###!T ,@    //39/3332332310###!!!TuO .@    /3/9/3333333310!!5!###uTON-R  ,6BF@QEFCD=2!' 2DF7--HGE5:Y05[0@Y00C$Y[*YCY[ YHOH]]?+++?3/+++3/+++?9933933333310# 463 4&#"326# 46324&#"326%# 463 4&#"326#3/DUYMNXUD#DUYMNXUDB/DUYMNXUDnn`w|ձaw|aw|fe\[=@"dtR4D"u@ltHTdt@ ^bHUYH@CKHF$4>:=H@%69Hpp@,/H@ H?]++]qr_rrr++_^]]]+]+]q+qrrrr+^]]]]]93103#ŬJ=o\='@ ?2]2]9933103#3#!ŬJŬJ=\6=&'J%T@[?+93103#NRRd{{dJ%T@[?+9310 #3%RRN=&@!@~~H!@||H!{{H!zzH!yyH!@xxH!@ttH!@ssH!rrH!qqH!ppH!ooH!@nnH!@kkH!@jjH!iiH!hhH!ggH!ffH!@eeH!@bbH!@aaH!``H!__H!^^H!]]H!@\\H!@YYH!XXH!@WWH!VVH!UUH!TTH!@"SSH!@QQH!@PPH!@OOH!@NNH!MMH!LLH!KKH!@FFH!@EEH!DDH!@CCH!@BBH!AAH!@@H!??H!>>H!@==H!<;;>?>vB\hQk{ymPi5dmpWPMZ[LLؒGKM@A#gZP@+  @Y/?_o?3]+333/2229933310632#574&#"#57'53q?54#"#56327^UG Dj1X^UW?/"dOP9V;GNL8D. %@   FI?3?3993310%!"&5!24&#"326.lJRNGGNRJgח&vnrzKQR@       E  H?33333?3933339999333210!57'#5?/5!7'53QKMBCKl}MA   &?3@   I F?3?39/399333310%54&#"5>32#"=25#WXDR`7|ف7f yf"1k\.0g@7!)) ..12(!(_Y! _Y_Y!!0)0_Y.0 _Y?+3?3+399//++3+3999333210%7#"$5!2#'&#";'5!#'&+373#'#32?3!~퓱=`~?\s>>إT(? -b&8u-np T{'-3@R 10.3!*+&'( '' $$45 .**0_Y+ 33_Y''&?3333/3+33?3+393?3/39993333299991073#'&'326?3#"'#7&'#7&5!7&'+t/P2HRB%=w8Jr;%ASH*P/38?3# !2#'.# '5!>3e+:22l<%A^XBF`쫝w <<%n5.?c@Zc3ۮ+/,y-u2\=@K  ! _Y `Y?    `Y _Y _Y_!?!]]?+3?+3_^]+99//_^]]3+33+39933339910!!!575#53'5!#'&+!73#'՟B pqm==dR55Rn5۠dyL+@b)++!)$"$",-@-`-- -@-`----- -@-`-;- -@-`-- ----- %!$*+*sY+@.H+@sYo@ H! !$!vY$ sY ?3/+?+_^]9/+]3+3+2+39_^]qr^]qr9993322339910&'#53&54632#'&#"!!3#!!576=#5E C8vwA#]d FSH#OR5RSRLIu@|}R+259@F)) !8"3 3!..;4"88#"#:1/_Y153).,._Y!,&&bY6( ?33333+3?33+333333?+993339939333332310>32673632!574#"!#4&#"!57'5!57FK@Eu#3tPfo=yU%[gmPUUXVww,`+:49!--X -y1SY-- -bl80=%)-03@R&.",1  452 ! _Y&*!)-$%$_Y .%!/%%/!_Y3 _Y0 ?33+33?33+39///3+33+399333310'5!!'5!3#3##!!57#535#5!'!35!%3#Lfɬa7 3ff_5"55qRRa55RRRW9,e=0Y@y $((!T8FF ?L11Z[[ [T?I44'""<_Y96 _Y0,(3/+_Y: / $744 ?333?399//]qq3333+33333333+3333+333339933103#!!#!#!5!'#53'5!!3!'5!37!37!3'#7#7#3'E2553Fщuņ-}uO-AMVE.9| _RRRR55q55S0pX#HU@$-5AA-JIC**C323!254/4>32#"&54&#!"#"&'&!2XS-  1VB 5  0QE 6 uL/,;+#?u< A׸6 < {4+<&B  L0@',!,!12.._Y'*'_Y*@A H**@ $$_Y   $ _Y@2222`2@2]]]]qq?3/]+?3/_^]+9/_^]3^]+2+3+39933331032#'.#"!!!!326?3#"'#53&547#5JgD-v<^bM&Cpjj= +/QD8R8-?R5FQ"=#@S ! $%!!_Y _Y?O?o@H#_Y ??+33?39/+_^]q3+3333+33399933223939910!!!#!57#53'5!3'5I6TRnqӬŬM5=5@lR5p[;55 R,55,5%=$q@<"" %&  `Y! `Y"_Y?+3?+99//93333+333393333310!5757557#"#!#'.+77;3]CDx15mRmmRl; lRllRk5)i:FV_@GMMW#3' 7T AAT '#\;a`PD^^_Y'G3G_Y-3>`Y Y_YM# 3 30 ?339///9++3+3+33993393333333310#"'#>7>32".'#"&546327756%7674&#"32632654&#"32lV8&2 q$~4F`n?&LX]eP&V =X60&M0JP|UHL\XGI],I>2E39Suzg@I+=fo6M=9&ĕQ82>FKI>PPe/:S%MRCiaqt^atx Cp-@> &&+U"JL&0T@,#'-  21 _Y&/  *`Y ?2??+9/99993?+9933310 #&54632#"'5332654&'4&#"D kSgkTieK'LC1-"0@FHWDAU,QNbhfB55RR5R:*(R<0UPVPTd 'a@1! $  ()_Y @%%_Y @$$_Y?+3?3+3?9/+39933933333210$%53#'.'>7'5!#G)}66LT-H#&@\ #$& & !"%& &'( _Y #_Y$?O &   _Y?3+333?399//_^]33+3333+3399939293939103#!57!!57#537!5!3!!'!7!*=̉ɴ郴G<)ӾFi9.R55n55nRRCRR,4L5@L31!$$11+67_Y _Y3 $ .  /    +..'_Y. _Y?+3?+399//_^]993+33+39393910!!326?3#"&547#5367!5!>54&#"#6323tQ^%=RW*#ATmY}=0xdf#A*~H:!REm~F1!&C6RaBR,nN`mJ+iJRTd$O@' ! %&""_Y @!!_Y?22+3?33+3993933333210$%53#'.'>?3#E>RBBZg;%APrRNb2Oa 0ۮ(/>3-$-f ]m<R(4y@G/#)#  56Y0`  @ Y &,Y&?&o&& & @ 2Y ?2/+_^]+?3/3+_^]2+999333210#3#"&54632#'&#"327#"&546324&#"326no3%y<[t19HZXltoCQ[ZJMW[Qfzt!yOy{y\S&U@*$  '($ $$  PYQY/3+?+9/9392993333310%273#"&=56746324&#">n!Ew~OqkUjrH>787uoN՝I [fvl{iwGG;S=#/@H*  $01  _Y _Y -'!!/! @ H!!QY/+99//+_^]33?33+3?33+33399333399333310%!!'5!#!57'5!%#"&546324&#"326/ɬa7X*@RI@@IR@ff55555đvvimyXR09m@<1-6!!&&-:;!&$&Y6 Y5')'Y)) $6))6$  Y Y?+?+9///_^]+3++3999393332104$32#"$732$54$#"!57'5!2#74&+326X=@F ⧧r`hJVs?Cj[Aü@ߥ "++)sjsxYIJ`=,V@ &"+ .-% Y!&+Y) Pp ",     _. ......P.@./..j..o._.O./.....o._.O.?./....p. ..:..p.O........_.?....P.@./..]]]]]]]qqqqqqqqrrrrr^]]]]]]qqqqqqqqrrrrrrr^]]]]]]]]qqq?33/^]/]3]22+333+39333339331057#"#5!#'&+!#!57'5!3!572)),mhhffl+ }} V+++)G)P++`L)@Y$##' '!*+!`!p! !!##aY#$_Y_Y _YaY p  +q?3/]+?+9/_^]_]++?+3/_^]993333993310"!3;'&5! 32?3!>54&ܸB9PH LCCL HP9BJe!!eWX|HP@, !PY  PY PY?3]]+/+9/_^]+99333310%#"&54632!3267.#">`ۘ5QRa3Vu|8DhK5AuhL@J  =,#F 3,FF, MN 8/ =/#I // I?339////992233333333999933339932239910 # !573!57'!!332>54.54632#'.#"#"&'ZZ`[rflPQ( *39/F-%>NRN>%=n/)P1-C+&=OQO=&N*hb  yYp -<$,;(#5N:ar e".(5%%8Q;se6I@& PY PYOYOY?+3?++9/+39933910!!53;##33'\~~/?\s>>ط--Sn/pg!BB&{'Tuk@   ]5]5?5DF&t'Tuk@    ]5]5?5BB&{'Tk @  p 0  ]]]]5?555UF'T'ku*,@ 22p0]]]]]5]5?555W='T'k(4@! JJpJJp0]]]]]5]]]5?555w=''WQ,@ 33O  O]]5]555]5?555??5d^D "@    /99339310#&'5673!9>HH>9)CI$ICV @  DT&6ifv$B$4bDT&69`pDT @P$4`p  /299]_]]qqqqrrrr_rr^]]]]]]qqqqqqqrrrrrrr^]]]9333105673&'#CI$ICV9>HH>9#d^D "@    /99339310&'3#67!59>HH>9#CI$ICV @ DT&6ifv$B$4bDT&69`pDT @P$4`p   /299]_]]qqqqrrrr_rr^]]]]]]qqqqqqqrrrrrrr^]]]933310%67#&'53+CI$ICV9>HH>9d^DM@   U\H;BH!'H /+++993393339310#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC@   DT&6ifv$B$4bDT&69`pDT @P$4`p  /299299]_]]qqqqrrrr_rr^]]]]]]qqqqqqqrrrrrrr^]]]933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9H@  DT&6ifv$B$4bDT&69`pDT @P$4`p  /299299]_]]qqqqrrrr_rr^]]]]]]qqqqqqqrrrrrrr^]]]9333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>9D*L@($+,0H@  PY 'PY?+?3+3/_^]+299339210 #"&54632374&#"'7632.#"326H|܈]"ky$iONsyN[ahYQp펻.cStT!#\y|-H@l   /      p   ?  :    ` @ _      p P   ]]]]]]]]qqrrrrrr^]]]qqqqqqrrr?23?3^]9933910)'3 !wݾp&P\rL&=j@A  _Y`Y _Y  >P@qrr^]]qqqrrr?2+333?++399331057'5!!57!r%L5R5555G5\L%=L@&  `YaY ?3+3?39+3/9939322310!2>?3!5 5!#'&"#%?)ac_M8 9BJBQB*`lK'bJK O fu@ Y?+9910!5Gff=-y @ [         _ O   l     o _ O     ? /    ? /  :     ` P    ]]qqqqqqrr^]]]]]]qqqqqqrrrrrrrr^]]]]]]]]]]qq/+9310#"&54632yF33FE44E3FF31HH3bT3@ Y//3]/9/+99392210##5! 3okרZ=PMf".K@+)  # /0&&Y,,Y#P/]3]29+3+3933310#"#"&54632>32%"32654&.#"326fҍ@]iA@iP@32#4&#"tтwgĠ'*@!()QY  QY/+/_^]+9310"&'5>733265>32#&#"R E:5FcFYF95F e  _E{ jx BAF|Inr9-3d@7# 0 45,Y"`""@/&&Y& @Y`@ Y_  /]+_^]++_^]+993310"'.#"#>3232673"'.#"#>3232673 jJa&MN ev8wKVS#ENg@jRjJa&MN ev8wKVS#ENg@jy?9m:?H1iLfy?9m:?H1iLU6@   Y  Y    @ HtbTD6"tfF$tfV6<B4"pd@_qqqqqqqqqqqrr_rrrr^]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrr/+^]q33/]2+33/+399339103!!!##5!!5!3" {3Q}fff4ffN :@   /@/^]/]9/99333310!5!5!5GGGffNffffU S@4  Y [P`?O/^]q33]++/+993333105 !5U)G2gyygTffT U@5  Y [_o?O/^]q]++33/+9933331075 5!5V)Ggg+2ff4 h@N  l P ` @ p   :  @ P  //qr^]qr^]9933103 %! {RVf/99310#!guVf"@  ?/93310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //933103#"&546323265";N2$! =/'5)%3%Y?+33105! %H@ ??93103#HK"@ Y?+?39310!!#(in"@ Y?+?393105!# (%%HY??+393103!!Hn%H"@ Y?+?393105!3 %H)@  Y??+?3933103!!#iHnnH)@ Y?+??3933105!3# %K,@ Y?+3?3393105!!# i%n%H,@ Y?+3?3393105!3! %nH 7@    Y?3+3??339333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH @ ?2?39933103#3#ّhHK Kj 9@  YY?+?+?9333310!!!!#(iijב" -@      Y ?3?+33993310!###בnn#j ;@    Y Y?+?3?+99333310!!#!!#htjo"j 9@   Y Y?+?+?33933105!5!5!# i(qב) .@  Y?+3?339933105!### ܑב%nj ;@   Y Y?+?3?+33993310#!5#!5!ґttj)F)ޑqH 7@    YY??+?+33933103!!!!iH"ב%H *@    Y?3?3+39933103!!33A$Hn#nqH ;@    YY?2?+?+339933103!!3!!ّK$hH"qH 9@  Y Y?+?+?33933105!5!5!3 iqב)%H .@  Y?+3?33993310!5!333$ב%nqH ;@   Y Y?+?3?+33993310!5!3!3!5!$KqFH >@   YY??+?+?339333103!!!!#iiH"ב"H 3@     Y?+?3?3399333103!!#3#AHnn KH G@    Y @ Y  ?3?3?+?+9933333310#3!!#3!!jt " "H >@  Y Y?+?+??339333105!5!5!3# iqבKH 1@  Y?+?3?3399333105!3#3# 㑑h%K#KH F@    Y Y ?3?+?3?+33993333103#3!5!#!5!A㑑tHK )ޑj @@   @ Y Y?+3??+333393105!!#5! iiq"h 4@     Y?+33?3339933105!!### ב%nnj I@  Y Y ?3?3+3?+3399333310#!5!3!!#!5jtttAޑ"בqH @@   @ Y Y?+3??+339333105!3!5! Aّ"%H 4@   Y?+33?3339933105!333! ב%nnqH I@    Y  Y ?3?3+3?+33993333103!!3!5!5!AH"oHV@   Y Y ?3+3?3+3??3333933333105!5!5!3!!!!# iiiqב"ב"HI@       Y ?3?33+33?33399333333103!!###!5!33AבHnnnnH b@    @ Y Y ?3?3+3?3?3+3339933333333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{@mUE- yylTD, xeM5dL4qYA)}}pX@(|aQ9 `P8u]=%t\<$|xiI1!hH0 fAQ2#թƩyeV1A"iƩ֩xiUF1"թƩxiZF!1ԩũ@hxYJ6!9թĩXhI:,թƩhIY:&ԩũhxY:J+  Ygckhk@ Yd`h_[WTW@ Y\XTSOKHK@ YPLHC?GDG@ Y@@   /3?39=/3339939333210!# 3 #R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow@kPhhTl8xx<|(pp,t ``$dHH L@@D0044DLdt|lX\\JrrNvBzzF~2jj6nZZ^RRV::> **.v~n^V>..>V^n~vf&fb"&/3/39///////3333333333333333333339939333333333333333333333210#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @ @|HkYK=+ u@ptHjoH@eiHkYK9+o@LPH@@DH>@59H+;[{@ H @H/]^]]+]q+q_rrrrrr+^]+]]]]+qqqq_rrrrrr+++^]]]]]]]+99102#"54>jnrotjlw)@i @`dHo+K[ [@PVH@DLH9_o/@54.#")vwvvvwvu}Avvvuvvw)#,@ $% /993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu @@swH_;Km_o @NSH @=BH:@+.H @H?O /^]]]q+qqr+rr^]+]]q+qrr_rr^]]]+]993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:o@@:6+% %;<("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332933333310"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7<@$.#5 # 8910/+*?*O**/^]]]]]993310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'J@'$$  ()P /^]2/]32993393332210.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8D@#0,!'6!'!9:,*3$$$-  **/^]]]9999333399310&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<4o@/((5(6[6k6M6+6;666666)6I6Y6y66 6i66666666{6m6Y6K6=6)66 66696i66666+6 6666666y6[6k6I6+6;66 69666666v66)6I6Y6666@!%H{6Y6i6K6)6966 66666666?6o66@$+/     //99//]923]_]]]]]]qqqqqq+qrrrrrrr^]]]]]]]]]]]qqqqqrrrrrrrrrrrrr^]]]]qqqq3999310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@  //999910./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @    K  /]999310&&'6H zDS%Ut}FiGfY;.@  //]9/9933333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt `@4 !"VC 6% X ///33]33^]]]]33]]39933333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu28I@'  !  ?//9/93/99333333333310##57573%377```L`Y=>YYYYG\YY Y 0h=c@4  !_Y _Y_Y_Y `Y?+3+?99//3+33+3+3993333310!!!!!273!57#535#53'5!wttd>A嬷<qRRg5RR5)l@< OYOY?o@ H OY OY ?+3?+99//+_^]3+33+3933333103#3#!57#535#53'5!oF:JJJ--JJJ-h=&/"!= Z@0 !"`Y _Y    `Y _Y _Y?+3?++99//3+3+993333310!57#53'5! #4&+3#326˟ŬbhB55,J(5uJ;ES='a@3 ## ()`Y $`Y$$  _Y #`Y_Y?++?+9/+3?+399933329310'5!2!#326?3#".54&+326Ck*FBOdS5&5L {·ÅHq.!*05@J+1** %-$.54.-67-' 'QY*@ ."1"OY11OY4  PY?33+3?+9/3+3?333+39993333333339210&54>7&#"#56323!'#'#3267%%54'WHq&dS"8{ 2Hur |"Dc2oJBhav/^w>J /u#r~1-^rZ yQ*D]T+.Y@,    QY PY  ?3+3?+3393993333333310&5#5?333327#"'#${}e?Ha;0:S#8V1%=-'VABA1hW|;t=St U@   !"OY OY K@ RY?+33??3+333?+993333310>32##574#"!57'5!FH?z|rAa}^dw2h.)<2t-^---;L=d@2  _Y  _Y K???+33?39+3339999333332310 ##!57'5!'5I6=AjӬ=5@";5555x5'tg@, OYOY KOY?+3??39+333?+9999333332310 '5! ##57!57'5!XbLuXfAaV{dw1--2t----bLz=C@    K@ `Y _Y?+3?3+3?99933321035#"#!!#b]E >Aj^=Vm7tR@@  PY PYK??+3?3+3999333210!#!5#"#5!!RAa8h/Dt-/1TL K@' _Y _Y _Y?+33?+33??+99333310"3267&# !273!DEzz[Q3%L41Ac@Wf%5-@ QY OY?3?+3?+99310#'5!>32#'&#"-J}`0gW@/' ,CV%z--wvsoOWL;@ `Y   _Y ?333?+33/3?+39310# #'5! 3 >32#'&#"^55Du?i-\'mXUQB!0/Cd 55O^2{bDZ ;@ QY   OY ?333?+33/3?+99310# #'5!3632#'&#"%NJoTNW@/' ,IYlz--eoNX#c@1  $% OY !PY ?+?+3?39/99333999933399329910'67&54632'5!#654&#"Gn!kN1vQPQ\ZJ"S ,7F3/{YSnUEhr--<;WLB0,;=K@)  `Y ? O     _Y _Y?+3?+39/_^]+993310!57'5!!73#'第@@5555d%Q@/PYO_  OY OY?+3?+39/_^]+993310!!57'5!!73#Jrk}}r---- --kON <@ !" PY OY?+3??+3993993210+ &546746324&#">N`SzqXPo"I$dSXX0@ /3/399//33993310 55XO: !@  Y /9/+3333103#2#"&546Ymm-@@-,@@ >/,@@,-@Uj@ Y /2/+33910'7"&54632MDM`,@A,,?@MDM@,-@@-,@:!*@  Y @Y/++339310!5%#"&54632:@-,@@,-@mm-@@-,@@_@ @Y/+33210!53!}hv @  /9/39310!#!53h[c Uhv "@ /9/3999310 #5!3!h]Uf! +@   @ Y/+9/933310#"&546323#E44EF33F>^1HH13FFf! )@  Y /+9/933310#"&546323#F33FE44E^>3FF31HHM )@  Y /+9/933310#"&546323#F33FE44E^>3FF31HHi8 (@  Y /3+33339310##5##!8}}Oc8c (@ Y/2+33339310)335338h}}cI{@  /32931053#%8I!! +@  Y@Y?++933310#"&54632#"&54632E34EF32FF23FE43E*1HH13FE3FF31HH*@ Y@Y/++933310!5!5AAffffV=?93103#V>J=SV=?93103#V>J=z2L#@ [ H/+3+39105654.54632d|x"*"7+3AXk%?$5!"&,M?L %!57!!57#575!2#'&#"!-Br3:Kedm#F--!--! 1'B%o+q?J!%!57&#"3#!57#57546323-mE@B yF-->{T!--! 1'L3&&  J @   /3]2/10#"&533265JSUPX㊟VhfX30' &  3`yf} V ^ N+HZ'h(@  gY_?+39310!5!3!'3TN&=N&N&'d=N&'d`&f`&f`&{&@ _'0''']]]5b&@ _50555]]]5y&e _..]5f&Je _II]5m&1e _##]5&1e _..]5Vj& `AA]5'& 1Z@`&@&0&/&&&]]]]]5qN& e}& @ _$0$$$]]]5V&  `II]59T&@ _?0???]]]5&@ _-0---]]]5b-&d@ _-/---]]]5Vw&jM=&z1&HP_PP]]5w{&3 `DD]5N&eN&d+H&ye `<<]5m&f&}f& =f& NO@*>>E:POB(!Ib>*6*hY6!!gY!_^??+3+3?99933310"547654&'.54>32;267"&54632372&#"#"'&'}\% )' V%'/',32`F[q> ܺw).2}52@Y/  @ Y /+_^]9/+331032673#"&'aEmzNX*4Cfq5" !%)/AOW_jv@ qe*k`MJU]]FPJXB43:??<3BJF`*e + x"..+''+&&#++w #.,]7ttF0b\UnhhG7##7!#327#"5k3 4+*090&5T0X*-6QrZ؀T~AAA#bz A@&   @PY//^]+_^]]2323310"&'332673Th]]hbgjjg2d=%@ Y[?3++9333105>54.54632dCP&#7+2Bm%?*0''&)N2`$@ //^]2933310467#"&2d|x"*"7+3AXk%?$5!"&,Mw_Cw_Cw_C_5v_5v_5v+&@  /3233333104&#"'632#5>3*HFZjQ[pE0"c;U 2x+&@  /3233333104&#"'632#5>3*HFZjQ[pE0"c;U 2xX +&@  /3233333104&#"'632#5>b3*HFZjQ[pE0"c;U 2x^d^d5_sw_u/321053ɬ_5v_5vw_Cw_C++^d^d^d^d^d^du ?u |u u Zu ^dm!u ^8u u~u u z.u kfu WRu #u :u +^d^d^d^d+ &@ OYOY?+3?+9310%!57'5!q+F-- -:! /329/3105!#"&54632#"&54632tC2%%44%%22%%55%%2mm%55%%44%%55%%44 A /399//3105734632#"&%4632#"&+e2%%44%%2=2%%55%%2s%44%%55%%44%%55A  @ /3299//3310#"&54632#"&5463273#'52%%44%%22%%55%%28%55%%44%%55%%440{{!! A /399//310'53#"&54632#"&54632 e2%%44%%22%%55%%2s%55%%44%%55%%44:!@ Y@ Y/++105!#"&54632t@-,@@,-@mm,@@,-@@C!/@ @ HYY@ H/+++9/+3105!".#"#63232673t/QHB!(3/QHB */ 4 _mm&%&#2\S &@ //393933310!#!5!3e*\* &@ //393933310!#!5!3e*$E &@ //393933310!#!5!3o ZZ"@ //39933310!#!5!3o DM"@ //339/393310!# 7 3f\>Ha4R $@  //39/3933310!#!7!3bG4oaRM$@ //393933310!#73_J^rM $@ //393933310!#5 73fS܈kh/iF @  //39933310!# 73pZzfjFp$@ //393933310!#73p^ZHd(5"@ //339/393310!# 7 3RkGHyN!5 .@ //39/933933310!# 7 3Rka.K- O $@ //39/3933310!#!7!3xtdH^- $@ //393933310!# 73`vcFFH @ //39933310!#73wp=Dg-p$@ //393933310!#73pEsHVH!$&@ //339/3933310!# 7 3=|GHY2#% &@ //339/3933310!# 7 534~X4(5f% .@ //39/933933310!# 7 3C{sVH2}q' $@ //39/3933310!#!7!3cy Q2X/"@ //39/933310!# 73HԈG7%p @  //39933310!#573p={H\2#$@ /3/399933310!# 7 36}MH)Q0) $@  /3/399933310!# 7 530~YAuO/l6 $@  /3/399933310!# 7 3ON,qS-m6 *@  /33/393933310!# 7%3O~t8S-{0@  /3/393310)733+NS.)p @ //39933310!#73pA>S.)O@  //39/9310!#!'!ataoL *@ //339/93933310!# ' 3[H5fy4L *@ //339/93933310!# ' 3UH)hy?L *@ //339/93933310!#5' 3SHhy-^"@ //339/993310!#' 3Q6fy=Lp"@//39/933310!#'3p^iy @  //39/393310!#!5!3pT; (@  //9/933933310!#!5!3a.izT $@  //9/93933310!#!5!35$$@ //9/93933310!#!5!3?P(@ //399//3933310!# 7 3h`axbVL 0@  //99//933933310!# 7 3e`;H`GF &@  //99//3933310!#!7!3fb*]v\^L&@ //9/93933310!#73^'c{L"@ //9/9933310!# 73e[؈scSc[Lp"@ //9/9933310!#73pd]?de[/(@ //399//3933310!# 7 3Gu7TaF?9 0@  //99//933933310!# 7 53Rv8HqGG? 0@  //9///33933310!# 7 3Nw]sX=U8H? &@  //99//3933310!#!7!3mwo V=2?"@ //9/9933310!# 73\w߈5:=?p&@ //9/93933310!#73pWw2-B=+6&@ /33/9/9933310!# 7 3O}4H) 0q5 &@  /33/9/9933310!# 7 53N}<Au 1[l6 *@  /33/9/93933310!# 7 3ON,q -+m6 *@  /33/9/93933310!# 7%3O~t8 -6@  /3/9/93310)7330O~ -Q5p"@//9/9933310!#73pM4 -zL@  //39/93310!#!'!owKzL ,@ //339/93933310!# ' 3oH Kz4L ,@ //339/93933310!# ' 3oH)S@Kz?L &@ //339/9933310!#5 ' 3oHu^Kz-L"@ //339/993310!# ' 3o6RjKz=hp"@//39/933310!#'3po~l= @  /33233310#'##'##'5!T6116116Tnnnn%bz 0@   YL?+_^]2333310"&'332673Th]]hbgjjg:! *@  /29/]3393105!'#'53tBΧmm :! *@ /29/]3393105!3#5tԧBmm D!D@$ @ HY @ H@Y/++++9339310>3232673#".#"3#5iS,TLD(44hT,SLES2BO`'"O_J D!".T@-#)) /& Y, @ H @Y @ H@Y/++++2+333933310>3232673#".#"#"&54632#"&54632iS,TLD(44hT,SLES2%%44%%22%%55%%2O`'"O_J3%55%%44%%55%%44ObY '@  Y /+9/333310#"&54632533%$33$%3>x$33$%33!% 1@   Y /+39/33399310#"&5463273#'5X3%$33$%38$33$%33p{{!!:!5@  Y Y/+2+3339333105!#"&54632#"&54632t4%%22%%4>5%%22%%5mm+%44%%55%%44%%55&B@!  PY  OY OY?+3?+9/3+3933310!57#53'5!3q+--fTf-TTN&c'(N&c'(N&c'(N&c'(N!&c'N!&c'N!&c'N!&c'J&k&(V&k&(J&k&(J&k&(.!&k&`!&k&.!&k&.!&k&&w'(&w'(&w'(&w'(!&w'!&w'!&w'!&w'H&k&j )@)`)?)))@ H)/q55+]]]]55H&k&j *@)`)?)))@ H)/q55+]]]]55$ $0<@M +%%177 => @ H@QY.:4:Y(4  44##!OY#QY@ H/+]?+?+99//_^]3+3++29333333339310"&'332673/53327#"&5'5!7#"&54632#"&54632{;wRRw;dȪ>/&.C#n3US+8**::**88*)<>'*8DfS(,,(Vc̓AAArg-*;>'*::**;<)*::$ $0<@J +%%177 =>.:4:SY(4 @ H@QY  44##!OY#QY@ H/+?+?+99//_^]++23+39333333339310"&'332673'573327#"&5'5!7#"&54632#"&54632{;wRRw;>`/&.C#n3US+8**::**88*)<>'*8DfS(,,(VcAAArg-*;>'*::**;<)*::&w'j )@0`0?000@ H0/q55+]]]]55&w'j )@0`0?000@ H0/q55+]]]]55 +7C@V 2,,8>"))>DE&5AAA;ASY/; @ H@QY  ;;OYPY@ H/+?+?+99//_^]++23+_^]3?933333393310"&'332673/53"&5'5!32654&/#"&54632#"&54632{;wRRw;dȪ>1xia|q3CL8**::**88*)<>'*8DfS(,,(Vcܱ̓!-ndt֮(I!*;>'*::**;<)*:: +7C@V 2,,8>"))>DE&5AAA;ASY/; @ H@QY  ;;OYPY@ H/+?+?+99//_^]++23+_^]3?933333393310"&'332673'573"&5'5!32654&/#"&54632#"&54632{;wRRw;>xia|q3CL8**::**88*)<>'*8DfS(,,(Vcܱ!-ndt֮(I!*;>'*::**;<)*::+9!&Lv%@P@N%+5]5]]]5;DG&P@*&  '($`YbY _Y _Y ?+3?+?+33?3+999323104&#"!57'5!6$32#"'53325BvVq第ku gRgOBF*<9555BTIu;E=#U@+" $%!_Y#!_Y `Y ?3+?+3?3393+33999332310'5!#"'5332>=!57'5!ɬ`\OBF*7mBʹ755hZAoGy555;G&V@,&  '( _Y #_YbY _Y?+?+33?3+9/+3999323104&#"!57'5!6$32!"/3326BvVq第ku gơD3C<9S55A5BTg3+/E   AC?3?3333210#"&546324&#"326}JPLFFLNLŷĚV $  @B?33?3333107!57573F%H11q:/V/@  @B?33?33333339107!57>54#"#5632! nd['=57nP[yV`d[q{Q!bodaiH(>@$$')'!@ C?33?339393339310#"/332654&/57>54&#"#5632in7H%`PHZVVD9;P@17oMb[0j~p IaNKAENM>fg`KjU&{ @@    @B??39/333333393333107#5!533#!kea&g{Fy;@  @ C?33?39/333333993102#"/332654&#"#!!76Z7GWPTZ=-:2?n}pXddNp E!;@ "  AC?3?339/33333392310#"&54>32#'&#"6322654#"}U\YV415Ug_bcqB;vOIO}eU4r_]Ty-@  B@?333?3339310#5!#!8$aVBE"-K@ (# .++ %A C?3?39/393339933293910#"&5467&546324&#"3264#"326D9ERQE~{}iGPMBBMNI}>;;>?>B\hQk{ymPi5dmpWPMZ[LLؒGKM@AE!9@  "  CA?3?339/333333923104632#"'533267#"&"327}U\YV424Ug_bcqB;vOIy}eU4r<_]KT@ Y/+3310!5!#PL`/\_,@  @H /+2933339310632#'7>54&#"EVZaB&*"'?1oA9k1^!NH @ ?3?3993310)'3 !wݾp&P\_-@  @H L?3+99//33332103#5573#'8B8 !!!_0/@    @H L?3+99//3333310#'53'#573BΧ08 !!_A@  @H L?3+299//923333399310573#'632#'7654&#"8=:EHE?25(0_!!\4$+4D*A&C@"  Y   Y@H/3++99//+3333310573#'%".#"#632326738Z+IA<#/+IB<&* /A!!{{&&&!4K=@    @H@ Y/++99//3/333393103#5"&'332673BMJqSSqJ Ąo<==54#"JqSSqJ:2=Cx.5) 0Ko<=="--" .. 0/!"...n_z#%@ @! /33]q229/33105#5!#%4632#"&4632#"&3oHk." 00 ".. !/." .oujju"--" .. 0/!"...nMx+@4>32&#"#".54>7.32654.'&/.SsEDp45fQU!!;%/PD%CDI+5ho|Inz@5ihisK'JLQLzW/?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~             uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniF004uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFCnullpi1 cyrillicbrevecaroncommaaccentcommaaccentrotate grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmark breve.cyruni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.alt radicalex.xuni00ADuni0309UNI2206circumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildelamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BE x        bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.604D@- 8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz M L K J I G F E D C A @ ? > = ; : 9 8 7 6 5 4 3 H N < B:BJRZbjrz i h g f e c b a ` _ ] \ [ Z Y X W V U S R Q P O j ^ T d:BJRZbjrz       ~ } | { z y x w u t s r q o n m l k   p v:BJRZbjrz                            :BJRZbjrz                            J",6@   Tcyrlgrek&hebr2latn>kernmark 4<DLT\dr $,4 Zhl(z Zt ( !6! !!","\"""##L#|##$ $$J$n336:X=ATA\Axn L $*06<BHNTZ`flrx~ &,28>DJPV\d2<222d22d2x2P2<22<2`22<2<2x2d2d2P2x2d2<2x22<222<2<2d2<2d22d2<2`2222<22<22d2d2d2<222d22x2<2<22<2`2<22d2P2x2<2d22<222<2<2222 (  H" X2 &,28>DJPV\bhntzXXXXXXXX  XXD|X0XXXlX    L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzX2Xh2hT2Th2h020h2h@2@hX2XhX2Xh2h2h2h2hX2XhX2Xh2hT2Th020h020h2h2h020h2h020h2h2hX2Xh2h2h2hX2Xh2hX2Xh2h020h2h2hX2Xh2hX2Xh2h2h2h2hX2XhX2XhX2Xh2hT2Th2h020h2h@2@hX2Xh2h2h2h2hX2XhT2Th020h2h2h2h020h2h2hX2Xhhhhh2h2h2h2h (  HFLRX^djpv|FFFFFFFFFFFFF. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzXXTT0066XXXXTT``XX00 XXXXXX00TT XXXXXXXXXbXXTT0066XXTTXX XX66TTTT (  H jpv|-(2<2  !<  !J`  J`  J`   ! J`   ! 4<4J4<  !4J  !Jl  Jb  Jl    !Jb    !n L $*06<BHNTZ`flrx~ &,28>DJPV\22,22,22,2,222222,222,22,22222,222,2222,2222,222,22,22<22<22222,22,22,2222222,222,22,222,2<2222$2$222 (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\222 22,2222,2 2 2222,2h222 2 22\2H22<222222 2222222222<22<222222 22,222,22222h22 2 2\2H22<22222 222 2 2 (  H FFn L $*06<BHNTZ`flrx~ &,28>DJPV\X\BX8X8888X X8 XX (  H ( >     $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(`(6Tf|:x8>l FP$JtB|<^ L . X  & 0 V t  * P  >`n $79:<;DGNVW] 79:\DJPV\222 222022$22 2 2 2222222z2z2222H222>2>2>22>22 22 2 22H22222222222 22202$22 2 2 2222z2z222H22202R2R22 2 2 2 2 (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\XT0XX,XX,X0,XXXX0XXXXXXXTXX,XXXX (  H flrx~n L $*06<BHNTZ`flrx~ &,28>DJPV\X22T22022@2X2X22222X2X22T20202220220222X2222X22X220222X22X22222X2X2X22T22022@2X22222X2T2022220222X2d22222222 (  H:@FLRX^djpv|FFFFF,FhF,FFFFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\XT0XXDhX0XXX0hXXXXXXT0XhXXhhXX (  H flrx~h#T@@,,,,,,|||@Hp 8=D̑openscad-2019.05/icons/OpenSCAD.icns0000644000076500000240000073202013402025764017433 0ustar kintelstaff00000000000000icnsis32܂ ݓS%<\x֒]@ֺ˱Y`YؿYI$DZiNfeʶzQl鐎ȶ薔p͹*nr~nьhUOZESn  ߘc/Goq؝hLpQ7Ө|N.4sO8 ó]JP-jµn7}{7TonCNuukv|]>y)qepb3P\LF5ZR;H_ ڻX|ju%-BcFkdCnJ#NK=}KUuhDS90)NVTIGH=90"MHA;4(v5]7JA<5-'=2?:MB:5,/SZX A>:63-"4c{f#6Q;() $rv DQ9nl]e d{s8mk@\ w\>|?.Õe߄/!yvmmv6HKy>3zIil32 ÈjosC))BSbot^T;7L]m|pcC45K\ht~pJ3EVwfKUílXplȾtO_i]@ƸpPUTC'_lKZQ$"MŹyeH[f0?hȽvZCaX[ӼrCWPR{ɵ˻A2mZĊ!ssǿ~ƻ{}l|uu`lwtېpticw_ɔkxnfGڂ׏sneXL?n{XUJEKZgK?HIP[iuƞzddlvƍpx~P33Nar߅n_D@Wj|}gd`΃qP=>Vixkee^G~THMO@LTIQH2(3;BMVZ) GGYWDRr+&0AOHPK-(}JXWWQi)/Sad)%8,&ՀcQWVVUOi]LQUNE;72-& GXVUTSRJKLHC@=:61+%BnLUTSSQPPLIGD@=84/)#"OORRQQONLJGDA>:61-'  DZWRSNNLJGEB?;73/*% !BvYb\7RJIGEB?<950,& '+%r&aRP8KFDB?<951.'*,L6)BlMGE(/TIBA><952.(*HF?\KF(>99?SWN?=;852.*&HTYcgbWe7:<:9AD<:741.+#2S\fpnl]+/DB<;=82630-)%!JU^xurrcWKJD:;2.1.+(%$GObzwwrz?SL:=6%*)%"!]]k{x{n&VUCGE"$ rlwzs#`SO\M7fmupzO&QYb-;_g^s:J !&(0?m Z7$8j齑vmql8mk[ů>e/7dpgqoFbp}Tסow?R`} ÀEls%ߑ|Nc|!Bd]xgDrƶi~qm~vezu^Pzq+xzypsj~zs/w|p Tv{q)]|}zBruM uD :s^!it32k|Ϲ~y~޲Z;)$(,4:@DHMRTW^dp#pH7211.39=BGKPTY]bejlnonnv+؊XFGIFA:4-06:@EINRW[_cgjnswz~}{~/]UYVPIC>83-06:@EINRW[_cgjnrux|1k_c`YSOID>83-06:@EINRW[_cgjnrux|4hnjb^YSOID>83-06:@EINRW[_cgjnrux| @nvnhb^YSOID>83-06:@EINRW[_cgjnrux|>u{snhc^YSOID>83-06:@EINRW[_cgjnrux|>|xsnhd^YSOID>83-06:@EINRW[_cgjnrux| ?xsnhd^YSOID>83-06:@EINRW[_cgjnrux|v ȿݬM牅~xsnhd^YSOID?83-06:@EINRW[_cgjnrux|sUԅ~ysnhd^YSOID?83-06:@EINRW[_cgjnrux|tqQ҅~ysnhd^YSOID?83-06:@EINRW[_cgjnrux|rcR∆~ytnhd^YSOJD?83-06:@EINRW[_cgjnrux|{n\Qysnhd^YTPKE?93-06:@EINRW[_cgjnrux|}viUQ|ytnhc_\TLB@?83-06:@EINRW[_cgjoswy}xpcQźQy|tnieWNRZlZ@;3,06:@EINRW[_ciklmosx{~zrj[PzStvpd\{PTG;34;AEINRW\a_`iy|tldPVz~Rlgxi_YQF:4;FKNSXVXqհ}vne]De{yzkRef^VNB76EQNOrϟ~wog^S?z|yxtokgGmqid\UM@/7hxqi`VGH{zxtokihXHv{tnibVQbǽyqjcXM@^|zxtokhfb_]XI{~yomyrkcYODIs{yxtokhfb_\[[J̋}|3¾yrkd[QDE[xxtokhfb_][YURJUHǽxrkd\RGCRkpkhea_\[XUQMJJ:B¿~xrkd\SICOajea^][XUQMJGEE4zG¾~wqjc\SJBK\i^\[XUQMJHEB@=4AD}wqjc\TJBJWkaWUQMJHEB@<732$D¿{vpic\SJBJUgiOMJHEB@<730--E{uoia[RJBIUbrPGEB@<730-*&&cDysnhaYRIBIT_u^>A<730.*&$#%IF~xrmf`XQHBJT`qq;730-)&$#$&++?<|wqkf^WPGBJT_kD,.*&#&*.269ܐG{upjc]VOFBKU_i]#($##&*.159><אI~ytnhb[TMECMV`j}u"##&*.159=@CCڐI|wrlf`ZSKCDNWakx1#*-159=@BFKL܏Jÿzvpje^XQJBFOWbmvR&359=@BFKPUT܏K~ysnhc\VPGBHQYcmwl.:<@BFJOTX[cL¿|wrlfa[TMEBJR[enx9@BEJNTX\aax N~ytojd_XRKCCLT]fozHCJOSX\`dkgP|wrmgb\VOIBFNV_gq{ZKTW\`dhnvpQ¿zuoje`ZTMFCHPXais}lR]`dhnsy¿R¿|wqnmg_WPH>=IU\cku}ZeinsxTxuvjO7XbWPF:6AXhmvcnsx~n{|qR/%%God^WOD74Mrzny~q~[/#*13>soic\UMA2I}{sۿzE#*147;>r{rmhbZSL7Vtɼ¿n6&147;?B@p{wqlf`YRE{t뽟佻B&77;?ADIJwzupje`Sbt͔ظ¾~}J5@ADHMRS~~ytoic]ɍi¿~[>GMQV[\}xsnc⒘esOR[^ah|wnei]ei{x哘JyoŐeJ S땊~}O͋镊 ~}}Pڐ~~}~Oݑ {~~P~~|~땊_}~~}{{~ym|Ȍ镊~L}}|~yvow{򚖊 ~N}}||{{wrodļ|w}~~}J|{{y}~xsnk^¹|xxȎ|}|5zzyx{ztokf^i~{yq̀Ð\z}|{zyyxwxvqlgb^U~zwsnۑI~zzyyxwvuusnhc^[M}zwtnr̀¼񙖋vyxwvu3tpje_ZXOp|yvspg΀̀ Exwvuuttsrmfa\[ZVe|xuroldρ΀̀ԑȐDsuttsrqqjca`_]\a~{wtqnkgbox͂΀̀ 镍Eqtsrqpopofedcbab|zvspmifbdî̓΀̀הtrrpooqtxnh+gjb~{xurokiebZo”̀͂΀́ΐ}npoqtx{{lm)aL|yvtqnjgea^ToŒʀ̀͂΀󜖌Fkrtx{~xqpWKK{|zxtqolieb`\ZMy響̀̓6qxz}rOOVW}}zxuspmjgea]ZVVE ûˀ̀̓4{}^U^`}{yvspnkheb`\XTRPCf ˀ̀4xbe}{xvsqnljfca^ZVSPLJ>_ź̀G~|zxusqomigdb_[XURNJED>UֺˀG~{{yvuspnlifeb_\YVSOKHDACFJȲMtxutrpnkifdb`\ZVSPMJECBEHNLՐKorpnljheda_\YVTQNKGDACGKOTSjIomkjhfdba^[XUSQNKHECCFJNQUY]a񛕘Dȃdhedb`^]ZWUSPMJGDBAEIMPTW[_detܑ>Ι]ca_]\ZXVSQOMIFDBCEHMOSVZ^beimpyǏAΘX][YXWUTQOMKHECACEJMPSVZ]adhkptxzt|?|ɪsPVUTRQONLJGECBCCGILPSVZ]`cgjnrvz~sr<9;*y8vulcZM@?O]]_yikfr|vpjc[TH=HKIFC@? ><9876517yrjbXI;Aiugej|wqke]UL?@HB@? ><9876546%tRÉ~xpf_bohk|wqle^WOD;H@??><987653310.)Sȑ}|vqlf_WPG;DH=<987653310.,.Uҟ|vqlf_XQH<>P>77654310.,*))#2V|vqlf_XQI?;LM453310.,*)('%&Հ8¾zvpkf`XRJ@;EW=010.,*)('%#"#eZzupke_XQJA:BTP-.,*)('%#" ) U¿~ytoje^XQJA:BM_8(*('%#"  Y}xsnic^WQJB:AK_P$(%#"  Y{wrmhc]WQIA:@KWe-!#!V [zvqlhb[VOH@:@KTjE  7 [¿}yupkf`[UNG@:AKTe_&Y|xsoje`ZTNG?:AKU_r- Wzvqmid^XRLF>:BKU]tK Z¿}yuqlgb\WQJD=!$'()% V|xsplgb\XRLF?:?GOXaiW!$'((*+2 ^{vrnje`[VPJD=:AHQYbk}m !$&((*,0-IZ}xtplhc^YTNIB;ELT\eoy:$)),/247<-ƺU|yuqlhc^ZTOIC=:?FNV^fpyH#-/25799CKPW_hqyY&4569;?C8pq˻`|xtqkij^A$]re]RE>ES\bjs{f-88;>ABGBƾhcjU¿}zvrmodE =rld[OA>Nflt}w2<>@BEM?tu}ñvfic[|xsrqM %xrjbYKIHGgHB_~|ztWUQJHV¿~{wxb%$-//8h?IGfHC[~|~|ywss]KRi{wwA(11U@IGeDQ{{xv}~|yvsqolj|yuyJ*ŷ:JGeFMxwusqwzvsqnlihf}zu½i@IGcwvsqpnlpqnlihghhi¿}{t¿RDHGHDltonljigjihghijjhpF~{vyDG HCcrkkigfdcghijQljt}zxrCHG HDWohgfdcdegjTklmnls~zxswIGEPuuwxy{|~rprrs2wwqlgb[c|yvspnkfw:JG Fnzy{|~}qs6tsutnid`\S~{xvspmjgc=IGHD[~|~us9ttsstrlgb]ZM|~|{xuromjgcf KFGFIy~qts8ttoje_[XOi~{ywurolifd\p j?IG HCbtsst0ngb^[ZT_~{wusqnkheb`W| :JGFJzrt1unec`]\Y[~|zwtromjhea^\V| CHGHBdqut1usgeb`^\Z~|zxvsqnligeb^[WYƻh@IG t3vx{mffbaeZ{}{ywuspmkhfc`]ZXOe˦ :JGDHC\|rttvxz}|ihhiR-o}{ywusqoligdb_[YVTIgΦPEHG7HBxqwx{}vmh=% b}|ywusqomkhec`][WUQPBr򼠸;JG8HEMv{}h,%+&b}}{ywvtromkigda^[XWSPML: IFG6HB_}7"..iyywusromlifdb`]ZWUROLIG9` ;JG5HAvW.,i{utspomkigeb`^[XVSPLJGCA5XHGGD\otrpnlkigeca][YVTQOKHEA=<6M:JGPHEKqnmljhfeca^[YWUROLIFB?<9:>AUCHGMHCSgkhgedb_^[YWUQOLIGDA=;9AEGKORVNDHGHHCRwX]ZYWUTRPNKJGDB@;::=@DGJMPTXXs<:;=@DFIMPSWZ]bbߤ:JGCHEHhNSQOOMKIHFDB@=;9;=ADGJKOSUY\_dhkn;KGBHGISggGLLJIHFECA?=;:;;?ACFIMPSUX[^bfimptvzr:KG?FBSbfr|Y?@GEDCBA?=;:99<>@BFGJMPRVX[_beilorvzd:KGFEJ[hhfK77==<<;;:*;=?ACEGILNQTWY\^aehknruy}z8JHG KQOGzD9CA==<<=,>@BCEFHJLNQTUXZ]`cfhkoruy|:EJG=HILKozGFLJHGFFHHIJJLNPRSVXY\_adgilpsvy|J=JIG>HJCGnpMNTTQPQQRSTUWWY[^_adgiknqswy}v==GJI=KD:[Ã[V[]\\[[\^_`bcehiknqsux{~tF:<=:R ՝q`aeh ijklnpquvx{~ܪvv+ymknrtvvwyz|~&ή{yz}ǵ  ׽gaeghjj%Ɨe># !$('*.4@Rk*xE$"$(+.0358:<>><98?Oq-ąF' %('#!%(+-0257:ABEGILPOI@J 4_>6;:51.+'$ !%(+-0257:<>ABEGHKMNQVR?2g毀WKg?fDCB?;741.+'$ !%(+-0257:<>ABEGHKMNPRSZU+){ۊ&'MtGLMDA>;741.+'$ !%(+-0257:<>ABEGHKMNPRSTW[93z@OIUOHDA>;841.+'$ !%(+-0257:<>ABEGHKMNPRRUVWX8%Wr+@oFSVQKHDA>;841.+'$ !%(+-0257:<>@BEGIKMNPRRUVVZN,-@UJVTTQLHDA>;841.+'$ !%(+-0257:<>@BEGIKMNPRSUVWWZ9)+('rBGQVTUUPLHDA>;841.+'$!!%(+-0257:<>@BEGIKMNPRSUVWW[G)+($#PEVU;VUPLHEA>;841.+'$!!%(+-0257:<>@BEGIKMNPRSUVWWZO,+(&#!drHVTUV;UPLHEA>;841.+'$!!%(+-0257:<>@BEGIKMNPRSUVWWZO-,)(%!zlHWTV;841.+($!!%(+-0257:<>@BEGIKMNPRSUVWW[J,-*(%$ lIWUV;841.,)&!!%(+-0257:<>@BEGIKMNPRSUVWW[>,-+('$!yGWUVW=SLIEA>;864/(!!%(+-0257:<>ACEGIKMMPRSUVVZS1/-+)'%"9HWUVW>VNHEB><:,$,9P< !%(+-0257;==>@CEGJMRPQSUVWZQWSTVZD01/-,*(&#! KTUUVW?VWTGB2M>52,%&)*-012>P^dffdb_e:3UXWE120/.,*(&$! [ZOUUVWV>WWB|_5:50+#%,+,=Vfifca_^]Z`"I@2421/-,*(&$! |IVTVWV>XRx8A<83/*!5Ughdba`_]\[ZX155320/-,*('$"YEVTUVWV?UVIW;GB>;71-1>==;;:98653210.-+)'&$"  wHUSTUVUTSR9QRRPONNMKKJKJIIHFEDCBAA@@?==<;98765321/.-+)'&#! UISTUVUUTSRQPPONNMLLKJIH)FFEDCBB@@>==;:98764310..,*)'%$! wHTSSTUVTSR;QPPOONNMLLKKJIHHGFEECCB@@?>=<;:98654310.-+*(&$#!  JRSSTTUUVUUTSRQPPOONLLK/IHHGFFEDCBB@@>=<;:988653210.-,*(&$#!|ETRSSTUUVUTSRQPPO8NNMLLKKJIHHGFEECCB@@?>=<;:98664320/.,+)(&$"  KVNRSTUTSRQQPONNMLK4JIHHGFEEDCBA@@>==<;988653310.-,+)(&$"  *CSRRSTSRQQPPONNMLLKKJIHHGFEEDCBA@$>=<;:88754321/.-+*(&$#" sFRSTSRQPPONLLKJIHHGFEDC)A@?>><;;988654310/.,+*(&$#! " PNPQRRSTTSRQQPPO>NNMLLKKJIHHGFEEDCBB@@?>==;:98754321/.-,+)'&$"  #CQPQRRSRQPPONMLKJIHHGF.DCCBA@?>=<;:988664320/.-+*('%#"  !}CQPQRSRQQPOONMLK8JIIHHFFEDCCBA@@?>=<::98765331/.-,+)'&$#! $\IPOPQRSRQPPON@MLLKKJIHHGFFEEDCCBA@?>=<;;988654310/.-+*('%$"!( HNOOPQQRQQPONNMLKKJIH7GFFECCBBA@@>=<;;:887543210/-,+)(&%#"  ( @ONOOPPQRQPONLLK JIIHHGFFEDC.A@?>==<;:987654310/.-+*)'%$"! '! ?ONOOPOPQRRQPONMLLKJIIHHFEEC0A@@?==<;:987654321/..,*)(&%#"  !%(EuAN MNRSTSQOOPOPONMLKLKKJIH9GFEEDCCBA@@?>=<<::887643310/.-,*)'&$#!!%+ ~aDMLMWaeedc_ZTQTOOPONMMLLKKJJIIHHGFFEDDCBA@0>=<;;:987654320/.-,*)('%#"  !%-QFLQ`hfdba`_^_S5RRNONMLKKJI?HHGFFEDCBBA@?>>==;::9876543210/-,,*('&$#""%.BGPXcgcba`^]\Y^>ESMNMLKJIIHGFE9CCBA@@?>>=<;:9887653210/.-+*)'&%#" +82-' #&/P]`dba`^]\[YV\(4SMLLKJIIHHGGFEEDCCBAA@?>=/;::9876533110.-,*)('%$# !@740+$ #&/ ]q\Zba`^]\[YWVTX&QLKKJJIIHGF'EDCCBBA@@>==<;::8876543210.-,+)('&$##" @?;74/*" $'0Hq"]\`^]\[YXVUTSQ  MKI HHGGFFEEDCCBA@?>=<;;:9876543210/.-,+)''%$$ 9F@>:73.( %(0&O&Z$^\][ZYWVUTSQPN  PKJJIIHF'EEDCCBAA@??>=<;;:98865432110.-,+)('&$"4MDC@=961,&%)0*Y$_ZZYWVUTRQPOMN$OIHHGGFFEEDC$BA@@?>>=<;;:8876543310/.-,+*('&%!+7RIHEC@<841*)1, YYWVUTRQPNMLIN'KHGF,EEDCCBAA@??>>=<;;:98765443210..-+*((&&!.CA9VNLJGDB?;84+3${KNTTRQONMLJIGJ,CPFGFEEDCBBBA@@?>==<;;:98866543210..-,+)('&!,DCFG@ZRQOLIFDA>;3)ZKGHOPOMKJIHFDD< 2^h^IEFFEEDCCBBA@?>>=<;:98165543210/.-,+)(''#+CEFGJO+Q[VTRPNKHECA<$|5 HFEDJLJIHFDCB@C=Yd^\aWDEEDCBBBA@@?>==<<;;988765443210/..,+)('&$(DGGIKLMTA`[ZXVTRPMJGFA&"CECB@EHEDCB@?==8@R^`\Y\\[^MCDCCBAA@>?>>=<;;:998776543210/.-,+*)'&$$AIIKLMOPQVU89e\][YWUSQOMKH'o&>C@@?=ACB@?=<;98MXTUWXYYZZYEBCBBA@@??>=;:688766543210/.-++*)(&&!:LJLMOQRSTUW^ZA]d`_^\[YWUSPOL,4 4C>>=<;>?=<;99:MSSUVYOAD@@??>==<<;;:987765433210/..,+*)(&&!3MKMOPRSTVWXYZ\hhdcb`^^\ZXVTSO3 )B<<;::8:;9:;;:=MOPRSU E?@@?>>==<;::988665443210//-,+*)('%#(KNOPRSTVWXZ[]\ahhgfdca`^][ZXWOAA: 987799:;;:;?JLMNPQQRSM??>>=<;;:984766533210/.-,+*)('&%!?QORSTUWXZ[\^^akkiihgedba_^][[NY=98789;;:;<:>EHJKLMNOPB>>=?<;;:9987655432210/.-,+*)('&%!,QRSTUWXY[\]_`bmomljiigfecb`_]`Jx88789:;<;::988766533210/..-,+*)('&%$"9887765443210/..-,+*)''&%$ 2IGHNW[\]_`bbfqrqpponnmkiihgfdbdMÊ <9:;;<=>?>;<;<<;H@A>:78;;:98877665443110//.,,+*)'&&%$# ?IILMOU]aabckttsrqqpoonmljiihgfaa =:;<=>>?@A>;< ;?B>;:75998=7665443210//.-,+*)(('%$#"+JILNPSSV]chqwvttssrqqponnmljihj[  5==>??@@ABC<<;<?A=:8526876554431/..-,++)(''%$#"!?@@ABCDEA;<;>?<964028656544322100.,+**('&&$#"!#IMOQTVXZZX\xxwvuuttsrrqpponmmjf?A?@ABCDDEFG=;<;1=>:742/-6654332210/..-,,*)(''&$$#"! 3QOQTWZYWXW^yxwvuutssrqqpoopcj 4DBCDDEFGHIC;<; =<8630-*2531'00.--,++)(''&%$#! BRRUWVUUWXVc{yyxxwwv uttsrrqpprb GCDEFGHHI=<;6<<;:741.,(.421100/..-,,+*)('&&$#"" !NUVURQTVWXVh{xyyxwvuuttsrl} >GFGHHIJMC:;<<;0853/,+),3110//.,-,+*)(''&%%#"! -WRPOQRTVWXVn{yxwv uutssue4#LFHIIJKLLNK;;<<; ::741/-,++0%/..-,,+*)(''&%$#"! 9RKMOQRTVWWYvzyxwvuttqyyCJIJKKMMNNP@;<;:7320/-/., **)(('&%$#"" 3AJPPQRTVWVb{yxwvuxh#OJKMMNORG9;:;;4321/.-+ ))(''&%$""! QBLTSTVWVl{yxwvwt{4%AOLNNOPPQRO::;::;<=?8532140*,++*))((&%$#!! 0ܞ^FQWVV\wxxyxwzjRNOPPQRRST@9:;<=>@B@6556% .)"(''&%%#""!4XLYTjyvxyxyr7UOQRRS5UF9<=>@ACDF=96,(('&&%$##"! EyJ^vwwxxyzoe LSQS/TTVN!  & !#$&''.;FMRVY[ZTI2`0 *-1  '!"$%'()++-17=@A?@5;K 3p ( !"#%'')*,./12346;93^^"H ( !"$%&')*,-.02458=<3K!6 & "#$%&')*+-.02359<81AE|H !""#%&'(*+,-.02369:41KDy g'!! !"##$%&&()*+,./136884/8aʼnSDEQ ֔S("%&'()*+,-/124552.-8T 'դqG)#%)*+,-./--+*),6Jm"ϮoZFA3/01223CH[m ͂ t8mk@;Px`E* 7n伄NVx)Bf _$ t+3DK>+X /YlommnnjY33n 5aojfeffeegjoa2}0.bohefgggggggggkpZ(_dhgggggghhiiiiion1Yiaiggghiiiijkklknx>v_jghiiijjklmoooozO_liijkklmoopqrrp~G^mkllmoopqrrssts}>`omoopqrrrstuuvv,erpqrrsttuuvwxx|wjtrstuuuvwxyzzydnvtuuvwxyzz{{|{=wr0_wsvvwxyzz{||}~~}MR$Ypxxyzz{{|}~Y_h^~o|z{||}~bbiu}|}~]j)klz}~ZwU] ?~4fDӃ *6·Ooc擘  ˒_癝 /Аc㐓 cA|^*W۶~|y~#]ackը}~|zvL ;[anjbިx}zxu~U9cp_fmnodw|xux{OFiphf[hoopsd쪒vvx{e)Pyyxvt`hqpqruiu{e1;}zyzz{}qgsrrrtyfe2?yxzzzzz{titsuvrk"xyzzzzzz{tvtsmmʊdyzzzzzzz{ug}䞁yzzzzzzzz{wИtrDxzzzzzzzzzy~^cyzzzzzzzzz{v=u{zzzzzzzzzz|q~yzzzzzzzzzz|q|zzzzzzzzzzz{s+xzzzzzzzzzz{ww(xzzzzzzzzzzz{u:|zzzzzzzzzzzz|q }yzzzzzzzzzzz{sv{zzzzzzzzzzzzy|Tl}yzzzzzzzzzzz|q]yzzzzzzzzzzz{uFxzzzzzzzzzzzz{w>*xzzzzzzzzzzzz|rw{zzzzzzzzzzzzzy~bcyzzzzzzzzzzzz|q@xzzzzzzzzzzzzzxc{zzzzzzzzzzzzzz|qhi~yzzzzzzzzzzzzzy{~R _|5 *Wy˲g8 )0////0ic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 $=?wm!i3ЄjtA)wM;rF܃2.HŁ~eFr\kjʹ^BI4tj*9.-m&]Re1^'Tsg zlnld8w7!_mH{ԩOF\8>eXRσ.խI(LyV2Cm(Z uxXIE |\Y"үԥ_gQ2-%si95owIΧeRJMKc!`W{)7ZsXuYu:0?.i+4M:Z Ine96x݆։#6ls0ҿM(t/c37[䥡ɳ62,1b~8yR;mاiv0K UT~!ʢp<)"թ,YWk.I'~ 1,NrSv/0uGOGx}~ *ǪA,AnU ^KSW^\>ʙ[id]e>*!ZXU{ut"O_b΍ ='p&{ *~sߊ[K(nBUXbgk-Oܠ~G .o{LZX_~31OrS];VkUZԧ_׍PzeMPYn;ǁvc\4\M+g$K\&zD9W:|X>/I(6eU3AHQ"#,kp?E ǁ"u`Nq[9} >+4aI?[a7݇0OlccJPf2F^7p\xrO,oH&X r48kR)> Է,^=+~D:%},c0[J?Ա%Qǭ(f.YxY0 /y :XᠱɈ$l Aכ( n*/ #Zh^EqYm<$XuVĦW B$K%Y&Ch~hzmgdn뭬LV؏gcFg l4 FN yG Ldb|w1nհ}mq- kCr/&3 N \~O@ pjNnqhugTVU:3pZD1.V,[h])w"kUD(Ģ| .lޱ-@,39a{H-EV> K[֜-d7(c4#.Ε Y$*cZW7X ,Mi9`+[JʭZԾvf~#c߲]2/cZsYTd^ W-/"#(7# Z4 O6"&jlRu}j#dXbiW<>ihf%}#iܭ+L]?UT5'`aC2G*MnN3^, ݁%m <#.@D&Oc69s=SF[\8V=Y[] LkiMaP"L?NmQ9A83&@Ɖ섡rt QǢ8Уމf 8U?5 +pUu5n'6YYs+/u5Rofj$<%J3}ȶY)DuH̪B i?|vBF]52R;/WF.}}pwE^n};f`X"`L.l`$cz xçw#x)_ԗـfnǧ 4pk¢I/sn(0 i8LXOγζl(=VrMJAFѵ,ұ)δ0K ײΡ> tsl'FE=Q.J__) Fkn \2T݄ء}I̔z`WCȍBq5,?5#U-j&cq=!vڸ d "\@)7 P"|4KF9S0ZhvKNdjz`Yڛam( 覙cΔ4_?2cl 4" \XH־b _>(+ !u9 @+@0}~?:V0pSA3&9NN'*%n*`TjٲpJ-/'=#5o|lg[\*bv3A;XI~h(w|^}2MYa U6iMwcq]9}' R2L `ާ]SlgkTHjn;F1r_6ݩ-[tNN ?͍eF[M # ӘfHhHT,iHg["]􌏃/o}y] \K]HBd,:)\ >9܋͋AMD!sC:863hOKqqJG\k]ay6&ah ֢b9`6o9 _CRK5a?7 >ZL1q| |(?\jwKp3ܦhklFI@F,A0#8de? mfdpe%m>x(`{qr_ciPZӛ#>ƛ?mO i&qt gi/ )&!5?~$+oLALښzSJr1:i|{7 QكMcPbljDDYj7Rv23=Fa%UD %QKu,~T19w-I`lc |]1&탾nrC Q(J[bwdipX7#xA[iLc3 2$uabڧQc-ZQg/i"{b(_Cw+[Vk̷CbbYÅ-)ڻq|b, \[]T#]ubG}bG1Maj`ieiVR{Qר\XFrJ^(%LY|W9$C4/`kpM+uUc0JzՆ=:TЍvRC(tf88M@AIoXi}ihU˃ن9 4biZ͖ZuRnDu~&jQ^ CuSaX7q}BN })&5>Y$*pC㙤75Ho 4A>T<㹏bܼ"Y*W/Zo.D~eVƯPGq] HU4 $Ջ2 C|D z_ǫSV.$bIlkpnzB#2Ӂ ) 49<-ɸ7vs&=`-ƚ|+_"E]%"+F;)c8>54jG:6@5/к x h1KImS3JI7pe㥈AXLH2+DN{4jQ7cAmz !VOWwc*ԶS#mM-?I3@$˒GY[1(_*ifE>m ~q0mn+7fs4dA/E}]>8UZwԐOpH8|0sLjeMWd=yі ^ӅG&-dSBY.%|D82[߂թ C(0Xg+ZP4qԼX[K3sˇ7஻"r@->(*YGԫIW^rMj.J^KM95zPj )e`דՕp?HVLG &t lKnX/ǀ"m R8q!CH`ABߩ.x:UjLCb37~!0J³0pɀ:Dw3QL~~vvSwRcYU6tǽd{| ׉O]F&kqME$lUXZvi8wmf-va7s:r7v*L7P(MhlMp%^u5{-0A=Xz=)Ɔ+Tȶ,+UM6} AZnK H}:3 0V9v5]WQi3&'kRIjW 2~C7gO*xou:n4CrJ%,G#5W36^vKQ@ȾU`Lpp-xp o[MXfgJy}۱ ̂iSV ; t=yW `wL"N_NV!UO&xya,Yˈ[z >553pgǨS4ZM!cXSfL"W#a$P4r  r-+R-TH殼 a)S*4sڹ<1$L @$K]`.HyTbUl-@]DJQYxkgˈd sN35T"$/aepL$ Tjv=>..I݋@w =]$'MPI`vL˞mJţp@U 팳@C𩭼VVOda?)ȁik;}ĸj:&y0\?ByQlaKPznW9cΞG_EKg Ч`9;:0 .BUwP4S}(d'ϝ}qM޵*10/JM"#7}6OV[p[os7ad\.d%q*UjN[ K^EO^`@vR٫Y/5E4Fdɓ(aVC|l7y?"6>%9z|}t;CH$ٰhm@8RMBǃexgrP\1/QyzjbNuwmZbB?yyuyߺj:+e i‡UG]z|Hl**5bI9u 6'1Fڋr\D2[z2TRpU݆BU'cY*WiQ[=&_(b #%D:+zSE0x9>FɌJ& |561I*2X`vj<'m$' 6.>oN%>&09>nb G59Hj[ѵ-v5B"e+vl,? 'O ,=]l0#dRKksLA_sC<莰! ZdClWs>_8.])%7pE~gmTR Xϗ3<!UAn O2aq'v2G_liPGm^(Pqh/ʖ=ar6xAdzY.[9$ |'{2(@ WEU;;R+.B?uÌѯY%﷊dLVRgVv1HɏHvp26󍗌C]JϘ9LVR%_0d[msa+a~;rĠ$dAV6,`]'"8BF'zoǡ#w_:ooA[QNM*U#M4cIEP%@d{o2+ ='򞄭g wm5Up~8Eqbd4'׷wʓQꗫxWj/GbMFO/R2ӳa_3U۶ZNQ-OFq"V԰Ox=&Qgbr0,&fȰm)++_T iZ)5Dw{ŃUiڣ^NE;9+'r!Ι/ެxAH$pˆ"IF2&ƍt_Mx_$^(Km@dm2-a %u .ڨ+xn%/(6A֊OTw@'GUgm"Jr4tgUkbYHڧk6#~ 7,R=2uic9# p0e,zTEoĦic!96j250VrIYur4XHHj#3kwcB`S)GޘZ ;:Ė1jP2QE߁Ev;)؁sQt^~{L)3 ! Ce?7=U.+,z0eSLߚ6c=O->DMJݾW0J@Ԋm,p  l,c0EyHx}U3-_di!qѯ\aR"tOoMZ9,jrq,\h)߷fB4^H8ALj!ź,I1pu+$:XXO1~Ez#N4Cض@OGrkS b11SPK#zgkbX >[pjF.yZfڷi W.Lp? n(BlZ,bSKSl<;7{VlR_%])voq I|Z<k|`ܰ?@*?J]֎9#R+O4ZUdU A|hJuZOɇ«ӎ튏|B fŸ6XTAuv_h rqtIୠyleFMzVє*%I:ecz zi^H#&Rb ,B%s< yҥOF֫i.ANBdN|VmA~c;B=7hldE $heݙ4UWOGŠveQB @oFo r> Fl0 OB r#%f I*Iw怶m'Yҟ 2J0|r5Q` krO^zQݘUƩ|3YQ|BTGr퉪J'XT68PdܤܜaS%w6n-s(6@D4HrG>WRzYSwdzD}Qd `DVJjz`fu*N1۲Ȑ֋DgA֞_+'oO'v_}VeFS~c&e\znʅ..>;:<)0SbVXAAH^ϭ Tnk!% jnmD)eaLn;OZYq\-I}[y9!bcUQ7xqѫTpaĻZ0VŊ&wXr|ew1AlYXOfTU]h";iC6A|&N&zDښhÌNWf^+9ʋw;ts8}aUeڮ;"0w! RCS_XG^_Jړ{Xtw^Ӳa/ց/^J%WiQ٩)NJchg""ٻ Ev%g1&ZU,6c|!u^ri0,wGL)&wC6b*“ġLK`ɑcdr11-ݝ>N[H"E4*}66wg/Úw>CS1,"C{T׾ ϵj8Jo$ [PخVD};k怜z=[=" gy=? rEҩh~Dd>vǨMĺH<.Nj࿜^C'(B:J| {4G'zif޲FMzVd܏~lpi \qfb#]t6<_,lxp {% kUB#BA 3KJyxɁy7X;&)Ge Gqͼ(+o+&>p ӞQ1@ EK)$W"1ZEb0 F.D>/g%/D;Ao%VUk^KF ]r`qJxԋQɬ?kפvikw'p.?W89$t Q_Nt֐Oy;:ukzlM PH;IlyYH{7c^׮a0KOq4tuݳo$oJȝY6%9aďT#8N~h jq VЁ@c9r5ӻ0hgK^J.k \{Qk?] _u$QZ^?r 侤Syk-(~S[ 5%bVʿv\ɮBnTZ f/*ccV3lf$Tq7]^y( P*/ g:opSϊfL8L"iTB#Y%q3T,/,|2)|j FgƦA `+ d8כa?gG<ѼhiFE$G[ckzlZR(5+]G-`#"YLH.|!=sPӢ;ؑ#qMr1`FL9 +sFAb~׵>.\.9P #z&ú)Loe #bjyڕR:RfM.]uP I.u[Qg7(Ub/oίagn³-/ltGKp[;RFyR JdH@uU//{ ~*|%'MGQzƅ$>~}sTv:MIHIb8O2Y_~Iw89OGDPo'lyeʜ`'$?=4Lq!ge>cB!(gd u)#Y ʺB q%%^}>Y8jk1J{CCC39AdYJKC-qLX95-^:Qq@X J>I8d@,Ie?8,ސ\gן9E0cګ8B@ Opk,Yvl?ۢc#=URIngmVXzu{rd& Z!IC8٨C*!EF)| DQQ>k ^^#*s(cv0Or˔$peTxY I‰RCa,GLv ^=gD,bx` g#ꩂShv -̮u @:N`SSl+͍{1`Y^ /${&?"LZ( L Ң&T?Qi 긘B_Gxͩ1zD\ x j9VsoGNh5/Ԉy,a <%yf3S R27ีYIL/8| }L!t2=/#ur9u+Ro-Fe'd_,@s;GP'Zu8ɴfWeQRzZoOp/$ͥզ2j2PfXn /Tnƀ3w hͬ3} 59]y&5Jg>J,..hˤ#| 2ٹ_ߚw{$`%o_kx˞0KNXV,]Q]% WfKURZA+D٤CВ負Y7B밵(t83t=>})էN_K'zIUq;ߺݼɛx3 zBش)??TDq:B¬;+ eJ,߸W9Ȅz&yhmR2ї'.PIlk55wF4D0Faix3Fzo3܉$u鎰hNFbc KP*T|E6Fu$+դ+/ "{kK &n?QOeu8gBM29 uk9Z1> R4J jCpjҬP~rp*R5~]˸܆ccHDڗ;lr &-ղ2bgn撑MFhw֨q3.kj&jT,v[IPCϳOvO!85#%;Efs2?qT ʕ`짰ۘyE7ZxcfOJq3VckA8V"JaF. oxFvI/])v`F'칮6n8;#`fxY 5O~ô݀-7dK} 8lǮ^2̴uklkcMyŨGo8+p?Y3d-*щh-jF(s4友i^ y<MB"UI;_*OvSs|Ś3mi4YjSm埘`UG>SN8k(;,AEX"/'dI[]R w 7_&E8g8ao)KnPs3:LCT/P5!u3!8Ycl)BxFu {UVqc\H[$Neb.Q7P/YYR)Z{c2^.<~r!-uȻe]8;%R9K'ր{  ?^zJaLocϠ8»l@DYW:7\)?/sF"m8V[v쑂RG]tukv5{ =tim\twĢͩ= $ qǕZ6d8S c%7PMJKb|@DVGMm"y1Hӂbw0"C.fkRgŘSYN|aEl9X' ʮIb dW2$ϼeۗ{d(l i7A Q@9s]*^'#F͓oXS Y{T)-b{ '4BoVѧ_'mJa8(ؗ#Қwx[.XL{r.oq2i!J_KY_<7;ԹCPJE^˒zQ[7'Ba̝dީT2lE!2{pR|y AJdƲ3֐>&@i6"mg>b7n f׃_XCW@JS¹$>#J׎Y6#q1TqlA`WbX7tBC x{ሮmj)¿hu=qܰ^hv*f=|BfFU65,gތ=Qٽ{ Yai+Ie]^ `P֊" ;zPM!8*t ֎}H!kL>M+~Yw~:rw{N )/8]Q /j=Ήrx68-ž 2˧?#{ӌq }x$r8TM*HIKBo s<5^}J9s% v"f[ -~G$>ޑA.QjB"܌5DgCԜ3yס sE &ܸmtg:{جdB *ET(dJ5A4.Mi/X+iBȽ O- Os i5la*/v9NF]-%InX[=ԄZ(D!rGݛFӝ}q(Vd5)n~ -!iS#m,՝0#`sH$jq*niɮ ` (o< PSjbNх^Y Mq/QF U$LxD1 QG,Ȋr -vPry c4z" Mzp*o~ j=/>}qKLNv-*dԚNnRK^s0}xJ+N{6]/wRCo 'OFA!cjkѕ5_HM- # qnBl_`7A^>PRi608# QEeym3Ԑt+W(T1Ie쨤ejW`K+DV}g d;̌[88^B$ĩjk8 /n-ejGKY߻Yrp /5 BY&p|Z#`{ IϿ2bL1A%K?A;c O ,^ZЫb'TtCj$0]T20"L dp#8ޏ=׃{~$+Z [h ң]#^QC=;>ƸPN6oJ*cdXTi˂nG\"OĐhXn Ю様~=kbOrNd]nh߈xK)~k PZ`t-;"ə$j1a}A spU]?EIJ/N+/rs^FjQ=nh ㏺BzRQif=223O`ÔǣWv쀰-CI (BR5옋 9AY 'f`橸). 0O`K><%OG?Ib!%bSEwVB&h}M-SFO[쑺!iȱ(KDFV ÃCJx9W橳rf^ {+Ml4uvmiߎھm]QA_YDw^SPˋ`ƤkI0J"siįaKnX=X=&dEq|L9qٍV4(2l)0Xꢶag`N W/H'M~m&y:b҅@QıL!5kU-ٮSPL CFh8%) T HUB/l+G;hjK9[=VH|< :!p26LSO:yQPpͮuMѡ1ԎXnۄWvetnB06} ba:b\/3a|ˀ4eW55׏9m%u 7XVu)Nwcƛ !J3Y(>_,*2_/veDMy>Έ. 4NOR p lfI:i6ys`U Y&ƪT[EjU߷x,mM}xv.B lJIׁ0Ů[yV֚{(66{R,a?ϸkr璞3:&T(x l7J-IP~w4䖘{c/jߞi{`\ft# 47ƞ q?v6h3>'a})}+SnV4CnZx @4>6ʻNVKj\Iw훽/mLb ȄЁ&Z": 56I(,}~\`#NF;6+7i- R n =5%bA <n&EE+My ވY!KH0{YpRY!ʌ91.V>z HZ l(NClpje8 MQŎER?hנ5C{ )2hZƽ6z[~?LnwN1}VQ iUkѶ,_oNUHf9lPa+ (cc % .T ʯۉr$^H:"zMڪa`w|D 5o)9nCsc2TAO(₍:͡w02@0Z4zd11s7E 3zgUQ}˰H= FF5bU34J7q?9ea:\t{ƔNC @wi'5ec20ۏ?wz-pcù'^>mK71&$:"E6">w1F !&*Gߍ3|G:f,sӨoz?n$`=&OW$Ry2zg'WlM3;VwX>|؝>H乎@kưCM: i'+%=0Mt0ɏ \ ^PT[zmtND{IV?ü"Uڦ:[%H'9SQPx5؞ "fL̥ԟϵ|o->̃j[X {`&L"L*L , S\>.;F?,Oe120]JdabR$怴JE?eJņ]e} "ؑ!Zϕ pI'.ʒAb_}1Qm=&bƗ\ʒ2 }۴ N7seoe6%-fHMAAW݃Bdk&mEL.1DnގD%kA'"^s|,ɞ ՜4ø 27.Cr-::o׳T Ain/W7A`_"dRl?fǁw+_RA3nV_^t(1[6#6~|)?фWHL0|@sz ZC,cd643`͓19 !0N13k2D8!B1 ª,j4 ዆ܥ^,,>^;Û޵)[Ӈ3tWu_`6dڦ`NPTZTb 5b1R`vqHa%=kǙܜ;6'J䷶BЏ{Mm4_%|?yJ[a,QZ3t-̣{+|&G6WK7SzVn'#ஈ?uįMg߄9J1STfw%ʢ=7>Jf3 2/aZ,">#^@DT [403gi)k׈`<=%, `u损t ?gAn&#GQ%*Z ?H=a}}t%ђԆ:)͒6R='F=ECeRy'«\} EΚPJk,g>}@:Lpn{+1@ r;K]PTd:sR}6رg#[ףizB+~rtox.;-+L9'$c$.M8x h?OX:gLvj,*rҷ !,Kkw&o%w 3MQyP,t%ul.2vyd| H|'C{2IH2dϨ5,q1)fM, ! =!&{iƚi;YX@)-ߟNAx\7|U5^FiQ];0D-U>DNrkdmgN] 1!YXR.|x&!TL?"`6X4}3jgS+pYK)k}aa}MDi9'SKo?֣29+>15K 9 >C~?]&JaIP/REEWtuKEpgm`ry;Ңu͏2qMX7Dqo T߭;;e=(ץϑLЯZ/%RM;P"Co(jKQ-Zc_6eʑe֛/+ɚс~060אcŶL0=Б7.qmn|`aٱ --PO y%g+Ι|,K{4Sa %rʳ_&]` NwaJPמ9O~t_EY1r }7"<ǎNY|ij&OeqfNo]f7Yw𥻃Py!(ֹyD1aJhղgC&G/\q Y[nzU=5n*RVt,c2&npZ~^;HH@ܾGKΓhR`9j|bHf tlE696 OI2L 5>˚B(T.<KsQ+\0+n#Vud5s]^wv(5Pa3Y/idX{lXmBffCāf'tR{P*G~Q(JH5@ oxɹ1xO 7YZ\j\5FCf>>t?nm੹5.nX%O;uGט+vtPsa`&+niα@Dr1Ttd AFv&DNjJŔ:UnZc\)Z닼-@{0?j4.|vpX&Ā.>6ESNצ ʺ%3NZ F?m^lF4wj0x8t)uVW;D`d;o,OSu* ܲn6!܅}; HMF,9a-ٵ(|~Zϖ,֧ˏWJlf+0FxZSyq5>nSuU5hGΓxi=g M$0onY3ǣܫ-aaVײ'Mi1L7~\PB!&˫k+̢YNCBAI?v:zoqѮ@6 J0ΉwfMVaQej^j%D\"NnOvGY8QsH5 7J64b'1J4S(m~0M Pqm(bw?\/ځ3K}tBIZWɆqibC HTc:uQWSrRvrr[p?hR$Teҥ-j @W_\Ng@WCޠ!cBx 7V#rn%R 2`pH|gXW?z/b!NOz:/^S\;IK~L} e<^8ؾ7Rǹ ㇃~%ʟ<-z"-Pr7b𱐠ņw4<;5 K΂8yp eV'Q&hz}Q dND:Q[f 󹚑]a\p$ Þ~7HOvzZų(UZdnZ'^"KbGYulcR=,m3@4) Ȉ{=  ۜ*TNwpӥ mQP^tnЖ!h$<bnpRlgNS)_DwrZmp񻅇%vp$n63L%wTL&!zZSzqxh[^wCf PQ\HS,1* k(&j0>h-ȹ zrjqN/ pc?w+#1SyFoZvs jjɏr.=1lK6`g `Ѽmf N:,,ћ|q>moMs=I~=Pҫ˫||^tD^3.O~y:Jޜ Ve] v2`q{"ba1gYtըھ ޏS'3:ݳW!L&L Jlo5CD))G2A}+;bCȒwg9CtJ;KRGLӲS~3Chqc:eK2`FU0=og.Ifl)d U`  [@.FqO%،g.Ĥ9\(Vx%8BmS}|'P uDvf})qWZ60a;Jp&Kdio!%i*5X!`nUGT^@Y!V1Xb傾7c}89;pZK#/*s Λ<}j +.HMm+wId]5<I#v&xwc? #WM3OՕ^&]{xb0q"H"f[ ?uLm EDe Yfh/ ~{SۈՍxa>X7.[ 7BUDE{ J%e0R@*t &-ay0NV-)4%Bkp2ƠWӯ2ӭB~輈l@tVyz&9T3f\|>Wd2<PTbc dԙ@육p>rv|^ z*IW~q(`F;>뒞lS`‚lNy'p`rF8IELPBU[!u̕ aE;K=&57{t@1Wh(ԏ HH$䧘SsG*fj$$=`m€>0+X,CմXr|o D[ҭm"c6!.^DZMs֗L6% &8LX -ap%$ܹ́jdAo1phlO8)i #pd@Dgܯfq)ʘ\S 8Mv9ezw Em,b#h3~@޽CD5CjXdUd (p('Y&y9ƣ{ Uϭ\d?^CReKcLe,|?= 5 yp qOe+&"< ^{E*&h%H1T`ݏw|† '\d: r2|2F\9֒mv:kNʄAX$^);[W)ӤEٵz'u2i~"l3)R9̪&zHAg<Ã1itq6S_Y{OćJwR_e30vfWڝ>h zބ3wE[okxFu,>aib3)ߏp}`Xհ@i|iށm}\A1r`^0!M5tnsW2J7b $t¨3@U<캦>e:[fɰQB*u@PԴJ[d=c!•Y ~{01ѮF˸tEj vb_ {ʑ9~]Is$3f8fDMYęF3",' &h,F6b99'fr&Ԇ}LUM~쐺I0mj S^?ҭĠ,!z;+0".᱆ xTb/1fA  il$.OPmU?MhiF%Q5a}w ;Rvҩjqߨs98G voaw 2$Zϕi7x[ Z֣i hW+<.Z9y\H+}nx҅HY˽jD&ֻBZxF9um]kѴSQPxe xn3?gДs*H|?{4 /ZTjf7nա/=<920hq@?^sR>>@I}=K7HE3hyэɮD d:yŹ(#˴kus,{8˶ sۼd!85tc$ioDe9̑gįd.ڈOר!Kޚ1r+V.&"\a#˫" utM,|˫1gg5l9FhGZf BDUeԶdeT8[ \r\iG:LEs؉::CQSݘO(r^ Fiņko}kQظҴl8Vu]#(h$ǢfaAMpG L='ь[6vT"ji'z5CuEF#h8ឧ8,)^ *vSei~WPӋٜx)Vm0s0Ҁ?vbJq-z=_GJ7C#i84nȞH{`35 j.4G^De"2ˉš퇟ȕtKcFE'\tN9[ [A1&(6:d  i CSQMcyYN:_vA![y!KeTzec&ܱ湐H(ksx` ^p *yP?: $(*ᣛvhO+sEK64"X[h IelS[QQʼ>Qz") i0O>6r- AbgƭtK':X/ckk9vBOЋ7ۆK)eW(D4m)]$Z?'hmKr_?lG]bu%\{*[U1Mw˗vD#{7* %> :C r9<ҍ1oR%F`8&ڌ_pNy">sGu[ϝ38wv50n bTirw?$פH~cwg:V<=vjl3W`mA`VO4vk<֭~!ѴN>Q1bIN}],NLO|&uVK_dgNbzգ$/29p`,@<¥Vx fs^#F4)κd4+9Ic Hc:ZH[d/BN,NC$lL55Dt/L'_~:&D߹!(2NKS'9uEՇPw$O@6 km2vRv10CPg\@c rϛ2g:B $#ļpOl|;.g]"`su'OCaE[ϑT=' InvJdļd󥱾{!wG2u)W!JI>%gz&^ l'\CѹXަ'p$p ֖EW8%&^r@Y 4or_RnS7? \scMruvVpn o^i$c:WeFUW7Z"hvx.DvȞsBgsp%μ7gh8Qhojʎʛ%iY΁ݑNt6i(rAwXdC؎Bd'Hen4ukhp`ZsX_/:fcSECky I<lj%w#9Ѧ5O>﫳S$p3_WjSzuxzuA4t380F 3H_DYS:Zw{aH 1@G? >?"v?p}mX£?mdx"MyCz!sD %da֪7`(%J}u`+')wv=^t? ?Y>K0}{fNWU:JX׬Yz~<Rp*B W*lt%g-l,veJ >+&IIaKf㈌2ikO;h!P@yk1g9dD6 >9zBbHw5bXJۉuHVe+:a:s|V#{-Z.5b&G]S8t[0y3lli'`fTLq|&>Lmtd"moި*p-b?wOI/_a&9WGV_8MjY9R!/OGZmv/tBeVZ{!LZ8h}?]֢ycO)U}JE RC_i-˻:4#QZG gՐ5.4zag$*E&ISA*(2\8M!DzxU^9;7,< Vp7rӗ髀>&^v)B],b&q} =`x.ŢZ!nb<` WM2g@)#-$iBبك~>$j6!Chi%qQ~5b!TLװ~x%e=*Qi$KK7oEZ A9h# ]].d ߆1@F# tj IdO0Ɍ0Ɓryۃ)mT@g݀۳p4Bw\.De')}fOu*+yϭVVeB ىۄp_t2VfAq%bHs5h6`)Q4>vבowVѼ~W\LV?C7_P{ 8)k 5yb%cQv1xHҪiCf7s_}\HemK3"6Nm*|GBh@z!*r4ިlࡄxOUȽ 왔qBuA~yB+#5@ 4-y`3+g 0;gXB?۱f+R/F|?X  >5d]bĩ,CB>"6!`2ā3)צtkasdE"X5Xw,:l Z*qNSbnW',ZLx!Av[k dY\VV7Z2ELt_F{&%C%|Rpnx:b DTp D ^rrIS0}N:+ T>"+%i8Ɵ[[2$OF:ޘGIR8JpO NEGTFpc^!23gL9LӢ.MK$҉aIL0%k$0#tX Q1'u812fHļxVKoEx$63x؎=q^ -j0ϟ'.욭7ŀ:IVcN\Y'ZtV\BhF=T3эǮqݜmZu ON ={9_>U]Z/tL2z3 :d7 𭎫5&f_M,i -B8BV(C@L'ki % -bk6?QrFu?"܍~TE!X#K󡤧콻Dx LSfa/IvCʞ3li-yR"[9 j/~tK7Eduڟ>!=+.Ql*ZN-=|Df%V?=p[|[QH(CgC}t5̂G09rċC^-(as4Pubg1DvBPJu|1p$j1#qsR~يZG}X*`0EoۘAi̱播=rX L?ӌH.^1)V{f_Y>{-HYm]S1 |Nw}=ܓGtSH88rO|2ٝXj/.Oعv.8xfR0o|߾+J^"7զ<LfR1#KRX : N2CRP?zf)栍]PY%oo '' S(K}Յ]RB H-ԭRNLk<%IN~^L艢ȋCĀcFWxpxVV{"燕H׸;Č #}KKI5#!ř)6H.nc؆<.0*t.<7{bkG%N_& @7!ñEs7ԁ12z{,ǬB\3'ռ7yP_P9H]c;S*就]зq!:_*CrWf1Gƨ N;m]-oNֈ06mTF 3f[hQ*0 fo\O3D Er7d׶—ɮ|a'mǯ}{s#P:S%| WGH@!DN@B_4V#UՍiQpʨ1][a̿/vSfĠ4d1}I %BSr>bfdK%U=@d.̴@ɆhZF 97 ԏu>ső>O$(zqm[pMs D]^=)ve2}O&2+/ ;@i? )DvH7)lU.VY(H7d/(Ӈ̇v]u!ӊ9Nо%4~_Z\B2\^놜ib͡ޑT| K6!iGEZ}u_½\7x+MVT:YszN;BL&Z[Rp_{j޴U9Y ՇzV2©Â,XlM6#}E$džυ1/]Ʌp>ź%(D>r{03Mi{Sv QHgckY&Wgr.d[?^.e[(@g.ʿW7^kE.s=S7РQ$r?:#PnUT^#A56;*Ğ"uf&ō9 iP2x˂(:oǮ$,۟vfk㰈 UƩXRl0jjl-92`öfd.ɦ}]Y=9+Ldߜ@γu`=f6 tl˱q q*Qaˑ&-r+*yzWR*|ѝ6h1};E7$-_e^$"pC̎՟]%+k|Xt aug 3,߇SVX䥨|p1Bn(D 訮, @z#5({%v& I"! 6WsZk.qؘ&xx;&i]{hB`ե"p C9гcF *{^j5KLQdu(FIs2#"*4^I=,לbGHtp̑5(dŠ,X+vZhmX<b<즠{wE'0s(ILtҞ1mW9vŶ!+l Vq1.uaCΩZ:rVY,Nq] U ALx0̚8S~8 cI "ies'$K-qm;x:LTn N<@t6 00֨^o.MdEhM(PHчeypw'>˂=p'oĔt#aJ뵨\%\HZK~+~Hى->♃긊+mcK &Z2Xp1Oq8r/JEo*(ؓ챭[8 YFp"\8#0u5Æ7.>JV0:ՠSܐ%+JG} t>wj۞"2ܒ+~ͣh;M[K=`IJ}~L: j)E@(wC3J9s!'j;2>q|)Y @i2n8ozdK|N{Ք\Zr3ɾ} YV4$ZZ]1b%޵-0SL+5ūULLk;N>=u%]\ʭO.EǃT8գX+zZƥر(>'TckY?Po`S[q">O[E#hih ѕ`PCջ*, xoTP+Ny #aaJ39)GHXmyPgX YYVpۙkWJ/:ju})~P[6KMóc qU\ Ku]mS3tn6ebYd!]$+PϴAs8;m?50EB.'x}2Vj}ZMYd섽)[z_7ڀ~egiߴs/+E=)SyȪ)&G_+;⪳2r)< F/8q ;ӰۏYv]HxSJ08;p|7 >IՏ%GH-^/IL8LZ'Q#ҿ&16=y 4iFUG/qJD2tُi#9]zŗY׆֮HЊп+@˩pUGF}Xj5Θ)hVz.ϻ|3va3.gh bm`z$-6 ꍼLECOFzs̃IF6]~JmUces"^t:u!HqґEIcWӼ~˴r-TK"6OܴkxuIY{}pG (Qڤ_wz_{ J`8IEBP تDmG@Y0cͅ\J! gA秏o1)8u3ړ>qb[X/M1џ̦1!-&5T$k& K`MĢ'z`BZAPfaZ¶:o #E։S}aVi#t? LUrz[Dno8wJ@P(D78;99BgHN~ėJ1 h$mT:4G0kj=FNib&:A]yA$X= (?_w+ɶ83t]}Ä$o0YBի~~ѵTG1?YcSv!]#v]>`[(]{*CȾmFe_nϗOjäk:W;G'ff8UwS}n8O-MLwr9 7KpE|+;M҂hBp ֭ miъ?+5^_TrֳOVϩݙFQuQiǹf7t ^򚶸q/N``v)C4/7xwx 0]ҥ߯ wʭE=Xz#n(?=xƎ5]mԅh%\6[lWƵ;)+"m$ GqlHdgJ6jy ng[O=f3z9+Huj0|шQι"-qYnGƧS0&c4ҦޫP%Ucfjmd$6{!?]}"r0tO!`CnMcQ4P?Xhxz1<Z J=Z%s+w.Xkf"`܁PZMLx6 t剼R9_ 25_( MFSm1liB[@llvDYD^< 5%KP2~i_Ln|oJKqh0S+v *њb| P'jhSi XIT>h]&z1Im߈}7\r!|w}W]끙0&G~>0{(,t@"RV2lB +h~Q$.ݼiҸgU3y,Nq)Ȟ5>+ 8P ^5:p޶τ>jċ~4U:8F^~\6jշX)[n «8v$/b jGPPɂa\D6ܳ/㴭6ץeF$),j8,3g1N?RNN~U/eK{}"Ќ CȑQ29N" =z%\[è)yoADh-\ wc,ek `e8$Uq8vYQ=>ɾ]v'#_r''= m!ܜs#8ao,&Fgz A"myn62gp{XE\_+#Ǭ=S'C>N砚4(` ^)0fr%SS=/bb[C8w(o%qu})tT䄇Κ8BCb<ߪw5J S>A|m/`>Z~Ĝa롹ޒX؂z:8p6Goqۉz`@WAT<'H<绷~Ez EOOp %f›ٗ-Ĭ)nf"'tk7nG&hs+2.2RYrU1f p#`Ï0L~&h9pԨ5!Tk峸n"p%V1a'ѭ+]Z1%mh<Үn: 犊[Ӹd{iN!U t@zmV&T\ZTLV . h7HknTڗM.T>))Bz&xTo p\Gi垣G#a/?gd֠`A܂_-6^3ّ=L8#vO"ԌJ]aXY0p2ߑs }UUD|5B3*~' aO#IfDd1:yr!4@)AMOKOW_0|E*%Ñ/+fx2isQS\S%&usswTvIX骶eGn0,_܊G鮞[@gI15Q9u6?,k=WCY k 0BvAS6xRpݑ4,ܾM+M*뵽/ˮ{P&.Z̷ǫ5/ԨymSdP)g4l`.#.Jg(+0c&M tz y oV(mckl.Rq:$ +\6 uМn@V|X  ujǐ_^68 N P#:!kdMɝs5%%G=MOhC׭0}benePJ}!\5z_P)Sl 9tt5j6d ^C sZ eu.Yyy0Q{g u (f0|SI+oS]Kd4u[fSUux}`a *p)9ɴɌ]pl [[;h!r@V@g#8ޟ;9Xlo$.3 aS\nc*][FWhɂQ=j K4V֝ :\8;R5M{щb:9/C>b^!hTPy$f"FL=3At ('ű(eM\Onfy !$MGZq(1l tbW3Z2^Pк(ry>w $6Z"1 v?Hźa'5.E(R`c Q$[,f[+&O-bg=AÕ&5T= b($XUG$6h)M52ϴ ?‡bmxuo[$bD?&f^Npgݫ lD,h@iy$Qw0"7XzAK{ gQV`VOOcĦ @1h [0Gϟx3~'-88-DGaGeWZp<3 VJE#eRcdˊ6 QϫP{86nPJs]CȆ?333V}~S90kCz6#j%23X$ +\3tA"a'G޷o (m+6Rm נbZ^ ҫËd:L(?c}zHلoROKx8qD&J pn4 Udu L(z VM}h<~G>0٧! q2tYoHF9sA`ߤ;G2R͢< ZN:_gU-=q||sCEgF{vܫS4[#P1€zxʔ`t&C mI+{OQٛ5r}ۘI*Ʀܺ,i-d#dlxZM!4^:JEaL YwLh`>d4w5Lz\ lW^8S7hrizp'H)^tTT NXvuN99"1Gw9.eld/US/-a3:F&K2;?N,\o*QQ$OvfذA~2n]EKK} <Qně"u"Rbq"I2ϑ!俦|_ YzQ=+O^@0](󂰪CgsU˗l*Ó_U&7Wщ'JԆn.Χ=d÷~RֽK c u6 v\C%U ۱ɬFx5т0kl[YG('ֈJE\9曾Y"  Jz5s&4>8UbDpgNQ]CL>7LZ Ң\oVl虚!!5Pyn`&tLcyJ~,sn!(#hGZVLdweÆ0rƺH;]EwZg$JWGcQY Q0àylJw6Ct5Mj#D U±9X,g]y3űiK/ ,7QMF (EW"~̻lqngfG9DF9~w+M7dmֲ$ \ϥ_8}TeT#E1ƞ-IGv 8BZq*ڼ7i4*PW NC{ύ|vuԂuTf(HE  w?y816:N=Ul*q7$t7//V$qL%N. y 3s5(݆x7o^,STQ(sB%k4;>m &G,G;NqQuL$͞eppSjeIenM8օ\xye35L aiyQ#~n b h7uߥp0>EE8^͈*N$kq?;;N_Bw=Tge!ZС5PTu!l_%!_mNVF5и:UaߞlEN ҁ@Ql?Ϡ$4 Mv4W߉4'P!W3?)(WZUjj,)ʒ x]N)§*|"#ICy%ԋ(7R"&]:-D&Yb2NhfJHvk+@Y&ݗiOo`g k\SE.J\P6/v8v_w+^WF_[1/EX}Z蛗*t孴 W4.7s)k7Ly>*k0d6 EdղDB?1o)^oOK#;z#gg`Sؕ/Mp RfwM]6uBщrNrr\38~UE>"c&Zzv{[83hң˰ hN% !%uy6j jO[?$7/;Qs2!:5_f@/ ~:Z$3XK.t ]s%)M/ePt$2`WZ>\+*H!UMH9ɟ`=H̯|! %H4;ӞYS̻~1M +5`6";_۬95vz ݹ\Oߏ۶R@񧁧@N:#Үy8#(Hea[;ZuXB ET@,o!揟L$MV`S[2VFKY"YBeB@>2 `/V-)FE3JgAjN''/v@ǽ,PߌP{)̎V,OUj*uzB;b" IǼ+xH1N@]!yC8"wEVwiIXHɦ>{Ss )j´]&< iV(4DlcM4&_ga*p `A"lC@aA8|Q(4/3Kq,~ +c2:Y %d=&2k<|#{mv_*Efdb'=c2Ҵ Z弫 &Uܔ4ARi9u/r\6iO,*{"B[s&^ OX%7Q\icgS_KsTq U; O(t\ocoY\isXa$L2IJxG%w\ht/i7>ׂÊ ?hQ $,M3@!}0c/xIn+ѴӚlV>Vjjm17NތVcgW:S\UI]tyվQv˜,'!Xhwnw] oKr*H <d/b 3q,i=VRa ?ۮpϮk2UUM2&ꪔ%2st@ ^KS@OTϘOG݇.fl.ai'"ɑTX=<=ՎI[b)MUH\XRx!0yɁMe: $=e$P5}=VFST y\䡆ּ A1XYq>3F玵>}ڢГ |%tYmaFh5d Y'M*$9d^?$*#zZ|\:fġigА7lFv/Vga u 4t+yoG$&_@3grkwɑcG~NDp>NrK_T@Fן;O'WNyæƜ)f<ܺD9 CSڢ ?+& )̝wzV E)J&b8Bzaye!䇑PNKQ'P;p"enBEWbGmYT+c..U?n;`YGj n;iTtFmt _dj.&`ie\a#\aLrR;KE`sɔTEjNUFArRu|GWiAhn$GEo)(ixb$*G~9})'4nҘnc3J9AA=*)!10'Kר*ez7aR:s_'jUЪSo& O0D/ 4rdھi^ %3vyFbe k a*m_4sё)0@/Nf B4^Rv}69hFPfNk2z"((ύ{R$9dLmbw~55#AØ8ϙ|l"2oO?"R:)I2v{*ca LV# 6= d KBHǑ퍐HnFkR u$VLzpx(ז+f8]9_^[FOP cBB?C8LP/<}~-G(Jq]5ޮ 0b tLnS8\D0s䜯Z;CYH 0NMfX !l0% %( uzp>2Gp7i 0gq4Nq0[^ȣb,qѝf+Zɯ??O[XҰxI<; JBּM K/l]T|gA5r|U>N1=`~yYL3#MAIa6*_)g6P#~N( [5q "p٘a/ݸI6:7yCJ^ }2; x쐺?IN_tnbAԵ\zG(Yܬ/< ޒu=h\yjT<3^a/mN FnM]"#.R?؜U &rfL;3٘72)}>!6pܘ.['w h}y?'Yo7v*,Dh`72n<66ӺWtU$E۔̜媷d!ߕ_N @^r4xrn;w0 E"p)@0?vd] cʓ2F uܦU8GM&JBmE^?+Hv݉@=SL>:a0CȜ㎟nhCkZ~" Dhd`V7Ix޴v/?bU Ve eR]/8+l+6VtpO$4PECMK%A>=;THs`\l;Ő!QQ2].zRғI5NHJ@S#1 F=9,'/}cUW~{ꅚ^X78<]'7t7]v87"El=C} vGFh3"c M:c@C?2ـQgۍ0"! dC%oU s iupIHq5Q^ø<}lIc%10C+!~/3'$A%c;F4tax ĴkSy߰) MSt[`+Z޽w00m'i2AMkaz҇ߝږRn F/%iK8#3ٽ3guEDˆ#QMfw"]k- ]X:JtPtd]3hb/guZKz3CZpSU0 ~!&澷ʰkTg)CAeShPK^,_fy"G'ofJƦ$-?~(Buk.XOEY)-Qϱs'-:NѸWGFؖ>NS<{3ޛ?t(< 0tw>էx= oSRɏblVXtŪ &D1p7Lt hpTV2if':-C'w9q`hٮFQhsb!Oen!lPvf#4jxҺCY:\U?O q39-9U (Sm:#p lJTgW P+O ̱c<(1q1g={WI.!lu  >w ;9R1bVăÌZ`=JScKzJ>:2% ƌ`jɶjjk{~ȓrsq2Hc`oa+!Hɒ4FXY %;]_]!h?% ,UNLhay_A0dM'5O?K5DfC6r9h=a2y:kQO> V<<y]f1oݺ tµ<`YҘK8H7MqManhߝi"OxM & j9Y*y"!R9WZRFwg؇O|f@VVU(b)b'ˊ"susjn"hipKkʲ i %)<z#H0r"tRaB`%2+ǘt͡P5Fyc&9G)P\1nZgqj l<nk t_Cvk.RN܆u3lOؾ賮n*oۨca93645F_q4w`pSH  ]aah|kmGn!R* ,|b{hPTEz%͸!  ;K|peH+` IhQyT˸k˽fic09, jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 ,'&? *!*OlfBֻpsg$} AAJ=˵;g4%2Ί, 3 ޺K @.8pTKF;IJ|I]*Z%e#^/,a?zL8&'N>ޘ4756Q5ݟZN!F_˕G¾ [676?V٫r#(Og`kǞbIdiyyb҄v4K kghwSm!|[1ѺR0r`A)3@κL;췗Bv"(T_ ALzZ5ݪ/p r,loj "X꣟&D#ȄbnW)p_>^HTaX18Hb0E-]k­Wq"At!kYIeTGA[aELCΑ5)f>6,z!O ܟM ̀ {ؼϪi@c =~aSv)ދ%\ΰ-[SSj#)!Rd|tj=Nݣ,O '0i>haP=Ƭ lN$㜐֤${e4iJ! Npf_`۩eXN!(4EL_IV/8㑀6wVX{wrv0s,KK}`tMۨ-'fmιMHB@qjT1'OH'uʼKi :΄1r3iO1em4k=G=ULy,-[P&Yy@[LlpTf!AkTZC ctm0N",^U5ja5O=_g#P*.).a N-9 ٖ'N8z_%z∇ f `W|UFֲ;ء"^s3ڥcF?pf鵰A t_{Hb|PgIoǨbiW4 fz!pq2em"u`Nq[9̴5c1NhL-U^,4uWYy"! \_AigEt7fgLp`(mJoVwq{\̘ET`Lj~摴5487Cñf 3Ɠc|hm0=q ZF0 /y -hבY)Qa=<39rmm11КHkgjrx)RFaΰLtrMZ81#ipߚ-0oߍ_jӾ&EҊ{6aGeJtJI,A'tuaՐ}mq- >oF4@e]kUd]d@bzΑbGK 2XރLOtas ~lrZ88F)G$:5Y- TAfH?&dm*wՀt;%IVD]?UT5'`aC2G0Jd M}SW2Q`eKeq xdt)[3y!!AZ\;RTŧN'P&,h߻a8#HBkI Y"Y6ۈQ9A83&@Ɖ섡rt QǢ8Фut-1t8$Ֆ)*ܱflouHJ{w_=$Crwq7@gd\ErΕf~/ћI MA>7D6kd5qZ3F6ȑbeL.ggnv2٫:[isLwvۮ dMFz1tLY{~(/t $-9 9~JUtw:k)+[2MzD%0ش_a bˑC '|D!MUCw۠#M%7/yl]\j \߷FCunM%4"D2\:bf`5,Mﵢu Krwt@W~݃];jՂݑq66$Buџ˿3Lʶ|EY4\jwKp3ܦK`pܜ QAљ1 ^BGE (]b/ UT`^IwN@eHzݗ~6RoZaA,'U-TQ5Ξrhlޢ\=Ń :P3rC*]=0A4](di8' Y pǟ?%%ezAٷߕN_ݬ?KVZE4Ë7 KZ[QJ':i=I AoL̶yLHt|;6&5B sJBCHkW{hER7%cz_0WfQ׺#EM~Vy=44W# {j>)1}G.! vl' [j`+UvbЪmUO76d+3<:-.G(wc2\NW*[OI.=_3Y%@ 9\.hPIxNt"?J"q*"{sFЄV-‘m3hRiwOOw.'K;܏K{Hj2HLM]TTm#5%_hA߾q'[+Ҧ^1M\N1si dE~/w~lSj{ ґUz)q9̑V )ef>!g=Q0a Xv1Ft{zsH%4>),=- ~"Wfj{mV (jtyA` *VT A!`T,Vq# ,DQ~^[Z YiWv6LqKP2%HN{4jQ7cAmz,KG,W@^-&H&vyf+[|%& 3F9*X> '?v?VS8H`l"8V- Jl)<>+tYh`HW;"RmL|& g@(t"wb-UmZ<Կ$HUߢ UK ϛ 9 罩VoT2H)%V8#V[A*}@WA=:ݾ^Hl /x]vOgcC F\`iA S};D K&\ē%*\Թ^ޘ -C1qv۳3Xئ :Y "KdAN_DF5I!J0v{=/~qF`"`!XnuJ8I}wFƖ7~!0J*H X@#1yBKAT8 nAn_,Q({ \%*ҙItXyo))E=E/^fG1{$‚e5hŤn7qOͫS &7〴F "5!TB 9W଑ Sd0:1)hKJOJ[$HɵLh3h\s TV{ :ڍֲ* 6Ml[FvǢ:W:L~O$|[av20T]_ia%DNK.EZFnCuGVm/d=z2WVT&\QR_ Z'N=tcMĤIcK? j(}۱@̂iSV ;@ڻa)lhB *ekY8+5~8Ee?N= LˎrĿ`<.ka2'#~㿏zZ9 [<9mhL_b=۴>Sfمxlz܈252LR*Ivڅ]{܀ Fgj,dEk><9lk_O,ҴFdA Ug)ZkmHr_҂-.ﲐ^]"$;leM${|DY\Wb3j"/pOUuS#:I2՘hԆi1$82Q jqc⊷:DRIֱT[Z-tACh8/q<#6εp6za7Cxjk dJBuܷb:w +uX X%? gV\)ˑ2s>ݞ<tqJ5ȜǽӽU2ʎ--` Ym&ϏPF KQ۞P̢A#oM8vPI&pbI$1C)lL? 'O ,=]l0"o3 } E {L$IJBS~J )m]8OV PەA|:]).{ov)PcfX>ɵz!aØhyw[C60Gpu@bq]Z";΢*VGj>cPdZkH+h4957£7OժI#TDEQ ~׳$W9; Fq NBS5ǪXXa@$hg; 1<  X״& q8OpDK !Vb'/ !UA&W̯o:f[@ {QM؛gHƅ#~9݁i}TGޫQ- n.v "vGzDǜb'>>#[^M 8SR.8NR:h7Tvv 3"Uy 1bT+zq{˝ep5硁T㮏ShP+ 6naUW\jS-Ko,O6_?ɉ8!*ϋ9.MVϾAӈi{J <h~L,(Ɵ!\ck~u"?D,[;څi hUI캼B :g$Mol8 \,g(0ҕ}f*f-E)bRx)ywp\oJ[k^Z>W#V-]g]d, >6Gǻ?`pᄉOB=RjAacQZ2 1y%Q(UH ?eE vsEaUd:0ޘc ;(n mS_IO ,}g'C^f&{M%Ow˄SHr.BN5d1cm(n.p]:c0Fݨu9Jvo!\ϛiS,~v/ V=} K?ڋQX%;<: ",46?t7P_RcoAJZ6.V[ 8u)7/zb??婗ah+KPeBʛFqнE'#?D0z˰jjtm؅J/`þ×]PɽXݨcHC]sX袈v[ Sqځ3a1&1|RPc{**|_(l*Zw5sinrBͶҎ}\ӧCLGȠH A-5ouZ\τV[hnYn_`R^軳69Bb^*YQkaF 4֫k-˫%zځ8, sӍs}}f yR@鰨q~l@I)i)V&tԦ]ϛq+o]M#)g5وo<ѿ"il(ATs37D7fɔ$%8bO}N]%Իjs!h$@\$;%:oM3M7)p~޵O?ARE{`AxƧNabb3&ӀL #GI '\򹯛`iĈ]%*Cr Eϳxi+m-j g4`ܧmȕܫ,8ZG@'м&:Ś҂b@2Ǐ6S'"{L5؄ 0x#ԨSǰNCڒHeE;ApIx̋'°3{K|7t9^?W-};lR,`Z۠L%Np%Λ mXQ~HׅHI/90[%CV<7m{'];JYR_®$o7] G{mql4B (8,QiUCn.ȩ-ކӭ0#_“]6,~d)2KD?~-N}$;l0(=dJZа=?:* 24D>Œ+ú-Nd nlBcf3i{=J3 峞.Bنv& +vXa|:l4/{1V[L͚u@(+T(R n-^92,1l^I\u/8ѽˡo,Y\n%}wYtȥ>R#/{Jg-{jӅRyi"Z`!:+W"Zx@,#j'_@cKr^Ux3؇HBhӮ\?ZnwD""IIb8-yFvjAt5!Bսk!꬜D% xw_xN3T/SP* !PrjsUQe{O< uUOZ|0C4j8N &1bbV̯Ks gO=k,2xG<)M2 ͛/q0wM,hr&C8o_%4 7hBy`œCP2wb8%07@-}.9PȣY}9HxWfZrfyw>kO`C$ 粗|3>@e.C&vq Z ~(>T^ B~;:r><(nՖ_*D[o`BT12j)٥|Pj<+YbAFdh^:^sN[_j:wG x~yʫj!a~O{}0eEՀԌrA*h2:bd%sU2O0!;tķOOGwFCa΢iD\ 5%)(Ǽblrv?$ϝ&CIC E@SRM!Tq=[y4,x9XSi7`=NdXBZw(bZ.rmf~*3/8[{Üi.]f#E~cṟ u_G;%H#%`]~AH&~șJDHc') Zzj@"S< ~,~i f\<`Wma;11 N0V==G2Jp!aˊK4ipmW; qx!O7p\:ld ^q͎ Zf:^nA .xnCX8jA܍UA0צG}2*E8͹*eڔH7YA#@m0:= l2ӧQE]@A,8ӤoWM5׷hi{jj]ٮGw4*<\%p~dP&r6lVZD3^lEBɅw2g֜ 6 '1 pK*u&Ϧ7gpݳ"PE Hθuc,ݤTg ״^'9vo)WD&_3`HzEBoZK^?PK6/h r'gaw ]70]κrM[$Xj3(1s{CưECRg Qk*<"Ʀ*?y-M r4Fly>tts؞-Dqs\zM'ϝs@^F $5d$G, 7@xxlSuu! iѺ[.+Ld}HS%FmP3okuG1޴[ ] 郹}2 *HZq"ak8 gq Aoц|E{'½{ hju@78oT r1hqY˪NT|44s 3 [UWxyI [t߲;(4Iߥs7P+|P:,!ߔ4C['!f) :|Md畕?)\3./!=E;_hbֲhgK6Dձj.OnpՑ͗)sɘ߽-cz.V| DH} %( HPkX)@1z&FKP=^i9`뒉Iu'*Hޥe`gXҺ'ї_xfq UIUq!r!4Yu?zRG"0>+]#cyJz_i.Z\P0e`y;ih\WW:7/.*59P-pp%JWK(=`{TC}UTΘ{/i'SP LAnL=Kg"fTwgLJףS[н],.>!7Yq/X:A+ ׌^<ô.6AĿ^')%!1dF*N9`MSVre5׀" 9m#&?[2bRƗ.ʜ3|_,^ŞOt>b)i}u8<ўnju9N\άFFS K Br鑃NY[ ϘA+M+R=Fɲ-XnҪ=̉ˑh|L(Cfb)['&:Ii\9V=.Y]a@Pd cGdz = ,!ow=e1U/ŵm)KYٮhV2 PCGJDz=`iB?{,ّ-n <+U~Άy\9mZ>ۖ Ykr]mϱw6~u?o#h0B::R//>W6CX#VM,Oc6e|rR,MFΣ~ߩ`0{h^XV#J(060GPIS?*$ݠuP|Qa6{5NQWm!c^/RXq(ԯ%F`a[d"kQOcvJ\zp=R{[pQJT,FrH iK{ē1šgźVM%U$tRT$ʛl 7µkSw="a1E67^2!f/tsڞNx붺$@ܤ;.nP';3 f“r@]L+ĤQ"PކEm୨1tIx2v_C[_:)[t1W$sdl%&K @Bg{+)D:* 3mbۥdm', Zduq$c#~tу}/[g=Ԯ %]N!xC~[ptr2beNS1؉hW +GL(jIYc@X8ȯS | 'tя`/=M'W& QEt[  RtX&ZeYzBu۶z *jt?MU#mv&)PMWx`+K,2[v|gA5aϩjCG9 :fѩs!|PE|F1i'('-`e);ïXmUX:+*wLO d*{9; =9-UG^M^͖_Eӗ(n=cv_y.Umȡ]ˀK#d{) "g=PPrs:DM 4e&䚪s3O3wt1jL}= w姚=/.OڝMH]cPs -Yb R/~L8FQT yTAj9ͼ+2Pßi?&Q!GoeaԄO4xjeMR{R9UŘ!;("CVds$ΣZu+ lPYW˄bإ_17ssT> XV 3 [6)'OW^Aۮ)?ybmL8|*?T֙(M0Am|W_gneq]&yuc639K4u:#79ކxFt>0dhi9rDظ0ER |^nOL:.4CWej-ott,5LWd;EqiK+ r{> PܮA l@G5Q+`kq7V֭"RMf2wg ɣoJMcwH^4lG2,T9bfP0dHóɛ]s8r4#lF Ehx >2K3lK9R:Fw j+RDwawǞ]v; zz\PمcZY#S֕~ƵN,6GYј~CV| *W7$z̕!ʹ+@|Ij*4# )_i/z 68{2òjyJ#m$r@K`$fςr>ssAƸcxY8,2`>6bo(.p,>6@MF 0LC>/GrENCYs'^xzkʁ$Ow5!?ba\\QQk^"HKEzuڻJޞeb OOv _5ۨ׷OQ:S%gr0[zȌqE'Uβ>_}͞bEiwh2pnYr_Zi.ig;vdf)?Xk>!,k,+*MQ ^dZ6W|tԯm57ڬ-2(&宴nOY 1y0FS%Rl_e<dZx p0oT7 3ǿ8x0\>M[]=w9PAm3[u;#-O-P&v4)-J'A틽}7C{}4'zK@Rn XYYX 3vRjل(l<<իBci -DKX@dG`.*yI"ZPdU]$`J%}#IC+?gkoZsd\7YQj0b%qUd^jyp$n݃!r]oKMg xうl'~u{CwQoU<3n;@~&.;bDI |>\|/UHNT 4o fW:eM{l6 {dynBog $Mss:b7 ¬P͔|C4Eށ V$>T|'O"-b/\8{__׳U@Lo ݄{rDgש`bMBT\GܐI7~Ah,[ÀZ()@*:!d~:hsdpC =`[za@kNbK4^?OnNo,ϏPq}h$f2s2Ѣ_֓F^u{=\kU}pN |HlwPㆱO;4$Yio ) (~6@7 l#$ԄUdqVB0ܗ.2t_phσWM7rUAc!WOī\JoJ';g^ za)0m EGU讁Ѩy|QIi pu"Zm5F/Wf7c枖&$KM:5XIƦUxɕ\H>"ux Z@E(ك l6ae;S S :~玗1ӳDu[$F2:p q_Sg*.]._AAuG]njnP\KlhPuu<% ۺ7hv|=pZ_2/gZF{ַ}^ҫĚ?} 446\9?c֌{a=>Fªؕ.k;怵G2 UU),D8;\km" H|V֧LrۈY?e8/Y(t?mYzo}V?NuO}bzq?ÿ']YweAh&?kS=0MRa:j<@ ]-:KZ^fqe?l"Yȩhll"2[5FdpjKvQ%EM2.#ngMR8CΰmÆb1J17A@wqU/ALjԏx#+Kͦ#9>.aOPd?w|u@^z,~v!gVL@P&gh\&dѸxІa&o glH-?*ʗ;iZ9s4y@)t8P$* :,՘zu vmY[z1(kP>6?*9u˹ڟ[UpU$J+6KQM{*G?}]@~Jj~P(qSY|'`Q2ǷoR@$B_Ƿq 8tZ~MIV ך*SnS4-1H.*#45{DrA $DsbyB2T~X;^̘˥R:gT9C>"fD [>pso~r( Xn"rAqǏX~< \c@\n <pW%kOR`"KX KSV ;~~$R]5 b i_ߐ ~ex;NNȭ%SEi(xM>g-۱Z6tD5púo۵ʿ*,Ls#[ds kdy:+nu1=>.Uc@N,Mzw3GƆrWCsa>Q "FM{"E::2=7lY /cwò`5Sj]znpmF]V,7iPSQz]I>ko)d!K+D d(ЫWؕ 6H|^fvHd$i /g>R -p\ ^u )A}pCݵ}|t'&*CjҽJ$_I՚Wm"D_3]|[xm(7i*S&L,RtVm30ooh߄ [F+)TyUB!,L)S5EI({v1/ ˴P0FŤԴ/4oN/5l4LO$^~@2랋J 8k:a?Ei)&\25Ӭt& -^!Sbm\9hhT0AcV; /%.*Mb? ґR?f|c2?sPHv:ay͌n\#-CFŐ qS,bG,M,Jqw.Ao585AǕ:^A HgmUt>Qg#i;#O/2o*M mvQ׌mIMD륞snϫ`Q̌)Ʉ+:a9m$P {C gBƞ^ȼMS,hr|v%PN,\բ%VGZtj+X>ϦUh2 fs~TrmW!`>@Y(lKb#d6P Y[<=1NNH18#*I? /n(;bcr҈Y\k D%Յ.9~q'\S4q nbr&M]%YyzW[HY# uKoҸy-hG'BmuȀW3*l//I>kk+4s΍#|0thr}IwPb@V HSOW/9oo7:`l$b-@->ݐByXp\6c\d|0^y疀T6Nmq^6jzZFm)JP t?ܵ;m=*-nCd y$yG3/6y#DdAW|7,OM` 7ߓX`kVtd~̲QمN%+qlKz(*OsqկY7i^Q† Gh{s8@lYpN.=f'U2VVwgEDoqIL pn@"hO%fHy\'#+(ԡ\ܬDHس " Zi3Dt&@2fx7nQ =sar^:#Ys$:v vj ,҇rr76'KʫF2C===A&~Cj@_Cv^LJGŀƎlJLиSٺBShnsl߽C:pi*MSIaPd譑Du]$ =:7Nb}Zr!ܠ/M y:Z ̂gJˠ0bCo5Tj/X׶CH|o+՜^Ơ``[;ѯ}pFog= \]ن1HrֵJ=ïe./!Z9%h}U:vpaFd˽~r1RЩ :}bjM\%/0 Vj$)/x:PE>{EA9IEP "8}эDk,scy&[~"cʓR{J|g*)—RmK$>{F}Įv=QׁP)Y%n@}6M츮,ҩ4)t@@@ԈRu r&֌場b *&cE"`xo 霙h}@qJuuӳ-1Hjaˠ^(BlZPM=lIb$D?QūAx#LsA.'+rEk?,'޻v{ )FAkgmQV~w FziU {Ȼu1nj<5h!`I?.W@Q+aXTOhOeA٥}~} "?o%I3F幯M8 _%@>[޲0Pc5hb9e $́ ;qhPNwKCl"j6yM17yW:XZ]:ѩuս֪p,7 UeBh |813Ⲗ(n+~7UL?rm/DV2.:ӗs؋̞Y2p ]p<r (C7ɳ)2b.q, ꡛs* x30悍}Haw.A`mUwcG>]2}F Z8n0; XEۖ9'#J:xwz?|W 9㰋az:u6܌b8+7H&q6Qx0dRV8ӛIif\^c+ѓإ09KOxeO'^р[40NmNծc:#mqdCV|^aoJ0rQ{ -`U["kbʠj)xܐ>ІlS>tYE`a7;*eA5(<^D탙9Ys#3զwrFw*;5OM7}CW>oUVrd"rer/(HUhz]ViΞ{T{).mB%8~I%]*+r wVl%c,q@I8D:ۚ#i7}@OL Gd2rb6ǫJwf}T*.r9*Zuk{0R0d{4|.) ɢYL4O9̸Ԟ{5y,3^N{F=еE9ꉰF/芔79߱fa~c,zz΋K/w<}ي!Ά*zOZ P\|"Jq3Ĝ3䝸J)[},OQL5m6R tPܦpS>|3x4͹UQ1~|Ne@1#}k\-ZZƺ(Gy3$3r)3,:Qp+͗szNb|H #S*A9z]6@1؜[%Ko҉ 8=4>]e#_-Xb)#AQ?a32 s槜Ϊ"]u Fͱ!iE}|eT-MLatM)<פ!`AT+(ޯ:]R pY\>1Uzv93^7-ud,dF\g1o!2(#TzHM\0: af}aV)lYꮑ"[ɏ 0كzb&Kfʴ4:* 6V SآXΏ8-:ޠG@o7H-$zU@76+]9eZ1($=80l*+넜k׃].!mR\ " Dќ޾:^wW%k x:*E2N=ӟPE i6!ЗO}1iſU+x'V,Z/8^Gְ{+^/~nUշkGwt)t$'x{ gkq~at( = y;t)]~&cnI:w($uGŴӯh2C5P8}dL*E)`J#^02,^XýNs']D0\pW,6;g痪!C#šY +֡LNc ?\=N R~nA)b̈́Y0!#! 2P{+ʶōrЭHACSqtT&2 MlȐmEy"mlC1B4/Gq/fB Н,nE@Ǭ8Ӕ v֘URFIhǞr|/M؞fPz62D;&V 54 Ub6vydFujR'G;Z>nj<}+ s9$[[yd)i1?iwW 6-` AZe{YB-үEkU[DžzٴF W%`SC`ЏyɂV''XJ[,MK|aCMG-V *=aBtZ+V2 !Xk2buhZt5O =ٶ R8 Ћn%|^}N_6ثf6^v书֝:f(8pyx=񫪅D )]Ъ'cTp\! ~e-B]!Z?vuLL4,`-a# LD-ByNQ,g8#3֦߻V^ xzRA3Yao{5YB1yA)#OeCSE2z IyZ^1{M4wݟc'-J?d֩Pr:ȇ _|tḇ$U>xQLjYk\ $?14ii j+wǒ O'Ә51뀅9QN0_giݵ8]kY}B;0J~R (F^G~/C74ehQk%. 1ٔy@-1CW9]u=8nG4MTX+PB##0wH?%C˟f۽7ׁ̌6t*ټg \|?䳀&M>/+O%$c" ?hO,fjG(7ze 0mJL90к\j2E# NP2Q<2!خU`:]"49 #D4'9q׍`l7@_(2Ua"`~pf3Jd}^B pHw~di`KM7O4MoNϏ ^깰eL@ΟK=٣G|0MQ]NGsp.m| ʷbjtVd6ƝTF_vFBD @jv+DZ% ¼mtۢK;jLv79#=+\Y@kSr5}ǨpF%_F̰؝訡·>Ut5iVsm[G%Ǵj9zb'9SDT,z{ b|NjDup,6+/ةҹa,HXT|ΩFw$M^@)+`izAaf'dϳ4E'Fn`*o?!/16 M}@16%6 LH#s*lɦdD v՜zMV,O*n$4 o/Թ5C4y?Q]qܥS\Ӝ|CFtj 7U-RےLM:@c>,wM'+)"HY?E#A nB T]櫛 8;2]o|p+IECҋ/q0K:vEdkݟċ82%1]չIc0yEx$=uK\BaoZ*Nć!!oȂZ"uԌ"rtڔПƽpr-(egX]Oюi2rb8w~K6goɌz߄&H]BY,X{T|}Qq ·?=Y:a)\;ǿ$"~.xʗu'ZhgRXVU/lh[ܟ4?+#q*qF`Ճ\:*׃aaQ_-ǑLSaxc^bulu)$2I^r`'fA[VUL\)8'p-qWO*Wd{8-Gg-'.He`|L"f?^{qLQdR l@>n8mMiOFẒB yly`;ԊsQgN,]Y!0ow| t0[9H%EkYg`)DekIA; N0KRHT۠թ~Ew{?xxg2vj;}gi G5=no- 9؊J2P(*f U5Vja)1f9r@>7&pV K"cƊ) ,ӕ9IJKF 퓣w?Ă#i/\*\Ziks|cM:8䮏\5 1?S 92¶PfM?ɇY%RdH>4jpgv/2{+1oBoΫ&:0YH%bnzS ium6aMvJdLPh賓Cʌk9m] &2>UC$ ۢ.ixJmԿarٛS}vπI)ȃ0uP -xM|݊K}06JWqLrQ(#뗀[!ԃ|k] Cǽ>Q(%9cNR0K_Z%ç>$9VڜQGXEU:UbP1w#XM\b+4ӂ z*݉r 9L+.*KI|d˹% Hϑ|zj!_9ߋ1I{*NR*k̔䨮\A}58?ֆ?}8M˥<((->b@/) jg%_氵j|qTIZ E m@7_OԀ%#l1cǨ̮9m~7H!;F',J{< [+G+B1dzi00Q-b/I|\]&?ȴg̷EuU._q˄%"bpgIƯ`V؎ ZOn7OjeZJUJ0"LydX.w :~Z"vp*Gv>>9A/6ݒAi/O?xO .ћZFTwf7:`{B?@ cpX~H 0 @ Y:>sK2Sy<ɖǖ dir~ EO,0.@rE g-d.VK,_-QFhpN HC$7ξ\ 1dD-o2b4ڂA{_;ȯyyΨMinPM-´|=9K7k3&.(TlȺY/w+ZVY4L[Ma ՟ĉ[D"q6Ǡ ׍;x+qK!M8'0C}xq^󇌸S~E_*.o$"y]\7l^ef)<P*i sr߸ŀ߆%H "i" ~b S%k>ďxq w5ˣa@Tmĸq[tMG'$u9[7ҊCnms\ly L*^C_X-DǐꀡZ7n2C"Rv\Vp2B~]n_"Ý_v&T,jw_0m 倡m+LJ!mt^/bߏwIg)us$WU/:|UtkO~o* NX12Ry\w * g\B,7ᆕ[ۧg+-$k.as1@hiz˼ b^D֪I*G/j3qXx=|`J2/an~_ 'cb!˴`Ȯ1έiQ^#3Y)rf̵W,Iȓ*vqd̜ R@r}旌" +Ut^nġ=={t88dju܎=VG#iu$M9>Lj4<&hJwl>%ǵE]VuLPRsaap tӥ;>y 7 &l *A4clb1OqtuWKNM@ eļUX Gwջ@Rl2"R!i e Jl0臲&//-yu[-O H_bgI灲\-F;mLYjwAd9WNfG*2[G.#QUQ ,2f7Z]]ol D&|x*&d $34=@(A}ﲧ}lV JoS:GBDi8ƕ&3$k@ӊ*M\qL{;_CyDT"IJ٩d.QgWmZԏY?BL~: j.myREMtcH˹ A3Ԥgc#A"#V1~sKw٠4'GD ƶ G>ehHӻ eȍKpa8$Q^N q:ʠf3 #,[αǘlGbB&S4s  unNDݞC3VIUR/_hF|2d vO lrYw'y$4l)7Z Ieq7gbMGVtJw8=R&يN9Π i9L GA#CQy|mYbbr 8Wun0m,9MC]7'4\T/e u!ͫ7+֔z/UTjbȫ+0(VChX!H7,&g˃nȼFs6<,DBK ]g1 dQuLy ǀTo=Y-TUOy<7:!>q1EWL>d!C6o8V̢ܡWroz#EZ}0}/vn-,o8o1Z9+2TN/>K)Jpx< ?/Sս/b ٞ9%SU0kuzBxm+a(RL@z>Μ*Go~O1p~)uvlz`Gb>8 d0w+O"A3H7>OX#@(CӚ*謓WEaڎoq8G|lBK!1x@:+ Rz_(T0衛2@6XP0j8,gKjq@*4P6$YIy&bCw5\ԔFԘx_Z௦p64I(|l L:OB4}"*>Kkג7½:FQD>vY*PS 4x/P7JbQ?ͣƶkȄ@uDnt-"_n>YNSNU<&;[#.;!hKDLF w1k fQ暪c,u/B!dz%&1MTܖg6eRY!rM*Q3?ޏ@#as6c2Y&-ZWS-0O`܍*ΰ14Ӈe\J-y~~8ұx-h;e<C!K4e"^Wa?_qs7붡zrIiZ{P)h(У_Vϱ ER]MSXBԣyw|׻]}l1^I~-˸+dʍ+Y] 챼Klɝ{qEk-Pgv+BNv˜ꥺ&V6|[E#I{~H\̷G@cW|yhܩQ rt-XN[%C}""e!y sVkɒV^+&q>K DXhs9+Ap a4AaEC ˩R&/R`^AYJc8cXoޝ7FnF tȒ ) DϮ{5I2r36PiKb:%^qNV(L-] hzJ~ |Ecr1' l,lA \z\)eRyǧ\ EsIלy8&bM  uGy ǭӁHw!P71果v1\=\xnyMz_ߋ4bORYH;+/@uEuVL.}`}Sq|+&t"є]`C⏑ցS՗AroEs?̮`f-D .Hu%D)U"1E!0φuՍuL&ٽ8shnT1[73, l{!ifG)D4p;W$1ɇ2G"鹢“O(@gGfKS ⠿~tezԠ+،w|$9*+VPD;̽szQ>#Q1̇eZGH̚Mh$$In-= {/Ӹ%<|屢1Jz޾E6$Lbŗ,l–8-9rv͓,C[w/i];UP2Oywӄ4 P$Dl˿{'h#/w盿o} ۣÚC&SOZ%+YPYt )ۺ@Nn<mS} ^ 2`{LM9.so؏?ʮNk!ydlv/vL.GwjYhos^l,8$a׹כfa>jqSw^џ;.A@)@Gv0OJO?_߉^" 5,MO@ITdbҡd]|jhhKv^I4JNXgCMcRW?:q*V+]J!]0'}G .L^<7HC@2̭rJЩ(+ED_R1 CKEmCwuxɉx[8A&^@@dftUnhDj-wʽ \V{kJHqPPX्-m[Y8^^1ӗؚ+ڈ BܽM1A0%yr@o Gy 4HXGC&? wq ;h@U]i\3{^X >{>`&6q裯t|z zGhdkP(2LyIoY7)J\FMAoXRj:!}6IQvhWJS+B/ .0 {\'}~DY `^;;<(%+RP'Tc䱖Бe,l(UhEt JVc\MV T[L CpKiq9\NSL=ތ9M?[}g qC0dAkMM{^GŶk-eh=&2BWM8\44-:GDnB>+Ղ}[,Y0rF"&r;yDYi&R6V/Jݝk$GތOkwhU @"<7dEwsK2B7B :X]~W]U6gRy{ޱ@*4id5Хx%be-ɩ):~ oa5wV0YLe(zA5`BNvVFN}ԈvR GK(Vr]ja[x8!_e4rl0cX4P+f2S c-=Y߿Qϗc6rV7v !א5N'³dN/QlݸyeY쿣Fa8YSeS/xr2eOQhLX\C[1{9uAuR_~j[{c\@ mԂ4rbT:T،)`ҀtPq~N_#Ctcدlim.}2|oXԝ; +Ӟ'$! ވB߰,B83#$iݤ:W96o{꘧b i'D&h_ Unݓ-bR!ڥl. Wġ϶5Ph5jp#/5~ MJhn躾^ 6}wJ I&G:TWŁλI3bI ޓ(ϰΝVJ4+# E.$_"՞Yb̓ZS]X ya%!bU*o傌J kw{L{ǻ<)J,NGñ9j ' =Y[ZOVM&\j! )]m"˟7JzA&6"ysEhfԤ= ?$47Pl H'! h/ys(d/qoPi(]imK8kӏ½'-4)%vM)§( YqM1 9=ȝ]w. X.}*H,c)wXXl96f?sftպG}yzZQx sBEyYyuz~Qo4'"Cvmɾ-i.K`| , B߁>ayP (E< 4I9nҾx)sߠ~@A(j犏C\jz0UG=%q0؏zP0G蒻 c1ߟu= 򍾧1u&͎4r<_F-|x4WI¥pI5kMzeЙr=K֘ mQ[V4v00lm\<8D$aT|[mԟ!xe A A}GE%A!53{ם>5[ZэYAre&|Al賄H]CFƾIw]HFb܎a|>V73`1GL ƻ*wo`8"QN^ ]pQV GL!ְ|UQ.ۉ2gbm'=@Dn!i8_ <Ŵ*=A?\g{xhf$sV_`gh#=Pv"m/ \Mr40Z*2* B&#'G;Q3,{Eۡ3DW*51Kww gGu w 9? U9pF~AVr2 'k||7ۨ)Y 2!ſPfa  ^Q8Y< QY vfħ~ѱZZ8Bn$Dy־!>|tWSIV&8Kz1 )& r{ZJ "MWt!:uZ:bkM:}~-Xˇړⵄ'=þ[1'5Kd趪*c=tz1ѠqDFi;* vof+7; *y{djʄ_\m\mperr0X,H/<x9V Q̶QЖ1\6aiᓃƯ6e ejs:"˪}7*xAۘԻ2{}O2p&\]QVD4"݌?(>0tqr>g‹JM{/I& ;5bԣ ~CJ)ȻZj&>E+bD.Ci؇Oh]J~al~qL~hӎa}cJWgü#ʯQRJh\PRYyoV|?.F޶iy>.ȳ`XSO~t%0ݶr!^CDFa]H 5WMhCYO.2I)dWGk<;`r? v䏄"uղB}',7Qќird3[o߭ZЯe[N`fT̨t%(0$WA5;%37-p`>/o)j)ex?5+s7=C6_XWNJSpar"!Iwi>00,;_<gqrJ<7ױjgY3W Ę+cڜ#\,TXmk' .9}S^*xFQz q][ lZEUͮ&?Rɇm[2rQ7Oਯ1t,C&_Z-tmFj A(x3Xi-8SZXˀb$*o2жݦQ 4 Edc@͑ GjvYdqFq8ըNDfQ[gPW }JpFGUHaVLIYaesmITƿ+E8"-Kb5P3 $$Ȼt|Y˞5c%˷p+9rh8*A&԰ Qqɢ !pQ8 yr|`r$(]n˾MQG 8*ͽ\ix|V΢ăG]]t39f RI! y5ΐ%nPpL tl:fnti!/6 gu_g֛; JQ$l6.lg&wdʴ9%CAD;r @PyIBuKoܯa{W6vAu^&HDMb]WnOC%9ǧ+o@B(92ۻ@D:qu kY.A;cJ. 8?XyX)4?ܪdS^{vո66HE uTW+rXޜ!j|֨.\caԵ°@{~BH`{]zqgtb?Eֻ`0h%-XۼcAvɞ&dvVS蚼96 {1e׾ɛb5|j-Nfυ Z7[{B ѭ6p;dk](Tr(Uz27o-tER"|[71">0r}u]y1}êÍ.11]֗@sZ=˪LhyczZn3B`20e~O[/F?+c):T,`xV"YƔ7")UeE8Z_~-q7CvRnkCNs`72i{BF8z axKg4{l5R;Q0 &z "ŜLr,$ .!dYr: 4%A3*Hu~  #2ӓ ('I$hJ2k\y\Y)7=z.DG7+B? (p}VKPɨbXQHo6m4Y|˒J},O䰺e1A)+߯wKTf XMߛJ^+CvpoK*&}eގmxo D\y7<u{r*nJ/tr8wfOfži[ -:?'IőKAjHhM\o TmII0K" KvMX:äķhMNӛ74I쵘)(q\,VbRJ] 3cA(O N;*y!|+5 \$zvQ3r̓[QI2{5˗3pFU\J*.%;srBWI("Ei1ݺjua'%ꡧ5 Ⱦ La,gE< ň8Z c!ؒmdPg.S;4`ܗ!Aolya@d%&N[C9gI\ }2T롛f(Ɋ;R͹dARʲ(NŘ ;Q{CN"%Hs$|,<6 ęCIZ6|Wg1,J?rgu-3;rɑdY{3=7zC)Pyc#/!)ֆ׉sK \sCJ=਻GEj"m.yw%#7+C Ds[U^TI#,5@0<( `Jf Pf~t U2nV8RЯ͕Nײzb9ҕ$<V^OS+G+ҋc0xv?%1oxW=йYϖg= э}[ݑCGO@_Om.˻NI.}EL,NxI, w`>F&[guPМLDt:/"+, ,6:'8h!kt$g5¦Pi0/Ñ2uCYw蠏I Qf=@W@/':ww_vJ*u\`a`^arɮ ^A1&R{+>,R7|Noq_TIпPB (>?&_a~ݭֵm+GF1A).@1Z!f"@R# N7-jp iPS Ӷaڂ١ckw6Ff eP! H*ʲ20DDL7S I@SNޙR{yqsvispuĄQjܵ#p|n΁}V\+8UP9$Uջ ghbLS5)/\Jtڍ|~%'s/Arvc"/0>8SⳔe!iӹ;=ѸJ(մ9۲y$Ue* t/)Yt+Pz+tɗ:RR2vdf)˛R,-!L$0xŢF2FM \\/ jm7>SQ J+6I1z-ybB%'Pz^gsg<;&bK PX)ndjl :,^ ^V`t!- n|qJ \3cmk w +2 o%)k8=B3iN}6sėS_5k}5YGsjxtw}5lNT=$j޷!A$?fwlU2b vΞo,C͞\k!XY$ 4sd?޶AutCI)O+EIBx#ٹ BuaFWѠ- (F>^5kkX lkNf2Е]qZjxހ;F:l />TaϷQ}и !D#s4FD$[t&_+eEhAQK8E/푼.~Z}rzF ph:|W(6Ŵ>M0H(Gc6XWq48YNf,"P|6[2T'8I9C2aHNb܀/@cK v#k*jyeذ gqs)5*]ϳ$2|pUԙxߑW~L`e#L٨O/Uq;OuR"Eڱ}d=9y1#W\w7i&@!.iCm#4R :nAg驴2WNy75X"C,6)Pң۝hָ@<PC:9X}WV{yiW5KGkJ~;LVi .I En_Nc4yB| m4+̪s<7>o}UVQ,糟QL u{y].|Е\_TÌhu5Y83d q8{Bd[;/-J l9 3.܏4kBaH}^{"KЍwR#f/m\ήR٤QߣIyV/Hc7z^?o>)7v0O)CZXQ~!{]< I2={ 3 e6d۽!pXwaɑ;q%AT s Q=O~?4'0Bq<@E('\ɧ= Qެ3X1^֧)tZnzBZWW0xn;;Dq'ƊR{53gC4rH:?(##@]Jq!5Lcp}ra Oa=M$³O8_8.:ʛ_ 1uPhm(nH./AdŰ}\Ӡ\YnV'['6BDcVZpsT j0VP[ M?%dW?Qbnw5VstD%K6:Π<,5X|TЏG;e |_wPt{DŽkpvj KijL$H8Ja kH66T |ٍX#W ,{V{^kfd)^w q4sL'O sDl+.›}{ː Qgb.e[+bT5LM^d=A^)p(c;Ϩ<2&CKDS8i 5Č!o 1B%#W&GK{IB* ah7CO>5ڬj{Ƭ`wz!CP[{Z+~U> U/K܌[9c£+u0fF$kr;C2ʡ{j]i>G~ i]RM^K ӿ @r:ػr Q^3ǭ͘o3Ⱥ8CxDo6Y`/wqq6< QRi?_\B+n!r0U>//lG_ٱ[ a&W ].,ؾdjpVL_yH=tNov5W3F 7̷CWf.U췷Mg4TR5c|"<:"Y'"Jv^8AB !g)L[cFX3cT\:=4x4&u$oHVGPpÆc,Kqmv0eS i@Wx4P/Sd#l_ ;APfNl8ukȰL8LAE{ч?++3fʉ$^\_t/| - Ry{>BVJfD nb^LNƦ: D۰N 5K@T+P ORݷ MCPYCoKY&^)&u,L$=2==r)gXe>;VUd6tSzD { B<Ȧ6fq =Bf Rԗ/oϢRۡŒ}ab(&Sh2y3caOa-j'#rq9P<Hشj(LQÊf > G#)3$-tbb  >o:L'ݎ A%I\G՜X4dHҔ8aH bdT)Ǫ\ ryM(-K`Ir\L)Tezv ْ;ϯ"4o 5Yw}a<^Dfٞ:4N~T=$ Xo^$?dH9 E1$r 8qu5/MOIEdp 8`ƣyj_|N aDϭQ=Ò̳d81RdУLОYc܄Gz9'CgiX,^bȄ`2Em\&:(z]`fdLjy?ӟe"NXjp{LL|DIGT.F2,O<,i'Ƥnjs,ZH@[H1[*$B{}8І܆r:fO%6xE:*Y"4} fbuac(5pU: qs&G}l>QSY*w[(B&p`0UA,֭u Ycp9xXBi͜7kx%zi@}^ ;\ )ʂ;9qh2⏜Dj9tv"0P۱^Dޥ(Gȶ-;.{!B;' k9Z`vi(,^b.x1swRWmyyqt>-ȴƳ[swNk.FkMV^+|*R%2$[6T*bbQ[ lOyNST\n$'8a#ƻܾ# T6k4fiTG8ѥd*6@+'Kv nEo"ҶƱIuPm@23%hF#J#a# 3.I$`peu!,y*Լ& "=:;er2uҏ=c`Ս"ݮ@vsy^IdѺQA-\rR[?d}ie9 0j m 7 G@㲹@w9vi>ũj4@I^g׏,R[2D%.[M<"tON|h(O0>}8ǔi.cųz~{V-HXsʜIOʞאJI#aJCI?d g&zlE#AϷݩ04P_IUH])l@-e蜥Uʍxgb ޱ*T6I.:HlU$/¿:2<@$]ʶI*фRL^ヂC0xAJE|Ywtx^wd(q#Dkh 3M${Fx(nUjTJUfJ?c6YV÷evZqBpąpe־̚:5Dŏ A>8$Y% ̮{J,}4a.v<Ž[\3I<5v'}`zޟM8&*B`];mU4Im} ˎw)e[^Kbx.ȭT$cN#.WYE9N%aL)O s /m?<?Zr~lxͥrwj0c' ҹgE)X$qkԯI).M8qhty 3M6:@mf7U=mk2L%>^wuݥ^ %6v|4'  0G,QGVꝶɳC1I  /-wC fxpޓ.xՏq.f uI#C-"MP'&tl,*wW,dy m *?,AE1s1a)t~n٬`}( %0"oR~f{LAȷbE$[DC-T7خ Q1KR8'*|-"IZ3!Cbzz6Uܣlߛ[cLvYǶ5XFucnfۂZr42'dXecb;; js%ž:bҎ_0-Z{p/lMHܲ7դOQ`uet zab82z=Ԃm,??0Ƃe /=,p}Hջ]1;]`05TRG'IZd Zi?icM{ޠi;GKz:R=LZrv4p#zt~_ -k_ aO`[,6#>ym51:;Ə2h_M HH?$G 12OSZZu&nH޻=r{jwG MZF3OF-{q_Oq;!; _]:[ Ԛ0,jzo^ʆ!+{zD|(sIz}$qo9_Ⱥ'OGl ź15E|}pUT-1SqP(bHjVC nnl'w)s\4ḃdjwVVg+;FLnFG6e͌MwځMi|w|LPdaj'7hBy91 6o=;:x͑ ;-!IhΑ51$p-NKҢ"$):}b'Qd͟`/O~P,a@JfN6-E-"x΅Bp xByKIhӜE@{К$eKD y=VMQɄTŮ5ޔ(Г4z wMR7b=8j Q3]jv}~${ 2{Gp5#GpLC6c|+=h.)/nztiNav\JW\--" ļYz?mCU:`aBwY}O-wN) L#zhj̬|rNw^ŲNZJwn'4'ً}p:VN_!,[ĕ?J<ްj vۭ:)GCd V_b|D-'1K՗pm_œ%d>$u[U凜ֹ .Inl%RZW]e/i}Lҫdyqx[pgDd,!$5LCO+oѰCߦzEڤZ{Yvl6ڊ ,bkRqNCYZ?W:}cCSH-r]h!л_Aj'N ^(xX[hx7ɚ!NQ Pڶҿ.< AI6}Cq N2X=_B*kNa :"o#OzErz{?Sn}b !Slb`zGUDA+/;;)Fƞ'dĜ< {j=zNpT7CLH"U);ȍfJ"gˬ?\+])ibEyhd+3J#ޫK`1;QX /B_݌C  ЬR5u#MF&~ː1H7ڶ& XHJF VĢkHV,4.d͢2x_7}tzQF,;_8H C2 <~։NwG$ƻ},  DhS?aWDRR#"7gФt{;;UqމD4Q/0[tq ag}{]j ۗq鷁ۉ+'%VzITL˒F70=jE h ?mi"R/˪vbTHE%+ūt+T/!ꢄ+w1LVsU/C.v |QS7I̼W(D&Ĭ0CLT=8@:?Rvar_N[/ ^Zl|]s*Λ+yd9~/9&_њOy#,g[h˾5kӵEzHRbD\Ftc%<$:z/>G8&MQ&FPy%N""6,jOR>O6H.)T|u.'k5*<#*ML4S2N9 &rnYGI[3Iě.!F0/hH)(@"z܉>@"kZ`WoF)aCm,g)c?2l[FAV4,5=j7M/jQk6 ]$RzPBвeһ-JI,q9g겆#epfvUm|(lrx}F jWM~™}diMz>58 k3,NM="UF0M! B @AwNk` Rⷄ{:~R|JSTolx<Ai\\N؇i:.FjiEnqSq!/rTPo\ 6U+>+Q(#&3imj݌(:L,R_3Q"4jN=C]n@@=V;{*[@z~P "ZXFcWy\+*x7T#ڼsU<:D:+b:|BP0w-,H…tR~.A3z{=4Pc @ʩc5$ֺ k.*/wg+0$ߪ 84L{6 -i7!FCJxOuGcؖE6'<*a`UgFM}h9 zi;USp }t8< I>U"Y#L/z` Dմ„u89wBJkFE+pPm;)@qD@\u=IdK }8GL tm߫|M"0<d'*.2cB^ )$T!A =Gzh5JUN;tÁe5WP e5oksDN@ê u_/ N,_ȥ¼>Mg&NX`r`4jmٸvӓ#=%Rf*r4Y%4QYDx(eP1P#~2 TU~NګFboTLK7c<k,,v7<DB'<\Fz"wTߵx W(tk_ ˜d+c^=L4ƒC?϶0᥄%؟6K;3:.MgAA?j;=gr#otosw' 6~S%aǡSBEgxL̤h;Am16}\zÚϜc>Tin|HNf @.=o.r?PxEV]6lln )Kݹd7`Ӿ+ -?MY!9`w K&TIhdz]<3\õS'4Yc@q lQZ_,7r] :R_UE&9O2vwjTD] 3..MA%M16kI},njܝB&$WC+((B~J۷; ^6r7>U95[HT -:opwF\LK'jz* #{ *2)a+,9rX LNvהE|ԫxOlzlﴢpX^;if->n rp Wyd9unzzʣl[xbZ'.V̱oD/K/ &D次,T;z6us/E2FS/Q 7FBv߂,A5e qc!PM4El,ֲ1Z}0Z`;<2QV4gHERj`})9/ڔ`TKH0"Z#GBb܆'TZY F:UwrZ1o6|Th;Zr8=صW̒uA<'B΁og̣d<(%w2`Mi7]ЎrϘQ㼙&Mv6æ6$]%׬X~m˖LeY ThY_/oI@WXlV n4$6Ia,iѝ0}D k^50uux“4;Jξ1"\<@ -[K2ǃtȊ+bY` ] lA]eR̢_J^*ko##RVuڱ g4FFa4k1{/Ⱥ~:pLGW[JW!dP힀p##mydѣfkI[K`%~|:š< SJ5uWtw]es7tZ{t`Ԇ |i9B&6(}+qXĩ2ŒC$bE)m!%Z5&R{%K;vXmq5\qp.ԋ- oȗeU. trlΩ ^r- HM{כQuBU!*i\ F=} ]&m=хyP}QMjxpZ哹;c7bi~"J4ƜzJq]cd˗gӛ QwIxiN9Eclهj[^q=âS@OndaCj5m}bө+k|X5|Ky 獨SP+2U;o|l6E_젵@7U#b,'GE /ޜL]0"OݶܫfɯDqP%b\A߄lq] >3ߍlq9Vt*b)[;` "TiU[2_WDl\;)=3?T pjpq$$!:b?\/AOr49u)0F@$J̸nJjm7,@8eP"V5Bo{l, vܭE'^Ľx@gRQ=m/s+4_oĂ;S=_ef߼PоHqf5HB^d@JޟZϪEAF9 #ƭMƕN8[~öle}ɥ·;<Nc/ {nB(~4!hH3/`Rz 9~:и=!NwHQ ](gߖ*ܚ.,>ZtAuY!jEq& p4y͎3pm1L#M|cC;i>X6MET ?m);B ^ی+O_|0t٩wX6 >ISMc4cȴ’4上n5n*q1b*8%Ro0&%(V'[yΌfmkd tY η2Y]|b f̲S%޼XzkK Xw iCN t&wXeW-<1>Qe" xOa@/~_.ҕUTnN5[LFe)f߾#m\;Ͽ sE?%yQ)ǩs ! ~u/Ɍ4֙wu՝]e񨎀Q)Z2n ΕLWŞ V&ՐKγoY8G%"yb2 ̈́11a/XжU3?% nR{NusbEx%ވS ;c0 oU={,ыHq0pQE= ʡYl {hsz!h*Pߖ>m=U~ĩ )I]K!b͖ nL?{ZIX E9Tmn $ڑIKt&(1]UY#?¡Y9ekd(?&i<1'o#ĔAc]@]ԟbQÔ ˠ "uuJSPBDp zDddpڽ wo<< Rѕ*ǯ: @A}W:Zx*"wA1藛(ofI2kR4f;o]S޲jv)%px>)ӌvvŔa'^#J^*5- u)^atyLoVaR[ap|ǁ1H;ea-P4`5E/ ¡g bZ$ 5G?0La}&<βbI *P(3~HlӚ"TMlQY'QEQ-N} rG|XUC$+ph]nc@8_JD˵!KN=}<7fL4{ `:U2f뀎I4V,BoІG!t [24PfMUX IgVb2h 6**d)40Bu]1zNh쌁e1 W("əK=m?sz],ֹ-q@~>IcC-F#Y9 azgm*$6|6z,'k DЛEK[M{nPpڀ=ٲ\Rn;3XfGe*K#|No PYpkΆSWT >q0鿩j4>Wȥ=Ktd>\҆w۩nO[;({PV|OXtcZg~B zdn=nsˍQHqdj#+pEQN*j}WƢ0Agj;zd6';ne w>y_xi9Ǒ:hNq"“ǔΌU}adܚ J˻}Ha&FVtS֝9ttг;xP*a,9LtH+(S"k~1%lakh?mAFHt {[ӈδ`~*' a>|N8,(͗h,dt't|{xfAr@8*Om%QK8) $'(t#(3$0TOu&8C-{qM{ VwxehV)x00~{XnRX>ޤ?uh^ T@⮹3| DOl3T Qr$A̟#;ƽpRt?<B8Q֖ůQ̮%sĆ+Y=)73'7jOJ4sOg696Eg!Xq^koE\^:[b>M ZhrY-KHVm `c5}L)ګ^ЛiЂ}9@O4g{l{+;Y >G9BX7i!bh [p]nhINO{sLxTf?ܯ+p?lsI:@ڌu=@'=V݋ޖfsx>_*T|P \iE~BυH#ju  c}5P }ngxP?s^{itˊQJBRx묗ޗɁL4X*v'JAs Z2TA57m$KUgS$"tvJ==NeqH5m7 v7@xR3$T֜TXk/W9oդ =Z&w8Y+0vS*rDmRGoJіHܧY/8ؘd ?;tTqKtZ7e3ԏ/ˌC3vTo铌cάW?n,Yd–\eo$۪[ b޶> }!rE$ "Qawҿvy?˰oN<PoBwg]' ,`QvQxuc `7 lhY:2#kQ=S`-݇V ofbqB2j"FoYC|bfGLܒ\znԦMq?h:(+!fg_ )x <:Aq\Te%2/n*+lہ6+2`]LAo(@&'o: 3VT^ٰbVX [JIWfaNge-5k}Zs;=9L7T KCQoAyvK`gEswq%΂\FWӥ#r*<!% jvn(hAɼ`H!ȑn]G\TfȰ!d2$& f=iٜ`ɨ:7҃R5 zFm\CֳjG^%uܷ<2l{Dʬ~?NeQM%4ػ-AFh$jB+a|\}R)~UUx?F*.}K yÒ$ŎʥeD*kn@ AH]eo,AT}AL 8R q7EVA _ք-j  n0zg۰/ūo=2s$iD^*PniU[LCLBb7R3j$bI±Eۍk&;HTp`MZjׇ0tu xaJFպz(R$N/iGmG<@sv? N|Om(C~g+WkvFM>ԯ501:jO~ j'ڧׁ}Dx^Jx<.2u۫Q>%3V&jl~݉B}2:`>Y] gϓ!6:Irw?;Q҆2 xKk`难YF, u6$ޭ@nԙGq@|۬ U_ tE Ǎ_3?#rX`n LPZĖV2W-9 gNH,uoy 3Gg(Jk [̧lb@- %-z]vx8$y ߰|)j_bfF"l͢H,DXбj45&b#O&*d\aOKa B*̄7M?x1Bn64N":>Y++ij_Dzz{HIJ.,QM_8Gcq6O֑K(mD ӼvLB U?NCⵤ ?nJ;_So#%t\c͙xeLf]kN9U7Rgs] Ӻ>6_G ;_Zp~:+ fm3Pԁ;_ -xLOH+P{R<'3w.157XY6aդ>2A=`,w6ĭ~4Bݗi{o7k'voCqFonC^"5ۭǭ<@ JURm` .I+7QMv2ee{t ~'.)yr!$Ay_xgij _% 8x g:c{N5N|ۀ- l] Xw t!af(ly.NW(iMfCD^fxW6XW륀U%om+y Ѱ;_ k4QbuצJ+ɏy8@Y mb>aOEKk/$ X:}?eA4NO8pI˜Q #t)l%ģ2|Qّ]³oZk. dɣ֍ Y(/޵ؕꌍ)"M"4k Ft,uiJdf۲4sEJ;kݐ\] LIHT`O,pd$%%ʼn#L̷]LТIR0RTqxFUP{+S|NC84\C9 -׊_ԡSnCFd)͇f8^Lv<`E "YWb_ <5HT; (!3+o br;7XxDUfRWp)N_W%qD;j"%Ld5sR\w S)ƺ^씴qYN/U܊of,f]#Oz7n52$ sXƅ8l׽T` |∐g0?BNH,g y%caFP"b2Rb3@:"o0ީtByaE|ԈL(&}2E8Uy,Dɾ,/a$ ΓB r6eBrZJᱯu U:UKz*)5ISO z&-;g+p5"87'jDL[icYeAC?*$zB?رTq q&kBZ4N%p|D^~7Q- P_)JQ\WԤi0̓CHsJY[/W%TFOuC=7γ4Y䲘S.Ѧԓ@>+Tk :7S`Δٖ2aYcAZuQ)njy% 4@:=8{Z:챮3p(5K BUj[u?0ß:v=4 eSc:dRj5^֪܄Si.}B}xZqWV]we/fA&> nN1S$voG SE 'FA+d  =Y#B7rE-H ]S1WkHSri@+?*;a¬If?݃<$(Žw$Q7)BqwCk. Q oi+R+NK]mMj-0$)U5 bqg;D@~FаTq>kO~iӄ# 0r"^yH;dPl__'ʌNЧ^Zm;rz A=tTw6-JOGJNPedvWK eߟ=Rz$nX[Rɞ-%-b;| "< Z|xugTMi/.YcR bM( {!kFgޗZfzѽ!fϟQO=$˰G&M(l8.ߓQT*DA0sD»ZMJ<@ME'fޢDCWi)4Єz3]\E։uN7$]Ãf~J>G bhnnO-vdi&tUJwN28iFlrWWnE5yXAEϥhwtC# ; ˞7ㅩ%AByj.Q8ʳ=8fSݙ;e] .toaƾ6`vJY.ßeDWJBwbH 5G5{#Qb05N@RjJ BPM *ywO#@0H>Pi)QtX|bj.?6Wj|v}q<s;m\SEGdSCѰxw` !Pn]hM$P6 ]f6lу/QU_t<o@[suS4f-Lq`#lFC]tPM?^ zB,\CuFdJ@ӆARdKU,NSG\G^qLdGc(oceY`N.r_aܾ3R9Ok( cяAv`sh (-I.\S"yTbNiyz9WuA@VT;6#Sg>3`y^:KPDv|3264 wy~_Og}HoPf' C(4|mzn^.BXM;3^FS[iʦi;Jg)Ek5vUn;7 ,wvs[()ARBiYjdRBV{Ep: oA;(ɣN{ٔöGI3a&Lp`M_m|"!g>,] , J :q{"7mΰd p*!'z;3 %SR JqBW[hIV<Nx*Kue!"=^:7!޳K-Eu\<WuiȞ2 " *"1(6:ԝʆ%Űm2P[EV1Yh^6tRVO.8?WJ eX@9`t3)|#ZV KL ]$kGb>>b8pu}OƳŏ Cޫ5i< At>q㏃`Jo$ Q=d>lnO\{"yA&jCM}M$ Wܞaoo L%@V8n/ߴc)C*Ǣ03"^vƌ":є;Os`O&FpU"qj3;x9e(K94űVN7+՛ JצI"zR2. /09᧰$;8bX+^UL&pԆŊr cac[,M;? Zz`-m>MY E*י,J,h" +[Hhg\3nIy Ct ] h^؝|Gߜzi ף\ }8lG LR"h2=ιKX2}>[sJOj@w3[g=xP!̓0Ǡ 1gV8'(W~x98?xhdIf^t/nbԎ%=Ҿ;jNLdTӼrƋC5FYJ~ {qq#<יWԉj0fXP]/Z`XI<.fS ʒBȿ N\rgn@0$q2 #9.J/ 840,  '6ZnCP3L@ Oľ'ȗuz0AYj=ѨxhF؊.o8[+kؽv&6]^i`-W/~q;J!N]Ifz`}&XtϟQ⊼oӒKo)HDoI@1 Q_osn}mg{{23UmPW=+mΑw(cXKے1bIC QB/T#IN R_)v/1F9l|fc/%Z1$==CK%j,`< O"< gsVf؆U-?7"~W> Y3 čIՍEu= `J+бRs-/jmfqC PrqZ0)םvuȱVB0x@_C9ɥSbehF qm=V]uB$g֒ؗƴj6qB}; ֔q0ЉpVc^̽Q1-:F%P FV7w׉2mJz| x%_f?GoYl&v7P'ri.+4-\(]xnKkI[̏6g'doc.fgKAӅPMC.Fpy0uτvB RTRud:GGEij5 7SYs~t>r|w*U*"T-X'JE4=~'jҬܫV`zNH2FT-={ ~2;wbtF"0_þG>&)Us#ZpY<|;8NqW8q<ʔdSG388!\%jXD,\c '>,ߤG!(loalEzݮk M|펳(  (>I:cز I$LICw7 ?-sod\o%'׳cz'RHkY TmFydv#Nl{%zzV9`S6ΌŒ~F sg0ZM49ga # 6_G5S/(Q"F 8周+ڻE.A^@&q+s s*pmOIUGu!/2k,Bb`y~6YgA렚x|CW_EĪO#łҽARP1l[Z@[j17 2%z<^\j%iƊyRij8pOLcƎJ<\J2b DuOc 3 xy Dg?0N3a,vqYE'ψihnq8GACِ%i4t):M `p2wِCw+RM!I8?UY B6i۴:Sg?lŒ-Ƌob؊P҉~|h_xw߃)Yf/c[ո7p@ǼgP;=$[)4?IS[EkS&dI[ ]ӯ*Grjtv{^xMu(bgSr~~\ FPwb*'(hė<KO='ep /9S20ޏKb$(]xW[*fLN8}vy[E8-mwsEBՌ[~c0E4H>W<[u^Gp/fsIt.6i)I!q<]P5p0./==LYÙ˖bY1ī+ ]qLhLϵu9,Fn!$5N*SCj`JÙ:k[zIoP߫_܇}]ދ?UU|gxR7׭mMt[}]y? k|tY|uwNe?~~b]#oW<+{?WFU^?CcBs '&=Mn8DCiY#*=?_д{ԍ)6ph!a&UoD3>/%*NTbi+&*!LmuAbKM ”@WfP{ew1jɎyS*]&{Wԃ_h D0y"=ke@-3<KԤ6{I{O@ʕ%P^6Cq|X[ .A~:$bcZ8xK'{:O:8^'9ҲS%!TXvorGҀv 5#?~A.rJ+lb'$zhdbR*=c,t͹+fىM9~dJBq r:m-K퉲UanV>R"8 !W)xa0o%YJ9J_0PHC??"yAX;&{駌Cv=2obxյBd8/=4Y9ky"‘ߪ#ԉ8cbI,%(c-ZpjK$ r5_=Ͱ;<;:^^,fQ+E%db)ntCw̆zӔQ{>ne0 Рh,6 f:p}J|pZ4*Շp3ocSB3h2۽@Ӧr󣺉G9ۼ@8r9p'}F6x<}5{{MSEm1/7suSSv0&۳ϭ 4߲x݉;GSղtt7Mz 079'ZP2Z_Gx{TT(!'s];e1Es{o0n@E&nH/5l?}0:X}?S ,b6J8݂gӃl Ub9!l`-AϞVWb)~F M0^t.? f~{d#?GL7G瑾P2?ƌψ ׫ڇ!LK7eeF}h9$R?6nɋkb;Mr Dd&}SDF1Fc.iFd8BoC&4s~ʃ9gUq#$ǿVu 8%1N}?R.W N*eѾi~R2΃u/'u+Z>DNT2@)e Mz*Ggi~)-_ڢ:WcrEa tA^+F]lk'Z\* S?~j{+%4X ޲poiEȜMX ,"'B4&kf ]Vq|g,-N7T *c~N_ +efۦWqJϼ2\6*័hAJbF&/fZ!p>e!2X|]%-Y,Orw(PU 314i+1ژ&aϜ]s@ّrڍȁG, ENah:)k}}uP-o-l]e(SXǧsKg%LFO zvs m\҂P^eu.8\yFaLG~pͧtM.<}8Ok՘t#s@8:ڑ٠^.c9ع? u{׹cm>N>@w!NN*Bڏb Uvo/!7s;@ ߝxn^trZH `K]tDezsͪ M}ecPi1?zdEY4Tq(z3y߃]w Ȝ:`R[@_ޜo_,k]\pٴY:1FG("M4(~ϝq/ ƃ uS}:JC?;jL<#Tŝhy;>V:"mcS?V24b¬.Ũ1oa8ݎ(lLFH2iNTI G;vBf;+*/`y|Hu9;mHo7igbV= C;bu5 AdAKuAx,'ݨב PnflS<۠戽cQӟ["jDo-'0%'3yTbEX6ڶy@8!@F{懺w "fF.KT{ٹO0鰓#)'q'͍_xɐm%Y >4 G u,,s] ޚiF7V 3/0j ]WIN%: ϶5 ,AZ+ 8 Y/ $Y\1tA(*Lpd~*0v%,' xGR A^L!kJT:F7#'D[r.G˩r"/1؅ݾj3atuATR-~6Sj 2=`P):pY:AOnD9뒊[tfbtV d !dyvܘ 7Dlyye\ʗNNjr*/6/PoljnyjY1D!4 .[#-;6*Z!Yňg s7&w]EnkT Sjv9e6pz?S-uZ[pΒVcq8i g8;|.Sڮ{a œp ո2+t6gv\5x.5TH>ciҔė'ylRttdLf4XGc"~, @ZB$!vVE-@pa`b¾ n4A[.LJoZLbem XXR'JX{vzx5e޹вߣELV'HG~M”XΰS g%saԴTOTN=|ED‹MP%E!C mԐ6q r j,$c6Fp}@Iߓ\ vS٘M;pF^ϕ-b->alW$V8 fBtG[p+󌚕էר#f,6UƗ?Kzai$+1VQu:_ 0A_r-Ն{Kp$GNfn^IyOz'LԴG2ߗ*xaR N,'ǻܗۛ%_*X bǒx` lWDA l~+ ]^(|1f`a/UϮ29 b B]-^Sj(`RSD& .?pϮdBS`)7`.zi-:AS CJkkxEFz(hO<<튷 }xiΡc$zϗVa了 Oz_3>xx]Ss6,[{ Y,K.{ Jh %S60HQSRtZNʑݕR9,p%4>Wc~D)FOF 3vӟ[Qefh+~CUXr'%=Yow^D|sTg3YM(Ƭ͆T޸`M_Lk_BN,M;s~*SH(w2*CHF$r-B_ ]S$Jx<MQPM㘃=ľ́.K.(72 i{߹0;a<|+W/iPȝ1>S@BPߞL4_O%#:bD:˫ ݢHAlYƨi)xP֐BST6t4m|?6U)eaRqsL{"L٣JR0}8 `is+䐖M6/>xúʄoT!T\H[bR+KC ~V%8H/+NKw u:\M;ZO[쪄ImfdkG}8tYׄcb\XPo؊}.(3t#j(9T=]'^/`waHؘT~no^mL=KKOz.99;ئr֒ɉCuQ"ORRJm/8䘞8f3_R< KQƍ[ m/PAAegl7nIZb4M?rm%16#$r6^f~1(ng^$YרjizƺZ 7f ;LsOO;ٛY( |Ck\#dUyN[*0ań˜c!tchxRuMai7tQ/U@$k56# h>b j5Y&4A#=}9S4A73#d2+\V9}LzGҔq~p4?;//zjX/yb3 AtQXfSfXs*lrxY 3c/]F`^ʩ?QJjk0ݹUfc_'kT ɽ9t4" ZuK@b@i-zVfɞW=KW.V{SJ<a!G7̸f_jδǚG=ا"]%45g?xJ$ć¯W02d-p"OͲ }]LNr:mD!zO;ʘJ<}fջñE女P-踡8>ٸDln?QBf\q195k^>5xtTMAO/D6I?&w'p4ڹn#V!!#sHE8c ;h0q?t]6G@6i?!ԫxt s& +$H<{{q5O{t'[0vsOI+ϙ-ީGNT|%0"eV<ӁܵZ4H-mmSFs/!jJuw:vA'b6@9￞x[+V8M] U6.3{Wt"$R&@Onw@]JMuK cyyA ڄs8shRwTu9e:ԡ0ƽJ'bqEgs9rkP]{KLI6ӜyjlO f@6Me)#lKzIK{w pm3o[`duLeX& pzfxybsUHޔYea"4Ɔ(6aZםj-{zWAwDQ'3WR AUOܐ@)}Fi[5"4RϞ9Zq}/u3A"Qp 闏<(4ufOs5DdW?YGN<#4<_3{N~ݔcɎXLkgPÞ/wVDK-H!W埐i=R & J_c_ _ҩm2t]gm%D@\uGfNE >~d 3p!J(_5. r׎‘(SQެMi tQ[{tYHPNFLN.Mez[u{nR0_P ËVR)`ع٤jI>2>oKL rsk w5-X?4R5{ՂDfpڜ()>v87yt4 xeɐE*m\osᜢjGς#DµS/0vs« f fg)cwxm WAݝk2g3Ґ g R]\-z@zd]~q ^:,w?޻ݤ51Y%Ybj{ٝ~%rװq +bW"qL:%Hp)agO9Qu^uKf|ll@Odb&Z8TW|>GU^IuA۴#q-D*wNS5 "H6[pVRz"zq B=OJdB"K Hv@ReCxG6Lם)Һhٔ*l6ld6Z=~>IcVz@m7 V1Dܜ,Y :D#WZ1ʥ l= "ަũkuBS^nxS64,gY?[2Xt\n2{*RyHMiX]6$KT`l.>xfL I g͞&wIў앷EMi̽{B)"QED{qepg7PR'ݿ<>)QMuTk ظ DzgTmv-Ku!ls6 ĜnٌXTz /{}gh|IL~G/_ƏF:$kڙkb WEe_#hs5$ѭ;k&Nxf^EsZkc[0} HYZ p M0W Fӓ'^.ŤJ41iA>a;utvW&#KM|g0 ګlhק8Ik!E:W$R# KP)`X~%&iǚtJ4B'SFŕ.wHHg:CXTaF&;s ywrHv f)di&(2f8+h`wt*TtXxMC&pD${b T =K:wA/ux4C%tj?zdL1Oƨ^L:ify\iLE$"̘e P%dՏIq"Uo͖Maʨھ}xc>5Q^xho9wp{]Tsx ՝JOZǡS&{몞`5,g Pa j Op%:OhߡVK{hyј]f:e_% f Iq{9 w3 Ҥz U]6%x/0ـZN#[Olx;{z?_e2[۰h edU ۊOkr6|yF!LBeƝ06BK2|Ќ>=FGcq'w Ҳ0 wS]#eڱ+uF$i$!;CYZgPO>G< ]Uā7,\{EGuHYVTۥY܇vQ;Zmy߮w2l-L$U&p x!v*I4*})Ѭmᛔ˹ aA.jdAZ$+4v*I}BKM{zÒGJeE>. ],;q[XJ2 Y?v1nDUqZ œx|S4cfńQcԌpWj D|~w)f-÷cXkVwBp? O'GBDM&8[O T_m(mMl>;zؘC{i+d`hڟeDK ˰0V_TN$كV F ˳.-NVú RB5KO}aX_lRm?ekLL6pN8}+[|[GK\=NN'_K|wwV-B>mt{Bvo&'f-^t…}- 5Il:05h>Q+euJhdžAϺ($brR*u i \9QOLwrX{<-U*OB7ly ]ZN=O7"Gssi~NcairfDOB)syGi~mt۔H)7FP>uHt{bq넓f_53hAE;YY? )8O-QH(v|XU|!-C-"ɃZC=O c;EWd[&=E\v}I~(*ukH< eJ:&<*WX*g/t\.irŇ *(I;n m=P^q"J.2[ֺhQ@^Riy<ulO왗 ʱ]Ihb k(ǂ- <촴zF\tf6G:,}&/smՕ98( Uu? V`ˇ= \ NՙLt܄5w%0Hh#ǵj?w#qތuQHU rO.p&~""Z8"6/r-}]?At=M i~-69p?bla)TÝVn;JF=i{LYrPh ,^KLCWL~R@U e/E{z<ͣ!e@̚ $̕Pq~Y M{*dqvq._oș8G$d:Co- "|c ۼN/T^֬qIL{4Vp!ߴ Y{S>bҥ(BxB,0XK-2 k~(toy w=6U-ByedCӯ6oZ1~̙c l@߾YAS*O:!,F5.z5 nQk.Ҵ`jUE_g BK/BQw$e%,#dYa("­ TqWT7Y9`L!]E!lf*X-~3{5]o/􆌨n.E:rugf [+:T&CyҏvjJ`ZbW )9 yb )<ݍa@9jY.'mn/xRP-TpC"`a4S2`NXj\3y>g}( %.As쬓!MsyvS5FKGcw}nԺsq;?p19pz ~d?B EK줵Ņկ }U+h0:Q7~uvq> qT3=ihۖMΚA}٘ Hc{Y@> Ch0̵`,}@P;B>rid'kXQ5yM}ъ_qaR"*@wHHufS 5GF9Zɻ3!~+Yϑmڊ|RW 0PQ|XV'e)kV;@x*w0K,>E1?vmFdQ(L)kS!U6FNj"#;jԽ#F.mD/39Ż/+waP6S5"jJh}viUM}opQa׾"<9p|+mV]HI)|Oj 9 eʼn&u:i BuFιi 7g(+}TyWҀصm WQJP-'{!S[ Ӿ vgۋkYRs"+^q37Bfe<(MLU RSjނLi5BƲr[lA T"Ѣ#eR*A2y V-@][$Ò*DFvE/>'Z(=S_. EhjqW ENSv1N<ũ셅yorHm6FJ38Q Sq=#6Ak6#!Q[qUi,L!CS2xU:ԭ+W^0bGk%({j8"U~vkP`0x߈I|^ 5#_/}ZM`%(+]Vg0ddƞ/jT >u,Ң1G󱊳7jrO,~a0žݜG0ybp3thS4F՚m=h-bUnZr潾 qC즜ObGr{^>Tnmmɧe4G[͟y7]7RʞCz\`L,Zf6 5*[Umӹ\\KcS;Yi>>Ɨ՘0e?5Cg2hX^R] ;]HD~TX#+zheΗW-@>v?,o/aH=_-PӮNx詁qdԩ;.j s,)"@RSַWavLOPJb$x2$r4QyRGwޏLvgIʼnf,gב(yH֜>o&Ș8*Sv9y{bUH:s(S@ 6vۼqg6$qfE^Sڭ7ˎ*=Q_}ײY1>yYEg䢚p/=;y"UOϯu=5 ]ˣuG!e; ydUET4vD~:#隕-G>*7kBM/fjz E)CxqBڽaJ(;X߳u~} cJ ZT֓ͻ<* $MMIa!jI7WI?zKG ](v'=?bSvTe>-zd٫#]0 J6w.F/ӥ]8Њ}rfXief9YkzԨZ7 rl{5.Rݎ-Z~-AAJoDO-RZ ?H e̤v`[T<o5vUKBn1#/aZF5ma'PjB4wJؽz_,֣+!dm:[fNEgQ'8*T%t6m#C:5A:δ]=noH5Pv[.GЭpĸsTK&+<=YI$_eky.MVf|MCH#\Ky+{I$|hnͿEVұoD)c ;q?Cn8|/e/|-~}sz\iGBZ)@ڀpkR+,f>WMf`,+|-xzˑ*Az3-9P3VR[Cӵ,m{5$Z{eŕZggk&}p!#qm+񕊃+i {)S<钸9D6W%ȹ2仰 υbZVn(KK_5 N~ (sGfö́jX4dϷfD6ME%Pߢ62:yB9%ya±!_WgPr 'FU߆#^F|5LFpJdCHۇpZu{ǰ ƘS=Y^ޱ/iC>=RDi@J:M69R ww;M&-<$8]_kcnFũ+ضCp ػO" F&l% J5 N,r똂RΩmo(4!l6w4|_.SëRfCDEdusl)Gnmm7VQTR)hE2&YR|nqUct}ײal)j M.Iܯ_r,:wWqp,1zaZXp?I=VÐe e!37~l,LL}Џ4wyQ6 >$-jsqm;!/c[+B`nl_FT;ƷZ= _|TRwbɋ*!íe~Ij9nnx7M< pQTvoCjY0-wn6!-r{qC^ TĭDtKr.!H|ΜCpž$#[‡"|ZAzC9'߯w"ZkVhj=D_QZڀj_0@Gm")H!I)NF}1ed9}9~mǯmٕ E!MLQkh:җ30L qR~^ܳ ۃܑ巏5yiѴvB.h@W]#\lwgb2NTA1>VEwςd)si.a!Jf ~fkg }>*I5l#֧c9ko3Ivpe"C.g2/řzSq5SoxjQc7!̰ڂZq~ 6Ỿ]!`( bӖka^v]$G:D? 3NHj:&M} %!t7[I 'S,]Xe$@LbqfS"Һ Q0,_9S &xG4U13s-BLlZ7Rl gہCbA] eKh>6o97yK5by=p3 'jnJ3x>LMն-{Jƒ]80kO:N3$:(k폀EӅsZ%* z)Ư 4D37S|s//9thvу\",Än*yFcV|55a \X?pjwr9<9`! xrBD ޤ̀s^LTJ}Y3i̦ydSܠStyw;\iX\|̵ iZ ^&h4giRN$籔!6E"Rl /xq뫕h[9 U$E(CXAc2*jJKËMA9r| =O,Nl/*}'ec @[MlL9ZR5n!a&EJh z|v?vADwnf/뗞cD?ujh{t\*x|մ:jQ"0s[D݅n&FvFZ-~ &Ɛ$.}Wa~Ja9C^d(޿/TrD ؔsi,5.[^QuF%l]eȸ& uL#u7 iV EB΄'䦁,?CȁwnwqH \;%%$֙MӤҝYUg?c%y K"SJ5 àc:e7OWڜ+=JMFXeaJTV:\V[H׫ t*DVzJF[~0/wW.+"T7W!F);7{mMBNl)'ޯiAsbF TLv|21%djl5ǎ1dwWҗA)0"[Z3qbrF,jo!%Ƅ#ޏpYꁜpzI7m"[DYl}PD[7t-)8"@S.OfzԆ PDR,m >YUAn\Ɠ\׊;77-4 LZPTxбVv1S|9 gQHmzy9D;Cx& <4SbouIMIkLImmx2xM} 7n%iށO@yڇ?goJt,!B[ *mqEW,œb/5!$fdNr k߷Zdˮ3 Z(hs6D,sxxE`^CAGGQhN#:({SUPU S5ޝbd~FۡWhk+ vVq~V5nQ κrƕ>8&*.+g<~ c 䌟J(mjՖ{@-=qVRVJA"PH[eߖ8gP# :3rH_v9nC8پSj,R߈UIZg.h(-٢M;JѪPAB tOJ|MY5M )KQ$J~罻4t-L ƍ3գxz5(-,l \ |2en],,Fƭ~4''9Y0 ݩht0:z% }I?V`@ l=Η{g5}d_hz*;JZE( O* ; e5~h}haw!p@0*6^GH&~L%I֨nfkղrТ)1JնpOǭ#݈ 2D%*B_W*Y(>]rPkfvv'd{ S<͔ \Dmw8-c8in|DQi\V9, MfVp_VW"!q-{V gu:Ө劔z2䈡˳*Ew[J#iANs޸dcm2ᶀתg!G^TCX1uۆcQ2#| , i$ ׭҈Yo%%ZЙCLq"C֓m"vO+n_$=Cn%xG\i[U ~\CFugu YS/6/,sd(0CZaGq?U4﷮AQ(?*v@HqOQc/4hG;As Wg};聇89TTeW JD/r: 6av8ͰePk$%UUG>„i$O)^KfM|5RN _X7A͝ަ.\a:})oNMy8 2"H#k^/̥E[g15avX"zď+'~%l֖7LӶ Z~y|#u6Z,Ͱ(Y>!+B _řZۮ@v#6򎌞l TBŅMSWWY .@,k9:E~U*?hXe|Gj٬!&&eUШؔ Q3{Qgxi ˂SHϞv.wmԒk~C=%ʍVS A#X bagJUIC_"w[+^> K6% Zh۰Z>ȟFxՖ$ۀpK0 3\x>QrUA_,]i)\o4RW|B&LA/<`rԯR I60W6 ǀ9?0`jk6)_0,7^(^wIH0#F6"xZGY 8Id]8|xĎtf)pEVB[vƄYbm Xޭ}H*uH87m 'd Ҫ73IКiËotn<)(+_z&H" v\Db0t'cs\ 䮫_MX‚%Iք^Qㅋ*Po< >K|@n=ƍ(;9Ab:g0x?q#&JJ%<.~ǘ՛t}Nsa9y:ixw-7]QPwZ. BY|UpΦfQL*h#U,Cj{0I A9mi{jr=5qR/>1b8dr) R96tj7MLK; ^'PtfzHE:<' ½/}t|+߇lc=R~U->=|xcᦟ&*[Uz]s~@_?p~}c~; &u~?W\CH쯾WUߪ~O3dK7 a8 ҡEрriXO9)\<z#5Љ_$8O&†k[sN[װgEQvk l)s (͡K (`~2 =9^jmm~Y[A$ e9 uG'Cd&!1W܅,j/( &4 RhC3=~0㎺TiidXw;{=;F`1_=*GQ-&=NE3poDޤ(8GsS_>D7̿@8ĒUƺ_PNA%8jZh9U'%oM:c^1qahpyf6ChњiOjQv >x3rܭŃy3"&+YZ֩Ȍi ?FL4( i N1 [ \0YP+wڿs40C㔦 jY]gsl*L A?*bG׉_ߘywj"GgVHt 7Зa{=nvcT?vtU3-Ҥ ^%iqWBdjK3{F\g @$QO(F8ӑKD4a.0,6DK ЪjO-1bh ;j y ʈ#3zPǣR]1k׮D(q|lcHxQsgRxh19jf !"Dj4mNfUt|Z+!Dk)w4!D#LB)lq:ŏCڱP"FE]w9=БVbШP29 jpnzt  Zh+yV1E[>.ۆzh16TS.i,q8.5 Jvq'@].C|aM½f t=u,\̃zW¯{ӻTvքC}(jJO(]N4bm 5C,殰 5 FaZ"l}+?奝7Ѷ%?m-rp^h՜̔#Lԥ=oANǧ>'=ge~.,2rڈ>w]TN gh"9m怂ALfPֲ6{2܅3zc ۢd7Kp Cn^ƴj7JigMb ,QS <~N KƚJ-Ae%" 嬹wFyЭvM2x9  t)qޜ^W&K 8Ik0^KcϨj-7''}|#MFF4+Ci)!"xbs Vs|ug.4Ermc "q.D+ VYR n!ڌÒ@5#0}IIgd~XtoZE܆-%җy^v %\d^xY-N!lB4=O1h|`MGˍ@~Ͽ˩*!8'(h#pDomZKoRdȝD'|=l|ׅ(WkȊ]1M"Q Q׏6<~*`ɡ{,Ռ431%H;vWcy9,3BRu&6LF@-DP{0KeC0{L 3'%~G z.$B{iom[Ѕ߉=iaױ( debIX5Ghۊ8^^ ɥQ2[MJ:D|I z IŒv[;ظgrXLT9,ý+^v;=la>xkC}+^(ΚjK{o'Av0x?>X qI\\|3m)fch H9D^]!|}x/.>}p U`2vm4*#bS1zg[ԤB]& Gd# 3h̅бf8h.pA"}F3Vqgk0U=~5)zaIKbT[v4:>+v+2&*yyY|h`:ٍ+Fe|sѦgXK[5'l}P1 @] g(?Smi_vҤPi2 !w}w3Aݼq&ua^_VI't4H =Q1PGCpY e!^anGڴ]yA1} %PQρ"!fT*2L#CQnıNT.)ùE,t.pɓ'!j$$LP%9F$(Ƣ %()21h*vR;wΘCMThn!ZO[)[exWI&@5.pVuF:eؾ ef<{swehfHXoHsPF7 m$of겅'C:1 0&bƤgQӜRtgUbhLtTv4S+"H sUk@ցN]2,qX;*E8yQ#}1ML l<R_'ngQ!tG<4\A츋JO~kp([0MN\ąGڅ6_u300lʅ@bSP|<ڪ5{%;PaE9؍_+LWL+͂6L.5a&>v޺w& ?WmQ(ߚ8'2qWs^AI?N&rqE,nO <VWc:G! MۨF*ΐ3uzo{h'9glК sQ%1Q_ $s5ֱ#ej0YY8jZ2]ӛl .!c)e@H9aOk>^FӡRٙf>8ژiǠ+xG5ET9|*NmTn%G*'@ӊsệ뿩M,ςEqKMZ0΃'Y"UjK" ܁v-#}9f*1_+b+"m,$'M/jASJo tX۳C"{hq-d3uH>E] `vju^-, cBćj//j*zz/(|@K49MݹݰBswv! ꨫN].1YHѪ H}Sƫvl3UFmHJ슪'iz,-f_)tUq ؂5T@D)Í9Hߤf)c&덌?}vB ga.'0’D~/?7Ж#J1í-sQy[̆ ӹ*I3R))J`m`0Zl~_ҵ1:S>=#̉q c%.cq ڨ4rX9B5#͂r] oy7^a2uxRt$n80pm=)>`kѴcN%W63-UrI;LG /`RD:~69JwQҊ4lЩ d碒S*$d^|Ylq h?u߬m鱜&ӍTOƦQgFH9xYMRĕ[~|\M-Pp!%o&p0-qP /%'ex8[4ieykG ݊2Oo"$]bYMkjR&mɧ\[',Y^`sٴ*!Jb9Lx"+~`^~4y`aaQS $-i3IWԷ bчka{Ϊe܀|aG^CC 5maƄ`KL<=JEO]bӥ#&p¸ X8|Z9b*iCo{$Tt .a小 >Ϧ<7I.VG>%WMD?H$ P\t.V)]]*U.ȚyN){MzBƐi=x oo3PRԏKXeɋWWBp^M$MQRd3)#oLqyo't|ΰ/;4^-9)I(rUQPʟ֙[W9Eq],z3Z`0dG[Y{xy}pMhC.-%c.FU*4KBF[c6Ğm\l9O7(RU>LEFZэU&礫 ibrGw٩q|7!ՄW9$oϦ4CX0  H"SEhH~USᥨz\DLsJn8|dikDtF1fuk=_:b{/H2\?o&_G qPLt5̋U}"Hp=,j'CDilZIM (50njj[t-j1cAtIAzם;xD^Ƹg^ L%ED}KqJRЇùw1wTp!B3U&1~9 <8fk-#E^.HV: \."z o؏N(Gp؇lZ `]%Л9ɫ,=zq>ƩA]E9|+h,hXx;\ G(Rf8HA^ P) OxXA7ZG9j,JgUf:)ۄ%cBcn K|Su'8ol7Pz$ړyO~ݕSR޺r "H]>8avC$ W>Dܸs-jD:CGUu{rÖɶlc(tHki@x_9e ձ ! )VKˌV܂z}}.?HwOaqӧ1DX%Qw,Hj N҈s Y!ףR(j{S8u_O}yk](z]%>y[ݝ} .5>F[UjN||=΄OYJcV, m*9p}f EZd1 R:O Vl_/fɟf4dqyoi4gDuIOzJ>=T!NtBO,# L8q=B$މ C;'^UZT&MRE6QW0ac.(ŨK%[=Z(L 7j^#K(OONgrW@8֜t#IT 򹏝y"ٳѝ?g/v a6#^Vw\[tfFpo~( uu"NQҚ&s=F'GarR n9U|֭h5LpӖi9M1q_mdT-.AD'~ø [EJv9*/{Awt.`)*KhY]־vs䵾Q}MX=ne&`Zt I /[3X'tc? ]%_7=ٛcɱ{xx``^?pG~lOFiu&HqƇ+t7= =%PV5hFe]B/U궪~v=|9sŴo͞j<QHJ4yh8{CވurVY}27ԁ 6F.)X!M V,SUayX!E) ]vnME\W³FmSD&r蔱{1:#rW!sWvփЏz!P}e) o c8q{ Nzm([z !MRs! O>\O?7ԁߌ5kD֊JE OhN K.ѼfܴP&u1 }Xʉ+1KFŚN.Q'M^/pW~ ~I8{#%]_wzjˊKUfVun&F/C0YS Q#Peij2Du <.:!X9Kooge+EW{Z1k_iB@@9F`. C˞1ua.4n< 4'!>"1>xț2 rV6>w0+ף.1ioK]8HQdj!z{?zAx]q(62a{tQ|΅s`rإa`<~g"(wZ@Gd>"q!Bx; oOqZP.x~v{tpIȏ=)@0af]bDF֭. VShg߄F~k '\0ę[!J5⃭˜K@~J.8v- E94zCn@7ge\,Zk⸥u 3 4 GV7ݑZY`y]|xy>vR):9gR%Ĩ^cmvt-C >-Yo_^ܺУ[+WZ ftmrrFp{=\KNIHż+T'@k"tqw.R^w(@Mv+Hbv)u1iq~B&`+!mCd.*X66o1`L=JzM% ?+ůgE++lcU ǹQFy~sInGRޒBlU`/6Klxk)^8=!wPJ;(tܑyp└p q>MT2BQBPJٽi.+ʒYeI. \ZId>hк20vpe۟YqcF>^M#27rHxY*/#O.?H .;xg =UKX\ ,d框ª)+ wmIK# ?e3 ^rt5 8%-F.{'J# n<Х?QWbI CUm"^P5'{AkSG Δ_krl>u;zHQI0p߈$ :LҾ6xpnUq"B&QGwEl:o`+@A2M{/ltJ dI6x Zdp1\]2~5 Ѝ<-F:S~l˳GWPUjeyxpRJ>De* wuRu8|&,w!%x)`%w~y ^_f#[^#Q.6^q'%.džTѭI_2eui#5c?xh]vEXX; h+_h9r+~&[@7%y2vQ/h_Tը$yK{͎y~ A[Eْ^Sng ,[ow$<[ )'驁ӥb"Zۨ9p8]@WfB(ZLSPkE\JTfyv-xU+ߞ;2~L`!I:Da37!(cvd,68z" }8`i U`NxºxX cw߿٧/UQgy&8»q~æ䣩|~EWR+m<@"wإ1Tv=[S׽qڳR~7b!!LL^nPT*65 [(S]ԿxE6x@Jj,ax*ms_6<(rxk|5;.ҒB W*9>d˒H, 6.\(&5P\A<3뫈 eD^vhTȟf}P$;xz `0nki%60#΀:zwpG53}~ m4V(ƺ$ TE)PE'1[ަw2? "oבM?W.";=!bj(Tn7\oijX*=,khx'Ix Pl {"ٱ(*)^Z]?XUg :"Қg8 Xˀ,o 3ELm#9Fl'3f? kO(M҇J(y,Z~XQ,Tm@H19Wqf/^G?07״$7`AonlZgҪTө5ҡHch#xURk"E>Ƹ/ۨ^:J&v$ >0 N=bwǾwk2H7)Kn/LP AGԍ_ Rn5s^וϣFzF?,mj%EMᬏ:/@$Gw_/dk su@o5-TQHd_ 7dJ_.]i4a #Z.8TuO%G0茢YwyMtWD*\ݢ׭Tk0*'@Sao H*\lda cl,sşlr#e!UOfufyo,5<+2frg[D|r8#"=݀2k"J+Uat 5e+&}>WwS'~[̗n}EBh0[lj=5.<v-3b*|@ 6 쓛Ib'/T7NrA`QSxޔ8cX$(^4+l`%gn adҁ,iRif8,{-H38Qg ,]W]vJHh 0e탻f@0D!kyN͗0-#eEm=NPc0MFJ4k*6xv^Ǧ%h=v EzXod"۾D("\0\zAiAz #{ۡMXG(EqD#X!T۷;8 IzR#G PŻ㮾R!TsV3,jtzEÁ;yZeʹ﹭8i"l*?@ k1w4uw,HGl/$sg)7NٰmMa0X bt<"$Twty M:LZV3ѐ󇵽iz;sF0xgBfHhqlWivl7O0CK(džmõ@jܖ E,^4$V;}y^.`\Oc˃e0̭XTukO'=d{kz@S=1bN\gX^LUc{[|yt3~m%p&Q3 -̨RLͦ/Wjer((y5(}!To1;{)LGKvA~°:@ Vaa E=vp@ϛiD^hknaB̐2S?@lkM3kPwdbmk9UE EW f;?9Ho5i D#٫vE` #5KA4$}u0tfSvhg)d1.j,?+F ړ{ =ӋH+߽-uV:P=EˀOޤ5 s>~E4~$"2bhn E[+eȾ%S3hB<: Wd`,,FA6Vy4~XޡxMaFV4+|v.:mo8}dCB2Lnc`谸Q-dDa=,>He-Sq+cPM'=UQL޿楌'dg]]K&ͳM6O tTP R!"oS"~3SWNR>7y*kvQZmU`>.2( iHkv<qѮ )e:qѦD=ml3+Y~ o36=+}^y|Yyㅞ O9)p}4ݗs2#63WwdZJTzC H>#(b`[ss6^ek -rA2YAdp;7).9&U!1 LB] _j戝G8ԠAGhs;i! ;djv _ʺJ}~<}LJR!p4]|O3+E4n-3TqL\r=% IQyb8 Q+l(Jrz:SjUeAD3|q 9bNJJkISF}(ɯyP躆H 2 ~Pbf53JD YN&!pS B;Q-b12C7 ym)k3HP3 9N1>?Yw]!7&'/KwQj]{_0h(^ p+UZw2id)g eD5avan]ʟY1W#4BP .ʻ`kj%|eBz1%L\ 0L?;4,#4 Vc;ljgIGr["(Zm#(/>9ŕq@JZAamV+Ǎ2&UAȶ_me b. J D+0 N6{E0GFL =fĬ긯U;:Lj=!)綩?ASΧng?X1cQRkp}1U콇X #L{<_c=`[wq$(z{,aY;0es/P: ~e1ۅ"=yC->4mmu=t `i/3j-5'#:`.Oy""L& wp[;[\(_|-rMNaa +"4HKx 0&9e$XbK)qFWG iv\IDr<d_tMpG`d Qڂ^]e%CJ f]Q9/!'/ǪsS]{^^Osŕ Jj}W@h|\/ҕ[$fćC)dl[InSg̙(GY'TKz^ʳT:~m2)#fj9Z5Q 75&N}G6QZdTؾQ^ŃVgϲ WFQ6[j ;XzJB˿8ubdz }xBtWNA?"i(ӳ7 0ZӲ^+aywxz m{t^K<\A2‰26ek}G'q-Y{٢c#o`Hxg,=a/fĊ aޟIs`ϕ7蔖wX $4(O[hǰ1KIF3O!PRD]BF S^؁ڋ?9Su0$ĄT'aQpæ{UCTL#[tB^* %I4O=4:eU웱haBINtV hN{k:2 *6~4}:,#-9eŐg ] , 2P% j"H!6~e`NY\Ҳ.m%8?{CeKGtZUG:LOQwJL>N)^P#_;!k=7?G'2t!(=хhBB07isPˤjQG, !~0^îZXHHkt9%TEBEn2HDU@GtF{]3ڵ<! zn =9I)*o1~`;S-vU3=Hz-"q P@mG$4}֨0tAȑAxƏ7W,RaPxRF"^T)TLjLejh:d1 foHq0TBQgld7 \?b94jĀ1rƜ!2}OMB8%eB@f*4 4 VgުNиw90!B$CR; 7S7N"|,,j_ % 7SMoh;Lyあj E3g3e>!) aьwrVQ?uS/G 5j ]K Nh3%#EGm*p~Q2ކiŌQ/yQ'J\ŖPv?0zLiSgU Ag6~WޘO <`z  %ݽ M_E2&z>ߪ|&cnҙRKҦhjINdZf`LK~)X#w fG蜍#%ەUxԥIa"`'c>nUM":o #um Y~vmГ)Ӛ ywȜ׿X.S/QJ$WUxdix.K+~ V(I7}en;p0{\6tHk׈x~w ]faAj$ }(;3,tŊ-6" GC}GDdEq/"R1_Ku3Ƌ_r~YatɨgZnKirBMwHwINĐ/60yFɵۛ2f+OS:8Pi rjv\ ,75P1px`rN"V $D+Ik5{:%c!+wJtdu.x[ znnGЪlp(H-drXE`WɷYs4qd  }][6%L ȍFyDZ'}lJBı/멦> _S Rq G!XO$5&iKkdƝKMۄ5?YkXQˆ?]+)@"Ž6}yeW< P \gֲ2.Ǵ %:=7f]#{I6}fafy)NQw^ 4.|2qRx!2-Gz:+i6*]N{sۤhan7Չ\SN/ Z$2ohyWyFAzdsZp9GC,*5y Z2*{.dZ8nERDRr'sZBffr?)!b<"۽QxB(X.>eeyKб^f;2wDlo.cDr.%r+҂<[/tcMJr괷Oa9Mh,W6A>eX^/bcҗ#wr)AYJ&f,Q7ROfKQ Sմxg6B(~*H4A͓뉏'/yмqR 6c z`K@4>Fh%9=0Ds)#br%h[Hng6,{C KX6@4X=07hw:5 :@oԷTifg!!.z3t98f~澜y{`ݭcde\H9{ĴeFf!k-Ye}9 J[0j"%y!;`ni!5K}:UJISUq<=x"pQzB) k`lip-zXƭX5o$' M{63][> .$XUPo+Fpٛw_p8ߖ4`$l0/Bd8DZJZ\5.M^R5Y*’ YUg> 0i:Uٕt5j\B0t+.` Ai hm~D)𛓴(Z6Bw{exBs2XS=t7t,Tl,MeV~|A. 1fQa[˿FqkS-WΝ](xkBr%d sz:T$;JP%G4ة)]y]a!A>tiaZ%epԑeqJ7_T?jðRw#TgqwzꑲΗiξHMAsrn9!{w{SoUsT54qzVo %3z͕C#[d9޵uH͸2` u#Fr%6~'Ī60[@VB!1;.+MY.h b{qph̜TubJ.|cR^[zOUFiց:tAH~&R>-f3զm ZdBK9}H7$y Yl0J;Ǵܖ􉖍'\X#[wP\v/WJ~%(Htl9HFJ&\4/L(W-K?9?MpN8' 9 2aHCIrl:*m}؉͹?,:ȫX Ar;P/_ 7 :'bp<@֭AHAZ/~q#>M}9gt0ϋ^d{uf|͚ Φ xAB{h:vn&yxdӐbeF(;‚UÕ0y^k ,@9B\km8؎4[NW;Hy (Nyp[ RsX"sv|vV&:Py@,n- 3p:9e4E4?F3w4x1Brɐ$h"ZyC/k`'WAӡ z|b0?6|VEDEi5oU$l,ml^5*;dv@J`3 PGf:fOndSU^w[b PP.BOS5} w4u{4:p÷-I J?_\lVzi~*Ks!~gHO~z=@M$K,}T02$nTAqԸk*9]mՕo_T6qJZ菧 ]D81@*N0`bNkdNd6!kMokU͑[zaLAL 0tmXU#~5Lg?wa"nmK8_?|.Fl")ܥVʏ0hdbDyWY:.g?fʿG eX yUU{=?W`V.:55Dc\I'Ӓzrrw(M* C6)RۚeR?B!gfB\ /h26K:(靼 c&K̠[Amb} |l$W[$o_[WNXùsьnv#c EkO2%́輪/cm.u5֒-~Đ1n";GI*էA/&4153oF>͍xWQn>jMnoօ;O@x`,1<(?vdR_Z%Q [A_Z'jS|לL v>z2W-`5(ӻⳛICSmxaqOr,TBsOU\՜犰cLqԮ2-;|Sg絊VH ,v6>sW%:QoѴ{Aozw#d():(,`*1LlR5m&8w[/@+K5B!M_{w_EdMw|TB~[\E-kceA/$^>QSE̢~`9)y*ىeدQ‚>xCYyS8M/DQL,I&C/S!w rjӜI_V;nTDrr m^JH`̼M'T1؛JfWi^ J ֨'@xW8jP}'(/Td^C '2&s݂;T]Je=[~-~+gpPD;Ig O")6 9A^;J՞>*p{j"^^MNQh "1Ģ$_fR#'06E_ ]l[< !E$> Њct8Mܓ(bm/mܨD7YLc^OIlyʨq۳DBXIӢ%9qD|'jvgUTVVy]ŶcȎIv"κ,g%+jXӓv6(KRFJC>sh$ѭAKBl^蒈~s U_u-dr o>odTo6aGuZc:z{9$% \6:T4c[^ʆ& и,\̠I dH;5،DқhbUllVoѕ;Wh>BEYZ+Px6^C neL6q֤^cn4=9#Dj5pYOp'j} s<4-sS1Yk+ E>+ |.\](p dYatMY7֍XݽWьqF]_x#A9QO R9?\|0;Xj.d>Snct69,{D9@1Ymy[fŒdg}=اhN+&/H@[hJ]-{o=HLԚiɺvB[-D`71&)㣀_M뭟_]*LWG8( 5bjپQvf  TF]ʓP[jʔC2% Fٷ" MRNVRqƝ0e]u)m?$އgmy\&o|| t2^FJ0HMU}3l cJ7jt5]5!ற,R܌{~PPOny;gU -҉ qͩdpA1Ț+b䵩Q<|[ #uNwk}ּǽ'e-۵I2+໬TiU3*@9趿0}Rtj}x1R>ҭ[́ <@ YvR5-ň* ΀'pnRqmj‘e\W.߯Ƕ%^"|jiI?Kc^K._?5D`]NlϴȀsyѽ7G*\aX-BQN,8>b:;%"ę! /\u68{DbKG޿@@v@hYY D^ӔO4&NM-bSk? \8,2uKm wamݬ|ʼn~(Ę{jLٮ6zߛaby@wzwUҾtN8{Zfl+˾2'ʌXhcGVNƥ (UqQL9ߍ9;@"}ԥ.*()@*PlwLAÒ`=m5lD^uZ_[`62ݣss$]+H枭6FRVT.jEȸ`pK%ksdq//^ h9&6Z7@PHfAɘ~73#!o~I$l VID,h )WOU5k~$E3/i  vE]Fl*oPHFuP2?b{~xB%Uj,nDD8 R-؅,4XNxKEd+.X B+rh? En׳zoP tdL@p 4÷D3|a=D{x{VHS'7c:8.\X@nK;0 __w (s3Ԥ6҈ ٤}zMtʢ'MGzg+|{ [_ Q O|0aR) C_L6S9SFSOlʼB|x$ pQ=N20?6S4%*5ցwTH; cçS߶/& ")!X/& 'h76?3OC:t+VD9ң}yDj7y3'E\1Bu,@De~9/;"Pr~/նm7: ތMЧ%hho3$v@{Q5UpD;U"؉Crދ2_1 ΪY{.HF B>D%6S}d|9ꘛjKLȶ;2ƝЬ|Traxsց'/]!aj4}-obwD9 |hM`n=XJV+tvTMHÈ(RF:mV'>GL*,9 3-D^CWdPxF19REwF(γ{.B}ε:Aڒ}$?q|X<ϜP41/u~X1:DգV@F6S3C3g i4kT'򇅒=Ͷy`Pɤ:,b5*Q?syn1,GvVE2I.л #{ʧ0PG@,F(SȖ N>y&6Rv<2hmu|@3S%^ÑwN & e}{¢"6F:qީGJȅ{~x6q?]cgC&.)|n@+cT\`|?4)*n !aƉ^pmۖTߐF~کU=WW.997*XT[{#W`hBeY\9].UXh Bh"ɈmiD62k 7q@ZJ o)񍠇Y^.7%.頩y䋮wv6EN`/0pjxdm_srA8oK8!qtiÁb}H='ic/o4JľXaP"ȧ࠴w M:<+~ؤKsAhв/9~`t(W0BV@C{7"슟( !DQcy{:UQ,zwNK*.ـy4z"K]HPC!`4@p2uNsKBfZ{}.ɕ CR5cҘ$1@H!LqPWi4j9 $5Q|(&S%Qh!;{QZY%dy,OD;2.I:F-cC׷A k}70 fn: TWôo'@z_!:fD!sNJWM穔/*|CYϱв|c!2jv^< vr+|ӻ]ڑl)<{?>bɎlkЪV+n+z] ݁M{ Q2%T@=RD~Ub##dQ `H= ,b(ۖS$Lh9Q޸:Q0yFmRl>UGǷeAl:tܪԋv=#7eljc#BFN ZY7?6NIuy4uxyj5=<*j=ڷk@+Z,gjiL6Xר4 QFwNm&u!B$p $uCԜ+NivL'G=7T;k/oA* >4ɫ9"B] % I!\ "m:R|{ 9W m$~ UL%}J3NI^kbδ ' K[ RVC,pJ<#38Bo?&|7vtQ`y q -'҈D""#gTm%T7' # H,Ϻ!YgˮFu-+$͵PBF`~}+EUƁ?|\s\\;E($df[nC&>$^6d 3+_J븰f++pMC-RQo n¤Iӥ` ]dN]46iR\hyJ5*kVQ=U. r'6^LX-@j5D#y/U9@EOrT#k;o6\׼qޏ?[lgqw8*GMЌ7(ʕ*ҽR0yOhnQ@:MXKvq g 4e_|ޜsnLq wЙW'Jiu^,@5GmKp^n ) ObliڮsE :U< mLM,ԛjר X$p{rV-Ҿ4vu]+0î4+W]Yl\40dPHiW͢@pJ՛"Z({[aufhn\zT]i!5FslWe݆ %phui׵ƯiA%Ht i ,O@tPt>/˶Ɲ^( r"lOBNm'u+dljPn`^: Ui}@Di2Vf`ЛrȶOkD|M$Aȉ@ʧw{D2Ȓ5G9O?Ak𷘔p;cq7z#KS#cO7ѽ\ƛ91k$HfJDB_8;f8<1n4ۀW ԑz2}FJoou}TB_X`K&N%ں_gxe>'=CnŠ*lSegu qYf>|M ƼwCd9{ s zs>b j$z < 9?eGKblR+Kf c'1X*Z3f0V-z"Z $T]E&a֤rulV!t9O `;w 榀-i(dXyژ Ɩvi؈% ݳ,\g_;tpX(*XB9N**/t]^&Fx'% S@ /a93UP4Ė*p2*XvliVE4iܠedB@Qѽ$1˚gg'!QBLhj R5n4+$|Z&8 Ӝ\ϗR,v7兔,w.)HS#aHP-Les$saU.Ss^O)}7Hm)EA3AF)gz4d`gt1.0UքM,S =7[|6K$l8vt2"5.=c؜xgz̫i:7nmfi>+*WߕH($Wkhe. L> L{%>v9cv2Ѷ'(m"FR1cy'pR*׭93FQv~s^/e,2k+>>9zg=3/=.ҟnĜ}F1_ZJE`2x~82ԅ5D/e<d [? 6D\_^P&)G&=;l!y ӤVgKCfVWIjc+и@:ع""͊*t{S@v ܜ`~iF;ZX;"gJ,k6eC隘/a(>OU(7AmK,e?+פ>?@!4e] G hIR^)rHOVWm'P`Um4&jt\ϹY^oxSrzw;XD}=XB1^ :ds% `al2]>~+^,m8'(CPːw]P3[Љ5ȔgLY?l1[^Ϫ}2ш0-!l@}TL+Q,{WgoT ^p6GjMJdFk`V 7A a;ʂdD 6}8WZQÀ QWDH=*ݼᨵt=Q_&fp*M܌ xcgWܹЃ-U0'~@쨑Ys #]@)pPWULg49@oY%d2G^=aip̦YSA::K)+H#«[.W֤ӝJkF N<SP# ϴvꃟE97G4CE֙t j:G%e?]lq,wT+(˻ (ziEI (*/+-)1ֿ-{z{|{yJHIC , *ѵ ,,؊q,o$-}F}'-ˬn@(-ϮdY'o-chm)+loU+-쨤\1~*/+-)1Ի-{z||{yJHIC , *ҵ ,,ۋq,|X$.W93,c&0/Z?:~(-XQ2.0&&o->;3$#Uc),^,-^V,,z'0*/+,)1δ-|z{|{ys8mkSQRRRRN 5243303,3.3.3.3.3-4.2,71il32 Մ̬6̼9߄ Ȯ7 ܲ3 ޺1<Ȱ6өxrkqɼoTOsޕ)!6L^{x>+l}rŵ­Qlջ[BzwůwIBwź̵n]@ιƶrdols{ËwlUqm±qWv|lQƳUM4ؼx23:Oa՚|\~uywxw{yu{vtv{wwxwyuUՄ̬6̼9߄ Ȯ7 ܲ3 ޺1<Ȱ6Өxskq˽o[Yޕ9'A_yI7us_I\׽tQ;mnνi@9lyةôra]FxtnxoxܙWVg{m˱果rgcT{vdd}pZin`Fܒ|KF,m*,3DZՔ|zw\~uywxw{xu|vtv|wwxwyuUՄ̬6̼9߄ Ȯ7 ܲ3 ޺1<Ȱ6ԧwtkq˾o҉H9Q}ޕ8"(7Y6>p3:MN+s7O?R0EB0' =uj=J@1:<2*%!ZgCA;@D;41,& Io?Zc9842+(4;Dk7Bq?32+("Sd(~ׁ{,*-;0+(!'EJ\CↆE22'$'!Cce]o74.. ig\xf5P= |L|y~g- '{κuG3Eup\~uywxw{xt|vsv|wwxwyuUl8mk@GFFFFF0|sit32\] Y0  մsק<ƽKަǺJߦžEߦBFüFſEDýDDøDƺDǽDD¶D÷EĸDŹDǻEȽE ǽDɿ F"G#}qjklps|B$øslgfb_\WSRUb|AŻtlklkjjigb[U_9ǿ}trrsqnlk mopj`Z1~{zyyxwut`ož~xm{'»xO 4$I'ŀĀ L&×nPA;@HO]rσ΀ ǽM*ٕX1 &09@GLOQWawՄ PR:995,(.3:BHQX`gkqہ S+wKPMB5,#"*2:AHNTZ`fnv|{z V.yZaOE>7/'$+3:AHOV\chmrw~ X0bjTQI@8/&$+2:AHOV\bhnty}m Z5kcZRI?6/&#+3:AHOV\bhntz}fy[2jdZOFA90&#,3:AIOUZahnrw}}ca \5heVVK<20&$+2;AFNY_dinv|}zt\U]1dg\F@PO0'",39ALQPS]gmnq|qkRR]9XSQ<.(2@B>Lo|xfaA[ʾ]0·OM:,)?r»ќvm[V1wƲ ^0\aMLXɿѼwlaRE3^/rp|vlaTI0U^1ƽvl`UG96^9~tk`TH:5Zo^2ſ|ri^SH87J}~xyi^.»ypg\RF78Gi~zvqpj}^?ſwndZPE67H`yvronot|^ ;|skbXMB59I]sonptz^<ľyqh_UJ?4:J]rpty^;~vme[RH<4=L^v|_+¼zrjaXND83AP^w_ 2þ~vnf^SJ@58DPax_DƸſyrkaXUJ>01HXdy_>Ĵ|undckv_NC4,Jlz_AԱxqjlvzu_YNA,]݅_Cztks{~ni^XHG_D߽Ũ|uolvzvne]Pv_Cƾÿ~xppvzzsm`q_Dμz~q¾~yqu{~ypv_¾<|wrv|vqplzrx{_;|opkmononqÿ{rw_¿Ăhlikn-lo{ǿ{ul_O¾ȑcomprnlmmlkos|q÷{ums~_¿Ǩisruxtklk,hkmc^ztnh~_9½xtxy{pikiiglgbOysnfož_9¿Ǔt}~|ijggdf`ZId~xslh\|¿_Bξ¿ű|odfdcb[SHI{vrkg_b|_ܼ5Ē~adaa_ULHD~ysokd`V]zv{}_Aűc``]]UORGw{vrmhc\ZKzlv_2˿ŜoZ^]eaUT[~|xsokfa\RV=͙y{ÀĿˍ_4ĻYfhotdp}}wtokgc]XTLM8œ_3Ưgpsy~ttolhc_ZVQMCF-_߽0Ŧtx~jmgd_[WSMHD;=$ᱮĿ_-qcc][VRNID@:37/r_+ľ[]WUQMIEA;636Fh`(9d19y(XcKHMN`*=qN6|PE8`(a3NuVk;1EC`%cB7[OrPIFGy`(Ί;Yb>lRUE@`*F?:+|JeZ]cEL4`(~?`AsBoz@z=f`$\CEZa_T`^dYd` ` `_`]a=e]a`a]e%] Y0  մsק<ƽKަǺJߦžEߦBFüFſEDýDDøDƺDǽDD¶D÷EĸDŹDǻEȽE ǽDɿ F"G#}qjklps|B$øslgfb_\WSRUb|AŻtlklkjjigb[U_9ǿ}trrsqnlk mopj`Z1~{zyyxwut`ož~xm{'»xO 4$I'ŀĀ L%ŚsVIEKT\kЃ΀ ǽM֙a<* !/;DMTZ`ekvՄ P/_HFD=4/6=FNV_hqy~ہ S,݄__ZN@5+*3ϔzaimqv`fzonjgb`\WSNKCE0Ϭ_:kruywhgb`\XTQLGD;?&_˕.uy~s^`[XTPMHE@=47_/fWXSQLIEA=84,2'sԼ_9ٖPRNJHDA=940-/69G_,eDJDB@<84/-.39=EGs_)vn<962/-.39=BGMRXt_(m_{vG19641.-.049=BGLQW]dio_顙(]&%/1+,./258T[YN[Y^S_` ` `_`]a=e]a`a]e%] Y0  մsק<ƽKަǺJߦžEߦBFüFſEDýDDøDƺDǽDD¶D÷EĸDŹDǻEȽE ǽDɿ F"G#}qjklps|B$øslgfb_\WSRUb|AŻtlklkjjigb[U_9ǿ}trrsqnlk mopj`Z1~{zyyxwut`ož~xm{'»xO 4 I*ŀĀ L"⺋bB/%&)-;RnԀ́΀ ǽM+m7!%%$#$-Dlօ P1M  "&+05:;721G~ہ S0M&(.+#!%(+-04:AE@3.xỗ V1`4782(" "%*-0479:=BKG.Œ X+=BBDFE&"{~]9q6MAGFFD942 46!'**-16:9:BBI5!# |u]4LAHF0?3)e0 ""(6BIMG[aBG;%%" *~~}}w|m]6IBGF1GCK7X#+!7LTSOOE}~:''$" Cz~zyvvo ^?LBFEFFGFEEFEXy'5'&%9VQMJIHEzj:))&$" dwxutotc^5ICFE/D=7Lqq2>;DEDMKJGB=85''+'&$" #ztsqpmoe^>@=9520.-0-)'&#"Lylollija^ u6HBGEFE>DDCA?BEE@>=::98654321/.+*)'%#! mlkihdhU^<>>==;99764320.-++(&$"   Lpegd`dV^ 2I@EDEEDCCBA@)>=<:99764321/.-+)(&$"  *jbba^aZm^O=<<:98764320.-+*(&%#" Vd^_^_`f^4E@CB<@@??>=<;:98764321/.,+)'&$#! ?d[`acgh^ 0F?BBCBCCB>A@@??>==<;987754220/-,*)'%#" ,b_cfhjl^a6C@CBCABBAA@@??>=<<;997755320/-,+)'&$#! !_ghjlns_BF=@=?@@ADA@@?@??>=<;;997754321/.-+*('%$"  Ynkosn_7>?HKJFA:?A>@>;=<;:9977644210/-++)'%$"! Puorxp_B.JOTQOLLfA;A=>=<;;::877653210.-,+)(&%#!!Iyqwx_=VNMJJCSL9?;<<;9*76653210/-,+*('%$" .Pe;(%C~zv_C軝kEOIJFG<]Q6>;;99876544210/--+*('%$"!KhdjN./("D}_D㬊mDLFEAB8XM8;89866543210/.-+*('&$#! \icgoY670-&"=_D~zb=GAA=>6H<88775543210.-,,*)(&%#"  3Iinjr]=?86//P_C{c1>=<:762}mSJ7765443210/-,+*)(&%$" 475Hksx\CD?=4;t_E|~j0548523*F_IGGLA3533220//-,+*)'&%$"!4:;@=D_sSJIEC;B"_E눁r01-/1/-,(8DFGFG723110/.-,+*)'&%#" 0>=AAEFDPSOMJIAI)_Q}|3--++,,--0;>@@C=0210/.-,+*((&%$"!'@>CDFIKPWVTQOMGL4_{<',)+,-0,.59<=?4//.-,,*)('&$#"!8CDFIKMOZ[YWUSPNMF_O|O#/+./.-..-.0365/.--,+*)('%$#"!(9CGFOhccba`_]]Y]N_8P,63575-..--/-'#$)('&%$#"! 0DDFGDQhdeccba`]_Wp_}p17689:0--.+&"&#$#"! CA@BFCWiefedcbb^eQ_NzJ4:9:=7,/--,(# !%$$#"! 7AD@EE^ieffeedbc`g_߀o5=;>.,-(%& $"!  Oe/8HFIfbiV_)P9@>@B3+--0.'43"n6>Vgefefcp_{{?A!E9,1246/FvI!Taddfgdk[_򎃆3gA@g: bV`_abbecgcs_/OEIG=<>@AEHF  HdKU\[^^`cacfa_|IHL=BDDIGMC 8ESSTX[]_[bfU_||DGJBEIILU$ 2HDLPTWXWc]O_,E5LNLTT- /?EJNOUaJS_늂M)9J4  *7>EPJ1g_㊀)l2  $03#1_2|t  !(-*'p_/}~n! $)*(!0n_-뽣L !#$%#*Q_"ܪuT9'+`*,d=$p@v5%`(S >iF^)x41u`%U1%L?e@t8{x56m`((JT-^}xCFs4/y`*5-(p:WKOU4s<"`(*SW)T-sr.Q1g0bm/v|n+X`$M14KRPERPVJV` ` `_`]a=e]a`a]e%t8mk@ytF ؇ L \ a a a a a a a a a a a a a a a a a a a a a a ` ] R C) n  Rx   jP !-8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6)  %(*************************************************************************************'#  ic08PNG  IHDR\rfiCCPICC Profile(UoT?o\?US[IB*unS6mUo xB ISA$=t@hpS]Ƹ9w>5@WI`]5;V! A'@{N\..ƅG_!7suV$BlW=}i; F)A<.&Xax,38S(b׵*%31l #O-zQvaXOP5o6Zz&⻏^wkI/#&\%x/@{7S މjPh͔&mry>k7=ߪB#@fs_{덱п0-LZ~%Gpˈ{YXf^+_s-T>D@קƸ-9!r[2]3BcnCs?>*ԮeD|%4` :X2 pQSLPRaeyqĘ י5Fit )CdL$o$rpӶb>4+̹F_{Яki+x.+B.{L<۩ =UHcnf<>F ^e||pyv%b:iX'%8Iߔ? rw[vITVQN^dpYI"|#\cz[2M^S0[zIJ/HHȟ- Icq6^p/dJji$=i-wd{s PeYɤ9z(w??[[[nj197 I_sނ-V P(J=t&"cv"BJ)(Z'& {cGUUɭZOԏo±c֚i#8z]3}C^0K X@/] )@zFP"D*X^^.Uyk~s\{76MP >_[;E2/::EER95eeeC]GG{K4(eAk݃ dh}ϋlϾVd2pX|h>O}S} 7k]Ŋz{ٴ& &-`v~|&(o͵^{oo~ ox[뺦z F|0fͷX-Ǐ{tMxӛ)˲z9l.J(׿mUULz;ǑM5#ucQ'Oܮ5G~77pt@0xz|z* PR-˲YZZ:x_߃%^\ۍ:>;}~YfkkK=zTyR|<Zg0p)Μ9cEY]]AZ wyznfOUU1L(d|schKφ Y]sY =ϼh9AzBn0z ~> Y Xk)R)a'pa[hxU~0uWVf{cf7Ls`ra*LlažmmSzYȜo([Xe/4u]x?g1,t.h=m޸y;nޱY8=\n"nǤycЦi\dQs"}9Gt] ,Hփ@z{Nv> R3P_,(:z@ov[`B)A~6@ޞ](]@8 dˉ @=v>U绁<|RJs RXXȕ~[6)}3 ͻ7cz~!E4qRM9rg 4lցӾ٬l {O u ZkϙY覛nW2d="va]L79g2Yկ$v]̹fA 07ht [w=م9?&Qgҁ9G_ @oϛ͖r睗:#s~;.gYȞ+^L&cA}9GțM v{?3Fi v:L{*bMBł[z{AB~e:oښV5u]SUUb#eY2 q^@]v G mI  CFQIFE} *@Z4apmmm.x¦m6/P@u1g~`)uM4x`MPcX]]miiUYZZbiin=lnn2N[`U{YZZdt@)eKzXW<10mǎc<3LL&D` CVWW9x СC8p5MӰӧj2HQ9ݻwz@]KysSJfY<7-EQΟ8B3Lܤks~^ve߿#Gpr5pa֌cu qtٳKKkr4$@ޞ7ͪgf]x燞q]/ m "< f#z݂#fuXh'xG/~Qx߿^[[~~~~C4~Eʁ FCzwBZFVjkm+kls4egYYY*n6|Gx;{??1^)UG= !BB@o/?fy~*@8ns `V'-! ZC4[n{キ|׻5o~( UFv %J@N类l@L瘥i?t>[&M88~`ej</~񋃣GN~~777C>W',BкzڼT`^ԟiD`r>5ܳ Kg/HMHHc ?W?yο ==v-9X)M7k?,饆yUy%Yg'g9HI&ɤ-O??CzeBz{Q^|iY/9vO1%]ey`@NnUy<-$VeIUU)}Cgg<"Rgwԋl t,лT{ ]D(=_j0Qa>yͲ36.>ӫp8\L&u&Kj%&3\鸜&/mf3˲TMpW n|쭷 lf @o L`ڧ)H@Y-O, y`fgEY/;l9'Zk5#N w 2yβy#g؁rαo߾|~'~GnϕeTU"z{m^o|U4h'wơ%vs\a9s,XkU4ncc|7|i{y ]/*`LmOL "r|n`4/vyr0X]]՛կ~gϞ=G z,B/: bsJs]=*@d9`~?ϯ|!?$- v2p^Wٳcʦijz'ϣ-,}ϟ_R$>s\-7wy:rG`yf-?fc אEQi|QL@o?Su몽1[0 fo_ uS%!@'|~\'{çϤxv ~F| @D,SOۋj=,QrP TCbЊjZqf89Ü:uI#=DY(%XQ 5k9|j\}.zrBꦢ'x2(IW?KsK #9UX$;Q|;/dK@r搶ԧ Mn=L0 )%֖K3'x]w=Ni2 GWWVa 5Sh 1Fa c4jU8p)Nm<̓}c, =ī^uW뎼Cee0N Ɔդ=9lԄƞ T:ϧטR<⽻p ,4-`q]_cm1a+|/;N28 xSMDqVSxwXtd b?-x,?}We4̈́f h)@+t$VjQZqS{YI.\l.yQ?Oii hD՝p!Y gb̐Iʒ]g_%|_|q7++ մa24Q,4c: "c&(,6Hx,J*hQfa7!2( _)PG5}8}O osv`<= ɔtB]9ZmՈsh[NQT>y$lym6"QX4 F)˷]꽼M :6Rlo]8DFx=:T e5g@yv3_H;=ϼ@>! iNCk ayԯ:f뷹lOݏ?ydɨþ)Ʉjq.匝3oPWV!FG0@+ѣU;꽼G?ȑWdt'6=JhT5FN~֟j,QU~drh-\{=E v1OxN;h]c7 H|yEmE /8)h/)ڰfkj$l >SJ@Tlw &56uH#k%  Q' 5ZmßOʵo"͓`Ź C#6 N2u*r 0xM3bnSǜ|2ٶ~,X8EDkҿɒ|KO{_X?}a+0Zv4. E^ŸȺst-:q(H[w[X`~A] #G7=>?ڂtryN`6&8x=/#5paģȍCH=cLd;8,KrXT^d3d}L(5_lr>8qtAQ%6B2M=9ݤBdQ(*VWV(ZQ_ya8Η?p=_'?+cy=mPWrz4C!c+ވ}A)$2 g4ϳYEyW@NkG(Ҩ=ǟ_iؿf7 ^4e)V$cDDe+τш tZ Kozvy/lт /!lvEg טDMVeU}r0PƁm쭚Ʃ֡^{Poܷ\^" ZuF8((}P+#XۻO>OS5dRMCQ %Z!Jkp"HL}IqgXZC:d]TtvDZooQĀ@j,_e~5b 9vJsIpo|yƩ٫̣dT!& J GyDJRá A~ c྽|?c<#]@@ i~D"(^yp"x_Wx355'n4-`lq36Ӗ/W>o Ǣ:?Yr 2ZaEQuxe(< lvEj:Bu[%rGMV1M.✿\EA1i20jD*.߻o?ؿv(Ի/9OǻOhDmߍ.GHSjBمb%s 2E*e_'Ek>snk'ic2]\sLH͎aKQwoKhBWaiؚԬ 7.'1hD'yKe;p. !Ǿq3vy/US MXϟv{ EŽ PSDo785!\뤮 ZϨNfN|3=o2HJzP2`uM[L1i ÐAk5~?}?4 vj/8ߍo|HJB IDAT3#LΜ86)).%?E:Wl2:JeN:{yd$1=f٥ZgP;-CJ C경||rĴ կ#x:}Dihq`\bЅ"E2g|+B~S8`*ViTğ{D=ޅA6y N*g%۽S{]ۼGMD0IW,cL8T,ThP\y`/7y1, &UPs&:>'QUU쀍8?Ah=VϏ <-al%i|ePVAqw mC끽N=EPs}цA9b0Q-tˊ.l>egcF88H9|u鼭pЮf(J%@Aa\Uߺޕ=lSV%}/ Tﻐ8(M5V,Uk0(-U3}?K5"(&X x/DSO+T1ۿ橧1EF%^ \Th}UaaY~ 3xJ!84*_+Y urv}x\s|a.;*>_3\9E!=@B6H,b{/BSZlU hhYXVF҂c5¦fI((XX>T[8@)R>Ӎa{ؿg߾3س_{=g771q ^uc}T!ޡLxkooH@3 R7KԿBXeNԇ*fJk]-:jYW o{!{ aPZ'ڷ?Co^~%L1+|?+lDެNZ>5i CfV])ye\{F &Q^YMY6{Y^}p:5*0%+ne(^RucP:h(VF%~'eT(p޵@qm[@)}kĕj1~/'yJMc>|:8G_v;-c W ?#?6K#Əﲼdi2TōaxR/%P4ɸF3Z U/PjEa4[#VxkpUֆJ=Mϴ x|zW׭^n9w`nCӓ!:KHH710:^PJZP3Z9>xAXހK$h(h{_8_t`L jH}UAt8z{*ww^/n|ll 8NQ4E2GFk'=Xwx{kK$6R^:oj4m͇Q @7 2=0./XpSWX?^U#Vl!yMU5,-yk+B(K-5\Qq)o2~Gx^9-Cj XoBon)QJ4|zɫdJ[G330SiSZV]wu?ƭ\{\ lnoüIÇZ@pu7uo1RX?e%?A})ɟ40'H `*0Vp gQs`0~ʽQctVANy”c SɸaS,ےkpeXklB ƅ.<%5()5{4[lG8YͩTGȦd_IsQ*[FGf!ctk^ROF'{kt5U-GSe õTU8}<\NƯ@r[}sjK>wϪǖ?As)&%S(#?5C>-<}0\K2mq+P(eiƆ*/cjL0ZjJ@a#&a@󙅤7 _ ^=㾯EНtS(ca2=wrk_xAx 9YJ?MY?EԜQrH2"~$Nc:mPb5&Z"2qglEغ~ ~vE5QlnJ7 kqq.fxZ8B5 ^H^tGASOÕ%J Dz ؑC+(M- V8z(G|+_t S@XfJ-CnT=~d{ W~;?,dbCڇU^.,yLhEX*1jؠ#a0uPKlAphƞU˃sم jQqb2%;W«6Oc>uk>Gķ@L 8iOe xzEvcE=ʓ~k=v@( [!QwH[O-ߏ%qfZe/Dx Bi4N L+xV':<өUq"`btNcbåu wHhvoM Ω?u$cuYzqK[7 P`k)3hsM6uÄuFAзzPX-Nx7a&۽gmq5D5aoYq.! mswKpT>EB\Dmg^)I^G@H:wuS]uQ]6t`#HJ)XG,| q,]sl ^|,h܄4NS5u;wnTp.|RA(-*8}%,%@Px~S"v *YKhO7v8^GGs%B";txlHQ*xt}7OtC7$7F(k|b7L 6zmxR+9ʹz]:>2a2cJ4( kloyz(KFS}5N9Ørs9RzqG;wOp~VDK}s4ʯc!9cN<$BF ëxו<[g3zBU[; q:4~i&"M` E>gma`4F'P`Dh1"wi@'M/sG76I#ȩjx!G~\Jϗ$u]֝GMׂJjΕ$'3·)@4d-3όίU;*.qmĝFkBY5yϥ5/ `a`q,wJC@KW>Zr*.#ps'ߩgt !WvP)ɡ磓.G,BڜG6m)6-#2h\H崽R#JRP@N4q&c(f765hc,_lgi~ut,OA=K{B3 ʏ]nJWMv}>)F"B"@&z]#P>G$1Q8+&Iibv~b]Ͼ+>9j ^ =ZURӧ,jEi4/{꟬ ZiNAqԦ";t\" y<&&L G78bdO7$<ok&NWV*ةY)V[nЄP ,׾Spۛhm#)+$ ijll' : wgۊ_;o"zQLs]vf`+ Tj*/ FL=qZie(&,d44h1B@p~؄x{q7HHU< 5\3H;}Exl MEKs{b6\>lk#HU"⃐#Rbp!r07@ <-+=TqpΓ"쎉9ya!L<^48ߠ>V^)NcرL+ġ5[ ֶp`UsYZ-@ p=QS٭ Pr0B&\CgfEx[%Ǐb),qѧW(#N nj N 71lSŨ܃7gY`pNۀ0MWۛOFI<̉|RU sgԿqY}~&QHbz bsQ0 -kxn|j{^pp%e1hŠ) nRXEQ(dacӞck +V!ĽlmFaLAa,F+aC(Vfk8(c^ /d@:8wcw 'FcjxמZ||KSS[9FzȰXqblx3=\~-W: > yQK3,;s޶Ӯͫ}]h* rmsV'hOZF,D}^Tx_0hZlQi P,#V6( aKK94Lj66zk5 k  cVFQz\VA@w U 𧞤zNbZU(X֜&51htUլVQf@ՄW`}%OWRCKa3/BlsJcS-wt%?Ey霿;KwA"~k/8Q1Exo~pշ0ASJcM@X1,ͶXh -t\Xa `6/@k4eQY>p+~.E:/s?W,(.,eafw(w!ga|-<"4eyfSQUBiYS>]tˇ)me>%mkьQh-Жk°=,hjcl`EL< fMϵZ4b!{uoj|= +aRi2G%>(=cNV,k5R'Ĝ:9\ehv1f2a`*GzW髡=`vt_dx8WgU=ҩU7EiDn'A$ =tS"teK%Z FϯMhAPYC1x4ځS(LVQWczJ!pjZ-XB-X}_z,ww;~O`K {k [ g''x&:cuTwtfOo&:Ks6yS\;iQM(zm ?uRdr ةЪݟ&q.Nu`ڊ@3F50W3ϚzjA$( ei4#,fR;5i *װlBY]}kozWj&16]XnHz~Oc!ĀZr<'( FGSۮ`ΣlN;${qҞ5ĠTUøǪM+jZpAO hGw; ,muvל+,S"be(SbØڜe*`zbePaEˆrhqN *\1ƚpTUH6bAYg\MM +^1 "(m[]>YNy=]?צ!c hU`FK\H_5.Li hrEQjW4>4hCQ4FZ_kS1ʣ pj.GdK+ (Vx/3Y?E+9)qFxҰ6,BӋ"r y]gy}s]^%ˋdy7^0 B&@ I 0IɤdICHi UUjy}ϹJT)U[nݺ>=ܿ=wjb= 9̳`V ѓxa1^m8  }E""O-څnPr_/uy.񤏡/?h %iP>l *5$N['B B e㉓T<|$'ij^u=!`F 0lzxZvrwr{.^X$ (i"-gvNuoӦhd<ԯꋒSQ@َci40@``?NH¹N@dPEdMts%JiS"ʹ~_Hu?Bwh/e=HAX#HQT1kJ^s:w=ITZ?;xz0y!f`2.p5ւ{v>elEAqg@ uk9]Cs"KrPQ|vA z,{]!0Erdp?:0)kX`˄D4rT2)" D--E,B}'v1t68+baL+C:.t2¢6rj/IC;g N:QǺ k(/q֕uf@(+e Cy!3<0 )I)LY8)tLp2xrdjb'W"aŷl8b'8S)#l[HQ U{i*: 98HPu ڂ+ X:PE}ء !_8Z-,";Lo:vQ2 q,BN<ʖ~$Xׯqw 152>:IoL?Th LIڽE}_ jmq;rcm Y?#0֡E߸q3P+Gy=.00mG_<zZ}, /QJ$#=HFS3.?%Wu"CctB\($ӓȬb> ^h.N)v:TSHi39:CIT`]8i$Rb~Qt!2DlJ$y5=[Y.8KRKů$_rApdmdT! 6H,bKp -=<:ZM4ΙL\: cr?T)ԉBGX#y6'B` ksVXs$m l}A_CP3LP(IT]$s?8 "Ƹ08cǶ,Ry)rϾW 6q{s>Out ЈynI:zKE!U$Qh-kES)h(vkًz"eY >{P?Hs >THTӴFkQx;PgHɆ/KkCOs;Shj C.D zv)\H1Dskbk(*Cbc&'2e5gBnØh_>\)^HxNn]ߩXOurki5RM$V$ZI]IS)=OC҅΃$‹mB^mi1)@jZ#uFڬYA?^)@,hx@Z^9Vo)iP3:<{%iK&|RHAسeuۋ?\LL8S`mXKmF)MHJ?8:ǩ>D_|}F`t4"f|d-@iւdZa`O8 XN0Yp8j6얖É IJsj }x\-HZlm[#*p ] "I1Lcֹ_2wE-q&7&ZMbTczFw?L;o %K8R=L913hh Qy0qXnnٹ23-m,<'ѧFnC0CZj5 *U없}'A,t-YDKX<2vObD}4~ukST-xzk0 LN16~`yS`!˚Xdž.@z˨RS^,83M9Ju-9_<WEHo;0y0ǡ"7ba<6S@eA,)E1ЄfN$!efP_HIq>9Ҙ"e߯/hp"g2bl N-^xBxҊ }14⠏w SgP5@zF-q]t@*PVʎ/A"VtQqG",v\(乊*}_^O5֕x " ῳnPtݙɼM9"g ,"u7D`qr!e?zbn:EyNUƻBh߳c:c~g0n#J'%D[)u=? Z(z1Š/RIxFB(rcǏb('~2dۃŘG~[ 86ځW:pH q&/d]xtNHb!?P |MC P>8wURaa\N0=X٧]g,qAd>QAQ 'y(QHB/]LLƁNw^cz~5=os.;v44׵umH{jJɹB& #A%r7`m)Ҫ:Ioa.FXwZ\~wlx{X7@hzrb0Jhd4t mQ5"'b8cΑyy~LR.F?8pT 2._;E;{0&!{=KshF~1&n˻5 6#]Cz# #[HwE8PF]^ jxsӲȆƘ6Rdx*IQ@Nh2RLE(B1t4 hy* mzmuWEkңd,d-*雙YSayE*IE%$:.Ԃ4H!1*i$%=,ҋ$;77yȍlPc B&ٳm۶⯤ǣ&O06 >*)) YCҹ>x iParxnHVl infZ$AhI)ثA1W r%udJ 8$q4K#Wف0ZR ]D`l _"DZC<Ë ?Q rUx8( , 5|)[nY e3:a5s$mWF, sa[N3S,t$ AW[B[`@B;|N,=fׂd{pqMy_+?_CN`2`oH5_?rr G=e·-EGU#]_ ҅BEX FH4nTTL+w,>Bv=pP 4P0֜u4amB.&XӂF-!Y$!BPQ% [sD=bHroϳL0K~;+U'@avn`o̩-^Tۘx%x##P8i>ß ]^6hW]$te-dEWdXccg Z[J ۧ^z"ɀ~.n/wyh|ɱX5<iBO?z`I2TUg`o teP.N X eُh"DGTz`dIo4(9r?dLbP/s UE4Ҷ9c1afB/aX狓Z@0z=/w|9lcP5|;k'Xoc/ X}?f#gZJcC}_쳨 űW" v?hFbR-E^xv?::6uΡs S|C:T5Q_z>L"~K. _((l*fwlantVeK M86gn|%<: g9$&ݰ6+*B4> >T+0 '9o 5%EM>t"E`På=E+ξT<|qjC)GG~S-J( as#C){ػoz=۵ez@r췿1ؗ)V_JVb@t O,9"<8B4xN@ }KC$B5sg673AǓ_a8onRXǵyz~3$ΘOxx4αD6;V%,r=䮯i#VХ<.nh#E ?}^)vyHq>c- ^ve'yV۱VB8Ѥ"<֪hN8iH3c Buh,R'.6G,[njc^7,=/ iS&T]hs~oh(4KQhgctPhM@}X=\cx؁8HR(+!+ZaEi<2֞><>o#d^_4TN0y _MoLmh-3 {9J'IS~yGj5lMik@9n'[<Yb;Us731/PB#=0PDQ ~(1 Y6nPke4uOf: LBm%*2IzLۘX?6v%> X^LT`®?59_Fڇ bz]A z5%[l&>Ƈ5e:uW}?O<,\l?xzph+u(?BϽp=0(DPuLj~_##F$$:DJKF`JvXn'#7) dB#7 kdm<_Ħ !R0&ΰڷ>'$k`M1}m//%· y^u<-46^FЪK3ÄqƵ8[8F ԕ'&t1 io7|cK_{^\)Ki񟠝xK5J#)E4 !(-9CO_c$D9, CuzzsY9Xȑ:PV/638re>+x@Ě *,OZo⡵QKhR"usZ4/u9ȴg Y&1o_mƗz4#(`lGBL! ?Qf|0ܗ"> H8%PDN@@p$: ϲi*I"tщ :݌Bf8gtR0N<x oyy=3 8klx r0k7_Jk+Qi= zJ(gl?ý*_'m_dvv?Y6D CMrR#Q7EqX/K`_GNDiZB^$YԊ!k >^t ,Zoe'x(֠|6]o-Q[P!F Yj^gr/\l/ |  . .[Ư-wyv܂&:G:9K`s~)`}n@=ATZV$$ѤIthm=Gkx70iM GCHiuTy{Wcocqv{ǡӝ?Rn㌮=5/>< .3~0 l)yE YyOЏyb7=+tF֑B!DQ8 X<~`mY38kUY dӉ ZB@K hULjMv2ETN9t( cM0>!NkAkdmyswh/ϵ -E$i> Jˁ<BhTE% xYPF`&a㜉B)5R&,! ?cm7\zBxѧC4rF >u.-5Xl{82**XTTl() B?_n𕱿P9=ĒO>ɟ*Yr'-*îpA+Tx)ag+Tr*Ĩ@ '1*PITpr*Ĩ@ '1*PITpc3O6 j|7:^ި )QlqPt, پTģr+!XkK?T؈R'q, H4J0ՂN~\*8DN{(B$O+0j:92!Q]cs˵*'h$8عc;Af֬e||$I ǀt ln^Ufבhe+şe{9r'>~/ٳ{͢`|ߛk_wӦZly>ɿGf=ygdd nj$kcZ;'?1i/9‹c'\n࿱^4 +Z&gl1W/$Ic؟}cWbqqѱq~~W^r9J)s$%-oebr#1&gqq\s-׼ؾnÃˎO?p.T|?W.eMg>{ 5صs'+cBJVns٫att{;wlC)}T ȐPO鬳9 9 w Gsλ}{25[n5Ƙ%W=ABZC&|?b||4I1i^s͵4 6ge5v={ヒVk#o:{3"z#N4o};ٿo/kן©: ]m[y{_glh Cr NemK\<7H^Q~ݿo/!t:]nڗyELW*?T8(pZWg.|oyK.K/giVϬ)<'IlyكX5c-\3Z =o:_@Ξݻv;Kw.g-Yj%APף땅Њ߸F sLNM+_~ PʞnKK7p=Nk-c}9ۋu9Zz e*ܱtP7[G+بj'gq%sE멝or׷Gbۓ[IBd>ɿʫ̳70<hTT Bf/=֟u70G>@ /_>Rnzz.FZƞ=ؾmkĘ& @ qZڷwV3?7uȲtH5r ˉ@g~|sea~4I˼>{t]FFFhRin=Bfdt~_xevjr׹޻9302>1QN-..pe5w,鴗ĂH ]z۷q.E/T|w$2y%Z:U8>"(Wϰ̧?~8Ip׾̶'`rj#GsʆSum?݂Rv{\Ȳn {Ѱ?SfǶmLLN>#G9sYPtxի(9 Ǣ00&Ư?5<k֝U}=0TAۯ|C %۶>믽妯/}VEj kq+/g>Ԫ9|ƍg1j#g# 79oy+5(Gqˍ<}^qW5  D/4ؽk |s^Çq,v{@w155iglmI|n9_P`%HeX۝}nk,{/^fGCQ?th{-hٗpl:\|LLL_BZCl߶kCafZ&&C+U*zj{&Irrh. GYD3zBJ}!z.RJuK{Oe?eCtKY%\sͿ׾,v=}:n"׾c!l9B<#QF)5 ry.—άY̚uK~?X)/&I",KR)UE^2(R,)!+ae  #ʀr97|~LדJ^+9WLpBkm'M;СC[Ћ'T y%SԁSր&_~cc^pr 1'^N$Rtc,+iUL %y~9W#'<XI0 <@pk_*Yo;Vp?KxBr^|?[ r'=fssſ*RAv2~X9:ie^( x/ w+ɨ7G~,B1>/8XyY³aïPB *TPB *TPB *TP?TKTdIENDB`ic09A͉PNG  IHDRxiCCPICC Profile(UoT?o\?US[IB*unS6mUo xB ISA$=t@hpS]Ƹ9w>5@WI`]5;V! A'@{N\..ƅG_!7suV$BlW=}i; F)A<.&Xax,38S(b׵*%31l #O-zQvaXOP5o6Zz&⻏^wkI/#&\%x/@{7S މjPh͔&mry>k7=ߪB#@fs_{덱п0-LZ~%Gpˈ{YXf^+_s-T>D@קƸ-9!r[2]3BcnCs?>*ԮeD|%4` :X2 pQSLPRaeyqĘ י5Fit )CdL$o$rpӶb>4+̹F_{Яki+x.+B.{L<۩ =UHcnf<>F ^e||pyv%b:iX'%8Iߔ? rw[vITVQN^dpYI"|#\cz[2M^S0[zIJ/HHȟ- Ic<^xyDfVWuuU--3#=<"}{_(j' ,RO@  t AA@Uڨ! 3a k.b='] 8&ok CA PUd}q CB?@ ] E3]Hw/ 6vi%*Rx@k+T3[yrc$591Ru ` qso2{y^$Ubπ8?y]^yglƘ y7NOOOS333'N:uԩSO81w^zw0Gf1SN]x_I\+{ĉ׎9{:x⩧ڏЫ* $󧤿 .ؽ{K0G3aoϏ÷$ɓ'_;|^z0Gfԁ :0Jހ@pNA@'ß/NZy g#9l$ RzfggNNN'>wK(Bl)Oh0X<\@`EB$ȲP_p @] XP/8|n)1,?0OV cccӧNzG//-D4 3Ѓ I3a@)53c033'Ncn??|OO W ܌ՆqlSXy g Iu^=cm3$UqFy>cǎ^GU  Z- (PE@X@ Q&6W6~ǎÁ`;'5\fB^cpĞT=\U@ XQ?쪑?y-Mpuf),:bzP6ud $P!qncظq#&&&N}C/~8r`XY .PX.@pN@aƟ\p#oR JCF? _z=>޹{(g*2eJBp$ ,k( Y=4ľ{/\1~vv6oެi&?[Hxqԑ@Ѐ&OI} 1.Gk=gm Uk-+c˖-]zG?'~cnb`*:7FsMC4x;V-)sJo]v`;?:@HN"bPL)kύx 8صk֭[ 6n>|B[7Zkh+b ~pj dY}abb7nDVwqǯ} 8 @  }<Lfff{nlٲ7nÇxn喻^|di˳EGHcaƨgGI{bll N@uM7 ,[3׍3,ISBaA IDڵk; ,[Cc! /A`Py:t'Oy2@0UN7 %}M} SSSسgZƐ$It@ౘ~]$snב_^Wއ֪oYH`@@ IkgT^}Sџ;8qu9B $@ @ ,b097y1bKB ufffGBۅ:tjp`Y@@ `zQF DxL( 0;;UVE9)łv|Acթ7ļM(ľs9rSSS>4 7 $@pB@ T5Dza ?v|~ LLLn{I@)$@pB@ 7Q ~L# Mbym\e@cO1Bg%(2؃<~-4M+h'N`ffNV J)iZc *PأuBٟ;رcFө3IiZQ~!BicغbMc AIľ)I=z'C8(4!BA#tB`Lرu}XuyGmoyBB@ cA~ yX"mmrrt:<E B ׵|{(ǶqpAK Q%֑P"$@p@@  C8bk1u#fC (pq1M$ s@!@04:`1o>l>7& |@H1xףp2Dx~BH4pP@]`]M.D)ǏNpΫ6`@(60h{ PX׾za \PGB!3 !`d,T>@XuFQ@2:V$)' bZ!3t'0w!t(`n 0Ӷ$I`1ZJ[51zy!#9$1Əcǘ<4Meٜyȕz XtưaI@M |7Moec$ ,$$@p& @ %k_L%y1;v̇Bsv j Rж^cqv!B`o| C?jSJdANx!AKB !a`/>TǬ癙z/$ (&$@  è 30߾u$ϱ.'`ffyIIB$ۤX` @ ,( ӧi&mrBwff~m d`X>wB !`q:|]]p}z}u&''̕KM$ 4!IH8@p 8( 3fSle|21s?Óbm;!`Q0>1% 0l9 'Oc =#c-$@0oȳFDZe@0ƘZ1 z>g8ddi ni1^ zDE@y1&MSQs`! f`00'!.ng~.Yy*,c$tBgB7uux;< $,*h^$@)z!9 F  wT>(0 (0LbI@1g%cGYQ@FFxN=g=F% ۇ3 2_(L  @pF1ʒaQgG=֠;X*@,1| @]3ERB#C@ X8P7|JaS!BYAq:9vSn>aIH@,'npB@ Xh2uhZ0lWJ! CH !c>U?(dԅ@Ӝ pB@ XQهc Cb\JU!!`E"ḟ #4F58S$ IZ-q AXn8b@PΈRzSkXi ;PcWg|)4;֨yΕ`ӆ_<<ϑ$?V~$I^wc{?j8%Z8oٻ,(|0zm! žV8qiRh`go{%`B@ 8дo>v?n_l c!`EbcC,>Bmn[(ۆ J@o ! Ŷͧ&y"aHtH_E۰ X KPwn l i H@MH @l0_ДWPGkpPf1I}#ivu$ BVe$a=ܖ$7 \hRp X i}, rH71B.G>"$`@@ X6o>8uԼ:&#:[,jobAB~+uY&mz=8p`<}Xk+ 12$ ZZ6:j*%9 m4.}=~~> X8/2KW U:plX +uyN}|5ymZ,,xy#s6~߷/ޟ<ۣEU2?|$Iqlذa/:oZϩϹ6| ñR'__+o0 [hw[h !B%è 76Q @hc!YG19ykд_~=n݊[bؾ};.6oތqYf5c}*sYHʀa6|=rnu@,T w1;v ;wt:Kq饗bӦMزe 6l؀7V4EժY}LOOxQ *I2Pb P)t! (tCaP&o{Ԟ{< *$>yPs Tul_,Tk{+E] /ЇxRaHfff033SQ^cypA@p΃=ڰ+~5Vg}ܳUp~[؎ݽ{7v폵zjOoߎ/V hZvzzu G?j>uOpư,n(TUzq5 S{~bi*;h܏e2{熵.r.7y1D"b+mua}8p;w7 .?s/X` ,+:y ~X1&텆?%Ŕ&Ͽ7 0'&&sN<#xqI}t]`ll̗KsH%\re]vz.%@H!BS@,y>7h0pyʄp%ǰ{! Y4I޽< v؁iO(n(HX/7۷בM@ @ XV 8w↼Ɗ*$y6>0P< |}.سgz)ڵ ~>_Qo~]v?~cxE" @ XV&=VG)Y.l3<z1?V 6:Cd$|3u58q/2q?~܇4Eݮ(ZuW{jj?TW!@@dyD :@sjJ p b$Kfj#uƹϠ'uG!#J)LLLgÇ1>>1$IvVEK7=W@.k%@Bӯ |=07 ?J|NjdY9C)u1BMDbs 򖷼7t.B^0}oczpur^J`H ,)NmxBTϟ ^}椀 թ \A b1W^y%nflݺi"2z=Xkgw8`@UBNRH h b$sIB-IdNرY>:ʛc5eK/_č7ވ[nncccz|neޢ,TZ V3uX:Q*CǤ'8a`0?`#>94ͭdnێ;K/~7.RZ)k_'oDKvUF H@ XR,F!X?qi c pҔP1jnp>u*CHb=ow܁v&9~Q"$crEs=^{ wulق_{wPY5<$@j! G\ P 8DAbۚ8Ş1$c9DZn$Ie}oZߴn؜bΩn^z%l޼֭æM֭{jns"I@ Xb JP޴Ka{] e}j{\0m  s \wM7t0!T"+D;5\Oz0[ FL%F^< @(QK'˲h'{,p|QGB##s⅑>~kV_w 7 WBC& J(`%ESf|LjeylX.O.Iye$)P? eA&މ4Čr˧6'mFωKHv؁K+4@&(|M}̀Q&PQ7ܸgY4M}\[X!p4S!Qs MAa 'a0 >(֮]???20l@䨓G c:ӧܐuxR_LiP+!h9bqv{D0L0BHS,_?ëpuFUB</fb9;uy<|{]a j&%pCk61QLXn%)c099o}[wO?C(qg\X +2:. sMc%/W/7pt<>a$bćK*(ôcϕZqXvo?8W*BH%@(,S0m?f~\ϫ*~zs8Eǎ7VU0k_I̩d??~ \q׬Yc=qs\g F5={腒eYXa>MJG/>KKkF\tM:o~*a|BU׍Ϸo?q]wɓ'[%PTH@ 8+0߂@ cF5M|;P,+cr"F\C8~q8s+ BR֤x_/o߾77H%cCQa& hއ %WcAkąB݊|B>F BorL}R8x߿y/>|x ( @ ()@ܻ;4z:Z"H{n@Ln3&b*Fl̘_XuD@zuĀC_d߾}nU{p!R@  @ h2ZM*yJJ-\H-{ ?6VEXMhÐ8{ي!2LNN4)\.^<[?@p`yX0AHx#Cϟ- $y oqTUb2'N rQm۶nݺfbb$ʥ ?'B!@ , K,Ċ >&@$~L޶ d}>V&4)|0ɗU!qd۶m~G̠4A@ Xi)ԗX7~a?N08qy}ת1YjĮEx Jַ]e ƟA@ 8paYd>7Pp7:d/fcD'|yuĩi (b=fc(<훞N.袷,ަ@@ XF5p\7L}گ-eBBNx1cۅ\WxƯ#*a>6j]bA&E 4ă)1B@d@Vkʒd  @ 8c̉7n5.Փzq#c1 }DrE]d)>=0fprDsK w~ D @ 6/Dc %@#<&?^,Ļι3 !QOۚZ ] ^KޏPzu$ &:T+0ilSRbx>ð}bvi`BIBhDb%sBY!H4jGPGRA(6&'JnD6~a~paX@x1rF!-0V qȄ*ᡯ~Y?N]lZ0TZA)_%Ez|5n.?R [7mۖô w`. /@cD"Ī{iZ& \B.O:S?bc?F(\, @@1q5{u;v|B8|5h$QPZC) MON#TCiws x_vNm[\ 7+$ p06nqPi:BKB{Oㅞm,I w~uF96ЛkDbǦ}E&/$ ` z8qGp{A{ ıcaESgu4`M[l ⳭĥRPqnhc_@-[غ+xVwR\~٭vVAdFh\Kh17=(wly0qP: ;4~xb~ .܀#aD6t"1_-7 ^ k>ެ153VoP~(э~+uFTߌGNAruv06q\Bl?pťu }-jKvarC<7k4cIr1ѤvmtѲXȃoo7L<~0(s./"Fbh؜p6\ (;v t!u$(_/!M@@0ƲBG?<:7 k ZNY4ђ -- ^y"QZZ(`QdM (Pz~|`1_'E>,Q]A`IU 婊<`¤bFo0VI~oyO]_͇,T?($@m]5%ncYusB(q_JuhFM}uOt$A{tIi~}>4v#stZ5y˶9yy(ӟӅaV7Lz_46 z@1 VQ['{#_IRav! ڠa0af&|/m~;bWG0:Ϻ)$ԯK7{`QSbbcJu{̰]x 4|MXA e/`,,:oa)|g,lnIL)ؼ}4Z)d|\xc"'wnG0XU›5 oҖwx3/_m4 HMPug&1LeSU!k?M[i[(9ZJn#k'T3 G!?&t0xN ;Am#_<Ӈ4 z??< &,:m z 0H={X@) Qb-ە!ļ9Gs7rY`Pj}i)d IT.diDt-z6;}{Kkߏ+yqguNʮ'_Iř:e‡ѾmuMLQ4A&Aesәs!@ 'Ak3d"M!YU~N yf!q/#i]=]p|e@/ˏc$`'){>P*Zg<` 4lM[{xo>I\};n|oT58av Aɣs< 7W*q`f`|]:vB,qk*b=AJEx=5vc3M{%4߁N؉S'_Oa'' V)魭b9OsҽEU@Е*eICJـβ q[`\~Bz(W.x⠅29f"cՑNO?}`+O7 _r-W Zfð~ Z]UNNv>u iAZ X͑+ǧϣ)P+SvzPҰdA!@ i4:HT $m (| =|Yhc,gQ ̣9*[mj >KƶPL(!4mH ^m42-D7 o l`y0_GڞGw/\mmsfއ=>;26 T.N4HSǀSG߁}P/a %Uo4=h@ sN @ NGtE`r%y YN$:ecOcCx 9*x!q"O4T4(Oh:KT֢a3:Ju(}|ů;~jyC29fJA' `B Hstt㩣ˏ_*`M*Ű%_`8aP 4"Cw>tT2(@=m/ 3 -3̠ڢ_xo+=RJ~{P!z`-P njXSBҾ.p/}P=v8' @@֢hfw<'掿ۮi.^a~Nة7hdDx_h-#"T>gnTr#®\p%bxÎ9L ,f sB$;I*Q*-3n0v!ۖ^ʘ1dl v-^fETYv^w+T@ 쏠07|TB c1JLZYRT Y'JkPe -[3$=eh._Oc ^ͦ] 0E% c:o0ϢPt k-{~t!2&2}]!|+ Sd}]XD$BkVyz},ǩ)Vs7{(zC_=x#X``$Sc(J;T%*>(A`}X` T%.@QHTqӅuXHΉ Y506H^}{Ұt5xgo |mH`>uIJ~r+;JU-ɍ*U)[aȞ _ζ+ì Xԑ&Q@a,C @+q")*בg-v ظǪ VRW?yL/ЭG!{(omR4m[$&O(D,fUZ2(U:'yi%`ŵU&Gj5Ԛ5HNN*@!H)翎;]7(:g`Bj}bk9)2Z&w>QF Iϸq8Qt`!4ZfVgzS@ְݘsbևS`<  jQR@ءVVYXє[Rxipj"I$巸iF4|ec( ,}H&V)' Rl$*6Ew.R'@sV(`)P3lJ IDAT:zT<5c]` zN\CV D*iӦ'ؓ_DB%S: csr-ڧʫ`{ ݋ Lpګ0sh/?PAH$ض{[ !!9ļ3\-k>e"݊v0ٹ E2,QqDn2\|CY,T"t>>؅)`[2\y(cx9 $1 @*$ }<=}erNР 4ޓV!50~U`[1bsG 2㌿-1nj;~Gv|ӇLϟ>Oy+&8gοU淐tON6,ZiL7[xtL \1JU=9k?,,y ~o+H'pV6T`7nܭ',LK+6(zF!~_&)0CUoT~;dD4./  {O/ݗBaz"XOlF@!ɫߢ8`~cVlB6Г_W#׬܀Zh,V>`0 tOa\)t+囒/& خYj𹙪|=dl:jhZ@D)W{UEu(+^{sOlW$`D\~BWH5-[p ob\e~Zn7eRgF0$E@+eN0kU9|8AK^]RzaBM]p3Kso&a"r|['`$:Vn3b6 ʊOc=3|K_/g|&D7:R6(U$[ vRP+pهq?+.$ P90ӟZNWERbI}HjxotKɻexyΕrqg+fXeuAfQO`+]Uv҅m=:Tχ/d /8ONTDX7|ػ RG'g&ϡPU⍵E|M"pّE*X)7-4ư̤mؿ l-^MU/(XPƳ @~(2smw7|gܬ3uܐ{J7GYEy-V,(nU4  G6ϱm_=x=hrxxUT$'\%@yE|#2IՐb{)*(<|Ct’)QEr_/9qERpůUn O ʅ埨- Z]8 {l]y"$a~V}AUH݉*:g%-.`dDvъ҈:y[soe}i}zz!W \T9-妐n02p )G}(Xc50ysK,bU^xyQP(Ư4ƭ QTcƉptsE0]B`Eyik_HpҐK`dEG8of5y elQɁN^VQh\&ףj8o)y>`Oexb4{/Bު*oU7c;'m*ϯI᯳i$RR+]Ѡ'e}@_(θ;Ýy/@.t_c/LI届ʁ|Ia¾o,xfӒT6!gOWZ{C<:W(f~>L)fƀX!{;S)o 3H_egl*\FG)+9M݆GG!QT.̏M+)I C3]U.ʀłŅ[W[._% B3c'Jƣ4WݹVX ~^FMkmم;gqjkΎ\ǏGjGD8-Y躰 )oڶY(\'OYH,IU[("A)g\\vt*~_ |( $UXUxbU ߖƚ4|K, :crz߂- t}BQp$Sx`M;Bʾ=:V|Ҝ5T R{Ԁ? Mxka^4]6f1W7*/E [1~n ńgА4oK4}> =jKV,'t:Й8X I@)k yx}z>oV/&-e|:'c brX5rSZ>An$-::W{|dIg3 Xi{/Trt]ܲf];Lb-7 p6.ט͘n:4a`؁GN&u  rǯ66s Ywu|l1ed3#g‚̥`wN@g}gqH$BA|I B`mG={ٯ3Zq/Un9W " @\s nY1B$-ptM1I_/G,ktOzx+SJ~`U$#ZvQ`^O ]pŅ^iC^һ*3/ͻL,$1T=$8_0P?8?6@ 'DОExL=(!Rm xg?c CCae3IA JE?3V$ k{xb#hw`5 SydzoG}g)Gc-Ln"ږI.ɐO33SX,HE;a?P"OhTzo`?xC 3tFp~V/ L|y>@)=W[uљ"Pz<)KGs(>ly 1)USG}PJgr Jdtg 9h%@~ibyQO 'YA+. X PHy9% rUV>y /?9Xz,K=O+ ŲyDeQRp$V)w\ ;bV yEXq vq|AJ[$ NT/={6_Ukg"TQyP>yS4[ =;%B{ !eeb<-$SPPvBA(zVup-xߏtpEuƅF'mil; \;qӵ? Ͽz;e8| VHSktSd9z 9Li4gxɓv&'V $gWK9V r (gbU'ֵ]7A\uݶ/S,fsY,5Z& Z $`g* Xl: ۼ4J((e'R*Zzp)[`eI9q ϧ??$I>dl^*$qB/`#ߔ9 (kNZ8n,.ڿ;ʇ2E7tz V5ֺ$@IX g[ن1=0b!;Iw wn\yMC=Peum8~0r ],:3ЉJV~?G#,ln 4-]6" R*|?Jk5Qv@k`֎qX?kƐ*T+cyn*3v@G[_Etg-rx>7&aBPF+ˡ eTXWw!tidZ;߉VpJ Z)/4JUJ[hT ' 9 /Z+(.QPc,15q; qWU~N_*U[i y .֝W'X X6IwIEV0E_gxD>'$6QU16`)d!~k y_V|E^1۱ksH[¤Yfu4WhjoП͑3B@wJb^@_bG[ ֭j- ucXNYf$ O{yuݺ1} - H۫u[C汝x!9R$E?" V31 W6^x6 |bfAh/Ӓ@Sr%G HqM*tsOc6.&Hnu.*?[?ԏO 1R(\bcG㺻~jGʀ@jD[H,2FDcٮj`vXXVǧ?3ˤ$c-6یu d~vխxh' y"T3 t Z-~]@w$$@n\h*dxoMزu;l Ȯ7sdpװ$X>'dEb ;xowކuR!`D3<9q߁TC%E,r|_q$;ʃI|;N~5_| >_Å[/;kpt0KJR S ( OԅDĕ͑˹|?)kgr~%F+? kX7{'_\}8~趟=m)\JZ 4ArӎBhv'Ehw5)c)Wn\י7fڷs%yѢ(%˶dNo6@y_S~CANyIqrݖYD/(<yZ`٤.[5ýZjΪ]7q;>wiqwo۱Na?w3I+ΐN+Rcy]3nÑ&'L`" Z;Z޷a4ӣ_ē}o hu`OD3~qQQ-@HH4TDi$m w'65 <~.Kh X7Jh]K9`ֶú~.BZ{x7o\Gߣ豙6Zޓ7{8RQ|7TB5,N\#9 ~_5.qwOa [|aH7 aulOgu8>d'#>c>_U<9ܹ3vF|Ӻ}.u]Y<<6n/ |=[r&@h ǘOo_7_=Ǥ}q 2rḱ2_.)#!)dY(GYBvտF֌pe}K MMYמ-cne^nŗ>*6 IYM[y V%OI|Gˏf~7#a'f3ӌiT0[Z m`^kC%zsAkw߻ dh)uY-ݧLHe:{ĿYس>wgS2 IDATۛy 1~'hƉEi4!$q٫.{%)DzuC3_,}Gpt|u@?gߵ~/ؔmO%~ֺ?+c%?XNc?=jQ@߳V9V@<ѢJ pp3giMпğƌ_A\ łRUz76#ctm՗֧M@M6<f&\nZܼ/COe<GR|񚎗oA6C%zabm"5w^:7\o}|\ }hhMςۧ;_ ^T'TV#(:@@*Hq0ׁ.xi~ nãx/l'j}>J$S$šgE{:kns6P eo~n bC8,E_B/16Gq`V{ 43V lLP@֙ D|ohܨe/oa xY]08|.N8:1 sM 2|z& CQ9 rz&f@fs9y!M#2Łi?p)[MRJ,X<<ϡn^/<xEĿ&GoW À> u6`g{`?1c?Z/+`?,jU"P @/!vkZu?f(@}sM%<l0߃d@dz$/A/ o#!|m/&7&7bh'I4j>{^)KZFjE{щŋ;t00u 2$zP\9Q׉ՍB?%H2u܈0GF^~iRS0WB܎d@Ɂq/k&: k[[>_;AT7B_>Iy/oq=9%x6ᅗahx54޳d{pl/]wϯYCN3Mb/_a0UfE](yYHF-TbO{ `.]J\(\"e܉Vvb$/`8~lw=!lN0v螺Y~qjZ-~a4[_{a%?c% -`F$j|,s(=q ,GC0<ƀ hZZ"HP8X@Kln `+zz^g[t"Lk "h3nnxzt+{&6cъqzc &n*#vl4yx)!Ƹ@`UfV G@Y4&8YE-:XZ2 2e[\eqz[Set'O2@@lAY [ֺ+Ns__̊+3 %[Ԁ2k qvJcmY÷ҡ |~^(V`q47.?^+qZGfR>n atD؀~>~#_{ׯ~쎕<: ҈5,+?Mn9x}myE`o+yq+ӑdP#x.ve+d8~jHlO>n9œSw:̚vh[\A.G,Al%_FL(@_ ~smviL⻶\4W2?2*:_S:ms1< DBx ^A (=}ku%R?;\=ö0~`aZZf7OL;{ LY@SPZ-(K@d 8z{,sT  o&fxgXvљS.݉t_Q60M;쎕:Nհ *-OJ!,ک-qi BPM.̓,>ZŤ*L*.؁`+STƶTfn() pyIr OUkn \v/Z6a!#''Vt Z0Dn1F9BM֍5Gz B+}-<-^IC1޸2n| DCնӚC)]e{y" 8={8c%1im5Vh>^[0vRN+QNkm=0͡)8GBIl3-XPꃁ *uu )I / ~`1 ]Vcۿ ݰY{HXwra͆"^\8]YtuYWՑ( e-WnC~%adj 4oꁃ_no}kX+XǏe_coj_+O\wX- īJB8r]L 0BY8;/'vM)yx{w oy DC1u݂U/ky9VE( L!/w u_y"y>LKO@n{+o#uA0PiD(\VB\Zn}yJ9_Zn2r[ Cدk_f(3$pnF`NJ9cUsOe?)Q ƌo|Y ,ܗ䍫: bjV}i2vA.jxuͱuk](3- вq՚VLj;j}yFry6ѷsrJNvP{uN/ԫVgʺ{ '}uwL).B8X'L=#.g9}/ tAdpw5 Jd>KT ?=$n֒|ZgkU?YnAxe7Ӗqg=3rO޷C(>cYdtf|  {kp8Koabgoȱ]=hj([Ak-A3~.@H"{;Պ] M/W h"%Ruvus{B8 *k$Ýq3L!)zfQپ\vD]F?R9q/}o| ?qJC/AfQ{Ŗ*$O\ֽ+@pFľäCǵm`x 0gyZ]LT<, $ hRZpsO^8Ƥp t$dp^+K۰- i['й7Ch?iPa"Lj -c(СeyWe}{CE~'Zewb.n֝'1L^V )?~zs!FTm?V:~tc?.nQy3HT|_h]W<,"rp[uNԀ5:`|ĭł6Cˣ F"b-46~QjK7SV?YޖŮ8,!J'4yf̥xY"@OM9-MI]P[x:s@ ~_r;zf"?^!4fM3hnˁw͢`0 DId[Eoz<`\}k/|8{c% :K E ]*> d_@ b읃UB/*@nOK[|~J֗4"00ę)ry܇E\*:[Fb $MzZ~ ({ڝi ݗ5vw &A5׿ZfhvdXl ̝,Tk[b'y-&ܻ0 0Eu.,~8<)𷦤dà2[ocgo.uhB)diWRn66`JG HKׂɥ.&nP;(ה=(,(kJrVj~% vR5XrZPh+{s)+VVQF7 ]qH,uq\Qa%Bh(gs%U9@9?'Hts?G6z?Tt{ VÇOҁ0Nb^.FRM641Z.ZZkZ; ߣNP8<8:XuH~(O xi: R,(-T"V9즨#{cBiIb>VyB B}?5xN1ԤCAJ |Mڅ"xcRr| Jf 8y)Pd\-c ,="qZyd5Bs:h+eIcE|tauy\7 $u`Ihr4uޛ}ƣ;{~ K_B 2V~)G `ׄfs7u*ьѨpAu( ,c7[aha4˼^d{aI$E5ul?jj@\TrKR ]UDZX~ %Aa`t ˪N ́(N)T6+:xv@_Jxv~I>S,Q4;5͵u&~zW_n 5"l̎"{Sޓi#XLG)ɠDi*O1%P]*Ch 4jh0ҋX+Xǻ?[˻?3܊(,"2#9i.ƌ}@Z @%/\<»'pD>f3b~p+ +xIJ#sx~Nd*Q(&}VM 7wbBdᑉӢFX~[4Eca`c@,S65KR索ۏ2#P, j$xyiP rZUy7U!w @j'#@(rtj]Z-~j80"|ޮ()MB+kp$Zᵍ(clZZhl '({$gϐ (C wxaopB%PP垲mQ{~=Z#, R}ީϾ38VwfDQ5sn=+RjN7'ndVdm vzKCZkwk+wrL%ҚYwĀ0/h?C.ylv!/ju_qa-S=N -%qKdd=hl IDATGnጒ#@~w"$+ޔ-cl-w>GHo$`? C3%-u]y-1yCQ4u`$A4ȓ8S*:Ө  VfصSA_J08 ^I^#75!Jw'C܇^ġhol=<:A Ê-qq diU&v/5*EKM==B˸;T(w, P{(arlҕ6c=LC=RL MIYW2_xϡpw*nEf 963%Qljh@K !틗A i)ǬwqO` Ó%1ǥQOL88;wA!]wVo=I?o?/mm?c%xWm>eąx_dFHdY\Z-#*{Bb<(jҸé e bR0eNWIZP,PK#@HҏA$-UJEnui:V~Lbs`9uE@5 IU7G2E[Tc 9W +y*/n M\^UU:K'qy=D/z-ʔ>}~F?*5onZ#4d̙+Xǻ6xzf1L^tsT46a%)wϽHXuY2VÅ\-}k0D _xIפ vN!mާwd;[N*ڃgK~*zȼTW1(1a_1 t]Ou3L'Bk oV賮`5ξ/%d2ƞ)`M$%`@<5ΕHCg$x-m1^Xz+IQYowEJX :޵!5n_Be,3N5߽}Jx@~2u,=-21cC'Rji9ƾ}?WNR e<̛T"%J]IYnW 2!R==y/ HVtX(V~xνbυrޝ$,pba.֔4:Ib uj哫4Y8%ْ: b&`3pdh 8 (X 8#j0x6Ja$XS<&j-~YX [ni𔷉UD#nyn)*׭]Ip8![^"wL[m4E|71*x0N6%ep_:Kk=0x,2DbbMiQ[zLIjVb{1w>(D%֐M-U3UOvLD%CR!`{3]NwY[%R _AÀG>ElBapia{@kfiпPlc 2iJif9aU濷 {`R}ROQ!%zNiص A@H!NրƷ4HϢ{P4/brQ- |zsqC?w̄}߫2ơY CnפHok*i'腑.qWq`fBBo ?qAN Z֬p:GV,kc;aHaݬF# K ۊO?m7Vwen%D:-+'/"\*eO_#F1aV>lW +zl,{Q7f>tƶ9Aނ{+籺L`ͬ ‡^OQK!ϡwN?Iee$bND%xfoY[Woѫt?jޣ? 7h_ kbQȀͱ e8ܯ;"8w7;Vw~cw¿>z] `@Z 3{IWZjD!R[@lɮ ,ž/0όɫyS" 8y{P_֍l2݁n)NO"](.$΢hʐ+5qE 9!DAn1/+%x`oczTh*|:W#ݯjK/H0wDPd%{)/-J fj@ލD>~3u<:X :9p2<&8jP[{7ܧIQ \2ŎKZS98$er͂6C.ߗ j:0^9Ft8$}4cJoΞn}9T4B( |K+欶tDB`{ʱD5==8D&/*NQP GCQjhgNn\RxJ ;g@S3|mMA@yW5`h-( <$ygpM_8VkXECp sܥG9Vw| m !h4>Axp ޺y7<4g5KCȫo\ 3:>>g&ɾ}qШ8VrnMfM k #>F>ݯ/Ȏzem[҆XjL.Hd=?n#2:u'BU=HՀ%aeͥʭH nvX*PkA`|Nn(zD(2_ 9'F [f)FټO %wt0L^܁  j{e_~c?qSؓX+X;>5`udŗ/,56siD;F\{e1Ⱬo'aDvӗ="%%?:G!9 Zg?$PDfR J^׭ʷY?O]‚6߈P76Y"%Jޜ5Gz̧,%sg;f߇[/y-,r:Y(,z_?> X8 3 +Щ%kϡꑔ!߽N [m0w_H~"Z0Obgw`8gZW4I@t/vWn[r5X" |G=‹ҷqpުR2Yܭ%Q۶7dpJк7d^$S B:V8P|(9]ex|Qw>b  m{Iu"ǒ.\@Aoa wQxVyBW2>@05q/alYHyVA]U`Ҏ@dC@WSP|-"S Ʊ+h>@{R VE"➿4vuh4kB6>7<[12?U?[``l@/op0-\ m=:pc;Q:r9%l ؃ZІV0Jᢙ;?{Xu08PQ]X F UIXt=!̗2#6@,F]ۧiLt@ %ibΩ{!2Y"ҠNa$҈y`:v3#p<6niw%Z+`RU(#Aټl= Jd 4@զ hZp`gt`g0#c nmF`3Y`&+P7K t߮Rc 8ycc-. [5gc+Ҡ^i='%#U 󶶯GYZ0{ZӁȥ4mŬE2|ߥF 8HI ҷh$;lO$XvRs,v,pX,ʂ䒤#HfQ&kŸinC{GGW=ah]0M6wШa3i<1vcFlGÌM-{)kE>KīiC[!Ȍ/}8c%xGtvw_ёsLh{q0"v0VD?g| 7p3/>~:iVW+Fj 0+2=(.)3 VH-ԾM:x#-|X*+'_JP7m̟ ec X /GW`ug؋2d^wW\ _ '20.a<|O\~]^L'ow 20>0Z1l< ێiVp`#.m†Gzit՚vuAaF>=  Ay#X+X;; ;'5`QʽkR60ckbuȼѭyy+;N.< ["3pzis59o3s@;cij QPqJ{G*K7L({(+Bgu. +#ɨ<6a-ޢ=p1l6`6Ot5R.Fu&hӀq옶3v'y:pggW|~ ʦF CSdڀ~gg{5 k17跾 :V L xi& }ߛx4} dxXm6铫hc4(=jp7x_ѣ?5)斬l֫y3G$0 /;Gq}̈mvnǼcJ/w< PK"%2?0QC!/T+pw G:R _#)"%°!lv8>yJ =(rsWpx8`ɔb& ^G@of>1 1Mk IDAT`+DQRHذUh"@CK??Fg<}+X7D0_9LƛFfA2qZg*SK,;bßx%0/Aм!n^m@`;'Q逳[―gȬzxJ2( P{d1*g_3X<PcҼ T?[,8N5`.vDPzĎjT$@D<޹.xЦ!ݫ/'y&99 0c 'c174b0317CG1 i&¸c\ ߙm?t#{d3iE$@%qhԢ@@W?۸ ?kc% ̯_@04и19F0>pA oB7@+jضZ~&rgYZ`K{E7+ת8wpB`!G&c Ј7:S̀7 L2##ڽZyݰZuANJg` Rtpk tkiQk!9H)w ?m8gafX@_/ϻUP*r@W !>>uK4r9 78!nF&Ġ6K3l b46~" "@qԇ7Jk14O1tKMsW@3n0Rofg`?p7_o_XӋ6o!;r>Wu䐛M-p? v 0+{o^]/=z1p$3. dXۊ % GY=tZcqZy*@.姧1$$=\ueg7ŀAo]h O}KO>u*{nvHS^቏vw&qɠ8LG9n 8q!oszJiX@1f^,wf5 ~Yů*H.;5\o|WT5asLLG=p $kci}%.S A c *J st>hZ 0=AaN!x֌`}6 ؀N-Hp`X :ӽ;ý7|K-܏@FK8:prb#DYFf W3/UO,[IA~@'ؗKH!޺`3w7ҵ:[t0& U!45LF %O7OW.Rk0Bm <4.1Bpr)\/V_c%?cY\06yg@pC#\>wXq<I kY,o ӷϏz`#]zg'͹f43? 6 \U(hěW{t@IS54RHeJ }M2Ւ С m91Ә45^[W/ ˢ4ϙP){;JV9aPa( ]E8KF̛8~8w"w~XcԬ>C00 `Y"̶hQ N{]Po(fi5r9~q4 b Ty O <:c%?cw6o5C/G>x먲Oqgw ^'| 0i 7-?aK[|;:{ a&ɫ)| h8µ>sOæQT\؆ >-Bw7D}S*#QNY 5)q>wXy_WT\r&iJ'5M2]; ߨ @]ŐihsEb*Q/@.bǐqxni-lO?$@&44=ƅ4!M\f'E܏׉Z3e U $ڠ. I%q&;1Y9TP &[D5ej2){d2-zђ~vҪJf2idV27Hf7 PsVN/ 9ܛ%P /zƍ8qp?Af`}h{^qwrIx2 LgA匙+|G22{ě8{ttط)y`ӒXzFw^k~9:u8O@MH>te+TPV5@Laܗޝm(6WxD+PJ ;5D*LJ K+8z4NOlFH^~=dPޟFV$*}sD dI v2&;"vwQs;eҳ?F x- =& KS!sA*` BLƷT. fAi̓l(%/*7(?H}z,}o[GєӈHtq?2^0paw,zSs>J% auװ2.AUx5=oSkU 8=~=]|{83IzRۍTb "bW8)OȆ~^??(e[jsYGb곗F @\K]ύ'.PВ8:!1<1# PIW2;Dg4Q f;gGpppSK?'-qjeK!]=lf %PR\)Ĺ!$z-QS!4koY*Nϭc3nWbQ>DΟ tp 2(o`Rs QwS,Ow!xoOOs5֛li䮬29{M};ŊSjGSOu쟨"pɋYvo#6Bk)%AsF"jI!G61QuG6ʸv쓢Yf0qTN3d]#m #XxTE(!|xLUvk m^A@~Xpo)_(qWUjFB{ ~O@b|{M mX4 WL|UʛCy v< @̭{#Ck7f ΅)zNN;@ ؽ{ \SkT71BP~`M]NB׳݃?AI0A*rѹk%LK ",'Smu( 4F|[_G =zO1π+rxHÚJZxo} % KջCԉ۸e{fIdղG&L|AIu:G *h뼖H #+~M7!-crF)K# 5ly;~qX9L+g΃8$PO{8{vv.[@X>M`c\E9)Nm)WC!0c$CX)uo&Aah RtQ+O.e*˰<}S<Q&;9.Oxkcӌ'؝M0)ZXy^x洱8;)$ yh6%B9D|ˎL޻K pvq{ o$>7%ڢDx.WU"@kI#XK\!%+9 SJߺp#eSMs@ y'@zP#F> <3܍SgZJ5 +CfL0/kl>* '@RBG3RQk]ٽYnLܢ@|DO::g-1ٻb^'5Yמ~rR4䂔'guhQa3Գ͑Q̀̊FDQpxEF9_yZy?. 9^մ}5)vKFy|: Oda]iKKW̾σS6EZzR$56^S 0?GZP(n[P4a}, {ZE8 (߿ @ȋ֞:}s<:7+>d5#o dʆ(Y( PX[C(@C IDAT_F9Z60*мʛ7ew{wRiIqEnrsF(0" M\mJ&7iX[lc0&>胗A  06 |;k= zhzi\ӟXB)}k+L| # jAph+ 9zxPOӝ P(q/3%`G"s3ugS참֔=\6ҳm }XK0p " M@2d q!,ëO&?@$I/l3\8Ah%CBb3a6C׏|| P?oYw@h??K6J0ݽ-2(Sf\pG\Q%G9=_aڥ)# g𷕀{?|w #}AYiu!jSFMS w8]EP!vZ=HGe qUR!M^XوSt8n14M/ r'* `r2g@b|UG<0@ i~ɌRJ .䌆 h,Chs$W@9iw %`s|kQ>s("e8_KZgA(-p/tofԹ)roxE(B +L{Y }c >x2_cQi/ybRR&MkJ `IM)7Nq2:HdPvTaz2UOa<< dFDAX_`ܕu,CKJ(C}-p ]!A+/^EYa |NӛM2+y :`b}YF!!|d(MVGpϡa&S",@Iy#FֺٜH +frVñ`PF#J/[ P}Wcli*8a,Ƌ5˼)+2fi3Թҷg$bG $wrgݟ _$1RKg8h& VYtx/^oE"S]"OsaGODɩ(nD"H@WSZ‡Z&楪{bF 9cz[]Dn2]9#bז*dϜA7EbX# I@PO4?B؈l %ޠ 6v#Klbh [I yE:F"BnQh<|rq]ao6|y,5`F\ٽLа5o|pZ&j(m5}p "boA)1Ȓr% qAQ E?}0ǵcـ4y 5Y׺yƏ{hC.lΣa=xAFTK{s12+W3}\jql1I%+6=@|HTJ^"(7dM|:f @ qԆX;GqgU{&PWf d+Bf#2O" Fl*S.8=]D0gؙw4/7O@-"`%zbt鋌J)z 3Po&gP<ü=4"= gvv{L%6 jJag6 O$% : hW`I6tDR <) ͹ Y&AR0zuZܬP@s5D(RH]R!Rg] k90h~@a92O*\&dMoE(H-#U2!^=A[Ś2c뱶j ge^ %d] 5 )IT"%3L89N/ǽUO adq]TA@~y ۦJ~>~I8W.ՀpCtnc,8(YF#3e%BI=_۶A.!E;װ;㬊WZ%wzZn5(%^}9+FB(`hƩVR;F!+#[J "պ$xqXfJP峠}yoPS>n#yutp 2 'V0, φPrKP&ԓ@.%4iRK ("^a1\lH ' SFd#!hC &F\M"(2@ B iY n!aI5ԇxFOV(`woټC01"D =\(u:ό%GZ87VKpM@jEUvd]: ͨEK/qx@o#e& w}}ӫߦзmV(.\l&-Q7{,4T l' bM6YBӕJ[Z,njXf q VaՓ2# >2CrKk߆H_+?1H|O~{#(ܬ N-kQ vG@!6lnLD4ˁ3G>E%!ԬgK˫X-'8؟`2I.ܸdc#5,`D?d'͸Gi&Q~B(Etu{a/VjX棠P5XѳPjx%yh`>}/7nbjhu*Zտb&%I "{r*?^or X"V`z!}^ɬCU!+MH=+ʆXLY1Sgh2DXzEyD2gI )0~mV* |Iq'I wا&-3~xN)ls=۟YQܙܜ7HI0X¨Rb )_ Xa|2bQ)/ITa EK5U쭎{1pOFFyV.PgPx:[ 'OA̕;>Bst%)M}6.[j CДoh&Ygqj<~gy+o6 gLr)txyUƈ}juU^԰p:־>  w] mފQci7LG_ ,_|l%|I|@ Kcwu3,&X,:]DHB,;s~aEdkCJi{Ŵ D*Pq@u JR 7' c6J[ t}Ipx7i(|  P*4uż(TR1n2ǵxu'QM~@rMkqW,ކ`ja7*^?Vj~+֠jQ,ZfPrLׄm{ཻ A/4^!Dhމun@쐆kl02{|W\X ma5V"ۘ~R;{J+%w~1 E (OWy9MU5/B"@̷1oMkhK4+;?Sq Q?^+9:O@)!0?F哒194`Kz۶m~M6 MC@+%/#y5m:lhUpú$CHGޝڥK AA`/\v5XBJ ˘<>)5og`=?|ȃ֭At2}VTGQcI6]({cG8YīĎk*ȥ 2BgAd CAMHaP\%u@1[FR! O2?G>C2aenRky+^9+9 +E/i"'r͋8iBJ~1f;ƏG:(?s(W^~^MHoېЁ_Õ ԥyϡl7o yf`g5ez| K\k=`y@"` 8G~sx!lE~N3 N[=q?bBɵ\Oڰͧ߫BE=OOԢqGvCbQ|Ksuh?XEH BRKڸ>:A`SbF@2KZ1a@19% FT\b." Vr \(= kR=r+Hxqc3qGbG/S |MbQ>)CϡԌ --,mV6<Agy`U WG@͍ċ&AЊ'¤K8] 2my_@؊+f T=*GqQ{wnh{_h[*>޳'83رmz DkbsY+lHf>l'7Ht ˡ vv%H,MKj?[ #bR]'] X.oq7t}[%Q A#gb*{ FJ<"+(RcFqOY6Tjd74/ }:~Z'"LN T?0QqO=k&;bP"o)m"?)y+puvJ)~8q`ڦ1_@O>)*LQץ/oSSySG_YC mp[Ѐ.M$SQ¢_C7q(|<Twm ־h]+}tiWn;V3H+>=[cz@e~-vWy:Qot8!JX|=pÂ)n] $@(PKkT A%Z .hw/4h\Ԅ:{0hBt2}cԫ%~̤4<woc,zּ"dG !WƽyS =k3*'Zgt| XwNڙ0c?acQ>iT.o?o*փe]6m72% 2Tz?f.CyۘM;̧(Ua}@^# LlnR*"J=gwK4?@hj(A$'q p(8oľlgVC.1 9G` VBkC!yvv߸gWT@d='Laot+Gc(} RN+ȫXf%Za@jRfu)p[o9<> qF</e)l6QS1R \߻ b"kΣUם5av v4u/l^Zj\:_2.`o֕v.R*lL~2Fc ٽ.@BMI 1&2z5TtC IDATwgO1J4 $Œ "ޞ5 ]rЎ)1z› k".Z`*I"?{-0@O^| 8 ڲ?_C8jX@)׎m|2S\t)ӳ]M@xd@xdE;6:d*N‚r ?;,OWk\ eq3@!P϶4PbBf<:{&#\{ Szk}Lv#.svb sX%U#089aow>feMʿ< PM4 t=7/v h+5bJMw,'*Ծ M 7y A$ ?QFih<2;dh~H?ZoeW888^X`b7p#/ym%zy՚6}|0@{K6|Ε864^r ;2 d'+ )ދ'Ls# ,8a\'dq8ڠSРT_/a(|i;"$۴C3|N߳5ds-A&ӄʃ͢ZFlOᚳ"mQ>!BkF7  MaQ~2c9 JԷ}i$ Ul{raژuZ)~lcpҮ9=}w w " HBE;\Oan_j.!2^G8=+F*w9 3,_֖ase̞k A!~>GɈ<Dz8";XWۼv6 ҸyXwb®.շwٵIߟOd9 [de/_#DU Dkn 'ㅯJtUx`X!k .9^ꃐ rc>ah-J7 hOLP*w&4<'6 3#K6J\Ӹ?XZ담S/]q< hsQ!XP.d/UI '&bPf\凉64Ѭ=#HE LNpo`Q~2cI]KGb(|m}7|?7)% _Br%dӑOXGI 9H~!o!;&ag' Y_ ߻*7 t~o 1ΐ +gKª OQ8yQɵ/zCNjd}lItwe7s1c)6v.,S?Xu7ЂAAO^1+4X[<pv6F) w=j9`+^0&2 =hoxҭ ێjܴ5H(d]b)j@oBZJ5v.4sSu bll5 xdmٝ+2kk\]!lQ*xPtH`-~6tж?5(w\zwˀo%+O(˧ingZ9`;YChc!J3~5KeY{ڮz!>.[H/(bQ~2><`/\~xyNdqܰj'XTHBY'JƋ7_P*~+Rr/=6|a1KxxV:6Xy 9oTKoʨv]+ަǍR=Q5}ݎYO n0!| X3DBZ!u\kpV{("M] 9$NvsgQ{h3)!g6n W6u J i^bHg5ՓxeM!~.W;6ٷʖ}jWJ=~t- =8ePvf]/d ^Fy+r6~85C=W(lHɀf ֱtՉjTf9OddC޿W[FFyVYuRxm}pc4_kzσ+YQHz3  y 5O{t "6G arZb[v;)և,\_4ްiy$d„ n^-pQFih\}ۣ+j8gV {o}*T9^RP  ܛwoT,WY|B[)Xcnr2%!Ap *5|zI֟k<^\GӔƊ{CQH&FA1[)fDNjxǍ`6I8ɹn;o;^u{j~C7鐧( QA@@HAKEcZ#*Y7̫/ e8KQ{*I,04riы&wC+}7WW~?|?g}r]d4=?bX~ke(k{Xc-"fu>j0qΊ`o%|4BbU'ӻ\#KAqsqoo T67b0$&\ڛgHPnO xڕA`+"B /:K5Pz2n \~Dz8ȋ9DWd$`8Pg6!ZY;aМ߯ r odKLU:_&).77k ~-ʿuZX p=tSư*k9qlU*z_Vi^6f=lD[K5pqἌ2OKFS"ӝ} M&؆lfKl컉^WڗӒs\98-V {eDy_}ioه  ^D)aRzgFj r!8{cˡߵEJq륟e?xp)5HJd7Tp=7yg%{>Neux.^P qWOoudMDU#6v.X8 ez? p>Z3"ڿ4B 3^E7rɥۯ?=xP}[ܿ7ut[ܶ5[fHAgx{"D0\/k=~Tx{îѸB}pR6I~JA4Op$yݽ`,%ґa`7]dHYRO=\ȋ%~է98[b !YY,\=`~J+ P *O ;;q ֖|}\ %X3XV@u۞چC`{XQ,IE!lftv\z~YeONF#_evGҫDO&P+\Iہ{Rԓ-@UJ^mp.ޣP+UMvX}GY`גqywO')gnfW@v'8>^TbHHqyQal\oʣ6DOa)Pes(!XW۔t+ @5.X3*$gLEx)_J_#VoTD)WS&]x])tAl\vcI{9=BO 1.On gSa B6#1 LfUũ7/*$zGK Uu'暦s- qB#wDcQ>Pe\:BɆlmۛMHf@=țG~?!{Gۋhh0g)B.τ7?ǟYc"tq*dݟYiq À,ɗa?ioyy2=^z8e Xk"԰Cvp] jx2^xl:h|\ lWzk&UcG>ռ7H-Ւ Jqtk'6qe4>][?5NV?/ 🛊56 E̕_gpoU[ׯFA%?Aಘ%\!<@FHs v\FD~䂽+tuv<m0A;ǿ)XȾ*;dB A|e1&'|K(|R2bʗ{JֿpzXWMCaQf`()Hyk(H}׉8lrd j g {^: Yg9JelP&@?PL;6~r֔UsTT\1hC@A"=\P^ ?G\ %qOxj9; 9vSoiF`AvD`k9š(TYgn [**C%TuVek '%QPk " 1FB,K4I#iFw~yho߾v{:mmrĕ>3|{BC IDAT5,-ip!NJU/nk4_DHA 1i kN&bHS<&1^S/ ꅇlVE}pz37W>с 8NZT9 {h# 9FhUJPM[DMz U^rΟDcp_?VK9E|M.%pqgP*^۟]Ew\51@R1ƴ-UmX Q/j>#gx6Dɜp#M@S)2\%RGP0Ź @І I(D!@:gfYa\+C=ix#Po$*E@U[=CWW7Zk_]ΒX򸗀hE bXs٠x<0 s*(&H;ۍjVAQpc:ׂ5Z4 +~b@ !mpG >{L $ܯ#$0a1@'47pK/M-Y>Cv71^9<ʱ*@XHKS.T9q[b(][1k.5,kH. $X9)L,mx/@Qf+Ff˥F8(1\y :P>0&Xy.<  }J? C|i寠o@|ZjdJHc8aT&,P;n>az4\zS:B-|Xj{qW@Oz+u2Rx%|:J6Ki pzF+'} 9Q 9?əSgn)?8*|Xy s1q2 1=7kzߏ-Y V{Fk5rcE#0p\qSypA~/ח|Њ}dy^|q(dԵ}/VZ 7Y, +( w0FS",TN^ (^qu(=[J߿#+bFq{~{us.rm{ެފoEGXo'_k/lf_~@{/Љu'=p,`Q<$Ŭ~|aop^@tClb#"G^:B3`bQ8amǴ ܚ<ca]44ϯ]4d@rb܁X^?LۢRc]^Gx ;d0Ʋ! dh@Y<2YC[QN)8roϡQTs!Ci hM #6n}/*{4?aYX)\7} Ăp zWoƩW_)y7-FzNJFkl^Œk=ctu#m*S~F\J[r_־,4t01ﳗHks |C ϴdpYN@pר[|J_ F>zW|% @|FBNW Biocr$t͝vоCz:OZ%e?hhҡCQ3A^j:*|_%XhY$ASf` :)FX_@3=@ǧ"߾A"c5Pۃ5ݰՌVzװR13x*Td*vZ wSx倀7pЅ?[: TUC2 v/S +k2DE@}5rHH¶,ՇmL j(/T(JB?\5ǹ#Xur,srB- /7tnΐN}ZkZk^C (XhkNJ kG7"řCvb)_">B [6"V聢i/~=E}9Lz:%+AJARNj(nT0diIupӄ>߳_ |@>*PHV֠J<n(jDZ J\졟Y,}6[ pȜO'ZzG}BwHb?~Pa˹%2|gDJHn\Fk Bu'#(lr8 [" ߏN}ncu/\1jXs;d훑W*V6AQoWՋT'ư-F29>S2"gwQû͕_B0ĆB<H m@m vH єWU>=q8nӛYo` 3r/EM \Z0ZjP_f-2K5 U-2WtBvAP5?] I1vfY u6̫9B׃='1'QùΧ2IFh^&9ڏuQ09BQ?{k@io4A."I,5oe8Fƾ}AMz!&p/l 88 I5E9e +oY` 08HR "Mr9ɓgq%W܎6 #v-qgC}Wԫ(80F7N8C|!߯s*O2aUY(p@apa`çGhQNPҨ܇J@ȭ ?y!!LQa q(P ʠg4֞;eFYp"IBCp9oi|2oe= ᾊ5;8dqGp-Q-f.c$@WBKWB aos 㸷^˭o W%$ )NrT}d:$ph TqX5P~b1(D9 㼘0*%2w vprj7Z> xoN`'㈋ZQ_[n^UQ8Yo)l"\*zo(Zjxa 8эb^y1Y@i834\hRLBho,' 3ֆ<Pi*V:qqҳ8~$jif2]i9i ΃{/PkɈկ)Vj>o}:<$p3oL}'8_;J!<03d>yPLrX8!ί$S䈏9NBD4U5e!ך,r%\\3AZHR45Љ﹐\II< Q% Ol 1ZJ=V7EGgeo=;(=;&,,$ P @oOU3  .DGkhkC3+lS};mW uRs?~[F'âf2,FWoF+h?X4A)8{v}= cUR 1ā>~uBB< ::x5n(+ TW(sNk4S!*Lch@ !_9u/\]II#- nNmjD2DP }+u[-z X>~(:Kˮ^-#}D 3bމ!")w'Gb|>Wg[^V"PYJ/_~C88\87] ,5Xߋ_jR=H5:50/Þ}p8T#1Y1}8@_/!ဪuq?! y{!bU_Zh ǥ'9¶/ԅ(^_Z@'0G8[DgW<3$RkB8`mr`uԐI'_+kF 讌`QSjTӻ )J~S|D3Biu{`?:d ms3'.`ttBgWkz,^م%e8G+sTG*?9(Ӕŕ:@n|6h{R> { h5[N޿s~k=.Ip _8?_).6?v@!Gw6кEK^+ C9BHS 3pNrIZ49$@ $&V-p(堬C2tbQ>R e%}hDy \Mfl9> rG>Ph{)Vԋx?e(zh|5`7c>Sa8Zs!)5(ișY L\"4 ط' E7!s@կCv_$$IL 4:z^x9It(s+;'ȯtkPTp'Ug$*WKXFqR2)JRD%q1T `| ehB;+EW6%nvrt$Fg9k>EGf 59.o"@/n_=9Ǡ{1P7o5l6rxg?KCne_mڔS?pi jB+4q C s|rJ>8(^D]=s(flEk@[3Ogd|l]XB(T vab@I=PJ֔s1 Yb¦P֡Z5HKɀ$E09:M.CUTMKgHgRAӻKqt,AhC{% p=~s{@xvMxF9ߧvZ}ͧk124= q砡PJ#x9cך ?'q)mPXa<) ԹλtgLj ; gq$&X8C.& & uƊ ` @ zTG1P$fTM!B(q t N)}IJg@)QHCqA4U>G(5݉ :]%\IH ={ /~;wIf^4ލEݯ߮Ѿ[/'_{ehYrjg8~n /scpP!3W}+N> ot.]6vp!DWZœƟ~D?qEօmpez@@>{K&(!!E9 HS߁ϱpF@Sn;`4h9F>/ΉB*J=}Xzk必pu `f0'={C/äl#J >8P-W}%M{بc:==?ɡEs28B]|.d߳aBl9 9}k>(n[9Vλ( I:$Փ{(@€E(x`z=PC]71+`DSC3 C$MHRb5 )_#\ K_-$|^|.MNjFg@6OF x/m~ڄ.~7lUQڻ{DZOc|tUcupm]4ַ|D)J6T&9Bׇʧ2ɂ:&*E Õ$IDATn5࿃E^\zHss6˔H|{,X8C.}'&dS:$()tvb w7 B{!`hިiџ>AVPg`i x|ǒ $oÿqŊžndc(欩N< а^ڇގ e(awc3jFt-`5߱PP?4hYC@  0pALh(:h@; -h|wT>$/;,Tw䕹"oj|@) ձš~|.ȆB/\З&:tK듔mh $>!%QTާمkWLiЂp#!_#8s8gI')QM?&r;jQ2(Ulr9¢uy\x<y31XoPˇ='i<.zCR3}߇?[^s=pSܿϮ<p$0ۥ+ȝϝj~E9PB|BIBFª_QuCb4kV~iJv ܈>CW;Zk ".g8+&ƠM|hV|>Ctr'8%+_WSW =R?'5Ѡ, 5fb=6m W* bT5Z)Sᅂ7B)ȧ8Q9h@rDcZ#M~lлl_{:9V03DL|B~eؐ'h._D9gѹd ׾AtȲ*:?7 Gb@oԝ'y_g;kGlK[cR&W ]JzAV a@((<; *(Ʉ>cVFgrZ^l+3C‰WsHJ/^;/D>LoIWNmѱd ׽uֆOE|ȲcZVޘ;WH'Cڻxcwk }2٠sl:&z;.ވ >hcIJ')j~~Ob%Yk?¤,D ".#/B cRԯkWDPr^K皛mwBKrn`?5^]:򜌱).؜fې,oXkq" N_OB9y  ע} 68?% L2KFSnrBs4g>CMv>v$ohJߎE+ߍ޾"D\v??W\8s  4*_OZka -ƪgHz/a {}_ᵃ/ pe+=BoK-v'Aq% ETfkǂAsX1|X?6IuXkmLP{7>}C# >P)lk/f8 ORz>5 T#)i,Yˮ݆eҾW D "U1p{9=@ʴpF6g *;:q--t =6wcϳ_s?Tȭօ}a V/x|ŀu؞غi_a]*]‡d%i$ dkMrJ5^,_~,Z+\I W"fͪ8y9rg6R4e>lHXq[qߍ+.4a/W d٘5`sx=xm-jRZ2<{'^ JԋA. 9~VP0>,46T(-LtsJie7bu@RpE"`f`8?pgS^Цgm?بu,ZaD:)ɪ8|޷7܃OS`B0r&?`%.c0wIj1_p,^;E%OuC* 0>a՟p:O €&Qy_jzWc۱m JK! W4"f g>yJ|Ed5%o`m+zt/_s. W: c#m g|n 5§{q΀yUC(v?x OT k.7i0 }Y%ލ%&Yt? A @gFq]8=x?}k8}57֗Z]XE@yu.) x֐+C܀b~C6Q01 ?^c4!WI zEע7{Ft%Պ!@p6~gŽ_Й70tHHt<~ؐoɂڧSa7Ş.au_h d(_AL?6Ys^x0Zj.J )P^wMwܵK)3 ,h*#87tm >Cjc# N$ׁW* |MȮ(?1n@ {TY ?OKRG/z܀ޥz,Ztt JM#&A("`f4@AX=X V?<U0x% 8}y48(㪟*_H|4)|iJDgHҾwkѵH,I YkC \A;()-m{`*G~hb(䶂#?Yp ñ'/ I.XBXkEoŢoѳmZpq]K0vOt ʥy^@W9hvbPa6AWu2 sA Y`-5]hAX7AjC  !"A   mAAhCD B"@A ІA6D  !"A Y3ǧ •xA   mAAhCD B"@A ІA6D  !"A   mAAhCD B"@A ІA6D  !"A   mAAhCD B"@A ІA6D  !"A   mAAhCD BBطG8q8~Ɇpז{{Yidd;wloͽ[ Wj`QKVP `ι/ˑ z_e 86n}#mpqLx#Sn׿_bc2]~I|s^>MnMH( W/Jp8 Uf8kK 5'᳟y>݃}{Mcڷw>Gg%F>МzٽkZ 8;<{W8' n݆{~H<%B#9BB/yf.<`ddxعc;>fm'ܝafٹc;~Y' B[222~摋2֍8x`?,֟ܣxxN'?>7b=3^3 _#Ms* %O<؜F<{׌?v &.U?&"@h[$@h;N޻u֭ wl\8gORʎ/-LxٽkZFޭ۰ᶍv؎gvj?x`?v>$a||{&]Å?5 8a V߄?#_y?nE8q 5QRLl}#>#M(mvr_;(M[+67߽ 'M`=8x|Myǰ(ڎV+/׿Gf>O=8ݵ|ӏN0ݻu[*Yޒf9\w6|>rxjCvysܿznM-kxGFsǗ[*U6t&&*׿aȾ=RhYՈA(pm`}MUX{~sqY`<Vݻb6l}#y+!iQڎ 4y{3uZa gC+''Mf*Ǟf駞\]rvrSAM!W "j1AڐvLǸܱ~xs9pn cNorׯ[.̔V9NAԈڎl#δ駞ă6mK{zjboGR,>A 54'?1= VI{==-S+/tvsUoş?2'/ZԧrJHAX8KWAk.640HVqا** Z @&qmԧ b`VZ%V{r3_[%lJ.ܻu[ |qLF8ql^ dTf0|MoBKi׿&8q _)斯8q=gݹc;=nۈ;6mvoҾL[L5Sd/> p ̂5GrlS5iU?؏}{t1ܹce s|N TjAvۻ'dw͆ olm6xX$5 =&>ԓ-b0 •h%pKuX?ϦouA=#-w6ϿᖟqOO%& | !c{1DLOOEMNlVw؎QCSpp>KnMG{*ru|qAh&2~98Sp• A f2Gx7SiHx)L+1/fփ \ڒ;6mn*rϬ}?=Ȝݺ cSR]Ӌ= -wms#}袅6oYǥشsY$\ tGrf/r[/ݻu޷s*&xо{p+==m+V+r3nC.E&][Aj[tj`QKVP `ι/ˑ #g׿FV@PJ}TL[ 7 [["@ U!9 ІA6D  !"A   mAAhCD B"@A ІA6D  !"A   mAAhCD B"@A ІA6Sm/ 3nvh%j/ BknH3_A&ݖqZ}1 dpAMi 3y<.A5&6A@sWAVLD71-H/IQ-Rnʠ0 7Aa&[[7o{DA= %O?D \hndStCkWZ6!Hm\$~ًo:w> كo{ a"L"4M'S9'^qZ/USO^C+hMJ&G@Ӳylto߫c՚  5"Yi\t։15LsX g8ocግ#f45@ B:K@8i ΁'&.)@ry[:Vͦ#wQ?HBd(B acĪL"JitTy8;(Gx_^[%׎ŷQ麲uan7m QH^eOQu6Su 2%vX ^*l O—ޭˀq,>S%LdB1CZ$M9P 'w\/].r#E|!3>_oa۾d1Zӑz'=~V+cjJtO%mN |-bWO+ o ^ IH.;S]i_s9*p.7U^s.3u |^,<;c=ma>Vt.[՟Ϫ x# ֺm pHYs  %iTXtXML:com.adobe.xmp 2012-07-17T11:19:11 Adobe Photoshop CS3 Macintosh 2012-07-17T11:19:11 1 72009/1000 2 2 72009/1000 65535 512 512 vj~@IDATxyUy3EbYe/c$vca<*HtX(aXLF;M6hIIZчkug?= \;&DQPҢ 0==0*hw-m9XmZP`3}0rh'LN@ j #޶vz =y`Czbi?i)@ Pt:C~#=@{>BH8N=qu Xî`FmA=Ҧn4H2 :"ضui3]p#F$}H%==zvlm &!5Ok˒HhAic _d+==077Wfg x)oI'Z9ycǎ8t~{8ݻ7__o:Z=nU$QhtϒXºu@76Wի,,u cs_/8%'&&}’G|{]O<ăo;6PI b2@p'sQ4G@C~3dP 8z% o.z,5r_b"'T9x{-o7{X%!`v;0*PofId0 :*1j,׻b`1P'v ѣxI!$`߉'v>|=&d@wP= 0@Ouɯ༐S"_l1"}#SiC۸qc!!~t=|m//Y%P"c\ Ю,5LNMHis\,5m/4Iq"#K^6ld`֭GF‡n喿_2]$D@c %=&=@2Li7d%==ɎÃ)N|@"x=EP[lyOO_aZ^yz%>Vz%=f=f'8{Uy ;7%=f=QypqtCrU} o^.R$8zw|~>e5`D}ತ֤xYgJ IA@z`A^]A;_tQ.g(+<[_0/yKoObȮ"O_mA&LJ = NOt(i@Gr(xE1Qax$z衂UW]57?m۶m6ËRK$ нL S[8Vz`y@l`u }W_HlW| 9pG~G/{[?7Q3 Yօ0JHbK#Ot ~s))<.hL|;?ׇ{~89R k$P'Z3FK̫ꥳv?ޖΒԔX [p[E=TKN8 駟.w_ټy}ooy: lY`؜Xz`%xۖS[i1U| $ _@C[@Q@DK&l'?借6LԄkCK,g[CA}j)mPwdχ Io'=z{$5QLZ@&kh\ ‚:EA;vQ:U:Z@GPONvI]$ :6kÚJLۢŋ7҅ky鏢E|fׁ$`.̓㞀o}Nܚ@&k0$X:qg,V޲e$vO@&[u`48=6<@ V2gkx%Z=w 個.l' w< ;9x/z]?t ѩD8 hrC Xc ȃ ׊2X+G2Xh8S;ۏuG-(^ |'\PNI^We G%\Xa["an1Bm ޢ1/]E٨6זcǎc``Ϟ=.'^W9#@/]av@ҜZ􀂯&y[x(3cz |UOdsuz y9@O0\Ko4.d@>u8|؛= @^'^WlJd*[X[Z3G~NPǽ$<@L?9+@&Х違JA,q,?Z'= _A|ϵ^uV@x 7N/ϝl*dWX>vi~TxZZ>>G>Əsͽ'O'w2 (۫ÕƦίFh8<_V.dxDW\dii7<8>ЙN@&0違8E^l+U5Fۏc^%9RvoR[VO'IoorfW4@z`)<(},FVG />ڢ#Nm՗T<~xٱcI z̈́~c`&b•LVJ+YtkbP[#~AG(ӗ==$em۶ tF>ڌq2 #YV2X-G*LB(bڂ}Ӊ4 yWۤ@7y3 ?ďKɦh mIx: w'= J<*iSzóv|ߎ)^q pĉ}AP^:e%{ |tҶ n%(;JWT]D:$#a'>8 #ǁ!P7=>/7xcDgf{Ey`+4&=X(PΧ{1<7C8l--N2@Ux,f@^ /5&|3H~DdJڔX%hgǾH48"Gy[x"7[0NEML_&rjLVHc+1jF-A6TՇ'%#.7n޼oDfÆ w(cKog 7ܐ+E҈@z`x PѶB|-]2@*WwD^򒉸K{߾}ѣЗ&@]:;|&8/ˊ@&+P!Q3 R#|H*y5~˯>PU2ie{zWטȊFTeCd"CXAqቼ- ly H/o p3=D~w|{ }r*kB;GmTW`GtVN.>x1t^=: ϋ/+7QvC/~Տj+G}-~`_EୀѡăƓ.xd7dp\Vh FJ>AS%hH^,FB\O^} :¡GcLJ$#?σaa2=X] -TΆg,H#x>6'Ȫ-:Pm؏tE^2$X<m>":>N~kdp=V nRЕ,ARO 4# 8pqze3O*獁vsL΅sk7_ӧ\K_x` xoIAtTW8@JƘP~,6,kM6Oz`o(>ԗ~%mx'<:\ 祯 yI<_? IHc'N<9>*Rd7t$o}řFF](Z3Kz`r`oHl rT\)-_ۇވM>=F :t>c/< m A1k8%?mf]luMV9i $SӦ^~z2l@o&d{9=W#@z`MyP-_ۇG6/EGN% 'y!@Fm%U e=/bFHAkDQm@[Lo<)]7 IШKcy/n+ ,]~6rnی҅ -]@,Hp(ӆOQ <  Gc)= Rz3uz`6_Qky\AR1#h*j;v̓lC]ql0Lt0.%QJ|B<ȏ3jqd![~"6 ;< m^N>_s,2X7@z@ W8iid`CYȧ6g#NY6Th xK_/ ҁJx~XE S=x*v|:b0`(-j߇8$D[G% ILG^h\LH1R`d'ƾ[:"H/oW Wp}I/Wtc= .<`9g!:r xeƈzƑa#B j?`_;83 !Y[tY<+=_A?otN_H-]vJXU46}nTmnM(]V 'rS2gQ +oiȷ\h-/gT'y O|$>Ujag&:( @& (L%JVOBtɉO;y P兗nAM(i$@N`):y=Н#||ѢqQ`??H@,8Tu!m+p2$K.0T'L/=:{on%+( K^tiP uIm;2 AILzݒ@z`x6_ ģdTD~.$J;t @LńkxY{JLOd$'>Q 1ާ[O]$ƛt< H}ARc*HQQ>mx~%VxT@J:: :>9Jq%vbhREDY@oj>u9$="S/@z`y@s\4^׋t2 +L82Y2vz = g;hѧن>Ot7h7_$`1߆ϛ ?9ROիq;6\%ؔI@|@&x)yU6/f"dR@_ie2 RV2X G!mHmnL6=Ֆ$}$+>q\`o' 7xc>"`&tQsRp}C8Ԇ >[:-G1@O]$Gd}OFl8EEg,x;W0㎺yZlGYxҧ.U } 뫌W|MVlJKS?[y>DqQe< }IƖ>3 8娬N&k  q ׶Zi+;?<𴁌-hx#n6<K }CP6Ҝ`8h_I-zL(&85d M+ʴ-=Xq\G`+>=G[}LjCOۗqtWc~qJdԆGv6l0 o7t/[&k_luMV9i OU,T蠭TҮ@z`y @Z4DO$+>:kǃ'S4 `v2 Y0y\sVu69D8+qxS]$=TBvgS&:HkfjN)==@%vDW leE~Dž."K N $v:c3I*(K1x"R>E$P^iS< >h˞(2 `˜Iz`{@jUkN_z [}gGo,#dKA8l 7-6 >/pgG&kXLk M/.$ GpT%FW𨊮l64Box$'Uh%FJ&k@43@N&@+b ^ю q|хSO }I2Ɖ$==X4bG)V0`o]qBItj-A$`9X|$r@z`x@4NQpo|W@#mڭhƀGUtK_0yt}|";8YZ;=Yc-Txѣ`xKQdtᣈ>6 /r$J S#h~N@Ur`u6=XՏ0&Qi QRej|E>r+>N5G kupV `43=X^bOU 4fKn EW[}KdCtv&񨬞ߦcwZHqW"[j\k8jT@7&k'Q^4SCWA9 Nq@OV,v ͛#۲!jTMI8$ި Ί'x;2 CW0D]-N_IpEdOH@5 /?~<#-IbDbO$3zM|B} txcSL<ҬI96 2NjfT!&ۭ^fj,x@U5 PDg~zzz-}PEmဪ膇G+P8&^cnݺ\s5nSk@M g<۶m+_| HfA[<)(Z 8Kn_?5VX=a uTr<02x Lk*yWF .՗ @ r+6Uty4%QlxeT[4]tQ+رÓ-[/0ܹs0j:sGOM8qid"Doe O/|a39dcǎ*6jOzfE^_X!MHί=gݴ$'|ՌF 'i,pv/9ဲQ4Ɖm %%ܟg=wG7ry$"qw@㠿}go̝,jrh_:]v|č۬^𶷽 fI J}C(x<:}#. =ǶtM/(;"m~čjDZ<}scXyG=A`F}-W_}+_G?zx3j,22X/VK,45}U)ѧ-xdb ?8ɀPuЖ}jǾp-|/|_,wqo+΍$½h6x]Zxo |I ~XL*wJNI,]`qxЎ}ihjG|KH^|1ȋqjCm ƹvO_>#E>r뫭nx twUr}yc'DO< .nS ԃn? @&g%Js;1h">AFV_<@Uky^miSAP8c[(݇}2:b[=¾vQ({o^pIv⎀h⻿ȑ#_K Ov:%L딪c:ӏkD[4Ԇ6U6Ii jp p‰GxART JOtF=\"سgD$tNѯ|+|~a~ϱ<ޝ#_裏g,&Sz =0 [VJ ׳W ogSH[p<'O6<"A+C}G -^' ₢W64 3-Hi BPz#蓏x#T[cя YDω׿?j3V NZImACeSE@VYl@ Te `MS ^m oфOoK-"uiȣƦ/ )Wc@7YrM7W~ , dWڒ=EQgǶ͜12OɕH`Ӛ K.->A \&Qi+ r萼p/(uZ2rG3juNpzWR$-=Xq q]E4 *.} ZQģ-=5 mс*m׍"yᡵzw>o_mOSz7LmѥhOɺ o_)6?a*) 4?#dz _Ejw~W~% `Vz`<J }-h@l hڂ-J  xɨ/\jëvU[ JاM*yFж%/\x~~dضTcZlOzwA?ErֽP_g/=/UPAG/(m?&3u)(Zt#HL/yKm~/| d . (1bBK#@z`mxÌb?>Bh+8Eidƙ!a82%60(##..ݎ,hp+A}FtTENs@3'[_7x㿴]6+kjFe4nz =pn=™P> WT > cĄA}*¯qf}/B% E93P[sV?ʡK6#NrȨƢ/~N> 7ܰ?x^&?Vj$3^F1NJz =\ X(O0QP]p⥯$QA]<ৠn@p@% ^TD[%G}P8\v3Ƒm^U4<8:P̀gٟAR@8`dD+B(kc c0NN 1mj hjKD@E(U{OQa࣌W2`B< றzWpN m'v@V%ʦr``cHT( (Ӈ/ ^a+y8<A&M;X}E2 Ҏƍؖ^Z(e3m*6DN@{짃3D(ǝP%x l,·|#olG^ ؑ&xU5xlLAIr DVEzG]+I|`Vl3U_0NPhhiGWoK~!=g SɎQ9a+*~~fn}N<==@ %8(3X>W U4 >BpS Nq(\+P H`?}8I&?/M|Ā^1C^9?<\կ'Rڥ~1P7* *P৯L[PZN`T2GRg*I^} "]1`cnJ ë3'y}O_CKNA()n[bK'ʋO6Hy{E;w[o}dvPY3!dy`;C @s D1CMgCm vۇ7VsF/}žFmW8'vE O+>J'rc.y5'%+(>Sd{_\g((eG`ΔHMozӋ?mr 8 gը 0W K&C_d+=X5QJ/>'H`A^}ɈW}*`>`E;Z;ţ;>VFIBS[근.A #}1(K''Y U (6eأ7 Hռ `P@HHwĶTU R&E>B-A>'ƄGQA蒑 y}dc.}1no>>^lHm &>M PL6fIV2 6?O^G=G}UL4td l@"QRFJd)]A!P[s P|ҫy&Rh %|k^s!w~>d O$LVb@4uF`FbN \e2lቶ`J1.QQl >-(OA8&Yxʂ7[U^%lSdՠHΟ p&pvS2$<i䀢KG}^z֏;$1mN@&| }+)pCQ2QOˣ Ɂ~ǐM[}7JxƅnZ%|p@INPxx9/?. xCmƍ[3.@ǚ@@HH(qbG0!PbF >SKC|mvF[.lS>yx)(--x8mc.[gcٿ=`違ZU[]'[. !#^!p%!8JKS?+$G4hݧ?4h/th[_2ddQCc=cQO\ ::9Z@oN WAFG^h-t@S`:[' tG2G0 t'B20jK%<09A'+_#J_>By *+m0>SCFS R0iO`RpEOUrE K}mBXă-O#KU(d| {dGK ֍A!2ȯAz` z[߾9]&mthɺXOMV>ɲcێ0|eה/y/QF,) 6 ,p_ߎ:xSc袵mNU|<~ɴGMc#hQSG=jK^' .@=hߜu~z`5x'->L)wrCeƉr}w={T $mmu [&MpqjP_DYgdrsT/(f.Nٺ%s+J hl Ue{z8>Sb\*_4n -ꂯK2}x#DNe>'jKd=WF}_C3Vۗ#9R3R*~]}fí/"Œ==h<}GU/{\[G'8;l~hO'v^܉H[.ٻ/Z+r@_u ,U:|өu^GnQ(G.zv n#em<,=}Uϼ5z9fu1BCmAE=Ш 8?mYЎ}l-F-7.8ɽ %)lE^8XNl̾y`_\'=XvL>^L7>S>9 _<3%;#"س|Y@ݰ;og u4R 't׸0)eM|fxw AY 3XoA Utv]pw{f/ϼrE(]{cyu_n筮Ԃ*edP[PZ*^<:eӗ*<8GD=D9ͱ! C}Q[0u`2qvC\gmR6M|g?6q-@IDATZ?BJc-m5?AA_ zF % %!C'QKwT nՖa(O:|BKwC/<|wXw{U쪗sSƀ`7ʶ)_1)xG-*[/|/|Q_:u(' rQ# z:9恉e;mw~S˽Ovќ M 0gkAJe,x,~~  ,R 1b.Ɯ7cY5V{|:;;3tv#yc얲{W\Zf k_Qeeޅ>mB :+>a~lm}n`7cq<.W ut,>%u3WC19K:]Npt9~ѿ;s{0'Ws|."o mrT=e=(;.,}я|O[.` § +4bB |e j࿁QSbЄuϋx|,9pk(QğLNIbg큩_(fL}-w>.7>缳vW``QoS!p]hu8,؟*E7 ΓJfJ S:uC3^}&Ƃ&P몐#j{ }82۾$'ޯU-7+nXO+ :()w"%]z. ruZZ_:KvKז/;"nN s Q? M^i\⨾  =D;Rfg7~3S~ggo×i<#ԸUO΀'l++*ZiJUڪ4q0cY+ƜJ KcWf17fG|SImZN\>R=}+xߖˮβa㖡 k q T )(8Hį']ES\ ?t[QN\ѯ1DjwBp!پy_6ıi'`a%Gz`^L(ԮlT9~c۱rMv.kg = 0 Z$;:H' H CyN )+0kط 08Qbۇ[6Pנ}PL:Ej4k;e[˖?YeʋcyK~lڴm P#vU8lM;lg4יnŠ0[])KCd22q=H%)H^l*@ w&Əv茻 镬ڎ`o8f`g~{ŭL>?/ ju]jÇA<ߔY)N\]>!AU.O7co-N:=UXu">lR`U+\C; FMZИ-W][6?lx)́[tys\:ͧtWWcdx{2Cf=1aSՁ]q”gI DȾR,!(|Lk'.tZ4O#6F|lmŊ>6鎰k7{ {`r?-#eT_k[;xNf>EHj&cޑ$6ƺd?rԶl1x'jZ Łau,-C.i;|/5L\2..ھ//xZ?%& -ORrz~ήmض:FF͢ςo`rd/͔mv [a1u8s( 0H$UYE5d}酝)IЁWO;/<*D (U: oW ` ? :eJ0P%nu$t'>0x cE~v]Y6?^59?`c_*?S^}yh9vme2ԃ2g? /Uy e*ʐ{;v{8o-R>X~q^z.*. S85% GtoILz<?1ilfVk=*EhcEX%[ #3KúhO1$Z§Rc96!>\ n^49XvmG*0~`.mrp^&l: XmzcF%Kxf`~/"J';yeζ(֬1!:SwVmwbW8}WX恂=b4 Į U$Te(b-S}v| ծpetaE>x]qI ́VwōCnԜMb&8iS2CvOeLsK[쇇By_]^]G:o3؛`5:HusdGG1A;ej'bۗ vZFv"=U@_ŧ7lkUϷMe$Q8jss{leQ AE֮Og4W|b56 i/ ;xX. zaЋ`=E" N@xqj<1YG*YTuwcU@b pCK RWb` @4] پLYI6d9N?u,omǪ &?/8d0'"X@~9jr[eoK:8x:NOr~=@%=n=qcmeF{$pM^`'K&VPX3vi{9; u_/Hn1qžڭLC7 { /,Xc}lC{qE l5HgtdoGץouRXA(7~9Aū_\mL3@Ap76P}S?ExMBTuBʹ:͛U y&^:<,+Uʆ.jttGbtb|{p>$`'G3<6!>3\sV$Iʌ%TOeB蚳_t5'6n,?QCۢZdK bAz,8uQ-9ҕ~dĮAlH>_Nmf'~әG*azz?q`(, 2{QA.NA1KփE'R) |@mPF:W4SPMiM(w[ot-E$x42`-/l]S,$ʧA{u<*8<H2/K.w<>I7,`ڠcX,5x{M47"N~W O`ZAl]8='v螇LjqEs\8 spђ#z lYlm?Ͼ#p}p^ݐe+f60z`w/"MVAƒ^X J:چ 仱.jm̬&h~yUMUR9"uS@T`Lj;ϫ5+Vi`'徙Si:v!$ 9{Q/;>Ƈ}tl}#gY{ ?c_r: Vפ~Ӌn.a%T#C0cGo4΢$ YֆEvqYxle/l?=cb,OEUN ]t۶GUP{C>R3LͿg8u*A8PVy={`m7/? vIUC#S}ׄtlM uDP?.ۉ5U >7'[R~c6wyffm;IÄyEn%[iS/^K&,CV5dWncy}3P}TS 6` WKo8K̈́jNmʝKoXs֓l%]qx[L~fMy⋶}x -,6QxΗ:ȅ 4:  5,T9u X %NC@}bU8E]!oK N BWFg\@@9O1epIrrm0hĞOؙ8f|x`o8"hc)K՟21}?뷶s$`gnd^t÷}6鳩n8 7V/ <@6؝قw쿟mھZ:į~TbŊPŽ[;^$& )Ř~cpJOV*(t) Ƭx£1,TTkLAA#-U7 1i;|֢D5g2ݣɡvja4 Xj,ΐ l$`gUw- ^`Vl}oAߢ8{epiH*M,HG/u xkHe*W#ݷ}ǃT}}KeGYd4~L-+sO[˭>,~-䃛< UT߮oYϰ3AE9_,z.4_+'B[| +e8Ю tl+M:d:`4aa6 IjI:y2#a"[;F L">gkNn ZR)K/`=*هIɓ$l3xpV^U=OHP9g^fWt#g@ aXߠ?)Dt:besWF~Ih /x,͑@&=XSg~;۷٢mk}j 4?3>8>D:RgwYճM:LuS6p Y+_ G|۰v GHXX) [<N wecNjlUn\,+ [e:$f951Is#vw|krÊN*G(++bĈLVɁJ3@ h[YٹEߠ"+x_$@V:} uk) ,-l튄k$U!;ah84R,Īޱi*L#::%8vfZ4NWu15N}NdS 1tJ;ƠYWEBI7Fu{T~lڬF vnp 0 qua{}wkZS/L}ٺ~0ߙVg[}=rntSD ~* ?З>UN,6̲K ex(d95]߸!w?p'(E ,&@Pmi&IVrgd9s90$\'^+8 NrLrCbj0?"ީ\v50xÒ)Zֱ 4  nFաM0!<+N1+>E':F&wo:q2׆T@yq4D~)~?,U~;|X վj-כ=Xymr/JzRAb`}O$6Kag ~q͛ozl5Xߧ58eRϪ#{vˮr[Y=@f՜J@mwcq+8wƛ~(^|!tuPUXv Tm嫾lȕiw84xaPWAP8]h ơ|xÙ o$C节vY|u`1lP`FpC\8~a{Ӝ2v[2tH~W \`Oܶrqr@ }7L}k8}"}7j7 #z!>~ As3؏i'Rr:^55 \jʵ+p+ʴ,=0{Un{7-ڬ}f&(XW7*Aw"OĀYWO=~>֞A_QD_` Z vw|"T uslom+t(+ vCyDP:aWc67NNdW\n㖲iV% ml5W?~j2=v)]6;$DTQؼaPR~ƍq0G-U {]]ۡߩF ?Cؠ4_U/S-vycZeN2W! Aޠƭ 7k X38άw[6p?Uŵ5ǚp* 塩|K-6o@L l nK7ypƒl`o~?eu.ۘ.i09>wIO=߶{V2jƓ,[__c!rwEŃA= ΢Î~t^\rdeDa!S *9Ru5K,Ͼe~Y']_-2$Fj2z8-鄗( M(=in8}:s+PBgcErUiP ~xˉemsM7ՓŁ̮"OhN] [E;dhP=_KS'5Pw7KL?iq@<j}3 -i{}KߓI GJ4U`>ڹoV:?eJ-W^r7{|Ѷݣ큌ܪ>W7eʿk@ RU[濖_ݵoM&).EIbK$ȶb1'- f:$?$A3&'A1ز%E;E-Dl6d>U==ˎSϩg}y]AUݻ;y|yw;qT~?k6]~D*og{/^l骤}Q&A GGU<#%ݫИLD\@gɪcMt9 0r[T CVF-f|]uH)[C{27N6!:Q2{~r MO- 9pO_=w;vdT;~, / >7c귈IB1Pn*/|?ٞ7gyܱ#ܱeOn^˪@lb6RGΞ81El(Xk@6D]a$޻Ϭ# \ŗ" E&JZ*`ȣ}kOz?=w]z$_DEkGSo3)ءO&uGK}R0G.%qC^M0,~vIR7oYojw;fd '\vgދ7eݬz_uB6 I~h%dl k:1/Wur[sЉ;u,KBV_>yRMI*{O@'G^_?o Ԟ.N} ׾MSM+獉 ,Y6]ks ^E ?"ܡ#ܡAzoiot4Wx}QW/ߒ*w\'V'>kIKa9L(s>k?F{ף%y(8~]8@{ꥶGgnIyuUE虻 UɨAmڝZAIrƼWEbrt]ԑvf{'ڙcɣm]@G:'{잨+\G09okl/|ڳg?.+]׮1o${oԶvo] c|#'FCO#SNweϿx!Pi㿂qz\r?/icwH r,jcg+w xj~oVrB y'3}vݝsYi#iG-ѝYtGu`&ƍȆ =$,`J{|C{5HH ?[$I!CQk5_+~}OL@v'p%dejrd_SNqD}G^Rҕ֮1]{^68R;{$ͥ h&:؝ 00i5I?-e2\(_9HK>L/ B߯smks}<7^/} KaO}42Ezm{-0wh ,5׮\n_'~,w,'wA+Y;7 ‡wQ':Z|ks7I@&Iİk«]:%'g!vg6>{ Yw,'?l"X/VV잷71ykhW`~Q&SwE/4wy֭X K_#yh oWi\rCȑ# Y"!E44VM6l7cG̀[_[3p6D`]1 ]o5kwg[rCw=#o4(jBJ"gM>!I> eN u|v}`֎ 蠬sSXs{\kgg yoE)߭}m^u{KzԨx SAjz I_9֮ߚ[;67b3!%9>ڠjÚxHFd2IcwJ:&y:Sl} >̲i#`\#ߎ𦿕5/~F15I3u0I;s|P'(v+Xtؤ-x~ZOS~X_nۿpWE^u}o"ty7й䦻 VmQ8uDlGlM?Ww5JxjfL$6X~so}oClO~W^?2KjH6[Icb̍pv?4㉕ f^VE&X~Η;7~[kW_o/OxH8&oaLB<!Pqtaً xRҔ0>&_#|7sĆ1qq\@?JQM_$tBИ^0vRi fWtYXy-o~Hʖ@zI.qe7HO0#i_7f h9qFmt0h_;>S34U;y3u?I~w4$v,`e MNx-,Lǘ(<={_{Y`o2fd!?pǂ&jxlCX;hqcc$cmoZdW UL/׳Łّu:}p[DDW4TTiؐ4)uV4TJJE2+~wzV73J{?qesF`y 9o)OWn߷VFs߀h5-#[Oto5^hᲄwNd!NzkGm߀lNm%lDvb#/o[*kl8V^R}$I*>n;~/llqgܩcϴ87=pvڬdv.Dㅺ6ɣ`ԬʶנEa5&&$? @5pxMkGK?پ_p+4\{Z$;t*Æ/dD= @; #v< 9-sB6?mHmOmG =87DV%ؓL| {g+?c[ G]{ඓ*98OY7g]m'=&$H<)LO-&xϗ$'i36/|PC큩Ȑ3? vn +V>+bbqW=-Q{@'CVMGJOa|.И7_z}ϵ$bzѳ{r>h>Y,q8.DAYS#x/wt ZXN<\vQKO#"ɲw`Aj uGCDkvxïA+ kP!Օmk"$FBx W{$ Wf] A~wMߋ_}gk~Z,M&xII?`=$, jZ3Yo@F!0lQ;rlHXV۾qm̾Үm\n;ǹ,=v|Wϴah4TA0oǪV*+eQ ITI b2O}3ѷKL1Hm&&BI2%/zi |X ZcgV{n?Zz9/svoq񏐖ЏOM2͗A.ǧ zP=!(CwY!d'6d%6mKf^m>ϱ տM~ L&>TѲ̀h\Ų>c)<8u]NlqyI_'/R:r?YAOt $dSI/9KFB$MlCF35ؠ Pr_DׇJUǠ:3hwBUraU)deEm[H(+ Uow=iB&3_a >[]~e Z쏢~d:!= w澏m$/eG`9XCrp}x}ker;a 3bpG 8B|Bo=DV#k` ?_un(N۴?͙9;QsڕI4qDh|2`+ &&ݻpݾlbǠ' L#y GGtc[+ G _csc8Ξk/F\ '!f{#z[\;d:e|c)XAP@IDATڥ Ҥ4fK.ȐE)0i)ubu,v?o|D0$U*qJ5unDH''_դ嘈UN_z=ϴbr-m+[QQ֨iI1`$G3g5N? #^-Zpx=0J$_Yu::A$ Σ vŶ՘$I-Ϊkcžlף}\Ί}݂vK]}蹗 ؈34o_9`=d>IĚ_jI7'IdІ/tuMX137鏷&}w|reFO%ң~/zBջ7ÑM2{EqA/sxe\rva&1ɥv֟€e@{J`j,[{_Kw]~[· zs_}(NZ|.ݲ *iAmգI%A3%8 e"gGB07ψa86k Nd4RXc'3+clxū7ow|2pݒO3}Ţ :Z-LvǍL_qzRڅ=*,,' |pJ=CTE'xt y߿ʥmJz8BM(-ZR+-f4@z`ӂdMDfV*j`[ܡv]z]Ҟ|j{"׽ l?{){L%Gnޚ&X2w{?vP\,}p}GݎB=sf >דMz}'aljkqF+_$j|l2lS0IpOG1iWKD!Lz E uȌA8kpĤQ:)`+Ðnv Ls_mN<$m.ߊ^{-yL\z]t&h_{LDŽ:f2x|o<0>^E?o HvD$} orh.'҉Ohh'f7fm:`l"슷Ic a/+Vϝl܉Gۭu_i_3\^%p *#> } iDwy olf-Nem[il\8hGyπ!\;A@I6r~]!ML>oRdXLGqKS4meq@x)[MoMnDT /Fʸ'-[ JRF崥 ^\0ɇ|}}%:o-~x(񣻫q]\H"[=2lc| '˲#,}8 ?M4b*aqw{k\5%GDeݿ.{ҩdkEQ DLIY |sf&+l$* O>V?D$\W 7Wګ9I$`m1jPϏ%M>L$܇@{;HU5UhɪZڵC$c k2;@n|dAv$yKCΗ%c3$ 76xj[6>G}:_ܕ/Ewk(dK>طj^=裁r; ^e[__o/|ƒe#,A}k5?b/>T FL54) N#} giDa_=;OT×tMv%`=fh ݇$w"s H4 xL(j{\i Jmljx~<#KSrm1++."`~I:LB.lL+uE65sB;ˎ[Cm7|F 'Cy7Wy`.\"-kqfqCࠉ=\pb/1:w?~K3_%4]@/+kaGb# ϷǸ*P9}BO~i9 ҭ}Vw>@K+BD` kO$Ӊ J;@3% Ey h_Fd?{1@XkH+91, k)Sc)3KL\( \I΄ef%{ Z<^XH#C^#¼ʎ."cdqۡכ)x8np¨ QF%cN=|vEhRcXi2!{dkUW~\/݄.kl39ō ˲#,ꑽ.~1( b :%aHć6RdRb$WiC>H:aW_;-+0Wp_߃ń^Mn\ TZE/ȔE8SIADQ.:55$#:)u ;W]n& YR]ʉ.S^+cB$__fu}1Nrx-gs{x?hHuFuB+aC1D|gcߐ)呆Z;+ї5VNg_P\2Y?k`ԅCDw7*~&RJVIh}\m2v b2cTOIHI4Yѭ~>a"p*vy"[9&awIRY qlS$R> k~I䣻ےt\9.e7Bs{WcW`磂 S]aixᛊ_Mnp/i<ݪY=9했VQa]s3xEO}K&?Զk囊Ib@ZǷ(پyx,,)1|K՝/Xw˕R5܌D9wH<6KKhi8\3N#,.Hd=g0'>5TfEVe2V59S);2SPhz%b|y&Q/c;ݘ45ŘQt6'P($RW2A2i+.DŽ-OV>2&{G+vD|x9|環3M5P~hHꭤhkdW{z9̱7NBi:HTd5ne1Ӯ]Ny]Xܜs\Tc.nPՃBK}׮B 3 ʷ#;m?DcyD45,+ZVtC,m!fn 0d|Kdu^6IQ  ҅f)~ 2{*'H[x m*f?57ȣ?"_ ߝ'TDNnWed)B9@NIbx*)i{ď+P+HS01$Xӂ"VCQS" Ck?Jof6={ F;-&KeH|۩0$H~N10((2ihkO1˱y?%[S˅ҫjuvhG ݄*\eh0iZn޸ K:|ON?IoqRE[P&</aRW /8ux@eF`9X#zry/;+j=&e ŁQ2T']$]eU2eDΜ ThM~=%HWWI"c?uoǖ-T´ }i$Oj&]ĥy:j),9y$E"7qR&'^I0$Mwa; zp2 ym↿TKv/ $>0z㯁W?II^wS*9`K'*3xhTCAz^nݸ~ .'a~,X.u.] _'_d@nVcB<+ NFB+3U^"F1>9|!9=ms%2k;_@Fߦ%NƄC2wm+C/% *! (r0^"<䥘$RWmS5PaʲD("_(7 Kh!+0 ա~,2\Û ,|-z .˘9CҤL KY/`4Ó:v3^]~/wE_uu!Al>*18}Nt/udߛ^ӡ[_l/F+Þю)60 'I#"<^ &aG3Ny)W3AvbȆוfNLݲnlڂU% ;臝/΢u2R.1HC ~}O1΢CW *C& 0Sr}CC;T?1cE*0SᑣaºK|Yi\&43H[%y55} Sv&xKtPGlȮ fU%9*J=]ߺ֮߸9ڮ#cL2:>#K}q6'q._tYm;vDoWn~ 7(d1Bzm3̈́7`<AZ\51ƉOzd f` M6 {vV郁֒V}MUt5ЗZV# ( 0Sxr"20U_)%v|&*LT4١-ނb* N7s\9G}*ߺ^<,:G7HҎɰ)H&mLf5# *xo# 9xy,ܞ.l/v#$7IcE>}bNͶ_hGDc Ga]:eM`9ı kg9dXf9#{/6&DtJr3bG8}+e$$nGߘj<uw620 ЮJd#Ikpִ+Vx5K̡:lYz[2=6{6hAyS8X`iK`brpPw9 .X.GfW}4u\O: 71&B51ϗVrh+3ճȘ+0WdI1}p޴'1cԅoSw5]_+Y| 6_Nq uGΌnЂW\= bO;l((6dpK)kskw˲p#0B9a0Ұxro}_Pb`'hh߀V^A 4J @VӱX(8h*MF p =*GH.Y%:#!16&#y98IX.UIR{Ev  iCmWHK.I!M\{[|^yDm<hA67^o"cs)N)* 1GHzE'մGiPTkFrD@ lֹN}S󖦩މݑ+mY3dʒFO|M}vm2 Vh_[ /5S^IJ,,' u8oSgv AUI7 78fL'HE#TW|QImZ#/ d bD+ɡe1BNt1a C (ԡ:dD9lAڮ87&@u~VvD^f\[u;HN彞\*M= :^- (-岚o L8t_ n".==ߦD L[S1lSx#!&Nl$LL$UmK p\1)9"I \97mń0٨l\كsZ&mE#E`ʴ}/N5~bY!8%Y~-,'s,oOOv6;&6uŞt+U+/I~o`(*S:}x & jC wN#J);OQ&QƆ.#AsdQ2zWT c)ɏ.| >?d)IT0CT[q "W``sJ?q[ NUD~a5k] kGn'v0 QDHmrx_`Uq)rmNcecAWQƹ$K2SF23 tLX׉`#*j%t$t*P|"{@ 4 ܶmNv:K(5vK縷)X$A.!" 1D$$Z$D"uOrI p瘔,+q$ԬC.TPZB>a&$)QOC4qڣ[+I_2;%1d$q/{==7JMM4 /E3ey\?}:I9kWo^g"p izUOɓĿCx8}d2Y]ƲZXN8޶^]m]A6LF$6hD`nv N ˕!Xe6Ej"j;EM*ڀ=6 & >R4$h1hF渠%t{B4D?M'J Є^W!BdL]TedoKtH61n3Qb):KƧȢS8f4zCSyOl-v.^rY2T^؍*>y\4 p#ޛ^~wmm]V`&ʬdޮQ`pOۇɿ' zjsώ]~/,'r$oS?Р5L&eaS1v7 iy RyR)Fx^Itʰ$ؤo2$ Iδ'uK[LhDrc`ɍ}&8hIF+ѵK;v!ʄ] WT hfKx`su MDV29B(72Ӈ <'2[g2ǧO164VIWl(cd4d),c)6뇣DybnaC'-+j%Y$O]W41j07s,kre$&?x<?Ĉ;`߲,,'wLogϳoy5^"fX2xյbg䑛C~x FA&#H*0$ >">2a  vtY=Abtn Y&" Ew2Z1U2/0ysޒr2G! ](8> Wԝq#g  4ݛ 2ԑ10v4+;,/ewtku7&GCW٫]5.w,+f=}F߭}8KF85)O w e~G+)^-pxWu~w=?SR&oRtj71dفJZ~ BnsQCWmŌɆH/x$% }%(fy)dWb$q Kg_QNq8H%)s[┪>aȖ{Z 9Py=4;k#&G&>+} =Аݜ?\`!kmY`U@c4X&%j+:4Kd oO& t""DO!~%/h e j4&ؚ J{4t$y˗u/rӏ.XrĶX؁pWePqxqAX?xʎBW{9B=Q:F2v]f 5ߜ}Mmpy18cnߎ3_+zySNX.n <$%4ʩm%3?8eYXN&\"`]O`(3m5 $O >I@H'LУ,A3܈fǤI]\>U@1I:#! ]*h"(?{)ATDڷF62mt /P rh'9cvpm9#tqdtJ45 >+}@:q%%,JD#|wb)')"HEYY} G7 8zMDŽ\0roت3Lxƣd8&Қx#Nnpm]öq@Wg1@mem͆LI:' J9"Vu5OSR,ḀgVl?ۻ;xzQ;ʫ}d=zr]̫cGvib&,v95=weYXN&mp\WDD N ,i,EPmAY7r@`sgeBFRhT%I\`A%eDkya"G a>mFRLb`VQ @ʒ-LIǭJH"< %1)ȢD niҁmgҳ_?ʖ^t[p-1ۉLp~OI\#ǧ) Pw2JѦ+2)4hH1j&ZiWmiǤ8/آַL惮ȕKrG>--G:`m tgxg遉c0o`T+Ql\3& - pr Fp- >+%OXJB%0ۺhf2N23CQ X\Hw8b9`Vs̒|K?DTW-I^Dɢy5 eOEK$'J?`8PWȧm^.P)ݭ./:o||b]+!rHhme_ I#1A+7x%F鑡j\YM'xu:wz"7 <_:G]<#DhK ^rsN4(s?~*x߷ s&G\E`юea?Pc "fBИ(5'“ 7; *'ZVۑݛ!V3jxKOǻctm?i ܱۘP'i |$ 5|>:tK҂R/ۄ0jՕx ʡ<~LV^v'2 /[.d,&Q/&vK"L}@[])D]elOtшX [Bq}+jOyKG_N'1FOM:}#!ڏw˿ȁ#ę{MY`5Nl3 ͵H .0&U mP$p!c;eY@#VbI _#8ۈ92ڪ {O+Je[GbV v#" JX ?ɼۢL d s%7DCqxb;1f6tRM+P_vT*"XIVY@d(.mL9p}8I⑏sdt.[Yf,)v:MІӣҙ 6"Yv32bJ+5#p L%1s!a8 t3'WT  \JNmac& SdlLt 2$)DЫDg?&2jeKUɉMP1BdRP7٩Ce$qv r#Ʉj#)<Ӷ}!73|$Pv60,pr J[.u]{"lJbwT;9yU[Q9 8Y)>#83V58{GkF`9XcCh;(&1_@M`L~V{湓V_@2D*-vgym]}Z{[smHkmo(i9;/k5Kv!k haI|es?CU(Vf@eVz72XWRq|xFWɩtlء.~ąi`_ʟ -)7\QAn~9ر%o껞N=N`1)ropKL;46vy'68E3V|?뙨l19(.#m\v8f?t,o@Ǫi_ʷ`][0j<o MY`Aӭ[W bU^K0L&4θUڳ+W(A`k䢙$eɢVYՖL^8xJ{췏s蕑$[c Cޚ$8’ĵ:q&FM771(yd ] =GմwDLhn͟qƌ$ c~lU63_>naL]׫ϓ>ķ)+s:+~DzM@8wcQrGz?NYIv$7#_agCgIp@׃p%c1t& b"}F ĜAaZXz_`]ջٶ}J[U};U'Pm]~FxI16V &.UgUNku[z< 5plD.;í}@t/w=?fm;ן$H= |$!fuugnlor%y;{7&da;+UC94$Zv_®='B"ogډw~m]@-4D\/6\BߓL %[v}7#a nշn2/dfvgiߝʘTcDb`ϔZ)؈2:# y4yI 4qXqUcY$]+14(q5e+8we%%EN~xϹG{Vms9;s?~l^~͎]nwkn3 Yzx_kr?_iO}m8E"fjQqyț؜,FK06h8./c$!#&vzuF /K-[?^'6. Sr; 2% ͌%bohI T$.HRLɄ.ڶ ,[r}]ISsU߭#ь&f_rc_:N md/&Vle\ \?\}> F8|Vz~".`&mڙ{Hﲂ߉LkQv6kov<7J_$NWbeYXN~ce2Ki{^}ݶr T7/䉲M{W3T=W7+`pW2!9v `;QVf* U֏?yW ĉb!< '(faӾv fxXԵCxU2wLzv\q{1)c'"A^1fauSE>/8 Hes%Uqy5maЎ>A9%=rDKGxd2Gh$N,? ^B [/vO]vΏYk/U59?Vkg'ڙvkcƎ+D\Y1z\XPW&Lp7­5vVLJdUiF[lӰ l#3[ޛ vl?{g8)^6W/=4lR2W WY5ZIBLI IL: xŁ&{$0'yx?vpSSgm|n_AO2uC=ӛۤFU\4"|m%Aq3AvDY!pq1*[kC>V.;DLm180٫";9@ ?jcGLE CV҅1qJX;)qeu&#;{1RPzFuy)<;.}O\;Y;e;H'twYD&W\]^Xp.(%> m0J6_$,Y'ºVlǎ&{VڎW<+niW.,Dlw߮{5fA_oKk3.0^wvۇUrJIwp&teXg23f>χ>vC?N?L9wrp쿐DOWƊ߻yFxOdvo~Ӿ AWn;k&HX`] /T*;Ji\|OLD4о^M̛Լ/K?GrnkX.hh4UN f+yis͹sB l\.64Ff&G! |]Io$kٓp\:D^)'IS{V2H2|]fb&dQ84I, }+#αF}v<3!_>ݲ0;N}$+iE$=av6gGQ3yLuDQrI*4*ekG`|m=wq8s' [Ϲ$]{#N3n/P1{>;>rrp݃[+BonXƊFBnU^{{ 4+ZRglX~Y嚽􍵝,bЯD.4&Ad|QێLS<ʥ?$,nT=QA5Z.-e5K'I*sѤ2=b\7Ԃ-]qיWx d"1yX5x}B4R{gϒc222r*U Ui@RHF&0,/` 36,0c ѨͤZTss|UueUu]3soׯh`vT䵮 ֧KDTi̐\lOC/. ¡]e "{_[;nj_mwxͷC tb{1%A:'%evV:Nv W5njя6'I ycE֙7/y{{I{1KA)tm#_4HkRy\Q}?Ӟw (Go>tyVmp4e߁'#>qdl6XDVю ~[e=T-ơ1Ĕxe)"6OGꭶ"^[>3)6+C\Qe&D|H5/ )LQMi62EwO2C􅶺~g@k=|@'v{Nv\;u/oRyr6QY>}lb p߲.n*d/ͷ-uY>|4jݯg.D~~۰e:~m?misLSfk|vL_ [^sGiN|Au5R#[̰3XKVSY 5Հҩ+xb~$X$Zztr|PP -('³^=ڿOx@@/+-bMsV% ]Ek7<$ vb:(dڃZY䨊B\nvPjG(J;u}"8 (Tf({ ƢKͽm8 Է$Nޢ)]S ?ix^\z( ﰈE޽ϵWkL? "T9xUq}u><:i|wc[ka :lk;u䃯~.2=Vxи.I{z& :<֥o }UTЭ?An: qv\yJQSFi~/ڽ'y߫?>gS 5v1X]ch1 u󾫣 sMYO((ǯ4)` rķ1|Eg)iKAYQ8s= 2;f/IR) N h!r6@+ ?&oY*GB4\ytF{"#RF4v.H :TjPϊI%Lޤm :Ί i'\5 ڍ{L1?F ӇPqʕSa6x7~>sίLt) nV=h+e $,w7]la$YA%KfbYC G2q4H/]CcuG%Q(:AF P.sRGh1Еux2xJ?kG [^7;gBpvxUC i zc+V S69*ˀi~}m6=Gwh2O7;:hV;5g}@(-6Rܨ6DE?\Ж j ^hsâz4Wcv>w=sNCL@h Q@YD8 Sf{FЏmbG#o/]#Z[Ӱg L3E(3;jUc=8ӤәOEu<#s{ٿюnil2Zƹ*GE0t5祺˱xs4QwJ{V:#_i|a NLl}h!#pp!T=ef!r |'܎u{KBGr;0O{ts#?_> g>Rnui"ӏK9jXQYM_$^-AGi4͞Ã309 J"sh*A:v6χIS-^9I"3Crok[z':SY^":L⑯U YRF@uEWqo+iPCY.X)`W_, +'7tUvAh8hǨ_:z]9mTa%6*ZAg?Z 򪥁{<ɞב,Dnvy].3e=%=3?_F}F\w4Y*uA ˣ`)ݡ/Uw=kiV~& :?~j\,Nu[qsY'ƿ0.ی [+ٯ >Q}Oz?{߽)kw?2OgIg*qZ{k.\a/8 q. )<2xoeC_|Gg`'ɚ'S ( me>L /6Ww5a0C\z y k"S'AJg@99 `7N!AYU0.ECe[OR񫇲m6?QkAVTD4h)bثsɇ,{'[ .Duow}~vj[+kk<(dWG_b|-Vop}A1_ގ2Wc#m;965.=E~d?T@%$5+ Q*Mi@$~Zg/ ׵d~(ħ͜6cpoܸί-A9͈7-#XE.#&nnoy{/IBH% S^.~i/ Ptw^ؾ;1 * 1eÃUaэ#qd,<`A+#g&9e%V &ҾUi=|F]jx.o[_;Vg& ^6tBC͌JY'vUUт㬽J?ZD%H]E,ԭwGx׶]pvį7Bm@O{ұjG]XѾx]5͢ya:?!> m!9yuPLiX`<~x\_1^9#?gRG8A;#/u7Ab]|sfԉSAӜ8=k}}'䔎waq%ӽڭn{K7!#1f)T +tr{; WˬW];#cx !`@J;«j*E˛)25kYMV%(#R:74]" )B>L]w~`f;qP8[2-hKk t$ιnr#$Iiu9}937\5*B2 ]_A3+aývuo^m;OW!A> i9E4ǩ]'lcG7|[tEDQJ_vAAG ̦Vr/hfS,:a%׾m)yhzq6ӤA/:r ϗqCw=>y{{"Q*Hr.zk O9 2=Bu$?:q)G]ƪ?+.uvwl< `HIٶObR:L=j?NkeCq LFa;oٛr]Y~vmY^D7KL&W.z/=)|5P ףr\kgY;"ϸu[YNGZ풋dxﶷuQct6ΝNo F>C]|}I8>S69V[k+m[{`Ǒ:O Lf [:p=9bz?FWv,k7ڽ[m!N]rm Ǜj>o~g}g߳bYZg_$#vaI@ސ)8ܕ_3 Ǭ0f .OYs"d?2Y/6xg䗍QG4'6C䴭E6 bk NLdXԃ,g MmlN>7JGLs} _NdI]l\嵻1#tmo;-X Yn8|VyqMzrh82{`8N˵80PrGOP%5? L޼#Q:lg/~;he o/l,35K+bURQe7aKkD%o]n?|c} >L3]T!m59iSNm$PMgSSN`%7dmЬ,Ө3v/5Mc{<%XWS]:* pX iI~ 0V2f`Ng@ %8׆>V@ Xտ-fξo_`ifA+lBѽҗCzdng2x˙^5DG8BR$40q8a+Q^oX īw~ddEv*,칰?+ݐ5x` y+ux_?N Pϯ/=).#.>{0SNT|:nzQ pF|>Q7KwUQ?XiGuNz_[J`d 4 =dA*.itF'>$?qĵ-G24K)h eMQ$mJARx.H`yfP}]YJ#s]giWDO:+~^\39ZBNW@-垈_R㽲 [}-tEvEK^FHsHtīY'f.vԼ|5Z籈zsBGp84k{ڋLE,AI+Oq&|4r«JqVu|-X]d&84edIM lIy?xߖ {[9NZzNq: 9<xlbX~FgEoi 2AĈҟkE 2%Cސ%oA1'fOٴle=Hd9?A+#ESt" AOG!SƔ~lk'DFa~0A)3>y{`7X = ;m/xPŶtn lw-}D<[hP4=Mq_sy=J Τ(&Auz}kWNiY`<y[=eΖbfiuShFnP2ñ̀qG_J' `:BWǩ&hW8Ϧ ;|Sog~i.nTyNO2`.ySi, xkҵ&8YzLЦG\@Du>%+l`Ncd㈭ ǝJo@ljt&TH>y*h>k:I >]HݕZ+!dI R/@?}3 yg5y)~Jo?KG GU6*÷BV9h;o>Fr[ޒR;8nDQ 0Eټt&ҡ zXBZ_TSr([:]뿏)Mx8 L# *6o]2jU{K^$^2iSik :>ʯv ?<)޶aڮ*-b!1a%C !uv|"Bǯ=^.ٛj*xGJz_J޸5'rA: Iu}Wuѿ[FǨ>-ӞEQ?#å ܔcGkzY῝ Z[fmO!-0up2ޝ}w2|t<:K~cVJn=_?"uqg#@QL 8٠ewGP]bՅD޸Tw9:`?ÂPs. Ԑ.`֗YH7Fl7ﯴwo/[Vj P[O h%I }V,] 0+P$.ՐO]Q1gsWlD>J<(Dv$WrQ:rVuC~d3EVy~g%>C3pZa={m@Nٙz_-dDyͅ䣮!+ąv>Rɠ{F'`/Iډ@^{L#ʓ6@YzǞYw>_R)Mx L0ڣbS:'óQ>A7΃n-G[S\\'΋rRT E(pv>>~KWF1UggD|`ɳٻwt>Xgq%`sQmue@۫N)M7.|3(=QN̘mCq<%)n5 B+ JJu%TyFyCTuL۫ |ySQgXX:ZǡC%p9s" n{,g:& rzcGZuۻic{]#;FUSW//bbεdCiJ`abY+q7JSwK`Y|3#sxh zьdNT^Bd]YR1t6W[DbRjh,jl_snx<^366%r|K^'C/gi0ih|FAl"e& !y$L:'>>nv3`vv(Nl ]lP6z/3U~YS,:oGҤ 4`|yy0gV*N8Y(Sç- G4R{R皮Y`#[l6MNS 62t kg{y _ dC)b~Epom ?b7RG!3>,n_jX 'l3>~:D }G jAUަd \F 6 pxթkQg ץOe3zH>#)_z9-ge}増!rlChe7dʳ}t˛~Txߢ;|W8{15aԙ힗!GˎByUUt k?|ʪ}`5X^Vη"da!ȳgM= [*͟4O35XH(Z?:Ga <;*`wʾwml49>QKhyMq0,#L+bO5^Eciǣ?‘k_~o|էGt 뜇r G>uuB٘Z} UmL>PWUrQ4'g}.>T8:`]1@ _"½Cݲ >vi/r?aS,:mG1#^LN$¤= ,lng~>7ڂ(W$ilD@AcuA51s8]1Vp/GlP ] &e-leM݃Zec>ߺ,t6ZЄl Cc'0耔.Gl-nSMw;2YPcʔegFl^=Tr[ 5ik$9`&Oudnz}c!O3Coj %dgqpҁ֩2G ph3W4~#=YzuU^ڝdo[&!WsRH6E{iuQ̱g;R=q¶ً̌: S,,0u>I#V4}<~ A?pG~Ѯlo߹L'өIJ)F˼Pg<-'N@\w ]T*yF/!{,#/ ^јAUO)e1vd Ѡӛۮw﮶'1"lR:-@zdF iLbg}3G|Αt&y|/S J`4%h7 (2B ]zKT:S^I˫mk{6yD>u4 XsKڎ\?Ymm #Fx1u!6ؑG9-.Z=ټOk/_L'agE} dAhn#M)Pmύ1SCQeݿw+'w4y֋F~ Zvnv; Wwzu0<\"}k21NB%\7 ea-"G-"2.6<ɯp=}+Q/a;wl~ڽb{b~bPK(OPO^yN@IDATd= x ! (*[],2|.o*:fIW&mQ`X|)Ef Fcwo3C3նFNז^yH}Ն#c^128@=NB@COxYFxF&v>QT>zpC@\kBחc& q>z G9>J  "vB6?)MP:|*3A) D~ o{"Wl)q+YY\UPg*- 眱52A@Eƨ!Gjɔ0Zԋ{lʫVr09E4H.R;5UI{܁AO_ĖEXAV9f&FJp#m@s],zc:,F&,lJdaIyVY}vpcGZցќooVц+l챿X[~ମo0(YQzN\jM|&GHux'V1'C1C @2+@ bǁjeދ W|J>},j:$OΜ͏rGil<Njpi}X|mwXT#*l^N\D {H#ChPz]pg'8t4;֓NYq~>O>ʠhcd\r:d{Y[pަ˟]hg1rʿQB6bƫaiK8տ|tV6GHMfPI"NLġd{Fk9zA'iK]&Cs>GŪ="@>y:g7[3#~?"6)^(pYӇdg-u 4UyZQ ]p\(\oócΉ\M0)T HyFQ|9jHK]Mm֣rּ#P/ cisl}@Bxn=I~N? <#o@H;J #q/BL٦`G1EVtZE)'l݉8'Y=O/i 5 RTU}0_NXy`g% di{F袝f9–T.\=u%& |8 LgG{a 04؝\~YYi϶,|П6[9q{9nD8t|Nҧ#".LDdx@QG.51b Th9;,>əQyyTIu˓΁gESɫn:eYv~v`9K:ĵ >vq"L':;{kY.I_Vl惎nVl v {=o@|xD[Pk^ua`ٟz(^k/ vx%PL{εC@CmVЬ~ (#jt +NB!OneUunNm7/Tu<%=!%; ^'3 Ic rn[ִ0~>6#*@*g˃FHgҘ^qy=V6孵vt9.gxlu'y naC_H YU`R^gXd yEjkt zIG$8D/dϻYQ(QFmQ'эmnQ*Tmh-f5p# @]m1*SLUoR.^Hi): ѱ&:Ac ">ԡɫ{={=U`zg+m.W{)Í}V L<wS Lb7o ^?QU}Gv t6H[ UP98s/|,d:nS D˙ jg$zYbɓ@UGX)WF |5Yܑ! 0@7l2HzUؒ's2͟XmN\sk}l`ϰ{$btIq K hhcsm/gm1?G} kƶFn;8ṿhgV\y CEtD{BC:Xb,ICݔl4 :\hm}狥;Y#sf4&AN1󰳸SӜ4G~Ο'=A٠^W9L>AIV׉c)yx j+h2RUы*Yiԇ*Ae'LQ?4`l;rܹwܾô+OcHEP&e`R}+!iK%6=r/ꡢ!xሬS%vID<Q vW7,/e: 7~,Ը-/szccq8{V~߸=Щ@:iAjys4: P^Yo0:v/1聳lGwGr=[/⸉NKdRSygS]}_p4z4pfAy>#\}vycWXlp^>%ęRץqGOI+Ue'B>Ǒ*J4RbFقA`fn# =p h1g;;Qz* 1I{S0tY:z+>q6h7JáK@ 7u0YG]8SʜqCҕTr@!RD,6| ^ ҵyUmO:\l+{6;7yVap7Ŵ{e- uFghݶ{u\'oA:VTÖ"#&2적chl{KCۺ-2G8mdo\4Y#ԝLZi '/ėDWfZiYOi*A?s|'ە5nᬇCtnSjf[q^qM+|:v}j(R! \ukCrMYJِBs+W:`ehe^z 0,WAP|3 {8,u@WQA,eQY-UC~h(Ҹ#6,j,]z":5TR _aJ?gUyB##<\( |x߮>L[qS5&QwG5VgR"ɗ:L55eNSE'J:GIktǝn1 ?5ɇx+9j^BouPAc6h.N7f J^'H}  m[S0sb@:~|  6Tvt>d#tf Zȿf,s>S/ =j}Au^*/ *7k`(|EW_?rd>n3u݀g (]GWڱP/mSbGLZ_.-ί& |:9ak/(gtqItI3pfHgAoǷH˩;!:ONzs/AZ$cB ,q#\-HU .>"l`ɀ7 r Z/^% Qg/28_dq.y䪃Swnq ƴ uOmaYuVguQ)Mk\5Neɲ3@^ގ}u> \Ͽ^cpF9//Mղ:gM`Wvj; Q)Mޟvxť@XGJw)ut^$TIg)H{_:AG,ٹڶYpdWY<`Y%0ssvĕ6oPVfXkпη;0G+\qN[--\='qi[0老@)=>QIBόO&JVp7;b9; g*jD^nVft.otH (lY٠_nd鐐?dᥝ,ؔF>WF onƢGpeZ[ȲF;Wx$ǜ }(asWC7;SK8wEM~G}jb{#j%{Hv{swBr/#g`=񹶸XN?>j 6j O}P{yLe$nÝe|2bQ2C (0EBSӦ!ࢰrB qVXax{?#rSuKz39r\)6Z2V@(xޑt#<OUVN{D~T):]%'Ԡ6l+d\W"Ki(G`CxOiŭ~wھXI9κ *p}UeuYDeف8X6OY_iwT`vD:W{OF L=֛QgKg< r`qM fO ϻtB ʕldo1Q|3\!QQӢߢᡐdf#?6{ f|̵rj #7o}`³I. 3U6׭sp2ͬPWy `r/r)EL+Μ I3S#Ty\{{ڬ:˧EVu>~,HMdS#"“m+ksCSYtGȏ!A4}]jY'C/guGXBj3y A*w9t;[E:Gy ADJ&YxΧ墕p0'F&oã(;Yhb# &kEK(}ڒ1lЯkmKoCzF.;Lg P% ꯩL) Cί&0 )!7l൉ J: Wf!EZ-vuOG@1PXeߕ?1S,Y`te? &ū8<LOb215<\u'(B0wyX+~8ѰSHhamݚ._4%C^t2 fJPnPhpԦ;^`Dcȫvz y<\. +0O?2&*_9yꕙC9GuW3 :u(y 7VprY ý> .ldCF%>פ~dE^+֙$jNV*oJ XOW CC5hOC~+#5dnOb?U ,ظkwz>oOTeQez5i1B2-O0:Migqo,fΐ&R̎JzVPntgSç26:{z!Z/$Y\Cdp t |o[A1SԐ(|H<:* 㜩}a yn~sP{xΉ<=NY .i ~ FGdv6"ȲQOjJ iP"vĊ]2%%DʧS>Kjd_4'SFx_\tkZ.$Q ܠ˽x ~p/g!oBlԔ& |:y?}Kmpµخܜzd)4uKLK|] C*ߣGucq7ґ+G#7:{b[E ilO`ȑG\N[!B[H! \x^({DH飈ܴ Iz|L@?*>5 \~ q~墆#HHHΕ/6ZI5N#W5:j˧| Ȟza:6, JTmm˧# %H'`9S59!%.L* |&!b1"Oy?~=gL}c&@}3NDe4Cl`3`:4@y3%7GN`SVJuW mn0W%XN'_ꬎ8_ZvY- Quk ZP ^)C^~A+cŢN.`ư.uUlBOOqYIȼ'\tBy׿C:ysp_bzX`|2vtk]z6@=}NF?+/} ']T*rvF;$T%gP BXZ^o7n/L9H:uN$,>KΜyy{(j{s!G WbZ\Q\KR;ߏFz'. 0%:<} |P߫z1ۑet\TƮ aMl9=B3Z*]Ŕ}W1zfЫƖ`*43HZS׾?ko}/ԩZ yzt(ϓmU`?OW 6I7tV_R]*7eoP7GpHrNqEVKwەAS,Z`|*[<ߞ=0u\nұ\y],pUGL?vIS ,5'%F\l/l "}/ F䅕,def7N]>=RT+%.Ywί>ޞ|2vƋ4 +*ꉬP 𫯝 #mlSp xcL+7RAS2RVeySۏczL'euWo%r/06w 27hu p/L}t<]|pі8X&1X:ɥ/iٔ>Y LOޟjmxOb5'霆C\.e|آ/i*xw CZ{Ww+,W) 'G:Yd-FnɅ^B(z QoFS[1??5>+$N[KaȂ̩ TjEZҞzy=y"˶̕#|ګ 2~-%[UHb䡊\oAV]s!^y1ػoN?>i Lh8oW7r_n~ެN-0urnaR2A-Zŧ_oo{#GǏxe[02m}$w޻c`h7Yv5NI4KK|tfݾM;.wէ5Y\X{TH0 )1?4?t&鈹f_3#wdO)"Yɯ|zgiy gq߲I8ܯ^}-9GKB&#NcN,rmpWǁ 8}dF*ruV5}·ڪ^Wx<ݾsJ- KKz1?6{墳A癯bG.00B`-O2sT=\eKeᬀ<<(So .Ӧ<lW.<CpշVϟد:OvphMgQp<ɓ\!4HNTJNΤGuIϫZ@ſdOSӰX<{vgYͳGwr3|f pϗ͐;+l9eu=}K \2k@pG|+OPpȽ=R?KjV{T3t)Y󚖛:c cy\vK๴TgN[g59>7ZFoJ 3 6K fi\~5eI&pKΐcu`j,<Xժ/ B|Y'/҇Hwj?|.;`Szjӌ>ce+D.=SŪS3 Gg;q\F>d, Z`z.@eWyΪ|TVV]PwWKR$KH2 `d0"l#@ 86bx{ƠЌXP IH-nKWuWWu_YU[물n罙f]ug^?'Ͽ㜳`~˻˳_|$vWܬȯɋ]=2Q6Bg=s+yZS].;Ql/374d.:U.ѨT9'|fX DKL}?=yy@ћgX61^mTJܢ@wT3rGțDzӏȰ_D>š<N1nr%15=-drLfljE8E_J( 1Sj,UԎMb*+AH:&fu*2ș5nPjad4u2rzcf5 1_Ma(|(IVX܅*uȑ:vmN9(o?[z\\yJIA`q؜.}/rFf^nVzZ=|brsF @3(]eg!e"/f=(3+ݼ`ێeߦ`'t7BރgP},D5KUڶŇ!~mcF gyY+ LA,w*=ӓSe둉rSbi[g8_yY6B"#hhqazJf\8Dk#RJ8У>\U)e<=+#=AGZyvDpWw$wBd4FTJ(#6 y2l6 +]j/{ZCU#cm~JYC:"¿zZջf ,#L=ebe^6|,ȫ3z+o)DZUϽ^V\N 'N"~ A0/Ѐ-c-M12^[7xt #o{oL7ˠtY$~-s̿ۈB9y:azW>35++'׋n+C9Fp9믜Uy?ɚM~l:6mΜE'^ߐ벑^VcSz}tĈ8chNceYYV 6]G$hS>a"l%×].wWw@D`ꛑضnQ i~71w5B9!.Hge{`됦,.M(:z7K Ō`-GϓaMFꐹJ{;>B<@̒=qYШ0BZ6Lo\INЈ~LAVr@$A^ !wY:HړWeSJ`|6QPŹ4H"TuQ_%i[2O#;F8j+][LR=D ijL.'>jWʠGtC(-1O*Pڂm7wkXB X-@᷼L%R+Ǒaljap$cae%hI ߫fcV.ف XiǙZS/=T['W_]wGajzy3Ϻi`8}褵K?z 4[e*63 qFNm$jr*CzvߙʑT6oϐ$;JVu|-@5 PwCGzr|H+ozrw_2sP7uHkoΤMqz#]2Bsc6d7{ȟ|+i@襬9 Vd5 v0ߪHj оrceBf݀|Eвy1$N4X!I#u $k 8ٯՆ~ɨ,=@>Ḫdas J[xdsPN…g*/j6qڰ:[x=RI16`'[`Oi&$qWFGɖM) Ɨ1%Gcy3C?5Xkgda-!3I뒈!{8&?'-iQ?[#Ժ>Ź3+O>GeNYκΈꦬ1CFWFJMu#i#(s" F2S3CET!IQL^*v땋dB^bdK/S܉(@|< y_0hy(t9s@*O oۓ@~5HP늩;͐JIT/ϒlr~X9qryd9yQ BF+NEP,P@!f |35ps.U)ID["WiF^&tHZMAPΖ\?ZD xVV& p}|jMͣfJu%-lǑwHx8dIk?:-hG|cHjl*=SS2;9}knߦN(`u*K6ݬFgfZϞsgu |"[!H`ZFi΅zZq:y:GiB;nʁ&CFO"VH`ktaR"j{7>]~# iGA.2H#?BQ){˦w㧿Y)7&x :AD26z螕(rTl=J4۱魎!.ʄGIZprM#p 1瀊?2/;k 25ȫ[P!IaŨ^$I2҆%u,O,н{rG7CDJwPppJ0JPf"F0`1``nvYCЦ`6;-hpFSh#"7^^_sw"Z=3`=7ʕ3kck n2>ߜ^Oxe#y #^O4%OM^/;vc'.z 6tlz '2n,8(™qp&Iy#1! HVy:EtƲЁ<ۙSe=RPYv:ib|o1'_O膌Wl8JQgyDT c4+ɟe&ӵLbs[ @{JNNKgxet0pB!l/)R Ƀfo%KK3u "^4`6 ,E[ &h?}pD:>2~~o$s2y?5og lZ-ڸQC. '}lBg u!uw[z}_xjQF'lWd=AIEՐ}{ut )gO"OF ȳ|5@2r\z5ъ3.+C$$;b٨%>M]qd+'.-SBꐾmKe8c_@zRܶՍ.a҅#@l4nО^|E3"m_={p `ޑp؅2y}JOAmr''eQ'%Ei`adF*H۽-M:kGFad@hB'3A. .-;tXu&B  gim<#w n5I8&=B=A^ԷȯM/GO?9 H*g/UQ\Ɖ!HMr1S{鏪9s{ Hi|◗98HL& s箔+W\4- ِ4M5R4rv m-:624tbP!C'I>#W!OmvM9TA9Aoߤv3 Vc0~Z9''`F6i94}l0(z"ͳqG"`mI͞4{BF?w e'"z˞{~QOx|R3$@:qVJ=?$"nxZ7Y؃tWߓNzhF:uWW x+#w $HފFde!J sb<&²cr@ެOyCoz"!oHQ"HtD"FL~,~1r/oj'b',+#srWP 0=_4]Ɉ`!1ӫ=btۘtM'7G ~\V81 9rf܁C8/8(^>/Mi#N*Gtld.)iS Jg7T9C@/W>bc4\<]\|=z4IzKi oϩ[[{buPk zIdBQuizwHB~ 2@`_XWDGGګqA8 *bCphh>}RsRw2go=⊈!Gb\;ŕN8)(ʛ~Ft#O'Mzl PƆP|0q/n/OkꙋH 3G|ˆ@ {WH[/sYfl[:lX[0eQ't1]02_~xy93'rC̶AB,F`'r[_4޻X/@`ItSWڭ.68ѡ (/J 7#}ɂ#EWʁe8#cE(K깫fۄN1b4`==yFv6[y876^,V>RVF xZWOz` 3ᄌAoBu4'esWwsdMrf==ʽzAs_n[7+zJ:Q, b.3LTL%]%$n Z-Ǖ6Dy=W;;ou;7RHjʕb= raǶa;6X%4rX7^AF2kgC: by+a7\8|9U5Vv'H\'!}O#]&CQ 9/_o|^|ByetVMڰu7B 3'I 8;FVrHF+K2-׮ZݒGdcC:fZ 69A9Ky[ǂ}p):gHؘ<9 H3pF?!rl,?zLKӯs@hӸv\;y أ'iEM,o`F/=X]8g7a C2E 6z%sۉS:qqګ$dm!$Nt9j{bپv=??DF >}+cr}^tB7sKoy02+)G_7ߚF RpfK4B[-{xw٣~?.O|>:R_0 ZOV qAp$`ǤbnXT '̐!*6w.g-y\Mq'YZdNq ً^9:V7L%(UNUJ!j}~?bg\Jڔ9nv7X:ԃ7@ 2b-p\u?*L b})7<5@)gvtv H1!| [P^X)N's,\ _zy}cˮKetϽe' @#@eof}w`ysY3;vjw*7 quB A+&>?_ϫ;%=5Gׯ]˗ ˕˞;v[ːV3L0 !BS8h3@1;V<=&$BpKX{qx iZH}p2(F/܄@ ("y9@;:PDY[3i6*lzHbn Fϫʑ4xB'PĎUfVVi( ydSwW.W޽wE:@IЍoNоϋ*qvucV"Ȍc//r}2/zF7_eѲhz4*\x>{ jǾetPKerlBD3SYH?CքzOc>zxb2ןPT͛ B^z`mb! 1s9'zPC-bk~E쐼art:`rD9.W&t>fʐAY b/ RK~rh!XKuEA=W Tv`f OO}Zٯ /cHO!<+SX'vuTN+Qg4: @:}H%GyC)eǑ\Q&bIG]U 4jl4Ќ_(//X-0+ѫ}ό(CWT!jko=M|CC{ᱚɪwOm/ ҨyN f c &#QM` RQ&~F|_5)B:D9u:ڼaD༁W؇39V^Δ_[]*W& PS-ZS1gE8`T}1'HT1]0M_ࠞ:5^vJeozZ auۏcY5@:.k~_/.)7&=N<9AA4AT!dlH6Jw+C$G"9qܐpccCCC{o[;+PF=v} 5BE:w"F)9؆u͊9z1'ԇ nTFf=* uit3`#} Ui9e|f\M="okr..A쥍zCtVV>xKdwC)f mtWu˖Wh?w'nml8E[> څ9/XЙɩ~H*GC=Qcu A sׁ2vTy/GIpdD}zXyF=}e*l*T6Wդ(* d:L%OPS6ӛ7&6,K DYB: c+>E16ƈ?N^{U)2!b0ťL6 S&#V/{s.ӂ (`%%{d IC+y=_32ǟFv;epMCs_:o ~D <"?▨z>ir7vEE& `^zgzKi)+i2OYF6e)(|Cr(GRøY' H‰^8Ŵ6#N#7+K= éc6 ZP=4Tulm B7I f<ܙPeG<`)d4Q^Sq{U0y6w$ש}Y8l;!*[7*a= @ggQ~:~6BX̕HPμVju#t#2R~Ԩ˞c0FT*/+_Њ~-,/\9{*l/tzwTV.$#grGy%-W#z6CYX9OYCع ֳϡ)]`+zb43W>DM)sp - {_p|tsѼR+~[k);gœbuXo `~a@ # ޹ˉ'1 7oۻ fS"NG!q[eBg}l{Fd/At6L FˑrttO.\;&52QCHɷ'OK EH7t<gLC'q'E=Ig4E(QEe흋pPǨAg^nJY(tڎ6_{dBQM>aϔy֓{ex ldͬbF'zIwzn1#CxS{[y*z i,`N,S m~8ο95 "M!WE(!j;7 Y^}js'L/4Vʣ7HI^UL0#tS 9Q#Tge#,?:#=WBC1oSj'{DhxxkuGˎCl5.p eqC&Jn?j%9Ԭ_=66 dPfOuU'~;?W}[0?ȕ=6'@:tea1ې9&@FɌtzِ LUXY5R!tHؒQ TEQ$FPQv/b$OFO3aH[Nȑ!Ry߈^}~ p`]L0AFK/'8:3ܿc;{>^p?HZ F-e .by~L׍ݺVKycOrÔȯ;5RFRv#OGȂf1֝lCs~?U>W?>3Ty5H.9Ь Ih6b؝\Y}% FdY\:(%d)۔UNJSQņ{26K׏au}:tr,i)7bGҌsXD(s&i \Bo-{n2}4"@ N|6tltK[Os@txG_0R곻5B`A~1o#Iӥ\>6@G=pݎzmQl=L[_OMM/,gʕ1wi>7"Gc }pȻ[ ={ԏSv(NCʖḢA`4Uˋ|lۯy+?'Qvc\ @:p7r.2_ П3? =7Zq0.N0WSYCJG˶T}z vZp+?ǾX^|q{T2ջnO?>Cl<Xq>qM%PrV,o*}hd/#bA3Ζn7gEqd$jmf=vЎ_YG6}s$GY6YC{xǞSFh!ξwVf=IWwtVzr[_+Wϟf]O,ʿ95UQ}l__w[L?w%9<: ^F,AgP%fH ]z6 FTɡluȂ +, ld,]q'b RE C=z<+y;!vi׎6]'s$3~|'T7 ީ}ohٝdE\]o@ٸma5aM͡zq3e)B3s‚A25l.wֲY1k?7|/tW2ڰP0>Cf=j(=nFāUkNg4c+-9Tڐx/(YCа4ꨓCt>PEYO]Hg #ci+[mBF1N }S>O},y})Ϩ?kate[jxAӗ?@34#2ˬ\ϖ8˗O/Eg:+g^!C/0gnu6ep5ВM^fOx\|ΦX'lHI>M@VDÎ6z[AUR9gM1Hۉ,9ހVс,GO9O2:&z#!g=1? hxCe޷0mo.2$H56s_\9#q¦[P>( V-0|~+"r'>{]Dw=ky-/*/G?[}2~m̦p x6gjChak rtsԣG8$3U@[.;<7C2$ B 4+? h?[:2XƏ]9S{rNSO<闌!lzkN#U8_)-𭷯K pU+G:RJ3F"ڣ']#HLG_ }M=/ţ){`ٺ.9u3O")tvVf=I~tYᶰ^.?^|Wb債.iN, HC{p |?zCſ@yz^)[:*'mPe&"o,[G=G>X)#;ߢJ(C"8 WGt).^ &nKrܱV&''ˍ1rm^wϙ^L5t!ӃWfuҼ>QUμ-wY?)SQ݁ @"ЃЃ'-MNC`Ja;QFD`#Pl"$@"H`clm"$@"`B"$@"H`lr"$@"@^@"$D  xҳɉ@"$@:y $@"$t6I&'@"$5$@"l@؀'=$@"@"$@"otx:ZD HD^?i"$@"tZID Hztz @"$@hY$HD u3'@"$] @eD HDH`ڟ$@"t@:]ED H^G ^?i"$@"tZID Hztz @"$@hY$HD u3'@"$] @eD HDH`ڟ$@"t@:]ED H^G ^?i"$@"tZID Hztz @"$@hY$HD u3'@"$] @eD HDH`ڟ$@"t@:]ED H^G ^?i"$@"tZID Hztz @"$@hY$HD u{i"<ܳG9U8x>dy?)۶)TaX9G>*;gN21Hzxi ll6j~Pۈڎ|R *^;qw[-2tkrCpF~̼I?2oJ-T{垣o| u]v]ۄ&mJjLiBls-!_[-cek>O SgA!+ Ʌ6mxbCʢZvdأ6r+)Ϲdb^ID`5H`5P:WvRH'2p ~(NG*|Y\qC_Q#v>U9%Hk7O?3-m6?3s-S n 6#@!SvE#Ю?_Qhh7(?翶 bh|#aW/ S/N\ۑtufC6GY= .,dT]Kztz͋B*?xЂuCzL@]長 蟏o7ߪެ~ňHL=4jp\+y@"@{YxɎ2'*̧ݰ::&{BF&G"gVӪL'@峗wUas_/h1> CVFf;屏]nr.zh72Ѯ=KH=V $ڴD`-"Z<+iӲ"pᖽ`?󦸏! FZ]X}Xsf$i]hny+ּv\X [sldg?>'05@#L *"8/Q0nW {jzz9gmWOVtVcdis=6W w#i5 ]}@}_ t,~>l9geSMV|ju$ mAҿwʷ*, Mm18iFvG]uql[3\v`.,v:2/rRڸ$T/SBO2v෫/p5rX5]9D͎w*@pqhtvۮmlW|8ӝy@!@wQsXMh7|P@|U@/Ch;}Kuvhtvyvs>Zt\YHz聓&.oE 'jGbmڟ=Oha;`;B!VGV s=@|"ˆ 49b*GNLO%9.Ok6 ڽ|A9{$ c3"jΫJ]=r8_;k C휖V:68FӮvBJD^;ci}nHB|hgɇLڑ&F2n!B/С]Xc2hGnb(n*S]/Oo,U9j7²TD`-!Z:iˊ a v] Ol큀n,XY ; Zvv=V:1ɠF'꺖#N휣3u&kX g!mXQ`N}9i^pl~!a+b bΉXm<-5uO2峓-S1ݒ ĂƆ_ߚWW;`|zV nS+@/#@/}Q@Լʗ 8u,pNLJŻq(LX8ne||$7%S׵8v b̲\bkXWX t}=I .3N6Ho Kk?uڣm󞏴;gh-u@4%ެD` зV Y%;h?#! hچ6m#333>:Ep|gll ?{bf}}}ѧ]v]ۄ&mJjLiB:l>[$t:;3R:HD X.Nc6"HD  t:+D Hu@:4f#D HH3R:HD X.Nc6"HD  t:+D Hu@:4f#D HH3R:HD X.Nc6"HD  t:+D Hu@:4f#D HH3R:HD X.Nc6"HD  t:+D Hu@:4f#D HH3R:HD X.Nc6"HD  Ws~<3;HD`hG772_~:@|Qpܜ֪l'@"sݯ=HJQQ"c@"$k um$-H` #.U<D Hܣ~]]Sx=3%HD` } ׈kÌtZh?!ѫ3'HD`qo}\ 7'lEqqQ\چ߀͵ )!HDK܏ccTkƵ؇eStb q\@p9 C6?p!HDK~̽86蜅@|>B=ij~P". V(HD~<@lF6< ِ,p @$=F# fHD '62ǑFzEGj`/0R` Į,C\hAu!ʐ$@q}9}(z6lHS_8x p.  2$@"Dp%|]@ us\HR\x8 rOD Rg9ux8 KfO!Bj&flC]&%@",!d^?ǩx ]UI\ ;wpj0)$@" 툽]^7u2I^{J7'G |la"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"$@"#.@LIENDB`openscad-2019.05/icons/background-welcome-screen.svg0000644000076500000240000000555613402025764022776 0ustar kintelstaff00000000000000 image/svg+xml openscad-2019.05/icons/background.png0000644000076500000240000012604713402025764020054 0ustar kintelstaff00000000000000PNG  IHDR pHYs  tIME 8`m IDATxqAD3t )Z X1L^ve VXqg/a`'~>`6(ơ D'¹xD,z @~0?P%9]?6"0-9\K ,'>sE H7q* ' 3r`a2`g" .@v&it#(r1xEO00rDzhjK(C"rH8J .$ ?0\A8\G`a&r:GB߉<&0?>0(БN l(PN |P(К?@O@D@;N# &^l@YN& \I(D8JH,4BGM' OzrcD`:Op R(& 9@,N %u \nNГ \KJrs`?p%AxNp) Af,Fp:(Lj 1*" #H5A2 "H`3೥?|#O #[B p<"0C!>#PB05L%pˈ<'rB /l' @ B@g#t$@hb@ T'@*B@U$T#@jB@ d'@)B@V%d"@yB@!D&@;B@D%D"@{B@/!`'!`xA XENf Y!`40 |J `21 XDxEM`3!8 !M (!E !Kz 1!C !K |0!C1IX9!A8Cv~#{ ZKBp%\"sXG` `1ON=`!xNXN_@DpHKN@HE FHM*N(EF(M,NhEFhM(!B]`5XE!fH n`$ 0 B|B`0!D+& ExE`1!D68M !E 8!M !E 9! K !| C!K!!xC!I`XO-!8M`.OۄcB`!N:8O`!XN;EDLpKDHCLtHKD (CLr(KD hCLhhMB!`?BEVU!`6@EnFB` !.@J&w`!!@?H @ BЗ$@`BЇ$  @"BP$$@bBP  @!B$ic>ǏY& 6hFb hNbCB!"s -B0!CB># %S5TBp&,% [@Bt'"@W@HBt#&@@ BT'"@U@JBT#&@@ Bd'"@V@IBd#&@@ BD'"@T@KBD#&@ |!. WD IDATޝd;PM\AV6-@0b oHsV| W[|R<MMB$=$@K' Ђ@#B!ИGt" ńM̈́x<@2BsHJ`. A`B F&A "08!@1Bc(J`, jr `,"b@nK`BBLL !uxI?&Џ 'aBpy4#p 췚o@OY5.!H[ "@ BHE)  5!` ANU 0$!&T!@ BVP8TP0F 42`zB@?!Npp%xAIIvzXM8"bЂ4 % G @B^Б.\H@Ln$&  ~%"6+| )!$'sA@m0!I%(B&(!'cXM9cX<<"b$|`bB  }/z:KBП6!GM[MxΈ pЄ#4%]>@WBBp)!p !H" V8j@6Yi 0 =!f CP0,!*'@@Bl5PHl TP @vTJS wYMJeH جU^ o'A !Z8I Ƅ8B!XMЇCMxX/"6+ LFB&K !!$&0y90ţ0"b@]I`PB N"&P@qBcXMPQcX<#"6+$0!!|&&B }Bz ̑)-gx&"6+'[`!>8D-NhC&)!cVВU,X%"6+G^2B?rB_ p!3[M@[3[<QDlVf"@jB,PC`HB@5 MBѭ&-:&"6+,!`$'@i 0! #%d" V0;G WDlV &OW7 B@/pj!.#! hL8B:΄wEgV5Y<""b/$ @"B0/HH# oQYNf89!OF't'&zs ^[<W p !Hػ,7n(;j" A C`WH9`W0$ B;!"`ZBD+&f0+(>$iV`F4!f!lA [`TNQ`T$ B؞#WW=U=R?KҬ^ Y > Q  >8*>YW DWLgt"# pO5@_pOqp$ nC@` B~&jq93`I%0!5 LJ`-X"VMV|'I\&0 O`#Bؐx xO%iVMj|!p K&(>bxVfs2! 6!1! p!UpGW|p$ TB !Jjzr$iVE 0!`g GؑvRMvR|0$ *$F ` B XyVYf" !`d=`d;JҬD p=pC譚[!%iV&O$/ o$PMq8BIҬCN JN$`\I`0!XLD%T|~[f# IDAT,B&9 `.&G`.c֗Y&q `<1!G5aAGPn-I\GB!%}  @#@#xVf82!86!81!p!x_5p }8Cfxp*!xЅ<&t%U=9ff*IrB D `Gh<`GŃYfv LA S`UXM50#GXMfY `fr,!f",OTs@X`'I%!F#lMQ܄^5"W+_%iV7oГAIB91p $ IBEB|J@B85Q p$ %iVu@` 0![51P[$iV`0!LDUMp0U<`NI`09!,BVMkpLV<`=I/0! ~T88 )W4+uK\+#sn`$ p,`7!86!xp!د8_ΐY^'J^#\B&)+>4+ !V'tEUU=qUAWIX=!V C `FhH`FYff LA S`TLO`TG UfF!LOg*VgŇ XQfz",M^<_52w+>FKҬ! 3W*><?KҬ6,;pjih=IxAxأX8G8Of^!p!~"p!!SMpǝNGf~@7VMV|Y`-XWM?GW%I|%0 ̡`lF̡AGf1 LH`<%1 IDATG5G $ X@%Зj594 З$ 7! #+~|x&IxDl@59XJҬp &>IoG0*`1]7wŎ,x(O%eS/8}K#$VxxZ7gp5ך%gK2x< Ce@%I;$!n(Mn*s 6p Y$VV%tu0d+j^n,ɰ N&`%fռXUa`,O!TM]8\yIpGIJ5! x&՚|dX8|B8pnC34/x]a!`oB^ }ҼP`Iw ΄wA&c8K2|EN$|o3 dXE.&<P[7o%$V{„>`BnాsI2I Z`rBnCa ֑͗dX$ „`.B=5ji,Y + &s\)ɰEpw@)BU7PCйJ2] p4XY70 fdXS`]73!VdX`&A7:3A$ɰ $@59lj$ \M࿄ 9+4 +pp4o(sH;Gi.$V`/?$v"OtD/ɰ!p !^Mpa8Ga>#p2!D"B|wp$ &P} $p?8 ~P[a LB`mXS7\+ɰ 0n9<~~MXKa,J`.C7,?FGanH:_Gs3x<$ !kt;_$V8%p<^&pn^4$ &W3({H2ni`oIG8uX!ɰ8 p ! ?jjI7m4#PMqvٶyGq)Vtl\? I2VLLk[!FfmsVK1uwl۬H2fVm۞3\gB৒&T tٶYZŋ$Cׇ7W۶=_ %g.3Bm۞Gv/U$G\x!Bݔm۞{K2`g ts1m{ow1$㫿}lop$ןbIM(@ (@ (@ (@ (@ (@ (@ (@ (@ (@ (@ (@ (@s@`@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@lD IDAT0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  `@0  j[OcG0  `@0  `@0  `@0  `@IiDIENDB`openscad-2019.05/icons/button.png0000644000076500000240000002725413402025764017250 0ustar kintelstaff00000000000000PNG  IHDR,s pHYs  tIME(AtEXtCommentCreated with GIMPW IDATx}[vȮ#GޓP6 Civs?aRo?~UUD[K"?]n|_tۏE9~ݺ X}nq=fGʻS{rخzjRƿX[꾓諾"ſzĻ01~^C9 Uh"DB.=*Wsց: %M%7xA(dK'xdoE K4c/0RzތɎV_ ,DҎ%zp0P)˻dr^E J&*ъ-W߫Ɯ\q<$n=DZס<e뽂`BT/DϹW`i!ˡS1&B BQ.fH[{EXjGyT r. Q,`y*蝤G=2v#-k,$2ut7 '?v8az /p,TdբثyQh=Ff_:Gn=4u[{۞퓾MXmQLS^ܯշ=rul=F! p6FTUamzmxi@Bܑ/XЗm>r^OHpj+șYR/V- ~|/0+_-`' !M5f&D^m7?ˌx)O5Qvs׻`ʗV1eи r_5+ކ*N<0%-"*2Fq</8+ 9,WU bc[-76)9 -IHd2F2PG\s-*,DnO j妰bd51 ӜWy>4\Jd'Duјp>HQGn&s.ڵD'P}q$maЎ8 @dZJxv@V;g_r֣)X35&7/0u$@DGs\Z1:)8w=mlWo"G!H_|-:1~VԌ#1/_.˼8G~g2&9 !ݬ6L#ϻ~՟ #%> ZD+gDG>+G&AЅDpNlUy~41%(DC:Șs5GJ8hNp8zqy<UGK5Z {ZЗ *l*dDu&150 ,pNR5e>ؘw j:"̣iK>L~ Tf~@MF15L/4Į@yrlh ]K?] ;y~?*Z!.=V&//,,疭EOԳ̬ѲZ6|P (5 xm]TgCU#x5:65߃:yjչ9tڣAy~3tʠоjG#Aɛɞ( ndUa@"KLg{Gk9ըZϫ4Hׁ*ۡxYmw<4FGe:_A2gDwK G(PX@l{{l%1]mhwf sQ-&}bvA#K\Djy! 7`٩c.&0{YhUJA/1@ NQPAu>Fl>Z|:cO6$#_fgCJ ?Z)LX8C:`w tjRUy,³j # ~*b]$ sGNLU ¸[Qg Qgk ~5ڶx&~ɱ zA1* 4X=QĬoek p\ 1 ׶2μ.)D£wT}Q L$9:X-\O3(YRH" -tG&': Ri JBIjVh$tOMBUu5rWCNG,gXsCn IF`Y5FWߩKsPnyI](xd*4A.j%5D8gR =h J^0#NVhzib#aD|yCM GzpHM^^U8:HPDbE?_D46ֽa>'o˜*EzI1B AOtj?SET륚KVSxJ+0eؑUi)9xx-V:'K:Pj,G4HQV:SD0w~'C+U +Twn{٧>I.N^OJ3S!C )$#if-=q(N " Ku2z%v7Sܐq7~XQ `clrfJ씢ogD*$|YKĵ\q%\I}J<*(\u:a PU,e'@*L"GFtj 9ԟ3bƌLj(; jeQT=CkBB`4J xGA#_UNUujs0C#ƒQ\< fNEKYi?;4iB P)Ovw7*)?12LƲק*5sc= 8IJZ ZxŰ%{^H8$i'Uf'0s?jDڮ6}PIU6&UõdgN0?kI<, lYhQ_URP JL;/O=KJKD3ZxyunvhR1ҶbfEeX3•' IJ9sJGTi(sxQzW)Z֬Xx4gn29 D=Ai~= RӇ6_IOMoQRwᨂvaNX=p+ցn H 1<4*Xm: pUHtR@QZFs9YUk\Ӎj+8OOE9`'ŧWATax&>e 6Z/JNYH΅# gpZk'j3X֔R"P(+"mXc3@fH#DRpiZbЖ&W+jGI$QsH|JY3XQFʺHOb$3:^%EtS'>x; ϰP#Ր::[/խ qCB9}8Wiً׭{/n=ߕd S/y)R܋ڦcUlQᲗ95t5༴L'N{][jpyqAB2OJC0r3򖡴aگgN]u6X *>Х'xSѢx;l鮂 )yWxfVQT>eV%*vL *c+x Nx]t7?VEyiUb-Xn{se1H>:P}([3ڿkoOG#Vh~U?2$Xmp/W^y|Ťv0逛kQ5?3s[ /gr t8kXǻlg&eoX3vK\}M+ pDN [^/͹vҁ~VY_OP^ /1u,'.Af$ dpiEi FܴmnegePWb[g27v=3kb8,&ASmyL#abѢ`\[GNb |$쐹5*axJ44V+{H뷫=3˙z ۀR6LE8㩼.uI/iܭ`)̇Ҡ{? <} `-~EޠXLtxdz*l Z1/eܓ=A(!ܪ{,wר1cte&KHo}vL ԩ3mʙLL*ÆʏqTrNDf`b$?3d  }|9>tlN5T{WDDǕ- Ӄ6$+>,xYczJɤ4wl5Dǥ׺hStEu{ZQRP1=䀽0H uޯ"c™n4 t )SzZʵ?r$EQ>L :t:XH9znkv=eJ.zFpRނVb6n_D>$M#r(qXv9q|m$; q l%A` FCW)T-:g B:)|=X`9I)chRN!ij6"aW?]@1[iֳ*ќQJ k1E60EtC3LH<9s?AjPL iFJ"lA+J;!1(=̪y zU7W z!iO}tz"nCyi0-4fg'Ue7I-| $Acjz$! [/Ff,IK)Fd<4 ;XV=Kusu |3{`ǃrLS ?\2iO ֨b̎S898/1LV(9|9iiaZg=i]GL)B{,d`{9|@SpH3Cqk#Jr3 8GO$!qC 3E.'CnY{}zeɄJd::mRGjƩSZr3Bi-8ŕ?9ڡ U8t@03Qřar#dRRș۾̴)2Ns=eƫA⺠E1 V$ +bSyCޚnԗԝ=8Szk`46Hcq2![~$Sw5MdZ (*SAy:GWD|GZP0!bM23SCxжաEzj2|H܏E=m .d`1Q feGaC"O1R'!^{Ý^UdErE܋V  ٥r.3\p22v]G jp*([2RLkKyiT=y7B **9Š 03`sbA{zcpaT%*OS3K`k9>3ɝpFԼ.wkDOp ( rW]jDH:r.JھJ(wj)oBHJ֜^Dy3Aܙ kVdM!x(&8c0QJ{d5[٧sRBs( Ӛ64? ?m@ּɃflI O@yo:|1֐DѣYźhsfQfE'(Jsrt9U^[Ojnp0bMB{T&Oׅm<B֕l{i_.R2 ʨ55(}I=`FK9h^;myŞm"u@\s /ǰwwƘ+'ބ6caHVw02;gfGLIL/NmwXl~u -vbS<(EZ{os^U-Xgl9czoW+O" = T r;MtE2ؓY"dhaԚ$"),aM1@ 9*^s j@JbOƽ LOvҖHIf$OC2$.̮GA 0f0YPٌ碮b_*+9DT,:pϖf JԘ+U%Ar0BA i(AHQS0>1bJTDCd9J5;(O-AiO)⚦Jx^UUNAء~hH4&}"pv8rBÙWǫ,:szNiAE9ԯ%1MLss[e_vtcNI<"V=2FD$ iX9]1{,4±]hA٧.1ŭ m{Ln Μ)A!0G [{"ծ l2aF`vZ+-%=450Ӧ ,=]*(lm~əm#qS{=1l.{Nx%cO07eqz`.D7\IML݃oH, fbtur Jv2Jꨘ2B4ii#X)Le?̫z=y͜guZ&YFcMS,/4BB1AoRBcFJYU!.~kˮ+ꎜg"0\f 44R?X\ T|]GZ 9-'[ٳd<=34Z5A_jko̩%+fDKVTp\9UѤY+-vԻZ|kQHthyS-Eh]j@DŽ@QM:PV1Z_%bDɢ񜖗ɤdpW ])E/qy qk+N r23˩|0 !M% ww*oXJzÙD7)Jeشb42^xoh;T#8R5ۦ57Tͥnݪ.nxuEeH~b%NziM0t qalЎ/^ai@7RsNı4 ^Z-9UF}y2nc*`"zx,n=t_F#cÚ3}}?7%u$od;a!oZ+dM:)=}>UUckBizS*+CZjyD :Fvqse>;kuS2w,-,4y~+pQ}/T(ý-ήeD\M٬-n`%nDw\ܻÏx v Mbu3*,q0j% "Gm\ۓIi+sX*:?Kcoe<7;S`GNEh/H(7;VjKg>fBcZ_K >SVi Δkk.ىtA1Kvf y;˚K_쌾Ͷ0l"9ol94斜.yOs$¼$(0I|Z?p0r#~N[mq8wFYĵ'>IO:Sm -kV ?~ Hb-1ƚ˞IZ&oݍ?oe_)XדUoclLw| &8uPrO Y}z0b tjW9b :6Ic7(f+R:Gw .~ =ˏ5kBݎtQe6DUSy;9~Wg~'I\?/Ι8Nf45x~X7 #=MH.pE4Bd@B0)bX:φQ~y6 M /Bj`r<ɦC?v؄Q NDa`"}e!7Ƭ鄡V*7TjckVS] @Gqw5ZPiND aT)~aTؑqH h%,kϞcjw+!Z@#O! e#oo/!:{$jvQ8S' o@v>8!v6M*"1BYnԋ¨~?_]oӬm'64%}@oEj-!ltI|7aT&'[Ѧ{=Tj<6yGMÛXo3HvEYԤ2ݩ IfFk{۽->g:[$>&!yykF EresN\w5, ը[#»ErirEb_ -S"H0:< Bp^d?Fu+J@hl(+ EzXTM즤fЭ|vFSjԭ \Q={P$[JYp_ NԤLcVϖh ϶ufx+nT>J#=v}:xwcE+[N]ֵ}ߩ:APNmfn$SYͰ"=[Q$qFCO @RcffdXWkkƒ.^L % !L9yfѤq 푯姫s LO@a"ɥ&xMN!pQnM A\ ev۴s#=gNͿ`4ӓ3P]Bn @ʃY3Зh=R>Ͷiy0GG:gs ¾@9Hqx&u0UP!J(^,߭8FSGњs??qR(&ۚ T3ِ ߐ _֘PM\?tơ? 8$R0H7 X 1fy!O<6aOƍCu_|횡eW8Ƚ̝0l0gkho/Q#OLͰ04~z@W=0YgL$ub'韚Zz]3t TjTh(Af+i<{݁i݄ 5c`^bs%p;̞/8ЧڣvM I wwJziO;:uyR'IY9cmڗ5þ j{`gu~jo1}5y/-`m2 ioCף龯Bj)ɛ_T3y N`I<<FAX: ;5~,-.`ͨ]3 t@ rn(¨>{6}_{dC? 1__8$6,vom0Mzft9a&@55i7v]$u@Fubam^UY/K0+F݉{'V^[ lNeV 7ӝ}>Axˡ?Qޕᾩ*ƾ0|^5C('}x^D c`' ~rJڶY}yw5Pjj C<5ЮF `m!z}zr?aor9'n4~i@ڦm87E\ &'45$} b<ܒoY~MQwހElF*vkijHz$9Q; 7֊< sw6~uuMpyBk_80 gqq{sz%;7W׵烰Rqsi7k=A5{9t/2x&uTz%[- _6Mp7i7+ %_3H Γ`U|¨~=_3 TjTϾPk$%:g'zvj!Le -Cu{EvpؑtJgC?-.MJ I\C7"=a1'O/bj=03fJpܩ j:7Ā®\:F҃@ SL=g : Bx@T# Bp/㴧>h5^[@AxKmm0YVT3 AB{;H=7JRcffdXY5|\H1)q\WD,x𨅿Evp:-Yg1}Fm#&t/[YMpQJj//OBp˦FElF(s"Ʌy}˦-t}hxgtk[4~ gtOco\M hdBpfr( }Jh 0ڊFݛw6!3;FހaEtcFpdJX~jj"FJjfmmon g3s5]YwNwh·Yv#6pMK0ZOs nԹLNf(3&#V M=Ѩ{Âzf۲S㝚CK x?zHU(3xN~yr7oBp y0t$Mg(k $)O*ZS3tg>a@Sfy<ΪQɨ~&#Kha +SS+NnJҮ\Jr/jn)bLp_68i!khKj4=Trkuqk7- U[%K.qizR;GK@ )j-s6ˇϙ8Mm°+S"6@[!(-\.˃9U˔SV 录èsӭ{UtBPKHSxmİYoҪ,w>dU;gdտ=yxu~AX7:֍ڪ ʚjTw@ Y9,/w6LQ}n.|w;N 1=LnoP)ะ+}- i.0<h|0?g{ͫ:]I: u{.H5A 7GPmY0= :oi"g!T^'q-:815Ж.8FoLou6^sV*5N{n? Ssp]~ AyOQMP] ¨~?rXGuj:wy+U3 <Um/=Hj7ݯ)&a] 5vwCbTݨTgkĩu0yޡf|n6qJz6+ed7>/> xBP6556~ }ǡ:Y^6+ -9A'M*e#caT?oײG=oJL&Vjal>'}k.p iqak)e Yc"}jki'-:o"7*Q(z搱#Y-phG~ ١B cdy@}'}0E¹:31qѶlٲ0 7߯QsH0;T7ͦC %u^c :ܷC0zZdy .psof=0j,@[_t48VMP)e19=UN+Q_ӥcUi qD XJ^lI`T3bi:iA5Жk\FIhY)řqI965AIP oP.D5B2dBPrlh1`zw̕ZM]/5RL{=^ b!8OP atWhw+f&'Z)ia M!~Y Aɱo'ݙfnBpLbp=W ߨb$!h^vn88W-h #DF)d(%ӡlߋm:gS儔Q䔛= 0fw͓":~K0< Bϼʪliߐ +^v%ɛml_ͪmBpzj?{TJ$a81 %zg۶=i0;L!nPJv_ Z6SpIWHN.`r|g8E'uRT 0.l[Ŷ5'xxꑤM#CȰE\“ge:x^2+}o~}#ĥUhB^ԃ$9eivz&f!p1/y`NϮTYu1${8t}#©q7afr¶ -UPrtJ7aCmbRJM {<{ݵrɉVM'uJ87]}8=F5%@̮]cqL_+\f&'4}:Wʣ jШ;g!>ŋ ު+Bf85 ba_X4UvF % 3]w4m]pueDةAI%b:znsuoaC`TJ5&#,_lt30 )PṛӨvqzF~`@;m3_o(ß$̲ 7IEݨ^'{A' AɩNibƴDܐi,E.0<p5PD <˧:A,۞5ިlY#&HIH2"..Hy+4ߋ mV na4O1폧.n۲O#Cɛ 0<Vzo}%j'uJ`Tmɱi`n}{I.mj{r| %yKèk!ΛI܊0&<ܔic{VPh=_PnR^ubOoFu$ C A9;vCTgkxqLX4&6ܴjOy U[|5#ēu7nq%}4㑠hwhO&=qXڍU3<2 0Mc6{dV&Az$VV"75;aC[8iKtVèowuf/ۺQ ٪ɓhҭMŽL09MS%:? v;Ds5*]!jk 㘽aT_} cevI8hﷲgA%Wc z)E\ L tH_`rTt&nJZrp4""y n+c૟?`OL0Y6-ٝ88EEDrlh14L6{1{nDBCrՋVPn:ڴƬPp4Hd>6 48r87ѹ[| ^D hDDzE W&I];U:+@ JpcEHv c\![Q\0Nj-"yn=lUn1N4 $"ycK2`E hD$b_^~YW64QH{T8\F5Cɇa2_ .8qz'M\ˮ|-̴_lhj9M\wfSHXaKM\;[Z"/$6#Nj}"[I # ]+MQ8[o>Z660b1D#8E1 'iKָcӫhl&p1`J5A& n0lxEEdX *CAiuh3=5|aaPD& n2S$Tmfvm@/yJx^i\G5C)!^ vF˱oRBEd mנ] ](;FӺm)\G E;bMYnE4}EaNѴz E4(52S:TWAߎxPtMAE^FIzT5 i eLcVRnY/oCc{A5Aa qbBM"v @w-c~9 &'tU66PxW $vǼЈkYi}?$ab9h%[1WtE=4!yW1\H@#MqJ c[)Ҟ[foWyű*l#$IH?=&+"CИČ\u3SzQֈL2w7)֤;PniOZb|SmY bQ&)\FEU(a)5VwMM j-2xR 5ѡ[GS[UX"/>ڇv ߘ1`tF2wɃQ18{ -`#aC- fbը[k+lc$T*g3EReB}>"#-C<`/\ 4qi3u&c<U{jB0YHHنuH"i0UU!z1l@" E hD& A|WMPA(kV=Ml&3K$wZ@íe(2zqp\g9n:W$ ,Ɵy1({nr)u a  '5V1qMˋc] F c] ?i_SJ= @YU*O:Hx>CMDn/_ BS$?] `'*ĬvzJ7N8`늈;i #ιEnJ@8[3Ԅ: |oOf">9w5 ~=~B[ @kgAWCA(*9#6 >fg/r[K g/r[%P 7J B(2":"(Y~mkUPJ r L/.Ƙ'Nt1ҏ*;9}">>] ;{H#BwI~5=%`:Ay`G5 [K5ЈPl4"e7X B+aT'-yE' ?7 shs+:P#BBjQ{K%j(FaT|;q:OXN.9M0?ԕY?:i;<+ |` hPȝY~d/(TJG-rWR{׮űm/OUCgȺ06L+5"1LeEcx^WE}ҟA-6SJs `.(ҭ>ƪ_H5~HWŐ7X QJ/D 7B0Ź`/)E0#0 f٤8)E6zd݂MWDA(D8^SlmG1}ɱjT+8#mȦI0\]R0VKYMP!(\\J>`"CYMBPd˴)ReBkHp"[=Wm^BߤljTsaBPgte 5"n,8+EzrPѤ PшP- hx˜7"= ioF҅lR;5AHo+>*횡U^U9"35"`1٩ɥV62Tn܍[hTP*MLQHҗk`",w:ƈ$nF*Т0P4J5j=DS= 1vHߎ U3Tʭn g"}ɥ:P֊ޡbC0khaPn- C AQzUnZ5y nI'ˋ 4 ukD8P#,Kfy~6kQFh0؋ AFVf K AVjDײڥly1T5",8;%sga_X0l7طt"4jԽo A!آ0˴(lsH(Ed:ը[A[ըfbKuLSgBPDAu+;@[Duo ].`Yd cttsdM C]&?M[T&4꾆ՈpT\y^5C7-6+Ed+3FݮUnU cg`CEdXB6!k>į8C#y A%i6Ԩ[AuYCE$t]B⌹$+ Aq- =jԭ \[ho3X'("yPuFH=B@;ӡ"CFt \S.IC!("9}߇Fo - # A *֚HHpYuҽj ;h;+"E{!j>?MWPH*dQF"2@ôOF?"Tmᾎuh@{D EdeԨ{S< pB &՜#VP!{A[Q:p#¬&87""@̕p6D RQ5yՇfAjIp1FD=%وp`;aPj& 6""k1L;5þFB;Y+ 05þ [hi:TD.ǃ5d)0LLLujj@H)1-.3}{>o9TwD EDzR,QwOAWmס""y H{>PNEgXf˦C""y}{zjռ&RfC!("+ aOsAxK5%HY ELnͰ`46X+"oM :iόW7nR4 APP/6F5Ih5t8;,=g1 XH^Y aa{WL3  4K:w 8忽qWJ=oĦO')i:lH>:eU+3x>x5 /eVb'%\a'oR?K$ov.|mG[ uj%4(=bm~~?kIK.155uol$#r~ 4 VkuoiTYfbE J5cOO_ :$TNLk ',&aT % "e 7oe@{hBYd]qOYkW=)w5:@jMRwXzd2/t>jljW-M :&70Z{Jϒ vҠiMvjըf\W!(9f|څ׶$;oq=KSCGe 6ͦըuF4*Vٙ•F- 0Z`81:v0Z؋t"%1 X3ܴռ8’NJ<Ҽr?`- =βي:%|Z\f Ě- ]NJ޴}^SehHRH/y,{Ƭ>6əv\Y77Y@Ipt|$PY!n{vFg`_G'9~tpیM62 Ks;!x2M+y J%vR N8W߈%S9OPӡ7)x8/z\J-vFZ@#y}cFa L܌QiCM p ;(, ?ҷ<H>k׹0lN]EW-qSCS$$b0La4&ai<Rɩuv+Fga @ՕJx+~9?@H_+{.U3j#U/g0H9Nm]>vQy0{ɓp2e'[p3`^uH]"oS'#Û 7<H~~yz"qLF Nwu}$oqUҗiևaj!}̇Qnɇ(07ΤֶsLF 9]'ёlK\}l8JWDz|͟3qceո}3C]+A3qYl]WghF5Cf-0yx=6.833C8d5CntFSe]q<6XuF V_ '߹aǤ{~ZdCE.}p&0]\U3TVO~s猵E-jcb5΅[67*쯮 )*ڍ)0Zxz&qv״0&8nUԸC6ߙ8>M!j:=U˜\*vu}e/<9!A0}p?5iw@W6X"QM0nS3| e5iw9͟3;5~kpvilpznŽ-m0LcHkӽl_9uׇ~F[Ƌٞ\WMd Y]/=H>5[yk+Rba#u.1NաٺCN?·¾l3nhg|l#n"6n09h5tANfQ}pͶV( ^4j^4wr7dMd: kf0I!} GQP1&IDATvoĈp9ǟT3j<:<8%p;]YZF˜yDx[J}3W~KLn='j= D#f_52Ӂ_>FuU 75o4.3P8I* w3 chӽ E޿;@5NFݟ֦{yhr f0z ;vCUϞc}dΡ;bj-Ҩ{_m kA_IPn&ܗ:7yw Qni@J @BwgffoI_n/"0 WudV0ˇJ˱`׃q>ǁiYh˝Ҩu ^ SLcæg-K05&=L&(kwKa?GӤt'O͟3iol HPݝ>OPDqp_ z'N^ZF ETj8i` o4vy/}ͱu4^MniԭSLYuo+`>u޹=7qq{VL^pM $!iblc0}C'3}L-ْ,ٖdKSׄHICi{V0쮾f #;=OIsZw8M%j=8 zQD(+i6`>HOS7u76" 7, &R~ `fPwXRtY>0Lx|VXޏBg>eh<5Z /^Ps &GzZ{ʰ\v!}!YjT'u6_Hɐ*C(Bsa8Yr z]CZ&LY"j"HB [i wȼ+B+WԤM0| 8 7]5 2l |*bAId&8M<˻&e2+a.Vvڛ!53$tóL*M1$,yNw=ARPrUPyCz1R#*^HxN Կg *lu'5@_b1:u%B(AoxIEDnntmdyn(+€`w.ʰ s䋃D\X)k|"]aYI{ڱRMirfkhQȳv Ui6˓/eGO~Pc6u/`CITa. W@ϰݬ"1=;_Ɔ""ͦ6 ohر=+@ϰTJgB FV6b SfP7=v)AzOi`TBMI{x"61@s1>\PҞ+Qԑ˕bZe-T8#,pp.g6ulhȣ*iJg9<U! xE8@Cv&Vy1 X@s ~P+A &=433HڂlbcR_yAB A)z)j"&GcϕЮJ5=CCu"XUc#,B1l bcR`QI{$.` !v7 rЇt! yX`%ͤ/qQ_Z{+_;{LQ@\A6 x.$z<)(qL_īH pjD,`lasWwgx(~ _@_ ٌ*lz`EgxeqjD!BAGi,`H5X c}xGuׂfy}jA}$j<,=ABڥ0A{Y] "lV;_8{X~ MHiuWq' CuM!` ͠C1kM|-vc}PBÆ8x5Cuӳ5LOdFp_?0 d+Td$sn zF N}eh\{0'[pWMHiiXۤQfEID\%(>a0aB ztIp p.Fs"W`rݾ,}[v}}0"OH5U'u6_q(!]V~Q~s4*}k[$s aą|` ˡNxױMx""l*RBMu=܆s[g eυ#ה58>5BB]!{>A6Xm6FW}5C%wJUh"#YLYJe ˀ~=DP^Dq[$$t l)a 32_0.*_}Їz&@S *lu'9&u1da*0O6P~PA}4˳zP xW7=Y\ ,TOfWhZ+ iuX` J>GJoUyc ne(ϻ[$m%$dd3@e oELf"| eXB{mҎ`؃T$$ʪ0 0pyp ~v̗b$=A*§dCP7ڻX >gkDg=C v,.ք"l2\aj9wD mHMHaKP> ;Jju,OE*/|E(>ڼG)Ymh?e}bKxzp |i1T3L(>KO/S$hgenG `q&X U膆Ho3 #b6! ׃~g7O}.Y{)aI?36ү Wq!+i5;'`<<} ffܹ qoڃT6ϤdS2}ěG'L~ ,T!AI5v1>ރ:C !AI@ ~=mБ+U]-Lx$7M+U-VF<7!1Ta _ _!UY3E;"IENDB`openscad-2019.05/icons/icon-alpha.png0000644000076500000240000024072713402025764017752 0ustar kintelstaff00000000000000PNG  IHDR`DLgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs  IDATx݇Ց?㟏`LB$@A!@"(""(@@L068a TOuu۷{'T= Juzz:?;W$ :ÇoIceЉɰSQgqgɉ#wڵ+=f$V$ X-IZZZZZZZZZ ǟLvPv `G\W$g'#Pjiiiiiii5~*;H X?BF^+ܯVKKKKKKK+{C`ZifgjiiiiiiiES[.`!]{`$wTjiiiiiiuQ>NHl#ټJAAחV_a(^رDr׍?TjiiiiiiO}cSv`':$sV6,EA:_J X X+vv Z------: 48lU a.K~ʿ{o_Zo uY?#* V tdaN:*d:> hןp(` XL7]}ݎ3wPjiiiii[C, o VIȮc)+fZx@_>>zx(`9b v쌕M`kd`Ŭ+7LծVKէd<Z[ jPdF0ZtBVKKKKKWWN+̋2i XlQxMX cW̮Bvɴ* &mjF+3@׫ ^ Xl5WW,Z6 Y*Lkתyپ!N X XȜ|,@fdOVjiiiiiR7U&WVXl+X3;: ]xhiiiii VEjh7WΟ_v,GV[`!s1@척;``5Vf]bVKKKKKUNop(` \lm6 Z!@ i5y :@UXع;5yB6k6L[)۫e)5DQ3UUX^-"d]]jGv긭zmTd[Y--- *=ʢ` `WV[>`Z E,BpS[G^vbVKKK+cW ׷eZ1WVz}j-Xɗ|l'5LߣS---,(Vw'<KU*`ۆLyXdtvYWZ`\ 0 wRk3U*`"' &ogBv \ZZZZ2s8mZkp}gU*`m؅d Xl) vʸ*Win(7\DkYp59V7qV\ UU`9b]::NbU['l][Vv2yjS.@Vb% U*`yX@,#L!bq֥Dpmo4e2]׷k"1^?fʒ# X׬xm&`Cz[b'$N!vc/9[F| K*` ,ⵙFr"`y'vc눅[q5Ď9![ᚵ*{F9OKK_2$ WīVUHWQ(dڄ:b'A瞼Ef*\ӏ $ZZZmZ^W뽔puREU*`}4J@; N`p {~ʑ:*:\ZZZچPp'NVY}ݎ>jClw[=>L>~l=e>j2_0*^'$ Xll?gNI%F;j8Q~2ⸯUWEWc; X;(`]^XV+i` C, b{Ru.VZ>\1sAٟ#ZXtd2*?O XVk좤.A%@`Aµ5JSJ--p>b{]\?V*` $ںpާ MN٢rΉ_~WABkJA{Z*\ +MٟCJȊ,^sPh"|rXwU*`;`Kg쐺 X87k;S=دUZ e{m*b#O)` Xl&Ek뀽mM(bN%"bBk\!UST--&Tl=V6 סVVXVX#Q,"!+!wacϩ6r*\K+Mٟ[ *cIx=pZVUvͼG,2`!X { _ _(\ˇ"VK̻ղBOpVm`1ٵ ,dbM놡=c0eʩ"xv$8j p庛t,`9b V,k;>+Ȁu!;'n]M.ac=QĖ׬h*b:`U:LY)i2\,EVXk+C aa ]XX`(ȓtbO UXF6  WVTWXHkV>pU*` ,,dL XL:Fva'&o$y1``! JVk3f5\)sV6 >wp[ cV:`w"Vw:bQDl;$*bڴx"xul;շ K\db' ACPiY$JpUji@[5;P+l ZJU*`yNV"bE;v\"b앣 `҄va]tֆXks᪈*"x}?Z\ X޲pʚyߏpR)`1UBo̚5 vkZ KSr-*wZe=\f,"VUv/`1XzZV,fmYYl ;钭BBDĆ]yX,d_!ᚄV+E+Oٟӵ""xMh$e׵@ XXV] spR]0i; `1$5ĞEX= ~R\hb3ZZ]=ҎWW]U*`;Ԁ7~+P"b Xi,Ed`hV GGµ9pŔ]Kc j6 ax- 4 XV[,d;+lVZ;`g] #"A7bF GۮpMBkUU`Ϋm@񊀵mkU*`L] vM",E,c,"`ث|$-M`q";$C>o: UU@{^m:e XVWX,G pRv6,"ABx XXAؾ}pm>\TOٟھ$ZҪ,~@'e9`1BfO: ,G ^Gta7XkpUji5X!^; \ga p\ Q*` XۮP,^䢀 Oges&ncP^}Q `+V#8#օR {d 2} -Vxy:PZXՅW۟o X]KXD,tR ^1ӡ[[U&_ZGD1B?"\״WWM6oeI\x((hwZJ Xlgv[,c"^墈XȅkXL ,E%gta #8įPĞ@j`F `V|*`RTw׶īE"VU`1Wz̀_fO"^1X:BX 눝pޖ&XS0 {L.xp.bݯ2H6j}aUmwUV݅U*` K~`oQ1ؕsPB` EYE;\2n+5$l Xv Sl ]XDAGE\Ҕm-,k.x|%jGVU"`1!z̀, PRĆ` `g1"bA.U|+15b"]X: R*\W8^c >Zؑ"*` Kw1x ^)bA,=h:~b".rQ"b1;-L\cء G] |[}j+VT&~We iӮ?b X?`)^W >3 ,ll=Fkj1zЀ""`1XH#c`mյZ {p-4eAK2WuY[Ɓ rk3᪀ Xl;v],,D ^i XD",|;`|"ԣ=1؅= &Xl}U6 X-땬z]m72 X{ xW p@`uz1"=f (bM#KA>[+{r{f3k `.؅"?WQ6X-h /m뵭F!] 3;f0 Xlvӊ]*w,·G\","{-,$lq~2Fr7Ll_5wa?,*\q{Lm-RAU+[I^?iw]fءuA[9 U2`HVXV@,_@(`!x++ l!e)`/gGAB=i {vM ;Xb[ܫ\q|(Ҕm -V֠zXu]PykG5ڮy6B~[(`,"o!૴*e3v0EKAcoT.8ӁeʱvIgÚ"V$j[ ^9`p i1Dnlb쳛O<0?o<57ɓw xݰl CMw 嫴Wڋ\+^v=:`!8B@ XJ 2vvV7xqi+rG[e5`f|,nd)bmDǗkQ6 ؟wF{b+OG]{]C-W|E+Z1k\ )Kk\+.NX,$l^1g_iGTօ=  JS/ {qo~$<ܒ6Hxز8b[w?VSuڅ{T Y!ԍA1uJњ\9Z yt A6LL+q.a(` @[+B{k&9' `YY, oo=-Lؓ7#/Dfaa@*`:ǫ.˾ղq#FGlY- ټ 8dwL[?&'yCS6`7"V\p'XKt BkN"`k (`Y5~d5xREBþb;/]Xk1pUjut׿};׎k6XX`q^X٢c)dn Yy>HpMW#7[;*2 xt.a(`5Z5 ^1Wz"׸&G˯qA,E"`/!E:`cꀍ!6F<*NL”AK+2ގ+ͼZ^lWآ[-@fJD"Z}jCk3*uTr,5xk[uM(`2BgWi!^i(`)Y+=)/r%yQfEVkcXڅ&w+ ᪀*c^?dI^Ɓx^1E'^ؼ!|,,52phMk pܞ3,SEl5pKZxk(`W$]'mKɚOR55E.hXH_sB .,ykpUjuTx}]x혇["6Oqd+M F _v W1 yhqh'`i^)biG,,"Jk_EK;`)`q,,E, xPBϨOc ;AYX*tZQkpÞenj̱\EH׶ʬex4 ز?| %!X YkZy5*cj9 (`5`D,@x[vH AR&]㢗 W ,v̈gVE`XD,?K!b)`6ŸS W?7hie*Xu+'ɧ28"!⫝̸+k>[ Bـg=\!:'\%ွ f_ `7 +"kUs"စ ^)bDltVXzȀ"Pb 9ok\u8)KB>u"bYc1_ ઈjۊ{}O}  :n@qp SHl;Y ]$ȶ|,=XDjEZj+b~oF(`W XiYhHpBhq5Z тPB)YDd(bט.X XD, `#VBµXBإgJٟˌ[I}#5J-c'kQBcپ0n\= p6gH}x4WV#!ֶBw`1t+KWhvκ|k XF\䢗5. XX<) `!U C;:`},p-4eJVf'v,^ԅ ;Cc-cт$Ė1+A/[ yr5OѕY=gCnDB,UB,<ܺsi=X>x[pF6iF wK;}NxP9Y!sX,G,=υF U6:}l}H6g ;PPͧ۬<zqȦlpm@#p5YIp?MB ^1 &m+!6P^5& X,X X8f@b#xH]bB b઀j­ ym}EjVV]}Xǜ{dB604i yνB ͫv5g`)`Y+GBѢ]tv1VK`! X<'=(`Xc'rD +\+ZZсV [r߱[C[6V[1u5Y@lѐ-k>U;8VnЎbp # x@B,•& Xi}]g!b -+#_9`gEˎ@Ƒs"O"`XV,E,{jꀭ>QkpUjL+5pK}ODEqZ>8dBcWP]~Y0K\KN| wג\ڰW=kKG$Ć ĺq|╯ hAK큭C񊡀R^1X,AB(`T#3,G,v\=#j p- X }86% .,kUrݍm&dW^yQt[k } Mo:fm~>#UB> "BbXBvmc3qXW =#Eb(`! sA<+cX, 1!lօU6WQ̄B ˌ[)l5WbWV2``#s}GZQ Fc]]3ʚk7,f}MN8w pd+t]16_#f"! re}UK/pPRZW ,Gߋ_)`X4 Oɞ-+2EғXD,ųu@>hUV>"x%׆62["^?6~Drd5S|xUTz: iֹvECL|{W 2`{UëX#.z}# ຎ!V:# Y1Xi,xb(^1XD,KRB(`!Xqfx/E∀u.,gaֺ ᪈*뾾7}6Zꬲx^V;g]5GB(`/?dcBœX1> kuB5_*`R+xn?"[$b[9̽fH,>~8r`EBl {ע[ W6.R ׆CBJl^*/>JjC,•#Ͼr޽ XX~>6EQRg`x"bc;` `9bXX|EK@ƜMī,"EB,3@BB,v`*\+)8ZZ[Y^m_ ß٣.4 "]k2k uÂz@"Үppphh}}#IB4*X.X~:#*BJx刽a&X8b0mc;`)^)bt2E]+ uXX) pŸ7]gԺ )9ZX#*Շ[)7HMl#Vi:^? ̽jl-oPkx]Eج- u_<_WL`6K@@{prJĆX~:v"^9b9 Ar3 ['^!23⛑+,쀅33a.,2EĚj:`!~?>Uկ XUUXm}U0BLiu@=:wU?윛W|XeAux=Pf,+(+mLЊpxK pmOW 4`pAVӱxy"=xPPRJ;`|vy[P^|ַb+\X+EBS,` A7= .lU WVenan>oօX/kZ/kֹ&v_ ^y60ckCl} ZQa4d3ucgoA{uG7# \i\+Wn̈́+YӱG\: YEZ_ ̽rBX~R"bXD,=%xPX,W1 ő,ta?xy9@B_2]XcPWH-7KU ઀ʭL56A nElx-?N/H"w_vX+xxͱo:.+&wίCծfIpB~x!V¾`H8`m]XW b%W W̝˪px o Erp+vc ^)bX+F:dxŜPb_ 3/cX8\Їl!@Bpvpmv86I]Xkv*`r)p!Wgkg)`k^a^} ?{jyd8WD uDnY*pOzT4>Eľjပk&•FBl.•FJc9bW̪BJWgQb(^*X S<+!'oəpFBk"bX!ꀅcx.u`)E},RGb刍_Wo>ߧOJ_`o9!6xcWX\wCԁ!*v8` ,U:mL8`XDtJk!+񊡀׸ R5]#]X,taUhAx2E!oP6H< ͻJRtD,ͧMbݓz_RHz1h+!;b9``[I ^\b$ĺpAnYSW RW+GlxBZ וG `v9dHI PB(`1<)' X"Zk ]^@,|[hVX7H1:+qW7h9ZZ>ƒf4zIx?F?'E_ҷ/K>B4YԅM36X@+-YoU{.UQrpQb8`p+E,uL8`Z,#xŸ{2q28 ^q,"7@+v^10=XXvS \7{@VU}}u_[yӡ-2ɐr׶|n7(6bXr,kfHx4yVB/`:Y+ͽrںM^׷W`XD(^9bX"bW B(^)b)`t,"t3kE"`XD,=f`,BD: x{j.,ۀ]XkpUjJoハjՍƫ}}%qط*g|GX׼+!QjHνrH,ūX.+ ,=+!0uۛP"^9b|,G씱[p.X}W&#5RB(^k\ P8 ,l+_K o9۳YpmXTe>9u k'ַ$+-6|+v_j, w &`o<ph JnIuua_Њc[`}o=DN\o9XX%VzEAb PR"^9bWXA%.X,"EB,쇥E,uaU]Y!4x_1`?/^?–ou@,"`qMVF[?x, wׇFw彗FxmA(^%J倕hoR"2p#6-atؤW}upIb(^9b|,G,倝6{1B(^)bWXXX~  XzX8fK8M .[Tu,m#/3*β=޲mOOvxmt=VɌWO^z,l&W b)\4>Mx-m5إQJWXi5NDB,+E,#xXo͹XWX+,PYMA5f+,?dpQ_ 9aH,lxw=W rpW"tX,|;]دW.pm X-g|Wg9P eI: jk®W<kz{ k[h8^"W?JXDܫ- b}opqn{zl=, ,JC N +E,"KWhŎCF xPk\N+>₝XD,,:]XP6W'g|avA$lV5,M+*5T؜@G+G[VֵY_VB,5vqWĆh}FoǺ6\ilx5īXe,+,Or \ G 8`# X~_ CcfXX6 `1µ1zʶVUdY>I4f= [Y:k>gb֧*V"_ޢpM-i;9^1p"JC:{&p}BJxER1 (`)b]b(`!n%k\~ 1sT!|pMWV>zM;FBl+6֢lÊ} x6uq8b|mtkg <4ج-p+ 'i-(\XZ WX W t,BX+G,p+ W+\zd5.X@){9Y," B$b(|5;\!;|ͤBetuV}V|'`}2ZmyU$^h ҏiހ}Dl|k+-GV V[X~25 `oX {EXWb4b4`al#VRRr^bjb)^)bW pBvߌ1WK\v 2(`82,uX`a,"{I[ JSZk:M}>څmi\ D myt6&+{W"uizM X[X .9&-`iǕX>6}ks`yUBl.@uYe`W %xb(^1.,E,=dxq,"pB ^;+\UVluVX5݅m&`θ64'^x{^} lb x?yMXqA36\]GoKF,ǫX4WX Y•FrB\W< ׷8`!WX~1E>΂PX,\B"b1RqB1kz*`La?J,?*>lވu4O6!5& '^=Yzm> |X XG[µ-iub%x:Zi|k{ `csf_RAl4\_1DB,+E,#xޖ&3:4t RB%`k[ K\5Z6Bl/X>Zdv̈jV }gI~*puVֻ`t+OSOfAi2U~l:+Rm޳׬-ׇ`wm-~~2X V_yE뼼k}E<e@g_%J8^%X) PR"^9b>~Fn,=bA\"^kJ 5.k `1R:u Q.5\i6VI-_X j I٢;z,`ux~|lxW3)Nv*`%ȵpm[iƽ"- X[W-DVع.,+**r. WX+E,"E"`K\ ~`"W o NL ./D+l+}ˑ«ki:i5ÌXKJX+lpؤ[\6RJ]6c lW  qB(^)bW 녧Ä@(`Iʏ@#Xz= JeAb:BK+M;^XYw~פGZYZt5WzjVze}JX>زnh2`k[ē?#h42ؤ[>xz% EP. W +倅_.瀅PR"^)bW tQ  XB_V:`,o3A y`kzҔ)&y!L_ 1^+nWcF6 ru.i p tu&VWWyEP^w& WX+,C ׷ JC񊑮pQB%. Xz w"`a,"w"`I= lpUva+?^v_%˹TB`ӌ|:>&+g=FMyM|֠b}XY*z-pnwv`]\bYn\g&>M{>vͼGB{W x:VB,+E,+,*~ٝ*ȩ6Dp+\ix=16`,nR|t"\}\]X؁ֶJ+ ~Y>ئ=81VN3ywM}Vkj,kgbmbs,϶VSi:YnΫ/`qOȯ_SVB`ŠW ხݰ) \z^?I>JkTSu_? w_.lkzkހ?؊i@;b)\%^1p:BJKJ xPb8`)b8xWp X^B]゜08X`/ ]ٲO aC`锦BiJN?` 9N^xv_G ls $χ94,Dz%]4XX V_R>$}xf^m^%ĺ.oaV̪giV.[vΕD •J~DŽoqB(^)b)`WX,"JKwR"bmd9C9C>K XB )WZ|ҍt_q|r6`};PՅ}YGU5ok4r `#{}kXiNXc-l[,ElҹX_r>s&.rĦ}yhsi4.x{j +k+,#xM`OBW(^!A\l @,X@ _ tpUvA'M5W>gdtaXlaxu|o>NC{չ5kk^; if5XX_r>wO5V 6Ħ}Ż$X:rR"^mo@*vحL8kWX|E{_yw`.`.,">BB 0 `0 pUvA.JIJ WZIfkejj 1$65m"5@{^SX vF.m=q@,VB,\BHuuacH$k;X`C,{mt}K, PR\1"`(^%J ΋BJ7PrG\t w"bX XD,u9%L'e)`?&X>1xp+dQ ,3>'w.i@:#k 3#;āR/|Bqg\[Rw_]G kZ6`cwX,|X te˶6K<`9bmbmM>a0."ZeH|z%U%!VgIc)b@(^%ڶG\㷊"ֶxP,NZ%]$] Ped%.+^,qApg-¿ g WҔ, >~Fp(:yǿ{ 6K6i3c{\3nH5`c z"5`fXbxgYM:+֧ MP&!uplmtX~XiGk| ^퀕7pR"^9`;zi-pvk!QpN"^9`!ؓj (`+G7^EWlfWl؁/`Sva/1|<ӌk+|/l%IX۞W_&~G^ X ]g6 nXX߇[!^U:˻Iuu6H\i8^mNX+E,#xPb(^)` XX. Xz ,:;#PUkz1;m'eYQZk7 ض ~[gl- ][ .mJ9koumN: taˉW#YĦ9^c V3YXw/`V- M\7 x!u:֧oQBl+ xEr ^: Ȥ gd ЊW8`K\5 ߁8F0uV\Z|,lw.ta}n%4 T}`xIsa dv_{^3MqͲm ̓JO.lIֆX ?AdSZ16rҎ Vb}bW Kr&m q\W +R(^)b\`9bXD(RFN z8]`!X"`a@Wl| BgdlBo_?Ek$<h}dA~сI"b@AW 8\ye5#=w XXשX YV 6X xvSӱ`- XW KpEJЂM`pBX&'),^◸׸dB8`a-9PN p= eK+ǂO}NF.rJX{f#Ff\0k+ֵ& k=V?_f?G8qAX ?UJ/`!V :6N"`m,n7JW +E xEr7Kb'׾#W)H>%0tԣjBJy/ne8 (\ivV(c^̿`IM"둗ψum &Vr辦\el캖I[p3۩XO+XH̃it\ Ť,EwcyMuA-Xl,Jlcm;`moEoi"ARR"^)bW WLZB/ Xs ^aqQB عWmSQ&UA@`߷'G^M笫ퟝi@]׵,cVd54>HAZ 4FRTl<`mp}z^&Ie5 >l{_]gc]Wؤ[ 4G, nԩ[,+o! ^1tzĠx!`x;G ]Xw \\!}g^ʡFMYi*yV!הjMV i6 t#`mpG[Igb,G+MB<Wf+#jC,t %B(^9b x{CQ +B xIqF/q!,6P0FWv2\ܲg.li5P0>1,}Bp1Pz6uɺiZlygb\,OXb16nq W 1&Յ%Ӫq6:J p: W +;pQL|KpN{L:o ߯}=m֕yl[Q᪀퀂Oj B,l䔬͠tc l](MҿC.k 7)KDluk0,sifӀk+MXټ+^zTNS4i}x]4>Abi8`:*!v#q,Ķ}@ xm+{:b)\)`)^)`t++X . X~X{n !v*`;ТW" oBl٬&#--iiD[) RP`t_lcy ??;麖9Vb|OTlV)YK.Rn^U/`7KjC,e^%ĺ6 `ӱ>Wk}UB}]JXbrB(^1W,+_~x=~RX=eLo1Fa|ր$Wi@*9P mHs"ZNR6p}&|\Ю"qõk;b>. n5 ΫX>2X+F `[p+mx{BD|KX`hMaV_"}F6 XD,2lFUc* W9}glie,G bw n*HfE <&m{N+܏2ebsl`?x.!66 ?Bl,UJRvjl$f^%Bl,lӱF#!ֶB" xprVXX*^06p Xڅvk^]pM+U ?;0@b|yZ|ה[Rm\S6v&6{UBjV~Ȭ`%`T'b qu]}KJX߇[4.J'c%>`,+E,+  xERkYX*E,c X=!kV@SX| 0zXkEHlnH\k@Wp~#v̈oK+=BbWM_=bWށ\uq9/ ^1XӾ,̥Khغ* 8\1e[L+C/Y&6F2;W.{麰1~I=눁O4S[D,x- l K2ɢlҦfzt&V4X Hxuu`9\]]63恴Kw^iZWW X=c,}E~[l&V_!η `}Wf:Zi5Yo6؍w \,xpu!p+,WXi•U ZMC ʑEwrJݱpXuqWl!^qw-|lu=3!e{L+efX b+=jl$lZ>8diV-Ie /6WC, l#lo1R5ͺ,,F,lB#ʓw1"ʓX>2HyUb9^9`]p)vi8^)bW +,º(^)` -<%{j,M+\?e5 Wl|" /p9˺ei;bY·͵Isw@36 dYWep Oju `m,hD,= iU)Y `,r}Ult06ںW #OD,+"xER* ^1x Ucꀅ``Lv;\mZe ]:be#4 U[<ν5a Ö4+[EV6-b_6'b}!K#wa$&62,pnpuw^9b[[ZK*!+`N xHW+qٯ^:k&X~uKe*\9ze{L+Eg ",GnX)^R `IgV![Rz;%`9bdVsm`31[XwVzj*>;9Jsw;x};^ŤūeMVCxY2[c-׃=yƽHxX+On\,& Ib)`4Yb9^)`mes +nxMԅMX+AӚCuv"'`%+!vݢj8^]u/q}ˆXXղ>˺}U4>`:GH,DZc7# W ,uƱ_K,D,EC.k4wϴM'5;`%FZ:u[/K3.xtT3jxV3 mպa `s^ݘT}5MEt_; >'b,?+5 b^Y&$R$6\lX`6D^B+Gs}V? ǫaxp1Hx4H .,wM *\1eL˳>) iva߭+m+1ʝܠԆVaxϸe `@Ax, m =z\,"p&!V(Z9`i$~a$fc\Mzy=ޒn]ktO\EJxbFp}uWpQRb# hQk\`,.QFS˴< _x\$pFK!FJ X b%JzEVtSjrۿ>yHȪ M&Zez}y9`kZi@`1>MBt&VkVs(\} hnHke<X恤W>B î% K: KHW,3K 9㘯3~ - W 0ۍpUF\,}ش]X.>ԝSf$j%i0q5Ն>ӚFk{%=jU吵v@k#s` `\oU,dL.rlp<>5xp$t_C9TB_ՂH+(^%B C'dx !B ?kp=ejvg`pXzĀu`Jsiź =->h+^-~H+,~85YPXK X {S`^ kbmW IEK pi}>˵}]EK R7PO؉v!Q` FK,]xv@M.j'dc#(>٤_i6 JlmL{;xy9FdORVQ{^ }^H'b `7]Mb9\v*bo]Tι ֬bpulv^1IlV1I4Xi}+,=@K xPR^1W c,_d9`g]clQp:.P4\mT 1l9`JM˧;'Hߺ l-ҮȢJZ%>ԪOڔUYH!Y}Wc; XY3ckU, lPp*#J|*m ? I2u_Xbֶq5/siaY5y$>ڢf^)bi(\mM<qmH0x=y cWXix=dϙPG5,(^)`EbW%)YXKUf+ `k4Z`-_vVmom3.X$ V^}csMe/J[|2u_}N, `ӬL,Ek#EJlIp =p@<@wm+ف> 񊑶pR"^)`WL`ۅxmx <'{e2` +`ۢl!ͨIDAT:3Fхg2qF8mfBzՒT2lHa `y2sMV nh`}jk _ zrE/`X[vӍ?%-`[иhֵy@:<`JueW~21B(^1XW,{QBo8ka#rF AN ::`mQo SٻRw0q> ooZ6 4 3s)Vd&-i.jk3Xko8@̯_LQ,?+.mq4i o8\}hIB,XQ[::w^i, XX}AbPK,zйxx#tnwI]7~ yzmQˑs94M&+&A5+*, ٴ,? H ؔRmHkd ؤZXbօX7E``mpqvpJc,Elң-Xk`m\Wkktv`%Y YWX:J񊉍0J o  l=}7~dc c;:~=(j >Qr'|˳"`Rl.lVJ3K>ci*q+^Zyg@[ Yyn(\ll=p ؇i`,t IMu2mM8^%lpYE+;F;_KJ˷pJEXa,2*\!X^ ?.v \/ؽgliy|3F+|vI]X/:>gi%&w7m!Vۿ>w [|>[ [u/q=jcWm@k,`ՖFq.d,' iP6i@^)b6@Fxy•&y% C:4W^q XWgo ,;sn^m 8` 6K^b]F uU Pͼ*ik I[Rnp>JW:rkklh}IXGmօؼO4 X\;EyWW`gxYW`4WX+U%w_!p@ZEuu`)`X+AXXsX8fp+ W^} weLˣ^ >'_I};u[ݰKbv`XmCyUXB|7 xo~L<ʺ"+,یk{^iֆWl:J'bi콫{}MhK<`,"Jcl~XюӱW +"VzE+Y`qϿ"b鿃 cbx!`Xx@_7UFk*b} hEGw]˗~ &r#5,`0f2`iRJixM; GZ~'L+ֆVl҉X< P%-`V4]uu7LA8`C\2ɗBd}6b)\%JIW/k+E,}EJK~vW QHW+dVY``+5@*`۬rkM+M;b%~W7ՅTNʬR5Ö aO\|WdI<K#rEy倥y]; m"5+`]޿v71ΥHxuh:hI,G:pu2^/w<޲rV^ǫXMg xpB d9`9jc $^x7M$BSB``cێpUWltyR"Vl҃7%`1y<z#6z̡@~ǂUX} xVee|-yPLj=ۚjA^yl1@jˋZ`X ib)Z}+u\}lF>*vZ6\ilM:KB,R:}v"`4+Ä}?gB*Ђ+_j:W,]!f,F gPY}ݎnez&Bvg|R+9XF7ڊXM,m⼩cXkZXiˀ׆Ofjq؏_' yrֆW`R]B ~"#5 ."XyXZ`9]mK+ pp:P"\m/ݯ6RRJ(^)`|}{%*:+d¨9 xE0u{Wk!Ac._RAlAYTH%캺vz]a>r1w4XLl&=$k iƽLyX"ye<>嘥hֆXSpMB"ǣ-`;'aq6i!#V:˯ozLhjxPb,ūXC#`lv4,|?"^)` ?9z6v \mV~7`X闦݈XUC;#Y  wS]HM${lw熁T[[ uBՆWuW5Xm M<ij9?SlZֆ׼KR~#Hxm&`]EJgb9\3 V`]EJ42XH;_9b?ImpͿe1]F`\(Gm@d}XW +E,ū/`.,"Xڡ/_Ile&qKu*^۬(o`!PDl yΓ#ybInB6\y,[ݫR\Za5S+=kZo(`<$A덻D"p.&-`t?زGB,@Նؤ\3\9`}VgIxM8^s"`9^1 -W_xPB(^;eLi?93quW{*W]i:weM8`߯!6 ވZ[O͏n=1=T]!51ؤ:>g`}7 H1SE{Bx^N8刕.lI).VB쭋Y $R;lrh\M:ӦY#[im}WXXi|;G`y_u_ivq_3E"z ;S7]9Gl'UۆE`!pyt V6&nգj[6 4iE1;`yXsyM zZֳF:.56.V,M`\ 9\ gE9\]umE:ty+,+,#6+Ͽ^1>ErB ^ v"`aک`;zL(cZ)8`QClLf~ܱJњ7\9Z;>Gn>>Tv&l9?T'! ?R$)✫$XC-c-CrZ&`Wnk&ޞ<{Y}6 ku+MkExx _d,jΞW:ހŔXb)XXz.5-` ^]IIPwm.3+mHYWOXi} x8$ `91ځoX iX|?.]⢀||w2\mXz w(`k]A,?=6 g%\Zs\55j R=WayqK-OR7 *^X)ܷ=ؗrӰX<Kʓ73Ac,Gldޕʲ!wE+|$hK,XitF+•Vz_W"Cx~cxuJ xE6='~,, ۝ Wȼzƕ1A^>'`,$ WppmIh-WSymTϙnjMN֡~麬~vwkl+  i+Y j={V+BJaڰ56x"VJ"bZi ב p[[qEK6"\E8^)bG[>IbYe>ZE;W W , X xCֆWb׶R,`IXؽXV_]%B I[a66Qj]z; >i0.,i|$X>  NSr1_ ûN XD,*KZN=BʶVk~ AZqVp Wozr6؄=i7 ,OGZ `x`kl^mxd XiX)yjKR/!6J=qk闑8|uHEڶp{څ{TN8wHy@k,~.+,v)^%"b+Ӈu`gOvn1l EUk#pUqYxD:`%~ѕ~|L׏9^&+ p=g Ⱦ$CiVdQЦ+?Qpk΀u=32C-YXzVJk:+v7~$Ytzih Gk-`fNR~,ҤA,,E,ԍM,uttU,"o ߟIWHfFX\m̹6 )aZ  {*]cS'cMZZ W 1ľܮ|l?R}tDCOzҙ֬zVYu=ݓZ(}yfx}@{J9n,Ʉ46J^%#H`}`8$&m)Њ =K #.ݫRd b!^|dF _GHs~:`3].6͸@U'pUZ!xmv[+ <|͕ ^tX_nÀ'`ixdem5Oj(ǶiieX^)`%U)ibV5EK شklPb8Z)\)`1@X,=tz[ ^GM_"^#`K\WkO?W XԫY{7IW-u"wo5ņgW`ck9)G\غIErJpEld%RR"^W +3/3U p]ӿHj ,Ǐ2x`:JkL5xh޻tXj^lW^g]y L^\Ãt=` d)X~HiXKblx d06&5,E`![^'pp}mmXWȎ_~e*>Xfc;`)^9`(`cv rWk컏 7x}׿׺UknW+b~{VّXizw^cã efy5*riJd,yՌCgsj-23#6 Cr )5Y XXK㈽uQ46il @1sxvL|fM`I[(^}\*V񊀥W18`.,/qv+{Ɣm/ʼ]z(;GR$ ׻-m4Eյt 4i{ ] "К\y5FiyrͲW'Lb,OX[Wt`cO1YXL'b)Xy*h`lx;o^mJq@ZU4\)`1Im/ǺQZ1ϴw`'^+,ӀW;V+]CmU, !`9*Q2e]Vüiq5EzŤ^e )K:^]Z1C%Z{yyz^LiXĪFfގd,' V$"Zyl=ؒs͂Xnlk@6>VxW4r& +WXǖ"ꂫkΕUFW}XH ۊpc/\!  WD6յ }u=J XUMVH@u=ӳYB5 VX< OFI XĉW`J `'2s ,}-lbzجc0Z+`pG\Jj;6)ob,} bkp4T*,]>{\#)K_ūF+(BZ[q"`%ȶ`)bӰ5JB*V fњK hI,E rYp\2wd˞E ЊlT}!^q=;XX+\X(\ӎ 4li%pǏ"ݯfe+E+d&Ih 4>{\-5Xހ%ū+ `{o$y6 yg ֆuHp zzr,\BJVB,,UJ1 ,R2kb W9VP%g XD {"m*^[25lm(`1NJ cJ3yĞQi`WGd@Zd,"B^0S`֤}l5`1Ig`is/g,'2Ⱥ P%hlxM"XH8b-`[66ҍm F xEҟ|WKvU1=3-K5 W`mUt5+\]hEҤYqM+ `&xM"ˍW`1y.v,zU`$• 2c$ ,yz\?Ar;\?0k#(@#p}US&\![+=UXI&%_֓`͌ X#-n- XD,,ll]VeNMLR"hR6 Dk`a'(G« $ VF!ۊccE `"| jp}*XմHlH WR*\mJpm(l+rĺXw^ `i^4 zP뗏0`h IE>~ǞR4`o~X$Jhs,"(Ҵ Wȁ[̝x]Jm5RZ`O;'~ SO([ T k#(+ʁ+E+ py4XBi=ilJF`y,i6vXA֋Z6eV4<|5 x) ~Bv$B-]blYXuiD?L:p׵\dfJ5'{pM{p]7I+Fl),}x7xHl#uUX<,Dk^4in!Xy4`OV`Wb[n!`!W W W-S͆?ZuνWL# .quc6-`1})/,&@Ÿ(`{]t ,'U^Valx XVej <&2`7use>m,"Vl+5,FnV5WC\#W_f+}äl ż~XjٽZ潭yz;Oܹ5M^l\<,+ 6Į"E >mppMk;ֆV+2k[+k+?vkW-g1Frv;\1 W: X+Y״xxK X[^}@F[ `l~Xl.,Q4 } hIk;UlCŏ# 1 0}cuY\I~j9VިV¶2ieb6"6W `y6"#օW X)zk *X R+@ &!`T,GkV.v0YW`)XyJ)p۶gΔ*bӌ|, D,mJp\-Ptu!=M^p倭waGpiG:\i{\=Kb,_V /I.J) I-ػlxvͮpXbof` X V)=!jL4^; ,EA 8`!s" Xk vx<Փ7ikekxV@, H}uS`#^ _XצI"B,<¹?)yWd, .v"\%"d+Źj,6npjZ}@`Gp=N>mK\yp-ʆ}j:np]ya&W{\@N+zϹip% b+qxm˃ ߉X=&U6:ȟRyfVkւCMW" X4x`\<>xM XlVW_,3`m5&! إHpEl`cdܫha7.Nīziwbvlc w/^+| #^#]µMlhWRyf!!` W;\]פ]Y{d Z8o<ߧ&IVcX_=`_dӭjmƒ-,,?qVӡ iJp'da>%B7ͯ~"^wkTl`[۷ӛ Y\E piWҤ<Ÿh,\O EQ[`EF̀BH޻zW1UYAD,D/b%)OW"b)Z}W_s5+\]vEB$^-9,cXk WٸlF1 U\!K& \9Zy!H# 뺢`lub1GZvǛyνz6q׫yCh U).J6{alxvm4eՅW\iU y 챂,.,yɀUh f5} l W\!_vpLfJYٿt 4x}Dz 7< SQ xuW^Xd Im`iX V`X24.&!VW\ɓTk֮\9`; i Y2`DKYelP6;?Y]*^N9,5WL^˂R-i=bR^~F.lb)XYX"],6 Wlɴ $(\9^)i' ȶ|,x^!׍+ꀅUx AY` xp WWv6j/`]hZfVKCXx8q.pAlX V \\,G R8^+O;rN=qT%/Ķ|,, 7,9XYW?ˆO?^k`]x {Y8#2nr5º;8 ]ٴjU6 taoV+fUt \%Ҵ*\!n `)G6#!BQ#Wbm+^O ?`THрu"x^a X^5R`d(Xy| hŤ+$+\!WV? M. +`[dّW y5j'\mhK{W^t@JƓ"x!M'H@MXXXW+ `mlJ#9D='a] $T< `>p.Նf2wQir68VWnP`VS+MW-Z+UȆ$W ՜K df5-`MX?84IHsX5q]JtQ >t[\'a,@DkXȜۈxaU e•jld;y>Xsm7,,$-\iaV\mh-e 'V y ,l툵mH«膁ޙb,/ٯˇk{#jiQRJ$v긭J\OWkyGVʆ{&||bCl7dž]T`l8Jt \i+ 2{ɝr(Rm_?#ӳ bi,wO ElÀ˄=8d)`%ȺX^4.En'&-`i8Xy۪p]_$rW 6 2Vd]>nlU6[)O'جh)I ,>x k<;_RcօWXn 4~|0H:<=ҺCV,/`7,_DR`)b<, >hy֑dl;xaJjlnlAXo{+`ˬJIlZt \%n?P?ٗq>p %X{ʤp޽5DŽ1╆"DŽxq<'–Bp-b?.ixvĺV`U>WF:`mI2PAҦU)VlVYXĪEκbX\u!ꋾ[xw:nQbEAcnvliU6[9آJөplqx+f4W qpွ. w׭"6ĦLYM:XL@WX Aڲt4XeV~c Yp(d;q>v(`[Fb+v Wp*\ms0WY >}K4d<w_xpPf=B}5%`m)Cn;VY``-U[RV p6iL `\WLUY=zL\)icX+?ޤJ>y! i ӉplX>~PW؍ cC5G!v|Z8`)b"!Zyld=B`[j#r `y+p ,R XCs;;+~l$U[,bUJv \!9*\1XBV,,ο>?G[B ViJ*pMB+$ kFU=L;o"B6cXٍC(`%n XM.d'+ZyCbi5J. HuӯRY3n5YK7`o5yveѤl3j[Jp5;]q,ȶ|Uu<g6+`^eՓآrA+%CB"d/ƆX w—JW ؍C(`%ף_w&UZX"KJ!!X< +Ņ$'b9X,{ ׹sWZ5pBگ `lR l z[rpŌ* G,BvMGGb,f+z@Z`1|U3+MW`)dɡ`xV/`4< XxU[*" `޷f`aƾlu] v˫ ״Vk'L']w`WۗK!{a&w刽#c G,c\!H㊏,͋zZC{(`\e" b9w+s6Y` z(b9do]6#v HE:BZ(`5XY`yݭuVl^Ab=6 X`pzl 4E@ ,)`KQN:`ˆ+MՅV ׫+! p{ۊ {|Zl=-Xkq!=D4 XW>}1F/}B6orȖu;:k初{6W:s pu6 2nU,V麪Fa;%U`UpY3o@k cCɒh$Ȯ[>4 G,C(`9do >`8b)do[]vă-Y4؟;K[ E֕CjV/`XYwv Οm$yO^9: Wp8&66ҍĵ[{VPM/ܯmjv e)p "CGBC(`%Ȯ[>$+ :zedo_X|`5ؗAk X^KZ>ǑM+vqFBk+?)V_&!bU LJxm:\צW+ūbu , l[`J)p\ {Ӣh$Į~ !pĮ"!J#!6״}c`>{\v"XR,Mv‰X^%#\gLkK{K[dhlO`Y-.ҤBl#r@XD,k」BVB+=њIxU;OYV6:VJ-j>8>mrv WW31@e'sub+^1bW-` p)-#!6ሥyy57OfY$]Ғrg`#ɡV!|RiWڮjIXWuWokB*^qwt\YW  Vp5`;Fl2g.u !r^Y+cX ٛnlB+Av!!^i8b_"ֶ++`XjKZ:⺤9[dj+[s&Ī{Eߍxm%RJDϺ X}R6`;A+•#J]1D,,`uaxwz Cb p]|h5XYO=6 `1 ` EIX)XL 4?} ųm2VdYo`u m1؎yxq WnR4\Ed&!h1-Ɔؕ#^]]$d,ƆX+&W@J)Ow:V,fC6-`'aq#cօ5-`mxM פX6z \x+MVĶXAQfQ!l'7v :\]># ~a%3c승b~W b8b)dW]tpbpW-@+3` d%5UswtR]i lppٍXWz`٦*Vv+dbu!&jlڹ2d]FB,1ٕ JCޒRN4#| V&pݼfօo_zu]ٸ|g/3mYX)yv(\hIpᵝ![X ls`;4o#Av# ^i$ĮX߄wg9b<+H]k;@VH[ ^(`Eғ<.&ֆX<pMG:rK#4nX Yt_:*mHhm7^|b`17<q 6޸( 7AveɔF,OVj2\]x۪ͣ-k%U<+M'吝116b8d b$.y E,by^4X "k =8P`n (`9bzX(X7b1+. iWTwlf,\9^}ԽVaʄld,οPeïSnpjNw`ee `1׹b!v^ ,@qb郫4x cmE 6 Y_Jh8f)XyX +iw&u]IfAc:ZB N mw p\>j&X YD쬫AJ.@.CK!낭ؤXcm f6r/fY3w6 m6`'_ZV_N 3S$p l'4/kluJ`Õ#JsEvy5!h^ `mna(b)d?U {&,MZõiE\ҺSZ9`1˪XW ,!tp} ^1 Zu> Ga~ fWt\!B:/' "24ል@z9o16#^m5 4`>ˀX iv X`m 9WncPeحi҄v5ⵝSΫ2!McImIy`a+& Z4_wⅽ f6NL16&!v {  "`J@yƆF5` d Xd YVY D,3eb3xvQ XM/y!H돃> md}X(F_'õlJ4^9T+Av+'hA~m,4b8ԄBv쨽d X[7 #Ց2![$`Nf`c(VP/\1-+vC#,;luZ: Fg-p}.Kj0 xœX2B] ޽rYY*m-Vـ!XnOȺ;EkZI|L^5,Xz<vaօGD p `!+/ OyPq!!ێc:>BU6:-EE&/R*\=Xe_^&. ?zo` Y|Vh57br,OҖ)vKqՆX^k;p$83vٜ~18+f灖 zN+[:>U6:-tYpAk#p@7\znY^hcN? "0f_`ǜIހm+Z,V, ?rKs \삩xE^?:^ `ΩAҔC>Nj*|vc>pLh+zi!{q=իorU ˂ q"u `mXU=Vb  XSfj O5sbjx]\+,pp޼xP"d 6B`.Bu xxʫOҫlub:4W1g^z^ ;L80/eţxu3w<XBikk҈n!V%>ByuM+)ؼX@*= I 5·ZSF pxE.}d5+oBjk ^o~ɺx- xٍ- li(`N+J3]*矾[e*mޑWıUt?'`/9/$?W_ుf]jbCvE vNY=wGgڡ g`1.jJga!. x倝W+,•vɬ#xv~"\1k 񊀽mɐB,O^XĖ n+HN=1Nk pL]ԫL WK/5 W ,G`K' dC@6 `i$ 񊀍"x\1sZQ&k +eCM%╦Qȶs7]na>5lub6>c:t3\{ՄM\$^#Ϋ OZ֬ZOрI K!+vr .u5O^r"AֲNNv_q֕AWk 7- +g߸XīB=n Z^,pt3\m2Nk`/,xW~W+ 0Jlqb`o^7 u=ZuӍ+Ve?}WLmwȶXlxE:U6:5 Wn+5r.5 ^]=] ^1`y`kހp]kBY+Z,ϾJiVVtW`  N=Ԅz`͎FuW+Z}58,ct+êArתܳ\q++ÕGYīP N t*\!sI mEB.W+{W&] `d H`ǜ+ؑ5JM꺎W/5rb'`S6W dӞUJh X+)xE\1ץp`"\)`)^!tEu+d^.wrMp=ܛq!V!ۺ`u}V Ut2\iB\^_"`/5 WسNACঀH2#;\]Xs؋F p ^b,+d(^6 ^/Auc\)^_{Ƀ7g"5 bvK`NNӍpuq& xMy02P{I?~NY]J<^GXL+Ss 3r_ ȊZ#"x.j+ujjupX+eL(^wus\ -W]97/Vwcש1N+MU앰5H`{'vٻ pH1UO>X)T]xp`F@F-$V WiDVdJbN:^k]=^ox]=J`+f \lrj8\zBe+ `1 օln,v_ Vt^wAa W;v yusv7qv)?0MBCΪ ^g`nv+ l)XF[u=,%p`FgWJu^WxE6 \13ZKכp]|QXl{k W4 >h- fuհ5.$ =ī gkq],ՅX׍w,B6`d[> ^j< wm_Xf^:\)^!W +Ex]kCCnX^ږ\ ltcˆlc>U6:9gp V+ ?H^]=xoX,X >m&:BJmGξbX^eڄq^|ַbov#C"`Wέf~k+jȖW(\a5ȶs76+dq-Ye# p̻஁ .e1xu3w5xr 7AR X),b}k,6Of;BFha뚖`1M츑H`uzW+ ^!W +V%CMz,x #xi!\Iط.MDB!6t\%: 肽 ^]yV.v&ik[}7`}Cv,aZ0)q I+.pPM 0u"\!;CܷX.Z_j*bZټūluz6د+p8OŰ5 W \k^Y]|g+Xv̀%E&KfBxE8_55q:^WxupƣLddF M Ɉm}m*yn+Mu|K^{I .gXk`O8fcb\˃rR?!;\ZӜ`Yg~3 G ^W \ `7-X_E=b6.^k+Z].@i=r0i{ ٶnh*xn+dUt<\1.;f'`GI`<!^mb?znXWr1 dlG|O)ز{9ߊU采x\1Usx\1W Z^7jkڜ# k]vr6 t2\]{.?r$BIhS`m5W.v`1 ñ*XW̌+,c W;@׵yv=0$ W rG޳H6`m\[<Oǚ;dY}FU6!W NΫګry{&3l=V+]wU$`;\ l` VmXe3+7Aqx bZ +t]W޷LhPYp0"m6q )jV+S Y~Q^2xM,c)'coo`]G- w2ڪ ة2^ EӾU6%E5TB.; 1TsX+c92Xds;B0ӞP~4zE{j =lQBk\W_7v z;kdz2#GU]kxMtu-Lvl_JvKmXe-pDb./w`/Esa5 CW` XWpUr~EXL+(bX~]bU R}]1Iր0W :^plͻ޻ k#nP3l"!ڰ]7u \)`ˀe0Z\md>I g,Ejx"6qkP"{Vlag`-A J[,Ū)X)YpDk 4ׅ6;Dj ^7_vkUȺ! ~ l;Uٸt \1_{hRjF^9.m9{i?0ဥbl6d[װlʑ̀%![&`!-I5Xx]X+] ^7LC  8WLimvv_۴ʆ]4▁cW"`?oOW`G '}`rOS`T/gXv%Gӯ+Zݡ'_$-0#Oޢ2jP<ւyZ뭋ZA+^)\MU4ؤm;6aMpb\`Ԟ.Ej'~X+Fy6ik [>4XL^֢Xb[JxE6 [ yE¸+t]k׍02 Zp}pͱ٫4`[ Y?6a-&Rv\]}^ سGj)'أءvcU`]Y}ݎaҞ64A6`--?+% `+ uC w-nf]a\`֪A!^K:`|b[zYy nS{ WWȒ)t\%p/W`ρ܀= ^]=;8[+ASh3kKW;`XLemM4]j͋w^o[<<Ժa W[\1X+MClf,t__ vaM&ۮp5W{8k. .18B0rf% R]m"`9aWXؓak`>z`6+-`9d6pUW ؂+@6 `e-U)؛kpF.0.pI;6 ^ ~ xêluSM5pr { qS`1`,#6 (b9`9d֖3+KBz9Y p \~uu]sT ئ  [b:>QU6-34݉յ.p<IF^&FQAb""CwЊt]@EAQQPco]lb46 D$&y\gYkjW]1c&Zs`RO '`gQؙ3(KpKpKp2`y.+C6 `W Y`uT^4pڢPgӮ'`^Udil O`;5EC pmerSX `(5xU`m18U`m7O&Őm$`]4μo^2^l:mN 8}Nn' T[%ri={« 3d6 3Xk5Z/ro(g;R5O0]0XL>T-~]42|kfFCӷqN+J]b9^]53 lW6rkl XWoA(V-!>[UyVdq I! "*E#5'=\MmEJΝ;HYam%rmE jǙrU^MXXX[sYB0o[Xf]p>۪.V_+: ħY`pvl+Õ|Ҽ} ]a]E-YSGx Xb^l+i1R]MXvjV| N_ݽnX;.TmerWa9am=s \` \`鷓nʩ> p`Cֺ ހ;`qX S`JF\mur%`?Rm3-jlzVA^Ẫz6m4=`J&+4d W-E#jBl+UgyKAm >;'T Xl@t X[yJ@+ꥇ{0gY[`? ~3j^3`q Q 9f! NoÕpxu՚ST]7gf Pvn ^MCeZiꦫ &ClZ6jX543`K" X-đmW>}ju͕#Udcƫ W s';g &]ZOzNl-ZUXN3mV,g^ޱT4:]9m*p˧6ng6ع:`MzX߆,ޒ%',#Ig9ټhL;(ؼ{}ef KE fV;cJ߇['E*\mx7\W;g 6逝O\ ` T+U_2mѪ&&,4k# fꧩXze-ۨ_gXƫt4i,n!R4k-\5-Q&. >& jlO&t \,4 `M5Vk6Y۵v$շhuHrW5Y:}_IYծpmu2`{^m]H+1]9v^Mp=tj[jWbzGM#$d[s,+`-Zܝz `9E6 dq6/p Ijp5p.Z8T^m] j,+gdm]zGZK.f3\Wy]B0bOLorոXf}xo.7Sm5Aַ!K.h`m]5ŚVVն{ֲ&&AlBOcquɜp \ׯ?a&. ~$KpxM W®#V&|Vk:؃Uvdm-ZcZ9d/>_Z+dqq gѴ."-V#]*.p5viPW`xWY X[ 6iX٬5a6-`F-EP/jlѿ$I-eVd>N_R4аVp>~mW@IDATeNRxviU 9-CґC_[ʵ! Z4EZ5 ^ W N+Bլp5V"ֶ5)`m%PAT U[[ z<ŵ!K^1 MKa[ Nl.vc֍ Z2`$MX,]>v:`?c?g>7 ^?moVPHh $xWݗc{ 7|V]jë ԝ;.,g\)-^\,@דY`eo5 Z\|v_oc۳[ `G [)H t۬*xE.EC u#jluzXi.kZrMV/8LU_,٢[_ւY`e 5k ؗ?^XE,4ǵ/qi 5; i)J 6rbդp]<4K|5Akl-Y- X d%`MؠcG=cםupۈX\+bdҬ)jˇ \פ#+Cĺ5fݒsXmkKֵ|pj[@-!n_-(Q"v[*+)j?pÕQmpkj&YjlK;;QYji@, H 1`fC-a4 s}:@ Gl+Xu|> +& dmX UK,6`E%<2Y>?W7d[ZA+>zxEZ1E# Mf,jk%rk9ޮ:d۳,5aހ=w~i6h*`yn6OYYHhn]2}kB>Х0iSZ ,շ;IVN-g/90R]7` 7ώmį WYbq wV!vz~YS} lF3OE͊G_*Q zB ZZ]-$b\qXZ Yߖ*j5Vlm%r} .ꀕM2e&Al3]+hVVxǸ:Y W WkJ]eYj7`sZrM ؞[f^zYCQͺE+o^pF;\~qjU%`"=;^i E گ p>d+`Vikֵр֩VRǏgpQZ:lwxD :b<k!;!^&i34=b_ڪpn ^8\i[5;l5մֵA6_!HrB B6)b@y5ӵ 34b, Sd-6+z׼j)ic>l-c z]쾪 ؤVМ+iV"afClmIJׇՓv6a%ڔUXz4QuշsmK Xyj''l]+(rvl\+ ~ޘaa)fh *=pÕMXVX3dOueF`XӟV0b[Vz $^o`M(CS"'DluՆN+ZXd}[vvPmZ`eX>lU\Wub|Ibqu0^լOWb[- 9u%#\\*Wk\EBokZ.<+[`]m D Dp˃rlZA=Ż+Thzzئ ?3MXDWoF &VoVևS%kl_g嘨4e47R#V4;4i?~qYK CkCW vi{VVrIkRښۖ f+^ X_XB $]H`gyZA@J#A)dh8D- #\Mx?{zz5PgT4;@kkڒe@,oò- bVb5$uJs'/"JO*xEg +p5Õs'GRg(չXd%#: kl]z Xܤ4+iYARh#6Jp}MW>2`T|V¬XS@`];v~Qm pIM4uSWXٔxNՇX\+hG^I!xUWI1֎Xˈԟ<>9Yy5•jZת-HX$MI~YLY&̦ XY`MYihX}ƻU4^_:Ec 7!\vkXIJUI[ +hi:VX9Ʃ Yk5VBֻV_777 !f,NcZ"RsZ{7 KS X5}vFQƫ$Vr]sZSZ::@hPIX|c#vil^+_6 R4|yp妅+5濄RMe4ue,uB*Wu0Hʚ+tV5h?>&< ٱV"HR4lan e O\+p}6 pҀK Z ;X YVYk-3\INV4ֳR! V_R%~xE\S4l]=@!dk 6Vu{k Zok Ik[Z+`9<4a_T،KV_B`k-kV =ǔ.)ah~ x J Wẫ=OffO:P5 `MMXWٴKZ*1ۊe Ao=ؼ!JcZ: xEFhz8bimexJy)Lsʪ LԱSl ,Uu:6-`c3@gmkk6! Zx9瓳WwFf(mލv+U+t**;S2ϕ@1jKnXY`-lJRט-jEwJ``{gه(JZA Q G+4,E fV#Ơi[ \lϪ\M۳lx*%:uڄ0 +`}՗ xAֵ00t l[]`TEXuru4kTW+44E ͧ? V]-HҔpeﺀ {2ˈWX3=լT Y xeچ5ok-egu6X3ZyiW[%`WniņQ8-4!^iy-q/4?Į-K5۩pK'V:P]55 `ʩ. KpJYkl#Ok'ݖC*Scd9;UV"\Vѿ~#Hǧh|HF#k 5rmvQF o0Ku A5 `M^ +k,O TY<3\I6kMhuV"tkCN] WWE&IBE,="XylNpM74jT^Cֶ4 bmC%؄eidTRRm Y>Ջp< X}ִ]0c .ZA>%2^?{{+y^R4JҵF,6lVkґX>4B,#Vv $2PeMMB ٦쩢&ʿ' `]?GyOڶhsk 4VBV"zƶO^JkaW_Ҕ)^h~en(_- hWO9-\]p}YF(տ\$: `eoHIg $րYߣϓV״]<`cHvmos! V@p맪\Ϋ:y}wL+BOB+i,}r1kp Z w_vBՄTת:H&ĚzM[,[|c||L"X-\m94ޫ!6 dq YqZW Z$LB-<`V]38^k_MpU%•k% 2d]u&<4Uvg 4KbU .?\u!U< ##Ry+^R4|bDvc`صӏ+]5#l{/v9:!0z)֤u.`.hv?po86 8 `{L]9Ps`-9X,ZA' T+t(׿: +b1AWOO_X3uϼ=+O*ʈuLTIj-+[ykTZRXsY7ey|?? glX,Bizaj觚4f}ࣗGDp+x%JcWqKW5箛y|ڮ<̀啵M \pݹrDiw] Kƪk QTHM6v"Ae6:45ŠMZEvΛgn"PZoU5qerQ46t#T%^i%x%J7+}?`7곖zmU.@%^]>er+=Di7 {A(a޺hpu\|X'sɥVP=}uAZZ|>Vb6mX 6ɦ,--Syo:oU;*XݬumrmѲrMhXlyZ+ɫ!^yLӷGa+tb^) kBh:>\ݼDU:y\MT-K[bޱ$-m[zRiJw-V3]OV%޻25#SKBC%:$]H'9I!Մ$5uЯeZʧcC XY+`Zu "[MhݰR6vQnm熫|tIyDoJ ^\7곆aX:idy,R%`o70i2`^.Kݶ:LUK^1kpAgLJ$IORMe1FT=wRGJY4sZyKV{J}[lv1u󺰷^{TT`=V}˧x%{<"xk})ah>p6* s 2 W*Jxkx:$Ea5WУ,ӪNY[72Z 7 {Bl^ޱdawp5l9tdX,53=L`*?RrAU>f!t Y48,:W `m\ۼ)`R{hht QU`J}1޷XfVCKo\W+㟅p ?ũ+ 14]UEAM=bUwU?rp޶(,+vKw_>\%ב!+=תi4!V!ބTf+`mM hcVU\VY x\45ٗ謜h 5 -Z\ZM#jh6ZhJRԏ^Sx%,0eAGFZ`}py^- Ѓ,zNXRD%n)_u!u«l;\sYW~xw1HʻͤW%df!5-`g{NXyi@V6 `Xi 5 `."0Vu5U,aU n +ZOc_xh*UV?p2\?ymdW*OcJ_ÕA<)fhrYݶlh鎥Cdo_zR)+!򄁭oo-uU]ŕˇOG5PeP*W8!kbzu2l;9N k\4Ϣ hu^m VoA`5T^,!6ZDpa֭W.cTcۏbsogsF``UFkO UpZ4"ắ|Jp2\Sp H3,p}>˹_gMci8IJ?he޻bD잦cVU>W:2&]~k?)Tcu]9]Sp6"zVqrֻ)k6e`mk ՎMZ X-W*cbݹت޿:`V\F+p̰\W*Õ)tJx-BAZ0E# 6 \O_gW +yy<5l(8 ;Xh(ӘՐM*5 Dk& HX'Y۰1Wր4]2fYB«ouVUSX<U,UoUG;NPNTʣCx%r%\ _RX 9hW YBݹ*@ʓUwfҏX3U! 1bڵ~`B%ee|dI dI~+lEj#cqv55 `.55 `oZ{.H,ƪ^wT !^UWU*her%\~6,G2\ |] uA6IXCx /M쳘)}^{Ji%G|b!Mnbң.~@jlHVm\K &$Ҍs oֽLU l!V6-`6ԕ=Z+jj*kjëu1Jh}dQ%Zgg2ZQT+a T9a GZl=J}>{}wZIt:4!˯ | Ȑu'Gl1f=raKh&ĚfJ+dk:~YњN׵%3 g}c.&m+յ@4tEʀ-#ʣx[͕`hhe2Ze%\ڀ2衖2P+] {+x\{[7)\%^U pB,ݝdꏋ+6V-}CӒlaT1\vA|aKim~z}~?2?8b+] y@« i渚gf o@ՄWU ;>k`+GJɡW9e@Uv}5>e~C-L@a)q\\mi>l[YBY~D@BgVN h\R>9NqOcִA˶̠&]j}^,@Z `]k·xSVN]:ciԕm 5XWj%eIhh7VU+UVU*h)V2@p\xw])(ECShxH0i(CK%|;24!kW$d?kzteŬ 6VNR]lUH= XTzV6ˢjoԱ5 `Zo+U؛Է ڜ`UֶEj[D /"h3]%ZDUt{U\ VVY}U.밨|h2\*hAHkxm$\eL?d,߱$)-Cl4t5=n9h԰J^p!T+m2u񬃝s Vݰ+;ޑ"*U/h}JE\}€\FhJR|ߕJU# R)z$pe2\:m#*P'=K*!!ˣnim|~)#v:bC 6]_smJT9K X)ke`I9YkB*`Z@V6UiV9K+5Z]}uէ Е Wz%ٰ_+UÕ~"Ң)|4peW= Y:%Ҿ{,c fO3bI}^,QB6R L6_kzdkSj+fF@=Y,^ujo؝j[Bqj^Dִ@_FO`TF+U=*h,B+iI=\@ R4ڥXW=4ߓ!].AvN^;H(C ;iPTVi8u!'<$^* : U)kv`cDq\qP%X&YB[DggX"WOxXj4ֳ#\F|*pALl&=CqJy|JHU.M^;W_n5>`ѷʼngs Y穩թd^}Q UV6,ט+׬VoVk^cltUuq湖 JVrƫ>U+UjZF@heeGZZU\+ !؊m\>yoWxo ˸"*M`L)ZWLu?yy6_ TlsWyևFWzj{Mhu9UT7U65ZBc@<˶@G2X]WFHf~jVy.V;cE AK(lFb2Kh4R!d PY>+zmƗSo[7Y_SWIW*\_6 UarU2˜$Zi*Gm#|Sz6(,s\9ZDUSWY} *+J}S{-ZW*?@Jp/AO0l+\0d%AwF;zu@{$.Q*?gjX%f*WUǬs댃VYY7J1˄W,^|l%US Ygw `}XM\ \Nh W+ جY]/ Tѷ.>9F Z5K@+:{RPI7}4,7!TkAj. ~eJkW/=Z碁UM ۮ;m1X:Zex{c%Xms\,םa%Z?y`W9˕'2Z+燫J+ªoppEJXl,P$`gȪB asW+z>2blŷ۫}K߄Rc[^U}jғV<($/؛uGZ]gkmV׻ˣvV*X@ 0Zeu-5.p=WrEI dNe煐]^~E8D EڞI Y:UDf{myUP5}͵`hAad IH Xwcԕ T֕MW߲ T mwkU<*W\4ϵ\F+Wr-UpZÕ {AKр,^J!J,CvYZ~ϐU{| ui ƍUe꟏ՆX5{Ngz%g`Z7_eoMYa`xuϽau>{~:$WZ*r AVWڠw\9 H˧hL6k8%!Y,=2b^WnʻP,]U]X/M51eܕk#sVMlحm,AV\}c$`mcdqBU V VY,U4˕J_8 Z"䞢aوC/NtEpSW/kz}/MtyuRyif)Iu& ku-U7I (, GX5uϽqX V^JeQX V9*hV.tUӽ8qEiHFf f}{z]+,]5 uGJe.Jس}+>`$ڐ|'5X+a*u o91XT1X8,V*mz!QXT^*gr \ߕaע ґ)kQd,CͮZp$ok\ߎgJ8Ʈ.XPj;5\C[zU}&kZ2|ZhM3 뮍DfsMp҃nom iGaQ 3\oaIY/w\V啯 O\A"E4Ki 0Kw3 e5FY>΍}I2 )TV}>sE_#l cַ*++3P}LKI<ĺCê^I\iXW(,ªqVVY9 *fUVuU|8mEi Ryqu^ꪁxp/ \+P2dns=NHQshU/l[exo.X׊ |ZmsT]\+$}w0O4`GaY;|U;5 AZ.Epml(vY1'xd+RuWk&k2 $3Y`m-cԪW)I{vƫd_f,غWqUuHUy~! 9hztWEtH< ~|mt'6&|Hm%T kŸ#S,!uY|@UؤSVV$9Q@_x#^rjV:qw\ys\J`հV& m?<}M hELaUn%2y~)K?ԆΤsV]_sM(7uܕ5 `MllS~=ƒ`uMi$>M`!Wj1K\ A"zԋuGFw6շWU@Z^/vI8u}A+'lxL M&ꃪ)i' +hk^rմ1m*WAI6aNmru:IWR,$WBS>'zYqYZmubM9e n;X6I4E' XmYCc-Y(WߖE`h٭[ Ԗ[qv9awC_Q})?f٨8IGU%e2Ϊ{M8]}tXO3{,ScpÃMYTצ,-BNU " Rl>ĚO?pHx422E7:fn^Wz]fuN ku&LL \!$`zx ܽn4BBk># aD:aZW҄Mq~95?_*h+\V[̵Avªjz=RXcYސXA/WڵoAAܵ1H(}+~]>Cs/鄘j^ڑj SV.;N06+)]}釃jzez1ze " R!5=O#] 05cXϛQ`״ʦme˪n?^.+Ujڊm2s YJW">+?}WE{  [r<* 4R]OX/GM} PH?)65ͣ+VVmX58|a܊EG򸫢BAiX_0P:Xy%RoT?Q ;(c: {GW&g}pvOYk  4]'U;˯%0wnWy{j*hu:^ףvT]>YҕR;YRiR@>  lF)"(6]LUiZTm{+r6_]沚AAcBBBxoGfl=>2[}pgUZ `]"aQtGZѩjAAO{g۪; Z1j~F|_/4,@껳ʧoOTFAAO߲7}s%oFVT[}Jx$7%                                                                                                                                                                                                                         zqO{*B%tEXtdate:create2011-11-07T02:03:53+01:00h%tEXtdate:modify2011-11-07T02:03:53+01:00 IENDB`openscad-2019.05/icons/icon-nightly.icns0000644000076500000240000077465313402025764020525 0ustar kintelstaff00000000000000icnsis32 53!1$>$DV[[i@sq>NMP #&1fǮF*":i=:{f mK;4.zPG%K" /+*oF  MqJ;$#%"[wD'% #ГeF/&%#2ƹU"-(($#y*((=9"C=`p;)9+;:+W5.872,&" Aagkҡ@&(%/B42V?$kITX6;9*4-H;^kFDk%++(R{wDNOQ8;5!5lһ_=W% 0EиT"*/WSJH*%S^VJD@ev;(:X]XO]81;4T^VOFYhivҩlRQJ=CAE64[D%/wS_d;&FE7<;Y]݇_>GHAmXDHFVZJ(,>{{g<#,DB|sT<"@B==QU@nd9UX`Zz|e`enE0 ?aPGGO}upltnI:&=wsih~pfdTH)uKYbfxk`L,[3muiZM!4}u$|zLJt6 5|l@8D)zt{yuϯxdqYO=;hB(=*dtyGs8mk,,$+G'ɩQ9-Ѽ-!{EΫ%vF t$//il32 F gY_vǎ2$:YWM/ !RXwAHvq  8[vɻj3`^+8[vȥ7kjN:94Zva gn29]  ;<2YpV %VX9?NGQ (/x #MHMIG'# r_P, +T3 &,  "",~~9K^=!  !F<$ N}c  J(!!"#"! Kj[O $$: )C6$#$#"!#CH 7Q mqrR($%#"! Y֓0UjT*%%$#!zLaL(&%$#! *=íJT5&'%$#!(H.1N835)('%$"!"cص1:-.-.()('%$""q*2.+))#*)(%## Yoz*-*(&&#)**/.%"QEYer|twwF"(&(,-,*6Vb+!)5$/?N[S9)+.161+(Re+;Z>,)6O:F[139>.+*./& /mN4@lmM&564++*'%%#9SG&HIJUM(*)('&#!''&0 #"'&%#!#Y/1<8,+/.- !" ()(('%$" l]d|Ҏ1%!=]ZQ̔Q*U]}]Ysn%=`}5^\#$%$/;`|ҲUm]L*+ !D<7_|t>kfHI^/.#!$"H=6^we(CYSAALE7 '-/03/)2ALEGHE:&2*+>>5531'áp]Q2")5A>A@><=R\gL4%#$1=;9@>BZ[IEECA=f{j3)'"!+7>8.HGIFJJIGED0Qmie*+&!.EF;]9>N^WONMKIF@?T754.*% B_4*'0rjn`SPOLJHDB?:62.)&`13HTcZSRPMJHDA>:61,,΋L_UUSPNKHDA=950-:λKPKWSQNKGD@<64F-0N735QXSQMJFC==f09-.-+<[USPLIF9x)1-*)('XYUQNKFBě^u),)'&&Q\XXVNI@UI]jx{}~F"(%',)M_Z`mKJK3'1BR`X9(*-20P`L\pLIU\B.+9S>JZ134<\^[YYQIQqR7CrrM&5F]`]ZVROKBUdS4NMNYM$s^[YWTPLGB1 '))(2LMLSROLG@.6`;91("/5,#SuQOKShOXg~zxrjgaZSLD>%mQSg=ށDKW{wrlf`YQJC쪻@U]|wqke^WO*/אַrDGc|vpjc]?>#&C.+0ztng]m{&0%&'"Qysd!)&#"#)|umk!%"!!xnbSky@!!&sus{u6-8L^ne9"#&,"uypu}wfL51A_FTV*,%1{|~^@MG-S|q{~hF\XXgFנ~ulX0<9//.:}}ujKNoLNV%rvzdU\bQ wnfdil8mk"ETTE"Ճ Hl A֨%Yζ!!&%GFw[}դ[8F=%-i,ߺ|j14i=Ճ$H\\H$ih32dwjzǚ2"@TLF[ʾX $PjkzȖ+! )  =VizȹbgG,{t&r (@Vizƴdgfehhb" 6(@UhzŬA sXUUV$  L?&?Uhyƾ?vla^WRLL$ \<'>Thz0haY\aY& BD%=TdtǼh ,]UPTVL' 2*>Gψ0SHGGH/ɽ|pmqjVJ 3XA(,ImjbS9 ") Sc.9   !)%ka*_' &  $%  BC :NBve\P  )*T95 +{~wc  -3!#! \lt} !!+e "!#$%##""!! $;hi2mK  +5"&.'!$%$#""! !%/\  $\K =otgI(#&$$#""! 5 o7 (~koop_/$&%$$#"! :ҡ$5+dbcec2$'%%$#"! $He*cX^]V/%'%%$#"! 7&wř&[P`ZN+&'&%$#"! 63Dİ'TO_T9'('&%$#"! .1D;+# 1C1'(3>HQZP`숃$g&'),.0263++(,az?)$EWF9,%+7BY3wz#&)-/13692++(3DR5#%GsXM@4)(Y=ee#*-268;?.++*+&%)$$*j[F5e?MN q.057>7+,+*))'%$##9m_J8A=334 r)34.+*+*)('%$#! )&') v+a-++*))('&%$"!+0UG1>321.&)&'&&%#" + 540**+)).#('((''&%$#! j~pҚ!7(#DXOJ`ʔt*Apqө0-MHy !B[oycJxq"o"+C[o|,fdcff`"'9+CZnϷ]AqWUUT$"")ETB)BYnǐ9Vrib`VQJJ$'&2'c?)AYn28Ke^XZ^X&+.3W"%)%NE(@Yizv$49HYSOSTK0x+'&)-/;*@Lٓ$%,2:HMHEEF'36*(),612210.DdzzlildVS"&,2=F?;H?'70%/1@D8766544*]kicV@)!'-4?U[FA)93-%+5ZtL8;997650.4I41)%"(.8BA>EB)=5BydE=?>=<;983,*f<%9,$##)1=9ScXyme[+'%"%,6@@=>);D<=H^XWDEDCBA@+oCBBGILMMLKJIHGECD2@olEa-.+($!'4<<::+Y0HINSPMNNMLJIHFB<=Ib8,240-*'$ 3$(<;7\iHEYssk^RPONMLJHGFCBJ==9530-*&# yƯK'/K|flkidURQONMKIGECA?=:852/,)%"<ܮ6;962/61EϽŀ'RNaQIWUSQPNLJGEC@=:756.F6':;w=>A:NYUSRPNLIGDB?<96HoÀ(>7:,87/046YWUSQOMKHFDA?7]v(6:661//,3'J\VUSQOLJHED7fÍzĀ(1520/-+)/%3]XVTSPNLIGE<ʑkyÀ(400-+*)')%"W[XVSRPLKHEB{Yjr{'I)-*)('&%%N]XVYTPRKIFC'QLYblu~&,((&%%()F_ZY^]iXKKGET 0>HR\enwru[%&&'%%'),/+C`ZcWa~NMKHKC4(*6BLV_Ue$g&&(+-/21H`\P;eNMLGXYJ<.'-:E^6}#%)-.0263Qa\X[^lZMME`w^QC6+*^@jk#)-2466B]_\[YVSSOMGMo_K9jCQR q-17y/@1/OdZTnߛ%'%$38`]xv .!- 1Mh䟩ld^'])'-3Mh~ޠXTSRTTP22//4B0Lg~ӄef]HF990C&)bJ/Kf}al[UHB==$@?2S03>sH/Je}۰RcjQMKOOI&GL,T8=CAaM/Iex@SbhFEBDE>&OHB?DJKJMI.HWĸӷ:>IQdb9=99;'TZGDEJURSSROF`ɘgSQPFHb++8?ISeX$6'[L?KP_c\[ZYXWUJ|۽VWWOC4"!*/7@JWjy})_UPNPQiq^a_^[YWRNQ[MH?;60+($!)08BL]ljgqn)eW24gphhgfeca_]WPMnWESE;83.(""*1:DQcnii`OT̆jnljigd`uyxlGA=83.(!#+4=HZjjff)bpngmrrsqonkjeorhEGGB=83-' %.7APbTNl)i``nwsuvywvtrpnlg\`|gmTJGB=82,&(2PܚhOZWP]|yuspkhd`\XSNID=:)*CB_IY}zvrnjfa[Y;"CY'01iv16>2u}yuqmhcaMAw(3.0#//&)->|xtpkh]hڀ(+1.-)'&%0r~{vrpaܢ((-*('%$",C}yuqgzȿ߀(,('%$#" %"!{wrnfzր'B!&#"!  "y~ytoO\Wfq{Ɓ{%"!!$g{{us%7GS^it~[% ! "%)[qnfx}wmI<.0>KWblas$b !$&(+#]Qqfz~xrcUD4-4BOl=#!"&'(*0#rvl]M>10lJzz##'*++$;~wy}kVCyM]^ m'+1:[}xo~kX[N@=?m +'u{uocYP%'=334 p"dg{{ung`[`r_MD*+_~ytmajntZLNQG -0\{[_laVX]U{vointfh8mk 8\v~~v\8^^ xx IY%Ԋhٔ<֋BfѾȏM cΝ{  yy__::`_xz4ǠoВ貿9ҵzY_]:U>\x Gpҳ OӲ}G 0UiiIQƓwx  [a^^:a||a:it32jy i]cmsz NPX_feb¿ǃ++8Jml^fmsyͩPfB$ &SXLPX_fmsyǀǬ/8S#3  +3DPW_fmsyɹX&!' 1?HPW_flsyǀ ìsA% ) ,7@HPW_flsyǀ Ⱦ; &$! ' &%,6?HOW^elsyǀǪS4 ! ",  & !9+#,6?GOV^elsyǀ½¿\%HFrvvtqqrr ) (I7+$+5?GOV^elsy~ǀ¿\#!I\CSkkml +  WC7,$+5>GOV^elrxǀ¿<!E~uwusqpg0   QWC8,$*5>GOV^elrxǀ¿4r}qrpnnieba1 %iSE9,#*4>FNV]dkrxǀ¿5&]{lnljhig_]2  FNU]dkrxǀ¿I!Mvhhgfda`]XWW3 rTG:.$)3=ENU]dkrx~ǀEBm_`_]]ZG\TPP) 'nVG;.$(3=EMU]dkrx~ǀ,@h\][XWVQRML(U]G;0$(2cWWVUSRVKSG'"ZJ;0%(2I|{w|xWdR     3E;K"! 8}wyxuU[t(  ?  5&5?#"! <+oxuvuvsVLʼn    "$" -3 $#"! '*[xs3pXLʫ7     !""#"&("#"! #-'J|lpopj.'4kB&  !!!""#$#"! @ +-)35,mlo_+   !"##%$#"! ?)+%!MonP  '$ !"#$$  #%&%$#"! #% -jlD+   "$#%8LRM>.#!%&%$#"!  Mo6" $Klrc8 #" $Bm~}|{q]?&"&%$#"! ,j,"  Rĺ@ w[F$;dzussqoptta:$%&%$#"! J&- BU WZqzt sqponkjmrP*$'&%$#"! %   0{mZivvsqponlkjjghs`1$&%$#"!    )qŁ ¾ɎԵqgpqnmkjihgegeil:$&%$#""!  +.sł - mdnkjhgfedegcbh?&'&%$#""! ,+.Ą]_hifedcbacb`^gA&''&%$#"!! .++/ Ƅԁf`gcb`__a`^][d>%''&%$#"!  .*+-.0ƂҘ # qZd_^^\]\YUV8%'&%$#"! 410.1%\ƁΫ'0>~Ta\[Z[`^\YVST3&('&%$#"!! &446779-ľΫ&.=|P^YXVaa]ZWURP.&('&%$#"! 35678;2[ŀ̳5?VyMZUTVc`\YVSSH)(('&%$#"!  /8679:9:ɺCPqvLWSPYc^[XUQS>'(('&%$#"!! (*9679:<2ȲOjJSOMYd]ZVTRQ1&(('&%$#""! # 9776;;0wŶtUKOLJYb\YWMA:*('&%$##""! 487897B~¸h̋knCLKIFTcYH?=>3('&%$#""! '-?=943@646515Q:JGGBCFCA?=<,('&%%$##"!! #H>N]-CA@>7,M~>G>735?CA>8/)('&&%$#""!! *>JFE|о:@?>==;=24kC74206=820+)('&%%$##""! *L9Kw2A==<;::99:705433211.562/+)('&%$$#"-!! ;N]d d6?<;::99876 332110/.560.*)('&%%$#""!! !!dlwR7<::9988765332110//.-45/-)(*)('&&%$$##""!  xz| B9::9887654322100/..-+24/+)%(*)('&&%$$#"*!! L̷ztxz}!7:9887654332110//.-,,*03.+($&**)(('&%$$#,""!! ƶumsux{~"A797654322110//.-,,++)-2-)'##)**)(''&&%$##""!! !1phmpsvy|E4765432110//..,,++* +0,)&"!'+**)('&%%$$##"(!! !hͺgchknqtwz}V.64321100/..-,+* )(.+(%! $+*)('&&%%$##""!! "ǻZ^beilorux{~p)522100//.-,+* )(('+*'# !*)(('&&%$$#""!! !{PZ\_cfilpsvy|~'4110//.-,,++*)( ''()&" ! (+*)('&&%$$##""!#  B]LTWZ]adgjnqtwy| -100/..-,++*)('&'&#!!"&+*)(('%'&%$"$##"$!!  AJMQTX[^aehknqtwz} B*//.-,+*)(' &%%&'""#$%++*)('/)&-%',#$##""!! V:DGKNRVY\_cfilorux{~~t".--+*)('&&%%'(&"$%*++*) "FS((NB%##""!! _3b68=ADHLOSWZ]`dgjmpsvysz=$-+*)('&%%&'())%$%&'*++*)**%6m4$ ={1!%%##""!! 0#(%.26:>BFIMQUX[^aehknquqrB&*)*)('&%%&'())*++&&((+**+)#%%)Xc29g$#"!##" !! .-,%%',048<@CGKNRVY\_cfilil}+')*('&&%%'())*+,-..*(*,+**@N>2(Eg]uU!+/7/#"!! g70+'#%)-159=AEHLOSWZ]`c^gu ,%&%'(('&%%&'())*+--../0/,+,+4**EjxDBFIMQTX[b;\jpr'$$'&%%&'())*+,-../011240,+*$*XF=gc{_C8&"$##"?RHD?:61-($$(-048<@DGKNRWSWhh )#$!#'&%%&(()**,-..//0123473+,+**+(')Afc{^A2%"#"HZQLGB=94/+&#%*.26:=AEHLIQ__o$!!&&'())*+,-../011245682+,+*.,%Cec{_CLD4'$##"#EdXTOJE@;72.)$#'+/37;?C@JdWZ ( #())*+,-../00123567791+,,+* &Kfd}\%/.0)#"#Cna\WRMHC>950,'#$)-1597@sMP! !!%**+--../0122457788:/+,,+* )'Wg;Fm"$#$##"#8vkf`ZUPKFA<73/*%#&*/-8>LG?#!##',--./01123567789::.,+*+'0`7$!>z1#&%$$##""(wwoic]XSNID?:61-)$$!/8=#$(.//01234677899:<6,+**'58$)) >8"&%$$##"!"exsmga[VQKGB=85/%.1'D3'$%'')/1123567789:;9>1+,+*((')('(#%&%%$$##"!"8}wpjd^YSNIF@5),+/-)S)'()*+.2567789:;:8JC+-,+*))*((' &&%%$$##"!!"azsmg`ZYVG3 $7@ :!+)+ .37899:;:@VO.,+*))('&%$$#""!! lxsplY<$c*641,(-+,,-..1479;;BP@*,+*))('&%%$$##""!! EzuZ93#*+#+--./012113401,)-,+*)((' &&%%$$##""!  %&$- $,0/12343,++,-,+*)(('&&%%$$##"!! #*-42345+'+,,+*)(''&&%%$$##""! 7(4345564.))*+*)('&%$$#""! \255124G*+*'&)*)(''&%%$$#""!  e45**)*+()&('&%$$##"!! 34665()(()*,%$%&'&%%$##"!! !61+5 (,&())-,(-# %%$##""! !!!.'( !"!!%)2&%$$##"! '" ocisy %RT]dkjgӷ+(3'&>Mqrdlsy׸mb%#-JdRU]dlsyҀRYpH3 .:IU\dksyƫ s<+IG5!(6BLT\dkryϻ''`HDCF9 $/:CKT\ckryɥZ3DRMG9 #*&/9BKT\ckryзn6ZBEFDDIE <)<-%/9BKT\ckryt:KHtusrpoppI/L:.&.8BJS[cjryr:HIAbfZbjiljkkiH ([G:.&.8AJS[cjrxV:E\yutrrqnfeN  X\G;.&-8AJS[bjrx8>AQsvppnmjje`aa_P2oXI<.%-7AIS[bjqxM5>?Ifslljhgdb^ZZ[O HuXJ<1&,7AIRZbjqx\/:CWjcba`^]aUURRV !"#%LwYK=1&,6@HRZbiqw~ſW)458;>CUe_^][ZXTPSNNX!#2 "#$%%&"9s[L>1&+6@HQZbiqx~ſ@)1258;>CS`[ZXWVTOzQKJ "$*" !$%&''(K&^aK?2&*6?HQYajqx~Ŀ$,.0247;>CRZWVUSRPZLOG %%" "&'())*K+'5_N?3'*5?HQYafnu}Ľ;"*+-/248;>DQWSRQONLPQK &&# !$')**++,G-)=P@3'*5?GQY`r{¿S'')+-/258;?EPRONLKJH '# %(*+,--.I*8B3')4>GQbùzutv{U$#%')+-/258;?FNMLJHGFEDE )+,&),--./0K//0-34'(4>=6ź{omnoompoibcմD !#%')+-0258DCBIF62//6:2OSJRRA7??>==<;E::9988766544332.o](/,,+)%#'&%$"" !#%'*,/36:AIJED5 71hvSD?A@?>=<<;;::98<6654427g`x<,.)'*;O-%&%$#"! !$&(+.148>DCBE85)57;p>BA@?>=<;:?96765772@s\jg$0=RgyG%)'&%$#"!  "$'),/26:AXZEC:76:6P];DBA@I??>>==<<;;:B<:;22,ExXfux{S%+)('&%$#"!  "%'*-037>DDBB8;;9==:fDCDCBA@@?>B==<9e}z{ztsnU,-,+*(''%$#" !#&(+.15;A?=D;955=?6[{vbxko\/..-++))('%$#"!  "$'),/38>IIBB=<;;>B@UhWbGB?>EFEEDCBBA@?A>=>5@np}Y\7/1..-,*))('%$#"!!#&(+.15>=@CCcOO]GHIIGFEKDDCCBBAA@@?>>?:8\~|x~zTeg(01..,,+*((&%$#" !$&),/39?=?>6K|xz4ywTZ-.2/.-,+*)(&%$#"  "%'+.17=A @?==ADEQJGPTHJIHGFFEDCBBA@>??<1pzvwvwtUKϘ5)2/.-,+*)(&%$#" !#&),04;BB?@@CFHJIINPJKJIHHGFFED CBBA@?@3)^yt4uqUGҷN(1/.-,+*((&%$"!  "%(+.29>>= ACBBEGIIJKLMLKLKJIHHGGFFEDDCCBAB9-)J{orqrnB;D}X-0/.-,*)('&%$"! !$&)-07<;:@AGFCGIJKLMLKKJKIIHHGFFEEDDCC@-,+>NFonpf985--.8D110/.-,*)('&%#"!  "%(+/4:53>B50EHJKLMNMLMLKKJIHHGE@DC1.7>?=;Znm[9:9:8730321//-,++)('&%#"! !#&'*-29ZS=DBBGJLMMLMMNONMMLLKKJJIIHGGFEF>9BDBAA=HjkT9;:9876543210/--+*)('%$#"  %*,17@A<EDDHKLKOXbdb[TONPONNMLLKJJIG@EEFDBBAA@>YkL:<:98766543210.--+*)(&%$"!  0Vw~oH% -/6==:FEHIKN]qxywvtpg[QPQPONNMMLLK JIIHGGFEDDCB7?GhF;<;;9887643321//-,+*)'&%#"! \äQ"/4::9sT`?EKZozvtrqonmfYQPMOONNMMLKKJJIIGGFFEDCCBAARB==<;::877653220/.-,+*('%$#" Me"5887;CikwwssrponlkjiikaSQPO NNMMLLKJJIIG=<;;:876543210/.-+*)('%$#! E,;76yqejstqonlkjjhgefkdVRRQ=PPOONMMLLKKJIIHGGFEECCBA@@?>=<;:9877543210/-,+*)(&%$"!*vЀ Ҝ):45!ھoennkjjigfedeffeXSSRRQQPPO7NMMLLKJIIHHGFEDDCBA@@?>=<;:9876543210.-,+*('&$#" ")-xЂ E*$3jbligfedcbcdbaaXSR=<;:987654320/.-,*)(&%$"%**.уp2\egdcba``a`^]^WTS?RRQQPPONNMMLKJJIHHGFFEDCBA@@?==<;:987654310/.,+*)'&$'*++/уݑ3d_ea`_]]_^][YYUUTTSSRRQP9NNMMLKKJIHHGFEDCCBA@@?>=<;9986543210/-,+)(')**+,-0сۦ&%=WoXb]\[Z\[YYWURSUTTSSRRQQPPONNMLKKJIIHGFEDDCBA@?>==;;987654321/.-,+(,20.-0#_рع@HU^}R_ZZXY`^\YVTPTUUTTSSRRQPPONNMLKKJIHGGFEECBBA@?>><;::87654320/.,+,224568,ع?GT]zO\WVUab^[XURPUVUUTSSRRQPPOONMLLKJJIHGFFECCBA@?>=<;:987544210.--23467;1]LVjwKXTRUd`]ZWTQPVUGTTSRRQQPOONMLLKJIIHGFEDCBBA??><<::97654320/.14577989Xe[uJUQNYe_\YVSORWVUUTTSSRQQPOONMLLKJJIHGFEDCCA@@>>=;;98765421025668:<1ļҾdiHRNKYe^[WTSMRXVUDTSSRQQPPNNMLLKJIHHGFEDCBA@?>=<;:987643126766:;/|YTJMJIYd][XN@>VXWVUUTSSRRPPOONMLLKJIHHFFDDCBA@?>=<;:8765425778:7Ch_ˊjnAKIHDTdYH??:FYWWVUUTSSRQQPOONMLKKJIHGFEDCCA@@?><;:987648=>:43Aɽb~535514P8HEE@BFDA?>:QYWWVUUTTRRQQPPNNMLKJJHHGGEDCBA@?>=<;:9869HIJ>O_.a,BA@??=6,L}=;;997DKGEȎb9@>=<;::;=13jB6323106=83,L[WWVVUUTSSRQPPONMMLKJIHGFEEDCAA@?=<;;8?K:M{ǎ1@<;:99896/42I110-572-4YXXWWVVUTTRRQPPONMLLKJIHGFEDCBA@?>=<;>=:7fr}Ŏ^Q6;:99876643221100/..,450.'2ZYYXXVVUTTSRRQPOONMLKJIHHFFDDBB@?>=:ʼn~bA8:9887654322100/..-,*34/,)"L\YXXWVVUTTSSRQPONMLLJJIHGFEDCBA@A5fz~=6:887654322110//.-,++*03.+)!7]YYXXWVVUTSSRQPPONMLKKIIGGFECCA!6|sy{aA68654322110//.-,++**)-2.*'#$U\ZYXXWVVUTSRRQPOOMMLKJIHGFEDCBB;P¼vmsvy|C365422110//..-+L**))*1,)&#C_ZZYXXWVUUTSSQQPONMLLJJIHFFDDBD6»mhmptwz}T.5322110//.-,++**)H((.,(%".\[ZYYXXWVUUTSRQPPNNMLKJIHGFFDCB@º^cgjnqux{~p)42100//.-,++**)I(''++'$ "V][ZYYXWWVUTTRRQPONMMKKJIGGEDDBAT^adhkorvy| '310//..,+**) ((''&'*&# !I_Z:YYXWVVUTSSQQPONMLKJIHGFEDCC`bPX[_bfimpswz},0//..-,++**)(('&(&# ":_[ZYXXWVUS/RQPOMMLLJJIGGEECCƿDOQUX\_cfjmqtx{} A)..-,++**)('&%$&'"!#!/\Z7YXWWUYUSRRQQTMMLKJIHGFEDC/d6g9;@DHLPSW[^beilpswy}x?$-*+**)(('&%$%&'()$>&#Q_\[[ZYYXXT`pUSO_WMNMKKJIHGFDDF3%+&159=AFJMQUX\_cfjmqtw|wxA%*)('&%$%&'()*?&%(#K`\\[ZZYVVUXbgV^rPOOMLKJIHGEEDA/.'').27;>CGKORVZ]adhknror*&()('&% &'()*+,--*)#H`\]\[Zbg`[WXhfhMOML"KIIGFEG92-)%&+/48<@DILPSW[^behcl|+$%$'&%$%&'()**+-../0/'A`]\4[ZdqyLBkicHMLMMLKJIGFDZF?:50,'%(-16:>BFJMQUX\_hDapvr'$$'&L%$%&'())*+,-./0013/B`]]\[[ZWYqI?lhcGOONMLKJHHFQTLGB=83/*&&*/27;?CGKORV[W[mm)##!"&%$$%&'()**,-../001231Da] \[[^XF-DkhbGO"MLKJJHEX]UPKE@;61-(%',049<@DILPMUdd1o$ !%%&'()**+,../00122352Ja^]]\[WE0((HjhdGKKM KJIIEYg]XSNHC>940+&%)-26:>BFCNh[^T("'())*+,-.//001234574Ob^^]\\TLMOQ`hipMPONMMKKIIDZrga\WQLGA<72.)%&+/37<:DzQT! $*F+-../00122356787Va^^]]\\]\[YeiZf{QQPONMLKIIDU{qke_YTOID?:51,'%',1/;BPKQ>#!""&+,-./001223457798<^`^^]]\[YYWYf[TQaXOPONMLKJIFK}uohb]WRMGB=83/+&%"2;@"#$(.//00123356789;8Hb_^^]]\[ZZX[\V$P`]OQONMLKJHHBvyslf`ZUOJE@;71*/3.O6M'$%&'*/11223467789;9:Za__^^]\[ZZYXWWVUUQRQPONMLJJHHBW}vpic^XSMID:02.1/+KS)&(()+033456789::8C[a`__^]]\[ZZYXWWVUTTRQPONMLJJHGG>vyslf_\ZM< +49%9!*)*+?0567889;9;Rcb``_^^]\\[ZZYXWWVUTSRQPONMLJJHGFCA~xuq_H5d0873H,',++,,-0589::8E]d`_`__^^]]\[ZZYXWVUUTSRQPNNLKJIGFEDB;_}eJ3>056%"+-,-./0159:=Pab_`_-^^]]\[[ZYYXWVUUSSRPPNMLKJIGEECAA78BB?8+ :,$+//002323:X`_^+]]\\[[ZYXWWVUTSRQPONMLJIGGECB@?><730,.,6-33'),3134J`Z\]]^]]\&[[ZYYXWVUTTSQQONNLKJIGEDBA?=;8643/3. %+5'43556JWYZ[[\&[[ZZYYXWWVUTSRQPONMKJIGFDCA?=:750040--.\1434\\ZSSXYZ#YYXXWVUUTSRQPONLKJIGFDB@><97-(63013/ d34Z[^WZSVWVVUUTSRQQPONLKJHFECA?=;5;=<6224334WYYXYZcONPSTTSRRQQPONMLKIHFECB?=608K;7446450*4%VcQWWX_]VTNENONNMLLKIIHFDA2EG@EH?;9g8UW HJIGC@?<;>PT]QPPOONMLLJJIFFDBHHA qy ]`jrzyv+IS]gpxȾtNZ]bhrhOTRQONMGFFDD32,*2.-0578:<4afVF8,2>IS]foxǽqIUX]agqeKQNMLKH>HEBB47;U52148:<=>?;PhWG8+1>HS]foxǸ[HPSW\agqcGNKIGGF@jB== 9?@ABK@pmVH:+0=HR\foy͜?IKOSW\agqcDIGGECBB=C; =>8459>@BCDEKFCOlYH:-0=HR\fou}SAC= ??:57>; A7:*6=CFHIJKKLIIOJ:-/*.<:98997 FKCAAFJLNPQRQFPPO;,*3PWxѸ\W]a`^\[Z^]\\YLL. ./147:=@DGKOTX^dp\3<7798 IVD?AGLOPS^STTUTSR>PJHL\\Zaa_][ZYXXZWWZ]V7!*),/136:=@DHLPTY_gnWkl98 L>U_HMQTQk_UWVUUTSRQPM5֮]`a^][ZYXVUX\]WG3#"#$&),/137;=@DHLPUZ`iuWOz9 NSIGGMSUSfwW\ZYYXEWVVUTSRQQT߳c^][[ZZYYXUQE9-$! "$'*,.148:>AEIMQV\blvurpuQIBENSZX[hWS]^]]\[FZYXXWWUUSSRPUtѯa[^ZWUQLF?81,)('&#!"$&)+.148;>BEINRX]eo~vrT<:985410.,*(&$! "$'*-0269=@DHMRW]gpnlysZSNOX^Zm]V_\[ahgOffeeddccba``_^]\[ZYXWVUTRO{tGKIHGE@>@>=;985420.,*(&$! "%'*-036:>AEJOTYaly{rp YYXX\Y̶^\ljihgfHedcbba`_^]]\ZYXWVSXoP\IKGDFTdF??=;:86420.,*(&$! "%(+.147;?CGKPV\fpomq]WBN\aֽjlkjiihhgfeddcba`_^[[ZY8U`xPbDOXhz^ACA?=<:86420.-*(&#! #%(+.258<@DHMRYakro_\[^]vքgomOllkkjjihhgfedcba`g`_^WVQbpsxhBGDBA@=<:86430.,*(%#!!#&),/269=AFJOU\fppmn\ba_egfqppoNnmmlkkjjihgfedc`}u{tZIJHFECA?=<:86420.,*(%#!!$'*-037:>CGLRXakgeqb_XYchkntq{mrqPppoonmmlkjjhhgfed^}ȳ|qZsnRINKJHFDCB@><:86420.,*'%# "%'+.158<@EIOU\gz{mndbaaglmsyqoqqnmtssr qppoonmlkjjihf>]g~ilzHPPQOLLJIGDCB@><:86420.,)'%"  #%),/269>BGLRXcmmjk bhgejnqwunkvwvuutNsrrqqponmlljihgfgb`t{zu|wD]HPPMKJHGECB@><:86420.+)'$" #&*-047;@DIOU^hedm d#hnquvvqnxwQvvuutssrqqoonmlkjihgfea`tuwwxwtENؤMNRMLJHFECA?=;:8642/-+)&$!!$'+.159=BFLRZek jheelqsvwytr{zyRxxwwvvutsrrpponmlkjighb;mwtutuqH;UJQMLJIGECA@><97531/-+(%# "%),/37;?DIOVammhj jiiotvxyzxv|{RzzyyxxwvvutssqpponmkjhkD-_vqrqsoE1nHQNLJHGECA?=<97531.,*(%"  #'*-159=AGLS^ggelnnlrvxz{|~}||{{zzyxwvvutsrqponmkoU10Itmo4mWQSwMPNLJIGECA?=;97520.+)&$""%(+/27;?DJPZdb`i mvtpuyz|}~~~}||{zzyxwwvutsrqpnpf3.1Lkflj`_\Q-ZeRQONLJHFDCA?=:96420-+(&#! #&)-159=BGNWaYVgnZPrx{}~R~~}|{{zyxxvuutrqqo>4Nbkhghijg`_]^\ZVRTRPOMKIHGDBA><:8641/-*(%" !$).259=@EKS^eplluz}~P~}||{zyxwvutrtaSlqnkjigfgeba_^\ZYXUTRQOMLJHFDB@><98531.,)'$!"$ $)1=EIP[jjbsppw||uqryQ~}|{{yyxwvusrvqnmlkjiecddb`_][[YXVTRQOMKIHEDA?>;97520.+(&##@k^<9INYdd`hltssyyha^]\\^gw~}|{zyxwvutrqponmlkgaeecba_]\[YWVTRQNMKIGECA?=;9642/-*'&o޽j=NWaa^v\8zww{|o`]_^][XV_y}||{yyxvutsrponmlkYchedb`_]\[YWVSQPNMJIGECA><:8631.,+^?V]][hisuvo``__]\[ZYYXTRl~}|{zyxwuutrqpnlm`eifecba_]\[XVUSRPNLJHFDB@><9752/.-aL_[Yjdmef]^a^\[ZYXWVUUWQ\~}|zzywvutrqponnkjhfecb`^][ZXVUSQONLJGFCA?=;9632,' I]XWٽ\R[]YXWVUUTRTWQMy>~}|{zywvutrqpomlkiggecb`_][ZXVTSQOMKIGECA><:86,!'cMFUWؘYPZWUUTSQPQRSQIq~}||zywvvtsrqonmkihgecb`^]\ZWVTRPNMKIFDB@>;:-!#)>2SV}JTURRPPOOQONOBm}|{zyxvutrrponljihfecb`_\ZYXUTRPNLJGFDA?=- $$(@5TXSMSPONMLNNMLL=l~||{yxwvtrqpomkjigfec`_^\[XWUSQOMKIGEBB1 $$%&)GE\ ]GQMLKJKJGLNEq~}|zyxwuusqpomljhgecba_][ZXVTRQOMJHFE7')'&*b`gt`lBOJJHKXVUTQNEz~}|{zxvutrqpnmkjigfdba^][YXUTRPNLII='++--/ `guUi?LGGEZ^YUSPLI~}|zzxwvtsqpomljhgeca`^\[YWUSQOMLD**,--2$]kt^g<;7McXF<;0[~}|zywvtsqonlligfdca_][YYA275-,?ݍdr,*,+'*E+<::4;BA><;4}}|{zxwutrqpnljigeda`^\[TDGH9O^»Mb#875443,"An192-(,:B?<.B~|{yxwvsqpnmljhfeca_]\JFDA06421X013(*]7-+*+)'/:40#s}|zywvtsrpnlkihedb`_XF4M'521100//./-',*N)(($03/&;~}|{yxvtrponljigecabDJhw W*3100//.-,,**)(''&%03-+r@~|{yxvutrpomkjgfddNfťE,10//.V-,+**))('&&%$02,* :~}{zxvtsqpnljigea✟Տ6.0/. -,++**)(''&%$.1+('v>~}{zxwutrqomkji^٬؏,0/..--,+**)(''&&%K$"+1+(&H~|{yxvusrpnlkk_ؽǴԐ7,/--,+**)(('&&%L$##"'0*&#"}|zywvtrqomlewɻ}Α;*.,+**))('&&%$#I!$.)&""e~}{zxwusqpno`̸}w}ʑ N%-+**)(''&%$#"!F+)%! 9~|{ywutrqomjͭlrvz~Ò j ,*)(''&&%$#""!G ')$  }{zxvusrpnlϔ`mosw{ +)('&&%$#""!H !(# q~|zyxvtrqomp[ehlptx|$(''&%#""!I $$ O~}{zxvusqooAګNZ\aeimruz~;"'&%$#""! E!$5~|{ywvtrpohgFRUZ^bgkosw{n&%%$#""!  !=~|{zxvtrpjks>vADINRW[_dhlptx|E&$#""! G !!!}~~}|zxwurqru;)0,8=AFKOTX]aeimruy} ;#"#""!  !""$$ $ovu&~|{yxusru\43,,/4:>CHLQVZ^bfjoswz~$ !"!  !"#$%&&#$i5usy~tjr}|yxvtrwA:4.+,16<@EINRW[_dhlptwr|ፚ %  ! K !""$%&&''((Y\PzwtWTYp~{zxvtt#PHB=72,*.49=BGKOTX]aeimxTpn  K !""#$%&''((),"SSG|wpRn~}zxwvj\WRLF@;50++05;?DHMQUZ^bgbh||"I !"#$%&&''())*,#Tl6M{wpTu~}{ywvohb[UOID>93-*,27M! $))(**+,--.//10-~{zxvqxrkd^XSMD<<6971KN# !""%,,*+,-../010.r~{zwutm|tmieYL74558.J4$"#$#$,1.,-.01.,>r}{ywuspm~o[Je<@@;%!%$$%=+5731/+>c~|{yvtrpmf{bN5?NAEE:$%%&'('(3==Bt.~|zxvsqolja`gfaXK?M46BC%('(()*)+>~{ywurpmjgfb\VRLHFQGMMA"$+))+y+~|zxusqnkhea\XTPNTK8>G-+*1j&}{xvsqolhd`\WQQVPJKLV),+2,}{xvtqnjgc_ZKAYUPRTN^ +~|zxurolieaXaebYTTVS+-~~{ywuromieWL\va\VVZV-'!+ zr~}|yxvsplVsrjtyhb_#] wyyunkhb_f}{zxusqoxmt8mk@ $*MNNNNNNM*$ "NհN" KՒK AArrcc!!izwfJ'ޘL/HP{"bBbWbkbdQU1?\+xԯ-$ΖڊZk~Žq%c ӷMށ-tԪf·5iѬfrrDD MM$$UU((LLNNdҬa.oԩ}-sӨ൸| fԭص|mӸԳ}>Əܲa{ҞƼN"ñLB(]aliaU]$G3Mf>;qiD jf٤ -ʲoku·U@:ĵ(NN{е:ݿ-tڼ\*÷C`ѸV *O/t.I*;ߚG_/q4, }4 {F6J _I7En1J'B:[ 'Rx\#0CR9s%=a`z@Q4ĸ~I#QE_{nz銕6^4UNVT&gmob:s DUp/FLrF55&IB_ɚMP!] m1e8f;L&>ںDLt|ٿJP?Q <H]/l%T9r"OpM𿵊OTWhva8:,1CEQܣg F|^i񧼫f>aVip{]d" <_p]2D(EV:)c'ۦ} XZ~)N;xdwGQQ#Z__`y4G8•4 [EFJKH| z˘_EdgYGh F2?KQbn8T??»orHR֤m"j{@ψ=nK: KeETjLFV'`V9JnxϝMWdWى@{A/XFյʪ18}QP/ŷ;P7+H0(L1c>oN}/T.\+x)ǀQG (mnE‡ԅWmh桔bS]?]Ys{ ٖMWZ=g2d '4m M&{hIou6cb}Qf1CM5 nBaKc)ZP8%e:h ?p[z|rDC8Aڍ^^=FiAډލƿ9ޯuq0lӄL7],-q4pN{kF3N*cAbƃ ^@3L'S>C8)@f刉uRlAA̠{qB1DVzÛY=LS"ׁӟ8H~[[XQڪW=Eͨ?w䗊1bX*09XR§:~uhlQcgJer|إi*Y+IC:M%U Mu}-jydHO(#:.V2mzD#m_U@SL .|F䷖H.W(L0{@p~H2~ڈdN>w#fO#ļ@I"m2hf"*\2En]tkK9%󱞓3GG?=`0Vh^k 0&ϮrXa [pѩlzS򐟉{^L^)A_IV-Ӕ <Ү>xpXŭ1|Mpn{r ?0NCnAK{$VF2 "ء}hI?ʾ+q\ڎ9@"clŜNC9~-H~b* :ެg bR"돵M󠵛ôs5}IR Ϯ#u). ]+:hQ̬lE yC~J!'rgohmjg$d"w8E"}^y͜r?-/C1B% O<ɘ׻ 5X<0:剎7/I_k9?GSqy:"+4Y}^FE qBs$diRdދ> M4ch˔)0TC.y9E&b<ޜ})(JpJI?JbUuUwުZMCP)mH+W;|5ƖHZ+Y7Зb!*L82t,6yYrAɇuЧ3@jF(Q\h߿n1bSEr2\-_3b3V^8[ظRe(S,÷o XwS1Y:JBKGy 2jr 0U^*`M)H26'Χb]=TAç6:}a m7^p[__?7?k5=L/+x!J?tcfWjN_B F=:"s{Mn0bDsS= x]+wMgDZO˞I_ꍔܰ(Qr閬ϵMsP嵰/}9^b?!g!5UsGnҹyU:p꩘^|es'?"䜩zyz@ax}j:4/,dҀ0]8_4/m\{=?2iYLs w~h|i:@$شfc.Ԉ3K)*n8(mv[';)Q~8kk,Y{F BSٻk稬SX)@ߴusx)Ŀ]&+}Fw1jJ./˾rt%5~g (inԛvԾXfUc7>F@~@z l5{b0\b&¹.4yl!ߙ~i.6`V7-_`sY#UB3֮4Qb+ݱ.CCntWʆq딆M=k 3fԁIٞ biP@1v {t QuX~rBy_ QHU.(ۤa5T9/Zn9 rݛ.P׋vs ut, 0dYfm n< F otfG>XlߏbfL xw>$7{,Bv_K3~9}%By# 0|X# K S,B"do<*bd獃 36D=1n (5î #C"ؐHtgằo@mjguéGq3L!o4$.2oM%F4.Fcm@\DHSӊsS6IX?<"&kpR}+ ɑ{}7|p \ ÉC IdDNW$CᢏĜ5F%h@zLNFoֵ T_jӽZ_ H=-FY#_+ _v:@ӯ{/"N2MZBt ~Y:K1tjlBʹ4+&e[|AR [CIf^67%#6v^T scI۟x7oVM9B鐠v_slӤ- =v8 E㈓4rzNc,䤘Ds"5z6Py x'\M+هe]դΧb]=TAU|N;n7 uGiw2 ˁȓJHE:U^S kVU:q5g(*f[pȱo#-#>=dEJ &yKSOIQ(&x(A@ߺ*%\ }ہ>+ADnTxߨTcgR.#_>;+CAkI1zO-M?ύio){J') ci0^#sd& /|& ExfUͺzt "3@ko%gXYlטWjeх"PVeQp.T0u6tS;iG;49SE*X.џ&o'dCTQb AF^rKAͧ##Om˚9ʐc\%{wĿ]&+}Fw1jJ./˾ί[NhKREפc`fjCH@9- ΀7XZɮY= ́|"+Ic=A-kk#L'@M+ 5VYȝWwQR]ic^7<);?ٞ8PSA>{dzVbB [ Gg{r|r<"tRo;GD^+ ?XK}@CU `W$^"w3էC59 'U#:/atOV#$x`Ze)|(2#O kgl,dR\-T$ YWڵ,6Tt41"em a8sNI؈[̞ASB 39Ie~gP]6bl$w/uئLA@g_,^q([JV7d'LH)y/2p(&=<)xA7kOU\E[u6`(;n?|cc~r|h'˗k6`$OPb9>ep˨}>[yL3ʮ~yyTEQ@PCԏٌp_@W-aĢDP"HE!q$,b4n{@1-r4X L0.+c-*SFAjr[0;Z=RbKV]J҆;x%UДjb-43:Nt ԵHU.p8M}KvT"H*.+Z7/dbN#ٯ~9 |j:"5YGa15ѧW̃ "TNU,Ӏi&Xq3ys@b4,nE-YF!7rYL6='n*0V!s@~œdimg%!TAƵo0Ց 8=94Ŀ]&+}Fw1jJ./˿5xYs"8[Вg@G^S߱D|w49wMN<1Wgѵ%!r0HVO!~LW&/Ax)R^dT^H|9z/TOҴI[ @?qU"M  F%tŰRlda=Ư2L'luEaq 13:c|rUg@9p&SvWJPOY*m6Ρa՜f/?!Etma!։\)JBWR1#>BpGm #R t+mJ`aE7+jĠI`i$TmJz3z9!R1lQ(Bb??b|vQFCi!zH#E\e qeV*76jzW"%1klvK.ex7 E}H>ԍ'Şev<;Rfʕ"kх ,@zs]p*r`t?0fku~v^gn>ٙuM,L|XF/t/J;nX0|_B@Llۓ;.ϋ{H1Sb|_ܻH}Pb,Fm5wM^MxKIKN^K$Q}#d"[L #8B^tm\ETxR`ҁN jW"r [X~y$ݶir>t]dɏSd7u-t֖HS=t鶪̓j?ʯ]+C20kl>ޢY,0*5H 'jpj{C ZOE~hH[Au"KO-s -|S +!jVUTC*aK>膧7iq采AV՗ Z3|LQE }TdeMuiT6lr_:/f8Uh :!.w9fk;bi8EGf`,͚?KܺetkjB9/^EM*EJ@GsZ@[Jm0VT= -Νi +Mjh7/W; V!2{PPߕ'460ADrC 'hUĿqeJClW4&f[fPk|ݘMl'!:q~rҴ-\l ҂KQ>ɛ'|~d~SՠM> )اtvyC`-t̟W+J#Y姦=eBd :@eFg&~z|:yr\H BAAeKi] JLGK[YUCBF[$vm*, "JM҄ayEIBbL{Yq}=J^}jޚBÙc%57IҸap]S^F?ش, [pZpmbЗ^KN>TpWT/? *D' HDͨh ?9.n)JG>ǯ~W2? hiY0AFvF^W"=laRD^-W7j,MP+mqE(Q n܆>BB*!Hc2Tw 'fO^]FXDچ)wf-UWf:`+!FIag$iRD|}2yF}\m:\;La*dǒrQ *to({~Hʨ"Ee.Bq~۰66iʼ\$%~d@P;G wP[wMdc.)zU0Btڋ/O.8 Fz'4t\':SlJ:OM\hQ4ȗFq=*նHY{QSvҊ8{$&-XI}s5gq,6> ibʬ278g"m.!*-d=|4hA}mQg蟚TzӢ"TGVJHXKObR4z 6|es %=d@\8&-ylͨu'_6MH iC O_fTrP?:WH2rؖ!=CHsR϶p0Z_,Q5 JU/zJmLAEpFQuU2)'AqѰ{K^`Bh %!4JA3s*e|ɀKAw=-z=o%G2i[ٳ Ff']~up;BTX0F4p {F2f觎#I>) =#tMz|0 6NaF;٫ ےJ?۞ ޤAh>'SmcڬV<릎Q+f*v؅\nBo@z\ ģM?]Է۫΋ șBa@<|6ۚ*bL8maNG"{+Vu7K#bӝAN?9yZξ ؛{l6*Q[d5ްsb]ʂ uqIb,a2_8užukw(j ߓW)Å2{4N -N*w/0t)m wUb1/Sd5&p smRrz*̚yI>#@Pi7tlà_֡Ytx~wz2zbr\m{O/šj ^4[TDJޑ>@{[{S rFX3߀9[2[d,p2qVݩ]ArQ @> ?5iN@Ta1ܑk*Uc;s^ۯP˰!2cC}6 icӨN:-p_P|mdEZ+˕OI׻6G`:89kL.0M~V;oO ۥ6"h%M>Dő$tX+\_,>1E|[j/sdg 7 $`ʟ %JA+vUrdG'o2nJ\Y_З7(ֈܮS&52wVPh~or 3WSmlXѱ.5.Za޴b15>TֽG=TnӚ >x98ݢvYcYm#bM5Aw6tNb`J9_ƌP K:'~lT6G.HpȚ̝EFjٚFLښDah"xp3 VFE ޮj/ں&c^NshZiʅ}&i ?+h`jdF&u aBbU!/(hNNu.LnlD@a "I#>GmJ'?T)HU>{eGHR%B8~T SZͧ 9x극ivQ,b+w[=7(`YX{tNռS8//JC3bcyv%.i٢JI>a9Ļ۹U3vfh3*W/"zX|>5j\Փ ]j5 Y`.DZB?zeQi"GֲPˁ̨e\Gsl m /)7%ŸyN9c7^'YZAmG=SKˢWy֐˗MstTY k3?QigWܿDHǕKCvGU}k,9!_e0>v +D0 Y;yǜ23i:V!5D3JY7Cz|nĆяȌSy\C#GDsKݿYq4q=D\^xR/Lq MI$m8>ޞ DpG|6ǖVv,8N@W|!pH\):*Fas]Ia{{WMwO9BVGkansB7Ņќ2Y@N Íj}˘Ӟ~z:yr\H BAAeKi] JL}76gC@mF-=!_xYbO{1)G(Lx` +ᦡ M 6o"qvLt,Q]+"1xt7X*@y! YgS2%݂ 5 T`;:Q{YM"}XՏШLM)\o0MXGp!=\Nk @5ďV#ǵl?rЗ5U;8!=mꑌ&^pNnŎ?/VЫ,! P~B @:ڝpc}wI ,'sLE(ߡ(Ӕxg |*{rTZo2ߡb><3˒#0S5C <2B1s-H(Lbrڗ~ev[Jmie7#W NV`u yw (ldIPyd_)+3tJ^<^dF~6 Ohpt|;ɤv^D<J !?iv[Ɛֿ)BMDŽ%]}ό:`N%ss((Eoz﫡2/NHM)r3PI@}Uw:q)N _׮dxsdW!:P!bp*_%ġ o_ ngrzrT3n @{\b5(ekVh[rЫzLYfB CSi4̴uDe.j_i] k:5%74MES\]>>/2Df~A/ptPx"[;"rNͼ X3KG˯gƪ#y$A%*2RXRMe=mJ'P ťӳ_8-H_W^0zX*G]?!fiRn4o[,‚UwK#I#Ľyٻjjx`#MouUڰ2%M`mot =|DT|;^6i+[s܌x2͗;L$5FO Q*QVgq")OgeRƪbƾ Pl*ь#!V8w{~L3B4gs+1ʑDp Y@ %I? 77y:ԛPIw̩1W>p5i|'DBhlz QOO7 A\K;[wwʇSnjK;&؈Zq@X5f֏ 55J:kށ0moNjj<׈ŧZ[+AO_*Eޮ;VT=p9}AxU4 ڡRU2K7.5ldE}`m/85P'oz"(FbOl\OHÑDňۥ EbΛCpJiP}NT)vpQ)t?蔏ƺvrkʀFxo.h(N[)N(sV1 ,M,FZ_W${fPYuF , ZrzdQ;7ɠv/ {b\1(/@~2zujbRdҿáD4QEZ/ݩi0%ӢW})rlzwrHȬ%xjyDpk+ay W}5&;lI 5l0{!ly{~[wDJBٮfwz`f]s!ڪ@>3_m4ץ-HbFu c%MnU R ;ZP'9TG)L,_sV$@Hj@%G揢/yAo`,_D58|DpV9 ~8@{?jx d@gy3{\2 @ʒ90-M\v0=wӳ̔ QGUvjsW'ɹʬhke`Q?G$1#;^\;nEnAj>j`-L>OV+ҧmoכu>lM*? p+9٫r/CK`bϨAdLf (.YMb/MTfnL X_PcyW_{SZ2`IOoNDZ݁-ܭmnKi_ J)^*2fá%]bylVSSE HX?@ktE˱'3^S!2@??q*&͠K-F(ӻφ"-Ե]<=^4q- ^;4zB[X+iѐ()J'wJzfffq(t2a-R4J慊;x$6ٱT' /C r1Og/&z9iyn*+JLꎤgG@F`qs̉{Bv~e=핒'7 \B&:)kZƷz k3e*e|tDž%Ƹo8r8КZĸr=oNѓعAo%Hb:"W:~zD0;y/okіn.ȡ?ҠxSFn)?'/B:|-Guw\n>V89o`ak"j*4zx9ؒ3jsƩEM[VHJȞb_nyʆZRN;9TԠpP+KG/> y~x7qW2`i@X)&t KƭD)ӷ _*[ !^5A3B EKgIďi܆0 ډ*[m$fYg$oCNyaYafk[ p<'vM2{#ƣho-8V,%^{fN26[ma:mm'"? ,[nIY|,C:Px}D{a]n֐xSsBAc WS&j2A˩Yd]*wmhOcC`i(5bҟl#Z"K%7r|sR3S|ߴ5OvKO9u98c bD~͸22 zTo+]`a>ŴzJO}r)yC1Pn^%s:~!drQ?y4h1Mɨ-X"GRW>x?gR(J"E =ikՐ Dž yodž,ƾS!P NW}Qʻ'ɵnc '[!FD~::aY|t;,un%dP(w6̪p~}!زZ@O0. %m 0VKk"<{ϻ)ZG6F5H(N`V8Œ|EfԈ@:s`Z i] -DtyD-?3+/S;hh_@^Ka0J[{i([[`"u>vG5uCk!>ڄOxm 3>BiF. PbQ>VqG-FMIoZ q=z2j-I¤*.st+l\k#xIXq. EvL}|GYiCTKÜQvѣ I)iC]LIK1ڬ̏.FP@3o)j-]`!4{xa5jo z73|^[Nܙ/Us \k^l]7*tߚ׮ mݐr,vb|輿 WJ(.vȆSY =@Mk>nW*B4r-L*.f(۴&@߱04)zmXqǃʅ[?1*Pި{o7ER*V:+劙N;=f9{&Wʂ`wS1B+28bX =s&beF(j+/gDhн)vU 拷nA= iЎϘ6N/%4洧8`~ҺLDqJPXlGz=#~5 X jIs0m*tdn6MݸD{V~ | l#ꥬg=sQQ}]ұ9!Nn\6& Y0=9#ȶJ~M ǩ%SazSc6X )#鮂/ɗvzżS)0uE H0l˅>R$+wEگ T> csuV{!-gX*sHC8~u3G Y6خi24 Զ#;p%)d!29L57FHVql|/~(݊`D )>hSP)䃶MAU^Jd_Ȯ}ʹXOlB'3Wru: @ sg)K^HOtVgX$_w0Ǯ?BW͠~߯#UCP$%0$;HEa|BCW1]ꦹVjh#ay@Eq8N]U6,dR+XQǂ2fץA'IE3Ç x +2sȼƵN cg-]~"1`i{mM!)m3k(3|?.r!^ +54/y"ڵDOa$Csl|hC=;:fW)k퍲)*EѯG^_/X|uJd"FwPQ]顎F723qT0jg2tE4(`,o8ig4;_O8@|"SY?%5r%Lfo!U.W=SZ.ێV׼Hd7ob⪠hEoV3znm3@=`4/ <%`9֦'!Hw fDi_ې;CLSاA!ʠfK%(_:ٴkH_%\1_ O?sd/EU/P#XŮ&m@m|SHIŝ?gؚQZfNvEXFa); |M&4_*.jg j~ Fn3Aag.aVl}esxhTOMhM4[ψPU tQ+H'L}H쵡lA"HBU3-}bSo:ٕXF H?#J|Gf ;,L!One$ITe)=[q 9U9_4 dCPq"I>9|\E>I\5iyILFJgF}jE## V}ޠ4="y-Udv*Y& sx){rwl+?`鳂"W-Dh2ԐE~pxt 9-5̒s%,E)R啀,pOOS/~B8tP3u vjM0<'Ou6q˔)N WVbC$qtDy8IDOwc8z),2s*i_ZiYB/tgt;!NHL_RڜV'˓'2:y*~f0*@!_\j?R$*RK[M"*~d[䬔d?Ƴ΀=GNZ-}%h-D+(/q'%ao—us<]+ڈCXURFU`Й"P/spAV'Qt+ DG%jD]lߍ`eIni aI:Ev!+LfFIvjz`])5 g`AW1MbD3֢Dڎ6vNdhbQA7f<! e=K ?r:6Nx(z62fH2=4k=b}7?e]Wa<C_aAwR p5 YO17Uhx33{}idDN Ym;<3|ah(s,8΢Ixp̲*pȚ56)XJ#_]ajDޣH(EGl5;i5`cK "xLG:M3$PRXW]광u"BPɭfd[r -z޵9kN3%Ed^q.6qQ9_|o 1HN9(jׂͫwBT`< z8Lp17;{Oaɴ>8Ѿ~+g&\pr[ѣ5#0o0>t 90r;utP,%&%Xϗ8)ScwF ]ӌn* Kݙٚ,蚈鋂PuϨVMDM4&\Yk1O;жRTD"hn;]{̉ Ë5CBuۥ䙩h>jh\,4P4ğ}kD(5Z{L2糖v < B2U*eG [m;8"s|ɍ t :ӭE%żk{J/ #QtQ.]~Q^ބ`EE)=c]<[[ l C}!>X @w=+ʙ#&:͒y7op8W{D Ys_yt˗) EQy$:7%/8K9lPeE~`&ʬ~shp HW$h☧'l'NzϑcgF|(}[v;d|,YG)&MXiADQ=ޥBéTᶳ2_ۤ:WB8cZP/UP2i6y)gR~ ~M3Vd6j1+̧:5i<ŲJ"`@0CRK($$ٽsȯg g"288'D74Xmz鵓Q?Z#P!P#aqB%NUVnbuݦ]{\7]y쁐މY#P~88y<=dJZGL%m6nK@DVKݤ:[;3h_í?Y_ó3`lhWĚ_G7Q_}GAtG[}1z2t#b5o~5g1E!'=0'K7{$ /5~yJw6`auv28R7tϬRŒG1ʶ.HK6bIwv h ^2ǤHKanU0՘vlZTP6b6dkVmi?9k _ZBݫ=w'D3s92>wmXmI`;FC\@aܹA=ƺrQ -C,\ni7SN&'D!9=H>(Vsz.&!8 .<rҐ[{-lF&/)e6ܰ8⸦0A7{Yjq(둿/{>mw+B, =~TkN=-X(a) H e\c4 _D8\C2go~Hۃ}uLEd;lem,>"1S޽3>.iORɉXqʀi =* &Z qϷ^P=z"zE}̠{35Wx` K$q/iv@r°!i-7:Y+~|oY%-R,!W+10R N9`nk bzD[ .6ƊlL `^] , 7֫ ='RvC]֡c5jfFO:ufLb ca7 >W$HinܰD*6!)5+:"u$dPes!aʶbn#Rl{(9p*??yo;K#cJǎHw@o, ]ֺץe8Ѿ̕mYƹ K+R֝IX4\)-7:*\/QȗO (?kRY>u3}OBZ<yB(LJ;h4||X X!9 n],nՆFcgB] t߾=e#qNtBA*_1L˻LCƐ֣-Ui^8YK'ӫLeBx#ǢZ4+놰Xi e"IVU.,&-%ydQp5x41dm㜣z~ dqtµl`̼.4[8fJtRm=w|Z]& )v^sg/?" lz9Oj0Q}"fld:Bg¸=5;|X|5w4Z|e97TI$0LqАړcRHGydd\.:>p&:(TJQV.F>jIޓ7J:;%z ۻluϠx'Tz "m-m #j(N>B|ξ u@U" 5@Hj!fpy'2N/V6c=5Vp'I|O2P@)TPO#eakԪdt/p;g YL$(\ Ab[W[1}}`]pTh&HРumB9gҟ̦a-ebȹ@bp#.TǍsoMƾP1&.Ww-`y|czn7T5pLz ԉjN[3g;vC4AIi"AKAiTpj#Z)`zt4JKR`&? 8uL B4go+]񱈬51zyQ˰_cTm.i?|)).5SaBϼlmLG]ĵ'w}:SWhtV )}d:TaǼC0*l+[վE= &(ٿǺԱŭUN/t>Hʇ)[gZoRFJ7IX#$h}ߘBXΣ:-\~;]|˜kt)uX۫P2״R8g]!tEZ}q[6,׳hi8*{Źbշ%r.q 懡uM0ZPN9u.;Q/1N ~k`ʝ/X;hqo|cf`Ib!)rQL<Z3Հ>G-n>#NrwYs*m \H*&L'q aޱmS +AׯprCƖΖS>F蘰 jZG^@{[C2aҾ;♧^\,n wO`K9TtnuۄhnKͷq3I4tP}7G d*٨YM*ΖM;;ۈnOI׉=Dd\c{Q?*jHQ!oP\"R:u3Ww< /0`9MV&`F"CE"sV+_gSt* t愠~*&\z*EJci$#W)6MMf"e>(z0Ǔ4>G5M{.F7^f{F=Up,@Tc)Y!I%+8盒`CxiVoh)oAz8Fh uzbE\ aʒR3'jF`\BatLIyށwc8R5|ɓGʻDqu$=$wO5[2MƔ Rm rv$b-:[i8m8nOݜ E;2?w;+7O ?fa Ohdـ)ēʸv߱4\SXCՁb:0[ &:V (ousi,JG*9Ň"aFp5ᮦΈU:f16rw2D~l%G)+l+MɇA2Zy%@N65L,HqwZ8_c]6?<!{.fP/i ,]Г| Ą@qZ6f4;HQ{ŽxLQ5Aլr-UG &+γwriمD~٬kEƩFD~usC(ҟѪC((`4iYХlPKqh1♘}=Q*_mEp]ߏ:$=а`x}䴼(r5E\-ԭwΪ?*ݭP~83Q7VZ2B՝_E q};(5pkUze`Wwi-?J0N[rcJ-=rɓNe:Q ۉ~FHѵ?B2 E]b?E[u`a̕3Rk mX0ʤarˊ&",7X_ʗiiZa8,<%H3c<%(|/1t` 3 LnqqʜoxrIޢt &:-swP`<~w`lngZp;i#Xe! ?`޾Fkd3lJovB jtژ7OꀛtF*2|71]jF0 Xx@>X:~&= c!{r){?]גOrU)vY2|>҄C,ύ MSN_,"1'uxmR7 EpD8<,K71dL@:Bd-O݈!Dzq2u(O FfGx/'ox䆸,N<<%O% MP~L%:FjqS(8hcm+2#Ar*e"QAi$ؤx1S%I}OZ%IiRf'\G{-t ŜY._dnr ځ?E[ oZ\tƒS%}B#ũWG& yJ++Fc2FU[Ѥ*3x.jޓ4,>43M~hpH@B7[~!mA)lʯ 3g${.#IޑkgLf&ύՔJq}&GN^JOg߷SҨ|*;Ocu7_ԭ9UR M >vLtVm* s ]yb&ELlZdZg\|u'-mUT?J|fG3/μf~|G}JLwR@|;`B(Ob?#m 8Qח鼽2xM bI򆳔aTyu$W$XoƊifS Y (uk0XxboN9k/ETu33a@WU ?y@YMm:+c`i MI_-t+K@>&hc!|~Bw^Eh賉G93p3&$U캱䣶@)t"]6@,#BQrCZh"ԊT=v u¾CJ\ט4jM)<8H.qj4z7- UzhÓ q!dž|Vù S0.l-HPEu-sz[v B%Vo-K3)NxpOW^-pPޙZDQa70h5zef2%؛jv@jrJb@u Y o|?z8mW(/QqrSc8N[Э8̃Y_03OGyxpʷ4/oܿ{?͂A,Io{!J`*F֧),Ć+oc3Mc7Y]͝2C:^+\́Z4,XLcĞm /K/JI.XAE]}{IO 5X1հE]*71DI_[~a&`nEmJ~q3L -ym᰿#s{Ƞߠ%oX ڳk^mm-pZgmcx8*73D9r=GA-~B{A}`1]kt%F.N)? V[va^PñY1…aC^;Zn0{A9ˆR2cKh&;H-1r˖8a;moI LJKc?jd̈YinlpJه{ Ԙ}wŎ hCAKL[xi㲟34BT`4|͵rr,=2nKjk t.;dHfpDI6uǣ[(D j 9fӃE>;>_UCkJ>*pXqgMeq(7e+̀U0i^40zh33ؔ cJ9V ĊNi<^4|=GίK]b_ѥ"og5q pH[;16oP&.m._aV2n;4ic!l6>0b\~Ւc x;ԶpE%>e@ Kd!`yསnUT~maçNhQFDH(Iglai1W| /09:/=7 Ww^ө\-̣vw^(|b/=6tR&P0 ?Lȼ`Ǽ5Mmr+Ah 3e;v+ 5n!v]gE?hCxKSetv p @{C;b۽Φvk2Y0)ͣ#>{.[GCx xGl91ԭ=ll䑉Bml9-,="NroX)jc%؋r-w]WAs`bgsFJByxyl:;ڻ*r9K/D[͵co<*(`S(g,o mPE4_@|3|:^aǗfE2A4viݫnli٠d\[P_yyZe\ c++VٗIh4K4D^H?)mBKO"7.ɐVm̋uɼAIj߶ݡ;;M} {&'sѦg9ц;Ccc*m7A EubTl{h7l#imEazrZMw&_zr`+R?Q2MOĆ/x2^f 2-\` > ptc4D^c&l#kr1k LBt(Iffr f)  4/Iz@0!] R,o;:h{:Nd__`%ͦxtQ:@[}}Cld_÷pò?ח/u4F/aE%v Hͤdǿ{x[`iր)-6UTJD~;VG0YJR>iQF֩| S=xfue5*6dFd/iV%'FFC`\4XG<TE*.ԁ>J\Hli8>qPb +zHS qڱ{N9|Zݭ8=C}"J93+.jB?CjvO[D'2l 0QhUk\voZz`Ӡl72# x)d$EFmeT]VHIkd!1_b-f]шSN °1I'(Vͷcg dqjG${ƤT׆vfNvVQY;#jj\jPTc Ru-`sp4`}#?؂c-|͗GB{78$=ձ.@0ȏ%O }]e37ڀ͉La $"ItwkCDXq Eh*?G*]V- ftjH MK#M>k8E;L zYB zob\773/JH͒|/LAr(Ǣv-?6ʱ%2H6U:/̱<"GIB*l'Jw'`h7;#M0أ#w,WdO/Z锥s~x'+S_s܆W*>9idj&i#X؝ΩuGlvZ]p>0zB-o,PfӝVlO:ae+Gj}HN䚛wӰѽ%=MF*3}]:h!;DW&F,u±}" \R~&=7m&[km]M Z֟?b t5/XljĮcN7g5yOVé[ܡ\ַiJqWbv=U%$Yp@x[!\lZOtX4fv-:Gu\@1iƯnY\L&zQ?g3O} d)ON2QaӍ CB))R]&ΰ*z$&W>)#~+E?19+l"g2),0؍L\L3(~:#iLa$zd6~bA+qEK,pwS]E^4-$zU+ǿ7~QZÍG|8_Sk26 ihA@A4x&NkqM?y0gZ{`-W ,:u͞icݸ @)qtl6X\(a(/dD}ȬNX y&uтKtUU;Y"mhNxlr榹]SZTQpˍ;luwC6;\ZUu*\/QȗO (?kRY>u3}OBZ<y𿊴)FFW K%/`OI W徢Uߵໝ}~Ă8)YX0kυ\|b:੝6u3GjT0$b Kv׹j=|`؍5p.hPC홼iG?k.l-E8APA?fޜ[kʈ@7O\_`G޸@lԢrg5*:GX\(EA"y& ut q;Ǹgyņy;m^}pW9~op<ϡ'P]L9p7q,l|ZD8O9 7dzA -qyBŤ]d N%wMJ|HE0Q={`(f[]-,g-VA:&LCd*>qB^|NG=Q*t7pspA_Cn*&oӒ`YcY^[Q6Xj\WZf:A6XƦ`''α_"Qюx9;zS d68ɞ=k'H9= ډ r$3p\B$@~.@rM1ۿ)k-GvX4@oFٮvl{ p׾?xk3F|EGnQ & R}^dx uOXǚu5Űr%s$i3|3Xo%C¨>= z(&!G7̽sP\/TSozIenJE%4k~Ӏ@G\հ5# M _x$4V~g[`[\2mr"rC$X<ݢrmVˌ_&D}ӭm6Vt%mWӡyat;Ok?gGӄdP徭;qUIw註M6!mƊyڀ Xv@!6Q(om2ɱiU9Fm1xOE鈬:?YGdb:PQ/mnxTy@"G? { ],=ݬҮo7jP)I| !g)4 (MUJή(V܉0^P[̼WtJ'trYa=@NߩD z N!&9_~a0ME.k$tk-0pԧ_gjs1%Cu˫8+5 FC86|(mu}Vۜa @|0LͭQižєD;Q]hC}asv#X׿V"c[]JDw Z4U9vp@(z,m|UAAY9MV&ErK'g iߍA 6K0/tz ?f_u4$ _`YZ)c`vkIdOg2lp;6S>CB,c py$3;&#IU<\b+G= ~=Z -v`PMld=D#,v9n`%GG {"Ko [J l8ZXYr;DE`7ZsPNzID^}T(SOMS]O)YNnW(RpRoyݢFFY"PYnUV',EA@J [2|?=6fG/P@Ya1.}\=ڗ3{^&2oشᙂ)!1KLX%2rDzceh,Ћ:1: ɁԞ v(/0EIZ?o^voe7_Wnh)gT×V~2B_7u/g^/:"jRuɷWG BB5!g]JE 1m6)'n˃&34:_k4Imo%Ϋ[\4P.&ݐk462F}"G]cU| b!ӁaEG󈧍@W7kx)6[u/ CFs6t]q~.Xu(K5F/[1jan.8zW ?L|F=cbp$#08T>,3EݭP~83R"lN0)\'x/+lj'_b=69b'2 ~|f o'0C -mxeav9vHZyYi]'zv`u ~ {\|%L3ܘWx -g`oAL`RU^ndîPC5| ‚M(//-mKDPZU ӶoÄX<׻aRe}MO.uTCRJ}`Ff<,7"OڒA@3}zwܛQ'A5|kB Ԡ,5{J-ừZKDâB) !39XN]2 e^49ۈ:{ϳfQ@h%Hjk1>sឝ0{pŸ 0"W@_5..Y3s& DW&kodwg{G ,&Zm`F%QtC)BO_vc7k<:'6W?B@oqou |yA R?m] W#J@tFJ=)j)83ڹ_MH% |̢DWhlPcinJmaD2.(KJPA0l.a&عT(b)ngZp;i#Xe! ?`޾Fe5充E5D(&E(!Ә o0]yQr~zMTG蠌`]}40A. *b.6 -e6^)sa6k_,.Og8Q{O\MD]w|6J\3_E lЮ"tnƱPPzI˜\˚-*omDhR_6зz~rL~ xO+#{8޽Tt\"uk5 g *S3]K͠M;d |}¹I})xWs:]ćy*4ZBdEU8EDau.eT̈wuXA1?;> 5 ccs?^ 7oȓڃzk ڙ&8Fn7 - i\g1ta:ǃ{#1|w 2p`# 53)]퇾Y,% FM>&5}[;CBr /9,0çΜR9w1wgÚ"Ss΅ tqV9h{2B_44lG3u';ߦߊ=F0& GWc5D ޞn` Tx ^jE:{MW%B_1QJ &oz55by ׸)&GEs{K{ MIDe'%] XJ= ܓr5z{ i,>.'[_(t0%#c3dw] 8QחJ%䛴~0YK#1kGj.& -Dd|%RK2u*lB#uw9ޅx-=Հ(5q_9wIWu塽g&]5R 4ZOWr<>z@=U³[^> iR*T>y/P̪YPjpsou xp^VPIczRQ"@tn2+h9{{H*l!bk3eX*!o+!g'.iaZI~g^Ή|w seE(KtG*((i ԮqYԬXJVnuLPwːQm3DF !$ZFINRdVC¦aڄG&s)aw9a5&ο;] sYЁvNPhº Rdm>Nz!PĹ4ڋyMo` ԫrt˓Fޔ AdabTn'L"\;jͼYMQM 健3 e#]XT%IBY%w椹woj ;Z^0 H+~C3pZ6rn@"/[r zo-crFX)f}Ȧ~>QE 4Ҍ!<nΝv+rs@DGJs Zw]L;ns[ԝ yaO5jfd OL=ڳhp; Chy$XN Q@=p~yBLj궯+_kz7@&曓ٻ-tK_rI'PL iM2f $Fg/@Nn~CUPy<qT$26F5?A?CWY?KMJAyv+W(")]l{јlAYEn,F0$f4E$ PY[m>pnG:2n %%i؄'{t @Jc*$swElfڋHNSс{Xy;{/*O؛\Ns$ Y 7bwm"[-K3)Ne+ }4̣h8M&~q IYͱ 2࿵/Q%k$QP:]`jɯm-Uj qlA9.aJ9aYjS@qWm-s ޫuL5RC*zvvn"/WMR\?..u-mD\Tr&0ჷ0jI3Kn_.*[I]|7?ؠջ`x̔~3O3ݣ>oÎUtʭq;9nC) !/*Q+n"F,2jKwY#/бiql2^ppVy : 1:ӻMdgG4XbSPDR_)appL`ɬrJ5;4ǶTC G+'CU{H\'^V5PBd搜3_hyo@<#GS$ !j{I+yэ36@Rw'¦N(~H6)]Ԋuya2jq~ <fYV"i $8 //XvoέY۲1DSmX8?q ""^c%H;ttO3}̋ۡOF6n|&3kG3NQ8 ֹ6mu;d]y?;nWCRiPܱ ْzo]f^Cr _2>+|yt+sѪ%^7Y AGpFP=b }1հE]*71DI_[~a&`nEmJ~q3L -ym᰿#s{Ƞߠ%x,w+#zJ_^@&Bd;-}j&DԯhsD242 aVOA i@|S'd+Y~zEvvaE?h=h:QU[HTͬ* ^ح(\d m_i9X*N?Guy9st CS6!TS=~HD-*ٓHyۺ+Y=Fvs/*%/~^߂Gk4Z` w\wP4}q7P|ȃ`i6ʁ ze2CɎ@u4ȍ&0u̜=2 M@_&))Oc<KE+=x?4@~u(ﺡ"<&4&Nv."/iNex|cݕl~9n{Pyx'1K.͒4w 1cJ;LjW!Dki`T]/]V PR (:b28=I'Skde xWy52YDZ?du!Cjd$d`ET>uCyH"\$' 7nch?E`X"~.b UXs9TZf}r6vw0 T5Ldpx-.-E"vqKE9 .$s7 \N"niT1y7gz˪Hkռ{-ݭo@cĖ)#XɳwvR&^b l $Ƈ&iCoTf)~7-PGIjMTDd'ЮWfxQD-j =K#,h0}}}+6c +]TT|ϫ٠mSw'TWxWt#>G a#km| y6%,n)PQ9df@Jnz$Ϩj& JjϧP7-Z`dqgeK+O>uUy 'A68e[҇LƄg4eDgw_.dХ -5/ 6p%8pecHi}{Cwñ\ϯ?ݷ3F ŔBlG S¼ :qfdn= =mC{V K.²kq %3D[XC,r,:{u(!QOVɋ2n[w9ǿH]Jϴ8 r [OmkjsAZH bMdV9?`1E|1 CQ'AID%,J!\7tTnق96DÛwӃ-h=c EUD9 Z^LL@gG7C)k]JR^-вY.xF Ȍ4`[,Q$$ʴ@y#)N-NU8,uPD+,sA' hvwFF{rvL/]Ppْ ʪ]Y,:W{Y!4κrQ-Q +YJcW1醐gZ|<#Yxz .1uٲQ堡CQ^uļ'BFKM^5ɪg(QWb츌4 5y3x9O/u> sÀ,ƠHZԨU!#G5tS a{?Vb+s !"z Rhj9F7,ʰ0[XjElPt{/xJЌ9IԜ ]&4!ޢԢ6P|kAc5"`_n|&V,qQJ'~ua[ o`Mԝ'Mm_%&vWvO|뮤\d;Z}ЭΐdK]>6GM;sΉ4ѯ%:QIhLҕɒ ;!>Ϛ ꈩe瀏8]1("xz]krKgՊZ.ѩ޶q 7Zy$*MPAe15)#nzPxߕ?zt JA5aW/iHDW'a].I䅽M]R5'`+ZWD~$x\LrƉ7#O՚kK|b\e,۟P;=2 d^];D(4BVG4kǶG =mG,Kb@J%PMsbٌ/|2qnrs\JzK]6K_W-R4ie iXn%YsWH"+Iq ,NyL:l .+k̃lIXܠLnS ʢo# o%\i鈖lt>&tikaYPlӖ, Sma1cԬf{>"dL T{Qǥ0oXu}uЗ&EOIߣ]4HFʔcy~EB1}sy⒮m)dd*\/QȗO (?kRY>u[:vY3&I}W LX:jA̱ЎD%KkJm֖aײ{KU4&$x͛\K>sgC4&P_2J&F#Cz=cXj7w>i1.;W*nmgCFBƪ0`A=ڼ_\:tk zcE?V<2p4$qmbb}`Cd}e@w̅7} |P11j.u OpG' -̼pB7ESn5̆?y.ih @!me7iÑ#sDH.7xrr*ѾVk[BE{(I`uס-y@ h!OgGxӚD_h&(]a+B6вz3{WSBLO~)<>@,>xٖԁ 2"F|Q|i s<,rʑNCɅ"HV-4^Weݬ{;BZ%3c Y 5R{^u>2/l0VWz9l?W/rn=W9߿=hR(ܨLQ[*N!¯-+C7~/(}'mg/U\=[2E@"WO۾cbs#$Dx-r6&Ƞ\x$n*ٱJɰ=&kÍꐆhj-ֳ9$BQZ삠9l(BB_;r&Ag`+͓zeXz[NO10}Gu0㳤c~(F6'2ML3ięEI:q($_jU } 20SòIL3dvP,Vm`wdG6 Aʆ+Z 9͐L;U!R -Ȍ"/J )yݳVUD]Dgf5ϖa-!݁Tx֒^I(L0G`m9 8[U/ W-Wt8\ LtVCyAPw) >ůx%ضPK*rXCBtL#gT9)Lڬ`뾡N7VSmQ%%f6.qzm}H+{ڶ=]*F 0tdZ+[>/[47n!(RRw7[vn}̈́A{\*f-x-WS ة A)eE\5`MwI3eѕ\c@6Wbzf0W|q\s+2&A &ѹHEYTv2_7#tΞTu#=1ZcC? k%T-Um[gdwqu:sBA[BnZgdܰ"g8I֍b@jd;m~QȲYY輨jǴ{"8Ű8 :$o3|S1.N}}KɅ$&PDxD;ηKXӭ  z)}eQ5T͋r\Iު]$>&ը؉T):h@1:HȖ/ryw8"=v*'F獡>6~vz169=/7!$DPQ΢j GiMZ݁-g眡w MWZRѠ^z#d$ N&c9ag3ʠ8xD(sz}M `@@H?c $A:RZ YU|_ Eϲ%9<[X_Ĩ4R1ϓX}$*JuQZfGAhVq/LLx1J#>s +0eo" _mV*݈% .Lu_pSԗ%v"F7o;:4ÝW <]p!d+N˪J!avͣ}Rñ{K hE? +`.<ҮDp'bw3.,x|9鄂"F[ ~$V )of?1t]/"\ sq;(g0تEC&=vf>Go"s}"k^G#UxnOnh5M,uۑ37-9["d2qR%IBL7f'1V̌d CPܧh{&y띤X2$ ${ ,ݎġAp&k{Y E=Z>FrPB6K|GH<%~TdG޹Y,~?I*T;̮yը>$z}ⲍrO\T3 #=4JfǝH>XֻH]L'ZOv)s$+pQ-ႉg(DZ5+:[x1OUT ?ڝUTF-U? 8Q)umUrI%h|3 +7 (O[9An5S.1y+.$~E^W~z ?6T>viZ`XQ5 :ӳ(jbOGCrq MKK\YA:c| _.^x.j Y筧uK(|561y Ȟ˖ܽoc/7~] Z,ddz'RIϽrUgx^ˆy*W!;> T~ H&0sô4o99=`wc0ң#46z"J*$}1q2^ x*KkN-. %X*e[i(ag?ٰ u/{GqËM (!d+_V'}ʔ}vςU,oO^aNELy-0u,b>{?F)ѯqC@rSB*4O}G=#x*tUHCa7i^zZ1.=#B2afiN~Dָ 9 V%=GtF"x*Ggʉt1|!/rč!D*Ge_6-'6 \L9)kpu!p *ߓf^1b#:SrE?0$kM0cB)2&ã+j˶Bxo;] ^;q'&.> c=,p{|SGmBF-I&6]_(+ >Y!Rr[N4k~ =)#<Zy%N_T/[ZIV[_~"S:~p\ + Gzu AL0?V\\`PL*:L9mLu> t=N 09pm ‰""a Al-O=3R"21Qs6Z%ݴb(L禼NW-W$R (E᯦ Э¦fiɫL%ΐi F%Hxp|mOi@I"D(l A/ ~}FGIr/3!x> ne7UY`.(a5'1_vV,Ua6tODy[P,ye*|8P.[fbsR=4 儜HIUF5PFupVWz&@cx%P X_J5PVnœ`[*b@pIͣ) l? Ѳ=}u*NDsPy"s lBRO*t}^t`DtVsd C}t7-ulf$Hϩ;/=9Е;`^_JUml ||(9R-Rߙ폑1R}`_%c.[v__o)utyp[J8O$diw1't>1<yq ]?{MY(6eLQ(U\5e|ɼ"?ji'"AC=P9$6q-%eسYd4a;4Ut@[^c3JѠA]$J7p9z]5} I _f`whY9T e8 iOx]gbo%C*$I_JM|t%]{ gFCʮ}6&Ҳr'u?&q\or1JEu>\޵IG#gyL PZ!pˤqg /s Ybbk^{e=]ZSw%:}2˳qʘ2uB}lw"=^7}oYbI9b,>L!vEK)m|M~*[Q-?騒,*'! A/4֛߅]o@E9ZT'EnU>z毓l`$%zxT!xU71հE]*71DI_[~a&`nEmJ~q3L/pǝ=l}KYG>vE90͈ c+ H(˵[K q1w(;.J PҺJexPuX?,D"\?.]"Y#$ӖLSt( _vٶO鯘6 R-߭Ù0v2;ZV;% Ѿi05}oy"Dʐ ;|c?] F l^&HI((x~Mqwi|T7mh)Xc<̜69x4}^ɫ"M#esI ]/`!9.!%!nt @)uIp'@cj:=;MsqQJ8_ aL6TnTZB4y=moupۛPNAnNc2g Vn72ȅi5 |}BKEΖ%Np-dө|p>:T.MS zSFWFmݺµwtN%.4W]rrQ1VKb#pu' Mkgg*]lhphJNRɇ{K!?aeQ*p{NE0"ylYw }t Ƅ1;?{ >ϭҫnֳAϣH=#= Vi׋ ݪބ\1u{zaba ͬŏ.(&n -T5؍\rJe-I!tL9a\ıW%KЛvV+\eIǜͺyq<p#>e,1B3] Ners{h:?C d7ɱGCɥ"7ADY[mkk,lE2fe#v-tU @m-=w՛vi(sj;{xk9f0QWA/]-Nٱ跏s[70v(x@[WQ!P vzz𪁫huWo BĹ)Ծ JCB%/Afa?h?>I'+Q$UCpltu_cX*֢j_uf\@N4p,䗤XssB: Wn*[meG4 q#:C :u' _ ef˗q?0vUs3nYׅ!$ŨQ71;$5𡫍Ӥ;W9ƣ_yx\y>x|t]$ҜO`mASNQ,O=)mnSM8|iX SMqSڜ "VGRat궕[\Q6 >Nza.?גB.[㽎01#UlV_9u?? n֬`ڑ_bI#d3(A"/oJ2dV+x-J4u=3qC#%M>ma;#XeKNVZ! ko.KM^u?'؏͘m5 EJ+- N\ Kq]#Z c;[gK e}?H|W!@'ǺjÁ,:$#*fnMvժ-VqMN!|NgZJyer :xט~d,ʾ_0jUE, l$(Nx2QXO8.u[ Zy-8>r2T/5ۣ mN]hXtla?d@$qp"-QE]zw)wtߒopTm |/ ?*{Kq '&_AO2%eK[$cd0 -E'9vgy%7ve u9ǚ 33=>@W\z˔S2qHߗ1* C1ޗ]I)P`K\y]lf0cܮ#}umJˢmMPHْD?QD92pq?Hzt~݁bjDŽXW_f }y:DY6lpamc8*4#v #>mlzT%Ŕ.310 v;DIq^ K;'uÎoh@`H'-r?::KP:WN%ᖕZRNzg*fܾOCNNu\B8#A廝 lyrPΐkNfVp5k`iK/tiR ZBWl$Mp1 Q.2iG0o1&7x?bBJ_S#ag⚑qG uN0=UO2d[+!mHTsA?ILE f2\-S=m/%fTsS[ܓm6^Hd%UҩWQ \&MCQďό;PSֲk17j6nGr4vuAt)"\?,߳mM > v;* :eç Tr:*gxayl$5yC[qPl .gUJnf(8!~)LMnfO],{ a+v" 1LR@)Ճ8z`/,,f){G ̇f=sЎaДrs n&lŻ& 3)85wΡ8_"ᤀJ*!DyUR>_φVީv5@ڵlSi&,1|h (L&.6aN-t(-jѣ'8V a -fڃ@ESDI>#G͒4 G AЎg`˸{H}N Gml$U.`Bmu)A $;+\v'tA5p:tP=Eg!]wf;*~&v ‹?ABFJx12?68dP4U.9e re@N=^;ޡHL ;!'i0X/9LG/OCZG(\Fnb88f#kJD'Gou"R˓ [5(&z' $C9>2Y) udK8 YDk!{g:'(h3Wo~X%>b&C +IWg/&U{UqCV_A'Ai3XL |#A]h4CEFqҞ;DnƇʖ}`OAd7Z#En]5‡GPT56HKC+kLMlȺoeq׋nf3)hI"Nhcz#k$ˀJO/In|›0+`v9 ̧!a`":3mSvՙAR&*o#BҎ׭N=dE 39Jm7HGiLsOZAL8Fk3ŤP J YZTJB wo." . !^w>ӧ?ɺfŷyE隟uʊYwXR'}3)4w 2=BJ񎙐^tM=SEq@L*}u|k5}IP%V +נ|x?|Ӑ_HL,_S |n u)gg4lSԟN6-_ɂP,ȫ0I.Xt}V 2M ҈E @1Cj6uIAcT"aMખ)Lׅ (lL(WX !lR z;ӹB2'A.jrT{%\i6Y=mu*9xdԣ9nvV:b .631# 8σ}mdA2MA,ǚ5]K>%U8-%;]cѩ{AcR]&XOn8\\u4A:Ҕa"55 vcLzkp/ۑY! FO\¶b:VH\C0OԠ 0&_tú*\V / я=$՛_^-$mS2#Uxc)-pGm}u#IP*X(›A^%;9/RK_-u+^P4c cuHRy\IR GZ4 NMG0;bpZ"tSi)GӪ hsnr mic09?J jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2d#Creator: JasPer Version 1.900.1R \@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP > ߅PIck$P֒/#)AUep"J^AoDj]H(*ZڸZyCXHuw`+ә۝ i q7rUo ;Umjpc(=9y՟9,/d ď$Nu@D&LaݼjҘ& /|cT c]g&_Dv{Jqބ1Exf:N佗KE[߅PIck$eO+ħWvc q *@\A_j- Co:g? w SWuUC /@n B)ȵKZ[j",o')!|h#TLn;Ӫ >X9.u:,~O\zݲ?FVrP[4vQ5:+Gn!Sy(7, )0Ep"Lf[mH ?&d9bm7t.1=*MXj:HY>W7^S쫣P2V֊H273^~i BuX /i,Zgg]|Wx@Xe9byN\V_”BH&~~;AݼR&^k;J "-v߅PJƀӦs$V;R\[0a^hlRPc_$_ -ރ#hdB<{>6z3gռW%࿕2Rj'xX0&K4+LQf4qPLD?(r#[k玈QduXF9j aOU[7EDI@fjʌ+D*V~̢rnGΚG|O2 ¨Q?:$U%# ce6Cg]eS@ ؕuFIQN.Mo8+7+eytoqAdO *=SUh$f罢r>K7[BTd7okؽ3? HӪo$(8 f@\]m_?H -(']geRԮ=Dz&q8=]?DxWrI_oBS B>gGgC6>5h@7P. $M_(eIĂb+w H˪!Yn;1),3x [G 1^W^hpf ﵘ`s^ٖYY'dṄ_sBxM@\]ޛ6X4F+ ͐۝ ^ܣHWQd p]-f 1h 5s"HK'&}&ޔqL04Ҥ<2 G浣0zw­W?:$LWJ\^1F`|x5"0¡14G8WC.=ƙDG8$A$1 Vy˓aͶF.BSpQ:aLa%"4,}NW3'e Wl%k&iUPǞJ*$!Q ?It|]7Zx?0c#-Pe9%QHƞ%|OscE0G0}m͢ r|INImHtO]q RrD$ɪg[ǽ[$W(d.Q/[WtPPsh<ڴT^qJtw󰤇{bs@^hphkcz-؆Up(9&?@^-L,gKTcwnTԀn:/f[5tg( {պ(_CwwXݜq16?p'/I2B(@[Z]F7?qER4J#zZU]´e?:=[OnZ %z&y|@ ﵱẻ~8 γeaXcnJUG Ų?&6*K}]H}/^؝O)U3R,-zcTP8gaHM5{H.ZgϿC ċ8&mDyqɟ?It|]7!|geor3cV-C[sP޷eS_( D 1ˉ}K㙉c?^h?h`X|U`?Pީ5"qVLpK=2$ ¢luKoR}#\)x!eBRȨ:*s%9vIR.UMϽxud-8}ⳡeT0q]XH%|V/Qo~ug\=;bA !nI`Y̌eS}4xz:XOo_kDUjfY`4#F|wk(kM*}Igў^n VtMU*9rzA$AT}kr.C:LWÂIS4d&.r @Cنt!JO5F4QEXȄͲco|* }홄&k]]?A08^\#-VĹ@Ӓki*@AKU$$|w*r#<;`KֱyȒ`b>rh@;> ` dӇQ++I©9z-: ;ޚ) [ßI#WZ#BKy8keN֧5 ty8nvVgf.saU  Lgm4hI?9%^t8챦ǫfq8a`c7cv=I`XHgqgnh\3E-ZӱGǸy,GNS[ ZD6م] ?JN+cFnTOh _"Pxe-tk5VܗlIF4_+n+UW 2' +>j1XϵTx4yg{ #1asX1t%zdT\vD&ǢHD,}Ә̔L}׃C7'w +nI#;ȑ 3_\ RE ^D~Z)]# U_6r?,/qtqXܝ{^IȂqohhQ^HJ;O"N ~bxY\Ed-;J.ZvrRy]˒w)} ~sxd!E7/êej x&Y6_l6|ik"?vgR6I<ģT&^mK+=rCU#I/vi{Wt@=<"n"UKmIQN:߬DzqgHw?'g?TSUt#,Eohj lq! R)I_fRfة;UB~{P˾PHv @:)lF]㙒1-Fc* 3 DR.#4&'h%oEx"g xiLX8X Bp^G0C7Z +SI- ,W$eD,n} }zgI/Քseu_FD-Uj{5)w6 ِ[9ҫ%?itnoI;v %XNNA=b,c'5W^`wʾ'] F=Yj>4 ,5jF-/#ћ#̒`UT BڻkwXhҕ7 r- io4$Ucԇ%fke2^SǵB?84(-i [/9)4@B̈́TdTiIWT/vļh>3gŋmg 謉4s~| vSf}-HJJf]~}RANP]U=Qu_9J'u lt s0]o ?20iV7z Z'PYlɄoBru1nQǮDǂj` ryֽ̟ Fj 19+20}jJ-e[khAga8Qubr\uȾZX e)\M"Gpo3tcʳ/0~7x'ốo䋗DAUDlpJʆJ;=Fܕgsh> ZpZ޲m> Dfr;O{h.:-o ?x .D%~2d*KM*)m. lH5]O_:M`B1{,nO(Ttp\^K~Xl fee"?`J1lxJ>Lk [k}j\>6W}sZDD:KEqx-F1o9NDv8GD}}EfI^kKlF\{K ~gw^~g%?NAL;i]eX1HonZ#)Lz ;nYAa?P7wSw!Y_-"o9^UuEI~e(*Еq翔]«,t};a5"-;;DٿSTBOgi1j(9u.JvbT u;TKJr{՝wS}v d,[׈)P>3;L8*u@oN*.td%IYl[CS&*JI{ެ) =q2u&*QrX:L$еeO\aBeb!amZA",h<{d,ڇֈiaYtW]aW{&JB9]+Ճ] b@ _ :ds !0> ` EW}01*/$|b-3407{YIXH4]T 4vJY~0*D S0VN{&Y, n _I@_dnV"26Y.W~?* |vyJI&t\ʣ# )\| u! $ 1^1RLYJQ 6[7~X;+, (K{/tft_<~DdWksS MWN~qR8Izf1uy+-qv?ТWyt"{Ct{ rFOCY*'2,쐄  -Q X5ܓEHi7&?WfՖAZߨW2!"3l'[, =4`ն uq,ගw. ]~P\.PXvܘBkᦋv $82 1#=hTT>;5j+4X{ڜOErdi"a6ޝ_73)ܟO8uxA= #+;qz+%>,'9a9H*Z>0(bU]@i. w$ %ez_liw043o%ϸ3eB[X1CUtH܍zkcN݀GRT;M 6R  uXZsf:Me[ V}1_SۡAIOް‚e *GVvMw)y"Iŷ@b$8Y'H+/jY|޼PhC5rc>&*?J۬qҦ~BV#I \*]P(@`c|%΀}I2 Bx?h]A E$)SM]܍lX)o1dIuu0;õu^jԑO\nvYak!$&n:K㧤&'(Z.ЬF-O[A՝Iɞjʂ#ܡ%lYdkfWVhiס2BEǎ GnvD@+ EHڟ(܀HPcdAsi?*s|޽C]gJ XOݤ"@sbXzxG q3\(gSDTm~"< + E!Ut3Wi0Ɲ#mt@/CXt:rQE5tjO9C=` yW\V? dtl|H"Vѯ$@4m7-=jBzFZSxHPHZQ}Fg ݊ƴ:Sǧ+J_ AAPTZ@ ] {y{Y2OlR}-WOGZ-'Qsa@׳ngtvsEIBX S0£[ ԙ6yF^L? Mc;fTۺqpIQ*nv|5F~W1'Z>x54(13ofE}Cv38ńayxzfQ鮼uMLS JhpgW$dRV@&PӖTc׋%u6SABb`"gn,ؔPIbyԃYzv\ dPWpIlܑaLſҜ #Alhu}gwue;!7e(pE ɕ2Cօyj1ȣt4'qώTΔ%o \fWM}I2W_0pY RaIA1:\IOfáVǂQH(|@«tF)f."ۈN#Q~)(`2; , \dGL*@nK@|n(f¥CnIrC$k3l[6䃦N^>h's{ɮCץY m)35y  '3Fyx B$LRcZBY-`&VlDE<>b*&2_jI:>Ɵ3!W 6<CT>qaFvs׽bBND1=iB3_f4<7ϾûUk`ơ`%c8'p;em&|Q&v|2"0 T]puy nG@m,.&CcHA*s"z"RH"YZ[%i9xh!yڰjLuP=gkp"'_o'&9th=+eOesMy21U'>= ʹs5?-{̖%&[MW-Nm9 *jiQV8/(KՃ<)"[u QS(CuԩW-*ة0b Z[ID !5BA+=d g㠝MPz]4y+IќL̃-<@^O=!֍ZwL 431vRSI&Ze%٤݀Tg24E0;3Yڎ(uϏGm֑YRs2Tqxoe&i!o1f?[JR̦##Jk/8rDgnla)Xg ;i2u\d,R؁U@˜` wRk1wegU&wђ+QΨ_G5T,ٳw7qaP߅d"\\/.42ofPy"Su\>peIȵLVds3$*'60c? 9u<=c4`O14㸊ܭg3JW{V˰r򎹂}2af4kxǵYh7j#oĵncҏw ~! L6X%AVGK MUKl2p0!,&% Oi XNXv"c/gÆB["ך3 _7T B#I)~|eO^LZ5n.tn ^4睚jzgp |s;AQ(je-4V?U?8"40uQJjZb 4vgW)/g:hc0G఺uT5'T)(t&N2OR  ۧ1!<u]c0WjW}'%~Bm{_k,u.(rjk#{Qtxj,b)6;6u\G2v13ݜ}d͌W/GQf Bvl|a f2;'aa.ϝpϯv'jwI 6h4x@?`=Pțayu@U2K2>-ٛ(1]vz|MV$ǭIٌo}$-_x-MG)P&`dI٦A?dq CTjP{E>#.0wxyC.D(4?m9BNMYC xր(ȳ"C/;jo`d$ ]1:*pٹCO?@^5aہN.FOBO*cZ͔pqD~px? Z[ө9[ThW0dB~19zoArqu4(;hN pnː}ls)>)u,sab/:X4̞ vQYx6_ 6+ p).(X[l3{y$}TZrcES!UQ{~ W@ ~vDrgмwрN XCi)](Y }(nA(VFy M^fN\Ðul[3yW{!u6YFK;@qw/bň<ج3I]ก3؋*oʃ4_xG=Sn`gXьmlAE[T+j4ύ좜i iKy9&W2 $DNs"!:g:6{! ?w )b?|i'R(:ZPL LրzZ0< 78otM#}^y*L6(:Xѣ~Vx8uZ5X9Ϡh8pWFt94o=OvR kCHsw{U^&I 539]#[Y6,x՞sEb~3`&_ #c7SkPD9Q8اj-N xu_GO)?3IFb=jU.Z[&ޓ+a&I <f>Աeщ PmԲ ]Dtg \9_WdC- I5 b-J:!\ PPtC#5:ZO?\)f K[u2Ϥ?ogR7\lrDBEȷru+ތ: ?zDQs}'~sLUR#Ӕ~buUӧcԹ@u/v=ћSdc"!t7Kׁd&.a)In,w;;i,dLUU26 ٌSK2lA]$= ,}AutVI(aIREOX8sCH̘0JM/pd&7u/rtzwZM+^_׃9ynΒw;~u'+@SE(鈞~Gr"0ϡc&yZ`_ 431vR6р * R'Ӫ=UU6|Cт O2ȿ*y C⣕wڗN˫Ӛ?2+r`+Rp'Uß*^s ~?/|6$El]9PHM֠=\"),X)bubYh94];>i,hpH4A9uxUszDJ4lc!8yzg$u0tl^k]QR9 B<Á 2Q 42GOKkTU{Pr2Z'qn H-7ڲ_4@5$.Or&lè1Fs[%.,\nT1]+T/3H4hG0}?CVʐFfՆv ЉCDI1x&~sJBms'7o:k¬+5~-ٰWz-bOS3G|Vڑ::<u~ž*9V@ ~M$ֱK@aa!6VCZ/ ;I xd2_ JgRmU rj)i;{?ʨC?/tlOl~bB<\k|>,hPt'^m~EfsYPf7[؟9DwzwMni\u+Y&AXȃ!Yύb( rvXPNBVZbg/F YzU>yHF ;V8peIiYyVb!p-XZ(+H_CKI- H9'UKs3qAsx'Jhg%! MQ q1miC/2Ly 8p,߈*,Vu`(?}{Id *G-ixhMShim )=cZH|.z wbа!h1\ tCČ?&e( cj_h6d~,wVJ )Chtpkc1uRW'p$ F,,iyo]1A_yj;I$I,AψGsׇ"%Qsΐ")&.Ѽz*OBk\һt:1Tl`m #y2h: kh8_X$lqI#B H׶E ɦrus Z\JaJ@Sl َBOQ\MGW❒;+>8O>Co-T+!_F~y N ZA9 k7x 6)Lb wk'ԅƛ?=`b[S?f6xrkF !:Xm<>00˃nukQ3Y\R^#*HK1ZH]m<O˖3@]/xqQ+8*4/18u`z_5hPE\QU]4.:LIO`Ϊsm[bC9;(*Siڲ-!uizZ:zXkOtXHQM~f3fEڭE/?Oq fŋ!8^1K)$w0evII㟽zMaǖDpR-Eg@a$bl/(3o}͹,bF_2DkuYX脠e+: ^z 4/Z)%J3|e@WW ǯfoRZdPfg'4?ƫ"DA@U)lw]߻?=D {Ed;} ^ !:U[SaUXO-<6c5E }:meX'L7 C@C RU=$8Ѫr8R!|#~n{R%xznkh(if7=R6ev 7@^䘄B;⥕q/rbn'7J!{1 cN6._c+ &ؽ,h@LIo۾Ϻ,|!| SFnI%u {k_ :)fEaf6B?+>ڠ8v2C<~akf`rTMn7sh,EA f5=YЌ%tD[a]9.]zB6%7 /!& _ϋ{}A禔I9?\G"n:*o U'E:EF(O].Sxj#)`Eđ*A,u;$&uD }YfߋW]ҫ30%1 QɅZ'XR吧hv6ɖ!Bq~UUMٲ̮3$0WxB`A3jhB~׸ dƪ<`Cm}ZSqte k)r%˫ ?Dn-%} ;3D0\o"R~8bMڽ2 p(Fm¿+vrm]V7siDᦤU.HU\&) nGK {7MySh =zy8?=oJ64Aߵm0"2%aqD(FeYH* S@nQ5t V `չ5;X% ^J.q)TO$(?+'M6U5v}Ӻ5njl/ܘBx\$H8,S~Z~J ˙ oݿFfXuf/TgS&|s-;Oo:T跢0y1قp/WcÊVK{ n[ VV&)@!nwP,a qɽ&q(Yj4EP>9~Vv^ܢmFy8 }4wNRryu]i&B<'{|-'s#%{ x";47FsdQqMc8H@ Hm mqC\~]T30߾-oVXSkPg@cdVo>~GT@d(/ځ|:?OmUęOX6<;.bBiN4+<ݦa~`ə!wM"e%x]nZc% !mƓ9*&dyw-H8q+h(S; 攙1?ö9vm`FRA:eyK5=9,Sbo{fBnvFoD)*vGFŰ/y-?'וڂs*!N1 "W$bl%έO~c;@?1Fҝ<|S*(npxHfy1նS9Y&/Z=%62J/3 5_k*b;DlCzdAq3㤕l{Pf+ qXƆq_3F]i.-żCY(@G|R {p< ⭣NcAPqEfgWLkmKcxS r^QA@--w8ẰUaE,<ĩɀrG/x[rDy.Oka$iLHl bӰ@7+ks^{"<o4J" <fJC_tعm D8%[IzPނ&OML߷!BGw"?àirӑmsS``πτGwuRpbLv8˹` 2#G6Є&cZ eveBf< }/H܂U=FO!xzfnK#d+݃\w21%.͉LvJluR"0mҀ&{s~j!lT'X 3+J āRdƶ?СiJI:OR 3 ~C@F #}>%*kp 3G7"m?O9g JQ:6Xd5楬[ zӍ0"eK?ɏOd*Q13j7 }zu DRO_q[,^X"ڽp޻y'ghIJ[9d#W,F2ę};I :up 8ʼww%,bhUux[%}#^e;>ܮ["U]rfiÝ: `~ҠF/J[@omثˆ׶-hRǮ7~LP**8ljp_8yb brHMcRdJ:]}<,CJ hwt-?C8]|sj]7ꧽ^Îj :uJAVu$c0#_QQ{^Kqx&k|\eOD"Dž{x3jK~zP%g"x葕韞 4.g, K-(vޖElRVkrý;TJoEwNg Ov̘{޽y=LOPxU.k6éwWbY*Fl6 yj`Ҋ\-ee" /H#sZܽ9&"R},KjiQғ_w9d-hSOc)Fd}'PcP =p}K虞s8f߭+Mqݹ>˽G?>}"Y`R'r96ѻDv-f;ၾHt36ۭ+XƏi3l ώVǑytc'>М 1[3^O;S݄ [ӁaeǞkaq 45<X 'AWw7ۍ'6*riE_}l/l[aóOg zMW7  1^Fk}WňX6rsz taO'䘵k^P,Yl; BjOF?f=*"r>v,³x2-GcWTc`zfw`:%4zӢW}Ɋ"]{u=RvM?T,&堳.G B^`ɗij4P&J*QbapcCzM/q]MO$ҠN5`H, * & XaaYE%|w[hI@c`.O`A,h7eZafԘev樸1y,4?Z/,ό\XVf뭭*ksS ̶M /^3cEZo.^ũ{!,솯(b"H)eyS<>eT.4,#=L+Hd9#~4÷sXꋗhsI\Ln@K%d+xdc//`z^/DZS9煱R-튷NFi]"|eU5ۯbŠsr!^]Lu5|Z HQ ç>&=m?"pWɃn WjP~HBs/n)-үRVT3s|˲|]WG:GJX<Ϟ{YS`l)TP/pgDRW)Fq}h1qs!ݨJ8wIA=2k5O6 ul ( KhgƬ{`VA1x.~@ضA#㈳+ƒ˄IȷMda.C Eгjcu^߆eSʐ3+nPd*OŨ*O$qoF'v=,/w8ºx6Y4 z+IIvi329 DAҷM0T'~ԀQa̅585$UP3CxlP9j|b_*9p΋M̪rc2w,)t?DXc[$KбPC{+B &PZnOnD5O0A GzrYcȠ3%A(7 QUC`g雷E<ߍۂ\ȫ!?Y G)Iw^)joJ[Hy@,]`Lki j\谦yǻ;3[=XU4:+?m?wɌ&?Css㙥v*;P3M<-<{Q3(R#nj~s=B+R~40F.b4SY^oeBeʝ2~ 2I8G$Bw7d}pA2):mׇ!"( L9k?T 0xH hQ,\T޴hTKhr}i*LmĜ $Nb;I1 *ӌ:`ɤ2 n5ҳ]~;T^ .&]^Cmhmy&r;FM3E~ SM&Ty|}d6XQ;YZ(֐ZA%őW/&a:|eӯJOrԞ. I+}9MO 9m:,d43`[,z7kDb*2v&]. ^ >߭)lBbQ( Ѥ=&GyFaJYp{-D$,Id}6ҾҧZ*={^m,l+mvgبt%zNa{@-&^^m?76&[ZДaWu+ͧCmgcKBQ=!ڢQ*ɪu5Z;pp*p[4Ua^"NԉN76jHva~CGv 87XRZd7H/^zLҩ,)s*Y6%ɯAG[][jNm/#;@4@e3#˱4(a쀋 `$Q?V?3;]tq(zg>2jE0О|<Q1m"h&]聕e ߃$ P,t֦K@;hESQk'df G`|@+V<Јn0ӢLqaL:@mȻ`x# wU/5%3aĉuyO~; 0Ҹf'21Ɵ1I@zW`x_Ι\mm@3Ke;"7ZYCݑFA]7O "9l)[2lȤ gsa0E|9ƵSs?he ae`RI㓼Hr(IąaT^dJ_M DEaS_54'7)/Q!F "?x ,IԺ F345|[zuy|m#يcCj߉cRc<[^Akj()iD;\XcXw7b -$U7AY"W!vm{8ztO~Ks {á_I4 LwY>KZ.l1TW^`$$};ďcKåCᄒ@,ZNQ-0[ l? x*즌gRYG7!H#b6\[`w8`uL!F.9.O%S [l|vo{6#5Tŋ̡Sax\W I) ht8޲BD 5hVjkM;W1+P)(t8L B* Z :-DXq =RAuD8'xȥT(Jkmnkct!P _됔z^/ \3e?" FzIDCaLy;/&WoF~-:fA)HdF ;eePG*yTb%ECAS].$BZh ծtz;2>261a=Wewp*,"ZS O:U5?s_XbW^7:_A5$#|:dy?XFV ̿ }bЮ TFD~.R%XrϜe?B yQ~Х=5 xΊKDuD<Oe =}hlH'PK9f&)Dȸݱ<U; Af~wx,~3C8D> I 6K0GCrfɕrP'NӏW-q۾D1`u-a)pGa_ygLkI6暑u9|TvQC%;JgB!|Ĥiϒ!|/* TU)٦EˣPX"9D~O 49p4-.9%P7wzP1-W@p ?+AF%]pM5CKb-Lc'qShX/@E[֢~vAz|+9O%毟4I6W6ȸ{^Wu:;ʩ OyLbFc@::H\1($f$qs=@29Eu&du3(»_:^ݳ#w-'"nXhtAcȍd8OׄbGcI+/ٹ %?y#;GY(&ؼX|.ZR؞ނrGR6v0+MCUSDN͏JVRDbnZ<1ȝV`{YS?\Wf ~RPvLB _k`L"1]7Ŋ7&wBebDN80}JA$#P6^wE @N[ ntŶN^R.ie!ea#Cp8"tJ+|5_evs,2n݊4-5dOzc&鵺xua Mж& t4~>n#U.47f H}N1G.z>mWBf>bjLg%'f#R@tIsC»? ȃxf*[4zf ?>?1!p'GR \sYW`T! Cz}=WGdU66m'}S317l(.l}OO#bgp^jJS2wa~2SayO?MZ[F⩧ :) 2zU<,9@XJs?gd.=7B'sO{֤Hd+'qT>=E u|k H^\IkLg}x/?sq>ApVCIj[`T>;PM34hdAb6,&}߰tBػ'^b'^]F:ZT6{oHZ.xJU>jB6wu|{P][-:$Ɂ|%5 U'98l1'J4U5R;RޱuE]w(Z >pӹ+d}&^c3a{?@᳷ڶE|@@>C ާd3ct2y)14ʾ6cSSA,лx:/A)n>a B Z>%Y%)W\R_*-|ͳ kKtYU=)CQYγOK /H#$f/Wo@+oxd&qu5,3dZrr5GJ\6ˏџC'3&daͧw`qJ8rv>Ze")oO pOwT8 ̂S*RO=O3!DHj$B*)R"ڼ#:c$,"Es~2M):аY}-&u`fŬ}R9-Kcm^.q`rX]"6+SlSapx/1\n;zX ~p6/ZƐj/vK;x%X_LZL#j=,?^ሥ EMa,zB֟^NP_Y_1$de[+޼N`ZOWZ)*\p*ī34P䟳Jr f`\U4GEa94Uh6K3O r>b#%d Hq-q|r},$W#q!PԘ[=,mxv8RUeݾ܁3&mAV@n>쫇!0ƙ,g,Uί 5J:nb+0ֈ6h?&h%Lg3‰}tZ8ɩX_~fZ^ GtvwsBӳ ҵ#PH܃1D4jfH +V@H (}MK'aIDz]H4g,빧IܕWBSzT(ޒ/˦d{k+]1}oz&-"Ә>\/tASsWun)F& qOю(Դ[\2L"t "ۀY) Jhw+oYE.xD&B.NzB?8>n&ѝ`TZE|&#$OX5Zz@{^ *Y[2HPbjϡk?G mPvTl=7&2+(YJ.&[us!~IF/(z=?~*F̽x7p@XhӳŮ*0v ]Rߑg\~;#H|M&{ZR\3yUt_塙fک ~ .ʄEE9&%MӘ_D [BnF,FwrU?fD Gq3.H+$w14кl_J! y:يbfe')(" O*"Nфo[vxr~] J_&MSwC6aFmu|$5`Twyz柤>1dkM 6q7x Nl q:{L}*) hLe_rIt .ra+ :$:ABnÇK(8h3F a=Xtw'|.7ŕqqph ~DI5k;_hV%`l>j]5kqg%S^ 1%m )]M<Ȝ]~fV!N*#&ggxY3Nm-lk-4V\Z;]HrW7& JYTq`D U员ݍt˸{}M0[ c0vĵ~=: |zm}5wK@ :ntm-WWw < ܃1FvI\>»_\!.=U?9TWMfĘf>gGo(x-=Hz?J I1!\=?+$ʨNr)FOF ȼ1ҦB&ߟY9BN էCKf7CUB`'*-ȇFAys2'(j[O{KH̆M .nS$LU 2 H'}zؖͿcú?n?ô? ;?!$Ţo(?2`էA%BAW\Tt+`: WkAڭ樾2PSb} Ǟ,gd{ K1&_7] FSylw'38 Su X噚%_75&z u!Kq0R Qݣ"''&YGm[Kp˅1}KK UWGge0OJVi>z,͚5)VoD Yc>wA;Rb >wVgcYN9l-jeBYmR1 >\u1t)&Y,auVla;$cB=rKpSMrdf"S7XѱK`"dXqR7.ۛYN(+ygͪ|syE s6oU ;Sng' PkH@fuc9{^Ӊ"lyB^Z0%i^w~:dmjؒd9Ztvt Ϙ)! #{{5bgi )bFMDg2o DnQ z{C@,vW_ܜ1zTKzL">jqormJb3[:!SۖVSQ+츼8'KP;F9~zkħht`iXvm ;At&f0Ţ5=nGq֗V򜦃]sӓ{ʫ-Vp[H9x?}wy6d&Aӻ 2{"|.]"^~0fye!{lcuOU_:裋B$%wr]>8 sUo=J_0:.qdRA1G4|jM5A %Iίn75L䎉ate:b9|1VsO.S3O&S$o"pltiPRGYz)vC`(܅Ie ui"za)BljĈ\]0#/RTPC`ީI7k^-= .?^G#L>%5A ;v[[gZPޥFyoUf`o!ܰ˹,1^uk}6(gH\j,qળT 0xH hQ,\T޴hTKhr}i*M*)z2 JRF`p.գdlH,:%׊N3kf)$(yՖ«!e-xN'#=Ÿ)q)Đ$[Wo)0c*Jh3ي^`*NmEAYhz Ϝx/JldvHZ\ sn~bdJ'2 .NBCŃtU6ʔǵ;xzlῖ$fKifAM[pS[\_79oYBcK (.:7W.IMq1_e]\U0+ NAitm(2JCC Mn~6k{Yֿ ~b, Ƨ^MF.B iDc=y8{KZ<}i?9p#-~]/rqJ.M Yi".K V_^vI4A]6Bp]tQImc&>.&{B˦31v\%~UCNyD} oS d"|w{8 q uM3g @HGq j@9}C2׃҉w h1O N}E$a,ەi|W# wi\T4g8W%{Lsn&9FJ `>EhPI% &e p`Ñ:M@twNU2KӉD(ЯdPdǼ#-S +F32/N0Z6H#jݍ%-iW e` `偅EoA/ ,4QWrB!~FD[fٶl͓[y{Lb;(ZҍZ0y}בse@n;"7ZYCݑFA]7O9ALs|Y{=U- K3y> 7#HΤQpIn(qP5IXb v$&ڛАwJǥ Ԭ]<<gF>HYO;5ɽp1bd@ jYĔiC,sp6E\˚f I-Lfa,_I/"ϼhd[9ڀ U"Ю*o)VW!Q Y-q0m8y+>ֽg6lz,X샱}&w>[ɏm998%O&ypӮrg\C4֬`pK]i> |v b R_z$Zvڥ 7*o,]+5= , @smn͠BZgS~HúZ|OC}So1Q#"֣uT[^x:^R"L!̍eKAr|{L ,Z}YLOP@&5 ]4;,k,gr闋qjJEyziPXP/e"ƌm.rjD/^.&ض'~!!y!`f`eq^T-s5Yb1@7̲D~#^35PEəx i!~)3@F>((ըj΀ TT{t+V,) ^gneZLiY$vRZ,2M`>C4ZbE>d&1fFQz#ܸh'JB$֋-@vԭ(Bhtw%Ψ 0Oy'sFB<3Raj= 3Sp;kD8{˂/'b G,eD3j7߳ Gjբ2Ϋ2lCtl0o~{nU᫼ c= NKSR1֑PoY9<sȂHdI]Gb~=H2\V!vI, Blo}ҷI;8hbv*=g#‡x]-/ l/ݸcpȭ?`k(Asd3ͦ͝ ; _j?px1fNb$s@/GDC3|:A?[4KO$ 2 uYPՙt8O'h\UvM l1lpkt+,(InƉF$X`R&@-i1*@I tzv[ibm^Ƚ f;A?.{j :_yKB>@,k:!Șw4+ @&nfITd[Ј;1 9Xd}mWBf>ķ #8)ѫKۈqE [M&gR]%CNC|ma|Ůi->=M>%OuXBWĠ51cK-QUR3ŀ|_(M{ueLۥ޵hK$rOBFع+|&%dpTp%pbpU<Rj^qH&냻s*G^('f2nlW E2qeL8d cV VhGb;^ǟ]J޻FgzoD.jQbAm/uh8n5YL\baH:iTOqt+xX);WϫKb1!Zv^T!-<, :s<.Lp+[5BY)>-U 5Ȓ֍U%b }%A?YƋ`).az]1+ZfVA.PYs^AղʬȖ|yb 1Jij x"$0ak<^rcٔZ%< psZ-;Zqo#0g`^345e#7 ~ms,ݱV# ᗱ+: JA!T|e8^h D~%13shXR>D*P~ R&뿁ºC N0(WLc:S=lLyJ2cte#YijM=5\ Ȩ;BλeVDKiC;3Rۯ%Ф"lOu-5LKeB|em1a𩎙 *T-)EoTuh0egxJ"ņ'@qΩ7]9.@TK <6sttXfHp?6◢1JHަİV_W!J#Rz)i#8+߸r-SfO"^v{czke6E<FUhZ"E[$F[\O M'Io4pإ T;<(tx!sy<ಽf[V]RJ)V8sy^r`k̋Sw͒j1J#5!% L^D? ؝qojXhйidIZFwJO ;iϚϏ:dsu=5+`:ӫҡ,^j=8Nt%zR,nGtڍĥLDw2TY4Mk&])b"|A\f1?"jcn=A^4gG,bNrwxM+@2/%IAds M>XsYoժ y e"Z>}O~OQR@/k/q. QX*RpoW{ x8}pRa:[6KKa}R&ohashwq(Hҿȹr+-VD7yIV;4k>^ #| oUu{}'ʷr_3^K &PYK;7C2S+k#8UdQ,C;^AAd{pjs,j`ND 7}ԱX`'k/rƻm0߯6%*r+H{Ս~~݄Gz>]EhDsA*ֲ/vʐ̇*r Ti'R  ~+HcWľݽ]bU/㒐 ^?el86g kO)V܈8S`ubm~9,\4snIPZIk@0|:19W )rL)^Wx~}?5@=QA(F Ҩ=0c=Ȋ5tk5ݩ¤tA3|D0b"C5] {Cﭪ4DF#/ > ӘpU.o6`(R;>|IN::<}yD5-0boio4x{Ϭe+_O<+`;~Ǘ+n.,EYm=Py6$6+xͩ >Uxk!DNNbsspf+[ _KQC̼*uUkr݋ֶ:0i Hƪc;=K[䱁 I٧]a9 G#KQ&%7C y~diqwǯY?8j5 4u["2lP92m97$BBw~p@ݻG2q`Q*9#ax»r[:t9bH͞jj-䞙K3$AL H L0`6xqJLm7tLВd [4Qxݺ=ywBdkGTܕ-y{XsfsO*$p{vJm$=!Y[z{~">Ȅ;Ƞa}ٷRGQ!4U]1OHI̹[|EcG`_.w<+m yk~{^c{t3]z ؔ{Mdh] qU!;u4yx+B&a^𡑞 {Cl( _3 }[P';]A dYY@5!|+ pLNrj-}.*I$v)nfp(7(R<1;KHtGebKXەXTt]bgkq`x-ڢO\-0LRz(C[J F__@Ss6/ -RR1dx$l؈0cF36K3O r>b#%dZ듴?n8ז:\&$sV'Vӑ~KiHmV.W'{:VtwfA[ 2/{rffVR5APWFڥUˈlZ&wY ;(?ja)k/9 _Sw*8ԟ4Tv%m)ܺ[j1]L`R浗Hoc IQ4]X5 +۱tixp~@%8Knqz YuԮ̜9 PלE\ lm!Ci|gkRn(s{|s-Zqު\傼l4 HIF|_ƾQa3NcPw1Jrlj| QG!e~~)o@?g @7s5llcZ.*wEos&>CGu9&"7diRR:);l13qK N"h)n-UNc)zjy={?RQEio e~X17VK_y'wZ|1:[8ȷ?idSPds؟08\|n@>CCU'kϾP,za꣠Ȣ5ڒgCgM wܶCUHbNJȿ#Aeʼ9LF@yyw:B~~#ɪC~<m\$ VF<-,t2 NmAт&8d{%JE7١4&l# N!FV$Q~0i/jJ2FWm ~dU6a:r)m#`@A~IjCX{_2[չ(ȜyZbas 7(˴Л%nRK(R+Q`oDD{lJu屐A!v΅ "0#S">p}Q(SzBfu*cϘŤAVH/qn9z 3d%i$ UKC+;11`=n/z ׈}LS활sZ%+ReLTWv JjQ ;CUٵs(ҨlIJJe Qϴ{3_^[޹lL[&o14) >XL[jΈDޞ%B`}*&>:MΑ~XT>O 7 `ŌHzꗌmjNhyxFCy-ȗRWaPcg7ҙgc*CWⷔ1PmU"L'@f-`?Q1sq xʁCᐰJ8L/p0clKCSm=v ]%,KAg,JGZKW <(h>#?e5L츂 &h6/:4)Ξv+]^lQ]ӵ\,č5bWMQ4X35Tͩyή KUi*jgƠ4z Y?Z םy[2o.p Q=^sr,2W.y@w.B9-){F,Moc7uԘ:&bƳRB+eR۔RK0Zfr&DŽX//=rvPC+dfMC(zSmXqdJ7oasJv-& )q*wP+^S.p~<@sF9"2⊸F(ׯ&SxwnZ)lB![?% #7T*a6V\Lnbn\ tD Uۿ.UxgЋ*dJ*$w~UOFjJ^}#9J{oRtHȖ&9jޭw+)U`sZ k=o R`9.tDϦ=\nePjլ`^nz3Utj}jq-r"̠yp!'I0-hb^>B[A ׭ S]ecU7ܸgVvUSvAviR/z ='ѠXt@(\y׻HG# pox6e?~Ɣ~jz=^?ԤRpA~~faNeYvyu Z|plx%~#hYNtm8tU ݋fDAb擖/ʂ1MIR&qP(ҢfFzCK˛'D`~S{d_DSײbkT`)zBRڠ{j(^H}po.ጰj"k}GBbXO@j) >rjpp'JKގ__Cax0IMM*¢xeTWh0\f=1[EY3בPBnʑ[4CJ;AvTOP&_zל7 a2L:EhxuT 0qbgM:+_ ꋎ6q"3+ 'ز˙OZ>|z 'ױ\@G* 7CNZ!mPS0(3:c&'\afs)~h k$gp%!8eFkMm3!L/,e;"债DR8>IXA.i;.D['#+P,@tM\( x=ɮr`] Ԅɩ{lQ(k\ߥ!eKqIR>Ac3.t_璇t,1ܞLI> Ps^9d\-,U9 /FҜ#izJ#i\PHܫ_{p5 b7GnI,a-r ("lnD(+ -cA;ySz=JޕwWJfKPeC5gb)f6]|%Iw7*$/cЄ6=S${0 og(Jl)"@U7MT~N<{xZ<"2\.cdl&`ofBh 47VΛ*Cc;LiS$K@R$oͮb\CU+(MmTz ̽=Dkb+ ?>ywRsH.( lʷĆ 4Y#LcljmńeSBݤPlrXRVްw{2@ /# Dn*ϟ2 .}RG{j&A]y'0pKh ިt䞁zfr 'yAmԾ}WpQP] V>?e ЅnR-V°C3utV;rFT3!afٟIM$c+]S=9J]}t,gU~碱|g\x{z7 3"G6ƯHM5iGks ?FB5"!__4gXl𺴼(MnU=Ilz9)Frkw?S2,62ȊԽA>zVhU,(jyUs?];S\T ܣ >^'XM7+=\209W~%R@asO\Mj .N&#@ܭqwv( u0J?Qܿi8 \Ǻ6r@j`D::f p/ l硙ic]tسH('(bq~TzU%e(sg*xF'w繗mv>tj3WQ.g|+Ő26Ջ3Vup QTw_p }%Q)bʳOUa:4X$0HZ]2{'(Ri(Sx\#!]fh_]09Ed ݬְD`@*j:d]S* ?<YH.H(XDz pDA0XБ~(w1rœPڟtli=GOwqn\2 |P6s8J=pq*^=Ri͜\ze  t.&o1Q6Sgxb/t)Eo.{`>u;#V١2wd @rdɲzءt%#̕7XCk!f jE5|\$ы^dQu`9> һXjMpv> 溶#D<6vx}Î--e%5-_})&|)0g}Jf 2l2B q9>[WNv\);`@(He:R䦭E5[لe,BQvk ,8DʕA\⩐ׅNLܗ!vlOO怫{ws)_CQ+u#Aۮ˞H' 9e0]oFT l6{I"gqf H}N1G.z5ѡMd33-$[*5eT~F&+3N+-,+pTc#MCQ{8kXw*DdUŃ7^;¬\IF"I]Y)*葷OF=,W(b7rτ?>fr.(ُrn3a!?CN 'Uo;*>0Lu#b.^p/ZvԽ@ `AO9wxFe &Qt0}ue&l{6W6U+;0+5cU`N_BV ֿuz'\JVn;E~(^G {ϗ{|#:kM+NfOf+4 z0Xמ د *iH "jMM ] *~8' G˛ښQ jp'4^cB1$Z\DŁ~Xӈv"͸Y=T<8Z;8Cb[5cewoM`y41M V&fkc/})a^ *˧!wL4:NT~A8|:X.6YS3/>K= Sxnq)gJVʤ6(`308 UP` eLn@7E|^qsx*-b zRS?pdɭaΗԶ&M]J[|Y{ғw@턍)Rp~(<fnP*m̮~dރP/ow-;}EY֛9%|"¥Sٖ#;PQT3@1r+ on:@7eDfQu8]S]c9}<#l 8'E">o7 0J! Ql^ZS,ϮC߬xjFԸ9y@J@Fe./&75GomcbYej\S/N"ŋYV^QrAɬ[RptI=A"8}2#W<) 5GU:];.} F;r6+E^K#w<|5BxXes Vw0b>'_Hr_s\L¢Y\ jb%Һ󰕴馞D?(𖚰epG]iR0,3)-VJ0_ScڍZ\ 0x!u{{ODa㓹$Uji?lV~cT#*mN-AOk]դ!gfW}3=.'jJ,#oXIu1JOO$uC0Q"4ݲ0zliyDHcqYoi?WOpUPΚ;y#K%2Kme6(IKɊ%PI6׻Ac[ MV钕yNWx}uuf Sʜn{=6ku[*uA4^N o]FUu_ um槜GY;܀Y}-]yYM˳5b2S뛾沕#BuCMd-yRMrmm5]E5-d=O/yJ>)wj':&ʙmz9TTH6}=7l:^=i~A,oK> ]V̹ # ԳXbdUTcY6{)('([=-Y0C U3ޅ"X_H+-,H,Qyբy3*FIbz.ҹ.dtd ][6%cQJz0YZlePx$j.8Kr=i+bUc9gJqQ ]o<8E;Z \u9c-UQ=Ba[n2`ipo; 5Xa-0xR7AH%I_$ɺedBtP[6Dz,u]uE}E$5MQsdE*`p+^ڕuk? VG|kkFg)wvg4MێtFb4y?swxR#ā!1cYݮ9 ̬T@e t7m^gƳóԈ^ y&&5M8x|)~F1-j.zv@򵭚/Jziht!h_Ѧ8DF3|o_"f:2pכd5&_\ /GXTV9-2sc^0}TlCYhbPSO79.qAt=od.=9R *3w Qu>*6=|QoqUb0Ve`O]*3ѿF0CA͡ں9[i>Ua[Jj98ZB\Z`AB=M5[$6s6Ø;J0IǗ3w֝S<j}>%EH!I*h8[$J-dOޠQ9;24&o9qT.dI" 4焚Ƅ̋$7H>6Bұ$g:1N@6?Iwt ~Iг/RwحgΩGfH >2p/pRZSDJѦ?r$.Ķ:-aimV03+hw,aE*63ԓ= Nk_؎7Qcꗜ2!$j4cxPn.qn( .U͹r emG:7ΦA? :ba-䑑 `2e!TPVN4)|$ &ž$%#.zQ$*VJF\ͨы yC!Ak#Cj 2 FA|^Ѓ#o=p70Z|{:MK(PzQӬsoؐ bYyb';'cw?-A=x̠rQll~u=U'̍ WrR+2]e^*'[6Vv{Zv Ҕ@Jjl/OzC-%CM!l*M9>w>?xMZAx C3m]eݲ Ŕᓝ<>yS&h1k<^؛a0gi_,3>K3awmwRC!B8?>l-{{yWT:gyD6ϽʮO+v=h'Lۤ?K|exGAZ v 't(H>^bSU7iϗHlGgr5[=9+$qhG$R }.9FD۳+nIgB}rej5KgRR%GNz|HEs,ar[m?ׂru~27 S8o7_'顯VW1ٞoMETݙ~F|9gDA8-E+q(2Y䌄=*Cj>:;m>DIȏ!E ӏX.S;IADd^/ieW L ¯kzϱe=fD8ԩG~6?ɀy*a:ȿ167^A\9UE–摊~64m(t``0yN3`%Ÿݖq-zYuƸȱX3c[]ZmL  ۑU1=i~O#L Jʣ1-էHRPc6`ځ!ǤP^!!` "\`9ыS;F5)V YۗuuμVr!iE3}*8zENg L[ck@G[8l^KkHM(oJL.1n "9uJ;FzE"};q5# ^г?wO\y6tU6'lCaԜЙhFԩF2hP׎kO[{ ti!Xf9ǓTh*PpDMe'E8 bì=LnNL}݌2"Adf#n,rfy|S;Ť8WtuN+uA("`OE a:- J6>>iɩ"kX0"c!S 7/W~PoүyYRG\z;q$?FV٘],qItrk0y z"s+deDH Ug*ǀO`/3 LtPTtA| u=Gy,]鞜fX9uçz[e1=]T8-')zW- \lv9uq_#GXjtRh>qnOp{ցW߬*ՙOMxDd2_H3m<[Fm}w>7ف/ m~}g:yo$  rӯz{2p!'X$f)pQZ(Ԁ  9 A#%[DA,(޾9$LU%;HBY3 tQl]>aX Ha:Iz ڑ2ʄfP7^BfQSr9!U)4Y@ :X43m%09Qt#& L4q$˜m7K7g+6~vmM@4r/]wOh1^n^`{{ 8;Ődc͜y^P +>߂nZK2fyxӻLY )k(L>!2]$1qu$gӡ )xmp SK̭?j@ivʜe4 n<2b=ެ轓(n-GG\E5Sqób26!i~HmaGLoccKER ,2u,F\v \4vvH*ڟdEk&Vq^Fcd-RM*u΍/ya;@䴯^S[I;rH{4>jW`b5+z8RnX+~3S d(A$z3 dNi$nQj6b&6hxHXXDdC楐 :<;?.w$h=̴cNP닟]R\cdo.dͤ\1e+pH8?b=N7 :*Yޘ]02g%.A$I,3`< !"mHHyk6Ym\943zbpRɇM| @d 9͟n0ڦwFb S5aG"RHDF4 &D23WB6 |\UsMM"HH4w,]l:ѝ3?5Q [|ORĉ/5 /}HSח1LtKúlz1]ۆ#p>gKjWBZ_{o!vtŕ+%ADAyWۼ ) ~VÜр03*"vU'(~nRE؋ɶ.N#!V|g3\ Xȅ}L /щ uy2*.ϵB\vwdN$5wL=ZePeDhUS뼪fuY; ]rpΓUodlt, 0uDE=pRA("O KzVSa ԻU#D,$tNӈE$U ȿ|c@[*^#~YƸs(kw !9~9| xxnȒ%6UC|!kZej¸ZwvhNApJ?cT;3*$@ox *Jq侪{?gSƗX1wiNTH(e0aYv,ץ;'l] d)kZI&l旯9e&"C&A%BQ|Vc?٨A 9FDb̠ I]rY :aΞq\,jd1t1@}&y|Uk;Wv_+z3c@E3|_6616Pӓac/.78|mk"֗at$jA%=njHnE^$cMX)>')m$d6L(2_ W&3%:X'dS%BRY.,G0UϾĊgS&٥t%bP:?I뵳AբnggA pdĚFLƺC3Ã' U'c53u4xIBIVF`TI" w;JSS?\ ']O]|J9]-,B;nuq/%/gKQn!w0% m&;5UbL%Bi>zi|JI X)<Kz+nHDu#O\EHvx9D{hg7&S];c9SQ<k!0DaE7Na.X?[*"Գ\A& ^GՐ*C N ܴLؔucr6ŏZCcnԾ3`e9ØKgD#^~|LͷRy&Z zBkNd8Qڀ?M!0m: SXa73weIAp~ӏyDx #0^Wa=ro\9hU+6h5Ad;AVP>hT`5Yɦ$}K!^kG_< t*L%@Vl쾏w G;%GҕxRl)IaNOQur#ˣդxaCGfi)l@@ 7䏴 C gX?dv@eQ̂)9ݛqF'e]1R p64zw7x{g/iH~uTLl*)T|Z;BvCnr mMf0VjpIj(a,{{֭QR6oHw"wE@݋~5\z'э=+ g3%qS2ZDhdzR%f2/ueY;!q8 ĩkbTvD<#jt;졲Z}1: ʽ|[Sj_ q킥k :r {wc"85nAwŒm=A*&B2,Lvw'h5n֊Y# d`xցR\<x V_62a;Ok1PyW s2$:16#K4g8fCφclEsdgxuw vV`}F6ojXKT]eV*Xd*1䥫)OЪX2ƃ X/פ0ݹjc-5lk ǫ0GYp}&*W\a(=i'z|gr`0UޭHh^@h $D @lzG_7R 5Mo BqQzl $5+j-9(m@h"Ob*aӯS#i< 8^l=+yS9 SyMޕi nR}l:3%ٮEIWv eWylm 擄\OMz:#Y3aKj;L{p}=# lQFzZr\w|Ž81޿w|gZ@sRY4T%F(A97͢mzk6.?$YM Pw@S?$cA CjAU3cP`0MM.9͑uG=w-=+Bz.sGdHwQK@si\0aVK*n[/}*vV_?SB;%T$oD.t։csO(٨C-Y)cs? ( d* \`A,q`oki~}yC.D푢~="ɀo!B~ yd*_s(P[L3V%J^]~+W {ݳ\ fEkݕCc⚘d4Z!I; ɓǏ1;aTa㽝0&9 1?p'zd B$HQGeW&(N2to$fh@_5Faj_ñ} w<}]>ktSqQ'5Wða}a՜|?io/G>ʱA%23[Y E s~6 .܈skV~E>PGE$0I@.|"0(Ӫy3ksV{do39DanX]J6< $_!MbI,@NV9aG]ktB$SQe<%kzZ/Ƒe2]Py%bQ)vM]7V\yhȱ2|_-"HRbz^J:CBG$pXF'lZ|IsR!/'T1ϟ6<ʼt‹oަHn\{t[ +o(Musa/#>@¹[Ee4?;;TqknAd¶!]_7X:IyAO/u$*FLkcGhom"ȣF;/j俭1DJ4sѫđ{x8(lIpY5HrVoz6?JY/ymjE/Eq6?̆ . b{]&c%2K!|Z bs A.;pi{˄|NYY3s@9G.d7;:ܣzY@7%Q%' pB-0񹿡E-tbZrlc%CVO#)=5™a@c9Dd ň-[+(`젢9I07C3&*V3Eqe|)kl b#H+g%srAӦp#J9 c8PQ(wJFnUk0eFAm 0_G&2"l&VF\,02_Њ8/*m ׉tzm ( VjG5AJ4o@bCy(]#͍UaIp|lj/`nRzy,FUT)DZ: mW:].7~gngQ HBƸ=a&Bg@QO;muQ'ī!v^_ Gٞ*X1昏x~ M q\s 8׳$}&sGvg〭R2{o@qڹpn E)/\nbbMh#B- |Y~RhE=grk8w=~z^{,e= WV)C)aU2Gp7*p4Sʴw8>u1DoҁJcqQi#IѧsR m+ S YIù_ߟښijX|jڑs^@O"^D&rq>GKR־(q:txS>*LިAܰ߰ ?<0mf#tFjncu]+!97.>2 ie>Fm M,~s͒9/BO.WJop 11z óddkc2QD!XDր))Uļ>SA:cf<J.zKl[Qyvğ+c\f6&7;<6t G}:)ċͰ!3D){nL~|'x?L3`pXUSƧ(]Z%)0lVpCT-cޕ{˷혘ՐêtC{B:'A2*wV)7:c :C{"JLQ2 ^=<8)J"Bz4l#VEZ-{6h>C1 +M%,7\3/ВC Z.a;]`NCu=̒"N&LW"hAo^S_xWКP~c r(_e_,); a #cf%Ξ9o"b|ζkYé5Q?\ b s"3Y8ovEϜC6!H23PS,BQG؇וh#[x]tO=-U}|f[=wUd=)jeIն9H@g3pM1UҘj#?f0RD]sJiTcĐL&a-p.saa{sCy00WF|`]d;<7O͗Ab'h+(LJ \gÇtŠybZsᓝɒȗy3`$BrM,%(d7CuPeKé$SG' =IJ)-BRPWe^icQK|uycq7e(+p͗faH\uy"n؀P"6$xR~RV ۀȞk,z=s-?PS }\N0*߇ +8γZ5 l3}} }|/^UL If3e`$ ;vF~Բey[I%O>#x/υ$! ط3zOM` qr\vm5_N\hcE4[|XSXTs@B%71%nh+y!rJCl^z]KÁ֣Auw34`GLU 1W\gi:|%."^!q)գ X}L+6Eu2 )2[ΉD x uEXa^ Qf e< qlrAx :8`4\|=vyeEgpE6N<4ǭhpy4㒖˽/hzw8LZjF"нBގј Ĵ(c,qZY_>}$^ΩqAʝ< h- x#!3CU$۹9#g^\Φuk_W%d aSh"5qF^'ר(zw D"$S^Hܤ]͛m.3 %4H2"m^;oԍA@PFNˢb_FӚ%le:Yu {*--- %%|.Whq ,yiCk>ə!Y:N0BؽDI@FHۆ5WF"üh{ i*l^%xjDIJMvJu_;iHz|FON~LCŖmJG. ]4W%K`?$^ٽUm8|$r^CJ^W_h,AOmYYGx6.|WM,1(D^{H UIH0*@&0})"f5&wcw.Њ3,b>5A"ݢm>Rט5D5H(s.|<_xuY!LCEv*O`G&vn7u# 0Z2Ή]εd nC׻0 ׶6}i+QK&tt5#ёrPWߓ0R7AWr1jO XBn Ǝ t%t\ ?7)w&ez#ڶ/r }?{h_t{-)g3oGQϮWV/4'{NJMw3~)"I)pX4X} { uCɠ˶AEUEaFQ51r7 nϙ&p;7$C y[h+g۹v#Lc~ ߲MzQmoj} 2<иxaOހ66MQt4Kgv),F 4iA(d.8O[YɷB~v3~xn71p\H7K󐥸_ o|-=`lA3y'C5Yln0NZn+NScU%v7qt#η L楺D9E,:F=l}#EaTQGv${59j*<)BFI)ࢍ,cA,JP3جqdMk 6"\ӂNIk:W #[gy]j眻楌­sN(q>{ DX0Y`S,Mm=b7R@Ŕ'D]G8miˑU|<卛zT+(u 1nj /CRYſs7j"FQ_⋄7$ ӮN"7Ai/HC_E3 ۛ$3UxLZ3]sde4}zV^>JqۇV(n:w$g "ʹ_oVj:]66N,當{Z o?u ٗGߜ:nNH`T%` Bmtc%Dlz2ٞz<^a7 RXE<E"v86ZCy ćhy4p̴߯Qc;*,穝x!'Oe -u7D-DK㯢x4EXc gt*|d8DU$ C$;ȎWIاJ^]z\\<-> Ι/tl'7G-˵lEXW3DWbӻ_ӊ@1nP̱$nċ%OaPulG d飻IYQ 9&0(k9!k˾3V/7wvf5Bl}F=#9H)Lƛ\wC{+~U/Y|t%5.⽾<-"ioL)vG?ZaUe'Qӫ؅JC0AX\+=ϕOzZHfhe>HKvѩ~gug#D("otMS&^x9L f ^mNb:z;/4avGkoGˌCv,umשvN#W-L+\?Öf'!{- AY"\@ĚG加GՇEYJ1ǡ2XTE%GXPRcav_}["2UT2Fji\:(+t8Rm]*" 39m*ZʡЇ"H7[V xOL˚3. 55+CfGr3|u-'4*WNB,~$뵶bo<(@8Ԗ&ɩ(LE4S:QS1A*O"M=bn)l"$>vjM+A=_E=xg[5iQ SOݪJSeDmRl%`{i_^!'>VnsM! ?Lx@exssYe}IQ?29lnz@=U[$N; ?+ )B1ef}5ZԷ[ ֑GfT%ޚXzFL'T{myF#*IKu{o2@( VNq /S˻(aN32eJ$"i7NC 3=,Lny씸%hX=ֱhpG*sx\Jꏔ1B;͚N})<`+]ȱ aϹ6~ܜbs<- ;ng4/Mlkse$rC1=J:Xˀ @~YӖ 5$Vb xQ\y3ZY96/J4b猸XjlS+X,.-i(~w%fN~7zalhOL:1 ZMW Cn3yGwxmuFS܊.DP'9v"ᡟ6;u|\5ByeCӅ2wI" >`:X:f;F(X=>!tƕq].TqԬ"(]YF%W"4{4O%?!㯂zU퟼hJmH,˽~j5:$#>]ԓEv|DJp' J+> 9p_<}NPrg$Wyv AaؠPbCMS*^6j >=e:DR0ˁ&*R=/*=^CeX2Nu8WKDJ®5 n!jqޮMzlVNL(-AgINCŸ=ec*Cr:]sؠy45KGdDa„V=>CAŅM12aUr jAxpl^a"d8{PjщwgB_&Ýn Sdm%/xhs28BAˑ.oZɄ%31bICƂ$tSP#uPW:eQ4;H'֔$/|iNy)4M.!Yre]|3=^/s0Yw˺cZ?D#Chiho&5\/LAbjTi6&tMAñc9Ob{'#^XV;d]E} _EPfѣS1#<.,(.㫙<Ɋv`qʄݨh >VH"'Z]&O8҈vRڐ]Kq )hy:ǤYa?yM՟j_yo?6iAih7qIZwk'h9CMtvʇ &AƤwq1^>q-ȷ$&0mjHu@bl! GD&oXK#ߣvVH:4Mp28z;xĽ&jCba%cpswEab^hd 8bcz!W %$<=MW- /;2o{h*:S >Z?c4zbof0<3lD7ʎ9l4ȐG{GKRV '=$}EUcHh1;TQvIcHO>_[f󈵈 -JBC/* KW}*bmlQD6 7^V{mxEc-4t27_V4Z@\t-բ@F4m PW_7gV{dhYXiuH߭)+W"t~ g_"FfHI֭| X$گQjW~]f(Z8kPv`@WT!S` y~U4e.Ŷ0S[X9v d墂Z8b_0~?v PckvSЖoxg96s=y Ŧ&uE rx|\~z#ܤa9c3߶]_w AX-/ PZ$̈;ŝ%\whOE)o`W(eU?]yAWҥ<~{S>hG@x3 wc&i'TFzkkغ C# R /gakR'If᚝mS17Uށ &9wtϟU M6;p0wP ~  D 82񿠡d! fTJnKטzNkaJb+ݦ&".q6;KDb≡|y^35jtLʍm=yG}X[8cixNXТ0Kݶi#Խk;'I ޒV&%TN?oBۺS Qu,G㖰WqG0ӌ "F:懋fNl6@4|esoP"”B`iCɟ<s@uuqkqZYḤɵDc0TcW1J}R!0y'[ج'`|4yRψILgoU3J}68W"Hti3E LFAc;aVuVp؇B#wvz# @8TiX=. VnpX"/"#hyƱ|rb7&˂3+ Bʉ=mimx0;)ػ&I2նy=?/T JZL5vX?97k!沢LRsH٦/hm#ޑ;AgoKuiK\a#ho-lWU)  p}//˨ B}_(X8t:VplWI+:1(ʶ̾hPzM[rnf!c`9HDt/Qnh]E5#ʝz([ﯺv;TkEia~jK/_"Ie"q 54>7 )>cc,K2 PҝLOG.ߡV[T2sKT ndn*7m Zmi{ܕ.2S/tPs=&pGaEsb2,h_aW}$4oAQZVuFاZ45mya?l%՜ vM` q)"3,`J0ႌU c f~V=/O$+)a@<ysaRWM?Na ?÷QTm/ϏOz*sicwluM<,3"0_|Fl?Li_w3#jm} g)Um#c,&3%o)=Dނ 1"r+pLj-jjDZD5U$Ļ i69칤.<;vZh=*r”_B~b{}g ɌIacQ abfsh8.2y0po% uMwClwx64;C兏DBX+<\G9|UgWWtȫl aOws?!HiM@09nh$yRNgWS=Q_0FdfZ;o50Eˡ?SQrC9QcbqiYG_ƽ?l1FYFW1Em\VP~YiMͥ+7~DB琗 lÝx{bUEIK,Wq.%[i]͊|m$I"1T8`[:m XŸl2tEŮ^HMz|6]t/yeѢ{uR{/Mq)vd ~Yy)8ߴP ]z~YwC?maƻtbM1)Y /g"NݤtBA#Oq\^3o %C(F$ĴQD:/q)JhMvmf!tuД d˽F@yr7[LǗ#IG~n0i9{oZWBZ+-}阌j.Xha~-#34AldG#|w_,)h~Me*%s \ndw SZ4L#"n.'(jV'ZRWCG @ āTkƱ4FWb"Jvȍ5p 5zr^"W2_;/?W^骀gt> 4#(,%ybP5&M{NƽOTtklW'n/DfpG:ss2s܊ }` RYWNo5s+aC=%)2{9Zw-pFHQuB 28Z8]Wh-anHYDtW]l;2\lG%j=fGh#j d Ew&h iv7YAV>Ju4+`H\ѝEd lt8 귍4%m(#mQd**LAVl;Qɪ3.-6w.y]c43;:M. ꘪ)jE&*&d8S_K0+1UW+ +/DĔc^L{|:o+)<(G\ݤ0s]oHXPBpd Ϭ~vǒgb8U^dP)PU{V[}9X]wr['~}LD+3_skuÃ4%%I3MsV!ŢOqdl )ϱ1s1/$=+o9'͊J9zvRsKjW%\1 69km =|ۭ0-X I,|y!} _-QludxK: O?{iG([E| aN ǖXBG)ckVMkJ qT\Qڢ*K؄Yj!j/rzE8!'!^B"#gg? @IDKg $/=L/hm9 xR-Gsq:RF\be-6%GJo9u:jLwzuKc-N ;ݑwLRK|^Nܦ=ɱ<\XYIG}vK s.%8qG(ݤ/-GFi>;/1볖0!%b_9X\_'-ҤnP&&r p}Uh*^#岠+2)aAƯ[Y5=n|7ȀC,;aꑴJWm821i| IQ.td!u* q/6W*'4 $v*U$Oj<&xMYH6`ZlLeB ֚Ii{W!#02B u^@(Q~15 ,Nޤ1^MmG6pS`{,'])h3L[y2xF[) iJA*X6ݚ/?),N-2MKjuq q&-kK3.u#\B4Uȱ~sRdrDN(2ϮW13zd|fd2؍͌Z֓嗢%9Z< f3KuZK7WO}!$Y0drD`X `FA-uSNC-rN}뷈0Qpj˝WMBfxtD<؜"Y)&N Jt<kA ُ`uP{GMl`SGqWN5-).bQ}E8:jIx2혊a+"9HKSc3_qEkYR ThGh RY ڕHP v-CڊPD,wGň#%iVTCsRXp-3ALe49CM{;f6ĺ%T1= kV>5}d u!NZw_Hbb76w2ٺfm@2_g68 gwx21 $2|}P7ThGy.~=Zض]!ˍ 8R#Y'WVeۢ'@>w9iRWy-p!#›0}{`Zr(SXe'&n ǗrL4wvGLnճ;Vd/;|r9zڭ{(=KAvčb+c]̰n Jij!zڣ! E.tI}a~Q9F⚝,JVϓQKI{ypk*kq,u_U'~,S[5/s bu(HP4_@;-KmR#zaJR]1!=)2E 5mel̓ԛHXL =!fm4tĜ5GBp|zW`vp:N4!Z -< BU9sM`(< .,sbڬH]g&\9(ۜgm9@]z,YRK`[e_Q%|U3mA&.ޜaPd~}X٭u>z~?;ѓ;o@6@2YDNQ7|.1tV3MM>-C!W(7;;YdbZN_G8Lu! 3x38͠u_+R`Rkucf4R~eخVco*rִz'HGmt% gp@ Yge*c[.|@82gV4iÇ,kP52>~ ɑűdD~ǀ>оKn&0s _녿q|}Fq؛nS'{ˣz805}{h6tIV@q#}ش8{DG_"" י MzWAڒn~蘻Vj9ߢLн e}sّvI; s@]qB O/j FۡBv6\.#oȲ/ ו Zm`Z=tӼGF"æ0qku^*R۵qANwmzT\$H@kI'9K5"ҸtL 0lݱTR-޸xYLDz9w:vdJLq=O/ε7(7; hGR6ac#" l;ج]a*̣gH_9=Aֽ%TP}E3VC@x}nO#-!95qL&lZܐ.mtkGn]Dcݰ̮k&*"H'EIra/ʻw#', [3:Xib-sh] $.w-ytT.ԗ+_^ڕg*Ma [ї|3|`9rO; 9Zo =5mIi] ǖ94dPZ1{D^P={}wuH,4`4aY10~Jo h{*"B~S'KPiW?XS~ĪN+8INAJCpABFeFi|6KABf%4}Iod2F#{۪mRΐۜgG)ֆMd^;l_Qڮ  PˁvV֏Aecc#iƂk9M \N|eeƳ)Pgx\"_JՎE2՘C7Ol%> db.ؙo~)qT&ϖi\ "b (M7L+b\ iEL:1G`MgYXK(r%ǬGV=.2BE*+†;ẻnS0N@Ul%,Fr7ҔYDή,,[%l|z2ҟkӒXxEܽ*m[ WU]5iQm**2De m2L@N=N1h B~d6nʇ+$誶sgd'ٍ>Pq 9T_s=G܉6eF7[N9IƒO`w F,[m7MLlf9ܚI:/ٲ2A&bN b8[{.; PxЋTuCLLUTF^ ˿(z4}i_"~-&>mlgL%h{jl}T#%7*oc,H{UJjxa fI*9EaA_Hc׼r: ~%4STǸj5'o0\]f34OWW#y6an JQ NC׃v`/ ˕<>ORw4E Wnbs6Dը ՋǹA{;fv5*_yCsur7J6lGMZC-0pVFFuoh%؄2~bpY< K\đ}X )tn풕6^|^! > kU=n)$CN^|Ӓ6Tk1ϒkBZ43򋖼 ŰUb^#+Y9`,5[Et? gb:!"v67z]'g<.i.^J e'(Ѩ(9d,s%N"-~|W:PS.,q:Vw!04!fjq/m( ETf(ouNɘfVB\6owU]#9Ĭ~DD{bJ:|>A>#ίE=R=79;CJrLFEGu)]Lk7IABȝ[]DLzv_-xD?q1涓&yE…H9齲(6?F0%sڙpi$ %2]! 99aC8#Ov ։I6DJ@ W^VYD^i"'!S&|obD9j_|h!!k!2Z% :,߮#G#ݎcq}H}R"Wk `5V~/^$ :ZGg;>x YԹoҝB;δ mݘM3BdY޶؍=.OE$v9{Or^Td^|lj溜y/볇@{?VP%Tݘy`wCm&h@Q<{ݖE3çvC9WW4IJɼq͵堶WP  _^bɧg8M>SA0YP%&>nw: bȥh^ʹF. 6ՔX=~=Vv |񐗬Fx{>ď JOԝۢ,<޻W9P7r $Pz!ֻ9HK!^ot _~) iOQ#,LvC?+HV`9/#=:Zp39rPO,/̔^u[{feQ"x(l-S=U3]Mִ_poHP-Sib:א=!'EԓC.NP!J0]1)tiY'EBt K{fd0 {Uv2|&Q0S@+(2QAiGvcA˥ Y+˵4vFV!0{?ί\9s}IB|\7r_=,sk$'y؇`PvK,g]@xbdBk;{/ "߷Pٱk3g<$R#O1e÷gBi"Q~$Zalo\5YLgJI֜~1Ee&*1q:?#n-&b4{Us= n6B}T#w->C/u>_t[4z WBwڭ|o{kE?ò}/wt>\{;>/ T}۬_ԫcø[z^CYôҷ/ἓ %E -="7r=Wݾ۪ d<η`7x>dl)5I/.1e+/22>G~dv->&2^%z9ftXFfxɋBia1\)(pm*Sߔ iTaeA{{5K7`\KwRVN*iGA07C-:䕓evW{3,bX̗$bÕ_krZ&}UD-r41;:މItF3ΓQ nU]!Nx'ŘZHD=l vd,jZw'2|[˃Ԇ|ry+@d=xhB[qIDtV) Se16x ER{Ł?+p"XOV4ԳaSaC"m̍wM;m:!At.8o0q}iYaDмp1;s=N*~V+T;k !p:#>r l]Lyxv g:g3^ ! 5!GsQEQ*kWׅ$YPhK ܇"|cG+H:]_F9}W|A A݆ԪQ_P+y]@~Db_q3T%4a\IíC2m:+>d·=6 ASz^41#$_DIa@rSG_ݟ+h?#\Y2{@-\0c`٥471 ^ש>Fb8Z7v80}<k iե0e)!pIۋdJ2l/ixʍ 2Pj#hfs3RL׳MڨxrOڱm_`[$b:gʔq4$ gw:!ĻI?'*|X`|QCl%M4Mep]1pRIqM$GoDcpiWd3n N&@PRM= I?r5lJ*7(~#Pk%NzZO +0/Ir33 GGˀti*zy\?5K#sG6a\ ?ѸbB=>_7oy{2JlB†ìiJtdF gJXpju% \CpjY;\ #jDzZ,7 uīW% h\:ţ4)Gd(9sͪfG>$ mNy{yn$Ha9q`(ј60cF W(HbC}T<2a"Zw?s*]qz"ܘ<}@rvJ׭ֿw B2xEn:'ZI\4ȸ J@8zf=;/R9\x;s_$sAZ), o*efWgO*ٟ``xCFa~KMYl/a%zY3aYNAE0+@ZKh Rk6m9VӸ5a~q'P# &dװ-Iho[M}G`?bչ1H5SrdU9 MT= OyPTohlF1K<нc:qОςI窣m$}{.&/)wPɢH5N&.+frM\ b s"3Y8ovEϜC6!H23PS,BQG؇וh#[x]tO=-U}|f[=wUd=)jeIն9H_z֖J'كx>Og}ʵCDgy9 #ENm!N̐FJM`P!Z S+dԮZ)GYzp'(CJ);!h\;3‹?8+nWO6Σt%Є-3S5&svm⢚C@wn4m=3.e 坒a4=~NSooQ~g1>e@yf#"FBRuM vmrWo*\@ZuƗˬ(J׍EVlvb(贞n,  Dt WvVMbq6Ќ!pVMK8*ʁU +Z2W;3F 3^,~Q -= X1mwq`ɋTZ眼O`}p]?¸0r[ne>^J 6Uؕ;qȲX^R T\R97m2pIuzY̶@Wإt̫D>̨ yiHds3U2xuђ+k?ߴ%o0X 4?HRb5UH%d>㈉,mͽp10\Te0'0a)M> ~%N`!ưn5pG+Qy*#vf2Q}2ѧ`^?e- o?R?pz0' !˻a(8juErKP=YD~?g׈ֈXS !u%@I( U$ []𽝾c( z@S'9CWd>fej=Xg urj@OuNmt6Sʤ}PzmEo0̙ID SX&} )6%$=b"xT;9Q3 5Wu7& 6AOl 4a@WF"A\OQH!3$-|_AӜgRHuе'hTa/ *aLPIsi= jE C3n1uLWY5DcfHu t{(]XTd-N FIk Pcvr|殨%麢/V3r){!XQl {,=2N;# -CJGEDNIs롄Lp!2Zħ^CC.WI~v$&yc=xA $W}n_6NVÆ3ZLڿdg7\euW($y)NwB6T5!?~ĕ~Ro= 5" c o9]d2-yw+W@clQ bM4nW,q'=@30y~~ mL,Iπay1=}? ?\~\QṆ̃=x@`*)'u34O r"!k^vTQu`]G"Jw? ^f*}BǓ |MQ{ɤ-3XQ5:vϔNz^/&'4^2۹ Aw &nd[Y? ? oCR$|h~ uuH_ԯ.>z],w6Ȫ4Sњ;3oP^.4|Ca߸$Up$& 4r:K]qb{8OVrex97N#)j kΠf*^HdۙA_ۂ];kS "Lg>)hp "T-8:+NScU%v7qt#η L楺D9E,:F=l}#EaTQGv${59j*<)BFI)ࢍ,cA,JP3جqd򊭮ԝM״6 \ӂ֢2߯' \g #MYrC0H$g?>Q`rN 4TUɬR:|ؤ;RyȐ>66B<"hN7Q(ޜahWrUٲ_wYdN`1 U̬kԂDVEDّ{4R޻(`=wO 'w$fbB:J^&W !dy _8#Bre؜ e iiWF Chg2NV-AZbk*3LsD|E`.^,;*+oCSR=:;O . )L"[O:`hzK,I9^5LZI#I 3J:Ӓ0|Ā=GI& SΏf?ZKyјE!Ts$ }aoN%7 JzOtT:Ί1n jJ%bD?Gkʢv y?+CjW1apQ!5b;[m };%i =ߟa1Ro`|Wc!_bz XdQMʔTLBlRhO+] O5xJZWl8Σ;iU\.GdG_a3CKDb5XE=\?0݋)Nc&=kӃrHzyۗeR ~ڙ^P8F{Zuxcם2xc,R桎ci%LPG`h3\}fz $ davS ޛkuVIp ([^9_bkڔC7?2D+C@ MZY,6 ;e]-`ʤoVLQqx ­F^]c% ^*z[{vq*f*Ӊ-o--;I}od-  Rx+̬UlUUUį MjВf7/zT =icARA_L(YEՑ?Q*XE`}I5\!JayF4Vabr9l M3@ػw;a HًGODԢ`wŦ?CN;U]@S>H_rGGrgCF_b )Phuȶ'}4nbH…̛FyOd-zCA0NF d'N -itr3ʐUk*A%jGf<$ŭ7.Bt[7}ܞ0n9= K5Kʄt_U] Aw/5*JDQ2hp60΅O 9у:Հ%|a;86WsCي%HK7aKgrky1$m#j&alLc:F Bhiw8r W~/;aΐ՝\S=UW &ugցlj˷$'Q[c2-tQ<Qs 5Ȼ- ۡ h {bB0 &HBWaıoGFQ)@XXFi&GK <KW$.;eP}3C>L^ )٧9SXE<ų`a7:ωt0>iH^)~8[")_ NӭS2o1F>*&u.t&| ?!E3 mF{V߈;_ywR2!h!yIH ](ፈ45m1a%! . Q 2h?eQPa ml3=nLb]霘7 ]0ɸVc,z3GIK<-a6 z&"[^Q;Ec٤t+!"qg]Mq:AdhfZ߶ q5"ѷV^">)P+uIߔm~V3o76vinU7( aC't9.1ηa B^q[牡wp[^)#2JGº鄰C$$-J*8Hm `Siʰn;Qy]6.|9L;[dǣo_U 삽uDD'sl[<5:GJR49w yKԙpy3ߟhhH~Pr}OX( ZP,Xƙⷝ,=/qH~XniKHxQuޮAeLM! B|rhu m@i7ldpE`c\W$=9ft^uVE-n~ Կ&C1y@Hʎs1Y& }:USXГh kL .4W+Ē4$ϝ4XdhM6ֲ0sHMKbg4uM5-M-M!h.GUAw#TIHG,_D3P<46?KX *qk1!$떈6_L1ˬӫZ}FL{Jr+x[ }ǟܿttabjHq5*X(rB =s-~hdԳ]2($9() jxY3ʨWX U;brlld9 )F7r~Zzux{C>ОS9<4Wڙ!bt_N K*Pط (OYu#qM/5%kդHxED)'(Y'"w@R=e(Ds*>[bw쉜 ZP6e-;/ɸia>!Pbo\ܴtvLP@ D{GajօR)cn?`[ҽd+U~+M6" ;X.8#hyX1|ZzA,Nڲ),=(Ps҂K&~3Wj'>’cV2Hp"|Rź{OJ}yt1 .M3xej E%i3& eAʚ.RK1< Um $975]eF} X -wl&Ýn Sdm:+jPHfgW'E "Թ7?ai""BI̔! ]p_SǗ}^ tuhS:l4jA};@P!}Q E%P>~v_8Y`9)@7T͡C.RR].OU 3|NFύ6xJaVd`fJL|,\6gw̦;-utc~gTµlI9eO|MYaSv,n2 +(@n MjJV?-d3rzBa/th.!>~J]"gޓBL&G߄&,>Z͛3s[|1 -z$UTSqiË4pnnc/ln.S#j휉߻z"!0oGY>&pvE8QqYU:s@3ws5?|ZKQ򡶽~c<7%j>N $6Mqfm[bEY1Oŗ:i@Ocv֒$l^u@qW89k&-QB%bnbZ_(oML e˖ZW%܇~^K(jM8]%"4RUĘi|xYul^qըc-B~%aJc M3I`[4ȭs4KvNG9R!-a+޳>zͣBov> %5=jB١=-5/#cfflʢ? dJ#'DeVYu\d-up[r|P8Njh1$ y푸vV=t3(JFQ%Ĥ!!K6I։;p>:Җ^T=PoAdz9!-uٕngkҤOyP=>{ṮI37/{oAqd7֮^ar Utr #kԢeOHz:,b:Oxƥې9նS=*ogqDm"P(f5ifd/' ÿ$ia`rdC>It  Z D K X'3{xܷ8*`ZÃ])1guwb=CB!kqn0:QT,R,T+\6}$r%<~L~bFQAd[7FZn̞cl}}&>{&V_/*F~Y[ 1[Td8hG@x3 wc&i'TFzkkغ C# R /^B@k@**HPS wpoDs4x8'o`(.{HP歮 ~F)wܚW(Cx!?T򤓈hPpး~% Π9߱bCD)@eV3XL35ɻMS=> ) #a1뜰W&K 0s~^ $zaϚpR1M=k?$дi# F/XSOs1s.$әhy6kewmϚB-մr]`;fm ̺ ~0mj6Ԥ/ncv Ӷ1$Pd r&r{̙]W~k64M"},,+ 2/AvBA޹X x9bxed$;7 Ña:չ*o'HJʢfu4W ௄pj0v >TnY yFufn^h2-lvؽnio4:!k 0&%*U5F)I ~,KdeM0gP`LJX xTH#lW;clbV[s a/?୞yqqh덈!d{$0ٗ-޵%AGآv0"}U轮M39d`qn,Xo@h+ c9(Mno=Ԫ#YٷT/n"-2 akbT?2|1m!ě3V?tibwu6<'z 㝇=A/v9sG:G(>FFH}Mlb j`7IjtwۄkZ]QsIVsY1:؟r)Ndb;XP҅I얁dt0B7xkc;tLn *n8Zh:Lk,\_RO[26%>ѝe$IuvS{S"pNC@+ DiNIpp 5\Y{r8]oƭpˇ9Ov7M@=tT 2AY1pd~**O/X_s60Gh&$y']%Nn,@B.0OkؾȜ*Faf\.@wy385YҼtN >U$^4 2ZRcJ ن խv:W F+h lҸA zDY.fM>)1`œlna t3fuLw+)FKh8@z&u*2h 7) 4v_Gŭh{ oX2VLAKm, >Ž{}6 ]BC#ۘ uQsv>R)ܯG$89Fوd%J[=ɧB _YPB9n@~EJO^x qxnZ.`GS 5.&;o %*妾#TKr>8'F#bO xDT60֚Y@9!0OeXUNRee*1bVRo Cvbn6wHF, a0pүG~<`|$<&LpP9y)f&ڷǞ,H!ZFF%Ր.&0!V&L*N0E<4Iue!aJ@5~y9]ߩOy^~?B`0C|md,jgpTo?&^i>&G­wg˘)%.7bAlj Wtk +zT%HF'!r{EG*X@[Tzrn\՗$ٍױɑ w\r.̂E-5A T6q@]#\iDbt0 ޫ pzu`xgMFxlX4܊pPTO]_eφ嬥v:ϾwWi(5OMI焉 C7]q/f`Q𡒊-[䢳2Iw<K>O o͇KˈʆátTBG(|q,jNb|B2e6*D q0ZUiBJϲJ.Ў7@7j cLP3Z[%FbhRG'H/}5 v-GFN1.ʽxSRϰW~o|\,c"sYG$t.5SE1;xߛCq,l:=.Vd،e_p0]iھx.恕^{MKϧ 7T xqnn}J R-&5?O,űsy7ElqOndY.sٸrQ2o}~Qpu>N*7>兺\ e.?z!,`c7v7gaI>c$L#hEY/Cg'vs]m)] R}"ݞ.E1gN,Qr:#f   V*Diqbj^iy콞Lbu:̫"LLxdN R ![ 6v?NXͣem u"pY "Z^#c2uyfa >>OTLXeB ߹*qt7[[Y}\x F7T@X0e^ɕaJmKOǶK%7b^20&YYZfO7ͭ5:V{*lxڇJr ࿅.x'8:NvWk]V61g1۽cML+I)CQo2|:0J"F]O&]dOg ,*P8{4j&~"};g'2&UKYnA42J.&wA]2bvc_GԳaYӳ}j|>[/< >e8؇v8S`Є1>NVG2`~,@7W9Ac" MԚތąQ*s+XQK߆یG7".7s$e*vYTuqqm5 MK`aȶ1Т5#Cs"bҵ/KGQqD%|4WN: O.:Gdu,.uYTK h~NJ4h-ht*-Ad@'rwśiKm#栙%(C({Hqi|6|}P *G,1ycw*op&AQE^h 'Q'! *^V>ZTY]$`K,L4yM_S꽋[:LJb] rCT=n__=Ә*27 aƉV`]| zzk3Ա}0&x ! \ }'}7>em = Ոܮ%3TyT}7jԺ)CNM%9o?K N 6,]X,pӻ[e_2' +R)K *T FT;/ ]$ B#p D`۝ep8l3%VUY`ƒ4KM 4+Dt2"<ݻ6Ȼf>[>gRJ]}}AV/pK6 Lw9ȅЛoo1/KO_j/rߒo*S3s\yu"15ִK.Ņ[B';<1Q}Xl4K(omZ\"^mxn2V]G88X {snAFj,uD+S^1]i(Iaaܻrw~`pX\llٖ^Xw/C+)$ɸrx{H"']Sur*NÆ3TcRX! dZf5 C1u-U*@~0s̎ R9q uh`j;-= R(I:>dLH i:7yHq &OshZ`²Gr*X/5wU ,}bIY$|3F߷x{WXfa$]+s'穀\IX cjqd+c5W/ >̇+2\ܙr x0ю3aUu! <؞9M"R!땅sfH@z7ѡuϋ!kLmO׿Ga-;+[MѿKXv^QY'GTb*|5!05կbTb 2Y'$Y*?JeyU:K`(%  |1LOF7D_ɐs,tߌ ~>XHvnh։Ф_@T 3ͭ:Fȁѯ{>d!:A5_1.AF~t,0_Ya΢A @u0٪z"jjK7]:X/ǹ&skݪ{z &qxi'j M^U"d6keR.{oxӎz~ufnǡ"#ޤLa$܅Կm 'U%T%$jp^4SСb8PNdB{~P|uV$QւEFgrG3RAp\zZYf4a(.E`>ĨP啄>i%8/ uv5POGCIIߢºFf[*la I+qhir륩'9^..B493?];?+ t5hٹh?u4ʛ!E1|N)^q/Ƭa1 ޷b%.%R c:?֯υY1fE>C1h^h\rO4d8ɾ;x3OZWo,YL`2"(jvaeFNByaO} 5~ZM(I9 {` ø|L(E7 $hhv 1U_m5&]#`-8% 6 ֟6Izppdķ*h11~^(!H f ѫ+ulD$ (y?ߝ9_Yڴw9GOpT{i i]iAgLMȉ_>/rߕ! 뺕 uOi]F*m*[6y LVDP=t/ !㏪]1W@bu&Rn, uMOJiۃ$ +uT۽Mz3uQT=爽ՉoI [j`x|4݂b:0”witk]&T*w&_(K& ZhWs4D&<<("&LGK- MXRb{#unLT G.|nj}>0{k(q~ea,~![{hr?_j"IgY9(9y9bڡp&?i*)HыQn`3(JwP}Hgu;\ UO-zD_Rz)VTSɒ=ܯ[F/| n1j<c]ÝʴNG\"0,0cr__u6a 8˿9ʟ39+J&RXd ˬK۷rH+O j(EHn=bx>+59PN>1]u"6s@ˣ"&M]m2 0`r84Ln}=!p(^4B|-bKrZ3BdY޶؍=.OE$v9{Or^Td^|lj溜y/볇@{?VP%Tݘy`wCm&h@Q<{ݖE3çvC9Y.b5.q͵堶|"+ڦ1/:sM2Y.AVbn G IښG~ȫ`0Z5`)$ղc0j+fK,{S(dO*Q1 \e$S3"tߺK>)jo1)#kgO2I<'H ovZ f~FQq\hny]xњ\ RQnk'08wY^$ʊ?,vw\xcS YL%< ^;,#%3KWfKmkfC$鶨'e pC<":p_ʺ~dMd% Vs.=C$J2x!U˲idiH%rD k5y5g^mꋭy"h.RVt&5sVLli=(=Sj] qdX:JZ_HOtGFp׬+TiVXHA(Xֿ,VsU=+_;‰q`C• gqt!NaiB:f!Ɵwn7ƒxZ;ܨfYQ \fO N~஀ŚwX1^xXÑ*޸66YzBBi"Q~@RrM>e=bvډ %2~XRZW8d_wޅ}w۽_Tð:C B/wѫ:}]!_jWڟ5zUg;f}@w}]/K_z7^o6}ᅥmg~?@[zëut?æO_ã)tQ@&,zc%*9Iyc |bSB^ _ JڙU-O?,i_+0Wjq1Z,l3V]866oHԹnRHJ:>!x Ix(]"Ꝍޙ9+\K[g^??nkQ鶟'VZ}kkMI0뮺{F>bLU jYH[qEn G#þI0xF>d,/WK;<Jv˯M~U,nNaձfEa]^R51۹Ld_%wҾF^yN^b&ܚh'$DM]HCǽ8mȪHr7Hc(TlQ*/$v8bkg#+/(9(, 2-־>Zwm ,tv~9ս$ND>z >}'傞C -!GgG F5u-E>iQe4*ެpO!Qh-k(>aMtZvWC(?6쩨xJzM`情F/ڹ\ڼU45x[BBHG@n|lp5*XC !LO[߰;#@hiȟ+%:^fsNyU )ls\6Rθ#I}Š nŘ9$A ka0e&n+'!1yywo6Tg:0JF\5 n+$nĆ=^Tj,=go-P| 9Ov7j>k8iFv&j.05RR0;#@ 'o>urB񡐌Ò6:&‚,'FEtl}#"Yh^gtL% ׺oi^y7 Q㻅dE|yB ipw퓝zL F'JPz2!9[d=s1u;`4Z7+h?#cn|7R̾6 ȚSꗨ Mb dss h<)x@xDZtFgF !aE`dR{3aMܼc̾O; ]2P?@!6gʳͩTh&@Gf3ag2W6}͌7WuǶ֘ٷ&iP \roΜyS"[Lj<NEەB9_z^; ٫FZ\f46(eα^f @%#ICwo0y--?n;ʽ2=b.ܚܶd-H6iDٛvñ?5FlY~,wSC̀%\ϳazqoˀJW2GiEnOl-o\؆9C>[Po| U[sh^D{ӔqWuA՗07*db{E-P #@̪fX)g&sRș(VO&詭cd  K,!RԆnq"9!^kQwuͯ}%ш)֕JOޗOQ {T¢vv(onA^Hu!_?Ka/Xq.X+bJz-@b S%[H %s<d-$wLCj诡!]sA<> e 8%{z.(iĤ+A$ J%CnSԶx"_Ǝla 9)[0GՌo*d.w݁XpjSCأI{$Igl|~R9F@f$ N&̪a(fV?r`a1Dzd ;aLs#KRPΰJyt`KײmΦ()Y{/[ubo&r)/[|cnN{ `uwƤTv9MsZڹg#d:&GC7GPoZh[]5*Vף`SRo2+Ѹq$f5QKb( g}ieDB0:MaOX75Kq$|7 B7ٯ06uW#)4R( ~,8i ]E{g[؊p[:RxI0i,Ktg*VU)\.C=nc *׊Zj}^ګc}fN']hB0\Z36)7/Hx#LYBM:3JI0#yqM5 W#(~MEиjLEv\?HRCPՀwAi>d28=}+Ehb7*+#SyZoێOY.#6H؀ney! uE 6My^%L6my" 1{ _[׷xGXO=ꄟ{rJlO:WT^z߇z&)nmt'w˾3<.{j5Ml..N$p&8 @vNe%f!xu\Қ@ 8ZɈ}0H\s]O:[N #B⻱u`atWv!u,Z! 3 2"So5fD)N%m6~srMq#}-f[ "V'z,MF9+RCݦI,SlAY[•lfMp3) oS|ЙKp~P|H#6)R2XˆucV-s_;jDV``TR?}H>WM Zw?Qgr" 2'` ¶UiU[d-0svgWIP=ყa1cSeq-W8x蘅XZGFuFkBIwozoۂlN, urA4&AJ]{?[xYVbsq0-9x?hk-+!ki$2|^Vk+ .kP;;P}oQ6H Y{ĭ]eP7#s%CBR ԦDl^IkR4 `fVzDϊFhd3Sck\;k#.\EQT Aw 2f)=bx\ b s"3Y8ovEϜC6!H23PZ8e BBdCp/a\%z ҇ tBu3K;E֦tMOdS zuuɜtQ$Ÿ AvU$x"s$4{) J( #J3@S?+VOcϑ$|˫>mzyQhtHIͣƨ3nбNdh>G2OR_TlPH5E9\qƑe^MdW-}޳A'Xg"N4=IzH`Oc4V7-{jJצ 12;3G:^a<,f5z%EzUٺ "|T*>4t4Ls%Jv>$z#9ߒ7H!fH F3PfŢ ֗NS-ofд"$MReϷƊnz$6ԧ6T񿦱+rohUtS+54p s=Cٍ䰶c#N?`8&E{]u\w?ZE+^jkxSI0۫ {VxοX2bb@ÿF\hdhWKKkX-~;5cNaC,9?ڇ/f GZ97s ;- jc8?Ʃ4l1EK@y՗ 4VD;p ;Xr)uU=+':Zj-s_]&c )/も^0|wgFF9ԶugD3 rFylqÙ Yx D\ܑ>ˋ߱IC ELyө<0~CLt]K= OT<'6.hrߡgZ(Y;7U_)oF74m.+>C 8Mg\J;1-_ˀ͹K$A[b'2!suo;UWS-,@X~i0k#0RJ^xү9hbeЈۤY5&0z[ڶv鼬iSgEWԆ~;`gsn72ٸaiZyITIPe)[?w"h,QgK*raQi8/SA,6EԠ͈BnMT%D p-%H@7ݩ)Q8<(5&>ͷ5B>*YH)%1Hy;'\VMڋ"qŏP65`ŒNޭ=CLMa< lmp^]ݙpCx]\2OM͆G; })N7:\D{W,,|5/}C?a-.=hqň@QR/*hJTcVQ"퍯o; 9)0\?U^F6zi\wt '|ǛN wHKEq*^0zlqfjdݮd|$jzJ'~  K`-{ߙ`ֲlQ k*'ؒ ^QڄO3b2v|f^WmBfdUEY1dy-"7SYۺ1݈a1y w cY}8-kO_.r?scKA|.O=",Q$\]4"=!yT=I$[(!+A#q vݙ˿hUX@ʙ,:#cU< b*R /gLRu|Zg8T˩l>ZHN"c' +wSNUI}ccm X{K(aYo5>ws;SɕƒydC Є䮔*{$:*.G'{:ؓW4׶dBŝ3rDj8 X=K`4Nq0?fK+w:$vs&?'caK"ZfJ.pk[%~V$ jI҅Nk%yLc=bk!a=SǍܫ.JH oiu;ưYoܠWIc!ؒ$Lw@ots^cy/KGae ߾mgw@*]W. W6 + )Jg15z%'i U{dNxԣû,t&D;BЙ}[ʹl87/v\Q빠P]vWmO}Zn%q_P_[f2p+꾊]L6\:WGȸ | Nw`*N 1n7.:&4k~7E ߚ ),1Amſ5JOEFdjTGNrfҚ/+NScU%v7qt#η L楺@45 /8Gg(oFh*J\ign\.qļOa%w7ޚ)F,傛7-c*c 80(_C c*1 JzD Jg8#)_H0D(@ΰ舟;oά['Tt95i-[@SJnj棅U($BwnBRJJEV2$Z&0kJhxhgACmͽ+Mr1BJo*)3-Z1֞+jl٨ǫdRR`=[ghLuYDT:ߙroj,lfdt1h/ Sʢ'ßt~TzMjx^- ]Ik^λ$ Ӕz8U{xC1 PP{{f.zrjͼ _FОb.v`k_ rBQ4;Zn$Ui }9/&ߙeHG= t YEϾ"N]o)A ZY׃;(3G F,m`$wy` ї*yoEűӄW{,EyC|y;(]][k]rgNr@*&Si }3xnؔFS1nl8pVBюN-0npX++LeLA^e < '1nC H_?lybeK (sS2?qt"'G g rD{ 7kʬeWS۔ᦸhr%Nfk0Ҥ5 F 讣 Ƒ#a]"nСI:ccU⴬Lm: umF_ U2]_̭L.xjKAC5M*`6SEMP$N5OyM x8z!_U/\'/;,G 2C[EeG\fQWҗ ))V93(Ŵ 7EPD7MZ@g¼S޺B/,mq|&^ {66]?f+kDTD6bhHE}>H(g :0q_WLbhx:vA?º)/_pyj BFqO=&]/m|roNA`}!0jK V !g4kLE9V.)l$:Ȥ >dD}dFq: A>~rXu1wlKMgL=%Jf<~4vt/z˩q0M-6gi5y02Ub*.bӜ>6bdF25m^}#HvQ 9̈#25LuI%e l5 }:Iw`%Js6t1En[}cV ]Oi$9XPRszTJhx @^lf™rQk}dw&Q=ݗjZ{Pzi뿱٦(<6ȏiMHoqQj Y+sU3;5hu);@aFy]iA1|MY1/M?lߋɞY䐽=`_ &xs> =>Y/Iv"Dӳ)_)C |o+~ś:SsĝHdD0d=ë}u-o3s|ZAo3'%u6%K]YШ)L>,jWdK^LJԱkzIGPk3A]f1U 幡(DXFAԺ j$9$}XdA=71Ӈp1E w ]ovoe~-lQ+gY&G]b/oHo\SkCf1do:He<}-i φUmk H$B\6Lv1IzN *u/&lT*KΫZW'8U$bP,{J.ro9)}}^c@-NU&نCn8gIL`t{aoヶq/G9G4"u CO1lDTm1)VAzJOvșa\5o̜X2i_UU$⏯j4QN׊0(FH`'D(\ {ɥ_O֎DqG6VfaC<-"D[Cul|OOJ;;a\VcMz;px\ Ұ7n@c };5i>_omة%Aj+Rm:%vmku͐><{9 .-U5ڕ(EQ]0ǫwުA\V-@W*cK/ "7eY-a7teFW\rps`x('iȽui*ZxHzauUT,6 8,IσT3^X N q3(|86Md{&t]ߵ%:Ts+ 2<m`uQ!'l]4}+DF\-CC7#҄@)3&CU tl{qE7J-@7Q7Wy]͖}A|-_'Z&њIkz!z|3r.@LH hk@ rM) Ü,e:rD.8/?Tzd(u%]giG$}WeC)9Axw-QÂgKG(j7~,5 (P*5r>?sU$Ur;IQNԵw8L~ d 㽉uCbSs(zI$R~wxoA*hvjW+c|=HzjwAB} - "9li 2-kN~3[qtpHeL43.G@ ^N=H%UЯySyf~iu+V}EY:a;}LW6TP;x`p ?MF/6dļ0UR dQnq"ELWhڱYfBc`'j4+zÐo!X^Nw:z\|i)Ţ,"hǑ$_cd˄ ٦<֒0'U!1%ZemqcM(Js.Jmq/nV!IH0!3Reޮ/T(b,`dbC{QjMTԃv%,qqC4dĴGb.p+kًobF0hj۴?z\P@FEsg. )<RTqV ?vq'WcHxR_e$x`J"1UGi5$R 8XJ2w#Z]-{N&o0Y4_V`4z+w\m'_d胛^5#XjwwEm8lPe:O*"ӂ yHTFN̳?D6Bg7/̱Y 3HQUu"G/3g#ŐbI[uP-}8~Of}C=W@4@{?#vآ]ǛdfAU w.kU]Q-u([@ީ4Q HP*|-ѸJ.L2$Zi'4 dwS+R 9VbL +hKhQD4&(.p_VK@D4 Xי.ψZz$xr/(P obHjem^fYtӉ{voԔOp,T6Z( DQpZԄB\٨f"fյRc,].K]-&/oQYQ vY{W|ic. %n7G=TUeݩU : *GuhG@x3 wcYRh S>j[xT $g]mb.y zch !< [w6;kHl9ؒ2KKkz8(3fUC"2kvu6|-`!){RȻ(x${(_Z_߽@ָ0lEYӉ"!Qϛodu1ϼ7>N܆]%ՅvS]ea (ȸY? L]1w@t`ț&=֕rF{aA r)5X0sWWOs?;I4orq~y㕧Q?0в68wBF|I=OH9 JOr5وU 3[Q`@ #@@*Hն0znmW+Xk^_ wHa$p7CuYSxh W<ύX+Iw74 ~8ZNBroT_M@o4!܂ dkݾOQԨ,zw!ȠdKqTT'rkŢ^uy;>~Q}`b[sc Qt9(IeDܓCV3 |LϪUEFI}8}\ p7C@u7?Ti]ʈ0'm|vu@Tы`$T:-B2ClWc4aަUIm7D[K8iJ?~%"d_2vac-1 yȧ2 IaF~60ʻӌՉn4gR㢶@]nH^moLJӳIJGƸ$mݎK1^0cPS]#.&u]?{wZP2PK^ifWrX]NrA>Gǫ!ө/ -tM5KvD`-Stþn;h?CvnEG Y [YG 6 1jM.W@:-&= QŹBLβ}xqVBy]?'$$(/LaS) =~*F[$c5oy*̨grExTvfI#mӪk(td>ߟ&,4Hd쓿~R6Mg[;էdH2Lo(7T#ِ+Z r9AqqJ C k;үG\r56Y/t@qh$+O Il}rB˃A{han)JťXqY ?1xCo01|S 5 . 0̪weu3,H"f˩VYA>vG?x%-WNwaZޣ +}5Ϸ\̡.j5F(<|3)()foD'U_=tB,qg}L^9g窨M~4Oꖃ*\>)hk&X 1!R,B1n~tj-}ɹ*5#*ȶv9k:4^Sc3#Hfrڈ7mQAß6yoXQmV8bw!sk?rw9͖6[Ba!0 )Gx1FQ ׯ& ;1D`a]bo`)"]K0~~܀siHC,!P LYSá/∫|=S|нG {hCIrCHi[}$MN<M{- IE.X%c8WK~hkKqrѹu,^_Zm̮6Z9*{ C 㣗VԷ}mxJxi]; HvtH.El"8[ݗwgOc ڸ900H9댲yXfJ*3u?cnO~SaH+6y=WgX97T.j= f6-d6x@";Zތ:ҞB=5keO[U-}k`ƏcK !t9[ <3, y&%r/Mq)vd ~Yy)8nG6‰4xz2PfYbc+i]~~2C/N`M Q0i\N&>ͭ|_VV{8At={=DmZX'6CeC?m:4T٤l%;GvsyߏV=I~Q.Z(oIV&8k 6p!-nsِkVY{=H%..p=SFqja\ݩДAۛI F?η4iAO뚖~֦BUΞ)?f.JD6mfsq8( #{"X2L:#?O~xp#6zΊ20@ c}E[])S]G.E75n#ۣT;yF8}WeKWJhf][LQmf!UuV_2@xҷׂ$uL}pW3ETry6INY$1EH&+C~eQ&\G8:~g$+yb,rNjb t!j5y?!) >wt3TdJ:124rz b!s<'ë<9{ 0'Aɾ?ɣI3֔PΈZ*ۿv-P~!RɆMVA_ʧ]ɀbJ"AG}?˜7`.q^#y>/>]a/Rb`C:z(1>?,AWѫŷO1lG v6fSY1% ڣV0A'fRh荒1"~'Q×OXM҅\; PYa%`_mz[hus_ǂWLpK[ML N;gbca]>+ u:̫噷DMYbhL/n0UK@2%pPB{+|L./s?9Gnf2i2V ̑&@ݙ[?Q65Ñ. +)W uB&_hrA0#6BWT8KR/{&n?XD=LGFVUi?fZIX{}AMzhbZ=aTL`HlRA '=mQՁqM^.qm5@ݑX kT4b޳  QM)ϐ7:r7iԯ&3^8₥*D.m!IGػ_.s}?SvA0 6e-A DFh `yɁcaAm]gAcY1,#Y5oDރ[J9:mB(VXx[ⳃ'f_eҕRE9|:R*Gz/Ge/S=C_m \Ea]Bs+]O&Fj׾Z91eU#+h lUP-6<0[egc3sn/ΘweSIR'C`!d4~$ #tc_u6 a_#gXSbа.+C<˒0ϥ!]DƠ3!bpܠZ*CM\ȋ-41PX[rȈnh6π#m+Q{P~`CbO@.Z5%(P,%0#RZ]> wX+Fv0D2.5WC:ȡ~Y@lsSc1Ui{"01c?:'qQs4B&`QX`J3\Ñ;H뱥 M_ɬ`?z:4d=SK ܄Ңm(/@t> V7_1 H~k` ^p>z^e]#ؙA΍?Rţ@|F{u;g)y\)h:#T C ̱jNzgW?8 xJ'lA9TGfڵO +k?5̓O6XXKQa{ ڵ6o9ԍ%Cj}bWC#W Y 2Eb M,>x,^ݮ{Vʂz qD_ 2WȄ lyjpWdcl$%Fy6xjZr=9(9PЎ "l A$\Xl1 ?^,- }ť Ғz(J 1ZO͓3_@(y΃1ӱ)s^뫠Dohb cdCΦWVUyj4r"I(t]|1f '$M20<{Hv}mz5o VϤ$;lA$7qGcbkDC g0}/heh|ՖY ^X9DLvqcYn3cljT5$X̒-r COבSRc˚ !͢>Fe/t9Y1BԗC\ēEatLSVszW]:I;7c4y`"Dai0sy72pm1~nI43@ps!a= W> IE4.>ewDP[B#{Fk3Jm|y0Zk_ [GI#(Oȇ m C.8&7rn뀵`6G+2J/סGxWro^a㶱u,F]w&i-XdTY/>-Y<#pMvy~{6[K^z̪I]6 aDAP;[?\{qnEU{τs1,nENP7yU0uےeM,r.n/W4"T OPOؾgX,mS5ϴC Rn}fgQR,6]{&x|R "@&.#kn$!K27s쇇ٜ?sQC.v[n@?W7(IՇֻAŀ <1x[3d ~gPxW7۰M;UOd_$#|Zl};HҺn.R[NJfM)~(ŴWH>bДH&O$ݥUO.V(Y(NJ~TrG y;2jɮp^lTBXIEwvR?6i=]eQW  39Mkv%R}Mث&(꜀]W _qq$coF7:|[-t;JUބSa&"8D`o&m:W~-2>1ցI<0 U溩|Y+arw+l$C=r0f&Y|Li֜sXĤN#ѡ>oxk⚨qkZ A[rC|H|=iْC-cu ̈́&D_Krv @9?3]`|ϣ ,%Wɩv,) (5oScURT!ɢUrMW bLPφj OIBf|jT BrR,(|:%g'30hQ[5- N [0HQ$<ۃʸ,V -<0ﯷ il0_-3S7:KOϣʅÎ~ںiXknEnd3MsNBixťU2Q\z!C/[a_zu:fNøR3Bjp➌ۘU)C f.ɜ(k}G2GeĘx%kfvbF\Ŷ7] M`/zqXb -]P Z߬0L,%.Av7Uvz2>e^ڕg*Ma [ї|3|`9rO; 9Zo3a |PBese pG:sc4V_J]ؗz'T"<>g7l:Q;b ?z?[qȿ8Z6il5Ze7`cf9lbTQl,.:8tPTQd#O)nfG<ͷ uZK8JL`3 zZ{ Uӊ&Z}; !,c\:?AIcXlՏky@XK39A  ,KX >L}Y5p);zRCpU.cu02ՖͿ/Yw8. k h5s P-_~tg _O,Io6'^>Z*g׋͘VJ^I_.^2˹KK:U@Yxv"7^[D"Yw$ϥ*R 2ؤl̅~ ׾7N5ٰ6ٛS-A&-*9XIo(e c4LhF?&)̈́m|cҸuPt%Ǔڣ{&uL*Zv<+biW'S}kP j2Jbbw 鍺0a?)5 -L.j\sCˬj7q ihI#ȗv6 x)^h9YvUcD́8tl]Q=ܴU!6[(}i:uƙlzZW̐GC7(a3*CW[C}.Qu vG2JK.:#V~Pf/x&^J.iyR`&OH˺ɶ 10ӦWf<2#T+^f&'Yc``m FFx$}3ٶi#c`ˆF ×`Kj/)Pq?ϴٮϕ8YD[#Jx!&'\=c0~3Q-e 7h%`g/)@?Iw*i| /lx5B6̑w'c3B1Ωw!s%ИRM EoiVʵG7vj~f҈r4Dϖ[@/538lW)" bIbE࣬oA>2xw@0 S>[B!zvL] L,ZWrjB/2&;;}A#3aD0XkTވXijh_#"}y~vz$~'GB?Nuo%sBAehxTT sS{_^f?Xu^s}[.Pj3ۍ]-D 0v1ݫeFY`J{'u6?XĄ`S m**|A4мX-͍kQL VMzhWٮp;`b&eu 0DO8P|}o@J2~?wXWSz:9dC2ہ3zTHa'>.xhU.a-, P_!2B^J~m@Hr?_T 5 7j"K+ȟEY/ v\w|lŰQ>8nTsk;e:U Ao66)a|L&h }@窜YFLudEh~]8"i.W;[\=X hW% d *p_MYo:7#*R2^Q 1N{@4: Rݿ\\x enc15!|wxo/EuX?EnB 4n*g'l3MOYbKˆ-Ak:%:;Eb@y_]ޝ=72 ZFCHi{ Bko |׎=6:2y9i--K z,00|);!WRoa^Y' 7zt:^G=ŲvLtI:GC;{BzC`ң+kue8j" ɒbh#C mtIC$Eǘt14XFYsBEf^@n>UsVo-I43`hY#|U{LG EK#$n;Y[c)GjRI3MT؍6%hU3BdY޶؍=.OE$v9{Or^T9bh?ߎ$.OxCAmpyo@*}1l=7lY(`u|hp~mߞd%ѫqֈΟ-99X(L\ )} t_v \#WKׇ 4rnSUݳR/a0 vo)M>P 6$M y|4PUx0>$Y L B>=!EQg^DEh%Ue8"`'v5RpgzIٴ[= 3JҲd%֫ F}H[. ^4տ`Vl3(oxX>~ՊPqrH6v=Q> 0Fxcq3V>l%ć/ D_Mjl~@ˡ&;56ݮo-0X-Qif12y[Lo϶Նj]/ =FvŪ:!.q jSb4?u|*&+jԉ* Sb~ªjRAZV7lRAR֦?Ƕ{?C&uBtBU(3Cj&bjCBV (k@0㴄~{Exo6㕁KubՙnsAEڕYb[<ueaBi"HU -7.?q/Twg(ɭjgֿ > 9Fs|J:oP,){}wW4u}WGw^tp_Vs}B߾tk -}W}[>:nվNsk_؟Uu*owճՠ/k?iFghumY|Wc+ GR5_zM7#&l&{2ѱ͝MaoLu :[Npoi9>Whߤf!.vȸTLM?J@stN3_FQ>ibBV"EE|zòy'c*_ S뢗^^Klv !([߯69 `/KYsSH9:* d]كNL~ ƒBÁ7PcufzҀC@5H-IXjj$y{#f_*hk*t$[7Ƹh9r"K [kړBjb~ҐgwT$ּW{,))jqY69V&'gI o`j7:njVqDnj-nBlD*> v![+Aw+a%@ayA,V+P`yًJכ7hBi(P3† ;+IS1Jƙ"a:C},aR7 :A L8;S[w*닻>CkU,8EI-9a9%1 hR{}O|C@ G}<-%փr@"B]E`N{U2L:E`Z yt]_Nr;=rA#ko}!GQna3;K.k}D78eܥeQs&r .=mNmEDABZB@jָbi^51+,Kd-c汏k hEeLcPŦ|O'֙y #"%wѦ %ӇJ"pNG|@HjpMEЪjd I߰_Ż,տ '*t&mnymY[X-:vؚȭu*'~!1yx k1/+DO Xrh n.,O&ڋ944sT"6su HCϾmކg 0T>n6|> 4Dؕ ͵9N5:V`wט{_vmv] oq,Y1/x"#y`?8sόlf6CQ53]Z]`eq5Cjjܻ9NM)Vo-mÌaRL(rtl}*ߵF, k Pȕa,clvY,Q)J|LZ|Y6W's #;_uDS>b6& *lnQ7W OqcG|S/&^Q Js`fV/IjV@$d Y>'t?nD`hlEҩ28,-1 x&1p|gWt>.qSqI\yZ˳PO0L05$J hK'ŎDD| U^[X|vݓvJF8R\u(Cd9(_!PXўVp"4!aZZ9'C=i[l8rH=tu`L6q:5=o|=C]5X{Í{%uj'1a"`L!_mg}Gw|NQwɇ{b1N[ +":9TeꛌIU:}\l^TD "U?I 9.7M7͓ Llju3ד'L#빹"Eg7e`\ *SԵxՓ(} |hEc\ڗj]HATOg4@J}cn f‘5w{ 0[fqT)ʦFpt9z}PV$(ҬZtg펑l(Ca{_pSf\0D; Ւ$DK66["1E jEvfHb# ^%ed1*pxr#8s 2(g(ʟxP5Vbĕv678>+j7Z:5 Pj_y8#+p)V:(g INYJ.v0"7%=5$VPTeM}a;x.|柊I~ oLOq~\6ľzЂp7h(>T"N\ߜL1?FgXk D:.M.u]E,ޮ%yoi䴩o\ L\ܕGi#?\I) #ϱ/.] Sݮy9 :{UjqhLΒ%`8cHϲރa{2hfp*! +f:_D#*u9srE\rJ._:䈜\6qZ>j<m):37esA}.ɑ,pb'g_Ƣ\Y.N,k4 9&&rjYZR6?"O{T?f,2.+iKK}Yuk ӱ18H]f;˸3!i>b^&ߌ&~xPK1\LЏUnW1znOp>|d8C1v2^_7cĶ اGbS>̃U-5ɐ.ٳ̢fXD!e& o@guPzK.OGӲ臍}?F?@,nG{{ORZGZ-s"2x Hk3˶al wsB [z49VYl,]'005zQg޻|婔s _X'J^&dN?dȯ*FeoRY x-B?)Py]".(P I'TYAyun^G 0§"iO 4U]`$ |JRG@S/.a7S,'ibŭH՟O[wLYF0!Maw߯/tYpv(9HD,U!pG ۢD)nk"γtz`AT:*~І=Zsʈf 7lnY]0uXK /zJ AYHSBr17Ü} 1EoD4n<3Pߡ鼙+0wuVglykK + %{gsΡ]#>֕T\HA._{^ƾ4֖V@} {lD{čyߜHwti5OسpVlL ;  Cz7%ҭ0 ]@n?XX?8mM mp{8` Yǖg۩8nRfucdF+ j9z)&1ơ, tȉ$C`4НlDkq2:4S%KJgaөy2H & ,bruxK>aM Rpz9'oJ9 ԕeاv^{yV96@]-*}cX$A<+nm n,/U=/}1*r"j TO_Cɍݳa&-B=h0óHK($#(*oկB'T0`J9g Idw[×@%%rV. 6ސZi}E|rom0FT 9v{r nZq|Qv$MƗFVڔ8O1/$5^nB~_g Ӧh]+^qٯE֭ep@ :x˱5 :_gqv%Tչ2t*f#+65r3Xc'hw'z C <&;1 Rʿ]n{wM{d02ob6Z2 ٤k@Oٮnr_.KtqM˞ ?*&LA=}T`52ryO17[K2vZRU6fBhװ3ǰ|a3h&l2V(ZRBny8y[pBXN2U=l!n(~D6w'Ơ/>:U@m""_-x!VZ,Cʘrvj7Z4Fp[.BDr~7wW<0[J#؅Ƿe3=6[%f,5i-MyOj!Y2pjƑ jʂCCsZ}bS-/op$ 6Vo=]zBbJ]Y"e@eF0`!z?{jyQ"do?.YYI^sw&H;b?I$h+ %:ЈZ$l^8//MjnH%4Sb?`yUJU᪸31r[%edk ,5?Y |!Lbq\Fez (e3FTGӛpG*F < W?HgLsxM[sd?ʐ&ǦZhQ"OZ!xqkA]ҩ;z+M;R]JwxpآP'g}F ;ߞyAiq;DiT7 UTjƱj?vv@G)|T[VW~#ǮR}dac/ jx0 &o)aMi.8_adennX2O^4=-3iX#NQu-[y7@U_ mt8뷘sl!6GVwG l< _Vj¸&ɝ\h[n (Pl nTks_G>Uoc5^d0q]ot f)bu.-=׼U{ı}~սu}AS)1mSLhb@:ҧL)yCB*+@ ȼpkjf[=ߓ S)z+aެJL 5K̓j9CLoT]Y(rT7s}(KM![>:z9.?3si6,_7R!.#LB%`fc\cM!(i:^+fw-c"HTh)312_X*:_eqȗŀs?z9g^AK;!zB}9 Iz ؞7n¢<A(BcyntH$O؍J _ɐ9yfc[3CIپȮwRJ$F4̓~X1!79/#"o`'@"Ew~ӽ'zM%01Mk{y)aF>H< o8.v߶Yvsa`)f@;#xbD"y؛,UK `YkK[bFʔ\+ (֩`2Xr2F̪|z/zS*I5c>-,塵 {i Dy!|wvܹ3>e貝GX/w 0ot3kp-&J^ef)hrHh85ye;%qnU) 7cNkc[0[kkRf/Y'P)6n{%TTW}ib_;BhW=CvX ٝ Y%ML:vL|ʶo_To5+ohXk2򐃍bL?>+mV TL.[Ч^(t 0$j't4jR_ovE73"Ls ?׹l΁V$xf?ep*R߾=VMg! J(r=vA(AKnPI+Z͠Um??*ki9avS7ja|PcyAx`+ͪXNVJ{4@AJ̈4FHo*{_ *Ӫ&2E.u{0*ԓZhEp/ cwZ6 |RL* tSZcW p  =H%$JFH5' %izH >E [ض]c*+9a?*q [k: Nw@T-qkBN?T/ 6n2TTEwWF ȅ~6ܸuFN.Fz l͈Rр%kM>' W韌%2fg6 NC&2V|n<Nv^VR;EM3.n*>#8ZqOd_>{?/ 00gpq7gza&VJ?SQA,tiWV< *+/{r6Y`{۽2Q%E7_o_!S8R}SVL.Sb-t7%oށ[T6,(leܗ3ThlI}֊]LDAI$sk y\6;h^bBP6_bG6{mJAtg+[܄;?lrd8BgUN.#/Ia/L\4Z SbYc^8\ ^\ݴ_uyվ0geC1ɕDHh1} E]xTcD}dw9?3SVp<rYfq&&L83ǀxzLI̅)&݅$U> "UW0^$8؏{^oCnCkAh?f>U'V(V(W(Q%R%%Q&oR&yQ&R&܇R&؇Q&Q&Q&Q&Q&Q%P%P%P%O%O%O%N$N$M$M#~L$~L#|K#{J"zI"xI"wH!vG!tG!sF rE pC nCnByk@oi?%g>h?f>c<a:+45V(W(W(Q&S&T'UT'T'T'T'T'T'T'T'T'T'T'S'T&S&S&R&R&R&Q&Q%P%P%O%O$N$N$M$L#~L#}K#|K#{J"zJ"yI"wH"vG!tF!sF qD oD nBlAk@h?g>Uc<[7c;a;_: '#%MTT+46W(X(Z*T'U' V(MU'V(ΎV(V(V(V(V(V(V(V(V(V(U(U(U'T'T'T'T'S'S&S&R&R&Q&Q&P%P%O%O$N$N$N$~L#~L#}L#|K#{J"zJ"yI"xH"vG!uG!sE rE pDoBmBkAi@g>e=b<M`; `;d<^9[7%Hn~mst,56+45K+41+45X)X)Z*V(U(!V(iV(W)W(W)X)X)X)X)X)X)X)W)W(W(V(W(V(V(V(U'U'T'T'T'S'S'S&R&R&Q&Q%P%P%O%O$N$N$M$~M$}L#|K#{K"zJ"yI"xH"wH!uG!tF!sE rD pD oCmBkAi?f>d=b;`:i^9!W5]9Z7W4>x5<='(+24+44+45+47+45+46Y*Y*T$U(W(jX)X)X)Y)Y)Y)Z)Y)Y)Y)Y)Y)Y)X)X)X)X)W)W)W(W(V(V(V(U'U'T'T'T'S'S&R&R&Q&P%P%O%O%O%N$N$M$L#}L#|K#{J#{J#zJ"xI"wG!vG!uG!sE rE qDoCnBlAk@i?g>d<a;`:]8jX6O1X5V4Q%%)11-55+33+34+34+45+46G+5K+45Z)\+_,U' X)HY)Y)Y)Z*Z*Z*[*[*Z*[*Z*Z*Z*Z*Z*Z*Y)Y)Y)X)X)X)W)W(W(W(V(V(U(U'U'T'T'S'S&R&R&Q&Q%P%P%P%O%N$N$N$L$~L#}L#|K#{J"zJ"xI"wH!vG!uF!tF rE qD pCnClBkAj@h?f>d<a:^9\8Z6HP1 c;Y6T3QV\] ))+45+44+33+33+33+33+34+34+45+46+45+45[*\+W)X)Y)Z*Z*[*[*[*\+[+\+\+[*\*[*[*[*[*[*[*Z*Z*Y*Y)Y)Y)X)X)X)X)W(W(V(V(U(U'U'T'T'S'S&R&R&R&Q&Q%P%O%O%N$M$M$M$~L#}K#|K#zJ"yI"xI"wH!vG!uG!sE!rE qE pD nBmAlAj@h?g>d=b<`:^8Z6W5T3W5U3S24NTT#%+35)12)23)33*33+33+33+33+34+34+44+46H+46,46[+[+M"Y)EZ*[*[*\+\+\+\+\+\+]+\+\+\+\+\+\+\*[*[*[*Z*Z*Z*Z*Y*Y)Y)X)X)X)W)W(W(V(V(U(U'U'T'T'S'S&R&R&Q&Q&P%P%O%O%N$N$M$~L#}L#|K#{J"{J"yI"xI"wH!uG!uG!tF rE qD pCnCmBkAj?i?g?e=d<a;_9\8Y6V4S2E:(R2Q1 c+22!))+23(01(02)12)22)23*33*33+33+33+33+34+34+45+46& 05aH0a*_-Z*B[*—[*\+]+]+]+]+]+]+]+]+]+]+]+]+]+\+\+\+\+\+[*[*[*Z*Z*Z*Y)Y)Y)X)X)X)W(W(W(V(V(U(U'U'T'T'S'S'R&R&Q&Q%Q%O%O%O$N$M$M$M$~L#|K#{K#zJ"yI"xH"wH!uG!tF!tE!rE pD pDnBmAlAj@h?g>e=c<a;_:]8Z6W5T3Q1Bb;S2N/3$,,#*+*12'//'/0(/0(02(02)12)22)23*33+33+33+33+34+34+34,45_477Z*C[+\+]+]+^+^,^,^,^,^,^,^,^,^+^+]+]+]+]+]+]+\+\+\+[*[*[*Z*Z*Z*Z*Y)Y)X)X)W)W)W(W(V(V(U'U'T'T'S'S'S&R&R&Q&P%P%P%O%N$N$M$~L$~L#}L#|K#{J"yI"xI"xI"vH!uG!tF!sF rE qD oCnBlBkAj@h?f>e=c<a;_:]8[7X6U3R1O0CN/K-X$++")*'//&-.'./'//'//(/0(00(02)02)12)23)33*33+33+33+34+34+34%26gJ/X^*\+]+^,^,^,_,_,_,_,_,_,^,^,^,^,^,^,^+^+]+]+]+\+\+\+\+[*[*[*Z*Z*Z*Y*Y)Y)X)X)X)W(W(V(V(U(U(U'T'S'S'S&R&R&Q&P%P%P%O%N$N$M$M$M#}L#|K#{J"zJ"yJ"xI"wH!vG!uG!tF rE qD pCoCmBlAk@i?h?f>e=c<a:_9]9[8Y6V4S2P1L.C8K-G+o#)*!)*'..%,-%,-&-.'-/'./'//'/0(/0(01(02)12)23)23*33+33*33)23153883D=3pM0_,`,_,_,_,_,_,_,_,_,_,_,_,_,^,^,^,^,^,^+]+]+]+\+\+\+\+[*[*[*Z*Z*Z*Y)Y)X)X)X)X)W(W(V(U(U(U'T'T'T'S'S&R&Q&Q%Q%P%O%O%N$N$M$M$~L#}K#|K#{K#zJ"yI"xH"vH!uG!tF sE rD qD pDnCmBkAj@i@g?f=d<b;a;_:^9[7Z6W5T3P1M.H,AW3K-B(#*)!((&-.$+,$,,%,,%,-%--'-/'./'//'//(/0(01(02(02)22)23'23,43672>:2@;2>:3684QB2Z-a,`+_,`-`-`-`,`,`,`,_,_,_,_,_,^,^,^+]+]+]+]+\+\+\+\+[*[*[*Z*Z*Z*Y)Y)X)X)X)W(W(V(V(V(U'U'T'T'S'S&R&Q&Q%Q%P%P%O%O%N$N$M$~L#}K#}K#|K#zJ"yI"xI"wI!vH!uG!tF!sE rE pD oCnBlAkAj@h?g>e=d=d=`:\6Z5X3V3T2Q0Q1N0K/H,H,E*98>?#$'..$++$++$+,$,,%,,%,-%,-%--'-/'./'//'/0(/0(01'/2(02352<91?:0?:1>:2=;3?<49949;5dK2^2b1`(_*`-`.`-`-`,`,_,_,_,_,_,^,^,^+^+]+]+]+\+\+\+[*[*[*Z*Z*Y*Y)Y)X)X)X)W)W(V(V(V(U(U'T'T'S'S&R&R&Q&Q&P%P%P%O%N$N$M$~L#~L#}L#|K#{J"yI"xI"wI!wH!vG!tF!sF rE qD oCnBmBlBj@i?i@f=`7]4d>lH,hE)fC)dB'aA'`@&T3M,J+H+G,}L=9;E*9GLM!"%,-#)+$++$++$++$+,$+,$,,%,,%,-%--&-.'./'//'//&.0,1087/=9/;918944962:90:;0:;2;;2;=,9<4@BVXPpgWc=`,`*`.`-`-`,`,_,_,_,_,_,^,^,^+]+]+]+\+\+\+\+[*[*Z*Z*Z*Z*Y)Y)X)X)W)W(V(V(V(U(U'T'T'T'S&R&R&R&Q&P%P%P%O%N$N$M$~L#~L#}L#|K#{J"zI"yI"xI"wH!vG!uF!sF rE qD pD oCnBlBkBkAd9g>[Atshx`RfJ7V9"H*C% A&1B&A'9NST%,,"))")*#)+$*+$++$++$++$+,$+,$,,%,-%,-&-.%,/'./23.:7/881286.89.8:.9:.9:/::0::0:;1;;2<<1:<-:=9LQPcg_e_a<`(`-`.`-`,`,_,_,_,_,_,^,^,]+]+]+]+\+\+\*\*[*[*Z*Z*Z*Y)Y)X)X)X)W(W(V(V(U(U'T'T'T'S'R&R&R&Q&P%P%P%O%O$N$M$M$~L#}L#|K#{J"{J"yJ"xI"wH!vG!uF!tF!sF rE qD pCnCnC!j@d9^C~z{~y|wsmq]RW=*H,>!D.9 9$*+!(("()"))"))")*$)+$++$++$++$+,$+,$,,%,,#+-*.-64.662/66,68-78.88.88.89/89/9:/9:0::0:;0;;1;;3<=0895?@FX[PejsdOa.`+`.`-`,`,_,_,_,_,^,^,^+]+]+]+\+\+\+\*[*[*Z*Z*Z*Y)Y)X)X)X)W(W(V(V(U(U'T'T'T'S'R&R&R&Q&Q%P%O%O%O$N$M$M$M#}L#|K#|J"{J"zJ"yI"wH!vG!vG!tG!sF rE qD pCoD k?oD"mŮ{~x{uvptmpj~ni}nj{min^VU>.D*3.K8(>'9"')!''!'(!((!(("()"))")*#)+$*+$++$++$++#*,$+,/1-441.45*47,57-67-67-78.78.88.89/89/99/9:/::0::0:;1;;2<=1:<09:@LLH`ggf\`-`,`-`-`,_,_,_,_,^,^,^+]+]+]+]+\+\+[*[*[*Z*Z*Z*Y)Y)X)X)X)W(W(V(V(V(U'T'T'T'S'S&S&R&Q&Q%P%O%O%O$N$N$M$M$~L#}K#{J"{J"zJ"yI"wH!vG!vG!uG!tF rE qD qD nCoE"ů}z}vysvpsmpj|mgxiduf`qc]pb^ob_bSKO:+@'{<'9͖(./##!&& %& &'!''!'(!((!(("()"))")*#)+$++#++',*01-.32)24*35+35+46,56-57-67-67-78.78.89.89/89/9:/9:/::0:;0:;1;<2;=09:5=<>SYkfYb+_-`-`,`,_,_,_,_,^,^,]+]+]+]+\+\+[*[*[*Z*Z*Z*Y)Y)X)X)X)W)W(V(V(V(U'T'T'T'S'S&S&R&Q&Q%P%P%O%O$O$N$M$M$~L#}K#|K#{J#zJ"yI"xH!wH!vG!uG!tF sE rE qD j<{{~xztwqtnqk}mgzjevgbsd_pb]m_Zi[VeXSdXUcXVVG?E0"2@0$9077 &'$%%% %& &' ''!''!((!((!()"))"))")*),+/1.*12(12*23*23*34+35+36+46-57-57-67-67.78.88.89.89/89/9:/::0::0:;0;;2<<1;=0896GKy]Aa,`-`-`,_,_,_,^,^,^,^+]+]+]+\+\+[*[*[*Z*Z*Z*Y*Y)X)X)X)W)W(V(V(V(U'T'T'T'S'S&S&R&Q&Q%P%P%O%O$O$N$M$M$~L#}K#|K#{J#zJ"zJ"xI"wH!vG!uG!tF sE rF!m?nW}y|vxruosmoi{lfxidufaqc^m`[j]XgZVdXTaUQ]RNZOKZPMTJFH8-;%>B958'9kop!(($$$%$%%%%% %& &'!''!'(!((!((!(()-++10(01)11)12)12*22*23*34*34+36+36+56-57-67-67-78.78.89.89/89/9:/9:0::0:;0:;1;;3<=/8:1?B]1a,`-`,_,_,_,^,^,^,^+]+]+]+\+\+[*[*[*Z*Z*Z*Y*Y)X)X*X*W)W(V(V(V(U'T'T'T'S'S'S'R&Q&Q%P%P%O%O$O$N$M$M$~L#}L#|K#{J#zJ"zJ"xI"wH!vG!uG!tF sF!oA{R2~{~wztwqtnqk}nhyjevgbrd_oa\l^Yh\WfYTbVR_TP\QMYNJVLHSIDPFCOFDG;4?/${=2,70.#%#$$$$$$$$%$%%%%% &&!''!''#('(-,(/0'00(00(01)01)11)12)12*23*23*34+35+36+46,57-67-67-67.78.78.89/89/99/9:/::0::0:;0:;4<<)8=]I7b,`,`,_,_,_,^,^,^,^+]+]+]+\+\+[*[*[*Z*Z*Z*Y*Y)X)W&W(W)W(V(V(V(U'T'T'T'S(R%P!R&Q&Q%P%P%O%O$O$N$M$M$~L#}L#|K#{J"zJ"yI"xI"wH!vG!uG!tF tG"n?yg|y|vxruprlohzkfwhcte`pb]m_Zj]XfZUcWS`TP]QMZOLWMITJFQGDNDALB?H?G>;D<9B96?75<4291.2/0-'%yUXY $%!"!""""$#$$$$$$$$%$%#'&',+%..&-.'..'./'//'//(00(00(01)01)11)12)12*23*23*33+35+36+36,57-57-67-67.78.78.89/89/89/9:/::0::2;;&7=hN4b,`-_,_,_,^,^,^,^+]+]+\+\+\+[*[*[*Z*Z*Y*Y*Y*W%_Eye\W*V&W)V(V(U'T'U(S$T)ukQNR'Q%Q%P%O%O$O$N$M$M#~M#}L#|K#{J"zJ"zJ"yI"wH!vG!vG!uH"p@lV~|y{uxruork~nhzkfwhcte`pb]m_Zi\WfZUcWS_TP]QMZOKWLHSJFQGDNDAKB?H@=E=:C;8@86>63:3181/5/.2*&0"E0&Y#$ !!!!!!""""#"$#$$$## &&&+,%,-%,-&--&-.&..'./'./'//(/0(00(00(01)01)11)12)12*23*23*34+35+36+46,57-67-67-68.78.88.89/89/99/9:0::,8;EA8`-`,_,_,_,^,^,^,^+]+]+\+\+\+[*[*[*Z*Z*Y*Y*Y*W&[4thgzdXX*V&V)V(U'U)R$V*|o\7P"R'Q%Q%P%O%O$O$N$M$L#~L#}L#|K#{J"zJ"zJ"xI"wH!vG!vG!tG!sF }qy}wysvpsmpi{mgyieufaqc^n`[k^Yh[VdXTaVR^SO[PLXMIUKGRHDOEBLC@I@=F>;D<9A96>64<429206/-3-,1+)/)',&$)#"E0*(?!%&!  ! !!!!"!""""$"$%&#*+$*+%+,%+-%,-%--&--&..&..'./'//'//(/0(00(00(01)01)11)12*22*23*23*35+36+46,56-57-67-67-78.78.89.89/99/9:09:,9:ތZ/b,_,_,_,^,^,^+^+]+]+\+\+\+[*[*[*Z*Z*Y)Y)Y)X)X+xf\thgzdXW*U%U)V(R"V+|ovT)R%Q&P%P%P%O%O$O$N$M$L#}L#}L#|K#{J"{J"zI"xI"wH!vG!vG"sCzR2~~w{twrtnrl}nhzkevhcse`oa]l_Zi\WeYUbVR_TP]RNZOKVLHSIEPFCMC@KA>G?;C;8A86>64;3181/5/-3-+1+).(&+&$)#"*%#-(&/*(2,*5.,F;41     ! ! !#$!()"))")*")*#**#*+#*+$+,%+-%,-%--&--&..&..'./'//'//(/0(00(00(01)11)12)12*22*23*23*34+36+36,46-57-67-67-78.78.89099%5:^I4c+^,_,_,^,^,^+]+]+]+\+\+\+Z*Z*Z*Y*Y*X)X)X)X*W$`Hthfwg`uhduhdY6c?{mVNS(Q'P&P&P&O&N%N$N$M$L#~L#}L#|K#|K#zJ"yI"xI"wH!vG!vH#rBfT{xtmqk}ngyjevgbrd_oa\l^Yh[VeYTbVR_SO\QMYNJVKGRIEPFCMC@JA>G?;F $$ !    "&'&' &( '( '(!()!()")*")*"**#*+#*+$++%+,%+-%,-&--&-.&..'..'//'//(//(00(00(01)11)12)12*22*23*23+34+36+36+46-57-57-67.78,784:8]-`,_,_,^,^,]+]+]+\+\+\+]+Q*iF*`B*fD*hE*fD)gD)cC)sK*R&W5vhevgavgbvfaxid}~~}]G>;D<9A96?64;4291/6/-3-+1+).)',&$*$#*$#,'%/*(1,*4-+70.920;42>63@85B:7E<9G>;FMD@499"#!! ! !   $%%&%&&' &( '( '(!()!()"))")*")*#**#*+$*+%+,%+-%,-&--&--&..'..'./'//'//(/0(00(01)01)11)12)12*22*23*34+34+36+46,56-57.67*589;7^,_,_,_,^,^,]+]+]+\+\+[+[*Y*Q*R;*+)*#%**)*,)**)*/+*3,)6/-n`[xidvgbugbxid|~~}wYNIVJFTKIRKJSKIRKJOJLSKIdL;I?MC@FQFCp%%""!"!!!! ! !!!%%%%$%%%%&%&&' &( '( '(!()!()"))")*")*#**#*+$*+%+,%+-%--&--&-.&..'..'./'//'//(/0(00(01)01)11)12)12*23*23*34+35+36+46-57-67+67߆W.a,^,^,^,^+]+]+]+\+\+\+[*[*]*^*T*[?)5-*,)*3,*4-*2,*0*(i\Wyjdugbugbxid|~}ytTIEVKGWKFVKGSKIWKFiM9}O(O!N"M$M$~M#~L#|K#|J"{J"zJ"yI"xH!wH!vG"uFuN/ufbrc^n`[k]Xg[VdXTaUQ^RN[PLXMITJGRHEOEBLB?I@=F>;C;8A96>64;3181/5/-3-+0+).(&+%$)$"*%$-(&0*(2,*4.,70.:20<52>74@96C;8E=:H>;J@=LB?NEAPGCSIEEWLHD4::%%"$""""!"!! !"&&%&%&%%$%$%%&%&&& &( '( '( '(!()"))")*")*"**#*+#*+%++%+-%+-%--&--&-.'..'./'./'//(/0(00(00)01)01)12)12*22*23*33+34+36+36.66#28wQ0b+^,^,^,^+]+]+]+\+\+\+[*[*Z*Y*[*\)S)X>*3-+,((2,*1+)j]Xyidvgbugbxid|~}ztUJFWKGTKHVKGhM9~O)O#O#N%N$M$L#~L#}L#|K#|J"{J"zJ"yI"wH!wH!vG"uEtQ7pdbl^Yi\WfYUbVR_SO\QMYNJVLHSIEPFCMC@JA>G>;E<9B:7?74<4292070.4.,1+)/*','%*$#*$#,'%/)'2+)4-+6/-81/;41=63@85B:7D<9F>;I@=KA>MD@OFBRHDTJFWLHYNJ9\QM ''$$$$#$"#""!"!"%&&'&&&&%&%%%%$%$%%&%&&' &( '( '(!()!()"))")*")*#**#*+$*+%+,%+-%,-&--&-.&..'..'./'//'//(/0(00(01)01)11)12)12*23*23*34+35-46"17zR/a+^,^,^,]+]+\+\+\+\+[*[*[*Z*Z*Y*X)[*[)P#U@31--1+(j]Xyidvgbugbxid|~}ztUJFTKIbM?P&P"P$O&N%N$N$M$~L#~L#}L#|K#|J"zJ"zJ"xI"wH!wH!vG"uDqO4j_\gZUdWSaUQ]RNZOKWMITJFQGDNDALB?H?MC@OEBQHDTJFUKGXMIZOK\QMaTP`TPq6;; %&$$$$$$$$#$"#&& &'&'&'&'&&&&%&%%$%$%$%%&%&&' &( '( '(!()!()"))")*")*#**#*+$++%+,%+-%,-&--&-.&..'..'./'//(/0(00(00(01)01)11)12)12*23*23-45"07xQ/a+],^+^+]+]+\+\+\+[*[*[*[*Z*Z*Y*Y+W%W*hKmc4.-0*(j]Xyidvgbugbxid|~}ztUJFUKH\MDqO4P'P#O&N%N$N$M$~L#~L#}K#|K#{K"yJ"yI"xI"wH!wH!vG"uEoM3dZXbUQ_SO\QMXOJUKGRHDOEBLC@J@=F>;D<9A97>64<429206/-4-+1+).)'+&$*$"*%#-(%/)'2,*4.+7/-920<41>63@85B:7E<9G>;J@=LB?ND@QGCRHDUJFWLHYNJ[PL]RN`TPaUQi[W cVSE#((%%$%$$$$$$$$&& (( '' '' &'&'&'&'&&&&%&%%$%$%%%%&&' &( &( '( ((!()"))")*")*"**#*+#*+%++%+-%,-%--&--&..&..'./'//'//(/0(00(00(01)11)11)12*23+22,1{Q,`,],^+]+]+]+\+\+\+[*[*[*Z*Z*Y*X(W#_9nbwvzkg5/+1+(j]Xyidvgbugbxid|~}ztUJFXKGVLISLL^MByO-O!N$N%M$M$~L#~L#}K#{K#{K"zJ"yI"xH"xH"vH!uG!tF rG$^WW{^QMYOKVLHTJFPFCMCAKA>H?;I?MC@OFBRHDTJFVLHYNJ[OK]QM_SOaUQcVReXTgZVl^Y8=>!"!'( %& %%%%$$$$%%!'(!'(!'( '' '' ''&'&'&'&&&&%&%%%%$%$%%&%&&' &( '( '(!()!()"))")*")*#**#*+$++%+,%+-%,-&--&-.&..'..'./'//(/0(00(00(01)11(01&..',+$+yO,a,],]+]+]+]+\+\+\+[*[*[*Z+Z+W$[/hRsmtpuo{kg/+,,)(j]Xyidvgbugbxid|~}ztRJGSKIWLHXLHULIWLHhM:~N'N!M%M$~L#~L#|K#{J#{J"zJ"yI"xH"wH"vH!uG!tF sE kL6VLHZRHEOEBLB?I@=F>:C;8A96>63;3181/5/-3-+0+(.(&+%#)$"+&$-(&0*(3,*5.,70.:30<52?74A96C;8E=:H?MC@OEBQHDTIEVKGXMIZOK\QM_SO`TPbVRdXTfYUh[Wk]Ym_ZXn`[`$*+ '' &' %' %&%%%&!((!((!'(!'(!'( '( '' '' &'&'&'&'&&&&%&%%$%$%%&%&%&&' &( '( '(!()!()")*")*"**#*+#*+$++%+,%+-%--&--&-.&..'..'//'//(00(00%--#)*$*+%++)+T,`,^+]+]+]+\+\+\+[*[*[*[*Y(X%bBrlvxustpto~mfO:+E4(i\Xyjdvgbugbxid|}zu_K?dM>XLGWLHVLISLKQLMXLGrM1M!L"}L#}L#|K#{J"zJ"zJ"yI"wH!wH!vG!uG!tF sE pE"P>/x]iKB?|G?63@85B:7E<9G>;J@=LB?ND@PFBRHDUJFWLHYNJ[PL]RN_TPaUQdWSfYUh[Wj\Xl^Zn`[oa\rd_0rd_&KPQ !#**!'(!'( '' %' %'"))!))!()!((!((!'(!'(!(( '( '' '' &'&'&'&'&&&&%&%%$%$%%&%&&&&( '( '( ((!()"))")*")*#**#*+$*+%+,%+-%,-%--&--&..'..'//&.."**!(("))#)* (+10+],^,]+]+]+]+\+\+\+[*[*Z*Z*]3l[snodhSeHaBZ0[0[(}M&f[Xzjdvgbufaxie~~}zu}N)Q"P)O(sN2nN5gM:]LCVLHbL>yL(~L#}L#|K#{J"zI"yI"xI"wH!wH!vG!uF!sF rE rD ]J>KB?D<91@96=53:3171/5.,2,*0*(-(&+%#)$",&%.(&1+)3-+6.,81/;31=63@85B:7D;8F=:I?MC@OFBQHDTJFVKGXMIZOK]QM_SOaUQcVReXTgZVi\Xk]Ym_[oa\rc^te`ufaykf tfay&&#)*"()!()!((!'(!'("()")*")*!))!()!()!((!'(!'(!'( (( '( '' &'&'&'&'&&&&%&%%%%$%$%%&%&&' &( '( '(!()!()"))")*")*#*+#*+$++%+,%+-%,-&--&..$++!''!'(!(("()#))()//+\,^,]+]+]+]+\+\+\+[*[*Z*[,dE`=\1W&W&V$V$V&V'V&}[Bg][yidvf`tih|_Lt`{{x^EP"P%O$O#O"N"M"{M(sM.oL2|K$}K#|K#{J"zI"yI"xI"wH!wH!uG!tF!sF rE qD uEQFCH?<=53 9206/-3-+1+).)'+%$)$"+%$-(&0*(2,*5.,70.:20<52?74A96C;8F=:H?MC@OEAQGCSIEUKGXMIZOK[QM^RN`TPbVRdXTgZVh[Wj]Ym_Zoa\pb]sd_ufavhbxjdzkf|mh3sxx%,-"))"))!()!(("()#)*")*")*")*"))!))!()!((!((!'(!'(!(( '( '' '' &'&'&'&'&&&&%&%%$%$%$%%&%&&' &( '( '(!()!()")*")*#**#*+$*+$++%+,%,."))$% &'!''!'(!(("((')+-)\,^+]+]+\+\+\+[*[*[*Z*Z*Z*X'W%Y'Y)X)X*W)W(V)W&aLg]\zibthfydYT(V*|o}|ycNP!P&O%O%O%N%M$M#M"L!}K#|K#{J#zJ"yI"yI"xH"wH!vH!uG!tF!sF rE qD rE C;8:412,*q/)','%*$"*$",'%.)'1+)4-+6/-91/;41>73@85B:7E<9G>;J@=KA>MD@PGCSIEUKGWMIYNJ[PL^RN`TPaUQdWSfYUh[Wj]Yl^Zn`[pb\rc^te`vgbxidzje|lg~nhoi`qk -44"))%+,#)+")*"))"))"*+#**#)*#)*")*")*")*"))!))!()!((!((!'(!'(!(( '( '' '' &'&'&'&'&&&&%&%%$%$%%&%&&'&( &( '( ')!()"))")*")*#**#*+$++!'(#$%%%% %' ''!''#(($(H9*˝_,]+]+]+\+\+\+[*[*[*Z*Z*Z*Y*Y*X*X)X)W)W(W(U&\.mbgZVykgycXT)S&R$T){owrodT)O$O%O%N$N$M$M$~L#}L#|K#|K#{J"zJ"yI"yI"xH!vG!vG!uG!tF sE rE qE AqE :204-++%#q*$#+&$-(&0+)3-+5.,81/:31=52@85B:7C<9F=:H?MC@OFBQHDTJFVKGXMIZOK\QM_SO`TPcWSeXTgZVi\Xk]Ym_[oa\qc^te`ufawhcyje{kf}mhoipjrluo uoN!"&--$++$++$++")+"*+#++#*+"*+#**#)*")*")*")*"))"))!))!((!((!'(!'(!'( (( '' '' &'&'&'&'&&&&%&%%%%$%$%%&%&&' &( '( '(!()!()"))")*#*+!(($#$$$%$%%% %% %'#('!'\B)Ԣa+\+]+]+\+\+[*[*[*[*Z*Z*Z*Y)Y)X)X)X)W(W(W(U&\1{rd\Zzf]U)S%S(T'Q#S)v~ɌyoV-O#O%O%N$N$M$M$~L#}L#|K#|K#{J"zJ"yI"xI"wH!vG!vG!uG!tF rE qD qD dqD 1+)-(&/*(2,*5.,70.920<52?74A96C;8E=:H?LC?NEAQGCSIEUKGXMIZOK\QM^RN`TPbVReXTgZVh[Wk]Ym_Zoa\qc^sd_ufawhcxidzkf}mhnipjrltnuowqwr\bb"#&-.$++$++$++$++$++#*,#++#++#*+#*+#)*#)*")*")*")*"))!))!))!((!((!'(!'(!'( '( '' '' &'&'&'&'&&&&%&%%$%$%%&%&&' &( &( '(!()!()"))!()"$#$$$$$$$$%%%%%#&&!&\A)ա`+\+]+\+\+\+[*[*[*Z*Z*Y*Y*Y)X)X)X)W)W(V(W)S"fEMNŃV3T$T(S'R&S(O"\:wqd`ALP%O$N$M$M$M$~L#}K#|K#|K#{J"yI"xI"xI"wH!vG!vG!tG!sF rE qD qD fqD 0*)) #3.*3-+4-,910;31=63@85B:7D<9G>;J@=KA>MD@PGCSIEUKGWLHYNJ[PL]QM_SOaUQdWSfYUh[Wj\Yl^Zn`[pb]rc^ue`vgbxidzkf|lh~nipjqksmuowqyrzszt]{uM.56#*+%--$+,$+,$++%+-%+,%++$++#*,#++#++#*+#*+#)*#)*#)*")*")*"))!))!()!((!((!'(!'(!'( '( '' '' &'&'&'&'&&&&%&%%$%$%%&%&&' &( &( '(!()#$!""$#$$$$$$$$$$% %%!%Q*_+\+\+\+\+[*[*[*[*Z*Z*Y)Y)Y)X)X)X)W(W(V(W)R"gEV3R"T(S&S&R&R&R(N {R1𘉆aAKO&N$N$M$L#~L#~L#}K#|K#{K#zJ"yI"xH"xH"wH!uG!uG!tF!sF rE pD pD pD 90.@758@85;41@85A96D;8F=:H?MC@OEBQHDTIEVKGXMIZOK]QM_SOaUQcWSeXTgZVi\Xk]Ym_[oa\rc^te`ufawhcyje{kf}mhojqkrltnvpwqys{t{v}w쒀z~x##'//%,-$,-$+,$,-%-.%,-%+-%+,%++$*,#++#++#*+"*+#**#)*#)*")*")*")*!))!))!()!((!'(!'(!'( '( '( '' &'&'&'&'&'&&%&%%%%$%%%%&&'&'&($((#$!!!""#"$#$$$$$$$$%#%U*_+\+\+\+[*[*[*[*Z*Z*Y*Y)Y)Y)X)X)X)W(W(V(W)Q!}kxbQ U)S'R'R&R&R&Q&R'Mq^veKO%N$N$M$L#~L#}L#|K#{J"{J"zJ"yI"xH!xH"wH!uG!uG!tF!sE qE pDpD rF!ȽI70.E=9E<9H?LB?NEAPGCSIEUKGXMIZOK\QM^RN`TPbVReXTgZVh[Wk]Ym_Zoa\qc]sd_ufawhcxje{kf}mhoipjrltnvpwqyrzs{u}w~yz{zO_ef$%(/0%--%,-%-.%..%-.%-.%,-%,-%+,%+,$++#*,#+,#++#*+"*+#**#)*#)*")*")*")*!))!()!((!((!'(!'(!(( '( '' '' &'&'&'&'&&&&%&%%$%$%%&%& &'&('$''""!!!""""##$$$%$!$3.%š]+]+\+\+\*[*[*[*Z*Z*Z*Y)Y)Y)X)X)W)W)W(V(V(V(T'hGU)S&S'S&S&R&R&R&Q&P%O$Q'aDN$N$N$N$M$~L#~L#}K#|K#{J"{J"yI"xI"wH!wH!vG!uG!uG!sF rE qD pDpDoC(oCٽBպӹZOKA85KA>LB?NDAPGCRIEUJGVLIYNJ[PL]RN_SOaUQcWSfYUh[Wj]Yl_Zna\pb]rd_teavgbxidzkf|mh~nipjrltnuowqyrzs{u}w~xy{|}~B~088%-.(.0'-/&-.&//&./&./%..%-.%-.%,-%+-%+,%++$+,#*,#++#++#*+"**#**#)*")*")*")*"))!))!()!((!((!'(!'(!(( '( '' '' &'&'&'&'&&&&%%%%$%$%%''%''#&&!%% !!!!"!""#"$$$#V>'Ӟ_+\+\+\+[*[*[*Z*Z*Z*Y)Y)X)X)X)X)W(W(W(V(V(V(U'R#T'T'S'S&S&R&Q&Q%Q%P%P%O%M!O$N$N$M$M$~L#~L#}K#{K#zJ"zJ"yI"xH"wH!wH!vG!uF!tF!sF rE qD pDpDoC`oCĺĹ ڿԺؽG>;MD@OFBQGCTIEVKGXMIZOK]QM_SO`UQcVReXTgZVi\Xl]Zm_[oa\qc^se`ufawhczje|kf}mhojqkrltnvpxqyszt{u}wyz{}~ء F$,,)01'/0'//'.0'/0&//&//&./&./%..%-.%-.%,-%+-%+,%++$*,#+,#++#*+"*+#**#)*#)*")*")*")*"))!()!()!((!'(!'(!'( (( '' '' &' &'&'&'&'&&%&%%!&&&('$&&"%&!$$"# ! !!!!"""###hF(ܡ`+[+\+\+[*[*[*Z*Z*Z*Y)Y)X)X)X)W)W(W(V(V(U(U(U'U(T'T'S'S&S&R&Q&Q%Q%P%P%P%O%N$N$N$M$~L#}L#}L#|K#{J"zJ"zJ"yI"xH"xH!vH!uG!tF!tF!sE rE qD pCoCnCnCȾȾ¸ڿֻϵպxidI@ʿȾŻùۿ׼Ҹ̳ǯcWScWSfYUh[Wj]Yl^Zn`\pb]sd_ufavgbxid{kf|mhoipjrltnuowqyrzt{u}wyz{}~^#++-55+33+34*23*23*23*22)12)12(11(01(01'00'/0'/0&//&//&./&./%-.%-.%--%,-%+,%++$++#*,#+,#++#*+"**#**#)*")*")*")*"))!))!()!((!((!'(!'( '($**,/.),+())&((#'&!$% ##!!   !!%$"ܐX*]+[*[*[*Z*Z*Z*Y*Y)Y)Y)X)W)W)W(W(V(V(V(U'U'T'T'T'S'R&R&R&Q&Q&Q%P%P%P%O%N$N$N$M$M#M#}L#|K#{K#{K#zJ"yI"xH"wH!wH!vG!vG!uG!tF rE qD qD pDoCnBnBlAnE#ɽȾƼù׼Ҹ̳ŭ{kfcVSj]Yl^Zn`[pa\rc^te`vgbwiczje|lg~mhojqksmtovpxrzs{t|v~xyz|}򳜔  z'(.67+34+35+35+33*23*23*23*22)12)11(11(01'01'/0'/0'//&//&//&./%..%-.%-.%,-%+-%+,%++$*,#*,#++#*+"*+#*+#)*#)*")*")*")*"))!))!()!((!'( &()---//),+(**&)($''"%%!$$"!!  !! ;/$]+[*[*[*Z*Z*Y*Y*Y)Y)X)X)X)W(W(W(V(V(V(U(U'T'T'T'S'S&R&R&R&Q&P&P%P%O%O%O%N$N$M$M$~L#~L#}L#|K#{J"zJ"zJ"yI"xH!vG!vG!vG!uF!sF!sF rE qD qD oCoCnBmBlAj@ӳȾƼù׽ҹͳŭë~fYUn`\oa\qb]sd_ufawhcyje{kg}mhoiqkrltnvpwrys{t|v}wyz{}Aekm"+,-56-56,55+45+35+35*23*23*23*22)12)11)11(01(01'00'/0'/0&//&//&./&./%..%-.%--%,-%+,%+,%++$*,#+,#++#*+"*+#**#)*#)*")*")*"))"))!()!((!((,//-//*-,(**&)(%('"&&!$$""!! "!!dC'_+Z*[*[*Z*Z*Y*Y)Y)X)X)X)X)W(W(W(V(V(V(U'T'T'S'S'S&R&R&R&Q&Q%Q%P%P%P%O%N$N$N$M$M#~L#~L#}K#{K#zJ"zJ"zJ"yI"xH!vG!vG!uG!tF tF sE qE qD qD oCnCmBlAnC!_5jɾȾƼùؽҹʹƮm^Zpb]sd_ufavgbxidzkf}mhoipkrltnuowqyrzt{u}wyz{}~$m'^*Y*Z*Z*Y*Y)Y)X)X)X)W)W(W(V(V(V(V(U(U'T'T'S'S&R&R&R&Q&Q&Q&P%P%O%O%O%N$N$N$M$~L#}L#}L#|K#{K#zJ"zJ"yI"xI"wH!wH!wH!uG!uF!tF!sF rE qD qD pCnCnBnBlAkAj@i?i?jA ]4xǼƼĺؽջʱë}w|lgtntnvpxrzs{t|v~xyz|}ëĬŭǮcƮ=)441;;/9:/9:/99/99.89.89.78.78.78-67-57-57-56+45+35+35+34*23*23*23*12)12)11(11(01'01'/0'/0&//&//&./&./%..%-.%-.%--%+-%+,%++$*,#*,#++#*+155154/11-0/*..(,,'**%)(#('"&&!%$#$~P)\*Y*Z*Y*Y)Y)X)X)X)X)W)W(V(V(V(U(U(U'T'T'T'S'S&R&R&R&Q&Q&Q&P%P%O%N%N$N$M$M$M$~L#}L#}L#|K#{K#zJ"zJ"yI"xI"wH!wH!vG!uG!uG sF rE qD qD qD pCnCmBlBlAk@i@i@h?h@`7^BȾƼĺؽջ˲īsmvpxryrzt|v~xyz|}ëĬŬƮȯɰj&122<=0::0::/9:/9:/99/89.89.89.78.78.67-67-57-56,56+45+35+35+33*23*23*23)12)12)11(11(01'00'/0'/0&//&//&./&./%..%-.%--%,-%+-%+,%++#*+'-.587144/21-0/*..)-,'**&()$((#'&"%@4&\*Y*Z*Y*Y)Y)X)X)X)X)W)W(V(V(V(U(U'U'T'T'T'T'S'S&R&R&R&Q&Q%Q%P%P%O%N%N$N$M$M$M$~L#}K#}K#|K#{J"zJ"zJ"yI"xH"wH!vH!uG!tF!tF sF rE qD pDpDoCnBmBlAkAj@i@i@h?g>g?^6ǨŻĺؽպʹ~xy|vxqzs{u}wxz|}~êëŬƮǮȰʱ˲˲9˲ =HI.781;<0:;0::0::/9:/9:/99/89.89.89.78.78.78-67-57-56,55+35+35+34+33*23*23*22)12)12)11(01(01'00'/0'/0&//&//&./&./%..%-.%--%,-%+-$***//698153022-01*//)-,(++&*)$((%''"%hF(]*Y*Y)Y)Y)Y)X)X)X)W(W(V(V(V(V(U(U'T'T'T'S'S'S&R&R&R&Q&Q%P%P%P%O%O$O$N$M$M$M$~L#}L#|K#|K#{J#zJ"yI"yI"xI"wH!vG!uG!uG!tF tE sE rE qD pCoCnCmBlAk@k@j@i?h?f?f>g?[3xaøù·ؽپpjĬ}wyzs|w~xz{|~ªëĬƭǮȰɱʱ˲ͳδʹ.JSU+572<=0:;0:;0:;0::/9:/9:/99/99.89.89.78.78.78-67-67-57-56,55+35+35+34*33*23*23*22)12)11(11(11'01'00'/0&//&//&//&./&./%..%-.%-.$*,*/0798155/22.10+//)..',+')*&))%'1-'Y*Z*Z*Y)Y)Y)X)X)X)X)W(W(V(V(V(U(U'T'T'T'T'S'S'S&R&Q&Q&Q%P%P%P%O%O%N$N$N$M$L#L#~L#}K#|K#|K#{J"zI"yI"yI"wH!vH!vG!vG!uG!tF sE rE qD pDoCoCnBmBkAk@k@j@h?g>g>e>e=e<a;Ƽڿؽپqc_sm~|vzz|~~ªëĬƭǮȰɰʱ˲ͳδ϶жѷѷMBMM-782<>1;<1;<0:;0:;0:;0::/9:/9:/99/99.89.89.78.78.78-67-57-56,56+45+45+35+34*23*23*23)12)12)11(11(01'01'/0'/0&//&//&./&./%..%-.$,-*00799265032.11+0/*..(,,&*+'*)#(iF)]*Y*Y)Y)Y)X)X)X)W(W(W(V(V(V(U(U'T'T'T'T'S'S&S&R&R&Q&Q&Q%P%O%O%O%N$N$N$M$M$M#~L#}K#|K#{J"{J"zJ"zI"yI"yI"wH!vH!uG!tF!tF!sF rE rE qD pCnCnBnBmBkAj@i?i?h?f>g>e=d=d=a8WA-򊄁Իɿּؾoa]smx|}~ªëĬƬƮȯɰʱ˲̳ʹϵжѷҸҸjҸtn||(244?@1;=1;=1;<1;;0:;0:;0:;0::/9:/9:/99/99.89.89.78.78.78-67-57-56,56,45+35+35+34*23*23*23)12)12)11(11(01'01'/0'/0&//&//&./&./$--*01799266034/21,00*..(-,(,+"'*3/)Y)Y)Y)Y)Y)X)X)W)W(W(W(V(V(V(V(U(T'T'T'T'S'S&R&R&R&Q&Q&Q&P%P%O%O%O%N$N$N$M$M$M#~L#}K#|K#{J"{J"zJ"yI"xH"wH!wH!vG!uF!tF!tF rE qD qD pDoCnCmBmBlAkAk@i?h?g>f>e=e=d<c<c<a;>?:UXVஜĺoa]xrrl{~ªīŬƭǯɰʱ˲˲ͳεжѷҸҸԹպԺ~·&016@A2=>1<=1;=1;=1;<1;;0:;0:;0:;0::/9:/9:/99/89.89.89.78.78-78-67-57-56,55+45+35+34+33*23*23*22)12)11)11(11(01'00'/0'/0&//&//%-.+227:9366154/22,00*//)..),+')kH*\*X)Y)X)X)X)X)W)W(V(V(V(V(V(U(U'T'T'T'S'S&R&R&R&Q&Q&Q&P%P%O%O%O%N$N$M$M$M$~L#~L#}L#|K#{J#zJ"zJ"yI"xI"wH!vG!vG!uG!tF!tE!sE rE qD qD pCoCnBmBmAlAj@i@i@h?g>f>e=d=c<c;a;b9[D/ELK@DC{toѸƮoa\~xvhcvp}ªĬŬƭǯɰʱ˲̲ͳεжѷҸҸԹպֻ׽׾#׽"ʹ,675?@3=>3=>2=>1<=1;=1;=1;<1;;0:;0:;0::/9:/9:/99/99/89.89.88.78.78-67-67-56-56-67+45+35+35*23*23*23*22)12)11(11(01(01'00'/0'/0%..+228::376055/22-11*//*..&,+*,*W)Z)Y)Y)X)X)X)W)W(W(V(V(V(U(U(U'T'T'T'T'S'S&R&R&R&Q&P%P%P%P%O%O$O$N$M$M$~M$~L#}L#}K#}K#|K#{J"zI"zI"yI"xH"wH!vG!vG!tF!tF!tF!rE rE qD pCoCnCmBlAkAkAj@i@i@h?g>e=d<d<c<b;a:`:];KMIKNM=BAWVUᔆwhcwqvhc~xªëĬƭǯȯɰʱ˲ͳεжжѷҸӹպֻ׼׽ؾٿmٿEHRR/9:4?@3>>3=>2=>2=>1<=1;=1;=1;<0:;0:;0:;0::/9:/9:/99/99/89.89.88.78.78-67/9:'/0+34+45+45+35+34*23*23*23*22)12)11(11(01'01(00&./*227;:377156/33.11,00+/. )-fF*[)X)X)X)X)X)W(W(W(V(V(V(V(U(U(T'T'T'S'S'S&R&R&Q&Q&Q&P%P%P%O%O$N$N$N$M$M#M#~L#}K#}K#|K#{J"zJ"yI"yI"xH"wH!wH!vG!vG!tF!sF sF rE qD pDoCoCnBmBlAkAkAj@i?h?g>f>e=d<c<b<a;`:_9`8UA.GMNLLJFHH9>>NMKma]{keëĬŭǮȯɰʱ˲̳δϵжѷҸӹԺֻּ׽ؾٿۿؾZ})238AB3>?3>>3=>3=>2=>2<>1;=1;=1;<1;;0:;0:;0:;0::/9:/9:/9:/99/89.89/9:09: ()Q\]:DG-56,55+45+35+35+33*23*23*23)12)12)11)11'/0&./3888;:377176043.12-00&-/74-Y)Y)X)X)X)X)W)W(V(V(V(V(U(U'U'U'T'S'S'S'S&R&R&Q&Q&Q&P%P%P%P%O%O$N$N$N$M$~L#~L#}L#|K#|J"{J"zJ"zJ"yI"yI"xH"wH!vG!uG!uG!tF sE sE rE qD oCnCnCmBlAlAk@i@i@h?g>f>e=d=d<c;a;a;`:^9^9]9KHCGKJJLJ@DC1896<>5>@5>?4>?3>>3=>3=>2=>2==1;=1;=1;=1;;0:;0:;0::0::/9:/9:/9:2<<)33$--؅0<=9DF3BDC=??7::265043.32/11!+0kI+\)X)X)X)X)W)W(W(V(V(V(V(U'U'T'T'T'S'S'S&S&R&R&Q&Q&P%P%P%P%O%O$N$N$N$M$M$~L#}L#}L#|K#|J"{J"zJ"yI"xI"xI"wH!vG!uG!tF!tF!sF rE rD qD pD oCnCmBmBlAkAkAj?i?g>g>f>e=d=c<c;a:`:`:^9]9^6T?,FLMIJI>A@;@>BEEFIHOSR{|zǰ«ëŬƮǯɰʱ˱̲ʹεжѷѷҸԹպּ׽ؾٿڿܿ¸ùùKù΁(129CD5>?5>?4>?4>?3>>3=>2=>2=>2<=1;=1;=1;<1;;0:;0:;0::3==/9:#--BLMݽ2>?8DE8DE8DE6AC2;<-56+45+45+35+34+34(01+349?>DFEBDC?AA?A@=@@8<;265/22)0185/X)X)X)X)X)W)W)W(V(V(V(V(U(U'T'T'T'S'S'S&S&R&R&Q&Q&Q&P%P%O%O%O$N$N$N$M$M$~L#}L#}L#|K#{K#zJ"zJ"yI"xI"xH!wH!wH!vG!uF!tF rF rE qD qD qD pDoCnBmBmBkAj@j@h@h?g>f>e=e=d<b;b;a;`:_9^9]8\7[7IFAFJIDGEFIHHJIHJICEEPPOߙּƯªëĬƭǮȰʱʱ̲ͳεжѷҸҸԹպֻ׽ؾٿڿۿ¸ù寯Ż`lm*249DE5??5??5>?4>?3>?3>>3=>3=>2=>1<=1;=1;=1;<3=>0:;%./,66wN\]4?@@@=@?;?>:?>9==687&/2lJ,[)W)X)W)W(W(W(W(V(U(U(U(U'T'T'T'S'S&R&R&R&R&Q&Q&P%P%P%P%P%O%N$N$M$M$M$~L#L#}K#|K#{K#{J"zJ"zJ"yI"xH"wH!vG!vG!uG!tF sF rF rE qD pD pD oCnCmBlAlAk@j@h?i@h?g>e=d=c<d<b;a;`:`:^9]8\8[8[5R<*CIJFHGEIGFIGFIHHJIEGG9>?gca湥ªëĬƭǮȰɱ˱˲ͳε϶ѷҸҸӹպֺ׼׾ٿٿۿ¸ùùĺŻƼƼǽ)ALM*348BC8BB5@@5>?5>?4>?3>>3=>3=>3=?4?@4>@/9;&/1/9:o}~q1=@=IK:FG:EG9EF9DF8DE8DE7CE5?A-67*23;@@EHGBFE@CB?BB>AA=@@;??:>>9>=;=;2:f>e=d=c<b<b;`:_:_:^9]8\8[7Z7Z5KB9DHIEHEEHGEIGFIGFIHJLK?CCKLL}wheduyxëĬƭƮȯɱʱ˲ͳδϵжѷҸӹչֻ׼׽ؾڿۿ¸¸ùĺŻƼƼǽȽŻɿ3n|}+45,574>?6AA8BB8AB8AB6AA4?@1;=(23'226@Bn|}ϥ1>@=JL;HJ;GI:FH:FG:EG9EF9DF9DF4AB?HJSTTIKK@DC@CC@CB>BA=A@:>>9=<8<;5::ހR-Z(X)W)W(W(W(V(V(V(U(U'U'U'T'S'S'S'S&R&R&R&R&Q&Q&P%P%P%O%O$N$N$N$M$M$M$~L#}L#|K#|K#|K#{J"zJ"yI"yI"xH"wH!vG!uG!uG!tF!sF rE qD qD pDoCnBnBmBlAkAj@j@i?h?g>f>e=e=d<c;a;a;`:_9^9]9]8[7Z6Y6Y5S8"FHGGHGGIGFIHFIHGJIDGFBDD6<;$./798JQQjlkĪªīŭƮȯɰʱ˲̳ʹϵжѷҸӹԺջ׼׽ؾٿڿ¸ùĺŻƼƼǽȾɾɾɿ\ɿ1εfqr=FH.79(13(12(11*33/899DEfrsۡ8FH>8==:=<.8f>f=e=d=c<b;b:`:_:_9^8\8\7[7Z6Y6W5Y4G9,4?B8===AAAEE;@?3881763886;;299488@@>_YV«ªëŭƭǯɰʱ˲̲ʹεжѷҸӹԺպֻ׽ؾٿڿ¸ùĺŻƼƼǼǾȾɾɿç2Ѹԅ؈؅ؒRad:GJ@MO>KL=JK:??:>>9=<5;;@=9V*X)W)W(W(W(V(V(V(U(U'U'T'T'T'S'S&S&S&R&R&Q&Q&Q%P%P%O%O%O%O$N$N$N$M$~M$~L#~L#}L#}K#|K#{J"{J"zJ"yI"xI"xI"wH!vG!uG!tF!tF!sF rE qD qD pD oCnCmBmBlAkAj@j@i@h?f>f>e=e=d<b;a;a;`:_:^9]8\7[7Z7Z6X5W4W4R3/53+68-68-88.782762873873884993991987:9KGEʰëŭǯȯɰʱ̲ͳεжѷҸҸԹպֻ׽ؾٿڿܿ¸ù寯ƼƼǽȾɾɿȾ2o1?ABPR?LN>KN>KM=KL=8==9=<19e=d=c<c<b;a;`:`:^9]8\8\7[7Y7Y6X5V4V4X3I4!+79.78.78.890782662772873883884:96<<7<KN>KM=KL>KL[__fgf_a_]__[^]Z\[WZYVYWTVVRUURVUQSSFII;?>/9f>e=d<c<c<b;`:_:^9^9]8\8[7Z6Y6X5W5V4U3T3U2;4+*69.67.78.890782662772773872::6>>;@?5<<9BCgkiƯ˲˲δ϶зѷҸӹԺֻ׼׽ؾٿۿ¸¹ùĺŻƼƼǽȾɾɿ$cϣ1?ADSTAOQ@OP@OO@NO?NO?LO?LO;ILV\\ege^``^`_[_]Y\[X[ZVZXTWVSVUQUTOSRNQPNQPHMOGFBڌV)W(W(V(V(V(V(U(U'U'U'T'T'S'S'S&S&R&R&R&R&Q&P%P%P%P%O%O%O%N$N$N$M$M$M$~L#|L#}L#|K#{J"zJ"yI"xI"xI"wH!wH!vG!vG!uG!tF sE sE rE rE qD pDoCnCnBmBlAk@j@j@h?g>f>f>f=e=c<b;b;a;`:_9]9]8]8\7Z7Y6X5W5W5V4T3S2S2P1044,67-67-78.88077266276277099/::2;;8>>:>>(23pmjڽ̳жѷҸӹԺֻּ׽ؾٿۿ¸¸ùĺŻƼƼǽȽɾɿʿƻsaow2ϾDRTDRTCRSBPRAPQAOQ@OP@NO@NOf>e>e=d<c<c;a:`:_:_9^8\8[8[7Z6Y6X5W4U3U3T3S2R1S1E2 )59.56-67-67-78067166277/9:/::/::/:;2;<8>>189ݐܿзӹԺպּ׽ؾٿۿۿ¸ùĺŻƼƼƼǽȾɾɿ|2ϿAPRAPRETVDRSCQSCQSBPRAOQAOQ?NOPYYdge_cb]a`[__Z^]X\[VZYUYXSWWRVUPTTOSRLQQMPNBMReQ=W&V(V(V(V(U(U(U'U'T'T'S'S'S'S&S&R&R&Q&Q&Q%P%P%P%P%O%O%O$N$N$M$M$L#~L#~L#}L#|K#|K#|K#{J"zJ"yI"xI"xH!xH!wH!vG!uG!uG!tF sF rE qD pDpDoCnCmBmBlAkAj@i@i?i?h?g>e=d=d=c<b;a;a:`:_:^9]8]7[7Z7Y6X5W5V4U3T3S3R2Q1P0Q/92*(49-56-67-67-67166077.89/99/9:/::0::0:;2;<(34ݑۿӹֻ׽ؾٿڿ¸ùĺŻƼƼǽȽɾɾɿ1ϿBRTCSTGVWETUDSUDSTCRTCQSCQS@OPJUVdff_cb^a_\`_Z_]X\[VZ[UZYSXVQVUPUTOTSMRQLPOGOPVPF׌W*W'V(V(V(U(U(U'T'T'T'T'S'S&S&R&R&R&Q&Q&Q&P%P%P%P%O%O%O$N$N$N$M$~L#L#~L#}L#}K#{K#{J"{J"zJ"yI"xI"wH!wH!wH!vG!uG!tF!tF!sF rE qD pD oCoCnCmBlBlAkAj@j@i@i@h?g>f>e=d<c<b<a;a;`:_9_9]8\8\7[6Z7Y6X5W4U3U3T3S2R1Q1O0O/L0120)37,46-57-67.67.78.88.89/89/99/::0::1;;2;<#02ݯùռؿڿۿ¸ùĺŻƼƼƽǽȾɿʿ4ϿCSUDSUHWYEUVEUVETUESUDSUDSTCQSDRS^cb`dc^a`\`_Z_^Y\\V\ZUZYTXXRVVPUUOTTMRRKPPKPOGNO΃U/W&V(V(V(U(U'U'U'T'T'S'S'S'S&S&R&Q&Q&Q&Q&Q%P%P%P%P%O$N$N$N$N$M$M$~L#~L#~L#}L#|K#{K#{J"{J"zJ"yI"xI"wH!vG!vG!uG!tF!sF sF sF rE qD pD oCoCnCmBlBkAkAj@i@h?h>g>f>e=d<d<c<a<a;`:_9^9^8]8\8[7Z6X5X5W5W4U3T3S2R1Q1Q1O0N/O.E/)36+35+36,57-67-67-78.78.89.89/99/9:/::2<<,77FKJջڿ¸ù寯ƼƼǽȾɾɿ%ETWFUWIX[GVXFVXFUWFUWEUVETUETUBQSV^^bfe]ba\a`Z_^X]]W[[UZYTYXSWWQVUOTTNSSLQQLQOANTwT5W&V)U(U(U(U(T'T'T'T'T'T'S&S&R&R&R&Q&Q&Q%P%P%P%O%O%O%O$N$M$M$M$M$~L#}L#}L#}K#|K#{K#{J"{J"zJ"yI"xI"wH!wH!vG!vG!uG!tF!sF sF rE qE pD pCpCnCnBmBlAk@j@j@i?h?g>f>e=e=d<c<b<b:a:`:^9]8]8\7Z7Z7Y6X5W4V4V4U3S2R2Q1P0P0O0M/L.M->/ '37,34+36+46,57-67-67-78.78.89/89/99/9:3<<"/1ztpɿڿ¸øùĺŻƼƼǽȾɾɿѳI):dE-GWXHWXKZ\IWZHWYGWYGVXFVWFVWEUWCTUMYZaee^cb\a`Z`_Y^^W\[UZZTYYRWWQVVOUTOTSLRRLPODOSdQ?V'V(V(U(U'U'U'T'T'S'S'S'S'S&R&R&Q&Q&Q&Q&Q%P%O%O%O%O%N$N$N$M$M$M$~L#}L#}L#}K#|K#{J"zJ"zJ"zI"yI"xI"wH!wH!vG!uG!uG!tF!sF rE rE qE qD pCoCnBnBmBlAkAk@j?i?h?g>g>f=e=d=c<b;a;a;`:_9^9]8\8[8[7Z6X5X5W4V4T4T3S2Q1Q1Q0O0N/M.L.K-J,50'(25+33+35+46,57-67-67-67.78.88.89/89/9:0;;(45ޱɿ¸ĺŻƼƼǽȽɾɿвG( =bC+rHXZIYZL\^JZ[IY[IYZIWZHWYGVYGVXFVWEUV[bb`dd\a`Z_`Y_^W][V[ZUZZSXXQVVPUUNTTMSSLRPFPRQPJԌV)V'U(U'U'U'U'T'T'T'S'S'S&R&R&R&R&Q&Q%Q%P%P%P%O%O%O%O%N$N$M$M$M$~L#~L#}L#}K#}K#|K#{J"zJ"zJ"yI"wH"wH!vH!vG!uG!tF tF sF rE qE qE qD pCoCnBmBmBmBlAkAj@i?h?h?g>f=e=d<d<c<a;a;`:_:_9^9\8[7Z6Z6Z6X5W5V4V3T3S3S2Q1P0O0N/M.L.K.J-J,G+-1/(25*23+35+36+46,57-67-67-78.78.89.892:;%13TWUǽŻƼƼǽȾȾɿʿвI)EbB*UIY[JZ\M]`K[]K[]JZ\JZ[JZ[IXZIWZHWYEUXO[\`ec\ba\a`Z`_W^]V[[U[ZSYXQWVPVUOUUMSTMRRIPQPPKԆU,U'U(U(T'T'T'T'T'S'S'S'S&S&R&R&Q&Q&Q&Q&Q%P%O%O%O%O%O$N$N$N$M$M$~L#~L#}K#|K#|K#|K#{J"zJ"yI"yI"yH"wH"wH!vH!vG!uG!tF tF sF rE qE qE qD pCoCnBmBmBlAkAj@i?h?h?g>f>e=d<c<c<c<a;`:_:^9^9]8\7[7Z6Y6Y6X5V4U3U3T2R2Q1Q1P0O0N/M.K-K-J-H,H+C+,0/)23*23*34+35+36,46-57-67-67.78.89/892;<#/1ܭŻǾɾɾͯO/^>%)ϸM]_K\]O_aL\_L\^K[^K[]K[\JZ\JZ[IYZIXZHWYM[]M[^O[]R\]S]]U\\U[ZTZYRXXPVVOUUNTTLSSKQQDOS̀T0V&U(U'U'T'T'T'T'S'S'R&R&R&R&R&R&Q%Q%P%P%P%P%O%O$O$N$N$N$M$M$M$M$}L#}K#|K#|J#{J"{J"zJ"yI"xI"xH"xH!vH!vG!uG!uG!tF sF sF rE qE qD qD pCoCnBmBlAlAkAj@i@h?g>g>f>e=d=d<c<b<b;a:`:^9]8\8\8\7[7Y6X5W5V5V4U3T3S2R1P0P0O0N/M/L.K-J,I,H+F+H)?+'14*12*23*23*35+35+46-67-67,56+45+34,45(+WWUȾɾɿͯN.]>$ϏARUO`bP`bN_`N^`M]_L\_L\^K[^K[]KZ\JZ\JZ[JZ[M\]K[]JZ]IY\IX[IX[LX[NXYPWWPVVNTTLTSJRRDPTtS6U%U'U'U'T'T'T'T'S&S&S&R&R&R&Q&Q&Q&Q%Q%P%P%O%O%O%O$O$N$N$M$M$~L#~L#~L#}L#}K#|K#{J#{J"{J"zJ"yI"xH!wH!vG!vG!uG!uF!tF sE sE rE qD pD pCoCoCnBmBlAkAkAj@i@i@h?g>f>e>e=d=c<b;a;a;`:_9^9]8\8\8[7Z6Y6X5W5V5V4T3S2R2Q1P0O0O0M/L.L.J-I,H+G+F+E*E(9,'24)12*12*33+34*24(02'./'-/&..&..'/0,23#&Ⱦ̮N.]=$UωEWYSdfPadO`bO`bO_aN_aN__M]_L\_L\^K[^K[]KZ\L\^M]_M]^M\]L[]KZ]JZ\IY\HW[HWZJVXLUULSRGPStS7U%U'T'T'T'T'S'S'S'S&R&R&R&R&R&Q&Q%P%P%P%P%P%O%O$N$N$N$N$M$M$M$~L#}L#}K#|K#|K#{J"zJ"zJ"zI"yI"xI"xH!wH!vG!vG!uG!uF!sE rE rE qD pD pCoCnBnBmBmBlAkAjAj@i@h?g>f>f>e=d=c<b;a;`;`:`:_9^9]8\7Z7Z7Y6X5X5V4U3T3T3S2R2Q1P0N/M/L/L-K-J-H,H+F+E*D)C(D'7+(13*11(00&-.$,,$++%,,%,-&-/'./'//+22"$hdaѳO/^?&ewxEXYTfhQceQbdPadPacO`bO`aO_aN_`N__M]_L\_L\^K\^N_`M^`M]`M]^M]]M\]L[]KZ]JZ\JY\HX[KWX=U^fT?֑U$U(T'T'T'T'S'S'S&R&R&R&R&Q&Q&Q&Q%Q%Q%P%P%O%O%O%O$N$N$M$M$M$~L#~L#}L#}L#|K#{J#{J"zJ"yI"yI"yI"xH"wH!wH!vG!vG!uG!tF!tF sE rE rE qD pD pCoCnBnBmBlAkAj@i@i@h?g?g>f=e=e=c<b<a;`:`:_9^9^9]8\7[7Z6Y6Y6X5W4V4T3S2S2R2P0P0O0N/M.L.L.J-I,H,G+F*D)D)B(A'B&1+#!,0%*)$+*$++$+,$,,%,,%,-%,-'-/(/0%--177ٿ~D$U6UϠPacOabVhiSdfRdeQceQcdQbdPadO`cO`cO`aN_aN_`N^`M]_M]_P`bN_bN_`M^`M]`M]^M]]M[]L[]KZ]MYZ@YccWGU'U'U'T'T'T'S'S&S&S&S&R&R&R&Q&Q&P%P%P%P%P%P%O$N$N$N$N$N$M$M$~L#~L#}L#}K#|K#|K#{J#{J"zJ"zJ"yI"yI"wH!vG!vG!vG!uG!tF!sF sE rE qD qD pD pCoCnBmBmBlAkAj@i@h?h?h?g>f=f=e=d<c<b<a;`:_:^9]8]8\8\7[7Z6Y5W5W5V3U3T3S2R2Q2Q1O0N0N/L.K-J-J,H+H+F+E*D)C)B(@'@&>&*'! *-%*+$++$++$+,$+,$,,%,,%,-&-.+12!xeE#Z6|pI[^VgjVhjTfgTegSefRdfQdeQceQbdPbdPacO`cO`bO`aN_aN_`P`aQabP`bO`bN_aN^`M^`M]_M]^M]]O\[C\edXHT'T&T'T'S'S'S'S'R&R&R&R&R&Q&Q&Q%Q%P%P%P%O%O%O%O$N$N$N$M$M$M$~L#~L#}L#|K#|K#{J#{J"zJ"zJ"zI"yI"xI"xH"wH!vG!vG!vG!tF sF rE rE qD qD pDoCoCnBmBlAlAkAj@i@i?h?h?g>g>f=e=d<c<b;a:a:`:_9^9]8\8\8[7Z6Y6X5W4V4U4U3T3S2Q1P0P0O/M/M/L.K-J-I,G+F*F*D)D(B(A'@'?&?%=%*(! ),$)*$++$++$++$+,$+,%,,%,-)00 zuzhG& v] X5 ϏVhjObdYlmVhjUgjUgiUfhTfgTegSefRdfQdeQceQcdPbdPacPacO`bO`aQbdRbdRbbQabP`bO_bN_aM^`M]`P]]D^feYIT&T&S'S'S'S'S&S&R&R&R&Q&Q&Q&Q&P%P%P%P%P%P%O%O$N$N$N$N$M$M$~L#~L#}L#}K#}K#|K#|K#zJ"zI"yI"xI"xI"xH"wH!wH!vG!uG!uG!uF!tF sF rE rE qD qD pDoCoCnBmBlAkAkAj@i@i?h?g>f=e=e=d<c<b;a;a;`:_9^9^9]8[7[7Z7Y6X5W5W4U4T3S2S2R1Q1P0O0N/M.K-K-J-I,H,G+F*E)D)B)B'@'@'>&<%<$;$*'!),#)*$*+$++$++$++$+,$,,'..#%OOMiJ3O-X< Y53Ϯhy{N`bYjlYlmWjkWikVijUgjUgjUfiUfhTfgTefSdfRdfQdeQceQcdPadPacO`cRcfRcfRbeRbdRbbP`bP`bO_bO_`C`keZJT'S'S'S'S'S&S&S&S&R&R&R&Q&Q&Q%Q%P%P%O%O%O%O%O%O$O$N$M$M$M$M$~L#~L#|K#|K#|K#{J#{J"zJ"zI"yI"xI"wI"xH"vG!vG!uG!tF!tF!tF sE rE qE qD pDpDoCnCnBmBlAkAj@j@i@h?h?g>f>e>e<d<c<b;b;a;`;_:_9^9]8\7[7[7Y6X6X5W5V4U3T2R2R2Q1Q1P0N/M/L.K-J-J,H,G+F+E*D)C(A(A'@&?&>&<$;$:#9#)&!*,"))#)+$*+$++$++$+,&-.$$MLKɿ_@)Q/yR3 Y6wϪk~ObdVhk\nqYknYjmXjlWjlWjkVikVhjUhjUgiUfiTfhTegSefSefRdeQceQceQbdQbdSegSegRcfRcfRbeRbdRaaQ`aJahvW;ʋS'S&S'S'S&S&S&R&R&R&R&Q&Q&Q&Q%Q%P%P%P%O%O%N$N$N$N$N$N$M$L#~L#~L#}L#}L#}K#|K#{J"zJ"zJ"yI"yI"xI"wH"wH!wH!vG!uG!uG!tG!sE sE rE qD pD pCpCoCnCmBmBlAkAj@i@h?h?h?g>f>e=e=e=d<c<b;a;`:`9_9^9]8\8[7Z6Z6Y5W5W5V4U3T3S2R2Q2P1P0O0N/M/L.K-I,H,H,G+E*E*C)C(A(@'?&>%=%;$:#9"9"7!-# )+"))#)*#*+$++$++$++&-.#$̵G(X6e@ Z77{ϻύ^rtPdfYkm^qs\npZmoZloZknYkmYjlXjlWjkWikWikVhjVhjUgjUfiTfhTfgSefSdfRdfQdeRdeVggUfgSegRegRdfSbdQbfKdkzW8ЍS$S'S&S&S&R&R&R&R&Q&Q&Q&Q&P%P%P%P%P%O%O%O%O$N$N$N$M$M$M$M$~L#}L#}K#|K#|K#|K#{J#{J"zJ"yI"yI"xI"wH!wH!vH!vG!uG!tF!tF tF rF rE rE qD pD pCoCnBmBlAlAk@j@i@h?h?h?h?g>f>e=d<d<c<b;a;`:_9^9]8]8\8[7[7Z6Y6X5X4V4U4T3S2S2R1P1O0N/N/M/L.K-J-I,H,G+F*D)D)C)A'A&?&>&=%<$;#:#9"7!6!6 -" )+"))")*#)*$*+$++&--"#̵ʿkXE% Z7c> Z77{ڔ֍ʍuvlUikVil^qtasv^qs\oq\oq\np[np[moZloZkoYknYjlXjlWjkWjkWikVhjUgjUgiUfiUfhTegTefSdfSdfVgiVghUggTfgUeeNfkSce{W8ьS$S'S&S&R&R&R&Q&Q&Q&Q&Q%Q%P%P%P%P%O%O%O%N$N$N$N$N$N$M$M#~L#~L#}L#}L#}K#|K#{J"{J"zJ"zI"yI"yI"yI"wI"vH!vG!vH!uF!tF!sF sE sE rE qE qD pDoCoCoCnBmBlAlAk@j@i@h?g?g?g>f=e=d<c<c<b;a;`:_:_9]8\8\8\8[6Z6Y6X5W4V4V4T3S2S2R2Q1P0O0N/M.L.K-J-I-H,G+F*E*D)C(B(A'@&?&=&=$;$:#9#8"7!6 4 4 ,!!((!)*")(")*$)+&,-##͵ƻ[>'L-Y6g@ \87?Lgj7f}{jcz}\rtcdZig]nl_gtravy`tu_rt_qt^ps]ps\oq\oq\np[noZmoZloZknYknYjmXjlWjkWikVikVhjUgjUgiUfiTfhTegTfgWhkVgjVghWffPin_bZU,R$S&S&R&R&R&Q&Q&Q&Q&Q%Q%Q%Q%P%P%P%P%O%O%N$N$N$N$M$M$M$M$M#~L#}K#}K#|K#|K#|K#{J"zJ"yI"yI"xI"wH!wH!wH!vH!vG!uG!uF!tF!sF rE rE qD pD pCoCnCnBnBmBkAkAk@j@i?h?g>f>f>f=e=d<c<b;b;a;a;`:_:^9]8\8[7Z7Z7Y6X5W5W4V4U3T2S2Q2Q1P0P0O/M/L.K-J-I,I,H,G+F*E*D)B(A'@'?&>%<$<$;#9"8"7"6 5 4 22 .#&# )+"((")*$+,"$ζǽD& S3Y6g> ]8vl7mznqrhqodqodmpg_uw`tv_tv_su_ru_qt^ps]pr]pr\oq\np[npZmoZloZknYkmYjlXjlWjkWikVikVhjUgjUgiUfhUgiWjmXhjWgjOjtp\GR&S%S'R&R&R&Q&Q&Q&Q&Q&Q%Q%P%P%P%P%O%O%O%O%O%N$N$N$M$M$L#~L#~L#~L#}L#}K#|K#{J#{J"zJ"zJ"yI"yI"yI"wH!wH!vH!vG!uG!uG!tF!tF tF sE rE rE qD pD pCnBmBmBmBlAlAj@j@i?h?g>f>f=f=e=d<d<c<b;a;`:_:_:^9]8\8[7Z7Z6X6X5X5V5V4U3T3S2R1Q1P0O0N0N/M.L.K-J-I,G+F*F*E*D)C)B'A'@'?&=%<$;$:#9"8"6!5 42100 . &" )+!((%++ʳʿȾƻfI4E'T3Z6lA _9mmnm8orioskppfrobgsp_ux`tv_tv_tv_su_ru_qt^pt]pr\pq\np\np[np[moZloZknYkmYjlWjlWjkWikVijVhjUgjUgiYjjTmsUjo}W6؊Q$R%R&R&Q&Q&Q&Q&Q&Q&Q&P%P%P%P%O%O%O%O%N$N$N$N$N$M$M$M$M$L#}L#}L#}K#|K#|K#|K#{J#zJ"zI"yI"xI"xH"xH"wH!wH!uH!uG!uF!uF sF rE rE rE qD qD pDoCoCnBmBmBlBlAdA$j@j@i?h?g>f>f=f=e=d<c<b;a;`:_:^9^8]8\8\7[7Z6Y6X5W5V5V3U3T3T2R2R1Q1P0N/N/M/L.L.J-I,H+G+F*E*D)C(B'A'?&?&>%=%<$;#9#8"7!6 4 321/ . - , '"))%&798żɿȾǽøxA$ O1S2[7vH#`:mlu\BwP-v]Drqfptkpqfdtuaux`uw`tv_tv_su_su_rt_qt^ps]pr\oq\oq[np[noZmoZkoZknYjmXjlXjlWjkWikWhiUhkSovhdVU-Q$R&R&R&Q&Q&Q&Q%Q&Q&P%P%P%P%O%O%O%O%O$N$N$N$M$M$M$M$M$~L#~L#~L#}L#}L#}K#{J#{J"zJ"zJ"zJ"yI"yI"xH!wH!wH!vG!vG!uG!uG!tF!sF sF rE qD qD pDpCoCnCnBmBlAlAlAh?FC=dA#j?h?g>f>e=e=e=d<c<b;a;`:_:^9]8]8]8\8\7[7Z6Y5W5V4U4T4T3S3R2R2Q1P0O0N/M/L.K-K-I-H,G+F+F*D)C)B(A'@'?&>%=%<$:#9#8"7!6 5 4 220. . , * * )VWVɿȾǽݏŻʯK0G*O0U3Z6Y5xM(wG{H}P*yaGspcmvrbw|cuwbuw`uw`tv_tv_su_ru_rt^qt^ps]pr\oq\oq\np[moZmoZloZknYjmZjkWjmRlrZhf{Y8߈R%Q$R'R&Q&Q&Q&Q%Q%Q%P%P%P%P%P%P%O%O%O$O$O$N$N$N$M$M$M$~L#~L#~L#}K#|K#|K#|K#|K#{J#{J"yI"yI"yI"xI"xI"wH"wH!vH!uG!uF!tF!tF sF rE rE qD qD qD pDoCnBmBmBlAkAkAl?bJ4BKNb> i?g>f>e=d=d<d<c<b;a;`:_:_:^9]8]8]8\7[7Z6Y6X5W4V4U4T3S2R2R2Q1P0O0O0N/L.K-J-I,H,G+F*F*E*C)C)B(@'?&>&=%<$;#:#9"7!7!6 4220/ . - + * ) ) !;.&ǼȾǼŻĺپƿmR?>" M0O0V4\7Z6wH"vH"yJ#}K!J Q+{`Fnsmb|cwzctvauw`uw`tv_tv_tv_su_qt_qt^ps]pr\pq\op\np[mn[lnYlpUmu\iiq]GS+Q#Q&Q&Q&Q&Q&P%Q%Q%P%P%P%P%P%P%O%O%O%O%N$N$N$N$M$M$M$M$~L#~L#}L#}L#}K#|K#{J"{J"zJ"zJ"zJ"yJ"xH"xH"wH!wH!vH!vG!vG!uG!tF sE sE rF qD qD qD pD pCoCnCnBmBmBlAkAj@i@a\V]addH0g<f=e=d=c<c<d<c<b;a;`:_:^9]8]8\7[7Z6Y6Y6X5W4V4V4U3T2S2Q1Q1P0O0O0N/M.L.K-I,I,H+G+E*D)D)C)A'A'@&>%>%=%;#:#9#8"7!6!5 3210 . - , + ) ( & & 3$ynȾʿȾǼŻù׼پ}cR=" K.L.P1W5^9\8vG!tG xI"|K#}L$L"K R*xcKfwwa{bw{buvatvatv`tv_tv_su_su_rt_ps_oq^op\prYqvXqw]lkq^IS+O!Q%Q'Q&Q%Q%P%P%Q%P%P%P%O%O%P%O%O%O%O%N$N$N$N$M$M$M$M$~L#~L#~L#}L#}L#|K#|K#{J#{J"zJ"yI"yI"xI"xI"xI"wH"wH!wH!uG!uG!tF!tF sF sE rE rE qE qD pCoCoCnBmBmBlAkAk@j@j?gG,_bb`efdO=f<f>e=d=c<b<b<b;a;`:_9^9]8\8\7[7Z6Z6Z6X5W4W4V4U3T3S2R1Q1P1O0N/N/M/L.K-J-I,H,G+F*E*D)C(B(A'@'?&=%<$<$;$:#8"7"6 5 3 320 / . , + * ( ' & $ $ 0"wlǼʿɾǽݏؽؾļ]C1cYMaedaffdOd<c<b;a;a;`:_9_9^9]8\8\7\7[7Z6Y6Y6W4V4U3U3T3S2R1R1Q1P0O/M/L.K-K-J-J-H+G+F+F*E*C)B(A'A'?&>&=%<$;$:#8"8"6!5 4320/ . - , * ) ( & % $ " " #  0#o\RǼƻƻùĻŽŬuhI19 G,G+K-O/S2Z6b;`:sF rE EvG!zJ"|K#}L#L#M%N%M"L Q*z[>pi[ipkbw{awzavy_wzcqoikbpdQy[>S,O"O!P#Q&P&P%P%P%P%P%O%O%P%O%O%O%O$O%O%N$N$N$M$M$M$M$M$M$M#~L#}L#}L#}K#}K#|K#{J"{J"{J"zJ"yJ"yI"yI"xI"xH"wH"vG!vG!uG!uG!uF!tF!tF sF rE qE qD qD pDpCoCoCnBmBmBlAlAkAjAi@i>gG-cghddbdffd]Ud=d<c<b;a;`:`:_9^9^9^9]8\8\7[7Z6Y6X5W4V4U3U3S3S2S1R1Q1P0O0N/M.L.K-J-I,H+G+F+E*D)C(C(A'@'@'?&>%<$;$:#9"8"7!6 5 3210 / - , * * ) ' % $ # !      8)kXMxӹϹۿyiRCC,3<"D*E*H,L.P0T3[7b;E`:qD pC =tG!yI"{J#|K#~L#M$M$N$N%M#M M!P&~U3U2U1~V2S,O"O"N O$P&P&P%P%P%P%P%P%P%O%O%O%O%O%O$O$O$N$N$N$M$M$M$M$M$M$M$M$~L#}L#}L#}L#|K#|K#{K#{J#{J"zI"yI"yI"yI"xI"wH!wH!vH!vG!vG!uG!uG!tF sF rE rE vFsE pD oC oDoCnBmBmBlAlAlAj@j@i@i@i=eZOdhidecdhgd_Yd<d<c<b;a;`:`:_9^9^9]8\8[7[7Z6Y6X5W5V4V4U3T3S2R2Q2Q0P0O0O0M/M.L.J-I,H,H+G+F*D)C)C(B(A'?&>&>%<$;$:#9"8"8"6 5 4 210/ . - + * ) ' & % # "    # $   <*N;-L8*M9+P;,6!-/9"@'A'C(F*I-M.Q0U4\8c<=a;oCnB:sE xH"zJ"|K#}K#~L#~L#M$M$M$N%O%N$M"N"N"N"O$P&P&P&O%P%O%P%O%O%O%O%O%O%O%O$O%N$N$N$N$N$N$M$M$M$M$M$M$M$~L#~L#~L#}L#|K#|K#|K#|K#{J"zJ"zJ"zJ"yI"xI"xH"xH"wH!wH!wH!uG!uG!uG!tF!tF sF rF sE kB!U:%lC!sEqDnCmCnBmBmAkAk@k@i@i?i?h=gG-ejjfgefgfegffgecC(b;b;a;`:_:_9^9]8]8\8[7Z7Z6Y6X5X5W5V4U3T3S2R2Q1P0O0O0N/N.M.K-K-J-I,H,G+F*E*D)C(B(A'@'?&>&=%<$:#:#9"7!6!5 4321/ . - , * * ( ' % # # !   ! # % ** , '%(*,5 :$<%=%>%A'D)G+J-N.R2V5^9g>:d=oC G,rE vG!yI"zJ"{K#|K#~L#~L#M$M$M$N$N$N%N%N%O%O%O$O%O$O%O%O%O%O$O$O%O$O%N$N$N$N$N$N$N$N$M$M$M$M$M$M$~L#~L#~L#}L#|K#|K#|K#{J"{J"{J"{J"zJ"yI"yI"yI"xI"xI"wH!wH!vG!vG!vG!uG!tF tF sF sE sE rE qE sEN7&1,+K6&e@!qCpCmBkAkAkAj@j@i?h?h?f=g]RglmghfgigghfhlmcE-a9a;`:_9^9^9]8\8\8Z7Y6Z6Z6Y6X4W4V4U3T3S2R2Q1P0P0O0N/M/L.K-J-J,I,H+G+E+E)D)D)B(@(@'?&?&=%<$;$:#9#8"7 6 5 3210 / . , * ) ( ' % $ # "     " # % ' ) * -023 5!7!9";$=%?&B(E*H,K.O/S3Y6_:٫l-d=pD tF!wH!yI"zJ"|K#}K#~L#~L#M$M$M$N$M$N$N$N$N$N$N$O$N$N$O$O$N$N$N$N$N$N$N$N$N$M$N$N$M$L$L#M#M$M$~L#~L#~L#}K#}K#{K#{J#{J#{J"{J"zI"yI"yI"yI"yH"xH"wH!wH!wH!vH!uH!uG!uF!tF!tF tF sF sE qD qD pD qDqD>1),+-4.+@2(Z;#mAoBlAi@i@i?i?h?h=fC&ikkikiikjikjijhimndH0a8a;`9^9]8]9]8\8[7Z7Y6Y6Y6W4W4V4U3T3S2S2Q2Q1P0O0N/M/L.L.K-J-I,H+G+F*E*D)C)B(A'@'?&>%=%=%;$:#9"7!7!6 4 3210 / . , + * ) ( & % $ " !    ! # $ & ( * + - / 1357!9#<$>%A'C(F*I-L.P0T3Z6b;xJ"oCsF vG!xI"yI"{J"|K#}K#~L#~L#~L#M$M$M$M$N$N$N$N$N$N$N$N$N$N$M$N$M$N$N$M$N$M$M$M$M$M$~L#~L#~L#~L#~L#~L#}K#|K#}K#|K#|J#{J#{J#{J#zJ"zJ"zI"yI"xI"xH"xH"wH"wH!vG!vG!uG!uG!uG!tF sE sE rE rE qE qD pCoCnCqDc?!3-+3-+0,+0,,=0)O7%e>lAj>h?h@g?f;hUEjpqjkijlkjljjjjkpqgWI`7`;_9^9]8]8\7[7Z6Y6X5X5W4V4W4U4T3T2S2R2P1P1O0N/M/L.L.K-J-I,H,G+F*F*E)C)B(A'A'@&?&=%<$<$:#9#8"7!6!5 4320/ . - , + ) ( & & $ " !     " $ & ' ( * , . 0 246 8":#=%?&A'D)G+K-N/Q1V4\7d<U2nBnB|qD uG!wH!xH"zJ"zJ"{J#|K#}K#~L#~L#~L#M#M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$M$~M$L#M$~L#~L#~L#}L#}L#}L#|K#|K#|K#{J#{J#{J#{J#zJ"zJ"zJ"zI"yI"xI"xI"xI"wH!vH!vG!vG!vG!uF!tF!tF tF sF rE rE qD qD pD pD pCoCnBmBqDP7%/+,5-+4-+1,,/,,4.+D2&dD*h@f;f<fB#klikomkmlknkknlkmjlrrfXJ^7^:^9]8\8[7\8\8\8[8Z7Y6X5X5O-O.T3R2Q1P1O1O/N/M/M.L.J.J,I,H,G+F*E*D*D)C(B(A'@'?&>%=%;$;$:#8"7!7!5 4310 0 . - , + ) ( ' & $ # " !    ! # % & ( * + - 0 135 7!9#<$>&@'C(F*H,K.O0S3W5^9e=|c<lAkAooCsF uG!wH!xI"yI"zJ"{J#{K#}K#}K#}L#}L#~L#~L#~L#M#M#M#M$M#M#M#M$M$~L$M#M$~L#M#~L#~L#~L#~L#~L#~K#}K#}L#}L#|K#|K#{J"{J#{J#zJ"zJ"zJ"zJ"zJ"yI"yI"xI"wI!wH!wH!wH!vH!uG!uG!uG!tF!sF sE sE rE rE qE pEpDpCoCoCnCnBmBlAlA=1(1,,4-+4-+4-+3.,,('SVVpkchS@f@ iVEnuvlnlmonmomlonmolmqokhc_<]9]9\8\7\8Z6U1O+N+ M+ P-Q.M*jJ2gG/P/R2P1O1O0O/N/M.L.K-J,J,H+G+F*E*D)C)C)B(B(@&>&>%=$<$;#9#9"7!6!5 4 3210 / - - + * ) ( & % $ # !   ! " $ & ' ) * , . 0 24 6 8":#=%?&A'D)F+I-M.Q1U3Y5`:h?of>lAj@$nBrE tF!vG!wH!xI"yI"zJ"zJ#{J#|K#}K#|K#}L#}L#}L$}L#~L#~L#~L#~L#~L#~L#~L#~L#~L#}L#~L#~L#}L#}L#}K#}L#}L#}K#}K#|K#|K#|K#{J"{J"{J"zJ"zJ"zJ"zJ"yI"yI"yI"xH!xH!wH!wH!wH!vG!vG!uG!uG!tF tF sF sF sE rE qD qD pD pDpDoCnBnBmBmBlAkAmB`%=%<$;$:#9#8"7!6 4 4210/ . - + + ) ' & % $ # !    " # % ' ( * , - / 125 7!9";$=%@&C(E*H,K-N/R1V4[6b;i?$f=h?d=lAqDsE tF vG!wH"yI"yI"zI"zJ"{J"{J"{K#|J!zN*vS9~J }L$}L#}L#}L#}L#}L#}K#}L#}K#}K#}K#}K#}K#|K#|K#|K#|K#{J#{J#{K#{J"{J"{J"zJ"zJ"zJ"yI"yI"yI"xI"wH!wH!wH!vG!vG!vG!uG!uG!uF!tF!tF sF sE rE rE rE qD qD pCoCoCoCnCnBnBlAlAkAk@i@nAU9#/,,4-+3-+2,*831mqpptqorootrpsqorpprpprppspprppqppsqmnlMH>KD9KE:LE::DDU[ZʲǾ¦X8K+R2P1O0O/N/M.L.K-J-J-I,H+G+F*E*D)C)B(A'@'?&>%>%<%;$:#9"8"7!6 5 3210/ . - , * ) ( ' & % # !     ! # $ & ( ) + - . 024 6 8":#<%?&A'C)F+I-L.O0S3W5]8d<oC j@nBjAnBqE sF tF!vH!wH!xH"yI"zI"yI"{J"{J#|IvQ5sUA}I{K$|K#|K#}K#}K#|K#|K#|K#|K#|K#|K#|K#|K#{J"{J"{K#{J"{J"{J"zJ"zJ"zI"yI"zI"xI"yI"yI"xH!wH!wH!wH!vG!vG!vG!vG!uF!uF!tF!tF!sE sE sE rE rD qD pD pD pDpCoBnBmBmBmBlAlAkAj@j@i?h?k@B2'0,,5.,0)'DA@uyxpsrqtsqtrqtrqtrqtrqtsptqpsqqtqqtqnpoASW=PT?QU:NQIUWηȽڿؽپƽS2M-S3O0O0O/N/M.L.K-J-J-I,G+G+F*E)D)D)B(A(@'?&>%=%<$;#:#9"8"7!6!5 43200 . - - + ) ) ( & % # " !    " # % ' ( * + . /135 7!9";$=%@'B'E)G+J.M/Q1U4Y6_:f>`:kAi?mBpD rE sF uG!vG wM,wH"yH"yI"yI"zJ#{IvP1pXI{I{K#{J#{J"|K#{K#{K#{J#{K#{J"{K#{J"{J"{J"{J"{J"zJ"zJ"zJ"zJ"zJ"yI"yI"yI"xI"xI"xI"wH!wH!wH!vG!vG!vG!uG!uG!uG!tF!tF sF sF sE rE qD qD qD pD pD oCoCnCnCnBmBmAlAkAk@k@j@i@i@h?i?a<5.*2-,0*'SRPx{zqtssutrutsutsutsutsusrussttrtstutpsqERSAOPDQR3DF͓ɾپڿùq]G& R1R2O0O0N/N/M/L.K.J-I,I,G+F*F*E*D)C(B(A'@'?&>&=%<$;$;#:#8"7!6!5 4 321/ / - , + * ) ' & % $ # !    ! # % & ' ) + - / 024 6!8!:#=%?&A'C(F*H,L.O/S2V4[6a;h?d<h?g>\kAoCpDrE tF!uEvP2wS8wFxI#xI"xI#zGrT?l]UzI zJ"zJ"zJ"zJ"zJ"zJ"zJ"zJ"zJ"zJ"zJ"zJ"zJ"zI"zJ"yI"yI"yI"yI"yI"xH"xH"xI"wH!wH!wH!vG!vG!vG!vG!uG!uG!uG!uF tF sF sF sF rE rE qE qD pDpDoCoCoCnCmBmBmBlAlAkAj@j@i@i?h?h?g?f>i?S7"1-,2+)decx{zsuttvutvutvutvutvutvutvutvttutuvuqtrFSUBPRFST1DF˛ȽپǾҶxXBK*S3Q1O0O0N/N/M.L.K-J-I,H,G+F*F*E*D)C)B(A'@'@'?&>%=%<$;$9"9"8"6!5!43210 / . - + * ) ' ' % $ # !     ! " $ & ' ( * , . 0 136!7!9"<$>%@'B(E)G+J-M.P0T3X5]8d<j@\i?e>b<h?mBoCqD rE sF tG"w`SvJ'vGxH!wI"yGpVFj_[wL)yI yI"yI"yI"yI"zI"yI"yJ"yI"yI"yI"yI"yI"yI"xI"yI"xH"xI"xI"wH!xH"xH!wH!wH!vG!vG!vG!uG!uG!uG!uG!tF tF tF sF rE rE rE qE qD pD pDpDoCoCnBnBmBmBlAlAkAk@j@j@i?h?h?g>g>f>f>d=j?F2$534tvtuyxuyvuxwuxvuwvuwvuwvuwvuxvuwuuvuvxvrtsGUVCQSFSU7HK̦Ǽ׽ҶfF-G& T4Q1O0O0N/M/M.L.K-J-I,H,G+G*F*E*D)C)B(A'@'?&>%>%=$<$;#9#8"8!7!6 4 3320/ . - , * ) ( ' & % # "     " $ % & ( * + - . 1246!8";#=%?&A'D)F*H,K-N/Q1U4Y6_9f>oDj@d<g>k@nBpCqD rF!sCvZHw_QuDvH"vH"wFpTAiaauN/xGxI#xI"xH"xI"yI"yI"yI"xI"xI"xH"xI"xI"xH"xI"wH!wH"xH"wH!wH!vG!vH!vH!vG!vG!uG!uF!uG!tG!sF tF tF rE rE rE rE qD qD pD pD pD oCoCnCnCnBmBlAlAlAkAkAj@i@i?h?h?g?g>f>e=e=d=e>^7LB;y~uzwvzxvzyvzxvyxvywvywvywvzwvywvxwwzwsvtHVWDSUCRTESUͶ¸Y9M-S4P1P0O0N/M/L.L.K-J-J,I,H,G+F*E*D)C)B(A'@'?&>&=%=%<$;$:#9"8"7!6!5 4310/ . - , + * ( ' & $ # " !     " # $ & ( ) + , . 0 23 6!7!9"<$=%@'B'D)G+J-M.P0S2W4[7a;h?ymAf>d=i?lBnCpD qE!rCtL-xljuR8tEvH"vG!mZOj`^qS=xGwH"wH!wH!wH!xH"xH"wH!wH!wH!wH!wH!wH!wH!wH!wH!vG!vH!vG!vG!vG!uG!uG!uF!tF!tF!tF!sF sF sF sE rE rE qD qD qD pD pD oCoCoCoCnBmBmBlBlBkAk@j@j@j@i@h?h?g>g>f>f>e=e=d=d>b9d?!vphy~xzyx{zx{zx{zx{zx{yx{yxzyxzxwzyxzxx{xtwvHWYETUDSUFSUϸǽqO.O.S3P1P0O0N/M/L.K.K-J-J-H,H,G+E*E*D)C)B(A(@'?&>&=%=%<$;$9"9"8"7!6 4 4320/ / - , + * ( ( & % $ # !    ! # $ % ' ) * , . / 134 7!8";#=%?&A'C(F*I,K-N/Q1U3X5]8d<k@h?d<c<Kg>k@mAnCoCqD rDwaTxkhtJ(tEuH%l\Uj`^oVEwEuG"wH!vG!vG!wH!vG!vH!vG!wH!vG!vG!vG!vG!vG!vG!uG!uG!uG!uF!uG!uG!tF tF tE!sE sF sF rE rE rE qD qD qD pCpCoCoCnBnBnBnBmBlAlAkAkAkAj@i@i?i?h?h?g?f>f=e=e=d=e=d<_5fK4vzww~~w{yw{zw{zwzyx{zy}{z{zy{{z|z{|{y{zy{zz|yvyxIXZHVX:MNuywbLD$S2S2P0O0O/N/M.L.K.K-K-J-H,G,G*E*D)C)C)B(B(A'@&?&>%<%;%:#9#8"8"7!6 5 4321/ . - , + * ) ( ' & $ # !    ! " $ % ' ( * , - . 0 246!8":#<$>&@'B(E*G+J-M.O0S3V3Z7_:f>mBKkAb;\8 e=i?kAmBnCpD pAtR9ymkwcYsEsG!l\Tk_\kZQtG#uG uG!uG!uG!vG!uG!uG!vF!uG!uG!uG!uG!uF!uG!tF!uG!uG!tF tF!sF sF sF sE sE sE rE rE rE qD qD qD qD pCpCoCnCnBnBnBlAlAlAlAkAk@j@j@i@i@h?g>g>g>f>f>e=e=d<e>`9`7yfU醈ӅԄքՄՅՆz}{z}||}twunrr}}z{z{|{wzxJX[GVX@SVbc^pM4J)T4Q2P0O0O0N/M/L.L.K.J,J,I+G+F*E*E*D)C)C(B(A'@'?&>&=%<$;#:#9#8"7!6!5 4 3100 / . - + + ) ( ' % $ # "    ! " # % & ' ) + , . 0 145 7"9";#=%?&A'D(E*H,K-N/Q1U3W4\8a;i?vH! mBlAb;g>j@kAmBnCoBqH'xhbxliuZGqDk[Tk_[o`YsI&tEtF!tF!tF!tF!uG!uG"vH#tF!tF!tG!tF tF!tF tF!sF sF sF sE sF rE rE rE rD rE qE qD qD pD pCpCpCoCnCnCnCmBmBmBlAlAkAk@j@j@j@i?h?h?h?g?g>f=e=e=d=d=e?[3mH+}y~}|}~~swuX^^qut~~{~|x{yMZ\GVYEVYMUTP5S1Q1P1P0O0N/M/M.L.K-J-I,I,G+F*F*E*D)D)C(B(@'@'?&>%=%<$;$:#:#9"7"6 5 4 3210/ - - , * ) ( ' & % # " !     ! " $ & ' ( * , . / 1246!8":#<$>&@'C(E*G+J,M.O0R2V4Z6^9c<lAY5a;`:md<h>j@lAmBnC nAu\LykgxkitWDo]TugczliuQ6sCtG"uG"tH"tG"qDo@l<sF sF sF sF sF sF sE sE rE rE rE rE rE qD qD qD pDpD pD oCoCoCnBnCnCmBmBmBlBlAkAkAkAj@j@i@i?h?h?g>g>f>f>e>e=d<d<d>c<Z2_GĮ|y|~~~{~|_edZ`_osr~y|zHZ[GWYT]^flm`_\P0P0O0O0N/M/L.L.J-J-H,H+G+G+F*D*D)C)C(B'@'@'?&>%=%<$;$:#9#8"7!6!5 4 2110 / . - , + ) ( ' & % $ " !     " $ % & ( * + - / 0 245 8"9";$=%@'A'D)G+I,K-N/Q1T2W5[7`:g>nBmlA_9]8#b;f>h?j@kAlBm@oI+xidxidxhczidyidsgdqVCpApCl=l>m>xL)_@{csF"rErE rE rE rE rE rD rE qD qD pE pD qD pCpDpDoCoCoCnBnBnBnCmBmBlBkAkAkAj@j@j@j@h@h@h?g>g>g>f>e=e=d=d=d<e>^7b;ub¬«|xuހ~~πbih\cbS\\˃|xysced[ddckidhf`hiKIAO.N/N/M.L.K.K-J-I,G,G+G+F*E*C)C)B(B(A'@'?&>%=%<$;$:#9#8"7!6!5!43210/ . - , * * ) ' & % # # !     " $ % & ( * + , . / 1346!9":#=$>&A'C(E*G,J-L.O0R2V4Y7]8b;j@qD #nBd<`:c<f>h?j@kAlBmAwbXzlhxidsd`ue`~sF"zO-kPv^ĩֿtm@rE!qE qD qD qE qD qD pD pD pDpDpDoCoCoCoCoCnBnBmBmBmBmBlAkAkAkAj@j@j@i@i?h?h?h?g?g>f>f=e=e=d<c<c<d=X0rN3Į|to쁇ρgnmYabbihΐ|rluosnxplkmkXbbEY]M>/N.M/L.K-K.J-I,H,G+G+E*E*C)B(B(B(@'@'?&=%<$<$;$:#9#8"6!6!5 4 3221/ . - , + * ( ' & % $ # " !    ! # $ % ' ) + + . / 1 346 8"9#;$=%@'B'D)G+I,K-N/Q1T2W5[7_:e=lAe=^9]8j`:d=g>h?jAmC!l@mK1sfcxhczӹжǭɯԼսҺӻŪoCnBqE pDpD pCpDpCpCoDoCoCoCoCnBnCnCnBmBmBmAlBlBlAkAkAj@j@j@j@i?h?h?h?g>g>f>f>f>e=d=d<d<c<c<b;^7mWDZ«««ůưưưưưDz{t~sǹЀσrwvQ[]~}z٫~nitosnsntosliS^^FY\I2L,L.J-I,I,H+G+F+E*E*D)B(B(B(A'?&?&=%<$<$;$:#:#8"7!6!5 4 3210 / . - + * * ) ( & & % # " !    " # $ & ' ) * + - / 0245 7!9";$=%?&A'D)E*H+K-M/P0S2V4Y6]8b;i?oCjnB[7X5^9c<d=g>d:b7g<xO1ĬѸҸʹεзз̳̳̳ҹgKj>qE!oCoCoCoCoCoCnBoCnBnBnCnBnBmBmBmBlAlAlAkAkAkAj@j@j@j?i?i?i?h>g>g>g>f=e=e=e=e=c=d=c<b;b;c<kVtamXnZmZmZn[iV~kbxt̂ЂσtxwU^^ͦ욇okrmsnsnsntormyol^]ZH0J,J-H,H+G+E*E*E*D)B(B(B'A'?&>&>&=$<$;$;#9"9"8!7!6 53210/ . - , + * ) ( ' % $ # " !    ! " # % ' ) * + - . /1357!8":#=$>&@&B(D*G+I,L.N0Q0T3W5[7_:d<lAtF!pD e<\8`:c<d<xR4r[ʹԺѸʹʹεεεεε̳Һi<oD nBnCnBnCnBnCnBnBmBmBmBmBmBlAlAlBlAkAk@k@kAj@j@j@i?i?i?h?h>g>g>g>f=e=e=e=d<d<c<c<b<b<a;a:a;e?"^7]8]8\7\7[7[7U/S.S.R-Q-Q-O+ xcXzv񃈆̃ЂφπgljĬoepkyuuprmrlrmsnsmyun]TG)I-G+G+F*F*E)D)C(B(A(A'?&>%>&=%<$;#:#9"8"8"6!5 44221/ . - , + * ) ( ' & % $ " !     " # % ' ( ) * , . / 1346!8"9"<$=%@&A'D)F+H+K-M/P0S2V4Y6]8a;g>oCa:Z6Y6L]8b<_7lѸε̴ʹεεεεεʹ̳жؿ_Bh<nC!mBmBmBmBmBmBmBlAlBlAlAlAlAkAk@kAj@j@j@j@i@i@i?h?h?h>g>g>g>f=f=f=e=d<d<d<c<b<b;b;a;a;a;`:_9^7_9^9^9]8]8\8[7\8\8[8Z8Z8Y8V3nTD|xˈІ|Waa̚㩍~H( X;$nWI}jburxuuqrmrlqkyuhRDA$ G,F*E*D)D)C(A'A'@&?&>&>%<$<$;#:#9"8"7!6!5 4 3210 / / - - + * ) ( ' & $ # # !     " # % & ' ) * , . / 024 6 8"9";#=%?&A'C(E*H+I-L.O/Q1T3W5[7_:c<kAqELoDW4R1 Z6_9a;^5m־ʹʹεεεεε̴жּDZ|nj>lBlAlAlAlAlAlAlAkAk@kAkAk@k@j@j@j@j@j@i?i?i?h@h?h?g>g>g>f=f=f=f=e=d=d=d<c<b;b;b;a:a:`:`:`:_:_9^8]8]8]8\8[7Z7[7Y6Y6X5X5W5W5R/hM:zvsyxYbaLVVCOP͹nO8H)O/J+N0[@+lVH}kcvqxuupsmsnX?.B&F+D)C)B(B'@'@'?&?%>%<$;$;#:#9"8"7!6!5 4 3210/ . - , + * * ( ' & % # " !     " # $ & ' ( * , - . 024 5 7!9":#<%>&A&B(D*F*I,K.M/P0S3V4Z6]8a;f>nC|J$ rE \7X5\7`:a;]4mӻ϶̳εʹʹзּǯ}eYU`>$l?kAk@kAk@kAk@kAjAkAj@j@j@j@j@j@i?i@i@h?h?h?h?h?g?g>g>f=f=f=e=e=d=d=d=c<c<c<b<a;a:a:`:`:_9^9^9^9]8\7\7[7[7Z7Z6Y6Y6X5W4W4V4V4S0aE/smY__JVWNXYCOPzzyۦ|G' P2N0M0L-I)G(J.X>+kUH|jcvq{xpkG,A&D)B(A(A'@'?&>&=%<$;$;#:#9"8"7!6!4 4 3321/ . . - + * ) ( ' & $ # # "     ! # $ % ' ( * , - . 0 234 7!8"9"<$>&@&B'C)E*H+J-M.O/R2U3X5\7_9d<j@qE lBV4S3 Y5]8`:b<[3]DзӺ˲ӹԺƮ~fXTUKI^MDk@i@i@j@i@j@j@j@j@i@j@i?i@i@i?i@h?h?h?h?h?g>g>g>f>f>f=e=e=e=d=d=d=c<c<c<b<b;a;a;`;`:_:_9_9^9]8]8\8\8[7[7Z6Z6Y6Y6X5X5W5W5U3U3T3S1W7oiQYYHUVMXYDQS̯oO9G(O0M.L.K-K-K.I+E'C& H,V=+hSFlf|jbI/A&A(A'@'>&>&=%<$;$:#:#9"8"7!6!5 44310 0 / - - , + * ( ' & % # " !     ! " $ % & ( ) + , . / 134 6 7"9";$=%?&A'C)E*G+J-L.N/Q1T3V4Z7^9b;f>mBvG! rE Z6V4[6]9`:c<[3wS7׾rlcVRVKG\PL`TP^SPdH3i=h?h?h?h?i?i?i?h?h?h?h>h?h>g?h?g>g>f>f>f=f=f>e=e=e=d<d<d<c<c<c<c<a;a;a;`:`:`:_:_:^9^9]8]8]8\8[7[7Z7Z6Z6Y5Y6W5W5W4V4V4U3T3S2S2S2wdZtyxqxw\ffippԞvH)N0L.L.K-J-I,I,H,H,G+F)B&@$ C(XA1L4"?$A'@&?&=&=%<$;#:#:#9"8"7!6!5 43210/ . - , + * ) ( ( & % # # " !    ! " # % & ( * + , - / 124 5 8"9":#=%>&@'B(D)F*H,K-M/P1S2U4X6\7_:d<i@qE jAT3S2GW5[8]8_9b=Y2kC#oe[PMWLG]PL`SO^RN^RN^RN]SQcG4h=h@h?g?g?g?g>g?g>g>g>f>g>f>f>f>f=f>e=e=e=d=d=c=c<d<b<b<c<b<a;a;a;a;`:`:_:^9^9^9^9]9\8\7\7Z7[7Z6Y6Y6X5X5W4W5V4U3U3T3T3S2S2R2M,r]QӒs{z̠nN9E'M/K.J-J-I,H,G+G+F*E*E*E*D*B(=# ?%A'?&?&=%<%<$;$:#:#9"7!6!6!5 43210/ . - , + * ) ( ' & % $ " !     ! " $ % & ( ) * + - / 1235 7!8":"<$>%@&B(C)F*H,J-M.O0Q1T3W5Z6^9b;f>mBtG!GrF b;U3X5\7]8^9b<`7YC4^US`SO_SO^RN^RN^RN^RN_RN]SQaF3c8f>f>f>f>f>f>f=f>f=f>e=e>e=e=e=e=d=d<d<d<c<c<b;b;b;b;a;a;a;`:`:_:_9^9^9^9]8]8\8\8\8[7Z6Z6Z6Y6X5X5W5W4V4V4U4T3T2S2R2R2R1R2M-jTDڀs{|Г}qI*M/K-J-I,I,H+G+G+G+E*E*D)D)B(B(A(@'?&>&>%<$;$;$:#9#9"7!6!5 5 43210/ / - , , * ) ( ' & % $ # "      ! " $ % & ' ( * + - . 0 234 6!8":#<$>%?&A'C(E*G+I,K-N/Q0S2V4Y6]8`:d=j@qD [8R1Q1GU3Y6[7]8_9`9aE0^SQ^RM^RN^RN^RN_SN]QMZNJ_SNsgdaK_6f>e=e=e=e=e=e=e=d=d=d<d<d<d<d<c<c<c;b<b;b;b;a:a:a;`:`:`:_9^9^9^9]8]8]8]8\7[7[7[7Y7Z6Y5X5X5X5V4W4U4U3U3T3T3S2R1R1Q1P0P1K,_C.dqrɍlM8E' M/K-I-I,H,G+G+F*E*D)D)C(B(A'A'@'?&>%=%<$;$;#:#9#8"7!7!5 5 43210 0 . - , , * ) ( ' ' % # " " !   ! " # % & ' ( ) + - / 0 124 6 8"9";$=%?&@'C(D)G+I,K-M/P0R2U4X5[7^9c;g>nBuF GrD [6R2V4Y6[7]8]7^?&^SQ^RM^RN^RM]QM[PLdWS{mhyռt_Z2d=d=d<d=c<d<c<c<c<c<c<c<c;c<b<b;b;a;a;a;`:`:`:_:`:_:^9^9^9]8]8]8\8[7[7[7Z7Y6Y6Y6X6X6W5W4V4V4U3U4T3S2S2S2R2R1P0Q1P0O0L,Y;&rokjy{ɅthI)K.J-I,I,H+G+G*E*E*D)C)C(A(A'@'?&>&>%=%<$;$:#:#9"8"7!6!5 5 43100/ . - , + * ) ( ' % $ $ # !      " " $ % ' ( ) + - . / 124 6 8"9";$=%>%?'B(D)F+H+J-L/O/Q1T3W4Z6]8a:e=k@qD g>P0O0JR2V5Y6[7\6]<"^QM^RN^RN`TQcWRugcrjºӹֽs^[4a:d=b;c<b;b<b;b<b;b;b;b;a;a;a:a:`:`:`:`:_9_9_9^9^9^9]8]8\8\7[7[7[7Z6Z6Z6Y6X5X5W5W5W5V4U3U3T3T3S3R2R1Q1Q1P0P0O0O0N/M.O/okfⓕgJ4D'J-H,H+G+F+F*E*D)D)C(B(B(@'@&?&>&=&=%<$<$;$9#9"8!7!7!5!4 43110/ . , , + * ) ( ( & % # " ! !    ! ! # $ % ' ( * + , . / 0236 7!9":#<$>%@'A(D)E*H+I,L.O/Q1S2V4Y6\7_:c<h?oCuF!JsE W5P0T3V4X5Z6[6^ME_SP\QMhSHuovptngD*}Z?sèջa;\6b<a;a;a;a;a;a;a:`:`:`:`:`:_9_9_:_9^9^8^8^9]8]8]8\7[7[7[7Z6Z6Y6Y5X5X5W5X5W4V4V4U4U4U2S2S2S2R2R2Q0Q0P0O0O/N/M/M/M/I)ztmގyH)J/I-H-H,G,F+E*E*D)C)C)B(A(@'?'>&>%=%<$;$:#9"8"7!6!6!5 4 32100 / - , + + * ) ( ' % % $ # ! !    ! " # % & ' ) * + - . / 1235 7!8":#<$>%?&A'C(E*G+I,K-N/P1R1U3X5Z7^9b;f>lArE f=M.L.GP1T3V4X6Y4\F7^US^OH\5w_PwrxsrWEV. X2c>~[Bp̲iD'_9`:_:`:`:`:_:_:_:_:_9_:^9^9^9^9^9]8]8\8\8\8[8[7[7[7Z6Z6Y6X5X5X5X5W4V4V4V4U4T3T3T3S2S2R1Q1Q1Q1P0Q1Q2Q2P2P2M/K-L.C# n[L^D0?E'D&B$ B% A$ A$ B%B%A$ @$ ># ># =" =" <" =$<$;#;#:$:#9#8"7"6!5 4 32100 . - - , + * ( ' ' % $ $ " !     ! # $ & ' ( ) * , - . 0 235 7!8"9";$>$?&A'C(E*F*I,J-M.O0Q2T3W4Z6]8`:d=i?pDuG!GtF W5M.P1T3V4W3Z?*^UU]H9Z4_; ngws~ja`;`;]8X2W1`:bJs^d?!]8_:_9_9_9^9^9^9^9^9]8]9]8]8]8\8\8\7\7[7[7[7Z7Z6Z6Y6Y5X5X5W4W4W4V4V3U3U3T3S2S2S2R2Q2R2S3S3P1O0G(D% C% @"?!F)N3O4M2eQBaO>_M=\K;YH9^M>\L<\L1J>0H=0M@2J=0F<.GmBtF!a7J-H-FM/Q1S3U3X8^QMY:!Z6X2hK5vrwshJ3Z4^9^:_:\7V0Y4]8^9]8]8]8]8]8]8]8]8\8\7\8\8[7[7[7[7[7Z6Z7Z6Y6Y6Y5X5X5W4W4W4V4V3U3U3T3T2S2S2S2R1R1Q1Q1L-E& A"K,N/qS=uWAgTꐔІώҗ̗̘̗̏̎̐̕̕bx|]ux^uy\swdw{cuz[pu[qvZosUeeUddUffPZXHHBIKF@6+<.":-42 // / / ..- , * ) ) ( ' % $ # " !     " # $ % & ( ) * , - . 0134 6 8"9";$<$>&@'B(D)F*G+I,L.N/P0S3V3X5[7^9a;f>j@rE yI!FvG!L-J-N/Q1S2T3\H=W7W4Y7V2t]O{xv`RY5\8[7\7\8]9]9\8\7]8\8\7\8\7\8[7\7[8[7[7[7Z7Z6Z7Y6Y6Z5Y5Y6X5X5X5W4V4W4V3U3U3U3T3T2S2S2S1R1Q1Q1P0P0N/]?%lYrǪ۾΋̑БЎЏЎЍЎЉ`qt\np\no[moZln[mnZkmYjmYjlZloYlnXkmXloYosXnrWkpWloUgjO[ZJQMA?7;4*2#. + ++ * * ) ( & % % # " !     " # $ & ' ( ( * + - . /134 7 8"9";$<$>&@&B(C)E*G+I,L-M/P0R1T3X4Z6^8a;d<h?oCuG!sE G+F* J-N/Q1S2V:#U4V4W5X5W4~jaws^lAsF!zK# wI"J-F*~J-O/P0Q1S2U3U3V5U2^>%vpoVEU0Y6Y6Y6Y6Z6Y6Y6Z6Z6Z6Y6Y6Y6Y6Y6Y6Y6Y5Y5X5X5X5W5W5V4W4V4V4V4U3U3U3T2S2T2S2R2R2Q2Q1P1P0P0|P0*P0P0DzȿΊ̐ϑЏϋbvx^su_ru_qt^ps]pr]oq\oq\np[moZloZloYkmYjmXjlWjkWikVikUgiUfhTefTefUgh[pt\qu[quTefJRO85-+!% """ !     " # $ % ' ( ) + , - . 0124 5 8"9":$<$>&?&A'C(D*F+I,K-L.O0Q1S3V4Y5[7_9b;f=j@pD xI!~rEB(<%G+K-M/O0Q1S1S2T3U4Q.iO%?&@'C(E*F+H,J-L.N/Q1S2U4X5[7^9a;e=i?nCuG!LjQ%{I"D)D)6G+K-M/O0P1Q1S2S2T4O,u_RjP>Q.W4V4V4W4V4W4W4V4V4W5W4W5W4W4V4V4V4V4V4V4U3U3U3T3T3T2T3S3S2R2R1R1Q1P1P1P1P1=P1P0P0P0P0ʾɿ׿᎖΅fxzbvx`uw`tv_tv_su_rt_qt^ps]pr\oq\nq[npZmoZloZknYknYjlXjlWjkVikVijUhjXlmXlmXkmWilWgjVehVfiZmo\qtWkmAHE,(!      ! " # $ & ' ' ) * , - / 0 1235 7!9":#<$>%?&A'B(D)F*G,I,L.N/Q0S2U3W5Z6]8`:c<h>lAtE xI"6wH"E*C)G+J-L.N/O0P0Q1R1Q1V6pXJU4S2U3U3U3U3U3U3V4U4V4U4U3U4U3U3U3U3T3T3T3T3T2T2S2S2S2R1R2R1Q1P1P0P0P0P1P1P1P1P1ɿǽŻùø̶bwz\rudvycvx`uw`tv_tv_su_ru_qt^ps]pr\oq\np[np[moZloZknYkmXjmXjlWjkWikZloZmoYlnXlmWkmWilWhkVfhUdfVfgYmo\ruKYZ.,( ! $ # # $ % ' ( ) * , - / 0 124 5 6!9";#<$>%?&@'B(C)F*H+I-L.N/P1R2T3W5Y6\7_:c<f>jAqDvG"gF):DFT3 C)G+J-K.M.N/P0P0Q2N-Y:"aF2Q/S3S2S2S3T2T3T3T3T2T3T3S2T3S2T3S2S2S2S2R2R2R1R2R1Q1Q0P1P1R1Q0O0P0O0P1P1gɾǽƻĺڿջε̲̲^ux]swdwybvx`uv_tv_tv_su_ru_qt^ps]pr\oq\op[np[moZloZknYjmYjlWjkZln]oq[mpYmoYmmXlmWjmWilWhkWgjUegTddWjk[rtLZZ40*# ' % ' ) ) * , - / 0 224 5 6!8"9#;$=%?&@'B(D)E*G+J-K.N/P0R2T3V5Y6[7_9b;f=i@qCnG%6EI~:CF09DG9DGA'?&0C(G+I,K-L.N/N0O0P0P0U6Q1Q1Q1R2R2R2S2R2R1S2S2R2R2R2S2R2R2R1R2Q1Q1Q1Q1Q1Q1P0P0Q0P0=+0& t:+!H2#Q1{ɿȽƼùھֻжǯĬƮɱдҷ~[sv]svdwycwx`uv`tv_tv_su_ru_qt^ps]pr\oq\op[npZmoZloZknYjmZmo]ps]oq\np[moZmnYmmXlmWjmWilWhkWgjUfhXggYkl;\b{od *) * + + - / 0 1235 7!8":#;$=$?&@'B(D)F*G+J,K.M/O0R1T2V4Y5\7^9a;e=i?mBtF LH=5FJ:FF9DGq9DG*1AB8DG9DGA(>&zB(F*H+J-K-L.M/N/O0N/P0O0P0P1Q1P1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1Q1P1P0P0P1P0O0O0O0O.I09-&)%%*%$3,)D:0B:6H?<ɿȽƻĹڿ׼жǮĬǯʱ˲δֹջ[rvZquauxcwxauw`tv_tv_su_rt^qt^ps]pr\oq\np[np[moZloZlo]qs]pr]pr]oq\npZmoZmnYlnXkmWjmYjm\knG\aM`cZH< ( .+ - / 0 2235 7!8":#;$=%>&@'A(C)F*G+I,K-M/O0Q1T3V4X5[6^8a:d<h?kAuEbH15GN=GF;GG:FG9EG9DGc:CG9EG9DG8DF:#( ?&B(E*G+I,I,J-L.L.M/M/N/O/O/O0O0P0O0P0P0O0O0P0P0P0O0O0O0O0O0O/O/N/N/N.M/E5)820/*)+%#+%$2,)81.?74:?85NEBTIF[QLɿȽƼùۿ׽жìªĬǯʱ̲ε϶ӹ۾ؾ񖗓ex{Zqt]rubuxcvxauw`tv_su_ru^qt^ps]pr\oq\op[np[mo^rt^rt]qr]pr]pr]oq\np[np\op]opQgiD]aӾɿŻt-#0. 0 224 5!7!9":#;$=%?&@'A(C)E*G+I,K-M.O0Q1S2V4X5[7]8a:c<g>kArDlH)%B(E)F*G+H,J-J-K.L.L.M.M/M/N/N/N/N/N/N/N/N/N/N/N/N/M/N/M/N/M.M/L-M2H;3?8870-0*(*%#,&$2,)82.>74C;8KB?ZOK^RNcWRh[V^ʿɾǽŻĺú׼̳ªĬǯʱ̲εѷӹԺ׼·ùһx_twVnr[qt_tvbvxauwatv`sv_qt^ps]pq\oq\op^qt`tw_ru^rt`st`rtart\nqOeiF`do{{ɿݏJ7*%4 224 6 7!8":#<$=%?%@'B'C)E*G+I,K-M.O0Q1S2U3X5Z6]8`:c<g>j@oCtH"HLG9KP>KL=JL=IK=HJOEBSHE>cYSLB?īɿʿȾżپϵªĬǯʱ̲εѷӹջ׽ؾĺǽŻ˸zdwyUmqVnqVnqZps`tu_rt_qt^ps]or]qrbuxatw^ruQinOhkHcg[oqмɿǽŻپȾּT?0'6"4 5 7!8":#<$=%?&@&B(D)E*G+H,J-M.O/P1R2U3W5Z6\8_:c<f>i@nBwFUL@9MSAML>LM>KM=JM=IK=IK=HJ%9"{=%A'B(C)F)G+G+H+H,I,I,J-J-J-K-K-K-K-K-K-K-K-K-K-K-K-J-K.I*N5!VKGNDAF=9>6370-0*(*%#-(%3-*81.?74D<9JA>OEBTIFYNJ^SObVQUh[V8uo 2ȾȾջʹëªĬǯʱ̲εѷӹջ׽ڿ¹ĺɿɾ훚xZqs^su]rt]ps\os\or_tu]stgyzɸȾɿǽŻù׼ۿҸU@0*9$7!9":#<$=%>&@'B(D)E*G+I,K-L.N/Q1S2U4W5Z6]8_9b;e=i@lBtEeL4=PVCNOAMO@MN?MM>LM=KM=JL=IK=HJ=GIOEBTIFYNK^SOcWRg[Vm_Zoa\}ni{t}vz|~{x|~ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼǼɿ¹ĻĻŻżŻǾɿǽŻùڿպּʹW@0.;%:#<$=%?&@'B(C)E*G+I,J-M.N0P1S2U3W5Z6\7_9a;d=h?lBuDmK-9T[CPQBPRBOQBMP@MP@MN>MM>LM=KM=JL=IK=HJ=GI;GG/&@'A(B(D)E*E*F*F+F+G+G+G+H+G+H,H,H,H+H+H+H,H,F)P8$gZU^SNTIEMD@E<9>6370-0*(*%#-(%4.+92/?74E<9IA=OFCTIFYOK_SOcWRh[Vl_Zqc^se`ufazke~oirluoysy~ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɿʿɿǽŻù׼ѷҸȯXA14 >&=%?&A'B(D)E*G+I,J-L.N/P1S2T3W4Y6\7^9b;d=h?kArDqJ(JSRDRUDRSCRSBQRBORBOQANP@MO?MN>MM>KM=KM=JL=IK96370-0*(*%#-'%5.+92/?74E=:JA>OFCTIFZOK_SOcWRh[Vm_Zqc^ugb{lfoismvpys~xy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɿɿǽŻù׼Ժ̳ε@(<$?'@'B(D)E*G+I,K-M.O0P0S2U3W4Y6\8_9a;d=h?kAqDuI$JUUCUYGTUERUDRTCRSBRRBQRBPRBNQANP@MO?MN>LM=KMc=IG4 0F5 :#<$=%?&?&@'A'B(C(C(C(D)D)D)D)D)E)E)E)E*F+A% eQEtgcdXR\QLTIELC?D;8>6370-0*(*%#-'%5.+:30?74E=:JA>OFCTIFZOK_SOcWRh[Vm_Zqc^ugbzke~nhrlvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɿɿǽŻù׽ӹϵƮ˳tg6C)B(D)F*G+I,K-L/O0P1S2T3V5Z6\8^9a;d<g>kApDwG!\SEBX\IVUGVWGTWFTVESUDRTCRSBQRBPRBPRBNPAMP@MOd7PE@FM41F4 8":#<$=%>&?&@'A'A'B(B(B(B(C)C(C(C)C)D*?$ V>-pkn`[eYT\PLSIEKB>D;8>6370-0*(*%#-'%5.+:30?74F=:JA>PFCUJGZOK_SOdWRh[Vm_Zqc^vgbzke~nhrlvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾɿǽŻùؽԺϵɰªbJ9%>&?&@&@&@'@'A'A'A'A(A'B(@'xf\~pkn`[eYS\PLSIEKB>D<8=525.,.(&)$"-(%4.+;30?74F=:JA>PFCUJGZOK_SOdXSh[Vm_Zqc^vgbzke~ohsmvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾɿȾƼùؽԺϵʱªyB'G+H+J-K-M/O0Q1S2U3W4Y6\7^9a:d=g?kAoCuG ^UFE]eLYZJY\IW[GWYGWXGWWGVWGUWFUVESUERUDRTCRSBPRAOQ1/ F26 8!9":#;$<$=%=%=%>%?&?&?&?&?&@'<"O7%ysxidna\dXSZOKSHEKB>D<8<415.+-(&*%#.(&4.+;41@85F=:KB?PFCUJGZOL_TOdXSi\Wm`[qc^vgbzke~oismvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾʿȾƼĹؽԺжʱīY=*D'K.K.M/O0Q1S2U3W4Z6\7_9a;d<g?kAoCuF ^VHG_gO[[L[]K[]KY]IY\IW[HWZGWWGVWGVWGUWFTVESUDRTDQS1/ F036 7"8"9#:$;$<$<$=%=%=%=%>%?'7 jTF}xwhbn`[dXS[OKRHDKB>C;7;415.,-(&*%#/)'4.+;41@85E=:KB?PFCVKHZOL_TOdXSh\Wm`[rd_vgbzke~oismvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾȾżĺؽԺжʱĬw^OC% M/M/O0Q1S2U3W5Z6\8^9a:d<g>kAoCuG _WJHbjO]^M]_M]^M]]M[]K[]JY]IX[HWZGWYGWXGWWGUWGUWESU0 , F. 24 5 7!8"9"9#:#;#;$;$;$;$<$;"rhysxicm`[cWRZOKRGDKB=B:7;415.,-(&*%#0*'4.+;30A96F=:KB?PFCVKHZOL_TOdXSh\Wm`[rd_vgbzkfoismvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾȾżĺؽպж˲Ĭ|rI+N0P0Q1S2V4X5Z6\8_:a;d=h?kAoCuG aXKKdkQ__O`bN_aM^`M]_M]^M\]L[]KZ]JY\JX\HWZGWXhGWVETU. * F- 1 245 6 7!7!8"9"9"9":#:#8"rixswhcm_ZcWRZNJQGCJA=A96;415.,-(&*%#0*(5/,;30A96F=:LC@QFCUKGZPL`TPeXSi\Wm`[rd_vgbzkfoismvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾʿȾƼĺپպж˲ĬtK-P1R2T2V4X5Z6\8_:a;d<h?kAoCvG aZLLfoSabRbbQabP`bN_bN_aM^`M]_M]]M\]L[]KZ]JY\dCLTGUW, ( F+ / 13445 6 6!7!8!8"8"7!qhwrugal_ZbVQYNJQGCI@;LB?QFCVKH[PL`TPeXSi\Wn`[rd_vhc{lfoismvpys|vy}ªĬǯʱ̲εѷӹջ׽ڿ¸úĻƼȽɾʿȾƼĺپջз˲ŭuN.R2T3V4X5Z7]8_:b;d=h?kApCvG c\MNjqTddRcgRcfRbdRbcQabP`bO_bN_aM]`M]_M]^L[]NIY^HXY* & E) , / 0 1234 5 5 6 6 5 pgwqugak^YbVQYNJQGCI@;LC@QGDVKH[PL`TPeXSi\Wn`[rd_vhc{lfoismvpys}wz}ªĬǯʱ̲εѷӹջ׽ڿ¸úĺƼȽɾʿȾƼĺپջѷ̲ŭvP/U3W4Y5[7]9_:b;e=h?lAqCwH!e\OQksWfeUfgSfgRegRcgRcfRbdQabQabO`bN_aN^aM]`1K[]IX[' # E' + - . 0 1122342 nfwqugak^YbVQXMIQGCH@;LC@QGDVKH[PL`TPeXSi\Wn`[rd_whc{lfoismvpyt}wz}ªĬǯʱ̲εѷӹջ׽پ¸úĺƼȽɾʿȾƼĺپջѷ̲ƭvS1X5Y6[7^9a:c<e>i?lBqCvJ%f_QRmwXfhWgjVgiVggUggTfgRegRcgRbfRbdQacP`bqP`bM\^' " $ ( + - - . / 0 110 oguptfaj]XaUPXMIPFBH?;B96;414-*-'%*%#0*(70-;41A96G?i@mCsCtM+\llUptYkkWjmWilWhkWgjVghVghTfgSfgRdgRdfRbdCXhTIZfN^`% # % ( * + - . . 0)gUKxssd_j]X`UPWLHPFBH?j@nBtErR3`mm[pu\lmZmnYlnXkmXjmWilWhkVgjVgiVghTfg`RdgQadO`b$ $   {" & ( ) * + - (C1%snte`j]X`UPWLHOEAH@<@8592/2,*+&$+%#0*(70-=52A96H?  " % ' ( ) + 'l\Uxjeh[V`TOVLHOEAH?;?7492/2,*+&$+&$0*(70-=52B:7H?h?lB qBuI#keY^w`qt_rt]qs]pr]pr]oq\np[mpZmoYlmwWjm2VioTfhRdg    # % & ( "K<2zlggZU`TOVLHOEAG>:?7492/2,*+&$,&$1+)70-=52B:7H?f>i@mBsBsP2gqm_|btuatw`sv_rv^ru^rt]pr]pr]oq^[mo$[mpWhjVgi {  " $ $ #_PJl`[]RMVKGOEAF=:?7492/2,*+&$,&$2,)70-=63B:7H?g?jAoBtG"q\Fe{b{cuxbwybwxbuwatw`sv}_rvc^rt8\qs_otYlnWkm  . ! -g[V_TOUJFNEAF=:?7492/2,*+&$+&$3-*70-=53C;8H?vG!" " ( & & 3'IA>>636/,0)()$",&$3-*92/=63D<9I@=NDASHEXMI]RNbVQfZUk^Yob]se`xid|mgpjtnwqzt~wz~ªĬǯʱ̲εѷӹջ׽پ¸ùĺƼǽȾʿɿȽøŻt]d8sG"uG!zI"tG!vG!(   + A) $- :2/820/)'*%#,'%3,*92/>63D<9I@=NDASHEXNJ]RNbUQfZUk^Ypb]se`xid|mgpjtnwqzt~wz~ªĬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾʿɾźո`Cj=uH#yI"Af>qD |J"' & I+.C'*2("0*)*%#-'%3,*92/>63D<9IA>NDASHEXNJ]RNbVQfZTk^Ypb]se`xid|mgpjtnwqzt~wz~ªĬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾʿɾyO.h9~P+C^-tF!wH") ' +C+ - *$!.('3-*92/?74D<9IA>NEBTIFXNJ]RNbVQgZUk^Ypa\se`xid|mgpjtnwqzt~wz~ªĬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾʿܾsXj=f7 CrF!vG!+ ' (0B//%3-)931?75D;8JA>NEBTIFXNJ]RNbVQgZUk^Ypb]tfaxid|mgpjtnwqzt~wz~ªĬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾʿɾV5W&By:lAtF!, - [ 4 E3#8-&?73E=;JA>NEBTIFXNJ]RNbVQgZUk^Ypb]tfaxid|mgpjtnwqzt~wz~ªĬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾɿʽɨmPZ- Ef;rE .-9#3:*A60I@=OEBUJHYNK^SNbVQgZUk^Ypb]tfaxid|mgqkuowq{u~wz~ªĬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾɿѯw[R"sG$Y9uH%2 2/.GHN0 D6-HJ=6SGCXNI^SOcWRgZUk^Ypb]tfaxid|mgqkuowq{u~xz~ªŬǯʱ̲εѷӹջ׼پ¸ùĺƼǽȾɿȼЮHW. ůyK'7#:+!! B, TG@j^SPcVRg[Ul_Zpb]tfayjd}nhqkuowq{u~x{~ªŭǯʱ̲εжӹջ׼پ¸ùĺƼǽȾɿ̼ٸjnV-m[::&G;5MC@hZUbVQ!g[Vil_Zpb]tfayje}nhqkuowq{u~x{~ªŭǯʱ̲εжӹջ׼پ¸ùĺƼǽȾɿȿi!Գ^>H7+TG@`URtfaob] ugbMyjd}nh΁qkuowq{u~x{~ªŭǯʱ̲εжӹջ׼پ¸ùĺƼǽȾɿǘM ٹtbVQh[Vk^Y|mgrltnWxrt{uxӔ{~ªŭǯʱ̲εжӹջ׼پ¸ùĺƼǽȾɿżtWpc^tfayje{lfxyz O~ۥӨᬖªŭǯʱ̲εжӹջ׼پ¸ùĺƼǽȾɿ~O qkuowq{u~x@=9Pªŭǯʱ̲εжӹջ׼پ¸Pù9ĺ=Ƽ@ǽǽx{~ªŭǯʱ̲εжӹջ׼پ¸ùĺƼǽ???@?????????????????????????>?????( Q&P%P%O%O%N$M$L#}L#{J"zJ"xI"uF!sF qDoBU'U'U'W(uG!nCk@h?-56'01W(W)X)_-rE N%O%*N$LN$KM$a~L$}L#||K#|yI"xI"avH!KsF LpD *lAV2yH!h?b;_9+44X(Y)Z*P%S&#T'WT'S'S'ىS&R&R&Q&Q%P%O$N$M$~L#{K#yI"wH!uF!rE oCmBi?We=#W6a;\7V4 /J]^de` +34+45Z)[*^+S& V(KW(W(ՐW(W(W(W(V(V(U(U'T'S'R&Q&Q&P%O$N$~L#|K#zJ"xH!uF!rE oClAi?e=a;KX5 b<Y6T2ZV\\)12,45+45C+32,44\*\+Z*S&X)AY)Y)Y)Z*Z*Z*Z*Y)Y)X)X)W(V(U(U'T'S&R&Q&P%O%N$L$}K#{J"xI"vG!tF qD nBj@g>c<_9Z7AK-Y6U3P0\-57'(+44+33+34+35+55164jJ.Y)Z*r[*ڗ[*\*\+\+\+\+[*[*Z*Z*Y)Y)X)W(W(V(U'T'S'R&Q%P%O%N$M$}K#{J"xI"vG!sF qD oClAh?d=`:\7W5rQ0V4P0J-2")*$,-+34)12)33+33+33+34+45N`'Z+\+]+]+^,^,^+]+]+\+\+\*[*[*Z*Y)Y)X)W(V(U(T'T'S&Q&Q%O%N$N$~L#|K#zJ"xI"uG!sE qD nBkAh?e=a;\8X6T4P3T3K.T$$%+,(/0'//(01(02)23*33)23+34>:3X,`+_+_,_-_,_,^,^,^,]+]+\+\+[*[*Z*Y)X)W)W(V(U'T'S'R&Q&P%O%N$M$~L#{J#yI"wG!uG!rE pCmBj@g?f>b<\7V3R0L,H.Q6#G- n"#$++%--%,-&-.'./(/0'01(12351=91=:3B=4tP0a1b,_)`-_,_,_,^,^,]+]+\+[*[*Z*Y)Y)X)W(V(U'U'S'S&R&P%P%N$M$~L#|K#zJ"xI"vG!sE qE oClAjAa7`8gB%fB&a?$X8K+? cM:-zǗ%,,!'(%,-$++$+,%,,%,-%-.+0.5517843971:9/:;+8;>EBc]Pd@`*_,`,_,_,^,^+]+]+\+[*Z*Z*Y)X)W(V(U(U'T'S'R&Q%P%N$N$~L#|K#{J"yI"vG!tF!rE pD mBf;_Ez}u{eZbJ9N35!N>3A0# z49:!!$*+"))#*+$++#++$++,0.153.67,78-89.8909:1;;.9:,;@>RVrcOb.`,`,_,^,^,]+\+\+[*Z*Z*Y)X)W(W(V(U'T'S'R&Q%P%O%N$M$}L#{J"yJ"wH!uG!sF pCmAl~xxsup~qlo_Y[Hvazyssm|lgtf`m_Zi\YeZVYMGL<37 5+$x!''$$%% &' ''$*))//)11(11*22*23+35,46-67-77.78/89/9:1;;099-:>ߋZ1a+_,_,^,^+]+\+[*Z*Z*Y*X(W'W)V(U'U(Q#R%Q&P%O%N$M$~L#{J#zJ"xH!vH"qBW8}}wvppjxidrc^k^YdXS^SNXMISIFMD@D:5<0)/6.+d"##$$$$$$$"(('..'//(//(00)01)12*23*34+36,57-67.78.89/992;:(8]8O"Q&O%N$M$}L#|K#zJ"xH!vH"qBvexyssm{lgufan`[gZVaUQ[OKUJGOEBI@=C;8?7591/2*%P931K:>?##!!"#"# &'%+,%,-&--'..'//(00(01)11*22*23*35+46,57-77.78/99-8:7<:^.`,^,^,]+]+\+[*Y*Y*W'Y0wf`[7T$Q!a>zX1O#P&O%N$M$~L#|K#zJ"xI"uFwK(w}wuo~oiwhcqb]j]XcWS]RNWMIQGDKB?F=:@86;315/-0+),&$+%$b92/1 !!  ! !$%"**#**$*+%+-&--&..'..'//(00(01)12*22*24+35,57-67.78/88)7:ބV/a+^,^,]+]+\+\*]*\*[)Y'|eWtigZ;fF{mQ"Q$P#O#N#M$}L#|K#zI"xI#uD{U8{vqkzkfse`m_ZfYU`TPZOKTIFNDAH?E<9?75:204.,/)'*%#+&$1+)6/-;31?75E<9bND@ikoo$$ !!!%&%&&' '(!()"))#**$*+%+,%,-&..'..'//(00)01)11*22*24+35.56$28dJ2a+^,]+]+\+[*W*hE*:0*((,-(%SHCzjewhc{td_RGCQKLYKDnM4}M'M$}K#{J#zI"xI#uEwYEsgdl]XeXT_SOYNJSHEMC@G>;A97<4260.1+),&$+%#.)'4-+92/=63B:7G>;KB?PFCbYNJ<ٔ"))###$!!"#&'%&$%$%%& &( '(!()")*#**$*,%,-&-.&..'./'//(00)01)12*23,34#17TD3a+],]+]+\+[*[*^+X(lF'6-)MDA{kfwhc{pb^TGAuO2O%O"M#~L#}K#{J"yJ"wH"vEoXHh]ZbUQ[PLUKGOEBI@=D;9>6491/3-+-(&*%#,'%2,*70.<42A96E<:J@=NDASIEWLH\PLIbUQnrr ''$$$$ '' &'&'&&%%$%%&&' '(!()"))")*#*+$+,%,-&-.'..'//(00(01)11,32"/4SB0`,]+]+\+[*[*Z*W$Y*qXSIFG?=|lgwhc{pc_RGCnO8O&N"M$~L#}K#zJ"xH"wH"vFjQ?\TRWLHRGDLB?F=:@86;315/-0*(+&$+&$0*(5/-;20?74D;8H?;KB>OFBTJFXMI]QMaUQeXTi\Xm_[xhb pa\*$*+ &'!()")*!((!'(!'( '' &'&'&&%&%%%%%' &( ')!()")*#*+$+,%,-&-.&-.#**$)(#*iH,ܢ`+\+]+\+[*Z*b@gN`>[2W(uXEshgyf]uhUM!~O+tM/jL7rL/}L#|K"yI"xI"vG!tF!rE A97C:204-+.)'+%#,&%1+)6/-<41@85E<9I@=NDARIEWLH[PL_SOdWSh[Wl^Zpb]te`whc|lgt;AB%&#**"))#)*")*")*!))!((!'(!'( ''&'&'&&%%$%%&&' '(!()"))"**$*+$*+ && %&$((#(oK+`+\+\+[*Z*Z+Y)V#V%U%X)vbXugcV2^9rgP$O#O"M!~L#|K#{J"yI"xH"uG!sE!rE \A.3.,,'%,'%/)'4.,:20>74C;8H>OFBTJFXMI]QMaUQeXUi\Xm_[rc^ufayje}mhqktnwq|uxr{nst""&..%,-%+-$++#++#*+#**#)*")*"))!((!'(!'( '' &'&'&&%&$%$%%' '(!&&!"#$$$$$%%W*^+[+[*[*Z*Y)Y)X)X)S"hFmSOT(S(KhNaBKN%~L#|K#{J"zI"xH"vH!tF!rE pD j@sd_vgbA96D;8I@=NDARHDWLH[PL_SOdWSh[Wl^Zpb]te`xid|lgpjsmwpys}vyz:;AB")*'./&./%-.%,-%+,$++#*+#*+#)*")*")*!))!((!'(!'( ''&'&'&&%%$%!&&$''""!"##!$5/%Ø\+\+\*Z*Z*Z*Y)X)W)W(U'Y/U)S&R&R&Q%Q'T,M#M$~L#|K#{J"yI"wH!vG!tF rE pDoC(ֻNپgZVF=:RHDUKGZOK^RNbVRgZVk]Yoa\sd_whc{kfoirlvoyr{ux{~NuƘ$,-(01'/0'/0&./%..%-.%,-%+,#++#*+#**#)*")*")*!()!((!'( '( ''&'&'&&$('$&& ## !"!"O:&О_+[*[*[*Z*Y)X)X)W(V(U'S%S'S&R&Q&P%O$M"M$~L#}L#{J"zJ"xI"vG!uG!sE qE oCoC UƼ@ڿڿNDAZOJ\QMaUQeXTi\Xm_[rc^ufazje~mhqktnxq{t}wz}ͳ-''+34)11(01'/0&//&./%..%,-%+,$+,#++#*+#**#)*")*"))!((!((!'( ''&'!'((*)#&& #" !! qI(_+Z*Z*Z*Y)Y)X)W(V(V(U'T'S'S&Q&Q%P%O%N$M$~L#|K#zJ"yI"xH!vG!tF!rE qD oCmC ƻoǼԹɱpb][PLeXTh[Wl_Zpb]tfaxid|mgpjsnwqzt}wy|kfjpp )),45*22)12(01'00'/0&//&./%-.%,-%+,$++#*+#*+#)*")*")*!))!((!'( '''++)+*$'' $#  "!ҋV*]*[*Z*Y)Y)X)W)W(V(U'T'T'R&R&Q%P%O%N$M$M#}K#{K#zJ"xI"vG!uG!sE rD pD nBlAǼӹ϶{`TPm^Zoa\sd_whc{kfoirlvpys|vy|~ڶ NTV%..-56+34*23*22)11(11'00'/0&//%..%-.%,-%+,$++#*+#*+#)*")*!)*!()!((+..),+%((!%% "! 9.$\+[*Z*Y*Y)X)X)W(V(U(U'T'S'R&Q&P%P%N$N$M$~L#|K#{J"yI"wH!uG!tF rF qD oCmBj@Եƻ¸պͳl^Zrc^vgbzje~niqluoxr{u~x{~jD;CE*34.67,56+45*24*23)12)11(01'/0&//&./%..%-.%+,$+,#++#*+#**#)*!)*$*+.10),,&))"&&"#"!eC'_+Z*Z*Y)X)X)W(V(U(U'T'S'S&Q&Q&P%O%N$M$~L#}L#{J"zJ"xI"wH!uF!sF qD pDnBoD!`6hź¸ջ̳}mgwhc}mhpktnwqzt}wz} q7AA,67/89-67-56,45+34*23*22)12(11(01'/0&//&./%-.%,-%+,$+,#*+#*+"))'--022*.-&*)#''##"$#ߊU)\*Z*Y)X)X)W(V(V(U(T'S'R&R&Q%P%O%O$M$M$}L#|K#zJ"yI"wH!vG!tF rE qDoCmBlBe;wP1ɾȾ¸ּɰvp}mhsmvpys|vy|ªiӕ,670::/89.88.78-67-56,45+34*23*23)12(11'01'/0&//&./%-.%,-%+,$+,"**+00133+..(++&)(!$H7&]*Y*Y)X)X)W)V(V(U'T'S'S&R&Q&P%P%O%N$M$~L#|K#{K#yI"xI"vG!uG!sF rE pCnClAkAkA_6ؽ|usmys{ux{~ªŬǮ>ޟ6AB.890::/9:.89.88.78-67,56+45+34*23*22)12(01'00'/0&./%..%-.%,-$*+.32144+//(,+'))"%vL(\*Y)X)X)W)V(V(U(T'T'S'S&R&Q%P%O%N$M$~L#}L#{J#zJ"xI"wH"uG!tF!rE qD oCmBkAj@iA^5fLپzzt~xz}ĬǮɰ˲ͳ;̲fEQR,671;<0::/9:/99.89.78.68-67,46+35*23*23)12)11(01'00&//&./%..$,-044255,0/*.- '):2(Z*Y)Y)X)X(V(V(U(T'T'S'R&R&Q%P%O%O%N$M$~L#}K#{J"zI"xH!vH!tF!sF qD pDnBlBj@i?g>e=a:ŽŻ~xz|ëƮȰʲͳжѷзWdd*463=?1;<0:;0::/9:/99.89.78.67-56,56,46*23*23)12(11'01'/0&//%-.055366-10+/.'*rJ)\)X)X)W)W(V(U(T'T'T'S&R&Q&P%O%N$N$M$~L#|K#{J#yI"xI"vH!uG!tF rE pDoCmBkAj@g>f>d=d:N7!ffdŮrl}wëƭȯʱͳϵѷӹջؿּс'125@A2<=1;=1:<0:;0::/9:/99.89/9:-67'/0,45*24*23*23)12(11(01$-.055376/22&-/;4+Y)X)X)W)W(V(V(U'T'T'R&R&Q&P%P%O%N$M$~L#}L#|K#{J"yI"xH"vG!tF!rE pD oCnBlAj@i?g>e=c<a;b<DA;JNNha]widªŭǯʱ̳ϵѷӸպ׽ٿۿMڿ309:6@@4>?2=>1<=1;=1:;0:;1;;3==(12*34]jk7BC-67+34*24+34)12'00/66:==488032#,0sL+[)W)W)V(V(U(U'T'S'S&R&Q&P%P%O$N$M$M$}L#|K#zJ"yI"wH!vG!tF!sE rE pD nClAkAi@h?e=d<b;`;_8X?*FKL4:9MMK{wªĬǮɰ̲δжҸպ׼پۿ¸G̀#,-8BC7AA5@@4?@4?@3=>,67",,ALMݴn}~1<>9EG2<>-67(13,45:??BDC?BA.58B:/Y)X)W)W(V(V(T'T'S'S'R&Q&P%P%O%O$N$M$~L#|K#{K#yI"xI"wH!vG!sF qE pD nCmBlAj@h?f>e=c;a;_9]9\7JD>FKJDGFAEEދ|ĬƮɰ˲ʹжҸԺּؾڿ¹ĺŻȾ]r~,56*34,56+55'11*45EPQݐϜ+8:AA=4:<}Q,Y(W(W(V(U(U'T'T'R&R&Q&Q&P%P%N$N$M$}L#|K#{J"zJ"xH"wH!uG!tG rE qD pCnBlAj@i?g>e=d<a;`:^9\8[6T9#DHHGIHHJH9>>OON^_]©ëƮȰ˱ʹ϶ҸԹּؽڿ¸ĺŻƼȾȾ$ɿaκ}^jkbnnۀسκ4AC>KL[F3Y(W(W(V(U(U'T'S'S&R&Q&Q%P%O%O$N$M$~L#}K#|K#zJ"yI"wH!vG!tF!sE qD oCnClAl@i@g?f>d<c;a:_9]8[7Y6Y4A8-2=?7>=5:9-44,33?A@땅ϴĬȯʱ̳ϵѷӹջ׽ڿùŻǼȾɿɿڽUiETU=JK@MO=JL;IJSYYbdb[]\X[YVXWKNM:@A?>:V*X(W(V(U(U'T'S'S&R&R&P%P%O%O$N$M$~L$}L#|K#zJ"xI"wH!vH!uF!tF rD qD oCmBkAj@h?g>e=c<a;_:^8\7Z6X5W4Q2/54+780774885:9/77@CBፃ~˲̳εѷӹջ׽ٿùŻƼǽɿølYij:HJCRS@NO=KMQYYcedZ^]X[ZTWVQTTQSREMQyR1X&V(U(U'U'T'S'S&R&Q&Q%P%P%N$N$M$~L#}L#|K#zJ"yI"wH!wH!uG!tF rE pDoCmBlAk@i?g>e=d<b;`:^9\8[7Y6V4T3U1F2 *69.770672661:;2;;#/0܆|wھѷպ׼پùŻƼǽɾ¶aeuvW'V(U(U'T'T'S'S&R&Q&Q%P%O%O$N$M$L#}L#|K#{J"yJ"xI"wH!vG!tF rE pD oCnClAj@i@g>f>d=b;a;_9]8[7Y6W5V4S2Q1R092*)59.66/67.89/::3<<%12ݔĺּùĺƼǽɾܾdO]gwyd<c<a:`:^9\7Z6X5V4T3R2P0O/L.01/*48-56-77.7909:.89/9:¬ŻĺżǽȾʿƺwXCqBiz|?OPL\^GWYGVXEUVZaa^baY^]U[ZSXWPUULRRIPPσU.V&U(U'T'S'S'R&R&Q&P%P%O%O$N$M$~L#}L#|K#zJ"zJ"xI"wH!vG!tF!sF qE pCoCmBlAj@h?g>e=c<a;`:^9\8[7Y5W4U4S2Q1O0M.L-D-*23*35,46-67-782;;$12]][ȽŻǽȾɿkL5(jV"l}~BRTO_aJZ\JZ[HXZKY[X``V^^U\\TYYQVVNTSEPTzT3U&U(T'T'S'S&R&R&Q&P%P%O%N$N$M$~L#}K#|K#{J"zI"xH"vG!uG!tF rE qE pCnBmBkAj@i?g>f>d<b;a:^:]8[7Y6X5U4T3R2P0N/L.I,I+=,'24+24+46-57-67/89 ,-̶Ⱦ׹`?&LuT={]oqGXZQbdM]_L\^K[^JZ\K\]J[\JY\JY\LWYNUUERVqS8U%T'T'S'S&R&R&Q&Q%P%P%O%N$N$M$~L#}K#|K#zJ"yI"xI"wH!uG!uF!sE qD pD oCmBlAj@h?g>e=c=b;a;_9]8[7Z6X5V4T3R2Q1O/M.J-H,F+E(7,'24)01'.0&-.*01#%b_\ֹ`@'NtU>>ϮSdfM_`SegPacO`bN_`M]_L]_N_aN^`M]^L[]LY[=YdlU>ȏU%T'T'S&S&R&R&Q&P%P%P%N%N$M$M$~L#|K#|K#{J"yI"xH"wH!vG!tF!rE qD pCoCmBkAj@i@g?f>e=c<`;_9^9\8[6X5W4U3S2Q1O0M/K-I,G+E)B(B'1) *.$**$++%,-&-.)00ԻĦG& a\=#m}J\_TehUgiRdfRcePbdPacO`bO`aQacO`bN^`O]^B^gmWAT&S'S'S&R&R&Q&Q&P%P%O%N$N$M$M#}L#|K#{J#zJ"yI"xH"vH!uG!tF rF rE pDoCnBlAj@i@h?f=e=c<b;`:_9\8Z7Y6X5U4T3R1P0N/L.J,G+F*D)A'?&=$-' *.$++$++(// @}T3 fϘYjmPbdZlnWikUgjUfhTegSdfQcePbdQceRdgSbcQabIahqX?S&S'S&R&R&R&Q&Q%P%O%O%N$N$M$~L#}L#|K#|K#zI"yI"wH!vG!vG!tF!sE rE qD oCnBmBkAi@h?g>e=c<b;`:^9]8\7Z6W5V4T3R2P0N/M.K-I,F*D)B(@&>%;$:"-%!*,#*+)..p]>|S2-sԭԂ\oqReg[np]nqYknXjmWjkVijUgiUfhTegRdeTegWfeQfiMelyX:͌S$S&R&R&Q&Q&P%P%O%O%O%N$M$M$~L#}L#|K#{J#zI"yI"wH!vH!uG!tF!rE qD pDoCmBlAk@i@g?g>e=c<b;`:_9]8[7Z6X5V4T3S2Q1O0M.K-I,G+E*C(A'>&<$:#8"6 ,"!)+'-.xscE-M* |U3dy{.moeqmfeZ]ji^svatv^qs\oq[npZloYknXjlWjkVhjUgjUegWfhQks\d`V1R$R&Q&Q&Q&Q%P%P%O%O%N$M$M$L#~L#}K#|K#zJ"zI"yI"wH!vG!uG!tF rE qE pC oCnBnAk@j@h?f>e=c<b;`:^9]8[7Z7X5V4U3S2Q1O0N/L-J,G+F*C)A(?&=%;$9"6!32 ,'*) vqȾI)]:}W5i;uiWdvkZowq`wz`st_st_rt]ps\oq[npZloYknYjkXijTimRkrlaPS*Q$Q'Q&Q&Q&P%O%O%O$N$N$M$M$~L#}L#|K#{J"zJ"yI"xI"wG!uG!uG!tF rE qD pDnClBmA`@%e? i?f>e=c<b;a;_:]8\7[6X5V4U3S2R1P0N/L.J-H+F*D)B(@'>%<$9#7!5 2/. -ȫǼǽĺaE0L,_;aY6z`FwEN{K$|Z;ood`z`vz`tu`rs_qs^oq]no[npXntVmt_fayY:Q$Q%Q&Q%Q%P%P%P%O%O$N$N$M$M#}L#|K#|K#{J"yJ"yI"xI"vG!uG!tF!sF rE pD oCnCmBlAkAYRJcB&h=e=d<b;`:_:]8\7[7Y6W5V3S2Q2P0N/M.J-I,G+E*C(A'>%<$:#8"6 31. , + ^MBպɾǼźǾƾeU?" V5]8N[7tFsH#LyI"K N$y]Bhqmax~^y]w}\v|\t{^pqgg]w[?Q&P"Q&P%P%P%O%O%O%N$N$M$M$L#~L#}K#|K#{K#zJ"yI"xI"wH!vG!uG!tF rE qD pDoCnBmBlBk?gG,ahjeF,e;c<b;a;_9]8\8[7Y6W4V3T3R2Q1N/M/K-I,G+E*C)A'?&=%;#9"6!42/ - * ' &   o\RújQ@=" N/W4a:L^9sE pD(wH"|K$L#KO%|X8ubLqdRrbMy[>T.O#N!P%P&P%O%O%O$O$N$N$M$M$M$~L#}L#|K#{J#{J"yI"yI"xI"wG!vG!uG!sE!rE vFqDnBmBlAkAj@i>eYMckodL6d:b<`:_9]8[7[6Y6X5V4T3R2Q1O0M.K-I-H+E*D)A(?&>%;$9"7!5 20 . + ( & # #  @0$kVKwl~roc^H8<%9 I-N/Y6d=(`:pD lBuG!zJ"}L#~M$M$L LL M M N#O%O&O%O%O%O$N$N$N$M$M$M$~L#}L#|K#|K#{J"zJ"yI"xI"wH!vG!uG!tF!rE tF a>#S9%lBqDnBkAjA i=gH-fjjgkleTDb9a;_:^9\8Z7Y6X5U4T3R2Q1O0M/L-J-H+F*D)B(@'>%<$9#8"5 31. , ) ' $ !  " $  $)1=%E*I,P1[7j@b<nBP0rE xH!{J"}K#~L#M%N%N%N%N%N$N$N$N$N$N$M$M$M$L#~M#~L#}K#|K#{J#{J"zJ"yI"xH"xH!vG!uG!uG!tE rE qE qD oC>1)4.+N7%b>!k?h=g;hZMinojmng[P`9_:]9^:\8Z7V3R0T3R2P1O/M/K-I,H+G+D)B(A'>&<%:#8"6!4 1/ - * ( % "  ! $ ) .25!9#=&@'E*K-S2^9ڙZ'e=vG!pCuG!yI"zJ"|K#}L#~L#~L#M#M$M$M$M$M$M$M$~L#~L#~L#}L#|K#|K#{J#zJ"zJ"yI"xI"wH!wH!vG!uF!tF!sE rE qD pD nCpCf@ 3-+.,-1+)L>3kN5fF,lomlnllpojf_`9_8\5Q-Q-Q.Z8eD+R1Q1O0N/L.J-H,F*D)C(A'?&=%:#9"6!4 20 - + ( & # !   # & ) - 1 5 9"=%B(G+N/W4a:V3nClBrE vG!xI"zI"{J#|K"|L&|M(~L"~L#~L#}L#}K#}L#}K#}K#|K#|K#{K"{J"zJ"zJ"yI"xH!wH!vG!vG!uG!tF sF rE qD pD oCnCmBkAoBU9#1--0)'IJJt{|molorpoqoorpmnjWB.Q;'SD4}kǫwXBM-P0N/L.J-I,G*E)C(A'?&=%;$9"7!5 20. + ) & $ "   " % ( + / 27!;$?&D)J-P0Z7d<`:j@i@UoCtF vH"xJ$yI"zI xN-vP3|J |K$|K#|K#|K#{K#{J"{J"zJ"zJ"yI"yI"xI"xH!wH!vG!vG!uG!tF!sF sE qD pD pDoCnBmBkAj@h?k@D3'-)*_^[vyxqtsrtsqtssusoqpEUX1GLɣҷnN7H( Q1N/L.J-H,G+E*C(A(?&=%<$9"7!5 31. , * ( % "    # ' * - 15 9"=%A(G+L.S2^9g>Ue=h?e=$lAqD sEvQ5wJ&yGtP5rT?{HzJ#zJ"zJ"zJ"yJ"yI"yI"yI"xI"xH"wH!wH!vG!vG!uG!tF sF rE rE pEpDoCnBmBlAk@j@i@g?h?b<;1+mpowzxtvuuwvtvuuwvqtsHUV;KLU5J)Q2M/L.J-I,G+E*C)A(@&>%<$9#7"5 31/ - + ( % #   " % ) , / 37!;#?&D)I,O0V4a;mB$h?d=h?nCqBuO3vYEvBqR;nYKxGxH"xH"xI"xH"xH!wH!wH!wH!vG!vG!uG!uF!tF!sF sE rE qD qD oC oCnCmBlAk@j@i@h?g>f?e>a6`K8t|}uxwwzywzxxzxwyxtwuETUNZ[tM-N.R2M/L.J-H,F+E*C)A(?&=%;$:#8"6 42/ - + ) & $ !  ! $ ' + . 15 9"=%B'F+L.R1Z7e=kAh>e=j@nCqCwcXuO0nO8k]VvG!wH"wI#wI#vG!vG!vG!uG!uG!tF!tF tF sE rE rE qD qD pCoCnBmBlAlAj@i@h?g>f>g?b:`8t\IӂԂ{~|z|{uxw|~|wzxDTW]edׇgRH( P0P1M.K.J,H,G+E*C(B(@&>%<$:#8"6 420 . + ) ' $ "    # & * - 0 47!;$@&D)I,O/U3^9h?d<b<a;Mg>lBm@sU?yh`qWEob^qG%qBn?m>tE tF!tF sF sF rE rE rD qD pD pC oCoCnCmBlBkAj@j?i?h?f>f=f>]5g@"v~~inmlpoz}zHY[P\]P7"Q/O1L.L.J-I,G*D)C)B(@'>%<$:#8"6!420 . , ) ' % "    # % ) , / 26!9#>&B(G+L.R1X5c<mBMj@_9Y5 c<h?kAnE#td]qc_uq`F{O,fJvaDm@rF!qD qD qD pDpCoCoCnBmBmBlAkAj@j@h?h?g>f=e=d=^6}[ADZëìȰ|{xۂqvtZba΅xsskhnonR\[I/N.K.J-H+F+D)C)B(@'>%<$:#8"6!4 20 . , * ' % #   " % ' + . 15 8"<$@'E)I,O/U3\8g>zI" mBb;_9e=g=f:fUʲͲɯqD!pCpD oCoCoCoCnBmBmBlAkAkAj@j@i?h>g>f>e=d=c<`9eN}z}}r}zxu{y{zx٘tosmtnlZUMI,J-H,F+E*C(A'?'=%<$:#8"6 4 20. , * ( % # !  ! $ ' * - 037!:#>&C(G+L.R1X5a;kAe=\7^:D]6vP4ͳԺε̴ӹֽ]?g;oD!mBmBmBmAlAlAkAk@j@j@i?h?h>g>f=e=d<c<b;a;`:gB%`<_:^;W2V2Q, bE0߈pxx͗sXHxf^uqxs{yhSFB% G+D)B(A'@&=%<$:#8"6!4 30 . , * ( % # !  ! # & ) , / 26 9"=%A'F*J-O0U3\7f>pDDmBW5N5!\7a;pսεҹֻpaj>lBkAkAkAk@j@j@j@i@i?h?h?g>f=e=d=d=c<b;a:`:_:^9[6[7Z6Y5Y7Y7U2`@)xspP\\bjkӂgVD$O0X=)hRDzg_yv^G7A%C)A'?&=%<$:#8"6!4 20. - * ( & # !    # % ( + . 25 8"<$@'D)H,M/R2Y6a:kA֐X)rE Y5X5r\7Y1hQ̳vo^SQ\D3l?jAi@i?i?i?h?h?h?g>f>f>f=e=d=c<b<b;a;`:_:^9]8]8\8Z6Y6X5W4V4S2X7ogaP`cȁxs\<#I,K.G)D'F*T;(dOBF-?%?&=%;$:#8"6!420. , * ( & $ !    " % ( + . 14 7!;$?&C(G+K.P1V4\8f>pD rmBS2O/X6^:Z2mO9]SQVJF_RN\RP[A.a7h?g?g>g>f>f>e=e=d<d<c<c;b;a;`:`:_9^9]8\8[7Z6Y6X5W4V4U3T3R2O.{oeꍖt]LG(K/I,H,G+E)@%># @'>&=%;$9"8"5 420. , * ( & $ !    " % ' * - 0 36!:#>%A'E*J,O/T3Y6a:lAyI"rE U4S2Y6_9\;!^SO`TP[OKh\Xt_Z1c;e=d<d<d<c<c<b;b;a;a:`:_:^9]8]8\8[7Z7Y6X5W4V4U3T2S2R1Q2M,gYM~U6H+J-G+F*E*C)B)A'>%<%:#9"8"5 410 . , * ( & $ !   " $ ' * - 0 26!9"=%@'D)H,M/R1W5]8g>pDlBO0M/S2Y5\:^PJaSNxjenaԺvd=a:c<a;a;a;a:`:`:_9^9^9]8\8[7[7Z6Y6X5W5V4U4T3T4T4S3Q2P1I( cQAn\MB"F)D'D'C&A%@$?$=$<$:$9#7"5!4 10 . , * ( & $ !   " $ ' * - / 25 9"<$@&C)G+K.P1U3[7c<mByI"sE P0N/S3X3]LC\A-{bS}kaV0iD't`hQ^9_9_:_9_9^9^9]8]8\7\8[7Z6Y6X5W5W4V4U3T3S3P0I)D% C$ G(I-F+]F3_I7P9%S<*P;(H5#F3"F3"C2"@,<':#7 4 3 1 1 0. , * ( % $ !   ! $ ' ) , / 15 8";$?&B(F+K-O0T3Y6_:i@sE oCI-E+N0S1ZA/X8[8slhJ3W0S.]8^:]8]8\8\8\7[7[7[7Z6Y6X6X5W4W4U3U3S2S2R1P0U7tU?taŧѶ጑ЋˏΓόatw[pr^qsZnqWhjUddQ\[LQMFF@?9/8, 1 , )( ' & # !   " $ & ) + . 14 8";$>&B(E*I,N/R2X5]8e=oC~M$vG!I-G+fM/S3U4S0fJ5waTW2\9Z6Z6Z7Z6Z6Z6Y6Y6X6X5X5W4V4V4U3T2S2R2Q2Q0T45ӵiޏΊ̋cuw^ps]oq[np[npZmpZmpYnqYnrXmqUhkQ^^EHD94,-!$ !    " $ ' * , . 148":#>%A'E*I,M.Q1V4\7b;lAvG!frE U4H,M.Q1T3Q.kRA_A)U1W6W5W5W5W5W5W4V4V4V4U4U3T3S2R1Q1P1P1P1-M1tމ]sv`tvatv^qt]oq[npZlnYjmXikVhiUgiXkn\sw]sxWilGPM31*#" # $ & ) , / 137!;#=%@'D)H,L.P1U3Z6`:i?uEO?0D)A'%G+L.O0P0S3^A+S2T3T3U3U3U3T3T3T3S2S2S2R2R1R1R1P0cJ2 \<#|iƟɿƼŻ۾􄋊\svZqsauvatv_qt]pr[npZmoYknXjlXjlZlmWikWilZnr]rvVfg795  !* ) , / 136!:#=%@'D)H+L.P0T3Y6_9g=nD!WG6MlH%9FH9DGC)A'kF*J-L/N/P1Q1Q1Q1R1R1R1R1Q1Q1Q1Q1P1P/O0;+ ,&$~3P9(WD8xg_ɿȽĺ׼ʱë˱Ѷ񂊉\svWor]ruatv`ru^pr\np[moZlo^ps]oq\op\mnYikLadLgkǖt. ./ 14 7!:#=%@'D)G+K.O0T2X5^9d=pB\G33FL4/*'&.(&<40F>:-=62$ŻպƭëȰ̳׻پ±󗗔k{}WorTmpXnq[or[oqZmo\ps[orTilJbfKcfѻδXD7$4 4 7!:#=%@'C)G+K-O0S2X5]8c<mAiH*9KP>HI;QGD\QM\pb]+ȾxȾøӹĬëɰʹѷּøƼ}jz{cuwctvevwj{|ԿŻɿżjUG(:$:#=%@'D)G+J-N/S2W5\8a;k?pF$FNM=MO?LL=JL=HJ;GG:FG7EG9EG:#7!1<$A'C)E*F*G+H+H,I,I,I,I-F)T=+[PMI@<:30-'%0*'<52G?HK8"5 Q9">&@'B(C)D)E*E*E*F+C'O5"l_ZYNJH?;:30-'%0*(=52H?rD]Q@@W]GSSCRTBQRBOQ@NO>LMUCQP9"2b7!<$>%?&@'A'B(B(B(@&p^Uma]VKGH?;:20+&$0*(=62H?qCcR>DZcIWWGVWGUVESUCRSBPRd=LK5 1b48":#<$=%>%?&;" P9'snh[VWLGG>;81.+&$1+(>63H@=SHE]QMfZUob]xidqkxr~x~ëȰʹҸּڿ¹ŻȾɿŻڿҸǮ[@,H)P1S2W5\8a;g>qCcS@G`hN[\KZ]IX[GWXGVWFTVk@OQBQR2- b05 7!8":#<%4 aL>wrfYTVKGF=:81.,&$2,)>63I@=SHE]RNfZUob]xidqkwr~x~ëȰʹҸּڿ¹ŻȾɿŻڿҸǮqWEI)U4X5]8a;g>qCeUBKemQ__N^`M]_L[]KZ]HXZW>TGHP\EST0 ) b, 145 7"0^J74I@=SIF]RNgZUpb]xjdqkxrx~ëȰʹҸּڿ¹ŻȾɿŻӹȯtYGN,Z7]8b<h>rChWDOjrTcdRbeQacO`bN^`M]^BFUWFUW- % P) - 0 2+\HTIF^RNgZUpb]yjdqkxrxëȰʹҸּڿ¹ŻȾɿŻӹȯy\IS/_:c<j?rE!g]MSnvWghVghTfgRdfRbd{P`a"L[]GWX) ! /$ ( - (D2%~oidXSSIEE<95.,*%#3-*?74JA>TIF^SNg[Vpb]yjdqkxrxëȰʹҸּڿ¹ŻȾɿŻԺɰnM5[5d>l?rI&ef]Xs{[llYlnWjlWhjUghHOdiN^_&   # ' ' gXQh\WQGCC;85.,+&$3-*@85JA>TJG^SOh[Vpb^yjerlxrxëȰʹҸּڿ¹ŻȾɿŻӸζ^8f>nAqQ4dsr^v}_pq]pr\npYmnLWjnSeeO`b# * i  6(h[WRGCB:75.,+&$4.+@85JA>UJG^SOh[Vqc^yjerlxrxëȰʹҸּڿ¹ŻȾʿŻԺϷyV8WMJ|lfsm"ysNyէ魘ĬɰʹҸּڿ¸ŻȽ°ĀN"ٸmP`TPj]Xrd_zkf $*MNĬNɰNʹNҸNּNڿM¸*Ż$Ƚ smyszĬɰʹҸּڿ¸ŻȽʿ??????????(@ @U(T'T'T'S'T'S&M${J"uG!pCj@SSS#$1:;Y*[*a-xI"h?^9052'24yP.]+_,wH!S'$S'RS'zR&P%N%L#{K#wH!sE znBRg>$I-b;X5Q089w#,-C<1{L%X):Y)Y)ՒX)W)W(U(T'R&Q%N$~L#zI"uG!pCj@d=\8:<$iK5U8! _+34(11,45$15@^)a[+ј\+\+\+\+[*Y)X)W(U'S'Q%O$M${J"vG!qD j@e=]9P-`!^LCSA6!%,,(01*11.43TC2ϑ\/b-_*_,^,]+\+Z*Y)W(V(T'R&P%N$}K#xI"tF!pD g<b:d@$[;"J+U}sc@63'!"$++%,,'--/42397-891<=ZTGb6`+_,]+\+[*Y)X)V(T'S'P%N$~L#zJ"wH"nAzQ2{yps_T^K>J5%9/*$ْ%+,"#"()%++*11+35+57.78/89&7=EGA_-_,^,\+[*Y*W'V'S&R$Q&O$L${J#vF uI%xr{mhpc`bVRQE@C82IF=8JNN&&!'('..'/0(01*23+35-67298$5:sQ2a+],\+\+[(^>V+Y/dEO O$~L#{K$tCcJ~ngrd_eYTXMILC@C;970-+%#lH?;t!"#$")*$*+%,-'./(00)11*24.56&49VF4a+]+]+V+N&[AydY~rgMyK'|O*L#{K#vEfVzmik]W^SNRHDG>;;31/)'+&$4-+?74qQGDN288#$%&%&!()")*$+,&-.'//(00+22%15F?5_,]+\+T(X;%E;7zkgfXRgJ5~N(~L#zJ"wG o[OcXUWLHKB?@854-+,&%0*(:30D;8MC@VLHkaUP !(( '(&'%%%& &'!()#*+%,-&..)00"-1B:/ԝ^,]+[*^2lTXJDvhdhXQhK6}N(}L#yI"vG fO@NFED;8920.(&-'&6/-A96JA=SHE[PLcWSm_ZFoa\n@FF""#*+!()!'( ''&&%%%& '(")*$+,&,+#(K:*ɞ_+[*Z*^8\3\AxaTzlcIxK&wM,|K#xI"tF!sDAS5.,*%#2,*=53G>;OFBXMIaUQi\Xrc^yiduo|mg1&'%,-#*+")*"))!((!'( &'%&%%&'!'($$$Z@)՟_+Z*Z*X'U#fJT+V,dIM M#zJ#xH"sF pE"jcODB:7A96MC@UKG^RNfZVoa\whc~niuo{uztr~$%(01%,-$+,#*+")*"))!(( ''&&%&#&& #""qJ)^+Y*Y)X)V)V*R&P$P&M$|K#yI"vG!rE qE!dLB?\QMdWSl^Zte`|lgsmzsyM'RYY"+,)22&/0&..%,-$*+#*+")*!() '("()')(!! ̊U)\*Y)X)V(U'S&R&P%N$~L#{J"xH"uG!qD k@ƒĺжte`eXTsd_zjeqkxr~x}]>-67-67+45*23)11'00&./%--$+,#**,00,.,!%eD']*X)W)V(T'S&Q&P%N$~L#{J"xH"tF!qD pE"`5}eͳpk{uzë+?1;<2<=*34&/0,45)12(01%./365#,0[A*\)W)V(U'S'R&P%O$M$}K#zJ"wH!tF!qD mBj@g?`7^L;zwyrƮ˲жԺؽּfÚ!*+-89+56!*+:DEftu4?@,56)125::9==352U)X)V(U'S'R&P&O%N$}L#{J"xH!uG!rE oCkAh?d<b;Z8:=@EQS\__]^\JQSQH=V'V(T'S'R&Q&O%N$~M$|K#yI"vH!sF qD mBj@g>c<`:\8X5T2450,68(0/LON徨׻Ժڿ¹ŻȾQƻu{8FHHVW[`_[^]PUULQQφV.V&T'S&R&Q%O%N$~L#|K#yI"wH!tF!qD mBkAh>d=a;]8Z6V4S1I0,461:;#/1MQPռùĺȾ۽zaς>MOJZ\P\\Z`_SXWGRVwS4U%T'S&Q&P%O%N$~L$|K#yI"wH!tF qE oBkAh?e=b;^9[7W5S2O0M-=-(3729:)+؍}Ⱦͯ0wEVXQacL\^M\^MZ[BX`oT:T%S'R&Q&P%O%N$~L#|K#yI"wH!tF!qD oCkAi?f=b<_9\7X5U3Q1M.H,F)5+ $/2!()c<`:]8Y6V4R1N/J-F*B(>$.%$-/#$ƯnZ)mmRegYjl[lnWhiUfgQglShkyX9ыR$Q&Q%P%O$N$M$}K#{J"xI"vG!tF!qE oClAi@f>d<`:]8Z6W4S2O0K-G+C)?&:#7 .#İҶZ:!iZg@mN2mfX`{]v{[qvXpvVmrccZςU.Q#Q&P%O$N$M$~L#|K#zJ"xH"vG!rE!qD oCkB bD*g=d<a:]8Z7W5S2P0L.H,D)@'<$7!30  }aNG% H*dzHL#z[=ni\ikbocRzX8P%O#P%O%N$M$~L#}K#{J"yI"wH!tG!sE uEoC l?hJ1cWLd:a<`;\8W5T3Q0M.I,E*A'=%9"40+ %  [J@|iP@E'[8S3uF sF"yyI"JL N"M M!N%N%N$M$~L#}K#{J"yI"xH!vG!sF tFZ;$S9%i@h;g^Tgb\b9Z4O+ S0U4P1M/J,F*B(>%:#6 1, ' "   */8 Q1^8zZ6pCnBQuG!zJ#|K$}M%~M$~M$~L#~L#}K#|K#{J"yI"xH!vG!uF!sE pD oCjA7-)?84n_PmonmlhV;#hJ2u`{[EN.N/J-F+C(?&;$7!2. ) $  ( /5 >&G,U3c<Q_:j@g?&pCvJ'yI"vO1{K$|K${J"zJ"zI"xI"wH!vG!tF!sF qD oCmBjAnC X5HFDxtutpsqBQSоZ;"L-K.G+C)?&;$7!3/ * %  # ) 0 8"@'J-Z7kA&e=e=kj?qI)xU;nR=sG#rBvFwH!vG!uG!tF rE qD oCnBlAj@h?^5gB#zrk}~xzxotsWbcяq^J)I*K.F+C)@&<$8"40 + & ! ! ' - 4 <$E*Q1`:j@g>e>j>kOd<eNȲoutstrhkkF3J*K.F*C)@&<$8"4 0 , ' "  % + 29"A'J-X5f>`:_9Z5=g@pƯ׽oC nCnBmBlAkAi@h>f=e=a:jE)q^jV~]Fqg{ʂrjoh}spT:&D(C)?&<$8"4 0, ( # $ ) / 6!>%F*P0`:nC=j@X5[6̛{f˲iH.d7lB!i@i?h?g>e=d=b<`:_9\7S.Q.N) aO@qwx^@(K.cK;eOAB(?&;$8"4 0, ( $ # ( . 4 ;$C)L.X5g>pDU2S2bW0dN@TLKsaXzT7a8f>e=d<c<a;`:^9]8[7Y6Z8X7P-cM+l[So_vakF*^8a;_:^9]8\7Z6Y5V4U4K*I*M.S=*XC1M3H2D0?*:#5 1 . + ( $  ! ' , 28"?&G+O0Z7j@ԗZ)tF N/L-YR4\;!jO%E*M/V4f=sE YoCV2I,M-Z<$[<#T1V4V4U4U3T2S1S1Q1U_F1ӿȾl|~TmpZor^qt]qt^svavzUbb696  $.1 7!=%D)L.T3a:kC!A(>&E*K-O0P0P0P1P0O/O0=.#/+*ȾԺǮʰɲtXnqPgjMcfIbfIchhz~²͠}2 , 8#=%C)K-S2^8kB FID6EIf:NT?JJ;HIy>%7!m;$A'C(D)C(dSISKH2+(5/,MDAaUQqc^}mg}vƭ϶ֽź¸ƽy># L.S2[7j?bN:@X_FRSBPR>LM@NO;$1q5 ;$9 M6$whdMC?1+(6/-NEBbUQtfavo|Ʈ϶ؾĺȾǽֻ[?)P/\8j>eQ1+(70.OEBbVRtfatn{Ʈ϶ؾĺɿǽ׼«hJ4Y2l@hVAQkrScdP`alL[^FTV/ $ I$2!m_YMD@/)&81.PFCcWRufauo{Ʈ϶ؾĺɿƼfA#kD#icVYu}Zjk{Vgi8QinHVX) " ;.&MDA/)'92/PFCcWSugauo|Ʈ϶ؾĺɿûjRf9rrhI]4bmj ctuO_aL\^( /  U6*"0)&:30QGDdXSvgbvp|Ʈ϶ؽĺɿøm_0UScfUfh  " + `;3.QGDeXTvhbuo|Ʈ϶ؽĺɿѮt`i>m[F`}_qr&?5/" PD?:eXTvhcՇvp|Ʈ϶ؽĺɿȐ:R(~yO..%436vhbvp"|NvƮ϶ؽĺɿvN"äPE@eXTse`Ÿvp|Ʈ϶ؽúɿ???(0` $V(U'T'R&P%N${K#vG!oCi?-55054Z*[*]+lAa;V4+22_G1R&T':S&aQ&|O%~L#yI"|tF amB:a;Z8L. [puv"++adca{P+Z+^Z*Y)X)W(U'S&P%N${J"uG!nCg>`<^[?+r_U_OGQmrr ()+33'14uO.wa+^*]+]+[+Z*X)V(S'Q%N${J#uG!oC c:Y3P.x% =0)3*&imqq'-.+10175:<7[N>a7`+^,\+[*X)V)T'Q%O$}L#xI#oA~W9|ml_kWJXE8INB=@73i#)*'--*22+46+68$6;;B?]._+\+[*Y+V&S%S)O$~M$wGyM*}ojk_[VKFC95yjeMC?Uڐ!%&"))&--'./(01*23066#39rQ2a+\+X([3^DlRZ5M#M%vE`Gwsl^X]QMMC@>641+)0*(l^YJ@=0bgg && &'!()$+,&-.(/0+22#16]H3`+\+P(Q;,qeazfN?zM)~L$xGrXEcYWUJFD<94.,-'%4-+B:7OEBl^Y ҕ &'&&!'(%&%& ''")*%,,)//+/[C-ܠ`+Z)cxM+}K#wH mK1ICC<41.('0*(>63KB>WLHbVQl_Zse`O{%,,"()!((&'%&%&!()$))&gF)ڟ_+Z+Y+^7]CiNX4{K#{K#uG!sE}% 70.G>;SHE^RNi\Xtea~niwqGuoBII!)*&-.#*+")*!() '(&& %&"%$!yN)]+X*V&Y.T'P$R*~K!yI"tF!oCì\QMWLHfYUqb^{lfuo~w~Գ }Gޒ,44(01'00%-.$+,#*+")* '(%)*"%%!" ՎW*[*X)V(S&R&P%L#{K#wH"rE nB·Ļ{ufYUzjerl{t|px(12-56*23(01'/0%--$+,")*,/.%'C3%]*X)V(T'S'P%N$}L#yI"uG!qE!g<Ȩzkfyszʲ +661:;.67-67)12'/0&//%,-032'*rJ(\)V(U(S'Q%O%~L#{J#vH!rE pD!a7fMûztɰʹ\˲>3>?.780:;#,-/89/78&//)00-45>6-Y)W(U(S'Q&O%M$|K#xH"tF!pDkAh?]7h]TvrǮʹԹؽԹUʌ0:;1;?>A?2:=uN,Y(U(S'R&P%N$}L#yI"uG!qD mBh?c<a9M6!AHIwoj𧻓ŬĬ̳Ҹؽ¸Żù]CRTBNO_a_IQTYI9W'U(S'Q&P%N$}L#zJ"vG!rE nCj@f=a:[7Y5;6.".1CFD䲟׼ջŻɿ·:ŹYIZ[BOP^b`SYZRRNыV+T&S'Q&P%N$~L#zJ"vH!sE oCkAg>b;^9X6T2K/266%13>EDϷǽǽڽ_Ź9QacEUXQ^^Q\]KTVT/T%R'Q%O%N$}L#zJ"wH!sF pClAg?c<_9Z6U3P1L-?+.67#&Ɔ|wƨzoԝPbdOabSbcLaeJ^c}U2ڌS$R'P%O%M$}K#zJ"wH!sF pDlAh?d<`:[7W4R1M.G+C'7&#$FHHxe4h|~OfkZloWkoPip]d_U/R$Q&O%N$M$|K#yI"uG!sE pCkAh?d=`:\8X5S2N/I,D)=%:")<<:ʮV6jL5iKtExuY=iso`stakgo^IR(P#O&N$M$}L#{J"xH"vG!vFpClB cJ5d=c=]9X5T3O0J-E*?&:#4 , +yoֻƼɯgK7I' zP/Y5vH"`}IN&~S.P'M!N$N%M$~L#{J"yI"vH!uF kB!Y<%i=hI/gb\a8Q, U2U4O0K-F*A';$5 / ) ,G3$<$G(a<_Z7oC mB:uG"{I!~L#M$~M%}L#|K#{J"yI"wH!uG!rE oCpDE2$H@;tohjliXE2maKL-L.F+B(<$7!1+ $ % * 0 @'U4d<:`:i?`;nCwM-sO3uF!vEyI#wH!vG!tF!rE pD nBlAg<\4`_\|gmlmtt֫}T5J,G+B(=%8"2, &   ( 2<%H,Z6vH!f>pDg=mH*r^TX9W5rDsE qD oCnBkAj@e<oI+{~rwwhfcE(G)G,B(=%8"3- '  % . 7!A'P1b;N0`:T, _\B̵̳_Cj=nC lAj@i?g>d=`9uS:cNyXByyvymexe\l[PG+A'=%8"3. ( ! # + 4=%H,Z6j@_f=W54gB%ykpdahE*h=g?f>e=c<a;_9]8W3P,M*nf_W<'E% S9&E,;$8#3. ( " " * 1:#D)Q1c<M$nBP-P+ yQ5iZStcqL.^8a;_9^9[7Y6W5R0N.Q49M4 H1?);%6 0 + ( $ ! ) 0 8"B(L.]8lByg>L0K/P1_@(cD,\8[7Z6Y6X5W4U4J*|]I̮۾莒VkmWijWcbOVSC@94)" ! * / 7!@'J-W4j?֚U yFG*E)MJ,U6R1S2S2R1O0F.`D/ cǽɳgz|SlpQimPlqFdj{HVVbSJ+ + 8"?&I,S2e=XF3? ;H+?&D)J-K-J-M/I;2.**H@>WLGfĬī׻Ӽ웙嚘ѲŽ:$>%I,Q2d:bH09MS=HH9EG;FHT38"=%C)A%aNBMED/(%I@=eYTxidztĬж¸Ƽvh@$ S4b9hH,FY]ESUBOPBETV2S203 >'sc\H?eYT}nhzĬѷǽR2c8jK0QehM^aKXY<O^a0 C)& ) bTLJB?/)&KB?fYU}nhyĬѷȾɾǿa9lV?[rvUilhUbaHVW/ / I4'B960+(LC@gZU~nhzĬѷȾӷ]AeA Yf%]qsHWX' '  -"x3+(MC@h[V~oizĬѷȾ|dx X,SdfRce! - 1!MB=^h[Voi퓁zĬѷȾȴŹ^ybcGlJ,dx{^qt$3*$qkz8\vĬ~ѷ~vȾ\8`0/#OD@dXTʾpjzĬѷȾ???????????p ?( @ V(S'Q%M$wH"nC%38X,^+c/zJ"d<U3}L"S'$R&HO%\}L#\uG!Hj@$K.o`YL;/iFMM$(=s(^([*ՔY)W(T'P&~L#uG!lBX10 9'/)'4GMM&&-55SF6]4`+]+Z*V'R%O%|K#qB{U9~dShSGF4&\NH1VZ[*11,33%491<>ܒ\.^+[*Y.Y/Q&{I |Q/~qm^RN@74MC@"()#*+&-.,21"06uP1`+yL(p\RpeuL+}IwU;f\ZLB>5.,1+)A96_SOTJFj@FF""!((%&!'(&,,)-sM,_*Z6u`VmbsK+{J!uK)635-'$81/LB?^RNn`[ҹeXS,˓!)*%,-")*!'(&&!&&#Q)\*X*X/V.N%xI"n@bUQSIEk]Yyjexr||}wi!)*)12&-.#*+"))#())'#ݐX*Y)U(Q%N#|K#uF mBĸఛk^Yuoz{&0109:%--&..'--"+.Q<([)U(S'P%L$yI"sF"d9xqɰŬ-#-.&01CNN.78+33055߁Q)X(S'Q%M$zJ"tF!nCg=]="mfcȯҸپ=άծrDKJGPTcK5W&S'Q%N$|K#vG!pDj@c<]6?4(>FHᣑ׼׼ĺɿ·%Ĺ8͙@LLU_a]UL֌U(S&P%N$|K#wH!qD kAe=^9W5O0*-*/:=ȱٻF}сDTUKcjWZTS*R%P%M${J#wH!rDlAf>`:Y6Q1J,C,z[whrmOjqXnrg`RS(P$O%~L#zJ"xH!rDjB g?a:Z6S2L.D)>&%m`YQ1[gH0]:r>G{N)y^C|W6O$N#~M$|K#xI"uF!e@#h?gTC\7Z5U4M.F*>%5 , # SB7u_QQ4O* FS0g8nH(&vG!{I!zF|J"zJ#xI"uG!qE qDO0UQKimj{i[eOI*G+?&7!. $  -N.oE$%a;f>kB!vZF[nI,^7~~i>lAj@g>c<c=tR9t\Krg^eL=N4!>%9#1( " / <$P1e=^9U3R&!]@+p]TuP3`9a;_9[7V4J' U<&R?,B)C-7!0 (  " - 9"G+^9uG"!kAP2I+]>'`>#X5X5U3T1K' YԶ÷_prJ]_EQP02,* 8"C)X5jAa<9 9 C'J-M/N0C3(4//A׽˲ʰƲ剐֛оқx5 B)U2cA#?LM7EH% bkgLfnH`H231$7/+C;8n`[|vԺǼϲ}U7[mk\ =]j@LN/ 6%#F=8m`[Վ}vԺƼǻjŲN^`7*!j]X}w"ETԺTƼE"]AcYH]+!F=:i]Y|vԺƼ`???(  BD?wkdSIR&Q(/xJ%/d=YA/OEB t)47zT2^,V&O"tF {YAyha$vkv6;; ()5:9X+];X:|O+l]W@8581.FD;8E$**%(ΆS(^=|V9zJ"LDCJ@=te`훈%vp{MTU""!*-4/(W(S$}JuH#y![fe3@FmL/U&N%uH#i>ZE2ϵھb|fUD΋T'N%xH k@`:L,,)#º-q9i\JhS;ޅP$~L#pCfC%d?"T3H,)ud[wK+-O}Q/R+uFpClG*tronXFI+:$& =! wDzz`P|]Ge;`8eA%n[KE3"0   ?'a:G(B$= 'Q3U5@)ɪnqmdUK9"U5XK;QZD.<%,GD0"B<:|niŻsT=TI:51{lf񶟗ٻ{_F+=A(mR@wq,,XD>DNN7*!<41kVopenscad-2019.05/icons/icon-nightly.scad0000644000076500000240000000266313402025764020464 0ustar kintelstaff00000000000000RES=100; Logo(50, RES); colorValueR=246/255; colorValueG=241/255; colorValueB=200/255; module Logo(size=50, $fn=100) { hole = size/2; cylinderHeight = size * 1.25; difference() { color ([39/255,84/255,139/255]) sphere(d=size); color ([168/255,177/255,202/255]) cylinder(d=hole, h=cylinderHeight, center=true); // The '#' operator highlights the object rotate([90, 0, 0]) color ([colorValueR,colorValueG,colorValueB]) cylinder(d=hole, h=cylinderHeight, center=true); rotate([0, 90, 0]) color ([168/255,177/255,202/255]) cylinder(d=hole, h=cylinderHeight, center=true); rotate([30,30,0]) color ([168/255,177/255,202/255]) star(cylinderHeight, 12, [2,5]); rotate([45,-30,0]) color ([168/255,177/255,202/255]) star(cylinderHeight, 14, [2,5]); rotate([90,0,45]) color ([168/255,177/255,202/255]) star(cylinderHeight, 16, [1.6,4]); } difference(){ color ([colorValueR,colorValueG,colorValueB, .75])rotate([90, 0, 0]) cylinder(d=hole, h=54, center=true); color ([129/255,127/255,106/255, .85])translate ([6.5,0,0]) rotate([90, 0, 0]) cylinder(d=hole*0.8, h=cylinderHeight, center=true); } } module star(height, num, radii) { function r(a) = (floor(a / 10) % 2) ? 10 : 8; linear_extrude(height, center=true, convexity=3) polygon([for (i=[0:num-1], a=i*360/num, r=radii[i%len(radii)]) [ r*cos(a), r*sin(a) ]]); } openscad-2019.05/icons/icon.png0000644000076500000240000024551413402025764016666 0ustar kintelstaff00000000000000PNG  IHDR&iCCPiccxڕXT[> H EEW)AޥH HH ET@DDbADPA4)ox[﮷&w̜q )+kfP LR#nd߶ @ /5z"HƬn;b32;acq&+~v]2v=dDp#}U]HٙDq&U??  ᱌0"ewplZ('<'MvraHGv(V~{{Q[6YۿK7@ݛH wy!dyx CA2=͗d_1W$Ŀ-.[8PdZ\S\T"КӑGu;d7-)PQ :֬^8{S7N@ޠp yE-t]}1۩ͅ-ѽc밷Oo3Ză$@ `ä*kF>%-Kq~!c-Iג3SBSt3dre1fSd/]ɭsI|W^<(,* *ֽ{u4̤|ZJ*|<5ڡ7 , o}N]s{g[Soy@z(pYGYg#.OO{ʞ?|y[_|v`Ő۰e#v/9_| Ѳ1rߣ޷NLJN~Iki}qt~:`l9;k? r_]XbZJE+wYlJ͵ mXv`C I1IKXÞ&(_e a+6Qaև:$9/5)*%I^Z!DUiIE\F-^5QZ81m:a'Of^+/742ahtڒ֪6m O[| .uݟx4y{%y8K%2頉!oB_ o( ;g-C;qy\K|EBFbX[a\*wvdz{FQfro\;q~ޥKg./^y\[Z$S(Z\rԼL|}*+Rorn|_!Ii;蝹h-l o@!o;}Ǥn' = =6^x\Oa`pn(m˺W^o}?̸{ ΉɁeJP|q Yۯ_=˞\\x=_~F//U/gį=m鳣?=pA"i ¤Qy(.'31y3lbؽ8JS[ׂ{L`@pHwpHpQG1A1q&_~ Y|$Tfsr4r# x%~egjc+w5jyS_ԙ8]ݫznZiFG>_412e53+7O[ZKZ/ܳ={Z]}#S!Ιy墫ۈ{iOWOoO3gUҝ@AR!ҡòW"=)EDFŸǾ>g/@0؟Ԑj&ΐ&#-S(~]6&gP·ܫ.\&]i).)\*j*puqiJq9|uJt۪5Z+7_g6˲#wq--?i+Iz|#. ݊O{ ?{EžsL=e%в`c-)#:S@x޿@ߐs &^؂h!.HR (J&94@ {D 1XE 1JAMQRXQP t/ sGIܢ2*Z6ACAH󀖋6vNG!a1q)0G YY!(6sWqhp|ܗ̩˃k;?+W4ϹI DEĚƉKI,;\%r$@騩!9!y.EN%e %jf4|5#r گt#']_q)06o>in`mfoP8GuNppun/=*6^Ɨ&J&~N<5q8;O2[ͥ叮 TWU?8Y%]"=mRևGZ8δWnخ~3m8nJln%ocw@A Vq !}\%']ǙS  _$,bx@T-I`x!ü%'<*=(*)*'_PxKMJ[o655Ŵxwm:O2_236>ae:n.io9ec}Ӗtݦmu w &/6`q?-")+#+l1<#R\w,xIva阌YM9yy R4yVp^뫌0Nu64ު*6)׵֓ki ώԿSO}hyMh>O2Кv9Um9s?ºc'^ P4 Bp#$D yCPU_(>y.~(רf]?8L:~ a0fderdfce efbJ`?qSuۍGgNNl":EO9udxl\PTUUWQs?[uiS֙9iD_ 21e00=j;_wul΍gQHu8 <."8I$y=azJczE%p땁ܒ2 UꕚfBVn48 >m|X{7s Зw^>fm;ى6֦?L|>W2߲ʿR~/r,/Uܵrlno5}uqZںzo.+~OoondmߘdT؜:ugkn[pz;knӨ58=MO;O fu203FZ  S<|fFW{쨥 cnKk}Xϕm:xhg7 O_s=>{%d = \H?6Maf{c&#^~&{V]@zpb܀ z@h`#?`?V;gp3 L#ڵx F;Q0b[ ?<9Ok%PE w0J %@TQ ¢8J%PJpB\qvs=^]@NF|/ حw8p N&X?Svǝ%IIJ*@k+c bKGD뻥 pHYs  IDATxu'H Dqw%!N\ IH{RH--!HpYs֬6{{|>Rq'3{~r\.W[r\.9\.r p\.@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.A.r*x.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\.*s p\.U@r\.́r\.Wr\2r\e.r\.r9\F5=hŹթ.xf@F5n[|re-+O}O?i؆\r prg/nԮFp oL\pr%΁rT:'5zNmmapJ"+ k^ME56ͩ^_*.W@rׯZ䟩i@AͰm jldr9\ηW%B@P* 39e`팣 *\.~8mwqHRoN hfW_3Us pL ` Ѐ-Ms<dઈ9\zݟY>=U}WMu2pU\y_uy9T4 Z qiG/xTq\΁À];Ӊ zɎBu}#p@< `h<r Kzw9-0%L%G-tQG˕\+zެWV{BZnO6K%?=0p\_S<@x5-X6{`cs p~|.P ]P &X``h唣LX0L{WI@*/[zj + k4`)G-xԢq W@*yGLQW :Y4rMUS} FW3ұU29UP^@\Z738U,PmXF8J Wy@G瀲\3j &p ( FmrQ`j{,;71q`Ղrr pv x hzK',WmGNX*\w!^y]7AaA| ƂcS3,0"^+7@*koN @x}4@@P p!`ģ,=X=-ӧJ~ @VT\OoPR:l98 1A`k,7H0`cV)\6oUcyρU:сAPC/c7[>(3M]@6 &@ YP>uDǂr pMo)W)MJoi G> ~gCWݧy}TQ Q1XT"O~7 5p p ( VLp\DQ&XHׯꨛ YeЍrc9@_J$W! xPE耲 AyK 7Uc} ^ HRW/wşpA~} uwsriZ2! Yt$4+eɃx&]eXd/ ~KU{EAAs@^ہ`–8Bs0-M.LзUnQyHnȘ%zf09 bs p=<9H @p p ( L`xxqlߪ#G:kҥ@__ +WˁޮOe4  88  &4(Q0tĊM@XL9>Q`_C@ADChoq4`Dm8 (@kc@}=eB>Ѐy-JD Ua9)Lzh> v=@WP + 88(A@(N,i@ `jj~QtLЯS%b`(+@vx@Rȏ "( ;8X4P A79L0L/eވ]*{},)}\5+RH =4RH@0@~N Mû^qX @ Pr\~@@JGA?4+A 5uG/ 904AW}}:], ˪]cln*g% 4 (M<PԒ荃Hn?BM0,4`Wvå: :)@ lr pe*>vb(&^?z988@{q@&K& ,웠 ny}; h&p pem'fFOS/3Aq"*N 8>j1 hA_ j мGbS 6iCC(A0LzqC9%g\ Q PUC k1@G.,A_x<@!! };GG/4%PeXῆ;O١Iߧ4 &9!~c݁ `)T# <$.0MP$󅊖.Ci@IQA5,A< L{H0x}Hp0ઔ lun_(I!~( 2+,|`B4D ~sɃ&@Sn &8́ |xP῰;'\(PNAr `: s+[!lhotIhk/ *vކ3jg; &}K+fy7Ai X1(A3'>0𞕇tU$5t53{--yU,u(^/4"NJ98!Fې!ze0GA` ƧL0`H$&  !eg|~huT;5iTCgI(`́+cAL0@0 I=$ L 8@.>3AZ` SJi Fu p ( @ X` h X~86\tD cV  L5{C@pQ+g* |D9@@@Y r6xQjO#L0+܆ 8*   :M m|t?J;ⰁƚqGA@&p p (5ӏ+&b2d и~FN{e?+!]$ :-hG%57 ubA  0>Ø&AiCCLb @÷)@BQ@ *GAK Ca8w(W͕ rq4 0[S tc%AA/?A($Eh*PTp pGnn*G)gMR9884n1j#U|2n>@! |e!_uXwNa ( SM@PN{~d~!MR$Ήf* Ār p p mS}̣!2ODӋ!o5fblj`h/ YD4 @еnp2AXv@L( Wrn1m4V ¬P!AE56 A hPdOD ㉠1} F L0[4zBCh f |P AgA?DI\_5#M0К Pj`݌19$,]q&D20F`(AA[|LP8~7/~dsaF:*. m klS=ln4!@ PFp 5>$MpZ?: (s pemi(kx ~X k{qX j`/e~2ѡB&R+LM @ R*dor\Wx! o/2A!u( !WhiF{5A< ˟,2:kض@P1A5#&7Qa~ᖣQ7U d  nP \ 8`@6A(BSr p%CR5V @37x@=eY'5@PA@c14eoU S c AЗ땇u{BL Ap@pN!A۔ Z42W>H$0׸kћEl QXdSF[K`yS;.ž5艭RoztX4mA @ VO?C𛇨2Vh3@k{x 2L2A uB/@j{Zch h< ?qwֱL >W@6XL ಳ@x 8Ձ2H(P@8T ?K]25ԁր @ \]Tn΂ P)=>Ҵ)};`GU^YGk`-C@ 5h*j G CQCz)Nr9 0U k  Ҡ@~6/잋94 xYEj!6^uţ~&&X `쀬S@P @ pZqmKЉB^80>pC5+:vh1N/XN!3 | mLжDw V76k=ô42AV@ϟGA&,HtXY=: D@@2jMma ~4@&@|Q`(Î&FQ#{ -Ξ!3@)zy`.J"@@M@P"Z_dg{!A3A rذ   x0{mA{層2hr2hC -pL @Њ~l!u @p;Iy2AԋG/8}]_DSD~?&~u[x }EO0UYaA 8@A;/-6 @{~fj ع$[d5@&@ صhLD XԊ#A !@!ڷ@&@/BlsZ(8w|:fn Q1-H* Gt (f ?X]#h%*x,PN( $4FX ?,dA H@A]y9iP  (@ gq@@pR/Ís C4]1 Qt琏"@ LPu޵Լ=+LR.᫐\|4 @@Pr zY/5x`UЀ5~W9AlF29:X e7@`@~M- `?BZ},$5 `[ P|!-B !&4AdAlr`r4B  =@!ŎAE@pհqerA3?)`Q6nU(>+xhsMM…C~ _L C_ 1p.^9 ]l4:.AF p!Bg@СMR |Zxə; 8T>h<Hj-Xi4 k9g@QAa|E;u8HAiSqLg`Can1 ri^C4hB `(oW  eg }4@ 8(=}A|kjc AM{zSn `,dŀ7/Ω1XkvL(=rK@w 4 e. !g.5M 9"w`pC "  hD 6\0FCZ &@{Bвo0 [},!)%F?~t  OR?`l w lwclY+6+Q6  L(08H0Rҁ@e@X3h@}L 0n# ' l"ojzqώ^FԀAV"_ KiM,Xs<  h7p\;D @D 0@@& `4B@: 8Mn|*Фn`> owA]_i5{<^.54A`xH@?ygA& ΂U|ŀ^ @P&m3% P)2 MBҀ`!@pHf ;?HjL "p_#!A֠zk ?$6r (U?Kx@\O< %ԂpS?I?-$=Xdڡ o ":lO;)֚l`*/CV!j@Br7iL0n}#&+4!u F_D4 0o9Y3!@8偠iv@rLx L5SReߧ~9XiT#ZzlvX l-V j N.,vh )Z׀ Q i@!7$Z?n%8!M@44M@Ӌ o9ABA@' Tp x5{ sm4Pc (5}C2gA&on{ڦѭƜZrp/F,ߨS>OPL@dp޺04Z&X9 P!t;0Eu0eҊ#ye@wG@nv]!=$hp (Zb$1.dmyAAP8 gK -jYӃ['~˸ӼƟ!|Z?*M@,@' `]~GAdz6 ^J(0f{q ~O @n>A@&sC `XU!gڃL hi+n =o!>$08|S-!{!=@@̚5@;~P=Im&mZozDI^cOt&FDӣ)9x靡d P t w,A hhm!5M L B C! `hA&Pl483FA[88x hrILʁVjJ0{qBAx g j@}N?5@/ : p|㯘GYa8)mCI_2tLcAMN8;|GJ6[kbJܷKUA @5 S8 ajcSeTa=+=@0sd0D h6u 70 p1B@|kA-yp p (_}oUUF45d@G?_ `_/. ,&}F֋}(n 2:E @qpp &@ P-" -f [ RX<9##g CR &Ud:@o > 3 7@g͂ڧ>ch` 2dx(  d tvOL @(H 2dЀHl7GB`j0q!B@ t5@hE@ hsZkhA ?qC Ḱo=,Gߪ(AMs@44 KVBf5^@Q;g YËb${O@ `: pŀLf/n7ˏd+ pn1j@bn6b P4 !B !LԣaT+B\IC\zv\g @=q_B@p^[s0ȣR &p (D\mrA<$0gO:dE~Y."F#״1 7s~= :4h"XA3׀2ӷ«ȉ5yt' ! + hZ#fHda!E ud@& `4BF\ =v`C*2Jr*#ql !P#-3 l?A*&Hw/: (n ƜV]DxWB PJx7 | PRR@>=@&ؽҋM8nWvqȇ f1,l >O%B94h @  F 0΀VC_ pZc&8A$C+,7Nu (M%].-/) @e `b dA݋3 , &Hf wk xg6Tm^ ' dЀH8@U[0&b7h# LP/S7wlLD n0e0|x_z6FALgh;WX P%hhx@h+'y`iྕx:5@ ( nu _w:?X$ i@6l rt`h<"aF!Ε^B;@8@@P F402>' `"&Ch7 mtA^7o ]x@W\@`,(d~oدK΂~}/S {ϧ}:L*A =v wg &}ǂ nѤnA0 4@&@ pCF`HT~Bo "@ ڇ 8Z d>B0!A@L@!U&zPwgաB kˣ|<@7 |zOmA~y.?#^o~5Wjװ^RԏRY@GNzpe8NhFd9 P($ `+E ( VDAlF u|0U!M3hqF+=DAo Jcdȁ/;=W}ή'[󫁟g/2yY`>KE*AK{|uEP Й %Cgn Ko@!(@ `hBC pиb|i@⻏49 @04M @l"ኣԳl!,Y"\¤ x^/eM8atl݀ ()GP2@ &~oU"{]H}obS>sA @^L 6 F F\ Y&?Hph+p (r~}Y!Hj,>3|P ȤXQh8u?a|mw (1 %*Or A P -&;f{b9DnsJ &i 5]oX!ѡf @ O5W4 8ko~|)AiG䬀z&q!4 3AdX{< h@3X[i_A?=E($ `>\@kcM8`w@aDʉ+@J6i@?=A %ȒCa!4{ħqS8 tnۃ0L&jlHfA 땇U4 l[9s (3XfpL`A 2?+ ikYh|@ x\j;W\¤ MǤ\OY'VG&P(>! & ' C pK=DB’C7h# \ " jT"C@&4p~ A8M@tAmCzv*(At>= >g2@@NlЀnax_?^/ *&&Dx9g8N*A`8N(,NpU(D ` (p" Pd0J0D AF6@pWpT 8W'xKM CT"[ A8(MVo2{< |f $  B`@OF2ڽa <3 ˎ ]1}1K [{)A0YQ PžClA0J:)D(B4Mް^^x&? h@?K 0?$H%B dKJT gx<`(|&}u(a7 wȎ{/Ś౭5) &@ P u) &2HSLw{I\8A SBaR -C Wkz | EʁW`Vl穉pShW9\k7{ #}qMiҽ/4r&@ Aű&;Tk@ @ ;Wـ`݉B0_Mh|EQ P @!T[!sHHi@SJ `"&@^ܦY@\{H B @0s E64~@ )!AA`V ѭLD_ jck|bx:^|SAA) P ـ6#|`a!zL&P.>滏mH"aL [P8пv(vz[ .;թc=:z * K;:mH h@>I8=M@hX!jsAp@C_=$8 ,4p^tRa"@M*@:5 'WK|wJM6~}ѩD #e3 D&e@%Ce8BO)<'\.H㘲4;k=3alqBD Ҁ`EA @~@daú17\z(D ߦT"1 D4&ҁv" |+.98yD}ך16 WӅM4:*h?f'W 4Z$k e|h$w _3"H^.@ %'=#pe@gtB( O>&@ P9#d8@i'ܣ2ŗ*hA@Ck&B `5ZxخyO@Nū;oF˼=|Ѝ*(Bzh'~1fۀ6,7Ŏ)ba@ު\)I@ l32/*nL\h=b_%z;H]~2ݤƑ5ii eDaڂw/dc˳7JܱūR&'j@0+L l=Yzs  |Y^t(`#`c DƂM 5@ ,Wڋ`~*)`@" 8&oy=@yr|X Y_h`3V(`zgҘ;]E* X*0< /8 P^'ěO3(7zsesCbqB4?=A03_h>! @i# pvB ڵ8Ap^ 65(O0h`A^/wR /0߅S>$&I_ĽGP LtT0s~мm-g&<2D K~5RĂHo;O P<&Q@ 4a:"0hqB` q1Q" `+ zj# PdFc Ip@]uXkשU* P-@!hu&P>Л@-#m=w("y  diDJ6 "SdrN @LOd@qQ@iA0V5A ,>U/?KRM`R4r"CM4L@qxAsv@98螟L?…+>- *?ӾXceҫح*i@N,B{ $YH8i@!AxH#<[zM?@Ȗ03: 6ͭ)A #D`xiL l=拏I@@&iyP|L!9TM@hXaMψzv<T 6&F@JAX  O4ぴzqQ8B}qA@zg@ABa"x  <3o Ёuad&PN'ĖLZ8%(LtQo8dO*Aco=FǤ2M @]LӋ# Z @ o!5nQ"Ps Su9|< C%<$QjxHhs0t?@ L2w(֢6.Y(IG^͋=E`dV ,dݔb3 Q " (AM k@pu~ŤF{ W  +cna1-> vùŭ '64' P2pzH0{@_gX@8X :dǿ1.ܡ[bgfx MH2r@W J@73y( s&0%$p (@W'p P2f p  uSQHC&&YC%w v&f~6*5c3QǏ 4`8BUÇO%7%<&54:5R(r ȣ %Sqd4 @_*[4@&@  `_AµCaFpˀ@patF!D hFI] Og>B@8A{kojCwSr m57{l!/' by ts!%J8zf8'IB@,¬@qB"|H@7X!zt& ܻ.k@YDӸ⩑ 3EhAe4i@@ \wQWFz[ec ; AS(.F p@KϊڋK+ Vylߪ 4 f6T+ |kL U`F%Juw ͳMRf @o4\@6AAhm!S; x`cH%泄x)gGi@WXA /d $<& p0ӈL@{IF c 4R_XD@[{o 8H 0L%A`xH _79?3<+Bm@ty%#JL8BD2(NC gU1g lV'@9ãGq +Dk@Xy," `4 @ 8"c Ss!Aˆ x|x}@.W:Wr+'B9 jLa ׀ !MeǿÃiLoJ &Pjh;P!ı#@ hA!,,A79;B6 xxshpeX^}QQ &P+6< U jdoi; c\|,y|F!|ѹ1r#\<$C|k0OM|<.9 ~{H`O:vPJ }b6w Vi; O'. ,Ğ"|ϧt7t2OV / BP xlkMk@7=@&0*ƄF5Ab0UD!jҭ+ }hD!i@7A8V?Q8o@. 8`@ #zU)p m7_ πs5=$@`4y~^:@OtrpxPb4はC ,6AKԯl}AvA h s&Hˆb p:!Q@ WPඥad aD7UAd"srV1< \.'Cd (.>@A= C|1i4 6 !T 5ppX!y!]=LrD9Au" hF_J }ڥ  3忹Ł,.-ܯzby0CǝLA ˿B ő{ 6"f޵! ؾaV1:@7M;NM+2𾀛>S\~(k@ 2 P,WJ\Y$\ g3 A Qy|IQڵnA ɞb&H7V,ho?) `W 4NHx bp\DA So{Y,H'{X@G)w@?Xy` ( x~hA ($ `. .1Z'ьyM hHA0m0QAKAk[qI Á ŒBO s ~qSm |?<㯒2"Awf^G" 8I8@07x{-! Ŵ&@t&e^ṵ@wPpk@>N p (@p@& `/ KShԋ4@ Ť4A8"`"o%n"AcSQi 9ۿa ٗi@ W MayE > HoqvgҼ Ă :og#3!OT)Bq^R6iYMA\ ! w8:x RЙ`K&/ t wQ<xHҀhԀ43 @0..e&!n^yMU&@P(@~x#})G}H -0JP?P,?+@aY"(oŁ ) :/12?$xt9@w>v&W@n!L 0/&@ & Htͅpx ό+)F HcEbTup r Uu0h$(gȁ Ώ KhO9:<$0Q7$I7;U-򤁬"Gh z=t r |b%FJxS @L رM\Lmd@^.xm(%A5@ P Hd~i# +S߻p1նyA@c # 8?A  ? cU~ۿՁ/b -&|A =N!wGOwo^X;by~oaP,(|q @{@9rAR,H8{Œ@\lC0h{ֆ@@x`(ѹ+&E)A@e@}k@ /z_{8$' L@ \?@dc C8tE D;v @0y~+ 0u])>$HdW ~Bmث_X"N!; 8!p1x )[\ďA'S{\ߏ$(3#wø& ܾ, mBlS@ EQ &P^.@ 0CԀ`~  FHgm3AЁQ ' >d *A!qɱ?)O4WkCUF*5^}|8ЏkV8&xhsKܹҋ(39ҁ&Й6+A~@_@pVq@b@c6"5?:`(M[M2W[q=GAY Ά Tƀ`_/ ~s/6 iblx npb>8 =P~u‚@6A Pl0RŻ"/1}BCP z"].@ 4Q@iND /HQ A ;2j4qp2" hFatnq A*`#: ()R }{_Gcp_‡vXi?D!ǿV<. bl@Op\?i@}71<%`b ze Bp$ M``rGS:5Jȷ d w1 pxA0 h @&N hh7Mht1O>r@;WU  5{8m 8d9n=~+@bo(^4!-0^_6A;^6naqs[w Oo$>) Al ٵNR ވ[u^ABv,@ `/%8d / dg u (2iM`y,F cy0Atn~#oA #zUӷ!G? @@|6 XrHc eg9>@&nu#o_%|k37tto ؟bW ,o1xpz =0SV);lazQtBt ;0@ r4rpP@x E+azt<c+W $7; k0>lI g2/0^륻O2/,4["ك`0xh.e@,傩ۆʉ\A5@&g uJǮi4@&wI~ˀ>PSb|;!A+R oWF@0uY "~}JFDi@M?? l8n|V|r1A&HЁ@HZ{8»@Y l q Ăօ503ʃJ(/(5 3" g־ma\Z7 ApF@85 oznL+m9d/^M 12>: +go8`XJdC`bMEam&Ԁ|~rQ 0!|Szd!Zċdl[΂XXn5}bMsIH < k% @*lCn5A JB*A />|yG:L|QG' 8d-=(T2:|ecKRw} o sͷ x t l$";jy%@T SZ6Iqt@rl`~A2C|(tN @4jL@+t@&U|gmO )G' 8dEA? d\<$L Owq@^C*mME NE d’ ID{"Y4D0(Ax`t _(Ar7r6K%D}vk" `oD仑Hu^k/B@={}FAP>(=zLLS ј7m AMDYy/Jo@>(Z$Vm4kۖmgЙ@@`X[UrA8{W*fD 7A\isk5Z4caN 5521nL9A@Qp*|!8yHtԁ|Axnodzo8I,PmX4w N (@zQ)—:A닔 @; t&5"t%`꘠+͏&\@6LyPM+$@\h$?A& `Wx@x<Q$ 1 50AN!aN8=H)p BTAS/TA ,<0ˇReW߯8 5}rƓ\%obA0|09b>}|𿏋)' w t Й v @Bf`[0S\.м)@@P 87r~e5q L5 #(D!ei# hiC0[ 4,[D) k U /FlE~+_{}ǿŁR6smd*?.D  Yg ?m%dX@kg @-spQ tPyp4 ohhB 1Ab\?8>UdJ dBvz9d  ş[wU H@xR3UW9RMU^Pj'͛>Lrxn9PIA T!, L 'P g]k`t @P2@J}`x$t@yPy !ip   AtAzÌOoCQM@s tc%1kP>(@+@f6o 27|kcݣ~MB> ^/| 37ȁ" On+H|D1%n_:n =CF%5 ` /t PT8 t S&.r ph4750SGsLXuY )` [Ԁ6b !V 4 9_/&Tė\%el}P(C11՝|֚JC\&𐀿#^¹ F(  L$( rnʗ  A_. h\PhӁav\~2p ,pTSs e;!'sss|{-?Ѐ&mpxvSQ@%x@@iKÉwD(hJ1 - Lt P2¹2EM L"mF.=TqȅC4j@8=H-%{Bиi%{BGhC @"]< S1kđsTp BTdO G6 *o%('7oH&yNn!e(6PGd2rA<#)5h>!3ЀNk@iY@ &p8Kq0r u|\5@ `: 蟈H ``z`-Js2ݧOA|:sA;[CO RX+[E6O:&ab>l &0Ln!?.`~<^Z. #+{O'?'M"`fAV;Gp@ 2R p:'@\ +&P^.( @}! mЖ" `iAC W5]IWs`MUF@0sؑJA} I$ >3J?͏?`0|+/$IhyrbAz,&MvIDATx@ `D;xPo(98 m+P;CXgŚ` 9<A@`\2n.4|B HB|s 4m4@*A_@ApϢ3plӎ.i @O-@~?w*!F9sK@`6QDا}$I(ȴ@U7eza& Н,E(M` O&o+\i(h`J/N ̫q Ad t 9: aDAHzB p4@&0` c,i@o1 D2]y~g ZA?hcUx,tTN8/E?|n,؛`_ܫ_{}ˏýAB؛i&J*h R<{O%)  ?B UӼ8t&YM[5 p@9ذXw@yz=!8X ׀4@@?Kb@ @ @ޞC_=;.48îAiQs!8Ӄc!' _fh^7,M ͟Z$#*6AqՅgz "{ \T^U0_]0/%Jz*U:.puB y?H>B(꽊;2&Hm‚cAsI@,<Ѐf 8D2t 2mFV ׀xjHsH+ӈ?!  4!] `c-xTP@րws H9 x..7I@acOՁӸ'ʷ 4 ]"{&a4Uެn*J{{a PV RA薚nZ_@`Ӝ 9HHd  a\ݯ6M'T>2p4A /yJP!} p,\d YA@`݌K4@NElMA 8:S >֜@3_42=K(> +-%(*v1AH޶[]RA >~T,o 57É}|ـMł`V,7Q@g)C:4&@ 8Pzhʞ4oG4 9<4@ = L A?2bQH·2缩D? >$A~1q>>ub_ 0 H4E@^|f ySmKz$uƖ 5J !EJ(AmdzJ@xMRR2VY(v\eDA #2Hd~i@  (@@8PP ]F)(TXW" ȿ(Ǟ^%rnv67 W b7( YD "w 3`т@iJĂm5!yU>Cn_.r%@6҉ L0[uPU H&f ~ $L 8|0&lD9 yk\wq)5@ DhE 8JYN&x_.\4RogUs~\7T~.(5@7 W boZVd><6@ 仅Jf r=s A]e$ 4:)`0"gPS, PJ&0\.N6 mqhAN hB 5py j@ l4_|L@qv(I){@!񿦃 d$~H3ݗ>v_]@ۃy1Ԏ'o zbVuOýAŁO]JUME &|V +d@Y9lॻ")na + 5 غ t=VN9 439'M0f֣a^q ㎪^iL `\h @jA!hn] h,AIP ; yp2,gŻ.{ae@vI-`{ǿA5ByR"bm*G+5KmA~8FEA?S X?ziQ 8}o," S4nG67ˇST ,Ps0vn*ݦ"n{Xg;?w8`6 08נ A؀`jUex S@6frr6M>= 6@Сi(k a2i" @Ηق`5yP`IhX 󾅐A6A+ !AP a;_ _PC9X]% H?M x=녙\YT &f eJ@ `l5JC <0&'@31%t7 0ӫmQʈ/4Yox8!i4 @x_O4;?!}=!45A0VQGMAPp 2b > (s>bÐAh]%P-"{2^Hgt~? ;k{ ,A/&PP:'@Ԝ @0i`Jv MLW@y vPm8P@h35Ayp50G}pGJ/$( @ [4)>$ dBkΡ_uNǿaaq l61R .cbaVG4xAB}RSr L\p|a "@peN7@87@&8.@U mCggi!iL \1 W P4=!5Z 1҉GztPs ȴ=~G)|GD 2QHP'~ w6 t @ ތ?AlE7P\ r UJĂ Sd A0&B rABNNj{| 83v!@y5w tə!b A+ @lGܜ:lR!`%A5@'=|~WdۗwSK.?kYPǿy!&yq {i@^"O L@Y2F}:cüI5@i{E X;USC L@ &x0M`Y@qtPx0 |}Ap4C+-H綉h@ 4 g$b7Ms?>؁ @  -OR@lQۻ̲W)~/d&{R؇fӃp@[˗k-DNĂD ?"$g4p>0s @@A3\+4ߤO8HkL\e|YY҅C~!=E 0@ J,~7ϭ^D |m; @o?Bp<틗HG 0l)48(KJ Mb dGOBDW E:^rqQvApjJplVuL@2dp$ %)A \.L@2qBz<쬣mauZVNj\U0V@48zv 4H<} |VLQ 4`A@=ڮl@Pp} )^3$|O-|2$+zАpP@(L`yY 8@C ABi`^,O> 49 Ѐ`hD* t7 )@y!kAm/;kuA ʒܸ2]8gp?4p9_u!<(˄ 0l46k$@4 2Hi%<xXA `ҠиT rn` @7 ˎ|n)A,@,AuIp4 MP:TA3L4`%!S@@4j ;O{@0/v?@iQk~Z*‚DSt 0d1W рz?Oٸ^&ÃodRz䖚r= P{%|g%  t/4A*rO@dDT@w -bMY@&  t,^F @0o(58elI)@R AAj`_j#~d8"&x߸pL`7Q~h=xӇ̇s>|89xv֒{bNA.@pR1Vf R86@ L0m7Fր<@`YCSm\:ϩ ju1aF't0}@?V^(`Qۿ#'>t/ 遶??y=4@ ۨAR@IXˈ 7 cg ,_ (ӰY@>(6yԁ9꽊 %6@^U k>C P:,)`:9[]5A)o, 2| oQyy __L7$4? Yk  |ǯ(XE|r<` JX..[_E & @ǁ(@ ,@(`6A,@@& ~P onS _ <<٢y-) Y`3VHyq a X9JªTmAWBIB}dAb!Ma?N.sX0Gat PP`DЁ'/|t@l(mY>uGY?X'(D  p iMNڋ%xaݮ uMB 偠( =m>A>B5(.)(:G\ "C4@ .np03A &)P>A@^{rI \ fw|V@B ON\ 0N)@ | Hf@j`#i؉s# ( dQ^^ow/j6A@A1Ly$ Scv4(@šBBh*F X-Vu+x-._Ϗ 6wd P4 6 5``d&~~z[2_5M} 4fi`KM2 u@jA@?>FA?_|N*uabi?-Ga/n>O*i ! (\à!aܐx_Z_ PATt@ dx@wqrl7@*( 0 `pDJM% uDa-YAF Bg5RR~U!ht1x(9devw!/ )Hz`8{2 G)ஶ_@}!5hO@fzeN_Y]#T+`RـF/d p(5<<`wr/}Kw=IvEO%r X9(% rOtdȧR@QAt5ƦC'40w]NQ X >˽R gpzvh I (o*(ڀx:@0=zn/nZq d`唣/~P`d*7|;W\w8E 3vۚIopA;A I WE] ȳm(# T)P o[4ALNX)}&yaX=h rtD O A o c}mE,5HzvxrPk..cB  }?9s?؉ ' A`exsHJ5}Vsxx%ۖLPl-)@Om(\aY !KiIJ޿9I. [n:wEA*]]N0b B q3R/bA0_UN 2T)A˂,z_{h%玃` @N5PA`Ol W{Co J#mJS/~Fh/4-%zrm%(|#| /w ǃlA'Ӂ@hKMel<K '|Pt B)Bn<Ά@ "T AQA @~B @~V[ ?|fe?7!R@ J S@&1sBA<-,A@5 [ր 읧" DR^(xzg-9YnOS]zq؃A9 ht&SsQ~K3-MƺOj6 rq@fjӁ`@Νğ5rMQ (w x9 ؀ +7 KJdB˹J.ՀPRY>Pj' Kx#!PB P tӁ(@ XVX!]+ p2 ,)r (}tGA1, %I^9Y/|P7W pg~KAEφe à (+ n7@X_ag@F_2Y `4 o@MD  X2S( Uy$-}XP2AtsMw\nصŖ gxZu)W J @3 ͑2Z6ͩ4Xp2Ahb!}P<[A(0i , НC3y7?a׼Q (q$@6AwGrRRFh3W  ,@@%/m|@& Y`O@=AǶ֔( A*cN:8R@kt5APX `,[,⫙1}S iA_d }1{7 W<tӣ}w )iiP(@ *5}H@wx4j ; ]dA@` ]f( !`\03 4A) ,P>*02R  X>9)DK l e+_@# `nfHoXPjŵ?1`l <8iQ `@yo8.+@tc hC (R`P) @*`9W ^[lx@_Xe  ^{܋{ш 3@\Y^rCA P`Mq hg 3 (r  3 2|@ # @n,:WMy ˻p PI>}r9d+`3eHVlYm)|TL  [@r7ZrnL^`gxcTK@@(4, }: P@ \A '@}bJ<ܻ4((f ( | Aݩ@ÚCe3W f"}ܩAXPZ Й%@-W^fh9 n4_)Ô O]Q`؉~ AP 3be֟@&@ų [m^p PsNP XJ TE<4RJ@o?y2t 'ʽv &'t&"n_\R]\ u @ &n n!և,(9D$+/=}`qAa)cC/J3 dol 6 DRh=] xÃ*]{,oJEYA&ۍf<5`0w@,UAdA죂B,A?h-=AP.)o\ wLMXP2Po$z \ GN0@f<<-ŞԞ)fEo8NNp@~@ .) Ƅ2nA4\+k@op)=z̑kĚh j`#] (å`;ZjA(lH3x(ݶ 3xJaaA6 ! xͨ3d4]((t&ϭ.Z3E 2$ (=uQІXQ`gAo =K,i~IB,AP.)?>7|vYC\R`PPek6 =v -"J 'No($ @ A z0 رӒAxB$|sd  L[=2u#$ d"KP(!%$k@கQ)PRAiHʩZK OڳEcZK @ 6), RH7eրPzx;t2@p@ YP Й Zdc, Й3 )j! (AP,}/ 4p˼ExAPO4zfil3 `iO9R7 Ă*^'()^,eL l4d VrRLX/zHJᣛ` ,  h @[ oq"!4ެP* ܿҀa=wǩ xSWLLA( z^ *Eܶ[֐Zd`OA <``qsL!)+ vΚCz&(Ԁ!ۗ.1= P4 Ap  &):+Ir9ܝ+ xׂr KݹB|+L@e@l2`YqM,R@0Gy8X3;*dp `so\S`N%2>};q>hӁ)A vY@gf?HЁ@c[k=Y|5(tK o2:v @bAE &3t&(Nȏ d* (G HR&0' @uP6BЁ@+Lp 0`l/E  ?RA@)A0%tu @c&40y)My`Gv_-/*uAK^y샛*^fnRZ@н5H0D dw&K;堡veJ ij+ʭE & 3P1(MPr 86A_# Q뵄` wkP P{GM ?<SkED M ,,YC,6@g%t&Eɥ@o\TFU k &Nn1ejP , @P4=(A,lQz@H*@h% bA -iҁۊ@vYnn7~xWŒ,A..$j &BRdXP dO#[j3ہ l(@n-Y {˹i-Bwo;R@XL2Pj@_QhbN{NxeoAEL X5MzkQhW ӁA5֖@дsu6$D U};T$ %-퀲]]R3d=[M / ފ.'L ym1 1&xE3W(AaCͺ Ӳ#P,)!t,(4Xhu9T 3h@ w/НL;òK6 vז8vo9 2PjAfgqz '= xQ7hZB `ra,-_ye2@րEq HlrA `r%e+\N@ Й# vk=L ڽ2Vp ̙}:] @:GAo <A-=Ɓbiz|~zki-2Ю g(΁88 $@@h7rL@ Dd *X[`GQ@`:9^٢B̒i?*:ݫ< pp֞ @AJ:ܱ꬝+τ"pܾ,Xp;~ %(S@Faz P9wR<<ײA8^>L@ A@ł3 ٥j@I^xy;MP,V+<Ձ Bhb4cWعVm_vj"Xu&j"\si@6ugܶlL0`禳S(Qgt)6^{B@Nw5UP@JQ؃ C( P`XʃV* @+ÒRCd΂b;X ر8޵>с"i@- POlhuIMq&( ر,Ҁ̂ O, vo4 9^أ.w Ѝ"6+R,P,5+7x W-(!9(`@opOhR/{ Hʂ"?Xp˼(8T<<@L(@e0MuQ{Y}y`2 v Xql_wD8(2!HXI l/w/ZTA @=r@c@?Mǿ\<,5-)`H(Re탖 h1'n-' DiaC2AV(0k=)m[@`mK;` n]q&V_8ל &;'@FOI7{RxI#[jB mlF)`6-R%zaJк00VXAgձ?[j:T @ @` PШN~)Yeq{L@,ضD ,ض @ gB΂mkĶXp뺳0x䙃@ ۊ ! $g: (۱XG%L@0ori`|0d}¼QZk3 x`BO/;@-5@@ `c-f `E 6/h&@ME غL@ `3!'ˈ@(CPy9Ak8߳@A,(@PAȜO,hE sAH( 8@6ym1]`h `lY}j" %8 M]vA A`|5@Z{zrAh,P@Ҁ[ם,(-}B,&(7o?޿,mܮ ]t (vN#d<݆b9ȎBï:u춐lۂ(΂[tdlY&@lYy%(@ &=SF2$k78 P.& 4 XP@%:"AfX14 (ؾ gYy`1w8@@zk0=l FP+Z `΂sڀ(nM w8 6<& l^}<(Lp0=P/>T9֚^![2!oЊ֐M#)@ A*쑑5L0OLP@րEu@6 ZhAځ 5)u3 j  6"pl\5@6 6Ii@6 `ÔD JhO1lUAp R)t& 3(& A9m΁V>y1d ,QAvpܿGt pA# `#]F^SZ35 "p_4@ql&`S4HJrʐaRAvAj @ E2H  ΊhQ4@eȂ=X s屐AsT(tQ`էBkf)MlX܎Y?M%ড়2d4' %bޠ/$6ERSiĂL@Y#ӈL &28L8)0fBrO%t& rt5q%-A{xNFjӉg&&`v7`v`7` A|%17!()^T, ]{,66ήL  1; [EVYC]ϗB =*(Ȃ; }\{NS+N `LE&,X3;L0ym! ۢ(Z_Ϥ@ `@KWD,@==BɃˎQ}Q e I/(:BN  HCսr) h 'XOA@Ҁ q*(A(0>а.|&`0紁2 Y88Tf_7{kÞ/HH y`4J8,`VJ0CKF P%kC ]?)Ca^0LYK( P5*sű8U趥(ua e̫,4<@ =vc|P@yrPbA pAEKO.B Pddk ,X0%hLxi@fPM$`% C(y`R`8LA  $ah/55P(p7r%%t5̂{{f/,DC7,?Y0o| @ &g &X<5%`֔^ #ԔcA<Vld1E* ł,@ର*[FhuiC, B&?% jOø  gq _g@ UIwC @XPpdk_=_ΰטJSJ N LQ@4( (^Lt֨f@`- 7`VX`i@`Ô t 0HʝӁ@H9l CX@0U)J`&(,Z_H;f/8Nu004uL@, B,;%F& ̛ B,XM`9@{X-5 x 3ܱ; %E\pL)XOп8x@J:{ .'LJ Ck:8D!מ8A 3S 8 @'d̙54Q2 _׿smaR8)@ 8 d̂Yd̚4@ ,;M@, a  wliwzu@JPP,]O0s_ H`ZjA9C]pWcXP^ ջ- _. !@P^x(-n\ ,1:L@,}b J0-!(Ci@. ].nweziG,E؀`l߰[j,`ĠI؍Dxhg3 *;>W9EQ)s%d175߯a fdaMl ,>hL0sb A `v4n~ >Ё@9T عDݶ5m[]ٺG+Ïe²  H !X @&0HQAy @ TQx(@-PCph,:) LB,9%L0i@%|0Cݟ+!t(,H n+L&VS1C8bYf Gk0@ >MU@1eh1r΂`X9#T(m{wU5 @~0飛Iؒ/w&(OۃwA&+N `c:- (@ѣ!ܳ@0`c4ߨhB &?) R (2f,@&H\+DY;P2 S]nʩt_Y @ݾ"@0ix0_d-w0$j"W-RSP{ `x @ &; Z h@mQ(/+Ă5Ы+ͦشM -Mlg  xo_)MP(=swV d9t D&  UoXЈ( A G o &=1 V5pSSAO&@ea@" 1hA 0'P5s>@58"|_1ż -AX)))] ذA'xAPMpzEK(@ѣ7ܽ.&Y?M `FL0Gd4ISҘCƠ!a@@ m+JǿhL j@MAN5ɭM*,d ᣂbl+f Z*- P;>םQ us !6g]46AkOdIs Ȕ6ϭḳ){u'*vW R yYc$ (!Z:Q=7Ƃ"yP84(`p@ң9 `=:L ZgP7`؀ 44W=Aз[mH  M /dݔn*J U)G# WMYj^34sǷb X83NF"b@qh q [RD&(- zw<5t:,|Sch3_:ݯ?J';hlJEY]X@MԀ~7T01i`@o-f9ZH`$_)0 B \xzBEhdAEp@`Iu퀁ЄK"' !о!>=BJH q xb@AݾL=W`bRGPI Cf -F 5ADk`ͬXxwLo% r@H=@@`[S*Q z\u2=*Ծ7CT~ zՅ 9Ѐ>+OwRR@`v@tP P⠡E5nM t˼6Sb56g8RG@& 0>ER@L"H[z@xiQ`!YW4nNh6!QJYyT9 @遠^S+i P].=+Oם2bp؀`MA.t Ӏ74%S@0V5,bkk䣔-Pn16{đa=* )5h`Ȧ1ͽOhhɭR @ `gJ5 8mx*E?)A`0AYPro@E~_@`A1S*i @y!Fn$`pOJi@F &0@@* d bA@e@b@@0Aj`ѤV|,R`֫P>nC `,h%8(P4@%eAQ=*(D'P}_@`?&j4t ү>M< @p'?Ahja"xE(P`bc=J $M6z_{8:Y͢c"0f@(I-jA{>$h| oP+i : ӽh@ם @p'0&(~o0 .u"ݔ܂OIQăm/4 81P# ƵJ(y4`6mISغV_wؾ˒5%5Ax ARD)ApC6PoOO:tKi@ <4 !\\& Xq ,PtǷHK&80!ỌeA{4 عģ ܳ{לssX{}tAd p MAIP*E  ԯu յ6h@מ)A= 2 A8Vh(ӎ^dh\5eICJ | !R@xR+`T?_S*j`[uZaP`\)xpݹni?̱ Go;ρ C~`7Ё\w2Aˏ8t& ,0!^z9to9d'l6&QǵJi`DO夁>06^>-C) `v v-?ڳBA[;LAAp,08 s pzgj@zԁt Q2(`Wq54rP-T$`un@`0Az ["3i= `yc[P40駯Ji`6f8Wvm @;v8 RPS8D/p HƖ ((0%ۧg]Pګ šN H<)h`gW6)  I::2Ak"ٌ4@ X4%jAlj`Q| `@ sn@ A x! @-QPUgMQAqس OhƀƥE% Ё[gOJ\wׄd^  L`F# iK4v~zY!$ @ ) @0_KSavhvP`GEmkٙP@^{u@i  2?X8d RUB@пO~7S~㩠%ӀW\Z |{0 AY@ YPp`A (⾚tP`(yz53ZG(0;:=jVRe^Xu L}ǃ+ J=*Q81uJ%AA!% +/ 4; 3(8 p $A޲""K'5bi@ؔ槮,sKQs4 eAI ) ~ORO") U*ۣNnA:VRkOt @pM~t t@ `Ӝ b-+A0-!  L 4@ X=5j`]JP `.Qsٙw`E@֜0l@X=AIP5IPSw:Q'C:\u@{u@*3hAY2pl5])C34cE;t!@1-PPC ,|j `@,By۶=j`xb)pʳYQuӟ7ٸ8dUPw:%:p A+O (ApɅAܹ"R <Օ, ,(8bAA\B2P`x/P v:Q` 2j`(ݶ A;Vs+9 Tl,(i qB܂h)@ (~  sSݛzU.vt\}h@ K/ A hG3@n E8s%] ,hAlij`QPP(ca(v/4p׊N>qA ,p r7 POu@{SBtTЀ@LeAp9@@2Jy:o@u!PPcTL 3xaH 54ȣ6[l lÃ@ n[;x@JT (  ^78dB9CBOgS[WO:\DH &s4e$Ҁq@X,@,04ehy}ccwb<+LkX? j`sJ[@ @;Xh`q ΂Rn{5= xE)'>!ѽvnu ړ %.P@((Jpp L(Y )J> 50x`Vj`EJP `f8۽gܹԣgFo>UNYPG8A>NiQ@# Q's Ӏ_wA@&!%.5 L*}Q틃b ̂@`f{aBnK 0X=ˣ6^64?Bxv.]KسL(psFm   gʂ:'=$(~ `7+f pUg::tt ןUWq  ΪŃ[,3nX*b 9.",N=X>}FUm#@BDI#M si&hA")rHDFh$cG6w׽onߧ]]izwoLU޻)5pkBwlMh`'({ k(7>gAgg5i L֖QV8Jf‚`w  \z rY Sݲb)pt5pfOw%4pNAw?lࡽc(AO2uUl'`0 2$"K+:wn--+< lQ3A0~9 =}' uQPL@gA 0Y sYk:" ܻ}EQ:4HAi q j& X䁠ZdAcsECS3j(+&5`p;w}WtA` d +;N&Tnp Qc P5pNkBAgoŬȂ LAdc<EDY)@yC̭VA& 4ͮ &+ p&ƍ;bܷ74 ́VܚvpNv+wb{[K!5j:6pwƟ vxxph>A'{x}ף( j`(eAsЀ iڙ)+&MHYA0~9fT0L & , u #Xwo({?쿘BjXPᆟӆyL`vϪaEY4)3J ! p\&8"$M@eAJ)ynpQv{aH8;GSb@Q੃{kxAKDٛU}xHP,8"*@Q5 C(+L4``$ƟC@13 켮h@r逌Ap|ˈgn1=<0(s h>* x (C⢀,jh9U)+ " XA01' ` PǭS 8n7l=Cx$^& ) bn*f%# () \B@M ( ::UuV[AP\NYA0Vh SN@( @@]CZ? r <\L5 #9jbvAw>{0qKv g DYj 3 5n:;`0 >Q`΂  -VLk ) / ;;n$2 Xo޾5g, p1A Ev"  ؾD; @PP n^w15 ps hj XA0c`ҀD))+&O0fN;C9jsڠd,@74@f>\ PxtϘ˶^ 5Э@MtpC< YQA(0~E$*] XA0u SL85Ils@5vP )C\՗k E7ix<X(pl(R,=OASAcC9eQ@0,x g  @iykڹAQĹI ۣɂ/ޮ uAU,FNyv%eIdA, DמN,KYNrc{r! J(poR>*},fP@6AsPN h92AT3 3tA`9~: X>j-9yA͸dSFekW@GE!,G  -D\A( 5`R`ߢ hi2AR?5nk;\fPWƕLAUZY+xsoB]KgEA;vF˯6`vk%i ր~\7DAKJAa!A`e֚T?AA(WoR{ # vv|ōxG>dQ ֶ*Ҁ VRBs L$RA0NPٻPvN}7^p  A`g' Xv98LG5K@`p{TPoxKM DEA (`j WX*mM rib P44׆kNSSY: ԯ,' 6d3_Ͳkvk]! AQwdiu)@ݹkd)pR۪H&H &Yf0AuePAf$ 7ʂcլ+<@w=,"  Lѧ,j1:ګH&gW47ULW4 <hyo$l\WM " p^L0^h@ O `Ay ^B4&4 P7gN5iAGk%iA{" DJ 1 6-$#Vh & PSsQ;"2pi`.<= 7_^BT:: DO[+MtTR&:+ &]).Pق!A 3pi@f,e`x1z~W].{p&0AQu|ϨhR@AgG5iAJJS&Lpm^ޟYvQ_dA6 0e | ElAM£{{@PrER@6wN5i\RB\T0xm f<8( 0[>ޕsN -$)CMS{Y 98 2>AHxYPd 2A(En8ߧ4m" p)͙UӷLJAֻf .ו hhάfa/I6jI\.k;xxYjQA4)`ޜjZ(@ZIm 0h@.4?MDŽK|@P_IC5 ˒%! |0An*7:J0A0 Ȁ> f(!+Tf ;@b~_kʂto* 9 Y@@tM& yTP^`L HmsYR@&قA L1 o=*c 4dVE"j)@.+ai`rpΩ&T!>Ȁ`%=F?ɚkeA_߭O3,U) P-7;RIDAT<(}%v^JeL.<ӄB> W^G- X(S;n%(vYAZ,4x @6\a)@Y( 2fi?7R0$]a)tu穖rYgMzYs 5s0W ;^ L BZA -tQ @AQڽ}{FPR@49u8 \-m; PC\ It7{7,UQWEC N@aAxRE-z1dmPKB4qaL7)5 @ҢqTqYRԀIj 'W@N,H &dN S&^Ur j!ApD@,S ( N Q@P@X3€f ^.RYA  9ev|O/ƜeCd[0@5F* ! ց ̫,8$rB;,)`jwh*?[/&ɂ M“F@twiͪB)G i(T{W\S *Sh[&GDD[p&TXM a& rj V#oKu10e(K>]C ~ v(Y莣c5 =!/2>L0< & & | p] y+Abid*\ ȟ d,W,(\l6h : 0ANLЕ (I UDƒ^ Zx, 4@ W 5Q ;>I !YP aW@Q (vuVC/m }8c"󢁴@%CPaMS{ 6$28:sSDDP ӆI@3A] [Y!N {F]pW&84(A 4  wTHt$DwA`@=U_I"A +88!Ϊj)k@`.{6pa4`,MePA rKj1TXA>ƂtA/0RZ PY[;v0ȋ~IDn3$M7ٌ+6rA)0A(ƛ{ J;"(YZ|AM؋FKY@=OIh,PM% 2x`A-'rQL+@E> 5LR FQ f & 9ƒ?( ³ )YPD 4P|S@V< ArP^第@7ħR@A $2;h@  \ KLs\T(pK* ܖ6﵀$4aG& HF#p`Z ;XZKaAWA븂hA VPE 0Amk+]T€$h|΂mQBzqGغ&(G@EE@P GS WsKaI, 05Y1 !E K&zDp\A׿AMhȊ`Z { h RN OL%AG hmR x`͸fSFl3^.`ku~ā/i=(5GSor@j܂) m-L pV Xo$*. p,pLzQ1`8#ȲxƀxJq`d`AȒ?(&ȕ &Ȟ9*ykG 'Xjp 0Yꩥr@eA ַ kc #9nB̘WPo>oCEYDAM rE 83 hx) Aa@@c2lA1^pDkx^J*FvoPp Ѥ=\' TLe JD_AG&ZC HDt) 0pd=mpA*)C@L@\cNi &Q dQ@]jC0ֶPz쮉CS} j)A0{F/&a@!yF /)0c@j@f|OԪ×&(7xU؋4` { pG.3D!A@5Nd7ɂ䂧!AM5b|9{ϒ.j8 Y :]ӽx"[O0@H,a@o?0G1 rZşVY 65s4` !Q5C_֢Ҭ@75 Y$vH(X(@~،?=9%PD@.<:&X.AZ<@ @` ȕ8"#L@  laS2d |T@Ï_Y@) >lh)O S8hj]@ S/I#{ W!'X~!Ng`Xۥ*P5& ~󒠀Kh+JyjMgm'9{ IxƼcX W %X| qV Pwjz"Bxik!r2/٧t] LByG(/ k "\Rg4G 5y" N_{| 0YfL1 ~d}dm~[ {|\AaAݥ"LVL;R.)@F7u^;@[Or󠛐 Jhy, 0Ym\GSC(  u+ G o^$ &Mp,aGIDrt)5u$xbws,n pI I& z ӄc:i:[PZG_x ـ@.`G j ,o z(4Э*n@@& x,wra)|E~ aokhp4Rcɂ4ȿ<ֿAOq\7L`q)f&9 ~T Y׻ ;*" |^=`A`m7_"WOA v+yF[}K|`?N e Y 0A~R w*+&€`^CE-\ j% Q?߮;vJ0A"~T@?6Z^30kGw.Pm7] € ] c}ږI5N @`;hRK"@mli(w K:`F`Az f@` PO e^.Vh1 6GHV PYG] XG @ͪjբԌU* QA,La| tJ0A^-ʩ.V 6ޓu}~|0A`L@4B9=(@9+9hHkI)z ,WA ѣ{4@~?^UD7(l75x&b򀥓\3M<Ե3VՕu͍DA; gSyT_P fL FR@>RHkTI _֏ xTqټAr^4@/W+)n]SS\=mUSEdje͠3-Օ]?k0U D\g~8JA r"-W|뀴@` d р." +Z;*$ JcO.ٳL(-A>?BTr /ݻ|@6郮6hA2eՉg ^0(|7kkrO|ȩOŃ~~l N>Oc5D*K05zZs h )C TƷ a~Z& RLoP+k P+f)#PjV5Ň _N(8D@Xe^P]U~ژ 젔 ӎJ0!mK{X́iTA@˿ ,WƩ n\a 5B ׯ][WF&XU[솙& n}ڤͭv <.:8&\[Yڮ7뇼̛˿&J~VXrv+R$>0z*! dS{q5;v~su\_[O%FqlZ֟2$0 Q')7*Hz )@1~/Yw1iu?yS@ !u ^[σ)q'B<ٕ[*(mUԞ9꽝V7 G ~8`/? uٶ<{kh7қ.O 粅.Abjҝ2:hhy.^:֕v^wzd7< rݫDol! rF߽xq`M^D, $66Wlh[ * H:D}sIC)- ݲ# =[쾱oEXEWzr +]@,pH9? 0 `ʐ [\cV-+fR`5-+sEg ` ~L9SW/V0X_U7\VsH pAj}ہ "u,4XA(~6~ʣE>}_ީ P b0A@&Qr[3U`[[U,D]DwwT =9\^&%{+ebc/MM.m4T4 \':L;eQS2ILRG|)@i/߭GxMҨ d 0k7s{V^zgx@kQ]=%^;yjߤ?rF?X@{oB\g3 YE0Ƅ(ݜ+o#{-4 2d4ti|ضKbܺ,Dgs=G~#7=vx#{v;GwQ9{q?})@1x_ީ&^ 1 Ң^{V+ ry)pdyu@݁/~ m!r[ A9 m08 k@- ̡֙VxC&2m\cH6{o A*XNRb s·(Ӻ#b0AeF_o,vxs/ysGOo?z_yxA/Y Ԧ XOM0;(-| XQʁB21O6Sh:fZa @xB 5Q{$`Q\ܜXCZf}04]zyp@:Lf S X Tm[ҒP5IH dN%x너O|?J@iE1r@Uu7~ ='4O~H8`lBB|~ Y`fl~]`[  '^j.9Y@@!sVk \@K2M!9v2 IG T ^KR"p+Z~,(1|% Yr@P=w^Ăq=iU1c xud7 z M܂xb?ZXf-/c.r}]6MJh278(g Wj~k)AY47b7R) 2v}e?& |yG|Bv *20,"F,y&aȅ" ď/Nx0*i_T]S~'\k${m0ꄀ̆ Zs08@˿mʐMsjAC(!F];ϖI~p}El1 5%P]&@1 q& j)A`)uSj \c[E8UtvQ% xȣ_^(6QP+b\`  ]8f\OoTi'%^40 mz_ScpS; >d,kc-cAz/ ?vԥA|U.(Ԙ bH,i<c6An` e s%cl@0- KQ̵/ 7B[jME@T+"0 8LΜ2P5` iYC;@&o.~Q=9,(8ksAr'J ͭ,tR.7 rA=r|ޠ ^_$U"|"DQ)a@ Pq1D) \9P 24JuI|m8v ?7b*`A Bw\PvqĂZL MRfA\2۫})d.*?aX@Z f@`HY Z ZGp !@]R"˿2GS M msV p ~ܚ4XA`+p\s7eh92>OhxNzgwmC^]޵?{V#U| 9@|cQDҫ vKy Alvu nK;oncȴO~zd@ ^&گ L yJ7;ўR[Byj`DZR$Lk:_(9W`[;Ϧs+ S Qzg0A)@_wJJlxQҮkv>Ԙ :x,H,rρ __P6ruצ?Ֆv'G˿\¯>-`=@!.€@K c\M 7SXZ$s%&b-@-n4kozֹIBι{1‡1dtyK!;|9(&P+% `rA|-ωZlE퇴jέp077ێYƯ2P_{E=kZ*yM "d=1h[o!py?0Ht3S$*+5+dz2I< m @E@ gS>fFʱadL! W[O4( o#t#TjU N*xpH-0H0y/ч񝃂( @ gPQ@횹KZG2  4z> ->k|[}זpn&&,iK> C5_3 ضt-y%@:F(A`#ݻl#@M5@K{>LK?y-PYA+}<9k1/ m;Tku7?k);0 b5E@ؤdj@up $zK{p~ !`A#z)k(~G@` STy}ʺlb"Sl{|IdyP0:'`&̵~CA‚ %caBF1HOw0~؋!~L9~?U9B䱂٪EWǗCj]N4 + rN0{be,-ZaA vԎʽ)R$ܳ MzG7Y'6j' azxuD$a|#GOsW R {ZiD'*L#`^ze|K!x/[ myOZNJ|H"Y&RefzcW~DIp഻c-ZrL ' )y Q@xERG.P ݸT_fbWo'pD,+_Og ɟi}@ʼn?=,-VYt zGW n"3/$'{ @=; Oʳ9u$."^<**6 @h:g~Bv\@k',bOYOć? m.֖y)dvF`fa.#6Aphݙܑ 3GcɩÉ=r@P (_}ښJye dXbA_q}~^>P?QOyߟE^kkZـ`wxug nP{]H(g'—){91u+ayC19෯TbO]D-KQtZ۶ؑ7d^Y~O]u}p()jKS;,,ڡAsyj@q@&`=8gԃzvbp@<_H9ϖ{G{D. RmoqepY?L^]A>{=Ce0%j_O2H\HW -+ 4〟KOMSp~@?]n]ۿra_ߕ^Á#;XkrnO>2p׎ˇR?},>dL_2d"^,*`BZ1boI[.}Y?fc+`o 0@e#,SqU}=hKn-Xʽ䩁7 /kx @(+CʴZkccjkh/5s`lWp65i u^$*Ƚ`]+T9?|9A(j堽ϠoK6_1%\[ŏ;*{=k?3ig4Hi8mCֵ;(VAJ'( (IVA) oBb@|pPdq{Vem󢫭ք{6ԿmU"5ߵBߒߺ,3F3mH"c=s@5mUySB h)͏^Z~ /SVtSM¯ekOxz&мIȼM~qL 6/m NF zoTAoe&bP4XuB趭grKK//rysַ_},?m\Bm1<&X΀--* ۽ G6%B.'% 7?qaWr 8:So[ۏxO+ / R @(}lL= ?[y'Z_M<}hɭ:=P zAj~`(OBι{ٔX{yEgC@@$Pƴ`N@mb}V BS~ @Pq?ɿVػNuO |;BfB%Gc|柳0y+Q= % B! B @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!P @!PL!B<!BB!BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBQo$%tEXtdate:create2011-11-07T02:03:53+01:00h%tEXtdate:modify2011-11-07T02:03:53+01:00 IENDB`openscad-2019.05/icons/information-icons-error.png0000644000076500000240000014651213402025764022521 0ustar kintelstaff00000000000000PNG  IHDR|E pHYs  tIME5Cz_ IDATx}wx]ř;^fK݋\)6J )K6_6dC ɦR6 $ ƽے,ɒe|?t)3s^ٲ=}3_y?1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f3fN+8*2I`T B1PD` (dEE0La,3P;t͆ 3@hXE`tf8PxPy/3 ΀g><}цƌ 4ff(+H̳@<Y` FFV"l [mn@ҘBcƎuveЉb-0 uO/D`9,z}=1fИnsg!~*-grKx腂hkŘBc&=8,lƉ@gl 3297{?B?{񖶭ƭj1c͙SNsX s dF`c =C{7`4fИ+_*g[\` 3'.۰݌1ƌ\<&H\B [0ɌQ:ӣ[ڞͨ3@h̘67#Ʈgc˺?_2lĘBc;[`p5Q9nlGb\FǠc7 fz7#r[phc]35~`cۗ7DK()(Z(ZJVOEJW$TT R 'CvA$C7P]uw!utv ;ru 4v'[8W 3fxL7MCI 56n7-smn݇}{1otc 76;bw2 cX4^8 ՀWZ(o^9Q:w>JgFAҴ#ܽ ;foۂ1v`я,+F͘Bc9-k h'`Ph *-Eq4`=Cߦ ]:z7ǡ7^PkQدq3@hlw3>`F37MC|2T.[sTQ)Kǀx< %  ܓv0Xe%P,/,;VA!Xa!BXEE@()ye"z|<;Z^aNdY_}ƽm0~;|%MQuY: T.[©59B9  hx|x4< E"8Q5Ml>DyCc`yyKF*-C VYB h=o/>š7^=Z e[֛/ܘBcR[7gNEOD84g)g3FQرq>~$ Z>w<9,ФUT <ɕWV!T1v$/<ο;OtWK7hxcJ7}JgAyb 0Ia ח^hZi\!} ?NGss:,/* z jjaZ's YN`ۊ.ݾo <v~jX `BI' .Bͅdڌ9C={{{%A"H"S b bbZHh *:N ֿMv䢞<"ABWOE^mjЈPiYF 14<'C3A}q?ɋǿ|юN3# 4vٺ q ЙM>d_v9jziF>=={{{U)' rXTfqnʄs܋qBeeoF7@xduI<}vO7xo/6 bb} 5R.XѹeldlԵ?0Dx*+G(> 3f**h}mkD3H6>fj ;5%xO(<ד_UW򷣼ycaw};Y0Q& I2 PG;&1 h}I5Pޏɻ ȯG9(;y5zV^{-ֿ6Qm^"Э7>gfƎKvo@.`0MW_hɕ0]r 'oo‹Jf e|BsrWVz?BsýOsh̘4c;^<vo[offƎR[hBnXy$MoӮy k !qN?0!9 YOvvg6A22aLLc_!>zYDO^ JĴatPQdz9+c$*(DPvڙ˯R?hk=$ OM *pK$}.<qIXl(lplv-+(I0{TTs2*/G3*)s}7b?'+d8#KM8q8[T׀9MW]+@Αݶ|xXs t׼A>ϟsZeq4ؤb%%(3M{':CltGPtL:|UO3čwV@$ͭ 灱h<\̟\9ݰ$I d۰!J1;I=]{>A~Ȏp$jT@76r/3bZRk]f)T@Pumjq,JτY /AA4;_C+/i'yORrh-Z_d΀g**Ƭww w%Zߚ KSDzy3lO'8aiwh)oT)b},"X 'L<7/Whl',~å^53Bcٲyfn%Hn N&-A&M ]w(m0g)oz#̓J1Tǵ;f%g ȩ|VDQ4kpy]-\{&Bc?Pq8WT,m(_Xe\b5i f 3rǑ =m- 8_z?ЬQDK\Pej)%T_Gzf {):S`*W_b߉]w <;\ޫ6vY1M[7gNcg>KVs$ېh؉xP̅soRU?823 | Lka XsAWSXI2G.xfݽ娺J4CbnCOϺY-43BcvAtP20܏|"B`D|n  U(Mu*w\f5G,0EHUiD= a^\[ܱOp T ӹcHPq9Zu%&:6| ڷp| vWBcRv!@x3_E$ɀB|NHו L{i'h iCԴ% MrcHzIصt)$.{vVA*z).y|a~?aq&??AUjИ`47;x?ɕXϣkF|.~pAg'^nA٤)O{L)RUQzPA@?PEРuYzS4!D%B *LL:\?{'Oovqo/)kI3_v9}vDFe[΃%4kn55\& 36LTAr9 3e.%ѢLJ7<G7h\᧲b7 qo0C`ׯ޼f&4@xڣ3fH<3KQKOWLG4>`'h1>ɤ6ܠXؗQC?sERpѩM ވ1޵VQ f?pI)V]i8x}cxkUyÕM̎/9 %fDHoEb^jWd&,LuNeĄKq lk'si+qAoe ׸ \›Ӏ6R= ^O3OdPW]堙% #Neʤ Qq\ Ne-3<4$Y\RW9f IX eKyl+tuH wk橘n5}[ jQo-^:08>OaƍƂMm-Hu@EJwE:M42I&Uٷ/"k?& ʛUJB-NH gVוeqj0wAUG}fO|~<_7/&U[~jfRG1lqr,ʷQ{%~Oh$-}ZrF0.:kRi^B k䶯*( P vqX] YMOQ+dH\Bt>r*ܿP쎤AI%)ZHRhb\ub2nxPyf|s(?qlQCb``f-y_Y 0Pc[yyXc 7~ߺOA'ASAFC,1& pm*uA.XHؠߗQDu~dp Tk!3q;lLJ Y8q&xkځر}|&l.ۣf5@8! U8{?E2w&ىfiZ 6fPc`@M X0>A9 s.\A:9_6B¤f ̤(H~d):Gf7.w;~xGS#!J ׶ Y77fbMo'ZL8ߡ|^rwlCu}:H^DgykuH_fLȎ!&v-ke@v:TcIZZd=%1kDepQx)֤=7rP<8en81hܤ';tA y>v텗߅IݫhMGS5nG 4FCN6 ԖmԽ $B:mD/(@w;W(rAҌ^נxo)@'Áu!TR҅]hgtLt>[ Qvwqq[;rb>9g|?=m$@q| 0 ^9XT 01dL$((;Ux ǚk+^7[ȋאB*cV^`!78ƫx#Ek #y<8í-x7c`x$Ѱ'm&fh#Mr b3v`wk'ø3'*%tX``2>:٘bvbq6]q@ү #s %h@o/K kos_ag͐thF$3wccwOL?׋>q)'G+ݰ!ff IDATM;1ZgL~OvgR" ,P(̥,P&R2 2jZ̓2C~"d !iRK D͌K k;%O"43>B s.fԤE:sQ4}Fz-(Dê+1s;vl5GEXvY83iP̘{Κ0bk'H%|^G# 'èZO $1M/@:YZKЩX6AI L]녜z<$Q1&Ո@dMq1ʗeY(W!voiAbbƼjh of 09ǭX^Ժ~|F5a,  􎓉0f/. TiLW~tu5E|oW{sa1si鄆){v3e 9.`@m.[lNULrmv#q}23:07acG3_@Rԭ\ kEF&{SMi{ܺ""6zt'zg"_5[gB:4Nc7 ѿ5 lڀ\ fY׬jȯ[9mJ3s ̙=8ٹ߱V)M:cb)<sx&E6Tu.3C|Bn}TO 0\C',\d!9FLSTn] щD$dA8 +܏n'+ OՖ\bdzlݢi 1E:s/$BlF؝b7@ wcм".jكLJ!`w {DfOtX=NdI  $P"4Eґ\T GO.6){Wy@'pc~)oUt\̘]6)ì@f7@(5Vڜ.WǬ:L?tL'ApݠŔlxi2>YGlKy S@2 j K1.Q$>R"{RN\cQQ*p\=F*N ,R!m{T_p Gam}K+)7Tw G+H) tB \TimWUaF le %<8+kG칮=߽C  ӕAPЄ5#I6);!(SUE][p$ J9 [LfD+"4ɽܡq{C+*o{ ʳ|I#+HN MSK8+~O=;0$vՖw[q}b֬D~ @MN XߠbR7 >ڙĬ-0;R$`g$:@Mn98 [+ eaA= Φpi% U!dsskKz@ݙB~jYY p$O gJDZK,ky'QI'Bj %N,WfY{5g_'MƤ%'m s1MNk~c_]fY'TxV`~jI ,g6]Ɯ Wۛ# }5tqPsk#W/GjK颮ۂ(X@->h,D1n5;߃hqB\G̝$JRޣkQ"_0r(H!@TDoumfYQ4m:.I3ōM(Fߞʕt֪{_2@xMS+\KJP므aMl(0aIqPUvֵ'jh +Qj-d0, Xݡ7 rzC} )u^Wi-jNp4v(F} d%"c ^3AQCSjXC=8kC)\3 @S͟ل k! $O \gwBL<`A 쫙S ޅŋ qI[\Q(w= &Fg6wݲ/#7 9 |AP%A0YZ$T'.M!J"Gw?5^/K)TtD.XĽ(Rw 18tY$V 4=b* [;2>kn, 5+/A/D/[E}@Ȃ}\o{>Kf@b')Roa|ؓ/K"aHvU ^H4ÛVpHpD"Eʽ9 =>㏳/u@PpN8]˯*-ϼ GJ"pry/tp6IXv}c5"||iFx ٻ> XOʼn+9 +,:8a6J9+wm U$f- 25.rh#E*wi!fIUg 9 ѡNj( El  WUVͯƩXpIIe}E `IѨt1~ "W3v⍽IbO@ub\n6*u=]ШԊQ((jt$wi2 %-$C<XH/NG(=<{h x$qP"b~bc.@p6m@a]=*fߊMBn,5z͍cxטz+/R@= əB.a%4%MjA^D-luwY^opT"E/V(5FCSW-8Ox< ;Hk7@ **Y= Ҟ!K0{g.=Ck7807Fk /|ܽ"Ɣ(v]xl#1 SAWc uCPR ր1 G.ӊ>rOWc 7)Fa=8Q؁v]0XXT1mYPgVP{p QЄI,IŔ)8&'- t,{ XH"y8Hd+>^5Ř jP8 > mےtez/D`G +8o@P|TJ̜QP=%];.΅6oc=N8\.Q@'c J' rDaD]y' *\YOAhr۳ Ca2aʔu<[GjicHމDF=1\; "XhxG03SNPZ~<fT 5Apj/YS~}v=;Vj #b%zʏš #?Z2dwֱ$Ì5(=|X%Yhd7"w{fҒ xJM\NI&Z5=o'%:Tt2#Eq|gQ~t-.BTr6m@k/G#Y oߊP(wғܳov- MZȱ!D A{0* MP$!뼀V-^@}iBA hpM-J\ B8=.I(?"B;eޮޮ >GkSt)w*Ƹ8;]:07fy{;R*F$!DAAwN[yyϢd6N3ٟRLAp?)DFOo*(N4p"D6\f{q? @|[<,PJE c[y^͚4]UWh{׊@1[ȯoDldAs!^{r"zxAyF'WdBBTպI9aJݡPyJD0} H;kS'WrEwwuQ#G5 *&iY8{?Aɴ %4tzb @ LTiқx$AY獀 gB74!g(@ jf&lO  L[Vd]|MϓkuHC=H¬'N\>ea+Cـ ؊sP`qEz2?8b]N3W_շɸF77}`Uס.-Aa[ b gvIv $Musy]ƦF|]EnX 7 + H/"}I+&-*(Gk8ꔦ IDAT+jLfc9']ռ'X [:-gz+AG |pv ځ}{` be+@p̲0_ƔKVn}F`zCa,뮾c5bƺ9s f,9jKkJm=d+pPaaڝs ki팼<(WKZ ᅮ,W醸녲;]n8:3c0 SnҝI7)%-ZH @>)':ʎ- x4XADGPx4z\ $i`*>>04 9Z߆7Q}Y(6#`N?ޛBu~vv?*5Sy(;g 'DwlCEW%` \1.kgbT0') t\>ں;4A_2Ih8 ];@ crEBFj<18%䵦$]:R5$7dPPbuIIAp$o2Pu8ЀAp?=/77*(DNE k4@x_pNVP9 lhxW^(bC4Y D1LO]Ƹ;&xck1nP7 N0 G˘B4<#_*2_%kj&D@RS2JAPt Q0TI j Dv#TTLmXbL*s_oWQםGgwe{ӮӮѵ-+}>wJkR$(``6$)''(85NԞ$ݡ"Tg& u&Dwu X  j .x v A>ѳ"yHz,hNDZbL,d#1@-Lz,Ts>m->04 畗t;WVYf>E[շx)wX*+6Bk2f|@$ńL4^>sBs^M3:`#i;wJ+H8䋭BUC(g m -u.Hdy$z{hC|xnJ)>jCչ `1Damuܳ -L qՕ!d.jcqY}̿Ө>[}9WLpx9 ̈`ܡBAXϜu᩵(;| /RĜqQ1 #s;(1WwsAB5< Mj=XF'|傄d) gDx4ւx@%+t Y0:d9#۶#ZM>\7MKmDd! L!t=dp즪8)c54oRމDA'vBnKA| \43j%QQPr?Jy@(BH#SG'K(sP0m";%|cqz$y"R&spłų8KRSRw= цh~AL e,Pcf1T{"-ܶـApt{߆70Kw v4/3۩zM*`_ۺ9Mɢe|(o^~!qD^|R@7˙AD;sJD]}gU:?j(r$ArMVQq wnsIP](d\^)srE o A)Md  +̄kL H@RQܲU|հ 1+}b ( 2lUw 8?1D0u3bc1N̢g/zZ0]<A!7%jX @% ֊AA`@?BE>,aXG@7;V5]k #ЧeS3ݥMoFã󘞓:rOΥ h} 4r?k ׌`H?cru_\9>mw:iVQpdA D B*A3c?"`p$z3cA, tb_:jV]i@p 8ϭ?.buY(BL30nNXoBp3}_L;&.d@WS,3Lϗ(Hgd<0?A/3!Kb̘ȶ-If@~\ؼT6MY y&wĝk ւX~шt K$ܟ{u$b.A?KD_/wnUA!e $٤$3\} Apvnku܏[7#ĬYfa{eO.)5~yDŬ,#eWm+4U_kt@ &AGsb^ɘaYں)MJn.Msr"&'ABNAb^@*׋Ⱦ݈ww'2j'GdoA[6dU{xuo4tt D: a瞮3p@eVlQh _2a9 $ʜto\ t2A!I΅ 5@0埩knL Gc)b^/A;DwG@?wlEd.HD1)3t, R)U eaڷ]e@0CҲeyn)wʆ 69؛i(9_MeO/RG&! *$t'j H0y]d`O` 8' h oJēu.,Mt  ٷVXrOw7p)0in6M|Upʜ;XDrU@>άSNjTԤ;˻4k!i)#dld#X @y| VTfAU7vg Oa<2ھ @Ƥ> x#t@PV- ۨ} jn ~>[g l z|cC=J]~p$D\R7( l[N EɅb[^mJ] (Oq;~Μd_ïT3#oTL]11 ˝;?c1D[ah%G eLl\#@P{c1l׶.CɌYN-h8af]1&-= Uf7(+xtքIbo\^X{%ZZG8Δ+@D ɠ#נ ꩘zӻay\BR=;ApWqDZ0u8 cyD p7eVXO)sCyo :AEgy(pX syUgpO5y-hD%kߏm\ BZ#` a7+1 اƫnVx{ÔU9ƴckw?X#\CKTAa q ,P3m_X :J! (* APh) ԤHJ`k#$N9zrk:fx&ޤ8.3AP&PyD6 rjMY۲]JtV_xB/Й*wut$nLY`?\ {2LPRN:% W!~A(fPeuו^A t@8 %A 1_d8Bť1N؈ۋ]x *]ML{,,֝#`h@y]߫9BWVe531YVRy9n6(sv!c `; TJ4YF1 DbLOmy 8*`= ` AL+ڸ.!)A, 'fah$zz#^T6ŰwA&=>A{aY"]3q IJ Vcm;tvt4IY3dw @"w|\Ź.Kr+`SM5PB !H -@.Inp7  lz[*ɒ-ɶzݙΜ3sV|>$֑N=;}y煒ϊ@І T{RMHZ ZHL'_!H 8*)J4rI 2vA+vRNm܋χ=CIF6P|f-l a8MabR]+ 'Έ‹Ԭ.P  =iAM 2C=SrpeݿDu}W@];-.Lh@}iw7{lAԯCD(u9NuhY ATA 0H Mj*c3*H*y,Hx$"-7Q)zB9s#lu: IDAT!x-} A>5>ΙOا@crC:Uw5'ŎC0nL{R5 |JمBAq^"jX 'A =,`< Os_4 :Tl ǍðH%8 ļ(pAB|e Aѱ(teEǠta@ۧ@еeN/2?mA]'XP jAqi5@0$ vЫEx|\)L V|B̤VV!M =Pb@QPxȄp4C!X6xc-)G7ٚp ;o4 4\z+m :Ow7<̳z1~ =t:•AX7 @ݽ?\ BMr Kb5ES٤@_i52W]@406,?UKZ sqΩq>BPCM!xP;|Y|x>B9@x{&SI 6% 5!hŒAt]${wDˢckudA-*ש U <6ij 5*\%B` II?AK3l[a s A ߺE ?):m@i}oM1G;_XA'%'ᾃj– zrA\= h1E*0^-TT0(zkveтp*5:F@⛙(Gb9O^xSMM?PBZ#aI9$inU]%IB&`W!t stQzO:E8Q&*tABQWԨHꔠp);w`[<7YCPwB?r@W"^w5O'bʓCСbZ,t]GXTGpX(!ޯd@Q0pu\wJ2є4?aB)ǽ:2A-#&CU^N 5v͎I7`!#e][&*Щ@ua`uEh~UL \X}'ho"Sl!hbF2C!(ZDz A Y'W!h!eyMWxS`uw`Ul]B!a(X7x, ܨτt@-@xgmh}R3* n`)0irII. (zP*s2- -aHfkjB!hq+V<#M &<"nL c_Iđ4*!+kSr{ U  T$ΒQmސ A ÿ,W )^{K@ Vo~P5 'L(ycXfhO< UO havGDg鵷݀^L0`d~.|(rJJL3!|X78z :A] TK"ԡJbU A"vl6ark ܔ3C'zMaPPKځF$ t4Uq(w=w AuـmePyD]sI 4~p1n=#Kq#k傡tfZ~fxS,T~Q]Z Gh|UnO74SOcZ(7 lC\})!"4/3C5Hд[v>HifDz 4B*tt zL&d5z%z A_# h7~,g{5_gE9uBT2tЉnfc ygZ(!X{ ) 4^[RQc,MOVLe*>ʦNc6p|=F HTY?A<:ք scojgj,Խ{X1&UΨ.P9*ho/3):f nֱ,B@PQ^GD[)IppzzX37(j=)J)uj~XEذ[ <R@hfNy!CƏI*Pn˜D`mAR*oj{ TF> &E/#<`#h&f phZ@B8i CBG@TA1ËLtfRBlngEE 'ngy 䯿 9paJS~,Xd!wWož mAߛIA~fn!&\$85!!n߿v5PdZV߅&3(4v:H8u!@Uv(*PW0&;rxjұ#>o-bf1DNeڂP (Rbv!h&ҥ<% kYN>?(١I+AF"mQq *P4^wzbu!ւCFRBKA aݽ kzAWqQŨA/CG$fr!hB $p`zy"EyCpRf ZiiyO?*Ȇ -;ś$q\Rk4<Qfú۶φIun<1) u A}ل/ bwI!fJ5Q=c T9p8ۑ>ظrO?*YeA_3p1}a^g [>AJ Cʖr̻?!^0C=GIAБ֏j`Z\A0AfJf p':f[ }|ƃ~Lm i@H=[*' 4x/"z0ca r~ѮZ +"Ǭ`{ZIL\aVkQ!ha1&e(]U 7TCP;){^N-u #Jh e(5\+!!֭[4f[d6#X͜,G͒e%0i^@'/$šI|9Te8J)E-hS n}(yx]SULTg `@haPČWb jngRQbOP7=VXtۉy}?aB hյy2 >V٧@4q'ULq67jG=Q$,3T A7< +Kf&u{5A:S(١QJ\}(@UT  e,Ms(j_}=[T2aW QLd!}+on a޹ > (ՇCBM[&<&#B`@k$3ж}^Ԍq%eƸٿhh lPA0hx+)dC&(x7Za>!D@E &$$αqK"Z=WhcCA6Np=3<)m#kAp[Ah|Ţ:X%--ӁcF0x*Ф}aNb)^SAZH70p} Me-{17tAk!@L+`Oq]&G[o91n˃QF= V5!;*Qc= u gU11{ AMǛ2!X}*͂hhW, ) B  >BN֖8@!@!A,Ma$L (BzU6aDaPY)5(>qh5x@OW_`ǃwtwC8zHyyp q+UQm , t6m274JXkeHG;h(d01Kw:WzrxbЪ@ /BW 3P86tlXޅPWS,p$8sh8TB0  tԲ ,:% ¥c@A JVh"TY.V1aPX,JךxCSv 7ɻbzIz y4*/ڂKu] ]uL4ζqN#zó2 % ^Wk8V e$ /`_S buPMgynTPSȫ1닄=Hw(Lt% RuQu~ =ޅg 3 6 h)|k*0x%@Wy;[ C| M۸dU>Ir(%~e \_OCu+1 GAK,X^?ݍ}{Qw '팳Bf E# ZCYG/nUXfS23kbCmf(ɅUIry*PqN;8EkFDApUV R5Ek יkP} kA*t36 zQaGh1./!hG  T ?UhT̑t3 !<hۨZUhb_O,/Pv V< -CS BR68Aظ-f;+„@0#B,2C}1h98!ø bhĨL|$*v AT AQ"QHe(}a[5 TI{HgE46zU=G*3Cc}@A<]EP_߯a׀N 1&CƾvЕu@A5xFh&9&< a =U<¹ڄa{GB@0:z4 (Yz:r2qD^~WanX? 2$9Ee f< /Rp)G٬ H4::;e } 7EnCTfaysiWJJ'Z*280,QJ8aN~I-0(./"R=`dZmX ;.&WT+{n +CE7-/#c %%A%8GBw%=] I0tyA!h HU_^&==I.RP}@ <ze?(>g:Wp~]g} W= OA5#=!KH9ٝF!r ]+%C;@۹T`>>\@g0CkPFcA0zס_F¤|NayAShD1 HQ@U~.a(^%kԱ"/po/5 l[} ^A!Ie0UA/CcK&sP k8@=`to\nJOGC)&u +!! :: mXQf sr@(QaA-D):Y a,3Z?A-C{6 N`ʴؿ?A:;APDAPtVA0P A=a29md&|a0ϧm8hBAQ)0>:C/g ȜIDz^h A@0 A::CЂzr·iZ@KJ2I EDFߵ/7 Vjq2Fԥ^IC| A?Uqjdhlhk/Xz{ ?:6ǖ;oD(~IEfZy`y= A˾`4ֱ͋D0.behI}jXK7k IgdA0:7ǖ;n`¤ ^N\T2*!hA:w0KEHOP4 4+Tv'6DBP,Y+%  0%zO)VI UCҧ FƏS T fv*0mE*PP*0~s1fH32 T-~OR 2\-_ &8ӭBF*%pG4`tm\{ou,CP״)p .!(!h= MZ 5A UZCnoDS\ IDAT7uH m POwArAcUWx⧆sg;HmZ FWHJ^^cC%%iPUOY258 :_ۃ(\j$bѕUԂCM:C!5mU {33l>um u AB]P2y*N+$% XP /5mAH0 i&3[ A#2}9'v#r_ Ah>MM* [rBg{THlS2i N^LJJF}*L4⿠6# f"(Tq2<;hĴ -u@_ʃ 4S ' h9Hm"1N!xgE͞S2y ]=ۡ`&1IPМ8םC "jA˦jx^ GA\Z*J5T2\%f6U@ե8[[٧tʡ8_^!!(!lxPR%AH{爫- 35aBjؚd[RNb #4{:$ps{H`Ԥa(X ڪ f(usA+.` p-<'Abmz&q䩘T!!(! v(ڝq @cvivegRkx85%K!X 37j`kUAPBCR4'lKn5.<3@&sr u"<t ~}yyaABq ȴcAaMra?P0a!lkebZA&d¢ga֩})®NW@! JBvW%Ȓ'17fCеs A6F A>92 p!hXxQˤ32!Hm&EXdqS ʁJ-@^i)+p:]1O \]//_Ri1{!4cZx%(١FT -'X BSlSl00{~%-.P_48hޢRP`&д^R94Ө7Ns`Rp U4˚T_2 \Qw)7dzT"aR A-)5J5@J[h+,BPF<RUR{2a@1@)PCIw7h0d 2CCiȕ9f&QS}@DHN^KpШAaQK:H̝a(=A RG[dOCk&I BTc O 3 iRa <ԓ23 +$ @y(pΔGMhTׯDILM#g*'C: U5>G0r UhX ">#Z8]yeP03kax(N~Q`A ӝ|<(Ĩ-UkK}ل]Gd:Cq P`CPi{F$TB@}=͘ujBиGBCPC HyQIWGZB0; S:g8ۑ:0C W螣&ύ4!#>7j@SZƇ u`.[D ը@z |pkA5߆ܐ꾈 &ݝ Pf@0Jhs6iA- 4PB0; 9szsOR`2?c $lTO'A6 s :T+^pa F 'xLXyI=7ζM043AX,wռh4S"zWW&*hJ tۣZV B2 5uZQuI1@0EZJf),m/Bތwoo mmuDg*N "l==f6] Hgl]KG;, %3@Q }Eڣr+'H ,"hxBOd 5*Pwn"Z$nClNkH7- he ABKl̐`(!~YEY[Rvg,)龽LZs*ÈEH9{zBAaS_&aD3 a!hV?%==̧9 hjmf-?`fAPP:fa6H^]";_bNw:(Eg % gPqO=H@rfAjrj g|gbXOM;e!JIII;B&#b5#t0`B7SW+WaVuuOF5C{i{!hd Z d{R6%ϸSQ89FIdyDdryQna(!9qu߱sa{0j7wppUa0 x*F nn/0à p! k Fd2 igm; Wו I%@ل̶@Ank=cGFpD]BAc#j܄q kzm,&pNޔ@l b3X-H<"3C2&L*!2۷Cp'R+W8`2 4CGX%v1`НS[huRbtDjCA$Rze3N̸L431  4 8Yu'|@UF02DQP䯻fF닄gF 2]$Tzp6]K0|{do \ }#tp|]ٞSPB0}!ܶ%Ǩ TT:7rPg7bi GIhE hEB Cx&FHbȀ2 M'xNPoaxb ꭮@D?[ !!엁1cuƖc~:BBy%P@[XdI/C@pSGS C CP׽yPAltƊhu@#f Y.0|'&L%}994Hf[&.@fh(['̟0IXη0C lE00!Hk` h94 kPMGd zB6`  smׯqgc2PV:,8EyDf. -jz@؃&P\B1&M-A"ǒra8TB0t1ҍYBB*7l`#'@1QvR:BUߟ"yDDBUOUk)b BgKa^B0qǞ tK46d=;IaW՞:`-Q%'c1 tI!G^OjE.MXJ"6hIzAP q +ee(!Ax< 5n9d/B 5l+^gySO5 !HHhYv*1Z7$wBgSrJ&yettCc;"YLe@w8}MN Uh$`GPȃ`CG !G?,U ob-J&0䄓tꁕݼߓ]0o2VF Ш7-5 FLEzG/<£߰->rq^U x/CШo\' jAB]1tEi+,BB%ĕI1۷mEO>7{mY M_KKQx!Y!hEIHQ= i8L JTD.ǝiak/q PBЛ1̳gw~ f#Fqiq  8 |cobl-LJEBcN mUbJqS ˉq 0ˮT0YPB((uhuTd?Ia_%J{:}t!0C4T7aZXum?LlBM!ݺwb|+apY37Fu3 \' [ L2KŧEӎ8A B,*Q+=Ӊ> Aq801ЄGdqvl T&J ÄpAsg1?_-B]n0{ʬ!-FߏNdR= HQ21ha *S!A0y0TJZGNF}mߧKds6Vt@[+d]fJN<Z'nz(S A u0DUx.%k &ximڣ:IT6Ɛf"@ ?vyT8@Cgj_OzxɁ.}8- q!j }PAO#8;xaƀC9aR A;k.sjt9JGx}8`>}JPtQDFu+A}{՗ipa ǟqA>,8 T}$ C7 w;"V,uͻ z>t]hbSKO=3(hkT` .&%*UiPLR!x ȥ 8-GD!A8T>6,Yo$ sTPB?M;a/vo@|=% <{KU@oͫ 4 w/ :ÈkSA/#8;V^(= Ƀ Aw{в~Kۧ@~tÇъ(vD"kpA)Soo9s!mZt i(&XZE B YyO{|o~}z%&|!?z?!OPq֪Jt`uS @]+#B !H  ;?׶-,;$ ye E<j 56iZR ӏTBPL= &Oeâa岌ʺ* lq b Meg ŧ!ȵFi :D 3 @!O8R\`# UCpޫI`tۻT0c9C&|26,o/qL0,RFnvւ0wP9>Ny%&{F#J9v'WZ jdFTB0 % :|f_V ~.cr`R>۷Wufۀթ"!(W|gB#@wn{LEyzZ&34fCP H&dTWIOB̶wrV(Ϊn SU.7Ǩ{eiٙW/ndAB^ @iAhpakGX _m"yֽZZ@0W/SBP5&^ciшzH!R>)z}Vn9E V|t t7c_H:G8 5Ύ}bIZBP*Č5?ѹCv]x6}{%ۚiЅj w!\5Pݺ8w'%^A0jrMBP ïeiŚFBP5ξyeWΛI/Z`ܪ\ռŲ7l!s D c߂7(M}yD8;  ]"a}HBP3\3Ư>GWwx50 Wc_*]}Yg=3hMT*3)mM.I1Qq8T /% %%`g3j~arzޑ E7^Ծ.5R(_ C4٠'wAUگ#NfLq|`싏GcOa>cw֠ ..As UEn1 8ð$Mzn2 d40>r_/4<3S\MA*a(!; lyemZ4tyc׫OAq*" C8J::̟EQ46dڅ O Je(!vL&oDjw3V s6 [ Ff˯A5&} 2TW3xT%񕄡1hvix/bLgNÕ tׯg0n@r 7RZqhP ~u%}V]u,]Y^P0}Ua^ ƻy{?@նi}}"0j'|l}_?\ C Ac~q0۶=^)PN$-A0@g\RT?gfS3Qz܉ װ{lR g`˳`ᨻg5~Z]60xt}V|zaAtٽmy]!S^ +C;8;AB"|SBPt,YC Ag /Sm[_%d2"WlS̶OCɌ%-BP 0aP װtqFPB!~sC̶oƁUBϦ3K狣~4c/z;3F+ A=^Ewgq6A-C0 C AcŗbCY5'8"N܍{vS5W0 PXU8T?SB+ԄI8[B#`(!99z5Wh^k=)ݟ_?݄>,D[um=֭GI+= cyD 2-C AwcW̶g<ٕuUnUaUZJBdyZr$mB0:^ M ޒt4/(1=l'ؿ Q~ _&\(s{%̶wJNMF`/awj, Lq`b 0t?]{1[GϯY/Afpϡ/ݽ'bM]&!oR:HC!'C0^/YG8ZS7Xp>Zlv2|ȘAq{eAKYUx}I:`tԾ6=p5 V^Կ` /Y.80f}+W V~)tgʅԶ\8[6a~H@)A_H:`tk[ec@P% Ѿs;W. //'GB0C!X6~"/@1_EǠŤmRz<CnӶu jb+2F\s3򇏔tXH嵗MI-B@ګ${~O/(PBлq/77s լͻ?Π"Bʚŀly1;/B~>>_. XKtlR2C./!DF7'ލggU='Z>6}@ɬ#@<8=M:S$]@0Vl>% H2 %=0qz}VzEdneȰ˴ n|8;wjCB>cc$LYyDD!`+RB0=K?.B;10vLᗺM4t}8xїUۤ@Pv`Ƕ*hGo%]@0S놵ٷ:s ޑLF؎1 AoG8yŶ5,^G fW=LeEݼg@_u{/?C0F+ )!ռ6{;{\$`B0zc9űC]84!>} :FKڇ`tԼ66v62C\uUi _1xC AǘYs1N_t5w3'L[\V^Zǻ9N 4DIĶ2[6s AkЀ!9iIfwnGe0L*!W[ض*6PB#G_bSKTxsx~shlc)/!m/`ncphVA02ж2L8ߢߨ_˿~ϖHfvnE Q:n<EQԈ`ưOéOVMl{Y/O|>rƶ^)[dX4e=֡>qWٶ+U(!C"݅ (!In-ܲ2t5ԃ"!WRKY1ccۺ6@k\wC×-7ʝ;AG8֖'CǮ̶yC$AJf? ю=u 3 {.O H}9>dë́P8.P[쀁ij8 A ȿ^ lH/ٶOgzyk#?nCnT=V@Q0c njC-KJJJ7j4f;k@ R|2G]×eB߽8V_m0J)!(!(!(!^yn.ȋ$ =ԇ]O(wĤ+98 _`ڌ?'dmyhٰΓSGnݚJv?(nX5X=̶10O{IJJJxι8{m_}7'X3x{mᲶ m+4Ѻz`F0{G),mijIJ_\`gdi겕l19Fx` ;8nl$%%%Sdq 5JVyz|~s7׼Pعk}ٖ?d({@N`Ɣ+Cq=OQק:Ez7"ˇ}`\RQJ}{5r1m#G!o 4򡄠`ǐN9/΃O᝵5XvJ >0gKݛ}}5uh`& /p 7,=hۋuk$%%%6G 4m>ݍe?]u5ޜD_vV]F }d̪]/ECAFteOzq 8d A A A ";(<پZɫӴi/B}}َlXcō?gL%(!(!(!(!P|>(?hf= {w"g_bC᥵]!O譕[oleq #w@ A A A AqοٶǼ-R"~Fs8^m#!Q?e3@CA A A A AWП_=E|f' %un\FcggyKMLi^o(1Sm+1 'c B%%%%145۟:MwmnAx @CUR=h+fYc#`d 9D|ט2Pw_{=tBلI][_/OE+fWUA Bt VZU4N=CBPBPBPBy%= ~} ?1<8gs{r dyw\ǫc|I^rp?^ŀN+Pq BOW[j~'g˗ >^ins٠:f[u`șğÜ\ {ZV,CW. A A A A =a&/_xY0+i1`r}[@F0\yEI.1[7oD|ڙ*e_+WkN A A >R.\Dg~S3n/gz B1J@yZ֯E (á_йs``~5 =$f5+#sl3)@/,,{/'g)H{p* s0Ѿy#:m,T9 ?`͚!(ΩY9$7Z[?_}% -|q:"t܎ʍY #0wR :l:W-Dzk~`{'Ts*!gu BGW|(( V O?+|2|oB˚UY1%(,m^,*;< B9urS[K?r:nˆu誫Ő3φD\g @o̢c0%(>ŧXqk?i^5 CxX{Z ۶bwcZ <HJJfy٘5`7,^U^ )> A9Kz6^ijz٠m^@8n53 ,;(N;{?|41?~97_ =gՊgZ)gnY)#oQ8o/ OeJ !(!(!Qy>_`˓yk NU(gk pG>nps/pU+| *7IJJfԧIW\{ 6o_'t/SfUY%_/BL/{`?'D~2 2n\$%%xWo.3Io/Vyjz-1{k.9CK&e<'Ux/la(GՉ+IJJxt}DXv͕hD(~JϘ]U[-gg ¤K8/Mس] ((?,i2ƝB9бkZ1m$>s*k7YY0e0!fx%`K8x'5PztTy6|`[` OIJ _nj]T]Q ^s.4,3OEހ#CPBp`@)L<8}Tu {o 6> or2Ꝫ/ҔSFN~甔?/q>FcmnL謩`\u nW|qebaDas ݂I7(׳ BBPBPB0#@1v\+o&Q끀m Bg\/K$<24rsWT5ؿ\ O;~mSN~uۯa A A AOưb0x>`/`7 ښ(Ų.{M5ur0{SF^N$C'GvzVstlt1|yyqC8{uQ`G;=x7i@EkvT Z_1t9\ P<1hu}i܇ $%%b%?Aez,د2;;p%U!T<LuGPsTr:'7pw{?k V&Fo=;l):vP߁&knYT0+;}uA8Ou `wvޫ%Qv׿cI~܄݁}/ILgm"JfxwrЙ {C}>*L~8d~!u:IJJ?;~?KGSXO?ƺFOSB;@9[j_3a֎ctDxxS(vw6lzA|y4pQq̱Kg6ԼqϭTΔY?(?e)pb`57` A'X k 6HJIcƽo6/w;[ۻ%%{lKewv^c; xѻ{)Ho(Aثe 0w+.:_~W{IJ3GO#][áx.\ @RYū ؝f+k3/p̙C`dq\%:BҢL'4[֐̓wIozC%{ HO[^ /_}CI!޴]3c ~Y oKBPBx[߶˜Q|Q rVvFH/#1<Mlgo{&wxLKey][#!(!x~;+ ~,F`o8[t:W-KJ iӈ0< hvƎ' ?EGu5zH 1gjx"FsÒ:rlmbjs22 (=%vePQ}QcvD^1Ǖ}WWPǘ߿=%!(!x!HnoWvxïs@4݆ռj$EXziWoqa#~5WAkU`B .8ej:z+_xz̶(nfe;ߗHP5GW?$n ?3n36r͕C +"ib-&(6^b':N?fY2@a>‡lIHjk]Rwuw֏2[`_o5qt}#y,m _7ą|[ -:]2 H#A(|yt8% ,ս=,$E{6 \yc|<Òas~F=͛(Cj>]qf0pb^50xT܎s:*m骧?Od~p?- %E,ŦI>-V".ǜD]=K@}[)ݶm\R,!!h $ze^5ثgٺQi%qWWexpvN1$E~Rxa?ZJ}DNgyS.8ѱ\wl|v*>߉TB<% qsd5a}GٙnN4#|_ w%I!A(zXGKeڃb fqŔ_ ՑƣG3*w}A]enI 3cq9nQ&5"&`lg=Oٖ)8x*]J^10b ??HU9y*1g߸LT5R/r~0'kCP)DQDKĘqDs{3x[Zb>[i(f_~|@Pq{I/ A(|-V0˦qKp'2n3;5ٙe>7Ƃd A$tXa) KNXJ*/I>Ԟ>;;S.,TzQ$x오P@vO4'^F  9eS{<4: h8zi?J"'B\kC/888?! BHC~t7; ջ>ꋝ~Ufu< *$HqL4z]l $tOXF|^ϡ^\hUQNKuujqp wCm 55mqmiv=LOZkiӳj0V?>v,؂-/aaЯ?& "iwj9ߵ!7ڽ{ٳ=h)+6mXCYdm}YPHs!&:F)[e'zhEE# N~ηS{|OxRW#+ C-5Z݆-8Fo`4RNL&xH"qߍz:w]-siɦ!7,egi&>蠨 p n >p0A b@G18~c]M5EN\%E404]!e>;+d,d mZ{}DEd /, [h؂1`D[}=mukkpTZ]EkUUWV7F~ӂ~aFvI\BPt^5@3Պ%0K@ ?͆2,pmXPX+5"$E.5"(L3S}M)6Y5'xT =JzbC&7gڕ:R%BPxxbHlJl"U"$E)1>A'JsRi= k,m[gJ B!NѐHo Dj[ۯP&f+xBiiI3kZyVsrJImLʘ z*0Lj5;SUZrQ lN8kz.7T%1Zf.o>2ΨBP(mkx、R3vk͗y# IO ǪF)zR>jc_pdaxj=4[eciWH9G5 4-m6E52CCkR@28hG_ Eh1T,00SДYZ$!A(ďA}8thK P)t_ 2h݇sT~? X@k(݆Z1pv+4fjPZkQFPPJǨଐۘB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B3u%\IENDB`openscad-2019.05/icons/information-icons-info.png0000644000076500000240000016326113402025764022323 0ustar kintelstaff00000000000000PNG  IHDR|E pHYs  tIME $'N IDATxw$u,۾Q  E#hȝ#$TT3Ñќ1:I$A fȬ8nx <ڢM.>#?""3{/"ڼ{e2"##+СC:tСC:tСC:tСC:tСC:tСC:tСC:tСC:tСCgV0} t_^޷=wf[Z]w20W̫a pulZ`d@y6EaFA]~l)T9 {|n˿ _.z玭[?~ctBCFO Ɔs Dzjۙ  Ft+-'%%{}\&`0;5womo /noZuXX oֻm}_po2|8 )s Ԕv5J~ {LJo7e~>.^СPƢa.ei9eopX&'/j~ĖkݝT7itBCG[ ;Et޻?c `ONϐX,; ~OؖMsPe&СPI@/;}N_u9OWpb-stq:wPzաC>:tw|&dZ_} [x 8jW\N6#'x/YǗ9=CB:یtRT͈?8y~^RpҤfvqz}gF܍A6ez>tjTB޾[dO0|ilW _m8A6eC gqtme>q/zw-8 HS?p^j;#cC?r0E8{CFu"8~}6qu~jWyD` )@&e0*|B'eȗ1/#WX9NHLEsab"`ؖ Сg NBI܌z)Yb!_TfY+]sVukyZR0C1S(clC37: "BGKim­8c{l=-A uh!ԡ^| SX{5C`\GXp>vz\еiMc6'T-e#W`q:ɹ"R2_i==~PЎP=ЅC_]}[Շp 5 |sW/~&}Z6G&85mwњI-$UꝃZ 9CZu8cUÛ&F]}w6|,!L/_Oࣗ\IJWg=Wcˢjs]''{ mD']޹]1!8CFu"8~q-`Kĉ|\[ ne"H9?{LMמi_~8CK m7m~pWMͱ-S:#ԡ:),LVtJO3&,HN˸urgg%8"#0[qh|*`ȤVX, Wfj.48jPB:Sbi0̕* YlYA`hNjU98&&Ckխpo;LŊm'O_FK)k3qVN8Dp=1 4V6vա4_d  7\؍9lX/ @xt,1WrժIc`p\#(Y\ђ23 NW.WjfMGǶ r\Iuh!ԡRvF똅y6r;\NpAe%tJh}Sel{c,w&s#2\V" ZW:GA1Ǚ@+#c[v!DZu8\ 8?h'Pl\}xpɺU8i<80S߇0Se\2 Pk\]zz5gF㌈ \{ZhA? _R&uucD'%Z [S+՞VCb5K#{6 KLzw;5Kv޴QBZuX*G? m>'+Kzu+as.me sx}]SA [#+#0[8<[+ZБ6 0e9Wts8Co uh!ԡ:|3Fg@I7:oD"=Din-ޝb #T!"H!$%wp\ .Z8CYE\hMВ61:tѭ&CZu8"G7QD&Ui‹  gKUܲ! ʪ.-8g>bm|@E B4ixx V#miSoF\PPVPB:N'Y8dN va]N:T6E"XBS=F{c@Qw'Kdu :Ҧ4ME3|py.4gC 'K㷳p,FTNG 8Ag(óDf-gɰW /aêtdiիC9C:8\ u9o wۦ[xO.(aT"{I@ɲo W04gCB]wo6g8ʣnyqPD0 "~9VDS \t폤"鉜5a۟e\ 1LJ q(V,w)X BCGm) p8G 0|DR`*T,BHo@`)s)ゕrלNgҜ-:t"8~&$9't ? fw2 ,`8 ~ &cxޞ(Ґ*GI_FCX/s1_WcZ6VlDZޞ;ƶ TkG?uhGCaZ2N`oØCXT.&GpQҐV!vljU'3ܥ9CZu.Lϓ|;J' HR~1C9aR `l2.CBCIvg?`M}_ X,4 >8F jJ(ҠDGu|B#ԓ0?KHbD/ >|'}79tƁ2.^ي5gXl|jq8ÑwkPBZ]N^61tw9<89- onYA=E;c{"9>otƾelX݊e qiBCGE[Xo/-'ȝ=^+8A( ER ]4[p⢞0WdiCgK2ΰ%cԜ-:t4I ĀD ɧMԿĉ7it ?87&rm:нuR&VhPBg'{p<Ԝ`M~G&\ J`-"ghWu)۱y{asK3qu49 ;|A*$=AyavU ! s(NOT(Bk\=ѿ ghޝc% ˷bgnМuh 'J̡91^ ѹ]хҝ}l[s8E".]ӊe-jΰT]\ל-:pkrx P,yAY*ЅE0 &9(AQoP5'<^#JhSx@ȕm|U3os&+m<8\ s+|~9V>&"# 9D'/T;7eŪDHQH#U7'ޤ˗3d_62>iW~CƆ6ACZu!Y*Nr3VzZZ**$.AL+S-R[}kΔ,7Yĥ1b2 gh㥽 ֙m$~1ԡC %wWgON>Tr=R '8e.0[I#m1.0|~"}O SEOqZG pDp90Nn5i] ocU3nԮPBK'GuQ9&`G ~Pࢠ@ wE,H!qaDxf"E>RP ?d % Lpv, jg;ͱMS:X" Θٯt|^ՅK R2a rP-R=aӸ#|!9ac\ݭ FtgOF+th!Ա$"xz=< Cn "z_)F0$Qmo /XڲM 9GѡgTsS)^8g:$ΐ -:8"8ԏ0J5R 'i0<~`oM| W.P"uU.0c b/ K:+ }Q33xp}9C3Աw M+ r~qv2$Hy*W/*r#a' [Xd-e*9ٲQ ϖc9ê uhGtvv9A1 >q,ޕBb3bX1BLPtiʶ PXx}+۱%%hPBcH8 'y .琉_F\"H~! R@ĈH\ܧ!-d 3%opyW;VPs:8U ^q+qOîuh{|`\qJXDnJܘ:4!:t`lTZOF_;E8i#( ā*+nG 3<>t uh!ԱP .~ ~Mw3O.*D!. *OϗxPI-^6jӠ!g&rbN0ec]XprΔ3u= s!iPBfT1~8A=Nv`oM`PrW&'(KʚcSmׂ)/` x'*qcPq$H|!Gs+ZRJΐr 1tw9CR :t8ȜWyNA nL ʼnB"(fl^$"L;FL_]"yj ~a0$F-[3$z8C, 3Ԝu4 ',_J9AS >ypI ЇH#Na ] bҿaA%;&Ӌu0rFr+[8C+ kPBr{X'hȕQ>4ݣwhks(\0'wFmPiG$9N Ql(J9$ @9S+1sV7&3ԡP ^݆?]DN |v 9A ws ^I;HRE\wcq~aP% )d)pT ix7ǝ+[kAΐ- gؒg?9CZv rCj8Ka]9'9o yEc`PĢ-ʢEHLeGƧA?",a4剞;ܜ-Bo- gǚNݽ3QBxvj\NxNY+C D@?_+DR(H$^,/A$)dk23$!lmQ@d.Y5<G.Ӝ-:   q/kbte} T ET OקA9GIR((U@}\!D:z+{/>rY/R uh! Ҏt*&Stx3>VqCP:fЭJGpc2e5~+UX ]1ڴ^@pJ j!q@ؑ2&r%88ƊjNEj.&%HfECZp]`x67 TO A|uLDA \cs]3^\72op|h@sZu߽}/*'|SZP 1>,:^zU% TD% c0 aլ*LfDFrN*gjP 3 ^݆\tN0<aHĄ KHB-(#DY<E+u9CZnt9A7 M .* WJ]/A,m}ѵL5'`bId}6[L-³1\ٚVs|Z/ uh!< 0{;n '~GI8!I.\)P/rAT%4XƌSRj9ȶR^`7_H;i!ӜB`wo<`F8AwhTq$BY(12%]TtՓHsg2 ScX55W$[yUlzl7ӉUmi$s:8cm`9 88#Ex4a*rrS҆H LU!&|5A VcM %y1"c 70at1W~/m]"20s\g3S¿) gؖ")R-:\я?'p3Dp>fs`5aC"MTiȜZQUiiDPb* ®Np6d%żELH1WcS~T$݁(-)5a$PThb?8Aj,+pS5T7>}=PLG$PT僐~XKGfsW`U[6"3ԡr'ȿƜtN}3 R JA!qMe*O<; )&.c L%rc!X6Jug"\i0Gw0g4gC !5Np ^kW4 > $n FZxrt|Hڐb;$) O@BMN"I] g%DdTi٢́+3ԡ 6 U9yY?`1nAya&9&B[?Nq#X)6!|@gܗMvӒ20`ϱY:Ĝ 7w?= B A81 z: 5 >uN0 J@kl w m#z__'HэO4O0z J .X"J<[3?(6ZSU82]i%gHDXs9ٍC{ScC\BAN-~ٜ >oF 0 @p8-.=QshD/fd'_/o#疋`n ︞@T`H䥯M706-B`>oV/g/tf7 ̌ Z ꘇqfS9;='(Av`;F ڪԔWfLPERwhVU"ACjtJ qԻJl*P elqmB&X`.F,DI꒒ yy``xM b9S'>K,G7Pu $Te$NC$qI\?WG 0 Cu>`rS:3Y*U,ea):~59>I `sOXBb%ev\]ihI@k@0`0g{s%óe5V/ǜ瓒 ǍSLKϐ7x>w"8H15Xӭ&`e++qɚ6p%ŸE,k|Нgw 4VO tT Y*GT12<ni`PƇ.q7C$ 1UR&GB] s &S*|tp>>onY߉Um)tf hj03`ada,W{dZRj) %D4JEx#8~:`@8UxuFыo> 48wlsaflhPFJ'x_u ccD}33Z1P/2o)LѴ]dA"¤v;tb_ي߽ NlI4l)xBD {)kӸf]'.Y݆7^U2,$eod8<*In`qQDC0^5Cb}Va {EB9C-gwomq.1m* '>Z pD&\f6Eby@K?V !'Bg>v kע#c3Lߩi0tfpqt LSB/e70 EP %"Vb㱽fqE pF 3ct ~#2^ >wE0QW$i76LCL%f+J _| ~cJ-x_<hKȮDb:Dc"; HPI pZ</k .57NQRuzwg!sC \BU\lBʱwgNFOgF U/7 Orps #`X(.+o MbXchf0&r$1_SɋV@H,ra̎D/L sqax},BK9AAަ ?BV^U*St"4V*TU,̕m̕,̕--MKmϘ8:SOBOg&0 1,UWkP x \7WGRh4hؙ ӠQ :$hAD$c8A << *J-ū[[Wc̽(G^m~QpSwc,)?VՑGfa0[ҔSЈht]X b{% P9re3e 3Ul+6xL- ݙ3L5kaM wy:2c3B0{;nrm|` ^-yM~ B) נvQA ^ ͳAG%9>yJ\Ub%AAZB"Rޖmi*/"ePݰFj#t7OE'T ҅q"H<:C0;aqI+ܺlh3mBK8"*E/ăQ9[+2"(6 s(z.}S@2l6>y*m(JCE>sP=QDApC]p'n*6?U\%>DH#U㹺ތ0T,x *PC+'?+9'Y|4W/O#@0ta֯(h9(XA$(Ԃ3||a}|m{ASnFM-)|eXٖ~1j$5dhK:E? Nស97?*ljBSE SE \Nl {[љ;xhz:[jH 3МSFяV61trN}3xe˫8AOV ɼBiRJ$>+Q R\.\. 9Vs5eHJN..u~79s\#@kP#䕿$[o>N0 xjU/Z8Qtw;]Lu"} hO;S kBsZt SeٯJM?t: 5 >w;F 0qR4v1rE! ?F-TmB,2,`s`u[v IlD0\BH Txt¡ G`Fjɐp8"r~5cPhDٚ21wKb8Cg2%՜S :x&&G8{g{ /@1&7?OB_IYF>UNXeJAF@sAK nk5۩A"ITt~VŸJ.wR@i+`m WeP8&{F $wpq]dTm"HQ$_*4nH )D[ EX ^h[gTH "Ax߱xb8%f6Nple%'' >wG ѵ,x!:F4= $ ӌm.^dB%k-ҐSP(؀*@16bOL&uSs@ (ȅFcESND}8:SD5D$ wr$qqhPF1Ed IDATUʒqqF)1 "i={d;~$E<ҶM"^~AMW bw)s*Nt!kt-mvt*UVIS&OAX!-[ۓ>!CJP[sעKt2fJV SOO ?g j!<f'h-'o/s45؉$D.E'*\EP6&eE xjƺ2åkݑ-@Q~Ĝ'5gpQE_GOl >r9AޡxhAVXĸ(M'9$JWrxqj$b!.m`^- >%ǯJ7K۴*LW/` _ъbnpXgBJ,'wڨw|&c(#eL<41=yz~}ԥ]!."gu`j|}=gBЋ,9'27E7JIhT.$jJ @`6rs&L-ղfmw&Xݖ¥kۑ0 ^ƥOV;)=%߾&UUPrg `sr:gN xo}`fb}6Y)aN0զ{5ZtRtqT!bUDnbDP숒M"(j Kq P~s;9pmO*6wҨ?Y>5&n6`#0FGfJִ.2f6~(>E7rɜaMluY%'xmv*XlL)^RNMchC pvc.v'UhQPH^X3DTXeKʆJG1"›cy|0S]hOQ7&طt3< ӌ ΖaqoEQR Bc.^ΐ1|'&*yg 5Blbn~;TwA"q?r 1`1Z5eyWJFOZ ]fuZTE Iay6KL,bHӽ &3ptg e e27=xe!e200,d(_>eZuK)0;sJ`R98?re ŧ/Fϲp|JU:0N*%W NlصSa^Ml8Đ,}u- b X"`:|` ^>w J9DH|(5c@h:mzLE&{J>HY'0 8BBQvfJ;u˰-Ό%B&mB#Wqt3#MX.6KUUS4NYltHᦩdž߹מLyZhM"6?Zyᎉ[A6u]8+o >=6C_8Z1 +.MV /2$=.*bd"(N.tG 2$<"HAIqwo6n2gPaUm8wE ;XٖB[c@W8Vo\-vm\3%+ޤE0sIA `+You,Wޝ{b;њ69x{OeN&/^JoM `)| 7oНq8늠$s &srN8n%i$OAY? I!_W3|ܢ" oҒ7~8E&sRU?S`W 227"ɷ9UbPEe .z2fJU\ս ;7uI^@tն2:[3zBwMl7Ƈ3^ 5B:ѓA}C+K n;%" \0>)EHqAq)dϭƏ[ BvJ>%'Vz۹C] Ɛ6ZRNz-m5m=e5ŐIH߽#9lS*ZOCnx=%kq73L1nSggx a74\Nu3uD"{xX Bn)rAu9i PN) ,5HMHRbuZJF;D")!&8BaBd}u8<]B5gxCHx":g8ϺդI8L*'2/bl@+H!8uv9|sDgM;S$lmM4x61AP"ZBd*qQ b81k7,A}> U1:W Փ/ Q .$syo$ ^0Ͻ{TC`xpgzm(٘1| . 'Q$,O R2SNW o!r\\ %/*D$H2. VU`s-Ep>"Hɞ-PrlXӎ[p9ՙ+g(33<#awm8'` ^<:4 (Yؔct?mDPT IVk,!kEn#Z*$&R@ yS hRS蹼\9gҼGȤ ϖI| .@xcH7aWMZ/=ڑxF^<5.,ߴy['`ʗDJjAP`|Bg9 EY"BR>WR2Hxѹ d~Ep>:E"X.9g/Q<ЊR``r1*Ud/jw ܂r~m+H9B*LIq U57z Re"(;|P0-.nE7 f1McW08,rD㔴.H8~nbR)ʒTNB &D D{&$H;Y3.nR@@WLp_Xۃ4r>EAv B?1]Nsg9o`38 :=NP=O+` { ϝt[$\) <"9K%v+Y$!)!P˘KH w"$yUD8axRv693-WI-xm@Np>"8W[#K"xќva9A`(̃ ^:L %FŃaqB zy"΅6q\Ekt 8% _&I!wJz#$FG -G ʝ 6l tБ6\)&#(Y([\`YsD0kDPXdm~Ҝ*}[p@}``mo<.'<8U>lQo#{£'PYNJD z . xjEN+t! s!{oB;(9F= jN-.!_]Hcm{ k2Xhźei 5)C ?g>z mMgh͜ SKJ*sDph`n;`pq KrY?ziSE:Z8wVu Wb28%iPkAT1 [Ô\ĩeRpAɷ~`!&T;sһ |e8wy+Ye̠gY z:ȀjsXإZzu޻9wy td"ޥfĢB&I$z& *D5fW{+Y\:ϰ5m²9˷"2_%,({Pg:˻}V*.r/a41&!1@(V$&ylĦؒeÓ' y(w\qڕ,9q)3X{suՒv "ih' RxZb/ta4VR'99<"rdXM b)ve]tg9FÀף`q08u| j`L4IdՓP%0MstA9Hn5SjfyE MvtrN& ='~wX9"xj2^>Bgl {S@PVG"Plt;%E in5ञYבAw 活ns1-v9/U>Q!NbAL؄c)08,+[pDEm)HϮ)ܾ_HN4C]s8dN~x[phiE˸bUgJVҊfaGqBg  ?gQ'8VqN03oHP)N (0 pt$  #Q49 5" b2T7. 4A,[ѷqCsYŝ8j^aAGY|˜Q ?(X XNPu0ɂ(2 %1]@tepǎ~ln>FtO@;\MuMU&uD](iMK ^V^&Z!ZZrBw[˗v\0e9cLc/J8@2wdPm8mpǀA e/ߋK0Lg;8 MgL}y=4 IDAT)ѻY zu ㌣zb$:>;_<(c}h"$:8՘5LIp1F>I*)ç3UE7Ibsӹ)A$k.}9U&X'n8~ Qr&JE,,#00g)K8.EAg$hML!j5)i*A0 ];D . ?gox.sPenUgt;a+աEo`W 5 2.,YH-:V'BKϝ4m;e2Σ gDC^_<naL1*.Aը ZU~˰DtdĄsKCEm-$w,2i2Duz6+ӽL2_?'#W3|f.8.). jMg8iaRlL'"YK:Gc(嶷E&#x#X %ARiڎ-TYn@ʩZ@E/)|mME?iQn|Ë5ɉ@$Q\[U } Ց)\Zǻά^%[~) Gw-{VWnYiEIlpR@X  ؕb1 NC~՛J,Rm*DI`AGŋÕDDT #y2K10ܥ)5kkf? Sz\$54EQ@R&j^DgQAL0qN7< 7߃gB|O.{#>9֞VɄᄂwV=F5S;FQ-'g rX7:23aȔ+HɄDP"}?#PP#iQ.\Vˈ5U 8աMtlq=ۏsI3 Gpc%L >cMCtaŭ8OR u`u0pʳ~G)gذ0Wlc0`9j<8m P"IӠ&PDK3򨾠߸~ZAҘYjm EjGJ="4G&]!tg0WqrY'Ɗ8Ž/ W0oV涣s1 P`h0L-c`4v 0j\kx׉;*?o9n)r?ed3n t%oK:CaC@X ~E d~Fhӏ~Yᖧ!A'h#7$Kg 6' % i`"{4a G%8!S4<0E֥bYn)~0=xf(:|nԋi6Ӡ eX& `ҁKce.c*q;qh(gp;# jt'z>pXt:vLX).|1*=8a"X\ B$P!HB_Q_ k$ CX}9 ۯ@}F (AnD- 8c~x<F"}[ҸhmO@0etǠPgͿŽ=ΰn!}*؛mkiuq[:E?A'O1;A/mv5SqzDbj"씢 sEFuv 5]2Ej0`bR zMiqţTl38aX.8='vE)2KMUաIS `MաUwBPq?z)pCqɇchV?CY_uҊޕ7bDu?,\ٻe-زzG uͤ itBdF)! #,=AH:A zS UePBo7ɐɎ!>0T10\!P]]8z~}^N E0IiZ`\?R-&"xBaL0c:Ҋ\Xj#۷e-ƅЏFLNAaPOq\:% ꡘp )i mg q~"0@ЪC2*Pe]u{'Hp*Tn ý' ܣan{,d8Z)lmp@0j (m8/0sB?C2l0,dK^}F+7`׌.~iz؈}[ӒlvK=tG83` ~:L[)ʹ$(ZR򧄊+W"^NWr%&\/mǭ*Pu hݴ}T;/m47U p^7KsZqjF {󱃷÷ٍkӤ^,aT&:` c&U(S"oAeB00=}߾O,U)k+~oٛ?Cj?J5)gզ?y=~#ž:1f7So0v jH:4~:cNOjY 6mʚ!7%%XDy2qK3EA!Wkr9( *\)nxߨi{$C}N7Z)gZǙjAs*ؔuk?1#vDzBFJ `p3{pҊ㗢=]ee]gnjz>v|yxLNDэؾ=Wlth#uWmq08O'X,=oq"CXijf ;IB@f*DIuxI)EAJxR"$yYN Ac-UAbQܫZm:In*R4_c.`c!מq}cEuvdv$8 f2xi(.~ v+;e`HvRLWlrY]y߻v5H1~YO;JIR*hXJs_cRN @2 N=7XtMP6Iu)ʶIPl~loJc2X#E?JjWีKa@)i'IO5ĤCm}xǦ_V`oSahɾ,.b'V0'8R\ @@ڃINOǃ˝А#!UFTC,8@!hHqӹQ Y\2 IS*m:D[sl+G\RSo2BH.z88%hUߓYƮ¸h^ BV@vwj :CP\XgwFlxW:C' iyMymgl;> ܿe |;`i gB'#c?9EwQD~|jbtُ/* $f 872Dq~ޒ*slwI"F2[kJQ+ >aG 10 kU9F0 ]3D 1} H z'>8K3{>gXcd1ӋxuWx.]}SڟݳE6P0=t4ƈ:?}2bhHDJ " ٣@jHZG=h~Es!׭DQr(-.b +K@49 RY do#};qmҬCNG&M#"!:tC?6n 5^[x?YX{9y2;lһ?ld}657=[\y|"mQpڲt:۞9_4T9DDJdI5(( eDE FT93iS8/n~n k?))E.\#((َ?t 5*SmCwp٨:n%r.s0r4ѠIA-LiRth 02+s{}߾ Cfs>-%g _shWg;%+ҏ%i\ .·B š-H8 QJP"#Kjhz L`ԬH)GPT΃+cd-8qi]*A+*:>q]5Ӕܐ!HZJSݾs)#E.3V,h*!82~7=9?'(*l 9#gqM3u2U7;pzol=y׻b i5Gs6<^ ] f"t ;J` aEFwA !Ӫ% anFJK28ܔ֖Tq]ȼ\( )S1TKzc/ aZ{G?% @a34K&p#:0,dO `54,?˶O aviE83XNiAUrVW.]}skpHڣuQTH|j?ye $iP px4MXҠx>!EXS Ufˤ(BU?hw SCm*ϕڏ-/p 8&A^.³!(^-)QW`Q/O& McVL#!zzБsQ\WxzT:ñWM u?]R]ͭ?^v nzWo: {8q_Okse&HsL* "b2',U>Qb"l6PJk:tO(`GA0E@0+0wp`oWp?hњZq43!4|/p8.  ?y(xu8:mp|i]9͙/xݡ "P'OF$:pتIQsTBڀM m 2EKtafD,f YOpwl-aœ"_`kX ĹBpp܋j2em'/xgB0M VQV /_{Ca`ΐ߂<ϯ*1B{t83g/Y}yzVݰ%g|u־xɇ(X՘.%c-;W+:A)H1VippLD5$]a(4b5tؚۭH;z"`n/0K tK- 6!Z K][,[4e; XgPB0eY~\p:ܰ 8S4%QFq@9- uR|(x:T v0 ATQtm 6-+/\]V ڎZEU.aZW?3 ppcŹҽ0Z0Rqu#f IڠԌu^A 7ueܞA[au0^ӎ.O>y !4*iDppa PqXy^,~6j*(CW3tI- 1xi?ϺNՐ˃=iQ}IKhXWb$sҦ S+K&GsK,T9Reޡ^Aau.{1/I7WBrNEBFEe͆!%2}=)YD TBG}2$ s(1]+Dl~lpTގ["FcIN  E?i$'; xToPpFO0Mܾqsfi+UQiCK% 1jPbkV f;"(&7tr'IP^Ap.7tБd$'X5Q8Ge%y7͉`^,Mމ%mA $C0]h 0 Z߾X f28/K]w29$+'BgGtc31V tm@$z5|˃}" !W:M$<[ɇ`0>.-JiӧS J-NMGƋ]g]h 4f 84q8KBV.262(bЏ=uPWG:ۍo輻<Q=-#aA۬$v \0 P i ]D76!5AB"NՐICr/R"_7Ur[$a>yE&'UƘ4.Kʤ7QkN~ `ϓ0ʁQj:ۂ)! +]-&0DwD(MQ2`&^mf)(&ZS=.u KʼnE.:, +)<O+9?HRt5g(/nE-ҡu_kdxgc8oDk˹P(]%|bBe &Mn-|Q4h0S] EyH.'ˠ4YS$Ͱ}%Mے_>ԔXjrsd-|c4'Hɞ\&(! [l>&=zRDN>h#wg* RgXQL "DMi5Qԣ>-E" XXW>H[$+ %-Q _~x| 򾏱?tUҧ̸MB0mӂ`Z ~ʹfq4^0JX8?g#>38(2ne55-W`n SQo$DDh s4CyhPjuk~lU #]`KI)q t0< ިofepYַLXl d%jD@6`!sw!2x^%G1):9PLұr*Ֆ2L]3Puj9 /C*T$^i] Z7 E+#_5eaAf<,nthfhݔ`B ʿk@$LmA9!h7X:mxCqzm8ܧKM`^vI:ax=F*pbO;3Ǖ f!4`E$NjKQh <5}][AgOMOGWvЖt?EƉJWy+mZBFi/A$*CoMߝ2);`;yi A=Erl{NN%-ނഁ ՖYGڕE/"q޹jA3b1LoL 2Xmxݎѝ dk ( c(a'(B#ڙ;èHS1VMuṔt55/7B-G'WLvXM6A0H$XgWg ?~ ~^eݤrB((7mLMvukW12Z"(gx2 j` (ZKA "5o_=~8?!v >NMnY[lRCy㨅A4 ssMS%i'mW` Y߿+qC{bܓV7%cŢAsZ~ L3-/EDFdݩ"!F^ sy;#pJ?[$lQ wGH'Zqkoe"5JZ x#"Bp8'e\?8 1=EZ:w'AދSD Ai@ if@huX@ NZ1+C2Ey4\\5SEGX?AK cU*H'ZoM *]-F_!X)3#tU$eRxEg{>Io}^ͲbC@A"(Itd>r/\=ÅGub#TMBuRҡv^֍ &Rn D/ZXz)0œ5E<){1JNT">,(hEұ#HB2@]Ɍ K?.wЫ c&Ԃ:ڵypE{MAwJ?J@8m>~&=ʉ0;~O| ~xQ("x7E$дZIlW4p(Ɣ%Ht 7}^L;ƋGYrBa%r<zzVo?!Y9K':G߹z-Ҵa +/[͖簔 9"yC!Q*ѩ:AC uXu*0Wmtg 5,Y4T sYꇶ11 sbFtiAp&Cto! :k8y\"w1m>\ƭ[{1g 9@>]$a#lnB`V/9˺.xfd3N#t}q؏`Ѫl`'Mg>zN{>'̝Ն݅7]-uFAz(PJBw\KO2Սi4]!-@7Țbhpߪ8;-??pRM8 O׾'-`~~#wE{֭1}[=dFVh!,Zy=F_K+o[~RcY9}wA8&3NP byy\|KE!(تN)w2(\meԫ%$Kd,VL1[ҏYK*Hx}DIS֐f/)ЗP5BiZB:Vso :" t'/ NH0T\qw,Kl#ڷVc϶ m0e<=;َЇ+6/Dqդ"8}!.>v> 5mF9I. *76+BU VrPu&' 4%+`[!"U4?ǒ!Y ]= 9)FT^"Rm+Ӟ NN0 c¸jmN `Ub7 &|\A'xi[H#:K_`uה𝾛>hLuԻrS N }[RϪٝ[!+ᘘE#G_G6/DֵÐ0E΅ F;r-:Kxu x ]SӔ"B&?AaOfEFl+/CPw`Zea*oIsDMI"9It$2֭-=9P1<U ^ ^ ڲ.{Ϋ /8n^q}߶ ߲&Hww7}O2 MD=9 rJ՘AAD\(Z:=!Rb6neč 45S~Ϥ5KT"3 J[В.} H-N+m1:A2 >lQR*k'[5Soȩf؆_-f5[(]b5#2.~>|dS30:5g#JH)'kE'`]O'!(AP YCaX-Jl  %t]zQ 1̍6Օ5f6=no֬L-W_E Sէ^='~u' %~xc Zk F7l]ww揄YB}%؜qj}w=lO4+6/ p]/{-A9^2Aը2X`dԫ5Mp .$a񋔺؋amSraiHAJjpR 7 ˜/anAgw{{"07H鞯ߺ~]ʍ=Ǯ+SK1@;]ɻx;ߺ60g m9=XXaa(޴o; Xo‹̓z_u Q%EmB7o 0'9MR% lQ,_LZ<]X7AHR' kLW%7oAp!{ggOnx[Cw!;6Vy l]WFk:]ZU7b϶u[GNV Csl%J:ë޸=7K M ۓz^"!7Grbu:x(dl$͙˜%S<57($A Vv|~ynpAP&<L31=ق`5P'xYoK^t2*e}Z ߲9qj}ҏny5a(_pc"$(B%72K#Y%qsȅ(Fӫ"KhZ6@KFržK=BI>bwo砐I͸9b6#<>5#AJZ$#=h`C Suh=a u]}98yiB߽V`}tu\W[0}--bv8' ]ؽu 8O= ?BgE(\%TJtCU[ mkBa}kE%EQ%@!;C++'H޺$ 0\q$x7 / CVw& MnՉk6'nxiAuݸcoMlԦ YEпu3+6aէD B\s `ϦԳo.G# K3\s"P)iS[VN:8cq I)B[k'Xw ]&Ը -LvM WX>n%SlE˭8SOTC ))ِs749%zn_ B'x_=t囙>ٿ} hl`z^;B= ,/6pF{,R[ IaNȦ}b똹gjH ՄׅMOaRc:GJP $\%"2T}NI˓admK7:zǩF }? ҡS+-@m+uI'X:==}ٲ_ꅯptMxv*t-Z f;e&MU ïI'nxb\pT 3G>(0~uJ ǪBL_tEAb@Ǽ$@I:%xۑs~z- /E.}&S]&vqɒfפs Osc%bb dA0հ ɚf.n- 8 X$ZTeپūmv  <m& {UXzǩ{nn$7xtU)S @gGu#a"Q$< `EP)r7!"JOH[ I,T ֬O6i 7 ش$ȫNcQI' 2ٳ}ݵW_ַeCaɺ{P>K × Λ7?V3,V3[c%4Gj'(DZJB4}= #b󲕼gE) IDATrcSċW"ȩ A.N%4PɅ` v *Eپ-K]ݛPΛ7ТخW1(Fg7/{N .do<"W4#n(P):7Gj*): "x(sHDDpih9EY#ccNHCq%8cZLԁ`")I:S&^'(B~۲h6" ;qZF{U\. 7i1(xX1TkF.G бRYZFL7ۗ DX2lc]N`ąfەETCTPl)vVݪCd*`bV.SS I! ,/vg]u.K$V]ܼ7~07os#glDau#~͋qq󂈎45Ҕ> ZXZ\߭Z< T r1i2PJBeYQLz[lNY%?:Mw=W'7kN'ao]-^t:POa"?CgZw;7H1hQf\1al^)oTVrzkSXNGFʐhbi8^PuRp>kq_h]HrD}Yy#t }[p>MaCss۾G3|Ť~ E7o=<:V).Wڹ]GF"ud ddUQj|L=kLAV Yc_ή3K:o4R'}a{~>O3_#u]U Ci!*%@I6>C'=5$Ef\y("“ ^TԠ1Sk!065ivԃ M0i@0BSSP'ؔ a,:ÿy!% pdM1ɭPkI$iЅ Ȕ%5HJqDVtf _3tݘHp!g3h<gp$8$wԁ`Y'8? M)lZ0yd!|CpI ?C%:v0OP922ChD훣@.@PKOP E^S8dTj3@0jM_T U ٦y[ǹ@'xL}mtM Bu@a~C"_ H6؅ɊIM)&So.pSSkHT*@yN<I$y+ I#\'(F0 $)mS B-dEQܢinZm ONAР3 zU:~R\~d^LyrF^3QtåR J7,ZҺRJ I1xt;5siV:!X)Y'iNp݄f ?'`Vԃȃ J v!Q(`ӓ|x|4!sKDCaKW".D Xn`-lOP,!9 R-`.Ì & 4il zg ~:mG֫_?@Eg88@g2x1ΰpqJa^TqEw(Pne݀jKCaaY: a8a:C?Zgw҃q?0%'40΋3\ix\=(Z²QL~-~2Xem޳5CPZF4IO۴xFɢ)UV%\(N0mAP Ni0jyAgo><a" N*9Ͳ\%4_?J)z rxd=\)5z67NpZ>2#}BR ?xI SCLwlsn"ګZ)iuXD]aLcIKUٶ-ț)$%L&O1Ӵ XQ5  8o1q:nR 4 3r{#3Do; prg~d{IUB34T$/E(: $0ٗyLi[4`Pk`nǝW:A>:5p{[z-f ^oNL0*:Xtwte/ /X?;a! ,?hqQ0Ggt fS][D:!ycCG*EkXw@e cQW::i B j pU ?;S^JMj,=`7,+MS4V*GC0R`h0"q4( 8m (פ ^ݙ ak{ct^ei{\7UQIf%"6!HjWɃa -L3~Tkt4@'koˆSS" Eg?[yk:4(ԞʭHsʰ2 NwT:rFAI#zQ'8 h!3PU4oA ӡ)u%?|?AZ)V a(4:^eiP j'Ǧ֘Riq~RҺpR A3 )/ҧI{ NDV'؞u[|ٖNpfhΐsB{R!䚷/OR*I`P f BT *OX0#g2WЫ}o4k cD¯V'xc綪Y'/V 4 G3r?]p{Ba_jmFr $gW-E8ж XU1q4h&`C#$l>ɠSNn^E~cc0!PvycTOaGX8}G{sr6\.(;R~N52 X#I6YqJeNU*75.?Q:AOJd ~YW,+Y *:7F!O3ls=yz:Cszj,CP}+NF) L ;bvӹdDEpT XkaLXԝ^' ^7t3" k3:/_x$>pj/ q:@Uױ-: B͢3 g,Ř Jsk2ΫcK~f'^%(%)ۤy88u訟I'it D ӡiuFڧNpƃ0Ag.O:S #KPF ֐4Wȵ^rd)/#zT6CО5}3n&SE'8tWTt[:~ :þ :ö*t_zǑi9c4h9cgcS4R!Ja:0 Ӟu"+ '=LMSNP'xH:A4H'O(:ب6:ïh\~JIZTnA-] 15DbfBP^2X`ᨻ= ddC!t& &_t? \xoU^g fC*&F;ҞɝLcq=IHjFfvH$S:oM]t<l2,3+D3y w, A`6nN0QlhtT`;L'aDtֵPat6LgH(2^wx)(APpDVZFHJϱ K$s,7ɄlOg6! lI'?=St-FpҖ+iVUN\O:Cxyߗ)j/P`]!XBWq~K&Hpq@gs,Ӂ\iAp h:#KmNk3E'agז5X&i5vnYݟq܋L"&L?"AƀqlO':N7a Q;aw8r` ;Z:~\>zGq$~۝m98z!Vŧ!@Zaٝ8ucaW:.~l?^xm[D5ŕcJ$̿d 8왍[WL' ܇hy:*NpU~VD(| O}{Vldٓs3g.:Ce_*^t %ItW[XR9 @iK栫-7nFz”(eLNgTe$XP@*uY}M\O 233c`kc0?F y6k+<>N]^SM4{rnn2 dl nș8/"hPL2+9'wą[~ߧrք@th}N93 NvD/~\G@D@:[_/KcVD}vmY8-W4\ a3,,TVb@A- -898tn|SA7.s0qyߞHJvUgg{IgxNJ3ǃ; Lj%s;p8$@l]0M?74DMD:|WtiUF|Qyްw&ַuȜ3/!'z;WT ]9<{?}⡘?XM[{9eZ`":Vxa͛@ 4`dӧu ?!ct6\aNFJf~ϐA&=vM D?CPs4Ņg*^1}@H5}AW&00L'=5Eʍ|R͸ |#3S:L ,'h!ڒ +8Uy-oG0)ń%Fuz],ӖXϰ|gxZp:!M&@32Lϟ$@e:Aj0QN|#gj}.7}NM:>>>Fn6;9'j@ajJ3\{(L uqއijlXE!(׫rI+ߞGQr$p F<Ɗw q/APohj4М^VwbpNbӝbp4⚉0<N\&墾Յ'[!0]L]=9e6 ^W=AX^~JqLj#Mc"nw3hwrrBP%o (ӎʴJPCgŻ{ƝYX/&k:t$E@8^gwnP9 @4pŭpt:Մu P(ӷ_||§V0`,/h*ӭ" 1&_w>~rYw\DiP{˜hvyBGL Vh(o~`t<ผtl-S"{uyivYc'C$& 3u{# ?'ȘG h \D+\nn¬|cB\9?B8o8Zr/FR@棭#N-+>j84dXqӃMxe(A,;W~O',M`t\lqh= >eBg59t}n$f^g;.5!h&??s*2# )QI`0b`U\#2keW*GGك?>]M<4pX -EY}+HTy̫cyK /=( | K~6w'HϰCx)!ah@ }R~PE`@H@qv?yH Y3x{d#sa> .O4z51CpdNû'}[?Ady᠀ɚ`-;YS( -Cs8 W [V:/jӤ +%^y j/qЊޱﭞ=TY4|x\M f(oOPV}ӡ{Ԇ!\Ope#ϱ2yAxJ^|Q0+͆_:8h$ ˹ j <=o7!̤ ~fH;3\UF3bM#ӡNvd-evٷw!&i4 PXC V?j opfi6 >;ᰣQYdmPzh/=RfjcGx&zOؽ_&sHς1È ;BP^ӹ0U0.7]`'j>HD?#` +E%8~eX}M*ZocNaDg+sz1 ݯ,Go5y۫N +/y~ϻv=p ?zdUYؼ@%.^Y @p _c,\F^g{^0̖7ϰ xo|qjy Z];dz_HaNk5[w,X_l=gA`FG>{5 "B iy ?` #X7X H ? GT5:OV 34lr6Iv'(þv[ŝa9X 뱌BΗk>X &!%A@˃qؼZ Bӡ+݋HDKWK Ke`bC~ # ;0s(gx˄\49۱fHBІ;#loAP/džO@g?AY( ~; G9<'H $`>zq}ykwnU9@a,0LYPw;]k'FNFJYhahrzX3$? ܆ 3E_gm6[vnu&z簌)$J23|x!xsjqm z?/i+[OЄC'l!0I3\3 ,"O@HGgx#03n.Ыp3%gh &9APJ<`D;tyE'O8`s,a @vP3!gȰY$,۴ ز6h'8^ {(=<,yBJg8{?#Qyw xǚ"Lu#>VDB0ZO6q5fAUC E%8 WsW 5AA7Ȋ4=P+,YQ{ߞu+EW0>&AHU0vD:ޜwM*[5Op}maMo:t/]v 2S_S3\NjՈguxWy hLdRO8+~OpnOP4ds<4) 3,#KjX7ϐ #()`hacϰǹE`B$Gfx{K'H!RC 3,a&{7{Iwϐ |`YdOx{k'Ob8Xb(Iz).±N8bAP;Ʒ``c]` F=~cT8#ɞ`\pJ)PLM3-Cy]PS˲b mQxwhs'l&B): s 7L @H!ͭWʑ7ޒ.yS=kL 5gCV~pNq[{za h!Anh{S}AOpGH'H!R(h; EspW=ԿR̜v&U` 'L3 a%]4<2|᝽)B %$ dڊanfg؀F ' ܜ 1x 3~5A'/rJʱ gkԢUv VP3|T}E3$vye`y!Z5J{VAY:dPJ)o@3T#x<[:d< nL2O; R" &ֿR, k\_G2mv.!eţGWZeثOam؇_> ^"_~ iD_DGX_ XƝv-gFݏHPEH$Д!q}9P밋)2~3dGQ}{t3< XPNu?ZEKh __@s(x3oM O ıNxCc`O0S'|7%PVR|Bx >3*k ?a^YX애ӣLSz]D'XA UJɲ0f-g\>fwJ cPWwsFv D{ lr}uOT0BBI{.ϰ_ݢy"xjsQEPEH$su85%MҝJ*| `}(09=_teMQ`v!t--*AIi"+ՊOo4d,g/m EE iu(@H 0yfAV؟LQ@S W]T1>/4) b7݃'Y4Up! . 0xMD|w~Ƈ"H'H!R(XhnU,.W4Mq݉z7pAAVĊMQΞQ8IbKikcwgoy+]+A B0jјeag^*saT!`D4w0}|>~~L̸n$yO?T! ƜkP-a/K0xPc?Q[j'TAB Pt _ۋ1#w\_;*PZQY"O/ض OB"j2$ ϐgZuIDATeUsżu;p $+!}PGzrB` v? wm0,0&ͳ)Àgiae|CUydQrTU N`}롓[|c @y JXjx +TR)A 0ev!FQ``[V0s(|8\}qFeg"YDH8j@ӠUӣûRK@)!`ɴ`x(FjE/ Ų=2]ePQɰ#*Ad>F Bx ײrSO0@v'֡ARtԖ L{I*=X[>CԜ=*4+$R(-PB`j40 Hŗ y>R&w((;Zj=sk!N]Lo1B P"`a%fE_ AG,\7Uih iR/Sm8Q[.X'^_&.XSԔK)|obCWpK/Wx o޺ptewJwKf=`*U //q/"9紒yn5TR(B %䖾Ջ૰%kUVyˋ9|'_JB!R(|9UI"k\_ƻ`Yp)KI\f+1n$8c~/<ȫxN)ކӿB!R(q篃 _,zpfi[#pAPPTvFqɀ1{c1}!ʰFŖ p~ T ty@Y8~1 BP( BP( BP( BP( BP( BP( BP( BP( BPx?x6{IENDB`openscad-2019.05/icons/information-icons-question.png0000644000076500000240000014761413402025764023243 0ustar kintelstaff00000000000000PNG  IHDR|E pHYs  tIMEC> IDATx}w]U)H:ҋR DGqoQqp~ :8"(B !z=e~ܶZk} Y?r^ycƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cϘƌ̎։mNjbq^M<^IpY%`(FTB%Q@y_Fr`18c92D}nY7ۓdWS0f1cn3~qo"5=k:M5$0jX=ZU40h?cŰ;ovvcyƌ 4f,` NSRrt <4`Lz]j' lŶ28ئco<ϵ_1ƌm}!'~<-|3A+wNۭ1ƘBcGxI1LNRPdn[a#z@/[ך)sk 4flN[SA4u*@K;3a=/x?&YǘBc56-Z`~ˇ6b71XfјBcFvWQO:'h+vO!V[b1c69b <c 'Zu 4fLjoo,C`J{򾳽{]3ĘBcG<5^su5Wec]`R-\c1W-,{cc5Ӝ> v#$?8-1o[}_ z~1%P]V"T$J $(IQ!!f1, 1kv89 9AvЗӗCW:t,7LG`meV9[ OPy8_KiQSj0k1ub9&Uu%,$A?7stfҝFKw8Е޶^iAwa‰Y쁦ΉOg:-3fظ_$Sq[ q 30or NƜjn¬*VϦ3Ŏnlo֦.l9Љ;@'2y~[qy 4vȭawg+l aX0LIU[숀xwOӆ[~W+.W~IdM/X1&, %T$xFn X<M]|sG ^ބW5afI5UUcSho7m}M.y8i$hq/1|7:S3fب/Y)0{ׄb~qT> fWu@g ޸Ͻm܃z˭ؿ81Fd7Љgم߽ټHx۶d1}*%%T$qqE3q)/6h[:7SoځC_a-2fИnYS,b)/ƅgҥspֱSC 6"p@DC16,Xq!aCbHcS?xy~mXnۡv:<'}vy 46d3~q_&@ݡ8"\|,\l.Μ?u\M6'>&96G&dϳG.: $phہb@qBq$n$a4n,Puv]_`3Qtd"CU8cPÄ8CϿ?&z64ӗ>m&Ǝ(#V h>ui'겢?99,G:χ AkXEHpGy2%1L,,8&Xn;~Fy^_J`ߨxC4@hI{,%I\|>~|,V{Ўs9!oN 6"?@L?1 rwDHX qL.O`rES**絻?z~#w따Yn~( 4>+DnpfEp9 $?(l-# 1=7vE  lTcz"{_S]tW.y/ p˓T$1*Iԗ'|p87wgȞ|3s 4~k~j_A*H-\q\˦Ch 7=&଱<+NU؛ؗqAt$^.8\0FZP 2 0@ĠQF!NQ0TaƪY*J7tp1,/S1wbɨ^ތo?2a" ;4,cuYU'esGeM){{ltf{N6j }#+EP%Ps \.Wbf)/,roqmiL)S+P¦}uۛ$Z^c&(jonep_D|cF>!=6C9;iJ :Sl~8;,P0.V6B%w ,@Q_,Ie8sF%fՌNۭ_ۊo%lksozTկ*ݏ1*/Nq(1gіqj) V4n8?$pSogaa0z ,I*Rв'`FUΞU#6ds<;_EGof^SNob_7ͬe(Y-kʑcc#`eK^+F8 R6vH)%0ȁ.=8!Hsv!,0,Gg7#*FJ9yTY8{V5ΚYjY|WgA-ݺ`W9 ycS&[?kj{@=)< `ugQB*A6`K 4{ݜmNC0-9|1O9}FΟS=M:zwXnn~Xo;z$r28wሚ{{<$^ɒ|# TA,XICRud;N*7ÒdT=pZ{MPau0SOT|Z%.7e#s?Vwl&YFX}ߘ6BcV{C1+ ];nOo|44@4 msUɳ>IDU0DIE hgAB&$&f.8/>1<3qDqc߆]ޱb״F3 4b +Y@~1鵕g > mfrta T펓`"(JR\6XONQlUu.&4%5DT 0+OD]~v4L{-S3 4&k>F`bk㖅U-^yR{zl.̵s%h0znP>.]6H@չSj2bب$ˆ ٹ衒puΚYͯEe 9|mˣ/#OŊ}d 4%sjw}tuﵱ(( !n 5Ya CR47. IpC]ԈOȝQ}l<)^Ti[/[x^ .=f"bjG<764k\d&@G56OOo"f Ǘ/[DZm}:H3upz]ә] X @b0"p ;fH|RZIU.ea,0jV|NcTq:3!>;_Dj^έ+[U3 XNnzlpm9)# iA&zCRlѐZ'ua$`bPX6`7E/-0@%95~dTE=V|DW:;NNJ]h 5X=ԉxdVC]YMym.eQw^sA LT@/ SV P/x/(="(JzCa_' XqSHf&VǰF1:{jT-[lfб7,3LpY NO2̪v屹F>uaݥT"Z7x1"`^C]wT B Ѳ9` 'Xa N v.lkI(ᢪ=txsgh%Nk 34@x8C=b),/_ (IFSrՒCG(qLPB /ꎁ EF}OE% .N{@z*܍Ij>x ޘfwwe/Obf1E30 ϼwO{bQkKˊpYD.{zlpZAQY``&b ,ݢ*@C/4%@N_1LƢ܂")Px/3gUs˧x$v Jճ%lRaF>'wBT8<ﷶ#X<faq"N> Lm59ʖ2)uIO{Vs`t_x Sg#L6'lhcwdDi2A9@Hce J{ 4Y#2K "DidEM? ޳>/zn,m@EQ\f8ih5T4™IJ9y~f8c+^ Fݜם_I(;Vk9*2RU(h(P4UD>Eb]a,P׭$&ĚnGyݠ-.vszA0EHZy< I̪X85oD>s|iQz^eg}  _uM}Քn?3Ҹ==66zD,P C t4 } I)%DCF.d`}<}#a6z{=ǭ+u-ܴ:i^ײ`vل?nDWƉS+]&V%;ёʌ2,(.;:}G  < G gU}9ͨ= \CSMb!Ft<)< 7(d(hT@!{ ($[ xvtH [|i}Hf(mS VohN]X>J[>( ]e \{w GN.s›-99҉ZX۹0AC1!] 8tO2\hq bo^\CфhB y&cXFC DI#.H+& tPղi2#77SɲNݯv7'cs< S*pTmֻ~t;u"x};0KKNk7mʧ7щ?lHA=7X{LKZI\(sVU:D*%)vъ S ҆ Z VIȞyHD MPCar 7 *? A]Qއ4V?lmGQ zs'`ь:]m`h1xS= }8pؒ19 >H{̾^b"a3mu%hY `/8mR UUn:5  .J+V,j _<. .(tdT,;lZXkx=C[Oϭ_ىޜfhpa>TKv3 nn&F _s*n| nx1[:e Y`̙Ihq06~({Q: U"kt-|(g"o8Fh. *`oRh/FM@6GMV\Cv'xύ="7bSK 5QdjNC5O붍4f]o.K! Vj UPTYwvJ1g@bHX 1-9'9愼CCwsr_v% ^OAt l, ܩ Ah/ʦARRB(\6mKBs>',6߻8ZG_ق[hoikP`acUXo~4maot(|dܗ!ٞ&FTQ`}PPd(KPPPPP4a'fT0?~@9pt9hIѕq\&ڭI.{#X6MʦARR¥n{@P}  X6 \% =ۀ?ΐ_kzo& Y~>z1[Ж^gdeTd}B S oAuW1L,L*L(88&PSG<}7&DsS΄Y5Gs:T-)ͩ,gymf~I5vHr.C2~5})4pcpE(A2lHN8j)ܻ%.YTG}y*f[#Ai@\ 8z ݕņ4mI7|&ȦV)a zue""0CP5dlVޑݪ̨#.Fxz>4w^]pėO4\?ɢ~JWjm@ D"@$u/L]Wq "@wC[Y ?W0oB1Nl,ʼnK1*ڒL8aЁWq,V'$<'tdW4J gb4 A6 ?K#4@ՙ=t~Chi.:aYM]%œoxwo.Gӗ t8[rޛwf'\m0|l$kNGN=Fk)nCw #V&- 3[CX. 0'O)â4Ň+z<&! W2 ?(V?^qœ%8sF5ו17Cp47zFI{p4(dӼeeH&Հߗ P:ЃqƬ R;zeHgJ8i|Z6숌@XދhHk>Ek۶VJT~!IŠ}.E N@ K4a ꋱ|jW&QBq@0cz,PA&js=%o8 ̮B]Y-yd1:AaFO<5ʦkZeiaJwubBi'L nBEIϼ{$pJק 524** ҲSV̙UYSt>T6 ˦]Q.Agddi < P]Jچ 嘧piݭ#pOl:pȊ^X}US-t5xF]eIY,6IY9 KR͢xtW]Qt@70ƀ95E7IKH"@ $k8@dw~-?o  Y--xuO/8OwS.& xcHb$Mƙ M'h]'Ir/u8ã-by;źM#%ۜ8[vGT#6zW,t|Q"e9Yf= Ol.-vu]#˝*O$?&ӦaZeE16& \1*Swd Hj*]",ݟ8%X>:õzi2pR˦ -lU $|׹P=>~||}=@R(ab~ԐCHn"(p!Iq6 &!9en:1(@DD"H@u 3(Mp, ,TY楥A2ٴ_RWl$oQdCAnқ[q`!u1S'Txd3`%*nmӑGD~pkN_of uIJn*I1OԢ׺Zx.Ǯ,aԗCyVdJKh8J eI1Xk yl\apIba}11 rޙŮN)4Rbafu4aAC)*1J#ʤ%ޗ+cX`}tdl/@6m࿉hH: EٰNYS?r&&CCXs#yO-Kx+޷2]%*tэ_^>WPIr70 cI!@ ^=$,!%qӧaŤ'6'l=xfG6fМuH*xfQSp!r7K+D@[}ӎ."f1ԕ&\N8<gΪ,d%8ea4pB&9͑d6l?֡~v7 fƲ{@g&#O Ք]2oj֦B]cuk6@x/YOPD?%Tp ݶ *gz$ 8k@*-o<7jK8gf9bPV8SoԛK{Sxz{6e ezH}/e u.hIyNTD"m=dӑPȸgV#[7 i yA899|S&?r0q>һAzyhk[{54I>v~ff /xL]Ρ@,0p F8a*J|f]%:S\XUڙzp,sOcuU/2`Y!ëJע۟F^74I2c=H3Vɾ@R@PP'p͂z,h(-vrN66=_6lnM{irC +=A}]_~;: }C}'x_1ξ*t},rTcv-io<2 TL6HuE)㕽=hNqtm)1 L` CYxk/ѕug;G:/ZĎ,m)T'p3,0?~B&uO8IUG,(B_x&9,lʇ$ cP%èCXikI 3w2pΌrԹTbh hO8SO)dco>(v; X|J $|nPa4hp_ǀ4]Yӫ14 T D@MNYvc{GWE 8hmk%NB}y\SLK[ {aK\Jzݯ7 gV5`8UE_]D趯5ЕつS@ N-RH>a.a7qp2LtKAPt@;}xbK7UJ1Z_jqCYIh QX) Yd`l/F2faĒ@6dMZH  s'ߓ5 ?n^ˏj붡@Z^;x6@8Naݧ{y.6tj$ALD캓2@M}8={FjKJ101gFrvK7lCvS4v O2"YzJ}d }ث6ќc&W0,$8vlM4p7w"^ՅT΀jIЗ8:o1,^Pe;fgSxoJ~) ?cT|#ngDR0-]TܠsOΚ^"%eWu)mCǃO]:8)@ }y `k{65h IDATVNd !.Bs4fJsL[ѝ  ޭWvw✹Vn8#"=h?[d#~{>Yhhq"|Lmh"ݢI>%YFBtO0YzS}Ǔj/&}BPINrMdkpƴ2@PX6PDޑ/7v;u8eyJDGDAޣF?_1}=;&nhJߞۍ> "Hl/?ЁvuQ\q *Ɖc^GW?t2':anYSBeZ;mlJT1&2CY#:72p2LHc9PwВ>ƃx7s"oˆ/ȕ U 3_*uS}b}6mNi&?1`~a{U@חM#wїG:yx 3*+[ ٢%6ne\У& .cַ$L23j2|b}tBg21~qC  B03Н47=xςT,0IM\ALHρpf ie(MX$/Զ.َ$V&p}䏭 ߽MWv.{k9xi3Ss\`wvsOY_GƎ 6;6dl 1 SgT  7Ci"nd /?4|;e#vpҪ5BΪ+ we9 {VxtTZ/#\D83wƝlJc}KF~=i"7yĸQ04]=\\R' xNl4汯'=H:J*.(;މSw}=*p$u^Ĝjۛ qS'n #k6BNA"~o4Ϋk\C޺(YVxlPÉw?cLabIk H)@Pݖ;˞~O˒zO)_ ͝ eqA8*ؓa*fDY=@^92ZE>ޑAgo N?_ߌͩq @y29{Aɾv=t[VB_Y}_achu+>ynƦ; IPIHyFm@x,GQtrHW&7I",$b=k#B XJ>XSbڢH.:(#to6u]=e^FFo*0!M "$"I(|"m63ޜ#~uK{a;#+# lnm)<`_מXzk+Jp':]W  Y᝛l~ NI58dxJ$T$>%z2E:ƿNw3.2UvPv(A_f}jE,Pҕ. 6ԛC!9i ߓů6꽷drDOet$c̀`_߇綅?_z {a>8  ➓W؏>ßlNt} $HDՂϤfpK$J¼ Ũ)>[=9m> Гַ(u?$ sB|{%w3ZhAp~no%͆$Z8ɀ`_DW׆ҢpB$wn5@8qʼn8xir\p*:դMn!1iF *Fa1\)&+@1uV:l⿟\Нa qȕ y'Â>9ޑ4l9,# ˦"n1?3\'Sgi iq}ƌ{ r|(dugIoX iARI\@ pE E(VSNeaow> @HTqAo (޹ŊY;.Pc D=lm}ן(GM`rE.9ހ HShh鋗X]'gQ02$g/ ,-'CR*45X W5+,/6В}2AF `#^r)P V]@ a uF,pp 'BGZ蠁 {2+$3KlyG}ȩGk5(>/G`7|>QYʒ,) PƗnPHW[dc:y&^T#pTNeB@/o'dr$ 39HeP#5 ߞ㽖> cs ZKh[T8 KT\~.2>f1|c 3v_kpP@D|03>"$$X`ʒa$Hm p Pc~đUAH 薟+*\,*B .w. %\p tex5]]Yd=r>o7 FB^xAw3mSX!1ޯpaXOq|%+Va4ݠdIC,&m+)|QXݜL o?;A7(D$psT[0Ρ%Z)T^Hʃ5wb{:4f`ggl2 t:Z Ju7/ oкBZR3 `69&&Dg5 Al~ܮH@<%"7,V`8º|7wBR8>U,0^ = .R1(Nrc`^ XƳ/\ {^C*`k{%xn{G$YD ]g@P>0 Wd|*/Ҥj llj҇ / 8T/9΀b_w>)4V[Qa~hM4@V9#_ c`SAsQ&zq`!@ `]pRk E[V%p [ Xb"o |!4$;]nݝ{itflD ԣCКUfN7qJ! {"M!],X UfJER*"^z"&ճa,l[#CZ5^A7JE[.22f@r̀*OB2\lnaq_@xOcV2tnӛmt{ozRADnPUU*ݿ XqܥQm΄";KD!WQ9(̀I9<{q8aOw vO `skJF+9& @i2œ+ *b.܅NkXq*heM<W4/tmy8\Pt I:|(RƘr 2@HS{0jKHĢɓAƻUI&,E,@Q )XDy_o-<)GByےBPp'p 跓WT]pVxz8{RA7/1@h1PȸO1?gM9EGpA_F2FE\m(qI: vz ؠ|aQ}<*+H >IS%٬/909Em{{߸A'L2 Axzs6}O?0b}jmw+/'p=.:.nY,-ydIpHX(ц+@'CҸu51/ #Ʋ\:u792M,1:DӝŦ`A ~1BE+ *@p0Dp[BKh)x lBW:~9ƑFhDV)?oьyIV{ouuN==929JQ ºCӺ:+"( *I2C眪yTW sﭪs||P| wuG*rp8be^<.OLHPmԨ/ n{+d"[TA@uISТ88!1uUN 6v8vu9B @h4CˇKtڲ T* OoH꜕>> 7G>}u(; /[ <"x` $wDd浸Щ#ϕ rμQi$qbU䢜5bl,H )Ahx[6\MjPAmRA07I_+- A{hP05f|:q*qy;{btxJG9mj"oPBҍ3^%źiH7~5`$BA+,v@$25OtD#q 'Ob@p,czS!KW(:@05ش_o{V`@h үs߬[.1LO&BVw&8&!*%k$gϫ6w`nGa2@؁K$A&a"7P:Z s՗+\N{q+-O+F B]3I鉚G8#~ѻX (Sp$o`QS[&XifSM6#2V69)NRrNd 3z'm֢-@ Ű+< ) A ',SN(^ms\^rBVxO%h4|cAw wƒ o;u@ v AQԵƹ!-Hdwq@k=>E[WhO4 ^H jX@OG#iƩ A0qNonun s=.f.?u?ڧήsg`p)_%We0 4Aޜ˄}_LCjz4q,م tXcL\}gU(^ Oeyjp$6 l]y1Le s 4 gֲ"\vbaј0 h RNSC )@G˵54;o9Z &=k^ AKLSSf6f}ɽ@K`HyR^!V@P]+%Jׯ8(}oN\؈M~փ3u&xL(t?j?~*JQ Tq"! @E&o֠U},^i%[#h  JCs7A5M`wWݡSޑk(MScZYPAG{]4G}lJ9΍ '@lH-NUM 4$XU N6kW(`ݷ@p++:r `vK 4AEr(v3A f P]\ ??"<ӗ u$!i.zTuY1_3O:oooLbvàƅbȩĄ@C 805+2Cq$Is% `8#YŤ7䅉94MF,'ց !HA鳒+fz%E . m)\X5s,'OcDŽpo] s',DqsHpt0@[$/vg$.kvptC 2vw5:epPM6'J$2K>i@9Ҍ$" gx(N.!dt `^;-֝G$LeI!a/Eg%2}4cs2aYYWm[e#B$Hq:2dy^C Gp7x@Pе W`@Wt x؅*ɋ|Gp IDAT 50j}1AJuT{ok08CP@c* {ҌS^}q`4W8Ⱥk|kԖo!Q2۴h'pLAKge僐6NM:R oQ[6oz5Vϝ kg_z@;q/;8'LX:t@@R@X28܎f8Rp:d2Yc8U` 6:,L=Ɗ #q 6m00±@2DsdD&}-/WuI߿KOZm/*b EUJ! "]"NLOAX'c=9r:LA=2Nh=Cen1>'~FqUb1S A- f'$c@V; &wIK\\idJ}1EEXT;P9a͠?}G4A{L9MMȠ1mZE65y*z ԕA>d(YAw \6 \_oQd`*4tC 6dSjH#% ^o0H5pLE3[O,A3K`! u`DA'SZyDEc6A8D^{ y4y ja;=>3gG>z7Q&U$_bk{C4ќJ $p4)?s "F%#-g\0F҆ `Se =HoHA'Sݚu^Mj2z=&kX\.Ǽ[/f/w,6@^.}H1y-L0?gxeJ몴56C m89C0MGcRYq'#BV6} cA. M T A@y= xDA4=^Y3o:jKK@P}%sbkS߻B1CR`.!kfTe\fZw_װ`OO< $Mz ז8b w햜hgP2>ĂzBwsʿsn,ӀHm'y4FA1g$ϓK׼@'ӋHBhZ@A0gc d9 S6,?lzqm)ng-caPFHvx2ޣB{Yzڔ.+Om8ՙL6@p9ooKei DžR>kˊvID|r/|gǠ`Ku2GgMJj|H:C?i;B[4 ¿F[8!9`HJO1l|#V c3<`8k U]T]+  c`$ ! [_u A:ѱlV%j-1#ظRo~}Hɹ}G%OfAcEcՇ}B^n G^oCW(fGē U/5hx_A0 Cjۭ3&% <g8;h'OAy l>ګ ƦYY9c/>4 R7?O^$$mۓJ6[V؀8Ek1N.Di)ˋ Ak2usXWLjr~hᾷFmqso!#  üc*;g81G('ഹ(/x`n3DC= Y r++8oĉ<^ ,F[ hG=/1w1?1zÛgY4tMe,0"6|aĉȎҥ hM5bn}|ggl@$Z G8#(NaѺ@Pe|ma,A^> W֣4XX;' IS[QfJxI},{h1d5Ӹ0yxs2SyqQp22I¼~e{z"li-V4I^[vF~4B4# Pht '^`§F x[A0$\Q8~~^DډJY?A:g004/q|#VbV,3 +pkfS{a D=/\k:xZ [XҜMM$<{? {" Dh 8/m 4?cT"d;͇en/Bh\ 6 l27yꎣT[d EGaW)Kf]t =^ 0y!_fz"ӎƊ NYՍeQY͗-őaWgo6akpj;G`\ A)s 8Kԟ푂~Tr(1 DxCvEȿ1$`?a:vPC1<Ӌה`FeE* h`"1H1!|ms} 1S2/+"C Q)`j\ E5^.x6mX ^[=^6:q"6CvdCh1 _x+T7aL~(8{o? $m$mvEޏNRB*N4AMҞ+3u 9 l=#}Ϩ0`x0zLEI25vL0?nZdwxQzKGzS[&Nݡ[pp k+3Au󧕙E2 xfO` GzzDq9yYuI(>(C.<Q(6x?DDz d ;ֈCᄀr~a MRAg` phAsMDh;%sTT蝖^{rNg~sj^Y1Gˡc8@{Rۦ hx@ZץF[z;:f(? P9G`CpYC%:qgNDhjcx`Qq`?ãj}D[܂P,nb 'UӢoN\a$3.2A?@G6cnaz] dVd ET'q 4eLSޢ& AHM;ghTޡ ‎^ Ǿ CE AkPBבSg{=f~\v$̪E>sd٧t^XmٸcxDƀj\蘋k *%G0Ei1Fh.y AKRq Aw"t 'l?{Ww{蹯w(>q^MɃLI s$5D&cd֐=ʼnp? Nn*(^ޏ8B VJyht$ab՛Y 3:"Sfs Hbzm&A$PV=Yo:;ԠSKPR S߷xBd=!!q`@\h`S/>3X zyǘ7aAAROЄ{< RÜcNę`BpFU +Q23,;/\{Jf*+±a{9sZ%#x0gѦgulzFPS7?K$B)`;[MaTSbSP-4N&Zd/H F4sXc8PLA0_!XR㖏F]Y5;/S.<]Ap B` `@GCfD`Tl9!+."Ԕa$YoAٞ:8[Y3& v(J[@=DCV64tS#Ώ3࿾YfSJv$?J[A!|`J)#A-ZU &t7@czI8!i;1*kebBHḂ`+u \r R Fk3˲Bf& 3:2-@@0΅e=bB`.K@qV$#7֞i8jc^T8 FHI( 5 X|ܴn#Bpc7*E+ 4_܎jbf&{G M~Fr PJQt_  '{݇}Z$+7Cw:CTA0_ X]Z]_<{ c8yp3 +A@_(*]kʋ t'u*BMt/x +Ј{S|~"~{^A><sKE!X 6 }ӱ}2%NX>&9s2*?W5U.[Y5wGxu@A0!#rVQX $Tz#*$NvBI/_n rqebVCvG3MyX!]*Y{,_ñn A>e|BVBYh Fܧ $#1{YBpG* RQ"F⌟Qi` ̧ˋY35پd3 Zc%x*PP*3;֘ 6oU)c<]" 'S]_'ϩq4wgvGq̓J ;` ,a0(h<)ĉazzo'YU? .^[&:caB>a)Tg3 tlL˜5j63i7|L$FWw1ʋAPBDP07p' k7; lLo7 &yAԱ1IFdL&c:{s==TB~w)u6I% !hf4A  b|e8gLs/<$ʛH/Ђ`r}v"E3>*'>J,̩ _4AD*P5y% G S^{˕S _ 2x./d aNm6$i-e3P3#.7=O e fW{/ü2er ;oމDAp!`Zډ vWq.%p }0'8}oDShST t$yP-_C_( 8,i||9c a|穝xjwk XJ08PR9yc*ށi@B{J.lPry*AqV5s ;h/Y+;"x#ę$ t={郥@S>p\+$@J9$q }l|()C0;p:)AP5Ƴ6ƨ AF,r6D #]޲ F-d./N./B ~.ԛpF5j_mGP4#B<( %f/xfO~0^; \ dg وļPahՒ͖)JAx./04LܹK786tla ׇTJЅKA0<{A{RL//v>WrLn!>i[h_5'7tW5ᨼo)DP6u1of픍7&KCbrXTLS뗋}E P0Y1g4k@DA0W 4|EIM2, ӎnk_v3$+8D}佐6T &If!w٘ii 2xpy8*T;xp̥z#ΗE q3yp*f X单|(ڏGПz @҈^j#.@jC^w"pi. m[lV=x׮:YԛϡS=sT(hK.՛]C+4m^A0Ȫ&|Pf՜ j&54>|/ooc[qk .u5Jia", ꜽ5`-XrbRMYNhK45/ *f_>{!=uJ.~3z Bs6<oM@0 B"<=wz&J <0PQ EsʃIU9Ђu fo2e-1H-ݘ f]' Ci HM R&" }2|`y{z%ܝ$`xn_ފu!H8<]AA1Eh?u0}zF{F{IAEIR@{,)5)J@ l6𥃥4XaO6 /RS"KɇW5CPvyۂ'wu` 0\¾a_ɟ}Vk^xU@U% (†`.Kv91Ʈ9~dN1@ P!tskccUǩE` YX8;2<#Zػ8ߌR=9!z _b@ NaI|paC&r 6 SW!Nui6O{$N2RWϨO?A2'&N<6FAPA0s =@] u>gH[UH(AAЂ-I2{t2+,@A @٦q@%*SW$$ueQ[m`$6ね:0 \ @rB UPG1 amI lwxU"8>]@:A8{*Mc^m{ppU`fl Ax}(^?nsRT5u?'w$5PםM7/PmY[9YC_d^dyF ^'i8[AYmR#D UQm̪oR룎~ ~eZAPAp!3 lœ!k%oh듿@% eACo =  h=:œ)kte;SfSkQ`J$~rJ,m 5 E+pG0bmz 89䮚~TE5}p$*% FvexyBu@cfUgWdڪ M@edC'H5:E{zsy>u/#d͠`fFqZ{?zq M:ʤ|kEЖK:> y~CyfjV~E,*Fթ34'2zBtX ɒ3~4!9bT E ?}.^ s{ķܡ 5eα#tyWLтhcgˋҫ5sז , {s9\j={d?FX3М8OI`r',AC uFyQkAFS\Г"얃0m./&!Zx0d'n2ΐa*jT J!xGps .A X$W:MPi8k/[- b4!< _ ljhZ½9s΀dT6ZhU45~\Y:jTk5$*2>4w;OVT,Y5?gyTyB<|E>iǑTA$[g BV(SoFHy@i 85{)g,) kgBde3C`w_v$)* iY8ܑ6/'G:gbNx8aP B9TqT N iJS LHf*f ëAGh$Gp4 XP5z/vsCN }cvp~E!dFЦHqqBdQo.{F۴1E8a>ƃ𨥛AA-+ l_ߏ}] AX=.+:F]r:r]PMN"ʊP]@HgO{iknoRoaބ- QdUf l@ \wS--G v 6{o2;1#"Ep[@hZCh^`?=FȚijJRqRoj) B\O83ک` i{9' ?2TT, ά)f;y!w'+;aqw;9%$OȃAc3M^2V͎3dCeF[ iAFA0cJԗg5 Xɣ%;14.ޙ zn#/#9yfhb ^d.ۦbe M3p/ A(*f`vMiVcٯu6BWT,Β߻E+r&'rsMsQ)HHb۴OкiD -ݬ5 `*4-{ pY2`I хEl=؁P9Hʆ2~[&z3‡g4a'Hd ]M#3 B"@iP`>AR?^:諾͞ϭouơI B3c M{䛭Ϯ{rԛ <k؋)7'"aFp|APّx; p9}!?H0c\AIlN/<&sJKv(_Yg` <0?8{p 0NV8BAp M 5]C Ap<,Ž5}cGsV6cZ _nj4yI3̖6 sXK18i A(1(B8GlTT,xꚆb>+pE^8}/z^ IPYs,aPNStzѯΤ1R6^fAX Quy RT,hscFu3͈\EwW&=iOy=x*<{~A/6XH&Rsfdw3 6MAp P z 5r5y#ONڳ1 ,nzSI9E&l˷MU ًM5}{kmӠ 8„5ސ`AC-vSཌ⯻%Tp { 60c*73 icU2߃菧 8"92u`DAPA!8-ht!\|0TU:%@\IDŽq+ČiBK0)ͧ> C dI!,(*4J]qIB@#"^q=zqv3 \Lm.؝a lӤz IM1**,Sj0˻Mi7~ &hva߿_:@70+Y:}Nf91$( KdPTAPA`!l"li&g^zmCGGO=_!OF~( =\9Q fV ?LPRaMSz4+B A %E\{r_w:6ްMоtQ|zF4 Whi8%v4(NYd!d |Ed{_XT#y4oئz\4^)w4CWy6MApjC0BAA}svG>~>(n4% IDAT.Nzܽ/lMa++'VNǯn u ቈWm:Giɸn_8 XN^2qה8 %ϑxc?bY KAY9m$gw|GXߊ<z>T@/z@b ۞KaUc b|y޴ |EVKܱ>.?>.i=|mAAA)A5.-vÈp{Q~ j(sWxيz,o(WTTT-/WΗLߺ# >G۝7nW\ƠD;OAPAPAPApA'LoD(M y>|Aq}nF%u8}vଚr|~t޽/lǑ=(ʍvs/^z<ԕ'%t?Lp?~/C; h qF ;*W[Zogः |X;^:?mE`طl 9WCfϞ<++'+JNkOo{((1o~6ATY׀x14AAAIAOE]Et޿?*Fbqs<:Kv{ zitޙqŚFAAAI5`9+^׆G7{ĿG_5( 1HAPA u LtA|]~$ KҨhh޾Qo}㍿ozl~ëq7 `6|jrTHΩ3z:Ui p'aYc`cnm9<ڣ 1biwXӷwt9/7|I"i.["]ApA)׋VH9S$\\uJ64 ry>{Zz}_@_W$ #Bwxi~ڋUsciWQR/z% S[|t4ak~q}%[ք'w"+*f<9s)'׾^p׳H0ϏtnGC Os^ 7EW79gͫQ\PW^sWLSlמƪRAƂ*ɳts}P0A_$x7!d9K MUTUE+k֡HAPA\Tsr4{-wxT0F۝7nFw=7Kͭ)p`B4/>u fՔ8MsV:A05V4U֏jxLAPAN{Δև>?S?0>L1+&N?_H?Zۨ X`$߹xV6U I \r{% i NK0Mx "@]@ӾW/.2%gAᾠj^&N*IJjAAW؂;2/6^<&')?~=y*t`E0 _`AA:Ӏ;?^,^%֡odrn={L¡OFc݃ykfT Z$O 㒕Ǎ]OH:/ㆍ"`/FWpIoAhg\#ɳɵM y >wŒ ( /tU_;wp?ę~/~I::/Wyͮϥ˰RA0!W4Ł ŝ^AMr`ͬAAPA6J"/nޗ6 V6jSx? </j+ pQSZ ?u~OGgK16>mi:;R:H~ ~G0>\ѿ=>o|aEueѕh`A97"`; AxŬQ[A峥bqkT:hx}wb}?ǷΧ]^:w`@_ n$WZV!QAPApiku5_~2>QnKQ!)B<|Ezg =˻G91|&< @8c~]A@P\ӰnQ N]Ѐ_\>Wsym/y.i7N& Bw߯9nyr+z~xNS 8,5Y3!sljs8No%EA{Zz ;SdS剶onY--b^mAH6-)=A;tTɿ,O(NIV/ƌr܁pW$BX&RX ߀)4T5* (I 5V+O@ui@0+\2fL-p Wj 5(uq ԕ'C75Bԕ+N1jOs5{ϼY?hōa }=fr?}?p;ַjЯێ=K[ÝEKf)਑ Q/4^!SGzCQ)->!tءetM;oxSxSɷo/w0wnl>j`!}ag?aWsɝtO}AB# tgr}O@$_.oP!POHh{ Gh{Tv獛qnq'AT߬_k' 9 s dAF+NV~R4Uk{ٔii?Ԫ@{Dy~\NąK+fN Ek{>9C-C]Qd\5k^eC੷Kw֋dcv?<%0᭏o8NO~sN頻SUl5'߱?L$؆$xAh>*b<ݚnj?e6]er H,]k-M4-j[ ^>iE^IVm4Q( Wޣ"6$ٽ ~YnPd\Yl^9= ?0 u '{Iτg*Q)UՓ_.kAר3MKJܜY6`|xdHɱ1uT:z:l[`dwaܻ&dh}8|'n@Je=bpkW9"&JUrӐNJ V2qM`]ykD& A;?SVGjbǒEz׺!M_cZ~2%6eE:B )'<"ScN敊ۀˊ[`1<{{*-OQc+ﵭ\J2\4=Jq=MS5fCZ6cYopzDž!Î4EI9R k IgƘ _%筻9-"lq2L ty JMla#DrAX$1O>9TD)lO:^QKAe-z7 FJL"R*lOgX?NC;xҽ<rM,'6b¼H551 uc&֧e{.\cKV,< -srz65^ave1w2Qa04ʍ$Q]fGnHMdӁ>9P@rD0B$ӉPk\f|{N"5;a$Gz\OOխV-a `RXuFV̿QT ^:I$xV ѕ)}4I.s$A ,OνzzUx*Yn]yE-Jqp~G_c6Ѳn~m)Akoebxw1$G{$j"FJTkLdhJLm(}bpY "Aad"kؕ 9sl_~1V\f oaLm) [LĄgA:k8`sq[<ӇM# oPem?Z"){?X'V̑cD-ZFlnb[!/hf'gVs֦W^+=*.`&,Џ_ŒTɛ_Z]47'tW$Za+@KUoEL ;/_+qr?voHP$x%Z#Smc֠rU\1i6oJsmL)Z5K&yk'/Pp{xarID1ѭÊZmtEBCqydP#7kQ[_<ʴF;7H 'n. venSq:5xlmVIDATIkt^qE")A~)<6u},Vl>YeWedjj{lX*"BC.vk很ƣ_A'V|[{rqZ$(l6NăMp!}UL0/Zvnl"B,Zdx tc7\B׸&.GuE"A`1St2cLbU[_fہjx ok\sK^]X! MD(4 3~~VYcqUCk?K.uKHP$tzaw؟Ԙ&rMoǓg:8za;WIWP3WFb`o Q}M5jn^y"IP'E-I!17G&*$֧e[ȶ vycJ > vΒ_2->}!x%C,ٚɆ?L )))kJ?΋۳ِ~-H05&wcƈDy-n~iO׿̠ڜi_yD"Bcg?B=Ż${ܨ ֤9dUۘ; fڐ.Lڤ_NGnq%75M aY$+ĈFqz >qۑ{1SٓW[{cd+ETL´]-匓YP3vC8fs ,_C2PhBdZ?TSY0i z-ӟ}A9|{+'E-IJAϸH؉0<%ؙUsfgV+,L/f"d H'+~ws[M=l. qN-<' 2{?T"N3>$-bPr4z$2g"`:;xmk>E͸RF/\d*n WhRV}l_FJjne"Ɨml):H) JfdϨ"}ɰ精?w9DM}FVz(>ZwbE=пWjУ~敲7}yS[n<Zŀ(ub`>o~yveQ]w.V'ӟ߶}!DyDggמGaݸ L9gԚEUdQP[9J*9^8*iT BIiGv[svy냬vy~L~jF"B|n!ynA?Wua\=$[̹q9RRő*rJ+sW栠5U{[3Jb@bCC "BH&%*NQaD.пŜϼ*#d{sw}JRꏅkXȔ, "8󹱦.:Оw][z(uQQQGU:z75N.7nSt?U(0Z-[GHƒ  *$>mWna>ؕ6m r ÅeAD()U9/\6jĹMJL;& eSڡƱ精ў;Vt.[~'S1vAUDgBt#[Bƒ;q:2OGƒ2*jْ~OG(,o!Kpjr@%"E !F3 @3N?덫Wb{'1Wv'$O.V3t<\yli6ow0zf1ސ.PAD(x[P.Ά01z$0[ۨu%75[_ m%AD(K;LBPyc+ LePXz%Fg1ƳDCfA)mɱ#c%-Lxe>Qrl2P:D.Ȑs?Q²j+XI%ŕ-Q^3 siѲv/M -XbE֚i= }h Q@h߉?Y3XX GZr9Ի:ԻsRUSOU:uTRRUKiUms~:ت5/Z~XPh$ZѾ^90I_hdkͫXK!6E̬R2n3"Vk|ݾ/Ai9%Phh;{I?圜wkxWz}3"Bἕbۗ50XIҐkU&t!Dpn.e1TJ_5 9+}oۗ߹W= 4^ tՎ&QRWlfb٘l^AD(^"jDq8tr)GOe(ss᲻V "f"~ֳXFa@ڷhE%_žh' \ "BAh!D]r 0kPË7 rfMS~n˺PZs+@C&aEΏ[zz?J5Q{4=EEDIJ_7GkEQ@D(uаsV%.;C @Ҭk-)RP*EiI$T"8VQ+85y Ѩ#n?r; h~ǒgʰD)SGiµ"\C;P! 3TPar ` hhzpv(WJiTahYo1vNsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAߓq)!'IENDB`openscad-2019.05/icons/information-icons-warning.png0000644000076500000240000012453013402025764023031 0ustar kintelstaff00000000000000PNG  IHDR|E pHYs  tIME9.p IDATxwŕ=~(KHB<08:56wip8 1 ߲Ik, w~] 6 6!gc뮺Uo4c$իN[u@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ GO@ 8v[Z0%b|Ny(e28`#Q==C+r{<`n~ @P 8Ѝz[}BIⓗYcN,wpg%`%@P u[F|ȟ?epaBaA?Spb=@P 8*tvp'fQ6x%Q9A<$ACqI@@P_=xX&|aj(9(B>?]Hp៉W "v#୧yPw7AP #'C  {۹ wxhv>7'e)碡~*r1"~ŝ{G<~ #]w" 93@ ".2*7aހy0~Ћ}{;۷ ͈k/˙.l5iX0#8gއ0Q}w߃g'PjlE _z)"g_ D(ėᆣ9XJ;do-cS7g aX K.A\!B EW^GdGl +WE#u@_] /ǾB<.A D(a #a)+ƎYShHR{@tD}(XxDxtd2e&%?qJ{f(K.  g^R{sf6-"> R[AT(4lqd"] cry~p3ݗo) L[ކrL~9^`7ZI6P# PtsK:Hm ~ F0{{1~ s/°0!Y}\QiN\ "s\_g] $< ) 'pAfͮB6Jx^g?z{7dh_z)D D(w0)_r,_UZy*|*|0R07P2 X)׼&^lv kc߾_deQEp@,gud8 CA pU lbAѿr̜Ixk~Y3!(+E P 8 NSԤo+^=u$A25X8|ϛL~!~imUIC@pᮻۇK?m/:"u>>䤣#Ae Kz kx2o}w_ƍ74^6y_P buZ.A LODÑOLDJ"*PVހy|'0g"Ntu Ug̛N Sp`Q|qr#@M#29s Q.]V^vU$E( 2gz oz$&* $C`35HYW2*7_؃)S^QSrB)N\4},.Z*- &](4Jv$>\Iswa ;;B)BSڪ3fm7px%W%Bd*>Bu&BӄBP ƱՍE5ثzXsR[ D(rŗJ4/&v%XCUU14Jo!{*(xBw zz0xdxݨ3HmGϓ)t _d:"=Ē aVz\. ~3,B-puO&ʕ%"N!nИԯuu al$by*sces Z-ʅ83ތ ?V+Mp:Ae ֯GK&]~KvCD% *J 47 { ZڲhlqAЇsR aߌ\uQt1g$=뽖W8 T!-ͦ&*P#A?7>s;&P?tD|H l'Y/v//`_S Ż(*j8% "C\Mc?L,c y_._]r D ' H.ׂtaۈ#J|H#A$3?PuzBa%Aa+s4C>& q\y!B$@g'\}[âIj ՉV%g#/VCz&5Uba<*hj:V}+ո.D@@pqKw`ەzBӉB3$YlI.5[0I#)sEĉ/M3#W@P 8\ҲJd+aRaH$*1ٶi"X[EhH{?RUzنn\&W@P 8DxXUц 85%[դݴ9JS[ISI~Q&cl&Lhede w܁f"BqƠzƌ7c<yRXb%&j5=KIЁ""s7mkY3y\!W@P 8 ԡV| eŦ4xq$6X.Bʄ|I0#ǭ>TJ?3ƨ~ /z:U|ȃ+S D('(5X ~-c[qCeqU!ȑP_sTnզ#רnQm+ RqZ1А&2Bqn^S_?+W\ž旿oUTlwlڼ?maʸ@~rNB-XoIu^x;*BB1DO2Zy q h/\eMΏGXz+!B!p9 \}Əo`i=DvK_$LiBӚ`!AGh-֒LW 0P;nk¶KWr cNLMs;nciPJǯ) ȞO[ľFxpU$[jS  *P)=d]K5Ӄqr цoÃs֬wcWjA:%^47֦?Pr&SS#S$ñnNW> `"Q_?%͙\!B`aAWlm7I0BTVYT \] 4U~3S1cKUl=P uO1ak>| uf6z]shnk)`s*JWVI#4Xq,&y%mĮgoMVEc<K.y$BASv̙s)&M:hWp*YCR ,Ĵls&y)rA+1Z]i,3U DEc/3SH+Z D(ԀNˍA[ T@RYDu94@*Q+y)ȓ@?FY8 9sE^lZKTwwUl@N zඤ~˖~30xD4t^b̔LgZy͝A6D{=԰rzo]Xϝg&Lh3U*CrS=X59,Ғ/"Qj4* ACYrfv{_t1f̼49q\!B w'U2yˆR$Gć]{MVQ2R]iX)6b7UߢӇ4G[MiOeq\!B@OJZbzxaHQȡMta4+( J}BoFN)yhf*ی!u1mkӜv/CXKƽ[ "C| rWca0T@?S:d d>mw16ThC7bNy/fh*XgP==WriNy]]sB3] N$~k De LVJ@<jWeEP(J 4բڌzkٱ"p#W6TxWb<\Ӄ1r'g&>ӧ1fxIQjਗ਼Փ|MN0_!EDU vjPʋNo-ɤޥZ+NX* WJoSR4K@! hOb\˲4BrGgv#X?+W|y%@P%C:n&+.$꒮&㴐7 lÝ惎EG wuvrggzzP~+W|uuM>kؓM@wU`4P䑮$/K^UB?ߨZ(\CU*͛t࿥_Rl#̜񖴳m=="">CWWbs`QJ5$A{]0.2I+avrń E(c}"K0+;D D(8ىi |E3/Ϡ.E6D]ؤz76:¶,)SRmʕ(nY ~%T+}?7Fl؅XS.Wo؀ r-<hq9w$JD*@WG@Oct->ʅ;@T1 %i]"A3ؤAg&;Td2e4yHACP>Njg_k dTNڼw5Ť\Le O_믆2|.{BS==hC<]?_13rT@V[$(Fc)=L @63R$"| A@WŸ1uk!?&572_?gy:Ŋ/FE"Fa/%ĉ/aI0wVAFt 4hyfssN44 IyRQW-Es˥OOzZH0e% "$A} [\ FdMiea*8Xg#nȻx4x/0j f_RwьJ P/ӂ#_ ^Q">@ L "s] *X{Ɔ,ieadUxX/|~`ޟ/w@Լ0g1yF _@nDiޭŹÒ,'!X[[#ln߅l)OS:/\n]Y=BudSyR<ȁ;Tq˖]>0ho˝$"….qz#}`؀ҬΠyuF4ӮE<7(+d.ҋtɢhﶗWf͚8AFߪb >>ehk! }rG 6%_DSF{?i_1ĨDb<3٫T$__2V(U$9.rB1|ԬbƖeDp+3K0eSS7Rw^4K~ʯ*dú:t <8v `4FFnosho!-:#( ph?ѱc xY!B)!Ƃun@6k+Л^q´)#L>&duUhf!_~$h[c1XךQN7t+!XTxA CAc$&N<@Q7Q0GS_92e+1gOj?qh|]1mGJCZ IDATX Y%/bB%w2~iyчJ3΃kq>_Az46eBݘO'{/s;nc_J)!&";XJ Uk`07p$H< zNp[trۑEE9MH& #r@d"c:ؿs+Qd8իUuRƘy(~q2 7C=|ap݋c.L3 I4DW^;]}Pr?La檱I\R8OH8 k5HD$HH׸pV x^CRWI 9sʐ/Hqhw̉(G{iU:; B ==p[R˾F{?RJPC{|&/Xd'#1$HtuBm/}+];nlZ<8JF81)*987QkWK D(8(gRر xgIVsb3ET-%9fOe%o7_|Ic1|u^ȝ("tvmG>j5+`<$C`HT\r>I$@6; 5E)NĒddDc~zt2 /GahT3UӅ`ۺס@ D(u^QW7h+T/ma/d A6eTcLT&82X w`13+Yd3` ƛTe7@/EՇ -LǍQ6u8YW{/rrg  aOqcႏ3Al:Dgפ1VMDŽm8Ugf675j*|_ӽ`LBiJ\~%b*ESX'AޯTL_߳c~+2saٮ]k3B;TBn=kyfXR ⋼NL!]GFx0 r4*p/M/H^ x e+ ,%84(-v cÒŗ䫿L;T D(8Z5s[YDlb&Pfb- ۠$xe$hVii'cgu $A/AA?/{ k-GT^'û|m将>Fv 7e򯡱qzKsB];T D(8B;Ἠ2ho}Ro8ۮ6UR8YT`|bxT`AQ R FMȳ9>>_0`9ĉ/Msf3d[@P0"tvbtih+R~@̫ej4$n>qub)7)GX+wpI3FύӎP2aV,! 4 TWC)v={ vEJgvu]r 4ÍIVXT?PƢԤ RiT$H x&izHL _zc-e"D{ޤ5vl‘_1L2̙sIѿQ/w@P0jC|W :0|H0oUpQ2Nv1E#/R=Y՚vsL:Mԙ1fș5mDt . 9W޻Av#r4C9sBQ8 S5tU.B8b*0gW'ˇ\r4 ^!$#mMͱmM֟i5 :m)%[!_kSm8q46ҥ_NwztB 3{{1eY4< G< ݢȿ@SY%$R%ZFIp<!R`l16(WIC  ]Gؽax8K9i.1,;X D(8*tvepO6ۄXR)T S&l~Cm JtE\nԊ+ $H)ôrhaJ(Sx4qG_)' 8};zcg6<ByXo/iW~MSL$TssLUɣvyKahM5f䉬ʐ,ޤF( u5`XW#O;|P.=D .)Ju -("jgVS,,[vCe_jHKG9ؘgRbܙbs jk`lH"N1a4ޤD|m1U!l;:ֲ~x]Յ jBOx^lh"~(/(*!I*eŒ̶c!Ak'e>.A798Gl9,"x%=MІy"P\h;[ D(H Wɓ/Ĝ9 r 9bJ_ޤTzؿgqSb>| s nܮsLSI[*̓:^.!?6ablz"N,J5= :> JP#!A]#*WANQTbTbR|mr߮ Ƕxg2vqK<,w@PDg'^ }hm`ɂu%vWQP :t"%0tl(]*F'Q?!{AOR9\U yP=JBq=(`c9ߒvXىN X LsW,ݯ< S94m>=HLux33I:愓)wYHЫ)IITBT0战2)]\(t{CӀvm㣛k VE!BA 6`G:_{dJ uU&c$a$g& y$o:"; bcNb&DmظrX `6e{U>G?2v1.D!ֺu/w@PP<\`ϴigˇa~q6LYjUV](nT5@2rn)CyrZ`FLUOO.rBtg¦ձWo@ ƌQ)°a8.{ZF=a 4+V~J\߈ X peax@L:A29>c*PTTJNѫ@-+X _HW_tvc $`)a7ø{w1"8Zyu#|Kd 5r> ǛˇaIYQגj4ȇnS bZ'7h8cFp{`-ō3BÆ&zCA/h iF0kd[@cW X?OTcn w4l(mF5T(?ĂaʘGhYs݊x#o |rc-L"s;nCJ7n؀7L D(8CqpkR+B}$/? R5UOc@b#/1@f𗆇q8ɉFy`P>Uǂ\ և ahҍơCj\ޡH#AߑwWc֬wM~;2# @OXҲxJR~ne!Ak5P(T33vS`[`M m4CiI' Y"+\RbxE0!cL/ F J'dŽ箏%fd itqB3 ==_O!:J#g&$If=/UjɺFhQ444ݚ$>WR N0 VV2*P1 -G(MGhC:~"kJnn漲 |Sdf"AB\ i?cƛ1}|;Wd&{<6>/Iĕn(F.5)A)do1&|:{q!#`tTfXșBS ၴ JcM#/[v%gq@Pp&`K煑CG;|X.ݏVMR+/pga NާRI@咼Qi-7Ƃڍ?C*{zB(UB""E.=(Ë[7F#kF/ tamҹ_;\>+O wklZ9*}`T+ۈ7̰mmbvHQ$itOKn#" LPG(UI&e~p1fa(r(@{wRށ߇?#Te\yq͝g+ R" zGw(} UnTByPap1&9s.K1!ܴnd"hhq0 J_~$A(`L Cy+/_iQ"٦uFBﳒ GFDmV 6K}.L]9UApAe*Q.= ApaX6w3)T 7?u'vm7 f52c N3`&W$M~)6.)4.?LA{)*qi/!XUqJufP1YZ$afI Eap~yJgP)>apd 78Q? (?]/nJct,[{8[f!Bi ]}fzNy *OG&tGkzCD L#tm JT$DhsW!~Sj&$I' oO RqD՝ \ڊrq *]^ %GK;wl~ k/]y3/E 2s NpO6ۈY\ђ;L,FDUUdo(-ʘQل|">CP*ِi`*# 6Z=JG3* Uf@ ԙ6`2'L=nJuZ<Ү.\(3 amRmϡy^)*c{#Mɪ* mCL&W{ )Bх3\R2HPCQG(A(A~y7Tp! $Fƾ8ݘ65iQ' JVaZ_fK[4nStU ǴضJ踍dn|@f!B)D[˙ˇ Ϩ'{\9 ؝ݝ `k1}7qߑ#$, wWu"#!Nc a "J("@oUJqTG w0_<!ʌ"D(8tWɓ.ܹf%WB)(K*C\>A56u O~*<9>/^ 45IwT v O\ڊrSB*x.ӫTͫV~ uuJg5UQ9AGmk=Ј–F9u Ox|bH`טU{4Gd1R/״{f;D)AIjzL . Q*>?0pQ] $#;ibUiOݘ/3B>]}̹ &o*I c3̱&y{F?'nWQjv#9Di]kDeuYmG=~y{5J!?JQ.)k֢Rah'Ҳ4-UO[df""p'^C"5 6Rs9T@GDt@| [7~=IkԥV!>&3$źuO5InD&c.CQ c=X_cJ34HHM@d'A-<#jt^& zU@ J #*D2w1i}؅XS3Dq'!qɮ>S^YQ{Q.)=T3 S\;HH5ǹ6ΑLEOA7|ZA۷rYQgo6>.oJ ?ى2 N&xX 2_bVݯlB??#| IDAToXJm*FDh$'+}ZM F- > cċ?^C&QL[R(Ą iNgHޔ&"'l؀7xO]xZu-3ф(5tJ:5"lW \bHY#$fm쪏S}Vt \tjJ7yj$`(r&QkMl*{&^S x@BoGpkR˿zsRz*m+ՏrW0 J=hlb4LҿSao&*<\U;lAMoP`q{$&prMT 5-O^Ɏu{Mf2 L$D(8AԯL5'BTkmh S4RPe*ЮRuLtfCBB_&qwS~5諌2d,GQ)S(J4(ap.Q)T~l; O?iΜK1eS$D(8NŸէ~2VXL>t ; r)] a NèS46A* 25@"|}R[)Q)Uql'`BGZx^®.\*3c:4pSR+F]x\5(lpUmjUM(1)9}pRFWL>c`<<^(U2ȚH VP[ä;FEU38q8gR5n.4L%D(8ou?~Ѯa1ZC?M'Ix^1N|RGzxzNo>54E֠'V-ZAku[ܢg2S  0$)PN\|Kܱ)A]Mr3/9vI&2F"x򏆐` ftۊD֨oط۷Onh˾Ve"(zѳ߉iS_c Oja) J`)dZEOa1~f5 26ETvq|KtIЄ_ͦi*FݶfTZŗciNGc&/_=O]}>'VL&%!Fw$CZ4NF  ٕ!e5b6l~8@taM['Ѯƒ(ÓBt _1k*M}$4&>HJظuNa`L^zҶcґ@{"°OTѪ@}âq+W^Iinᩙ\1@P`AWG΁B& }1sU A%'>l5dGկycRiT}{Q*Pj RvUoQRX.ruuX&`tw7Ɍ&D(\}̹'h+[WeHЮTKE]ZȖBa*Qme|H7'DTv}IWNJO Eöv.8ƍ[*(x@P`WW\m72(K 6aTy%p$G(TOʔ,TY ,>5(Ⲗ3 GQ"LyYq[Z%NQf6!BAJ^ %[KhliN" 1@g3m%wj FwoR\ X ck7T[H0uB#7q7 $QNݳ8cM{Ξ5k9)h> էy.9?"Ji qdnLڐͱ(d<2v ?*p!B uBsnmFkpQ.m @+_T{-dKv'd"$`:o%kk٬|XJf{l8s_1” mQ50HQj묚P-(,0ʥ\z.Nn43s=V7 3] w}"v%&$i%o$lbq:0-vr0)(?b) SW4n̙vbS ԏ\ރ-3)o}pg'VɌ'D(NF5> &Lh7&VS]179sE*xW{p{Ɯ[PAb%]EpK(Ug0EC14*0Ysq#Zר ψ <*P$lQ}7?_V"f8nϷ`ժo3JBOޞ I#A& 쪍-_<N5?g>_Nz K5CU4{ ς/*@XR 6/ :ҜtvӣBgn=]_CCT\|*<`%/XJ],w,q>lxt\n6D> F8Ԧu)$%(@{ ԻM2̙sI7[61;g!/hWRT7g"LF?&LI)=GuB[IHB£ZXV /xT*P˜ÌNF5%7 <#"  UJ[I0-25( #hoSXKT!.@L8aYgf|;Q.޸S*Qm0+;?abT۪ʆr P0h2L˥P}DhRjM$K%j A(x\Uv]KhnfRYjp|brXþV13*E JTOl*Ilx4 ^}G43A {'A[p5)7uNQGꗚ_9`f hk1*Ӯ.wm0ڊ >q-ˌJ*5'gRpbTqwKx4_9s됰 &߮TG jAp(>Yy N@ ԱC?g_S^ XKT˂@P׸OʕW3O }Q)pf&{=9Jh,c#T7 `؏BCCLU.mc<>PIGp?H,T DT~x/g6x^6͔p~3}7=7%[⛨` @㞙z5j-KZ5b^D{rBaIoé@1UY&E LE(*@#&LhǼyJ"%\whR< |hWaT`Cß XcI' Fr3!n14!QnRщ\ܚ:T6A?D֠iU GO=U(eV-i]m\3y\)3i.$5lHS(0'D V#S "RImѩh{?GHLؿM>*0ؿ [K}XT,"cϠe4SDC>2S ذs/g2h}V?cs6,+)nHAj(RNH榗č873r>>3"(T{RTI ~lz*~KZU w7 OU%e2Ht]3f:!vrmL rڅMC%'ZHxap脩@2v>hrLS jǨqܝ8a3gx Ocs)Ӄ̜Bp8c" ga37ed$nVҸi U*sPt@RE~08rBUX.l9/#L!aQ Tj`<\jE)Q' D*U~cW&매:&c̠BCHt.<|>#?^Ҧ%DoMʃ$b3 i(ćGj,h C?xI/ q<0Lx4d6 lnbC?vIcb$h ZĘQU#,KFVRك? *$V񪰄yɠ62a nUfT!SW# nKt4h/AE# o>QfȔ ]jJP(R5r.ߋBߣ|*P K-1D5`"^_}N:]&j­ߎ̬B._4 ˖<7I[\AEEeiFetDāAڏ33/Gļl"4 ,ٓs?U=ϩu&9ǥTnT=z9W30EsQ#TS\i:E@UM} GvD@2uѮ{/98%Pf ҵ'㕨B#Ovxf6lpQ)*F8fЀIG[fxk2m2ep)=z &RO;؉9LN"T ]C:7EfC]W@~7y˛Ƅsh} ئt>/Vy}7 +F8&J:룧Ny?ͻSME^f^.^5B7b&b&H|Mй( YM`mt R@CBcMLskP\<+RW +FRXX7]TwCCFWL oz`KBvILc޾޳:T:W*;dL0 h@Zx3jX^^)֯I uu 3aNKn_j/EL|1E"~u"K}83(3_6A4̶;1F,aM25Amh,zD@_ ԏBW^sϟyTWh&`̴b9[Qm_u]Lj:M Yf#prO<^3žӳxD1IR$bGFGx;_mw "GdTktPؤ@؇o8X;"\y3f ,F" ?K>Ø=x*وXU^lkC~5B[(qk4Uc`-^(3,RaƎgwODqb#@apK֬> hד6t   z-] mۿ/J͈v 8(P?npr--,|Dw݋rGTmmo'UĒ%_3ƕ݁HדH[ 9yz??9cj qaKAUj\SMÜ P`)F|Zv.֮ LIӋb#{LX+ òׇ]Q1A4^Jk iF(i!XOZ5! IDATs@F(J{ tc 4 rE{'k ""(P?n yaa5V.D= X,3(zUsf[cl|7K~+\Na -F8쪯) amϺrg %y$>D؄@qݡQo$/Bt %bG)Rhew:& Y/<=XhzPMM@㥞祐L4 ϣ(7s, en+/_K%(׿FbYU~>0o lޏm"G= ^yQz&%&iS0vk7_SNzu&UiA,愧@hY9gdi=FxD(pP};]c,Zt66N|j {T't?h4('W˞qL_H~aOhIuCuB @k;jSa\9jy{F*I(pS=T;ej7!H:|xV|Zfr1AT'˯Di"ނAꐒL,~q ٔW@ Ƣ{&|@ܒMP< n ܢ@3툰9qau 3ͨ [nB8\bG:mG@xSfyP(px(Ghhoم %%sb]_k3ef#u|)O~{cN5!"T0obZ()vqVzLuo.ȣxoG  @4H :1;,8!)<Ʈ~DWJJpbU_ |>M:[WZ}iҬ)n(Gu` Mg*ǀ|A@n e1A˲ {돈V[ί !X2ðZ a$DžLl(5AMB(p}|kSnJ+mTO̴ALRbu 4A'1Ax/&DP@YN'=ne߻L/FG[;(.6;GE*dU+DCaLc! tJi5(J L]R&hTajZ;xNp OءpO|By"|(_ѣg0J`+qݱ/q wP(G\&:ͥp!{8@2:GAj&JvAP@aoSWC s[w[Ѭp>Mf|1BC5 >v (ܥt r, ^#ԓOa`QD<S LJ5j_F2"(Ȝ/}?j+*+ Fl<]*(Tm3m1gD#ܗ;ϺnJ£MEF릁 JL * imCJ=F^)>db1 t-P7A` RF((ܰo^ 15B}:Cf r5uN} J'5AMбwBB>3:_4TaQ!{Lpɶe~|557Ɠvʆ$hNƄak&PZ_A} v AARk({~p/  Lx6tw4dW1i Sb~X61 :L}P>6lோ?381Kn/&fxMswB fxX`CH%ې :WqdTslQ 9۟>LUCQь `mGbP 꿕[Z:ZRIUs5qv'Y2ws* f7=:ȇz©=BY@+^"4A趝HP G]ĺcdz?66i(~c0*.:1q(f0}ڙx"b/]y\˂d2ܽl{.'1q:|~ۄEذVvFh15Bh^%̻ ȶ;1^7D"`rA!+e tX5:5cL%3@w}xaەlԫd`]>+F8t)Y 7##8꘮!K"F(6ջALgDToi&QX?ʎ  fL)üy WBҥ ۦV֔Q]kTO\uQ`>XtP0P۷5B@L(м /n6Hݭ_SBbcX7~nukod/GanƼ¹],p!bԹ0^&H u,rE *:ǔ g\(P(pPo{n~?ﶤd6V*([CfQYa|4mOłfT ϥ g$x#dJ[3S ϩTػBDbe`eܫ1@:!m6vbU(-,MٸIp j,oJnbz?RjjG#WeH߭[79 <(%8L|t{RD,R ?B(0(PVuwaNo{ 7=o#Txtb=UPx2ã䚥ji|^ T̄6pێ k F t({NAe!8)P M;L@Sj(`XCpU_l^^)֯):Z7Ùr"־5ByȓH~̧fK#o1PD5 tL   K]΅'neL bc@?b9F|VmSZ:+֔7](;Bҭ#޸Tiup|X-m!ؤ@8zN&hyPP )?1¶aqnlF3S)\+FQ ?H?E8lv> e|jĬr"+IAEdڬ@ę 1!؁lEy!lFw+2AnZxAR`S 0oLU J{\sz4k|v[z>w5Ə=aAƍOB#;_aM0 )s`LPq}L$hd4/]`6JQzHw+{~w8}ڙ3XukC1,jV\D),5o`n$:Z`n8J wqPEL7.S7.MӶH$=& y, @"4!+ g|aílIJFKR %?@AA18TF0:_A zK@7(tpݸBes;L3=ȒPPPPCN㥥l&hwnt1aVG0o5XجJ/Kd2LЙR'd jcL4(8+՘g²D)$BBBBi(м_uHڌk`kQ\\dQuucW TneZ{(]|bS#~5BKA$ӡ.x"ohPP,(=4'̴R[S%#&)g=S>ݬ@5Pr Օl %F2X%e 1Q҈4;"8)0P Q {ؽ]/ښwĂ_@ui|E6npɄ am#]ۉ?gr{yio&& & PFh j{%ݬSH"5Y@@|J?OFfQ_Y0/&~!":$MSMM(=3A"bL11    ̘za~> ]h޶?mhfepsQ Z]3bhy؜HO T=lWȔt#b(\qB2~<(rӏ\ Rƾ֯ yyeA9IWfAw݋rBUHq:[mwOyPb'H.]b.U(71{ldH%s!((䡮^| ` FUuuR&O> \bMl3\>O)o.>O>SЫe<)WQS3T    D6z %pajh@nOWd14c0kf 5BT;dyx55@ӣCT;T*6a)Nj0++bѢ˂Hy3**U))+jkJEU}Z(( 2O^.zN8>PC&)'6m'C>u0{ʻ@J{BFV~esN7}jf^C`F'=y9fwL \*Z5Ģi /= OʽWZu%Ma%Ca d$f= JfrJx & Jv!=l{]}LC403@xP`/&;un3@Ss9󣨩8y >?ugCuu&?Sho'wOr̚w\P2 P׊x&"()L v ޻)'asP= WKěqq{?=-] .hu#/g GTV=\X,Ѐ"܋4׮3gmwmCUvv$?r]+x=#ʝA*Ֆ L.-abթ?übTx oyZy}7oQT)p((8!(ЈuAy2ӽ`DN4?d7ԧ~{DGۃra*ooXƸDG˟٪.~!NNf& ŹقJQrKMP7U=Q'dz.!Oy֜ ހf5nY9Xyq9ƌ ϻP( @y8wAܟA2e^}M P֭෰Pi&M2S ۚػO(D_ȹ#'HwOome##_Pէ܂+I / :/nj9Ch>l;*(8+)6p! +q}AvS{y'6Z61#=\c<?}C,%"}PMAwuF(Nzl{>L2,#XQ}1Á /Stjڬ 8&t7-`,:4Z_Z]TӫiF\ɑq%HZ}aYc,l0|n!jNq&jO fXT<Ui5ldS"F^ D^`8*;N1P]ΛF}ŋ̆D;_F<6~~~Q%Ɠ׊S=£gؓiGRNQ@0u懰=?G8\8d Jαpg܉3?((8=ыg`1W2g(Qp"5JS2RvRBXzVv;B!S`L _b@@mz mp {YֆoM(#lh@EiVfFEGcHZww{$X4[(9ؘM"5̒yQSP4  k8\PPP9h $  ZĮiŲ_s=9aжq9~۔%_7SVt<Θ иh=RtC2MЫOG]3#CmB@}<&NƠM26񢒙XMb  ۮGjaZhitKFU&BA)0z&"f/܈)C2A$2>ş  5);|1a{p4B"Xt _M>6y>ڽ> k;B9h9\ %3f`LJ{?(8#Ü?dzɍ\[aYGU^-h/Z(/_4Dzwtaop ';nbضy.XMFP(d!+ҘD.t&f6A*%87P= Ș8ĠL0*aS!|Ng؞a]謼<|g\]mWS1LcE$bG*-QZ(9ãaX$=ʷZrWq^؅ %m hdBGN M0 sւO C K:c8ܹc䓂Ruu?nn;neQ '(5sbnK\k$JzxžyJv R”gEC_!g0mևG]>oE?FЀ6ӦNgH%[]WQHsG&c G|-jf&-\`۠@*)8ҊLGA#$!쓡y(*.(8:qt;b8 tߒy3>"PvWbPPਫy/c|ːWh۩hlmZ }E%K3Nqp?cnt+ɐiĴZrQ=π q:)LCh'M{Lv ҄@gKa Ȳ/y8LoM+4*(8zz[ ,XPcl<1vp ,1| qz6AhO~ G|SD rwyw0*V]JuxrbSWWs>4tN˄sB±CK]NOnق3Bt-XyD{cҞǔ ͧ;A@}&,OM:@]TPOTBC@灬P8 b&8_  憈X*,/[u0@ܻh ģo35BBd芘|B *n"Hej,QJ/tMN`:cة.@?(8SA4-kx$`q@PEGc|ɒ͜А> /gжq)tە.ɧ-یuj2L23PvD(p)94.eVߏv};6C RcS[0z|Vg {jj_̊N[(B ]B#MTBC@glýB\cT@g>@R<ֆwof 2Pd%2 t?-Ssbfè}7rdf{FBU#T滤M"HRP`V)йY{kp%M%eyPP`ikf?}iOY5_ @48 &#\ L$:MUb\!LipV1] tDb Gd<ڄ`$7w[#  {?v 1ã6BE¢3ƺ^C\P=Ja~d[&H45Am|@a5d[bU!ɨ\DŽE_phz %=*Q+5$ E]2o\=1w]F8JEG#o!c.C &J/(DŽGg<pQ}PI#N VWjc`'[4tGjaz9!M{-9S WLJQ3RRP(Q3uڛ_ nC1Ac@PP`;O ݤG PY68NI#,ĩPd)SkEv̸ EW z4 /%#]^c^]TMӉi6={K y $<Ҡ|ei;TwPP`NC1ƹrSsCvJ5g{=,I|wpÇ$ѧB mkj@ /&-P(Qƃ5 z"Ҽt  3c'ר;B-+Ӵ *X-cb% g)̢bՁ~F({P^s5YhTTO@ao/g;Lɚll{I(pݿc!cuNw",/ȶ+_K(ɷ+rX5vw) pM}ukdL:j&h- ~WK41(P?֦޻{jCCALPӞ@{!8&VV"/4,)#,VcTGCxyB?}9)1u@.bP7^ͯpc5Aq˷  e#ZXU>)#}F=b7.'2_ȢR̐@^)Э?.V߀WjLi$܆ Ԍ#|t9f|B#H,FܣG"24qӈ.@,z\(pHBU\, Ss-,ma4c,lBq`0ף5Ƿw!1ѤFD\Bwv\(p)~}XuyBD])244ȓ_4: fB9Eqx w/ڇA =wDŽǴNc,* ,{PekG?^1mtbgã]ijѯ]eTv6zbL p0쳐 skRgQ*ݯ܂o݇է|SkȺ 8^}{h;/@~sfLG~`/còƒ0;WK;àbpCC;}\ x^FKW(dڏ;4HNnJvhyB}ȫdvr a<%fu5\ӴPL0]R&}*@@c4}GGQtL? &;{$|ŠE8+5BD~4k\5yQ)B7+s rM,\mR88.l<'lQ EYU^~ NЏ8MF%x8+[Fa2~۠T-O0J܍zvpS i+E4 WS3; jUg_^sI(pHBUyAСg~hI#Tlľ}niͼ/!W~sN3[( LH0Z 4_-ߐ`&{2{ Bc!8t Pxź]iy/tged&s FݍM 1{{kB[In ԈQ H-Ot0`]$%1dr`)BBBBJ?|8|䏙*>Z`L~'h /|/)_ s@I4ࢻ~sIw8sPY ),zI[/EC(P(P(P(pkUAAn<~/eRe37W#v/܀KR)չeFmsтOBb (pMS7`ĄV9(Ej(.M~b#"b6 ̪2ۯFc,.\C-4(hߥ02O@nQj*$/1Dȕ@@@QY!lxUEaq^JpIDATS}⋱=a[2=|shjzY~,X}L}!,@+ͷd9#K&.|$s#&%RB3G 嶪Ĺl{κVlU1 %͸@a[;9Q3fXKaGhUP_Noq29=[:~ٟ%ɋ Y0y o! _P*OFqTY9RI<g\vNq}#q:8oEr,^̞u.JK D#;[;[7emË.Q34þӘT55砦Lz:,+,WH$eI 4}?!;>tE'< *1cY\} *ףj ȕ,Dumm;">֗j!fgԸ6B<TUGUzTVCIנh&B|E"фmG6"9hk mm;޶THэ^ZF-5^w`Ѿ,+(.OQtE!.r;.ЫH$))PvRq*Dh#bFDcFLvL 좋pϨh|K=d6aI"H$:y7Q[b-XX&ׅH$YE`|w4/W•J2Dq \q#r̘sG܃|¥%H$,_/m9Hz ?#Dcl܈grCZ c T5%DcBq lY FXk,| (N*|"DQ 矏cC[c[RE8 (kO$FIa^ h%O(#t;_^eY0E"hXu ئb'dPCf% KC 2",fID"Q %,b1>3$Ȫ*T&(,!?B\"hJ)P8b1tGD"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$ ? IENDB`openscad-2019.05/icons/license.txt0000644000076500000240000000206113424335753017405 0ustar kintelstaff00000000000000Taken from http://tango.freedesktop.org/Tango_Icon_Library, version 0.8.90 / public domain: - prefsFeatures.png (converted from preferences-system.svg) https://openclipart.org/detail/35425/tango-desktop-peripherals / Tango Icon Library / public domain: - prefsInput.png https://commons.wikimedia.org/wiki/File:Input-gaming.svg / Tango Icon Library / public domain: - prefsInputAxis.png (Button removed) https://commons.wikimedia.org/wiki/File:Input-keyboard.svg / Tango Icon Library / public domain: - prefsInputButtons.png https://openclipart.org/detail/171015/laser-printer / public domain: - prefs3DPrint.png https://openclipart.org/detail/2281/information-icons-set-by-kuba / public domain: - information-icons-error.png - information-icons-question.png - information-icons-info.png - information-icons-warning.png https://openclipart.org/detail/171382/cross-icon-by-zawertun-171382 / public domain: - close.png octoprint.png: * Copyright Gina Häußge * OctoPrint is a registered trademark owned by Gina Häußge. * https://octoprint.org/trademark-rules openscad-2019.05/icons/mask.png0000644000076500000240000000446713402025764016671 0ustar kintelstaff00000000000000PNG  IHDRH?qgAMA asRGB cHRMz&u0`:pQ<tRNSv8bKGD#2 pHYs  "IDATxK8 RGQt4h:vc` gm)4b]"e'Hn7D"H$D"H$D"H$DҏzVGVϟx:<ĒGQ*b!V79XMU}d,I3,9K0oBY]b4[RQdM**Tj0[]c窰ةx{V3ê:&XSg[WgZ`'ZLXf>[z vq j_[\~L '`wxëz;+t{Y(x/hq=ߣe_$+f> V콞9HV콞.3co byh4'zK! 3ЊŁ`t@ZAV0 B Ft 0l w؂bR950T;L^i0c{ T;< 7 ̓yXl{jEW{՞3yPx55x6pm{jk&ڶNmk&ڶ5fjgzuQ;3 静;5 P*`BرN68vij0:АQփ̍HM ;s NesS&_!v];݆Vinly o0 :ϞwG/~Vj5; ?_ťglqgx@- :vdKnM{ ͳt?nc4.l ν;?{`׳Xl~4bf3:zK/rمɾxudͯ?Xu)V4aͥ7pqsKtrbsmV Kv*aNfTas2A؜Ku$lΪ:aSVSVX6vk~% a]Rl6,YDj'goWb}MdQ]'&bW7{gPOp6*-N_"\󰆇]xX*d.ӥX,˹Kwr,'^aOb>w$^^JXJv=˿_ecla L>gb;0VXq Ky~)v] b}.uboRlecRlS]3J]M[0&6 b/kB -w;[:62 w=g: `8ג+>;z|gmaamu'3_xUgWXg*l|K>ƒإp[Ú6K.k0lyjSBa0)TvnS<쭞 3ӻk5x64Xg}Ux⧷_ꯉ1[yVMLo uM`٦*$kŎYcn<6XbzBF@COCpm<> n#桯bwXa;(&)K;,b!I> +g鱐K:ltQ1`XaԸ5I).һl X {`bg C _X0Dk`vI,.~HCvoG~ٚ>O!~h>O!ϋ>4zI #׋>|{h0Y L;ƾW!D7Pp eA,}P+,TRX4K6`Ũu$,Q.&KQta&JptկvpԪD"H$D"H$D"H$D"bG%tEXtdate:create2011-11-07T02:03:53+01:00h%tEXtdate:modify2011-11-07T02:03:53+01:00 IENDB`openscad-2019.05/icons/octoprint-128.png0000644000076500000240000002213413424335753020264 0ustar kintelstaff00000000000000PNG  IHDRiu+ IDATxypu?ݿ́A ) ǖ{MNuȤhWMX+1WPmm"nf-VDYoű)kwJd*rKHKD]-!b 7sd ~Gwׯ3 w^!wRidޡipz=3]Q1# dL42Ot=ƀBpv0~^E⁧qFemFx'*WsV'NbAYBd }5V/aUIievVFx3@cp DB%hOvQkHs]v#Bѯ_̱H E;:p1CL^ 5k1վr2`]`#l qࢀQ%=șw`apBGHb 4"Ajc.  [.& "-fiSn&Tݪ1iqb~p+Aq.᫵4I"bLIkLl$j!b$l14ba[3@,'qw|f/BqA~_tl|8qbDz ܖ!`(2Y=OqguwYaM>y99V>Gm_=a2@CBH1w&sK}ٹ~_yH}^cU$b ]'/2~=PW==?WŲų|l efW0J2\{.f22t3%"b$e*U+a,φaF)q_E }yK5]E\5}!g_(.n60pG)|ʹ1]t/׻ :?^=x|#޽]hu;{7Y| {nmyM- .lbi Y[q;Ԏo}kdĘDV賙sِom%DZ|X__=Pࡇ qX{_^͵?al&W]NVi'O&/Whϟh=+K/vTرcw/wdi6ƿ@^qD(fYM3kq BNouWb X,rϝl rdd|s%}+=đ,2M{(zSqŨXyP v{#jKyajg& [!Vܧv$]_K̷^y$ZIJ|#%ÓO>Y4,[Fevjck1I衪)zB&aB ˽| O( 0-b 6o^C)wInT/\zp`.=HG˿޽{'o(xa50p0F nUc[P|cpYGV15ן\zhNݿ>wL;ᰫmѣ=<dm` =ֶ];c/~xbkjcjf[׍*zd,f07RG6fEp{tKc|"R'xDlnɓ'[xz~$2\p-V0\'Ol^O&8`?w"?;{gFε vt9Q$7#7kKb))gQ}:  +Ŋ.*o=j, !ߪr6d68*0@L-M~HIgv"ӑ8c8><:sWl4?00H2]Ddj<܋bM_441R&5p ,+<:{Ĵ~a۱@M̉ S62>젼ODhpߜ"4>LP[g~oi!f3 Zc6.e;S2VmC$ gW#0@1F3~ƜX(0CG*;QzU'QbD%9(r<E(gk5^e_ o1Ӣw~y IN_^!"q9.7A^ Vq?\?[R LEՋSi%MO5 sڈ|lo&(.="K+^bv1]JZ}/!m-UK-dNʼRPkD#hm\)#d>ar;C6NV49 9\hUcVN:.n#b] .OlsQŌ`uPN:ے^%j Z,d!x@f>Hg (1QBP0/ER> KV"d~5f_%x zJz(򼿒~QuU[FnKPA k׊)0X/y<ʿJLԜqe`ocN SA 1*¦9n)bY dƷ z8[b(bpIQH(svVON(.@ER+&?_""Frs&x sX1 PoDX,.=/ 4[:Fp(z^KR-o/(,_ee %;iE*MGVd'T׈"t359W)fF§dcű`^"(zd I?v&+b 틝u|. y"U+3G kg%7׺aQŜUN:wP^Oʛ2"SQ]-m?'Xz"ky9 n<]sib3-΋IJ@W$ 0Y ]+nm@ZDD$߇smGNg4iZٖNW2,ûZ )91O|yn~\ t TY\+8>RیTƟ}vnfmuQLkŶHCMz*UDA=bu` iWD(:[};: k 8>M02>!> ׇvAarDB o$\k}@񝆀dꏥ6bmt% ",p0@,xbbQTAq(0/pKU;!v<il^p kU>+`DGяH35 uLi< 3Jrrc#!* !;8 >&Q]M1/GS6YM}h}S3@9RX]tr؇T.om1M֦Μr<̇)#5c seDJ40U@ kFnt_i J!ld `Zbn11J5QG1 l EΫoưo/b3V5MBzGAM~эxWU/^m&H1Ѳv0?O}ˀQbyBM! IyD3^؈`sTy8_(10kxnZ &]ֵPv؈p˫8"ݫbE,'=0~\Œ`wA 6Ο0@^ ,DFD.kjaY9P%bBwbE$rj!lmkw 컱z>z;g2oYcZZAptcJ1._=3.{ݝ,\v)'auM= 6 ԭh3^&"JDd.y`_kafKz;GDskv=ufW,2S''l6c#׋gy6ZAyX;?ۆ .6Ia)ʀhT\ "@rzV{ T1gPZң

1~3t|M&`#`Sڜn[@VF(oU0"C}Uvr_$DҘ8Jre4Q6Pܵͼ6@D1a>UT1.B}vJOEB"FvÕ> 3Є2Ktev\ӚdALl+Dj'iہ Wܛ)\rT*^Bk_^G8w{G}hGώR٦h޺O~Z{ssؔ*aJ0Vf8K blZEBkXTAZ `b_3HZق/qvY.I#G!kKM=h۽FQ;z'o$ϯ0L)Sj9TDN4R+}~K:")?O{Q.$3aʄ~;zߺ+)3}\}P>0i&‹M%Ki$6Xx_ؐVdk ֽY%5CϚ:i8f_۞&'Y^%{u- oOsmh_n.7o6,Fsi; ;Shv}MXooSjC_ܪ^'qssiwncCk;ڔstwfY"bOr}bgw߻*(Ya,xtGS3 UG|K1gnّ1#`nPO[s7k;qj_Ö]1N'W8ß|JҊZ&[L:jn 'I QTEԕRS3P\Ag;7. O=׸-:ժbO`3ktİ9:7Yx1trc I=³NmA[s jh̪sdY{=3)qBWi MZYOH'O~鄊 B7\Ή%V ;)gQb=" 8%FX5>[@:W Qdl9=ZiD-ni*Z .i6Z/N>?RjP5HX nicsY J {1VC|B{-蠄Y>D3+nEZXó UkXHs-2- ;onچ1$7>:I WjYɺJɔ\ص`(+uV>",[_Oi\{^8zc膞f-j0u-`kX ]rS m|طƤUR:&&.f°nXɞ-7<.6Q)+05lI[Jġ/&Mm_^U7]VK 捄]h M|7iL~@"">Tp[U(Yz~zvY̴$mfJ䤕R.˥#25;2fJ3i" 6Ӗ7Z:;xhwqaS8 #"""mP$TWhd`sCo/@9Ӭۼfs+[mddl&cʤL˴l.:ڜX"Sjicmz5.Ο5mwkBn 52,^fC/P*:p  *A|qդ}􏍈foKó&L=@%,͖CÞ4"X1oDT55Bo hdfFyM簥s<4bsXTG҄FP _uGfM[Xv={YcR{Ɓ_l#gC 4¯d~̽mU".u/eD{NvzW}M Gg MlO׭ˬ!wni! P@E'gH),]>NـT.;zk@ڝFhiUK|e1̥ՅT37+X4ϽN6NTDh)X yl.+w}}/lQ3Sl6vf*fL{WMT9#i&F49 `qt$q)8u_NAttܽpbnijY€ri2p.}a^5k/i۳SUҠf¼۞ꝝ%VI|+|b8#?EXt*랚^FL*qB]3KfLe)uRGTpBUSddVZȟV:WS1rtLN?R4yjJyB^\e~#6)k0Mii*wִ+f !R=N-]8t$cnw-URGw]T3/Z`.mZ"t[1@>?;UWeA :\rȂ笂͖K3]Y"/M~s!5isС/vx^ھ DzIǧR /AKb띜Vt 2D߿wJτ2M[X)=N`ה6iHM7,]Kuq+,~o_{ywğh&#N Lt1o Tx=o; $1Nj&3zѶs$F3Hc?`}L1" *(?9FēGir- p׸m:˿Q fQN ϶cz \Ok wt+ŤXyK/Rb?tFE`Ş/gDbVI:ڶ b;RcJp"zpǫ6ӂU<~M80v9~=1=(P#VxBtVSuɐ>VzG3@$CiJ0*M6+g~}|:|o9ѷL火.lIENDB`openscad-2019.05/icons/openscad-nightly.png0000644000076500000240000045744213402025764021213 0ustar kintelstaff00000000000000PNG  IHDR`DL@IDATx uGY& a0Ș DQ0"ȨÌAAVqBVdP"A [z/$9{g}[WU}SUkZS{DI! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@! B@YّkB@@~֏;>9~8%(#?~lcVtǚ] ǎ2}g(Mx|{C9ǃEGMGkBH y:iJF+QijRY&6b;ʢoy) !p8yF!pd j#FVi06\tia7`Mp/?XND`WB@?WDy #pş}ҶO  Rt/U! 삀UX! sH-xߧjdUE6A@v7W#x1*pUVV?v\bWws>m8ӪA B @_s޼% *Hn" !|3edr=o*BRKҞuLp;:l?{z՟*m~S{Dv?OCxR5$! /sncd+n*6)ķ4LE׽s<;E G=':9؛r$B`ЗV,B`nr֗W_tmb52E@VB#?C<{vtTj7Zy?[`Z׵έoioZ۫orCezk (lHGZ;~Y}kΐ#ֱX nl&"xk_!۱u@,bGw'`8+X$"GB`5zz>M@\})V^a8si//WPոuTn۬>(J?v6c~5V}_mǞ^ƗvkzLNa߿U҇L}[x V?-yai{tr;mjkj[^cD;1R4`^WvF=`]moe8ys^` ^!"AfD"! ݨKp!7p4iLbIVm\؍ ,nY@$Vؕ8MQDFw7'뭯+TIk-C7&%V` Ksx2HV`q 2kXX.A\ l31?"[^RF1uB!vvl6B@#|'NM֮#g6PSB@lĵ8R D6K Z+OZ󠶄>cؾs7<}6+"+D,Z]>inx{X_?uW|NMns#55[Z{z"`$uV%[X+Fdzf  A@+ UAƊ=%;t[uů.򺽴[-*F'k!ppOؖWO֏ٽW[ e!X]B`mx{qW<Ϻ؇$ ?LY~oMg؊i0B`WhvWYlWq?B`9e>9vgpu3bЎ5KU U[;q>d>7q#v>ʶ[*"k_576Nb!hv/T,!0~X]p{'V0]<QK.gp+/~Vdd+%Q 4Îa?߁!m7»6}# ngf}luvˁfU읐ݑHlB!3ihzl'@%SLzг.[륬D@[yը?O\٫zɵ\/jH( I$_^_n_ ǎ|M/ւ*!EEd&oE^_)W^s;3v&) !l^X [V[wґ@@Hf r^VwgZm $۠Jˏo~= ߾5?T'ngbr!;~>~sI+V[Ad;_v=wԲܽ/0vmmVEp鯾Ks+o$hƥ{*;s+㏕p3ϾV+TQ4"}J"/g~K#0A僊- \+/1nDP`n#ŢHਙ=;7p/Ib>~QǷ<{NyF-!MU`wҚ'ᔫٗ6f|j҃\-SYVQ0 x-f/'FWd1?\;Ys/ QOz..NI+%ֱ[yyW~Ŗ "{[v G$։l[k6'-UX 776?׼ξí Y C!="p-ϱg&qj+f}@<9&_5py+[U:vΧ`e^l}r}Hbїx2P! {N~|k[1I\i?'}Nuc;[(X;1A6лD`9+97Fg(>8 % "#@TaWO|VO6Š2|`KY\4ad-Pcg?mh>2}FlW~Hg}E@v!p-^4Κ{]ZJV' NZB}áb-.*FcncMxxXor* 2_|o^uPL./"{nԳ@~G 1{q  -|7}{,[V޽/{R6kuz`Ғa ^ǒIJ{d;jsd$+uCC<6 Mlqb׶E + lF{fs_lu['u[#5x 'L./1]MQmW!|vҏ)߰vAL#Fsu n~8Y~W9d;Kǯr^C[oʆeۀ?gX9eȲ]C pXի/zTTnW0z-̱ QQY+JS_q?=}n-~7<a:s<~;~rFb#1qu]:/EۄGJ g:)!q R?TN-c}V{:P9(犯DX\G,$^r zIk6h .ik{K?%Cǐʡifn5/XejVH͜|ԼZQ4ZfZ2s+uhGʨJ?ӿdyNHTL֡q.X}vGɿjlŶkuE`/zHmB|;'> 7 Ck|p(#k~4l%aUFIÅHVS/@wKW)Vp}{ym1?G]ζ4>-Etn7$yeܼ~*mCCF`d>}!P|dd Hjxd.9i9#~?K[ rf^J Vk&PfR[5{YC''yOC޸m^_3!〺f!7=k`pȇ7NPw>&lϫqXk~X'Il. ŠHrE` \NI/@ҩ=NבS(!@Zf~|\ۅ^-(6:ZVnr&Hxx'T s(mnS! #[IsH'1"ꔁ8oE[C{j{w>RXbv @1V\˪k3,OG_v}ؠB`'>f>#7U׶J W^JdU/| ,W[M V`S* |Ano!,vvj]JUǥ!O_7*VHlBCzh4: 2Ro؄-,+7f&[p?W`}umX?ߴ&֔8D,栶s,lϷr[ "{|rl  ġVIfVҹ؇a'?_ऴ00hO+7Wu[!cƒ|8,_ڙnVRi\nMz-c_=[>V[@Bwָ ø/>\q% {~@{k'/et3clm+CZ͘ŗ=> =E0HS MۧهaM4d<و/T"hA/2d:d|5Hz(rW)XeJVК  H[%,c )([ 'AZa5Ve'Nn%aM$1-st{Zٶ@_ĎҘB k)TV&QeSӓDb+*oX2].r vdeј+" :oux.avֶ;&lw׃ijgeIޏ!ڸ9{H&/eQo(j)筜AJ1%!7K2)E "&l[r} ~9[Gwrqժ 2Ƥ'>+ilOȥK8]٤-v)W2HnY?G}'<>-192؂`L[>6E'[DU j8/hi0UQV4rWS2lImؙ-Wf-_G"5q@)l^qm0&|Jz/ "RQEJB`82`_:I߾urd5 +V!rŀB|˗A *?V F4c|VƨTB``Y-]#YA ک$_x*YuIԡB,ePO7tCD> E=ʭ ϖ0' 6F?7V,ZF\ b <(+qiCNeѴoPf\q`;;"-&a+]>B`(:Sܳ&7$lE^vjG!fPOeh'*+# 퍵}o.PDJHrlcQmT^DiNO|셗=>S@`y:%B`N并jdl 9# E^kOT՛t,Xn]{Mv{ov_ڏ7<-?M,E6<qAT'FIjIf)ug찁3L{ZdeGvv1(z[hm-W[ ⊶1O75yHl|5DC]n'I0=W3If<O_cKľD%t"qB[HaPm0~n,*>#K!Gu!@j쫫`J*.[{LJ҆DOxc$9ˌnG%]^ P[ou-z[X==_=8A=~/rZ ҉/|(yosĎ8 փ79@OMԅhKĵHTS]I,׿q啫W$INI(aJ I2;$N?2C0(s̉/faę^b! 1]#) ps2髦N41zur#Ȇ텅!MnT1k._-o5;E\ 2DuXNđ}XͯMo~C/gKC?ū1|݌\]Mb rdAXjtRʱZ)մU]X|"z4g%)I˶ol5-{}:6mB`[87 UVӐk:J*H& u2#ヽ`OOּX4Bk1/썘Do{;AXA+|2YI_ه=}~Wbt ꊿ嫮IJFh1أ6p%R+6)i Q 9"!KkHPC}4Kj $i9a X5uA\-OASXAp ˷Xb 1)Ra9ԪkihkQCTkG_," /np;y#m#!$Njv!$[3GAKLV}{7D6JZqͬof0 880 a5ZG7RhA8(C(@bEcqicy_uuqw;$cUx_5u,fޑbյ&r-pCXE3(MuZ%F0T>WYXiX{k!$$H:nj=s3D/6-x3Ժ K;"ѯscq= eBmimaNXCAF2 * +. ٱWP&yu2 fv-VbVc$6cL 9bYZ? qpfqה xW.u0Qۥ n}+@u7WaADEF324!rCj$n^녨QFcVa!i:~BNXd]OXTpFPՁLuXr@dec(Ѧ, m|!C9l*1>yxO,W@ZWЍ{5!k%֑>G=Ai]A(+v $3$'mDr~ Y7цGvrW;&lz>&S* >ZFoS@&ecm(!.H)M+iu(Azd՝\¢ >hYĞ'm;&;סq"q͕X_d$T:\p JY^nx{=$%DS-P~S ɦ!%\ B& 8$@GW^kd1HgU_#dG~%'q5cQɫr;Zl'Swo'`לxf+큇l0\HXq= @DHa~9Q+y#F Bgg*Q\IJ3Lm>Aol1Wb7r[BQB`'uY0|˦3+ hZ )B%0ty+WRΌ>YϠ}܂1>.uZ BKɭzCϐ픸DbÑpFXZnx{m WJֱcE)sIr9&$6F|ă`ͪV1j@ɫQжJX#"K˰ϕQJU3QN uf!czxS'ՓR<γ'o-[2[nbl7QķhZZI.OM ̉c#l2W I?JՏOi05zlG5IjuNY> sVHlEcu"{V7yɫmd5V."hȸjO I>Ib"Li:4 T%cr֑g9{mnVX9O^mT+ mnMҶَ,$(,I#ǖr!u ͻ1lBA[7b=1hv,3zNKh0NF]qZY ̃<¯JI( p#W{+$|RV%Fbf]'I"3–PU<A)eۂ"]MQ ZPQ!@%'ƻH 48BeX1$Q{_izʩ4aR J\[uv*~CHt+%O:NH\AA^AVtzBZN}h<18/K.s4F]:nR˾^-͇]4~pZ"cmF 3ŝ l~#߱^C(_a& aY#Y bI5p@b) X񏛧 " ?0OE=b2V;_5vSwotvAuyU@e ^uZmVa5nv zZ*<:A$qmeXT?U[qSq$֞KDT9£a\|l4OvWfDs3^CqA!@6~ {SFA(!MGʒXH«ȊMOw~/')E$]%B^5`bmxfi_m(Tn]p1FP]B}$ymXmy ⇲X&'iːԑ]Hjj@:Z>Q\keɣN^ VbG^.# ,*$o p ֶ04e/&& E]2~ ]qc=}n>h+} C[eA5Co+\ S`% Y+vbYĽ;ю%n J!a:.' lշ8Qu"iA\ &%$3j`fy"'Y5 iMrA3MR`g64i%M[v%ۥFrvDBPfavt/pZ&tt=UORq-C{bY$XlOl'@6Bk> |I Va +Q]ӴL} }()7Vh(#%#IeƝ:)ű9N ݖaïio˽Lme[8ׯ7~ѭEe+AqtqG,nql6 z_Z7F^n. Q2*-aQOf@TtjfLwhPf1F=b1X 5/\__3uj"Ӭ=7dlix]5He.Z)/m9aGfnpHIdU>XeGy`'(S|K;c,j:[j}r5oV-mW[kT*\PKv;:q%li ;2&Y)oD#N!Jj2}o64( |.v.w~zl' :Y3X"6NXuqM ҍ}k E`ĬJJ[$ *  B2}61V- 2l72jC鉄" 2! 䯑LI8'.sYfQ}`gFk7AӠ~AR2Vm cbvԩɟnYME\&FDb'إ?EAIrmITtDd觑rď` BCZ:D1k8B^;KѬ~WwfI2!pGW#[}H>N &"$,mzRȊ=S=jvMk/uūnH5_vi4 AWt`(,>};8#W]s2=:v:Q-Z76bhVQfne1$2+uƇS{A8d@8Æzwu7ojXG5iQ=g܍m0jɧSY.IFؐTqZ,BO;*%wl:۠Bڿ*u4Wأ eƶ>OzX8qezɺ׮xCDbeSw{>--7>~d/ȨioPG>;Xb(ZcwYp5mHkfbe-ղKm%gVz2'vUbS@Ⱥ hGڻ1IH8-F4Yl} CDv&}Ƈ} H-z=} -_.gpoϻ-M2m$J1=!_X|;'Kߣ5,:t d1ʦ҅m6a myX;FtǍrm6e2"bBɇ &xeQyM!8(ok$ߧ?$y#g "Ha{i״iL;9f3JZaÞ6bLcWڃ&XҼ9ĵr>L; +R˄2ˍϼ/JI"rA:+HI'ƈz3cx1cӍJ\.c9ڠe/.Ծ!äq°N1^oYR[ GF"[޼Vex=fb`IʶS,QO-N๮?ԻXu Ye<+ˢÌH\3IbπĂ,F,J,2meKɿl]S '-q`9>@Ru2pGET'nT d-W{0'#FK4ei~D/!OmXp\l>zБf,{'?FR$rȒ&dzP л/) 6nf߈7!۰}xF\},|+ t߈+n c5e"x* M y=nDJ 2FDALIRi% 2aah~,/]eKt{YIēfg|k'Cplxs]4!1瘄ngcym͓u]e(ŝ6Wsjqi"~ӿx[L+:qt]]J Pd,^QȰ/>6>ql Yk}f,׳Au;}v e0C yʜol?w~_V m0/hu} 8!Z˒, cF^ƁF9K 'e[9|<&)t +KYإ}Duf#&2JBǾ mKb w'P =_!.X7 k}CV6bå1Kħk$ |so;/ j@IDATz:F[ކSN^,¾٤G9m<6B߈g(MNWmz_:uMV#bVIIt Zl? b!1?+.$6F&w:{sgJ""$N 9)(G,i"e!N 3\bDE/f9.هcg 9w}S|Uzկl?㽟"p|^:dne7QdU}ճd)NcV"Xi=y\d藶7| n >`}~5!H3{#ǪnO8x[1[RaJ#vh&U6y"c|}2R_;a1 k2g a@6v]YujŵyqR8C׾06Q`+`֗}: #'WLr1YFtO"Q6CV=]i)'r5-U4ZÖz'f>cԀi9qb7#OkOkR._;50J.^u)<'6OV׿H܆wӎ@]*I׭dS:N{Y/}oe 9Gt y\>VWyه2%HY6bg9V @Ț~d4/[aܰs̟Co N9>I6YN]Ą9qYueߩ)CɬPmKx>fXy7fC0$>~pxN y G@$9=rxE`ڴ1 ),z?$\~}l=VV=mN\aӳiiY6 ]+ҸiZEɷ] сҏḳP]/4G&7 }䔦ޮ':I =o+yƺO]MC'497@K).6Jl-hZCMeI^McXy]ylrK(ͪkmc#M1hY[hg}Yx|I2 OLh8yHr{xO3/q69)2޸ ) :|egb''ތWd@7u6E}{t-De~^=ߓ8g^v|@M:N?p<>7{{2䭿#WߚM\fqk0y!œKYPXSڊܷ?eAf3k%OxL\F?sΰ:Evt4׿ %W2>ef^oME?]\1$ڼI޲QDud@ 5a4Io:OjǴoo&5_y=NpOU>0m5䜯92~&>>yt9S'Tfo9ۥM*9'IJ4p@ftJ٨>cɽns^kkz<9Zck~6n!÷Ψӣک aj:<bLC .Mᡒa5Bo?W ŭq ynI˗m sR4ڵdUHqZW@\cH"׉L!uy)Sq_;&>_=c)?q58QKv6{FT6X#B& zvXPQ.vf[jvMG9ba^&ždJ.#⊑n{յ4i 0<WAvAm/7=G$edK&(uA"EE~PHR5oJΞԅ|0YݠeCc<Twq>1{M`Vw Jq7VfMnZ"AC#A~6" rG^쪾`O⚭vӮ0j.k@?·ˌXVYΜ%i3|VB偎IXQ2؅x=_|ʶnUz*vrO5<Wh`8 '(sSNT(RO7e|1Qv9&?# Z%%X?O ge[ <;FOw=+Z5 [XD"1JVaO Ⅷw_mAZ(,Ӽ{ ZփPf C:#3 ?pVZɗ}\i]q)lqR pef}rӮsES-A p}Dxmd9m7Z(x1V6ɢ)ˎM&sݬ1t6z>@&1]wLZ87ZtqPu+3&lPn:,eAQ62X{Hlj\WZ ]~]V]`l=փZ_nrWN9䄄Ic6}{Wsb2"Lݱke$a]Gi,t?&z뫴9-s ]`{}E'h6<'S˚Su` ˡY'_r"O#*o!x_mx)cǩ?ϧm yf1wI\q`(٦)6E/}3$.mRZ`@^QϷ ~ܒO͋n|K}nVh>%]Ωek_ݳcg{[_w"BQܞGaiZ*Jh5ʚ\l"e*K\t6/|u '\c'(G˱0^X'6a Yv{br?ۤ >Bo_ղcʑOSJru!Z|FI^c=V Ւ= /A"%~qrS[O n1`3 uijX]Wcqc ,/~~_ٗU9M/$iE3*@bct~Ɲ VU@\} kW“/?{iin> ƮQPisJ^(y Wl.fsu=A6]BmlFО2k\d~Ƙgoڻm1͛1yQA?v/v/uMa@-+skE\+K^d;-ցu8şџV‡3_Z JVPF9/Qltlqӷ}Su)e=&dز}١#!kՈc>s73Own% "׬/q5ؚŸ\x>93gpʣfYf,=sP_dy?~[3%!39]N@mwMGadذ}mim ;o#|-bWL$_w]^_%}CLԳO96֫=HM#PA41yO:j`뗸f |VaGp4l&rh,U`lX@2l% 쯧wVB3;>X}k0Y]b7V8)kDee]#@y}`Y. G\x>O&{GfkwmjZ9?q @V O]kCٙD2}]J;Ċ,҆.-1M;#cZ>qE|3}hF\ 6[\C" eB'k]yN:|ʇE9xWtxqAT7!sG }wgwhKs4igsU2GJPÒ9.ӫ716vtp|3OdlYɫڸ4nJt* +~2o#';~uu\gh 51;w^{db+ ~}T<t+(5n($䧽]Wn͵dP4˿H/s*L]i^Ǽq-"_xR.ҿ{(Sm7?j#O7$ ~{E,4oE YB 3!a1Aoym!ֆ<\O#vư@Aߖ JD\Ip5Ҋ5'2Ϭ8 $P,/~f)r?'pW8Mǜa2gr:]ciJ'Dtr1R@#?n4~ݷ_w"C-Y~>[WX-^tfn8Q8Ȇu NdSAX,^s%bD7]7q1Y3jbqm"z6\N^wG1 g5u Ҧqss za`5}r0cKX}jiA^IЇ* y}d}f[%,{vl~CNی?Fُgc4Y{?Hv' /l.kY 6|\kAZ͒_iwzWfCT\<8z>5Yf?8qAK}:dL&֞ Ks;(4{[B6438)0;Vgw}yC{؀ G]cXL:4Q4Zr莃בyLA6!IxXgY5{h&<o;o൧6]A\&6Z% >r!F&?e/_/&mpAϕ0ݒQ|ڂӬFqݧۧdP%!mVf2潭A#ՆnQ3u6^><kl?칧A*z m(8pQ[V 6?nЏhc 5k0PD[i0uCWxC Ӓ*\ G-do˭VwfJUĵr]84m p|m2t MLt~yprf1.&Cn2L=>W ffuD\4b1.$雱 3Y`7/_ElV+~d;7cBfU-ݗ~վ*C(uAɼc5l77E=qEePz^j}Ymu?W}ns*+N\l+7RVZׇ67 f fxډ-͠~t07fy? LeΓ5}muRisլ~Mūa$csTNߴ[amSzf#>B2a m,<ӫW^`WQBfwy-Z!bR&$T8᠌0sQ!fF*pYrf`6T ;xy6qQ֫YbFSݚ7mRtU* F hsHx~4+I*-~@ vd?x(fyYIFŹýVW a_qk_:]Q8]gC<0e5[DYlռ'aܒXolFt im Ec7O˼İK ۏ-LwYhZ,37 {yQ~>*e,3H, E+ОMcrO)> 'p"B%,ocQVS11bXFKzwyFs[PmPf6wt/1Ufj}JAAX9v9sl(tNb,yV9<bǝaĉ ,C%aży2*m-{deVɏWDH^PnyNV[ZaoZ+!m*ifSvM\}"}`0Y(!lO pd-h =/9^&.ؐ[^+mx͛Mo_ăcMp{#Sf}q<,_x}vl 5K? g܇E݊>,!bzɆ:i|!"&7qxUnE9mBDċ1 i_*>!2d1#e \}Mqi#9)FbLf=XB=,.'f-qo>'&d2OnCj2faT{+elge%W^q/N15&iQ V ?zM됹Q!˩ȂOû.Ģ=mZǡ)lqݏb_C:ìÜG ]Xs FNR9Q\l8cz2`^ \x_5{t2'eQLMl/M1Y<>W[#6x~Eh@ }N2}qs@{"Ie:<6IyE?kiQY,h;, q:l]4!Ky%.cIdPPT!^%qt@^ tՇnlvZ6" lwFG^Ry&k'Ul)uܨ"$rl-N7@^y[ǚBشPn%$>uN^>VjxDey&\Ѽ:#|{#o xMs1n>ntC~sTQ}yUWꮷ1C?iqs16e aZmG2 Nl>@re)M1{ WkJ7;L-BphOp`޼vS]&VJ'탧is[ tמ5~ӬŸ,cb{ yjrey2>oZ͢ݞrBNeJ]YVAf<;[=z~ B*DtdMb2ւl-U&bZ[hn[ p.`09Ԙ"c .ۚ+ͬWMgkzIaӶ[hgޏf 0z$Wʦ8qE`uj\O?KWx  %1p .Nj37Ƒ1n|/{?rw{$2.*'&1a3/Yj,XSf"2V[l#f|;tJ~m|73w6A'.VBeƬ RQNZƉ+e:ۙYq]dXYIC}fJ6[2V,%ljo78 >@q]'cdr{YYߟQW=DəܕHVHZ~ `3G?;F\\ZtxuUW6ܚ^w6A\3<~zg[[Rd $0mb+뽾4!OvH(PS PۼP^jz>?->Go/cxQs{ײ,ǀ^V+q~Tհ79~y"%wRn"w|Owy?@]' t=gƆ}Ɓ x[e$ԽO!҆5%sm򌨰z?d%{l O\/_~dی"cg ^ݵ1y ~HcIh FS L=RO)85Y ͛9Bg+L㍎|4G#d!Qub8-n>tPdvl~;NcȮDWlJd=+= Y'?|3⊸{ehn+,#q.(z*7G] Su(C\ yy{T}v?TikiLj^S0q cb|%Nc^7c3tb@ήYEVlۃ[q[fd;.x J b[f[vGB`>@m/F!Ew{Nxrƈ2& uMƤsk6nbnkłkNrAaǬMӧ(bx6 ƾ$#nqqV\kW쯔]჉&otbxzޓ_?~ ro cBR'6YQ>hp,|8~AJ ,BelR B֚ŒQ'l-ئш«"'ٽ9XĽj^a(Xfb/gĕh"?MW0׃7??~t,n.c?mL\ޖQ#lBkM+Pe򐝸Bdjr_}UҊaܳyVC~Nf!;7c#U mK3Xԇvd;ce[w#KS>XsoQ 6l3&h kq18l od6yIy68mNy֑RAcW/Y܈u`0yG/0icA,Ҷdu?8˸|$9D>/z,;>#6V~%rL&gAvxvzmK㓅MWgjeȠ"6K4}co/ч\b@LzYҜ#| XYm Tڠ<2N2$ϒg&Lmc`xH4٬Fk'c# o!Ť?҆dwn?);\3ф<7حv䂇^\&_{_uiȲAb"gpk>`+Gz[) jNbpEe` _{Jk8}fN?]اM4'yico'ϗ#=mh.b{=$pgkv|ؕo Q2cf; `  t ޮ7w"fs[ N?TGӉWf_"iV F^&8*N.nĉTcZV@[L( &%>BfmRq0 f (ɡ Scf_zNܧ&KavD?lV)lx9Aڕa柭n,byιdk)H*Wa u"뎠#zo^E8`·L靷R}\fmBCʱ +o dl7RnYWR4dnEa`,ALHNs<4m~.y-??^%labO~̼IlG3{'g=čsb١7lG'H2ˉ烘h f]5OhÑZ1h16RV)Jb?"Z,Tl̸0!wzDBTG@vOwmLX>Yܻ}zt?z7񇿭'}_Q\ b1th#T1QϬB/d[ q30@8,[1·{= Th6H"&橔xuIR9tlQ,,Dh16XL)>#4kk>߸ʯ?h+D-5<ٙ]Y⊁"믿CV)H`5S<=; lD\ϲ@2{)G/Ŷf_A+|K>͋6CIT IlvOX"u͠\r]T%Y`tqӶt#Ѭպ,RTE(fw2@1+=fk ^41vOET #R+u܋>g8m~e}6g&.@a~p!ޗij,nOQ$_}Kw W5g'M04V[:iTõ|oqjzK)IJZ]>+<\f8:X%/ı^XܳE/7ӞcJn.!E˹ٛ鯋?ȹk~Ͼ'cn6lcވt^l~t9dnGNh&lz<89ܡ p)|/ۤc7˧ [uwcg|ʿ$Io'PD O`ߏa{[- FaOWtrzz( D9c䖄Y#NH - qۍ@bӦ{03Kh|b4)낱;U3>'_Σ۔d7z~E=LHF/~ymDd00,ށ$&srf q/WÉjUsR8CıN;_:/߽I d`|Г sۚ/Ncc ,ٔIuQd^t]&5;]b-a,"ll؍/tzOs;R< ͮ3佈]FO?L>ax&O[A}lP&;%w.S - }ܴ,\d~,Dw'U:6`l 8DÄ {h޶ţ|Jx@Ey,tɡCNGI~?X:A.9,=7z *1?d47/bŏa 6c~?_cm|!|R1M>|G`۾vCn3Kbr+zf_D<>^g"2'?[G&#آrNViw^qI ,~ꂝuGtGR|ivCvkywAÿՑL>t5o=_F:{돾ߺ tdv.FI+m[4e{E%q\`DDXŚq>9{O?:jOVETEi5M6Be?C%@_9`Kw;܇>xMwݎ29[߈/r É2;NrKazI:9>JZQ|OɊ4GaWOϽ2?: JO bu(r` \2q |m˧xX/M;pv7u\c8L_Ih[MovV5w<lc!]}k ?Oa{bsz"p=<п?naƆBbeCd4KGs:[A8.l~>1Iџ5,V^$ĨiJ^8Har,F`ꐫt~ۛI yk:GF?a'gѡ'M2zG*Sud7u~ J}هA:v5߼pmc>,Ko N VZ Ia'C';K^۔C#`r%5eɇz/qB/p='I,.'[ l֐W^܃OUn ,:az^m꙼gjCsKGyi]/e D3^L#w[ԃ>u.'|LyWC1Q;?t}w7vE[ ^M66oX[\`}CfbDh^\2=<\)gōi#S媌#=G4XV?Y !XpЩ#K Zh lJK^aR~U@>])5\B&O?oo&1Z~Yۍ_g=x{ڳ+)Vu@:)i>ZO\#ݩ>*=3%s@IDAT t[W,.:~UgOZCqmmnj6Հr=5FINfG.&j O$\fI[=5>"dR'r\hJR6r!$Vյ~q7; '';S6W6RbO䧀)?>}|kG|} k[z]y:erf x $Wt+i+bo:` >C'؋h_BL?1YFv EtnU]Gϴa)M[[@՛oYQUsaU%Sue>ZrCvloiE+LvDZ[iX0LGCDI+KubJz;8V/64/1s^>8{N#jmnMZ?mWss.U?V |緝=YncxMqʻK59,GHha#,66k!|0Dwd/pOP3>~z}&=ߑ:|Ga+~Hy/C',kW>"ݔ1a5M•0}| LZ 10SX/󼤓j-b"yJ8 _zgt\<]|쵿z&5Ř;I afј Bל%t9)ӳЖ\7Z)7|#=d;^`Puf:ħ Y v 1aQl+[n> FQv"6bb9[*j7tG|_~FF|lutBXҋ`L&C%]>x't8ؘv~%MݻNZὂR儛t3aj\[RCrZ=^cLL/,8F."A/Mn7u3@^-Ŧa++By?dR"f!, ra(! Ylb/|)/1vWF3G</g[TJw+|!˃v *y!iow`n6Oԏ/^z]&I1ړoY?il~LƲ ]8RS.  x-e76ĸ<&v3&D~.l:wѯb\3aHTA7"´M&m]֌ zױ]^?ʧrp_ם?$u|[ HNm:W>/qyZyZc( VSpMqo{r&HB!<㙪UT"plM {733| c_WAAMϣĜ#6o"}Kı-~SэH %qgĽMӣ775ZB/5aKI&Kȩ"p*`oW?c?6!26s\$)oI <J "[ i߉#ͥ%MCMP>".`r2ɏ*ZΥ?8 zIfg>@/~{e䓓oS; uLtxq,OJG XlL9v.XPkG JqN,[])\j} v=OGUcKzX#'&($ Eܰ|n)sAQ?OiL"oK_o1̧p$14`-/XAA`K6.Sob=]7Nzu8fg⦷={=)r+7{-Zei|O*A"P816yФ fm?]O eɶȋOlH'āz UL!#qqصU\~oMU #;@||#}0h6Jnv{>VE8o}B ZS0Z+w}2Kor1fO+lǾVSdHA檚|Ϙrkb>>zuۍ!>?V/1_s@ܖ?~5E^`^q{`~C }^>/(Nw} _<<42fDrIa˟F7uNM}{z9 Vl,`} `;7,V\b_7)qs[F4.J2OCu0E N(U$`1VlzoFŻnvW%ObD25mC|l |>KoeύC@"8jX`#eoy]}t݃(W+}!Ct Ž3\E8P[q}ypC. Q }APOrh-&?un]9ʏ~Ɛ{/ 7N|zɻ\<ܾ=̫>566=S `FrG0_boz'KfGpMҙ})ykָO%^pKX^i OЍ~3w6P8H^1W/bt-Da f 2ty~HR~&ag]ymL)a`̆ߊO"Ow8lJh$kٺ>i88.g n{鲱X::8ſAN Ztoӡp Ǎ r2 #?##7O z=x Yt]py\*_ :>aK[4*`J&e38SE AB5" Eg╅M6@أ8Ok-9/6bzh4&zDFF!|EQ|u?E?c߁7w'<}e^`I(90S Bf>jѽ-̗Ӈ|)?40; (|?z,}gyP3jvch:O݋ k>:G)&s7#^GG蛐q2S؏O<A\K3Ю l[`뎶a=[$BGē(6|ހԡ]$Sc-XԉV<%ޢOBJ#X7ƶij 0QU ~8\&WQ 1a:Y\u|knB6 [E,ؚ'7 m t^(V{A7?5}<7cZ;t/O&W$<`$3Q΁ʤ#3k]9e}8GN4%gx9KF &A ;B&2?p ]‡C~t{O a 9ʧZoܨE^1:jcFjN؁`JZNyЇԶu>lC6eބ :M#MHH-a/k1yF"&x,>jbtj_B~Xי1x<x =W̩0!$%(!Py0bmG͞>˽ g|B`WH䩓P1"^G@)! b}ѽ(9ʼ%p+ke|f1ow9Y6jp҈K l2p aL}}U8CTv"&|t9sx K,v%5`ytU6͇1/t;sps{[yG~=}!m E'J&F&G2gGy[b1AY9|P\lA¶RЅ>cRIc}'EO4"4 u6aTU(̶ؚ^#NG/Fs Xy.1'kOq0ojL7^XB(Xt5sq9uX B&|XpÆ{O5yHz+K~}9֛ZMkSOSH?D10l~iOcXcn#k[/Y6 7AJL0c᧿HܬoWpܬS$?!Q?FK7V{ן^Ձʹr )R9TNjcbwlh[z-8w0q<⩬ ;ބ鉿voH7_>&ȱKg鏤Gi!lۏ"rz_7Ű# \P w.E)ǦsO_ s{[x/\'JD_:d.=z!|mI^.0çpeXlr.5˹苌XZ91n%oc0yŏ/j11;uɿc TR{ȧO&L iL0{CyN}:@e/i~\_.G߰=~OQp5Q =x +df0ˣt6(|I{C k#|=}]AD߄ 8,DIv}n*rݪMӋN/`665vʦͰͧ=A^6|JL>QoSB7]ǁcBO:E!Z702Mɉ%=yǃ~T-"AB$Wϙ(^.Q˿ qw߿/$=O*4%W զox 0%Bk,8e aKz!N*pχmI1 ;sn!G7\z!g;;d=5?jL?N~*KektWɍr9қcކ"?|y0]򵇾F-)9z{))j N/ ښޥOhgˤV芻ƯE %^ңO/E/ݏYkaiB+Bb<驭! YXq$ .ol)ڧ&@ț̫؝<22*a" Dċ@x-lײuz)ه|R6wNr,עnrkX4Nʡ< v *[y؎i31Y<1GF@_kn=p:?[?^WwbpC~D1d<6yo*.kUckmBίfoIS/^Az7KA%ޖXg,R ElEXG^]wa~僷_-] hdv#FYX,8/¤ W҉6$'}c-8vЍd?OgE4nZp팔yet~LA{~--cLÓ5聭C%Gby]r0Xft Yxc %SZR-ĭoO2yxJR=c9y=}L SEÿh߅Ʈ&DE4VKj8k`.Iܔb/O_+l܌泖$1r~Z @ZަЋ,9rƂ<IJ1U7ʌX&+|/cz1&F4|IdO9HgY& ʝ;{˟F ;oTw D Dl 0yWק)fx"Ix!gOC4ɫK] U=@h.kkpHjc\/-L?Yje6ʲKI-$onj ZqTksZ oaPiV$W[Ŷ(bˢ̸.?E`([E /<]Xv-ܥ@L_ξvaځ.IHT}c#'^2s\ WyOZmVwʶy ޕL$070=%nmN=z`4N@W¦*Mās&]>m7㻝o opa?> ?Efƣ]bV|o{` % !-ɇ>.>7062BH:oiO*A)i(ٴlLQn{Nk!MV h7@Fϥ-<ֵOQʷN _&oxb6d[Zy<>H;>gC UmBb&qiFm<}ť3sB_W_ab5Zݮa>Nmb[OtÎ *xMfC*Q@*;bmE*E_`%;j2("Ն#(&^g):e6HMTq ej3#K#pz{5NՎ$LjFvSٽ'ew+["@Y-^}.pfr8rݤ)6>,?hF@ z#^(n> >4jiq~HH6SՑbnVjkO&NSUT]U(>[tR"v1y z~#ERuBK7?ڪ UY҅ _RVlk|/8æN,t>/aT6&ZiDtw jñE-]ul |B%ESM2sFB.ѤHH{Y9ҥV,;.Bvt٪[u@vB39q6$c`åhOl5  Asb$~G'_&;">}VhC3Dr.k^RS(PIZ _?7ϊGOR͸Ӆ ")|H] jG!:]2':DL,i.5^/҆xEJRP=T]aDL ձc \o/&'遣"z;ة_- FO"ژ%91_}6.g`_}`DNo7*'7*]m~(^ XcSd.c$e^-)ShF"ј O!$)h~J5#6Hѽұ2q(,d0gVsBX(U-6$1PSDhœ=]״wz}켍ۍUg9_ElYtgwhH~fUbXI"G,^fL3䋦yư|JP -|Cې/vt̜ws˞\7צ2PsȿIl0>gKs3d]ADhow=^VItғRc>{şP16#]>ǓXx$v:E`p!?b(}Vjvlvz H7ɨ"G=2>վbai,>v}d@~jg^%}̟ցLCt)zSqH.d|)7x;|m膽+ xk2jEOb'kh" d?.CCWgBL#EB;m/M?,:u.Xq&ҚUYQf8t}}״}? +)^:8~:46b/Û&h8׋fv*<ĘzД#*JlOIY8eSvpoaaqUS݋*kvʢv?iC$~+SFljنʣXè{0_Aw &{?'76~ `mUd$Oc܈li#@ vD+ʇ7Pƫ$XN~@o9&,6dB!+ Vo5C\!e,_-x\$Y72mxx~M`;VD __VB$ܭO{WG ޟO:~Ob1 U Ԗ&#V5C2CotLK1 PR؈0F,;mLK{h+܆}<ĎPW/< 11(| nRf3{G|ϹA|`NSK\}dƮov.?zލn-3 IckyY{zP>W>kmÇCJFs~C\k ,IL2bx%N&f+:M`HvP!g%Z|׭Ni~=|J7޶}pr 8I&N&ijiA=Ȅ\uKѭAowYЧx}'|n$Rj7U:6h;=Iv L !^p1Y\~E6)v "I~1Me.&Wz< E ]\Mz~PpI^b(Fa`q4o>Qx">K~!=ZL"6C%m/(8ّ1SQ%l6⛫'~uF8L!H=B@>0!i>,ۭN6w],`nKOm5K|<(h'bEV{uiw a<@Fz|0 o=xK *^Ǫ͸ Gʮc:ڨ2_/_`Uq@Xh^2%lkәnwB\P~8"=b2q"ߟ,QXOa>pw:#=U6;,N|jʉ';PXT +@xcl2!XCtŪq/ŷ8..'뵥H^<\%Lx1*KVUU"@24H\JDDjcЁI&MEWm7.vG?]P*8ꤏF|"{@VHؽ| :9(Bn%ʰEgy|tmK\>SrM<}Gvc?7`tE\/Ss9CIx{o9!}a+qN0;c~W)|DnPN!1}q Gwc 9G+;!pp|`_wqVdzLYJ?6tce2in)l:|܇ėi7*Aڅfq\E>u?52- s63:;Oa99㝮|ܹ>j%mXLHha{^:{77uyR1_CRI;V.+_{ ./Bk4 %C`$.~s! uX׼n*~oymco!?7S]OQ;4N\whFQa?򗹾_]m/#O{A L F@F=/mtn'|s^:{Ӏbb9H H~MYt7΄tZr2&:~) AƳ1kN>"؉$7i0_"` 젟~`0\1/Rwl$ {'wau&yWX}E_|ڋ[h&ZQ‡.EX&"I Q鳮Vl-Ȍ,nx[xͽ.#I4u7)[ٗb`Kf֮WLh/+[2FF##XM613.WUw)c6[ 6,!m`Xcݵ)bzS q 2.awu-@VcPمlj<`ZxoZW~OٖO2}'/M۫_%/a? ;-”tB5G#F'<]r.mm[W`m>l¸LrPT }_@g}~ѻ3aɇWW4rAm~Il'Ya7EfSD_~+'ot3Y&_k&[l _x+Uk&Q4D6 3bi2n(X2` HVY>yvW}ItosI{)Jg"`t0XgVk;LȞZԏ6Y<{jaJ*Kzo`&x%-1 ku8{,o~cbt]TNAH;_,7n6l0\!z݈b!@ohox%iҒ UNA 0W:%'wɁ;z|l| tT^o{ bi[}ЇF;ΩM-w6f屟5| {-߳ TWp^yzdU36Cʓ^NH^C>H0#xY*ye5%ҙd_+xS<',ϤL +h9 2X]ME^ɟ>tU}aNvBy?AqiUrTI̺n' qb܆mhCCxy)ѿ,'Ddh!Zy :yJ1+sNXW)X1n J7'{ NOJ})j+2cbLǎs|>(ߞ=FC'*.<%:O(JS,d_*l'8]2v)?(8@nq[l:G0`#eXmo %Ч!њ#q$I0QŽϳ^gx,LN8 q~kDjqR7- W٣AwGVk{ceځ?φ^aЍӓe0WȳᩅvXycޒM_OWIEY ZD3vTq joO[J7<̋yzs,SP'^gaOׅG vۅ۽m >_¿DŽD݊# ?n6ڐAc{G}>~_6{qekz~n{ES_/d`G_FȸTNo#DWU4봧^?`J)sҏ\sf_vyg͗.E/8~r&!!ndmoQy}J>BU85cG\;%q1Qo:Z^jJZR朖k ɫtu42Ԓ3(7z]RSIL{/et;Ay0bsD~@}EsI'tS^r<Х#\סqN71l9dsΖ;~54]U:|]|}tt|?Vpǝ1{Nya 3w2t'}-xOt#>x>eH"#xjT+(^K, شI&KW~qu-OF"=pH1*JS;@0 Oc{V?SJzqmsI=]-m^ };SXs@[xեyqp}wʋWHG>. ~9vIw^Rn:^~HlXw}6'$|p%?Sa]Tshz7-\%9cxZ@IDATQĶf-O}$:G@w:9#/W Cke2I@FWC_/cC#gz婫dBNPD'˨+$ ^&WɲĔɩt &ݮ¾^kB=`H&o_B^a' חlq?ZJil~2F/C1OwY5MA)ܵ#Lk }i}ݰkdkE}XG( !\\O>L؅'cSү_xnRo ѩVkM+-F_ߨ'=O{}EfP >rxБظ/r=qO/ç?2Q 'ܼɧKF~2{ ؘAF>(9[BG1_Е8H# r YH8|v<`Bb s¬2U'l>slr:&Lك&^M x+D=W cm7׃PE })n>bq$m#ſ0ttrExC[̇E,c6&?uw F񺓱m` m5 ._!)]C&=G R6FɌ8růNΌHģtɤH5sȸO?'_W!d & yZèpHMח ?Iknٚ/or&לO| 11EOm;! p0A.ԛYsB/tpoqt/^ ]I|⵬}.ޟk@.hweFօW˗זY_mAB޿1BK!K;;9cl/uIt fKXYHz6ԇ ;ɪpeɟM\wgl? 7ԯ<,s:4_D93{zڽ&2$!1!zR)>ٿ|A$p+a?Dr^1=89 @XY[ VH"3$ꐑ^c12&1CaGj‹mMK!ϺElΏ/t?:f8{x W7L>g\9Wr]Wxo?k[wzwsoA]aeq04\7Zg/\w91 o;vu)A)?P*w`zUo1Ǟ8i>o%VZw;2Q0jvE`FۺVavFc'IhZOO0ROx~+2c!kv3Iz㾶1~"@mE%&H.WsUr/e[Jnl*hG8k'ٙdq ., aYo,m,tCqP1̶[K.zg7S1Qv_Gm=$B6b#ٵ74 ,}TRU!{ nAv. G2}ǖtwLD$B'J`m7D!2lXHE6ގyX#ZzUЏ{^緙6n3m3"޺էcw98Vט׼kaC-^13(^y|PBWW xeqw_Ͻw߅-tTz#%Z IAi=z۴c1,G UkɺL(]d35BRtp$+x˽(X{o^30d/ XY@&_.Q;(~Ŵ~]C->;M<=_ HOf%e|1ٚ`;yp!KIM,l$ cw5/}zᅢ&yP;ax+la\qb|,wT!K;Ѐvؓ,bW_U`qon38I>E2!sYo^x]}x1C YH0Y}.VeE7üZ\7~o$k%0Q|qB-0ϯ,]-cv5 O yIm'V0!.⾍_c!w1y2,sj@Dz։{Rf[p_@&ElC"S~m"6mZA#l'v>6q⯣EQ '$K䔜LWnbגÌcP-j/L;M6xB{YENJ-#k7V//k;>l 1O_o%彰xěc|mÕ7~z~+!|m>;1юg/k We+^ЊWZhyOٽO-w4.0-q ?@}[ėsV\}l-5ѥy ʘNk`dq)^)X" V:kMRv H+B9,h_21n8xZ1cDV,c~ BGT`X<-#섶l,%gj7{E?CG: 8LHEve$p$JTƐӗ  D"]%.ՓB2/:9])gqɫ%>yoo¨SնXoMh]HU՗}|.˟ &b&p:;_߾NJB ѭ?jK8d>E'YK=!V=eE}Ayu@JEҸV{rs fVz%?И@x pXKyt*LaCJs;KUc25i!GRV9$'9OѯcRhꐪ-z&oZЭk= v:hGG5MjKN"0XEVB;XHGᙣjV'$+->:X<Ќ t} A4ٕ[6^5vCQ@ʛL#8(۵Ӓ6m#Ťx9[07Cj>W5EuMW<]*N/ æ vG,F2Pr)OD藧oSeoBUF`ޕW xR"r-n:ɧdj2lIY BU2-`8UVF{Hkl!k=2]6b+6壿7GGlkVM.VV:z u-{!LE?E{;7\5h:Gxr~Hù!#Q6.xy/:]{A?{W/5q8Aw]'\c\Avh>-L1qn;`7 @?ɝ<kE{w45-kiA't(SY8m/FhSO{mf |ښU~˶EhSމ|8j?s82-D‰ГO crPzE>vxcH.iCJn)<)l>n-A C 5-l,Xz#o 펏EQ)ꌗ0=b}UphT٠;d"dpL`a!XȾ/MяB!D&z+\!P W]JĎ;v-u ,n3bk^M: 4&mEل0M`K|E ́ɉt1w=Q#~kW9+=XQ./!KzY>Zd;/ e?}+V@O)1N92WסZm %Oh$4 $@#I4׎'CtuAXI8uk<;¼*x]sY~T}\xu(/bo YXRVoRd`m ;S}g`85Ym-]>G pha=x(('IY@Lg}FNjW{e}ѣmMP+qՕ?܈ُӻܑ9%zn=d7.m 퉥p'Rd<'zv{2ڜN=$7xo{9ywaVz ~0v냐9Oac+u76_[/&"樿)_僵ENXX|7JgϧlSG%b`u]&p/r$ݎv <=yFa;O.>{ 2Վ2V|s'g5.]Tb Jj%5VU2 -+ :_/'dВɥDvp_irkKʫ8O F'R Ўqu/%7dWqqPXDžbylX΁@ʘ̣ދA8#_CT5:Rc@48/t*SA ?G}[-GNJ.qźVB~t{+w[\UFS^zw浠)6iPAa!dk%WʺM^clmc0Q:''0=CO?VS!ljoF W\6u {5!xX'6/@@:q!}g`٘IX[}-oS1&qL6nၖth;o#:f` nK;#1Ƽ?;˿a_iUvAA6sNCML@ x?'M>ũ?Ηb7GɰKWk̿ :0Hu>){»LΣ 8zd:GI]W*z _)ؓk^JylekCAoic1\mۇ6ӜF?[ʕɓ\ vam{' * rjei p6\D,SuRO@m>7o-mɯP\ģ~{ IA09{Iky_+Ǔ%$ o$ "(Aqۂ:5䙼*qwz+!>,u2XqDCob &UukEsKC q[>9ċ}<3!;c.=Qk,;|>D0/<&]J//{v^s;R_t!]g 1T\a*sT䅱=G )ǹ{Up\7Z[}kr7kINrk,*&lCv%Wzº j*=}Z,"RmjmH3,Pi~LG{SXK .h_–NF̈ 3a4SEZ4̩?@J.)ft ϼ.tD ͟LT տg=`/G]uh^n-'1K_XUv:u\B`,`Q|dB(3Qԋ^/=*x !zIkH_y bY ñv.{j|Jj)hʃK"?蘁o0n]L8HG"6p-ym ZG_}hwyeI[g9>;Zt[ ]mq7rE]C2lOBzHppUaX3QuE` ߊ'VFTLhɯdgJϥ[qN@V8]8yW\H&^O.Lh"q &hm MKLEI7$Fj jJ֫XAskև"6]|F/CzNI.s!Aa3TF;6! oǐN$,q M⭸>lnڕ$`N[K1'A*(Pvt/{߄I}=x:E1_Wk57,QRS8p+TrTpq:W;1/\0 Y|)@k76I]kS&ƂQt «E/u bu8S:2]}d 734Rw!qCfc3Y؉dZ_VB>D b+Ͽ`kԝr *48(-v'f20 W3+7dFEaFt1HU 59 oߑ7+_*eIZviw{9|]DP4~SeUwNlHj yD˝zy]gIs?|7叨J_D-QvtVPqSI.ǃ&4>0)̪k6 %FS9c4J PGߓ-ߴoIY ضǷ.zus>K](uJ\?7fW[rIᠲ'GN3JKP}]\Hq) I%&צ9$d"`sus6 VpK.nYY'uŞ׫2dOdLldNӍ8,Jr/E$44Aw =F| sTa^.$3u& ?V !k>عq5V{ڟPW5=v1^BaZj@ B"[D.(8;\/0%>1N#@6T2ܟ=D!(RkhW^$;+]̻uZ hsk~t3Uߤ}$y c;-q I\rrƐERvC ZB;ʶԕ<]oғ~u$vDZNk}.3h|?4;&g]U2_)& dVLHd켄L-K:V1]eBKYEN¾DT[] (kk8ʓNl8&d"1q &hulſcobc"45X$vG%97^MYT;!P`o+zqA"1*zb\aM_?@EA#=l=Tzt?@!n:1$ڠVɹù =5Ge c.+ 52n9T}Sܳ*LNIJ ChrE;49Vؓb"2uA;ƿX}mpe5181lto, >cVmWn,1%r\v&&C7XӦcMǹx6iY! XPvX65G Z ?@ -zw|@'[l!ʹuB>A ݎnl_LTz?ʣ 53 0Jl?e=zԻ&;} !-K9/k1_s_(f|-k@0([Cw6~-.W~QGNN+M{kt+^yY.UfBVղwD_(Wd:x&Ȳ?k{.qRp|I_ש˵}U\X qؐѡ.7ß+M%= g{:ge剿fb9&=t־+Iyma)9ľqIPmCʪ86\J괦QF%IN;X- <*8Wr]IY<8^ &-pqUOIi>ɛ\gSt8HW]n.~Bp0N!78Rr|O)BM?7[Ƴin 40|1 aq9MFo,&N}dXOO^/.~柃ų?E"/Xv.nA M'r t3uJ۸R$_%QZKb[X.d}Ƶz!y\ק萵6G`LBwdbf 3yYUY_WjfL| mk@U˾%z@86o]E6Eo4āJ#tή{4$? o*lWA")+NȹubΟ=1`[7.qam$*znpP!<ι<7t ֶ7֯~5! ^7zsPq;o1D6R&q6-NJOU.M҉8\wl1nD4(dzS˩-szu"pʨDJ3Bػ[ e( :N87.ϒ5r+owSXlzԺjmX< m\8Q@™po~ݜ)yB 8l^02ih(L:.k /+˃|ČFGWwzq;3}8Tu3\ZtCz&c-s[zoBi" &EWptoҲ#Ӕ+y__ӅCݧ 7|ε|_N=Rp]Nl ('a|XkV8L,E>؀_S@k䉮Iϴ-,&:2NS9RFUEcv'[e$A,J lF_Ҟ?Y]E/Zz= a;?+BO,YHz_uOb5~25_y븱,KGKn),YZp6-fl22C`6+O0lBK†MqK놤*v\Oİ,\2P3zFƚ'/:3ET|Xe:5j 6AzAetQj$p!.Й?g?cUPqӁF!=v6˯ki-"}W,my:M>.TSKMM߆Q]!| ~֎_8_arKLQݚH3n"8CݯNsAm:#} 8k$aV?@R+j ŧ iɏ .6%^FG),b22'7 z9F7,Le~كխ=*`cd2.ʶAV ڪ+;T 'eF؎PJf?UY;*0%V&:.[hI}p]O_a_GႵ6o;ʳ"KXن6-{*B\z;)$+z m6.;/M.I*l%BгeSn l=xdd%\=n⃎|^[6gOAEV @t`r۴ӓ>kk77 1?gRCښbSUeå\@Tou/ׄ o(ʙWE昔&I~-,~& %5|?0bIA'M$y> LI&1}Qy+}$:sux0hvMwV^6}W-m~l諱S׼j@fooټ!7ڠ%<%x1t[c 5c{|Ջdao9Vܬ_UӎzAlWP]#ę.~;9oG:8yk@-|ܗ8c_^=nsejIB'^5+!*6{O|rWZU8׿yԞm8'Lj2HB7zfF78ɸu3#oRO^SS[XC'c_U;.cLFwӳVй}v? FdcFƆ"4:?㍻Fe'*2`=0Q?.á9+7gV#o)?󫠠l6FBܷku;t|1a\[ckx~nzzey'ٹb1+ZfP'ck{.c~wqeExd+ލz:Ns\X[q F:OtcM{?5)C2 ]ey9U;z<*WTЇqrՏߘa'FX\-ͼN ]YD4 m)6UOԞ8l= eLu#zرx8Oݟf?0i-0=hQElB~W, WsPO`i4nqSz-z^2FZ\VچZQx!A:ƾfKyT'x Ӂ?FDtWE$? whR~/4 Tz"iFd{AM/꺛ҏ$}I56([WXb=ACvC!pHLp7Fs#4¹i>ZmTKbb$ 575ĝǙ].-2LNw=wpo, Ou^m7=F9겡ZC>il)UUݵ{ڛ`>|p^Xb=Ӳ_!??+Go+yZ+8낗v#JSRQCtW"b[U%|V܊MGؠlo[@ Li*9 'k$zg[m(L7fkLZdksy~ c qovb˫mmǍb\I+!k.P㔿cwX'F캏]{M7$x[ g`?o0d=:*(}($i)ذ]8]}ir:h g{GjEA_\-BN7Fp&cEm5hr+P`+4_̱7x}1w,VQҊ*,SY4_ڎq~êW6qp^?M-ƃdf=2%aq)=Puy-Uy04JEP0qz毽ϋWOmf*m %>Nh|M\fwq|\B kⶇ |9ݓ8+S*M;<`cŇ8nJ0ߜ=S!ODdRQ;ڎqvs2Ƕ@5n Dyxl* sS@0H2]6joMv&2}Nse\2;U|Kq.W}^}|OHT՚mZk;ka󗒛{ZW ^7R_'\UZf&~ GT~7$16Ð,6d&dy5 _g6$`cTk;icٙ|{jKs=DY7aqaDs;ܗˏIT ȇF~QDiqK<8?=M&q`āVp`ȫ,5dCL JM8tQ+c'k١IYC?DL0VmSsq͟xZ^Ǫ @k\N+l#}HݭNV]w E׶b,kD#cI~ֶ{ƴrA7iW,p:‿Յb[A' ^渺A{o-`@wQCpCnjW#@ @6wA]+"oQb祎)da:hhh(Wnkotܔ@O_iKފ_6@ztyx'5 T5;a c$t.J .yERɧ~_̱K[7jRt*%UgUzM@F3jbrct%"~5eE:> d- yX$> kQlz8I6Q~&A>R{͚^W)`WNٽ;сI{)?;Cξ&5;lǾ]v[|8HZS[b=| ^$͵E(sBCH9@޸fAb1g(ȗf9d [\ `LdJC)0bWl: ǚcl^.R nE(+:>4٩y=-Ƞ_U3jU:W.bD@ISQ9竾Pb/b^N,jRx|:.T,_2yDoV5.ZFj*1f4X+2k|X볱DڹUAfBMyazlPw#Ƥi,vD6%k|;+[?k6tAdX ~65cX1O=5޻}Bw|GL_Mv;q=7e"ps" 7>_8఩@77mC䍦?0QkOx(qqltb1V_1GkCb%O-E=-~!^aYbƖOuQ˞̧WȕƜq?Z5纖K:~?H 2/IiyBFzwKW~ACιg-ήʋWe=y/=cσl_ TwFX41yKwWx (m,uVD#Š<ΓBl6qH{Ks q=$R§^7l38&pn āãxqMO# kD̆73KP͸9WO ~T c&rVs匮b ǞhbiU6RcKM0L 5AKֵ9H7tDuWg_ j.#eJ7r>gq:&2`>ơcZ?.9E%_&5DHb矋%C3r8'[JaSrcZۉj-A 6֮?Yb&fGĕO SC-JvHK#ǔԊtSB[ 0"uc?ƩٱaXjDjЉ2Y. Nڠ/+YsBMDo#Y\oZojry0F^Mjmp^0 }z1I9Ux {:灨Y*-ք1bǹ٦<:oAg"ϴ·Q2/oXyP\I*ɍ>օǸ1sȃ^яGŌ)Ad$@+8q<7(1Ih챋/{WV"/󴳢7bĆY4Tc sR WaCa?h#i&nlW⠓?~!䊍y? ŎtxF^Jز_u O7~DvLvyw8PƸ5Ԏҷ,vXeKLXJ2zH< mᘪAH$l3u3w^c=grvAT;I&x):ZBZ=RGs /!' KۑD9Eb}uL1݄eU2gӞV60/lgIb#MsWuo5=Ŵ~_{|s [8c$y_MdWK|:ϵ>=Vzy"9E 1U#/z7{lxy jظK}9.-iy*ԪF{55dVå%lfM( R񒨸RyZkn nk-8I mWz@6%;Xf>xr:}SՖ^iNC]Myk7=!Zk?q5ڊ='g=lv[-:8ؖT]l6|#4L7l&FĻp>;o_[fYiIީ66 tK] Qp*vD}U%m:p +(U!>p+o{]LPO`iN%Cܫ6:0Hg qBW>_ƆCaI?M:+/ؗw r䮝ӯ++sϵ!&ϴJ,kxk 3:KW7N CFmW]MTm& ]]dEbUi'1n 5i^oA>&u[?Է=$u07'7˛~)2z*s"tv1 'YI%D"{SooDe {kgQ7&Zv6 V<_# h @g<t>߁!VmҖ:>Y6”g?_Ə'I2@őX`WGWWo2Y;@!: KFdh |i{G^0 :k+WV N턮ig:U)4| -κv2#:-^i{//4{ [}G~;V冪~vgol1|;BҖvU:wː\i)sr+[ufso;M{+)1,F]-~EL/cwλq淼#w IuNAqr)d2t#m؀_'>c~eI.V{^Hf~\z[T[ **89~0յ%ūc.\Ɩ‹Ē_dgj' OJѮhOS5l{:%mhP"j(*dg5 >O-'>TO=c]67?UݺWaxGμSnCWJ_}"q?QDVη !K}cHd{.ދW}ҿWDNb@&HsF`ԫȹ<_O`#)︄B ;Bؽ~$< S%qv I=x|D*=}3'~ 5-V᳹\d)1WkcU͚BH ϑFPQS_ 4J02VM8eͪgH}u8/7? oDEY: 37ghR|!{mP3-1MhW2SJ|≣]3rINbK9_4.{cE͂ f+S3:J-o[FcCFv%O(N4].d2~&) td6Ȣ~\pkF' zK5X +5|wfC%W*K? mkFj§wj(\1==q_6˰)x8h paG7 ?js^^jLQb1$s燞).A;ס8L&qltU~IĬrqRu$L\zIĪAɧٯOgY|F1/nZ=+{Ø 4Aj,q ]hkOd)|<}+_i~*^ؘ偁៕\3%gZ9Ѹb[7KY_x*k]=) to%`oz#l)S3- Vh0ZIByO[ڬ7/v&%u]7)5N^Lp 9(,T4,7)K}H)}b?3l ̉]. 2b-.URe:,p1x'T+c]ma\/1/G|жN5hk2CQģ'؛{X6n U4k?Q;Yqc9~˛ͪ/nؚDqC&)ܩ"qvUǍf-D򯖧^Mb׋ a^>u6sO*Oe,X]}oN$ 3~Y\ ַR Đ qId([%LI/e;/"U3Õ/1K7[D>tkgw@3Q;y6 8OLehFiVz'qB:n~f7+Fuy?l`m^oyMZf.<ιؓnwZC ;ivMڼ–YU=.\-g@ y1K>pR |XX{AA`R 8f}}6ܐvQ3f+hlRvtǦʖSeФBCLkpKXHdт/jy"5JcG{xO]Lӹ\"'LD``!cMں| Wlc#6+7Uť(T9WSw?g.eFZ|O0_GH"[ 5:QlBsQ\ԁNoPUbY1/fQKp!=e(Uq\!W^{y׻~m1eq?3eRN]_=_ z.V l12*1{EhyߓБ)}>1-H8L|󛑸r ]?O^˳<膳gcOacOdu#/\:UT{+r۲QpNo@⊗ kO^4LВ*4k&' ^R ]HtB1w Id?C. 9 x`W;v`rF?xF[;~Y}L#F1#})FW wo?XK|H^Q'-Q@\zL|9;WM`މōgikF)G]Uؚ,WlշonG||:9QOlu@%h-m:$8օtkdee09TgD\.s.:btmW$h?~IJ p+F-:ϞbȧoQjG4qf1n%\;эa?~>byK ng3`(> ÀBzZ0(Թ \6B"CXGj"Kts>ٛH?|Š|WyxMpu}˶o{Ra-&u)jɬ_jdqNϪѷo1)Im% o ׻e.ޕyOt"q}.׉^Cݙ]o%Ayq(S$ cy 518(Y{"t&OdUL8'W.wy $q&n@goeךܑ⑫EjT$7ʳבL?g-qRY_8UK&v_^z!!%7_AK*xƽMg7+6:o_1׆;otMʿ&:c|߉yaDm?(lW+{~5_Ԗ4Sb#ts,xyЈn{9}gO]V]o%AيbЭ]=1sEVѨP+_~΀ +4:-G ^cԋjq$ E?+'XZi+v-e2yuS^5ўZǸ]Y&R6SI…?yϿ|/>fOcבw#-.reoaj\eTr?beƚ*a%P3(iD/quU,>-,Ecf7Y_Fd&njw MX75CL?Z Vs\˜"W8a~s$8hA\+T- Q>$@Lq/| |.eǜ!, Mo{#b}}2dA*)N)sя @YҒq8j@_+ p d["Kn8lӀo-K, ͂I_;8QB}:AeϏ"C;vJ2F/iOxqۏj">@O4]&]WJg,u*fV\hE![_SXNQ!|>E* xE Els=+nT;9TRbW|lQv܏SW ʮa?wE^*b['7\T4֞,[^-j> dO/9p2/T ﹜7_Jc7n5(rbHᓃ_en)doՈ#NIFJ 3Fn%DDKw[:>\\{֞Ċ(œCY/[@WAǑnAM cnȅjtPAw0LU`1x[PY:UM yWme`ZJ%6l4z5|һ=]Θaư8}S3lc):;)&,쮭{}LO/yS ڏv I1J#VPp/__J[ے'h˺XV{C9sGSxL\–%s!ȹ/%+I&6(CVv19. GIk&SYi_qx3|CG Y^Mc/J1k=`ª>`yqrݐSjE HݮCk[p ]λ?#)Tu؈sJ٢U;mH\ckɖ-v%^뉫,FYoゔ9 6!ahe39;@EʄYZ lź*+1A8K}D7V0J&W-v'@!b_R9 ZJQhn Y-$/i]a,\7.>~-_"<_)&?lW &Wà'[A~o|qpL`SƏ%NОM0赜JDoe @zabB*,"'FEx ؖ`] E hZդ(P2~ͧѩ"\D5@]vؖY1%ziUvS8\Jmԡ׋5F1ƽuONY 99*! Bnb)7wiSXv_ Dmmi <ߴ}l&?`9 >/cI-'Byy+ ߠ:9-.w OI}#*Bw,w?ٽ>=5qPƵG1Sg6➴NYᾙ=ɔdZ8&too?8E˒|Jp\1L6[Ex]^$-7w͟}>W3u\UF0njuƃj<+&DOD'*xv@Ԯ5KD ̎B 1o )¶tE.@T,Iϔ䵔XgSCЧAXjB1q ?& Bd3X&oԁfoO) %ȏ\}.x&k_4j iYW8*4ץ'aqTqx!{eJWWhJ?.Cc8*M ֊^-lrO6V$b4êI,֏ T'~o!>sUo%+dROzE9Cb,,JQy*Y4G"[\&x޸gbG$O_ӑoˉ?`KZ_җNC0A<(xwk$:d'wt!A FTuuXVTsgy?kqKA¡!=j?]W t{+&G|*+x*$p57;.U$ЬK*kו)BZ>O$a~1`"Ā8Nj3_D݂WҎ~BƬd}+suTs}rzǁTX U;QRe5ju[>-z0+⤶="@erBױCJGDFϜoM6nڢk uj<ᶒx;!;Wlq >UT՜LQ@$WTL!C@#Ku66yccjʒӵ59WT8tq?iҵEM>ne#4"coW;M&>|dz=+|ísW% -nfp|DsglNS1spN{OV:-[89n2K0D4N=)O\BLRu.v\T{[MEei$H ]U>??˲5y0xH$:,SdK\E7z$ !l9(MuL]UziU8vceWv!/š|~qP}2eM&u5LR1vY(.wfÕM~[{ks,>:/u[:H^=K.zo%^kDץ»\YZ ~4CsId+eI9Gr'+5~ u} Hk7Oc-5k[66QY@A=G'4q/+oH~Z`$LԼ@*mҎjM5[~UFyn2'w֊JcOSskQ>i3񈜦Јt5ѹ&"SuŸ7l΢됌)0'd cOԴ_BcJ[ix& KVmSk]LuD l^͟s{ϛ#Jf$jq҂o1~ZpiӚ2Fҏd'-Z@m7ڨZbvĔm삇0sκmg)կDrq)ATn`4qWx: yHs('@-]=5yYkXytd8\ Ui$,gCy/sD-Bu\or^]jȞ@\ɧIqH~ZV$PP\h5K'Drܓmf{@B=$MqvʒrZ-Fi*Vvs&#r,˨2w\e'O*Ib_Hd@$9?q&5VԲы(~i]/@5k8qLčv^|ʼn3%S޺fKēwgF^Ok`;8nwOÑoxŽB͟amO^]!wJ$LMN0`$ =N OdI;c* ]CDdQ/F؁]o%Aext;3u[Wp%.|&WiUfR3V4 +xR);b9G9eI=M\ӐXT{Z.L;^{8;2qh1Z J?WA6EmuE@$ h m|\$Iȥ,q2,Ne;(P}2깊&+LLc{NcYOvr]3Px~ x"ֽ;87> pP5To%a:2U&%CjAg4h|:F</Ã' mk7ux!yR̴n}x޸Wt$[͈aWĵTh}ε$ ÛfuKU$2'`e^T{PfHڌ ~'ыY=]Z~QzM~1u`rzA k)9ꯈf]5Zc'ݣ"q]3KM^漄jj bVОFYr b9 6BlwP F2YMFxM+JTL<=e9.tx⭧Ζ׼L;ʞss5#WFQ&Wʕ|tȢ-M?8֑4RB-pX8Zױ9.~뷩𓖸zkF9ZB2@Z2KQ 4cVw?xϭ :To)RX:v(Q][EjsĪɜTY\EWЦ;8eb̾Z0eMvЋJaHNTAN_kN<6[ x^3fW X#8aYWǤPsSA+ڼ~HQ4I*%:#d'd;w.:}j>}pL)ᵯ=-1'rشOAlx1 (\GUV> 4BϝGeR ֣{M9Z y}Ƈ~D¶ uW3RR}/x@^z=ֈ.Б4q-AxK_/FR3Џ`|MEȚR9:-Dp5XȬn\*^J,4ꮘ`i÷ js_FdH좄ZkDWEDȔjyvK6; X?Ucwǁ7$}#}/|(^/+ sl"GH"nAҍu=u\fEhlUq|W5JMԚY΍9$PŷEl7^ug[T\FUeaFS^UkĪ5ǫ-q ȪD],y.UBXJ+$ֈ.>.NUlsO0J7Cj& #Xâ Y+[mUpQ3&FvxINNBQvfD,ēD~j=}3uDRO\1_LyU%V( @KFR@C7L; ؞"Wy~ƭG[rvFA%nǓ_ę5T+K@_tl!["r=KGwU:/ZVPxMcPywՠәTKY'tU..AI(Dk4vSxO}N. j g'#\M洓"_pLGS Tm5n=qױ_ʟ⌭quRQGt(S_m:_KBY$SPNI$ w9qKdZBgJ=;7O7[%Vq ZOWXύ }Oz 4kO]Žϼuޏug݂q?#WKGT6vg|GoZ6,>?/a/m`Ԩvu>K;2j,.4EC6xMY*G<:_ҸS+2 Κl*-PW\QUf]}M]Jhs(g Xi*u % qϸgRN =_v -߸;a(,K?-UX6s e6ZӼ d;Nh%9[N[Y~b]٧w/yK6Պ5ѷA d+EI]{"[F=|-ax7J.+#/n_'6Xd"d]\Ғ{??E2ӢdEYN,x ̮TcKJKtW{@yXաQcÐ#~\: CTvؤ!H~vD+Ŵ)+|ĦRsbsu\$6EˢD;>]@]ea @Ad#!(`@Bni~VT[A- vhZUVǨ0 !R#q(PQ_A=Hnrs{Mt>o=sk~>s]kg>sZ[v߃KyMjb٧d)< II `6 j (\1sB 'q;|::U#Hprb+Uk3Czuvs q1!"VW4z7qϰf}w !{%9Yz'>񉯯>IOWu' $#۪/yW=$VY84U 41\uv8.Н^혤i,1-;; v14ݩ@zv>6kr#z7rG_i"ݽq1 ?FcM,iA#B'M[0Wo!]#$M>; '%L1k& 4t&aWd.Xʻ>>֬Be:Ⳋ-O[?&MS9ԅCw&Pb&Bt|^#0䆉MQ̎OjkrKg|UNy`+zۑQa,u<\lĥ`y$ P V91WXnc < K9D3ejYQ, єcLOruWڨ΢F}Usc;G6X;i7-~!!x&r)+ V^kŽ!u"+y*LM` a쒏#{ħiL␜^PF%T%V=HN$`Nw?km6LAAռqbY1"%97zӬhI!|ERTy^6 cz[H}5l= N $j(pZñ.r޳rCgu6P=8uhf Q!Vxq-?^yc]c{]gknEP 8|_s#I9kw)'VpMc/}oƽ.Ѯk`䳚uڰ90%ҵ!DcN)|kvҲ"&)<v.Wp% )( GϜ;&\UV!jQʿx~UZF)r?]/lHb}RrPޚe7X %q.ͰȩZmkQP(ٵİS}uYWaSWWgOLPR B=qUw>&e*EU6Wr5]VY6Q>*w @^uQRBׂN]5/soXO֗Z} @Gǎ,Lnk3 K]2?^p6P<˱Le|] z.Q&մJ\x<`wj]Xl]W1nQU $PPT  -F؁U⇄V2ˍ N*G?a֋u4iW~jsxO_%@=4៏_CǴuc\\O<7!bk{3Pi!ݵSo۷'ٿ;itf(q0`JL1՝ ݶP Y??|9{-418 'RG9*RӯͰ"GOیC-rlDZ5lN(!D}W3]Wf!j?+>Xw+֟lmT㗺2Al[[:UI"6yg ! ĭ4UYH*DG=-pr}bH #Fu\k+Do ƚJ뤳1$4 Xq}M'=vO;7OK̊SL0RE/~A$r@H$x]+Cڵ5lљH<[c^x5o뺮}hmd XWCT:_S@p,pn*]_Rzb~0ZKuėM>:7lxpxTu8J>&Љ[ІI,I'eD[K̉Ҙafr#xXy-!pTh!$X;Bl1f,2Oੲ}Gs%^?qEz%v\G]|[^HDey .Ӵ}V$~*QPC֩XٍAtZWLwK廹t-HcB}6XS_ɝdjkW\S C 8$#.xL\> ~74C4uI8rѹ,q!W^ZID&10SŐyh׹*,5?ͯ9Ĕ#)KP|2C1Tɷ/TS9|l->qٽC.ٓoZIbtpNh tf%[% ؘ@!.K,1akr BW{Cj!-]4"H!j bUEV%A\\o/ ˞l%@/Mxc|Li|'Jr6ʡ \5o}W|EHOFhߦV]CN=) ukW?}0qd^UEa\:3R]7Bbz FU y TW+?' bݼn,q"Stondui#@w}_~ϛuI=JBNW3+vM[lxIDw$6'E@Blj `T8{{X@lY7,@ahAɏpܕkل_$T}4>'±&]1]˱=~ܑdvuU[(f2 uYhBġ!wCL Uj;{g~yu "{$s//rG>ƌ.4oi[j0oF2Q8rxm J!_}ۤF ݬNK/Ò8>um$U $}IeGTÆ"ID]XOReXy @ S(e"*z %A]ls.LCi!լ 4_ahQW*x`Xn1xk,CR6~s_t>v1{z1`@ %>?x y6,&+qaѥI.$+W}z~[&dP8A䟌̣h+^={%u]fƯNma~&3<V‡)@ qz/ۓ}!Á =oCv=}k\f%z䟋NNdܭ9T35[),7( :@K7G ԈMQ [\d +{"m=UŅ:; Ouig2%k9o2c&Eg _\Oٛ{$Pta(2yMTtNS:tUHZBo,[ט6ӯI,KVq}+.dHV1Q2Ee70&Pm^Rz`|T* b %2“e~GdNjlTo1FqW7\PjD5cnQK!1ǩgׯ +~.Dža _u݇sJ10ːCOwYUK®S/m(/ӤU'-֌O\AǾᯟ?N0^eȝ~@/ 8Ky)NV9*JGO;@w c?5$X;"'04g8>KK?>U,T6KMreѦt>˥I~ :?B/xz / fIn1T]XA`f0Hc}XkV}qDo4 trI=U"!z[vSgjzK#"[c0aK)<#E$x>,#[)Zvgo/_|4=0wYm^3FA)]L7@Q?ř#d';;Vݹ:"\Qp)f1`ej.Rƺxy:kyxfp.j[?>g-5zRH-ML!5&7RwCV:~/"D^HЮu;)ryoc-1Z~Md[M~.unonf )/sĀx{CL\1k}mrn˯ %_[)& Xbsflւ ULJmI%X[!7F TZá(\"?{#ל=~y0 #뭮^|=M9: ..lgU5UiHu1/֨6ptۆ0ͦeENx1mߦ9|[D ɸGש~r~ֲ(pW]ƋOX)2%uQH\y27O"+&X]|wQ"? CY.\S}߫ i[T#J ~5 w#%pda>Z?쎲6Gq[h\3W1N-{ALpĿģbc8qK̡̃Y \enjM\%y4aRx+v]~M D. '$É"Dx,%>x"eq:>~ Nt(\wcqf6QQH^/_\ĕ4Z^Vت>7~v|B' ikmv(&C+GȚҦmb[9WPg<=J"sb|ڤ]WXm5NqN.8Np&=+nҭJ s4f52$I]߰7An'bl¯JjZ썸`_ƬDK}ǃV}jhȾ,脀?}tQ%N ąS!3C{΃y|<ڧn7-~|?Èub?c޵DH)mY 1UOO1ANG L >,f'Cm;|rڗ~ H}X.\BGTVu=۷gY(#UݒgYbj./͝:go}Hju8٭}NbE)9Wl#EmfB9+XSnW7> Tuul:`iF^=Kͮ"2^8Ց_\nryX w#O'|X58/%XBM|t|\@K Q4??$,JZa#]K*dvHd?sz}'C-1KrcqG_v"UIL#P<;?EuIR^_%la6ԫ\ I"r> LYdaϹ+:7X﹁<"ӎL6%+#7%%IJ- ApMna%$*XW[x_KTrOڳxkn8Ҝ]l ".Gԣ{ *6NC>N4\%׾C6’NxPSΐW -es ÑF o#M#clQ/?D ߘ??|Ze^^E(A|DD"(X$VmLD,f:bl}w-&Y0i_:jѫգ  wa_#'dÜTWb~:H_? ;;2k.ӨMzy =a%ʲu&^L7Ԧ}g_W9$qBETPߝ=Se:,ȷj@̩MQ&__ұX  /,R6}Sq? 㣹,Lw~Bgj>\{{ѐ|M,2Vl_ԏ_ iI<l`pӎAX?1ǜgī_%?&7*߀U'.WߕpX{Dq곰&STeAG2b`b}0di1M[hQ+~;]3 ?+\i5jSކ1}u\׮4/9EhfEv ̗R|-ƔW.( 2}8!<te1͆Uܑm j!v[ϼS$QxwcuGvI~${KyGwf_mxt<2ם05^S S$ &;k32<n(Ds۶㋶-/HI,і~HXe*EH}3%cck nB΋&z`-ZŘ6Kf@mIݨ5TlR#V87DE-Zg Xb ĸGcYE/[+cf 9Qc^#~`Yu|ԾT]?K1w$!.kc~$| jOyM]-b6H^巿*4aYNb[Oyilg>z]i":%8o,uGKc&ݓp"*"4]/qΜ22fg#aw}zC@_u|Kba˪b NG@>J1(70Ij[%й(AoF$ԢAY< \?%.&tǦ 3Vɦw/'P%`bGS[O!I [VNFJflI])o;g[c6mKY"=G LD[Y g^gwMW|Ðt gܵ0a>%.k*-ƹgqxrE:|x-q0L^=2Y]ɊNTD0}$DFN3{wd9d{U.JrM̞lklYo,?JQ. `i9ga#ЮxND&!d.kz&m3~!R^HdAx^B?;w-qI Zk,nuoh.>{6+u&2h]!HwnuN&Eע 0(&pLK_b_Q$MJ.~_`t؀2!p/acf/Zڋ*{gOu.ob{e[mf61_Mu1G#YXTj ϘSx#{9w.s`5ymܔ G) )J7tȆ*ԖVyPؘ]J?G^,m,vbeawT_Aсˢ)!PH\GdG8hQlR'CC\"  w0ò QuID&|}ix(Y!Un*Vޯ qj[tLJ[B[/8.^5m_U5ڲ뢬.*<y}G|6R 6po$X.6]#p- [ge~0lX%+:QA?/&g?+Q_]Pvn,vݑXCוwC_f^ocbm_SKx(?7@Cy:<j8Dpi#s/CszJ [XEJژ1G@Bn,^$.C+7% j} Ϲ+Y2cҽW-,=^ FBj-"ܑ֕g?AI?nfC}jSka@Eȱx=;e3I %ۏgwau2$}Oyz6H.*(y2s .!:}Q0UV֋֗L^N(éD,vMY[?P6y]Ps>KލU\dS^lQٰ}heo6-g]4|aXǁvNF=6Oy=Vn!UF@J*V"{H]r&_Ps?ǃXJ^ɰCt/h2k+0_ qԏ8YN{}($'җ!ԪOkf{P:\I#_y#0p@ 43 J:LV&COQ [|9w3CJ[Nx Ui4 j RYv9Dj'F9EW_XT̮\8+![ؑN,sr]|]_&m vϖ}ŢG:;^0MйQ⊮?|FH+ =bGv)oܮ6s]\z><;_E3cTG8P8?܏qşp8#qN,8Tub&bcVlM(j-@ؘ]X7.f,~~ %jηT쑼|-H Tw w} ,y ),>&c>Ǯe\n=Oyqڃg _EN\>}=>"^T.g*]n ˻VaEe%!Y U-f1;BnY) `@(h{6/~Z4ţs5h#ފT+Z)TҐL&BJ~}PDh a  |W.\HW5JUAT[KG¾z@Xu:VYh]81|߇:f vjx XOqJ8 TG]\,K+fO}M=9=w?R>08\FnS;.&=\nC,0W~1ac~w!ƎmM/3~H\y0Nǣ\$vQ''u|Ѷ)}%q3^f[CmGٗwA}-WX%.|c qS(~)q,rR#k,`k6f>)$v 8䥑M,0a[cE /&+]Y0,Y|Yԓ֬¹8lǮ>Xt.p.2\N)ik~!7OfƺundĄ&ꚼj_1z'/ 9uk㙟x~P^%F g~%MRl]a⺈"Ȋv-[YQs?"$-Z7x{iaz <~)#=\X45Z43TƼ(q jMcTWG86x.E_v#JEwH ^`ȰNLO}{kz}!Z5VfG"ǓpKda_ߟ?~ >վHgJuO$'!} q?HȡGesJo3.>-X5`IJ-F룝Q_ָ t~Q"Vm;/_Kݏc` /U)ު-TqcvQ,؁` 1hk6,h?K\=zεW kM}vXh=~I^V)SMT@%iU}k7][(W-k/ 8ZWٌxcfeK9g+s ~"|>v.v_'tRTD/~de+2Ʉ _/$(o0] 2-33G%3'w,HaKr_b^Ib$[Krx .1.:x}^nܵt].vc/~ +S˚4$Դ٬1[440_@(\[U4F)I{Q;L9":>)gŤl &@h"Gs/XNf|54b.`AU=$jW()lq08ޔyc"Ϊ+O"yn' M#se\v55DL|P8Ub\,q$o$]ոyފC>sϰG9{+?;Z](ЏcGREx:>&6,O\*8k\~95yhc|Bl#Pc6&6 NYa*ԖV9[4fb^,([ pKBoZQ2-2r7|LrGsљ 7TުB1V4뚨`6q7n_蹖8xdEe.1D[IOF[w?KՕ>L^#/at" 'Aؑ/;k؇-=qH2^(bû[yi]f|!l?m/l3\G*rK9Bm\9S\Ô[4`^ْq4vP̱ ĄVVgGL"TdރґjC{I]Di,]huEeHň1L3;}vms@&AA] `@gd"bl5;J6}Vj$E.dx5yn-qeHbG2~V$(ׁcL$i/؍E_c73~z_Eqpc8c>R/Mb ~b. #[Ac˩\yځY.1aFQ0\YJ U+L\QdYѮf++*7:7;p>!eYZ30 Z}ؓ;* E" |WzԾ~0cSevcPt6 |5P  8/X$ Ǡ/ onG?CůT06p]aDuu/NL^GsXiRW,NÖ]?Z\G#w8v^QِmG?WJcG6#pB~F? 6e^l? Q`{<1W # qF^ClIK^#Wh7WՅXK%mQB0H"(UEG(fǎLJZ:(S<;Bu"Xj`m.CGAIN*->K}d! tIB'ޯ+.e?ʉ&${ӯP&'@$$^QsJmI5X R9?vU_K޳#8aDv1'WHJ#pXYٴɋgjH>_E.kgթ\ rx_}/xٽ} [T$Τ ;  %w&*8GEis7~*?2ODJo_+"K\!n,z:[%xv*w?G~ڟDAſĚA~ǯL=Κ/:8WQbX[tKڵGv5Fl1WE4wūWsuJ"JV h9%[d͝CNpwOJK\d ,~=$\[cگqU2' ?? GZLT.|v~>2eJ` [>)?. 'Eьce#+ VVڎF)I{P:RR5`RPd`f*dE8X常|gȹGYw7o;r;^Fw'_QBm&#}W™ w1zqJdE«9:"}Љq(g7C\h)q_ΑH_+$R$(`z" 9T} \ϭcxƴؓH $|)J,%^;lӸZ_*Wa9/ט]o_mq\$¿襂ەiJyv/8 o+n{'XZ\|!`4RTF;ȎT$fn . !ԅR`a"q.~,WU/az\`cpJZO\/}+of{3g^|XX{9|> #&Y\zT'CaOe%.~pOz#y$Q&N%#{‰zgT!@rzP?Ǐ1Sg^s,c.П)q?F`FDj6-ڪdR•E7Sq!mUQDGɱ#KlљF A̩ʊx!\9 )'IJ a5iM|E@p0O|MBqXxA0Glgc" L/'GG!ع#V?oYdzr_?K|RrDГXMV '{(睚 dY(qfr؇ٵ9IdY,uǵ1-tE!S\f/w"F|MW.-0q,,\0YQ:mUQ1}ؑII\ Kkd?{P^dHFNZ&F~$_&" r Bژ?ݐk4 #1!YR rIUY\Jjv puбugOIzյqA[}H6&vpOHP9~rȀ'H#\`< G+&"w|AGr &䲏+ll H"̆~d_n>8g[Iy{MDru#pJ`n^y/->VofFʢ 2.1jqx# v#+)ٚ.aTU^1w5Yz$ ck0U?n? ;C|$p;<Hj6̾vqp<=]T sdUo+#y9GR4ףlE{zQe=M#y:'?]Kd9%>8مO6%3?1<;#_31/n?N۩\Ыѓ\h}`Z֩Y31 g~d$_[κb#$0A!##Bܮ6XړIi$Kf]9}B̯xɧpTvkڑ2>${SvI[X%_ %. G<_*r+uN%qEc&h—.Y HOCI:L\b\@6fw*R?c}4mֲbG_X/XKoK[;ʼٷԹYwƔ:VOW)v#/y;qw`}ݟ9_%ysr &{pώ '{tQ /%Ȯ]cp"MJ[̱ >,Wx5#pzjy݋]BmpaBISH&dEUEl߱#~ bI'L;Vcl.:Ctfka(^\:"hR&# 6T"(ܥd nQ󏥁>8Mb])B]R\3:PUu;HW5w;U99vIe<>1/G"v$[3IhrIo$X3-|O ?18\v`v?Fh:!X&+قe[buh=p&$QLj"9`E`qZ#h anGc5GE.ݯpg/zSq=x]xw;n:> \ߗ";S/90su>L#ت,(Y ,ˡ$UqewsA|$y=oS+WGŕ3C~fmtَ,߯GcďP8Υͬzm= ߩ\\V&9Xe0Ak7+/< +>[ 厝ҍ:W4)&YGP `fi,tu[2<-`sIv(E}Y`Bn ̑k>%Ya}#~ascQBu ꏔ 4PPس,O(}`Oǫk^0 OW2yPcB4 i0YQVŦؤtoFLh; @ARKkHGtٿ:V8 .5ucWX z L:!Ͷ,PWe^u$ĩD߲/"9a$oqHRoIDKl8KYpE_fI" jI%'?_V晽ذǗpuS{}S\Ns-ly U* WzZ MؑI8[;Q1BcӀu J~Pyw:Q-UB.+>q:.qQRȻ %!{s%XfZ1v.7cuz'՘yVs%ae*"Ntk</SI$$ruN` ]D%3.Ooq]rì+SfÉ,{68>6NO`e.~y{mһfz)qHI +j**L|B#sr0 H:z;s133Y&1f?X%܌'y+vb-q\61qafY3(k̗%LN8ℍ1D,JA g<,8Y&\g^T4ېGSZ¼frg8׾H#bDl N nH8<`S5RXҍ:0sayhˊLM?ppzev'vw3:H$t$TބKdVQ#dޏI?y4wc(.5pkv!x˿l }"$0}vlÉ kp\ $E E>Id$ǡ) 8qOD|,kcnNd_ OkA2.G]r,ld%*YUoԝқ𑲵&RēK&ujJAZ%+!(ZzS&4qVuV|Xc "RE 2wuЊk@U]\4F[H\gHvn Ս.c7]ߪ0]rx<ċxS}xNvb0𢏽`wY~wkY|E2*5| c~UIn-Z%^81F;}mbas_>jl">9Ƈm~~~*w~bG8@n[L6K\0k-uf'UuEB5X<D=^lG2!c٭ M#  ]IѠd:o>ǽ{vӉ>4,qkSAwVۑG9OkJ>n{4_}IU$^|;P[JbdnT$Sn'ҖOrHB:-\;lpDኼfXocޭ/fXATk>[j#(7g_;iFCD+],tK銙 +*VLG&[W'qGr0`ВR*@کeuh8j!L i Xv|Z5R4O 6R:aE#Y('ǒ@93ձ%%gDy?$kswbx:?$W#r:J/"E`Hbfϒǂ$,%Kl?sncgޅ6%U>O96D~b2fyoD{gjc!)*bҍ:L+ ӛ)M ] 2[Z$V9P^5&Q>csX8ݯ蒧Dj9Za|ҝ}/sHgeʹ丽8HG}I`Bnu{6N!'l\\WIRʸE-FLVb,]$28\lC" \x$c.! qdVvaMK\g mUQ 2WIi8peRBdrnSlj&h5G W0ߌ3+%T_`!Z|5qj΋"v]oمI􅻡 5A 99 \G+I"Y9Z,WMD}kw\ SXcܙk,ymun-d_/'ǰY .Jd UJqYWH< ?ʏrEl#3S|sq5h]!ԥ)Ȋ*UEL7^(UۊVRT$%WtUʔn(i#u܂g@a3im@Q`b%`"D3,# ) yֿMj[:y=ZܪSy<$f=K`A87x"w9)x.+lLnk4vx#yv Y#!s_[վ^RKY˰ [a_}o$vS#ځ#mZk4TZ/>5֍z|T:)ĩZ k[M!iBzJgvCB@J@Ϲc몙!=&R lUY0Drt- w4 _\=wŰVCeIYך&]vp|T_SG ΁i- AڋپrOrz'bcaϞ'XDqc\?"C;_&Y?rp^'9^K\Ӛ!iOĪ\%f'5| D\rb!M&:KGc A:~Q:H@IDAT6씱/-֭~8"QMap?\I58$Η5zUSTI)!˩"G瑽'^j;85Qtק;E?#!p{ڀ%A#&B'\`H-uur(zZ>_<%Û<n͈;2^7jh[(څ#Wn?}خC1(1]:l[( +Tݽ~ F.z!X͈4vO"v`P?EpUl=>0kXWehʝ]A&%h2SX?&olY d/"*X|I[芶ŷl ;|\@uX3iACske"L^5>!HagB=+f m锱D7my\ i461 눻?t\6n%nbOIvEY"&Ѡ>ӻf{hD4Y"["AIbk+Mnl;`Ni CFr0kL$ b aW"9-q ~-,>o&Cя&S UVr;ESjTi!e9"AYPgaA Ǿ@D/.scP/c~_]@(jLYwp2wDy8]kfb3I@F +څY{pž(DvlwƉ8g#L`r} cg3LP,ЅAgX}aJoVI)ga4 :мzj-Βz˻L\8dBY;@ឭg[C}kz*AH EŏDrRH$wQA}=[Y`GF8Nd>Id9YU{J6Y~ؿl7?1-3.FoKͦZn=j#Oش쎞+[U#Em ²!Ltc@$=.J|5dJtAU)d0POB6D%j֎olބ 8f#>&hFev̸h][Lbs25gZ3KЎ Dߒ%\p %~JYد_TpR\Q%K<5Il&L NĞtEzA»4)9tW`M9xwSF8 x١ xs68|-?3{$yi z.Agae=43D yej.:2u%aj>]v1qܕnwo^z| 0I7E-(Dm)Pr6VƳHJ)nDa{a9ac:.$5 pQf8[l+b=Vp6xF1ލҔGzֲH^ɫ`2O&25 `r0kACF3z]PʂqS!w犋\_Ac6R>DOGލ2v!I)O0.&7LW 6v\xDvkEBS'^Eq'G;׼2 )j?;0Vyz.]1u]_y\te=OO'+:l^J$LxI,@헳d. QvYd|_ocW w$o;۱lW+9x#M`/c0<'&PKIu&BbYO"tRSѼɏ(l$'Sȁ+JS8஼-q% HBkSpQX_ "=&8kp^?$b.yFPګ UB E8軒289W^k3HOlam,HHUUMᵋ4!CĽ(. C?r/s-zA /1 EXgMmβskSZ" A$LBDZC'PTJ" ˮ,LFŦb1Tt-MebjL$$ $T$!!}o5k7yk;mmW1Qzoj|n2ddI* fvD62f`Vd[`5wD-G4;Q-Ur -bRT3YVPcFyꞋ]/B\k3p2m#sh.'лsvJ!>2b!jCV׵\J04UiPQU"/*rtqHSk/0'K鈥kWe; o&v Q'Ԙvɜ5Ds;m-M(M= Dp'՘8:RqRR9nx [fhim+LDv e9qL"Wm~Z:YȦn50)e1[Ŝ&sJwF૰#V!):>n,GH !ԩ`ŝ1gѠ 1)tdMʓ8Z(sI#%Vχ@Uhj5{bX@1Q9b bh>V8ݦn6g"Ofz m]v!m#Lj,j`77\k"Ogy8"-G4?DPۘR<]$O'_ rm|^UZ!gn%9m^dcR܈倊D@%U>p'<_B6e(CjIIbQ~?-vyb|8NWxQN DqvFc]P=Ĵg̗;c @w;<5;Nk޷la[ +0I-a25|?'@#ِGcX|?k#"X] #5Řz3pbOnpr{"vQoW"9ra3q(yAE w-o@H=6דq3$шxlFPEQ.f9{Q GʘmLr".š#:Ƒq[e7$D'꛻ԗ,֏|/A9ar58&yF~UsA+Vuh̙7D 1_)\m=r<$؊ ,ƭ"Bfvی 8 KPGbq1UMV_L!yUd@+O E Y:~PZwSycRح,#* W'(!fPys2(8)ItZ9o##Cg&)!:rYwnL(ڦ uԪNJ wK3g|‡A0ez#eYx|~3&.,XJp/H:dzSܨd#Ƿ1V{Or*E <_rƊ,{uֶ \ ݐoMk|)D؁`$ 6"l3m|>Jw xPbֈb,K@PrD\ F%Rb" Ǻ*1VF^U_2g+<6^iQc'GG=MCύ:nMʿR!v!t$Zc @"j?|rfL&l#">YS}Ds qb1Y\UmĤK~Wvg˰ ;\7Z % ¤)@1;ܵK42fBb!>5H1yLKU$1Bo |t㓲d):0a0!"衪޾u.V^q Q;cB8w!̲Ok0ˆcknk ˒Mb,갣f\ުpg;+#X##r>b1N2ǘ-mcH5sbҘ^ϫqLm81o+:mf`ѵ {Z3u)% *R"5Q蜢[`$j+ju7U[vmq2MVV񚬸"#ioMԦ ~ S;bo5%MwWGuQ3\,oo{[^) ?Ig6bl*?'@;6Sv 3?!jZh5vWAx1 qD+za?GJD$G51F~D8ǵ,ɏLDkLc2 ڎg6,vC"ǰ_2sTZ4{zX3po#x=>5K\Ak w*\j/KCwXjGUXM6])ܽZ+ib EP? q(jCKi]yy:鰲pej6?z s@EvH[2=ƨPPf´RL3x@Q8GK> OR^aRdd^ieҔ # '*Ֆ \S`qn hc1Бc[ 쇽Kom5/T6^u[$OEr9n {CvT[~>J4ys'"&S{损-S܇`W< 9kku@$(<΋%B %LߊLN67n97+kR1$R|ʇFC>mo*&x#⵭O"`d 8y9rs<DJ1iLQ/ƶ񌝰c/I 8fc_m/'F\!HMHAh̑+eg_F< daU X]V }@l;aB= UUp"+:m>[ȔѯznF 1,J֝8!~2ý/b=鑶q{dIՈ,>6L[@|>mT9_F-#"9B\ig2ǰ oHO:Yڎk.=WTC\jF#Z`t8S&?Me6]eEkUWؼuV^cV{8=P*[2Akĕ@QZ6s}")DC< "Ue!U͵6{HZ),6?>BRds>-$ $GPG/{T);Ÿ ^˛wD&keDk#McT8G`ؚkYEO'~W~). tlG:*Waii~}Bt):[*@ F9tN%vF6R{ąE jr tqύ-(cO~)hfIz%ڏnï=rMLqal:NqT Lrvgm>Sɕ<d4m,czrs`:j&TH!)&q?jZ9穐vq4.e9O iR/%C#5ETqOrZ}-}x B9 `,gf)I ̮f5UB|iKJܾ[H~ ح\:ZZ,uc/\rCYM`jh]׸ p[|\K%?>W}TJäh[^Rݷ%Aa$`>cϱ \RRsDODsc2lĸFۘ?U%]f`F*,Ox:BLe+S>2RŸڨijguQTW]U**EUWMiC'pUAZ:q%P;-r@R .@X RQް7zUWu8BJý{ vdwwUZC4 9iC1c3T;Y㻾P{<]&VsD fj 60z>>)\S9ȧ8GE[ qDo1jLjky2V>}L$"Ȥ0>VVc<8gm ǂYf_jX噁xn]1H~Z qcyOo%V!ז0L%ullţd+nTW'fQoGA)h$:fz{5@Kۮ6 SvvF`WSLZVQVCVhDq)NP2n]%Ͷ f TÌj:pzv<8 >9Y2A2o%;ضVGrϘdOgr2dTODv+^q1W/k;Q?_o#02S),1ρEPW[:9:¢v#HP*ؼ]񣻍x̰>^? q4bFn@ٮJTHō VLO1 z#Yzl¿\v9/͜ET(i1Σ?Y)/zCU;5&FdXYKhq#֚s=&iZF>ȹ7o~)b8H-iXVz<xOK\y 3W1Aɝw3Lz&1S,*qŅTCAeA>;]j Ih~$82?8ISЌM=;wnzJ@^o߹ "1@T9*e]QZfm/=nWAfi^ 2)rqdrsLoJ4h5Ie-IͱAgL2cEtxlܐ~[!F>5HZ?~mNj=/)Uǥ.u@E6R8+@LlA.P5v-6ffյu3FjgoS(PFmoߺkkSlٻʈ)ҍ|˒yލJ咜Ì{g9'j=r*Z*%wSّLHpx־s߈W^' fE~hq$Z0Ody\KIe[Ɗi[l9&ƚbV)mmgvyt)F7Q.2wOD|Ֆ;OXzO]N @EbVv֣%i5k)Gn)M5KK\fiRVS6 Ve^`*XfF6+ cG:3rx%䑟&n-mFtF/ψ ~]5c}X6,R<Yabjpya˼ ?G~zkI$*lʘE:!ĤkL)w9DmXn. h,8UH#’}F^%AŇZ oF_ۗ\aվ]C@W`jċ*ĵCBTi4~_SI[9Ǵ}ڇt&6ǜUK)$7`b<swI>?\W_A#ssDCxmKRsly2hHbZn5Vj_6_R`qyLql}?տ_vyf G{~P Q7q:q"XCqo:s.KII9n(df5ie) bH՗ uR{F\X[nԭHo쮒!=M"X :Y\k8rr{S$ ,2ws-V6^Lv_==eDKXG UO&f9ĭs'rYM5q̐h~Dxɸb囁x]*uZ׺@ Mѩ qOekmpb=Gkz B= U=P҈usm9p1jڰZ9BqURVa$Z ֮T?jD|MDZC'Oy b<:eF'N<)WH4"sKXsWXlYjcKvf yk\*l9 %T!sԎ w c%AOTtU.UZ-T.J#CY$]5q "U$ {7+ vB]~\îνۃv##Ok)ZYw7٬ ܠy+~SWD෽--9qݧ &}}0VR 8&Ik K bw=V7c 2b>El/(k#6嚁rG7]dΆcī3Jx[xo]w"yj2'tG'P.&H`*T4b=0'@Q%h06nv򟮢k4 SW1.^5-UQ9K{V!?{P?ԵSA_)h#xNCSqknE:R^,k~*k@X̿wV8L?\ N3~"dڬQn&<#5j,?Uͅ. wWaZ[fQ#+s,7+o{B`_B-n`1\njʔH![R M s%Dy'/޸J)/_/ x)܂ dvAV1ٱ۾e~,a8<ȹ054M 7 8zq+ ikG\qT=s,2ctS,.AVc %V瞃Ve }ͪk8$~,F/E9m>^*#&$uIvc܏w&HFΒ!L2q)b6Nt0c,UL1O" rIr&6'1SxxgWyǶ I;rO%\3*qB\EmʿdeBNn8KhV]ݮ6 $"8ԉS `@^'M Y7(~Vb'E!xX1e@]^%:c]po"89 \` _/I/m{O_o Ykj8gg:-CV+ $;Cm`ia)gB'݉l'6c?-a~O5x[`[7n+[ -@*Ti;rH46EZPJBII,Ԫ$UvcSFյU&v(\)oW. B7O=r羋1!9w!76Or ?&Hk_ʤ;d~O5Kҍk #z:ckl D<x 4&;X8)7v|=d.e8js& (!xg]*R@FW0Wru@UP5!7S!"iǤg\n<)#֚-[#;sQ<*vЕNrl{a[HʠwU#T}'MfgOwj!-ymz-vv;H Ψ}[8S&VHDSWc%N^ߌX\KCdmJ-< 6< L2G>:)d\m#bp\7,~G\nL hqˈ?3 kz|MAw9*s{BnV]JMJ/0C/צRX vRt&. <ȣC]q'͝&Nq4GGd8}'~S3_M_zyj5gg={+:Dֆle5r6ՍS4.fV{$s4Wr[>9a\?r)z/f'Ǵ F02o{ Vne?(QvWYv j+SxA&ҙAJ5Ѫ+¸1ty#WYɬ ;٫MP'+mҞ#TUV:QP3˿#吱ې!+Q*yc+W)b)$!V8 2Ebr|l SH5m=dF JJLۺ/1\Rkgg}DbVy- ƿ^mZ2z9M2h!@H' ֍'#HEJHɓaբgkqlGej$oP9Pc 98{ _|{!em ݆^6<ScC9g`;L\=_&^D6f"Ԇ"-!@$a9uܣZ7|~#‚y NMz4ALSN:=dwL{AѬ /kCxۨlx)El롾ӵ>EĵJ8x9OXyK'?Qopi"x̦ ( N6+d#ؽN/?'mGOb:{ :z'A3"ۮ2Id7d Yrh[,5l8>%>ȃM8#9_SZDy/xaZxQgmVa*@䄨MTEQnF9̖6 IIC$!smtǚYҨgGZ|[LXW@U'7+rdZ˘r_s6x3ϺLbxY`91Qwm$ĔuC{(r4S'%'9suҔݧ*҉ē:"$Di؁s N\ml Jܗ(;Od_,Z9I+H}Z"س"g<ԝ{ӒXqF,|m5h[l hW] }I}lTb~C':6Gl7{X[qq *׷{c6GDUMLH\U~q"اk E\eo X_xer3t:4bu|Uҝ W)ޘ/)I ܮE֮+)> $"kHbHRY /&8.A>%R 9(#y2]ry7n?\ps4*%Jp+'?~p!?%/}jZ)>s24P/g̳~[> Ə./nTNi+9u \FXA@VYgYf}bؒث_F+X:`_\Mj'C)2L 7!bq9E gw]X lsj [V0^Ҩ/\ZY}s{nO\`/Rwn߽~HlzziE{\zvXz{&5s9Zc6.К2{I 6<=RTKsc R(a+ TExwScPJs6u\ gb_Y H2#gBn8VcȂaEŞNDxM2a-5r^!Ȱ816m7`@dQ Z;>NWXJ`m&x,$VJ{tHŒ:ʆСB}ByP7z$~' qb@iĵ%FxG;Ȫk%dK޼qK>G6+$xjH8'_N9q_1Z_ӽГu4Tg!)EI5nyv5հu,4dPn>WAݽUH IʫF_#Fb3"k$:#bFbY'Es]CdV>ijbzq9/ڸ>"檉֗utV{ԗ-?udpFkIUo߾<ϑ9cϢ%X}eaSt ` ݱ-ZuH\Ϩ3޸YP#ZJ?Fu8H,&"[gsn TZ0i0_/)+|W(QI,bĖIay b[="ӹ.%S;X1!1)F]6"O}d|p@dG g/╃Lk;X/3v [ g6sȈa"TsVQ`v %g+IIFύVal]pbqW <1);B*#$&l+T*Y z}rzɖoƩ8-Pw=?)w׼ ٽcۮ{ |OӜoK9 ˷'* i yl5}jİt/iO'vy!eq|aSt-E^w>FdzKv?{gypJސuY^.CjVnJS GqEo= ay. .*RFK._:r!|l][e5۱-(zCsf"#Dh8ll:]h\*qݳZ>߀3NiP"A>A뱬r[^,l, ?'jDYE-j?6r|3a??7`ֶ@9΋@y׸FC#=Fp='NPY춂>, uRYIiw+;-YP~!U)NmpE(\)т((ھ-2n"yGzGMyx͈Vq1ϑW\~ס;K/_Wb_2"ebrٰgE2|;ֈFY"kF}57c|84nAvcDv%f`]͌AbˊЅV#'貊z3q5"ngEЎehqP\~e}3I%clsSix$FddJENeKV8Ulh3iV`$ֱ;%L~ȚIe]ԁ5Dv'FnW>Z~7"r}K[_X s~Fh)DbWj$Ax1.=vVJ&*g شP) M67:OUHiv $ÞTWX.@S~Uqs8_;Y+`ж}Ӈn1ClBd#!/V?A#:? UcGziGMVK-X}u6J`7/:*'B2MH7o.!8&+٣fLAJ$NwB^-RA!2E3Yzq%l;L Je`BQ92q m'T?$pR0 Ǝ_Oc= LdA\Wf"MoOK,AVH}!NLu 3(d[%L{X|E})bI3Ȝ9 lél4He""&Բ~6+famKg`BtOoR3q̽!kV!=T:x^Z7#)I,`SVZ= <Ɨ 2)rHj} .@ɟ -e8mVvXC)_qu]j3 $NnRkDW&h<'qe~Yl1帾~?om/m tCՀ_=_ׯx@ilV]'MY=s'xplm@ЕN`G(9Ҋ +CT) l&|]ff!)Gql>8ƾ][뙶C-C"=0q~5|k-3'G:O@d̶5bqȮq|CN.hVcoqc^]keXX>p$6݈N&Bv{Wx!%Z *, w F"n_P'- 1 t*ٴewWڌo5;w Yr_}23g]y/V]y=Ӗ:콥ۮX3kDqܬXJ@LY0[UBu|I,YHV ;lEF F&bO1w|!Z'|ǵ7.H[bz֝?$L^IIbxi.2wSZuOjIc7KS DڇAu}?j`q?!.% \oĞjl+iScR~uov#H$ڶU6\lk#ǔ}O5mX_ݷ72Z}lگ2/hpGq}m3hVhNX=54J\Y#>HIb@2ۨgIg+8Gķs?@F+q8 A{ek32Hs׋Nww1c#=WDvrhC/0F1 eB(DL̶}31:bYYض.|B>eLWr.SrJB8V 5YRDqk[g`X=f"o%xw7ts{⹥.\mjǟUk!!%=ve iy#v?IR>"6 Tep+/cVOUMUk7Q ̎}+o['N^yd Ϻ&Ve٦Î inz!7\V7bC3Xg0gpxΘQ{7vӶĂG伭*ٹo+>(Z- ]g`]u5n>\e>CכEPVfV]yN:.iA Q6gdwI.I *mvl8'P>{qM L9DGU };Q!kVP;X얒ޖ= jz0ګ-H|^zm K`^X G`NoVM8:2.7e|aחu}tG ۬NNM|>rO)B@\7*]%xunw] "+jX 62@->E61 TtW1!zH䵛H1gFgܜʛ ~o>.M>zIn>G\V*'VBc|ȫ4βCH咺6~,61,.tF4|؍b%vjY#賎F3";732VW_{%23?ftk|HFy+DncIĪqb^%W;!k\!+ [RK.Q:U*JPLB'\"OQX+LǓ}΋!QtnE+%8Hko>zt|w~%osy` M {rչf\q ̫}48-~|f}>< Ƃ۬ά|K|׬9ž*|)_6U3 vי;'k=o$P.2$ngJW5[oܸ)$.t DYyҪas`G<2b!Gz&OV] G]1 Llow=v-';ENLDK k^Aja5H4H`Ni03!ۈYu}[NVC2bېͩ'q s_(:J`wyWaSCD"%uu"!FЍ쉝!br4*){to H^DBuTc wXE!0qY%@n$.@;np Qf2dijB %sDs֬O:\u6%v_꾷;@F$>vBZ,X=\ l7H&r]Vcٷϙpe S, }浭3 S.WkUXz֓ eAcOAbi Ń:嫮 Bqv!~?'97D{ޗHDL.g|>v멫]Fp0a$_kn\ Lzeʦ ژʏe5$G[}čuy/b?"vC+[V?4y /8_2O6敼i[_NiV{[ z^{ֳ:{ao,_uMA1J.qEdyƄ%+ΝPFE!+%/Q\B5 mQ!i+W&E:t5 lɴRßշs>Xw!|fU*T61U{c }ŧmsĖq[l㽴FY'3~!/m+LNml+_ݕ]Ә]˧Q˥sK] 򊻽I GPy|Vi v %bZUF&AJ$EqvTRFW<lNF"X] E)e5AJNQȩ#c笧۳M}vX.9'*آY C@':˾N*lN)cС[uYZ#0 V %acSlgC52k{-uVrC4 " +ID|`߽l 3 ;zy \D [k#pW)Pbq&5ʛ7TOQymkN rQUW8qM8s69~j+eeA\' T"BgM=٥;'~aN]pDVFв_? ;U?9>mAWdhk+m#~75{:y[݈ek$6g&DnȎ|߿s rm vqwX΀Ɋ+JVEjk^Dd"um!%kq Cw@\LuR[*X+B#9x XxRbI_M>3iE\DLkX\t񙮺JI"tOd-ƸxykD>wϮbgP0 1?yû+5R m+qN5Riq!J-֎'$wj,Y:_yZ5׼2HmSy{WaqN&!րL\ qի*)ǖIV y5šZ~~ra'<4UQBP3( ةew524L0")="CRo,g)cƔE[JHSOs6c_^; :/_ўa.xv+ Gd,IGcXc`5۬&\%V_X6h5Wd7ZM5b:$ ׿ ΀>հ \D?ccSJ(UW)ɂfr2))Mfh$UWW/6* ^E-Uz69%S]*O[ E'SN(jCҾ =/,ŀA҄I@@^Jb-bu#$D6cM KgXLzmBjd`v5 @u:ػX:KfKWK4X+sg0>qŔU4!Rɍ[0צj{cIur1+$:Ntյkcw CUE3#UQX`ќKuVCCخ3:~0Sˁs3y5Abm48n"9fI/>a ʫD/FͶ YE]_%b7x/,ΰ7;-Wcy A/V{ٽP:9r?v8ly@^'Mok8p7n[K^yr"Rm*]vT %8I(6q|Όyч02i'jjA Ӄݛ퇲{Wb8?bs"/ u5pqB>8HY}ȋ,ji@ olzf`aE>?"Ky 2(󡫊D*.~'X$6Q @WZRJTwlR4f2LmuRzXC*n44IQEhlh?/pɗk[Tr-e[d k|?mp>~,^Sx|ϟAɦ~TNΎ K}b%s%jM~X}mzT5mViy>IȗW_| c?ͱ/& \C2NMk%/6OK׵|_{8XM5˕#7E|)ϐḃRI)؁WtV\#:axDž*+HIbr܇a4M]pשk.xb( IZaX7 ~7u䍡V#ADaKF_ȶX"mۖeu|vSQ+Mg>a6ڞ0!5"kRZuNrf@)s" !QHd{ f1Cnjyf|F6~lT%GSCFpաĨ_ǽ؀TXk1I:`1>'W:pVD&vW]^tb>U}Vc/< +L} {XI5xi$QW* D\8,bxz%+㓘{ںMs.yƶu=Np+t.*]^=[v~W7Ğ᪫VW#ZJRaC4"S[%ȐjLTD\+頩PXvu#or' f dj3VvR|\'p <ԥQY9B(AkDdDTI>Dzl7X!|vDd/VQs ~c(OTR.jۮdY:;ro eFb|+\ze`TeUNB^XseܥQVG$DzP%^BH/s֐U'+9Ǫr Տz |Pa(vk9<`9$*f َS}+koDb_ԁllc'jtUo>eҊFdAmuJD}喑JZM*qɶgݬDLXaalWc6]M3p3sM~H,3 = IGJ\Xrqu$J7n_j qݵ_UZn]8t\\^u:([k EO>Cpo>)]Z^ޏ87ɲ㩕ߊZͻC& u0&+XɶYU5IaB6o+h%wC'V|$pzTBtJ|䇾SO+u֗ 7r^.ЕVTG4ƗB*L5}؛?Wi/T%F;HU8բX5RcgUJ\0Q@7u4XXWN~|ViW15X7NDʫؤ+d̈>$G1Lt[ܖm+Xjo|b5Xmr1C?C'W. 85u sEU6օoefʻ/o^߅*EwT'kN(R*MhP0J6(J ~HQ VeQCIH2yya5!164;v͒+LF{ՠ!X I*0EǤ0=-_mqR_lm9W완&[?\󹶋;9.n &[8.dͬ](]lx) hݟ{|uW ѺʅH5d & qڊgQʛJxM~:Y]K\ y%5E {Uॳb :ό멛d\L}d/]_~w7|~2 2V^u5HZV00™MBW䬯*Fc!b-qk[g"z^q/tu/U-&<~!+ĥ"<K#BF6Iс*nی5$ͣI[4&NZ]eROAU608LuLy~/mɡ>[T3~?۟q-\-A:Iĕj%Dg :qm p_dcLq~|q,]\rs\cy)KIQοm,Xf7\ev9_264=kW||ɦ8IG럆̬XfYR葉"ľ?z`uPe\82 s%>I) xu8nܸU>8 ܪkv IbV$]qQpJVZB. T!<<\ɺ>Ϧt"7yO"u68mؚyB_َr_|UVc[?ԥʯ>~֒?BpEU0O|5"2=G捛e_~dZumх=:]L0֐4^2Yum E"ROAUj"xաI[~k *[G6ik{ Y}~jkĕ>Xҁ A0x 3 };5_9t+cB5rUGq}Uశu`zG%^TYdZ,i =Q!щLJCV>_x G'*EQeiUJPi?*Ru*Z9գ!<<\ɺ>mѱ b~FnI9a&_VgT\oM\kXJu5VVc=`@$cN c>ykdƊM6wɟx~u8uHut L{yr#r|1kdfS\Z ,)%XI#<tR)=+!j !}y Q&abІIQ[>~=̯~=P'?|]`8Ηk|hu,cxF~5y}{`rm1I-4^$۶^?}fݫZۣEŏJݬcҲ_= ه,v>6Y_j>_Aolh׶qUS-Va/ }cU?6y2hK._=TʖCxu EEҘSmf4!)֟+LGOoꪚ|Є.x")&PJ xmRZ/Nt./([2c[RzSݢRFj7◵Ԫ7H~OHes~2PXNjlkv\ҋGʗ}>#EJӵj{"^'wǤ : R|4bR5%ߴ]InH%y U^{ ^ՁpT zcWݢC"!W3?:iu!:R–} x>u[A>XZ}zm-m1"VSѶɟs-?ޕ[_. FrIpQHOx+[.Aqe(BU1\R Tc>_p"DPԇ47 Ƣ:#rIP4qꮚ|H1N|M$6}9;xA!dm \.0m?e{cp"-kD~-Q} $ ̖h:,]>eulLfM?7='}č3p3^Gr.v׭u &4)O`V k$ §=Gɗw mf/!ibM+LGOů>jThsBb?Ũٗ(@PiŌ8 A$ƚSS>#uS'qbs\'jzXζ %TsɰfÎT9˘s.қ_{rmZ._-}F{c .~yX?<kv]u~XƖ\ }[ֶ3pf`,+\: ()F%2: Nݎ=TýGDY>iƂv`,J{UD^;UzHIr 9!O[W],H1D!D8T)bƏ8TKq SK- Z5 M\sS:QZ&?ɖd >cTTWv>bxNؗQ!B.q?P 䴌*,x&A?hXhDHmC4kKIc`ɟ(sqg%]ۥߥ t&N)TcKp%+˟z *@r$4!;W'E:YjALd6I|$1yu ,V]!ՕW Ғ ;5'pP6q|yI c+5|e8!l$/awm% d$&}u.–ov K9.٨y$+( E {]K{OǷdA46!-)K8=*#{[ z-+!o*{\AL7yX 筋A%j4 {S@q~zu. ދ$֯"{?Te1#'kp!1+T{rEnAD!)IcQ΅G=UM>aj D{UW:Юz{};T@$Ĭ/.v7MɎ$(e"6^)9T\Q[cʑ6lg9bX&eI X 'l(YM'wj,`@mk@KWdjzņ^ 4]o5VlbkyvY}[YOmZuחK?l,7s+))e qVW+FOTָ{W>qZ&M8[ V,f z,=WS$BaJP &$ҁ.,0h) ۸G~_WciƜ9_9qiU!1<4qͼ1Lzq,k$͸۷o'XBDT| e"ʄ ]-6H(ыy[wGJ 59'WZ1d?F{ GYnJbxu+Aމ%d8qcw8cf %zցr+O׻ v"]0PDimɇDyi᫷*W2xs"Q k脠`‚j7eLDHBqW6Hx|9I6;_OR0 Ʀ~`q$e[ĴxFZ}$  F]-cAD=ẅMY߈l/>hVqxVq͆wmuL o& m<E n1+}̪JX;y2I^Vv^eX> b"{"cq9By8mH;4yG^=߈IɄhc"BaKXP~Ld* %HFIMa1k&q)&};'ՑYTD"_[%8c>!K|eG_[Jj xJX<qI55"kDu"yf>f7rerŶl^_N]>wS܇3@Ophfv$ٲl/.bBձQ[N\P [:I +~Pݺ\ԫت]gM U M!76[Rf.̉l&~LdJ`:[E؆1#ɥ֜/@^9e66~椸a#%FŸo>gX_vrͺ{Bj,$d1BY&P羑P[8zvi~&Pk{nu֗uXt9gM^s9y؂dsф9RY=Q"->!zlZ5N|"!F3aFS g_5R*A2XLL9 acg"=xr6.0균lZ-ΕTp/X.0W6R7?[`\s>f)D~&yjxM# VZ/è=ٸ$3PnJbl!+kqʼnPʖ M.⤐NR?:6ld>yVd]BQO1TL*Yq9Qw:$yXW'u i!$,v_s>L\+h!X= E6V [#YLJ<[u ǬW'-lKSTԍΔE8em l1 [ΕqRto1:$,֕ꨩc6*k$e-3^x<̿i4\VVc ZlFFyo, e" чZ} 2 ?7W?Կ::Z϶xVb:y\ii/+g E'&/\R6qDq)"2gMBzUBëpgM Hhb8!8ܠhRWĪ"V?| kKV]>JZQ=$ S(I&39hb\g$J+Xav)-ިF#\ъHc),E 4.}u˸$HQiBO勄>ibjAXk-hJ^eu3`Ou ՙ RٛJ#Sӄ" %''~2dקB kD^sI)zy@5WXv?f+Hl=6YzSD#M~$ 0+XF*L"QG-ťꈗrME|u63/"v~R(l WEuF]eQhq{_!Ptri:j ڥ'FbSjyneuX$̈́\n;$M{Y9EI*CR儼vFJk`/*ҿ?ɁDk%A\ҠlPhOo8BRF I`!΁٣>z?l#c"$H?P#P,#65jK1$Lkl).TGԖUTw ~Ar ׎B:H,^l!6p=km''wIWcj~JP|-|P=u>:QV:޽ndm3@wޫ@}]#q4݋ӕ"xAT9!iFJˀ& Wꈃ>ևgLnx!L@BL2S2ZpreRsV@S򊜔\XM[1Wjƪ4 '<;}`FC3Я~X3C-xXߜM_$Հ̗s6A^\ҷv\4306]zkb9G.GsNrvFDizQxϴd[޻ss%<xpv f$8g%v 3R2*ĕ*ylHF~-j! `'CǻmbյuھroH$`PL5 8`ql77*f(v;#R5j"t*jvvcy@ϐD⚫_+_Hj@_3V3 4gNhky=ff+]`J)jWXE ˤ~{m"$bkjy/{B8 4#"ujsg !e{c&fM63ajk_2)~6@mm,E qPq0l,Q#pLς^}IDATΨ^SӎliCU>).Ɲ ElYף'=|'y|-?iW-NXg`XD;Le )73_EI*;׆=UXc6Dl>UDZx̋n\!ZnjƮw֣_[WiFu)>.dX{g!F_`q Wy`1TH752uS'Jٯ8jS߀aTcL5$q6X9x6sqK eMKdUǝ_"n[8e` /HHHx!B&@8f6{9U޾䮳z_խqeOK>ī8v4ZkqMyYc1݇aD/3qk#\-bє*Ӱ,{Ih?{r/yE!\ٶv1 byaj2(bg~N1WV4bYR`*tg\Qf̰m-3#yz/ɫ9ҧט%nO]2*1Q{s.' Ne/BrϘ-es5$HC4-`mrlI?֒ zL!}޸}i:Ay'b n܈EZUF8VsvD 9Fxt5G{=DvTs;s>;/kyȅLwUg,Pm>kYAw*gk4fzZ[=JF,v3HIqrqn!JJ=m\Jp {دq̉zVk&8<5&^mmGۏumWkUkWI@nWYZw@Q!"6߅cЍj1\-ꜹO$җc}c|v94uRJ?c 0_ԴbyStlyv!e)'PW6OKq+Y+/q͖eobB{ !8BFCvR/#1F}o)}1O"%}f[8?WlMx?`Wi7+b_5߆sDŰЖg~XB5w7Zh?w}wȎ"}S-:3;VQSJ'!Jzcy~7ֺ*$kY۩?RHNdglqXr$n$'qnnU%pw4KVPZLC<9B}Hsgg>k"ބv!N Ghm6Xvl# p Awdpa܋oD7{*s^ꜹ{5-Ci'~+XO@e\mLv5"v̘ OˉUԝ!Ţ}J,ZemHa1[jHo!+JN/I7sTYF9>nP*3HY˜}`擵 esI/z{5-ih~ Kk p d(ܨK_ʍp5o`?bӰ4YyxfziQ wgz",qF(x9F&BabDƲƘ};)Hj;\ޓN,-J(v{|b’w8Č!kg'c.9Eh2{[JmO5Kތn(Eyź/q"G@wr}cBXGn뎦o^_eJ|FNN\.PNVp]Ӫ5w(wQ.n3.X}znwb7^,NfRTy$ #X->)qSVwd_{y8sG$@)]bS)cv$ǶƀuKOyk=C/\ p^zп1;AoєM;WݖVc!z^c #^ful!I>M= [/˳Dϵ~YQpXV!8bH5ZYokKN(;Ce%ub3)3>J̎uTڰqJ.z{Z .d[}:N $ I@B]nDȦ E(W~؆V+͖7yTzܿ#p9 z٬q=FW[:" .vZJqbŘE@B3кs]kJ2晣Gk0M!wZ]#1}9K\a1s VǗ5bQ2K|ۋO~&ŧkf쳵[S/0k@  mۇ͈ؗF4ķ;]JIyj .Jj.d Ѯ")q1zkI9)4|"ZTњ޻{Vhw6k0c|͟9Zw+`%NhN&9b?Y(N쵧[s͉2R=on"űq9d#<'Q\տj/.0~0o}i. .d_v;ߤCɴ:fGa9kUOXIk>p@|;G-G aT9k )}ٚFLIKܴ|}3SW'1KGb,Gd?j/kuȺ]S͓uAn(Sƌ/ūr^Oӹ^G۹ӯW^nLv+ kW^~a|/߭:7o4g3\& !dM56]}X?C5(=c쨏hm`8k ,#EK6L!ӞiUuR =Tc=6\/ʜ)%#?Jo|zOK2֒kڣhVKnڤ>R+sZd5-'2`Ƿ1A/]]Ⱦ[oawlifQQIW煏MCɧլX[\wq!j jHsۈ^+dF܋df-)uRԈV WfMa#2_K{|99]6}j%v/]u闯+Ĭך;iM{x3fln5:^k;pXy]!W2/sR"p"U}SJ'-\ߕ";3Cڅb=ʮϜ՞Irڏ-_C މ . *du WCܖqWֆ?j,;.2]5w>N5+CĹ(Q7Nֈ,qb-,c^{l]g LEMG3m7e~>{~UTѫp{2Q~yi￶9n7Ӿ'&o35>7n 5Z[kf!_!>}y im9=]e9x}Ygw*xp<rβԕyc=K>wgu d1Z7}.9cESzqX{oF?MB >~-#.&d_{ x;p |1F&^u+~خmM0]Uvoݎaj#x#m͚vЫE-ILDtǞĞfwcH(^Ƀ}/L|:;kZ`|D.1-!BFX"_kBZRJ5_PYx3%`bBTɢw9LEh-rvo}݇鯱[-[\vyp &ߦW)]){&w}zࣟ_ы20EFڡijXX|]fd&6CbJkDILnqIbQ0^gus`O!hYgEldkV~ϑ{kbx۪PxZi2mR̮Bv Ƨ%wYDFvGnէ6[x)!Qe!)Qdyjɲ.K=jX8+1.vbؔ},%ǿr qK;-~iIj>ox Dվ{m++k"펧%ovgv_کPoIEIX)f; Oab r.1EϩQR-njW{?=_8G53wr٫.*]3gc3!k3Y5{2A:rƜ~!Z;} y :c .j$hw9w]|ßjcg6j͏"l=ƴ q 3>)rj< -QN،n"-<ԓD"\BF0H͕uQe6Ư1_}LZk/_)T-ufo#n8z`/+'.&~o GL7EsHl{(_Pi eB;=0K"EkدT,^rj=a:n}[?tv\ [6y@y~w Iɂ h`s(Տ]OIdz(RҽkLo.Dxϰ1j}YÅG)W⮇h>͢6Yw>$ﵝ'OmZF4sG ]7b<l(]M!/Q/KR{'Mf{_HNKQ{&klY7JN9B2|\J AxC?ӿruFMG}}Dܞom ),._m8Cu%G(G 1ɳ!Ӿ+$r-1fx.%qd/z0Z_ M># 'э#! p)\iieOf=id'xD)1 (B0#is27Wmm|ҿƵQs,=?'"MEyǨa'i>V>Ć9hgM6zWu܊fn [H[0 >?^|@p B5; s:KRMىMi&Oc6ٳꪯg/']&]~xh*/ &"{lÖ\d"~_$l%ff _y @﾿+2s-j"2wNnitAZng/?r@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @F?Rg;IENDB`openscad-2019.05/icons/openscad.desktop0000644000076500000240000000032113402025764020400 0ustar kintelstaff00000000000000[Desktop Entry] Type=Application Version=1.0 Name=OpenSCAD Icon=openscad Exec=openscad %f MimeType=application/x-openscad; Categories=Graphics;3DGraphics;Engineering; Keywords=3d;solid;geometry;csg;model;stl; openscad-2019.05/icons/openscad.ico0000644000076500000240000020407613402025764017516 0ustar kintelstaff00000000000000 (( 2<*0...$091_1f33455778c9Y:*:<? @F(,+M***++,+---./01235779;ƿ<ʖ>n?8VBFGGGF1'n&}&{%y%y%y%y&z%{&}&}'()*+,,-.0124578;=?ԫA?FG G(G\ NFGGFFZGZbkw"r!p}<"s#r!o| lz ly ly ly!mz!n|!o|!p~"r#s#v$w&z&{'~()*+,-//13468:A׸C`TFGGFiFyFzFzGzGzGzGzGzGzGyFzFzNu]X___k m|co_kZeXdWaVaVaU`VbV`XcYcZe[f\h^j`lbncoeriv jx!m{"q"r$v%y&{'))+,-/124679FG?HBKENFPJTMWNXQ\U`VbZe^j_kcogthu mz"q"s$w&{'()-4F=E ;C 9A :B;C>G@HCLFOGPJTNXPZT_XcYd]hamcofs kx m{"q~#u$y%{1zz=vG{NQVY]_a]VºF@FREGF0G}FzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyK/c1eP\]^_abcb9OYOXNXMWLUISISGQENCMAI?H=F ;C :B ;B =D?H@IENIRJSNVQ\S^VaZe]hamergt kx"p~#r~7{sDxKOTW[^`beĬfǮgʱhʹ[CFQjGG#GGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzEvO5nNYYY[\]^_abjDWbS^T^Q\P[OZMWLVJTGQFNDMAJ?G=E 9A:B;C?FBKDMGQJTMWR[U_WbZf_kbnfriv8xINRVZ]_ac«fƮgʱh̲jϵkҸoչjԽRFC FFGtGzFyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzCsPAY^VUVXY[\]^`bdAXdYeXcVaU`S^Q\PZNXLVJSHQDMCK@G=EEAJEOGQKUOYQ[U`Yd\h]j1zxNQUX\^`ceĭfȯh˲iεjзmӺmֻo׽oپqۿaF3FFFZGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyUM\[]TSTVWXY[\]^`^*q}^j]i\hYeYdWbU`T^Q[NXMWKTIREOBKAJ =E ;B :B;C?GBJEOIRLUPYR]VabiOTWZ]_bdëfǮhʱhͳj϶lҹnԻn׼oپpڿprsmL< GG/G|GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzCv\M[Z[\QPRSTVWXZ[\]`Depcoam`l^j\hZfYdWbU`R]OZNXKTHQGPCL?G>F :B :B ;C?HCLFPJTMWP[7yVY\_ad«eŭgȰh˲iϵkѸmԺnּoؽpڿpqrssuqQBHGGwGzGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzCvSQZZZZ[OMOPRSTVWXZ[\[huhugseqcobn_k]i\gYeWbU`T_PZMWLVIREMCL@HG;D :A ;D?GAJQXU_adëfǮgɰhͳjжkѸmԻo׽oؽoڿqrrsttvvuwwvNG$FyGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzH|CVVWXYYYFHJKLNOPRSTVXV7 p~!p~!n{ mzkxivhtfrcoam^j\hZfWbVaS]OXNWJSFOEM@I=E 9A;C=E@JfŮeǮjhʱiϵkѸlӺnּoؽpپpqrsttuvvvwxxxuXdGFGUGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGz:pG ;C :B G 8@mԻnؽpڿqqsstuvvvwwxwxxyyxzfMGFVG}GyGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyZNRSRSTTUWE>{x@~|BCDFGHJJ#Xm N)W+Z._(&~%{%z$y#u#u#r"p~!o} lyjwhuepdpam\h[gXdUaS]OXMVIRENCL =Dmjϵn׽sttuvvvwxxxyyyyyyxzdخFFGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGz@QQRRSSSTT>ywyv>{x@~|BCDFG>x|3fo@Z!K(R)W&}(''~&}$y$y$w#t"r!p~ n{ lyivhueq`l_k\hZeWbS^R]MWISGQAJQRUZqtuuvwwwxyyxyyyyyyyu]VFWF{GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzDw eQOOPQRSRSNyv?{y@~|BC@}~6jn5jn6ho#P`+L)O,*)(('}&|&z$x$v#t"q"p~!m{ lyiveqdpam^i[fXcVaQ\NYMVGPQRSVUbvvwxxwyyxyyyyyyyyxxiV ]GvGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyKKNNOOPPQRRI;us;uq:tp:to;upyv?|y@~|7kl5hk4fj3di3dj-[dDY,***)'('~&|%z$x$v#u"q!p~ mzivhueqbn_k[hZeU`S^Q\KUN0QRSVVUqwwwxyxyyyyyyxyxxxxwZڕQJ6GyGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyBu9zKKMNNOOPQPC:ss:tr;tq;tq:tp:to;up=xs:rp5gh3ef2cf1ae0_d/]d/^f-,++**)(''}&|%z$x#t"s!p~ lz lyhuerdp`l^jZeWbVaNZKBMNQRSVVV]yxxyxyyyyyyxyxxxwwvrD<EGGRFzGzGzGzGzGzGzGzGzGzGzGzGzGzGzFy[FIJJKMMNNON>w{;su;tt:ss:sr:tr;uq;tp9sn5kh2ed2cb0`a/^a.\_.Y_-ir...-,,+*)(''}'{%x$w#t!p~!o} lzivgtepbn]i[fYe_cIKMNQRSVVVXqyyyyyyyxyyxxxwwvuuvcѽGF FpGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGz2qHHIJJKKMNNJ;rus?u@v@wByBzC{D}D~EAx;p~p>q?s?t@uAwByBzC{C|=r;px};rx8ns6im3di1em6776554332100/..-+**)('&|&z$w#t"q n{jw*q~MMNPSUXZZXkжxwvvvuutssrqqpڿoٽo׼nջmӺlѸjзiϵSƿGNG|GzGzGzGzGzGzGzGzGzGzGzGzGzGz"];ko>q>r?t?t;nw~;qy8mu6hp8:998876654433210/.,,,+))(&}%z$x#t"r!n|0vHILNOQS[bcdptttsrrqppڿoؽn׼mԻlҹlѸjзhδh˲gȰeǮ]ôGGFXF{GzGzGzGzGzGzGzGzGzGzGzGzGzEx7h8d~8g9h:i;j;lqtAzDEGHIH?<<::::9877765532211/..,+,))('}&{$x"t!q9EGLVYZ\]]_abdoqpڿoپoؽnջmԺlҹjзiϵiͳgʱfȯeƮcëba^FFcFzGzGzGzGzGzGzGzGzGzGzGzGzBt,n9g8f7d~6c}7c}7e~9f9h:i:j:j;j;k;l==<<<:::9887665443110..-,+)(('~%y$x!s2}SQRSTVWYZ\]^_blϼmԹlиjжiεh˲gɰfǯdŭcªb`^]\[G=IWRF{GzGzGzGzGzGzGzGzGzGzGzFyEu?{==<;;:9997775543320///-+,))'&|&z$x#tANOQRSTVXYZ\]]ai͸iϵh̲hʱfȯdŭcëb`_^\ZYXE<ʉD,G~GzGzGzGzGzGzGzGzGzGzGzExd@t>r=p>>=;;;::9887655332100.-,+*)(&}%z$v/JLMOQRTUVXY[\\bh˱gȰeƮdĬc`_^\[YWVTC:GGGyGzGzGzGzGzGzGzGzGzGzCw!t@w@u?s>r=pq@t?q=o>=<<;:9997665443110..-,+)((&}%z#v8KKLMOQRTUVXY[]fñdĬcªa`^]\ZWVTRPA9<FaG|GzGzGzGzGzGzGzGzGzGzAv0CzByAw@u?sAwD|C{Bw@t?q>opUVXXYYZZZ\JBBBBB@@??>>=<<::;98876654320//.,++)((&}%y!u?IJLLNPQRTUWX>&qdê`_]\ZXWURPNL>8>G2G~FyGzGzGzGzGzGzGzGzGzBv2EE}C{ByE|IHFD}CzBw@t?q>p=m.o?OU\\[\\]TEDDCBBBAA?@?>===;;::87865533310/.-,+)((%{$x$vBGHJKLNPRP> Er+g(m}X^\[YWUSQNLIG{:5=%G GlGzGzGzGzGzGzGzGzGzGz@u;GFEKMLJIHFD}CzBwAu8oNmIpMtg4Rb__]IFEEDCCBBB@@??>>=<<::88776543221//.,+**('~%{$x+xCFGHJKNDKl'Y-_2d1g5]YWUTQOMJG~EzBs54:JGG7FyGyGzGzGzGzGzGzGzGz?uOUUTRQPOMLKIHE~ a}[qYqVrUsRtPtHq V|NFGFFFFFEDCCCBB@@@?>>=;;::88865443110..-++)(&|%y"v/xBCD+^j>!C$F'K'N(T)XCfPSPNKIF|DxAr=}m:wg4ul.2'}KGG.GoF~FzFzFzEzD{Gy_yKYZXVUTRQPONLKC axZoZq[rZrWrTsMq&ϡFHHHGGFFEEDCCBBAA????==<;:997765532200.-,+*('&|$x#v-w@~|!LX49=@"C$F'K(P?^NOLIG}DyAt>n:yi7rc3j\-qo,1%Se]IadG*[N6QrPvPvUrelrg ymNZ\[YXVTTSQPON@ar]o[nZoZq\rZq̎IJHIHHHHFFEDEDCCBAA@@?>==<:;:8866633311/-.++*('~%z$w"tdq/-269=@!B$F>=<;:99876543210/.-,*)''}%y#v"tgu .B(.259=@6NF~E|Cv@q<{k9uf5n`0fX,]P&PC#]]'+/#BvKwOvUxZq\0bXimp!pXskpeLX_`_]\[YXVUTTEjoejckalWi%HLKKJKJIIHHGGGFEEDDBCBA@??>><;;::8775533200/-++*('&|%y#u"rjxET !).269APEyAr=}m:wg6oa2hZ-_S'UI G<IE"p}&|*/p={C|FyLwPvTuXPUk$hULZ]cb`^]\[YXVUL pqhjfibi'KNKLKKJJKIJHHHHGEFEEDCCBB@?@>==;;;8887653320//-,*)(&~%{$v"s"o}kyan%7(+.0)[\@p;yi8qb3i\/aU(WK#LB?6C=ep!o~&z)-g:z~>A}C{GxMwOwSYkKUZadcb`^]\[ZXVsvdf yr8ONNMMLKLKKKKJIIHHGFEFDDCBBA@??>>=<;:9977643310/.-++)(&|%y$u"q m{iv iuP] +=-(8sf9te4l^/cV+ZN$NCC9@7KH^ggt!n|$x(-`4n:v<|?A}C{HyLxO9DINUdeccb`_]\[[-Ǔ"HONNMMNNLLKKKKKJIHHGGFEEEDCCAA@?>>=<<::887654321//-++*('&{$w#t!o}kygtdp]iQ]LV-g`,aX,\P'QED;=8EELRU`\hdq mz$v(- It1e6k7q9v=|?~B}D{GpI CDuIKKN_eedcb`_][QOOOONONMMNMNKLKKKKHIHGHFEFEDCCBB@@?>==:;:8875542210.-++(''}%y"u#r mziveqam[fWbP[KUFO>H :B=EDMJTR]Zebnjx#u'-8d,]0b3g6l6p:w=|@BB1EFIKLMMU]``^]YTOOPPPOONNONNNNMLLKKJJIIHHHFEEDECBBA@@?==<;:9887653210.-,,*('&{$x#s!p~lxgsbn^iXcT^NXHQBK ;C;CAJIRP[Xc`ljw#s',D)U*Y.^0b4g5l8q:w=}@t;zD'IKMNNNOPQPQPPPPPPPOPOONONNMMMMKLJJJJHHHGGEEEDCCBA@@?><<;:9876543210.-,+)(&}%z#u"r m{ivdq`k[fU`PZJSDM>F 9A@HGPNXWa^jht"r''>'M(Q(U+Z.^0b3g6m7q:x<}FGLMNOOOPQQQRRRRRQQQPOPPONOONMNMLLKJJJIHHGGEFEDCCBA??>==<::987654211/.-+*)'%{%w"r!o}jwgsbn\hXcR\MVGO@H :B>EENMWT_]ifs"q(by;"C%H'M'P(U+Z.^0b4h6l8r<HLMOOOPQQRRQQQRQRRQQPPPOOOOONNNMMKKJKIIHHHFFFEDBCB@@?>==;::987552210/.++)('}%z#u"q n{hucp_jYeT_NXIRBK ;C A"D%H'M(Q)V+Z.^0b ?qcI}KNOOPQQRQQQRRQQQQRRRQPPOPNNOONMNLLKJJJHHGGFEEDCBBAA@?><<;:9887542210.-++)'%{$w#s!n|kxer`l[fV`Q[KTCM=E:BAJISR\[feq"p~)237;? A#D%H(N(Q(V+[-_wF+KNOPPRQRRSSSSSSSSRRQRRQPPPOONONMNLLKKJJIHHGGEFDCBBAA??>=<;:877653310.-,+)('}$y#t!p} kxgtbm]hXcQ\KVEN>G :B@IHRP[Zfdp!q#r',037;? A"D&I(N'R(V~FKNOPQQRRSRSSSSSSRSRRQQRQQPOPONNNMMMLLJKIIHGGFFEDCBBA@??=<;::87664320/.,,*('%z$v"q mziudp^iYdS^MWGP@I :B?GGQPZYddp#sSc"%(,037;> A#D&I'MJKNOQQQRSSSSRRRRRRRSSRRQRQQPOPONOMMMLKKKJIHHGGFFECBBA@??>=;::987543210.-,+*(&|$w#s o|jwer`lZfU`NYHQBK ;C>FFOOYYddp"s>=<:988754320/.,+*(&}%y#t!p~ lyfrbn\hV`Q[JSCK<<;:987654210.-+*)'%z#w"q mziuco]iWcQ\KUCL=<;:97764320/.-+*('}%x#t"o}jwer_kYeT^MVEO=E ;CDMOY[gkx#G A@=840.*&$#"%)>MPQSSSTTUUUUVVUUUTTSTSSRRRQRRPOPONNMNLKKJKIIGGFEEDBBA@??==:::77653310.-+*('~%z#t!p~ lyfral[gT^NWFO=FF>=;::8854320/-,+)'&|#w"s mzhubn[gU`OXGP>E =<;98865320/--+*(&|$x#s!n{hucn\hU`NXFO=F=EIRWc?f/_.\+Z+X)U(Q'N%J#H!E B@<85;M ORSSTUVVVVVVVVVVVVUTTTTSRRSQRRPPPNNNMMKKLMLKKKFEDCBBA?@><<;:88654210.-,)('~$y#s!n{ivco\hU`OYEO MNPRSTUVVVVUUUUUVVVUUUTSTSRRSQRQPOPONNVZZXWVTW^][XROKFCA?=<;:98855221/-,*('~$y#t!o|ivco\hU`MWEN ;CAJR\@t5o4l3h2f1b/_-],Z*X)T(Q'M%J#H"Ek!BORSTUVVVVVVVVVUVVVVUUTSTRSRRQRQMOQNKH}F|IOVTSOV`^]\[YYWTPLE==;98765221/-,*)'%y#u!n|ivco\hU_LWCL :CHPMl7{{8w7t5o4k3i2e1c/^.\+Z+X)U(Q'N%JHNN$PRTTUVVUWWWWWVVVVUVUTTSSRSR$QQMIF}DxAr=}m:vh:tmGPKUca`^]\[ZXVUTDʘ9;8765321..,*)'~&z#t!o|jvco[gT_LU@I=DI\?><{9y8x7t6o4k3h2f1c0_-\,Z*X)U(RNNORSTUVVUWVWWVWVUUVVVUUTTTSG~EyAt>~n;xh7qb2i[-`R%RE*TR;kUgdcba^]\[ZXVIba]`ϔ3765321/.,+)'%z#t!o}hubn[gS]IS>F@J Fu?|?|?~=<{:z8x7t6o4l3h2f1b/_.],Zb(SMPSSTVUUVWWWWVVVVVVUVO[+RDy,Cu?o;yj8sc4k].bU)XL"K@>6C:'SH8okNegdcb`_]\[ZPoniieeml̛95431/.,+)'&z#t!n|itamZeQZFP;B GcGxCzA{?|>}>~>;|:y8w7t6o4k3i2f1b/] N;QSSUVVVWVWWWWWVVUVL@s=|l?pW=|l9te5m^0dW+ZO$NDA8>6$MB(WK,\P.aT1fY7peQfeccb`_]\V|ylggex{KT;421/.,+)(~%y"s m{gs_kWcNX@IBNLqJxIzFzCz@|?|>}>~><{9y8x7t6o4k3iI/^OOsRSTUVUVWWWWWVWUUKBo@r=|l:uf7oaP;zk9ue6oa1gY,^Q&RGE<=4A9#MB&QF(WK,\P.aT1eX4j\3l\:vgL[_bbca`\1ř„;RTVY@21/.-+)'~$y#s lzer]iT`JR>JKNuMwLwJyIyFyCzA{?|?|?~=<{:z8x7s{8r 3hNPRSTVUVWWVWWWWUNG{Cw@r=|l:uf6oa4l_/dW-^Qk)XLI*WL,0eX+\P%PED;:1:2@7F<"MB&QF(WK,\P.aT1eX4j]5o`9sd:wf}>~>;|:zBL PSTTVUVVWVWVWSJ~H}Cv@r=|l:uf7oa2i\/dV-^Q)XL&RG#LBF<@6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWT5/.,*)&}$w!qivamWbJR Fi[mVrTtRtOuMtMuNwLxJxIzFyCz@|?|>}>q>{NBPSSUVUUVVVVUOKH}Cv@r=|l:uf7oa2i\/dV-^Q)XL&RG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWYF/.,*(&|#u!n|fs]iQZ Hk_e[q[qXrVsTsQtOtMtNuMwLwJyIyGyC{Az>?OO$QSTUVUUUUVTOKG|Cv@r=|l:uf7oa2i\/dV,^Q)XL&RG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWXX0-,*'%z#s kycnWbOo^o]n\oZpZq[qYrVrTsRtOuMuMuMvLxJxI|F3?O$QSSTVUVVVTOKG|Cv@q=|l:uf7oa2i\/dV,^Q)XL&RG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWXY9,,)'~$w!q~ht\gRmehdkal_m_n\nZoZp\rZrVqTsRtOuMtMuNvLPHJPN&QSSTUVVVSOKG|Cv@q=|l:uf7oa2i\/dV,^Q)XL&QG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWXYA++(&{#t kyamXwkbiigiejckak_m^n[nZo[q\qYqVrTsRtPwN]P PNQRSTUUVSOKG|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMOQRTVVWXY;+*'$x!p}dpakhjhiiiiiigjfjbkbl_l^n\oZoZp[qZrVtTfPOORRSTUSƾNKG|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMOQRTVVWXZ0+(&|#sfr gscognfkgjhjhjhiihiejdkbk_m_n\nZo[p[e[UNRNmQRSSSNKG|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMOQRTVVWYL*)'~#tjm{tbrgsgqgpfnflgjhiiiiiigifjdkbk`m^q[XVNN,PQRSPK|G|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG~ILMOQQTVVWW5+'$vmqrsergsgrgsgsgrgpfnglgjhiiiiiihjfjdla;`ZNOQQRLG|Cv@q=|l:uf6oa2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQTUVVE+($w n|2n3rarfrgsgrgsgrgsgrgpgnflgjhjijhigi&bONBOPPHBq@q=|l:uf6o`2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQTUXG+(%xjweo4qVrjshsgrfrgsgsgrgphojl\j:kLOANOF?|k=|l9te6n`2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQTV@+'%{%"smlpqTrlslrjrjrlslrSq(n jLoNE=~p9te6n`2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQQ9)'}.nqrr0r,rssKPdGƳ?8vj2gY/bU,^Q)XL&RF"KAE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILNOKC0&4(qsPJ%Ds:1h\,\N(VJ&RF"KAE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}JMH@7L+H,4~-h`&QF"KBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBwFzG|D>k ./uv&&YS["OGC:8092;2A7F<"MB&QF(WK,\P.aT1eX4j]5o`9sd;xh=~o?sAvA{zCF9'gg6.C=:2A7&G<,"LAd&QFa(WKa,\Pa.aTa1eXa3j\R5o`(9sd%;xh| /????????`????/>?????openscad-2019.05/icons/openscad.png0000644000076500000240000024072713402025764017533 0ustar kintelstaff00000000000000PNG  IHDR`DLgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs  IDATx݇Ց?㟏`LB$@A!@"(""(@@L068a TOuu۷{'T= Juzz:?;W$ :ÇoIceЉɰSQgqgɉ#wڵ+=f$V$ X-IZZZZZZZZZ ǟLvPv `G\W$g'#Pjiiiiiii5~*;H X?BF^+ܯVKKKKKKK+{C`ZifgjiiiiiiiES[.`!]{`$wTjiiiiiiuQ>NHl#ټJAAחV_a(^رDr׍?TjiiiiiiO}cSv`':$sV6,EA:_J X X+vv Z------: 48lU a.K~ʿ{o_Zo uY?#* V tdaN:*d:> hןp(` XL7]}ݎ3wPjiiiii[C, o VIȮc)+fZx@_>>zx(`9b v쌕M`kd`Ŭ+7LծVKէd<Z[ jPdF0ZtBVKKKKKWWN+̋2i XlQxMX cW̮Bvɴ* &mjF+3@׫ ^ Xl5WW,Z6 Y*Lkתyپ!N X XȜ|,@fdOVjiiiiiR7U&WVXl+X3;: ]xhiiiii VEjh7WΟ_v,GV[`!s1@척;``5Vf]bVKKKKKUNop(` \lm6 Z!@ i5y :@UXع;5yB6k6L[)۫e)5DQ3UUX^-"d]]jGv긭zmTd[Y--- *=ʢ` `WV[>`Z E,BpS[G^vbVKKK+cW ׷eZ1WVz}j-Xɗ|l'5LߣS---,(Vw'<KU*`ۆLyXdtvYWZ`\ 0 wRk3U*`"' &ogBv \ZZZZ2s8mZkp}gU*`m؅d Xl) vʸ*Win(7\DkYp59V7qV\ UU`9b]::NbU['l][Vv2yjS.@Vb% U*`yX@,#L!bq֥Dpmo4e2]׷k"1^?fʒ# X׬xm&`Cz[b'$N!vc/9[F| K*` ,ⵙFr"`y'vc눅[q5Ď9![ᚵ*{F9OKK_2$ WīVUHWQ(dڄ:b'A瞼Ef*\ӏ $ZZZmZ^W뽔puREU*`}4J@; N`p {~ʑ:*:\ZZZچPp'NVY}ݎ>jClw[=>L>~l=e>j2_0*^'$ Xll?gNI%F;j8Q~2ⸯUWEWc; X;(`]^XV+i` C, b{Ru.VZ>\1sAٟ#ZXtd2*?O XVk좤.A%@`Aµ5JSJ--p>b{]\?V*` $ںpާ MN٢rΉ_~WABkJA{Z*\ +MٟCJȊ,^sPh"|rXwU*`;`Kg쐺 X87k;S=دUZ e{m*b#O)` Xl&Ek뀽mM(bN%"bBk\!UST--&Tl=V6 סVVXVX#Q,"!+!wacϩ6r*\K+Mٟ[ *cIx=pZVUvͼG,2`!X { _ _(\ˇ"VK̻ղBOpVm`1ٵ ,dbM놡=c0eʩ"xv$8j p庛t,`9b V,k;>+Ȁu!;'n]M.ac=QĖ׬h*b:`U:LY)i2\,EVXk+C aa ]XX`(ȓtbO UXF6  WVTWXHkV>pU*` ,,dL XL:Fva'&o$y1``! JVk3f5\)sV6 >wp[ cV:`w"Vw:bQDl;$*bڴx"xul;շ K\db' ACPiY$JpUji@[5;P+l ZJU*`yNV"bE;v\"b앣 `҄va]tֆXks᪈*"x}?Z\ X޲pʚyߏpR)`1UBo̚5 vkZ KSr-*wZe=\f,"VUv/`1XzZV,fmYYl ;钭BBDĆ]yX,d_!ᚄV+E+Oٟӵ""xMh$e׵@ XXV] spR]0i; `1$5ĞEX= ~R\hb3ZZ]=ҎWW]U*`;Ԁ7~+P"b Xi,Ed`hV GGµ9pŔ]Kc j6 ax- 4 XV[,d;+lVZ;`g] #"A7bF GۮpMBkUU`Ϋm@񊀵mkU*`L] vM",E,c,"`ث|$-M`q";$C>o: UU@{^m:e XVWX,G pRv6,"ABx XXAؾ}pm>\TOٟھ$ZҪ,~@'e9`1BfO: ,G ^Gta7XkpUji5X!^; \ga p\ Q*` XۮP,^䢀 Oges&ncP^}Q `+V#8#օR {d 2} -Vxy:PZXՅW۟o X]KXD,tR ^1ӡ[[U&_ZGD1B?"\״WWM6oeI\x((hwZJ Xlgv[,c"^墈XȅkXL ,E%gta #8įPĞ@j`F `V|*`RTw׶īE"VU`1Wz̀_fO"^1X:BX 눝pޖ&XS0 {L.xp.bݯ2H6j}aUmwUV݅U*` K~`oQ1ؕsPB` EYE;\2n+5$l Xv Sl ]XDAGE\Ҕm-,k.x|%jGVU"`1!z̀, PRĆ` `g1"bA.U|+15b"]X: R*\W8^c >Zؑ"*` Kw1x ^)bA,=h:~b".rQ"b1;-L\cء G] |[}j+VT&~We iӮ?b X?`)^W >3 ,ll=Fkj1zЀ""`1XH#c`mյZ {p-4eAK2WuY[Ɓ rk3᪀ Xl;v],,D ^i XD",|;`|"ԣ=1؅= &Xl}U6 X-땬z]m72 X{ xW p@`uz1"=f (bM#KA>[+{r{f3k `.؅"?WQ6X-h /m뵭F!] 3;f0 Xlvӊ]*w,·G\","{-,$lq~2Fr7Ll_5wa?,*\q{Lm-RAU+[I^?iw]fءuA[9 U2`HVXV@,_@(`!x++ l!e)`/gGAB=i {vM ;Xb[ܫ\q|(Ҕm -V֠zXu]PykG5ڮy6B~[(`,"o!૴*e3v0EKAcoT.8ӁeʱvIgÚ"V$j[ ^9`p i1Dnlb쳛O<0?o<57ɓw xݰl CMw 嫴Wڋ\+^v=:`!8B@ XJ 2vvV7xqi+rG[e5`f|,nd)bmDǗkQ6 ؟wF{b+OG]{]C-W|E+Z1k\ )Kk\+.NX,$l^1g_iGTօ=  JS/ {qo~$<ܒ6Hxز8b[w?VSuڅ{T Y!ԍA1uJњ\9Z yt A6LL+q.a(` @[+B{k&9' `YY, oo=-Lؓ7#/Dfaa@*`:ǫ.˾ղq#FGlY- ټ 8dwL[?&'yCS6`7"V\p'XKt BkN"`k (`Y5~d5xREBþb;/]Xk1pUjut׿};׎k6XX`q^X٢c)dn Yy>HpMW#7[;*2 xt.a(`5Z5 ^1Wz"׸&G˯qA,E"`/!E:`cꀍ!6F<*NL”AK+2ގ+ͼZ^lWآ[-@fJD"Z}jCk3*uTr,5xk[uM(`2BgWi!^i(`)Y+=)/r%yQfEVkcXڅ&w+ ᪀*c^?dI^Ɓx^1E'^ؼ!|,,52phMk pܞ3,SEl5pKZxk(`W$]'mKɚOR55E.hXH_sB .,ykpUjuTx}]x혇["6Oqd+M F _v W1 yhqh'`i^)biG,,"Jk_EK;`)`q,,E, xPBϨOc ;AYX*tZQkpÞenj̱\EH׶ʬex4 ز?| %!X YkZy5*cj9 (`5`D,@x[vH AR&]㢗 W ,v̈gVE`XD,?K!b)`6ŸS W?7hie*Xu+'ɧ28"!⫝̸+k>[ Bـg=\!:'\%ွ f_ `7 +"kUs"စ ^)bDltVXzȀ"Pb 9ok\u8)KB>u"bYc1_ ઈjۊ{}O}  :n@qp SHl;Y ]$ȶ|,=XDjEZj+b~oF(`W XiYhHpBhq5Z тPB)YDd(bט.X XD, `#VBµXBإgJٟˌ[I}#5J-c'kQBcپ0n\= p6gH}x4WV#!ֶBw`1t+KWhvκ|k XF\䢗5. XX<) `!U C;:`},p-4eJVf'v,^ԅ ;Cc-cт$Ė1+A/[ yr5OѕY=gCnDB,UB,<ܺsi=X>x[pF6iF wK;}NxP9Y!sX,G,=υF U6:}l}H6g ;PPͧ۬<zqȦlpm@#p5YIp?MB ^1 &m+!6P^5& X,X X8f@b#xH]bB b઀j­ ym}EjVV]}Xǜ{dB604i yνB ͫv5g`)`Y+GBѢ]tv1VK`! X<'=(`Xc'rD +\+ZZсV [r߱[C[6V[1u5Y@lѐ-k>U;8VnЎbp # x@B,•& Xi}]g!b -+#_9`gEˎ@Ƒs"O"`XV,E,{jꀭ>QkpUjL+5pK}ODEqZ>8dBcWP]~Y0K\KN| wג\ڰW=kKG$Ć ĺq|╯ hAK큭C񊡀R^1X,AB(`T#3,G,v\=#j p- X }86% .,kUrݍm&dW^yQt[k } Mo:fm~>#UB> "BbXBvmc3qXW =#Eb(`! sA<+cX, 1!lօU6WQ̄B ˌ[)l5WbWV2``#s}GZQ Fc]]3ʚk7,f}MN8w pd+t]16_#f"! re}UK/pPRZW ,Gߋ_)`X4 Oɞ-+2EғXD,ųu@>hUV>"x%׆62["^?6~Drd5S|xUTz: iֹvECL|{W 2`{UëX#.z}# ຎ!V:# Y1Xi,xb(^1XD,KRB(`!Xqfx/E∀u.,gaֺ ᪈*뾾7}6Zꬲx^V;g]5GB(`/?dcBœX1> kuB5_*`R+xn?"[$b[9̽fH,>~8r`EBl {ע[ W6.R ׆CBJl^*/>JjC,•#Ͼr޽ XX~>6EQRg`x"bc;` `9bXX|EK@ƜMī,"EB,3@BB,v`*\+)8ZZ[Y^m_ ß٣.4 "]k2k uÂz@"Үppphh}}#IB4*X.X~:#*BJx刽a&X8b0mc;`)^)bt2E]+ uXX) pŸ7]gԺ )9ZX#*Շ[)7HMl#Vi:^? ̽jl-oPkx]Eج- u_<_WL`6K@@{prJĆX~:v"^9b9 Ar3 ['^!23⛑+,쀅33a.,2EĚj:`!~?>Uկ XUUXm}U0BLiu@=:wU?윛W|XeAux=Pf,+(+mLЊpxK pmOW 4`pAVӱxy"=xPPRJ;`|vy[P^|ַb+\X+EBS,` A7= .lU WVenan>oօX/kZ/kֹ&v_ ^y60ckCl} ZQa4d3ucgoA{uG7# \i\+Wn̈́+YӱG\: YEZ_ ̽rBX~R"bXD,=%xPX,W1 ő,ta?xy9@B_2]XcPWH-7KU ઀ʭL56A nElx-?N/H"w_vX+xxͱo:.+&wίCծfIpB~x!V¾`H8`m]XW b%W W̝˪px o Erp+vc ^)bX+F:dxŜPb_ 3/cX8\Їl!@Bpvpmv86I]Xkv*`r)p!Wgkg)`k^a^} ?{jyd8WD uDnY*pOzT4>Eľjပk&•FBl.•FJc9bW̪BJWgQb(^*X S<+!'oəpFBk"bX!ꀅcx.u`)E},RGb刍_Wo>ߧOJ_`o9!6xcWX\wCԁ!*v8` ,U:mL8`XDtJk!+񊡀׸ R5]#]X,taUhAx2E!oP6H< ͻJRtD,ͧMbݓz_RHz1h+!;b9``[I ^\b$ĺpAnYSW RW+GlxBZ וG `v9dHI PB(`1<)' X"Zk ]^@,|[hVX7H1:+qW7h9ZZ>ƒf4zIx?F?'E_ҷ/K>B4YԅM36X@+-YoU{.UQrpQb8`p+E,uL8`Z,#xŸ{2q28 ^q,"7@+v^10=XXvS \7{@VU}}u_[yӡ-2ɐr׶|n7(6bXr,kfHx4yVB/`:Y+ͽrںM^׷W`XD(^9bX"bW B(^)b)`t,"t3kE"`XD,=f`,BD: x{j.,ۀ]XkpUjJoハjՍƫ}}%qط*g|GX׼+!QjHνrH,ūX.+ ,=+!0uۛP"^9b|,G씱[p.X}W&#5RB(^k\ P8 ,l+_K o9۳YpmXTe>9u k'ַ$+-6|+v_j, w &`o<ph JnIuua_Њc[`}o=DN\o9XX%VzEAb PR"^9bWXA%.X,"EB,쇥E,uaU]Y!4x_1`?/^?–ou@,"`qMVF[?x, wׇFw彗FxmA(^%J倕hoR"2p#6-atؤW}upIb(^9b|,G,倝6{1B(^)bWXXX~  XzX8fK8M .[Tu,m#/3*β=޲mOOvxmt=VɌWO^z,l&W b)\4>Mx-m5إQJWXi5NDB,+E,#xXo͹XWX+,PYMA5f+,?dpQ_ 9aH,lxw=W rpW"tX,|;]دW.pm X-g|Wg9P eI: jk®W<kz{ k[h8^"W?JXDܫ- b}opqn{zl=, ,JC N +E,"KWhŎCF xPk\N+>₝XD,,:]XP6W'g|avA$lV5,M+*5T؜@G+G[VֵY_VB,5vqWĆh}FoǺ6\ilx5īXe,+,Or \ G 8`# X~_ CcfXX6 `1µ1zʶVUdY>I4f= [Y:k>gb֧*V"_ޢpM-i;9^1p"JC:{&p}BJxER1 (`)b]b(`!n%k\~ 1sT!|pMWV>zM;FBl+6֢lÊ} x6uq8b|mtkg <4ج-p+ 'i-(\XZ WX W t,BX+G,p+ W+\zd5.X@){9Y," B$b(|5;\!;|ͤBetuV}V|'`}2ZmyU$^h ҏiހ}Dl|k+-GV V[X~25 `oX {EXWb4b4`al#VRRr^bjb)^)bW pBvߌ1WK\v 2(`82,uX`a,"{I[ JSZk:M}>څmi\ D myt6&+{W"uizM X[X .9&-`iǕX>6}ks`yUBl.@uYe`W %xb(^1.,E,=dxq,"pB ^;+\UVluVX5݅m&`θ64'^x{^} lb x?yMXqA36\]GoKF,ǫX4WX Y•FrB\W< ׷8`!WX~1E>΂PX,\B"b1RqB1kz*`La?J,?*>lވu4O6!5& '^=Yzm> |X XG[µ-iub%x:Zi|k{ `csf_RAl4\_1DB,+E,#xޖ&3:4t RB%`k[ K\5Z6Bl/X>Zdv̈jV }gI~*puVֻ`t+OSOfAi2U~l:+Rm޳׬-ׇ`wm-~~2X V_yE뼼k}E<e@g_%J8^%X) PR"^9b>~Fn,=bA\"^kJ 5.k `1R:u Q.5\i6VI-_X j I٢;z,`ux~|lxW3)Nv*`%ȵpm[iƽ"- X[W-DVع.,+**r. WX+E,"E"`K\ ~`"W o NL ./D+l+}ˑ«ki:i5ÌXKJX+lpؤ[\6RJ]6c lW  qB(^)bW 녧Ä@(`Iʏ@#Xz= JeAb:BK+M;^XYw~פGZYZt5WzjVze}JX>زnh2`k[ē?#h42ؤ[>xz% EP. W +倅_.瀅PR"^)bW tQ  XB_V:`,o3A y`kzҔ)&y!L_ 1^+nWcF6 ru.i p tu&VWWyEP^w& WX+,C ׷ JC񊑮pQB%. Xz w"`a,"w"`I= lpUva+?^v_%˹TB`ӌ|:>&+g=FMyM|֠b}XY*z-pnwv`]\bYn\g&>M{>vͼGB{W x:VB,+E,+,*~ٝ*ȩ6Dp+\ix=16`,nR|t"\}\]X؁ֶJ+ ~Y>ئ=81VN3ywM}Vkj,kgbmbs,϶VSi:YnΫ/`qOȯ_SVB`ŠW ხݰ) \z^?I>JkTSu_? w_.lkzkހ?؊i@;b)\%^1p:BJKJ xPb8`)b8xWp X^B]゜08X`/ ]ٲO aC`锦BiJN?` 9N^xv_G ls $χ94,Dz%]4XX V_R>$}xf^m^%ĺ.oaV̪giV.[vΕD •J~DŽoqB(^)b)`WX,"JKwR"bmd9C9C>K XB )WZ|ҍt_q|r6`};PՅ}YGU5ok4r `#{}kXiNXc-l[,ElҹX_r>s&.rĦ}yhsi4.x{j +k+,#xM`OBW(^!A\l @,X@ _ tpUvA'M5W>gdtaXlaxu|o>NC{չ5kk^; if5XX_r>wO5V 6Ħ}Ż$X:rR"^mo@*vحL8kWX|E{_yw`.`.,">BB 0 `0 pUvA.JIJ WZIfkejj 1$65m"5@{^SX vF.m=q@,VB,\BHuuacH$k;X`C,{mt}K, PR\1"`(^%J ΋BJ7PrG\t w"bX XD,u9%L'e)`?&X>1xp+dQ ,3>'w.i@:#k 3#;āR/|Bqg\[Rw_]G kZ6`cwX,|X te˶6K<`9bmbmM>a0."ZeH|z%U%!VgIc)b@(^%ڶG\㷊"ֶxP,NZ%]$] Ped%.+^,qApg-¿ g WҔ, >~Fp(:yǿ{ 6K6i3c{\3nH5`c z"5`fXbxgYM:+֧ MP&!uplmtX~XiGk| ^퀕7pR"^9`;zi-pvk!QpN"^9`!ؓj (`+G7^EWlfWl؁/`Sva/1|<ӌk+|/l%IX۞W_&~G^ X ]g6 nXX߇[!^U:˻Iuu6H\i8^mNX+E,#xPb(^)` XX. Xz ,:;#PUkz1;m'eYQZk7 ض ~[gl- ][ .mJ9koumN: taˉW#YĦ9^c V3YXw/`V- M\7 x!u:֧oQBl+ xEr ^: Ȥ gd ЊW8`K\5 ߁8F0uV\Z|,lw.ta}n%4 T}`xIsa dv_{^3MqͲm ̓JO.lIֆX ?AdSZ16rҎ Vb}bW Kr&m q\W +R(^)b\`9bXD(RFN z8]`!X"`a@Wl| BgdlBo_?Ek$<h}dA~сI"b@AW 8\ye5#=w XXשX YV 6X xvSӱ`- XW KpEJЂM`pBX&'),^◸׸dB8`a-9PN p= eK+ǂO}NF.rJX{f#Ff\0k+ֵ& k=V?_f?G8qAX ?UJ/`!V :6N"`m,n7JW +E xEr7Kb'׾#W)H>%0tԣjBJy/ne8 (\ivV(c^̿`IM"둗ψum &Vr辦\el캖I[p3۩XO+XH̃it\ Ť,EwcyMuA-Xl,Jlcm;`moEoi"ARR"^)bW WLZB/ Xs ^aqQB عWmSQ&UA@`߷'G^M笫ퟝi@]׵,cVd54>HAZ 4FRTl<`mp}z^&Ie5 >l{_]gc]Wؤ[ 4G, nԩ[,+o! ^1tzĠx!`x;G ]Xw \\!}g^ʡFMYi*yV!הjMV i6 t#`mpG[Igb,G+MB<Wf+#jC,t %B(^9b x{CQ +B xIqF/q!,6P0FWv2\ܲg.li5P0>1,}Bp1Pz6uɺiZlygb\,OXb16nq W 1&Յ%Ӫq6:J p: W +;pQL|KpN{L:o ߯}=m֕yl[Q᪀퀂Oj B,l䔬͠tc l](MҿC.k 7)KDluk0,sifӀk+MXټ+^zTNS4i}x]4>Abi8`:*!v#q,Ķ}@ xm+{:b)\)`)^)`t++X . X~X{n !v*`;ТW" oBl٬&#--iiD[) RP`t_lcy ??;麖9Vb|OTlV)YK.Rn^U/`7KjC,e^%ĺ6 `ӱ>Wk}UB}]JXbrB(^1W,+_~x=~RX=eLo1Fa|ր$Wi@*9P mHs"ZNR6p}&|\Ю"qõk;b>. n5 ΫX>2X+F `[p+mx{BD|KX`hMaV_"}F6 XD,2lFUc* W9}glie,G bw n*HfE <&m{N+܏2ebsl`?x.!66 ?Bl,UJRvjl$f^%Bl,lӱF#!ֶB" xprVXX*^06p Xڅvk^]pM+U ?;0@b|yZ|ה[Rm\S6v&6{UBjV~Ȭ`%`T'b qu]}KJX߇[4.J'c%>`,+E,+  xERkYX*E,c X=!kV@SX| 0zXkEHlnH\k@Wp~#v̈oK+=BbWM_=bWށ\uq9/ ^1XӾ,̥Khغ* 8\1e[L+C/Y&6F2;W.{麰1~I=눁O4S[D,x- l K2ɢlҦfzt&V4X Hxuu`9\]]63恴Kw^iZWW X=c,}E~[l&V_!η `}Wf:Zi5Yo6؍w \,xpu!p+,WXi•U ZMC ʑEwrJݱpXuqWl!^qw-|lu=3!e{L+efX b+=jl$lZ>8diV-Ie /6WC, l#lo1R5ͺ,,F,lB#ʓw1"ʓX>2HyUb9^9`]p)vi8^)bW +,º(^)` -<%{j,M+\?e5 Wl|" /p9˺ei;bY·͵Isw@36 dYWep Oju `m,hD,= iU)Y `,r}Ult06ںW #OD,+"xER* ^1x Ucꀅ``Lv;\mZe ]:be#4 U[<ν5a Ö4+[EV6-b_6'b}!K#wa$&62,pnpuw^9b[[ZK*!+`N xHW+qٯ^:k&X~uKe*\9ze{L+Eg ",GnX)^R `IgV![Rz;%`9bdVsm`31[XwVzj*>;9Jsw;x};^ŤūeMVCxY2[c-׃=yƽHxX+On\,& Ib)`4Yb9^)`mes +nxMԅMX+AӚCuv"'`%+!vݢj8^]u/q}ˆXXղ>˺}U4>`:GH,DZc7# W ,uƱ_K,D,EC.k4wϴM'5;`%FZ:u[/K3.xtT3jxV3 mպa `s^ݘT}5MEt_; >'b,?+5 b^Y&$R$6\lX`6D^B+Gs}V? ǫaxp1Hx4H .,wM *\1eL˳>) iva߭+m+1ʝܠԆVaxϸe `@Ax, m =z\,"p&!V(Z9`i$~a$fc\Mzy=ޒn]ktO\EJxbFp}uWpQRb# hQk\`,.QFS˴< _x\$pFK!FJ X b%JzEVtSjrۿ>yHȪ M&Zez}y9`kZi@`1>MBt&VkVs(\} hnHke<X恤W>B î% K: KHW,3K 9㘯3~ - W 0ۍpUF\,}ش]X.>ԝSf$j%i0q5Ն>ӚFk{%=jU吵v@k#s` `\oU,dL.rlp<>5xp$t_C9TB_ՂH+(^%B C'dx !B ?kp=ejvg`pXzĀu`Jsiź =->h+^-~H+,~85YPXK X {S`^ kbmW IEK pi}>˵}]EK R7PO؉v!Q` FK,]xv@M.j'dc#(>٤_i6 JlmL{;xy9FdORVQ{^ }^H'b `7]Mb9\v*bo]Tι ֬bpulv^1IlV1I4Xi}+,=@K xPR^1W c,_d9`g]clQp:.P4\mT 1l9`JM˧;'Hߺ l-ҮȢJZ%>ԪOڔUYH!Y}Wc; XY3ckU, lPp*#J|*m ? I2u_Xbֶq5/siaY5y$>ڢf^)bi(\mM<qmH0x=y cWXix=dϙPG5,(^)`EbW%)YXKUf+ `k4Z`-_vVmom3.X$ V^}csMe/J[|2u_}N, `ӬL,Ek#EJlIp =p@<@wm+ف> 񊑶pR"^)`WL`ۅxmx <'{e2` +`ۢl!ͨIDAT:3Fхg2qF8mfBzՒT2lHa `y2sMV nh`}jk _ zrE/`X[vӍ?%-`[иhֵy@:<`JueW~21B(^1XW,{QBo8ka#rF AN ::`mQo SٻRw0q> ooZ6 4 3s)Vd&-i.jk3Xko8@̯_LQ,?+.mq4i o8\}hIB,XQ[::w^i, XX}AbPK,zйxx#tnwI]7~ yzmQˑs94M&+&A5+*, ٴ,? H ؔRmHkd ؤZXbօX7E``mpqvpJc,Elң-Xk`m\Wkktv`%Y YWX:J񊉍0J o  l=}7~dc c;:~=(j >Qr'|˳"`Rl.lVJ3K>ci*q+^Zyg@[ Yyn(\ll=p ؇i`,t IMu2mM8^%lpYE+;F;_KJ˷pJEXa,2*\!X^ ?.v \/ؽgliy|3F+|vI]X/:>gi%&w7m!Vۿ>w [|>[ [u/q=jcWm@k,`ՖFq.d,' iP6i@^)b6@Fxy•&y% C:4W^q XWgo ,;sn^m 8` 6K^b]F uU Pͼ*ik I[Rnp>JW:rkklh}IXGmօؼO4 X\;EyWW`gxYW`4WX+U%w_!p@ZEuu`)`X+AXXsX8fp+ W^} weLˣ^ >'_I};u[ݰKbv`XmCyUXB|7 xo~L<ʺ"+,یk{^iֆWl:J'bi콫{}MhK<`,"Jcl~XюӱW +"VzE+Y`qϿ"b鿃 cbx!`Xx@_7UFk*b} hEGw]˗~ &r#5,`0f2`iRJixM; GZ~'L+ֆVl҉X< P%-`V4]uu7LA8`C\2ɗBd}6b)\%JIW/k+E,}EJK~vW QHW+dVY``+5@*`۬rkM+M;b%~W7ՅTNʬR5Ö aO\|WdI<K#rEy倥y]; m"5+`]޿v71ΥHxuh:hI,G:pu2^/w<޲rV^ǫXMg xpB d9`9jc $^x7M$BSB``cێpUWltyR"Vl҃7%`1y<z#6z̡@~ǂUX} xVee|-yPLj=ۚjA^yl1@jˋZ`X ib)Z}+u\}lF>*vZ6\ilM:KB,R:}v"`4+Ä}?gB*Ђ+_j:W,]!f,F gPY}ݎnez&Bvg|R+9XF7ڊXM,m⼩cXkZXiˀ׆Ofjq؏_' yrֆW`R]B ~"#5 ."XyXZ`9]mK+ pp:P"\m/ݯ6RRJ(^)`|}{%*:+d¨9 xE0u{Wk!Ac._RAlAYTH%캺vz]a>r1w4XLl&=$k iƽLyX"ye<>嘥hֆXSpMB"ǣ-`;'aq6i!#V:˯ozLhjxPb,ūXC#`lv4,|?"^)` ?9z6v \mV~7`X闦݈XUC;#Y  wS]HM${lw熁T[[ uBՆWuW5Xm M<ij9?SlZֆ׼KR~#Hxm&`]EJgb9\3 V`]EJ42XH;_9b?ImpͿe1]F`\(Gm@d}XW +E,ū/`.,"Xڡ/_Ile&qKu*^۬(o`!PDl yΓ#ybInB6\y,[ݫR\Za5S+=kZo(`<$A덻D"p.&-`t?زGB,@Նؤ\3\9`}VgIxM8^s"`9^1 -W_xPB(^;eLi?93quW{*W]i:weM8`߯!6 ވZ[O͏n=1=T]!51ؤ:>g`}7 H1SE{Bx^N8刕.lI).VB쭋Y $R;lrh\M:ӦY#[im}WXXi|;G`y_u_ivq_3E"z ;S7]9Gl'UۆE`!pyt V6&nգj[6 4iE1;`yXsyM zZֳF:.56.V,M`\ 9\ gE9\]umE:ty+,+,#6+Ͽ^1>ErB ^ v"`aک`;zL(cZ)8`QClLf~ܱJњ7\9Z;>Gn>>Tv&l9?T'! ?R$)✫$XC-c-CrZ&`Wnk&ޞ<{Y}6 ku+MkExx _d,jΞW:ހŔXb)XXz.5-` ^]IIPwm.3+mHYWOXi} x8$ `91ځoX iX|?.]⢀||w2\mXz w(`k]A,?=6 g%\Zs\55j R=WayqK-OR7 *^X)ܷ=ؗrӰX<Kʓ73Ac,Gldޕʲ!wE+|$hK,XitF+•Vz_W"Cx~cxuJ xE6='~,, ۝ Wȼzƕ1A^>'`,$ WppmIh-WSymTϙnjMN֡~麬~vwkl+  i+Y j={V+BJaڰ56x"VJ"bZi ב p[[qEK6"\E8^)bG[>IbYe>ZE;W W , X xCֆWb׶R,`IXؽXV_]%B I[a66Qj]z; >i0.,i|$X>  NSr1_ ûN XD,*KZN=BʶVk~ AZqVp Wozr6؄=i7 ,OGZ `x`kl^mxd XiX)yjKR/!6J=qk闑8|uHEڶp{څ{TN8wHy@k,~.+,v)^%"b+Ӈu`gOvn1l EUk#pUqYxD:`%~ѕ~|L׏9^&+ p=g Ⱦ$CiVdQЦ+?Qpk΀u=32C-YXzVJk:+v7~$Ytzih Gk-`fNR~,ҤA,,E,ԍM,uttU,"o ߟIWHfFX\m̹6 )aZ  {*]cS'cMZZ W 1ľܮ|l?R}tDCOzҙ֬zVYu=ݓZ(}yfx}@{J9n,Ʉ46J^%#H`}`8$&m)Њ =K #.ݫRd b!^|dF _GHs~:`3].6͸@U'pUZ!xmv[+ <|͕ ^tX_nÀ'`ixdem5Oj(ǶiieX^)`%U)ibV5EK شklPb8Z)\)`1@X,=tz[ ^GM_"^#`K\WkO?W XԫY{7IW-u"wo5ņgW`ck9)G\غIErJpEld%RR"^W +3/3U p]ӿHj ,Ǐ2x`:JkL5xh޻tXj^lW^g]y L^\Ãt=` d)X~HiXKblx d06&5,E`![^'pp}mmXWȎ_~e*>Xfc;`)^9`(`cv rWk컏 7x}׿׺UknW+b~{VّXizw^cã efy5*riJd,yՌCgsj-23#6 Cr )5Y XXK㈽uQ46il @1sxvL|fM`I[(^}\*V񊀥W18`.,/qv+{Ɣm/ʼ]z(;GR$ ׻-m4Eյt 4i{ ] "К\y5FiyrͲW'Lb,OX[Wt`cO1YXL'b)Xy*h`lx;o^mJq@ZU4\)`1Im/ǺQZ1ϴw`'^+,ӀW;V+]CmU, !`9*Q2e]Vüiq5EzŤ^e )K:^]Z1C%Z{yyz^LiXĪFfގd,' V$"Zyl=ؒs͂Xnlk@6>VxW4r& +WXǖ"ꂫkΕUFW}XH ۊpc/\!  WD6յ }u=J XUMVH@u=ӳYB5 VX< OFI XĉW`J `'2s ,}-lbzجc0Z+`pG\Jj;6)ob,} bkp4T*,]>{\#)K_ūF+(BZ[q"`%ȶ`)bӰ5JB*V fњK hI,E rYp\2wd˞E ЊlT}!^q=;XX+\X(\ӎ 4li%pǏ"ݯfe+E+d&Ih 4>{\-5Xހ%ū+ `{o$y6 yg ֆuHp zzr,\BJVB,,UJ1 ,R2kb W9VP%g XD {"m*^[25lm(`1NJ cJ3yĞQi`WGd@Zd,"B^0S`֤}l5`1Ig`is/g,'2Ⱥ P%hlxM"XH8b-`[66ҍm F xEҟ|WKvU1=3-K5 W`mUt5+\]hEҤYqM+ `&xM"ˍW`1y.v,zU`$• 2c$ ,yz\?Ar;\?0k#(@#p}US&\![+=UXI&%_֓`͌ X#-n- XD,,ll]VeNMLR"hR6 Dk`a'(G« $ VF!ۊccE `"| jp}*XմHlH WR*\mJpm(l+rĺXw^ `i^4 zP뗏0`h IE>~ǞR4`o~X$Jhs,"(Ҵ Wȁ[̝x]Jm5RZ`O;'~ SO([ T k#(+ʁ+E+ py4XBi=ilJF`y,i6vXA֋Z6eV4<|5 x) ~Bv$B-]blYXuiD?L:p׵\dfJ5'{pM{p]7I+Fl),}x7xHl#uUX<,Dk^4in!Xy4`OV`Wb[n!`!W W W-S͆?ZuνWL# .quc6-`1})/,&@Ÿ(`{]t ,'U^Valx XVej <&2`7use>m,"Vl+5,FnV5WC\#W_f+}äl ż~XjٽZ潭yz;Oܹ5M^l\<,+ 6Į"E >mppMk;ֆV+2k[+k+?vkW-g1Frv;\1 W: X+Y״xxK X[^}@F[ `l~Xl.,Q4 } hIk;UlCŏ# 1 0}cuY\I~j9VިV¶2ieb6"6W `y6"#օW X)zk *X R+@ &!`T,GkV.v0YW`)XyJ)p۶gΔ*bӌ|, D,mJp\-Ptu!=M^p倭waGpiG:\i{\=Kb,_V /I.J) I-ػlxvͮpXbof` X V)=!jL4^; ,EA 8`!s" Xk vx<Փ7ikekxV@, H}uS`#^ _XצI"B,<¹?)yWd, .v"\%"d+Źj,6npjZ}@`Gp=N>mK\yp-ʆ}j:np]ya&W{\@N+zϹip% b+qxm˃ ߉X=&U6:ȟRyfVkւCMW" X4x`\<>xM XlVW_,3`m5&! إHpEl`cdܫha7.Nīziwbvlc w/^+| #^#]µMlhWRyf!!` W;\]פ]Y{d Z8o<ߧ&IVcX_=`_dӭjmƒ-,,?qVӡ iJp'da>%B7ͯ~"^wkTl`[۷ӛ Y\E piWҤ<Ÿh,\O EQ[`EF̀BH޻zW1UYAD,D/b%)OW"b)Z}W_s5+\]vEB$^-9,cXk WٸlF1 U\!K& \9Zy!H# 뺢`lub1GZvǛyνz6q׫yCh U).J6{alxvm4eՅW\iU y 챂,.,yɀUh f5} l W\!_vpLfJYٿt 4x}Dz 7< SQ xuW^Xd Im`iX V`X24.&!VW\ɓTk֮\9`; i Y2`DKYelP6;?Y]*^N9,5WL^˂R-i=bR^~F.lb)XYX"],6 Wlɴ $(\9^)i' ȶ|,x^!׍+ꀅUx AY` xp WWv6j/`]hZfVKCXx8q.pAlX V \\,G R8^+O;rN=qT%/Ķ|,, 7,9XYW?ˆO?^k`]x {Y8#2nr5º;8 ]ٴjU6 taoV+fUt \%Ҵ*\!n `)G6#!BQ#Wbm+^O ?`THрu"x^a X^5R`d(Xy| hŤ+$+\!WV? M. +`[dّW y5j'\mhK{W^t@JƓ"x!M'H@MXXXW+ `mlJ#9D='a] $T< `>p.Նf2wQir68VWnP`VS+MW-Z+UȆ$W ՜K df5-`MX?84IHsX5q]JtQ >t[\'a,@DkXȜۈxaU e•jld;y>Xsm7,,$-\iaV\mh-e 'V y ,l툵mH«膁ޙb,/ٯˇk{#jiQRJ$v긭J\OWkyGVʆ{&||bCl7dž]T`l8Jt \i+ 2{ɝr(Rm_?#ӳ bi,wO ElÀ˄=8d)`%ȺX^4.En'&-`i8Xy۪p]_$rW 6 2Vd]>nlU6[)O'جh)I ,>x k<;_RcօWXn 4~|0H:<=ҺCV,/`7,_DR`)b<, >hy֑dl;xaJjlnlAXo{+`ˬJIlZt \%n?P?ٗq>p %X{ʤp޽5DŽ1╆"DŽxq<'–Bp-b?.ixvĺV`U>WF:`mI2PAҦU)VlVYXĪEκbX\u!ꋾ[xw:nQbEAcnvliU6[9آJөplqx+f4W qpွ. w׭"6ĦLYM:XL@WX Aڲt4XeV~c Yp(d;q>v(`[Fb+v Wp*\ms0WY >}K4d<w_xpPf=B}5%`m)Cn;VY``-U[RV p6iL `\WLUY=zL\)icX+?ޤJ>y! i ӉplX>~PW؍ cC5G!v|Z8`)b"!Zyld=B`[j#r `y+p ,R XCs;;+~l$U[,bUJv \!9*\1XBV,,ο>?G[B ViJ*pMB+$ kFU=L;o"B6cXٍC(`%n XM.d'+ZyCbi5J. HuӯRY3n5YK7`o5yveѤl3j[Jp5;]q,ȶ|Uu<g6+`^eՓآrA+%CB"d/ƆX w—JW ؍C(`%ף_w&UZX"KJ!!X< +Ņ$'b9X,{ ׹sWZ5pBگ `lR l z[rpŌ* G,BvMGGb,f+z@Z`1|U3+MW`)dɡ`xV/`4< XxU[*" `޷f`aƾlu] v˫ ״Vk'L']w`WۗK!{a&w刽#c G,c\!H㊏,͋zZC{(`\e" b9w+s6Y` z(b9do]6#v HE:BZ(`5XY`yݭuVl^Ab=6 X`pzl 4E@ ,)`KQN:`ˆ+MՅV ׫+! p{ۊ {|Zl=-Xkq!=D4 XW>}1F/}B6orȖu;:k初{6W:s pu6 2nU,V麪Fa;%U`UpY3o@k cCɒh$Ȯ[>4 G,C(`9do >`8b)do[]vă-Y4؟;K[ E֕CjV/`XYwv Οm$yO^9: Wp8&66ҍĵ[{VPM/ܯmjv e)p "CGBC(`%Ȯ[>$+ :zedo_X|`5ؗAk X^KZ>ǑM+vqFBk+?)V_&!bU LJxm:\צW+ūbu , l[`J)p\ {Ӣh$Į~ !pĮ"!J#!6״}c`>{\v"XR,Mv‰X^%#\gLkK{K[dhlO`Y-.ҤBl#r@XD,k」BVB+=њIxU;OYV6:VJ-j>8>mrv WW31@e'sub+^1bW-` p)-#!6ሥyy57OfY$]Ғrg`#ɡV!|RiWڮjIXWuWokB*^qwt\YW  Vp5`;Fl2g.u !r^Y+cX ٛnlB+Av!!^i8b_"ֶ++`XjKZ:⺤9[dj+[s&Ī{Eߍxm%RJDϺ X}R6`;A+•#J]1D,,`uaxwz Cb p]|h5XYO=6 `1 ` EIX)XL 4?} ųm2VdYo`u m1؎yxq WnR4\Ed&!h1-Ɔؕ#^]]$d,ƆX+&W@J)Ow:V,fC6-`'aq#cօ5-`mxM פX6z \x+MVĶXAQfQ!l'7v :\]># ~a%3c승b~W b8b)dW]tpbpW-@+3` d%5UswtR]i lppٍXWz`٦*Vv+dbu!&jlڹ2d]FB,1ٕ JCޒRN4#| V&pݼfօo_zu]ٸ|g/3mYX)yv(\hIpᵝ![X ls`;4o#Av# ^i$ĮX߄wg9b<+H]k;@VH[ ^(`Eғ<.&ֆX<pMG:rK#4nX Yt_:*mHhm7^|b`17<q 6޸( 7AveɔF,OVj2\]x۪ͣ-k%U<+M'吝116b8d b$.y E,by^4X "k =8P`n (`9bzX(X7b1+. iWTwlf,\9^}ԽVaʄld,οPeïSnpjNw`ee `1׹b!v^ ,@qb郫4x cmE 6 Y_Jh8f)XyX +iw&u]IfAc:ZB N mw p\>j&X YD쬫AJ.@.CK!낭ؤXcm f6r/fY3w6 m6`'_ZV_N 3S$p l'4/kluJ`Õ#JsEvy5!h^ `mna(b)d?U {&,MZõiE\ҺSZ9`1˪XW ,!tp} ^1 Zu> Ga~ fWt\!B:/' "24ል@z9o16#^m5 4`>ˀX iv X`m 9WncPeحi҄v5ⵝSΫ2!McImIy`a+& Z4_wⅽ f6NL16&!v {  "`J@yƆF5` d Xd YVY D,3eb3xvQ XM/y!H돃> md}X(F_'õlJ4^9T+Av+'hA~m,4b8ԄBv쨽d X[7 #Ց2![$`Nf`c(VP/\1-+vC#,;luZ: Fg-p}.Kj0 xœX2B] ޽rYY*m-Vـ!XnOȺ;EkZI|L^5,Xz<vaօGD p `!+/ OyPq!!ێc:>BU6:-EE&/R*\=Xe_^&. ?zo` Y|Vh57br,OҖ)vKqՆX^k;p$83vٜ~18+f灖 zN+[:>U6:-tYpAk#p@7\znY^hcN? "0f_`ǜIހm+Z,V, ?rKs \삩xE^?:^ `ΩAҔC>Nj*|vc>pLh+zi!{q=իorU ˂ q"u `mXU=Vb  XSfj O5sbjx]\+,pp޼xP"d 6B`.Bu xxʫOҫlub:4W1g^z^ ;L80/eţxu3w<XBikk҈n!V%>ByuM+)ؼX@*= I 5·ZSF pxE.}d5+oBjk ^o~ɺx- xٍ- li(`N+J3]*矾[e*mޑWıUt?'`/9/$?W_ుf]jbCvE vNY=wGgڡ g`1.jJga!. x倝W+,•vɬ#xv~"\1k 񊀽mɐB,O^XĖ n+HN=1Nk pL]ԫL WK/5 W ,G`K' dC@6 `i$ 񊀍"x\1sZQ&k +eCM%╦Qȶs7]na>5lub6>c:t3\{ՄM\$^#Ϋ OZ֬ZOрI K!+vr .u5O^r"AֲNNv_q֕AWk 7- +g߸XīB=n Z^,pt3\m2Nk`/,xW~W+ 0Jlqb`o^7 u=ZuӍ+Ve?}WLmwȶXlxE:U6:5 Wn+5r.5 ^]=] ^1`y`kހp]kBY+Z,ϾJiVVtW`  N=Ԅz`͎FuW+Z}58,ct+êArתܳ\q++ÕGYīP N t*\!sI mEB.W+{W&] `d H`ǜ+ؑ5JM꺎W/5rb'`S6W dӞUJh X+)xE\1ץp`"\)`)^!tEu+d^.wrMp=ܛq!V!ۺ`u}V Ut2\iB\^_"`/5 WسNACঀH2#;\]Xs؋F p ^b,+d(^6 ^/Auc\)^_{Ƀ7g"5 bvK`NNӍpuq& xMy02P{I?~NY]J<^GXL+Ss 3r_ ȊZ#"x.j+ujjupX+eL(^wus\ -W]97/Vwcש1N+MU앰5H`{'vٻ pH1UO>X)T]xp`F@F-$V WiDVdJbN:^k]=^ox]=J`+f \lrj8\zBe+ `1 օln,v_ Vt^wAa W;v yusv7qv)?0MBCΪ ^g`nv+ l)XF[u=,%p`FgWJu^WxE6 \13ZKכp]|QXl{k W4 >h- fuհ5.$ =ī gkq],ՅX׍w,B6`d[> ^j< wm_Xf^:\)^!W +Ex]kCCnX^ږ\ ltcˆlc>U6:9gp V+ ?H^]=xoX,X >m&:BJmGξbX^eڄq^|ַbov#C"`Wέf~k+jȖW(\a5ȶs76+dq-Ye# p̻஁ .e1xu3w5xr 7AR X),b}k,6Of;BFha뚖`1M츑H`uzW+ ^!W +V%CMz,x #xi!\Iط.MDB!6t\%: 肽 ^]yV.v&ik[}7`}Cv,aZ0)q I+.pPM 0u"\!;CܷX.Z_j*bZټūluz6د+p8OŰ5 W \k^Y]|g+Xv̀%E&KfBxE8_55q:^WxupƣLddF M Ɉm}m*yn+Mu|K^{I .gXk`O8fcb\˃rR?!;\ZӜ`Yg~3 G ^W \ `7-X_E=b6.^k+Z].@i=r0i{ ٶnh*xn+dUt<\1.;f'`GI`<!^mb?znXWr1 dlG|O)ز{9ߊU采x\1Usx\1W Z^7jkڜ# k]vr6 t2\]{.?r$BIhS`m5W.v`1 ñ*XW̌+,c W;@׵yv=0$ W rG޳H6`m\[<Oǚ;dY}FU6!W NΫګry{&3l=V+]wU$`;\ l` VmXe3+7Aqx bZ +t]W޷LhPYp0"m6q )jV+S Y~Q^2xM,c)'coo`]G- w2ڪ ة2^ EӾU6%E5TB.; 1TsX+c92Xds;B0ӞP~4zE{j =lQBk\W_7v z;kdz2#GU]kxMtu-Lvl_JvKmXe-pDb./w`/Esa5 CW` XWpUr~EXL+(bX~]bU R}]1Iր0W :^plͻ޻ k#nP3l"!ڰ]7u \)`ˀe0Z\md>I g,Ejx"6qkP"{Vlag`-A J[,Ū)X)YpDk 4ׅ6;Dj ^7_vkUȺ! ~ l;Uٸt \1_{hRjF^9.m9{i?0ဥbl6d[װlʑ̀%![&`!-I5Xx]X+] ^7LC  8WLimvv_۴ʆ]4▁cW"`?oOW`G '}`rOS`T/gXv%Gӯ+Zݡ'_$-0#Oޢ2jP<ւyZ뭋ZA+^)\MU4ؤm;6aMpb\`Ԟ.Ej'~X+Fy6ik [>4XL^֢Xb[JxE6 [ yE¸+t]k׍02 Zp}pͱ٫4`[ Y?6a-&Rv\]}^ سGj)'أءvcU`]Y}ݎaҞ64A6`--?+% `+ uC w-nf]a\`֪A!^K:`|b[zYy nS{ WWȒ)t\%p/W`ρ܀= ^]=;8[+ASh3kKW;`XLemM4]j͋w^o[<<Ժa W[\1X+MClf,t__ vaM&ۮp5W{8k. .18B0rf% R]m"`9aWXؓak`>z`6+-`9d6pUW ؂+@6 `e-U)؛kpF.0.pI;6 ^ ~ xêluSM5pr { qS`1`,#6 (b9`9d֖3+KBz9Y p \~uu]sT ئ  [b:>QU6-34݉յ.p<IF^&FQAb""CwЊt]@EAQQPco]lb46 D$&y\gYkjW]1c&Zs`RO '`gQؙ3(KpKpKp2`y.+C6 `W Y`uT^4pڢPgӮ'`^Udil O`;5EC pmerSX `(5xU`m18U`m7O&Őm$`]4μo^2^l:mN 8}Nn' T[%ri={« 3d6 3Xk5Z/ro(g;R5O0]0XL>T-~]42|kfFCӷqN+J]b9^]53 lW6rkl XWoA(V-!>[UyVdq I! "*E#5'=\MmEJΝ;HYam%rmE jǙrU^MXXX[sYB0o[Xf]p>۪.V_+: ħY`pvl+Õ|Ҽ} ]a]E-YSGx Xb^l+i1R]MXvjV| N_ݽnX;.TmerWa9am=s \` \`鷓nʩ> p`Cֺ ހ;`qX S`JF\mur%`?Rm3-jlzVA^Ẫz6m4=`J&+4d W-E#jBl+UgyKAm >;'T Xl@t X[yJ@+ꥇ{0gY[`? ~3j^3`q Q 9f! NoÕpxu՚ST]7gf Pvn ^MCeZiꦫ &ClZ6jX543`K" X-đmW>}ju͕#Udcƫ W s';g &]ZOzNl-ZUXN3mV,g^ޱT4:]9m*p˧6ng6ع:`MzX߆,ޒ%',#Ig9ټhL;(ؼ{}ef KE fV;cJ߇['E*\mx7\W;g 6逝O\ ` T+U_2mѪ&&,4k# fꧩXze-ۨ_gXƫt4i,n!R4k-\5-Q&. >& jlO&t \,4 `M5Vk6Y۵v$շhuHrW5Y:}_IYծpmu2`{^m]H+1]9v^Mp=tj[jWbzGM#$d[s,+`-Zܝz `9E6 dq6/p Ijp5p.Z8T^m] j,+gdm]zGZK.f3\Wy]B0bOLorոXf}xo.7Sm5Aַ!K.h`m]5ŚVVն{ֲ&&AlBOcquɜp \ׯ?a&. ~$KpxM W®#V&|Vk:؃Uvdm-ZcZ9d/>_Z+dqq gѴ."-V#]*.p5viPW`xWY X[ 6iX٬5a6-`F-EP/jlѿ$I-eVd>N_R4аVp>~mW@IDATeNRxviU 9-CґC_[ʵ! Z4EZ5 ^ W N+Bլp5V"ֶ5)`m%PAT U[[ z<ŵ!K^1 MKa[ Nl.vc֍ Z2`$MX,]>v:`?c?g>7 ^?moVPHh $xWݗc{ 7|V]jë ԝ;.,g\)-^\,@דY`eo5 Z\|v_oc۳[ `G [)H t۬*xE.EC u#jluzXi.kZrMV/8LU_,٢[_ւY`e 5k ؗ?^XE,4ǵ/qi 5; i)J 6rbդp]<4K|5Akl-Y- X d%`MؠcG=cםupۈX\+bdҬ)jˇ \פ#+Cĺ5fݒsXmkKֵ|pj[@-!n_-(Q"v[*+)j?pÕQmpkj&YjlK;;QYji@, H 1`fC-a4 s}:@ Gl+Xu|> +& dmX UK,6`E%<2Y>?W7d[ZA+>zxEZ1E# Mf,jk%rk9ޮ:d۳,5aހ=w~i6h*`yn6OYYHhn]2}kB>Х0iSZ ,շ;IVN-g/90R]7` 7ώmį WYbq wV!vz~YS} lF3OE͊G_*Q zB ZZ]-$b\qXZ Yߖ*j5Vlm%r} .ꀕM2e&Al3]+hVVxǸ:Y W WkJ]eYj7`sZrM ؞[f^zYCQͺE+o^pF;\~qjU%`"=;^i E گ p>d+`Vikֵр֩VRǏgpQZ:lwxD :b<k!;!^&i34=b_ڪpn ^8\i[5;l5մֵA6_!HrB B6)b@y5ӵ 34b, Sd-6+z׼j)ic>l-c z]쾪 ؤVМ+iV"afClmIJׇՓv6a%ڔUXz4QuշsmK Xyj''l]+(rvl\+ ~ޘaa)fh *=pÕMXVX3dOueF`XӟV0b[Vz $^o`M(CS"'DluՆN+ZXd}[vvPmZ`eX>lU\Wub|Ibqu0^լOWb[- 9u%#\\*Wk\EBokZ.<+[`]m D Dp˃rlZA=Ż+Thzzئ ?3MXDWoF &VoVևS%kl_g嘨4e47R#V4;4i?~qYK CkCW vi{VVrIkRښۖ f+^ X_XB $]H`gyZA@J#A)dh8D- #\Mx?{zz5PgT4;@kkڒe@,oò- bVb5$uJs'/"JO*xEg +p5Õs'GRg(չXd%#: kl]z Xܤ4+iYARh#6Jp}MW>2`T|V¬XS@`];v~Qm pIM4uSWXٔxNՇX\+hG^I!xUWI1֎Xˈԟ<>9Yy5•jZת-HX$MI~YLY&̦ XY`MYihX}ƻU4^_:Ec 7!\vkXIJUI[ +hi:VX9Ʃ Yk5VBֻV_777 !f,NcZ"RsZ{7 KS X5}vFQƫ$Vr]sZSZ::@hPIX|c#vil^+_6 R4|yp妅+5濄RMe4ue,uB*Wu0Hʚ+tV5h?>&< ٱV"HR4lan e O\+p}6 pҀK Z ;X YVYk-3\INV4ֳR! V_R%~xE\S4l]=@!dk 6Vu{k Zok Ik[Z+`9<4a_T،KV_B`k-kV =ǔ.)ah~ x J Wẫ=OffO:P5 `MMXWٴKZ*1ۊe Ao=ؼ!JcZ: xEFhz8bimexJy)Lsʪ LԱSl ,Uu:6-`c3@gmkk6! Zx9瓳WwFf(mލv+U+t**;S2ϕ@1jKnXY`-lJRט-jEwJ``{gه(JZA Q G+4,E fV#Ơi[ \lϪ\M۳lx*%:uڄ0 +`}՗ xAֵ00t l[]`TEXuru4kTW+44E ͧ? V]-HҔpeﺀ {2ˈWX3=լT Y xeچ5ok-egu6X3ZyiW[%`WniņQ8-4!^iy-q/4?Į-K5۩pK'V:P]55 `ʩ. KpJYkl#Ok'ݖC*Scd9;UV"\Vѿ~#Hǧh|HF#k 5rmvQF o0Ku A5 `M^ +k,O TY<3\I6kMhuV"tkCN] WWE&IBE,="XylNpM74jT^Cֶ4 bmC%؄eidTRRm Y>Ջp< X}ִ]0c .ZA>%2^?{{+y^R4JҵF,6lVkґX>4B,#Vv $2PeMMB ٦쩢&ʿ' `]?GyOڶhsk 4VBV"zƶO^JkaW_Ҕ)^h~en(_- hWO9-\]p}YF(տ\$: `eoHIg $րYߣϓV״]<`cHvmos! V@p맪\Ϋ:y}wL+BOB+i,}r1kp Z w_vBՄTת:H&ĚzM[,[|c||L"X-\m94ޫ!6 dq YqZW Z$LB-<`V]38^k_MpU%•k% 2d]u&<4Uvg 4KbU .?\u!U< ##Ry+^R4|bDvc`صӏ+]5#l{/v9:!0z)֤u.`.hv?po86 8 `{L]9Ps`-9X,ZA' T+t(׿: +b1AWOO_X3uϼ=+O*ʈuLTIj-+[ykTZRXsY7ey|?? glX,Bizaj觚4f}ࣗGDp+x%JcWqKW5箛y|ڮ<̀啵M \pݹrDiw] Kƪk QTHM6v"Ae6:45ŠMZEvΛgn"PZoU5qerQ46t#T%^i%x%J7+}?`7곖zmU.@%^]>er+=Di7 {A(a޺hpu\|X'sɥVP=}uAZZ|>Vb6mX 6ɦ,--Syo:oU;*XݬumrmѲrMhXlyZ+ɫ!^yLӷGa+tb^) kBh:>\ݼDU:y\MT-K[bޱ$-m[zRiJw-V3]OV%޻25#SKBC%:$]H'9I!Մ$5uЯeZʧcC XY+`Zu "[MhݰR6vQnm熫|tIyDoJ ^\7곆aX:idy,R%`o70i2`^.Kݶ:LUK^1kpAgLJ$IORMe1FT=wRGJY4sZyKV{J}[lv1u󺰷^{TT`=V}˧x%{<"xk})ah>p6* s 2 W*Jxkx:$Ea5WУ,ӪNY[72Z 7 {Bl^ޱdawp5l9tdX,53=L`*?RrAU>f!t Y48,:W `m\ۼ)`R{hht QU`J}1޷XfVCKo\W+㟅p ?ũ+ 14]UEAM=bUwU?rp޶(,+vKw_>\%ב!+=תi4!V!ބTf+`mM hcVU\VY x\45ٗ謜h 5 -Z\ZM#jh6ZhJRԏ^Sx%,0eAGFZ`}py^- Ѓ,zNXRD%n)_u!u«l;\sYW~xw1HʻͤW%df!5-`g{NXyi@V6 `Xi 5 `."0Vu5U,aU n +ZOc_xh*UV?p2\?ymdW*OcJ_ÕA<)fhrYݶlh鎥Cdo_zR)+!򄁭oo-uU]ŕˇOG5PeP*W8!kbzu2l;9N k\4Ϣ hu^m VoA`5T^,!6ZDpa֭W.cTcۏbsogsF``UFkO UpZ4"ắ|Jp2\Sp H3,p}>˹_gMci8IJ?he޻bD잦cVU>W:2&]~k?)Tcu]9]Sp6"zVqrֻ)k6e`mk ՎMZ X-W*cbݹت޿:`V\F+p̰\W*Õ)tJx-BAZ0E# 6 \O_gW +yy<5l(8 ;Xh(ӘՐM*5 Dk& HX'Y۰1Wր4]2fYB«ouVUSX<U,UoUG;NPNTʣCx%r%\ _RX 9hW YBݹ*@ʓUwfҏX3U! 1bڵ~`B%ee|dI dI~+lEj#cqv55 `.55 `oZ{.H,ƪ^wT !^UWU*her%\~6,G2\ |] uA6IXCx /M쳘)}^{Ji%G|b!Mnbң.~@jlHVm\K &$Ҍs oֽLU l!V6-`6ԕ=Z+jj*kjëu1Jh}dQ%Zgg2ZQT+a T9a GZl=J}>{}wZIt:4!˯ | Ȑu'Gl1f=raKh&ĚfJ+dk:~YњN׵%3 g}c.&m+յ@4tEʀ-#ʣx[͕`hhe2Ze%\ڀ2衖2P+] {+x\{[7)\%^U pB,ݝdꏋ+6V-}CӒlaT1\vA|aKim~z}~?2?8b+] y@« i渚gf o@ՄWU ;>k`+GJɡW9e@Uv}5>e~C-L@a)q\\mi>l[YBY~D@BgVN h\R>9NqOcִA˶̠&]j}^,@Z `]k·xSVN]:ciԕm 5XWj%eIhh7VU+UVU*h)V2@p\xw])(ECShxH0i(CK%|;24!kW$d?kzteŬ 6VNR]lUH= XTzV6ˢjoԱ5 `Zo+U؛Է ڜ`UֶEj[D /"h3]%ZDUt{U\ VVY}U.밨|h2\*hAHkxm$\eL?d,߱$)-Cl4t5=n9h԰J^p!T+m2u񬃝s Vݰ+;ޑ"*U/h}JE\}€\FhJR|ߕJU# R)z$pe2\:m#*P'=K*!!ˣnim|~)#v:bC 6]_smJT9K X)ke`I9YkB*`Z@V6UiV9K+5Z]}uէ Е Wz%ٰ_+UÕ~"Ң)|4peW= Y:%Ҿ{,c fO3bI}^,QB6R L6_kzdkSj+fF@=Y,^ujo؝j[Bqj^Dִ@_FO`TF+U=*h,B+iI=\@ R4ڥXW=4ߓ!].AvN^;H(C ;iPTVi8u!'<$^* : U)kv`cDq\qP%X&YB[DggX"WOxXj4ֳ#\F|*pALl&=CqJy|JHU.M^;W_n5>`ѷʼngs Y穩թd^}Q UV6,ט+׬VoVk^cltUuq湖 JVrƫ>U+UjZF@heeGZZU\+ !؊m\>yoWxo ˸"*M`L)ZWLu?yy6_ TlsWyևFWzj{Mhu9UT7U65ZBc@<˶@G2X]WFHf~jVy.V;cE AK(lFb2Kh4R!d PY>+zmƗSo[7Y_SWIW*\_6 UarU2˜$Zi*Gm#|Sz6(,s\9ZDUSWY} *+J}S{-ZW*?@Jp/AO0l+\0d%AwF;zu@{$.Q*?gjX%f*WUǬs댃VYY7J1˄W,^|l%US Ygw `}XM\ \Nh W+ جY]/ Tѷ.>9F Z5K@+:{RPI7}4,7!TkAj. ~eJkW/=Z碁UM ۮ;m1X:Zex{c%Xms\,םa%Z?y`W9˕'2Z+燫J+ªoppEJXl,P$`gȪB asW+z>2blŷ۫}K߄Rc[^U}jғV<($/؛uGZ]gkmV׻ˣvV*X@ 0Zeu-5.p=WrEI dNe煐]^~E8D EڞI Y:UDf{myUP5}͵`hAad IH Xwcԕ T֕MW߲ T mwkU<*W\4ϵ\F+Wr-UpZÕ {AKр,^J!J,CvYZ~ϐU{| ui ƍUe꟏ՆX5{Ngz%g`Z7_eoMYa`xuϽau>{~:$WZ*r AVWڠw\9 H˧hL6k8%!Y,=2b^WnʻP,]U]X/M51eܕk#sVMlحm,AV\}c$`mcdqBU V VY,U4˕J_8 Z"䞢aوC/NtEpSW/kz}/MtyuRyif)Iu& ku-U7I (, GX5uϽqX V^JeQX V9*hV.tUӽ8qEiHFf f}{z]+,]5 uGJe.Jس}+>`$ڐ|'5X+a*u o91XT1X8,V*mz!QXT^*gr \ߕaע ґ)kQd,CͮZp$ok\ߎgJ8Ʈ.XPj;5\C[zU}&kZ2|ZhM3 뮍DfsMp҃nom iGaQ 3\oaIY/w\V啯 O\A"E4Ki 0Kw3 e5FY>΍}I2 )TV}>sE_#l cַ*++3P}LKI<ĺCê^I\iXW(,ªqVVY9 *fUVuU|8mEi Ryqu^ꪁxp/ \+P2dns=NHQshU/l[exo.X׊ |ZmsT]\+$}w0O4`GaY;|U;5 AZ.Epml(vY1'xd+RuWk&k2 $3Y`m-cԪW)I{vƫd_f,غWqUuHUy~! 9hztWEtH< ~|mt'6&|Hm%T kŸ#S,!uY|@UؤSVV$9Q@_x#^rjV:qw\ys\J`հV& m?<}M hELaUn%2y~)K?ԆΤsV]_sM(7uܕ5 `MllS~=ƒ`uMi$>M`!Wj1K\ A"zԋuGFw6շWU@Z^/vI8u}A+'lxL M&ꃪ)i' +hk^rմ1m*WAI6aNmru:IWR,$WBS>'zYqYZmubM9e n;X6I4E' XmYCc-Y(WߖE`h٭[ Ԗ[qv9awC_Q})?f٨8IGU%e2Ϊ{M8]}tXO3{,ScpÃMYTצ,-BNU " Rl>ĚO?pHx422E7:fn^Wz]fuN ku&LL \!$`zx ܽn4BBk># aD:aZW҄Mq~95?_*h+\V[̵Avªjz=RXcYސXA/WڵoAAܵ1H(}+~]>Cs/鄘j^ڑj SV.;N06+)]}釃jzez1ze " R!5=O#] 05cXϛQ`״ʦme˪n?^.+Ujڊm2s YJW">+?}WE{  [r<* 4R]OX/GM} PH?)65ͣ+VVmX58|a܊EG򸫢BAiX_0P:Xy%RoT?Q ;(c: {GW&g}pvOYk  4]'U;˯%0wnWy{j*hu:^ףvT]>YҕR;YRiR@>  lF)"(6]LUiZTm{+r6_]沚AAcBBBxoGfl=>2[}pgUZ `]"aQtGZѩjAAO{g۪; Z1j~F|_/4,@껳ʧoOTFAAO߲7}s%oFVT[}Jx$7%                                                                                                                                                                                                                         zqO{*B%tEXtdate:create2011-11-07T02:03:53+01:00h%tEXtdate:modify2011-11-07T02:03:53+01:00 IENDB`openscad-2019.05/icons/openscad.xml0000644000076500000240000000043513402025764017535 0ustar kintelstaff00000000000000 OpenSCAD Model openscad-2019.05/icons/openscad_doc.ico0000644000076500000240000030034613402025764020340 0ustar kintelstaff00000000000000 (F@@ (Bn00 %J  >p(         "$"   ""$$&$$   &,48<<<84.($ $(.4688640.,,*(&$  $*.248::<>>><84,&  $0:FPX\^\XRJB:646:BJPVXXVRNJHFDB@<842248>DJPTVZZ^^`^\VPF<0& $4DTdr|~vlbXTPRX`jtz||zvpljhfd`ZVPNNRV^fltx|~zrfXJ:*   2F\p~vrtzzvrrv|xfR<*(>VpUUU@@@@@@RRR۶сjR:& 0Jf nnnSSS҂(((ssshL2"6Rp555)))...&&&MMM|\>& $:Vx...&&&555###ZZZgggZZZhhh썍???III𑑑 lJ.  $:XփXXXIII򒒒...xT6$>>fffxxx:::000VVVIII\:"$:Z~|||***GGG׼䷷III$$$III`>$":X~GGG,,,OOOIII,,,b@$"8X~)))|||좢III,,,b>$ 8X~̴ 000lll;;;(((SSSڞIII^<" 8V~PPPeeefff>>>===ȚIII~X8 4Tz000ppp___򨨨QQQ!!!IIIrP20Np<<<nnn!!!<<>DNXdntvtlbTF8.&$&,4:>@<80*((,2fD^Z2b's     P8R/.,,+,+---./01235779<=ʗ@oB9GGGZ)o&}&{%y%y%y%y&z%{&}&}'()*+,,-.0124578;=?ԫA?G G(G\ NFGGFFZGZ"r!p}<"s#r!o| lz ly ly ly!mz!n|!o|!p~"r#s#v$w&z&{'~()*+,-//13468:A׸C`TGFiFyFzFzGzGzGzGzGzGzGyFzFzNu]X_ m|co_kZeXdWaVaVaU`VbV`XcYcZe[f\h^j`lbncoeriv jx!m{"q"r$v%y&{'))+,-/124679FG?HBKENFPJTMWNXQ\U`VbZe^j_kcogthu mz"q"s$w&{'()-4F=E ;C 9A :B;C>G@HCLFOGPJTNXPZT_XcYd]hamcofs kx m{"q~#u$y%{1zz=vG{NQVY]_a]VºF@FRF0G}FzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyK/c1eP\]^_abcb9OYOXNXMWLUISISGQENCMAI?H=F ;C :B ;B =D?H@IENIRJSNVQ\S^VaZe]hamergt kx"p~#r~7{sDxKOTW[^`beĬfǮgʱhʹ[CFG#GGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzEvO5nNYYY[\]^_abjDWbS^T^Q\P[OZMWLVJTGQFNDMAJ?G=E 9A:B;C?FBKDMGQJTMWR[U_WbZf_kbnfriv8xINRVZ]_ac«fƮgʱh̲jϵkҸoչjԽRFC FGtGzFyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzCsPAY^VUVXY[\]^`bdAXdYeXcVaU`S^Q\PZNXLVJSHQDMCK@G=EEAJEOGQKUOYQ[U`Yd\h]j1zxNQUX\^`ceĭfȯh˲iεjзmӺmֻo׽oپqۿaF3FFZGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyUM\[]TSTVWXY[\]^`^*q}^j]i\hYeYdWbU`T^Q[NXMWKTIREOBKAJ =E ;B :B;C?GBJEOIRLUPYR]VabiOTWZ]_bdëfǮhʱhͳj϶lҹnԻn׼oپpڿprsmL< G/G|GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzCv\M[Z[\QPRSTVWXZ[\]`Depcoam`l^j\hZfYdWbU`R]OZNXKTHQGPCL?G>F :B :B ;C?HCLFPJTMWP[7yVY\_ad«eŭgȰh˲iϵkѸmԺnּoؽpڿpqrssuqQBGGwGzGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzCvSQZZZZ[OMOPRSTVWXZ[\[huhugseqcobn_k]i\gYeWbU`T_PZMWLVIREMCL@HG;D :A ;D?GAJQXU_adëfǮgɰhͳjжkѸmԻo׽oؽoڿqrrsttvvuwwvNG$FyGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzH|CVVWXYYYFHJKLNOPRSTVXV7 p~!p~!n{ mzkxivhtfrcoam^j\hZfWbVaS]OXNWJSFOEM@I=E 9A;C=E@JfŮeǮjhʱiϵkѸlӺnּoؽpپpqrsttuvvvwxxxuXdFGUGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGz:pG ;C :B G 8@nؽpڿqqsstuvvvwwxwxxyyxzfFVG}GyGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyZNRSRSTTUWE>{x@~|BCDFGHJJ#Xm N)W+Z._(&~%{%z$y#u#u#r"p~!o} lyjwhuepdpam\h[gXdUaS]OXMVIRENCL =Dmn׽sttuvvvwxxxyyyyyyxzdخFFGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGz@QQRRSSSTT>ywyv>{x@~|BCDFG>x|3fo@Z!K(R)W&}(''~&}$y$y$w#t"r!p~ n{ lyivhueq`l_k\hZeWbS^R]MWISGQAJQUZqtuuvwwwxyyxyyyyyyyu]VFWF{GzGzGzGzGzGzGzGzGzGzGzGzGzGzGzDw eQOOPQRSRSNyv?{y@~|BC@}~6jn5jn6ho#P`+L)O,*)(('}&|&z$x$v#t"q"p~!m{ lyiveqdpam^i[fXcVaQ\NYMVGPQRSVUbvvwxxwyyxyyyyyyyyxxiV ]GvGyGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyKKNNOOPPQRRI;us;uq:tp:to;upyv?|y@~|7kl5hk4fj3di3dj-[dDY,***)'('~&|%z$x$v#u"q!p~ mzivhueqbn_k[hZeU`S^Q\KUN0QRSVVUqwwwxyxyyyyyyxyxxxxwZڕJ6GyGzGzGzGzGzGzGzGzGzGzGzGzGzGzFyBu9zKKMNNOOPQPC:ss:tr;tq;tq:tp:to;up=xs:rp5gh3ef2cf1ae0_d/]d/^f-,++**)(''}&|%z$x#t"s!p~ lz lyhuerdp`l^jZeWbVaNZKBMNQRSVVV]yxxyxyyyyyyxyxxxwwvrD<GGRFzGzGzGzGzGzGzGzGzGzGzGzGzGzGzFy[FIJJKMMNNON>w{;su;tt:ss:sr:tr;uq;tp9sn5kh2ed2cb0`a/^a.\_.Y_-ir...-,,+*)(''}'{%x$w#t!p~!o} lzivgtepbn]i[fYe_cIKMNQRSVVVXqyyyyyyyxyyxxxwwvuuvcѽF FpGzGzGzGzGzGzGzGzGzGzGzGzGzGzGzGz2qHHIJJKKMNNJ;rus?u@v@wByBzC{D}D~EAx;p~p>q?s?t@uAwByBzC{C|=r;px};rx8ns6im3di1em6776554332100/..-+**)('&|&z$w#t"q n{jw*q~MMNPSUXZZXkжxwvvvuutssrqqpڿoٽo׼nջmӺlѸjзiϵSƿGNG|GzGzGzGzGzGzGzGzGzGzGzGzGzGz"];ko>q>r?t?t;nw~;qy8mu6hp8:998876654433210/.,,,+))(&}%z$x#t"r!n|0vHILNOQS[bcdptttsrrqppڿoؽn׼mԻlҹlѸjзhδh˲gȰeǮ]ôGGFXF{GzGzGzGzGzGzGzGzGzGzGzGzGzEx7h8d~8g9h:i;j;lqtAzDEGHIH?<<::::9877765532211/..,+,))('}&{$x"t!q9EGLVYZ\]]_abdoqpڿoپoؽnջmԺlҹjзiϵiͳgʱfȯeƮcëba^FFcFzGzGzGzGzGzGzGzGzGzGzGzGzBt,n9g8f7d~6c}7c}7e~9f9h:i:j:j;j;k;l==<<<:::9887665443110..-,+)(('~%y$x!s2}SQRSTVWYZ\]^_blϼmԹlиjжiεh˲gɰfǯdŭcªb`^]\[G=IWRF{GzGzGzGzGzGzGzGzGzGzGzFyEu?{==<;;:9997775543320///-+,))'&|&z$x#tANOQRSTVXYZ\]]ai͸iϵh̲hʱfȯdŭcëb`_^\ZYXE<ʉD,G~GzGzGzGzGzGzGzGzGzGzGzExd@t>r=p>>=;;;::9887655332100.-,+*)(&}%z$v/JLMOQRTUVXY[\\bh˱gȰeƮdĬc`_^\[YWVTC:GGGyGzGzGzGzGzGzGzGzGzGzCw!t@w@u?s>r=pq@t?q=o>=<<;:9997665443110..-,+)((&}%z#v8KKLMOQRTUVXY[]fñdĬcªa`^]\ZWVTRPA9FaG|GzGzGzGzGzGzGzGzGzGzAv0CzByAw@u?sAwD|C{Bw@t?q>opUVXXYYZZZ\JBBBBB@@??>>=<<::;98876654320//.,++)((&}%y!u?IJLLNPQRTUWX>&qdê`_]\ZXWURPNL>8>G2G~FyGzGzGzGzGzGzGzGzGzBv2EE}C{ByE|IHFD}CzBw@t?q>p=m.o?OU\\[\\]TEDDCBBBAA?@?>===;;::87865533310/.-,+)((%{$x$vBGHJKLNPRP> Er+g(m}X^\[YWUSQNLIG{:5=%G GlGzGzGzGzGzGzGzGzGzGz@u;GFEKMLJIHFD}CzBwAu8oNmIpMtg4Rb__]IFEEDCCBBB@@??>>=<<::88776543221//.,+**('~%{$x+xCFGHJKNDKl'Y-_2d1g5]YWUTQOMJG~EzBs54:JG7FyGyGzGzGzGzGzGzGzGz?uOUUTRQPOMLKIHE~ a}[qYqVrUsRtPtHq V|NFGFFFFFEDCCCBB@@@?>>=;;::88865443110..-++)(&|%y"v/xBCD+^j>!C$F'K'N(T)XCfPSPNKIF|DxAr=}m:wg4ul.2'}KG.GoF~FzFzFzEzD{Gy_yKYZXVUTRQPONLKC axZoZq[rZrWrTsMq&ϡFHHHGGFFEEDCCBBAA????==<;:997765532200.-,+*('&|$x#v-w@~|!LX49=@"C$F'K(P?^NOLIG}DyAt>n:yi7rc3j\-qo,1%Se]Ia*[N6QrPvPvUrelrg ymNZ\[YXVTTSQPON@ar]o[nZoZq\rZq̎IJHIHHHHFFEDEDCCBAA@@?>==<:;:8866633311/-.++*('~%z$w"tdq/-269=@!B$F>=<;:99876543210/.-,*)''}%y#v"tgu .B(.259=@6NF~E|Cv@q<{k9uf5n`0fX,]P&PC#]]'+/#BvKwOvUxZq\0bmp!pXskpeLX_`_]\[YXVUTTEjoejckalWi%HLKKJKJIIHHGGGFEEDDBCBA@??>><;;::8775533200/-++*('&|%y#u"rjxET !).269APEyAr=}m:wg6oa2hZ-_S'UI G<IE"p}&|*/p={C|FyLwPvTuXPk$hULZ]cb`^]\[YXVUL pqhjfibi'KNKLKKJJKIJHHHHGEFEEDCCBB@?@>==;;;8887653320//-,*)(&~%{$v"s"o}kyan%7(+.0)[\@p;yi8qb3i\/aU(WK#LB?6C=ep!o~&z)-g:z~>A}C{GxMwOwSYKUZadcb`^]\[ZXVsvdf yr8ONNMMLKLKKKKJIIHHGFEFDDCBBA@??>>=<;:9977643310/.-++)(&|%y$u"q m{iv iuP] +=-(8sf9te4l^/cV+ZN$NCC9@7KH^ggt!n|$x(-`4n:v<|?A}C{HyLxO9DINUdeccb`_]\[[-Ǔ"HONNMMNNLLKKKKKJIHHGGFEEEDCCAA@?>>=<<::887654321//-++*('&{$w#t!o}kygtdp]iQ]LV-g`,aX,\P'QED;=8EELRU`\hdq mz$v(- It1e6k7q9v=|?~B}D{GpI DuIKKN_eedcb`_][QOOOONONMMNMNKLKKKKHIHGHFEFEDCCBB@@?>==:;:8875542210.-++(''}%y"u#r mziveqam[fWbP[KUFO>H :B=EDMJTR]Zebnjx#u'-8d,]0b3g6l6p:w=|@BB1EFIKLMMU]``^]YTOOPPPOONNONNNNMLLKKJJIIHHHFEEDECBBA@@?==<;:9887653210.-,,*('&{$x#s!p~lxgsbn^iXcT^NXHQBK ;C;CAJIRP[Xc`ljw#s',D)U*Y.^0b4g5l8q:w=}@tD'IKMNNNOPQPQPPPPPPPOPOONONNMMMMKLJJJJHHHGGEEEDCCBA@@?><<;:9876543210.-,+)(&}%z#u"r m{ivdq`k[fU`PZJSDM>F 9A@HGPNXWa^jht"r''>'M(Q(U+Z.^0b3g6m7q:x<}GLMNOOOPQQQRRRRRQQQPOPPONOONMNMLLKJJJIHHGGEFEDCCBA??>==<::987654211/.-+*)'%{%w"r!o}jwgsbn\hXcR\MVGO@H :B>EENMWT_]ifs"q(by;"C%H'M'P(U+Z.^0b4h6l8r<HLMOOOPQQRRQQQRQRRQQPPPOOOOONNNMMKKJKIIHHHFFFEDBCB@@?>==;::987552210/.++)('}%z#u"q n{hucp_jYeT_NXIRBK ;C A"D%H'M(Q)V+Z.^0b ?qcI}KNOOPQQRQQQRRQQQQRRRQPPOPNNOONMNLLKJJJHHGGFEEDCBBAA@?><<;:9887542210.-++)'%{$w#s!n|kxer`l[fV`Q[KTCM=E:BAJISR\[feq"p~)237;? A#D%H(N(Q(V+[-_wF+KNOPPRQRRSSSSSSSSRRQRRQPPPOONONMNLLKKJJIHHGGEFDCBBAA??>=<;:877653310.-,+)('}$y#t!p} kxgtbm]hXcQ\KVEN>G :B@IHRP[Zfdp!q#r',037;? A"D&I(N'R(V~KNOPQQRRSRSSSSSSRSRRQQRQQPOPONNNMMMLLJKIIHGGFFEDCBBA@??=<;::87664320/.,,*('%z$v"q mziudp^iYdS^MWGP@I :B?GGQPZYddp#sSc"%(,037;> A#D&I'MKNOQQQRSSSSRRRRRRRSSRRQRQQPOPONOMMMLKKKJIHHGGFFECBBA@??>=;::987543210.-,+*(&|$w#s o|jwer`lZfU`NYHQBK ;C>FFOOYYddp"s>=<:988754320/.,+*(&}%y#t!p~ lyfrbn\hV`Q[JSCK<<;:987654210.-+*)'%z#w"q mziuco]iWcQ\KUCL=<;:97764320/.-+*('}%x#t"o}jwer_kYeT^MVEO=E ;CDMOY[gkx#G A@=840.*&$#"%)>MPQSSSTTUUUUVVUUUTTSTSSRRRQRRPOPONNMNLKKJKIIGGFEEDBBA@??==:::77653310.-+*('~%z#t!p~ lyfral[gT^NWFO=FF>=;::8854320/-,+)'&|#w"s mzhubn[gU`OXGP>E =<;98865320/--+*(&|$x#s!n{hucn\hU`NXFO=F=EIRWc?f/_.\+Z+X)U(Q'N%J#H!E B@<85;M ORSSTUVVVVVVVVVVVVUTTTTSRRSQRRPPPNNNMMKKLMLKKKFEDCBBA?@><<;:88654210.-,)('~$y#s!n{ivco\hU`OYEO NPRSTUVVVVUUUUUVVVUUUTSTSRRSQRQPOPONNVZZXWVTW^][XROKFCA?=<;:98855221/-,*('~$y#t!o|ivco\hU`MWEN ;CAJR\@t5o4l3h2f1b/_-],Z*X)T(Q'M%J#H"Ek!BORSTUVVVVVVVVVUVVVVUUTSTRSRRQRQMOQNKH}F|IOVTSOV`^]\[YYWTPLE==;98765221/-,*)'%y#u!n|ivco\hU_LWCL :CHPMl7{{8w7t5o4k3i2e1c/^.\+Z+X)U(Q'N%JHN$PRTTUVVUWWWWWVVVVUVUTTSSRSR$QQMIF}DxAr=}m:vh:tmGPKUca`^]\[ZXVUTDʘ9;8765321..,*)'~&z#t!o|jvco[gT_LU@I=DI\?><{9y8x7t6o4k3h2f1c0_-\,Z*X)U(RNORSTUVVUWVWWVWVUUVVVUUTTTG~EyAt>~n;xh7qb2i[-`R%RE*TR;kUgdcba^]\[ZXVIba]`ϔ3765321/.,+)'%z#t!o}hubn[gS]IS>F@J Fu?|?|?~=<{:z8x7t6o4l3h2f1b/_.],ZbMPSSTVUUVWWWWVVVVVVUVO[+Dy,Cu?o;yj8sc4k].bU)XL"K@>6C:'SH8okNegdcb`_]\[ZPoniieeml̛95431/.,+)'&z#t!n|itamZeQZFP;B GcGxCzA{?|>}>~>;|:y8w7t6o4k3i2f1b/] N;QSSUVVVWVWWWWWVVUVL@s=|l?pW=|l9te5m^0dW+ZO$NDA8>6$MB(WK,\P.aT1fY7peQfeccb`_]\V|ylggex{KT;421/.,+)(~%y"s m{gs_kWcNX@IBNLqJxIzFzCz@|?|>}>~><{9y8x7t6o4k3iIOsRSTUVUVWWWWWVWUUKBo@r=|l:uf7oaP;zk9ue6oa1gY,^Q&RGE<=4A9#MB&QF(WK,\P.aT1eX4j\3l\:vgL[_bbca`\1ř„;RTVY@21/.-+)'~$y#s lzer]iT`JR>JKNuMwLwJyIyFyCzA{?|?|?~=<{:z8x7s{8r PRSTVUVWWVWWWWUNG{Cw@r=|l:uf6oa4l_/dW-^Qk)XLI*WL,0eX+\P%PED;:1:2@7F<"MB&QF(WK,\P.aT1eX4j]5o`9sd:wf}>~>;|:zBL PSTTVUVVWVWVWSJ~H}Cv@r=|l:uf7oa2i\/dV-^Q)XL&RG#LBF<@6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWT5/.,*)&}$w!qivamWbJR Fi[mVrTtRtOuMtMuNwLxJxIzFyCz@|?|>}>q>{BPSSUVUUVVVVUOKH}Cv@r=|l:uf7oa2i\/dV-^Q)XL&RG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWYF/.,*(&|#u!n|fs]iQZ Hk_e[q[qXrVsTsQtOtMtNuMwLwJyIyGyC{Az>O$QSTUVUUUUVTOKG|Cv@r=|l:uf7oa2i\/dV,^Q)XL&RG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWXX0-,*'%z#s kycnWbOo^o]n\oZpZq[qYrVrTsRtOuMuMuMvLxJxI|F3O$QSSTVUVVVTOKG|Cv@q=|l:uf7oa2i\/dV,^Q)XL&RG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWXY9,,)'~$w!q~ht\gRmehdkal_m_n\nZoZp\rZrVqTsRtOuMtMuNvLPHN&QSSTUVVVSOKG|Cv@q=|l:uf7oa2i\/dV,^Q)XL&QG#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMPQRTVVWXYA++(&{#t kyamXwkbiigiejckak_m^n[nZo[q\qYqVrTsRtPwN]P NQRSTUUVSOKG|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMOQRTVVWXY;+*'$x!p}dpakhjhiiiiiigjfjbkbl_l^n\oZoZp[qZrVtTfPORRSTUSƾNKG|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMOQRTVVWXZ0+(&|#sfr gscognfkgjhjhjhiihiejdkbk_m_n\nZo[p[e[NmQRSSSNKG|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyH}ILMOQRTVVWYL*)'~#tjm{tbrgsgqgpfnflgjhiiiiiigifjdkbk`m^q[XVN,PQRSPK|G|Cv@q=|l:uf7oa2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG~ILMOQQTVVWW5+'$vmqrsergsgrgsgsgrgpfnglgjhiiiiiihjfjdla;`OQQRLG|Cv@q=|l:uf6oa2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQTUVVE+($w n|2n3rarfrgsgrgsgrgsgrgpgnflgjhjijhigi&NBOPPHBq@q=|l:uf6o`2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQTUXG+(%xjweo4qVrjshsgrfrgsgsgrgphojl\j:kLOANOF?|k=|l9te6n`2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQTV@+'%{%lpqTrlslrjrjrlslrSq(n LoNE=~p9te6n`2i\/cV,^Q)XL&RF#LBE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILMOQQQ9)'}.qrr0r,rPdGƳ?8vj2gY/bU,^Q)XL&RF"KAE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}ILNOKC0&4PJ%Ds:1h\,\N(VJ&RF"KAE;?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBvFyG}JMH@7L+H,4~-h`&QF"KBF<?6905,;2A7F<"MA&QF(WK,\P.aT1eX4j]5o`9sd;xi=|l?pAtBwFzG|D>k /uv&&YS["OGC:8092;2A7F<"MB&QF(WK,\P.aT1eX4j]5o`9sd;xh=~o?sAvA{zCF9'gg6.C=:2A7&G<,"LAd&QFa(WKa,\Pa.aTa1eXa3j\R5o`(9sd%;xh| /?@???????~?<???(@    "5EMJ@2+-9DHE>:62+'+4?FJNOJ>,  $Gkpcfw{wpf`gu~`= 8l::: 777JJJHHHAAApppKKKAAAAAAAAALLLj8F888???\\\FFFBBBbbb...888 ```QQQ|||^^^|||T!Jddd)))wwwwww\\\󑑑^^^ k, Jⷷrrr%%%\\\&&&+++ߎv2 H777 HHHSSS***t0 F׫䆆XXXdddf* ;aaa999000000[[[gggxxxiiiM*[___###ߞDDD :::ЦiWf\\\𤤤q_}ZZZ^15Y{oVLXpx[>.4EOI92:M`kkbM2  (9B?3& &3?B9)!*//)   e#G[@;62245;>ÇE]O. GG!JGGMF8I 5}$tm#t#s#s#t#v%z'})*,.147;>ьE+yF FgG|GzGzGzGrV=_dp1`l_j\g[g\g^i`ldpgt kx"p~#u&{(+-036:?BWG=G{GzGzGzGzGzGzIyUl[5Ni!PZMWHRGPFPHQJSMVPZS^Wc]iamgs lz"r%y'*-047<@C:GNGzGzGzGzGzGzGzGzGzFy\4l!Uh>G=E=EFAJEMIROYS^Yd_keq ky"r%y(*09BCABFG?FzGzGzGzGzGzGzGzGzH|%\DU]V2tLUJTGPENAJ=E ;D=EAJFOLVS]Xc_jfs ly#t4|HSZ`b¬[ǼJF G+G{GzGzGzGzGzGzGzGzI<WWZ]_dAVaT_Q\NXJSFOAIF;C>GTfŮgɰMkѸnּpڿqsuvwxxqC FYGzGzGzGzGzGzGzGz,pSSUVEBEHJE 5_/`'}%y#u"r m{ivdp`lZeT`OXIRBK :B>nؽpڿstvvxxyyymԪFF|GzGzGzGzGzGzGz OMQRSRr@uAxC{D}=sv>x9nu5u98754310.,+(&}$w"q-uJNRWbputsqpڿn׽mӺjзh̳bdzAFoGzGzGzGzGzGzM7e8f:i;k=ntA|EC;;:9765320.-+)'~$x#sBJT\_ahqpoؽmջkѷiʹgɰdĬ`GYFjGzGzGzGzGzGz!a:h8e7d~8e:i:j;k=<;:876431/-+)'~$w/yQTWZ\_dnԼlҸiεgʱeŭb_]EJ^GzGzGzGzGzFy.l=o;l9i:i9h:h:i;jHPRSTI@?>=;:9864310-+)'}$wBNQTWZ\bh̲fǯcª`]ZW@G;GzGzGzGzGzEx8{Av?s@tAv>p=<::76531/-+(&}(zHLORTWUZa^[WSO<>GGwGzGzGzGzDx?E~HJGD{Av=p"k:R^]JECBB@?><;986431/-*)%{-{FILM1m4g-r\XTPKF{6;G@GzGzGzGzDxEQROMJG4tWqSsOu0RFFEDCBA@>=;987431.-*(%y0zDA=;:86431.,*'$x,t| &<7>#E2SLHCw=|l5o`-kf.tXP_t$sRtiS_]ZWUR-~bl\m)KJJIHGFEDCA@>=;:86420.+)&}#v`o!5/7 -FDy?o7rc.bU$OE%s}-bIySvW>iR_b_]ZW;°kk4MLKKKJIHFEDCA@>=;98632/-*(%z#rivCR1FL:vg1fY'RGF>[b#t+ P=~B|JyOCGN^db`]QFONNMMKKJHGFEDCA?>=:97531/,)'~$v!n|fs[fW]SSCCADOY_k"q~*8g4i8s>C{CHLNTXWSPPPOONNMLKJIHFEDCA@><:87420-+(%{"sjwamWbLV@H=FLU[g!n{( I*W/`4i9t=}DGrMOOQRRRRQPPOONNMKJIHGFDCA?=<:8631/,*'~$v!n|er[gPZEM <:8641/,*'~#t lybnWbKT>FCKT_ lx /A%*19@$GMPRSSTTTSRSRRRPOONMKJIHFDCA?=;98530-+($x!o|eqZeNX@HAIT^ft4($%*29LGORSTTUTTTSSRQQPONMLKJIGEDB@><:8631/,)%z"qgt\hPZAJ@HU`Ui=6/($%*xNRSTUVVVUTTSSRQPONMKKIGFEBA?=:9742/,)&}#sjv^jQ[BKAIYd4W$I!D=6.($YNXRSUVVVVVVTTSSRQOONMLJHGEDB@><:8530-*'~#ukx_kR\BKBKQd-[*V'O$I!D>60+MPSUVVVVVVUTTRRRPONPSRPSQLHB@<:8631.+($v ly`lR\@IHPAm2g0a,[*V'O$I!C?OBRTVVWWVVVUTSRRR5OJEyDKO\_]ZWRG69742.+($w ly_kP[?GHb:{7u5n2g0a-[*V'P]NPSUUWWWVVVTUoTEy@r9uf0eX$OC+UUQec_]ZSffБ342/,($w ly^jMW@LD?|=~;{8u5n2g0a,ZNRTVVWWWVSD~:{8u5nWP*RUVWWWVJBt~nBuG{KORUWT/+'~"p~_kPt]mZqWrRsOuMvKxGzB3PNSTVVQIBt~nBuG{KORUWY4*%yivZ~fibl_m[o[qXrStOuNKHQ2RTUQIBt~nBuG{KNRUWY0(!p}flgjhiifjbk_m\o[qWTPNQRQI}Bt~nBuG{KNQUWL)"v nsfrgqgmgjhiigjcl^CVPqQKAr~nBuG{KNQUS1&{ n| p'qVrhsgsgqgmhkZi%ONF;yj4k^.aT(UI!I?<38/D:$OD*ZN0cV5m_:vg>~nBuG{KNQM1'/lqr>rLr<rnPCu8|.aT'TH H><38/D:$OD*ZN0cV5m_:vg>~nBuF{KJD-49.*^U!LC<490D:$OD*ZN0cV5m_:uf>oAvF}BND>>7D:$NC1*ZN10cV14l]:uf=x???8????``?(0` -1*",-($ &-13/"/Z{aXg}umg[Uasd<Y'''cccxxx666LLL곳MMMűCCC000000AAA5 #w!!!(((kkk jjj:::nnn333𩩩T#pٿyyy<<<񸨨fff444zzz888(((f nEEE ^^^888<<<햖777)))dk,,,qqq===󢢢000---444浵OGZZZYYYCCClfkkkۙkuuu u/  Hq|gJG_wtV3*9D9,6M]^M0 %)!/Kz^[lIeG^ZIu5  GI6G4G ]'va$u%v%y&}(*-037;ƴ@\]GFSGyGzGzGuSB\ YeZfZeWbXcZe^ibnht!n|$u&}*-16;?ԑCFGjGzGzGzGzGzIyRo'fJUAJ@H@HAJDMIRNXT_[gbnjw"s&|*.3:?BlDGGlGzGzGzGzGzGz K0jKP8zMVGPCL@H=E>FCKISR\Yebn ky#u5HU[XúMҲFFGbGzGzGzGzGzGzVJWX\`OYeT`P[KUEN?G=EAIIRR\[g5~{S\bgʱkѷn׽aP'G@GyGzGzGzGzGzYO[QRUY\0{co_jYeT^MWFO?G=ECLT\S`eƮiεmջpڿrtlW"GGwGzGzGzGzGz NJWXIKNRS2~!p}kyfsalZfT^LVDM=EBJ^:gɰlҹoؾqsuvxqCFFJGzGzGzGzGzGz>STRA}CGGKhLo&|$w"r lzgs`lYdQ[IRAJi̳KquvwxyyoҕXJGsGzGzGzGzGzcNPRJ;uq=xt@~{:qs/`hZn*(&|$w"qkxdp\hT_NXL QUUcªwxyyyyvgAG1GzGzGzGzGzK~@~KMOC;ts:tr9ro2ed/^`.mw.,*(&{#t n{gt_k`gKPTWuyyyxwuoSGUGzGzGzGzGz _EGIJw;ry5ox87532/-+(%{"s-uKQWettsqoؾmԺj϶cɵ@FGwGzGzGzGzZ7e~9g;k;:86520.+)&|#tAPZ^cmoپmջkзh˲dŭ`FJLGuGzGzGzGz/h:j8f8g:i:j<:97531.,)&{0}OSW[_iʹiʹeǮb^ZCEGkGzGzGzEy9w?s>q?rG>GzGzGzExBHKGDz=rk;VXFDBA?><:8631.+('z>II.i~1eKWRLEy6:GGOGwHyNwOUROK9zYqVstJGFDCA@><:8531.+''y9x{?S"D'N7{|NG}?p5sh. g;] XgHshV]YVR9`ms{BJIHFECB@><:8530-*&}!o};N0;0ljAt8sd,^Q%hl+QRgW#iR`a]ZG HMLKJIGFDB@><:852/,)%y!o}Tb -@0g_/bU!LDPR!p}'>x?~HwK!IO\_[SNONNMKJIGEDB@><9741.+'#tjw]hRZBHBIU` ly$w-[3h:v?_INOQQQQPPONMLJIGFDB@=;9630-)%z!o|boU`FO>FQ[hucx"E'P-]4h<9630,)$w kx^jNY>GKTer!5%)3<!B JNRSTTTTSRRQPNMLJIFDB?=:741.*&{!o|anR\?HJSZj90(%*0NPQSUVVUTSSRQPNMKJGECA>;963/+'"rdpT^@ILV B_$J C:0(#N QSUVVVVTTRRQONMMKJFC@=:730,(#tfrT_@IKZ3c,Z(S$J B:ZOIRUVVVVVTSRQOJIMR^[VPF8841-(#ufrS^AJ Dm7s4j0b,Z(R%K)QTVWWVVTO׍TCvn<{k1gY$OD0`^Sb`]Vnl-71-)#udqOY B[C}>};|7t4k0bl,ZPRUVWWUG={l4l^,\PC0eW&SGC9"KA+[O3h[@uPVV@PP5-)"s`lIZM|LwHyB{>};|7r&P*SUVVQEy={k3j\+[O"KA:1>4#MB+[O2hZ9te?oDxJOSVH-(!n|XiUXrSsOuKwGyBRP,SUVPEy={k3j\+[N"KA:1>4#MB+[O2hZ9te?oDxJOSVR-%zeyadk_m\oYqTsO\L P"RSOEy={k3j\+[N"KA:1>4#MB+[O2hZ9te?oDxJOSVK)pnvngkhhidk`m[WXO Q|PE={k3j\+[N"K@:1>4#MB+[O2hZ9te?oDxJOST3%yzp5r^sgrgogkeh?aNJО>~3j]+[N"K@:1>4#MB+[O2hZ9te?oDxJNM8'or#r7r)q PF8l,aW"KA:2>4#MB+[O2hZ9te?pDxHFf:&/uv%VP=56?5K#MB_+[Od2gZ_9tdK>s4A|9????0( @     BmiLQicXLF[lre9,wwwDDDDDDmmmFFFuuu뱱HHHyyySSSQQQϰ03EEENNNς:::|||iii跷jjjO/WWWiiiYYYGGGQQQ^^^㹹gggM"]]]DDD999KKKIIIGGGz<<F@gɰmջqtvpлCF<GzGzGzI|ISJA}F.crb|%{#skxamVaJS?GUj϶vwyyq~FGlGzGzGz/oLOA};tr9qn1ac,w+)%z"q~fs[fvGGkGzEyGMH?wkBPEC@>;841,(2~G*bvEkWNCx3G PAehXYSB]n/߮IHFCA>;840,&~ao7'EF|9vg*gb$QTWiRa^R;MLKIFDA>;73/*$xboIT)]UJHhso;yEmCKPTRQONMKIFDA=:62-'!p~^jHQCLcoWo)S2e9r,LPRRRRPOMKIFC@<940*$weqOZ@I`l .B5!D'OCM8QSTTSRQOMKIEB?;72-&} kxU`@IYf4()2@PTVVUSRQOMJGDA<83.(!o}XcBJG`%L@3(!PISVVVUSRPKMSVOE950)"qXcCP:q1d+X%L?RUWWUJ<|?oS5n_%PE5jfV_Zȇ?0*"p~S]EsA|<~6q1e?P SVVO?o1gZ&QF<3!I?-^R7qbAtKPV<)kxQxUsNuHyAi:zPSUM?~n1fY$OD:1!I?-^R7qc@rI~PVE&|egial[pUkNNQM>~n1fY$OD:1!I?-^R7qc@rI~PU4rkrcqglhgU^N)A2k_$NC:1!I?-^R7qc@rI~L?|' pr#rn9 %SKO;2z!J?-^R7qb?smD7??????openscad-2019.05/icons/prefs3DPrint.png0000644000076500000240000005202613417146620020254 0ustar kintelstaff00000000000000PNG  IHDR,,y}usBIT|d pHYs&:4tEXtSoftwarewww.inkscape.org<tEXtTitleLaser Printer K tEXtAuthorlnastov!tEXtCreation Time2012-07-03T05:18:34aVLtEXtSourcehttps://openclipart.org/detail/171015/laser-printer--by-lnasto-171015 XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/RqIDATx}ydU湙^Q /`[M3ntNwmD .ۈMh"6"MlQ URTSW̼sKǩz̛E̛73oc{޼dɒVncD՚6; Gc8oOۗs#|^s4c|z~h||n}W]uU8EpرylLbL"po `wGe!Eg}w)(|/vi'x  (*vZ5gΜɪ5f Sh{x })6GyQ&'L駟E~hhFGb"xi"_pX">-f:Uw =i#3lu ucN6("-ɣFiE=z[$Pl߾|.`sLٽ{wV/"ۿ.q ` [Aӄ5ӧOy.r)',Ew,3 /m~ٳg1?1pHF瞄Uݻ=6k­>~c ]Ӱ!@ 31L1=(d!СC^xL뜢㩧o|;w zЉrr PoHV~E-n!x#nU6)?糯n-N8w|bbb8e鯸mށ릎ꫯ{?#*GiI/@X`hАAse_~99sfWP3c'gHO` Xpvx֬YGfϞ=d17&j۶mѣt+(N4[ \͘1#~˗/gk׮evw.ڣ.L|` HlݺBT̝;B v>tD >st9fgqFP`Tk֬I" }<B~D`yڵӧq3ugy_=󉩾gϞ\LuŋիW &>օ^0δA&h6 Pu>EHc;MQ&os]?p{س>)U~ 7%&y%\H+)ã Ç>ZX}۷owq95&&^H u#L*>xW`V+V0;Aott4f?İ.3mO fO?^yijՎtSAo~3L.### Pa '#S#U@gw%>Gy$aV{'sͧ(?Mp 6uy%2Ŧ Ⱦ#G$-4bX[LS>8sF"pƶlْ+$zj"T𩐊>Pi\J<C*%c];R=ӧO_(3)WCJr ЉNW-[,)d .`s-DҹM0uϦ^C 1@1L}|쥗^J0Qgj@~ P-X :+*lÅ nǮ]N &zK } R1O 6z8IA! \ T)/4\p\Flݺu-Ի;&i=6+/"6ÙC*ؔ9vg' RzhCİʈu֝¯xi B`RG^D3<31Q-I`T8j_)~{7=)K9@>h4~gCi:: d,UNT7= .Kȿ_-|F  +20MAX"`Ѿ.(lIEHm|'/IJ,wPzxGVL>zޮm2t Ąc0')$t.:}l & byș:4r''nb;r0h"ve%z>&@J"E0#ϛ3gΧyGΨ^j? 1pFpYYZĞTR;m)`UP1'2|)!|Ķ|L Xزe8.Hz^Q`S( Wǀ&4)T%%NQHz2ɦзpѱVu96l3mڴ/s]~;'u#QU@A ,@!|PbDi%`UzLQ) P my|M <d ƍW[8P^BA >@ L HJ"':@JQ2K )LF?u'#`9eWE@ %72*>L` @_Pi͛//g͚ 0”~DNQએHyWXO^ReJI kE@16`@@(n]e2"|2a^JNOO>Φw!@NLs:!@ ) B/9r{8E:k?}yǗKPL˂ ! A0ӑTIـ}h~OK/mDžd=Ű֭[Fg,IUZ0w ^(&=\1QVHȐJUSYdIV(9 \|*9E 0ueY|".~x`SGfΜ^M!nݚ" SdzAߣz#27=O)e?+$X`a#E2lQ#;-ˊ|[itDgUӱpÒ`T0T*p}#ڏggrY$Ep喅q 7 ]A$OeꑁM6Oia:! T0%Vubr| 1Iㅑ6`1pڼ,FVLna4i1MQ^6?ж?z'¨烑k׮d_:& 剽?7w"MjQRRsjtf6<+}gY0ܷ 6q?@mo>)S\܁,NݠE}*>ʪ5ڸq3g7fyTHQBy}gC.p•'vʂy[3gMNʱ}Xt'?,؀EE5|pB0NUiWg"O$uڢ$,XႴi66%ݹœ`IEnK%OGV`XgF7oޜHWp %J|3+  %1 2' ) S;6YsdqD0+\a) OeGH|g?5aQ0,â`^+BR)RPxi-'xg50iT/ix5G:7+|#OUd꾑7xcys.lL[%T*{#q1oORWF71G IINd(}q?jlHYi,b!BNJ1ע> ve'MB&POe;>R0YCT8 b3r&QBGP!)TLyQ`Rn$.!IC[>V̐P |)`*HzcXVݧT4kEtÆ C}׵t'#p /2 bԵNfGܮϥُmQQA`P [&ĉP{=b&^i) aQL (/x"O>3~ŚoKGzG' ahB E |/>/Ym;lNc~M%Ŏ>9>tn;gW }`c C tH 8p1ɦ&fkʙg'; AZ]?C!`+px:HThto?͌x1*觪>> T9_MZn\~09)+< Ygzl"*F1>R|&~O~9vH M6}W.u[|/!^Gir59X}i:N4\G c$$*o;U1鎑@؏xWhC}.!WiW-׻;>ѽ.6q㾚5mڴ߶ur9(N<üSEpUDuvp?}؁xؾ\2^=R w0+u ңwGyZhx) q$F7]RRԙ1?`CʹXםCٯgY1n3xG+V\gV'*~rf 99`I:MR߇+ۣZ}֩56zlc#ي?9(-dTdV;rO5҂*Ta!QwmyW`VXYB >xi?cI.Hie6M_/} ވ}qvi }/A̧J1,ӌ3X&% S!)<+03{3YN_X=N;mfQRr׀S3~W 5w+(ol2yi+hu]Q~l:].侘´~ ՉK/tRũ6\Ay3Cw@-0J=::}{1gP6C .oKԐ `=y<+W n?H+@h%7n>}>c:əӌ3Y9,\4:XI(\,OeYDuRſ1e`)\Ȳ@S-%m%]r/i ^+c'w{Kyk.SJ&}P٧|j1,BW:Lx-4avAuriU$);Rd߿ʉ$MMMiI7wޔSE=W=/lۓ&FBT|$UM_) ȠoauQF [U'_16 nbiq1C4oXO,zFҐ= `dS2ݫXVA>Vj=#!1'}ݓŤ1mZrF7 *EIZe`Cs:#\tXOZ~~UGRU*ʐy `,W &5x8L3IJ#FU=} IgwȧJbXo{^鹿_CgOp;ɌMl`#)ƪζ19VQU P,K|r8p+Y pY߯nY`,R>Uΰ# m@,3BMɾ,Gn&`UIEʏw|/bX3]ҩBU9$t^}Փ@hn){>]aȐ٧ʃeVZn) y@GuN⤇t@(xγ+*KWEۀX5򩲃jY.OAO|b2q9fo4-Ev JM4H2| 'gʶt fcaⳋ]&0TQfL544u5'e:0R$Z,Ps|9XDo5brH%g&K`Ql34`kE@!Π;,@OTїՋ:yR 1Q$ޢEzɰbvU8 b-͛7|\0+`M턃e5!{e|o| `ŧB޽;IA_T7ر#ݲe ?"cKZ2-y K^ָ*]ݴ$>d0ȲmC.O&rWWӟ~=Zf$ ]dMU)(t!O%**8`IC>O=Tl6_{Kd<ݮSSА5X!h0&jkoOaΝ좋.JjABnڴ)aZ^}ja ݲ^aSmHݾ}{25 'x" ԸX5Lw~@ WѠS1O'"F?}% &dʯ~$9`T+A$ٳ'X@.} G9'l܉aQ$RMA]v% l3d˗/OXuV}{/!ZVḋ`QX "wm}P}*>*F$} ېs  #{\逕:@gJ>IB pI%JV|c = % l OO!Hׯ_/X$rwG"u}*0Bp ) $'<^bERp޼yow+y Ě,#$ ), P+Oխ$gy&aL/2[`{;ߙ\Fx vZ+Te"<, IgUxqR4˗) #Ou!t饗N&"tƍ 0y"cF!1zG+AaNck֬I@i W\qErN Y:xV"vbVnF\ XLuˡyոJ/h2=s _yd_1;/42v#-r(BV'ʴ ?D: dUW]  tW'=\r>"b/[,1% R3Y+mTmUB@׋i!Y Sqp|[S`Zb LHA> YeDzXjCR3ZJ0W,ʲ 'uSM~Y1 0ZY'H[(d! %hݎlٹLt@JfUjwnkۖ"Nڕ¤dR&I~vUda٘/`V𭐥sI#h!  bB0*z?aX$50r x+E/VW|*q7atyX`QH" , }a-oy䚃6vj׿iWS$FՔؔitj 2\GM:[PbXImȒ\ʙD؇vcL^`XՂ,+BˌJcǎm'?ѦV 94kJ~>.aqݼ#{S?qh(ے)z<B)_Td^(`S(sdɒIY(F0 ,t*~޽{o;:!TMdˣuQM70y[]wݵi2VB\ ce"Qs M`ȐDTQPӶÇԧ>ݑ_V< Idšmf8gzHʶz(IgϞn-ި 3* Tt1+-gjt 6:^tȘ9SG8Ȭ 0145U^DUHTs=O;٧<Ŧ>/0rH=`mgT)g?&Ԫk> >mb>mJ"s?TY@utttn/Fڵ:WZ ml3,,zw`*G&+{`Lʱbd(0FЄUIX*Ov;~_ٌ:`%U[&S]G9*lX}%'mǤMGpp ^03~$h7BMTv֭"}GnVLѕ5V @Y㱓U XClVS]74ȈB2X\4423V?`qyTrQ^ҿۿ=nݺv*RYΟ21*S]wDfm_1X bŊU"]PL04 @ mҥ'اMS,,I7b{pnɲ2|*/˯sŦ.x*@BVQ8VqWb ӊt1 ިy3%P2}j rF:#RIs!ԿH*~eiKyY!g~gJxO|?я؝wyMt!J˗z9z(EB< l[X&ȫ>UY?7Gm\zVh[\aNHvxXg_)?oEoX8QDWX!-NC%m׮]S fźn?[h >J-ɧA__~* VuLJ7ZOeYB}Rpr[!ů^6 UP-~h۶mA @ :AQ.WO%OOv)tj)310VfL-L-d(/^0W͛On?S  M߾3r%cmYF5aaY- lF |w~weX ``^XL&e@S 9[re2)F:вIB ̊JRE䷚^#F {0 <:|'1&\V, &'զK¸&Wͧۡ~򓟴99PGbc]u:`i@Jg0-0a(xp[m bE*1j㍶vdt͕T&Fz$Sɠz-"\ KldjrT˔z/?4=eun+U902y5ל rАw 0x^&'j K/S5-OǪ>Z2syWQNܣ9S00M"q(L|]`zqZz#d4X4ɯ0 >Z\௿T"r8Z?Jq}cW-p/a]wu/~,kC /QeDI Pدp"a:) kW}*y#<z뭲*lMHLJm&֥+y0far[l%^,Lҗݛ''*NLȦ*DgX;W_ '7$#.p|Ĥt&0_+rcI`8VYP>UZaw[.T@`U6 *k]0??̮⊞8cxa\BT !뵪,NBiNb'!/y&L"j[ռ;*Ȧ2ex]_>Pr.62Wٳ]_iu0 mefEg4oq2b[&c4rI^z)5\Ġ~WBA+M DCXD+vJUST.V[Xe׾G?wCNH )ۋ!oʤnjeB[fI_Er:W_ 3W*_jU+cQBFȲ-ڸq#g~_jq)rv~H#O`:{I2&3;~x*R+0 S`QQf$UT M,LV@2İB|#°"ǶIڳgu+Vx3.y?X,d!jwJ_h*+i Ç',w +ɺ UE7/p7'2]0s )]2h!'@5W:jj@J SV}*OyY؞T3|{;k=֬YL~RjV+ z) 1Z+Bze&V2`zg,Y6pXr&϶m"yX,D VZYDڽ;c%guִ}g^B.L>3x[;P(˦=SI*FKֈŢg^Iȿ4{l eM.+*}\ 5 -YKH,i|Ƽy]y啫;5 .<3g\>mڴe uw;0ir*F?LhEHn0ׯ_ϾH"\V< XRLVjA?A}* h`UU5[qoy 1@ Ʉ"^Tv FMVTT 5 зw4<_d?U5 J'uOn;eW^_lKOWY٩fΟ?ٳ(^F !-ofeBg>[k"3csj Mp&42ЖJ(@y,ե[]5,PǪ `54jK7MlO'0?i ,h|X_#g(Są.{1o}+tŘ,d@Qٓꍼҍ⍺jʾLao +Ê|X5KǨL/-H +5Z8x`͛w; 9 qF6tg4Ԭs-^fzDC rzHgv=0*,v].ƮƘ_68+c`p"˭M$`]V6pH?X䡎Y5$2|'&&&jOS7*x/`*u`saOf咀*P54@ZHWO~dѳ>&Su, ` rX@`%e%c\^ T 4|o λRR\t@2V:I˨ۺA5 ǐëaXUM[$ _瞋XC=tR\CyŊ`hI=RK0ƫ$1_z-nJapM1,U. TI4E64`0H!>dL] :jicT&N@)4@`f2yA B)",0I߽ދeҲ) 1Mjn3 >yVc^]EKAd9dXT0HSHĆ hcT5ñ`в1D&;NV2F60C9AHя~a]veeJX}ߎ7nܘ[dkxAIFG׌i,l Nf`Lu,uO\T 3}L`U7 C eTPbQmǎ'X-l nGf*e\8#ɲQ6j7pC$ה e{Z@1}[|&\(uiXW!3V#TOê"b2Vf]M002'*'wG>VQJ8iuH165aƨޘ+}!wa1ΩS Le@>RϗU䟍ULuDyOǨXHC~}g䒭Z* r+ 7eHRxX &P~oذ!<$ +dշs0,߹d\e3m&J9e+y$Q̺j `ecVٓl eeP%@5 ,梁X(LÌW}<+X1l3Omecƙ1,]A>)`NjWgM(eJ0{ȿ:V>QeGzMKtaR`dhep /bVaH 1嗾{ d,,ʖwNQMxfW}v[r(󐄅2,2 [XpsT n2}Xm7*-ۑ#Gؖ-[f2"ftC"d"2y l:]9TѮN1+aZRTCߕ^ɮܧ0#rej̪TV60L rRM@ ,yx]vm?];@m7ͼY`wyUjfcf*ήDžWZ9|F%Mc~SkL >ȨA@yWĢ,&,&?H/`cɐ[̇@b>YG*Qȯѯ;bފ+nKե/1LlYhG-ԑ@`̔3 X *ߓ4VBJ?2/ a 4y`dH)hr c"(Xx:ooԑج ZmS64"d~ ͞t+j(|%L{Tb c'}$+D}h1)2dX 'O/b᳐ /g ~UUahjgA|F{k>d1MX.s]MuUULXdТӗhѢX%&<%d8b$03Q4(2U6o5ܙ+l Aئ4W5̓]Q@G]V`@ &I %1HLLK>eu5tuuF\ Xiؖ .Yl.s]S0a֝Iˡ'=*Q`De% rSN@[o5~GTJɧҁӗ6v+SuQ,u] 1Ѻek&Sc~#x'cEFy| qN; h:# 1؝w 2uE+;gӻ  4,DGsusulii>`խr%W<@%Cy YIT/'Բ0>I4=ؕk9R1bd[fo[bHQ瀩'Hymwi[Xoh@.&!i\Z擾S/rǥخ.2TRlof{. `&Se' LQRgWL#M9WM L+{=2Q#Kr]9Լ<LB*132q_uo,v +[} _T}\V=er@k&b'E`'3fq|1<-\tIE@/XFPK#-]^K2f(x:F5f:0&_sKH*Ҙ RDfH5" 2ij9YY2|1[-(^fbem) c̞0nZlv_KTlWgmtYʶNb,m'2@˒;ETC+|RҚ4շr1Ľthhlod * ޏy΢Pi1j\l.-Cc}<<"Y0̫߄즼+ݧUkɌU]S\ʇM+_g#ioC~2syIF2P, ayeS4*cV5]{OEL~BqUTM_cZyTȨ/C"-mKRF,}F(k2TRG,, sS^91c aV)@4W02]l%dRtMrUY+l3'UiJ˴fƘڐQPF:kcr<-I3i+l 7 ǔfɡ=ôy Xu65OLu D#ePli\ ŚR4|䦏wöB*L,ydy,@ڌv[ޕ\F]V ]W礠autj.?f$\Y[,m(dDp106TIViECA˕nU2meXI-W)$'q3 k!lR.-HKkRlc23$V`V-ץ˵2Xrl*Ļy)(kd@l.#y &5" ҌRڎhlk{byٶ !oB>5LUzZ0DUԱj \k'[e4ҕݟF^斅^?f* *+} gRe"pK6 NZJK+-$ Ri_FFER>#&6K0 >SnVVa1+P"NkPbg[Z7+3[ZɣXAۄ1w5_ɟo,5j +it:Lb[UyH˴V,T% 8 f>L7yL1ɫ`vPê4""1RU>#4i&zi"F-ӂY,9di@3k R>yaSpt5}dK2}@Rox<AbyJʼ@*oK]$K;]G^2!qQ\W-%}F OsM2j,]W[GL33]Ny 6.ga\X&9ȼ1c]6jC\4|ؖm,79}Y,yeיwM4}%to9RtJlRTAV.Ъ$Xa2e{l4[S~J6U ɲ>KC0NY x+#Cm} *ze.iV*dJ1HBٖdB$NBaiR0B~9֭JAe)z<|֞ԁnPW.F H& F{K-WTaa=4QUiM22´/"U#d2K/`̽T J'[ 89i2YV6]& NiǁiYhEːܧR0bhEM[2K, q m }eg4AZy['t0l3wk2hl._%@X Y)Vж.İ%1,]zhu[}J/`CYea6 sȨeV -:WVV b̼nըX]*y2+֯F{7++)XX u\BbC<ޘX^Y~&@EELP.`~ɢ!+5JÖBee \BWn^eJ$Ee++6 j*`(|-BbW-r|@#%]ҒE&Vf1m %LޕX^uJKu}r|- *.WrliK@:2џ/`KjJK' (s=yd*F3CF-|&aYL Nx0+X1w0bQw-!:Ǖ/0!-󖕾cCG1-fr)$- p-ʬ I4. \LO,41'~k! ufmΫjk$@A}FM9bq[sX+c̽4aZ+0(,+bXƢޟ# :0 .rUIgiضնx"El+}VQPI˴/b̼}l)jİ(z?D5C%e\2fZ xSm 8c 2`b6ObgEEs'$O, ]& &q1/bUX[Q!]`*Wm-{(L^[Gb2(GE1[ꑥ6(F\py}4E~y.yZX/,B!EZkP`QPtEe, :J2)((J=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( c{#IENDB`openscad-2019.05/icons/prefs3DView.png0000644000076500000240000001166513402025764020075 0ustar kintelstaff00000000000000PNG  IHDR@@iqsRGBbKGD pHYs  tIME&v5IDATx[y]W}ze<^b88FaIMq $.,M[@ T$Bm A?Җ P NB8! vxf}G]YBOJ^]4{u}`4`Ҡ`K͏݁w3`o% sk.BF\(нNu hCSF2vX+Jp 0L-( JRPDg/mӀ7 XÂ3fƍ;}뉤 K-%3Ep(ap7}yvk#omd`@p߼ .'CHK\![</DJ$ їqXiMƒRR@ htӽ6RFy=`M?:iyx[Hv?t X)kXZmM-_7nxe(ԀR aaev2l\62t6+,Y롍1Z{(`á&.ֽ am @,K ĢQt ~_A6/Q1B{?U>?dR 0w*T4s5q%KᬃYatz pjH*d,pN? W3(,`׼*3w@s]?`s?_X9r:X纠y5QИR# $hC= <`p! xS&t#p|;Az;Kuw] mw,`zHr e\ Z,-$? E Vu[ADo6W:2" C+^;gJR\>ozBx1>76su"`p \`CH &v BMz?9rRBg*34ÓX1h- J/7+ӤX~vE&4dO|@ XâeK +}>A0xLs8"~5Pl:AΥo>797+o<3iv绱|?]Ǧ{%ou1;?m<u=]M'N[XhxK8 6I#Jw۷aU$b,p5fHS'e<3K\f[ ;yRwݭyZk6XYa{莬kAեN2#(\ Bj b=7) IQ8:`,E_ZwIP6X--~ 2<8pʴ/ s1uGZ{n|V!R~W $뫅!S0H[\$_# i;/xBٹ,;`$ , 7ż|њ5[&A)j3߻[:*L--}۷ֱ3}kY*|W)M^G8q6>tԀW -H\fvK!`.5%c5hFa P*XQt];Rօ](d !9 ʒ7]sn4$E"%C$Ÿ<@([]pAhOk&aGj8!n{xB0y*> )(#HRӗ9A3/ túzL9DCc+$gAp >T#܂sBIW=+fcBE}pؚ)#1Gu!XI(j]Wt$m|抮cI^iTS2,P EW ~,!5X@cQpNѧݣ! 0iHc6qӎ%;(3xXU3-BPj*^,,B,#3Dq`En$̷փ(%R j1 ϶(4,K+('E'@-8x\޴"S*sL٢;dYw],CCj(P %2A0z PuK;7 !9dQGoxhb>ۢ`n!/s J,;-<,!2H#tbL iIDqk,p ND4w +;+l/kSYKqjZl?㹪Q0F0 f ȌEfr-8zcttݍMYʐՖ 1:pppD!!>HyBp֐(5uV&lk9g,)4m iY~),s1dIfђr iwnMB(ͣ"^cfQmhBف8"W}3p }! 1D@("`5Q~۳"I;Lm`O QE"e2KBafO-渳s&}nߞ 4QQbkynߗdR7]IQHRٓ/PF7BC+V 9W|^m"4Ooډл| $g<995N{@Ys#)ކk!2 (oOLzOc?p86>8q8\ry^@a'@(# 8*uW[J2ˊrWVB 9|wRC&n~۷x(Gd_PV$H_) '==e^Y( ˮY諶]mHNIQNxB)%^/);+`gӉ}؊AY(ɥ/9cOԩf Oē@isHAW -]=h}Y5AP/{Ϸ3Ѻei4O<8Ix}K'y L qq # KxtK^~@?mEoǑt}Da0_Gă=$5H2[\YJwzqufhO 0:EPa3,ՓSԭ7w)}8wXqλ̍Ԇ^?n=&V#ސ/8IA;c )/="! UĵUe%y ;ǶvUv6+?yJkj&, Aȁ",Q9T}~omO _Q_L߽:5Nh^%R@SҎÀ!sULEk[_޾ U)e띳L߿GZgZOv7<*6D0֣) AslW/{khRņ[ VȥQI/5@TJ:HB € C_9K o}ZYA@ ~v\lv]lj k5ЦuIENDB`openscad-2019.05/icons/prefsAdvanced.png0000644000076500000240000000625313402025764020476 0ustar kintelstaff00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME&8)v +IDATXÅWil]y=s.ݷ?|7I(˲(Ѳ$ b)v]MT0E[aMHb viĶJMm$Z(Y;qߙZV;s9a|#dڵ>q``toYvRukxCe0}}OrIiW>{o, {9?Xclt  [_VS4& %@#77'a<CC"0 B%E ե!f2Ҫy@l_^SUDm~ ҡCֶwݺ _ydyDt~: j20zoZN0]]VikhmZZ>/DĘsg_#r\Ot4;P4KbilR5T PD 隴Z p'N]±Ç4 ~re @Ν75DzdʕTdӫ5 H$㨬(#.X˗G0s@U c b㗷;Qb4ֶlYȿ7%k؁sߒ.n-U_\95x7 S'yl{)>s݉W3ݷj\nd%E),dU9qƢ׵4Z {J2\U&/o_J泋H$#E /';7X#O9@6nOd9ƞmj,ǂ!"+UU~c;Ǩ>a櫯*WU"%:!x(J.?;Z0T=14\̵P(dDB}}5i-khj~g!V|ݓ=U$YN"umg:x~615vulttʨA]Һ(2!hLO?мdhbt`~ 'sP8/y+υuxgp=xa8z( KyR?9tr0Cs$I$wTVW&Q^Y HS^Wַ\fͣby2  $IP$QF.;8|Bqx!>zԛ%t6ssnzZȶb-J- {|53x<ث?m݆lj/@A+*A R2JkP5 'y% l*%}U⡠X1(qԑPC :%Fe pA(>96/ZԍR VI1$JsO3\ݓ=rv G '. ( >;sB濗5i-Q$Ξ>ɱڭ%, *yZ>E}Ers.h(þAXuCJ"+,866vfݙAȆx @@r@p\}д,Q ~*cZ n\:PH 0&n3p;(f޹N/UU5vp{'d  szub-IENDB`openscad-2019.05/icons/prefsEditor.png0000644000076500000240000000357113402025764020217 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  +IDATX VYo[U:u_o!鞥iJQZ"&aE @gT*!EEj>D4[[д ӄIpoi6gs{m7ix}̙sz\FFFTOgɧp>11?7dDJPh=1X ׯ~}8kyj^Źž6+bKKKv:OamSӛYV޼& @%DYa@H!ϫL0*LZpDT^yX,_hη,y`wX9z^@f h~&*o%s5&3D*a^%r$cVV24WVF0ى__MMNjky#m?}S- %t4A!D1R@ԺZaE?LP\x99z{f1ѻ$Vn<յ*gf>.Ov/Px,A NjYJXKN`tq! HqneAyoVJ3F^< Y)&CcGN) r.)8_n^"l )4Y%#h>25|K),Q;޲цW YV :_U)r-k9#j4e1| 2xGV+a*?j*;tuuJt =ךD[u lv;EWJA*o:-hmmݰL(\N>₊2fX`w~1m4tͨ`) Fw\0p4`%]%ܟgYr /(y\( mB[S5 SE5ɮ$ 1hwra#l6.=i*jg~%_uߋi:I _I3g޻xS,V vvJMߑM V Q(~P5R 8ucTr +=6~͓#r=|Bx>sDbKGDIDAThytUǝUu/WAL;=3ݙIKRGVHЉ'ΐI>>YҴ0l ӓ{woUB"lθgQ{oU}~WRK?OBR!'!!~ѤXS=r7=ظ+EIq )/1!eIPzZJ7~\.2H%w/_{5¢"2}LnGogFZ8~lOH"6mtJພw:`CpdFuuŻUϐxdʴ(.-#y"}hnj6PO6>ԕg^H~Æ_H/RrR )%8X`TMcT[?E!J-҉n_s.`CnϧSp^JevsB4MH)al6f͜h*Auh+Ʈ\b$ ktxSQت%P݆@0tzeSsߨyɟޭe}Sa[?BS굘:e*7,eYA8FYY!v(,,`B.HJm@Ww  qɹfsO.M#0W##%O@>idG(H&PUEEECQ 8+]rp8O[{|G1 Z hr f]^Vz,EQPPP X0w:EN(>>y;'&RccàͩS)_xQJH$ p%u`i(,A7,8vyNz!%xxMx'amBnJ-m=EBSx֐(clV?L2~t~gʯY1xNcɘTZh^}8sa颹PBΛⅈE5-j5 !lP(TPd:m2|XeKr:B/[4s녢(0-;vtK.ݸqO%x/o''pG>>B7W"ۭA7cXR1sb10v(˻.SZݟ*𲪆˗´R,(ςϥ'ӝNHrd9)hFż0x.pݙ=8N'TUa$YV>\mS1Um |yV^p~i#OJ0K,]<6?}l\,?. T h8XMӱfc4-흺:zC`ebt՛@,@WǵP 4>;= &SrɒeIJ,x<UUp8 a`fA4b1noD<{?1/׶\S!N-+ԖV̢=Q480-H8eqDN >y'lDqq ri(-eAwp`„ ŶI bv絮_Ϛ5KQU}#[%ٶ@ 88BcP-a E7!7}t(>>dA4t: 02>dD^/lؗO^ݸT(hA?oU%EBuxm z8H (PEoda6)?1E[43RJi #{h GQɫ#TghLKt%9ۡ8N>TLw*v2縑Hq2TxP?/yJU5RTX-˂2,˂C^n>.]n_w^R|ŞO'U55͌mU|38} 4\' H-?q| 9A5;|ΞdAS5ӺaO 3ęM4 28LFD#|6n=էԶB~bT̛=~4\. n mע8Q~0LsNp:t9I{- :Ү cD}J6u:DF݇#;Gn/}k6➀OZPE麚98=$ B5dthơ#GalAh~vME]eܝQJW.Sʧ gքUU3ZrzE:|Pr\~ӯ|ڿIsGCiQL|J)ÀacW;5;y 9 #` Bavs<X5m'7RJ|'a``stjM2KB3Gr!IUݷ >y?#*sy3OA)w]Sq)$s*N7pĔUު~r&N{nçcHP. MgN'5kx:WYa~\8o*)@"l,lտǥK]]Pt7B~.gyo_ߨsiZBK+WBIq)(PU̦F*5xS4\.\ G~N3zC.j0 s#y(II;>ְmˌ)/\ ED"x]0 aǾ{y pϓSO=e)>(Њ :$Y^lRƤ|'&QVƩ=ر "]m Lujx\Ndx)POn`M/rnm`/:x ̄MD{{;ZZZڊ3g JcQb[8(?z1!ρNL.p]ر ^si#VN݁l7\$K{m\ƲEww' aѢEXx18:;;t8)q?:EJ07G|n&;1)߉/C4s`;$aCƉL ǃ/ IO/2ȱqi^!xތ8:sx^F@s ڃbrՖ$OH` E.\ߊp4 sp.Jt7QlBt%8m~m!ն.`4 %2F:bB@UU*( ^@̒7l+JB=ϐ钜i 3e"iڡ:|.]a$<t\*B|(=^}o^|/+X EQ=ʂC]]%L@ч!(dđ]Dsi- 0 DsjNH ?ۍ$^"@wc_8>.!1$t @##n'H$OG0Ayy9ˑH$#Gq˴rU3UK}) )!T40} LwA> #hطBС^d6 3e(#G64˲Ç;o3=+²8 vAn:I #ёǾu!x |.|4HIa D 0QHB! EUQAWW:;]:R 6FKGNN lh c},^pT8:q]Ux-Zx, ϾWNPY1~ rt>V7w,!XoFX'Vr4\4NLH )x{E.5Jj5#{#;58suon%#$bM@m=9L +ޒ:cT(FX73hwrr:P(=<$GJp431FCf7kX0Z Z IENDB`openscad-2019.05/icons/prefsInput.png0000644000076500000240000010151213402025764020062 0ustar kintelstaff00000000000000PNG  IHDR,,y}usBIT|d pHYsVV1tEXtSoftwarewww.inkscape.org<tEXtTitletango desktop peripheralsŭtEXtAuthorwarszawianka K0tEXtDescription"Desktop peripherals" icon from Tango Project \n

\nSince version 0.8.90 Tango Project icons are Public Domain: Tango Project FAQ Q!tEXtCreation Time2010-03-29T09:06:37 UTUtEXtSourcehttps://openclipart.org/detail/35425/tango-desktop-peripherals-by-warszawiankaFXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/OIDATxř6Z}&J3f#AAH%1eڻ}bM]~cpw׾}1kmlBBBi4Qx[>IA{t/X$TAYtif„ L޻|.>r.ɿۿ4660`@U/'Nd 9RIE] bskРAV_җY+O>!}}}L&4Fz*++{غӧOTUUjaʰRIOW3if )Yb~ڗa@ ,VVMM gY)` +T+VT޽{ ь=5U})Le0,ƪzrWWg[ zFseO4TRU^xA 2&5M#Xe lU *! @u7U S0Tb'|j6e*0&73`j9+O u 2 2BEӧRIſ@d4y3 8cQ^P c-x8q"ҷ~y[-%vfaDzMeִX6ǶYS]]7>_߁:?Owo>0`(cSJ z>:͖صĮ+QFzTlb_&P,K-fŽ΀#XmVǞc!w;dJV*7xktAwAKf\aQ:0ɿɣ}w5 MQٗpm\`?2bĈ# ,Mz|=52$HNkF8L=Q]o6)ao6 ܺPOO7iW=MD{"#F '[n#oHPggg!eXG8dF=}OS2c 0 ̙3:_(sَ`_2{Rٗ̊$;l:2,0j}?pv|K_'&L%vd_7ZU]]}-2,l*J[ZZaÆ9#Gׯ_3^yJa~Iې#pMO8?mVs-6EΛ*Ͽ{OG}2eXV7c[ jGSNA @6j(] }1#G<8j"h}#*^Nn~,mťxw .ЂJSR9VS۟fwuN"fmKqUl,Lj(F^f:k`[7mg<~6llLۨrث2@ȡCCi'RJ@P2 )C=7 \>쐛7ܐ k|_crk-y10^__G^RW7P V],_~w X ړ'Oh1Ee][}]6{!;=]wvIfg=P;F^xE8Ȳi$L*<>8VTUJ Y' jQ)S*ȑdu^zGRQf͚;@Q*\)&[V}\׋/XÀtwsO/fmܹW6?Ŧd ?. {])`(ȭ^^RvJiu)jrmV={qI U!k`XYrjrOQSJH>Od4[رتuy~Aaf6)/JglfSS)lQm{}oٝGE>^"˖-'YkTK+9r~␚7B=lD)e֬Yppm]6}^%o$k Oq\{ Xɂ%@Bfܾmݺu7w ػg9s&ˋګ9C!qKmXɪd *VUq%87􀻭HWg^? #Ǔ&M"dS:tknb/|ae\2de@J0+V{IlȸϮsm^ٶm7boM}EA$ L&Ī1U̬b/wy>$OȡͿ Ȑ!CP'>;{'7O/v0+bf;|*"[Q>v%uO)`% ^yJfV=Isv'#<"/===|B{61CH#7_MϬf b}fVuo!,;1vՖH_mE U|hmoIU-e w"峟kJ {lĦmoҤǺ7jm=k_fORQQqdUe3Y,SfbT- [v>vS)hj0kn,z/3eS2Xuuu^eL&Mz,qSKB%e7z?*mmmnZ3Gfl6~W;ɩSFg;澸]R*w J/cVױ~>"S7Ij/vb7Z_|d߾^_v>S{T__eVNUW[ZZ6Mj =5L"+˨dd& !R:AW^G&7*x)n&/Ln@˿ͪцdMSWc=s:F[mm kc(6_)4r>VSx n-1eW{\WT%IMe blO^uY}},ƍ<ߚ/ߛ~b*FznRo X1X}\ "?O0;&1Ǐ7oA˒Y^C6eؿG>hCR0aiԓePb+jjj~p-8rhvfi$ݶÇ7CZC߱S&6ӟ.2d% 4'[Ԧ*EСClJY]]]?WMzqLe*}c˃w٧O: Ƃ:L(v:iO{.P_}-r)y>|ûlS~o$a Xeu8(5,cTǎ{-ʹ+ZG*XA.\@Mq]ǰ/€6ؾ.>u/7?aEO0v UACU!Xs)X  Vbw?_+L[0p2IL? Aos dlK8O7:h3gK/ؗq]:|6(%aR*3w3$`Y6pߺuO0Kn*:B 2ɤIɼyfSj+}]*;Ɠ7saR"% (d~!ȳIF; ~,(k8_*ECCՓCQl=*aۋVwY3g8J< -$ݶ:a|EɬjCM Oխ=zg5Yqp⠷cNk% /S`رf9yds3+<!%g"s.mxҥ)`0=l)䶒G{t<49s."A+xNw6q8 o~/- ԼbZ] fo\a+-\׵^cj祀&T]˽޻-tQFLX+ϸJqu4%H?N{rHK&4770SΘ>^7xF5cl𒸟x:JXD~afVT-?,iٜh cu PQUnq3H!%Jڝ@c4I,>= s5+/'M#>n0жɓ'J,/e$-6ϦQcǎ 2)tyo4۠?i E@#ot9U,eWٗ{{wW-]y.p0J2uꅾٔnd۶]?L;}  Vz J(?O^Ah1G(8rPetE.ubJVI?lEguHtG+r)+'Ow֬K6F3afoݱ4b4Ԥ VsYnEܾYV+\TCV]LBuX 2\t ry` l1hP=2e"81Lady5֡P;dKyZpVj&a%,=\{C. }ǹXcC6Eˆ+3ӊ19Taʀe1b*K{hUMzeX/t+N?M>G;~uキtt03R!Jj"Dmmml~0eX p&{Ŗy]w"`P  dh5*/'Ӳb8LxjG-E**+IeU%YS)A|mYP&+!ÇcmdS zڸqٿߜv„q z ƪ3<3=H.UdU/D<FzKC֣a=BZ}dYQQC*+*::MjQycۼ MMyΝr#=\v@גmMD)`%Q,럈!ywygĶڰ=A+._M?2`𵢢`/8d&7z&4f(2rdSΎv_hkk'kךs[^u=mXY̨ٺu{o1`(V]0R Ʀ.X+/3_+[RUjvVebW; Ff} Ir ' sw,Ƣ4PJ@q~}9 pQcU'QZ>9~zW gX__V)}>En_{N`e16K+eZŞ)(S љ{H$≠} }NR#?9t _8thCQu`zr1&MO.8?z,ݩvOr ϭǏN;l U30E b[}βh1aeHG($ڃ lGSQeeO]lt 6#n۱(鄦q۰R=[ٗ4yj#`,dgR62ep1$ FP Q*a X9SO0VMMu XOL W," kُ5 i%f~D S^YKh vS0vU龰g~e#󮻊TWlM&k-᜷a=spܼ=I2@5TWU{a_?%ٲ"O”)eriegWsD䏯Az¢p6|㇦D5ؿƌp@+Yn7o.MSs>MV|_ 2%ynUj45 C,^"p#uE.ʰ-HBd|X`X&ّyH5̿Lݺ)^,(k`5`@-?~fXp ]fmz{9:dpJ(stdޏ +ɰj+" V`[QN W_˧F')^E BGGGVǎ'+Wot žW^qi`*!R kҥ/^|*3P2ª4P*ܖ/^ZLC:ӎҠ"˝d<V^s2/L2)#&\w;I z0;UO99ȸqcSMNꊬ9RxNӧ×ꥤoʅŇ-CXQ=z=ycp&gFH c;3 c y *f7m%'N3yqhȎOyb=1–/_WCu25Λ '4oРGAE%L+>\b~_Kh4V$%`XHgx[pXL =wv؛&NQ 0d ]ƔɌSKsy\oop sue%xs}?r34e$%۷QA!Hbs`5T:yhk$& v,MF$T u~]h"i74U6*hOXvMm (,s0GQAXA xٔ:bD#{ qyl@ZC2Ĥo.I60 hY0`y}Pk!]V92v(MV9Z Vp.<*4'˰T8.U q;Jqr[C/<-h#Je4ٖNz uR-[1@jxqpc`kؑR1T9EL.1@ݘU350~aʩXsq5.S a/QTǓOeF3ȑ͹FJ`Da/cW֒qcG%5QDС4vXZB0葁X⎡1",Ujgjc>0hpu. NrR ֟Yy XQdGfΜmP &}O~u4S gn.2NUU - 6xgR! 'ד~>IZZvK6OJd^U I p ]bh `k\u*EP* mmmbsV%\t)z>5 OkpX@#AcE'^~*~0Q]~֋`%2/p*u#{`f`5Ƣ%SMOT X1n8`1uŘW+oQ&/fvL H<fGgı5$y5a Q #\Og=9,|̀5YNM$V4qj+Tih  fw8Q4s.SJ%%ZTc隩 `x68ݮegñ4|XSP[%RCZ[`%u0ܠB0a,;F)v|V䉓l:a-L@뺺T%LR6,3fzE;lci`c)Ns@3 Yz3+/»9c*nSg ^='ÊizM35d=B #U̪`EH#rΫb"28 X ٻ/!/u0Lva9LySUGbV24&Q\h G*CΗ8^ryO9jhd^;ۤe$8V f0ZhP_חuƝU &Nǧ50 ^tim֗%$, ,@EK 򅒿hosr :i&SbTe6l(iV2{4RZ'L)usdР:mlM֭Æ %Ӧ^s.׾b 2Lm"N#mFдGn͏pW XQ:e/c:u zgj/D*NFx:U׺;U0G+T9t'6Bre^R)cLuHN˺ A'1@=orц=+U S>3olVTBe MbY-{UG Ɠ+<@*=ܗA=/xf$]4ۥnFNh*`R A@9N*>ayNЂctٔV< `e`e ذFx]EcKx{fюj{dmFA,ggWΠ0,T?0,;qOi|JrT9e xS\ﳰ3_O,ƤPTa[1ɸ!dРAc +&d2/wraKf%P^ƸToUдz%RñwsNM߼vl6a3R`RmjIni* @qYܟ/97u2f WS (:,wczZ`u5̀ Ve2\S7tXT4sY]pfCrbld̘QE| . pWm-R\+n5e 1]si820!9:pƌWɲ^0Sh2MKd] ]Ýh`#~C`VN) p[r(]{%T?'P\͑ 0XTBlSr.OsZy]j";cF>+_1C_ll*F<%+]m̎`uqPP8b=!vӻ:(FmcBCr3 ܜjWxu7KǩVY,GnwB*?|&ʨ8ԠC)zIT󸫃yWVp$Se+xhSuD__ .EG$ sIKxIOu`r&2!/;Ys/kTQb^\`gbK| ?M|g/}*:9cWG#oWɓ&+,!wr=89U('h9jbua?: S ]3(]ϨK/@<"@OPb* $^DXXUlݶ9l.RJp,NgPwjmAUfϚA.30,ˀB)bsd}\wK6)^Y3feiV XNp1_LJԛe-ΔР@EHcBm0~pSru๾vFr: 6uUΛU!k`:p*QTq6L˄cNnuX8q<*++ hbUҜY :&q&dS[ñ4O)TH,ڜ|.ȩ>TrV~] X;3<'lD%p&L q DXaxW9g?{tvv 2̙IƎ;du IoHwRV4&f(s5uaRJ$fE: c$G& k\ʾ&l2|i XfY,:C+XAů&#P ٵ{fW)ٸq'@t0(C}/uuWIg@fiAr|#_XϺ qȢb%:Pmr^-ڪZcÆ =zX~O,֏{kn單054`P@3|ayds3ihKu%*\pi6Ƀ'aFePS|L`}6_F܂> `gϲI 5@+*yAK.d/|'X95,sՖCr]e*2f*WeT2;5jG M)UPrkix!OfUNOrdڵH6 XyE`pKqK*2mܯ!JC3Q`2 ~lT0*wJخ;*i744yN+ƲR2:6%{c!4`8L..#X"*a9Q T@ɖ;6̛7,x-.rڬ׸ʴ _@%|"9V6d:V-UcJr|@.cI iD Pc;h 9"`@KNG `߆=)SFU\UK `?;v?i$s%١~^&2nhRW_Gxel\IH!^| [sD0WNR@fX9б:S-ؔp]:Nj eRTvGȌ Q|[}]9~4dWn %&=z? 28ڢ,5Lg`a% LEɩ`y:}̜93555( ^bds +چ\X6KU0] T*G F&ҋB_ޓ>pىhzY<e+GZT 3R<(n?,FAxgy% XՉZ*B}` @c=X{mFܳgbBy`CC=ٺu;inAƍT9d&) ;/ 5rqSf%Pqwn#eP,)9t(sPnI}Ɩ?1 NwbN>R*br2L%3fpVRE;-ښjDCƍyGp\Ehx&W*Rlu܈mrV>v\+g@ȁE󬈃9 yrJr6#Ģ 'g5J*bj0eX*&:}. `qbJ&4@' D.؅rǍEVYR[['Hee~¾ct&K8l&Kx["yPdaf[/Pyr:wBúL@2ܬ ;o-ɏ f3}yf' W, uP= ]E)Tp5$Y*N6]X4 fX 0ِ RwMD,${| 8-pp:Lw+kGFTɩm4cgcmP< ; R*K 9vs?UVdHbDW\Wέ+[/eIL VDN3pJUQ> 2 Ӕa~Re6,-`R\Ol$/WrCy6Pg\2;>zmw2,왜z)edBn#Xž0)a\QQS2WVVq :J+A(`WQҙ>¤Oee?{hOO׿=g;l%~d Tggg/˶2P梆dh,jPc1>€̩_GpisTQ^+,ij>>iX)Sj `%²y*9lece XIijp#ؕ X xn0 5 `&7Gr9Huww;;|0yy$k{뭷vw1?oa۷mZ- [lFU|4<,"6G3 *g0mG c(ͺ Tj|oT+}>ǰ*XX_U.-ؕ{M+W]]QlXϯWAxvyqz{{`C9U(Dx;()(4 AMsTLIxc|~œ=3PHegHU(rAFuPRȎ)4J u\9U ΀B`6f r{fDʣ` gYLewRceR C`P9I˵_XܲhȬ}kւ X9U02=k0q C1a/XI_ΈtYHӟ>CfΘALBFkv8+}!P|@%],,Yy5,k۾2 %GSO%0+R$o\>7M;گO vRe@TǞ4@=,9uUVatm[RWWj`WFuFM7T-b )GiȂ,Ր!Cȑ#yʣGA ۙloIlҤ df-:*~rZMո854%?rG Aw91l'PtY*瑍ZG@rA+-%fܞpd۔,IeQRm*ĉs25@3-1 fi$nRٓH'ĥ ^#~D8_uS>#Ӧ^Hf͚I.<+JǝkJVߜ,BNd24Qj: {&,߿޽|]tIno>1cxHhl\s.M.ZV`G18`RJsAdK[h4FG1zxyuUZyҌG/RMFda;;`eaۂOk#<ZeXK,Aރ >cǒ ./> <---Q\|$dBn~;rH;<𶷷ضlA0% Ɨ^2̽ 2nܸ#cޡ$lT]S L'[Vy㶒|J>KSAŒ?`1a G\&,ר,|,)< ʓa1tO mƌK.!'N$Cu٣\I986:lUH׭[&=as0a30VիW Q0qrҋ5>]IP+ Z9"Τ:7['h>U,FQv+B v+Jj)>WFaRU=r֦`umMfpm5\C*`Mx^yaZre~=ؕ8@HBF8XV"'bLslD2>M.*Ⱦ`Qlr饗e@*!۷G2jC,kذa|l޼L6-at&@馛n 5e˖3wZN/_Ana>C76\A۬H{p>K4J9i:b*#Yw[|}3e|8VF2rߖQe w-SPZdyt r#nx>"ׯϯ={;s_@7S~:2x|0}<0# ߓm۶W\WK @UC&Wc6]yR+r*-㸅h KVC8Yn\QOTG dFZɶZ)ZٯJ^$`Ռ2lqDy}q PUIƊ3, sƅ@XN֎;ׅQCS6k,>}+7|S_6'̗?@*ZUq{ކuqFtD-X̪D|-r;Zf4IVgd!9UmÃڟ秉+|#`EȌhi0za~kĈs`w}1aNؾh67B`p{o~nrm?1y IR)X|n,۫mU-WeKoF8<.gò 6WG Mv+3ٲZlY -B΄ӖJXz]lvwtF @ KAZ/:y>ЕRN /#~,W\UR{Îl9plS1.|m0mI8:ۗl w#yDy? ?cA*NruAHtͧC6w9rdI̪~e;ذz9p9L]Zj7+Y?Z/Xaا>яjs@cQ9jl|0˝vF_p`@! pY`tbP@~^8w~^:yW!]z /pT| %09 5bHw!OՊ5R?W?gi^Ct(e[<Xht}P8l`l±Z=yk. `vmً @~7dt"nojz,(Ou0 X!M_py/ hbL`cT>y=?O\t{~ŗȽ zhxe emD*n ɥEde'Wҽ"8EkQT+XbZ:9. ` nW_M>{my}mOXqÁ'1pYP CdcX9XW;):vLj$zX*$ۘ&&l,!NbpI l[:s>}k[bϔ(Hgz47cvHt~]o2z]6ey q0ফ&X9ʞ{tۦU}Z}) L{Ć}Xl* byU:~NaA eu2,, Mw(?0/Ꭱ3[<0QCh@UblfeV_@NH@׆lX UfN3 v7)K5ī#uFqQlBV jT-:(U Ŷ`|uJ -‘cm"]vq+nVbhŪp7zgLL%l%Ka0BNd~U Fu@7dJQ:ԔN00v#ĦT{_ ^û,y; *8Xz|(<"s1YcmG dXU(ۦlKYذn(ޔ(W6uYFE i4 J_*^v0Yɩrd U=2Zbc5vѢv*%hR`_Y~;܅ AU*։٬s`BC!~KfWHu (, ncqp撂-PU+Xٟx@Lw :uP,/H*X eP5(`#`^:eʲv 6n>sIw2*4ڕ'V>o0/`uuu]կJd :j^u4gΜd xƤ袋|1,*``%-S}z]h>Y`?˞b,q}ޏv"d*5ZMKơ؍\+\(w((l\W \ [#P ESKb ƘpkbDV^0g!3Dv ]&Mx[聪*4ȑ#0 ` +TWƚpr_PL'/AXBs2QwuwPd,0]ݳKX7n¢* Pv ^2w\~`ٷؠ@V*m݆~Ad}AmV:6oeXDr=C D N%/J¿ dB_|W!G6x׏ C{so B-Xg @E*N.%f?^1Tω . MJHTϪز#";trV,a՗mۖ! uļpoPvaWÇB-^aæ2$Kb[<ʵQD5*ݓ JjMdɒYl6dҩ%/SPjꏨ e֑ݻeWcx6AlQƹ7%b U:aka2b~GL\js4M8aݨ[)@$ BPj0@c^[B%k9H!ݲ`{pA``.z)KcX瑣 Z;իjdxH*9q=iLU%+H6Q!<|O<^ٯr[a СCd?.? :<&LZtu:d5T} zi߾}^6˃o,`k,dq&U9٫ fu98s0yB:z wU%W~ʾޡT|/BMб j+UDbqq8g ~= YBq_A@K.%S/ɂB1k׮`>rH=l 66Wc-!=0R҂`Xc4kɒ%0\@d.tp:1 dW FepT@%F?ʘք óuqƍ<)e(,_ 68ڎ}%Rg Pm VCkмJMUK&wHnf͚7-ᙎmtX` )p0 v,ӧOg PWdU+aDV[K1vٳ dUq۫t[;ݥaU%Kfi:uPns.>{٢9+pDaP `b]`]K0?۸pX`RM*`X3ySB0}gعˌUV26Ts|VOt+aU PGt00mr&v^5?/ vǖeثp/ XˏM!Pȇ,7|?>}h%X:+\TBa'H7 o ?'tn5dE"|Ŋk/`aE &owh醍+t7O8(밁3TYU *Kk]K'cEaɠы{0 ئtj_UЏ,L™S^UIV$^` !^-7?9d}yTOFh^O JpX҄pG k3Oz". L :=Qng6B@\`E-ˮ]@K?;@F*zM!ՙV'X5D~`hQ t 2`P?yܝ܏*'>2{e5SYH1` e{CK"AL@Eé%U5`:} Ҝ`W6QA\ljsG+/ˏDzN B ឨi+FwJUg2+ɇ87XB?>PW gQqUPubxl Ђ2ja"^QΤBܽ{oQm2F*5P%5Hmb*^u 0R |Z&=%z\(kC.]ZJhJ&]vQѡڑMJP Q[Q| r8֡" !~W \V e,;wXWH,۠2(bM1v91#G'.,p28Aܯ*w\-? +}A-z|enAo,YV:S]{_@!gHL+.1**dQlt`pqLe`qqsMv߿@eY^&@O2q?sXU:DvI63Tsd)hj;bGXU+ M1N`YȪ8>0b*:ug@bPR@)SeVQnY;j=tٻTK>?\柍t~%|]ƻ_P%/PLTfT0nZAPäkxkz>$--:] *2VsjS)yhqUЈ`UUQNf ^uN]1K;:6 oynf`\2JbW: (9:&5{ÄD|QgX`'ƍҠj6)Xp ":y'xmwG::$[Է bjޛ d͚5 XWF: Ze@ ZqeP3Z(j?T~#k/C/N_Q29y@Xσ@ltwus @:TǹJF˷:Nf,nՋ/G%tKEE#+T *T~b ]E0TêilhBl X(ꫯ** a@0: @!!"f +riJزx˪%-G?&@l]/&$K@ilPD"Ey.GmO5f]7ٳ'i.TW0.4dZqU1Uϥb5e!E}v, ? *8hU"ۉ @@;Lv.`~ 6}ZfQF}}Ru\D*P#~$&lW d]7ka#Ӑ~}zJ|-xA==h`  Oe5"NMKQ4 qWTaêc|nlT+cd | "xdI@^9 %Y vnv/ٴ&ƚ6lܸq;sמ|5(?5VU!hbɋ${=*e0l%lsa=[Q*a)cCN{NڱiӦ-+WHz61:G96:;;n߾`ka$+y}߉'` RʒMZeRa}xQ Ӊt*5Oud!gߜ^zi?[Ĵ3͚5kPssd bsI8e_ fȗ8%F ︝n 0sk띌qS;[[[;vyC͞*'`ԩ)$],F_r7_U~XU)TCKإE% !^c6HRUT~2,SPЀ!H S* V0BT6Xcp]!qV% \q0NZ֥CgJ'@)7PY,2F(Ve ^alWq?8/*Ƹ,Z *a:X\VQ(` X>8HU qI ˶8z*R|wPj>k58ԋ%L8٭*jX {V=\tikOEARUpT0-{V4`TJ`| j] {9 ,{X>U&Y| X]_ tq@E82H`QGլBFNi: L^H堠b2MR)`uttEfՆ%RiN:W(,?%dXqQJscXlYG(rW_T\:,jC<~Umgqme*y:djXhĘ[ @;U+0:QF=>>JښvT.ͫVG#ԡ!> X:~(l Q48Tè#(F>05iIR4lҥ\^ommՂuҢ^a$|KWX `<\x.V6">òe# j唺|}rbN^'Q93aUPKa[[)ݴRX_^4f ()5zQ)hE߀U5V%p_;H;gS}R)Kb1"䰰߿`SNݨ`Y*`Q ͠ =zTHӟ/> k_`Og{^)cAw{6%: 96[(C8++aa(k׮5~ˤrF1,cX1(ICl=BhxaS̜ + C;lwr1,ƍN6b8UU1"?%bJmO WIV1`R2v{Bq62vrF2,H__ߣ{ [#Tg͚5 m݋ %iXZߛ9_'oysC'6((pݹY>44֨o޽{_:\T5 ,y~.1ᇽst!C~Zi:|ك7J_%V(RPrիW7o:߳'NХ8ֵk"o!+ꢢv@.]XtZLv5WF$qWEowuu}jXhdd/7Fg,|ݺuO680IWoVX bF%L<сCM0Q <0|kU*ʵD`WWr/˗/=zg:DTu,qY KAI_hChU x,fIv[7ngs}Mɿ"VZ~D']S:=8P YkU N+a $ĿŅ Ǡ9rdPnZ[[s;GNQ05ef7xjHIr&T]UX}s9+JN6ݱc~CCU{-}QS @Ȇ-S(.BV( 07 V$ϟ?,4666%h;&`:+X|o ~Ah8hfW| " N^Tѧ RVbNPwiO嫸: kS7t(;h p^&5庆EldØSp\GrYJH(WejΝ;Dr_]U ׯ_A :gȷ e=\P X &>ׯ9>l+_Ϟ=_ZQT{ݻ;$ꌺ 䜹ބ8r]Ieӱ5*>~nDr퟇,`VY#|>?dɒ?:e0v]L"^bI\{1\ /VЏRS _m̵X}CaR |f߾}ߕ{^LS mڴIC \K~0(TFFF|Ǵ9ǏyPX1p4ٳ2@#"2l0$ 1] ,^/0f֓۸-cA*c^zzzfJ*Z>$zP+j6n-LFJ'΋T){L\r +85CVg%$@$O+ikklhi)"qWb~0AnrN'ΐ. rf/]J*3V^ۿ#uK=~flJT8$&V\c#GE" Ç Tango Project \n

\nSince version 0.8.90 Tango Project icons are Public Domain: Tango Project FAQ ^ !tEXtCreation Time2010-03-27T10:16:06jONtEXtSourcehttps://openclipart.org/detail/34555/tango-input-gaming-by-warszawiankaaXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/ IDATxy}7@'AD7 EM(@K֘aC#yvw<~y1"%#K[طXuQ4%X ###dk]ccOORͮ(R{D"1 _X5+/㽋xlrZ?>^E0Qu qС]`]5E5K)`ʕNLhdc,s؇xR)ZuƞvCEpQu0::9mbnۺ m4R `7 cmE xi>>7@\y'1/xtG[B4v!qXˀ^ 0 ˥HAa Z[HG?N,ME8w|,d]Occc6"x(Z.Mޭ=:>{uhKz-%BI3'DOto1C|BQW"Ի %׃DlA~j~?Y97!:Om`kO0/Qի nR>';6}YUyd֕i11hY e!6Dn, ^1/ &\ğ<\EѺ 汱ӕ2*%\$ls(zX OYXf7bO!V5Ԋ!> ԳH};}3CһOGs)H$a[vЯ9dcG1o>qQ`-n Ny>,[̢% ZSȼ+1?'^M/Fp3~&H(pR̴8k8~nY"H$;7EpPx'?JNYeo 2wΉ!Twja$H-P['Q&>MM#ҷ Z)b@<]KAwuxx:eR%X-H(2|!_kQ-1=wL)@`)h#%ᛆ[6 ;D&ru Le +vѱGzv||\'.===_)Υ7o^Bs F{3/}T1:ϵ+bji *eR4ea0?RB0UkDd 5%iD..pRSZfE7:ΔXYf 2Gtu u8KS:>߶cǎرcNEYX- !0nYFG4/>!54k?R(JZ5 e$nqw.84NZꋷ-f4[x'1b$4EdN\JfrH"JHU@7uwuTd,o5΃84MPJ1oƣE`IBz̦'r =o)QQ8JYa(_XC2,U3e'9 ܮe&;Ch,߅ -G(3)27u320ݾl[\\⟢ؽ@BY_od9ȯ+3rs`\\ЛafB! j61Aa:)M͔~Rf0rYj]QSh w%]6+՝[n [W^V>5cq` }qyfE VPV dIftOysh23bXFA%Vni--VÒc{_eXD϶ۺfe4Bm cz"tJT4ea):"ˊsz30)K3d!ifVZgbۙJ{ ixq9J_J}akD">22}DHǵE5B1 ٴ_c8 ֒5YP2TiL0+1ٛζ] )ݾsNKMՈ6l0K`K,Ir9iz$\lqrj^PRQlbiGꗔUJ'̦C^r,˖fݺb>J_S9nL6\. %X@ V N;B!y$CY+SSsi+nĘŇ*Xcgu~'2FIv+Kdur֕?$La|ܐ|ҤcEPb1L ||YQ`0GFp"Z(n̦>v( XYhumi"% E\( ϧҳyʷXώ8M2Dh,+Y%f=h){i=N(ViYl]9 EJBWL`!;cl1a(j Lh?D P5˄-Vs UZ/ւZYEVQ*kKrVk$xHؒϰ( *Kz3yFaKml˰Y/fRepS>cC)$ msȋSMd1Z]fr66333WUSZ#kES)o)ZTZ3NCo $xXE>p':fM`N{D`m-Gc }f3MKuʠhJZf#jKe3U+*Kzx9K%%I4 Qp IJ8p1UPTu8-K Pa(n0!+yEMBGgj(5&nXe{.榣@ŲatWjN>y'`oR(Z*P2;"!H(j(IW&T/kwZ+k rUrSR,9N\4(j!c8)>s"ҳ oM"d >xK.b+.\:FYDV `q` W٬EE9V%S!I ޟFZ0 mwSxJbS6Z[Lʲ6+5WVCs$i)܌c!(|EַuwyJDa g!٭JU1lk 6+ (_f+? `dwUw:+V}V,`9\;fBQlB`Ys*"&\L4fZZmlWVVb+NSys>%X-i?uJByl ]]f]}gVX="1CY[|eoO%MBbUj* zJFE-[x`p~_ ]xyAYWCn7%ح-܇}\mGm+6-ZWō^8K4n PBip>Obӏ!@/lMCȇ!h "Vc}CPfuMT-jV,.s"7N^ |)3iPVb(YY2$V敭yVeXW>~eΝ !9gDBw"siٷgE X< ei+3+)iKuk,(6 -4 q˧f&>3ˣS4ea(/p>x}0,B/ރ놋VW(D"ghҺVHB(Y]ᔶByU4%X-ʑ#G^<8 c:D*|"+ѶjEdEE4Y>h~,=euU!~0ٳo:0ge˖}ߋ$lavyr#MObmB%L$BnR)3gݰԜMA9h[L4  Dkc}sY|^PCJC V sÝn =HLҾnPe€pGH(B2'`մy ym-aDpy Q+-{.Gñ?M@5 [P(0?[[GAsbDXAeV﫲F$C[7ga0˘"M;bd4w& PVK/e9H(B8ObHڻK>p>۽{Oc͒$KfN ֽbCU`z g*Y؛-r+ ZH-0rlL"^kq2)c>wȑ_WʨJ/Ν;_#&:TH.fcX2 z-T}Z(PAD;K͂fg9!Bf0WsND-=8jvn '_1E$?`MC "ѣ M)|/q6`3<+fT%XNR$oCK#Uɪ[;YK,KPp)XL${ynpAe0+xeWCS4ˍ+ίQ%X_ u)NP[+yd!xica{ x[3\YZZ!P܏w_ ip:L_Ro;9U\`-b~xx8 ^q&ׅhr':%y`UBdm[Z5Z4Xri!g1{M\8^Ļ`. !g*E/R(cTqJ[3H^}x$Y.E塺;Z\'mCgfO0q.iPG7ĪQu 0>> ✛`ZI}}I,J$F UFS8[Z"++mCw9@5޻Qaօ{ں7B 5CCC x׭P[ᎃ hja9V@i IDATsMeZN@ v\rm$|mllO8zgEnvcllNسOWBQDߊ[A#{2-Q#h*@{DӔG}f#EQ5ѣG3<<|]ph"\k֬1x[t` աOC8EQ^}?lK7Μ9J_ַԼVea]9r4OQ!ȴ -ȪYuezg< },X.]2B`v  eK/բ@*P9bll/:EKg}?pwp@z"TR j[sV1JS;cؾ3>J Xf$uﷺ@ jt|EKf 1KQ% Kh`*x`)) /EKDL(R(-j*F[:ʲR(R8 P*j*A BhTPHTP!BYXJ!C %P"TP]$!JN(R8Ҭ%\ IJ2`)Z%b @ Bh!KXUKQh&J(P RTM3DL P"(R(R%R Ih )%X H(j*B5(,#J<AB5 U㧈V©`]<7zO>ٕPj^|K_1(UEE)|ull=h2QO|. |hidd$a!p7?կFGG0@Pp*D O>*)@pHcvGA[[6mڄohT/[34Bp,_|nlcldxx+eVPϓO>Rc۝% tMҥKJ ̛JRj~զiv bٲe /_~\_&sȑWݜ+EQy;/ Vp7x#eC:66a=188h~/~ ;v1-7u>[r7  ҥKqAzeB c IDс{,æMqF\pЦi7tsǎ2)E4MӰc`o.XRdY5`QJAi y LZ LbtRYBYqѿ%XM{=Jd@&Wh!\D"qw@FPuyPJx$DDe˖YO*".f'<p1۷oEYT#IyfקYb1%D`߾}뮻L FfffBe`hh4UVaٲe^~3 ӝ:!g !E?fW^En!p#q_5B<G8\>A4l߾wee42}z$i:ϣ]]](+VΟ?/@|[nx75BӺǥbeU>`cJ)t]7-2˅ {1B<722hv}jځͮKP4M0<1fl}/qO麎T*ӧOѣN}{ϸ\hI:pߡ02_Ⱥu~[lA,!7k1V/e^m;77'uq?f屖.p z[vqfF+6|/8uSJKUUI႑cN~=駟ƚ5k} +~ffF@WW4E:vKFe˖~'MMM!x^U֟iXz5vڅW^yi#Jo*DZ·Y裏ZUT(y!_J Bm>n@,iT*j0Ŋg``{viX?pLR5221v(mpp=CTn0/c\.'Dؾ}gnnӞ q=V}Ӄ'xB @K tۗ%_OS+`eNfhNlWmܸ+$ZF}3Xt]իW{4 dG\C0"2xn.#L"Lxr٬Wif8bɤV&' C2 2 !rfo=p8nϷzj\x]`_g( ,-#X1a#<;r r\Ç-WV_(2g80l#{DB!qR8\N׹9 b͋_Ͱf133csGydZ:i V>O  *8PFp moo/k{cW #6ʘ"j6ɓ',K(ݍ R~Yɤ0+3-!XRi=#2 4M3ikk:e ҺA%N7ް1mjjJ*H6k9p{ly5U/Xő及֯_/bNRҙ1롙7`utt q@d4&''1??r˗/XXX0JeBfX,Ntvve'ɔ0yݲ{'D9j'E) ^QN㨼F>HH$UbY\z!MD?Hxq)J6oVuww#Hڜ^}tvvbݲF/}, %sqi(C>Mp~d2D"QMvpLNNpeY|x155e^!x* jr~f333#~֫K822r#t(n+^7WF,D.]WJIu˸CZD"x+J{'100`YǛ<͈jD"ҮzH\X(r`aaLllbsiRfYR)3*8<.^),,,HXsC8B(2-ZoTRd a3nM͛7[gl$cOnlܸg.gYsFpu+'t-eË"o-VM,e_-uYd8+AA[[(gmiu0p뭷G?\4Mm[@8"w=piOlzU(5= FD u'{icdhO.*~Ư7}vYOH,a߾}o\J4 Y0?|͔ܲSRkZ[oe^͏%bvxM=1Ő;N1)y>8*#tr-H&“.*+b|U;h#Eį2(B{R*,7l4}N(Cme&\O韛rq-[yn'ߕmB|ԮjY݃`YջZ6_h[-8^Wm;~ˉ ^6?Cg;5:ݾl }WmjN?r~6 dwBŎT9;;;yf?~AelMWc},&J+Ψ7ʹc|e"m& u)!MzuB' i)9eۭfEl+d%{e{%CgqbN>K V(]Mp fܠ?yZzM*α.Z2o%+r+ۯ[u9~!6hCcسgz߮y5&0}xx]]] j7㧣D-M3Vٯ!ݍ' iƏ8S(8MLyr 5|XCd;l煠"۫ٗ똝 xC U/RK,a#8ٷol>ZE?~/dCCCXARfF>xUڧ<8[]<=#֕@C)9o$I񣻷v߰$k}]Y$i̔Y#l]z C|kszGlG 7X*̢m"6NRs$Gr T:΍7hN[$+%s"پm6,YDl:?n=D_k1Y[A;<~+`jjbb@6rGGv%1PTv`id0V{'#bX[|N+s*麎b]y}{nȎJOXc_dlٲEhVl|>Y͵Tt|Ρ G);PS/2+kظl)^4hS9'P zE. RT ##( hXSSS^Hir9鏪CǏL>Op}},޽{Ѱn A x1VpzzS8s*Ncjj AF7nںC<P(tIDAT w܉6վ`NN .OOOKgmD}ū꺎LNNV5Mf٬ވD"R+1@S({"XB} eܠFO\`B{ FNf53 %fdz3ڛn[nE=X쳵nYǾ>LbΝgp h3Yrz4xMcXR+s*㵿Kf^k׮ժ+Qn*֧پg$}A~u!GI]u7~79aj^ޝl6t:l6k"N{F a2ԳT*L&\.** _DDH$p4Bm۶9q|\,,BׯGGGGz$!.~J14 B+!߼_jY۷йݗqmD;ww]HRz?:$hАpd:fȗmpa0Η!d:_tE 5‹? c? ]wN<)ڬ5$Z)m/~,6jU-=sDpM7kwٮ6ˠQ=1^yNO+UhcGfX322" 5[X Q%m66^v7e׊X[][FW 0ItB֬Y#̯xU,`ʹ B9$V^ՈРHk,*z2"jx.r+XP(A(Uz #˙=ˢu] x VRPvwwye[Dpa'(bfB+<p9POPvw~gTh$A*/ʺVze$I;b/)迤h,̩Ϟ' aTb| L\SSrM4uU3EhpЪ}΃Њ>//_$1gfajj lXzKV ]בfDeqoQQ?8^ b4-\p"ݥΡT*h4 MQ܄nNuj/nF1+(cyN>K# g#D"ay1V1fAn"ͺtEvpY`eYKGhP(|oKAU19ǃ^=B/W_BU\s ˮ\`!L*N8+X/4 PJqGww7DHhQt]Ǖ+Wp)\|t]ŋqEk%ER;fmz{Ll{f t]]q~t*Xn+Ŵ3AXxL^է׃_eKf]hVK3-lUm~?6$߻m,[+8QܰԍܸcE+Kg VP/WVOCYA英^ע%:0 jAիqe7r VU^=ϲUm2MFkQj\J0{-.^tUƕ?GC}"zU6+cK:݃zу^ɢsqez5nf]+F[9 ոm,{1X\.vj,X&Z7ezƶ,ZC|^CA\I%ݮU/bcj,s݈}QJ zJjaU@0~zу^x*Տ (F }\Ѩԋ|k^~^,2V5MB`ayy^ոzo֋}η*6ZX'Jȍ+[ի5mֹhح+Co VUwCP/W%u# ,;ijO zcԃ߸mYT$DB㨒`*Ozc1YX/7fE rt*6jAիqeٺчZ|XUOVzOzezƶ"{S, X +i}EP/WVVrsqD .Dq|>/ׂԋUݶAW=^~[Xn[Zal:H%J(ZG"]ԋݶ~x ^L&#fbbbUt˾>#prrRX`,sGU+KqezMӄu clܹsYT֛>_I&D+/_,4MCGGkE=ϲUB!ۇ1)fudeZXe.4N> JK\lYݖֵxèz5c77,2b@7@j"(ܹs@IbذaR2 r(UBTq+e{~mݪ_tԳ_Ƕm+ZZϥi8к2rpႰ\.RyN>oذ֬رc{1ǥn),kjoJZZm8Fpf_iiaXk]!JrW-\ZOp5T*w5b+KͱTc2z,C[ˏV\ll6^{Mk6.l1}L<5,H033‚QŪڋ ZZʳZ-7V:Vseyݏ ӹp*_F)ѣG13# &@&'''1P,$@U6:Ͽ988yBHYҥKի?vڪ]M]>* YA_MI:1>>zKV\ĉ_z}o&N<&n"7VS~ӓ BqVә1Fc/!RJ1PXBdgt>!N>=r uB E%X_&X+r0fB$X[U LDyVP4Tʌ݈ؖLpCBq-"XT#XnD*sTk8 $~YXJ"X/)ZNe/KH-&h.*^SP BQB$Xv2#ZvQF Cg#OD"UihB(C.&!h,,GqL-/YhrDB(Qk_E:Wxe'ߕXԘFD5MB_e˜6]) 1 f,k,ZEꖐߖL~48P ]0e*,@y%VN@j*%B!+c/Ѫ tk]DW5 +^4 jEb./NBKb,H$4*ZҨvm]9W(e^e^hB3/ENkZDw=HhQP# je5f T NPI,, ى$ZJrD%j @ B!^;BP( BP( BP( B}h'aIENDB`openscad-2019.05/icons/prefsInputButtons.png0000644000076500000240000004416313402025764021451 0ustar kintelstaff00000000000000PNG  IHDR,,y}usBIT|d pHYs\F\FCAtEXtSoftwarewww.inkscape.org< IDATxy}ͪ\\ 'EJ(+b J ES Jm0e{xc-tP/ZK} pCZHKHK⁋`>+sfuufuwuU3鬪e_eH$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$ַZ)-UU)/cC1( [&F B!T*U%iMJo~sVI$<`UGmf PJ)1`+PSEKz@Q#$(7!7ccTJ<II)XwZUUj !dY!iAt@cboTe1v{pxlddHh}򩕤Bp1EQk.n9r$RLFFF|6XntErZn⌱3`ͯ|+b'RJ y'>*|RtzcG63ƶATUMx;!KR RJC% [P0L9+_<#-gu~iV?H)]C,hҔgSԛM@YPJ![m;NLL4 cEcW(o_֢0?;wiP A|AMӞ,e'kT{G.s1ʕ+;E9H &/JYnz<篬رcr55,x'n>?cG 822 ' Q傪[~Vdff۷og[,XiY7uRp8SƢ`1R 6I)HqwUU۾};eMMMt[([YU4Oy^Q&+TUʟٟMȈаMӴycrRIBr.Ro6_CCgjj H$z{{"[Y;vleA VQ<-~C㊢|Z*!GgΪe2Ʀ !7R͆J622}>O%x<!4 %NDep)X6yꩧDadOëO=TW<6QOӻQJRԂ7ļ_MȈF>M|`У( M$LQY `h4̭,O]"`'x1 ݂eYOOdx'5MEL)Uu2R.A4}J~b*QJ㚦=O"ċ4222{~୭DQQS@}>#d2ɒ$@3(중H֦|lY},<Idw _-+B&BVJi+rM6cKx2yb% !Sh2Ly<(J1Bh,% X,J4Mcx!R`0HSK&iheBh0dқ7o۷]6R `DK}K_Z*oIW+-XwƪjFw'`)"4cciibx1 V!& H8K$Z4:1R 駟...CdxKRd2I!,L`0R! @-&~#[Xyo'bcr3_9r.Z;N-!d-T1"Fޒu-(E&j}[T.i z ORӴJ<`'x3|1#G.c%=ZiZ RJm~hAK'k實(JRBH$[H KGmX$T2(MӴT,ӚzeEd ++݌#7HJ PB@db%)X9>ZJ kx衇BX!+B1<<ף7s_yw!ȯΉc T T dHt.^x'n]>vO!R+IUU ?1UUqwԩSf(ʝ+F|Ѐv1ΖTy0I+>k~5ؼUUEss3:::oىm;Cֆ b7mA$+^k>ҾR2k_4ܼyW^Ͳ, ڞ={cwp7T !X۶i&x<n=L|1LOO^ؼysV>+lZE+a޶AqjYkݾe̕7c sssڲtTUEr~_xc4w#k}@њRҪJqKn]KkRq]E$2 J5hioR![>ht>m#G}};Aw=G">۶m͛7XiT`% %X@UC_S8Ο.^|p lܸw-~*Dž qo-mc˖ TsZ*B,گk1V-O ?}3AGGh4SR @f.^y`b,RDƶ@B!@Ux<1:zPSSpxoW߁1==Xn_[[@ jV}=~ĉҼɲI%ABկAYSi^)Oz{ n Mn._;zsv_{")Fg5H xCC%PvbqM8jYRHx@wq֞W_sxwU:TI0wUe,J=غ(7uueJ%Ɍ9zzzD&3+ V(;n{ cZM+0Qx3i0[hQ~NĻGFF*%܅vkjj2_ MӸ*_遒-9ۢV6_c?j'&&JNw]_.uGBh>baa;B$1B!BnX,łk0PSSBTx_چ(|-4|ꪧZX PUhv })X0yfa+=LCoo/ .@81<Үn… 47eCk.4EγeGҲhv}R]]]tVSt*N:::21.,,=Jss3_uᰣ6&''3cD"ڸqF F1==C<wl:o-3v蚚OR~h\D"óʶ[f}ŠFfz#:<Д6`f0( THݝ}M=дQY\܅,~,+/b龲Bv޶A[7H)jϞS>Xׯ)~`4TuVPMoG4_X_ACo 1*s&Ҧ{S 5-|[2S!i&^rMHA)orb~n U{!J5#Hwآ33waf.x3nBQ40G2لDf=P9qƪUa `(B}}=oSX9Z7 :<,NG vR-HZ=lF"%sn!Lfe z\>,ý;׺C46ݲa\6\aěA}Ӿ[h1oۃ>m,'%JxtZ\\ĥK)믿 ma|C-,,zlTC_Sttbcif<\\2;jQÛo^{-+o'mnjo[6J-d)ƾyĻN(ʚ e"#7܇( ;*!sϡׯNwFGG3.6xd=rSjKKKt`9̻rWH{9\ڰapJGƜ) f{NX-r J%N1% h1Q߷+XBG}Ce˖&< %WY|7mƮt"/vUbl| ۹Hdcyw7% f]tmQ=Z.Nv1sF9rw"?ETSRzoEJK3Nx6^'&>1Xeaƍ0C4k.Yi!qa|D.U׊qھe4m0s@+[XRMxnjjB(ğϥww;iΝ;Ӄ[fգCCCrloo#66l؀M6eգ͑h y7 yN6Qׯkst![o!~x<.yfx<ܸqÖcxxԧ3ݴi<l|[{{Yd7BUULMMٚ~sNu]zBUUض144;3{c)ʆ r{jO)źu2͛7/I!SN׬ eXxYYM{dyTwJ)"0/MQfՍ@)RATUE0>f4MC4-F8EQPSSEQzXt^@ `Y^jRq֭YO>>+מyalXnp ,\b,zlvn]X݆[(k_QeyW\DQ|ٱ,|ڿMvV IDAT(5%aQJ^M _Z_ e\s#ZE9XE)*R:ܻ 0bEQLLLQ=J)099> GQLNNٖׯcÆ )̶bbƵkс:a=8"|aecbbY% ,..bݺul9}ۢ3??21>>x<#lC8F{{-cccXZZJ̷nE)~?Q^,_ 2,n *`ɝυD"EMM :;;q d趖Dlmذa건D"a;F[[Mh#J+~ha^ɮ.Vvً҂I;w.cN$-km={6kr1VQo K%mȌ1g>V+͞={p W:bc޽8}4nxߍݒl9lwHs633;Rގ`0 7;;PvBVSR)nkTQK"X1n5D('Ғ6֭[^wֆH$UmcXQJ.O䄿HUUD-稍k׮6ʷ[*,轋D!\UKK4wcZ"(ד ~xqpH&q\«?n0Cg]9.P(kt[6 hN%HTLlR% q³$'ɂoDƘːapˆ9m#=ŢכWFm%̢):P~kRZ1o ]??m^\4YyWk=JiX>NQsͳdz/RBVu {p[4)WӴ υB:yn}wj--'8yFDqVv]E:ym0j&:7_cpZanKFn0bUƖΛh5hBȮCtޱKB`(={N1wsz)E= ҥK}):/^t܆N--*:17ڊ`Bw)t&"z-;w"1W^ySSS\n0osˆ]RCn_eDŋ1\QHKS`>QVDՑV 7V+΅6n{.>ylzPU5{uݻvsNn=j188Bn͛ܜmڴIP,nyi9>@ MRZ [!eNg>ÍݝH$]B>zںu1>>n1!{3鴴cbb(طovZQ6vލan=p5۾Bv]e|>&''}0N]¶6LNNxupn[UU[7o,Fss3ٓ 7bU;11n(ԩSۅvf/9}׮]=fqqx<#-_'9-`ttHD򩭭͈jekii ccc6xAlذ}loii XZZʸr hhW^RAAGG7" rڵ7Tԣmmm6:=R7n`qq1cU9eDCCsm\񠾾>ki[nW^3<3P*,rpwp^X,޺0P[[X,*P䘿 ɧ.RԢz ƳV1H H}t':uz-|6C_'z*~oo/wK.Ch h{+> +'<d2QYobhh(0/`"իWqFa=ӧOc۶me܁eشipgΜApT*i 5b6olɓ'azD"lݺ(\jbb1K%%hq. ا(JkSgselٲŶ2 x2m~8tvN8!5l۶(Ї[o qM eoǹs`Q6>… zm\|9Gb}hn{V % 6dOИ6>>n{SygdѫW^lCm筣S6{ltnܸ ۷/^L筣 6ߏK.e30==Al\r%J'ʘo޼`~r¼rE ;oy妽SqMc,_4'mLOOg-;jcff&SrlV=4Ms/$rbY[1v)x<Ji#JY]-Ç7B?7oP)q|n27llͼ9&:gq_0f(EYcc9.X+jf5A>m{Nfy1|lUCM-jbxMxK_ WMxvioԃS@)MTHWV4σRZԊvӿb1 獍 pZYX ---E$qN:U N)4x#BvoٵqG### &@Ϗ$Z~aaEQn 7lto)/|60\a/~_pCa۶mqFQekѺE `=֕ŬWvy׹Q ݲa‚wz]ܲadnn5N>pؑ0`jǠNzMӄA3ER;*X x:?O0::jL1xײݲ1VC=ܰaLQ4/orr9EB {/l~>,ý_,WtX,{X~}\7+(y8iʹ)Qz>NkSKFs,te,Ýc;w066Vd/S6Dazo*-[Z)z>?dmWek>mڴ)ٮx}sTCޥQ/鲊t_%[,^,becL&o \h.h B(Ć.N׃:] z8SXf~yߋ <3b1% LStP7 hsKKPr-IqF`mb:j';c(޸ _n T+&d,xOp,gB`jj;<>v]w]A*mw]Xny[6^/oߎ;|,ʪbvvֶvmP[ 6m>gc˖-طoׯe񠿿Ö`)dyGkkpڙ333sdtJ9dEeɓ\aVS"L?|>EQ^mt"+1MQgSJFxiF`cXZZ\C4.e;@ PP=se/"?\ߟw=[̙3~ _e2}24<󘘘Uxg kPUC[O.bn\PEQP[[2{1yinBɕfM:@BaK@O<[(}xGuEUrǻS>,j۶m~hqNS.Zǭ]:G~Rjx922ʺ",& rf3³n]Oorۯ26͊!Nlђ*ZVq_Uvp5fXIl9E /S}=%ÉwABڸ'Q4;\V7ZDm?2#]{zz2ƤX,sw+EDE=Ω}mʸV(._*GgggGTsń(jj³( bxR)ܼyx6mbpZ[[Ғ1.KϹ8<|>lsBa  }[0>>`0;&}TUE[[[A"M0==q455e3/ &2lttGo"@GG iD066p8T*MӸE[[[z ;#^E'СC5uuusR_򗳜-OxJ@gggQs(^}U߿?K8oO}S$J)~ڵk遲:X%ɢGۈF1|Ŵ"(zzzlC)/~ miP(ĝEQobBPF=(سgOQ?8s Z[[s7c8c~qOR]4E#Vrō`pdP555J/4j<Ǐ?q)VE( nb1;w.YG!ܹ3c`0XXG?+Wd}+طofff2D".EՅqbs+ $,-Y+(b Pcr5pގɌŠjVCbǃm۶qWUnhFȶƍq3VM69R@ ՝X`2FAǢ `jj*]-h ,]ԠX W: "lg[!⩯.BCCC|S;o$ެ)1::> cѰDqD[XƏ֟*:%X>KE 5`X+=o'oK N-tz0BHNFd\Ϛ(d9`(E巰/FÆ?}.\J/J__F;w 1ka||<#maa/r]ñk m,qek;=<)|] -DcccxWں˗/pttt8{Oz7pgK/qر$Rٳ\Ҋbxg~4@9Jarrnܸ /`tt۷oGCCC~3J)fggԩS¾}NVJR\[-###W[K4`Y8jES$!O8%p|FAv>L.UkkkŰU%rRvB!G)_ƅVaNRWWVw):; W>6#.]2+N8![ffa``]]]fPzV.}Wݖoذ!#tMWWcZ+ST*+ȧ"rD wB>Or\-ߏY144&9[a}[[[q뭷utt`׮]UY1 m۶##vlݺ7o;`ΝEs΂(jeYt6:7Ƙ@ƓX~+A&&&p ux<ա~_x~"H_}aψaGGp@`9LJGG_.\lUd󡥥>޽7nLGͷ<⯭{혚B<oh `tB¹x<BH&p::C7x4Y :|p#nts̕ੴUK ]]]_c:1+fSJOUTQ__Jށ@ۊs"oUU긯77zl,c.Bȭ^pLu c1c?k7o\ǭvPFi@4"9* ."ׯMx業Z;Qr_רV˓cN D+_R7 J-Jm5?P`h~џ_""l:p@>-G哙@Y~0`r^xjmwN/`~HOO.4rV:&Z2ҍvNܑgYi#Oorw嶿گSˉ ~-t\2!F`߼+k|ֶj(c9W<;c˃EHE1EDE[lpo<Zf2uNyT [|U#^$XCNxl~#>~% \cxlmm#S2pvBH/̑5%) WCWJbLx'n֭UQe>P[){zzz<p0>冮VPrگdDH0t?c֗ Iy Tۀj(ZDmOc~y9<|>-+Q2DxBOIDAT>n^UjE4Qkk;ۏUh+..X.j(Z `-!Xz?aSMUUg)ut7WG+~#z !hjjzۑ-HEu E-,|#R%kfr̕prh>WtwfW  ^\uEXڸ㯚\+HQS͟/| /3{{{ gYA>Uh(}*휸Sh>>vu `v)FB$U3g|ɓ1k,,,MSSOD md2??'O~Vw8ُ~㚦ȲK$5D,"X`f{XQ6/HZ8~{8*X@洙UUݍ"BH$M.LNNُccJ$R;uxX%U?[׭[ EQ"d-@5M{gzz_~X,e!ҝ,@ XƁdzQQfXU&_|%h;w 2ƸY%I6$)!n1O2"(›މK.͂/F"",EfNZڼ//泑8$YNnr)halV1kxJlFѢ,m 8ND"1c~fYbKBehĂW&~HEBel],R$0>34.D,piEx,ZDV-R)-Wת% {UBf\-.GB], 1Q"eND"7 `#b'X04Ap7A$)Tr.G}Vf,G|>e*ue-)XI!t7O+J4~R`٢/R%'>K$!dl%XzU+l!X: 'OD" 鞫[(Tn sm]aỦH|}Xߊ(35Ai#H#,XUAZX +œH$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$?z BPsIENDB`openscad-2019.05/icons/prefsUpdate.png0000644000076500000240000002523513402025764020214 0ustar kintelstaff00000000000000PNG  IHDR@@iqiCCPICC Profile(TkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEt pHYs  'UIDATx{ |]e{ֻoY4mӴMZ θ8:u\F%_Ed\0mDM)҅Kڴi'77w2{t(NϹ|~_4鯹D W&*/vB!e$gr3nkZtUb` lh',ɾ$vTrRHrYCдlMd8_ k =Ա=D2 D4@Y3kd |^LJ='IWhktDDhm%cbb QN !ZzHE!9T n.JKylw@B˖vk įZytm^!9lT톑w YD)ڝe׌\Q*#gQm @h~~6li!M gcT3CGk7Z!7X66`h6kw|vSMij.u|Qu!O)wϮ{y~\ϗD٩hzY&[YZPKg;{k U]@ZjlݷOTAPpB2H䜊B.I\d(nA 9]R>EiSzKsކaiyڀ;jSmef6dsXfy*^kR1Fh1:~t黯Q3L?$ @ J.W@0k)TgWVb_ 40rPwDE35Tl6<#ʎȜ)M,޾--C-RFڭ b~IeًG^;I?=DZQ R¬٢ xh{{.niiye`~jM (ܹ>]lϘ39ky:)Ǐ \AqpC]U2%kG ѱLm}@ES `ݵ@=-;e_)biOIvUd4e1R&ԅU0q%amWUvSf.^;׼r|/!;2ȂMTKV~Y[ͯ͒ v &~sjWݗwYH7ID27O (2<{AGܦt>ѧx\KJvET* uPMTٙѶu:SY[5Tj Jvs`5-_(5K#@-n 5p?ZP]yw47tnCzՒիggD,gÔla P6őDhǶ`}[  o |š{ѾuiRhe@"h-3J>]'f&,o,mmmP/W5m滣#m/>GMMcѬMfI]swXۻ@y;<io˘A2#ˣ;_C5l< XX x)˥oo` A 1İXZki;.g8.\ذmDwm+` LޗU~ͅ-_5Sų6AjPcD^A$ 91x.f^f(0߸iJ$i꯽lU"UЕlFW>esM'Мu>d5x,}w@ld %}6]_-  .3<7Mcܘp%wJ|-\L2;4vb,Ec9Ճ=%҂Y"g;6 L&j߭aۭܿ7s+Σ6SU PHPMC nnVp0ViooZIG^{v ;)6ż|Z .WwMT"s;&: ²M|ջ>ѿj{tZe^SSfic.^c4YhV޽f7:JCt&l4lo {[yPTaT]7KutJvˡu h8Є 'rApz8s5ٜ %2 m]qt1}v{,VN&vZU?:\<~t\h Ouu'h0O(2(K Q*k[ HF"_YY|>v,UZq'@x{x7Ӧn0qE*O m1UpWe?iat}=yk)I8DC7%]VzNF"W>~$?%#ccup<:: lD Yfʇ^9`Fr=O-7˖-ٷf_vI+ zJʩ(A=iZwEpWdIAbri)4UȻ(I4f +eQa!Fr#e&]`ªiN9uLǚ5@g<;F6+)hƼJpѡg4Gm>x'wX㑞 *dJ$-"WvxDE@X *uH)(#G~u۴>󱕴OSGE|hR@&Ki,ұH3̤ &v$uP,lo&CHmɉxfeA"2nS!:q(jgo^"viw1fJ.Zhm!4A:.SˎˆBY{{"Ut%:Й^Q4HY\V=ױ=TQ , n>w[)`#1L6D P|,UX|d.9űbsfiy} ^wq.aR&/@Bհ4vDR,Т3)h[NRcZ1pc#Yn!sH)tLh='AK ;c9>K%-[&GUB+WUesF" HfLQ/uQ"!j6;B6mϕNsBڋH(Y_GvPe `4Ɩ>Q/|"o@[df_yA7_^AOkC*/Q*j*pH6'lm|oX^4N ЋWMd-Q"ZXV4[0D (Ȗ+d FL:+O? 6m8 UuŧD RT/oK=kk&]ৱy)!A>LWBl,m?*Ѝ1;bТi%(h4S}6xʞI΍u S; 3'mQPdW|4@O, >MQ>4Yhymz2XZ_8L~0W~s1EeSyu?Q֯nUU0eI fɩ@5Dk&`wi .R-\ޑSMP%tWh4Bj=OF@J /DX?i#C^'s#c($-rY<ΑM&Aܝ.Cs\;otq5;]xI),PoN_n%Kk0Eb_F5-e6(%^C*._䡫/.mt 2%l?&¨TU|$ơowxf+@w M&V d{@/L';0!7Apsؠxta|HLricl'KQ+ּa t 35X48q["?8%xovqs@D8;7} UI9$r8'.~ult 6[)*F&dG;˥\'TVFzENc|j,w~f[ت͒WBI¹5tUᜦbyɅypFQq9l[8\{h%Ȳ:݊Z;M3A 0QTs<48V0BLAtd ^_">+J.\`5:N,dE g#8N<23 P) "q bh#Fx"e8C>fJ Rf1;.`$J @Kg{'BG @̯C{ *> 5hD) F"=Ii z{Qfy Jjy] ;of 1)o`#P% mE.[0i Pgs3k`6lv؊@h <3\L y$LA@K !!Hcc`oID$ڤsDZFU"T+͕' %Pl8+L?-AU3 PF! v(pɧӈdDDy;UCq{} UmTAG~ݛ"S8r_FG#1: 5GR sa5)Ecq2# ߿ÒP)IF:CRΪُ7q,"Wz):Wkյ\3ڏ9I! u-y6T:O0*WAMasTDX,e4޿ȏMΤpOYERnmXwySl):sQp Vfsө`Oy)*_=C=;z>6xl6<4169S.nڶ#_Z:AV[`k>xR#CV[.`Ә^WXvcgwpp\u2F ԏT_Tj)dLyG9u ۋk^UZN)[C0)Jpũ?xۊYUSA`8mBEچz ЪXAD:;! .'a  !l$^؄Z7|;AB&ԁ K)zx㣛,ACΤbo{G0VB WŮ,̭׹zg =P灏\Q:L<YDxV *l t;,J `GnO&aXe r X M18 v SAĽB@zM .0g eo N[6nYA\S+YZY ʵn5"2B6 ՘˃Q 3܈Լt o~嗓MMZTڶVwr[%1˛{By6ng܅8h+D–"F vs Du< ,\,ZˏW︯˶eRsF:y7\pQC@̈F+FvU0SrU;,=QPKh0 FXi ڻгqڬ1[ߣ#_T* @5-'p#2u JRAZvfE2<0.O˷al~F5V_ )S=M[Kp,/! ;::k7c P7h Of ӧ+_YK/pݦۭcvc?R~w )8!T MVDcO F uba ɥt:켏+g~]`ϴb+޾ewiIq~}yzf!ECn0b X9r<xٵb> Hk78').WwH6KA)⬫} 6ޑTu/`˚t]/4Aߍ;Nłܿ{}?O̟'>t:v˗ml%+} ;$#7n/uwJ.7n\kIy.ϱbIlX43](8~b|мn!:3Gl zB?͗nzưCH n"3# 3X@иA2rEt%$$CvFX] ۾G^MhUz dUY|Wr=;,*Y 7 >|}Kֵ+}_\{a߁ө0uG)qU#}4U- CpQlJjp{UhrG:{%,\Li˧%28-z )9l&6ӻ_@@isqvO$ VPnr7TyC۞9&g#h&A Qc)oFǡx'{蹑$gǼNce=1\o` YzWeE撒C $0mf5si,qo)o5 FҪ_׏زE]QH1$COb -S9p(oہS?4AS0duDohtR'`;—tǢOņqo2> yچ-`ON1;7F/e?vÞ~+~H$t{ żI66w+*bsIްp/?w#{tMi?Ĺvb~ψg)Ndafb7 i"e8/g$oGvxl0y>_9Nm^mUބaHBk?+}H  , v]F˻˪5W/s^s{D w͏ Ù<<{<'qx=~񑭱/Ɓ8y<ޜ"/JSg*9`w:NFnG"?P}äOpӆa|WnG%9e Q,Ҧ_P kח/9+j Sg-@Ȼ(p +qXil_~;*B%m[$p B>y 2|KpQ1ڰ؎]T?X|}ӷ]WyW֮<9, Oh:>f}[1N&M$R9w B;lhr $snMZ鈤<2N#KтG0oϕ7S 0VI`ul`[m꿹iOH 8^0ɷ1HXIENDB`openscad-2019.05/icons/stopbutton.png0000644000076500000240000000247413402025764020153 0ustar kintelstaff00000000000000PNG  IHDRĴl;sRGBbKGD pHYs  tIME 57pATIDAT8m[lUn-ke)D(bTDQcP"U.ނJ QDc|1}BB/Q4DFcT hMUnK۝^`wrۖm4nUcmӒ$̜\nzU~`Yc3\9lo!!:8p%ٮѯطq ;]]EŎי5o3OD< Q wq=78E z5K*Nڊ@jɹ#x/;0R{poFE bfl& CSL0q!^YmIM+J0ȺTY~+5kT]+۶ ?{k.`"c[)p :2-O1XEup 8޺'p0Vn"}ߣ2ݽe" C:tSbXՔ./ZG;Efi˞y\0HgJ/XbcYwn;_uo8xOo͐뢔b1| f2Zz9&SCꎛOF ~~Ej{leY,u÷//68::Jv4փO_TmH*. ZE :L (ň^H3GFpyLfr*iPg_ҽxϿL݁h,~Hl1s!tm==+3L1]8;Hϐ;[P%؉i8f{)D?ΣGm=<TO(LqL|F0]N 􂃾q6'Ɍy]Zi+뿮t[d<ߐH{*Y^6b`یD#fmYxy"G)זL xZ~?0y'.3s_0NIENDB`openscad-2019.05/images/3MF-white.png0000644000076500000240000000134213402025764017560 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs B(xtIME2cbIDATX_ha?gjWfjd+],憬rA%͍BX MZLhRZI+Ci09ۨ}|'4ORviY(_\9 HOBt2?|f!CҀ^$W$š@yВq= i=pXdb2(/VI) d$ |nubfI 5u iWh||2Cq/"I >v#@PgfA`ј}&`3z̬zL6[n@R î0p2"[ n4L;0v~Xǟ̬Xw:| "`#qJ2 8#c,6KZmf@u(ΐoys3cXQ#@ sતz?{H*"j8 |xrZ}vIiۡ~`f#kJs -%cf{bgjI[$uPg><=s*Ʃ J.'齻s%0fmo.ff2|`xatPM=sG'>OYȿȆ3IENDB`openscad-2019.05/images/3MF.png0000644000076500000240000000124413402025764016443 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs B(xtIME B|CIDATXMNa3j||5LGBIXLJ X MYFc! % DcCmijҔAMd0fu;3۽9y.Y+  )5ͧD&r+&j'۩SEt<=Q>Y8e"Uh*X .eTg!$iUay+"LE/>e*u 4./F e}zIGOdNC:⺽kcu|ƞ}(?G)dB}ӘQucEiH)P^Hɮc[\pdZ15"q؀* #_f :)rX(6n cbN r2%ӆXahmjbP-~;Z |Ԇ]*p\+F 6tbgX5v8*/9װk%p OַB>D?3RRJl I.lzï=QGjq#`zpΎ3dYPi&<'X %y7ԅt1^\ƗHdIENDB`openscad-2019.05/images/3dprint-32-white.png0000644000076500000240000000154113414440264021000 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME &VIDATXŖMNawØi|5 6, w$dJY(%I2b%l%,QjA Ciǽo6{ߙq<=<>"ERdjQr"r`7 e@@$Ap^3S1, `Cӂ8f6Хe@KBX{TR3486ת:'`!Hdt0s*>&G:3WDɛDj@kLyHqclګү`,5JM$Ar~90|`LOLG $fܗWB/^!mYpì,.>WͬPP4+<>X<u@mH{ #b@f`{ 4Y 1*FS-P/i+; ;~f\TQ0B/pK`3X4xYRr⋤ߓlf!^[/5>BJT2 d麓4"XW^I!u Y3O.w$-d#TdиE$As4CEIHZ#׎J.iOARh+2X 'm/=AnYøw^ZW; U ~mf&v6y |MIZ~̓p(_Ga1PIENDB`openscad-2019.05/images/3dprint-32.png0000644000076500000240000000146413414440264017666 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME $#|fIDATXOUuϽ9odNNa cY-D ]T T*pF"m0r.BA J- Ft{3Cf{Ǚ\xǻ=wBu+0ʪ)S$Ues<͂%y[J]ܗLeJbhZ~nY"%2#Ӳ& F&C<5Q_Ff]Vb;5|d%t8[27j(qwt*?b$Xq_JsF)~ Roqqɋp%M[́~]&\А%;Edx0d.u#%:sd@g>q/ag|zY3^4qV`}U%C-{+w,&al AQ縰ث0Q)~Qs)kqwi:k5MIENDB`openscad-2019.05/images/AMF-white.png0000644000076500000240000001023613402025764017600 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME4O'k+IDATX  555Xm777444`4```222d222Gԝb ˅ nx zl \  jj3339bBG?B^^AA???]^N@9@@@7(f R@#V 33`b ~iKbQ]a<*\x s$K8IENDB`openscad-2019.05/images/AMF.png0000644000076500000240000000116513402025764016463 0ustar kintelstaff00000000000000PNG  IHDR szz+;;$x 8,F+B$ȁ6V@$nAQ8PN7˒KfV-"üW}3owF,T,UV[rdXL,[I$( ^/:OZV:Sr %:(4o9sV)h4&ug- |Sوb2&0&0rcٔpEɊv ~ȇ?|ևο^`Bw=;1Sp-yR b.{$= " x(ż~(`H .H_}\4?PW)u5w ޶H<{WGrt |qS=v`1Oۻ03ޤSpFK8dQZ<pت2p@<>_NW^IENDB`openscad-2019.05/images/CSG-white.png0000644000076500000240000001023613402025764017611 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIMEtIѣ+IDATX  555Xm777444`4```222d222Gԝb ˅ nx zl \  jj333> 68 _ h;tF6$T>)ob'J^uw2D8 O <!k9x.#O?~d)!~,q\f`HZI(b5gIENDB`openscad-2019.05/images/CSG.png0000644000076500000240000000132613402025764016473 0ustar kintelstaff00000000000000PNG  IHDR szzIDATXMHTQs7IMaZ&cӦE`)D E*EHQ,, EP21pq,6Cf|ks14[̅9;߹y7Ajllϲ^TWWw&%x²@ ʋ!uYOJ-jSJMOLL⚚zln5Ms-ًS< ]r]UUU sYp8|6˝+څBRaY"l6{e^RD@4m6MoFR(Yxf``R*mFǼcʶmaTjh9." P^gxl7- ` u06\-pׅ \rp.i`FKp7z#%88f&SO q Hma;$IQ)vJ" f"ph9g`~hfPpyYbU.>TANj}dű ^ 4pءoXDq ma?gy[muѺ3D/=V]n-BםuJ,6s) v->m`?NۓCൃk`x|їLp0IENDB`openscad-2019.05/images/Command-Redo-32-white.png0000644000076500000240000000132213402025764021660 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME  YqIDATXk`ǟ$VCh0R x"1A zeuP{ VRj{1?(K5[/Ͷ "{ o>y7t6aqJ[Vx%@4%^qOFԯOUկnAaœu&.Ƙ*bqqiij`Q.0 "! 7B |;ef3ۙGH2{` ø(} '$seo1NC{ƉżP(,OLL<"j!{ͲV|>A=3~gFJ:BhZTz>u'c5&(IENDB`openscad-2019.05/images/Command-Redo-32.png0000644000076500000240000001014413402025764020544 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  kkk---8!!!t  """p0000VVV$$$f&&&X///444kkk..."!!!444'''N&&&\=== ***BbbbRRR(((NQQQ)))8 r !!!OOOAAA """r---(444kkkEEE"""z333...0###`ddd...F""")))L$$$n"""v%%%V555:...B...B...B...B...B...B...B...B...BlC6tL>IENDB`openscad-2019.05/images/Command-Reset-32-white.png0000644000076500000240000000207413402025764022056 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME  /8SIDATXK#WsG(A"UiX%EХ> >IpiRl%>$!hdaAc053>YҘm&RSp';{OX[I^__o#^^\BHu=sD"]0cxnȲ[BԤ(|~~tt42Jλ}}}ol)ZQ0 T*zL&Gvi0L?24-iڣJVc|!41+J =G/S廛&&&LRoMn3&@&qO|>ԊXz5͎ oREQ/V^;99!~3 y^:"DP(6YO$ך4M{(wRiŠN|Kgs4MRZJӴ~ 8(1[$ID$5=GtB!.$IO ﮥ( 5=L&c|!8%v  ø!cۮ^L33Bdp8[OMt]leɚ\.0NßJ^?D Vj X}pBH\|ii)l b%_Uո,s/cy"l)o4=@Za@u0hX|5.\,+/1ٴIENDB`openscad-2019.05/images/Command-Reset-32.png0000644000076500000240000001014413402025764020735 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  333 !!!z 111*>>>$$$v111...(@@@& FFF&&&X$$$l))).!!!|***>222333---:!!!t"""000>&&&`VVV(((N$$$p"""F'''n666,,,0)))V###x666^'''***D,,,8%%%n"""l0000vvv """V$$$Z999 $$$b888&>>>XXXPPP"""333BBB---:>>>""""t%%%Z 111*(((L,,,4***B555??? nnn---*666??? ***>$$$n***@,,,4!!!###$$$`:::$MMMEEE??? %%%X ^^^###r!!!```+++2***>,,,:***Blll#CWUIENDB`openscad-2019.05/images/Command-Undo-32-white.png0000644000076500000240000000132613402025764021700 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME  <luIDATXU͋q~7 :2P(jL!]򐗨V!NAǺIP!n " Ae]A磋1Qyn;`„ ؟~X*|6BȏbUU4M9x<.J%jXRE_#hV=F2>4d2ļ]hퟖ ±@R8z_Mc|q\_(UHQ,ˇ8ILa߿J IZ/A>9η⊢DQ](Nmoy<:v/H3q|n,' 0j~888 pӗ$5ͳ^},;`0XfۃNZPS >> +++((((D%%%f::: !!!+++2###X&&&N%%%\PPP,,,6333###l***8&&&V888hhh###!!!777!!!---2)))J<<<nnnLLL(((F~~~999*"""3332$$$n%%%Z000B...B...B...B...B...B...B...B...B333>vvvtnyqEJIENDB`openscad-2019.05/images/DXF-white.png0000644000076500000240000001023613402025764017616 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIMEk~+IDATX  555Xm777444`4```222d222Gԝb ˅ nx zl \  jj333 ;N9>^D>>>%Ceow*@@<Xf0CktX)XP0pX( &omZ#IENDB`openscad-2019.05/images/DXF.png0000644000076500000240000000115413402025764016477 0ustar kintelstaff00000000000000PNG  IHDR szz3IDATX?hQ?y%E.EB  nADDp0$BRtp l.h;)(^k z䚤C~}> rRyBЏH$r\.?(@6Ujuqph$@8 /hiuRjVb랱,kϧyy"eE`0fdmf{M@*:_oH'-˚afhTSJ-1j[-6P 7MFC`Tp;W` ت}']Řy <S~}Z7hߺS/(Qk=/jJf;wYW.;|`Ήn= 2B<[z?R眷8F:8@Q[ד>3g^{ [N ֗DSWoZ 1BߥKFoͮ< ໾ 5\33{z7e\mtIENDB`openscad-2019.05/images/Decrease-Indent-32-white.png0000644000076500000240000000110413402025764022343 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME  #~+IDATX@ƿX=)BAeJeX @)zUzazj!<faHz=Yu,lw|y̛7@HwIW' x T*u `,i?~u"~X,;ga2`3G8a `۶sym۲Ž@ټ%}h4ոʄSY,:T*&Z jT b儐SEQ9:c6l6{"gt:r\|2U)GmWc$IarmTUUXz 3[wMTzM)=d2c:N$ 9s N |>k8qO UZ]`xp';7#MӾٌhibȶBd0Nz"EI ϕzIENDB`openscad-2019.05/images/Decrease-Indent-32.png0000644000076500000240000001014413402025764021231 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  ---2---2---2---2---2---2---2---2---2---2---2---2555((( (((<(((<(((<(((<(((<)))<<<<"""*000 666666666666"""333333633363336333633364446EEELLL///(eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeegggJJJ,,,0$$$LLL222&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j///6KKK222JJJ000 (((t***(&&&GGGFFFFFFFFFFFFFFF"""""""""""""""""""""""",,,L***("""***(---@***($$$lTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXXXTTTTTTTTTTTTTTTTTTUUU^^^"""*000 (((\(((\(((\(((\(((\(((\(((\(((\(((\(((\(((\(((\111.((((((\(((\(((\(((\(((\)))\<<<NtIENDB`openscad-2019.05/images/Document-New-128.png0000644000076500000240000020045613402025764020701 0ustar kintelstaff00000000000000PNG  IHDR>a IDATx@L - IDAT$rر8C IDATvBfd ^` 8RXJfNJh@Jh4Jh,Fh(Bh$8h*hhh h h+] IDAThh\h~ htDhdXh2h PTXXZZZl~X h zh ,h *h h h xt8&h ""B^h \(`h Hf<hDM IDAT? Drh v&h h @JLrbh 00222222h 4Xh n(h h L\h h Lrh 8h h H\h nhhhhh ~nF@h3 IDAT h Zh |h 0ph FpD .Nh Dh .t@ h .@6(h "h h 6th h>^0$n IDATr@jY> IDAT=OIDATU)IENDB`openscad-2019.05/images/Increase-Indent-32-white.png0000644000076500000240000000110113402025764022356 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME  6E#hmIDATXV1A~ƸR8]`ikKۤPa)(qU8VnXwR%˚9~{oo @!w(~ ~)B(,PJJޯcW'1+HUշlWl6c! Ji:w']5{^OK_6ͷdR-fIB{A:P l۾JR#M>rΫ5cŮw@MA.@9B*cltX=Ͽt٫PJGy 8َo-F|0>L&\^lU"xrZUŢai<mq)hZFZ@R97^RJ sq&߶뺎鈺bsk0<wE A$Ep-5aV3 0MfF2e2`fdYs1}m۔R!BkϴczIENDB`openscad-2019.05/images/Increase-Indent-32.png0000644000076500000240000001014413402025764021247 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  +++:(((<(((<(((<(((<(((<(((999---2---2---2---2---2---2---2---2---2---2---2---2B'''j666233363336333633363336333'''666666666666... >>>111 ===hhheeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee>>> >>>)))j>>> >>>333,&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j&&&j===+++.FFFFFFFFFFFFFFFFFF((((((6---^~~~###p(((6111>"""""""""""""""""""""$$$222*(((6$$$^(((6VVVTTTTTTTTTTTTTTTTTTZZZ TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTB'''j,,,V(((\(((\(((\(((\(((\(((555&(((\(((\(((\(((\(((\(((\(((\(((\(((\(((\(((\(((\TY?aIENDB`openscad-2019.05/images/OFF-white.png0000644000076500000240000001023613402025764017607 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME >>>b>>>5B6 @@@@@@33 F#b3~SBBe)]HMF@CIENDB`openscad-2019.05/images/OFF.png0000644000076500000240000000114313402025764016466 0ustar kintelstaff00000000000000PNG  IHDR szz*IDATXkA?dz B/))hQopRT?w{ uoEMs7 0g}0NK@[ 6\Kx.hUoT Zy|pF624 Zl$X3mh$pO]1JyϞ&c!ys]@ׁZ+ik'T1*ZA U6CΊz{q#̫"0 \UpڿR^_5__ŭӐWIENDB`openscad-2019.05/images/Open-128.png0000644000076500000240000020045613402025764017275 0ustar kintelstaff00000000000000PNG  IHDR>a IDATx@L - IDAT=O IDAT0D XDXDXD XD X*NTh f IDAT666:***%%%$$$$$$$$$$$$$$$$$$''':::"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&&&9990///x%%%$$$$$$$$$$$$$$$$$$$$$$$$$$$)))222^$$$$$$&&&)))***&&&$$$$$$$$$$$$&&&666<ZZZ))),,,9998iiivvvAAA$444t$$$(((888((((((((((((((((((((((((((((((((((%%%((((((((((((((((((---CCC6)))===$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***TTTHHH$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***yyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***yyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***yyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***yyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***yyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$***yyy''''''''''''''''''''''''''''''''''''''''''''''''''''''---zzz6IENDB`openscad-2019.05/images/PNG-white.png0000644000076500000240000001023613402025764017621 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIMEQ+IDATX  555Xm777444`4```222d222Gԝb ˅ nx zl \  jj333',xXu%S,0Xu&?tI~ ,Xu%y2 @{hp f&lK]?VS?AH,,u;V>fR%ɕ<IENDB`openscad-2019.05/images/PNG.png0000644000076500000240000000123113402025764016476 0ustar kintelstaff00000000000000PNG  IHDR szz`IDATX=ALɉ(J@γST*v r$rba@QA@$gc!l8liܬkLfn$4yaoyyfgaϤl6+JҼeYn>P{$P,@&KKK,:_5D h>핀w-:'U*n~Xmg |ulH$ny  {Ϛ $4fg?T*5]owL.)0u5M rcB⳦iSj1pm;iڔ닃Cƈ X}6R`;I،2Rnú ?^Qǚq,.+~I/F U;(KŶ@pQb=> 0S֖&E~& C~5y 哿Vdqɼx' pLOy=HV>9p;$f`=T#f{챡Ҷ]tyG`_[zM_ߨ?R ndF-O;0PIENDB`openscad-2019.05/images/Rotation-32.png0000644000076500000240000001014413402025764020076 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  3332)))***;;;@@@+++)))222>)))$$$$$$***$$$z###|###|###|###|###|###|###|###|###|$$$+++$$$$$$&&&((($$$$$$((($$$###########################$$$ ***$$$$$$%%%...f&&&(((222<444,(((&&&...zJJJ^^^fffIII$$$$$$^$$$P$$$$$$$$$$$$n$$$$$$$$$$$$n$$$$$$$$$$$$n$$$$$$$$$$$$n$$$$$$$$$$$$n$$$$$$$$$$$$n$$$$$$$$$h$$$X$$$///T((()))444.777")))(((///f((($$$$$$((($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ***$$$$$$%%%((($$$$$$)))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+++$$$$$$&&&111@((()))777";;;***'''000PoythIENDB`openscad-2019.05/images/STL-white.png0000644000076500000240000001023613402025764017637 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME0cgf+IDATX  555Xm777444`4```222d222Gԝb ˅ nx zl \  jj333.DM# y3 O???? y.X#f M _4iVt 4@( %;X#X@`F  l/sIENDB`openscad-2019.05/images/STL.png0000644000076500000240000000111213402025764016512 0ustar kintelstaff00000000000000PNG  IHDR szzIDATX=AL2IAADWMRXh!^uI VF<lq`uAilq^caةfo2{";ηo,Ytj4Uua>T{&j^ PVE^p]N߄z=#HF -eYs^Blt:0\.y۶_n7 8732@P8ݭzGF(׻mRtɶ]JIX׳fⳔrv祤eF$L&cN)*ͽ:|<@NW[A%/xw6*8|NMң{|SXS_>_/@'5xp^M+n#Z֕X;Ix ʷ@r5Y\S8KOCsxȪ[6pziYM pد&TS叁6OB>ѮrE5IENDB`openscad-2019.05/images/SVG-white.png0000644000076500000240000001023613402025764017634 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME!"+IDATX  555Xm777444`4```222d222Gԝb ˅ nx zl \  jj333.6D[o R &_3 O F>T>)o y.9Vl^` 8_4CJi3P%>i~!~;V\f `F y(b54HIENDB`openscad-2019.05/images/SVG.png0000644000076500000240000000132313402025764016513 0ustar kintelstaff00000000000000PNG  IHDR szzIDATXAHTAv߮Pѡ:Aw"Rt)"$HJ$VBuYG Z)"P$.Tx[Tk}f``|[b ɤ.+ {я Hz:PDfv~R ᦦ]T+tr\W-Z>klla IDATx@L - IDATr2r2r2=$ IDATr2r2r2r2r2r2r2r2r2r2r2r2r2r2p2  2z IDAT22;#^ IDAT?= IDATVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVvZ2Z2Z2Z2Z2Z2d IDATV IDAT=OIDAT4F^YNIENDB`openscad-2019.05/images/Save-32.png0000644000076500000240000001014413402025764017175 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  )))$$$$$$...r...'''+++***z$$$$$$((()))$$$$$$...r+++$$$(((***z$$$$$$((()))$$$$$$...r+++$$$(((***z$$$$$$((()))$$$$$$...r+++$$$(((***z$$$$$$((()))$$$$$$...r+++$$$(((***z$$$$$$((()))$$$$$$...rHHH DDD,GGG$***z$$$$$$((()))$$$$$$&&&((((((((((((((((((((((((((((((((((((&&&$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$)))....................................***$$$$$$((()))$$$$$$******z$$$$$$((()))$$$$$$)))------------------------------------)))$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$((()))$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$(((ٌOIENDB`openscad-2019.05/images/Shape-Cube-32.png0000644000076500000240000001014413402025764020213 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  LLL 000f+++***...xCCC@@@...(((&&&'''(((&&&(((---:::&999.,,,'''&&&)))...@@@HHH///n***&&&'''+++555@{{{444J+++&&&&&&***000bNNNbbb333R+++&&&&&&***111^TTT...v&&&&&&+++555F8882,,,&&&&&&---+++&&&&&&&&&+++111ZWWWXXX111X+++&&&&&&&&&---+++&&&<<s4伈&5 02eii;3޳okz$zVv#׾(>`d׮]k3/^qʕk׮%(Xn]e?OnذG+?>:==Xjс$X," ͢Zb_oڴ۷244TM`O?.FGG},O7oƶmېJFXbrrltz_ȑ#dddD}1q?zzz^x[ 2!jf 4e,>3躞gz:t➘yׇ_{wx?4a,c b1!,B6}躎Wbjj 7nX+ۙN'O{9}u1FB(`,xBǁ,ˠT*}tvv#vرN:WB$FfffRVaddR UUÇ1B8!ȦtP(R }}},bշ}@X!Rض+V^ò, <[͋H$!6x󼸮B1Pa044]ꫯ^#!@QpkҔ@ujdYV(i eL&1880~z|/bi\, q!l?cg?ydYi7s ZQPJêq]As'|w, ,Cu~fppp" Ξ=O?=L&MUU( h;?w^ 4F9G"@^C6P355uNtj$dêjH!KML&u=̗ DFh4رc>Sضhׯx:wߑ p/2U*Nؚvhq@)Ekk+Z[[!rKKK@^>ӧO)q[(Tt:w7nD, gl9ܹsꫯr^z4-2ƞN;t:BT*U~, |~:G?9m2IENDB`openscad-2019.05/images/axes.png0000644000076500000240000000071713402025764017022 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME ,L&tEXtCommentCreated with GIMPW7IDATX햽JQgՄ h| Dl>o`/>h-}BjY޹?d]sHMMM5i5\N1]@njۀ}8<3yc "y)utd%pkfs@(l1ƭ•s[aewf +t4MvWDy"|d"33{fjƥ>˲m8=c`f͗8NdK9p tD>W>fVSS)pg41 *dz\z4 [YXIENDB`openscad-2019.05/images/back.png0000644000076500000240000000167313402025764016764 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME +hHtEXtCommentCreated with GIMPW#IDATXVMh\Uν0fQAQą?+cZ+c. JDu ƭIEAA(it343{=ES"d|{L0w3Tը icc@zZ;%%"T齟cN4"3wbKF}PBxa̼̯WUuTU&~0SJR1[}c `SJ>NۤVU3/)0sk|K)c<[ b)s)_w^br8y;P?x9c1/Ȳ~2sjOU?e授Nn/,[SՋ!mm WDdAUWWW^(ܻ"D\py8~e\Y~'f(bSU{7`yws "g/<vp1ƈ1"G5cPۑ"`,{[[[13EQJDc$Q ־H.b@;˲ s(N0<=MD]Y1~Y]^0ƌTՆDt~'"_c8cfQUYDUu1u-;)6D,;{sIjey9wjg">IDplXSNz- CtKD6ƌ1Y$"KB,c\VFD~?Ol}}= ^x 6IENDB`openscad-2019.05/images/blackNew.png0000644000076500000240000001014413402025764017603 0ustar kintelstaff00000000000000PNG  IHDR szz+IDATX  ggg222+++++++++++++++++++++///666Xfff222+++111111111111111111111,,,---___ 444+++---++++++TTT444++++++000++++++TTT555x+++++++++---++++++TTT666l++++++++++++///++++++TTT777\+++++++++++++++444x++++++TTTuuu...---444...222666\uuuddd ++++++TTTuuu ---+++fff999iiiKKK++++++TTTuuu ---+++AAA8333TTT...HHH$111@@@.++++++TTTuuu ---+++//////+++...///www[[[++++++TTTuuu ---+++ppp;;;z...---+++++++++---///666LLL++++++TTTuuu ---+++SSS444,,,++++++++++++555++++++TTTuuu ---+++HHH111++++++++++++++++++222GGG++++++TTTuuu ---+++<<<`333r222+++++++++...GGG2333RRR++++++TTTuuu ---+++000222...333///666^++++++TTTuuu ---+++mmm:::t222:::@]]]AAAH++++++TTTuuu ---+++BBB2ZZZ ++++++TTT...---333333333333333333333333333333333333---,,,^^^ 666X---++++++++++++++++++++++++++++++++++++,,,555j{  vAdUB $"J+DT|" |YؒF7J4W`1ՙN/H(};|ߜ;~ ȪaK@;|t Ni&@l[o f}}} J o...Y]BnWVV~Fٴ2#D"щ1n:²*o Al4Iy, 6ub$IFό[[[[(UU[q8/Inz<_ ov1[L&t]y<55uuXS]]]vZZZrvDBN9(p闆aRԳInÒ$]We&J=7 `yyL3 `Y6DZAbi[XXt:8Gh4}43 +BU$9[VVTKKKM8vii,+ٌ6eyEQ^{ 9V)қ-yN6088hX6l li>d g6- ފNEozz#iPQQq\B(xb!SU\<tzq:yTU1 mZ/=;;;QY{0mAL4=( $ɫhf &in?>۔1Nve*Il$3H|XYY9<11]b'nC4IENDB`openscad-2019.05/images/blackUp2.png0000644000076500000240000000163013402025764017520 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME ?%IDATXV_HqvvLjésc& JN0qT$B  "_J/p4f0azKtSsa=la:Ku`lz%B]]y\[['t&x*̈́ӴJ!H!aXq8Qa&Iq 0tvvbTtNNcIz /$=5[.]!(sss:TuuL:!rA_&b^\g E=n( FX[[v皚M@ @"pYW˲I|i+L>Z6l pSŅd2BӴr$G \%DX-(adYY^^#,---ɲkqY-D"v=?rXEQnEo6`0E4͋$I(E?SYwBa 4FFFڊGv:-$I֬L& 8n9wr7077 0 (**iðWb粲19qX,UUaQ[ ۳YB8OQէ( ,ARM4`X\.롡!})׺[~JĨj Bu!fd_]]AOm62GC\lMIENDB`openscad-2019.05/images/blackUp4.png0000644000076500000240000000161513402025764017525 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME>GIDATX_HSQ;۽ww=\ld|U-$BJ+D|"(Cp`y=^qͭr~w~s~?XrQ1esQ悯 @:ls.| Iww;\}vj6MvuuRSsN>Lf2 kkk~9---& Asssۃc7JQXc|@}(jG D"c&b\|d2"I2(5NF"B>vvvjLff]x{ogR !EHpgpee}P{Hq!#_E@"z!"@ŇX(ba(X]a];+QZܧ|=s@Alt #W:`|ȅ{h>W;fzorDpsv?uuu; F.!p8J?F"+EMMǻ1~]߄ 2fH|qܵP(bh|d]׏QQMMMlZjkkc$ c|piiyee[I677ӖEWU+E}8t(zǼ^D"10.KxeIyOJC4vZNA<ϟiad2ywjj(= EQ<'d2y0}4M?())i d`ۃp aY/.D"^5Ms;09BlePleYmB1!mۛ)9ؽ;??B8$IeugfffW(@eY~t:etuuKKKydYN*{o+NUUcU=gF70>:xy(7Dۊ1|喖Z[(֕rj\c<󾅅^P(6K!IҪ8d2rvzM0t:,7[J$FFFنZM"Y4Oy܏j>11q=$iJQ6 <PJT|peO.1Z|zvT*tp@_m!R+n@ֶgJCE!Dd˚N[u<ɼmjjzC+y~>$|,+F)4RmmٲqGG⤪Q4/PJiFoyt8Qk@r@dc,VUU{OG`0}nn$(zp2VTQ<.%IENDB`openscad-2019.05/images/blackbottom.png0000644000076500000240000000260413402025764020360 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME& [MIDATX]lUޙneM J[l IEPV|Pb >؇W^LbH0ʃ&>)66mЦ44-Ν{|pb(p^&7sν9{=LRaE+qnhh;Ik^q˲닋%%%n^ "J'l6_k3 `eart:}<~HRyJT33?8<*wJ[[jR y>f'I"JQ~>%ZFfe$A˲~}…KPQQQnݺ\TJ$)4?B9]XXXM>8544tp]ME7g =8 A!mBo񏇇@k-֢/((F7:mZ:@qfdq0>D"iF061cUUUo`fk``@Pe03P({'CD^Mf˖Dtc `f h@XZ3DLmQf%f"BZrDfZ"f@@=Yjii!!<@4M, `jj> x1-ZW}^JRE7n !@3sL)< Zk(~9rgϾj۴ ̜Zw8iֵ8yM3/O)v޺ueY&<~ֺ "R}$zuUUUpu 3GryA]G嚚l5)BXlB;S};%yA%DRJBRj !C}ɮ;φ1cw>N2LR]0kBLPf $0Ӗe]F3]]]*7F$)% Tgmޥ"RR~n;v$2Ls.; R^3992M$HbI˲~;۶GgW$Icaa!϶[̜}ߘq3[@XJ+..|8ZVV6{憤UByw~~~v?;[J]ZZzq[}}}> kjjRRK0O<)eS:2'uWNVLf",ZVsQW VciSIENDB`openscad-2019.05/images/blackbottom1.png0000644000076500000240000000274013402025764020442 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME(FomIDATXVMlT}oOlvc@5֐XnEꆊ8J)P7]fdePUںH%H&d@3 y~޻n^71T G:ջ{w6[… q :tԉ hA)dΝ<== 9|`h/ X^^a׈WJoB۶lYj@6MQ{}^$ t2!$hf-EQs O2*6e2qUUQ!T au!555+++_OT@fCix'v}8eggg2iAQ;A' BCPd&*)Ə"I.*"?,xFղ8( 4MkDq:-sUUE`YzO(]oBH{>xԉ hA)dΝ<== 9|`h/ X^^a׈WJoB۶lYj@6MQK%6灡#S')Q?B!U^?R2IENDB`openscad-2019.05/images/crosswhite.png0000644000076500000240000000050513402025764020247 0ustar kintelstaff00000000000000PNG  IHDR 0pxobKGD_ pHYs  tIME%#m'tEXtCommentCreated with GIMPWIDATXX 0 LQUT9~"1iH9 p蚣%56-*<1i(^w4}oz Qy ) ?I@K^umX-@!5 и q^|_!K+䌲&g'hd{O{؜F=5vGmܑIENDB`openscad-2019.05/images/export-white.png0000644000076500000240000000102113402025764020506 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME .LIDATXϋqםZIhD-)tK"֬+Pdeee#hbe)ԕh?`RVY`cst`fe:11SGшmGDL~giDS ؋)lƳێ wVE'\Ӧئ8G *^a9alPq 1 eW1=8=%6m9 i`W MG)~mْwi]-̒M#uعy"ZE3U5\+g3|Lj)`#pO;Hq/zQCIh`PEOĿKjZ@ sEK>aƬ87Nn8]?gǕ|BETƫ[TO.)NIENDB`openscad-2019.05/images/front.png0000644000076500000240000000200513402025764017202 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME )2tEXtCommentCreated with GIMPWmIDATXVMh]EܹiLcfC+""*i,*P\p ,HB/%[4JK,"#w3k*̙͜96Aґ׺l6ann$P1NxOH ]`${sO$n9DggJ ˲J){E!YvQV/\\6҅u ߂W ~T=@B^woJ*/Bdԑ{zz m$I+Mӗ|^}& i"@FbZVU("7zcf}"*W>Pў1:_PUic̉([_n[x+ jmeZH뺞e,8!Ƙ cqFȆ/݀]gIENDB`openscad-2019.05/images/left.png0000644000076500000240000000161613402025764017013 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME ( tEXtCommentCreated with GIMPWIDATXWA\E<ƑM n"KDxH7a\r J0'BM,,!4ABp! qLzU]^"};I烾}UuW40wШčEQVբ0EQ}i3Swjs]"ҭQ61uSf˲$yf h48`fW<B@eWq˲,,[Ϗ"mE0DC]q3N;n[`08 3Bx̾pOMM#!j^3."IUo"򆪮5U#"EBnצf~y[U/LU"rϘC3'"^ل҉"Ǥf̋!Y}ݡwܣDbf牨R\ND "B?Z]]*011q̮393;s <17{Љ799~&<;;d²,dE$_."|flKt{6l6W)%3;kfsfY\/ѳfMjokTU ~WUU;مp-/̼#Om$"eYbS# 8B8ID/JJN۽gm׈]wE- _EdMwɔҙF "1~B3peb1O}L갶s#hmzz਱1pvhIENDB`openscad-2019.05/images/openscad.png0000644000076500000240000000156413402025764017657 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME &/ZtEXtCommentCreated with GIMPWIDATX͋\EϽUshu#BFQd|0E.t!Bquƅil$ ҈f#\0{շu1n4mC`~[NuΥ}dy,#.43/3s0D$s=}]E'"79Io/--2qʲnse^/4 McIENDB`openscad-2019.05/images/orthogonal.png0000644000076500000240000000172313402025764020234 0ustar kintelstaff00000000000000PNG  IHDR*( hPPLTE۶mmmIII$$$mI$mI$mmII$$mI$۶mmII$$mmII$$۶mmmIII$$ےmmIIm$$mmII$$mmII$$II$$$$۶۶mmImI$I$ےmmII$m$mmII$$mmII$$II$$$$ےmmIIm$$ImmII$$mmmII$$mmII$$II$$$$۶mmmIII$ےmImm$mI$mI$I$$۶۶mmImI$Iے۶mIm$mm۶I$mI۶$I$$ےmImm$IImI$mmmI$mI$I$$۶۶mmImI$I$ےmmII$m$ےmImm$II$mIm$Im$۶ےmmII$m$ImmII$$mmIm$Im$ImIm$I$mے۶mIm$mII$mےIm$Im$ےmmIIm$$ImmII$$mےmImImI*IDATXA!/OXQh%\ fC! ϪvG$ɒVՠ'H;H%OD)QQdD*[\̷XfTҮVJP! mA`y"y]tI=Ro*C SâUCnjIWsEϢJuD)U)&D[%^^f 5/VIռ>Z)V"hJBnD.X=IENDB`openscad-2019.05/images/perspective1.png0000644000076500000240000000056013402025764020470 0ustar kintelstaff00000000000000PNG  IHDR*( hPbKGDt pHYs  tIME tEXtCommentCreated with GIMPWIDATXA ȷ;E^zPHHS gk@*h#9c Uᤂ$/K`1?<w8rTk_isZ:*FȈY R(jA^#.hhAv U{Oϊt$J@Aƈh`P|E4 )v+JPE#>0"T;!N, Mvgǝٻ\Xy;̜#Zl:+_Y)ۀ@GDwxNS6˝q``;20е6$P'ٽ:$JT͠%Ͱ6gxa~ P}?e;E#Fí< @(03ץhBob>rJy5J* p+n@*\V[ݐ)qk< L;T9pAx[9 hN}MlJE|YgLiMė%8-oeZ֮z(]bD(/IfHR*P둼12|1^K*U3Ҳ O$WS$D `C ߀f^E`+K"{$B-J$y,XQJtY@HPF#*eKS1ð$Xؘ%d x|KzgQt"8d~#fl&nNJ/ nʬ\4omBFi&=mLKIENDB`openscad-2019.05/images/preview-32.png0000644000076500000240000000130113402025764017753 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME%z`IDATXýkA?3{QĈhc*+AQB4)'XU B*AA#" X(Ed;;{/ 77ofǼ7:6o/X \R`:IzD16X"ȇn̶CB,TdP'5 Px~Eo03qpJw@~Vz <Κ|TXoO; a֢}B6/'eUba};<S* ǀ+6m^2E`˘NXdYyxAO߀=k&e<h^ slj .&*m},X^[N&G]irL#a0@fC3YVSDY/ H[Iſ ccaZIENDB`openscad-2019.05/images/render-32.png0000644000076500000240000000135413402025764017561 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME!1IDATXŗ=ha{JҡIAEA*tP f.JhEAEZDԊDEDI=&?C< ;] 3q;XOJcN^]!2}t~H 5y xs 'm- Yr*8`ZmQخ™"߹RU?J @Sz.M:-pp+px\Ւk*Uڀ&LJ@Q`C=X, T84 |SP rzY9ޫ@Xlw9U`3Z%g11k\tP LCX<}e~~}o$eT?]DJx$8X r9P]D̺ⶇjsT=~h\dd D'"p&5Dkbq;L8~Uε,"Zg5_5AYTd6 12 XS˾1 0[ge#^ǣ:pd J,CLM s$J+ItiCo>t-s0ni,Sf@#Bz7*e aIENDB`openscad-2019.05/images/right.png0000644000076500000240000000156213402025764017176 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME (&-WtEXtCommentCreated with GIMPWIDATXV=\Uf2 j S,)T`PYHF"  ba%Blv"&ˢEW,]g}oc3!; {w9Db:Cy?bf(^$UUUksss H#Lb<$m4D䃉@;$$/>ܴje0M,G]S8!cXpkY v{}EιD"'<4MQ" z<111#@"Xy.)4?TJ=ADL7mmmJM1 ?fe˖*^`ض^)yf^FD LfB`zzI)|w]Mj$ax<>ADǂ ?XyO=^f&D8+Wp ^tu70)aСCAeeY)elU4]kaBDD>9o7֏i0fƫΝ,!ץ f>>@"0<ϛZk1Db演p8(///?gG$,v]"J%#'/!DV)5YVV6/ϿnBLlOOׯ9kVh-Jl0 ZZj˲7'FQZpAĘ`2SFa De}JR @'.>>`? k-w^nj])j=`i|r&S`<xj2~fy}Lsh{}̓wXU h`zᅤsے wR8L %뮤Ͻ&ŕ% Aj[r`?YYu8i6LIENDB`openscad-2019.05/images/scalemarkers.png0000644000076500000240000000053413402025764020533 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME #6 r/vIDATX; @@ D/؈DvbZL1$!3 ]DL';K{<;(V̟d0<NҪ.5yVۏPǴ*vrh' ]N#lXM[B{_E`ז:qY%G /yA:YJ P@e5ƭóѷd] yMC,IENDB`openscad-2019.05/images/surface.png0000644000076500000240000000264413402025764017513 0ustar kintelstaff00000000000000PNG  IHDR((mbKGD pHYs  tIME mtEXtCommentCreated with GIMPW IDATXXMlTUfs.)TE7T i?`&" n HZcЅFjTte$bl F M U-픺wt*HqӛLy;ssܘz(ZܩKs堘fb)v5ɼn@E e U|vv:(g! PYJ! B`[ ( "GUW0RHu U\8~X(mUEWVFVXI*d|bDaAᶗ&`+d>!BP )&=i\\O54\9pU",wm]ʣգFm^no'+6]C=l*ɀF8\nѓ֍Ԕb@p!afhʊ ĸ46.&C7'_+~$"!_{9gŋ `sss+r@$]\2:lh(6yD+S5jqJAK}pC1Is__Z &+c? H:HH0-i=Y"r f G* elMZ"w̐xEe&kM0ٗiatLɄJ! D*S\n40.[@C I8*mjp&'KS"^-cu j脵& 興|]@dc9)y@ZftO QP#0]bbq6q& n}S yL:E= 0Bc{0{w11s{kr3[7o@#LhЭ6TN'4jpxd/V7qcI $?N|M&}&L7}U&s݊N[@0D@1΁^xcWkmd[E&fϭ"~~秞y~G.&,h %MA:vWr%{\n5$ՕtwAEL̄ʉ=Wing&A"KGNr񿶴|fa=ۡA(%[r,*}kDwVt~EKS[Z*`MqOo'Ozw^ӷ[G^61>HT'/___DϜ9Ooذ%ܘ8,CIENDB`openscad-2019.05/images/surfaceWhite.png0000644000076500000240000000225513402025764020512 0ustar kintelstaff00000000000000PNG  IHDR$'g6bKGDt pHYs  tIME +`1tEXtCommentCreated with GIMPWIDATXXNI=m I8˛DŽĚH|YLVEFHq 1z(j]9 UUgNnBU`b0 c Z6H[B?F ,( f焱_jPfa0 lP3Y!lsm`(2e#`H رo͛_fj7yi*j#$" {u ̔P0E0dA)!?5DFXYY<ZAL`b3*Gb ψܽD(2UUUgV]@+&+/a^ˋ lmmMn&CDbɟXVU`%2EX3 ,lXo3i=3fT Uժ*k.Oe8??QɪJ(vxP`"'79r$ߙquu\r"KZBa 9zf@%oAAk^ $8?9 (gl°)2UePh)WGV&iKD\PD}4>qxm*&4d5M|^ b9N=gGB6hVssqz怺+]S?iS#@WӜWe|JFnc&X2r4#s ,\I1~ &ZGZ^^FQI t{&ks$e`0ڤfVP|O#D +eӶ*Di?|XcjuʱL$LTbhuÝ! f(pݥc"?>~|4Ҽ*H KZޣczGws2Ƙ~h|dĨC̱\- m{{{O~t:899Cy"W: aww(dY's#LKpxxo?_oƸt]_>XeuxOW1GIENDB`openscad-2019.05/images/up.png0000644000076500000240000000156413402025764016507 0ustar kintelstaff00000000000000PNG  IHDR szzbKGD pHYs  tIME '1tEXtCommentCreated with GIMPWIDATX͋\EϽUshu#BFQd|0E.t!Bquƅil$ ҈f#\0{շu1n4mC`~[NuΥ}i*4= ̩:\O_AȍiOڇ':xqΝ˲|0tQUMUMDFY31ORJG?opRTUՁJDO/1N罛֝ UU1!"DRK?t^DެꡙKKK|ꅲ,/\-dfY ;<IENDB`openscad-2019.05/images/wireframe1.png0000644000076500000240000000163213402025764020121 0ustar kintelstaff00000000000000PNG  IHDR((mbKGD pHYs  tIME ,wtEXtCommentCreated with GIMPWIDATXOh@[ZA+(ѓ.Tg=7x"h+( PEqZ,b^l6>ٝ{_ ԭnuڼ*/Nۀ0 l;`[ . lV c."'p6(@^mm`V\ s]#oz;10v6Es1 q7| CpH`km/&LW6^+ j"~%V'(evVC3 GsDڶQDpaaV*.偍Io ЊBI5N!icTi5Ͻ<)9,]I(iX\%۪xL_ e"fulx:@ О$C$X/k} JC([FKe(gHK1)Lj|+5_-j `'li<͊ܔhD?;U͈S^*t<A"ط࣮NE^YM"UkK&-\8 >9+P:jݏFЋ\V<H'mS,nAio˼ǽ+ʟ uF"9<WZSF; kq|ՙ8ohB2~[8{>} P~F4ݐ7E_56T?"@nQ{tvnWԛhOu[*Aɣ@'IENDB`openscad-2019.05/images/wireframeWhite.png0000644000076500000240000000130613402025764021037 0ustar kintelstaff00000000000000PNG  IHDR'&GbKGDt pHYs  tIME.4JtEXtCommentCreated with GIMPW.IDATX1@y'Le!r >\i{Z\ ;Ⱦu&o ^r"K:1p |nw|V8U <w4Q @t@g"rS8U $XDx|4`ȧ_UU5T5\/N̹r`m6qߟδYXہ[ M ;(v-R y$fB7;fw@O0΁qkjU0mAtApSz}&+\c+ mȍU/evY^s>;C-pCTLD^{,w5Muj ˍ1N˝5`ՙ +i; ذ$Zޤ`jRS' [v7Oi7"v[{r9.l{֐YK~ְs[˝GmG$~R\kT䤁d[|Cm hL5P'^D^?/md>gIENDB`openscad-2019.05/images/zoom-all-white.png0000644000076500000240000000163713402025764020734 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME  >IDATXWKKQu&FM4QRDD5V?`,JEZ,"WvQM; Ei\Bij%)T :q&&C0:IcY9sc.!D"B4JaC.19 Qh4:Z[[;1m B⊢|d2/GFF~:WY"08kz#۽PJ"`c+oPJ=QS߀$)foiE9NbEQ_9o$)477oc1@.{Ŧmlltu:Ar}%OjB$}ٹW8K,{0LWCPW0!@,o'''R\eƷl 4ݠ c0a{dYkK嶳TUm6jL /o&{(rj|ecU8:|[[[O⭮ZBD$1lD:0q5Ͽ:889??OyYgbj6nZSSӂfy}zwwclӹւH$l(lDt.`xxx'JrI~-&) Gs<OkCJgSSS(b:NX,6gXt:Wr%dyy__ӊQB-ߴE˲@k444|G(l&z{BxXYYE6˲)dll'wt>3syzic6ad2) B8.o >*r !!uh0@i0b܉!Nm 0 cU!dO(-i.0߬W1Tl `&f=/0.I 8`+-@9hhhR.<2477,!7iZfeD=_q(jY]]kazYG"\rBUU%񍍍=1NBBoϲ,_D"ObMMMt:4%)BfggebxMM!yy#OH~:::<,n{f```' y~(s%7:;;+]O䮋x',S`p„Q^('''ͩ1J^˲-g0S9SOٻPZ2#Az-cy~ݩxKzWGX[wTƌhIENDB`openscad-2019.05/images/zoom-text-in-white.png0000644000076500000240000000110513402025764021542 0ustar kintelstaff00000000000000PNG  IHDR szz pHYs  tIME #bIDATXjTAQp,D1^@ {q \J_@pp(!q fP+*~nJsLȐtW]]WugQ]3F*ﵵt DRJe@^7$sߡ-Gb,ZLg}@UU;H)}v '){p#)Ǒ}/ _٦{N(}M7K1&Rm/:ڏou DP=aaM+3j_/(giPG zJpuSoP?Ez&{a`XH)-OS%` C ԁZ`xay n|y E`Aw, Zu%sSn63l \7AVo9u{t]LF!PUExxRXx>pIDATXVOHQۙݙ%EW\t ;۟]DAXxB .k9t)Hw[eEUWYMyeMC`{}vKwQJt].hnnVhv1m=qܚ$Ix^lii96;;^fð Ƙ`ƅ#&@GkA>Kt$Ic?(cvBHKuud2r`p8O0󬪪t:E vfcBl6w=g| FFF*r !!uL(Z@) 0ƀ1NX,cg2 p^QJsp2, 2c彛-ky58Kgƥ] k!>(J²Y_#olkmmVVV0ƸӁ@ a}+-- B*s"nw盘ݍ)MT0{YRUUL͒1^)\TTtullفF_&yE9 t:ObQKoD4:p8zl6L1"B/س@8>~D[[gyy^^^>=00V[[`ccN>Oŷ~}iIvot]o*hfC JbfSʅ*1::䦦Տfv>u@ 6R(-ョ766>|tVB#GU,[tݫa\h^DJiq<=VUHn2(wǑy(BHNUU[Sg[cBIENDB`openscad-2019.05/info.pri0000644000076500000240000000160013402025764015546 0ustar kintelstaff00000000000000message("Configuration") message("=============") message("") contains(CONFIG, debug) { message("Debug mode: enabled") } else { message("Debug mode: disabled") } contains(DEFINES, ENABLE_EXPERIMENTAL) { message("Experimental features: enabled") } else { message("Experimental features: disabled") } message("") message("Input Drivers") contains(DEFINES, ENABLE_HIDAPI) { message("- HID API Driver (enabled)") } else { message("- HID API Driver (disabled)") } contains(DEFINES, ENABLE_SPNAV) { message("- Space Navigator Library Driver (enabled)") } else { message("- Space Navigator Library Driver (disabled)") } contains(DEFINES, ENABLE_JOYSTICK) { message("- Joystick Driver (enabled)") } else { message("- Joystick Driver (disabled)") } contains(DEFINES, ENABLE_DBUS) { message("- DBus Remote Driver (enabled)") } else { message("- DBus Remote Driver (disabled)") } openscad-2019.05/locale/LINGUAS0000644000076500000240000000005313402025764016364 0ustar kintelstaff00000000000000# available languages fr ru de cs es pl uk openscad-2019.05/locale/cs.po0000644000076500000240000012746413432700636016325 0ustar kintelstaff00000000000000# Czech translations for OpenSCAD package. # Copyright (C) 2014 THE OpenSCAD'S COPYRIGHT HOLDER # This file is distributed under the same license as the OpenSCAD package. # Miro Hrončok , 2014. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2013.02.24\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2015-03-06 10:27+0100\n" "Last-Translator: Miro Hrončok \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.7.3\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Poedit-SourceCharset: UTF-8\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "O aplikaci OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "OK" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Předvolby" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 #, fuzzy msgid "Reset Trim" msgstr "Výchozí pohled" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 #, fuzzy msgid "Rotation" msgstr "&Dokumentace" #: objects/ui_AxisConfigWidget.h:865 #, fuzzy msgid "Zoom" msgstr "Přiblížit" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 #, fuzzy msgid "ViewPort rel.
Translation" msgstr "Vložit posun pohl&edu" #: objects/ui_AxisConfigWidget.h:872 #, fuzzy msgid "ViewPort rel.
Rotation" msgstr "Vložit posun pohl&edu" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 #, fuzzy msgid "SpaceNav" msgstr "mezer" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Konzole" #: objects/ui_Console.h:46 #, fuzzy msgid "Save As" msgstr "Uložit &jako..." #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "Seznam OpenSCAD písem" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "&OK" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Kopírovat do schránky" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Filtr:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

Tento seznam zobrazuje písma momentálně dostupná pro " "OpenSCAD.

Příklad:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Vítá vás OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Nový" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Otevřít" #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Nápověda" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Nedávné" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Otevřít nedávný soubor" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Příklady" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "Otevřít příklad" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "Příště nezobrazovat" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Verze" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Info o knihovnách a sestavení" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Podrobné informace o tomto sestavení OpenSCADu a použitých knihovnách" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Nový" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "&Otevřít..." #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "&Uložit" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Uložit &jako..." #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "Zno&vu načíst" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "U&končit" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "&Zpět" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "Znov&u" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 #, fuzzy msgid "Ctrl+Y" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "Vy&jmout" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Kopírovat" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "V&ložit" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "Odsad&it" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "Zakomen&tovat" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "&Odkomentovat" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Kopírovat do schránky" #: objects/ui_MainWindow.h:956 #, fuzzy msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "Vložit posun pohl&edu" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "Vlo&žit rotaci pohledu" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Kopírovat do schránky" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "Zv&ětšit písmo" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "Z&menšit písmo" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "Skrýt &editor" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "Znovu &načíst a zobrazit" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "&Zobrazit" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "Vy&renderovat" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "Zkontrolovat &správnost" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "&Ukázat ATS..." #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "Ukázat CSG s&trom..." #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "Ukázat CSG &produkty..." #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "Exportovat jako &STL..." #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "Exportovat jako &OFF..." #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "Náhled" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "Povrchy" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "Drátové zobrazení" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Vše společně" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "Zobrazit hrany" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Zobrazit osy" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Zobrazit zaměřovač" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Zobrazit pravítko" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Animovat" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "Ses&hora" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "Ze&spoda" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "Z&leva" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "Z&prava" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "Zepře&du" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "Ze&zadu" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "Dia&gonálně" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "Vy¢rovat" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "Pe&rspektivně" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "&Ortogonálně" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "Skrýt &terminál" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "&O aplikaci" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "&Dokumentace" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Zapomenout nedávné" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "Exportovat jako &DXF..." #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "&Zavřít" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "Předvolb&y" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "&Najít..." #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "Najít a na&hradit..." #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "Najít &další" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "Najít &předchozí" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "Hledat vybraný řetěze&c" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "&Vyprázdnit mezipaměť" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "Domovská &stránka OpenSCADu" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "&Automaticky načítat a zobrazovat" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "Exportovat jako &obrázek..." #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "Exportovat jako &CSG..." #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "&Informace o knihovnách" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "&Adresář s knihovnami..." #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Výchozí pohled" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "Seznam &písem" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "Exportovat jako S&VG..." #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "Exportovat jako &AMF..." #: objects/ui_MainWindow.h:1100 #, fuzzy msgid "Export as &3MF..." msgstr "Exportovat jako &AMF..." #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Přiblížit" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Oddálit" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "Zobrazit vše" #: objects/ui_MainWindow.h:1111 #, fuzzy msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "Pře&vést tabulátory na mezery" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Skrýt nástrojové lišty" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "Z&rušit odsazení" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "&Tahák" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Zpráva" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Čas:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Kroky:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Ukládat obrázky" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Soubor" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "Nedávné &soubory" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "&Příklady" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "&Exportovat" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Upravit" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "&Design" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Zobrazit" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "&Nápověda" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Najít" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Nahradit" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Hledaný řetězec" #: objects/ui_MainWindow.h:1140 #, fuzzy msgid "Prev." msgstr "Náhled" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Hotovo" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Nahradit za" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Vše" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "OpenGL varování" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "Povolit OpenCSG" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Zobrazit tuto zprávu znovu" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Zavřít" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "" #: objects/ui_ParameterWidget.h:174 #, fuzzy msgid "Automatic Preview" msgstr "&Automaticky načítat a zobrazovat" #: objects/ui_ParameterWidget.h:175 #, fuzzy msgid "Show Details" msgstr "Zobrazit osy" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "" #: objects/ui_ParameterWidget.h:177 #, fuzzy msgid "Hide Details" msgstr "Skrýt nástrojové lišty" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "" #: objects/ui_ParameterWidget.h:181 msgid "reset all parameters to the currently selected preset" msgstr "" #: objects/ui_ParameterWidget.h:183 #, fuzzy msgid "Reset" msgstr "Výchozí pohled" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "3D zobrazení" #: objects/ui_Preferences.h:1439 #, fuzzy msgctxt "preferences" msgid "Advanced" msgstr "Pokročilé" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Editor" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Aktualizace" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Funkce" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Povolit/Zakázat experimentální funkce" #: objects/ui_Preferences.h:1446 #, fuzzy msgid "Axes" msgstr "Zobrazit osy" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Barevné téma:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Zobrazovat varování a chyby v 3D okně" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Varianta editoru" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Jednoduchý editor" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "Editor QScintilla" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(vyžaduje restart aplikace)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Písmo" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Barva zvýrazňování syntaxe" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd a kolečko myši mění velikost písma" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Odsazování" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Automatické odsazování" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Odsazovat pomocí" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "mezer" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "tabulátorů" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Velikost odsazení" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Šířka tabulátoru" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Funkce klávesy tabulátor" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "odsadí" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "vloží znak tabulátoru" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Zobrazovat mazery" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "nikdy" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "vždy" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "pouze za odsazením" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Velikost" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Vzhled" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "Zvýrazňovat párové závorky" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Zvýrazňovat aktuální řádek" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Zalamování řádek" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "vypnout" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "zalamovat na úrovni znaků" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "zalamovat na úrovni slov" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Odsazení zalomených řádek" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Pozice symbolu zalomení" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Styl" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "vždy stejný" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "jako počátek" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "odsazený" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Začátek" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "za textem" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "konec řádky" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "levý okraj" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Konec" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Automaticky vyhledávat aktualizace" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Včetně nestabilních verzí" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Zkontrolovat nyní" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Poslední kontrola:" #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Zkontrolovat nyní" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Aplikace" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Zobrazit osy" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Zobrazovat varování o vlastnostech" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Povolit pro OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Vypnout renderování při" #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "prvcích" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Vynutit zobrazení Goldfeather" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "Velikost CGAL cache" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "MB" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "Velikost PolySet cache" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Povolit současné otevření více dokumentů" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Povolit zaparkování editoru a konzole na různá místa" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "Povolit plovoucí editor a konzoli" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Zobrazovat uvítací obrazovku" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "Povolit lokalizaci rozhraní OpenSCADu (vyžaduje restart aplikace)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Pohled: posun = [ %.2f %.2f %.2f ], rotace = [ %.2f %.2f %.2f ], vzdálenost " "= %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Bezejmenný.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Chyba kompilace." #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Chyba při kompilaci '%1'." #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "Kompilace vyvolala %1 varování." msgstr[1] "Kompilace vyvolala %1 varování." msgstr[2] "Kompilace vyvolala %1 varování." #: src/mainwin.cc:1186 msgid " For details see console window." msgstr " Pro podrobnosti nahlédněte do konzole." #: src/mainwin.cc:1579 #, fuzzy msgid "Failed to open file for writing" msgstr "Nepodařilo se otevřít soubor %s: %s" #: src/mainwin.cc:1589 #, fuzzy, c-format msgid "Saved design '%s'." msgstr "Načten design '%s'." #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Uložit soubor" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "OpenSCAD designy(*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 již existuje.\n" "Chcete jej nahradit?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Aplikace" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "Dokument byl pozměněn.\n" "Opravdu jej chcete znovu načíst?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "Exportovat %s soubor(ů)" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "%1 Soubor(ů) (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Exportovat CSG soubor" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "CSG soubory (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Exportovat obrázek" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "PNG Soubory (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Konzole" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "Dokument byl pozměněn." #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "Chcete uložit změny?" #: src/mainwin.cc:3202 #, fuzzy msgid "/Untitled" msgstr "Bezejmenný" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Fontconfig potřebuje aktualizovat cache.\n" "To může trvat až několik minut." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Varování: Můžete zaznamenat chyby zobrazení pomocí OpenCSG.\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Varování: Chybí OpenGL funkce pro OpenCSG - OpenCSG bylo vypnuto.\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Vysoce doporučujeme používat OpenSCAD na systému s OpenGL 2.0 nebo novější.\n" "Zde je informace o vašem vykreslovacím systému:\n" #: src/QGLView.cc:159 #, fuzzy msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "GLEW verze %s\n" "%s (%s)\n" "OpenGL verze %s\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 #, fuzzy msgid "Toggle Perspective" msgstr "Pe&rspektivně" #: src/settings.cc:172 msgid "After indentation" msgstr "za odsazením" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:279 #, fuzzy msgid "Do you want to delete the current preset?" msgstr "Chcete uložit změny?" #: src/parameter/ParameterWidget.cc:281 msgid "Do you want to delete the current preset '%1'?" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 #, fuzzy msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" "%1 již existuje.\n" "Chcete jej nahradit?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "Základy" #: examples/examples.json:13 msgid "Functions" msgstr "Funkce" #: examples/examples.json:20 msgid "Advanced" msgstr "Pokročilé" #: examples/examples.json:30 msgid "Parametric" msgstr "" #: examples/examples.json:34 msgid "Old" msgstr "Staré" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" #~ msgid "Untitled.csg" #~ msgstr "Bezejmenný.csg" #, fuzzy #~ msgid "Untitled.png" #~ msgstr "Bezejmenný.csg" #~ msgid "<" #~ msgstr "<" #~ msgid ">" #~ msgstr ">" #~ msgid "Shapes" #~ msgstr "Tvary" #~ msgid "Extrusion" #~ msgstr "Vytažení" #~ msgid "Untitled%1" #~ msgstr "Bezejmenný%1" #~ msgid "Top" #~ msgstr "Shora" #~ msgid "Back" #~ msgstr "Zezadu" #~ msgid "" #~ "\n" #~ "Using QGLWidget\n" #~ "\n" #~ msgstr "" #~ "\n" #~ "Používám QGLWidget\n" #~ "\n" #~ msgid "About OpenSCAD " #~ msgstr "O OpenSCADu " #~ msgid "Paste font selector to Editor Window" #~ msgstr "Vložit výběr písma do zdrojového kódu" #~ msgid "Check for Update.." #~ msgstr "Zkontrolovat aktualizaci..." #~ msgid "Cornfield" #~ msgstr "Kukuřice" #~ msgid "Metallic" #~ msgstr "Kov" #~ msgid "Sunset" #~ msgstr "Západ slunce" #~ msgid "Compile and &Render (CGAL)" #~ msgstr "Zkompilovat a vy&renderovat" #~ msgid "CGAL Grid Only" #~ msgstr "CGAL mřížka" #~ msgid "Editor for SCAD code" #~ msgstr "Editor SCAD kódu" #~ msgid "OpenGL preview of SCAD model" #~ msgstr "OpenGL náhled SCAD modelu" #~ msgid "Console messages" #~ msgstr "Zprávy terminálu" #~ msgid " vertices:" #~ msgstr "vrcholy:" #~ msgid "{ Outer boundary = " #~ msgstr "{ Vnější hranice = " #~ msgid "{ Unbounded polygon." #~ msgstr "{ Neohraničený polygon." #~ msgid " holes:" #~ msgstr "díry:" #~ msgid " Hole #" #~ msgstr " Díra #" #~ msgid "" #~ "WARNING: minkowski() and hull() is not implemented for 2d objects with " #~ "holes!" #~ msgstr "" #~ "VAROVÁNÍ: minkowski() a hull() nejsou implementovány pro 2D objekty s " #~ "dírami" #~ msgid "WARNING: minkowski() could not get any points from object 1!" #~ msgstr "VAROVÁNÍ: minkowski() nenalezl žádné body v objektu 1!" #~ msgid "WARNING: minkowski() could not get any points from object 2!" #~ msgstr "VAROVÁNÍ: minkowski() nenalezl žádné body v objektu 2!" #~ msgid "CGAL error in CGAL_Nef_polyhedron's %s operator: %s" #~ msgstr "CGAL chyba v CGAL_Nef_polyhedron operátoru %s: %s" #~ msgid "WARNING: hull() does not support mixing 2D and 3D objects." #~ msgstr "VAROVÁNÍ: hull() neumožňuje kombinovat 2D a 3D objekty." #~ msgid "" #~ "Hull() currently requires a valid 2-manifold. Please modify your design. " #~ "See http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/" #~ "STL_Import_and_Export" #~ msgstr "" #~ "Hull() nyní podporuje jen validní 2-manifold objekty. Upravte svůj " #~ "design. Viz http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/" #~ "STL_Import_and_Export" #~ msgid "Rendering cancelled." #~ msgstr "Renderování zrušeno." #~ msgid "" #~ "DEPRECATED: The %s() module will be removed in future releases. Use %s() " #~ "instead." #~ msgstr "" #~ "ZASTARALÉ: Zápis %s() bude v dalších verzích odstraněn. Místo něj " #~ "použijte %s()." #~ msgid "OpenSCAD - New Document[*]" #~ msgstr "OpenSCAD - Nový dokument[*]" #~ msgid "ERROR: Compilation failed! (no top level object found)" #~ msgstr "CHYBA: Kompilace selhala! (nenalezen hlavní objekt)" #~ msgid "ERROR: Compilation failed!" #~ msgstr "CHYBA: Kompilace selhala!" #~ msgid "yes" #~ msgstr "ano" #~ msgid "no" #~ msgstr "ne" #~ msgid " Vertices: %6d" #~ msgstr " Vrcholů: %6d" #~ msgid " Halfedges: %6d" #~ msgstr " Půlhran: %6d" #~ msgid " Edges: %6d" #~ msgstr " Hran: %6d" #~ msgid " Faces: %6d" #~ msgstr " Trojúhelníků: %6d" #~ msgid " Simple: %6s" #~ msgstr " Jednoduchý: %6s" #~ msgid " Valid: %6s" #~ msgstr " Validní: %6s" #~ msgid " Facets: %6d" #~ msgstr " Stěn: %6d" #~ msgid " Volumes: %6d" #~ msgstr " Objemů: %6d" #~ msgid "Rendering finished." #~ msgstr "Renderování dokončeno." #~ msgid "Export OFF File" #~ msgstr "Exportovat OFF soubor" openscad-2019.05/locale/de.po0000644000076500000240000013026013432700636016274 0ustar kintelstaff00000000000000# German translations for OpenSCAD package. # Copyright (C) 2013 THE OpenSCAD'S COPYRIGHT HOLDER # This file is distributed under the same license as the OpenSCAD package. # Torsten Paul , 2014. # Michael Frey , 2018. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2014.01.05\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2019-02-17 12:57+0100\n" "Last-Translator: Torsten Paul \n" "Language-Team: German\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.1.1\n" "X-Poedit-SourceCharset: UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "Über OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "OK" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Einstellungen" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "Trim" #: objects/ui_AxisConfigWidget.h:837 msgid "Reset Trim" msgstr "" "Trim\n" "zurücksetzen" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" "Automatisches\n" "Trimmen der Achsen" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "Achse 2" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "Achse 0" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "Achse 3" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "Achse 6" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "Achse 8" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "Achse 7" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "Achse 5" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "Achse 1" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "Achse 4" #: objects/ui_AxisConfigWidget.h:864 msgid "Rotation" msgstr "Rotation" #: objects/ui_AxisConfigWidget.h:865 msgid "Zoom" msgstr "Zoom" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "X" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "Verstärkung" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "Y" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "Z" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "Translation" #: objects/ui_AxisConfigWidget.h:871 msgid "ViewPort rel.
Translation" msgstr "Ansichtabhängige
Translation" #: objects/ui_AxisConfigWidget.h:872 msgid "ViewPort rel.
Rotation" msgstr "" "Ansichtabhängige\n" "Rotation" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "Achseneinstellung:" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" "Treiber Auswahl: Änderungen erfordern einen Neustart von " "OpenSCAD)" #: objects/ui_AxisConfigWidget.h:875 msgid "SpaceNav" msgstr "SpaceNav" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "HIDAPI" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "QGamepad" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "Joystick" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "DBus" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "Achsenzuordnung:" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "Knopf 2" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "Knopf 3" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "Knopf 5" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "Knopf 6" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "Knopf 4" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "Knopf 9" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "Knopf 8" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "Knopf 7" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "Knopf 0" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "Knopf 1" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "Knopf 12" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "Knopf 10" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "Knopf 11" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "Knopf 13" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "Knopf 14" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "Knopf 15" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Konsole" #: objects/ui_Console.h:46 msgid "Save As" msgstr "Speichern Unter..." #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "OpenSCAD Fontliste" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "OK" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Kopieren" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Filter:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

Diese Liste zeigt die Fonts, die momentan mit OpenSCAD " "registriert sind.

Beispiele:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Willkommen zu OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Neu" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Öffnen" #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Hilfe" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Zuletzt benutze Dateien" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Datei öffnen" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Beispiele" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "Beispiel öffnen" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "Dialog nicht wieder anzeigen" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Version" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Versionsinformationen" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Detailierte Informationen über diese OpenSCAD Version" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Neu" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "Ö&ffnen..." #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "&Speichern" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Speichern &Unter..." #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "Neu &laden" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "Beenden" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "&Rückgängig" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "&Wiederholen" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 msgid "Ctrl+Y" msgstr "Ctrl+Y" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "&Ausschneiden" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Kopieren" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "Einfügen" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "Einzug er&höhen" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "K&ommentieren" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "Kommentar ent&fernen" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Viewport kopieren" #: objects/ui_MainWindow.h:956 msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+C" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "Aktuelle Versch&iebung einfügen" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "Aktuelle Ro&tation einfügen" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Viewport kopieren" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "Font&größe erhöhen" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "Fontgröße &verringern" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "Editor verstecken" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "Neu &laden und Vorschau" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "&Vorschau" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "&Rendern" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "&3D-Druck" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "F8" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "&Design überprüfen" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "A&ST Baum anzeigen..." #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "CSG &Baum anzeigen..." #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "CSG &Gleichungen anzeigen..." #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "&STL exportieren..." #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "F7" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "&OFF exportieren..." #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "&Vorschau" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "&Flächen anzeigen" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "&Gittermodell" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Kom&binierte Anzeige" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "&Kanten anzeigen" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Koordinaten&achsen anzeigen" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Rotations&mittelpunkt anzeigen" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Axen&einteilung anzeigen" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Animation" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "&Oben" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "&Unten" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "&Links" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "&Rechts" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "Vor&n" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "&Hinten" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "&Diagonal" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "&Zentriert" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "&Perspektivisch" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "Or&thogonal" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "Konsole verstecken" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "Über &OpenSCAD" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "&Dokumentation" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Liste der zuletzt benutzen Dateien löschen" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "&DXF exportieren..." #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "Schließen" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "Ei&nstellungen" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "&Suchen..." #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "Suchen und &Ersetzen..." #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "&Weiter suchen" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "Rüc&kwärts suchen" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "&Auswahl suchen" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "&Cache leeren" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "OpenSCAD &Homepage" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "&Automatisch neu Laden und Vorschau" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "&Bild exportieren..." #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "&CSG exportieren..." #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "&Versionsinformationen" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "Bibli&otheken anzeigen..." #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Ans&icht zurücksetzen" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "&Fontliste" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "S&VG exportieren..." #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "&AMF exportieren..." #: objects/ui_MainWindow.h:1100 msgid "Export as &3MF..." msgstr "&3MF exportieren..." #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Vergrößern" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Verkleinern" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "Alle&s anzeigen" #: objects/ui_MainWindow.h:1111 msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+V" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "Tabs in Leerzeichen &umwandeln" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Symbolleisten verstecken" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "Einzug ver&mindern" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "&Befehlsübersicht" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "Customizer verstecken" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Message" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Zeit:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Schritte:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Bilder ausgeben" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Datei" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "Zuletzt benutze &Dateien" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "&Beispiele" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "&Exportieren" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Bearbeiten" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "D&esign" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Ansicht" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "&Hilfe" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Suchen" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Ersetzen" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Suchtext" #: objects/ui_MainWindow.h:1140 msgid "Prev." msgstr "Vorheriges" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "Nächstes" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Fertig" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Ersetzen mit" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Alles" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "Customizer" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "OpenGL Warnung" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" "\n" "\n" "

" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "OpenCSG benutzen" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Diesen Dialog wieder anzeigen" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Schließen" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "Form" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "Parameter" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "Beschreibung" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "aktuelle Voreinstellung speichern" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "aktuelle Voreinstellung löschen" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "-" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "Voreinstellungsauswahl" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "neue Voreinstellung hinzufügen" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "+" #: objects/ui_ParameterWidget.h:174 msgid "Automatic Preview" msgstr "Automatische Vorschau" #: objects/ui_ParameterWidget.h:175 msgid "Show Details" msgstr "Details anzeigen" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "Details Inline anzeigen" #: objects/ui_ParameterWidget.h:177 msgid "Hide Details" msgstr "Details verstecken" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "nur Beschreibung" #: objects/ui_ParameterWidget.h:181 msgid "reset all parameters to the currently selected preset" msgstr "alle Parameter auf die aktuelle Voreinstellung zurücksetzen" #: objects/ui_ParameterWidget.h:183 msgid "Reset" msgstr "zurücksetzen" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "3D Ansicht" #: objects/ui_Preferences.h:1439 msgctxt "preferences" msgid "Advanced" msgstr "Erweitert" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Editor" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Aktualisieren" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Funktionen" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Experimentelle Erweiterungen ein-/ausschalten" #: objects/ui_Preferences.h:1446 msgid "Axes" msgstr "Achsen" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "Treiberkonfiguration und Achsenzuordnung" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "Knöpfe" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "3D-Druck" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "3D-Druckdienstleister" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Farbschema:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Fehler und Warnungen in der 3D Ansicht anzeigen" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Editor" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Einfacher Editor" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "QScintilla Editor" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(Neustart erforderlich)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Font" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Syntaxhervorhebung" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd+Mausrad zum Vergrößern des Textes benutzen" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Einrückung" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Automatisch einrücken" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Einrücken mit" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "Leerzeichen" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "Tabs" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Einrückungstiefe" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Tabulatorschrittweite" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Funktion der Tab-Taste" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "Einrücken" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "Tab einfügen" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Formatierungsymbole anzeigen" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "nie" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "immer" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "nur nach Einrückung" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Größe" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Anzeige" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "zusammengehörige Klammern hervorheben" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Aktuelle Zeile hervorheben" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "Zeilennummern anzeigen" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Zeilenumbruch" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "nie" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "an jedem Zeichen" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "an Wörtern" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Einrückung nach Zeilenumbruch" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Zeilenumbruch anzeigen" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Stil" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "Fest" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "Wie vorherige Zeile" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "Eingerückt" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Anfang" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "Text" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "Rand" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "Seitenrand" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Ende" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Automatisch nach Aktualisierungen suchen" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Entwickler-Versionen einschließen" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Jetzt suchen" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Zuletzt gesucht: " #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "OctoPrint" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "laden" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Jetzt suchen" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Application" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Koordinaten&achsen anzeigen" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Kompatibilitätswarnung anzeigen" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Aktivieren bei OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Rendern abbrechen ab " #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "Elementen" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Goldfeather Algorithmus erzwingen" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "CGAL Cache Größe" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "MB" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "PolySet Cache Größe" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Öffnen von mehreren Dokumenten erlauben" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Verschieben des Editor und Konsolen-Fensters erlauben" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "Separate Editor und Konsolen-Fenster erlauben" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Startbildschirm anzeigen" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "Lokalisierung der GUI einschalten (benötigt Neustart von OpenSCAD)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "Fenster nach vorne bringen nach automatischem Neuladen" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "Ton abspielen wenn rendern abgeschlossen ist" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Ansicht: Verschiebung = [ %.2f %.2f %.2f ], Rotation = [ %.2f %.2f %.2f ], " "Abstand = %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "Datei\"%s\" konnte nicht zum Export geöffnet werden" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "FEHLER: \"%s\" Schreibfehler. (Speichervoll?)" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Unbenannt.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Fehler" #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Fehler beim Kompilieren von '%1'." #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "%1 Warnung beim Kompilieren." msgstr[1] "%1 Warnungen beim Kompilieren." #: src/mainwin.cc:1186 msgid " For details see console window." msgstr " Für Details das Konsolen-Fenster öffnen." #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "Datei konnte nicht zum schreiben geöffnet werden" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "Saved design '%s'." #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "Fehler beim speichern des Designs" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Datei speichern" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "OpenSCAD Designs (*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 existiert bereits.\n" "Möchten Sie die Datei ersetzen?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Application" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "Das Dokument ist verändert.\n" "Möchten Sie die Datei wirklich neu laden?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "%1 Datei exportieren" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "%1 Dateien (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Export CSG File" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "CSG Dateien (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Image exportieren" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "PNG Dateien (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Konsole" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "Customizer" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "Das Dokument wurde verändert." #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "Möchten Sie die Änderungen speichern?" #: src/mainwin.cc:3202 msgid "/Untitled" msgstr "/Unbenannt" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "Unbekannter Fehler" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "Kritischer Fehler" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Fontconfig muss den Font-Cache aktualisieren.\n" "Dies kann einige Minuten dauern." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "Fehler" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Achtung: Es können Darstellungsfehler beim Anzeigen der Vorschau auftreten.\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Achtung: Der Funktionsumfang des OpenGL Treibers reicht für die Vorschau " "nicht aus - OpenCSG wurde deaktiviert.\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Für die korrekte Anzeige der Vorschau benötigt OpenSCAD mindestens OpenGL " "2.0.\n" "Informationen zum OpenGL Treiber:\n" #: src/QGLView.cc:159 msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "Achse %d" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "Achse %d (invertiert)" #: src/settings.cc:90 msgid "Toggle Perspective" msgstr "Perspektive umschalten" #: src/settings.cc:172 msgid "After indentation" msgstr "nach Einrückung" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "Änderungen an den aktuelle Voreinstellung nicht gespeichert" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" "Die Änderungen an der akutellen Voreinstellung %1 sind noch nicht " "gespeichert.Möchten Sie die Änderungen wirklich zurücksetzen?" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "aktuelle Voreinstellung löschen" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "aktuelle Voreinstellung speichern" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "JSON file ist nicht schreibbar" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "Standardwerte des Designs" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" "Die Änderungen an der akutellen Voreinstellung %1 sind noch nicht " "gespeichert.Möchten Sie wirklich die Voreinstellung wechseln und somit Ihre " "Änderungen verlieren?" #: src/parameter/ParameterWidget.cc:279 msgid "Do you want to delete the current preset?" msgstr "Möchten Sie die aktuelle Voreinstellung löschen?" #: src/parameter/ParameterWidget.cc:281 msgid "Do you want to delete the current preset '%1'?" msgstr "Möchten Sie die aktuelle Voreinstellung '%1' löschen?" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "Einen neuen Satz Voreinstellung erzeugen" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "Bitte einen Namen für diese Voreinstellung eingeben" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "Set %1 existiert bereits." #: src/parameter/ParameterWidget.cc:528 msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "Set %1 existiert bereits. Mochten Sie dieses Set ersetzen?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "Voreinstellung speichern" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "" "%1 wurde gefunden, konnte aber nicht gelesen werden. Möchten Sie %1 " "überschreiben?" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "(nicht unterstützt)" #: examples/examples.json:2 msgid "Basics" msgstr "Grundlagen" #: examples/examples.json:13 msgid "Functions" msgstr "Funktionen" #: examples/examples.json:20 msgid "Advanced" msgstr "weiterführende Beispiele" #: examples/examples.json:30 msgid "Parametric" msgstr "Parametrische Beispiele" #: examples/examples.json:34 msgid "Old" msgstr "Frühere" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" #~ msgid "Axis" #~ msgstr "Achse" #~ msgid "Untitled.csg" #~ msgstr "Unbenannt.csg" #~ msgid "Untitled.png" #~ msgstr "Unbenannt.png" #, fuzzy #~ msgid "Parameter Widget" #~ msgstr "Parameter" #~ msgid "no preset selected" #~ msgstr "keine Voreinstellung ausgewählt" #~ msgid "<" #~ msgstr "<" #~ msgid ">" #~ msgstr ">" #~ msgid "Shapes" #~ msgstr "Formen" #~ msgid "Extrusion" #~ msgstr "Extrusion" #~ msgid "Untitled%1" #~ msgstr "Unbenannt%1" #~ msgid "Top" #~ msgstr "Oben" #~ msgid "Back" #~ msgstr "Hinten" #~ msgid "" #~ "\n" #~ "Using QGLWidget\n" #~ "\n" #~ msgstr "" #~ "\n" #~ "Benutze QGLWidget\n" #~ "\n" #~ msgid "Paste font selector to Editor Window" #~ msgstr "Font Selektor in Editor kopieren" #~ msgid "About OpenSCAD " #~ msgstr "Über OpenSCAD" #~ msgid "Check for Update.." #~ msgstr "Neue Version suchen..." #~ msgid "For Light Background" #~ msgstr "Für hellen Hintergrund" #~ msgid "For Dark Background" #~ msgstr "Für dunklen Hintergrund" #~ msgid "Off" #~ msgstr "Aus" #~ msgid "Enable the concat() function." #~ msgstr "Funktion concat() aktivieren." #~ msgid "OpenSCAD - New Document[*]" #~ msgstr "OpenSCAD - Neue Datei[*]" #~ msgid "[*]" #~ msgstr "[*]" #~ msgid "OpenSCAD recommended OpenGL version is 2.0." #~ msgstr "Die empfohlene OpenGL version für OpenSCAD ist 2.0." #~ msgid "Compile and &Render (CGAL)" #~ msgstr "Übersetzen und Rendern (CGAL)" #~ msgid "CGAL Grid Only" #~ msgstr "CGAL Gitter anzeigen" openscad-2019.05/locale/es.po0000644000076500000240000012420113432700636016311 0ustar kintelstaff00000000000000# Spanish translations for OpenSCAD package. # This file is distributed under the same license as the OpenSCAD package. # , 2016. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2015.03\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2016-04-13 01:56-0300\n" "Last-Translator: Javier del Álamo \n" "Language-Team: Español\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "Acerca de OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" "\n" "

OpenSCAD

\n" "

El programa de modelado 3D CAD de los programadores

\n" "\n" "\n" "\n" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "Aceptar" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Preferencias" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 #, fuzzy msgid "Reset Trim" msgstr "Reiniciar vista" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 #, fuzzy msgid "Rotation" msgstr "Documentación" #: objects/ui_AxisConfigWidget.h:865 #, fuzzy msgid "Zoom" msgstr "Acercar" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 #, fuzzy msgid "ViewPort rel.
Translation" msgstr "Peg&ar traslado de la ventana" #: objects/ui_AxisConfigWidget.h:872 #, fuzzy msgid "ViewPort rel.
Rotation" msgstr "Peg&ar traslado de la ventana" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 #, fuzzy msgid "SpaceNav" msgstr "Espacio" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Consola" #: objects/ui_Console.h:46 #, fuzzy msgid "Save As" msgstr "Guardar como..." #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "Lista de fuentes OpenSCAD" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "&Aceptar" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Copiar al portapapeles" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Filtro:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

Esta lista muestra los tipos de letra registrados " "actualmente en OpenSCAD.

Ejemplo:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Bienvenido a OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Nuevo" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Abrir" #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Ayuda" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Recientes" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Abrir recientes" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Ejemplos" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "Abrir ejemplo" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "No mostrar de nuevo" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Versión" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Información de las librerías y compilación" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Información detallada de las bibliotecas y compilación" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Nuevo" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "Abrir..." #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "&Guardar" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Guardar como..." #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "&Recargar" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "&Salir" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "Deshacer" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "&Repetir" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 #, fuzzy msgid "Ctrl+Y" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "Cortar" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Copiar" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "&Pegar" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "&Indentar" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "C&omentar" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "Desco&mentar" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Copiar al portapapeles" #: objects/ui_MainWindow.h:956 #, fuzzy msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+C" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "Peg&ar traslado de la ventana" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "P&egar rotación de la ventana" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Copiar al portapapeles" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "Aumentar el tamaño de la fuente" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "Disminuir el tamaño de la fuente" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 #, fuzzy msgid "H&ide editor" msgstr "Ocultar editor" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "&Recargar y previsualizar" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "&Previsualizar" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 #, fuzzy msgid "R&ender" msgstr "R&enderizar" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 #, fuzzy msgid "&Check Validity" msgstr "&Comprobar validez" #: objects/ui_MainWindow.h:990 #, fuzzy msgid "Display A&ST..." msgstr "Mostrar A&ST..." #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "Mostrar árbol CSG" #: objects/ui_MainWindow.h:992 #, fuzzy msgid "Display CSG Pr&oducts..." msgstr "Mostar Pr&oductos CSG" #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "Exportar como &STL..." #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "Exportar como &OFF..." #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "Previsualizar" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "Superficies" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "Estructura" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Juntar" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "Mostrar bordes" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Mostrar ejes" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Mostrar punto de mira" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Mostar indicadores de escala" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Animar" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "Arriba" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 #, fuzzy msgid "&Bottom" msgstr "A&bajo" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 #, fuzzy msgid "&Left" msgstr "Izquierda" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 #, fuzzy msgid "&Right" msgstr "Derecha" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 #, fuzzy msgid "&Front" msgstr "Delante" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "Detrás" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 #, fuzzy msgid "&Diagonal" msgstr "&Diagonal" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 #, fuzzy msgid "Ce&nter" msgstr "Ce&ntro" #: objects/ui_MainWindow.h:1057 #, fuzzy msgid "&Perspective" msgstr "&Perspectiva" #: objects/ui_MainWindow.h:1058 #, fuzzy msgid "&Orthogonal" msgstr "&Ortogonal" #: objects/ui_MainWindow.h:1059 #, fuzzy msgid "H&ide console" msgstr "Ocultar consola" #: objects/ui_MainWindow.h:1060 #, fuzzy msgid "&About" msgstr "&Acerca de" #: objects/ui_MainWindow.h:1061 #, fuzzy msgid "&Documentation" msgstr "Documentación" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Borrar recientes" #: objects/ui_MainWindow.h:1063 #, fuzzy msgid "Export as &DXF..." msgstr "Exportar a &DXF..." #: objects/ui_MainWindow.h:1064 #, fuzzy msgid "&Close" msgstr "&Cerrar" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 #, fuzzy msgid "&Preferences" msgstr "&Preferencias" #: objects/ui_MainWindow.h:1069 #, fuzzy msgid "&Find..." msgstr "Buscar..." #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 #, fuzzy msgid "Fin&d and Replace..." msgstr "Buscar y reemplazar..." #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 #, fuzzy msgid "Find Ne&xt" msgstr "Buscar siguiente" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 #, fuzzy msgid "Find Pre&vious" msgstr "Buscar anterior" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 #, fuzzy msgid "Use Se&lection for Find" msgstr "Usar se&lección en Buscar" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 #, fuzzy msgid "&Flush Caches" msgstr "Borrar Cachés" #: objects/ui_MainWindow.h:1090 #, fuzzy msgid "&OpenSCAD Homepage" msgstr "Página de OpenSCAD" #: objects/ui_MainWindow.h:1091 #, fuzzy msgid "&Automatic Reload and Preview" msgstr "Recargar y previsualizar automáticamente" #: objects/ui_MainWindow.h:1092 #, fuzzy msgid "Export as &Image..." msgstr "Exportar como &imagen..." #: objects/ui_MainWindow.h:1093 #, fuzzy msgid "Export as &CSG..." msgstr "Exportar como CSG..." #: objects/ui_MainWindow.h:1094 #, fuzzy msgid "&Library info" msgstr "Información de Bib&liotecas" #: objects/ui_MainWindow.h:1095 #, fuzzy msgid "Show &Library Folder..." msgstr "Mostrar carpeta de Bib&liotecas" #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Reiniciar vista" #: objects/ui_MainWindow.h:1097 #, fuzzy msgid "&Font List" msgstr "Lista de &fuentes" #: objects/ui_MainWindow.h:1098 #, fuzzy msgid "Export as S&VG..." msgstr "Exportar como S&VG..." #: objects/ui_MainWindow.h:1099 #, fuzzy msgid "Export as &AMF..." msgstr "Exportar como &AMF..." #: objects/ui_MainWindow.h:1100 #, fuzzy msgid "Export as &3MF..." msgstr "Exportar como &AMF..." #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Acercar" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Alejar" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "Ver todo" #: objects/ui_MainWindow.h:1111 #, fuzzy msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:1113 #, fuzzy msgid "Conv&ert Tabs to Spaces" msgstr "Conv&ertir tabulado en espacios" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Ocultar barra de herramientas" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "Desindentar" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "Hoja de referen&cia" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Mensaje" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Tiempo:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Pasos:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Grabar imágenes" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Archivo" #: objects/ui_MainWindow.h:1129 #, fuzzy msgid "Recen&t Files" msgstr "Archivos recien&tes" #: objects/ui_MainWindow.h:1130 #, fuzzy msgid "&Examples" msgstr "&Ejemplos" #: objects/ui_MainWindow.h:1131 #, fuzzy msgid "E&xport" msgstr "E&xportar" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Editar" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "&Diseñar" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Ver" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "Ayuda" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Buscar" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Reemplazar" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Buscar palabra" #: objects/ui_MainWindow.h:1140 #, fuzzy msgid "Prev." msgstr "Previsualizar" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "Próximo" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Hecho" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Reemplazar palabra" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Todo" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "Widget de parámetros" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "Advertencia OpenGL" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" "\n" "\n" "

" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "Activar OpenCSG" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Mostrar este mensaje nuevamente" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Cerrar" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "Formulario" #: objects/ui_ParameterEntryWidget.h:341 #, fuzzy msgid "Parameter" msgstr "Ocultar parámetros" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "Descripción" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "guardar preprogramado" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "eliminar actual preprogramado" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "-" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "selección de preprogramados" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "agregar nuevo preprogramado" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "+" #: objects/ui_ParameterWidget.h:174 #, fuzzy msgid "Automatic Preview" msgstr "Recargar y previsualizar automáticamente" #: objects/ui_ParameterWidget.h:175 #, fuzzy msgid "Show Details" msgstr "Mostrar ejes" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "" #: objects/ui_ParameterWidget.h:177 #, fuzzy msgid "Hide Details" msgstr "Ocultar barra de herramientas" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "Sólo descripción" #: objects/ui_ParameterWidget.h:181 #, fuzzy msgid "reset all parameters to the currently selected preset" msgstr "restablecer los parámetros al preprogramado seleccionado" #: objects/ui_ParameterWidget.h:183 #, fuzzy msgid "Reset" msgstr "Restablecer" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "Vista 3D" #: objects/ui_Preferences.h:1439 #, fuzzy msgctxt "preferences" msgid "Advanced" msgstr "Avanzado" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Editar" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Actualizar" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Características" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Activar/Desactivar características experimentales" #: objects/ui_Preferences.h:1446 #, fuzzy msgid "Axes" msgstr "Mostrar ejes" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Paleta de colores:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Mostrar errores y advertencias en la vista 3D" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Editor de texto" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Editor simple" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "Editor QScintilla" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(necesita reiniciar)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Fuente" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Colorear sintaxis" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd + la rueda del mouse para hacer zoom al texto" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Indentación" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Sangría automática" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Indentar usando" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "Espacio" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "Pestañas" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Ancho de indentado" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Ancho de la pestaña" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Atajo de pestaña" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "Indentar" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "Insertar pestaña" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Mostrar espacios en blanco" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "Nunca" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "Siempre" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "Sólo después de la indentación" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Tamaño" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Mostrar" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "Habilitar alineamiento forzado" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Marcar línea actual" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "Mostrar números de línea" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Ajuste de línea" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "Nada" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "Ajustar a los límites de caracteres" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "Ajustar a los límites de las palabras" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Ajuste de línea en el sangrado" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Visualización del ajuste de línea" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Estilo" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "Ajustar" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "Mismo" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "Sangrado" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Inicio" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "Texto" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "Borde" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "Margen" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Final" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Comprobar automáticamente actualizaciones" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Incluir las versiones en desarrollo" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Comprobar ahora" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Última verificación:" #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Comprobar ahora" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Aplicación" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Mostrar ejes" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Mostrar advertencias de capacidad" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Activar OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Desactivar el render en " #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "elementos" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Forzar Goldfeather" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "Tamaño de caché de CGAL" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "MB" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "Tamaño de caché de PolySet" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Permitir abrir varios documentos" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Habilitar soporte de editor y consola en diferentes lugares" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "" "Habilitar el desacoplamiento de editor y consola para separar las ventanas" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Mostrar pantalla de bienvenida" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "" "Habilitar adaptación local de la interfaz de usuario (necesita reiniciar " "OpenSCAD)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Ventana: traslado = [ %.2f %.2f %.2f ], rotación = [ %.2f %.2f %.2f ], " "distancia = %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Sintitulo.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Error de compilación" #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Error durante la compilación '%1'." #: src/mainwin.cc:1176 #, fuzzy msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "La compilación generó %1 advertencia" msgstr[1] "La compilación generó %1 advertencias" #: src/mainwin.cc:1186 msgid " For details see console window." msgstr "" " Para más detalles vea la ventana de la consola." #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "" #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Guardar archivo" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "Diseños OpenSCAD (*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 ya existe.\n" "Desea reemplazarlo?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Aplicación" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "El documento ha sido modificado.\n" "¿Realmente desea volver a cargar el archivo?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "Exportar el archivo %1" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "%1 Archivos (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Exportar archivo CSG" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "Archivos CSG (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Exportar una imagen" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "Archivos PNG (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Consola" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "El documento ha sido modificado." #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "¿Desea guardar los cambios?" #: src/mainwin.cc:3202 #, fuzzy msgid "/Untitled" msgstr "Sin título" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Fontconfig necesita actualizar su caché de fuentes.\n" "Esto puede tardar un par de minutos." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Advertencia: Usted puede experimentar errores de renderizado de OpenCSG.\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Advertencia: Ciertas capacidades OpenGL para OpenCSG no se encuentran - " "OpenCSG ha sido desactivado. .\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Es muy recomendable utilizar OpenSCAD en un sistema con OpenGL 2.0 o " "posterior.\n" "La información de su renderizador es la siguiente:\n" #: src/QGLView.cc:159 #, fuzzy msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "Versión GLEW %s\n" "%s (%s)\n" "Versión OpenGL %s\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 #, fuzzy msgid "Toggle Perspective" msgstr "&Perspectiva" #: src/settings.cc:172 msgid "After indentation" msgstr "Antes del indentado" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:279 #, fuzzy msgid "Do you want to delete the current preset?" msgstr "eliminar actual preprogramado" #: src/parameter/ParameterWidget.cc:281 #, fuzzy msgid "Do you want to delete the current preset '%1'?" msgstr "eliminar actual preprogramado" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 #, fuzzy msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" "%1 ya existe.\n" "Desea reemplazarlo?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "Puntos Básicos" #: examples/examples.json:13 msgid "Functions" msgstr "Funciones" #: examples/examples.json:20 msgid "Advanced" msgstr "Avanzado" #: examples/examples.json:30 msgid "Parametric" msgstr "" #: examples/examples.json:34 msgid "Old" msgstr "Viejo" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" #~ msgid "Untitled.csg" #~ msgstr "Sintitulo.csg" #, fuzzy #~ msgid "Untitled.png" #~ msgstr "Sintitulo.csg" #~ msgid "<" #~ msgstr "<" #~ msgid ">" #~ msgstr ">" #~ msgid "Untitled%1" #~ msgstr "Sintitulo%1" #~ msgid "Top" #~ msgstr "Arriba" #~ msgid "Back" #~ msgstr "Atrás" #~ msgid "Hide library" #~ msgstr "Ocultar bibliotecas" #~ msgid "Libraries" #~ msgstr "Bibliotecas" #~ msgid "toolBar" #~ msgstr "barra de herramientas" #~ msgid "" #~ "\n" #~ "Using QGLWidget\n" #~ "\n" #~ msgstr "" #~ "\n" #~ "Usando QGLWidget\n" #~ "\n" #~ msgid "Shapes" #~ msgstr "Formas" #~ msgid "Extrusion" #~ msgstr "Extrusión" openscad-2019.05/locale/fr.po0000644000076500000240000012437013432700636016320 0ustar kintelstaff00000000000000# French translations for OpenSCAD package. # Copyright (C) 2013 THE OpenSCAD'S COPYRIGHT HOLDER # This file is distributed under the same license as the OpenSCAD package. # don , 2013. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2013.02.07\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2015-03-05 17:28-0500\n" "Last-Translator: Keven Villeneuve \n" "Language-Team: French\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.7.4\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "À propos de OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" "\n" "

OpenSCAD

\n" "

Le modeleur CAD 3D des programmeurs

\n" "\n" "\n" "\n" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "OK" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Préférences" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 #, fuzzy msgid "Reset Trim" msgstr "Réinitialiser la vue" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 #, fuzzy msgid "Rotation" msgstr "&Documentation" #: objects/ui_AxisConfigWidget.h:865 #, fuzzy msgid "Zoom" msgstr "Zoom Avant" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 #, fuzzy msgid "ViewPort rel.
Translation" msgstr "C&oller la translation de la fenêtre de rendu" #: objects/ui_AxisConfigWidget.h:872 #, fuzzy msgid "ViewPort rel.
Rotation" msgstr "C&oller la translation de la fenêtre de rendu" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 #, fuzzy msgid "SpaceNav" msgstr "Espaces" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Console" #: objects/ui_Console.h:46 #, fuzzy msgid "Save As" msgstr "Enregistrer &sous..." #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "Liste des polices OpenSCAD" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "&OK" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Coller dans le presse-papier" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Filtre:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

Cette liste affiche les polices présentement chargées " "avec OpenSCAD

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Bienvenue dans OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Nouveau" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Ouvrir..." #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Aide" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Récents" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Ouvrir un fichier récent" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Exemples" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "&Ouvrir un example" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "Ne plus afficher" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Version" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Bibliothèques et Infos de la version" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Informations détaillées des bibliothèques et de la version d'OpenSCAD" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Nouveau" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "&Ouvrir..." #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "Enregi&strer" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Enregistrer &sous..." #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "&Recharger" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "&Quitter" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "Ann&uler" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "&Répéter" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 #, fuzzy msgid "Ctrl+Y" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "Co&uper" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Copier" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "&Coller" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "&Indenter" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "C&ommenter" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "Déco&mmenter" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Coller dans le presse-papier" #: objects/ui_MainWindow.h:956 #, fuzzy msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "C&oller la translation de la fenêtre de rendu" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "&Coller la rotation de la fenêtre de rendu" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Coller dans le presse-papier" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "&Agrandir la police" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "&Réduire la police" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "&Cacher l'éditeur" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "&Recharger et Aperçu" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "&Aperçu" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "R&endu" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "&Vérifier la Validité" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "Afficher A&ST..." #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "Afficher CSG &Arbre" #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "Afficher CSG Pr&oduits" #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "Exporter comme &STL..." #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "Exporter comme &OFF..." #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "Aperçu" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "Surfaces" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "Wireframe" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Jeté ensemble" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "Afficher les Arêtes" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Afficher les Axes" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Afficher la Mire" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Afficher les Marqueurs d'Échelle" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Animer" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "&Haut" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "&Dessous" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "&Gauche" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "&Droite" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "&Face" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "&Arrière" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "&Diagonale" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "Ce&ntre" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "&Perspective" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "&Orthogonale" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "&Cache la console" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "&À propos" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "&Documentation" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Effacer Récents" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "Exporter comme &DXF..." #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "&Fermer" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "&Préférences" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "&Rechercher..." #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "&Rechercher et remplacer..." #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "Rechercher &Suivant" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "Rechercher &Précédent" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "Utiliser la sé&lection pour Rechercher" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "&Vider les caches" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "Page d'accueil &OpenSCAD" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "Recharger et Aperçu &Automatique" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "Exporter comme &Image..." #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "Exporter comme &CSG..." #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "Informations &Bibliothèques" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "Afficher le dossier des &bibliothèques" #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Réinitialiser la vue" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "Liste des &polices" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "Exporter comme S&VG..." #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "Exporter comme &AMF..." #: objects/ui_MainWindow.h:1100 #, fuzzy msgid "Export as &3MF..." msgstr "Exporter comme &AMF..." #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Zoom Avant" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Zoom Arrière" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "&Voir Tout" #: objects/ui_MainWindow.h:1111 #, fuzzy msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "Conv&ertir les tabulations par des espaces" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Cacher les boîtes à outils" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "Dési&ndenter" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "&Aide-Mémoire" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Message" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Temps:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Étapes:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Vider les photos" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Fichier" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "Fichiers Récen&ts" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "&Exemples" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "E&xporter" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Édition" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "Conception" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Vue" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "&Aide" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Rechercher" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Remplacer" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Rechercher une chaîne de caractères" #: objects/ui_MainWindow.h:1140 #, fuzzy msgid "Prev." msgstr "Aperçu" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Terminer" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Remplacer une chaîne de caractères" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Tout" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "Avertissements OpenGL" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" "\n" "\n" "

" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "Activer OpenCSG" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Affiche ce message à nouveau" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Fermer" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "Formulaire" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "" #: objects/ui_ParameterWidget.h:174 #, fuzzy msgid "Automatic Preview" msgstr "Recharger et Aperçu &Automatique" #: objects/ui_ParameterWidget.h:175 #, fuzzy msgid "Show Details" msgstr "Afficher les Axes" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "" #: objects/ui_ParameterWidget.h:177 #, fuzzy msgid "Hide Details" msgstr "Cacher les boîtes à outils" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "" #: objects/ui_ParameterWidget.h:181 msgid "reset all parameters to the currently selected preset" msgstr "" #: objects/ui_ParameterWidget.h:183 #, fuzzy msgid "Reset" msgstr "Réinitialiser la vue" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "&Vue 3D" #: objects/ui_Preferences.h:1439 #, fuzzy msgctxt "preferences" msgid "Advanced" msgstr "Avancé" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Éditeur" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Mettre à jour" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Fonctionnalités" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Activer/Désactiver les fonctionnalités expérimentales" #: objects/ui_Preferences.h:1446 #, fuzzy msgid "Axes" msgstr "Afficher les Axes" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Palette de couleurs:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Afficher les Avertissements et les Erreurs dans la fenêtre de rendu" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Type d'éditeur" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Éditeur Simple" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "Éditeur QScintilla" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(nécessite un redémarrage)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Police" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Colorer la coloration syntaxique" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd-Roulette-Souris agrandit le texte" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Indentation" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Indentation Auto" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Indenter en utilisant" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "Espaces" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "Tabulations" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Largeur d'Indentation" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Largeur des tabulations" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Fonction de la touche Tab" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "Indenter" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "Insérer une Tabulation" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Afficher les espaces blancs" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "Jamais" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "Toujours" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "Seulement après indentation" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Taille" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Afficher" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "Activer la correspondance d'accolades" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Surligner la ligne courante" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Retour à la ligne" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "Aucun" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "Enveloppez aux limites des caractères" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "Enveloppez aux limites des mots" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Indentation des retours à la ligne" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Visualisation des retours à la ligne" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Style" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "Fixé" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "Identique" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "Indenté" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Début" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "Texte" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "Bordure" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "Marge" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Fin" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Vérifier les mises à jour automatiquement" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Inclure les versions de développement" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Vérifier Maintenant" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Dernière vérification:" #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Vérifier Maintenant" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Application" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Afficher les Axes" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Afficher les avertissements de capacité" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Activer pour OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Désactiver le rendu à" #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "éléments" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Forcer Goldfeather" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "Taille du Cache de CGAL" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "Mo" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "Taille du Cache PolySet" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Autoriser l'ouverture de plusieurs documents" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Activer l'ancrage de l'Éditeur et de la Console à différents endroits" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "" "Activer désancrage de l'Éditeur et de la Console dans des fenêtres séparés" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Affiche l'écran d'accueil" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "" "Activer la localisation de l'interface utilisateur (Nécessite un redémarrage " "d'OpenSCAD)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Fenêtre de rendu: translation = [ %.2f %.2f %.2f ], rotation = [ %.2f %.2f " "%.2f ], distance = %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Untitled.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Erreur de Compilation." #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Erreur lors de la compilation de '%1'." #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "La compilation a généré %1 avertissement" msgstr[1] "La compilation a généré %1 avertissements" #: src/mainwin.cc:1186 msgid " For details see console window." msgstr " Pour détails voir Fenêtre de la Console." #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "" #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Enregistrer le Fichier" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "OpenSCAD Designs (*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 existe déjà.\n" "Voulez-vous le remplacer?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Application" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "Ce document a été modifié.\n" "Voulez-vous vraiment recharger le fichier?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "Exporter %1 Fichier" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "%1 Fichiers (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Exporter un fichier CSG" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "Fichiers CSG (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Exporter une Image" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "Fichiers PNG (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Console" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "Ce document a été modifié" #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "Voulez-vous enregistrer vos changements?" #: src/mainwin.cc:3202 #, fuzzy msgid "/Untitled" msgstr "Sans Titre" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Fontconfig a besoin de mettre à jour son cache de polices.\n" "Celà peut prendre quelques minutes." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Avertissement: Vous pourriez avoir des erreurs de rendu OpenCSG\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Avertissement: Capacités OpenGL manquantes pour OpenCSG - OpenCSG a été " "désactivé.\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Il est hautement recommandé d'utiliser OpenSCAD sur un système compatible " "OpenGL 2.0 ou ultérieur.\n" "Voici les informations de votre moteur de rendu:\n" #: src/QGLView.cc:159 #, fuzzy msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "Version GLEW %s\n" "%s (%s)\n" "Version OpenGL %s\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 #, fuzzy msgid "Toggle Perspective" msgstr "&Perspective" #: src/settings.cc:172 msgid "After indentation" msgstr "Après indentation" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:279 #, fuzzy msgid "Do you want to delete the current preset?" msgstr "Voulez-vous enregistrer vos changements?" #: src/parameter/ParameterWidget.cc:281 msgid "Do you want to delete the current preset '%1'?" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 #, fuzzy msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" "%1 existe déjà.\n" "Voulez-vous le remplacer?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "Bases" #: examples/examples.json:13 msgid "Functions" msgstr "Fonctions" #: examples/examples.json:20 msgid "Advanced" msgstr "Avancé" #: examples/examples.json:30 msgid "Parametric" msgstr "" #: examples/examples.json:34 msgid "Old" msgstr "Ancien" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" #~ msgid "Untitled.csg" #~ msgstr "SansTitre.csg" #, fuzzy #~ msgid "Untitled.png" #~ msgstr "SansTitre.csg" #~ msgid "<" #~ msgstr "<" #~ msgid ">" #~ msgstr ">" #~ msgid "Shapes" #~ msgstr "Formes" #~ msgid "Extrusion" #~ msgstr "Extrusion" #~ msgid "Untitled%1" #~ msgstr "Sans Titre%1" #~ msgid "Top" #~ msgstr "Dessus" #~ msgid "Back" #~ msgstr "Arrière" #~ msgid "toolBar" #~ msgstr "boîte à outils" #~ msgid "" #~ "\n" #~ "Using QGLWidget\n" #~ "\n" #~ msgstr "" #~ "\n" #~ "Utilise QGLWidget\n" #~ "\n" #~ msgid "Paste font selector to Editor Window" #~ msgstr "Coller le sélecteur de polices dans l'éditeur de fenêtres" #~ msgid "About OpenSCAD " #~ msgstr "À propos de OpenSCAD" #~ msgid "Check for Update.." #~ msgstr "Vérifier les mises à jours" #~ msgid "OpenGL Info" #~ msgstr "Information OpenGL" openscad-2019.05/locale/openscad.pot0000644000076500000240000010515613432700636017672 0ustar kintelstaff00000000000000# #-#-#-#-# openscad-tmp.pot (OpenSCAD 2019.02.17) #-#-#-#-# # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the OpenSCAD package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "#-#-#-#-# openscad-tmp.pot (OpenSCAD 2019.02.17) #-#-#-#-#\n" "Project-Id-Version: OpenSCAD 2019.02.17\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "#-#-#-#-# appdata-strings.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 msgid "Reset Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 msgid "Rotation" msgstr "" #: objects/ui_AxisConfigWidget.h:865 msgid "Zoom" msgstr "" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 msgid "ViewPort rel.
Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:872 msgid "ViewPort rel.
Rotation" msgstr "" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 msgid "SpaceNav" msgstr "" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 msgid "Clear console" msgstr "" #: objects/ui_Console.h:46 msgid "Save As" msgstr "" #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "" #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "" #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "" #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "" #: objects/ui_MainWindow.h:928 msgid "Ctrl+Y" msgstr "" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "" #: objects/ui_MainWindow.h:954 msgid "Copy viewport ima&ge" msgstr "" #: objects/ui_MainWindow.h:956 msgid "Ctrl+Shift+C" msgstr "" #: objects/ui_MainWindow.h:958 msgid "Copy viewport transl&ation" msgstr "" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "" #: objects/ui_MainWindow.h:962 msgid "Cop&y viewport rotation" msgstr "" #: objects/ui_MainWindow.h:963 msgid "Copy vie&wport distance" msgstr "" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "" #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "" #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "" #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "" #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "" #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "" #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "" #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "" #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "" #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "" #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "" #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "" #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "" #: objects/ui_MainWindow.h:1100 msgid "Export as &3MF..." msgstr "" #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "" #: objects/ui_MainWindow.h:1111 msgid "Ctrl+Shift+V" msgstr "" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "" #: objects/ui_MainWindow.h:1140 msgid "Prev." msgstr "" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "" #: objects/ui_ParameterWidget.h:174 msgid "Automatic Preview" msgstr "" #: objects/ui_ParameterWidget.h:175 msgid "Show Details" msgstr "" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "" #: objects/ui_ParameterWidget.h:177 msgid "Hide Details" msgstr "" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "" #: objects/ui_ParameterWidget.h:181 msgid "reset all parameters to the currently selected preset" msgstr "" #: objects/ui_ParameterWidget.h:183 msgid "Reset" msgstr "" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "" #: objects/ui_Preferences.h:1439 msgctxt "preferences" msgid "Advanced" msgstr "" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "" #: objects/ui_Preferences.h:1446 msgid "Axes" msgstr "" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "" #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 msgid "Check" msgstr "" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 msgid "Action" msgstr "" #: objects/ui_Preferences.h:1531 msgid "Show" msgstr "" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "" #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "" #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "" #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "" msgstr[1] "" #: src/mainwin.cc:1186 msgid " For details see console window." msgstr "" #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "" #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "" #: src/mainwin.cc:1600 msgid "Save File" msgstr "" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" #: src/mainwin.cc:1976 msgid "Application" msgstr "" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "" #: src/mainwin.cc:2893 msgid "Console" msgstr "" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "" #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "" #: src/mainwin.cc:3202 msgid "/Untitled" msgstr "" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" #: src/QGLView.cc:159 msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 msgid "Toggle Perspective" msgstr "" #: src/settings.cc:172 msgid "After indentation" msgstr "" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:279 msgid "Do you want to delete the current preset?" msgstr "" #: src/parameter/ParameterWidget.cc:281 msgid "Do you want to delete the current preset '%1'?" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "" #: examples/examples.json:13 msgid "Functions" msgstr "" #: examples/examples.json:20 msgid "Advanced" msgstr "" #: examples/examples.json:30 msgid "Parametric" msgstr "" #: examples/examples.json:34 msgid "Old" msgstr "" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" openscad-2019.05/locale/pl.po0000644000076500000240000012541213432700636016322 0ustar kintelstaff00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2015.03.05\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2016-09-13 23:33+0200\n" "Last-Translator: Marek Pikuła \n" "Language-Team: \n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.8\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "O programie OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" "\n" "

OpenSCAD

\n" "

Program CAD do bryłowego modelownia 3D

\n" "\n" "\n" "\n" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "OK" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Preferencje" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 #, fuzzy msgid "Reset Trim" msgstr "Resetuj widok" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 #, fuzzy msgid "Rotation" msgstr "&Dokumentacja" #: objects/ui_AxisConfigWidget.h:865 #, fuzzy msgid "Zoom" msgstr "Przybliż" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 #, fuzzy msgid "ViewPort rel.
Translation" msgstr "Wklej przesunięcie podglądu (&translate)" #: objects/ui_AxisConfigWidget.h:872 #, fuzzy msgid "ViewPort rel.
Rotation" msgstr "Wklej przesunięcie podglądu (&translate)" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 #, fuzzy msgid "SpaceNav" msgstr "Spacji" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Konsola" #: objects/ui_Console.h:46 #, fuzzy msgid "Save As" msgstr "Zapisz &jako…" #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "&Lista fontów OpenSCAD" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "&OK" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Kopiuj do schowka" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Filtr:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

Na liście są fonty aktualnie zarejestrowane z " "programem OpenSCAD.

Przykład:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Witaj w OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Nowy" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Otwórz" #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Pomoc" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Ostatnio używane" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Otwórz ostatnie" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Przykłady" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "Otwórz przykład" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "Nie pokazuj ponownie" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Wersja" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Informacje o bibliotekach i kompilacji" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Dokładne dane OpenSCAD o bibliotekach i kompilacji" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Nowy" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "&Otwórz…" #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "&Zapisz" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Zapisz &jako…" #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "P&rzeładuj" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "Z&amknij" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "&Cofnij" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "&Powtórz" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 msgid "Ctrl+Y" msgstr "Ctrl+Y" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "W&ytnij" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Kopiuj" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "&Wklej" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "Zró&b wcięcie" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "K&omentuj" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "Odko&mentuj" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Kopiuj podgląd" #: objects/ui_MainWindow.h:956 msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+C" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "Wklej przesunięcie podglądu (&translate)" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "Wklej obrót po&dglądu (rotate)" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Kopiuj podgląd" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "Zw&iększ wielkość tekstu" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "Zmni&ejsz wielkość tekstu" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "Ukryj ed&ytor" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "Pr&zeładowanie i podgląd" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "&Podgląd" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "&Renderuj" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "&Sprawdź poprawność" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "Pokaż AS&T…" #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "Pokaż &drzewo CSG…" #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "Pokaż pr&odukty CSG…" #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "Eksportuj jako &STL…" #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "Eksportuj jako &OFF…" #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "Podgląd" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "Ściany" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "Szkielet" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Wszystko razem" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "Pokaż krawędzie" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Pokaż osie" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Pokaż celownik" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Pokaż podziałkę" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Animuj" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "Z &góry" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "Od &dołu" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "Z &lewej" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "Z &prawej" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "Z p&rzodu" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "Z &tyłu" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "Po pr&zekątnej" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "&Wyśrodkuj" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "P&erspektywa" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "Pr&ojekcja równoległa" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "Ukryj &konsolę" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "&O programie" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "&Dokumentacja" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Wyczyść ostatnio używane" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "Eksportuj jako &DXF…" #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "Zamknij &dokument" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "Pre&ferencje" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "&Znajdź…" #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "Z&najdź i zastąp…" #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "Zn&ajdź następny" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "Zna&jdź poprzedni" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "&Użyj zaznaczenia do wyszukiwania" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "&Wyczyść pamięć podręczną" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "Strona główna Open&SCAD" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "&Automatycznie przeładuj i pokaż podgląd" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "Eksportuj jako &obraz…" #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "Eksportuj jako &CSG…" #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "Informacje o &bibliotekach" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "Pokaż folder &bibliotek…" #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Resetuj widok" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "Lista &fontów" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "Eksportuj jako S&VG…" #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "Eksportuj jako &AMF…" #: objects/ui_MainWindow.h:1100 #, fuzzy msgid "Export as &3MF..." msgstr "Eksportuj jako &AMF…" #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Przybliż" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Oddal" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "Pokaż wszystko" #: objects/ui_MainWindow.h:1111 msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+V" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "Konwertuj tabulacje na &spacje" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Ukryj paski narzędzi" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "U&suń wcięcie" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "Ś&ciąga" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Wiadomość" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Czas:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Kroki:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Eksportuj klatki" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Plik" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "O&statnie pliki" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "&Przykłady" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "&Eksportuj" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Edycja" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "P&rojekt" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Widok" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "P&omoc" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Znajdź" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Zastąp" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Wyszukaj tekst" #: objects/ui_MainWindow.h:1140 #, fuzzy msgid "Prev." msgstr "Podgląd" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Gotowe" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Zamień na tekst" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Wszystko" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "Ostrzeżenie OpenGL" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" "\n" "\n" "

" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "Włącz OpenCSG" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Pokazuj tą wiadomość ponownie" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Zamknij" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "" #: objects/ui_ParameterWidget.h:174 #, fuzzy msgid "Automatic Preview" msgstr "&Automatycznie przeładuj i pokaż podgląd" #: objects/ui_ParameterWidget.h:175 #, fuzzy msgid "Show Details" msgstr "Pokaż osie" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "" #: objects/ui_ParameterWidget.h:177 #, fuzzy msgid "Hide Details" msgstr "Ukryj paski narzędzi" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "" #: objects/ui_ParameterWidget.h:181 msgid "reset all parameters to the currently selected preset" msgstr "" #: objects/ui_ParameterWidget.h:183 #, fuzzy msgid "Reset" msgstr "Resetuj widok" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "Widok 3D" #: objects/ui_Preferences.h:1439 #, fuzzy msgctxt "preferences" msgid "Advanced" msgstr "Zaawansowane" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Edytor" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Aktualizuj" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Funkcje" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Włącz/wyłącz eksperymentalne funkcje" #: objects/ui_Preferences.h:1446 #, fuzzy msgid "Axes" msgstr "Pokaż osie" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Schemat kolorów:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Pokazuj ostrzeżenia i błędy w widoku 3D" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Rodzaj edytora" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Prosty edytor" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "Edytor QScintilla" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(wymaga ponownego uruchomienia)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Font" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Podkreślanie składni kolorem" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd-kółko-myszy przybliża tekst" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Wcięcia" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Automatyczne wcięcia" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "Backspace usuwa wcięcie" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Do wcięć używaj" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "Spacji" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "Tabulacji" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Szerokość wcięć" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Szerokość tabulacji" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Funkcja klawisza Tab" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "Wcięcie" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "Wstaw Tab" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Pokazuj znaki niedrukowalne" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "Nigdy" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "Zawsze" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "Tylko po wcięciu" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Rozmiar" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Wygląd" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "Włącz dopasowywanie nawiasów" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Zakreśl aktywną linijkę" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "Numeruj linijki" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Zawijanie wierszy" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "Brak" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "Zawijaj na znakach" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "Zawijaj na słowach" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Wcięcie zawiniętych linijek" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Wizualizacja zawiniętych linijek" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Styl" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "Na sztywno" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "Takie samo" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "Wcięte" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Początek" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "Tekst" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "Krawędź" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "Margines" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Koniec" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Automatycznie sprawdzaj aktualizacje" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Bierz pod uwagę wersje rozwojowe" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Sprawdź teraz" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Ostatnio sprawdzono:" #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Sprawdź teraz" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Aplikacja" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Pokaż osie" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Pokazuj ostrzeżenia o rozszerzeniach" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Włącz dla OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Wyłącz renderowanie przy" #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "elementach" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Wymuś Goldfeather" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "Rozmiar cache CGAL" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "MB" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "Rozmiar pamięci podręcznej PolySetów" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Pozwalaj na otwieranie wielu dokumentów" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Włącz dokowanie edytora i konsoli w różnych miejscach" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "Włącz przenoszenie edytora i konsoli do osobnych okien" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Pokaż ekran powitalny" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "" "Włącz tłumaczenie interfejsu użytkownika (wymaga uruchomienia ponownie " "programu)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Podgląd: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "odległość = %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "Nie można otworzyć pliku \"%s\" do eksportu" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "Błąd: \"%s\" – błąd zapisu. (Pełny dysk?)" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Bez tytułu.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Błąd kompilacji." #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Błąd podczas kompilowania '%1'." #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "Podczas kompilacji wygenerowano %1 ostrzeżenie." msgstr[1] "Podczas kompilacji wygenerowano %1 ostrzeżenia." msgstr[2] "Podczas kompilacji wygenerowano %1 ostrzeżeń." #: src/mainwin.cc:1186 msgid " For details see console window." msgstr "Szczegóły w oknie konsoli." #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "Nie udało się zapisać do pliku" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "Zapisano projekt „%s”." #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "Błąd przy zapisie projektu" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Zapisz plik" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "Projekty OpenSCAD (*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 już istnieje.\n" "Czy chcesz zamienić?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Aplikacja" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "Dokument został zmodyfikowany.\n" "Czy na pewno chcesz go przeładować?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "Eksportuj plik %1" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "Pliki %1 (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Eksportuj plik CSG" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "Pliki CSG (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Eksportuj obrazek" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "Pliki PBG (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Konsola" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "Dokument został zmodyfikowany." #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "Czy chcesz zapisać zmiany?" #: src/mainwin.cc:3202 #, fuzzy msgid "/Untitled" msgstr "Bez tytułu" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "Nieznany błąd" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "Błąd krytyczny" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" "Złapano krytyczny błąd. Aplikacja może się zachowywać niestabilnie:\n" "%1" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Fontconfig musi zaktualizować pamięć podręczną fontów.\n" "Może to zająć kilka minut." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Uwaga: Możesz doświadczyć błędów renderowania OpenCSG\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Uwaga: Brak rozszerzeń OpenGL dla OpenCSG – wyłączono OpenCSG\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Najlepiej używać programu OpenSCAD na systemie z OpenGL w wersji 2.0 lub " "późniejszej.\n" "Informacje silnika renderowania:\n" #: src/QGLView.cc:159 msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "GLEW w wersji %1\n" "%2 (%3)\n" "OpenGL w wersji %s\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 #, fuzzy msgid "Toggle Perspective" msgstr "P&erspektywa" #: src/settings.cc:172 msgid "After indentation" msgstr "Po wcięciu" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:279 #, fuzzy msgid "Do you want to delete the current preset?" msgstr "Czy chcesz zapisać zmiany?" #: src/parameter/ParameterWidget.cc:281 msgid "Do you want to delete the current preset '%1'?" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 #, fuzzy msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" "%1 już istnieje.\n" "Czy chcesz zamienić?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "Podstawy" #: examples/examples.json:13 msgid "Functions" msgstr "Funkcje" #: examples/examples.json:20 msgid "Advanced" msgstr "Zaawansowane" #: examples/examples.json:30 msgid "Parametric" msgstr "" #: examples/examples.json:34 msgid "Old" msgstr "Stare" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "Program CAD do bryłowego modelownia 3D" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" "OpenSCAD jest programem CAD do bryłowego modelowania 3D. W przeciwieństwie " "do większości darmowego oprogramowania do tworzenia w 3D (tj. Blender) nie " "skupia się na artystycznych aspektach modelowania 3D lecz na aspektach CAD. " "Całkiem możliwe, że jeżeli chcesz stworzyć modele dla maszyny, to jest to " "program dla ciebie, ale z pewnością nie jest tym czego szukasz, jeżeli " "jesteś zainteresowany w tworzeniu filmów animowanych komputerowo." #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" "OpenSCAD nie służy do interaktywnego modelowania. Jest czymś w rodzaju " "kompilatora 3D, który czyta skrypt opisujący obiekt i renderuje na jego " "podstawie model 3D. Daje to tobie (projektantowi) pełną kontrolę nad " "procesem modelowania i pozwala na proste zmiany na każdym kroku " "projektowania oraz pozwala tworzyć obiekty definiowane za pomocą " "konfigurowalnych parametrów." #. (itstool) path: description/p #: openscad.appdata.xml.in:22 #, fuzzy msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" "W programie OpenSCAD modele można tworzyć na dwa sposoby: za pomocą operacji " "CSG lub przez ekstruzję powierzchni 2D. Jako danych do ekstruzji 2D można " "użyć plików w formacie Autocad DXF. Oprócz ścieżek 2D można z tych plików " "wczytywać parametry projektu. Dodatkowo OpenSCAD może wczytywać i tworzyć " "modele 3D w formacie STL i OFF." #~ msgid "Untitled.csg" #~ msgstr "Bez tytułu.csg" #~ msgid "Untitled.png" #~ msgstr "Bez tytułu.png" #~ msgid "<" #~ msgstr "<" #~ msgid ">" #~ msgstr ">" #~ msgid "Shapes" #~ msgstr "Kształty" #~ msgid "Extrusion" #~ msgstr "Ekstruzja" #~ msgid "Untitled%1" #~ msgstr "BezTytułu%1" openscad-2019.05/locale/ru.po0000644000076500000240000013374113432700636016341 0ustar kintelstaff00000000000000# # , 2013, 2014, 2015. # Alexandre Prokoudine , 2015-2018. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2015.03\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2018-11-07 02:02+0300\n" "Last-Translator: Alexandre Prokoudine \n" "Language-Team: русский \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Gtranslator 3.31.0\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "О программе OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" "\n" "

OpenSCAD

\n" "

Твердотельное моделирование для программистов

\n" "\n" "\n" "\n" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "ОК" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Параметры OpenSCAD" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 #, fuzzy msgid "Reset Trim" msgstr "Сбросить вид" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 #, fuzzy msgid "Rotation" msgstr "&Документация" #: objects/ui_AxisConfigWidget.h:865 #, fuzzy msgid "Zoom" msgstr "Увеличить масштаб" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 #, fuzzy msgid "ViewPort rel.
Translation" msgstr "Вст&авить смещение точки обзора" #: objects/ui_AxisConfigWidget.h:872 #, fuzzy msgid "ViewPort rel.
Rotation" msgstr "Вст&авить смещение точки обзора" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 #, fuzzy msgid "SpaceNav" msgstr "Пробелами" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Консоль" #: objects/ui_Console.h:46 #, fuzzy msgid "Save As" msgstr "Сохранить &как..." #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "Список шрифтов, доступных в OpenSCAD" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "&ОК" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Скопировать в буфер" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Фильтр:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

В этом списке перечислены шрифты, которые можно " "использовать в OpenSCAD.

Пример кода:

  text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", "
"font = "Liberation Sans:style=Italic");
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Добро пожаловать в OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Создать" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Открыть..." #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Справка" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Недавние файлы" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Открыть недавний файл" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Примеры" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "Открыть пример" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "Не показывать снова" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Версия" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Информация о сборке" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Подробная информация о библиотеках и сборке OpenSCAD" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Создать" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "&Открыть..." #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "Со&хранить" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Сохранить &как..." #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "&Обновить" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "&Выход" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "&Отменить" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "&Повторить" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 msgid "Ctrl+Y" msgstr "Ctrl+Y" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "Вы&резать" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Копировать" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "&Вставить" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "&Добавить отступ" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "Зако&мментировать" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "Р&аскомментировать" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Скопировать вьюпорт" #: objects/ui_MainWindow.h:956 msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+C" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "Вст&авить смещение точки обзора" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "Встав&ить поворот точки обзора" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Скопировать вьюпорт" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "Увели&чить размер шрифта" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "У&меньшить размер шрифта" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "&Скрыть редактор" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "&Обновить и выполнить предпросмотр" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "&Предпросмотр" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "&Рендеринг" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "Проверить &корректность" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "Показать &AST..." #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "Показать &дерево CSG..." #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "Показать &результаты CSG..." #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "Экспортировать в &STL..." #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "Экспортировать в &OFF..." #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "Предпросмотр" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "Поверхности" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "Каркас" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Всё вместе" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "Показывать рёбра" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Показывать оси" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Показывать перекрестия" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Показывать метки масштаба" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Анимировать" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "&Сверху" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "С&низу" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "С&лева" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "С&права" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "Сп&ереди" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "Сзади" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "&Аксонометрический" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "По &центру" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "Перспект&ива" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "Орто&гональная проекция" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "&Скрыть консоль" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "&О программе" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "&Документация" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Очистить список" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "Экспортировать в &DXF..." #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "&Закрыть" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "&Параметры" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "&Найти..." #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "Найти и &заменить..." #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "Искать следую&щее" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "Искать пре&дыдущее" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "Искать &выделенный текст" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "О&чистить кэш" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "&Сайт OpenSCAD" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "&Автоматически обновлять и выполнять предпросмотр" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "Экспортировать в &растр..." #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "Экспортировать в &CSG..." #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "&Информация о сборке" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "Открыть папку с ка&талогом..." #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Сбросить вид" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "Список &шрифтов" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "Экспортировать в SVG..." #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "Экспортировать в &AMF..." #: objects/ui_MainWindow.h:1100 #, fuzzy msgid "Export as &3MF..." msgstr "Экспортировать в &AMF..." #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Увеличить масштаб" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Уменьшить масштаб" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "Показать все" #: objects/ui_MainWindow.h:1111 msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+V" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "Прео&бразовать табуляцию в пробелы" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Скрыть панели" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "У&брать отступ" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "&Шпаргалка" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Сообщение" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Время:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Шагов:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Сохранять кадры" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Файл" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "&Недавние файлы" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "&Примеры" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "&Экспортировать" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Правка" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "&Модель" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Вид" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "&Справка" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Найти" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Заменить" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Искать строчку" #: objects/ui_MainWindow.h:1140 msgid "Prev." msgstr "Пред." #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "След." #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Готово" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Строка замены" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Все" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "Предупреждение OpenGL" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" "\n" "\n" "

" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "Включить OpenCSG" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Показывать снова" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Закрыть" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "Параметр" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "Описание" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "Сохранить предустановку" #: objects/ui_ParameterWidget.h:163 msgid "delete current preset" msgstr "Удалить выбранную предустановку" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "-" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "Выбор предустановки" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "Создать предустановку" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "+" #: objects/ui_ParameterWidget.h:174 msgid "Automatic Preview" msgstr "Автопредпросмотр" #: objects/ui_ParameterWidget.h:175 msgid "Show Details" msgstr "Показать подробности" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "" #: objects/ui_ParameterWidget.h:177 msgid "Hide Details" msgstr "Скрыть подробности" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "Только описание" #: objects/ui_ParameterWidget.h:181 msgid "reset all parameters to the currently selected preset" msgstr "" #: objects/ui_ParameterWidget.h:183 msgid "Reset" msgstr "Сбросить" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "Просмотр 3D" #: objects/ui_Preferences.h:1439 msgctxt "preferences" msgid "Advanced" msgstr "Дополнительные" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Редактор" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Обновления" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Функции" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Включить/Выключить экспериментальные возможности" #: objects/ui_Preferences.h:1446 #, fuzzy msgid "Axes" msgstr "Показывать оси" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Цветовая схема:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Показывать ошибки и предупреждения в 3D виде" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Редактор" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Простой редактор" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "Редактор QScintilla" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(требуется перезапуск)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Шрифт" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Подсветка синтаксиса" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd-Колесико-мыши увеличивает текст" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Отступы" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Автоотступы" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Делать отступы" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "Пробелами" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "Табуляцией" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Ширина отступа" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Ширина табуляции" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Функция клавиши Tab" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "Отступов" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "Вставить Tab" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Показывать пробел" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "Никогда" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "Всегда" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "Только после отступа" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Размер" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Вид" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "Подсвечивать парные скобки" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Выделять текущую строку" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "Показывать номера строк" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Перенос строк" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "Нет" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "Перенос с границы символа" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "Перенос с границы слова" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Отступы в переносах:" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Вид переносов строк:" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Стиль" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "Фиксированный" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "Такой же" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "С отступами" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Начало" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "Текст" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "Граница" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "Поле" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Конец" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Автоматически проверять обновления" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Включая рабочие сборки" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Проверить сейчас" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Последняя проверка: " #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Проверить сейчас" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Приложение" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Показывать оси" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Показывать предупреждение о возможностях" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Включить для OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Отключать отрисовку на " #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "элементах" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Принудительно использовать Goldfeather" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "Размер кэша CGAL" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "Mбайт" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "Размер кэша PolySet" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Разрешить открытие нескольких документов" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Включить прилипание Редактора и Консоли в разных местах" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "Включить перетаскивание Редактора и Консоли в разные окна" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Показать экран приветствия" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "Включить локализацию интерфейса (необходимо перезапустить OpenSCAD)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "Вывести окно на передний план после автоматической перезагрузки" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "Проигрывать звук при завершении рендеринга" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Обзор: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], distance " "= %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "Не удалось открыть файл \"%s\" для экспорта" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Безымянный.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Ошибка при сборке" #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Ошибка при сборке '%1'." #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "При сборке выведено %1 предупреждение" msgstr[1] "При сборке выведено %1 предупреждения" msgstr[2] "При сборке выведено %1 предупреждений" #: src/mainwin.cc:1186 msgid " For details see console window." msgstr " Для подробностей смотреть окно консоли." #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "Не удалось открыть файл для записи" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "Сохранён проект '%s'." #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "Ошибка при сохранении проекта" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Сохранить файл" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "Модели OpenSCAD (*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 уже существует.\n" "Перезаписать?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Приложение" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "Документ был изменен.\n" "Хотите перезагрузить документ?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "Экспортировать в файл формата %1" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "Файлы %1 (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Экспортировать файл CSG" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "Файлы CSG (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Экспортировать изображение" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "Файлы PNG (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Консоль" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "Документ был изменен." #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "Сохранить изменения?" #: src/mainwin.cc:3202 #, fuzzy msgid "/Untitled" msgstr "Безымянный.scad" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "Неизвестная ошибка" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "Критическая ошибка" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Fontconfig требуется обновить кеш шрифтов.\n" "Это может занять пару минут." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Предупреждение: Возможны ошибки рендеринга OpenCSG.\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Предупреждение: Не найдены OpenGL расширения для OpenCSG - OpenCSG был " "отключен.\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Крайне рекомендуется использовать OpenSCAD на системе с поддержкой OpenGL " "2.0 или новее.\n" "Информация о рендере:\n" #: src/QGLView.cc:159 msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "Версия GLEW %1\n" "%2 (%3)\n" "Версия OpenGL %4\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 #, fuzzy msgid "Toggle Perspective" msgstr "Перспект&ива" #: src/settings.cc:172 msgid "After indentation" msgstr "После отступа" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "Удалить выбранную предустановку" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "Сохранить выбранную предустановку" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" #: src/parameter/ParameterWidget.cc:279 #, fuzzy msgid "Do you want to delete the current preset?" msgstr "Удалить выбранную предустановку" #: src/parameter/ParameterWidget.cc:281 #, fuzzy msgid "Do you want to delete the current preset '%1'?" msgstr "Удалить выбранную предустановку" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "Создать новый набор параметров" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "Введите название нового набора параметров" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 #, fuzzy msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" "%1 уже существует.\n" "Перезаписать?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "Сохранение предустановок" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "Файл %1 обнаружен, но не может быть прочтён. Перезаписать %1?" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "Примитивы" #: examples/examples.json:13 msgid "Functions" msgstr "Функции" #: examples/examples.json:20 msgid "Advanced" msgstr "Дополнительные" #: examples/examples.json:30 msgid "Parametric" msgstr "" #: examples/examples.json:34 msgid "Old" msgstr "Старый" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "Твердотельная 3D-САПР для программистов" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" #~ msgid "Untitled.csg" #~ msgstr "Безымянный.csg" #~ msgid "Untitled.png" #~ msgstr "Безымянный.png" #~ msgid "no preset selected" #~ msgstr "Предустановка не выбрана" #~ msgid "<" #~ msgstr "<" #~ msgid ">" #~ msgstr ">" #~ msgid "Shapes" #~ msgstr "Формы" #~ msgid "Extrusion" #~ msgstr "Выдавливание" #~ msgid "Untitled%1" #~ msgstr "Безымянный%1" openscad-2019.05/locale/uk.po0000644000076500000240000013767513432700636016344 0ustar kintelstaff00000000000000# Ukrainian translations for OpenSCAD package. # Copyright (C) 2018 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the OpenSCAD package. # Kyrylo Romanenko , 2018. # msgid "" msgstr "" "Project-Id-Version: OpenSCAD 2018.08.15\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-02-17 10:19+0100\n" "PO-Revision-Date: 2018-11-11 13:00+0200\n" "Last-Translator: Kyrylo Romanenko \n" "Language-Team: Ukrainian\n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10>=1 && n%10<=4 && (n%100<11 || n" "%100>14) ? 0 : n%10==0 && n%10>=5 && n%10<=9 ? 1 : 2);\n" #: objects/ui_AboutDialog.h:100 src/AboutDialog.h:13 msgid "About OpenSCAD" msgstr "Про OpenSCAD" #: objects/ui_AboutDialog.h:102 objects/ui_launchingscreen.h:306 msgid "" "\n" "

OpenSCAD

\n" "

The Programmers Solid 3D CAD Modeller

\n" "\n" "\n" "\n" msgstr "" "\n" "

OpenSCAD

\n" "

Твердотільна тривимірна САПР для програмістів

\n" "\n" "\n" "\n" #: objects/ui_AboutDialog.h:109 msgid "OK" msgstr "OK" #: objects/ui_AxisConfigWidget.h:834 objects/ui_ButtonConfigWidget.h:266 #: objects/ui_Preferences.h:1437 msgid "Preferences" msgstr "Налаштування" #: objects/ui_AxisConfigWidget.h:835 objects/ui_AxisConfigWidget.h:836 #: objects/ui_AxisConfigWidget.h:840 objects/ui_AxisConfigWidget.h:844 #: objects/ui_AxisConfigWidget.h:846 objects/ui_AxisConfigWidget.h:848 #: objects/ui_AxisConfigWidget.h:850 objects/ui_AxisConfigWidget.h:852 #: objects/ui_AxisConfigWidget.h:863 msgid "Trim" msgstr "" #: objects/ui_AxisConfigWidget.h:837 #, fuzzy msgid "Reset Trim" msgstr "Скинути вид" #: objects/ui_AxisConfigWidget.h:838 objects/ui_AxisConfigWidget.h:841 #: objects/ui_AxisConfigWidget.h:842 objects/ui_AxisConfigWidget.h:843 #: objects/ui_AxisConfigWidget.h:845 objects/ui_AxisConfigWidget.h:847 #: objects/ui_AxisConfigWidget.h:849 objects/ui_AxisConfigWidget.h:851 #: objects/ui_AxisConfigWidget.h:862 msgid "DeadZone" msgstr "" #: objects/ui_AxisConfigWidget.h:839 msgid "Auto Trim Axes" msgstr "" #: objects/ui_AxisConfigWidget.h:853 msgid "Axis 2" msgstr "" #: objects/ui_AxisConfigWidget.h:854 msgid "Axis 0" msgstr "" #: objects/ui_AxisConfigWidget.h:855 msgid "Axis 3" msgstr "" #: objects/ui_AxisConfigWidget.h:856 msgid "Axis 6" msgstr "" #: objects/ui_AxisConfigWidget.h:857 msgid "Axis 8" msgstr "" #: objects/ui_AxisConfigWidget.h:858 msgid "Axis 7" msgstr "" #: objects/ui_AxisConfigWidget.h:859 msgid "Axis 5" msgstr "" #: objects/ui_AxisConfigWidget.h:860 msgid "Axis 1" msgstr "" #: objects/ui_AxisConfigWidget.h:861 msgid "Axis 4" msgstr "" #: objects/ui_AxisConfigWidget.h:864 #, fuzzy msgid "Rotation" msgstr "&Документація" #: objects/ui_AxisConfigWidget.h:865 #, fuzzy msgid "Zoom" msgstr "Приблизити" #: objects/ui_AxisConfigWidget.h:866 msgid "X" msgstr "" #: objects/ui_AxisConfigWidget.h:867 msgid "Gain" msgstr "" #: objects/ui_AxisConfigWidget.h:868 msgid "Y" msgstr "" #: objects/ui_AxisConfigWidget.h:869 msgid "Z" msgstr "" #: objects/ui_AxisConfigWidget.h:870 msgid "Translation" msgstr "" #: objects/ui_AxisConfigWidget.h:871 #, fuzzy msgid "ViewPort rel.
Translation" msgstr "Вставити &зміщення видового екрану" #: objects/ui_AxisConfigWidget.h:872 msgid "ViewPort rel.
Rotation" msgstr "" #: objects/ui_AxisConfigWidget.h:873 msgid "Axis Setup:" msgstr "" #: objects/ui_AxisConfigWidget.h:874 msgid "Driver selection: (changes requires restarting OpenSCAD)" msgstr "" #: objects/ui_AxisConfigWidget.h:875 #, fuzzy msgid "SpaceNav" msgstr "Пробілами" #: objects/ui_AxisConfigWidget.h:876 msgid "HIDAPI" msgstr "" #: objects/ui_AxisConfigWidget.h:877 msgid "QGamepad" msgstr "" #: objects/ui_AxisConfigWidget.h:878 msgid "Joystick" msgstr "" #: objects/ui_AxisConfigWidget.h:879 msgid "DBus" msgstr "" #: objects/ui_AxisConfigWidget.h:880 msgid "Axes Mapping:" msgstr "" #: objects/ui_ButtonConfigWidget.h:267 msgid "Button 2" msgstr "" #: objects/ui_ButtonConfigWidget.h:268 msgid "Button 3" msgstr "" #: objects/ui_ButtonConfigWidget.h:269 msgid "Button 5" msgstr "" #: objects/ui_ButtonConfigWidget.h:270 msgid "Button 6" msgstr "" #: objects/ui_ButtonConfigWidget.h:271 msgid "Button 4" msgstr "" #: objects/ui_ButtonConfigWidget.h:272 msgid "Button 9" msgstr "" #: objects/ui_ButtonConfigWidget.h:273 msgid "Button 8" msgstr "" #: objects/ui_ButtonConfigWidget.h:274 msgid "Button 7" msgstr "" #: objects/ui_ButtonConfigWidget.h:275 msgid "Button 0" msgstr "" #: objects/ui_ButtonConfigWidget.h:276 msgid "Button 1" msgstr "" #: objects/ui_ButtonConfigWidget.h:277 msgid "Button 12" msgstr "" #: objects/ui_ButtonConfigWidget.h:278 msgid "Button 10" msgstr "" #: objects/ui_ButtonConfigWidget.h:279 msgid "Button 11" msgstr "" #: objects/ui_ButtonConfigWidget.h:280 msgid "Button 13" msgstr "" #: objects/ui_ButtonConfigWidget.h:281 msgid "Button 14" msgstr "" #: objects/ui_ButtonConfigWidget.h:282 msgid "Button 15" msgstr "" #: objects/ui_Console.h:42 msgid "Clear" msgstr "" #: objects/ui_Console.h:44 #, fuzzy msgid "Clear console" msgstr "Консоль" #: objects/ui_Console.h:46 #, fuzzy msgid "Save As" msgstr "Зберегти &як..." #: objects/ui_Console.h:48 msgid "Save console content to file" msgstr "" #: objects/ui_FontListDialog.h:103 msgid "OpenSCAD Font List" msgstr "Список шрифтів OpenSCAD" #: objects/ui_FontListDialog.h:104 objects/ui_LibraryInfoDialog.h:74 #: objects/ui_PrintInitDialog.h:110 msgid "&OK" msgstr "&OK" #: objects/ui_FontListDialog.h:105 msgid "Copy to Clipboard" msgstr "Скопіювати до буферу" #: objects/ui_FontListDialog.h:106 msgid "Filter:" msgstr "Фільтр:" #: objects/ui_FontListDialog.h:107 msgid "" "

This list shows the fonts currently registered with " "OpenSCAD.

Example:

  "
"text("OpenSCAD", font = "DejaVu Sans");
  text("OpenSCAD", font = ""
"Liberation Sans:style=Italic");
" msgstr "" "

Цей перелік показує шрифти зареєстровані у OpenSCAD.

Приклад:

  text("OpenSCAD", "
"font = "DejaVu Sans");
  "
"text("OpenSCAD", font = "Liberation Sans:style=Italic");"
"
" #: objects/ui_launchingscreen.h:295 msgid "Welcome to OpenSCAD" msgstr "Ласкаво просимо до OpenSCAD" #: objects/ui_launchingscreen.h:296 msgid "New" msgstr "Новий" #: objects/ui_launchingscreen.h:297 msgid "Open" msgstr "Відкрити" #: objects/ui_launchingscreen.h:298 msgid "Help" msgstr "Допомога" #: objects/ui_launchingscreen.h:299 msgid "Recents" msgstr "Нещодавнє" #: objects/ui_launchingscreen.h:300 msgid "Open Recent" msgstr "Відкрити нещодавнє" #: objects/ui_launchingscreen.h:301 objects/ui_launchingscreen.h:303 msgid "Examples" msgstr "Приклади" #: objects/ui_launchingscreen.h:304 msgid "Open Example" msgstr "Відкрити приклад" #: objects/ui_launchingscreen.h:313 msgid "Don't show again" msgstr "Не показувати знову" #: objects/ui_launchingscreen.h:314 msgid "Version" msgstr "Версія" #: objects/ui_LibraryInfoDialog.h:72 msgid "Lib & Build Info" msgstr "Інформація про бібліотеку і збірку" #: objects/ui_LibraryInfoDialog.h:73 msgid "OpenSCAD Detailed Library and Build Information" msgstr "Детальна інформація про бібліотеку і збірку OpenSCAD" #: objects/ui_MainWindow.h:895 msgid "&New" msgstr "&Новий" #: objects/ui_MainWindow.h:897 msgid "Ctrl+N" msgstr "Ctrl+N" #: objects/ui_MainWindow.h:899 msgid "&Open..." msgstr "&Відкрити..." #: objects/ui_MainWindow.h:901 msgid "Ctrl+O" msgstr "Ctrl+O" #: objects/ui_MainWindow.h:903 msgid "&Save" msgstr "&Зберегти" #: objects/ui_MainWindow.h:905 msgid "Ctrl+S" msgstr "Ctrl+S" #: objects/ui_MainWindow.h:907 msgid "Save &As..." msgstr "Зберегти &як..." #: objects/ui_MainWindow.h:909 msgid "Ctrl+Shift+S" msgstr "Ctrl+Shift+S" #: objects/ui_MainWindow.h:911 msgid "&Reload" msgstr "&Перезавантажити" #: objects/ui_MainWindow.h:913 msgid "Ctrl+R" msgstr "Ctrl+R" #: objects/ui_MainWindow.h:915 msgid "&Quit" msgstr "Ви&йти" #: objects/ui_MainWindow.h:917 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: objects/ui_MainWindow.h:919 msgid "&Undo" msgstr "Ві&дмінити" #: objects/ui_MainWindow.h:921 msgid "Ctrl+Z" msgstr "Ctrl+Z" #: objects/ui_MainWindow.h:923 msgid "&Redo" msgstr "Поверну&ти" #: objects/ui_MainWindow.h:925 msgid "Ctrl+Shift+Z" msgstr "Ctrl+Shift+Z" #: objects/ui_MainWindow.h:928 msgid "Ctrl+Y" msgstr "Ctrl+Y" #: objects/ui_MainWindow.h:930 msgid "Cu&t" msgstr "Ви&різати" #: objects/ui_MainWindow.h:932 msgid "Ctrl+X" msgstr "Ctrl+X" #: objects/ui_MainWindow.h:934 msgid "&Copy" msgstr "&Копіювати" #: objects/ui_MainWindow.h:936 msgid "Ctrl+C" msgstr "Ctrl+C" #: objects/ui_MainWindow.h:938 msgid "&Paste" msgstr "В&ставити" #: objects/ui_MainWindow.h:940 msgid "Ctrl+V" msgstr "Ctrl+V" #: objects/ui_MainWindow.h:942 msgid "&Indent" msgstr "В&ідступити" #: objects/ui_MainWindow.h:944 msgid "Ctrl+I" msgstr "Ctrl+I" #: objects/ui_MainWindow.h:946 msgid "C&omment" msgstr "К&оментувати" #: objects/ui_MainWindow.h:948 msgid "Ctrl+D" msgstr "Ctrl+D" #: objects/ui_MainWindow.h:950 msgid "Unco&mment" msgstr "Ро&зкоментувати" #: objects/ui_MainWindow.h:952 msgid "Ctrl+Shift+D" msgstr "Ctrl+Shift+D" #: objects/ui_MainWindow.h:954 #, fuzzy msgid "Copy viewport ima&ge" msgstr "Копіювати видовий екран" #: objects/ui_MainWindow.h:956 msgid "Ctrl+Shift+C" msgstr "Ctrl+Shift+C" #: objects/ui_MainWindow.h:958 #, fuzzy msgid "Copy viewport transl&ation" msgstr "Вставити &зміщення видового екрану" #: objects/ui_MainWindow.h:960 msgid "Ctrl+T" msgstr "Ctrl+T" #: objects/ui_MainWindow.h:962 #, fuzzy msgid "Cop&y viewport rotation" msgstr "Вставити оберт видового екрану" #: objects/ui_MainWindow.h:963 #, fuzzy msgid "Copy vie&wport distance" msgstr "Копіювати видовий екран" #: objects/ui_MainWindow.h:964 msgid "Increase Font &Size" msgstr "З&більшити розмір шрифту" #: objects/ui_MainWindow.h:966 msgid "Ctrl++" msgstr "Ctrl++" #: objects/ui_MainWindow.h:968 msgid "Decrease Font Si&ze" msgstr "З&меншити розмір шрифту" #: objects/ui_MainWindow.h:970 msgid "Ctrl+-" msgstr "Ctrl+-" #: objects/ui_MainWindow.h:972 msgid "H&ide editor" msgstr "C&ховати редактор" #: objects/ui_MainWindow.h:973 msgid "&Reload and Preview" msgstr "Перезаванта&жити й переглянути" #: objects/ui_MainWindow.h:975 msgid "F4" msgstr "F4" #: objects/ui_MainWindow.h:977 msgid "&Preview" msgstr "Пере&глянути" #: objects/ui_MainWindow.h:979 msgid "F5" msgstr "F5" #: objects/ui_MainWindow.h:981 msgid "R&ender" msgstr "По&будувати" #: objects/ui_MainWindow.h:983 msgid "F6" msgstr "F6" #: objects/ui_MainWindow.h:985 msgid "&3D Print" msgstr "" #: objects/ui_MainWindow.h:987 msgid "F8" msgstr "" #: objects/ui_MainWindow.h:989 msgid "&Check Validity" msgstr "Перевірити &валідніть" #: objects/ui_MainWindow.h:990 msgid "Display A&ST..." msgstr "Показати Абстрактне &Дерево Синтаксису..." #: objects/ui_MainWindow.h:991 msgid "Display CSG &Tree..." msgstr "&Показати дерево CSG..." #: objects/ui_MainWindow.h:992 msgid "Display CSG Pr&oducts..." msgstr "Показати &результати CSG..." #: objects/ui_MainWindow.h:993 msgid "Export as &STL..." msgstr "Експортувати у &STL..." #: objects/ui_MainWindow.h:995 msgid "F7" msgstr "" #: objects/ui_MainWindow.h:997 msgid "Export as &OFF..." msgstr "Експортувати у &OFF" #: objects/ui_MainWindow.h:998 msgid "Preview" msgstr "Перегляд" #: objects/ui_MainWindow.h:1000 msgid "F9" msgstr "F9" #: objects/ui_MainWindow.h:1002 msgid "Surfaces" msgstr "Поверхні" #: objects/ui_MainWindow.h:1004 msgid "F10" msgstr "F10" #: objects/ui_MainWindow.h:1006 msgid "Wireframe" msgstr "Каркас" #: objects/ui_MainWindow.h:1008 msgid "F11" msgstr "F11" #: objects/ui_MainWindow.h:1010 msgid "Thrown Together" msgstr "Однією купою" #: objects/ui_MainWindow.h:1012 msgid "F12" msgstr "F12" #: objects/ui_MainWindow.h:1014 msgid "Show Edges" msgstr "Показувати ребра" #: objects/ui_MainWindow.h:1016 msgid "Ctrl+1" msgstr "Ctrl+1" #: objects/ui_MainWindow.h:1018 msgid "Show Axes" msgstr "Показуваті вісі" #: objects/ui_MainWindow.h:1020 msgid "Ctrl+2" msgstr "Ctrl+2" #: objects/ui_MainWindow.h:1022 msgid "Show Crosshairs" msgstr "Показувати перехрестя" #: objects/ui_MainWindow.h:1024 msgid "Ctrl+3" msgstr "Ctrl+3" #: objects/ui_MainWindow.h:1026 msgid "Show Scale Markers" msgstr "Показувати масштабні маркери" #: objects/ui_MainWindow.h:1027 msgid "Animate" msgstr "Анімувати" #: objects/ui_MainWindow.h:1028 msgid "&Top" msgstr "З&верху" #: objects/ui_MainWindow.h:1030 msgid "Ctrl+4" msgstr "Ctrl+4" #: objects/ui_MainWindow.h:1032 msgid "&Bottom" msgstr "З&низу" #: objects/ui_MainWindow.h:1034 msgid "Ctrl+5" msgstr "Ctrl+5" #: objects/ui_MainWindow.h:1036 msgid "&Left" msgstr "З&ліва" #: objects/ui_MainWindow.h:1038 msgid "Ctrl+6" msgstr "Ctrl+6" #: objects/ui_MainWindow.h:1040 msgid "&Right" msgstr "С&права" #: objects/ui_MainWindow.h:1042 msgid "Ctrl+7" msgstr "Ctrl+7" #: objects/ui_MainWindow.h:1044 msgid "&Front" msgstr "&Спереду" #: objects/ui_MainWindow.h:1046 msgid "Ctrl+8" msgstr "Ctrl+8" #: objects/ui_MainWindow.h:1048 msgid "Bac&k" msgstr "Зза&ду" #: objects/ui_MainWindow.h:1050 msgid "Ctrl+9" msgstr "Ctrl+9" #: objects/ui_MainWindow.h:1052 msgid "&Diagonal" msgstr "&Діагональна проекція" #: objects/ui_MainWindow.h:1054 msgid "Ctrl+0" msgstr "Ctrl+0" #: objects/ui_MainWindow.h:1056 msgid "Ce&nter" msgstr "&Центрувати" #: objects/ui_MainWindow.h:1057 msgid "&Perspective" msgstr "Перспе&ктивний вид" #: objects/ui_MainWindow.h:1058 msgid "&Orthogonal" msgstr "&Ортогональний вид" #: objects/ui_MainWindow.h:1059 msgid "H&ide console" msgstr "За&ховати консоль" #: objects/ui_MainWindow.h:1060 msgid "&About" msgstr "Про OpenSCAD" #: objects/ui_MainWindow.h:1061 msgid "&Documentation" msgstr "&Документація" #: objects/ui_MainWindow.h:1062 msgid "Clear Recent" msgstr "Очистити недавнє" #: objects/ui_MainWindow.h:1063 msgid "Export as &DXF..." msgstr "Експортувати у &DXF..." #: objects/ui_MainWindow.h:1064 msgid "&Close" msgstr "&Закрити" #: objects/ui_MainWindow.h:1066 msgid "Ctrl+W" msgstr "Ctrl+W" #: objects/ui_MainWindow.h:1068 msgid "&Preferences" msgstr "&Налаштування" #: objects/ui_MainWindow.h:1069 msgid "&Find..." msgstr "З&найти" #: objects/ui_MainWindow.h:1071 msgid "Ctrl+F" msgstr "Ctrl+F" #: objects/ui_MainWindow.h:1073 msgid "Fin&d and Replace..." msgstr "Знайти та &замінити" #: objects/ui_MainWindow.h:1075 msgid "Ctrl+Alt+F" msgstr "Ctrl+Alt+F" #: objects/ui_MainWindow.h:1077 msgid "Find Ne&xt" msgstr "Знайти на&ступне" #: objects/ui_MainWindow.h:1079 msgid "Ctrl+G" msgstr "Ctrl+G" #: objects/ui_MainWindow.h:1081 msgid "Find Pre&vious" msgstr "Знайти &попереднє" #: objects/ui_MainWindow.h:1083 msgid "Ctrl+Shift+G" msgstr "Ctrl+Shift+G" #: objects/ui_MainWindow.h:1085 msgid "Use Se&lection for Find" msgstr "&Шукати виділений текст" #: objects/ui_MainWindow.h:1087 msgid "Ctrl+E" msgstr "Ctrl+E" #: objects/ui_MainWindow.h:1089 msgid "&Flush Caches" msgstr "О&чистити кеш" #: objects/ui_MainWindow.h:1090 msgid "&OpenSCAD Homepage" msgstr "&Сторінка OpenSCAD" #: objects/ui_MainWindow.h:1091 msgid "&Automatic Reload and Preview" msgstr "&Автоматичне оновлення перегляду" #: objects/ui_MainWindow.h:1092 msgid "Export as &Image..." msgstr "Експортувати у &зображення..." #: objects/ui_MainWindow.h:1093 msgid "Export as &CSG..." msgstr "Експортувати у &CSG..." #: objects/ui_MainWindow.h:1094 msgid "&Library info" msgstr "Інформація про &бібліотеку" #: objects/ui_MainWindow.h:1095 msgid "Show &Library Folder..." msgstr "Показати &каталог бібліотек..." #: objects/ui_MainWindow.h:1096 msgid "Reset View" msgstr "Скинути вид" #: objects/ui_MainWindow.h:1097 msgid "&Font List" msgstr "Список &шрифтів" #: objects/ui_MainWindow.h:1098 msgid "Export as S&VG..." msgstr "Експортувати у &SVG..." #: objects/ui_MainWindow.h:1099 msgid "Export as &AMF..." msgstr "Експортувати у &AMF..." #: objects/ui_MainWindow.h:1100 #, fuzzy msgid "Export as &3MF..." msgstr "Експортувати у &AMF..." #: objects/ui_MainWindow.h:1101 msgid "Zoom In" msgstr "Приблизити" #: objects/ui_MainWindow.h:1103 msgid "Ctrl+]" msgstr "Ctrl+]" #: objects/ui_MainWindow.h:1105 msgid "Zoom Out" msgstr "Віддалити" #: objects/ui_MainWindow.h:1107 msgid "Ctrl+[" msgstr "Ctrl+[" #: objects/ui_MainWindow.h:1109 msgid "View All" msgstr "Побачити все" #: objects/ui_MainWindow.h:1111 msgid "Ctrl+Shift+V" msgstr "Ctrl+Shift+V" #: objects/ui_MainWindow.h:1113 msgid "Conv&ert Tabs to Spaces" msgstr "Перетворити &табуляції на пробіли" #: objects/ui_MainWindow.h:1114 msgid "Hide toolbars" msgstr "Сховати панелі інструментів" #: objects/ui_MainWindow.h:1115 msgid "U&nindent" msgstr "Прибрати відступи" #: objects/ui_MainWindow.h:1117 msgid "Ctrl+Shift+I" msgstr "Ctrl+Shift+I" #: objects/ui_MainWindow.h:1119 msgid "&Cheat Sheet" msgstr "&Шпаргалка" #: objects/ui_MainWindow.h:1120 msgid "Hide Customizer" msgstr "Приховати кастомайзер" #: objects/ui_MainWindow.h:1121 msgid "Message" msgstr "Повідомлення" #: objects/ui_MainWindow.h:1124 msgid "Time:" msgstr "Час:" #: objects/ui_MainWindow.h:1125 msgid "FPS:" msgstr "FPS:" #: objects/ui_MainWindow.h:1126 msgid "Steps:" msgstr "Кроки:" #: objects/ui_MainWindow.h:1127 msgid "Dump Pictures" msgstr "Зберігати картинки" #: objects/ui_MainWindow.h:1128 msgid "&File" msgstr "&Файл" #: objects/ui_MainWindow.h:1129 msgid "Recen&t Files" msgstr "&Недавні файли" #: objects/ui_MainWindow.h:1130 msgid "&Examples" msgstr "&Приклади" #: objects/ui_MainWindow.h:1131 msgid "E&xport" msgstr "&Експорт" #: objects/ui_MainWindow.h:1132 msgid "&Edit" msgstr "&Редагувати" #: objects/ui_MainWindow.h:1133 msgid "&Design" msgstr "&Дизайн" #: objects/ui_MainWindow.h:1134 msgid "&View" msgstr "&Вид" #: objects/ui_MainWindow.h:1135 msgid "&Help" msgstr "Допо&мога" #: objects/ui_MainWindow.h:1136 msgid "Find" msgstr "Знайти" #: objects/ui_MainWindow.h:1137 objects/ui_MainWindow.h:1144 msgid "Replace" msgstr "Замінити" #: objects/ui_MainWindow.h:1139 msgid "Search string" msgstr "Шукати рядок" #: objects/ui_MainWindow.h:1140 msgid "Prev." msgstr "Попередній" #: objects/ui_MainWindow.h:1141 msgid "Next" msgstr "Наступний" #: objects/ui_MainWindow.h:1142 msgid "Done" msgstr "Готово" #: objects/ui_MainWindow.h:1143 msgid "Replacement string" msgstr "Замінити на рядок" #: objects/ui_MainWindow.h:1145 msgid "All" msgstr "Все" #: objects/ui_MainWindow.h:1146 msgid "Customizer Widget" msgstr "Віджет параметрів" #: objects/ui_OpenCSGWarningDialog.h:83 msgid "OpenGL Warning" msgstr "Попередження OpenGL" #: objects/ui_OpenCSGWarningDialog.h:84 msgid "" "\n" "\n" "

" msgstr "" #: objects/ui_OpenCSGWarningDialog.h:89 msgid "Enable OpenCSG" msgstr "Увімкнути OpenCSG" #: objects/ui_OpenCSGWarningDialog.h:90 msgid "Show this message again" msgstr "Показати це повідомлення знову" #: objects/ui_OpenCSGWarningDialog.h:91 msgid "Close" msgstr "Закрити" #: objects/ui_ParameterEntryWidget.h:339 objects/ui_ParameterWidget.h:160 msgid "Form" msgstr "Форма" #: objects/ui_ParameterEntryWidget.h:341 msgid "Parameter" msgstr "Параметр" #: objects/ui_ParameterEntryWidget.h:342 objects/ui_ParameterEntryWidget.h:343 msgid "Description" msgstr "Опис" #: objects/ui_ParameterWidget.h:161 msgid "save preset" msgstr "збереги пресет" #: objects/ui_ParameterWidget.h:163 #, fuzzy msgid "delete current preset" msgstr "видалити поточний пресет" #: objects/ui_ParameterWidget.h:165 msgid "-" msgstr "-" #: objects/ui_ParameterWidget.h:167 msgid "preset selection" msgstr "вибір пресету" #: objects/ui_ParameterWidget.h:170 src/parameter/ParameterWidget.cc:162 msgid "add new preset" msgstr "додати новий пресет" #: objects/ui_ParameterWidget.h:172 msgid "+" msgstr "+" #: objects/ui_ParameterWidget.h:174 msgid "Automatic Preview" msgstr "Автоматичний перегляд" #: objects/ui_ParameterWidget.h:175 msgid "Show Details" msgstr "Показати деталі" #: objects/ui_ParameterWidget.h:176 msgid "Inline Details" msgstr "Деталі в рядках" #: objects/ui_ParameterWidget.h:177 msgid "Hide Details" msgstr "Сховати деталі" #: objects/ui_ParameterWidget.h:178 msgid "Description Only" msgstr "Тільки опис" #: objects/ui_ParameterWidget.h:181 #, fuzzy msgid "reset all parameters to the currently selected preset" msgstr "скинути пераметри до поточного пресету" #: objects/ui_ParameterWidget.h:183 msgid "Reset" msgstr "Скидання" #: objects/ui_Preferences.h:1438 msgid "3D View" msgstr "3D вид" #: objects/ui_Preferences.h:1439 msgctxt "preferences" msgid "Advanced" msgstr "Поглиблене" #: objects/ui_Preferences.h:1440 src/mainwin.cc:2888 msgid "Editor" msgstr "Редактор" #: objects/ui_Preferences.h:1441 msgid "Update" msgstr "Оновлення" #: objects/ui_Preferences.h:1442 objects/ui_Preferences.h:1519 msgid "Features" msgstr "Можливості" #: objects/ui_Preferences.h:1444 msgid "Enable/Disable experimental features" msgstr "Увімкнути/Вимкнути експериментальні можливості" #: objects/ui_Preferences.h:1446 #, fuzzy msgid "Axes" msgstr "Показуваті вісі" #: objects/ui_Preferences.h:1448 msgid "Input driver configuration and Axis mapping" msgstr "" #: objects/ui_Preferences.h:1450 msgid "Buttons" msgstr "" #: objects/ui_Preferences.h:1451 objects/ui_PrintInitDialog.h:109 msgid "3D Print" msgstr "" #: objects/ui_Preferences.h:1453 msgid "3D Printing Services" msgstr "" #: objects/ui_Preferences.h:1455 msgid "Color scheme:" msgstr "Схема кольорів:" #: objects/ui_Preferences.h:1456 msgid "Show Warnings and Errors in 3D View" msgstr "Показувати попередження та помилки у 3D виді" #: objects/ui_Preferences.h:1457 msgid "mouse centric zoom" msgstr "" #: objects/ui_Preferences.h:1458 msgid "Editor Type" msgstr "Тип редактору" #: objects/ui_Preferences.h:1459 msgid "Simple Editor" msgstr "Простий редактор" #: objects/ui_Preferences.h:1460 msgid "QScintilla Editor" msgstr "QScintilla редактор" #: objects/ui_Preferences.h:1462 msgid "(requires restart)" msgstr "(потребує перезапуску)" #: objects/ui_Preferences.h:1463 msgid "Font" msgstr "Шрифт" #: objects/ui_Preferences.h:1464 msgid "Color syntax highlighting" msgstr "Кольорова підсвітка синтаксису" #: objects/ui_Preferences.h:1465 msgid "Ctrl/Cmd-Mouse-wheel zooms text" msgstr "Ctrl/Cmd-колесо масштабує текст" #: objects/ui_Preferences.h:1466 msgid "Indentation" msgstr "Відступи" #: objects/ui_Preferences.h:1467 msgid "Auto Indent" msgstr "Автовідступи" #: objects/ui_Preferences.h:1468 msgid "Backspace unindents" msgstr "Backspace відміняє відступ" #: objects/ui_Preferences.h:1469 msgid "Indent using" msgstr "Робити відступи" #: objects/ui_Preferences.h:1470 src/settings.cc:176 msgid "Spaces" msgstr "Пробілами" #: objects/ui_Preferences.h:1471 src/settings.cc:176 msgid "Tabs" msgstr "Табуляцією" #: objects/ui_Preferences.h:1473 msgid "Indentation width" msgstr "Ширина відступу" #: objects/ui_Preferences.h:1474 msgid "Tab width" msgstr "Ширина табуляції" #: objects/ui_Preferences.h:1475 msgid "Tab key function" msgstr "Клавіша Tab виконує" #: objects/ui_Preferences.h:1476 objects/ui_Preferences.h:1501 #: src/settings.cc:177 msgid "Indent" msgstr "Відступ" #: objects/ui_Preferences.h:1477 src/settings.cc:177 msgid "Insert Tab" msgstr "Ставить табуляцію" #: objects/ui_Preferences.h:1479 msgid "Show whitespace" msgstr "Показувати пробіл" #: objects/ui_Preferences.h:1480 src/settings.cc:172 msgid "Never" msgstr "Ніколи" #: objects/ui_Preferences.h:1481 src/settings.cc:172 msgid "Always" msgstr "Завжди" #: objects/ui_Preferences.h:1482 msgid "Only after indentation" msgstr "Тільки після відступу" #: objects/ui_Preferences.h:1484 msgid "Size" msgstr "Розмір" #: objects/ui_Preferences.h:1485 msgid "Display" msgstr "Показ" #: objects/ui_Preferences.h:1486 msgid "Enable brace matching" msgstr "Увімкнути парні дужки" #: objects/ui_Preferences.h:1487 msgid "Highlight current line" msgstr "Підсвічувати поточний рядок" #: objects/ui_Preferences.h:1488 msgid "Display Line Numbers" msgstr "Показувати номери рядків" #: objects/ui_Preferences.h:1489 objects/ui_Preferences.h:1514 msgid "Line wrap" msgstr "Згортання рядків" #: objects/ui_Preferences.h:1490 objects/ui_Preferences.h:1503 #: objects/ui_Preferences.h:1509 src/settings.cc:73 src/settings.cc:89 #: src/settings.cc:167 src/settings.cc:170 src/settings.cc:171 msgid "None" msgstr "Нема" #: objects/ui_Preferences.h:1491 src/settings.cc:167 msgid "Wrap at character boundaries" msgstr "Згортати на межах знаків" #: objects/ui_Preferences.h:1492 src/settings.cc:167 msgid "Wrap at word boundaries" msgstr "Згортати на межах слів" #: objects/ui_Preferences.h:1494 msgid "Line wrap indentation" msgstr "Відступ згортання рядків" #: objects/ui_Preferences.h:1495 msgid "Line wrap visualization" msgstr "Візуалізація згортання рядків" #: objects/ui_Preferences.h:1496 msgid "Style" msgstr "Стиль" #: objects/ui_Preferences.h:1497 src/settings.cc:168 msgid "Fixed" msgstr "Фіксований" #: objects/ui_Preferences.h:1498 src/settings.cc:168 msgid "Same" msgstr "Такий самий" #: objects/ui_Preferences.h:1499 src/settings.cc:168 msgid "Indented" msgstr "З відступом" #: objects/ui_Preferences.h:1502 msgid "Start" msgstr "Початок" #: objects/ui_Preferences.h:1504 objects/ui_Preferences.h:1510 #: src/settings.cc:170 src/settings.cc:171 msgid "Text" msgstr "Текст" #: objects/ui_Preferences.h:1505 objects/ui_Preferences.h:1511 #: src/settings.cc:170 src/settings.cc:171 msgid "Border" msgstr "Межа" #: objects/ui_Preferences.h:1506 objects/ui_Preferences.h:1512 #: src/settings.cc:170 src/settings.cc:171 msgid "Margin" msgstr "Поле" #: objects/ui_Preferences.h:1508 msgid "End" msgstr "Кінець" #: objects/ui_Preferences.h:1515 msgid "Automatically check for updates" msgstr "Автоматично перевіряти оновлення" #: objects/ui_Preferences.h:1516 msgid "Include development snapshots" msgstr "Включити розробницькі збірки" #: objects/ui_Preferences.h:1517 msgid "Check Now" msgstr "Перевірити зараз" #: objects/ui_Preferences.h:1518 msgid "Last checked: " msgstr "Останнього разу перевірено:" #: objects/ui_Preferences.h:1520 objects/ui_PrintInitDialog.h:114 msgid "OctoPrint" msgstr "" #: objects/ui_Preferences.h:1521 msgid "URL" msgstr "" #: objects/ui_Preferences.h:1522 msgid "API Key" msgstr "" #: objects/ui_Preferences.h:1523 objects/ui_Preferences.h:1524 msgid "Load" msgstr "" #: objects/ui_Preferences.h:1526 #, fuzzy msgid "Check" msgstr "Перевірити зараз" #: objects/ui_Preferences.h:1527 msgid "Slicing Profile" msgstr "" #: objects/ui_Preferences.h:1528 msgid "Slicing Engine" msgstr "" #: objects/ui_Preferences.h:1529 msgid "File Format" msgstr "" #: objects/ui_Preferences.h:1530 #, fuzzy msgid "Action" msgstr "Програма" #: objects/ui_Preferences.h:1531 #, fuzzy msgid "Show" msgstr "Показуваті вісі" #: objects/ui_Preferences.h:1532 msgid "Note: The API key is stored unencrypted in the application settings." msgstr "" #: objects/ui_Preferences.h:1533 msgid "OpenCSG" msgstr "OpenCSG" #: objects/ui_Preferences.h:1534 msgid "Show capability warning" msgstr "Показувати попередження про здатності" #: objects/ui_Preferences.h:1535 msgid "Enable for OpenGL 1.x" msgstr "Увімкнути для OpenGL 1.x" #: objects/ui_Preferences.h:1536 msgid "Turn off rendering at " msgstr "Вимкнути рендеринг на " #: objects/ui_Preferences.h:1537 msgid "elements" msgstr "елементів" #: objects/ui_Preferences.h:1538 msgid "Force Goldfeather" msgstr "Примусово вмикати Goldfeather" #: objects/ui_Preferences.h:1539 msgid "CGAL" msgstr "" #: objects/ui_Preferences.h:1540 msgid "CGAL Cache size" msgstr "Розмір кешу CGAL" #: objects/ui_Preferences.h:1541 objects/ui_Preferences.h:1543 msgid "MB" msgstr "МБ" #: objects/ui_Preferences.h:1542 msgid "PolySet Cache size" msgstr "Розмір кешу PolySet" #: objects/ui_Preferences.h:1544 msgid "User Interface" msgstr "" #: objects/ui_Preferences.h:1545 msgid "Allow opening multiple documents" msgstr "Дозволити відкривати багато документів" #: objects/ui_Preferences.h:1546 msgid "Enable docking of Editor and Console in different places" msgstr "Дозволити стикування Редактору та Консолі в різних місцях" #: objects/ui_Preferences.h:1547 msgid "Enable undocking of Editor and Console to separate windows" msgstr "Дозволити відстикування Редактору та Консолі до різних вікон" #: objects/ui_Preferences.h:1548 msgid "Show Welcome Screen" msgstr "Показувати вікно привітання" #: objects/ui_Preferences.h:1549 msgid "Enable user interface localization (requires restart of OpenSCAD)" msgstr "Увімкнути локалізацію інтерфейсу (потребує перезапуску)" #: objects/ui_Preferences.h:1550 msgid "Bring window to front after automatic reload" msgstr "Піднести вікно на передній план після автоматичного перевантаження" #: objects/ui_Preferences.h:1551 msgid "Play sound notification on render complete" msgstr "Програвати звукове оповіщення по завершенні рендерингу" #: objects/ui_Preferences.h:1552 msgid "OpenSCAD Language Features" msgstr "" #: objects/ui_Preferences.h:1553 msgid "Warn when there is a parameter mismatch in user module calls" msgstr "" #: objects/ui_Preferences.h:1554 msgid "Stop on the first warning" msgstr "" #: objects/ui_Preferences.h:1555 msgid "check the parameter range for builtin modules" msgstr "" #: objects/ui_PrintInitDialog.h:111 msgid "Cancel" msgstr "" #: objects/ui_PrintInitDialog.h:113 msgid "%1" msgstr "" #: objects/ui_ProgressWidget.h:70 msgid "%v / %m" msgstr "%v / %m" #: src/Network.h:116 msgid "Timeout error" msgstr "" #: src/Camera.cc:125 #, c-format msgid "" "Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], " "distance = %.2f" msgstr "" "Вид: переміщення = [ %.2f %.2f %.2f ], оберт = [ %.2f %.2f %.2f ], відстань " "= %.2f" #: src/Console.cc:53 msgid "Save console content" msgstr "" #: src/export.cc:77 #, c-format msgid "Can't open file \"%s\" for export" msgstr "Не можу відкрити файл \"%s\" для експорту" #: src/export.cc:92 #, c-format msgid "ERROR: \"%s\" write error. (Disk full?)" msgstr "ПОМИЛКА: \"%s\" помилка запису. (Диск переповнено?)" #: src/mainwin.cc:915 src/mainwin.cc:1601 msgid "Untitled.scad" msgstr "Безіменний.scad" #: src/mainwin.cc:1169 msgid "Compile error." msgstr "Помилка компіляції." #: src/mainwin.cc:1172 msgid "Error while compiling '%1'." msgstr "Помилка під час компіляції '%1'." #: src/mainwin.cc:1176 msgid "Compilation generated %1 warning." msgid_plural "Compilation generated %1 warnings." msgstr[0] "Компіляція видала %1 попередження." msgstr[1] "Компіляція видала %1 попереджень." msgstr[2] "Компіляція видала %1 попереджень." #: src/mainwin.cc:1186 msgid " For details see console window." msgstr " Для деталей дивіться вікно консолі." #: src/mainwin.cc:1579 msgid "Failed to open file for writing" msgstr "Неможливо відкрити файл для запису" #: src/mainwin.cc:1589 #, c-format msgid "Saved design '%s'." msgstr "Дизайн '%s' збережено." #: src/mainwin.cc:1592 msgid "Error saving design" msgstr "Помилка при збереженні дизайну" #: src/mainwin.cc:1600 msgid "Save File" msgstr "Збереги файл" #: src/mainwin.cc:1602 msgid "OpenSCAD Designs (*.scad)" msgstr "Дизайн OpenSCAD (*.scad)" #: src/mainwin.cc:1612 msgid "" "%1 already exists.\n" "Do you want to replace it?" msgstr "" "%1 вже існує.\n" "Перезаписати?" #: src/mainwin.cc:1976 msgid "Application" msgstr "Програма" #: src/mainwin.cc:1977 msgid "" "The document has been modified.\n" "Do you really want to reload the file?" msgstr "" "Документ було змінено.\n" "Ви дійсно бажаєте перезавантажити файл?" #: src/mainwin.cc:2217 msgid "Exported design exceeds the service upload limit of (%1 MB)." msgstr "" #: src/mainwin.cc:2218 msgid "Upload Error" msgstr "" #: src/mainwin.cc:2530 msgid "Export %1 File" msgstr "Експорт файлу %1" #: src/mainwin.cc:2531 msgid "%1 Files (*%2)" msgstr "%1 файли (*%2)" #: src/mainwin.cc:2589 msgid "Export CSG File" msgstr "Експорт CSG файлу" #: src/mainwin.cc:2589 msgid "CSG Files (*.csg)" msgstr "CSG файли (*.csg)" #: src/mainwin.cc:2618 msgid "Export Image" msgstr "Експорт зображення" #: src/mainwin.cc:2618 msgid "PNG Files (*.png)" msgstr "PNG файли (*.png)" #: src/mainwin.cc:2893 msgid "Console" msgstr "Консоль" #: src/mainwin.cc:2898 msgid "Customizer" msgstr "Кастомайзер" #: src/mainwin.cc:3042 msgid "The document has been modified." msgstr "Документ було змінено" #: src/mainwin.cc:3043 msgid "Do you want to save your changes?" msgstr "Зберегти ваші зміни?" #: src/mainwin.cc:3202 #, fuzzy msgid "/Untitled" msgstr "Безіменний" #: src/mainwin.cc:3205 msgid "/" msgstr "" #: src/OpenSCADApp.cc:61 msgid "Unknown error" msgstr "Невідома помилка" #: src/OpenSCADApp.cc:64 msgid "Critical Error" msgstr "Критична помилка" #: src/OpenSCADApp.cc:64 msgid "" "A critical error was caught. The application may have become unstable:\n" "%1" msgstr "" "Сталась критична помилка. Програма могла стати нестабільною:\n" " %1" #: src/OpenSCADApp.cc:88 msgid "" "Fontconfig needs to update its font cache.\n" "This can take up to a couple of minutes." msgstr "" "Конфігуратор шрифтів має оновити свій кеш.\n" "Це може зайняти до кількох хвилин." #: src/Preferences.cc:235 src/Preferences.cc:240 src/Preferences.cc:710 #: src/Preferences.cc:746 msgid "" msgstr "" #: src/Preferences.cc:694 msgid "Success: Server Version = %2, API Version = %1" msgstr "" #: src/Preferences.cc:696 src/Preferences.cc:720 src/Preferences.cc:756 msgid "Error" msgstr "" #: src/PrintInitDialog.cc:44 msgid "Print Service not available" msgstr "" #: src/QGLView.cc:150 msgid "" "Warning: You may experience OpenCSG rendering errors.\n" "\n" msgstr "" "Попередження: Можливі помилки рендерінгу OpenCSG.\n" "\n" #: src/QGLView.cc:153 msgid "" "Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been " "disabled.\n" "\n" msgstr "" "Попередження: Відсутні можливости OpenGL для OpenCSG - OpenCSG буде " "вимкнено.\n" "\n" #: src/QGLView.cc:156 msgid "" "It is highly recommended to use OpenSCAD on a system with OpenGL 2.0 or " "later.\n" "Your renderer information is as follows:\n" msgstr "" "Дуже рекомендовано використовувати OpenSCAD на системі з OpenGL 2.0 або " "новішим.\n" "Ваш рендерер такий:\n" #: src/QGLView.cc:159 msgid "" "GLEW version %1\n" "%2 (%3)\n" "OpenGL version %4\n" msgstr "" "Версія GLEW %1\n" "%2 (%3)\n" "Версія OpenGL %4\n" #: src/settings.cc:77 #, c-format msgid "Axis %d" msgstr "" #: src/settings.cc:81 #, c-format msgid "Axis %d (inverted)" msgstr "" #: src/settings.cc:90 #, fuzzy msgid "Toggle Perspective" msgstr "Перспе&ктивний вид" #: src/settings.cc:172 msgid "After indentation" msgstr "Після відступу" #: src/settings.cc:185 msgid "Upload only" msgstr "" #: src/settings.cc:185 msgid "Upload & Slice" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Select for printing" msgstr "" #: src/settings.cc:185 msgid "Upload, Slice & Start printing" msgstr "" #: src/parameter/ParameterWidget.cc:79 src/parameter/ParameterWidget.cc:237 msgid "changes on current preset not saved" msgstr "зміни до поточного пресету не збережені" #: src/parameter/ParameterWidget.cc:81 msgid "" "The changes on the current preset %1 are not saved yet. Do you really want " "to reset this preset and lose your changes?" msgstr "" "Зміни до поточного пресету %1 ще не збережені. Ви дійсно бажаєте скинути цей " "пресет та втратити зміни?" #: src/parameter/ParameterWidget.cc:164 msgid "remove current preset" msgstr "видалити поточний пресет" #: src/parameter/ParameterWidget.cc:166 msgid "save current preset" msgstr "зберегти поточний пресет" #: src/parameter/ParameterWidget.cc:168 src/parameter/ParameterWidget.cc:169 #: src/parameter/ParameterWidget.cc:170 msgid "JSON file read only" msgstr "JSON файл тільки для зчитування" #: src/parameter/ParameterWidget.cc:221 msgid "design default values" msgstr "" #: src/parameter/ParameterWidget.cc:239 msgid "" "The current preset %1 contains changes, but is not saved yet. Do you really " "want to change the preset and lose your changes?" msgstr "" "Поточний пресет %1 містить зміни, але ще не збережений. Ви дійсно бажаєте " "змінити пресет та втратити ваші зміни?" #: src/parameter/ParameterWidget.cc:279 #, fuzzy msgid "Do you want to delete the current preset?" msgstr "Зберегти ваші зміни?" #: src/parameter/ParameterWidget.cc:281 msgid "Do you want to delete the current preset '%1'?" msgstr "" #: src/parameter/ParameterWidget.cc:516 msgid "Create new set of parameter" msgstr "Створити новий набір параметрів" #: src/parameter/ParameterWidget.cc:516 msgid "Enter name of the parameter set" msgstr "Введіть назву набору параметрів" #: src/parameter/ParameterWidget.cc:527 msgid "Set Name %1 already exists" msgstr "" #: src/parameter/ParameterWidget.cc:528 #, fuzzy msgid "The set name %1 already exists. Do you want overwrite it?" msgstr "" "%1 вже існує.\n" "Перезаписати?" #: src/parameter/ParameterWidget.cc:572 msgid "Saving presets" msgstr "Пресети записуються" #: src/parameter/ParameterWidget.cc:573 msgid "%1 was found, but was unreadable. Do you want to overwrite %1?" msgstr "%1 було знайдено, але не читається. Бажаєте переписати %1?" #: src/input/AxisConfigWidget.h:91 msgid "" "This driver was not enabled during build time and is thus not available." msgstr "" #: src/input/AxisConfigWidget.h:93 msgid "" "The DBUS driver is not for actual devices but for remote control, Linux only." msgstr "" #: src/input/AxisConfigWidget.h:94 msgid "" "The HIDAPI driver communicates directly with the 3D mice, Windows and macOS." msgstr "" #: src/input/AxisConfigWidget.h:95 msgid "" "The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, " "Linux only." msgstr "" #: src/input/AxisConfigWidget.h:96 msgid "" "The Joystick driver uses the Linux joystick device (fixed to /dev/input/" "js0), Linux only." msgstr "" #: src/input/AxisConfigWidget.h:97 msgid "The QGAMEPAD driver is for multiplattform Gamepad Support." msgstr "" #: src/input/ButtonConfigWidget.cc:186 msgid "(not supported)" msgstr "" #: examples/examples.json:2 msgid "Basics" msgstr "Основи" #: examples/examples.json:13 msgid "Functions" msgstr "Функції" #: examples/examples.json:20 msgid "Advanced" msgstr "Поглиблене" #: examples/examples.json:30 msgid "Parametric" msgstr "Пераметричне" #: examples/examples.json:34 msgid "Old" msgstr "Старі" #. (itstool) path: component/summary #: openscad.appdata.xml.in:6 msgid "The Programmers Solid 3D CAD Modeller" msgstr "Твердотільна тривимірна САПР для програмістів" #. (itstool) path: description/p #: openscad.appdata.xml.in:20 msgid "" "OpenSCAD is a software for creating solid 3D CAD models. Unlike most free " "software for creating 3D models (such as Blender) it does not focus on the " "artistic aspects of 3D modelling but instead on the CAD aspects. Thus it " "might be the application you are looking for when you are planning to create " "3D models of machine parts but pretty sure is not what you are looking for " "when you are more interested in creating computer-animated movies." msgstr "" "OpenSCAD це програмне забезпечення для створення твердотільних 3D моделей. " "На відміну від більшості вільного ПЗ для створення 3D моделей (такого як " "Blender) він не зосереджується на мистецьких аспектах моделювання, замість " "цього - на аспектах САПР. Тому це може бути програма, яку ви шукаєте коли " "плануєте створювати 3D моделі запчастин механізмів, але зовсім не те що ви " "шукали, плануючи створення анімаційних фільмів." #. (itstool) path: description/p #: openscad.appdata.xml.in:21 msgid "" "OpenSCAD is not an interactive modeller. Instead it is something like a 3D-" "compiler that reads in a script file that describes the object and renders " "the 3D model from this script file. This gives you (the designer) full " "control over the modelling process and enables you to easily change any step " "in the modelling process or make designs that are defined by configurable " "parameters." msgstr "" "OpenSCAD це не інтерактивний моделер. Замість цього це щось на зразок 3D-" "компілятору який читає скриптовий файл, у якому описано модель, та будує 3D " "модель зі скриптового файлу. Це дає вам (розробнику) повний контроль над " "процесом конструювання та дозволяє легко змінити будь-який крок в процесі " "моделювання, або розробляти моделі, які повністю визначені через " "конфігураційні параметри." #. (itstool) path: description/p #: openscad.appdata.xml.in:22 msgid "" "OpenSCAD provides two main modelling techniques: First there is constructive " "solid geometry (aka CSG) and second there is extrusion of 2D outlines. As " "data exchange format for this 2D outlines Autocad DXF files are used. In " "addition to 2D paths for extrusion it is also possible to read design " "parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D " "models in the STL and OFF file formats." msgstr "" "OpenSCAD забезпечує дві техніки моделювання: перша це Конструктивна блокова " "геометрія (або CSG), а друга це видавлювання 2D контурів. В якості формату " "обміну даних для цих 2D контурів використовуються файли AutoCAD DXF. Окрім " "файлів DXF OpenSCAD може читати та створювати 3D моделі у форматах файлів " "STL та OFF." #~ msgid "Untitled.csg" #~ msgstr "Безіменний.csg" #~ msgid "Untitled.png" #~ msgstr "Безіменний.png" #~ msgid "no preset selected" #~ msgstr "пресет не обрано" openscad-2019.05/mingw-cross-env.pri0000644000076500000240000000042313402025764017653 0ustar kintelstaff00000000000000# cross compilation unix->win32 # To use static linking, pass CONFIG+=mingw-cross-env to qmake # To use shared linking, pass CONFIG+=mingw-cross-env-shared to qmake mingw-cross-env* { QMAKE_DEL_FILE = rm -f QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs #eigen3 } openscad-2019.05/opengl.pri0000644000076500000240000000126513402025764016106 0ustar kintelstaff00000000000000# Prefer QOpenGLWidget for non-Windows platforms # To explicitly enable QOpenGLWidget: qmake CONFIG += qopenglwidget # To explicitly enable QGLWidget: qmake CONFIG += qglwidget has_qopenglwidget { !win*: CONFIG += qopenglwidget qopenglwidget:!qglwidget: CONFIG += using_qopenglwidget } using_qopenglwidget { message("Using QOpenGLWidget") DEFINES += USE_QOPENGLWIDGET } else { message("Using QGLWidget") QT += opengl } # see http://fedoraproject.org/wiki/UnderstandingDSOLinkChange # and https://github.com/openscad/openscad/pull/119 # ( QT += opengl does not automatically link glu on some DSO systems. ) unix:!macx { QMAKE_LIBS_OPENGL *= -lGLU QMAKE_LIBS_OPENGL *= -lX11 } openscad-2019.05/openscad.appdata.xml.in0000644000076500000240000000551513432700636020445 0ustar kintelstaff00000000000000 org.openscad.OpenSCAD CC0-1.0 OpenSCAD

The Programmers Solid 3D CAD Modeller https://www.openscad.org/images/openscad.png Graphics 3DGraphics https://www.openscad.org/ https://github.com/openscad/openscad/issues https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/FAQ https://en.wikibooks.org/wiki/OpenSCAD_User_Manual https://www.openscad.org/community.html openscad.desktop GPL-3.0+

OpenSCAD is a software for creating solid 3D CAD models. Unlike most free software for creating 3D models (such as Blender) it does not focus on the artistic aspects of 3D modelling but instead on the CAD aspects. Thus it might be the application you are looking for when you are planning to create 3D models of machine parts but pretty sure is not what you are looking for when you are more interested in creating computer-animated movies.

OpenSCAD is not an interactive modeller. Instead it is something like a 3D-compiler that reads in a script file that describes the object and renders the 3D model from this script file. This gives you (the designer) full control over the modelling process and enables you to easily change any step in the modelling process or make designs that are defined by configurable parameters.

OpenSCAD provides two main modelling techniques: First there is constructive solid geometry (aka CSG) and second there is extrusion of 2D outlines. As data exchange format for this 2D outlines Autocad DXF files are used. In addition to 2D paths for extrusion it is also possible to read design parameters from DXF files. Besides DXF files OpenSCAD can read and create 3D models in the STL and OFF file formats.

application/x-openscad The OpenSCAD Developers https://www.openscad.org/images/appdata-screenshot-1.png https://www.openscad.org/images/appdata-screenshot-2.png openscad-2019.05/openscad.pro0000755000076500000240000005371113465203575016441 0ustar kintelstaff00000000000000# Environment variables which can be set to specify library locations: # MPIRDIR # MPFRDIR # BOOSTDIR # CGALDIR # EIGENDIR # GLEWDIR # OPENCSGDIR # OPENSCAD_LIBRARIES # # qmake Variables to define the installation: # # PREFIX defines the base installation folder # # SUFFIX defines an optional suffix for the binary and the # resource folder. E.g. using SUFFIX=-nightly will name the # resulting binary openscad-nightly. # # Please see the 'Building' sections of the OpenSCAD user manual # for updated tips & workarounds. # # https://en.wikibooks.org/wiki/OpenSCAD_User_Manual include(defaults.pri) # Local settings are read from local.pri exists(local.pri): include(local.pri) # Auto-include config_.pri if the VARIANT variable is given on the # command-line, e.g. qmake VARIANT=mybuild !isEmpty(VARIANT) { message("Variant: $${VARIANT}") exists(config_$${VARIANT}.pri) { message("Including config_$${VARIANT}.pri") include(config_$${VARIANT}.pri) } } debug { experimental { message("Building experimental debug version") } else { message("If you're building a development binary, consider adding CONFIG+=experimental") } } VERSION = 2019.05 VERSIONDATE = 2019.05.10 # If VERSION is not set, populate VERSION, VERSION_YEAR, VERSION_MONTH from system date include(version.pri) debug: DEFINES += DEBUG TEMPLATE = app INCLUDEPATH += src DEPENDPATH += src # add CONFIG+=deploy to the qmake command-line to make a deployment build deploy { message("Building deployment version") DEFINES += OPENSCAD_DEPLOY macx: { CONFIG += sparkle OBJECTIVE_SOURCES += src/SparkleAutoUpdater.mm QMAKE_RPATHDIR = @executable_path/../Frameworks } } snapshot { DEFINES += OPENSCAD_SNAPSHOT } # add CONFIG+=idprefix to the qmake command-line to debug node ID's in csg output idprefix { DEFINES += IDPREFIX message("Setting IDPREFIX for csg debugging") warning("Setting IDPREFIX will negatively affect cache hits") } macx { TARGET = OpenSCAD } else { TARGET = openscad$${SUFFIX} } FULLNAME = openscad$${SUFFIX} APPLICATIONID = org.openscad.OpenSCAD !isEmpty(SUFFIX): DEFINES += INSTALL_SUFFIX="\"\\\"$${SUFFIX}\\\"\"" macx { snapshot { ICON = icons/icon-nightly.icns } else { ICON = icons/OpenSCAD.icns } QMAKE_INFO_PLIST = Info.plist APP_RESOURCES.path = Contents/Resources APP_RESOURCES.files = OpenSCAD.sdef dsa_pub.pem icons/SCAD.icns QMAKE_BUNDLE_DATA += APP_RESOURCES LIBS += -framework Cocoa -framework ApplicationServices QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 } # Set same stack size for the linker and #define used in PlatformUtils.h STACKSIZE = 8388608 # 8MB # github issue 116 QMAKE_CXXFLAGS += -DSTACKSIZE=$$STACKSIZE DEFINES += STACKSIZE=$$STACKSIZE win* { RC_FILE = openscad_win32.rc QMAKE_CXXFLAGS += -DNOGDI QMAKE_LFLAGS += -Wl,--stack,$$STACKSIZE } mingw* { # needed to prevent compilation error on MSYS2: # as.exe: objects/cgalutils.o: too many sections (76541) # using -Wa,-mbig-obj did not help debug: QMAKE_CXXFLAGS += -O1 } CONFIG += qt object_parallel_to_source QT += widgets concurrent multimedia network netbsd* { QMAKE_LFLAGS += -L/usr/X11R7/lib QMAKE_LFLAGS += -Wl,-R/usr/X11R7/lib QMAKE_LFLAGS += -Wl,-R/usr/pkg/lib # FIXME: Can the lines below be removed in favour of the OPENSCAD_LIBDIR handling above? !isEmpty(OPENSCAD_LIBDIR) { QMAKE_CFLAGS = -I$$OPENSCAD_LIBDIR/include $$QMAKE_CFLAGS QMAKE_CXXFLAGS = -I$$OPENSCAD_LIBDIR/include $$QMAKE_CXXFLAGS QMAKE_LFLAGS = -L$$OPENSCAD_LIBDIR/lib $$QMAKE_LFLAGS QMAKE_LFLAGS = -Wl,-R$$OPENSCAD_LIBDIR/lib $$QMAKE_LFLAGS } } # Prevent LD_LIBRARY_PATH problems when running the openscad binary # on systems where uni-build-dependencies.sh was used. # Will not affect 'normal' builds. !isEmpty(OPENSCAD_LIBDIR) { unix:!macx { QMAKE_LFLAGS = -Wl,-R$$OPENSCAD_LIBDIR/lib $$QMAKE_LFLAGS # need /lib64 beause GLEW installs itself there on 64 bit machines QMAKE_LFLAGS = -Wl,-R$$OPENSCAD_LIBDIR/lib64 $$QMAKE_LFLAGS } } # See Dec 2011 OpenSCAD mailing list, re: CGAL/GCC bugs. *g++* { QMAKE_CXXFLAGS *= -fno-strict-aliasing QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs # ignored before 4.8 # Disable attributes warnings on MSYS/MXE due to gcc bug spamming the logs: Issue #2771 win* | CONFIG(mingw-cross-env)|CONFIG(mingw-cross-env-shared) { QMAKE_CXXFLAGS += -Wno-attributes } } *clang* { # http://llvm.org/bugs/show_bug.cgi?id=9182 QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual # disable enormous amount of warnings about CGAL / boost / etc QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-variable QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-function # gettext QMAKE_CXXFLAGS_WARN_ON += -Wno-format-security # might want to actually turn this on once in a while QMAKE_CXXFLAGS_WARN_ON += -Wno-sign-compare } skip-version-check { # force the use of outdated libraries DEFINES += OPENSCAD_SKIP_VERSION_CHECK } isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config # Application configuration CONFIG += c++11 CONFIG += cgal CONFIG += opencsg CONFIG += glew CONFIG += boost CONFIG += eigen CONFIG += glib-2.0 CONFIG += harfbuzz CONFIG += freetype CONFIG += fontconfig CONFIG += lib3mf CONFIG += gettext CONFIG += libxml2 CONFIG += libzip CONFIG += hidapi CONFIG += spnav CONFIG += double-conversion #Uncomment the following line to enable the QScintilla editor !nogui { CONFIG += scintilla } # Make experimental features available experimental { DEFINES += ENABLE_EXPERIMENTAL } nogui { DEFINES += OPENSCAD_NOGUI } mdi { DEFINES += ENABLE_MDI } system("ccache -V >/dev/null 2>/dev/null") { CONFIG += ccache message("Using ccache") } include(common.pri) # mingw has to come after other items so OBJECT_DIRS will work properly CONFIG(mingw-cross-env)|CONFIG(mingw-cross-env-shared) { include(mingw-cross-env.pri) } RESOURCES = openscad.qrc # Qt5 removed access to the QMAKE_UIC variable, the following # way works for both Qt4 and Qt5 load(uic) uic.commands += -tr q_ FORMS += src/MainWindow.ui \ src/Preferences.ui \ src/OpenCSGWarningDialog.ui \ src/AboutDialog.ui \ src/FontListDialog.ui \ src/PrintInitDialog.ui \ src/ProgressWidget.ui \ src/launchingscreen.ui \ src/LibraryInfoDialog.ui \ src/Console.ui \ src/parameter/ParameterWidget.ui \ src/parameter/ParameterEntryWidget.ui \ src/input/ButtonConfigWidget.ui \ src/input/AxisConfigWidget.ui # AST nodes FLEXSOURCES += src/lexer.l BISONSOURCES += src/parser.y HEADERS += src/AST.h \ src/ModuleInstantiation.h \ src/Package.h \ src/Assignment.h \ src/expression.h \ src/function.h \ src/module.h \ src/UserModule.h \ SOURCES += src/AST.cc \ src/ModuleInstantiation.cc \ src/Assignment.cc \ src/expr.cc \ src/function.cc \ src/module.cc \ src/UserModule.cc \ src/annotation.cc # Comment parser FLEXSOURCES += src/comment_lexer.l BISONSOURCES += src/comment_parser.y HEADERS += src/version_check.h \ src/version_helper.h \ src/ProgressWidget.h \ src/parsersettings.h \ src/renderer.h \ src/settings.h \ src/rendersettings.h \ src/colormap.h \ src/ThrownTogetherRenderer.h \ src/CGAL_OGL_Polyhedron.h \ src/QGLView.h \ src/GLView.h \ src/MainWindow.h \ src/OpenSCADApp.h \ src/WindowManager.h \ src/Preferences.h \ src/SettingsWriter.h \ src/OpenCSGWarningDialog.h \ src/AboutDialog.h \ src/FontListDialog.h \ src/FontListTableView.h \ src/GroupModule.h \ src/FileModule.h \ src/StatCache.h \ src/builtin.h \ src/calc.h \ src/context.h \ src/builtincontext.h \ src/modcontext.h \ src/evalcontext.h \ src/csgops.h \ src/CSGTreeNormalizer.h \ src/CSGTreeEvaluator.h \ src/dxfdata.h \ src/dxfdim.h \ src/export.h \ src/stackcheck.h \ src/exceptions.h \ src/grid.h \ src/hash.h \ src/highlighter.h \ src/localscope.h \ src/feature.h \ src/node.h \ src/csgnode.h \ src/offsetnode.h \ src/linearextrudenode.h \ src/rotateextrudenode.h \ src/projectionnode.h \ src/cgaladvnode.h \ src/importnode.h \ src/import.h \ src/transformnode.h \ src/colornode.h \ src/rendernode.h \ src/textnode.h \ src/version.h \ src/openscad.h \ src/handle_dep.h \ src/Geometry.h \ src/Polygon2d.h \ src/clipper-utils.h \ src/GeometryUtils.h \ src/polyset-utils.h \ src/polyset.h \ src/printutils.h \ src/fileutils.h \ src/value.h \ src/progress.h \ src/editor.h \ src/NodeVisitor.h \ src/state.h \ src/nodecache.h \ src/nodedumper.h \ src/ModuleCache.h \ src/GeometryCache.h \ src/GeometryEvaluator.h \ src/Tree.h \ src/DrawingCallback.h \ src/FreetypeRenderer.h \ src/FontCache.h \ src/memory.h \ src/linalg.h \ src/Camera.h \ src/system-gl.h \ src/boost-utils.h \ src/LibraryInfo.h \ src/svg.h \ \ src/OffscreenView.h \ src/OffscreenContext.h \ src/OffscreenContextAll.hpp \ src/fbo.h \ src/imageutils.h \ src/system-gl.h \ src/CsgInfo.h \ \ src/Dock.h \ src/Console.h \ src/AutoUpdater.h \ src/launchingscreen.h \ src/legacyeditor.h \ src/LibraryInfoDialog.h \ \ src/comment.h\ \ src/parameter/ParameterWidget.h \ src/parameter/parameterobject.h \ src/parameter/parameterextractor.h \ src/parameter/parametervirtualwidget.h \ src/parameter/parameterspinbox.h \ src/parameter/parametercombobox.h \ src/parameter/parameterslider.h \ src/parameter/parametercheckbox.h \ src/parameter/parametertext.h \ src/parameter/parametervector.h \ src/parameter/groupwidget.h \ src/parameter/parameterset.h \ src/parameter/ignoreWheelWhenNotFocused.h \ src/QWordSearchField.h \ src/QSettingsCached.h \ src/input/InputDriver.h \ src/input/InputEventMapper.h \ src/input/InputDriverManager.h \ src/input/AxisConfigWidget.h \ src/input/ButtonConfigWidget.h \ src/input/WheelIgnorer.h SOURCES += \ src/libsvg/libsvg.cc \ src/libsvg/circle.cc \ src/libsvg/ellipse.cc \ src/libsvg/line.cc \ src/libsvg/text.cc \ src/libsvg/tspan.cc \ src/libsvg/data.cc \ src/libsvg/polygon.cc \ src/libsvg/polyline.cc \ src/libsvg/rect.cc \ src/libsvg/group.cc \ src/libsvg/svgpage.cc \ src/libsvg/path.cc \ src/libsvg/shape.cc \ src/libsvg/transformation.cc \ src/libsvg/util.cc \ \ src/version_check.cc SOURCES += \ src/ProgressWidget.cc \ src/linalg.cc \ src/Camera.cc \ src/handle_dep.cc \ src/value.cc \ src/degree_trig.cc \ src/func.cc \ src/localscope.cc \ src/feature.cc \ src/node.cc \ src/context.cc \ src/builtincontext.cc \ src/modcontext.cc \ src/evalcontext.cc \ src/csgnode.cc \ src/CSGTreeNormalizer.cc \ src/CSGTreeEvaluator.cc \ src/Geometry.cc \ src/Polygon2d.cc \ src/clipper-utils.cc \ src/polyset-utils.cc \ src/GeometryUtils.cc \ src/polyset.cc \ src/polyset-gl.cc \ src/csgops.cc \ src/transform.cc \ src/color.cc \ src/primitives.cc \ src/projection.cc \ src/cgaladv.cc \ src/surface.cc \ src/control.cc \ src/render.cc \ src/text.cc \ src/dxfdata.cc \ src/dxfdim.cc \ src/offset.cc \ src/linearextrude.cc \ src/rotateextrude.cc \ src/printutils.cc \ src/fileutils.cc \ src/progress.cc \ src/parsersettings.cc \ src/boost-utils.cc \ src/PlatformUtils.cc \ src/LibraryInfo.cc \ \ src/nodedumper.cc \ src/NodeVisitor.cc \ src/GeometryEvaluator.cc \ src/ModuleCache.cc \ src/GeometryCache.cc \ src/Tree.cc \ src/DrawingCallback.cc \ src/FreetypeRenderer.cc \ src/FontCache.cc \ \ src/settings.cc \ src/rendersettings.cc \ src/highlighter.cc \ src/Preferences.cc \ src/SettingsWriter.cc \ src/OpenCSGWarningDialog.cc \ src/editor.cc \ src/GLView.cc \ src/QGLView.cc \ src/AutoUpdater.cc \ \ src/hash.cc \ src/GroupModule.cc \ src/FileModule.cc \ src/StatCache.cc \ src/builtin.cc \ src/calc.cc \ src/export.cc \ src/export_stl.cc \ src/export_amf.cc \ src/export_3mf.cc \ src/export_off.cc \ src/export_dxf.cc \ src/export_svg.cc \ src/export_nef.cc \ src/export_png.cc \ src/import.cc \ src/import_stl.cc \ src/import_off.cc \ src/import_svg.cc \ src/import_amf.cc \ src/import_3mf.cc \ src/renderer.cc \ src/colormap.cc \ src/ThrownTogetherRenderer.cc \ src/svg.cc \ src/OffscreenView.cc \ src/fbo.cc \ src/system-gl.cc \ src/imageutils.cc \ \ src/version.cc \ src/openscad.cc \ src/mainwin.cc \ src/OpenSCADApp.cc \ src/WindowManager.cc \ src/UIUtils.cc \ src/Dock.cc \ src/Console.cc \ src/FontListDialog.cc \ src/FontListTableView.cc \ src/launchingscreen.cc \ src/legacyeditor.cc \ src/LibraryInfoDialog.cc\ \ src/comment.cpp \ \ src/parameter/ParameterWidget.cc\ src/parameter/parameterobject.cpp \ src/parameter/parameterextractor.cpp \ src/parameter/parameterspinbox.cpp \ src/parameter/parametercombobox.cpp \ src/parameter/parameterslider.cpp \ src/parameter/parametercheckbox.cpp \ src/parameter/parametertext.cpp \ src/parameter/parametervector.cpp \ src/parameter/groupwidget.cpp \ src/parameter/parameterset.cpp \ src/parameter/parametervirtualwidget.cpp \ src/parameter/ignoreWheelWhenNotFocused.cpp \ src/QWordSearchField.cc\ src/QSettingsCached.cc \ \ src/input/InputDriver.cc \ src/input/InputEventMapper.cc \ src/input/InputDriverManager.cc \ src/input/AxisConfigWidget.cc \ src/input/ButtonConfigWidget.cc \ src/input/WheelIgnorer.cc # CGAL HEADERS += src/ext/CGAL/convex_hull_3_bugfix.h \ src/ext/CGAL/OGL_helper.h \ src/ext/CGAL/CGAL_workaround_Mark_bounded_volumes.h \ src/ext/CGAL/CGAL_Nef3_workaround.h # LodePNG SOURCES += src/ext/lodepng/lodepng.cpp HEADERS += src/ext/lodepng/lodepng.h # ClipperLib SOURCES += src/ext/polyclipping/clipper.cpp HEADERS += src/ext/polyclipping/clipper.hpp # libtess2 INCLUDEPATH += src/ext/libtess2/Include SOURCES += src/ext/libtess2/Source/bucketalloc.c \ src/ext/libtess2/Source/dict.c \ src/ext/libtess2/Source/geom.c \ src/ext/libtess2/Source/mesh.c \ src/ext/libtess2/Source/priorityq.c \ src/ext/libtess2/Source/sweep.c \ src/ext/libtess2/Source/tess.c HEADERS += src/ext/libtess2/Include/tesselator.h \ src/ext/libtess2/Source/bucketalloc.h \ src/ext/libtess2/Source/dict.h \ src/ext/libtess2/Source/geom.h \ src/ext/libtess2/Source/mesh.h \ src/ext/libtess2/Source/priorityq.h \ src/ext/libtess2/Source/sweep.h \ src/ext/libtess2/Source/tess.h has_qt5 { HEADERS += src/Network.h src/NetworkSignal.h src/PrintService.h src/OctoPrint.h src/PrintInitDialog.h SOURCES += src/PrintService.cc src/OctoPrint.cc src/PrintInitDialog.cc } has_qt5:unix:!macx { QT += dbus DEFINES += ENABLE_DBUS DBUS_ADAPTORS += org.openscad.OpenSCAD.xml DBUS_INTERFACES += org.openscad.OpenSCAD.xml HEADERS += src/input/DBusInputDriver.h SOURCES += src/input/DBusInputDriver.cc } linux: { DEFINES += ENABLE_JOYSTICK HEADERS += src/input/JoystickInputDriver.h SOURCES += src/input/JoystickInputDriver.cc } !lessThan(QT_MAJOR_VERSION, 5) { qtHaveModule(gamepad) { QT += gamepad DEFINES += ENABLE_QGAMEPAD HEADERS += src/input/QGamepadInputDriver.h SOURCES += src/input/QGamepadInputDriver.cc } } unix:!macx { SOURCES += src/imageutils-lodepng.cc SOURCES += src/OffscreenContextGLX.cc } macx { SOURCES += src/imageutils-macosx.cc OBJECTIVE_SOURCES += src/OffscreenContextCGL.mm } win* { SOURCES += src/imageutils-lodepng.cc SOURCES += src/OffscreenContextWGL.cc } opencsg { HEADERS += src/OpenCSGRenderer.h SOURCES += src/OpenCSGRenderer.cc } cgal { HEADERS += src/cgal.h \ src/cgalfwd.h \ src/cgalutils.h \ src/Reindexer.h \ src/CGALCache.h \ src/CGALRenderer.h \ src/CGAL_Nef_polyhedron.h \ src/cgalworker.h \ src/Polygon2d-CGAL.h SOURCES += src/cgalutils.cc \ src/cgalutils-applyops.cc \ src/cgalutils-project.cc \ src/cgalutils-tess.cc \ src/cgalutils-polyhedron.cc \ src/CGALCache.cc \ src/CGALRenderer.cc \ src/CGAL_Nef_polyhedron.cc \ src/cgalworker.cc \ src/Polygon2d-CGAL.cc \ src/import_nef.cc } macx { HEADERS += src/AppleEvents.h \ src/EventFilter.h \ src/CocoaUtils.h SOURCES += src/AppleEvents.cc OBJECTIVE_SOURCES += src/CocoaUtils.mm \ src/PlatformUtils-mac.mm } unix:!macx { SOURCES += src/PlatformUtils-posix.cc } win* { HEADERS += src/findversion.h SOURCES += src/PlatformUtils-win.cc } isEmpty(PREFIX):PREFIX = /usr/local target.path = $$PREFIX/bin/ INSTALLS += target # Run translation update scripts as last step after linking the target QMAKE_POST_LINK += "$$PWD/scripts/translation-make.sh" # Create install targets for the languages defined in LINGUAS LINGUAS = $$cat(locale/LINGUAS) LOCALE_PREFIX = "$$PREFIX/share/$${FULLNAME}/locale" for(language, LINGUAS) { catalogdir = locale/$$language/LC_MESSAGES exists(locale/$${language}.po) { # Use .extra and copy manually as the source path might not exist, # e.g. on a clean checkout. In that case qmake would not create # the needed targets in the generated Makefile. translation_path = translation_$${language}.path translation_extra = translation_$${language}.extra translation_depends = translation_$${language}.depends $$translation_path = $$LOCALE_PREFIX/$$language/LC_MESSAGES/ $$translation_extra = cp -f $${catalogdir}/openscad.mo \"\$(INSTALL_ROOT)$$LOCALE_PREFIX/$$language/LC_MESSAGES/openscad.mo\" $$translation_depends = locale/$${language}.po INSTALLS += translation_$$language } } examples.path = "$$PREFIX/share/$${FULLNAME}/examples/" examples.files = examples/* INSTALLS += examples libraries.path = "$$PREFIX/share/$${FULLNAME}/libraries/" libraries.files = libraries/* INSTALLS += libraries fonts.path = "$$PREFIX/share/$${FULLNAME}/fonts/" fonts.files = fonts/* INSTALLS += fonts colorschemes.path = "$$PREFIX/share/$${FULLNAME}/color-schemes/" colorschemes.files = color-schemes/* INSTALLS += colorschemes applications.path = $$PREFIX/share/applications applications.extra = mkdir -p \"\$(INSTALL_ROOT)$${applications.path}\" && cat icons/openscad.desktop | sed -e \"'s/^Icon=openscad/Icon=$${FULLNAME}/; s/^Exec=openscad/Exec=$${FULLNAME}/'\" > \"\$(INSTALL_ROOT)$${applications.path}/$${FULLNAME}.desktop\" INSTALLS += applications mimexml.path = $$PREFIX/share/mime/packages mimexml.extra = cp -f icons/openscad.xml \"\$(INSTALL_ROOT)$${mimexml.path}/$${FULLNAME}.xml\" INSTALLS += mimexml appdata.path = $$PREFIX/share/metainfo appdata.extra = mkdir -p \"\$(INSTALL_ROOT)$${appdata.path}\" && cat openscad.appdata.xml | sed -e \"'s/$${APPLICATIONID}/$${APPLICATIONID}$${SUFFIX}/; s/openscad.desktop/openscad$${SUFFIX}.desktop/; s/openscad.png/openscad$${SUFFIX}.png/'\" > \"\$(INSTALL_ROOT)$${appdata.path}/$${APPLICATIONID}$${SUFFIX}.appdata.xml\" INSTALLS += appdata icons.path = $$PREFIX/share/pixmaps icons.extra = test -f icons/$${FULLNAME}.png && cp -f icons/$${FULLNAME}.png \"\$(INSTALL_ROOT)$${icons.path}/\" || cp -f icons/openscad.png \"\$(INSTALL_ROOT)$${icons.path}/$${FULLNAME}.png\" INSTALLS += icons man.path = $$PREFIX/share/man/man1 man.extra = cp -f doc/openscad.1 \"\$(INSTALL_ROOT)$${man.path}/$${FULLNAME}.1\" INSTALLS += man info: { include(info.pri) } DISTFILES += \ sounds/complete.wav openscad-2019.05/openscad.qrc0000644000076500000240000001022313424335753016411 0ustar kintelstaff00000000000000 icons/prefs3DPrint.png src/PrintInitDialog.html src/OctoPrintInfo.html icons/prefsInput.png icons/prefsInputAxis.png icons/prefsInputButtons.png images/zoom-text-in-white.png images/zoom-text-in.png images/zoom-text-out-white.png images/zoom-text-out.png images/Command-Redo-32-white.png images/Command-Reset-32-white.png images/Command-Undo-32-white.png images/Decrease-Indent-32-white.png images/Increase-Indent-32-white.png images/Command-Redo-32.png images/Command-Reset-32.png images/Command-Undo-32.png images/Decrease-Indent-32.png images/Increase-Indent-32.png icons/close.png icons/information-icons-error.png icons/information-icons-info.png icons/information-icons-question.png icons/information-icons-warning.png icons/openscad.png icons/openscad-nightly.png icons/button.png icons/background-welcome-screen.svg icons/prefsFeatures.png icons/stopbutton.png icons/prefsAdvanced.png icons/prefs3DView.png icons/prefsEditor.png icons/prefsUpdate.png src/AboutDialog.html images/export.png images/axes.png images/export-white.png images/back.png images/Document-New-128.png images/front.png images/grid.png images/Open-128.png images/openscad.png images/right.png images/Save-128.png images/up.png images/bottom.png images/left.png images/blackUp.png images/blackNew.png images/Rotation-32.png images/Shape-Cube-32.png images/Open-32.png images/Save-32.png images/blackbottom.png images/rightright.png images/blackleft.png images/blackfront.png images/blackback.png images/blackaxes.png images/zoomin.png images/zoomout.png images/wireframe1.png images/surface.png images/Zoom-In-32.png images/Zoom-Out-32.png images/zoom-all.png images/zoom-all-white.png images/surfaceWhite.png images/wireframeWhite.png images/orthogonal.png images/cross.png images/perspective1.png images/preview-32.png images/preview-32-white.png images/render-32.png images/render-32-white.png images/3dprint-32.png images/3dprint-32-white.png images/animate.png images/orthogonalwhite.png images/perspective1white.png images/crosswhite.png icons/background.png images/scalemarkers.png images/scalemarkers-white.png images/AMF.png images/AMF-white.png images/3MF.png images/3MF-white.png images/CSG.png images/CSG-white.png images/DXF.png images/DXF-white.png images/OFF.png images/OFF-white.png images/PNG.png images/PNG-white.png images/STL.png images/STL-white.png images/SVG.png images/SVG-white.png sounds/complete.wav openscad-2019.05/openscad_win32.rc0000644000076500000240000000164313402025764017252 0ustar kintelstaff00000000000000# if defined(UNDER_CE) # include # else # include # endif #include "winuser.h" 1 RT_MANIFEST "scripts/winmanifest.xml" VS_VERSION_INFO VERSIONINFO FILEVERSION 0,0,0,0 PRODUCTVERSION 0,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "0409" BEGIN VALUE "CompanyName", "\0" VALUE "FileDescription", "OpenSCAD Executable\0" VALUE "FileVersion", "development build\0" VALUE "LegalCopyright", "Copyright (C) 2009-2011 Clifford Wolf and Marius Kintel\0" VALUE "OriginalFilename", "openscad.exe\0" VALUE "ProductName", "OpenSCAD\0" END END END /* End of Version info */ IDI_ICON1 ICON DISCARDABLE "icons/openscad.ico" IDI_ICON2 ICON DISCARDABLE "icons/openscad_doc.ico" openscad-2019.05/org.openscad.OpenSCAD.xml0000644000076500000240000000457513402025764020554 0ustar kintelstaff00000000000000 The vector [x,y,z] describes the rotation. The direction of the vector is the angle around which to rotate, and the length of the vector is the angle by which to rotate. openscad-2019.05/patches/CGAL-OGL_helper-colors.patch0000644000076500000240000000516713402025764022546 0ustar kintelstaff00000000000000--- OGL_helper.h 2011-09-29 23:02:04.000000000 +0200 +++ ../src/OGL_helper.h 2011-09-29 23:01:27.000000000 +0200 @@ -263,7 +263,7 @@ enum { SNC_BOUNDARY, SNC_SKELETON }; class Polyhedron : public OGL_base_object { - + protected: std::list vertices_; std::list edges_; std::list halffacets_; @@ -356,11 +356,17 @@ Bbox_3 bbox() const { return bbox_; } Bbox_3& bbox() { return bbox_; } + virtual CGAL::Color getVertexColor(Vertex_iterator v) const + { + CGAL::Color cf(CGAL_NEF3_MARKED_VERTEX_COLOR), + ct(CGAL_NEF3_UNMARKED_VERTEX_COLOR); // more blue-ish + CGAL::Color c = v->mark() ? ct : cf; + return c; + } + void draw(Vertex_iterator v) const { // CGAL_NEF_TRACEN("drawing vertex "<<*v); - CGAL::Color cf(CGAL_NEF3_MARKED_VERTEX_COLOR), - ct(CGAL_NEF3_UNMARKED_VERTEX_COLOR); // more blue-ish - CGAL::Color c = v->mark() ? ct : cf; + CGAL::Color c = getVertexColor(v); glPointSize(10); glColor3ub(c.red(), c.green(), c.blue()); glBegin(GL_POINTS); @@ -372,12 +378,18 @@ glEnd(); } + virtual CGAL::Color getEdgeColor(Edge_iterator e) const + { + CGAL::Color cf(CGAL_NEF3_MARKED_EDGE_COLOR), + ct(CGAL_NEF3_UNMARKED_EDGE_COLOR); // more blue-ish + CGAL::Color c = e->mark() ? ct : cf; + return c; + } + void draw(Edge_iterator e) const { // CGAL_NEF_TRACEN("drawing edge "<<*e); Double_point p = e->source(), q = e->target(); - CGAL::Color cf(CGAL_NEF3_MARKED_EDGE_COLOR), - ct(CGAL_NEF3_UNMARKED_EDGE_COLOR); // more blue-ish - CGAL::Color c = e->mark() ? ct : cf; + CGAL::Color c = getEdgeColor(e); glLineWidth(5); glColor3ub(c.red(),c.green(),c.blue()); glBegin(GL_LINE_STRIP); @@ -386,6 +398,14 @@ glEnd(); } + virtual CGAL::Color getFacetColor(Halffacet_iterator f) const + { + CGAL::Color cf(CGAL_NEF3_MARKED_FACET_COLOR), + ct(CGAL_NEF3_UNMARKED_FACET_COLOR); // more blue-ish + CGAL::Color c = (f->mark() ? ct : cf); + return c; + } + void draw(Halffacet_iterator f) const { // CGAL_NEF_TRACEN("drawing facet "<<(f->debug(),"")); GLUtesselator* tess_ = gluNewTess(); @@ -403,9 +423,7 @@ GLU_TESS_WINDING_POSITIVE); DFacet::Coord_const_iterator cit; - CGAL::Color cf(CGAL_NEF3_MARKED_FACET_COLOR), - ct(CGAL_NEF3_UNMARKED_FACET_COLOR); // more blue-ish - CGAL::Color c = (f->mark() ? ct : cf); + CGAL::Color c = getFacetColor(f); glColor3ub(c.red(),c.green(),c.blue()); gluTessBeginPolygon(tess_,f->normal()); // CGAL_NEF_TRACEN(" "); openscad-2019.05/patches/CGAL-OGL_helper-tesscombine.patch0000644000076500000240000000276213402025764023556 0ustar kintelstaff00000000000000--- ../../libraries/install/include/CGAL/Nef_3/OGL_helper.h 2010-06-09 21:00:52.000000000 +0200 +++ OGL_helper.h 2011-09-29 23:09:47.000000000 +0200 @@ -243,6 +243,22 @@ glVertex3dv(pc); } + inline void CGAL_GLU_TESS_CALLBACK combineCallback(GLdouble coords[3], GLvoid *[4], GLfloat [4], GLvoid **dataOut) + { static std::list pcache; + if (dataOut) { + GLdouble *n = new GLdouble[3]; + n[0] = coords[0]; + n[1] = coords[1]; + n[2] = coords[2]; + pcache.push_back(n); + *dataOut = n; + } else { + for (std::list::const_iterator i = pcache.begin(); i != pcache.end(); i++) + delete[] *i; + pcache.clear(); + } + } + enum { SNC_AXES}; enum { SNC_BOUNDARY, SNC_SKELETON }; @@ -376,6 +392,8 @@ GLUtesselator* tess_ = gluNewTess(); gluTessCallback(tess_, GLenum(GLU_TESS_VERTEX_DATA), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &vertexCallback); + gluTessCallback(tess_, GLenum(GLU_TESS_COMBINE), + (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &combineCallback); gluTessCallback(tess_, GLenum(GLU_TESS_BEGIN), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &beginCallback); gluTessCallback(tess_, GLenum(GLU_TESS_END), @@ -410,6 +429,7 @@ gluTessEndPolygon(tess_); // CGAL_NEF_TRACEN("End Polygon"); gluDeleteTess(tess_); + combineCallback(NULL, NULL, NULL, NULL); } void construct_axes() const openscad-2019.05/patches/CGAL-Valgrind-Enable-Hack.patch0000644000076500000240000000136513402025764023061 0ustar kintelstaff00000000000000--- CGAL-3.4/include/CGAL/Interval_nt.h +++ CGAL-3.4/include/CGAL/Interval_nt.h @@ -149,11 +149,13 @@ // The macros CGAL_IA_MUL and CGAL_IA_DIV stop constant propagation only // on the second argument, so if -fno-rounding-math, the compiler optimizes // the 2 negations and we get wrong rounding. +#if 0 typename Interval_nt<>::Internal_protector P; CGAL_assertion_msg(-CGAL_IA_MUL(-1.1, 10.1) != CGAL_IA_MUL(1.1, 10.1), "Wrong rounding: did you forget the -frounding-math option if you use GCC?"); CGAL_assertion_msg(-CGAL_IA_DIV(-1, 10) != CGAL_IA_DIV(1, 10), "Wrong rounding: did you forget the -frounding-math option if you use GCC?"); +#endif } }; openscad-2019.05/patches/OpenCSG-1.1.1-MacOSX-port.patch0000644000076500000240000002162013402025764022517 0ustar kintelstaff00000000000000diff -ru OpenCSG-1.1.1/RenderTexture/RenderTexture.h OpenCSG-1.1.1-mac/RenderTexture/RenderTexture.h --- OpenCSG-1.1.1/RenderTexture/RenderTexture.h 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/RenderTexture/RenderTexture.h 2009-12-09 03:15:26.000000000 +0100 @@ -294,8 +294,8 @@ bool _BindDepthBuffer( ) const; protected: // data - int _iWidth; // width of the pbuffer - int _iHeight; // height of the pbuffer + GLint _iWidth; // width of the pbuffer + GLint _iHeight; // height of the pbuffer bool _bIsTexture; bool _bIsDepthTexture; @@ -342,8 +342,8 @@ // Texture stuff GLenum _iTextureTarget; - unsigned int _iTextureID; - unsigned int _iDepthTextureID; + GLuint _iTextureID; + GLuint _iDepthTextureID; unsigned short* _pPoorDepthTexture; // [Redge] diff -ru OpenCSG-1.1.1/example/example.pro OpenCSG-1.1.1-mac/example/example.pro --- OpenCSG-1.1.1/example/example.pro 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/example/example.pro 2009-12-09 03:15:26.000000000 +0100 @@ -2,9 +2,16 @@ TARGET = opencsgexample CONFIG += opengl warn_on release -INCLUDEPATH += ../glew/include ../include - -LIBS += -L../lib -lopencsg -lglut -L../glew/lib -lGLEW +INCLUDEPATH += ../include +LIBS += -L../lib -lopencsg -lGLEW +macx { + INCLUDEPATH += /opt/local/include + LIBS += -framework GLUT -L/opt/local/lib +} +else { + INCLUDEPATH += ../glew/include + LIBS += -lglut -L../glew/lib +} HEADERS = displaylistPrimitive.h SOURCES = displaylistPrimitive.cpp main.cpp diff -ru OpenCSG-1.1.1/example/main.cpp OpenCSG-1.1.1-mac/example/main.cpp --- OpenCSG-1.1.1/example/main.cpp 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/example/main.cpp 2009-12-09 03:15:26.000000000 +0100 @@ -22,7 +22,11 @@ // #include +#ifdef __APPLE__ +#include +#else #include +#endif #include #include "displaylistPrimitive.h" #include diff -ru OpenCSG-1.1.1/opencsg.pro OpenCSG-1.1.1-mac/opencsg.pro --- OpenCSG-1.1.1/opencsg.pro 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/opencsg.pro 2009-12-09 03:15:26.000000000 +0100 @@ -1,2 +1,4 @@ TEMPLATE = subdirs SUBDIRS = src example +# On Mac we get glew from MacPorts +!macx:SUBDIRS += glew diff -ru OpenCSG-1.1.1/src/channelManager.cpp OpenCSG-1.1.1-mac/src/channelManager.cpp --- OpenCSG-1.1.1/src/channelManager.cpp 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/channelManager.cpp 2009-12-09 03:15:26.000000000 +0100 @@ -23,7 +23,7 @@ #include #ifdef _WIN32 #include -#else +#elif !defined(__APPLE__) #include #endif @@ -160,9 +160,11 @@ #ifdef WIN32 if ( WGLEW_ARB_pbuffer && WGLEW_ARB_pixel_format -#else +#elif !defined(__APPLE__) if ( GLXEW_SGIX_pbuffer && GLXEW_SGIX_fbconfig +#else + if ( false #endif ) { newOffscreenType = OpenCSG::PBuffer; diff -ru OpenCSG-1.1.1/src/frameBufferObject.h OpenCSG-1.1.1-mac/src/frameBufferObject.h --- OpenCSG-1.1.1/src/frameBufferObject.h 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/frameBufferObject.h 2009-12-09 03:15:26.000000000 +0100 @@ -77,10 +77,10 @@ /// Texture stuff GLenum textureTarget; - unsigned int textureID; - unsigned int depthID; + GLuint textureID; + GLuint depthID; - unsigned int framebufferID; + GLuint framebufferID; bool initialized; }; diff -ru OpenCSG-1.1.1/src/occlusionQuery.cpp OpenCSG-1.1.1-mac/src/occlusionQuery.cpp --- OpenCSG-1.1.1/src/occlusionQuery.cpp 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/occlusionQuery.cpp 2009-12-09 03:15:26.000000000 +0100 @@ -57,7 +57,7 @@ } unsigned int OcclusionQueryARB::getQueryResult() { - unsigned int fragmentCount; + GLuint fragmentCount; glGetQueryObjectuivARB(mQueryObject, GL_QUERY_RESULT_ARB, &fragmentCount); return fragmentCount; } @@ -94,7 +94,7 @@ } unsigned int OcclusionQueryNV::getQueryResult() { - unsigned int fragmentCount; + GLuint fragmentCount; glGetOcclusionQueryuivNV(mQueryObject, GL_PIXEL_COUNT_NV, &fragmentCount); return fragmentCount; } diff -ru OpenCSG-1.1.1/src/openglHelper.cpp OpenCSG-1.1.1-mac/src/openglHelper.cpp --- OpenCSG-1.1.1/src/openglHelper.cpp 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/openglHelper.cpp 2009-12-09 03:15:26.000000000 +0100 @@ -29,13 +29,13 @@ GLfloat projection[16]; GLfloat modelview[16]; - int canvasPos[4]; + GLint canvasPos[4]; - int stencilBits = 0; + GLint stencilBits = 0; int stencilMax = 0; int stencilMask = 0; - int scissorPos[4]; + GLint scissorPos[4]; void scissor(const PCArea& area) { const int dx = area.maxx - area.minx; diff -ru OpenCSG-1.1.1/src/openglHelper.h OpenCSG-1.1.1-mac/src/openglHelper.h --- OpenCSG-1.1.1/src/openglHelper.h 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/openglHelper.h 2009-12-09 03:15:26.000000000 +0100 @@ -36,17 +36,17 @@ // copy of the projection matrix during CSG computation extern GLfloat modelview[16]; // copy of the modelview matrix during CSG computation - extern int canvasPos[4]; + extern GLint canvasPos[4]; // copy of the viewport size during CSG computation - extern int stencilBits; + extern GLint stencilBits; // number of stencil bits in the pbuffer extern int stencilMax; // the number where the stencil value would "wrap around" to zero extern int stencilMask; // stencilMax - 1 - extern int scissorPos[4]; + extern GLint scissorPos[4]; // copy of the scissor settings for CSG computation void scissor(const PCArea& area); diff -ru OpenCSG-1.1.1/src/pBufferTexture.h OpenCSG-1.1.1-mac/src/pBufferTexture.h --- OpenCSG-1.1.1/src/pBufferTexture.h 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/pBufferTexture.h 2009-12-09 03:15:34.000000000 +0100 @@ -22,7 +22,7 @@ #ifndef __OpenCSG__pbuffer_texture_h__ #define __OpenCSG__pbuffer_texture_h__ - +#ifndef __APPLE__ #include "opencsgConfig.h" #include "offscreenBuffer.h" @@ -81,5 +81,26 @@ } // namespace OpenGL } // namespace OpenCSG +#else + +namespace OpenCSG { + namespace OpenGL { + class PBufferTexture : public OffscreenBuffer { + virtual bool Initialize(int , int , bool , bool ) {return false;} + virtual bool Reset() {return false;} + virtual bool Resize(int, int) {return false;} + virtual bool BeginCapture() {return false;} + virtual bool EndCapture() {return false;} + virtual void Bind() const {} + virtual void EnableTextureTarget() const {} + virtual void DisableTextureTarget() const {} + virtual unsigned int GetTextureTarget() const {return 0;} + virtual int GetWidth() const {return 0;} + virtual int GetHeight() const {return 0;} + virtual bool haveSeparateContext() const {return false;} + }; + } +} +#endif // __APPLE__ #endif // __OpenCSG__frame_buffer_object_h__ Only in OpenCSG-1.1.1-mac/src: pBufferTexture.h~ diff -ru OpenCSG-1.1.1/src/src.pro OpenCSG-1.1.1-mac/src/src.pro --- OpenCSG-1.1.1/src/src.pro 2009-07-19 21:05:09.000000000 +0200 +++ OpenCSG-1.1.1-mac/src/src.pro 2009-12-09 03:15:26.000000000 +0100 @@ -4,7 +4,15 @@ DESTDIR = ../lib CONFIG += opengl warn_on release -INCLUDEPATH += ../include ../glew/include ../ +INCLUDEPATH += ../include ../ + +macx { + INCLUDEPATH += /opt/local/include + LIBS += -L/opt/local/lib -lglew +} +else { +INCLUDEPATH += ../glew/include +} HEADERS = ../include/opencsg.h \ opencsgConfig.h \ @@ -16,12 +24,11 @@ offscreenBuffer.h \ opencsgRender.h \ openglHelper.h \ - pBufferTexture.h \ primitiveHelper.h \ scissorMemo.h \ settings.h \ - stencilManager.h \ - ../RenderTexture/RenderTexture.h + stencilManager.h + SOURCES = area.cpp \ batch.cpp \ channelManager.cpp \ @@ -30,12 +37,19 @@ offscreenBuffer.cpp \ opencsgRender.cpp \ openglHelper.cpp \ - pBufferTexture.cpp \ primitive.cpp \ primitiveHelper.cpp \ renderGoldfeather.cpp \ renderSCS.cpp \ scissorMemo.cpp \ settings.cpp \ - stencilManager.cpp \ - ../RenderTexture/RenderTexture.cpp + stencilManager.cpp + +!macx { + HEADERS += ../RenderTexture/RenderTexture.h \ + pBufferTexture.h + + SOURCES += ../RenderTexture/RenderTexture.cpp \ + pBufferTexture.cpp +} + openscad-2019.05/patches/OpenCSG-1.2.0-MacOSX-port.patch0000644000076500000240000002224613402025764022524 0ustar kintelstaff00000000000000diff -ru OpenCSG-1.2.0/RenderTexture/RenderTexture.h OpenCSG-1.2.0-mac/RenderTexture/RenderTexture.h --- OpenCSG-1.2.0/RenderTexture/RenderTexture.h 2010-01-02 20:56:12.000000000 +0100 +++ OpenCSG-1.2.0-mac/RenderTexture/RenderTexture.h 2010-01-24 23:30:24.000000000 +0100 @@ -294,8 +294,8 @@ bool _BindDepthBuffer( ) const; protected: // data - int _iWidth; // width of the pbuffer - int _iHeight; // height of the pbuffer + GLint _iWidth; // width of the pbuffer + GLint _iHeight; // height of the pbuffer bool _bIsTexture; bool _bIsDepthTexture; @@ -342,8 +342,8 @@ // Texture stuff GLenum _iTextureTarget; - unsigned int _iTextureID; - unsigned int _iDepthTextureID; + GLuint _iTextureID; + GLuint _iDepthTextureID; unsigned short* _pPoorDepthTexture; // [Redge] diff -ru OpenCSG-1.2.0/example/example.pro OpenCSG-1.2.0-mac/example/example.pro --- OpenCSG-1.2.0/example/example.pro 2010-01-02 20:56:12.000000000 +0100 +++ OpenCSG-1.2.0-mac/example/example.pro 2010-01-24 23:30:24.000000000 +0100 @@ -2,9 +2,16 @@ TARGET = opencsgexample CONFIG += opengl warn_on release -INCLUDEPATH += ../glew/include ../include - -LIBS += -L../lib -lopencsg -lglut -L../glew/lib -lGLEW +INCLUDEPATH += ../include +LIBS += -L../lib -lopencsg -lGLEW +macx { + INCLUDEPATH += /opt/local/include + LIBS += -framework GLUT -L/opt/local/lib +} +else { + INCLUDEPATH += ../glew/include + LIBS += -lglut -L../glew/lib +} HEADERS = displaylistPrimitive.h SOURCES = displaylistPrimitive.cpp main.cpp diff -ru OpenCSG-1.2.0/example/main.cpp OpenCSG-1.2.0-mac/example/main.cpp --- OpenCSG-1.2.0/example/main.cpp 2010-01-02 21:03:19.000000000 +0100 +++ OpenCSG-1.2.0-mac/example/main.cpp 2010-01-24 23:30:24.000000000 +0100 @@ -22,7 +22,11 @@ // #include +#ifdef __APPLE__ +#include +#else #include +#endif #include #include "displaylistPrimitive.h" #include diff -ru OpenCSG-1.2.0/opencsg.pro OpenCSG-1.2.0-mac/opencsg.pro --- OpenCSG-1.2.0/opencsg.pro 2010-01-02 20:56:12.000000000 +0100 +++ OpenCSG-1.2.0-mac/opencsg.pro 2010-01-24 23:30:24.000000000 +0100 @@ -1,2 +1,4 @@ TEMPLATE = subdirs SUBDIRS = src example +# On Mac we get glew from MacPorts +!macx:SUBDIRS += glew diff -ru OpenCSG-1.2.0/src/channelManager.cpp OpenCSG-1.2.0-mac/src/channelManager.cpp --- OpenCSG-1.2.0/src/channelManager.cpp 2010-01-02 21:03:04.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/channelManager.cpp 2010-01-24 23:30:24.000000000 +0100 @@ -23,7 +23,7 @@ #include #ifdef _WIN32 #include -#else +#elif !defined(__APPLE__) #include #endif @@ -170,9 +170,11 @@ #ifdef WIN32 if ( WGLEW_ARB_pbuffer && WGLEW_ARB_pixel_format -#else +#elif !defined(__APPLE__) if ( GLXEW_SGIX_pbuffer && GLXEW_SGIX_fbconfig +#else + if ( false #endif ) { newOffscreenType = OpenCSG::PBuffer; Only in OpenCSG-1.2.0-mac/src: channelManager.cpp.orig diff -ru OpenCSG-1.2.0/src/frameBufferObject.h OpenCSG-1.2.0-mac/src/frameBufferObject.h --- OpenCSG-1.2.0/src/frameBufferObject.h 2010-01-02 21:03:01.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/frameBufferObject.h 2010-01-24 23:30:24.000000000 +0100 @@ -77,10 +77,10 @@ /// Texture stuff GLenum textureTarget; - unsigned int textureID; - unsigned int depthID; + GLuint textureID; + GLuint depthID; - unsigned int framebufferID; + GLuint framebufferID; bool initialized; }; Only in OpenCSG-1.2.0-mac/src: frameBufferObject.h.orig diff -ru OpenCSG-1.2.0/src/occlusionQuery.cpp OpenCSG-1.2.0-mac/src/occlusionQuery.cpp --- OpenCSG-1.2.0/src/occlusionQuery.cpp 2010-01-02 21:03:04.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/occlusionQuery.cpp 2010-01-24 23:30:24.000000000 +0100 @@ -57,7 +57,7 @@ } unsigned int OcclusionQueryARB::getQueryResult() { - unsigned int fragmentCount; + GLuint fragmentCount; glGetQueryObjectuivARB(mQueryObject, GL_QUERY_RESULT_ARB, &fragmentCount); return fragmentCount; } @@ -94,7 +94,7 @@ } unsigned int OcclusionQueryNV::getQueryResult() { - unsigned int fragmentCount; + GLuint fragmentCount; glGetOcclusionQueryuivNV(mQueryObject, GL_PIXEL_COUNT_NV, &fragmentCount); return fragmentCount; } diff -ru OpenCSG-1.2.0/src/openglHelper.cpp OpenCSG-1.2.0-mac/src/openglHelper.cpp --- OpenCSG-1.2.0/src/openglHelper.cpp 2010-01-02 21:03:04.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/openglHelper.cpp 2010-01-24 23:30:24.000000000 +0100 @@ -29,13 +29,13 @@ GLfloat projection[16]; GLfloat modelview[16]; - int canvasPos[4]; + GLint canvasPos[4]; - int stencilBits = 0; + GLint stencilBits = 0; int stencilMax = 0; int stencilMask = 0; - int scissorPos[4]; + GLint scissorPos[4]; void scissor(const PCArea& area) { const int dx = area.maxx - area.minx; diff -ru OpenCSG-1.2.0/src/openglHelper.h OpenCSG-1.2.0-mac/src/openglHelper.h --- OpenCSG-1.2.0/src/openglHelper.h 2010-01-02 21:03:01.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/openglHelper.h 2010-01-24 23:30:24.000000000 +0100 @@ -36,17 +36,17 @@ // copy of the projection matrix during CSG computation extern GLfloat modelview[16]; // copy of the modelview matrix during CSG computation - extern int canvasPos[4]; + extern GLint canvasPos[4]; // copy of the viewport size during CSG computation - extern int stencilBits; + extern GLint stencilBits; // number of stencil bits in the pbuffer extern int stencilMax; // the number where the stencil value would "wrap around" to zero extern int stencilMask; // stencilMax - 1 - extern int scissorPos[4]; + extern GLint scissorPos[4]; // copy of the scissor settings for CSG computation void scissor(const PCArea& area); diff -ru OpenCSG-1.2.0/src/pBufferTexture.h OpenCSG-1.2.0-mac/src/pBufferTexture.h --- OpenCSG-1.2.0/src/pBufferTexture.h 2010-01-02 21:03:01.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/pBufferTexture.h 2010-01-24 23:30:24.000000000 +0100 @@ -22,7 +22,7 @@ #ifndef __OpenCSG__pbuffer_texture_h__ #define __OpenCSG__pbuffer_texture_h__ - +#ifndef __APPLE__ #include "opencsgConfig.h" #include "offscreenBuffer.h" @@ -81,5 +81,26 @@ } // namespace OpenGL } // namespace OpenCSG +#else + +namespace OpenCSG { + namespace OpenGL { + class PBufferTexture : public OffscreenBuffer { + virtual bool Initialize(int , int , bool , bool ) {return false;} + virtual bool Reset() {return false;} + virtual bool Resize(int, int) {return false;} + virtual bool BeginCapture() {return false;} + virtual bool EndCapture() {return false;} + virtual void Bind() const {} + virtual void EnableTextureTarget() const {} + virtual void DisableTextureTarget() const {} + virtual unsigned int GetTextureTarget() const {return 0;} + virtual int GetWidth() const {return 0;} + virtual int GetHeight() const {return 0;} + virtual bool haveSeparateContext() const {return false;} + }; + } +} +#endif // __APPLE__ #endif // __OpenCSG__frame_buffer_object_h__ diff -ru OpenCSG-1.2.0/src/src.pro OpenCSG-1.2.0-mac/src/src.pro --- OpenCSG-1.2.0/src/src.pro 2010-01-02 20:56:12.000000000 +0100 +++ OpenCSG-1.2.0-mac/src/src.pro 2010-01-24 23:31:57.000000000 +0100 @@ -1,10 +1,19 @@ TEMPLATE = lib TARGET = opencsg VERSION = 1.2.0 -DESTDIR = ../lib +DESTDIR = $$(PWD)/lib CONFIG += opengl warn_on release -INCLUDEPATH += ../include ../glew/include ../ +INCLUDEPATH += ../include ../ + +macx { + INCLUDEPATH += /opt/local/include + LIBS += -L/opt/local/lib -lglew + CONFIG += absolute_library_soname +} +else { +INCLUDEPATH += ../glew/include +} HEADERS = ../include/opencsg.h \ opencsgConfig.h \ @@ -17,12 +26,11 @@ offscreenBuffer.h \ opencsgRender.h \ openglHelper.h \ - pBufferTexture.h \ primitiveHelper.h \ scissorMemo.h \ settings.h \ - stencilManager.h \ - ../RenderTexture/RenderTexture.h + stencilManager.h + SOURCES = area.cpp \ batch.cpp \ channelManager.cpp \ @@ -32,12 +40,21 @@ offscreenBuffer.cpp \ opencsgRender.cpp \ openglHelper.cpp \ - pBufferTexture.cpp \ primitive.cpp \ primitiveHelper.cpp \ renderGoldfeather.cpp \ renderSCS.cpp \ scissorMemo.cpp \ settings.cpp \ - stencilManager.cpp \ - ../RenderTexture/RenderTexture.cpp + stencilManager.cpp + +!macx { + HEADERS += ../RenderTexture/RenderTexture.h \ + pBufferTexture.h + + SOURCES += ../RenderTexture/RenderTexture.cpp \ + pBufferTexture.cpp +} + +INSTALLS += target +target.path = $$DESTDIR Only in OpenCSG-1.2.0-mac/src: src.pro.orig openscad-2019.05/patches/OpenCSG-1.3.0-FBO.patch0000644000076500000240000000643413402025764021060 0ustar kintelstaff00000000000000diff -ru OpenCSG-1.3.0/src/frameBufferObject.cpp OpenCSG-1.3.0-fbofix/src/frameBufferObject.cpp --- OpenCSG-1.3.0/src/frameBufferObject.cpp 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-fbofix/src/frameBufferObject.cpp 2011-08-02 01:33:31.000000000 +0200 @@ -57,6 +57,7 @@ glGenRenderbuffers(1, &depthID); glGenTextures(1, &textureID); + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFramebufferID); glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, 0); @@ -76,7 +77,7 @@ return false; } - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, oldFramebufferID); glBindTexture(GL_TEXTURE_2D, 0); textureTarget = GL_TEXTURE_2D; @@ -133,7 +134,7 @@ // Unbinds frame buffer texture. bool FrameBufferObject::EndCapture() { - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, oldFramebufferID); return true; } diff -ru OpenCSG-1.3.0/src/frameBufferObject.h OpenCSG-1.3.0-fbofix/src/frameBufferObject.h --- OpenCSG-1.3.0/src/frameBufferObject.h 2011-08-02 17:30:01.000000000 +0200 +++ OpenCSG-1.3.0-fbofix/src/frameBufferObject.h 2011-08-02 01:32:58.000000000 +0200 @@ -83,6 +83,7 @@ unsigned int depthID; unsigned int framebufferID; + int oldFramebufferID; bool initialized; }; diff -ru OpenCSG-1.3.0/src/frameBufferObjectExt.cpp OpenCSG-1.3.0-fbofix/src/frameBufferObjectExt.cpp --- OpenCSG-1.3.0/src/frameBufferObjectExt.cpp 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-fbofix/src/frameBufferObjectExt.cpp 2011-08-02 01:33:46.000000000 +0200 @@ -58,6 +58,7 @@ glGenRenderbuffersEXT(1, &depthID); glGenTextures(1, &textureID); + glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &oldFramebufferID); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, 0); @@ -77,7 +78,7 @@ return false; } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, oldFramebufferID); glBindTexture(GL_TEXTURE_2D, 0); textureTarget = GL_TEXTURE_2D; @@ -134,7 +135,7 @@ // Unbinds frame buffer texture. bool FrameBufferObjectExt::EndCapture() { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, oldFramebufferID); return true; } diff -ru OpenCSG-1.3.0/src/frameBufferObjectExt.h OpenCSG-1.3.0-fbofix/src/frameBufferObjectExt.h --- OpenCSG-1.3.0/src/frameBufferObjectExt.h 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-fbofix/src/frameBufferObjectExt.h 2011-08-02 01:33:08.000000000 +0200 @@ -83,6 +83,7 @@ unsigned int depthID; unsigned int framebufferID; + int oldFramebufferID; bool initialized; }; openscad-2019.05/patches/OpenCSG-1.3.0-MacOSX-port.patch0000644000076500000240000013630013402025764022522 0ustar kintelstaff00000000000000diff -ru OpenCSG-1.3.0/Makefile OpenCSG-1.3.0-mac/Makefile --- OpenCSG-1.3.0/Makefile 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/Makefile 2010-05-09 02:50:55.000000000 +0200 @@ -1,10 +1,130 @@ -SUBDIRS = glew src example +############################################################################# +# Makefile for building: opencsg +# Generated by qmake (2.01a) (Qt 4.6.2) on: Sun May 9 02:45:47 2010 +# Project: opencsg.pro +# Template: subdirs +# Command: /usr/bin/qmake -macx CONFIG+=x86\ x86_64 -o Makefile opencsg.pro +############################################################################# -all: - for X in $(SUBDIRS); do make -C $$X ; done +first: make_default +MAKEFILE = Makefile +QMAKE = /usr/bin/qmake +DEL_FILE = rm -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = $(COPY_FILE) +INSTALL_PROGRAM = $(COPY_FILE) +INSTALL_DIR = $(COPY_DIR) +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +SUBTARGETS = \ + sub-src -clean: - for X in $(SUBDIRS); do make -C $$X clean; done +src/$(MAKEFILE): + @$(CHK_DIR_EXISTS) src/ || $(MKDIR) src/ + cd src/ && $(QMAKE) /Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/src/OpenCSG-1.3.0-patched/src/src.pro -macx CONFIG+=x86\ x86_64 -o $(MAKEFILE) +sub-src-qmake_all: FORCE + @$(CHK_DIR_EXISTS) src/ || $(MKDIR) src/ + cd src/ && $(QMAKE) /Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/src/OpenCSG-1.3.0-patched/src/src.pro -macx CONFIG+=x86\ x86_64 -o $(MAKEFILE) +sub-src: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) +sub-src-make_default: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) +sub-src-make_first: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) first +sub-src-all: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) all +sub-src-clean: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) clean +sub-src-distclean: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) distclean +sub-src-install_subtargets: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) install +sub-src-uninstall_subtargets: src/$(MAKEFILE) FORCE + cd src/ && $(MAKE) -f $(MAKEFILE) uninstall + +Makefile: opencsg.pro /usr/local/Qt4.6/mkspecs/macx-g++/qmake.conf /usr/local/Qt4.6/mkspecs/common/unix.conf \ + /usr/local/Qt4.6/mkspecs/common/mac.conf \ + /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \ + /usr/local/Qt4.6/mkspecs/qconfig.pri \ + /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \ + /usr/local/Qt4.6/mkspecs/features/qt_config.prf \ + /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \ + /usr/local/Qt4.6/mkspecs/features/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/dwarf2.prf \ + /usr/local/Qt4.6/mkspecs/features/debug.prf \ + /usr/local/Qt4.6/mkspecs/features/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \ + /usr/local/Qt4.6/mkspecs/features/warn_on.prf \ + /usr/local/Qt4.6/mkspecs/features/qt.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \ + /usr/local/Qt4.6/mkspecs/features/moc.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \ + /usr/local/Qt4.6/mkspecs/features/resources.prf \ + /usr/local/Qt4.6/mkspecs/features/uic.prf \ + /usr/local/Qt4.6/mkspecs/features/yacc.prf \ + /usr/local/Qt4.6/mkspecs/features/lex.prf \ + /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf + $(QMAKE) -macx CONFIG+=x86\ x86_64 -o Makefile opencsg.pro +/usr/local/Qt4.6/mkspecs/common/unix.conf: +/usr/local/Qt4.6/mkspecs/common/mac.conf: +/usr/local/Qt4.6/mkspecs/common/mac-g++.conf: +/usr/local/Qt4.6/mkspecs/qconfig.pri: +/usr/local/Qt4.6/mkspecs/features/qt_functions.prf: +/usr/local/Qt4.6/mkspecs/features/qt_config.prf: +/usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf: +/usr/local/Qt4.6/mkspecs/features/default_pre.prf: +/usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf: +/usr/local/Qt4.6/mkspecs/features/mac/dwarf2.prf: +/usr/local/Qt4.6/mkspecs/features/debug.prf: +/usr/local/Qt4.6/mkspecs/features/default_post.prf: +/usr/local/Qt4.6/mkspecs/features/mac/default_post.prf: +/usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf: +/usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf: +/usr/local/Qt4.6/mkspecs/features/mac/x86.prf: +/usr/local/Qt4.6/mkspecs/features/warn_on.prf: +/usr/local/Qt4.6/mkspecs/features/qt.prf: +/usr/local/Qt4.6/mkspecs/features/unix/thread.prf: +/usr/local/Qt4.6/mkspecs/features/moc.prf: +/usr/local/Qt4.6/mkspecs/features/mac/rez.prf: +/usr/local/Qt4.6/mkspecs/features/mac/sdk.prf: +/usr/local/Qt4.6/mkspecs/features/resources.prf: +/usr/local/Qt4.6/mkspecs/features/uic.prf: +/usr/local/Qt4.6/mkspecs/features/yacc.prf: +/usr/local/Qt4.6/mkspecs/features/lex.prf: +/usr/local/Qt4.6/mkspecs/features/include_source_dir.prf: +qmake: qmake_all FORCE + @$(QMAKE) -macx CONFIG+=x86\ x86_64 -o Makefile opencsg.pro + +qmake_all: sub-src-qmake_all FORCE + +make_default: sub-src-make_default FORCE +make_first: sub-src-make_first FORCE +all: sub-src-all FORCE +clean: sub-src-clean FORCE +distclean: sub-src-distclean FORCE + -$(DEL_FILE) Makefile +install_subtargets: sub-src-install_subtargets FORCE +uninstall_subtargets: sub-src-uninstall_subtargets FORCE + +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all +install: install_subtargets FORCE + +uninstall: uninstall_subtargets FORCE + +FORCE: -distclean: - for X in $(SUBDIRS); do make -C $$X distclean; done diff -ru OpenCSG-1.3.0/RenderTexture/RenderTexture.h OpenCSG-1.3.0-mac/RenderTexture/RenderTexture.h --- OpenCSG-1.3.0/RenderTexture/RenderTexture.h 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/RenderTexture/RenderTexture.h 2010-05-09 02:51:07.000000000 +0200 @@ -294,8 +294,8 @@ bool _BindDepthBuffer( ) const; protected: // data - int _iWidth; // width of the pbuffer - int _iHeight; // height of the pbuffer + GLint _iWidth; // width of the pbuffer + GLint _iHeight; // height of the pbuffer bool _bIsTexture; bool _bIsDepthTexture; @@ -342,8 +342,8 @@ // Texture stuff GLenum _iTextureTarget; - unsigned int _iTextureID; - unsigned int _iDepthTextureID; + GLuint _iTextureID; + GLuint _iDepthTextureID; unsigned short* _pPoorDepthTexture; // [Redge] diff -ru OpenCSG-1.3.0/example/Makefile OpenCSG-1.3.0-mac/example/Makefile --- OpenCSG-1.3.0/example/Makefile 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/example/Makefile 2010-05-09 02:51:11.000000000 +0200 @@ -1,106 +1,206 @@ ############################################################################# -# Makefile for building: opencsgexample -# Generated by qmake (1.06c) (Qt 3.2.0) on: Thu Apr 22 16:05:34 2004 +# Makefile for building: opencsgexample.app/Contents/MacOS/opencsgexample +# Generated by qmake (2.01a) (Qt 4.6.2) on: Sun May 9 02:43:57 2010 # Project: example.pro # Template: app -# Command: $(QMAKE) -o Makefile example.pro +# Command: /usr/bin/qmake -macx CONFIG+=x86\ x86_64 -o Makefile example.pro ############################################################################# ####### Compiler, tools and options -CC = gcc -CXX = g++ -LEX = flex -YACC = yacc -CFLAGS = -pipe -Wall -W -O2 -CXXFLAGS = -pipe -Wall -W -O2 -LEXFLAGS = -YACCFLAGS= -d -INCPATH = -I. -I../glew/include -I../include -I/usr/X11R6/include -I/usr/X11R6/include -LINK = g++ -LFLAGS = -LIBS = $(SUBLIBS) -L/usr/X11R6/lib -L/usr/X11R6/lib -L../lib -lopencsg -lglut -L../glew/lib -lGLEW -lGLU -lGL -lXmu -lXext -lX11 -lm -AR = ar cqs -RANLIB = -MOC = $(QTDIR)/bin/moc -UIC = $(QTDIR)/bin/uic -QMAKE = qmake -TAR = tar -cf -GZIP = gzip -9f -COPY = cp -f -COPY_FILE= $(COPY) -COPY_DIR = $(COPY) -r -DEL_FILE = rm -f -SYMLINK = ln -sf -DEL_DIR = rmdir -MOVE = mv -f +CC = gcc +CXX = g++ +DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED +CFLAGS = -pipe -O2 -Wall -W -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch i386 $(DEFINES) +CXXFLAGS = -pipe -O2 -Wall -W -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch i386 $(DEFINES) +INCPATH = -I/usr/local/Qt4.6/mkspecs/macx-g++ -I. -I/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/usr/include/QtCore -I/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/usr/include/QtGui -I/usr/include -I../include -I/opt/local/include -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I. -F/Library/Frameworks +LINK = g++ +LFLAGS = -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch i386 +LIBS = $(SUBLIBS) -F/Library/Frameworks -L/Library/Frameworks -L../lib -lopencsg -lGLEW -framework GLUT -L/opt/local/lib -framework OpenGL -framework AGL -framework QtGui -framework QtCore +AR = ar cq +RANLIB = ranlib -s +QMAKE = /usr/bin/qmake +TAR = tar -cf +COMPRESS = gzip -9f +COPY = cp -f +SED = sed +COPY_FILE = cp -f +COPY_DIR = cp -f -R +STRIP = +INSTALL_FILE = $(COPY_FILE) +INSTALL_DIR = $(COPY_DIR) +INSTALL_PROGRAM = $(COPY_FILE) +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f CHK_DIR_EXISTS= test -d -MKDIR = mkdir -p +MKDIR = mkdir -p +export MACOSX_DEPLOYMENT_TARGET = 10.4 ####### Output directory -OBJECTS_DIR = ./ +OBJECTS_DIR = ./ ####### Files -HEADERS = displaylistPrimitive.h -SOURCES = displaylistPrimitive.cpp \ - main.cpp -OBJECTS = displaylistPrimitive.o \ +SOURCES = displaylistPrimitive.cpp \ + main.cpp +OBJECTS = displaylistPrimitive.o \ main.o -FORMS = -UICDECLS = -UICIMPLS = -SRCMOC = -OBJMOC = -DIST = example.pro -QMAKE_TARGET = opencsgexample -DESTDIR = -TARGET = opencsgexample +DIST = /usr/local/Qt4.6/mkspecs/common/unix.conf \ + /usr/local/Qt4.6/mkspecs/common/mac.conf \ + /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \ + /usr/local/Qt4.6/mkspecs/qconfig.pri \ + /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \ + /usr/local/Qt4.6/mkspecs/features/qt_config.prf \ + /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \ + /usr/local/Qt4.6/mkspecs/features/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/release.prf \ + /usr/local/Qt4.6/mkspecs/features/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \ + /usr/local/Qt4.6/mkspecs/features/warn_on.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/opengl.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \ + /usr/local/Qt4.6/mkspecs/features/qt.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \ + /usr/local/Qt4.6/mkspecs/features/moc.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \ + /usr/local/Qt4.6/mkspecs/features/resources.prf \ + /usr/local/Qt4.6/mkspecs/features/uic.prf \ + /usr/local/Qt4.6/mkspecs/features/yacc.prf \ + /usr/local/Qt4.6/mkspecs/features/lex.prf \ + /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf \ + example.pro +QMAKE_TARGET = opencsgexample +DESTDIR = +TARGET = opencsgexample.app/Contents/MacOS/opencsgexample + +####### Custom Compiler Variables +QMAKE_COMP_QMAKE_OBJECTIVE_CFLAGS = -pipe \ + -O2 \ + -Wall \ + -W \ + -arch \ + x86_64 \ + -Xarch_x86_64 \ + -mmacosx-version-min=10.5 \ + -arch \ + i386 + first: all ####### Implicit rules -.SUFFIXES: .c .o .cpp .cc .cxx .C +.SUFFIXES: .o .c .cpp .cc .cxx .C .cpp.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .cc.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .cxx.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .C.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .c.o: - $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< + $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" ####### Build rules -all: Makefile $(TARGET) - -$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) - $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) $(OBJCOMP) - -mocables: $(SRCMOC) -uicables: $(UICDECLS) $(UICIMPLS) - -$(MOC): - ( cd $(QTDIR)/src/moc ; $(MAKE) ) +all: Makefile opencsgexample.app/Contents/PkgInfo opencsgexample.app/Contents/Resources/empty.lproj opencsgexample.app/Contents/Info.plist $(TARGET) +$(TARGET): $(OBJECTS) + @$(CHK_DIR_EXISTS) opencsgexample.app/Contents/MacOS/ || $(MKDIR) opencsgexample.app/Contents/MacOS/ + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: example.pro /usr/local/Qt4.6/mkspecs/macx-g++/qmake.conf /usr/local/Qt4.6/mkspecs/common/unix.conf \ + /usr/local/Qt4.6/mkspecs/common/mac.conf \ + /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \ + /usr/local/Qt4.6/mkspecs/qconfig.pri \ + /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \ + /usr/local/Qt4.6/mkspecs/features/qt_config.prf \ + /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \ + /usr/local/Qt4.6/mkspecs/features/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/release.prf \ + /usr/local/Qt4.6/mkspecs/features/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \ + /usr/local/Qt4.6/mkspecs/features/warn_on.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/opengl.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \ + /usr/local/Qt4.6/mkspecs/features/qt.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \ + /usr/local/Qt4.6/mkspecs/features/moc.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \ + /usr/local/Qt4.6/mkspecs/features/resources.prf \ + /usr/local/Qt4.6/mkspecs/features/uic.prf \ + /usr/local/Qt4.6/mkspecs/features/yacc.prf \ + /usr/local/Qt4.6/mkspecs/features/lex.prf \ + /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf \ + /Library/Frameworks/QtGui.framework/QtGui.prl \ + /Library/Frameworks/QtCore.framework/QtCore.prl + $(QMAKE) -macx CONFIG+=x86\ x86_64 -o Makefile example.pro +/usr/local/Qt4.6/mkspecs/common/unix.conf: +/usr/local/Qt4.6/mkspecs/common/mac.conf: +/usr/local/Qt4.6/mkspecs/common/mac-g++.conf: +/usr/local/Qt4.6/mkspecs/qconfig.pri: +/usr/local/Qt4.6/mkspecs/features/qt_functions.prf: +/usr/local/Qt4.6/mkspecs/features/qt_config.prf: +/usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf: +/usr/local/Qt4.6/mkspecs/features/default_pre.prf: +/usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf: +/usr/local/Qt4.6/mkspecs/features/release.prf: +/usr/local/Qt4.6/mkspecs/features/default_post.prf: +/usr/local/Qt4.6/mkspecs/features/mac/default_post.prf: +/usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf: +/usr/local/Qt4.6/mkspecs/features/warn_on.prf: +/usr/local/Qt4.6/mkspecs/features/unix/opengl.prf: +/usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf: +/usr/local/Qt4.6/mkspecs/features/mac/x86.prf: +/usr/local/Qt4.6/mkspecs/features/qt.prf: +/usr/local/Qt4.6/mkspecs/features/unix/thread.prf: +/usr/local/Qt4.6/mkspecs/features/moc.prf: +/usr/local/Qt4.6/mkspecs/features/mac/rez.prf: +/usr/local/Qt4.6/mkspecs/features/mac/sdk.prf: +/usr/local/Qt4.6/mkspecs/features/resources.prf: +/usr/local/Qt4.6/mkspecs/features/uic.prf: +/usr/local/Qt4.6/mkspecs/features/yacc.prf: +/usr/local/Qt4.6/mkspecs/features/lex.prf: +/usr/local/Qt4.6/mkspecs/features/include_source_dir.prf: +/Library/Frameworks/QtGui.framework/QtGui.prl: +/Library/Frameworks/QtCore.framework/QtCore.prl: +qmake: FORCE + @$(QMAKE) -macx CONFIG+=x86\ x86_64 -o Makefile example.pro + +opencsgexample.app/Contents/PkgInfo: + @$(CHK_DIR_EXISTS) opencsgexample.app/Contents || $(MKDIR) opencsgexample.app/Contents + @$(DEL_FILE) opencsgexample.app/Contents/PkgInfo + @echo "APPL????" >opencsgexample.app/Contents/PkgInfo +opencsgexample.app/Contents/Resources/empty.lproj: + @$(CHK_DIR_EXISTS) opencsgexample.app/Contents/Resources || $(MKDIR) opencsgexample.app/Contents/Resources + @touch opencsgexample.app/Contents/Resources/empty.lproj + +opencsgexample.app/Contents/Info.plist: + @$(CHK_DIR_EXISTS) opencsgexample.app/Contents || $(MKDIR) opencsgexample.app/Contents + @$(DEL_FILE) opencsgexample.app/Contents/Info.plist + @sed -e "s,@ICON@,,g" -e "s,@EXECUTABLE@,opencsgexample,g" -e "s,@TYPEINFO@,????,g" /usr/local/Qt4.6/mkspecs/macx-g++/Info.plist.app >opencsgexample.app/Contents/Info.plist dist: - @mkdir -p .tmp/opencsgexample && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/opencsgexample/ && ( cd `dirname .tmp/opencsgexample` && $(TAR) opencsgexample.tar opencsgexample && $(GZIP) opencsgexample.tar ) && $(MOVE) `dirname .tmp/opencsgexample`/opencsgexample.tar.gz . && $(DEL_FILE) -r .tmp/opencsgexample - -mocclean: + @$(CHK_DIR_EXISTS) .tmp/opencsgexample1.0.0 || $(MKDIR) .tmp/opencsgexample1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/opencsgexample1.0.0/ && $(COPY_FILE) --parents displaylistPrimitive.h .tmp/opencsgexample1.0.0/ && $(COPY_FILE) --parents displaylistPrimitive.cpp main.cpp .tmp/opencsgexample1.0.0/ && (cd `dirname .tmp/opencsgexample1.0.0` && $(TAR) opencsgexample1.0.0.tar opencsgexample1.0.0 && $(COMPRESS) opencsgexample1.0.0.tar) && $(MOVE) `dirname .tmp/opencsgexample1.0.0`/opencsgexample1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/opencsgexample1.0.0 -uiclean: -yaccclean: -lexclean: -clean: +clean:compiler_clean -$(DEL_FILE) $(OBJECTS) -$(DEL_FILE) *~ core *.core @@ -108,20 +208,50 @@ ####### Sub-libraries distclean: clean - -$(DEL_FILE) $(TARGET) $(TARGET) + -$(DEL_FILE) -r opencsgexample.app + -$(DEL_FILE) Makefile -FORCE: +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all + +compiler_objective_c_make_all: +compiler_objective_c_clean: +compiler_moc_header_make_all: +compiler_moc_header_clean: +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_image_collection_make_all: qmake_image_collection.cpp +compiler_image_collection_clean: + -$(DEL_FILE) qmake_image_collection.cpp +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_rez_source_make_all: +compiler_rez_source_clean: +compiler_uic_make_all: +compiler_uic_clean: +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: ####### Compile displaylistPrimitive.o: displaylistPrimitive.cpp displaylistPrimitive.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o displaylistPrimitive.o displaylistPrimitive.cpp main.o: main.cpp displaylistPrimitive.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp ####### Install -install: all +install: FORCE -uninstall: +uninstall: FORCE + +FORCE: diff -ru OpenCSG-1.3.0/example/example.pro OpenCSG-1.3.0-mac/example/example.pro --- OpenCSG-1.3.0/example/example.pro 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/example/example.pro 2010-05-09 02:51:14.000000000 +0200 @@ -2,9 +2,16 @@ TARGET = opencsgexample CONFIG += opengl warn_on release -INCLUDEPATH += ../glew/include ../include - -LIBS += -L../lib -lopencsg -lglut -L../glew/lib -lGLEW +INCLUDEPATH += ../include +LIBS += -L../lib -lopencsg -lGLEW +macx { + INCLUDEPATH += /opt/local/include + LIBS += -framework GLUT -L/opt/local/lib +} +else { + INCLUDEPATH += ../glew/include + LIBS += -lglut -L../glew/lib +} HEADERS = displaylistPrimitive.h SOURCES = displaylistPrimitive.cpp main.cpp diff -ru OpenCSG-1.3.0/example/main.cpp OpenCSG-1.3.0-mac/example/main.cpp --- OpenCSG-1.3.0/example/main.cpp 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/example/main.cpp 2010-05-09 02:51:20.000000000 +0200 @@ -22,7 +22,11 @@ // #include +#ifdef __APPLE__ +#include +#else #include +#endif #include #include "displaylistPrimitive.h" #include diff -ru OpenCSG-1.3.0/opencsg.pro OpenCSG-1.3.0-mac/opencsg.pro --- OpenCSG-1.3.0/opencsg.pro 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/opencsg.pro 2010-05-09 02:51:23.000000000 +0200 @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = src example +SUBDIRS = src diff -ru OpenCSG-1.3.0/src/Makefile OpenCSG-1.3.0-mac/src/Makefile --- OpenCSG-1.3.0/src/Makefile 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/Makefile 2010-05-09 02:51:27.000000000 +0200 @@ -1,65 +1,50 @@ ############################################################################# -# Makefile for building: libopencsg.so.1.3.0 -# Generated by qmake (1.07a) (Qt 3.3.8b) on: Fri Jan 29 22:15:11 2010 +# Makefile for building: libopencsg.1.3.0.dylib +# Generated by qmake (2.01a) (Qt 4.6.2) on: Sun May 9 02:45:47 2010 # Project: src.pro # Template: lib -# Command: $(QMAKE) -o Makefile src.pro +# Command: /usr/bin/qmake -macx CONFIG+=x86\ x86_64 -o Makefile src.pro ############################################################################# ####### Compiler, tools and options -CC = gcc -CXX = g++ -LEX = flex -YACC = yacc -CFLAGS = -pipe -Wall -W -O2 -fPIC -CXXFLAGS = -pipe -Wall -W -O2 -fPIC -LEXFLAGS = -YACCFLAGS= -d -INCPATH = -I. -I../include -I../glew/include -I.. -I/usr/X11R6/include -LINK = g++ -LFLAGS = -shared -Wl,-soname,libopencsg.so.1 -Wl,-rpath,../lib -LIBS = $(SUBLIBS) -L/usr/X11R6/lib -lGLU -lGL -lXmu -AR = ar cqs -RANLIB = -QMAKE = qmake -TAR = tar -cf -GZIP = gzip -9f -COPY = cp -f -COPY_FILE= $(COPY) -COPY_DIR = $(COPY) -r -DEL_FILE = rm -f -SYMLINK = ln -sf -DEL_DIR = rmdir -MOVE = mv -f +CC = gcc +CXX = g++ +DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED +CFLAGS = -pipe -O2 -Wall -W -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch i386 -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -Wall -W -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch i386 -fPIC $(DEFINES) +INCPATH = -I/usr/local/Qt4.6/mkspecs/macx-g++ -I. -I/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/usr/include/QtCore -I/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/usr/include/QtGui -I/usr/include -I../include -I.. -I../../../deploy/include -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I. -F/Library/Frameworks +LINK = g++ +LFLAGS = -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -arch i386 -single_module -dynamiclib -compatibility_version 1.3 -current_version 1.3.0 -install_name /Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/libopencsg.1.dylib +LIBS = $(SUBLIBS) -F/Library/Frameworks -L/Library/Frameworks -L/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib -lGLEW -framework OpenGL -framework AGL -framework QtGui -framework QtCore +AR = ar cq +RANLIB = ranlib -s +QMAKE = /usr/bin/qmake +TAR = tar -cf +COMPRESS = gzip -9f +COPY = cp -f +SED = sed +COPY_FILE = cp -f +COPY_DIR = cp -f -R +STRIP = +INSTALL_FILE = $(COPY_FILE) +INSTALL_DIR = $(COPY_DIR) +INSTALL_PROGRAM = $(COPY_FILE) +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f CHK_DIR_EXISTS= test -d -MKDIR = mkdir -p +MKDIR = mkdir -p +export MACOSX_DEPLOYMENT_TARGET = 10.4 ####### Output directory -OBJECTS_DIR = ./ +OBJECTS_DIR = ./ ####### Files -HEADERS = ../include/opencsg.h \ - opencsgConfig.h \ - area.h \ - batch.h \ - context.h \ - channelManager.h \ - frameBufferObject.h \ - frameBufferObjectExt.h \ - occlusionQuery.h \ - offscreenBuffer.h \ - opencsgRender.h \ - openglHelper.h \ - pBufferTexture.h \ - primitiveHelper.h \ - scissorMemo.h \ - settings.h \ - stencilManager.h \ - ../RenderTexture/RenderTexture.h -SOURCES = area.cpp \ +SOURCES = area.cpp \ batch.cpp \ context.cpp \ channelManager.cpp \ @@ -69,16 +54,14 @@ offscreenBuffer.cpp \ opencsgRender.cpp \ openglHelper.cpp \ - pBufferTexture.cpp \ primitive.cpp \ primitiveHelper.cpp \ renderGoldfeather.cpp \ renderSCS.cpp \ scissorMemo.cpp \ settings.cpp \ - stencilManager.cpp \ - ../RenderTexture/RenderTexture.cpp -OBJECTS = area.o \ + stencilManager.cpp +OBJECTS = area.o \ batch.o \ context.o \ channelManager.o \ @@ -88,81 +71,171 @@ offscreenBuffer.o \ opencsgRender.o \ openglHelper.o \ - pBufferTexture.o \ primitive.o \ primitiveHelper.o \ renderGoldfeather.o \ renderSCS.o \ scissorMemo.o \ settings.o \ - stencilManager.o \ - RenderTexture.o -FORMS = -UICDECLS = -UICIMPLS = -SRCMOC = -OBJMOC = -DIST = src.pro -QMAKE_TARGET = opencsg -DESTDIR = ../lib/ -TARGET = libopencsg.so.1.3.0 -TARGETA = ../lib/libopencsg.a -TARGETD = libopencsg.so.1.3.0 -TARGET0 = libopencsg.so -TARGET1 = libopencsg.so.1 -TARGET2 = libopencsg.so.1.3 + stencilManager.o +DIST = /usr/local/Qt4.6/mkspecs/common/unix.conf \ + /usr/local/Qt4.6/mkspecs/common/mac.conf \ + /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \ + /usr/local/Qt4.6/mkspecs/qconfig.pri \ + /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \ + /usr/local/Qt4.6/mkspecs/features/qt_config.prf \ + /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \ + /usr/local/Qt4.6/mkspecs/features/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/release.prf \ + /usr/local/Qt4.6/mkspecs/features/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \ + /usr/local/Qt4.6/mkspecs/features/warn_on.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/opengl.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \ + /usr/local/Qt4.6/mkspecs/features/qt.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \ + /usr/local/Qt4.6/mkspecs/features/moc.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \ + /usr/local/Qt4.6/mkspecs/features/resources.prf \ + /usr/local/Qt4.6/mkspecs/features/uic.prf \ + /usr/local/Qt4.6/mkspecs/features/yacc.prf \ + /usr/local/Qt4.6/mkspecs/features/lex.prf \ + /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf \ + src.pro +QMAKE_TARGET = opencsg +DESTDIR = +TARGET = libopencsg.1.3.0.dylib +TARGETA = libopencsg.a +TARGETD = libopencsg.1.3.0.dylib +TARGET0 = libopencsg.dylib +TARGET1 = libopencsg.1.dylib +TARGET2 = libopencsg.1.3.dylib + +####### Custom Compiler Variables +QMAKE_COMP_QMAKE_OBJECTIVE_CFLAGS = -pipe \ + -O2 \ + -Wall \ + -W \ + -arch \ + x86_64 \ + -Xarch_x86_64 \ + -mmacosx-version-min=10.5 \ + -arch \ + i386 + first: all ####### Implicit rules -.SUFFIXES: .c .o .cpp .cc .cxx .C +.SUFFIXES: .o .c .cpp .cc .cxx .C .cpp.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .cc.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .cxx.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .C.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" .c.o: - $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< + $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" ####### Build rules -all: Makefile ../lib/$(TARGET) +all: Makefile $(TARGET) -../lib/$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS) $(OBJCOMP) - test -d ../lib/ || mkdir -p ../lib/ +$(TARGET): $(OBJECTS) $(SUBLIBS) $(OBJCOMP) -$(DEL_FILE) $(TARGET) $(TARGET0) $(TARGET1) $(TARGET2) - $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) $(OBJCOMP) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) $(OBJCOMP) -ln -s $(TARGET) $(TARGET0) -ln -s $(TARGET) $(TARGET1) -ln -s $(TARGET) $(TARGET2) - -$(DEL_FILE) ../lib/$(TARGET) - -$(DEL_FILE) ../lib/$(TARGET0) - -$(DEL_FILE) ../lib/$(TARGET1) - -$(DEL_FILE) ../lib/$(TARGET2) - -$(MOVE) $(TARGET) $(TARGET0) $(TARGET1) $(TARGET2) ../lib/ staticlib: $(TARGETA) -$(TARGETA): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(OBJCOMP) +$(TARGETA): $(OBJECTS) $(OBJCOMP) -$(DEL_FILE) $(TARGETA) - $(AR) $(TARGETA) $(OBJECTS) $(OBJMOC) + $(AR) $(TARGETA) $(OBJECTS) + $(RANLIB) $(TARGETA) + +Makefile: src.pro /usr/local/Qt4.6/mkspecs/macx-g++/qmake.conf /usr/local/Qt4.6/mkspecs/common/unix.conf \ + /usr/local/Qt4.6/mkspecs/common/mac.conf \ + /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \ + /usr/local/Qt4.6/mkspecs/qconfig.pri \ + /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \ + /usr/local/Qt4.6/mkspecs/features/qt_config.prf \ + /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \ + /usr/local/Qt4.6/mkspecs/features/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \ + /usr/local/Qt4.6/mkspecs/features/release.prf \ + /usr/local/Qt4.6/mkspecs/features/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \ + /usr/local/Qt4.6/mkspecs/features/warn_on.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/opengl.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \ + /usr/local/Qt4.6/mkspecs/features/qt.prf \ + /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \ + /usr/local/Qt4.6/mkspecs/features/moc.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \ + /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \ + /usr/local/Qt4.6/mkspecs/features/resources.prf \ + /usr/local/Qt4.6/mkspecs/features/uic.prf \ + /usr/local/Qt4.6/mkspecs/features/yacc.prf \ + /usr/local/Qt4.6/mkspecs/features/lex.prf \ + /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf \ + /Library/Frameworks/QtGui.framework/QtGui.prl \ + /Library/Frameworks/QtCore.framework/QtCore.prl + $(QMAKE) -macx CONFIG+=x86\ x86_64 -o Makefile src.pro +/usr/local/Qt4.6/mkspecs/common/unix.conf: +/usr/local/Qt4.6/mkspecs/common/mac.conf: +/usr/local/Qt4.6/mkspecs/common/mac-g++.conf: +/usr/local/Qt4.6/mkspecs/qconfig.pri: +/usr/local/Qt4.6/mkspecs/features/qt_functions.prf: +/usr/local/Qt4.6/mkspecs/features/qt_config.prf: +/usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf: +/usr/local/Qt4.6/mkspecs/features/default_pre.prf: +/usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf: +/usr/local/Qt4.6/mkspecs/features/release.prf: +/usr/local/Qt4.6/mkspecs/features/default_post.prf: +/usr/local/Qt4.6/mkspecs/features/mac/default_post.prf: +/usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf: +/usr/local/Qt4.6/mkspecs/features/warn_on.prf: +/usr/local/Qt4.6/mkspecs/features/unix/opengl.prf: +/usr/local/Qt4.6/mkspecs/features/mac/x86_64.prf: +/usr/local/Qt4.6/mkspecs/features/mac/x86.prf: +/usr/local/Qt4.6/mkspecs/features/qt.prf: +/usr/local/Qt4.6/mkspecs/features/unix/thread.prf: +/usr/local/Qt4.6/mkspecs/features/moc.prf: +/usr/local/Qt4.6/mkspecs/features/mac/rez.prf: +/usr/local/Qt4.6/mkspecs/features/mac/sdk.prf: +/usr/local/Qt4.6/mkspecs/features/resources.prf: +/usr/local/Qt4.6/mkspecs/features/uic.prf: +/usr/local/Qt4.6/mkspecs/features/yacc.prf: +/usr/local/Qt4.6/mkspecs/features/lex.prf: +/usr/local/Qt4.6/mkspecs/features/include_source_dir.prf: +/Library/Frameworks/QtGui.framework/QtGui.prl: +/Library/Frameworks/QtCore.framework/QtCore.prl: +qmake: FORCE + @$(QMAKE) -macx CONFIG+=x86\ x86_64 -o Makefile src.pro dist: - @mkdir -p .tmp/opencsg && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/opencsg/ && ( cd `dirname .tmp/opencsg` && $(TAR) opencsg.tar opencsg && $(GZIP) opencsg.tar ) && $(MOVE) `dirname .tmp/opencsg`/opencsg.tar.gz . && $(DEL_FILE) -r .tmp/opencsg + @$(CHK_DIR_EXISTS) .tmp/opencsg1.3.0 || $(MKDIR) .tmp/opencsg1.3.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/opencsg1.3.0/ && $(COPY_FILE) --parents ../include/opencsg.h opencsgConfig.h area.h batch.h context.h channelManager.h frameBufferObject.h frameBufferObjectExt.h occlusionQuery.h offscreenBuffer.h opencsgRender.h openglHelper.h primitiveHelper.h scissorMemo.h settings.h stencilManager.h .tmp/opencsg1.3.0/ && $(COPY_FILE) --parents area.cpp batch.cpp context.cpp channelManager.cpp frameBufferObject.cpp frameBufferObjectExt.cpp occlusionQuery.cpp offscreenBuffer.cpp opencsgRender.cpp openglHelper.cpp primitive.cpp primitiveHelper.cpp renderGoldfeather.cpp renderSCS.cpp scissorMemo.cpp settings.cpp stencilManager.cpp .tmp/opencsg1.3.0/ && (cd `dirname .tmp/opencsg1.3.0` && $(TAR) opencsg1.3.0.tar opencsg1.3.0 && $(COMPRESS) opencsg1.3.0.tar) && $(MOVE) `dirname .tmp/opencsg1.3.0`/opencsg1.3.0.tar.gz . && $(DEL_FILE) -r .tmp/opencsg1.3.0 + -yaccclean: -lexclean: -clean: +clean:compiler_clean -$(DEL_FILE) $(OBJECTS) -$(DEL_FILE) *~ core *.core @@ -170,44 +243,77 @@ ####### Sub-libraries distclean: clean - -$(DEL_FILE) ../lib/$(TARGET) $(TARGET) - -$(DEL_FILE) ../lib/$(TARGET0) ../lib/$(TARGET1) ../lib/$(TARGET2) $(TARGETA) - - -FORCE: + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) $(TARGET0) $(TARGET1) $(TARGET2) $(TARGETA) + -$(DEL_FILE) Makefile + + +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all + +compiler_objective_c_make_all: +compiler_objective_c_clean: +compiler_moc_header_make_all: +compiler_moc_header_clean: +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_image_collection_make_all: qmake_image_collection.cpp +compiler_image_collection_clean: + -$(DEL_FILE) qmake_image_collection.cpp +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_rez_source_make_all: +compiler_rez_source_clean: +compiler_uic_make_all: +compiler_uic_clean: +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: ####### Compile area.o: area.cpp opencsgConfig.h \ area.h \ openglHelper.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o area.o area.cpp batch.o: batch.cpp opencsgConfig.h \ batch.h \ primitiveHelper.h \ area.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o batch.o batch.cpp context.o: context.cpp opencsgConfig.h \ context.h \ offscreenBuffer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o context.o context.cpp channelManager.o: channelManager.cpp opencsgConfig.h \ channelManager.h \ offscreenBuffer.h \ openglHelper.h \ - settings.h \ - area.h + area.h \ + settings.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o channelManager.o channelManager.cpp frameBufferObject.o: frameBufferObject.cpp opencsgConfig.h \ frameBufferObject.h \ offscreenBuffer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o frameBufferObject.o frameBufferObject.cpp frameBufferObjectExt.o: frameBufferObjectExt.cpp opencsgConfig.h \ frameBufferObjectExt.h \ offscreenBuffer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o frameBufferObjectExt.o frameBufferObjectExt.cpp occlusionQuery.o: occlusionQuery.cpp opencsgConfig.h \ occlusionQuery.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o occlusionQuery.o occlusionQuery.cpp offscreenBuffer.o: offscreenBuffer.cpp opencsgConfig.h \ context.h \ @@ -215,27 +321,28 @@ frameBufferObject.h \ frameBufferObjectExt.h \ pBufferTexture.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o offscreenBuffer.o offscreenBuffer.cpp opencsgRender.o: opencsgRender.cpp opencsgConfig.h \ opencsgRender.h \ primitiveHelper.h \ - settings.h \ - area.h + area.h \ + settings.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o opencsgRender.o opencsgRender.cpp openglHelper.o: openglHelper.cpp opencsgConfig.h \ openglHelper.h \ area.h - -pBufferTexture.o: pBufferTexture.cpp opencsgConfig.h \ - pBufferTexture.h \ - offscreenBuffer.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o openglHelper.o openglHelper.cpp primitive.o: primitive.cpp opencsgConfig.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o primitive.o primitive.cpp primitiveHelper.o: primitiveHelper.cpp opencsgConfig.h \ openglHelper.h \ - primitiveHelper.h \ - area.h + area.h \ + primitiveHelper.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o primitiveHelper.o primitiveHelper.cpp renderGoldfeather.o: renderGoldfeather.cpp opencsgConfig.h \ opencsgRender.h \ @@ -243,10 +350,11 @@ channelManager.h \ occlusionQuery.h \ openglHelper.h \ + area.h \ primitiveHelper.h \ scissorMemo.h \ - stencilManager.h \ - area.h + stencilManager.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o renderGoldfeather.o renderGoldfeather.cpp renderSCS.o: renderSCS.cpp opencsgConfig.h \ opencsgRender.h \ @@ -254,29 +362,57 @@ channelManager.h \ occlusionQuery.h \ openglHelper.h \ + area.h \ primitiveHelper.h \ - scissorMemo.h \ - area.h + scissorMemo.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o renderSCS.o renderSCS.cpp scissorMemo.o: scissorMemo.cpp opencsgConfig.h \ openglHelper.h \ - scissorMemo.h \ area.h \ + scissorMemo.h \ channelManager.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o scissorMemo.o scissorMemo.cpp settings.o: settings.cpp opencsgConfig.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o settings.o settings.cpp stencilManager.o: stencilManager.cpp opencsgConfig.h \ area.h \ openglHelper.h \ stencilManager.h - -RenderTexture.o: ../RenderTexture/RenderTexture.cpp ../RenderTexture/RenderTexture.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o RenderTexture.o ../RenderTexture/RenderTexture.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o stencilManager.o stencilManager.cpp ####### Install -install: all +install_target: first FORCE + @$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/ || $(MKDIR) $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/ + -$(INSTALL_PROGRAM) "$(TARGET)" "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET)" + -$(SYMLINK) "$(TARGET)" "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET0)" + -$(SYMLINK) "$(TARGET)" "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET1)" + -$(SYMLINK) "$(TARGET)" "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET2)" + +uninstall_target: FORCE + -$(DEL_FILE) "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET)" + -$(DEL_FILE) "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET0)" + -$(DEL_FILE) "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET1)" + -$(DEL_FILE) "$(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/$(TARGET2)" + -$(DEL_DIR) $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/lib/ + + +install_headers: first FORCE + @$(CHK_DIR_EXISTS) $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/include/ || $(MKDIR) $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/include/ + -$(INSTALL_FILE) /Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/src/OpenCSG-1.3.0-patched/include/opencsg.h $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/include/ + -uninstall: +uninstall_headers: FORCE + -$(DEL_FILE) -r $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/include/opencsg.h + -$(DEL_DIR) $(INSTALL_ROOT)/Users/kintel/code/metalab/checkout/OpenSCAD/libraries-tmp/deploy/include/ + + +install: install_target install_headers FORCE + +uninstall: uninstall_target uninstall_headers FORCE + +FORCE: diff -ru OpenCSG-1.3.0/src/channelManager.cpp OpenCSG-1.3.0-mac/src/channelManager.cpp --- OpenCSG-1.3.0/src/channelManager.cpp 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/channelManager.cpp 2010-05-09 02:51:32.000000000 +0200 @@ -23,7 +23,7 @@ #include #ifdef _WIN32 #include -#else +#elif !defined(__APPLE__) #include #endif @@ -170,9 +170,11 @@ #ifdef WIN32 && WGLEW_ARB_pbuffer && WGLEW_ARB_pixel_format -#else +#elif !defined(__APPLE__) && GLXEW_SGIX_pbuffer && GLXEW_SGIX_fbconfig +#else + && false #endif ) { newOffscreenType = OpenCSG::PBuffer; diff -ru OpenCSG-1.3.0/src/frameBufferObject.h OpenCSG-1.3.0-mac/src/frameBufferObject.h --- OpenCSG-1.3.0/src/frameBufferObject.h 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/frameBufferObject.h 2010-05-09 02:51:36.000000000 +0200 @@ -79,11 +79,11 @@ /// Texture stuff GLenum textureTarget; - unsigned int textureID; - unsigned int depthID; + GLuint textureID; + GLuint depthID; - unsigned int framebufferID; - int oldFramebufferID; + GLuint framebufferID; + GLint oldFramebufferID; bool initialized; }; diff -ru OpenCSG-1.3.0/src/occlusionQuery.cpp OpenCSG-1.3.0-mac/src/occlusionQuery.cpp --- OpenCSG-1.3.0/src/occlusionQuery.cpp 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/occlusionQuery.cpp 2010-05-09 02:51:40.000000000 +0200 @@ -57,7 +57,7 @@ } unsigned int OcclusionQueryARB::getQueryResult() { - unsigned int fragmentCount; + GLuint fragmentCount; glGetQueryObjectuivARB(mQueryObject, GL_QUERY_RESULT_ARB, &fragmentCount); return fragmentCount; } @@ -94,7 +94,7 @@ } unsigned int OcclusionQueryNV::getQueryResult() { - unsigned int fragmentCount; + GLuint fragmentCount; glGetOcclusionQueryuivNV(mQueryObject, GL_PIXEL_COUNT_NV, &fragmentCount); return fragmentCount; } diff -ru OpenCSG-1.3.0/src/openglHelper.cpp OpenCSG-1.3.0-mac/src/openglHelper.cpp --- OpenCSG-1.3.0/src/openglHelper.cpp 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/openglHelper.cpp 2010-05-09 02:51:44.000000000 +0200 @@ -29,13 +29,13 @@ GLfloat projection[16]; GLfloat modelview[16]; - int canvasPos[4]; + GLint canvasPos[4]; - int stencilBits = 0; + GLint stencilBits = 0; int stencilMax = 0; int stencilMask = 0; - int scissorPos[4]; + GLint scissorPos[4]; void scissor(const PCArea& area) { const int dx = area.maxx - area.minx; diff -ru OpenCSG-1.3.0/src/openglHelper.h OpenCSG-1.3.0-mac/src/openglHelper.h --- OpenCSG-1.3.0/src/openglHelper.h 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/openglHelper.h 2010-05-09 02:51:48.000000000 +0200 @@ -36,17 +36,17 @@ // copy of the projection matrix during CSG computation extern GLfloat modelview[16]; // copy of the modelview matrix during CSG computation - extern int canvasPos[4]; + extern GLint canvasPos[4]; // copy of the viewport size during CSG computation - extern int stencilBits; + extern GLint stencilBits; // number of stencil bits in the pbuffer extern int stencilMax; // the number where the stencil value would "wrap around" to zero extern int stencilMask; // stencilMax - 1 - extern int scissorPos[4]; + extern GLint scissorPos[4]; // copy of the scissor settings for CSG computation void scissor(const PCArea& area); diff -ru OpenCSG-1.3.0/src/pBufferTexture.h OpenCSG-1.3.0-mac/src/pBufferTexture.h --- OpenCSG-1.3.0/src/pBufferTexture.h 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/pBufferTexture.h 2010-05-09 02:51:53.000000000 +0200 @@ -22,7 +22,7 @@ #ifndef __OpenCSG__pbuffer_texture_h__ #define __OpenCSG__pbuffer_texture_h__ - +#ifndef __APPLE__ #include "opencsgConfig.h" #include "offscreenBuffer.h" @@ -84,5 +84,27 @@ } // namespace OpenGL } // namespace OpenCSG +#else + +namespace OpenCSG { + namespace OpenGL { + class PBufferTexture : public OffscreenBuffer { + virtual bool Initialize(int , int , bool , bool ) {return false;} + virtual bool IsInitialized() const {return false;} + virtual bool Reset() {return false;} + virtual bool Resize(int, int) {return false;} + virtual bool BeginCapture() {return false;} + virtual bool EndCapture() {return false;} + virtual void Bind() const {} + virtual void EnableTextureTarget() const {} + virtual void DisableTextureTarget() const {} + virtual unsigned int GetTextureTarget() const {return 0;} + virtual int GetWidth() const {return 0;} + virtual int GetHeight() const {return 0;} + virtual bool haveSeparateContext() const {return false;} + }; + } +} +#endif // __APPLE__ #endif // __OpenCSG__frame_buffer_object_h__ diff -ru OpenCSG-1.3.0/src/src.pro OpenCSG-1.3.0-mac/src/src.pro --- OpenCSG-1.3.0/src/src.pro 2010-02-06 21:35:10.000000000 +0100 +++ OpenCSG-1.3.0-mac/src/src.pro 2010-05-09 02:51:57.000000000 +0200 @@ -1,10 +1,31 @@ TEMPLATE = lib TARGET = opencsg VERSION = 1.3.0 -DESTDIR = ../lib CONFIG += opengl warn_on release -INCLUDEPATH += ../include ../glew/include ../ +INCLUDEPATH += ../include ../ + +# Optionally specify deployment location using the +# MACOSX_DEPLOY_DIR env. variable +DEPLOYDIR = $$(MACOSX_DEPLOY_DIR) + +!isEmpty(DEPLOYDIR) { + message("Deploy") + INSTALLDIR = $$(MACOSX_DEPLOY_DIR) + INCLUDEPATH += $$(MACOSX_DEPLOY_DIR)/include + LIBS += -L$$(MACOSX_DEPLOY_DIR)/lib -lGLEW + CONFIG += absolute_library_soname + headers.files = ../include/opencsg.h + headers.path = $$INSTALLDIR/include + INSTALLS += target headers + target.path = $$INSTALLDIR/lib +} +else { + DESTDIR = ../lib + INCLUDEPATH += ../glew/include + INSTALLS += target + target.path = $$DESTDIR +} HEADERS = ../include/opencsg.h \ opencsgConfig.h \ @@ -18,12 +39,11 @@ offscreenBuffer.h \ opencsgRender.h \ openglHelper.h \ - pBufferTexture.h \ primitiveHelper.h \ scissorMemo.h \ settings.h \ - stencilManager.h \ - ../RenderTexture/RenderTexture.h + stencilManager.h + SOURCES = area.cpp \ batch.cpp \ context.cpp \ @@ -34,12 +54,18 @@ offscreenBuffer.cpp \ opencsgRender.cpp \ openglHelper.cpp \ - pBufferTexture.cpp \ primitive.cpp \ primitiveHelper.cpp \ renderGoldfeather.cpp \ renderSCS.cpp \ scissorMemo.cpp \ settings.cpp \ - stencilManager.cpp \ - ../RenderTexture/RenderTexture.cpp + stencilManager.cpp + +!macx { + HEADERS += ../RenderTexture/RenderTexture.h \ + pBufferTexture.h + + SOURCES += ../RenderTexture/RenderTexture.cpp \ + pBufferTexture.cpp +} openscad-2019.05/patches/OpenCSG-1.3.2-MacOSX-port.patch0000644000076500000240000000351513402025764022525 0ustar kintelstaff00000000000000diff --git a/example/example.pro b/example/example.pro index 8891a28..5cb5e81 100644 --- a/example/example.pro +++ b/example/example.pro @@ -2,9 +2,16 @@ TEMPLATE = app TARGET = opencsgexample CONFIG += opengl warn_on release -INCLUDEPATH += ../glew/include ../include - -LIBS += -L../lib -lopencsg -lglut -L../glew/lib -lGLEW +INCLUDEPATH += ../include +LIBS += -L../lib -lopencsg -lGLEW +macx { + INCLUDEPATH += /opt/local/include + LIBS += -framework GLUT -L/opt/local/lib +} +else { + INCLUDEPATH += ../glew/include + LIBS += -lglut -L../glew/lib +} HEADERS = displaylistPrimitive.h SOURCES = displaylistPrimitive.cpp main.cpp diff --git a/opencsg.pro b/opencsg.pro index b56e622..5cf2d6d 100644 --- a/opencsg.pro +++ b/opencsg.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = src example +SUBDIRS = src diff --git a/src/src.pro b/src/src.pro index 4843a12..04d3f4d 100644 --- a/src/src.pro +++ b/src/src.pro @@ -1,10 +1,32 @@ TEMPLATE = lib TARGET = opencsg VERSION = 1.3.2 -DESTDIR = ../lib CONFIG += opengl warn_on release -INCLUDEPATH += ../include ../glew/include ../ +INCLUDEPATH += ../include ../ +CONFIG -= qt + +# Optionally specify deployment location using the +# OPENSCAD_LIBRARIES env. variable +OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) + +!isEmpty(OPENSCAD_LIBDIR) { + message("Deploy") + INSTALLDIR = $$OPENSCAD_LIBDIR + INCLUDEPATH += $$OPENSCAD_LIBDIR/include + LIBS += -L$$OPENSCAD_LIBDIR/lib -lGLEW + CONFIG += absolute_library_soname + headers.files = ../include/opencsg.h + headers.path = $$INSTALLDIR/include + INSTALLS += target headers + target.path = $$INSTALLDIR/lib +} +else { + DESTDIR = ../lib + INCLUDEPATH += ../glew/include + INSTALLS += target + target.path = $$DESTDIR +} HEADERS = ../include/opencsg.h \ opencsgConfig.h \ openscad-2019.05/patches/OpenCSG-1.4.0-MacOSX-port.patch0000644000076500000240000000135413402025764022523 0ustar kintelstaff00000000000000diff --git a/opencsg.pro b/opencsg.pro index b56e622..5cf2d6d 100644 --- a/opencsg.pro +++ b/opencsg.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = src example +SUBDIRS = src diff --git a/src/src.pro b/src/src.pro index 9091251..598112a 100644 --- a/src/src.pro +++ b/src/src.pro @@ -3,15 +3,14 @@ TARGET = opencsg VERSION = 1.4.0 CONFIG += opengl warn_on release +CONFIG += absolute_library_soname INCLUDEPATH += ../include ../ CONFIG -= qt LIBS += -lGLEW -DESTDIR = ../lib -INSTALLDIR = /usr/local headers.files = ../include/opencsg.h -headers.path = $$INSTALLDIR/include -target.path = /usr/local/lib +headers.path = $$DESTDIR/include +target.path = $$DESTDIR/lib INSTALLS += target headers HEADERS = ../include/opencsg.h \ openscad-2019.05/patches/OpenCSG-1.4.1-MacOSX-port.patch0000644000076500000240000000100313402025764022513 0ustar kintelstaff00000000000000diff --git a/opencsg.pro b/opencsg.pro index b56e622..5cf2d6d 100644 --- a/opencsg.pro +++ b/opencsg.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = src example +SUBDIRS = src diff --git a/src/src.pro b/src/src.pro index 9091251..598112a 100644 --- a/src/src.pro +++ b/src/src.pro @@ -7,6 +7,8 @@ TARGET = opencsg } CONFIG += opengl warn_on release +CONFIG += absolute_library_soname +QMAKE_STRIP = echo INCLUDEPATH += ../include ../ $$INSTALLDIR/include CONFIG -= qt LIBS += -L$$INSTALLDIR/lib -lGLEW openscad-2019.05/patches/OpenCSG-1.4.2-MacOSX-port.patch0000644000076500000240000000100313402025764022514 0ustar kintelstaff00000000000000diff --git a/opencsg.pro b/opencsg.pro index b56e622..5cf2d6d 100644 --- a/opencsg.pro +++ b/opencsg.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = src example +SUBDIRS = src diff --git a/src/src.pro b/src/src.pro index 9091251..598112a 100644 --- a/src/src.pro +++ b/src/src.pro @@ -7,6 +7,8 @@ TARGET = opencsg } CONFIG += opengl warn_on release +CONFIG += absolute_library_soname +QMAKE_STRIP = echo INCLUDEPATH += ../include ../ $$INSTALLDIR/include CONFIG -= qt LIBS += -L$$INSTALLDIR/lib -lGLEW openscad-2019.05/patches/QScintilla-2.9.3-xcode8.patch0000644000076500000240000000370713402025764022463 0ustar kintelstaff00000000000000diff --git a/Qt4Qt5/Qsci/qsciscintilla.h b/Qt4Qt5/Qsci/qsciscintilla.h index c8a7d5a..563884b 100644 --- a/Qt4Qt5/Qsci/qsciscintilla.h +++ b/Qt4Qt5/Qsci/qsciscintilla.h @@ -22,9 +22,11 @@ #ifndef QSCISCINTILLA_H #define QSCISCINTILLA_H +/*---OPENCOR--- #ifdef __APPLE__ extern "C++" { #endif +*/ #include #include @@ -2135,7 +2137,13 @@ private slots: int ct_cursor; QList ct_shifts; AutoCompletionUseSingle use_single; +/*---OPENCOR--- QPointer lex; +*/ +//---OPENCOR--- BEGIN + struct Lexer; + Lexer *lexerStruct; +//---OPENCOR--- END QsciCommandSet *stdCmds; QsciDocument doc; QColor nl_text_colour; @@ -2157,8 +2165,10 @@ private slots: QsciScintilla &operator=(const QsciScintilla &); }; +/*---OPENCOR--- #ifdef __APPLE__ } #endif +*/ #endif diff --git a/Qt4Qt5/qsciscintilla.cpp b/Qt4Qt5/qsciscintilla.cpp index 4ddad7c..4f0bf85 100644 --- a/Qt4Qt5/qsciscintilla.cpp +++ b/Qt4Qt5/qsciscintilla.cpp @@ -41,6 +41,14 @@ #include "Qsci/qscistyle.h" #include "Qsci/qscistyledtext.h" +//---OPENCOR--- BEGIN +struct QsciScintilla::Lexer +{ + QPointer object; +}; + +#define lex (lexerStruct->object) +//---OPENCOR--- END // Make sure these match the values in Scintilla.h. We don't #include that // file because it just causes more clashes. @@ -67,6 +75,9 @@ QsciScintilla::QsciScintilla(QWidget *parent) wchars(defaultWordChars), call_tips_position(CallTipsBelowText), call_tips_style(CallTipsNoContext), maxCallTips(-1), use_single(AcusNever), explicit_fillups(""), fillups_enabled(false) +//---OPENCOR--- BEGIN + , lexerStruct(new Lexer()) +//---OPENCOR--- END { connect(this,SIGNAL(SCN_MODIFYATTEMPTRO()), SIGNAL(modificationAttempted())); @@ -146,6 +157,9 @@ QsciScintilla::~QsciScintilla() doc.undisplay(this); delete stdCmds; +//---OPENCOR--- BEGIN + delete lexerStruct; +//---OPENCOR--- END } openscad-2019.05/patches/gettext.patch0000644000076500000240000000233613402025764020242 0ustar kintelstaff00000000000000diff -upr gettext-0.19.3.orig/gettext-runtime/intl/langprefs.c gettext-0.19.3/gettext-runtime/intl/langprefs.c --- gettext-0.19.3.orig/gettext-runtime/intl/langprefs.c 2013-03-07 09:44:37.000000000 +0100 +++ gettext-0.19.3/gettext-runtime/intl/langprefs.c 2016-11-06 12:40:20.000000000 +0100 @@ -269,7 +269,8 @@ _nl_language_preferences_default (void) in the preferences list, arrange for gettext() to return the msgid, and ignore all further elements of the preferences list. */ - if (strcmp (buf, "en") == 0) + if (strcmp (buf, "en") == 0 + || strncmp (buf, "en-", 3)) break; } else @@ -297,7 +298,8 @@ _nl_language_preferences_default (void) strcpy (p, buf); p += strlen (buf); *p++ = ':'; - if (strcmp (buf, "en") == 0) + if (strcmp (buf, "en") == 0 + || strncmp (buf, "en-", 3)) break; } else openscad-2019.05/patches/qt5/QTBUG-46846.patch0000644000076500000240000000226413402025764020642 0ustar kintelstaff00000000000000diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp index 83e94c4..80957e6 100644 --- a/src/widgets/widgets/qlabel.cpp +++ b/src/widgets/widgets/qlabel.cpp @@ -1076,14 +1076,16 @@ void QLabel::paintEvent(QPaintEvent *) if (d->pixmap && !d->pixmap->isNull()) { QPixmap pix; if (d->scaledcontents) { - if (!d->scaledpixmap || d->scaledpixmap->size() != cr.size()) { + QSize scaledSize = cr.size() * devicePixelRatio(); + if (!d->scaledpixmap || d->scaledpixmap->size() != scaledSize) { if (!d->cachedimage) d->cachedimage = new QImage(d->pixmap->toImage()); delete d->scaledpixmap; QImage scaledImage = - d->cachedimage->scaled(cr.size() * devicePixelRatio(), + d->cachedimage->scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); d->scaledpixmap = new QPixmap(QPixmap::fromImage(scaledImage)); + d->scaledpixmap->setDevicePixelRatio(devicePixelRatio()); } pix = *d->scaledpixmap; } else openscad-2019.05/patches/qt5/QTBUG-56004.patch0000644000076500000240000000117213402025764020622 0ustar kintelstaff00000000000000index 0cc8cd6..5df99d1 100644 --- a/mkspecs/features/mac/default_pre.prf +++ b/mkspecs/features/mac/default_pre.prf @@ -12,7 +12,7 @@ isEmpty(QMAKE_XCODE_DEVELOPER_PATH) { error("Xcode is not installed in $${QMAKE_XCODE_DEVELOPER_PATH}. Please use xcode-select to choose Xcode installation path.") # Make sure Xcode is set up properly - isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null"))): \ + isEmpty($$list($$system("/usr/bin/xcrun -find xcodebuild 2>/dev/null"))): \ error("Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.") } openscad-2019.05/patches/qt5/QTBUG-56004b.patch0000644000076500000240000000071413402025764020765 0ustar kintelstaff00000000000000--- a/configure 2016-10-29 19:29:27.000000000 -0600 +++ b/configure 2016-10-29 19:29:20.000000000 -0600 @@ -548,7 +548,7 @@ exit 2 fi - if ! /usr/bin/xcrun -find xcrun >/dev/null 2>&1; then + if ! /usr/bin/xcrun -find xcodebuild >/dev/null 2>&1; then echo >&2 echo " Xcode not set up properly. You may need to confirm the license" >&2 echo " agreement by running /usr/bin/xcodebuild without arguments." >&2 openscad-2019.05/patches/qt5/qt-5.9.7-macos.patch0000644000076500000240000000063013434420302021454 0ustar kintelstaff00000000000000--- qt-everywhere-opensource-src-5.9.7/qtbase/mkspecs/macx-clang/qmake.conf 2018-10-16 04:37:05.000000000 -0400 +++ qt-everywhere-opensource-src-5.9.7-new/qtbase/mkspecs/macx-clang/qmake.conf 2019-02-23 14:02:01.000000000 -0500 @@ -2,7 +2,7 @@ # qmake configuration for Clang on OS X # -QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.10 +QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 QMAKE_APPLE_DEVICE_ARCHS = x86_64 openscad-2019.05/patches/sparkle.patch0000644000076500000240000000122413402025764020212 0ustar kintelstaff00000000000000--- Sparkle-0ed83cf9f2eeb425d4fdd141c01a29d843970c20/SUConstants.h 2013-02-04 08:18:48.000000000 -0500 +++ Sparkle-new/SUConstants.h 2013-02-06 17:47:31.000000000 -0500 @@ -24,7 +24,7 @@ // If your app file on disk is named "MyApp 1.1b4", Sparkle usually updates it // in place, giving you an app named 1.1b4 that is actually 1.2. Turn the // following on to always reset the name back to "MyApp": -#define NORMALIZE_INSTALLED_APP_NAME 0 +#define NORMALIZE_INSTALLED_APP_NAME 1 #define TRY_TO_APPEND_VERSION_NUMBER 1 diff -ru Sparkle-0ed83cf9f2eeb425d4fdd141c01a29d843970c20/SUPlainInstallerInternals.m Sparkle-new/SUPlainInstallerInternals.m openscad-2019.05/patches/uuid-1.6.2.patch0000644000076500000240000000107213432700636020163 0ustar kintelstaff00000000000000diff -u uuid-1.6.2/Makefile.in uuid-1.6.2.new/Makefile.in --- uuid-1.6.2/Makefile.in 2008-03-08 13:31:40.000000000 -0500 +++ uuid-1.6.2.new/Makefile.in 2019-02-17 18:35:51.000000000 -0500 @@ -112,7 +112,7 @@ @$(LIBTOOL) --mode=compile $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $(LIB_NAME): $(LIB_OBJS) - @$(LIBTOOL) --mode=link $(CC) -o $(LIB_NAME) $(LIB_OBJS) -rpath $(libdir) \ + @$(LIBTOOL) --mode=link $(CC) -o $(LIB_NAME) $(LIB_OBJS) $(LDFLAGS) -rpath $(libdir) \ -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h` $(DCE_NAME): $(DCE_OBJS) openscad-2019.05/qt.pri0000644000076500000240000000020113402025764015233 0ustar kintelstaff00000000000000!lessThan(QT_MAJOR_VERSION, 5) { CONFIG += has_qt5 } has_qt5:!lessThan(QT_MINOR_VERSION, 4) { CONFIG += has_qopenglwidget } openscad-2019.05/releases/2010.01.md0000644000076500000240000000062113402025764017027 0ustar kintelstaff00000000000000* Added functions and statements * Added intersection_for() * Added str function * Added min and max function * Added color() statement * Added 2D Subsystem * New primitives: circle(), square() and polygon() * 2D->3D path: linear_extrude() and rotate_extrude() * Import of DXF to 2d subsystem: import_dxf() * Export of 2D data as DXF files * Some bugs fixed, maybe some new bugs added openscad-2019.05/releases/2010.02.md0000644000076500000240000000116413402025764017033 0ustar kintelstaff00000000000000* Added functions and statements * Added sqrt() function * Added round(), ceil() and floor() functions * Added lookup() function for linear interpolation in value list * Added projection(cut = true/false) statement * Added child() statement for accessing child nodes of module instances * Added mirror() statement * Improved DXF import code (more entities and some bugs fixed) * Added feature for dumping animation as PNG files * Added a preferences dialog * Now using CGAL's delaunay tesselator * Now using eigen2 for linear algebra * Reorganisation of the source tree * Some bugs fixed, maybe some new bugs added openscad-2019.05/releases/2010.05.md0000644000076500000240000000052313402025764017034 0ustar kintelstaff00000000000000* Added functions and statements * Added abs() function * Added exp(x), log(b, x), log(x) and ln(x) functions * Added minkowski() statement for 3d minkowski sums * Added 'include ' and 'use ' statements * Old implicit '' include statement is now obsolete * Some bugs fixed, maybe some new bugs added openscad-2019.05/releases/2011.04.md0000644000076500000240000000066213402025764017040 0ustar kintelstaff00000000000000* Added hull() for convex hulls (2D object only) * minkowski() now supports 2D objects * Added functions: rands(), sign() * Now supports escaping of the following characters in strings: \n, \t, \r, \\, \" * Support nested includes * Improved parsing of numbers * DXF: output LWPOLYLINE instead of just LINE entities * Bugfixes: More robust DXF export, setting $fs/$fa to 0 caused a crash * Some bugs fixed, maybe some new bugs added openscad-2019.05/releases/2011.06.md0000644000076500000240000000065013402025764017037 0ustar kintelstaff00000000000000* Added "Export as Image" menu. **Bugfixes:** * Cylinder tesselation broke existing models which are using cylinders for e.g. captured nut slots and are dependent on the orientation not changing. * DXF output couldn't be imported into e.g. AutoCAD and Solidworks after updating to using the AutoCAD 2000 (AC1015) format. Reverted to the old entity-only output, causing LWPOLYLINES to not exported allowed anymore. openscad-2019.05/releases/2011.12.md0000644000076500000240000000532413402025764017037 0ustar kintelstaff00000000000000**Features:** * The MCAD library is now bundled with OpenSCAD * Added len() function. Takes one vector or string parameter and returns its length. * The index operator [] now works on strings * The version() function will return the OpenSCAD version as a vector, e.g. [2011, 09] * The version_num() function will return the OpenSCAD version as a number, e.g. 20110923 * hull() Now supports 3D objects * hull() with 2D object can now use for loops and boolean operations as children * New import() statement reads the correct file format based on the filename extension (.stl, .dxf and .off is supported) * The color() statement now supports an alpha parameter, e.g. color(c=[1,0,0], alpha=0.4) * The color() statement now supports specifying colors as strings, e.g. color("Red") * The color() statement now overrides colors specified further down in the tree * if()/else() and the ternary operator can now take any value type as parameter. false, 0, empty string and empty vector or illegal value type will evaluate as false, everything else as true. * Strings can now be lexographically compared using the <, <=, >, >= operators * Added PI constant. * Number literals in scientific notation are now accepted by the parser * Added import and export of the OFF file format * Now uses standard shortcuts for save, reload and quit on Linux and Windows. F2/F3 will still work but is deprecated. **Bugfixes:** * Complex CSG models sometimes took extremely long time to normalize before OpenCSG preview * square() crashed if any of the dimensions were zero * Flush Caches didn't flush cached USE'd modules * STL export should be a bit more robust * Dropping a file into the editor under Windows didn't work (double C:/C:/ problem) * On some platforms it was possible to insertion rich text in the editor, causing confusion. * Less crashes due to CGAL assertions * OpenCSG should now work on systems with OpenGL 1.x, given that the right extensions are available * include now searches librarydir * The $fs parameter yielded only half the number of segments it should have * surface(center=true) is now correctly centered in the XY plane **Deprecations:** * dxf_linear_extrude() and dxf_rotate_extrude() are now deprecated. Use linear_extrude() and rotate_extrude() instead. * The file, layer, origin and scale parameters to linear_extrude() and rotate_extrude() are now deprecated. Use an import() child instead. * import_dxf(), import_stl() and import_off() are now deprecated. Use import() instead. * When exporting geometry from the cmd-line, use the universal -o option. It will export to the correct file format based on the given suffix (dxf, stl, off). The -x and -s parameters are still working but deprecated. * F2 and F3 for Save and Reload is now deprecated openscad-2019.05/releases/2013.01.md0000644000076500000240000000375413402025764017044 0ustar kintelstaff00000000000000**Features:** * Snappier GUI while performing CGAL computations (computations running in separate thread) * The size of the misc. caches can now be adjusted from Preferences * The limit for when to disable OpenCSG can now be adjusted from Preferences * Added Dot product operator: vec * vec * Added Matrix multiplication operator: vec * mat, mat * mat * Added search() function * Dependencies are now tracked - any changes in uses/included files will be detected and cause a recompile * The OPENSCADPATH environment variable is now implemented will have precedence when searching for libraries * .csg files can now be opened from the GUI * linear_extrude() will now assume that the first parameter means 'height' if it's a number **Bugfixes:** * use'ing an non-existing file sometimes crashed under Windows * Better font handling: Ensure a monospace font is chosen as default * Division by zero caused hang in some cases (e.g. sin(1/0)) * Larger minkowski operations sometimes caused a crash after a CGAL assert was thrown * Fixed crashes in shared_ptr.hpp (or similar places) due bugs in cache management and CSG normalization * scale() with a scale factor of zero could cause a crash * Fixed a number of issues related to use/include * Providing an unknown parameter on the cmd-line caused a crash * cmd-line overrides using -D now also work for USEd modules * Modifier characters can now be used in front of if statements * rotate() with a vector argument with less that 3 elements used uninitialized variables, ending up being non-deterministic. * .csg files will now have relative filenames whenever possible * Don't just ignore geometric nodes having zero volume/area - when doing difference/intersection, they tend to turn negative objects into positive ones. * Always use utf-8 file encoding, also under Windows * A lot of build script fixes * Some other crash bugs fixes **Deprecations:** * The old include syntax "" without the include keyword is no longer supported and will cause a syntax error. openscad-2019.05/releases/2013.06.md0000644000076500000240000000500213402025764017035 0ustar kintelstaff00000000000000**Language Features:** * linear_extrude now takes a scale parameter: linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) * Recursive use of modules is now supported (including cascading child() operations): https://github.com/openscad/openscad/blob/master/examples/example024.scad * Parameter list values can now depend on earlier values, e.g. for (i=[0:2], j=[0:i]) .. * value assignments in parameters can now depend on already declared parameters * Added resize() module: http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#resize **Program Features:** * Added basic syntax highlighting in the editor * There is now a built-in library path in user-space: http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries#Library_Locations * Commandline output to PNG, with various camera and rendering settings. Run openscad -h to see usage info or see the OpenSCAD wiki user manual. * Attempting to open dxf, off or stl files in the GUI will now create an import statement. * The preview operator (%) will now preserve any manually set color * The highlight operator (#) will now color the object in transparent red * Mac: Added document icon * Mac: Added auto-update check * Windows: Better cmd-line support using the openscad.com executable **Bugfixes:** * Importing files is now always relative to the importing script, also for libraries * We didn't always print a warning when CSG normalization created too many elements * Binary STLs can now be read on big endian architectures * Some binary STLs couldn't be read * Fixed some issues related to ARM builds * CGAL triangulation more lenient- enables partial rendering of 'bad' DXF data * The Automatic Reload feature is now more robust * If a file couldn't be saved it no longer fails silently * Fixed a number of crashes related to CGAL and OpenCSG rendering or complex models * The lookup() function had bad boundary condition behavior * The surface() module failed when the .dat file lacked a trailing newline * The hull() module could crash if any of the children were empty objects * Some problems using unicode filenames have been fixed **Misc:** * Build scripts have been further improved * Regression test now creates single monolithic .html file for easier uploading * Regression test auto-starts & stops Xvfb / Xvnc if on headless unix machine * The backend is finally independent of Qt * Windows: We now have a 64-bit version **Known Bugs:** * Linux: command-line png rendering on Gallium is flaky. Workaround: use CGAL --render or hardware rendering. openscad-2019.05/releases/2014.03.md0000644000076500000240000000432413402025764017041 0ustar kintelstaff00000000000000**Language Features:** * Added diameter argument: circle(d), cylinder(d, d1, d2) and sphere(d) * Added parent_module() and $parent_modules * Added children() as a replacement for child() * Unicode strings (using UTF-8) are now correctly handled * Ranges can have a negative step value * Added norm() and cross() functions **Program Features:** * Cmd-line: --info parameter prints system/library info * Cmd-line: --csglimit parameter to change CSG rendering limit * Cmd-line: Better handling of cmd-line arguments under Windows * GUI: Added Reset View * GUI: Added Search&Replace in editor * GUI: Syntax highlighting now has a dark background theme * GUI: We now create a backup file before rendering to allow for recovery if OpenSCAD crashes/freezes * GUI: Accessibility features enabled (e.g. screenreading) **Bugfixes/improvements:** * Reading empty STL files sometimes caused a crash * OPENSCADPATH now uses semicolon as path separator under Windows * polyhedron() is now much more robust handling almost planar polygons * Automatic reloads of large designs are more robust * Boolean logic in if() statements are now correctly short-circuited * rands() with zero range caused an infinite loop * resize(, auto=true) didn't work when shrinking objects * The $children variable sometimes misbehaved due to dynamic scoping * The --camera cmd-line option behaved differently then the corresponding GUI function * PNG export now doesn't leak transparency settings into the target image * Improved performance of 3D hull() operations * Some editor misbehaviors were fixed * Stability fixes of CGAL-related crashes * Windows cmd-line can now handle spaces in filenames * Default CSG rendering limit is now 100K elements * Fixed a crash reading DXF files using comma as decimal separator * Fixed a crash running the cmd-line without a HOME env. variable * Intersecting something with nothing now correctly results in an empty object **Deprecations:** * child() is no longer supported. Use children() instead. * polyhedron(triangles=[...]): Use polyhedron(faces=[...]) instead. **Misc:** * Test framework now shares more code with the GUI app * Test report can now be automatically uploaded to dinkypage.com * Better compatibility with BSD systems * Qt5 support openscad-2019.05/releases/2015.03.md0000644000076500000240000000567113402025764017050 0ustar kintelstaff00000000000000## 2015.03-3 **OS X only: Auto-update vulnerability fix** ## 2015.03-2 **Bugfixes** * \#1483 - Fix Z-fighting in Ortho view * \#1479 - No check for infinite $fn * \#1472 - "nan" in list comprehension causes crash * \#452 - rands() fails when the seed is a floating point number * \#1407 - Recursive module crash * \#1425 - Animate Filename Generation - Duplicate/Missing Filenames * \#1420 - expression-evaluation-tests fails on arm64 * \#1410 - Crash when a polygon contains NaN * \#1378 - Linear extrude plus infinite twist causes crash instead of just an error * \#1358 - Add more detailed installer information including version number * \#1356 - Crash when multiplying matrices with undefined elements * \#1350 - Saving file when HD is full ends up in data loss * \#1342 - Syntax Highlighting Does Not Work on Linux Mint 17.1 * \#1337 - Simple detection of script and direction based on given text * \#1325 - Crash when polygons with > 3 indices turn out to be degenerate * \#1329 - version() returned ```[0,0,0]``` ## 2015.03-1 **Bugfixes** * \#1203 - Linux: Missing icons on Xfce * \#1258 - Occasional crash when exporting STL * \#1260 - Minimal window width too large * \#1264 - Replace All sometimes caused a hang * \#1274 - Fixed some preview bugs on Intel GPUs (OpenCSG 1.4.0) * \#1276 - Module recursion sometimes caused a crash * \#1277 - Automatic reload sometimes messed up camera position * \#1284 - Animation flicker eliminated * \#1294 - Support reproducible builds * \#1317 - Normals vectors in STL were sometimes 0 0 0 ## 2015.03 **Language Features:** * Added text() module for 2D text * Added offset() module for 2D offsets * Added list comprehensions and let() * Added concat() function * Added chr() function * surface() can now take PNG images as input * min() and max() can now take a vector argument * 2D minkowski can now handle polygons with holes * Variables can now be assigned in local blocks without using assign() **Program Features:** * Added Toolbar icons * New code editor based on QScintilla * Added Splash screen * Added SVG export * Added AMF export * Added --viewall and --autocenter cmd-line parameters * GUI is now translated into German, Czech, Spanish, French and Russian * MDI (Multiple Document Interface) is now available on all platforms * Color schemes for viewer and editor can be user-edited using JSON files * GUI components are now dockable * Added Tickmarks on axes **Bugfixes/improvements:** * Performance improvement: 2D (clipper), preview, hull, minkowski, surface * Performance improvement: Reduce duplicate evaluation of identical expressions * Better recursion behavior * STL export and import is now more robust * Internal cavities are better supported * New examples * Windows cmd-line behaves better * Better mirror() and scale() behavior when using negative factors **Deprecations:** * polyhedron() now takes a faces= argument rather than triangles= * assign() is no longer needed. Local variables can be created in any scope openscad-2019.05/releases/2019.05.md0000644000076500000240000000332013465203575017052 0ustar kintelstaff00000000000000**Language Features:** * New modules * assert() - stop script evaluation on failed constraints * let() - scoped assignment * New functions * ord() - convert from character to Unicode code point * echo() * assert() - stop script evaluation on failed constraints * Type testing functions: is_undef(), is_list(), is_num(), is_bool(), is_string() * New special variable: $preview variable which is set to true in preview mode * List comprehension updates * Added if/else condition * Added each keyword * Added C-style for loop * Now allows looping over characters of a string * rotate_extrude(): Added angle parameter to * import() now supports SVG, 3MF and AMF * color() now supports hex color codes * Removed glide() and subdiv() which were never implemented **Program Features:** * Customizer: Allow parametrizing design parameters with GUI customization * Support for using 3D-Mouse / Joystick / Gamepad input devices for controlling the 3D view * 3D Printing support: Purchase from a print service partner or print to Octoprint * New export file formats: SVG, 3MF, AMF * Quick-edit and preview of values using Alt-Arrows (Shift-Alt-Arrows on macOS) * Added --view cmd-line parameter * Play sound notification on render complete * Line numbers and filenames are now shown for many errors and warnings * Hardwarning preference: Stop on first warning * Hardwarning and assert now shows a stack trace * New warnings * Module call parameterns don't match module declaration * Argument value of of range * Duplicate passed argument * Children passed to module not accepting children * Reference to inknown $special_variables * Duplicate assigment * New translations: Ukrainian, Polish openscad-2019.05/scripts/LogicLib.nsh0000644000076500000240000007301113402025764017771 0ustar kintelstaff00000000000000; NSIS LOGIC LIBRARY - LogicLib.nsh ; see mingw-file-association.nshmingw-file-association.nsh for license info ; Version 2.6 - 08/12/2007 ; By dselkirk@hotmail.com ; and eccles@users.sf.net ; with IfNot support added by Message ; ; Questions/Comments - ; See http://forums.winamp.com/showthread.php?s=&postid=1116241 ; ; Description: ; Provides the use of various logic statements within NSIS. ; ; Usage: ; The following "statements" are available: ; If|IfNot|Unless..{ElseIf|ElseIfNot|ElseUnless}..[Else]..EndIf|EndUnless ; - Conditionally executes a block of statements, depending on the value ; of an expression. IfNot and Unless are equivalent and ; interchangeable, as are ElseIfNot and ElseUnless. ; AndIf|AndIfNot|AndUnless|OrIf|OrIfNot|OrUnless ; - Adds any number of extra conditions to If, IfNot, Unless, ElseIf, ; ElseIfNot and ElseUnless statements. ; IfThen|IfNotThen..|..| ; - Conditionally executes an inline statement, depending on the value ; of an expression. ; IfCmd..||..| ; - Conditionally executes an inline statement, depending on a true ; value of the provided NSIS function. ; Select..{Case[2|3|4|5]}..[CaseElse|Default]..EndSelect ; - Executes one of several blocks of statements, depending on the value ; of an expression. ; Switch..{Case|CaseElse|Default}..EndSwitch ; - Jumps to one of several labels, depending on the value of an ; expression. ; Do[While|Until]..{ExitDo|Continue|Break}..Loop[While|Until] ; - Repeats a block of statements until stopped, or depending on the ; value of an expression. ; While..{ExitWhile|Continue|Break}..EndWhile ; - An alias for DoWhile..Loop (for backwards-compatibility) ; For[Each]..{ExitFor|Continue|Break}..Next ; - Repeats a block of statements varying the value of a variable. ; ; The following "expressions" are available: ; Standard (built-in) string tests (which are case-insensitive): ; a == b; a != b ; Additional case-insensitive string tests (using System.dll): ; a S< b; a S>= b; a S> b; a S<= b ; Case-sensitive string tests: ; a S== b; a S!= b ; Standard (built-in) signed integer tests: ; a = b; a <> b; a < b; a >= b; a > b; a <= b ; Standard (built-in) unsigned integer tests: ; a U< b; a U>= b; a U> b; a U<= b ; 64-bit integer tests (using System.dll): ; a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b ; Built-in NSIS flag tests: ; ${Abort}; ${Errors}; ${RebootFlag}; ${Silent} ; Built-in NSIS other tests: ; ${FileExists} a ; Any conditional NSIS instruction test: ; ${Cmd} a ; Section flag tests: ; ${SectionIsSelected} a; ${SectionIsSectionGroup} a; ; ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a; ; ${SectionIsReadOnly} a; ${SectionIsExpanded} a; ; ${SectionIsPartiallySelected} a ; ; Examples: ; See LogicLib.nsi in the Examples folder for lots of example usage. !verbose push !verbose 3 !ifndef LOGICLIB_VERBOSITY !define LOGICLIB_VERBOSITY 3 !endif !define _LOGICLIB_VERBOSITY ${LOGICLIB_VERBOSITY} !undef LOGICLIB_VERBOSITY !verbose ${_LOGICLIB_VERBOSITY} !ifndef LOGICLIB !define LOGICLIB !define | "'" !define || "' '" !define LOGICLIB_COUNTER 0 !include Sections.nsh !macro _LOGICLIB_TEMP !ifndef _LOGICLIB_TEMP !define _LOGICLIB_TEMP Var /GLOBAL _LOGICLIB_TEMP ; Temporary variable to aid the more elaborate logic tests !endif !macroend !macro _IncreaseCounter !define _LOGICLIB_COUNTER ${LOGICLIB_COUNTER} !undef LOGICLIB_COUNTER !define /math LOGICLIB_COUNTER ${_LOGICLIB_COUNTER} + 1 !undef _LOGICLIB_COUNTER !macroend !macro _PushLogic !insertmacro _PushScope Logic _LogicLib_Label_${LOGICLIB_COUNTER} !insertmacro _IncreaseCounter !macroend !macro _PopLogic !insertmacro _PopScope Logic !macroend !macro _PushScope Type label !ifdef _${Type} ; If we already have a statement !define _Cur${Type} ${_${Type}} !undef _${Type} !define _${Type} ${label} !define ${_${Type}}Prev${Type} ${_Cur${Type}} ; Save the current logic !undef _Cur${Type} !else !define _${Type} ${label} ; Initialise for first statement !endif !macroend !macro _PopScope Type !ifndef _${Type} !error "Cannot use _Pop${Type} without a preceding _Push${Type}" !endif !ifdef ${_${Type}}Prev${Type} ; If a previous statment was active then restore it !define _Cur${Type} ${_${Type}} !undef _${Type} !define _${Type} ${${_Cur${Type}}Prev${Type}} !undef ${_Cur${Type}}Prev${Type} !undef _Cur${Type} !else !undef _${Type} !endif !macroend ; String tests !macro _== _a _b _t _f StrCmp `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _!= _a _b _t _f !insertmacro _== `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Case-sensitive string tests !macro _S== _a _b _t _f StrCmpS `${_a}` `${_b}` `${_t}` `${_f}` !macroend !macro _S!= _a _b _t _f !insertmacro _S== `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Extra string tests (cannot do these case-sensitively - I tried and lstrcmp still ignored the case) !macro _StrCmpI _a _b _e _l _m !insertmacro _LOGICLIB_TEMP System::Call `kernel32::lstrcmpiA(ts, ts) i.s` `${_a}` `${_b}` Pop $_LOGICLIB_TEMP IntCmp $_LOGICLIB_TEMP 0 `${_e}` `${_l}` `${_m}` !macroend !macro _S< _a _b _t _f !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _S>= _a _b _t _f !insertmacro _S< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _S> _a _b _t _f !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _S<= _a _b _t _f !insertmacro _S> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Integer tests !macro _= _a _b _t _f IntCmp `${_a}` `${_b}` `${_t}` `${_f}` `${_f}` !macroend !macro _<> _a _b _t _f !insertmacro _= `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _< _a _b _t _f IntCmp `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _>= _a _b _t _f !insertmacro _< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _> _a _b _t _f IntCmp `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _<= _a _b _t _f !insertmacro _> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Unsigned integer tests (NB: no need for extra equality tests) !macro _U< _a _b _t _f IntCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` !macroend !macro _U>= _a _b _t _f !insertmacro _U< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _U> _a _b _t _f IntCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` !macroend !macro _U<= _a _b _t _f !insertmacro _U> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Int64 tests !macro _Int64Cmp _a _o _b _t _f !insertmacro _LOGICLIB_TEMP System::Int64Op `${_a}` `${_o}` `${_b}` Pop $_LOGICLIB_TEMP !insertmacro _= $_LOGICLIB_TEMP 0 `${_f}` `${_t}` !macroend !macro _L= _a _b _t _f !insertmacro _Int64Cmp `${_a}` = `${_b}` `${_t}` `${_f}` !macroend !macro _L<> _a _b _t _f !insertmacro _L= `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _L< _a _b _t _f !insertmacro _Int64Cmp `${_a}` < `${_b}` `${_t}` `${_f}` !macroend !macro _L>= _a _b _t _f !insertmacro _L< `${_a}` `${_b}` `${_f}` `${_t}` !macroend !macro _L> _a _b _t _f !insertmacro _Int64Cmp `${_a}` > `${_b}` `${_t}` `${_f}` !macroend !macro _L<= _a _b _t _f !insertmacro _L> `${_a}` `${_b}` `${_f}` `${_t}` !macroend ; Flag tests !macro _Abort _a _b _t _f IfAbort `${_t}` `${_f}` !macroend !define Abort `"" Abort ""` !macro _Errors _a _b _t _f IfErrors `${_t}` `${_f}` !macroend !define Errors `"" Errors ""` !macro _FileExists _a _b _t _f IfFileExists `${_b}` `${_t}` `${_f}` !macroend !define FileExists `"" FileExists` !macro _RebootFlag _a _b _t _f IfRebootFlag `${_t}` `${_f}` !macroend !define RebootFlag `"" RebootFlag ""` !macro _Silent _a _b _t _f IfSilent `${_t}` `${_f}` !macroend !define Silent `"" Silent ""` ; "Any instruction" test !macro _Cmd _a _b _t _f !define _t=${_t} !ifdef _t= ; If no true label then make one !define __t _LogicLib_Label_${LOGICLIB_COUNTER} !insertmacro _IncreaseCounter !else !define __t ${_t} !endif ${_b} ${__t} !define _f=${_f} !ifndef _f= ; If a false label then go there Goto ${_f} !endif !undef _f=${_f} !ifdef _t= ; If we made our own true label then place it ${__t}: !endif !undef __t !undef _t=${_t} !macroend !define Cmd `"" Cmd` ; Section flag test !macro _SectionFlagIsSet _a _b _t _f !insertmacro _LOGICLIB_TEMP SectionGetFlags `${_b}` $_LOGICLIB_TEMP IntOp $_LOGICLIB_TEMP $_LOGICLIB_TEMP & `${_a}` !insertmacro _= $_LOGICLIB_TEMP `${_a}` `${_t}` `${_f}` !macroend !define SectionIsSelected `${SF_SELECTED} SectionFlagIsSet` !define SectionIsSubSection `${SF_SUBSEC} SectionFlagIsSet` !define SectionIsSubSectionEnd `${SF_SUBSECEND} SectionFlagIsSet` !define SectionIsSectionGroup `${SF_SECGRP} SectionFlagIsSet` !define SectionIsSectionGroupEnd `${SF_SECGRPEND} SectionFlagIsSet` !define SectionIsBold `${SF_BOLD} SectionFlagIsSet` !define SectionIsReadOnly `${SF_RO} SectionFlagIsSet` !define SectionIsExpanded `${SF_EXPAND} SectionFlagIsSet` !define SectionIsPartiallySelected `${SF_PSELECTED} SectionFlagIsSet` !define IfCmd `!insertmacro _IfThen "" Cmd ${|}` !macro _If _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !define ${_Logic}If !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the Else !insertmacro _IncreaseCounter !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} !verbose pop !macroend !define If `!insertmacro _If true` !define Unless `!insertmacro _If false` !define IfNot `!insertmacro _If false` !macro _And _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use And without a preceding If or IfNot/Unless" !endif !ifndef ${_Logic}Else !error "Cannot use And following an Else" !endif !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} !verbose pop !macroend !define AndIf `!insertmacro _And true` !define AndUnless `!insertmacro _And false` !define AndIfNot `!insertmacro _And false` !macro _Or _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use Or without a preceding If or IfNot/Unless" !endif !ifndef ${_Logic}Else !error "Cannot use Or following an Else" !endif !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Skip this test as we already !insertmacro _IncreaseCounter Goto ${_label} ; have a successful result ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If !insertmacro _IncreaseCounter !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} ${_label}: !undef _label !verbose pop !macroend !define OrIf `!insertmacro _Or true` !define OrUnless `!insertmacro _Or false` !define OrIfNot `!insertmacro _Or false` !macro _Else !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use Else without a preceding If or IfNot/Unless" !endif !ifndef ${_Logic}Else !error "Cannot use Else following an Else" !endif !ifndef ${_Logic}EndIf ; First Else for this If? !define ${_Logic}EndIf _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the EndIf !insertmacro _IncreaseCounter !endif Goto ${${_Logic}EndIf} ; Go to the EndIf ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !verbose pop !macroend !define Else `!insertmacro _Else` !macro _ElseIf _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} ${Else} ; Perform the Else !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If !insertmacro _IncreaseCounter !define _c=${_c} !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" !endif !undef _c=${_c} !verbose pop !macroend !define ElseIf `!insertmacro _ElseIf true` !define ElseUnless `!insertmacro _ElseIf false` !define ElseIfNot `!insertmacro _ElseIf false` !macro _EndIf _n !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}If !error "Cannot use End${_n} without a preceding If or IfNot/Unless" !endif !ifdef ${_Logic}Else ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !endif !ifdef ${_Logic}EndIf ${${_Logic}EndIf}: ; Place the EndIf !undef ${_Logic}EndIf ; and remove it !endif !undef ${_Logic}If !insertmacro _PopLogic !verbose pop !macroend !define EndIf `!insertmacro _EndIf If` !define EndUnless `!insertmacro _EndIf Unless` !macro _IfThen _a _o _b _t !verbose push !verbose ${LOGICLIB_VERBOSITY} ${If} `${_a}` `${_o}` `${_b}` ${_t} ${EndIf} !verbose pop !macroend !define IfThen `!insertmacro _IfThen` !macro _IfNotThen _a _o _b _t !verbose push !verbose ${LOGICLIB_VERBOSITY} ${IfNot} `${_a}` `${_o}` `${_b}` ${_t} ${EndIf} !verbose pop !macroend !define IfNotThen `!insertmacro _IfNotThen` !macro _ForEach _v _f _t _o _s !verbose push !verbose ${LOGICLIB_VERBOSITY} StrCpy "${_v}" "${_f}" ; Assign the initial value Goto +2 ; Skip the loop expression for the first iteration !define _DoLoopExpression `IntOp "${_v}" "${_v}" "${_o}" "${_s}"` ; Define the loop expression !define _o=${_o} !ifdef _o=+ ; Check the loop expression operator !define __o > ; to determine the correct loop condition !else ifdef _o=- !define __o < !else !error "Unsupported ForEach step operator (must be + or -)" !endif !undef _o=${_o} !insertmacro _Do For false `${_v}` `${__o}` `${_t}` ; Let Do do the rest !undef __o !verbose pop !macroend !define ForEach `!insertmacro _ForEach` !macro _For _v _f _t !verbose push !verbose ${LOGICLIB_VERBOSITY} ${ForEach} `${_v}` `${_f}` `${_t}` + 1 ; Pass on to ForEach !verbose pop !macroend !define For `!insertmacro _For` !define ExitFor `!insertmacro _Goto ExitFor For` !define Next `!insertmacro _Loop For Next "" "" "" ""` !define While `!insertmacro _Do While true` !define ExitWhile `!insertmacro _Goto ExitWhile While` !define EndWhile `!insertmacro _Loop While EndWhile "" "" "" ""` !macro _Do _n _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !define ${_Logic}${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the start of the loop !insertmacro _IncreaseCounter ${${_Logic}${_n}}: !insertmacro _PushScope Exit${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the loop !insertmacro _IncreaseCounter !insertmacro _PushScope Break ${_Exit${_n}} ; Break goes to the end of the loop !ifdef _DoLoopExpression ${_DoLoopExpression} ; Special extra parameter for inserting code !undef _DoLoopExpression ; between the Continue label and the loop condition !endif !define _c=${_c} !ifdef _c= ; No starting condition !insertmacro _PushScope Continue _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for Continue at the end of the loop !insertmacro _IncreaseCounter !else !insertmacro _PushScope Continue ${${_Logic}${_n}} ; Continue goes to the start of the loop !ifdef _c=true ; If is true !insertmacro _${_o} `${_a}` `${_b}` "" ${_Exit${_n}} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} "" !endif !endif !undef _c=${_c} !define ${_Logic}Condition ${_c} ; Remember the condition used !verbose pop !macroend !define Do `!insertmacro _Do Do "" "" "" ""` !define DoWhile `!insertmacro _Do Do true` !define DoUntil `!insertmacro _Do Do false` !macro _Goto _n _s !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _${_n} !error "Cannot use ${_n} without a preceding ${_s}" !endif Goto ${_${_n}} !verbose pop !macroend !define ExitDo `!insertmacro _Goto ExitDo Do` !macro _Loop _n _e _c _a _o _b !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}${_n} !error "Cannot use ${_e} without a preceding ${_n}" !endif !define _c=${${_Logic}Condition} !ifdef _c= ; If Do had no condition place the Continue label ${_Continue}: !endif !undef _c=${${_Logic}Condition} !define _c=${_c} !ifdef _c= ; No ending condition Goto ${${_Logic}${_n}} !else ifdef _c=true ; If condition is true !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}${_n}} ${_Exit${_n}} !else ; If condition is false !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} ${${_Logic}${_n}} !endif !undef _c=${_c} Goto ${_Continue} ; Just to ensure it is referenced at least once Goto ${_Exit${_n}} ; Just to ensure it is referenced at least once ${_Exit${_n}}: ; Place the loop exit point !undef ${_Logic}Condition !insertmacro _PopScope Continue !insertmacro _PopScope Break !insertmacro _PopScope Exit${_n} !undef ${_Logic}${_n} !insertmacro _PopLogic !verbose pop !macroend !define Loop `!insertmacro _Loop Do Loop "" "" "" ""` !define LoopWhile `!insertmacro _Loop Do LoopWhile true` !define LoopUntil `!insertmacro _Loop Do LoopUntil false` !define Continue `!insertmacro _Goto Continue "For or Do or While"` !define Break `!insertmacro _Goto Break "For or Do or While"` !macro _Select _a !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !define ${_Logic}Select `${_a}` ; Remember the left hand side of the comparison !verbose pop !macroend !define Select `!insertmacro _Select` !macro _Select_CaseElse !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}Select !error "Cannot use Case without a preceding Select" !endif !ifdef ${_Logic}EndSelect ; This is set only after the first case !ifndef ${_Logic}Else !error "Cannot use Case following a CaseElse" !endif Goto ${${_Logic}EndSelect} ; Go to the EndSelect ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !else !define ${_Logic}EndSelect _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the EndSelect !insertmacro _IncreaseCounter !endif !verbose pop !macroend !define CaseElse `!insertmacro _CaseElse` !define Case_Else `!insertmacro _CaseElse` ; Compatibility with 2.2 and earlier !define Default `!insertmacro _CaseElse` ; For the C-minded !macro _Select_Case _a !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` "" ${${_Logic}Else} !verbose pop !macroend !define Case `!insertmacro _Case` !macro _Case2 _a _b !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_b}` "" ${${_Logic}Else} !verbose pop !macroend !define Case2 `!insertmacro _Case2` !macro _Case3 _a _b _c !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +3 "" !insertmacro _== `${${_Logic}Select}` `${_b}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_c}` "" ${${_Logic}Else} !verbose pop !macroend !define Case3 `!insertmacro _Case3` !macro _Case4 _a _b _c _d !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +4 "" !insertmacro _== `${${_Logic}Select}` `${_b}` +3 "" !insertmacro _== `${${_Logic}Select}` `${_c}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_d}` "" ${${_Logic}Else} !verbose pop !macroend !define Case4 `!insertmacro _Case4` !macro _Case5 _a _b _c _d _e !verbose push !verbose ${LOGICLIB_VERBOSITY} ${CaseElse} ; Perform the CaseElse !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case !insertmacro _IncreaseCounter !insertmacro _== `${${_Logic}Select}` `${_a}` +5 "" !insertmacro _== `${${_Logic}Select}` `${_b}` +4 "" !insertmacro _== `${${_Logic}Select}` `${_c}` +3 "" !insertmacro _== `${${_Logic}Select}` `${_d}` +2 "" !insertmacro _== `${${_Logic}Select}` `${_e}` "" ${${_Logic}Else} !verbose pop !macroend !define Case5 `!insertmacro _Case5` !macro _EndSelect !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}Select !error "Cannot use EndSelect without a preceding Select" !endif !ifdef ${_Logic}Else ${${_Logic}Else}: ; Place the Else label !undef ${_Logic}Else ; and remove it !endif !ifdef ${_Logic}EndSelect ; This won't be set if there weren't any cases ${${_Logic}EndSelect}: ; Place the EndSelect !undef ${_Logic}EndSelect ; and remove it !endif !undef ${_Logic}Select !insertmacro _PopLogic !verbose pop !macroend !define EndSelect `!insertmacro _EndSelect` !macro _Switch _a !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushLogic !insertmacro _PushScope Switch ${_Logic} ; Keep a separate stack for switch data !insertmacro _PushScope Break _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a lable for beyond the end of the switch !insertmacro _IncreaseCounter !define ${_Switch}Var `${_a}` ; Remember the left hand side of the comparison !tempfile ${_Switch}Tmp ; Create a temporary file !define ${_Logic}Switch _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the switch !insertmacro _IncreaseCounter Goto ${${_Logic}Switch} ; and go there !verbose pop !macroend !define Switch `!insertmacro _Switch` !macro _Case _a !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifdef _Logic & ${_Logic}Select ; Check for an active Select !insertmacro _Select_Case `${_a}` !else ifndef _Switch ; If not then check for an active Switch !error "Cannot use Case without a preceding Select or Switch" !else !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for this case, !insertmacro _IncreaseCounter ${_label}: ; place it and add it's check to the temp file !appendfile "${${_Switch}Tmp}" `!insertmacro _== $\`${${_Switch}Var}$\` $\`${_a}$\` ${_label} ""$\n` !undef _label !endif !verbose pop !macroend !macro _CaseElse !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifdef _Logic & ${_Logic}Select ; Check for an active Select !insertmacro _Select_CaseElse !else ifndef _Switch ; If not then check for an active Switch !error "Cannot use Case without a preceding Select or Switch" !else ifdef ${_Switch}Else ; Already had a default case? !error "Cannot use CaseElse following a CaseElse" !else !define ${_Switch}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the default case, !insertmacro _IncreaseCounter ${${_Switch}Else}: ; and place it !endif !verbose pop !macroend !macro _EndSwitch !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _Logic | ${_Logic}Switch !error "Cannot use EndSwitch without a preceding Switch" !endif Goto ${_Break} ; Skip the jump table ${${_Logic}Switch}: ; Place the end of the switch !undef ${_Logic}Switch !include "${${_Switch}Tmp}" ; Include the jump table !delfile "${${_Switch}Tmp}" ; and clear it up !ifdef ${_Switch}Else ; Was there a default case? Goto ${${_Switch}Else} ; then go there if all else fails !undef ${_Switch}Else !endif !undef ${_Switch}Tmp !undef ${_Switch}Var ${_Break}: ; Place the break label !insertmacro _PopScope Break !insertmacro _PopScope Switch !insertmacro _PopLogic !verbose pop !macroend !define EndSwitch `!insertmacro _EndSwitch` !endif ; LOGICLIB !verbose 3 !define LOGICLIB_VERBOSITY ${_LOGICLIB_VERBOSITY} !undef _LOGICLIB_VERBOSITY !verbose pop openscad-2019.05/scripts/batch-2d.sh0000755000076500000240000000051013402025764017510 0ustar kintelstaff00000000000000#!/bin/sh cmd="openscad" [ -x "./openscad" ] && cmd="./openscad" [ -x "./OpenSCAD.app/Contents/MacOS/OpenSCAD" ] && cmd="./OpenSCAD.app/Contents/MacOS/OpenSCAD" mkdir -p output for f in testdata/dxf/*.dxf; do echo `basename $f` cat > tmp.scad << EOF import_dxf("$f"); EOF "$cmd" -x output/`basename $f` tmp.scad done openscad-2019.05/scripts/batch-examples-stl.sh0000755000076500000240000000025513402025764021627 0ustar kintelstaff00000000000000#!/bin/sh SCRIPTDIR=`dirname $0` mkdir -p output for f in examples/*.scad; do echo `basename $f .scad` $SCRIPTDIR/create-stl.sh $f output/`basename $f .scad`.stl done openscad-2019.05/scripts/batch-tests-stl.sh0000755000076500000240000000045213402025764021152 0ustar kintelstaff00000000000000#!/bin/sh cmd="openscad" [ -x "./openscad" ] && cmd="./openscad" [ -x "./OpenSCAD.app/Contents/MacOS/OpenSCAD" ] && cmd="./OpenSCAD.app/Contents/MacOS/OpenSCAD" mkdir -p output for f in testdata/scad/*-tests.scad; do echo `basename $f .scad` "$cmd" -s output/`basename $f .scad`.stl $f done openscad-2019.05/scripts/beautify.sh0000755000076500000240000000316513402025764017745 0ustar kintelstaff00000000000000#!/bin/bash # Reformat C++ code using clang-format SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR=$SCRIPT_DIR/.. # note: with the -style=file option, clang-format reads the config from ./.clang-format # See here for the full list of supported options: https://clang.llvm.org/docs/ClangFormatStyleOptions.html FORMAT_CMD_CLANG_FORMAT="clang-format -i -style=file" FORMAT_CMD_UNCRUSTIFY="uncrustify -c "$ROOT_DIR/.uncrustify.cfg" --no-backup" FORMAT_CMD=$FORMAT_CMD_UNCRUSTIFY # Filter out any files that shouldn't be auto-formatted. # note: -v flag inverts selection - this tells grep to *filter out* anything # that matches the pattern. For testing, you can remove the -v to ssee # which files would have been excluded. FILTER_CMD="grep -v -E ext/" function reformat_all() { find "$ROOT_DIR/src" -name "*.h" -o -name "*.hpp" -o -name "*.cc" -o -name "*.cpp" \ | $FILTER_CMD \ | xargs $FORMAT_CMD } # reformat files that differ from master. DIFFBASE="origin/master" function reformat_changed() { ANCESTOR=$(git merge-base HEAD "$DIFFBASE") FILES=$(git --no-pager diff --name-only $ANCESTOR | grep -E "\.(h|hpp|cc|cpp)" | $FILTER_CMD) if [ $? -ne 0 ]; then echo "No files to format, exiting..." else echo -e "Reformatting files:\n$FILES" echo $FILES | xargs $FORMAT_CMD fi } # main if [ "`echo $* | grep clang`" ]; then FORMAT_CMD=$FORMAT_CMD_CLANG_FORMAT fi if [ "`echo $* | grep -- --all`" ]; then echo "Reformatting all files..." reformat_all else echo "Reformatting files that differ from $DIFFBASE..." reformat_changed fi openscad-2019.05/scripts/builder.sh0000755000076500000240000003057013423115164017560 0ustar kintelstaff00000000000000#!/usr/bin/env bash # build&upload script for linux & windows snapshot binaries # # Usage: # # Start with a clean directory. For example: # # mkdir builder # cd builder # # Then run this script, or optionally the 'build only' or 'upload only' version # # /some/path/openscad/builder.sh # standard build & upload # /some/path/openscad/builder.sh buildonly # only do build, dont upload # /some/path/openscad/builder.sh uploadonly # only upload, dont build # Notes: # # This script is designed to build a 'clean' version of openscad directly # from the openscad github master source code. It will then optionally # upload the build to the OpenSCAD official file repository, and modify # the OpenSCAD website with links to the most recently built files. # # # For the mingw- cross build for Windows(TM) this script does a massive # 'from nothing' build, including downloading and building an MXE cross # environment, and dependencies, into $HOME/openscad_deps. This can take # many many many hours and use several gigabytes of disk space. # # This script itself is designed to call other scripts that do the heavy # lifting. This script itself should be kept relatively simple. # # # requirements - # see http://mxe.cc for required tools (scons, perl, yasm, etc etc etc) # # todo - can we build 32 bit linux from within 64 bit linux? # # todo - make linux work # # todo - detect failure and stop # # todo - generalize to build release binaries as well # init_variables() { #BRANCH_TO_BUILD=unstable BRANCH_TO_BUILD=master STARTPATH=$PWD # kilobit (not kilobyte!) per second for scp upload RATELIMIT=420 DOBUILD=1 DOUPLOAD=1 DRYRUN= DOSNAPSHOT=1 DOLOOP= #solar day LOOPSLEEP=86400 DATECODE=`date +"%Y.%m.%d"` if [ "`echo $* | grep loop`" ]; then echo "----------------------------" echo "loop mode activated! woopee!" echo "----------------------------" DOLOOP=1 fi if [ "`echo $* | grep release`" ]; then echo "this script cannot yet build releases, only snapshots" DOSNAPSHOT= exit 1 fi if [ "`echo $* | grep uploadonly`" ]; then DOUPLOAD=1 DOBUILD= fi if [ "`echo $* | grep buildonly`" ]; then DOUPLOAD= DOBUILD=1 fi if [ "`echo $* | grep dry`" ]; then DRYRUN=1 fi export STARTPATH export BRANCH_TO_BUILD export DOBUILD export DOUPLOAD export DRYRUN export DATECODE export DOSNAPSHOT export DOLOOP export LOOPSLEEP export RATELIMIT export DATECODE } check_starting_path() { cd $STARTPATH if [ -e openscad.pro ]; then echo 'please start from a clean directory outside of openscad' exit fi } check_nsis() { # 64 bit mingw-cross build MXE cannot build nsis.... for now, we can # just ask the user to install their system's nsis package. # (it might be possible to d/l & build nsis here, or use pre-existing # 32-bit-mxe nsis) if [ ! "`command -v makensis`" ]; then echo the makensis command was not found. echo please install nsis for your system. for example echo on debian, sudo apt-get install nsis exit 1 else echo makensis found. fi } check_zip() { if [ ! "`command -v zip`" ]; then echo the zip command was not found. please install zip echo on debian, sudo apt-get install zip exit 1 else echo zip found. fi } get_openscad_source_code() { if [ -d openscad ]; then cd openscad if [ $? -ne 0 ]; then echo cd to 'openscad' directory failed exit 1 fi git checkout $BRANCH_TO_BUILD if [ $? -ne 0 ]; then echo git checkout $BRANCH_TO_BUILD failed exit 1 fi git fetch -a if [ $? -ne 0 ]; then echo git fetch -a openscad source code failed exit 1 fi git pull origin $BRANCH_TO_BUILD if [ $? -ne 0 ]; then echo git pull origin $BRANCH_TO_BUILD failed exit 1 fi git submodule update # MCAD return else git clone http://github.com/openscad/openscad.git fi if [ $? -eq 0 ]; then echo clone of source code is ok else if [ $DOUPLOAD ]; then if [ ! $DOBUILD ]; then echo upload only - skipping openscad git clone fi else echo clone of openscad source code failed. exiting exit 1 fi fi cd openscad git checkout $BRANCH_TO_BUILD if [ $? -ne 0 ]; then echo git checkout $BRANCH_TO_BUILD failed exit 1 fi git submodule update --init # MCAD } build_win32() { . ./scripts/setenv-mingw-xbuild.sh clean . ./scripts/setenv-mingw-xbuild.sh ./scripts/mingw-x-build-dependencies.sh if [ $DOSNAPSHOT ] ; then ./scripts/release-common.sh snapshot mingw32 tests else echo "this script cant yet build releases, only snapshots" exit 1 fi if [ $? -eq 0 ]; then echo build of win32 stage over else echo build of win32 failed. exiting exit 1 fi } build_win64() { . ./scripts/setenv-mingw-xbuild.sh clean . ./scripts/setenv-mingw-xbuild.sh 64 ./scripts/mingw-x-build-dependencies.sh 64 if [ $DOSNAPSHOT ] ; then ./scripts/release-common.sh snapshot mingw64 tests else echo "this script cant yet build releases, only snapshots" exit 1 fi if [ $? -eq 0 ]; then echo build of win64 stage over else echo build of win64 failed. exiting exit 1 fi } build_lin32() { . ./scripts/setenv-unibuild.sh ./scripts/uni-build-dependencies.sh if [ $DOSNAPSHOT ] ; then ./scripts/release-common.sh snapshot else echo "this script cant yet build releases, only snapshots" exit 1 fi } upload_win_common() { summary="$1" username=$2 filename=$3 if [ -f $filename ]; then echo 'file "'$filename'" found' else echo 'file "'$filename'" not found' exit 1 fi opts= opts="$opts -p openscad" opts="$opts -u $username" opts="$opts $filename" remotepath=www/ if [ $DOSNAPSHOT ]; then remotepath=www/snapshots/ fi if [ $DRYRUN ]; then echo dry run, not uploading to files.openscad.org echo scp -v -l $RATELIMIT $filename openscad@files.openscad.org:$remotepath else scp -v -l $RATELIMIT $filename openscad@files.openscad.org:$remotepath fi } upload_win32() { SUMMARY1="Windows x86-32 Snapshot Installer" SUMMARY2="Windows x86-32 Snapshot Zipfile" SUMMARY3="Windows x86-32 Snapshot Tests" BASEDIR=./mingw32.static/ WIN32_PACKAGEFILE1=OpenSCAD-$DATECODE-x86-32-Installer.exe WIN32_PACKAGEFILE2=OpenSCAD-$DATECODE-x86-32.zip WIN32_PACKAGEFILE3=OpenSCAD-Tests-$DATECODE-x86-32.zip upload_win_common "$SUMMARY1" $USERNAME $BASEDIR/$WIN32_PACKAGEFILE1 upload_win_common "$SUMMARY2" $USERNAME $BASEDIR/$WIN32_PACKAGEFILE2 upload_win_common "$SUMMARY3" $USERNAME $BASEDIR/$WIN32_PACKAGEFILE3 export WIN32_PACKAGEFILE1 export WIN32_PACKAGEFILE2 export WIN32_PACKAGEFILE3 WIN32_PACKAGEFILE1_SIZE=`ls -sh $BASEDIR/$WIN32_PACKAGEFILE1 | awk ' {print $1} ';` WIN32_PACKAGEFILE2_SIZE=`ls -sh $BASEDIR/$WIN32_PACKAGEFILE2 | awk ' {print $1} ';` WIN32_PACKAGEFILE3_SIZE=`ls -sh $BASEDIR/$WIN32_PACKAGEFILE3 | awk ' {print $1} ';` WIN32_PACKAGEFILE1_SIZE=`echo "$WIN32_PACKAGEFILE1_SIZE""B"` WIN32_PACKAGEFILE2_SIZE=`echo "$WIN32_PACKAGEFILE2_SIZE""B"` WIN32_PACKAGEFILE3_SIZE=`echo "$WIN32_PACKAGEFILE3_SIZE""B"` export WIN32_PACKAGEFILE1_SIZE export WIN32_PACKAGEFILE2_SIZE export WIN32_PACKAGEFILE3_SIZE } upload_win64() { SUMMARY1="Windows x86-64 Snapshot Zipfile" SUMMARY2="Windows x86-64 Snapshot Installer" SUMMARY3="Windows x86-64 Snapshot Tests" BASEDIR=./mingw64.static/ WIN64_PACKAGEFILE1=OpenSCAD-$DATECODE-x86-64-Installer.exe WIN64_PACKAGEFILE2=OpenSCAD-$DATECODE-x86-64.zip WIN64_PACKAGEFILE3=OpenSCAD-Tests-$DATECODE-x86-64.zip upload_win_common "$SUMMARY1" $USERNAME $BASEDIR/$WIN64_PACKAGEFILE1 upload_win_common "$SUMMARY2" $USERNAME $BASEDIR/$WIN64_PACKAGEFILE2 upload_win_common "$SUMMARY3" $USERNAME $BASEDIR/$WIN64_PACKAGEFILE3 export WIN64_PACKAGEFILE1 export WIN64_PACKAGEFILE2 export WIN64_PACKAGEFILE3 WIN64_PACKAGEFILE1_SIZE=`ls -sh $BASEDIR/$WIN64_PACKAGEFILE1 | awk ' {print $1} ';` WIN64_PACKAGEFILE2_SIZE=`ls -sh $BASEDIR/$WIN64_PACKAGEFILE2 | awk ' {print $1} ';` WIN64_PACKAGEFILE3_SIZE=`ls -sh $BASEDIR/$WIN64_PACKAGEFILE3 | awk ' {print $1} ';` WIN64_PACKAGEFILE1_SIZE=`echo "$WIN64_PACKAGEFILE1_SIZE""B"` WIN64_PACKAGEFILE2_SIZE=`echo "$WIN64_PACKAGEFILE2_SIZE""B"` WIN64_PACKAGEFILE3_SIZE=`echo "$WIN64_PACKAGEFILE3_SIZE""B"` export WIN64_PACKAGEFILE1_SIZE export WIN64_PACKAGEFILE2_SIZE export WIN64_PACKAGEFILE3_SIZE } read_username_from_user() { if [ $DRYRUN ]; then USERNAME=none;export USERNAME; return; fi echo 'Google code upload is deprecated' USERNAME=$USER echo 'username is ' $USERNAME return echo 'Please enter your username for https://code.google.com/hosting/settings' echo -n 'Username:' read USERNAME echo 'username is ' $USERNAME return } read_password_from_user() { if [ $DRYRUN ]; then return; fi echo 'Google code upload is deprecated' return echo 'Please enter your password for https://code.google.com/hosting/settings' echo -n 'Password:' read -s PASSWORD1 echo echo -n 'Verify :' read -s PASSWORD2 echo if [ ! $PASSWORD1 = $PASSWORD2 ]; then echo 'error - passwords dont match' exit fi OSUPL_PASSWORD=$PASSWORD1 export OSUPL_PASSWORD } update_win_www_download_links() { cd $STARTPATH rm -rf ./openscad.github.com git clone git@github.com:openscad/openscad.github.com.git cd openscad.github.com cd inc echo `pwd` # BASEURL='https://openscad.googlecode.com/files/' BASEURL='http://files.openscad.org/' if [ $DOSNAPSHOT ]; then BASEURL='http://files.openscad.org/snapshots/' fi mv win_snapshot_links.js win_snapshot_links.js.backup rm win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT1_URL'] = '$BASEURL$WIN64_PACKAGEFILE1'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT2_URL'] = '$BASEURL$WIN64_PACKAGEFILE2'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT3_URL'] = '$BASEURL$WIN64_PACKAGEFILE3'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT1_NAME'] = 'OpenSCAD $DATECODE'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT2_NAME'] = 'OpenSCAD $DATECODE'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT3_NAME'] = 'OpenSCAD Tests $DATECODE'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT1_SIZE'] = '$WIN64_PACKAGEFILE1_SIZE'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT2_SIZE'] = '$WIN64_PACKAGEFILE2_SIZE'" >> win_snapshot_links.js echo "fileinfo['WIN64_SNAPSHOT3_SIZE'] = '$WIN64_PACKAGEFILE3_SIZE'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT1_URL'] = '$BASEURL$WIN32_PACKAGEFILE1'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT2_URL'] = '$BASEURL$WIN32_PACKAGEFILE2'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT3_URL'] = '$BASEURL$WIN32_PACKAGEFILE3'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT1_NAME'] = 'OpenSCAD $DATECODE'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT2_NAME'] = 'OpenSCAD $DATECODE'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT3_NAME'] = 'OpenSCAD Tests $DATECODE'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT1_SIZE'] = '$WIN32_PACKAGEFILE1_SIZE'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT2_SIZE'] = '$WIN32_PACKAGEFILE2_SIZE'" >> win_snapshot_links.js echo "fileinfo['WIN32_SNAPSHOT3_SIZE'] = '$WIN32_PACKAGEFILE3_SIZE'" >> win_snapshot_links.js echo 'modified win_snapshot_links.js' PAGER=cat git diff if [ ! $DRYRUN ]; then git commit -a -m 'builder.sh - updated snapshot links' git push origin master else echo dry run, not updating www links fi cd $STARTPATH } # FIXME: We might be running this locally and not need an ssh agent. # Before checking $SSH_AUTH_SOCK, try 'ssh -T git@github.com' to verify that we # can access github over ssh check_ssh_agent() { if [ $DRYRUN ]; then echo 'skipping ssh, dry run'; return; fi if [ $SSH_AUTH_SKIP ]; then return fi if [ ! $SSH_AUTH_SOCK ]; then echo 'please start an ssh-agent for github.com/openscad/openscad.github.com uploads' echo 'for example:' echo echo ' ssh-agent > .tmp && source .tmp && ssh-add' echo echo 'to force a run anyway, set SSH_AUTH_SKIP environment variable to 1' exit 1 fi } main() { init_variables $* if [ $DOUPLOAD ]; then check_ssh_agent fi check_starting_path check_nsis check_zip read_username_from_user read_password_from_user get_openscad_source_code if [ $DOBUILD ]; then build_win32 build_win64 fi if [ $DOUPLOAD ]; then upload_win32 upload_win64 update_win_www_download_links fi } if [ $DOLOOP ]; then while [ 1 ]; do init_variables $* main $* echo --------------------------------------------------- echo main loop finished. repeating in $LOOPSLEEP seconds echo --------------------------------------------------- sleep $LOOPSLEEP #if [ "`uname | grep -i linux`" ]; then # rtcwake -m mem -s 86400 #fi done else main $* fi openscad-2019.05/scripts/check-dependencies.sh0000755000076500000240000004675413427162620021651 0ustar kintelstaff00000000000000# Parse the minimum versions of dependencies from README.md, and compare # with what is found on the system. Print results. # # usage # check-dependencies.sh # check version of all dependencies # check-dependencies.sh debug # debug this script # # output # a table displaying the minimum version from README, the found version, # and whether it is OK or not. # # design # stage 1. search by parsing header files and/or binary output (_sysver) # stage 2. search with pkg-config # # Code style is portability and simplicity. Plain sed, awk, grep, sh. # Functions return strings under $function_name_result variable. # tmp variables are named funcname_abbreviated_tmp. # Local vars are not used. # # todo # testing of non-bash shells # if /usr/ and /usr/local/ on linux both hit, throw a warning # print location found, how found??? # look at pkgconfig --exists & --modversion # deal with deps like GLEW that don't have proper version strings? # DEBUG= debug() { if [ $DEBUG ]; then echo check-dependencies.sh: $* ; fi } doubleconversion_sysver() { debug double-conversion doubleconvpath=$1/include/double-conversion/double-conversion.h if [ ! -e $doubleconvpath ]; then return; fi # No version info in headers, not sure what to check here # Just assume version 2.0.1 (version available in trusty) if file exists? doubleconversion_sysver_result="2.0.1" } eigen_sysver() { debug eigen eigpath=$1/include/eigen3/Eigen/src/Core/util/Macros.h debug $eigpath if [ ! -e $eigpath ]; then return; fi eswrld=`grep "define *EIGEN_WORLD_VERSION *[0-9]*" $eigpath | awk '{print $3}'` esmaj=`grep "define *EIGEN_MAJOR_VERSION *[0-9]*" $eigpath | awk '{print $3}'` esmin=`grep "define *EIGEN_MINOR_VERSION *[0-9]*" $eigpath | awk '{print $3}'` eigen_sysver_result="$eswrld.$esmaj.$esmin" } opencsg_sysver() { debug opencsg_sysver if [ ! -e $1/include/opencsg.h ]; then return; fi ocsgver=`grep -a "define *OPENCSG_VERSION_STRING *[0-9x]*" $1/include/opencsg.h` ocsgver=`echo $ocsgver | awk '{print $4}' | sed s/'"'//g | sed s/[^1-9.]//g` opencsg_sysver_result=$ocsgver } cgal_sysver() { cgalpath=$1/include/CGAL/version.h if [ ! -e $cgalpath ]; then return; fi cgal_sysver_result=`grep "define *CGAL_VERSION *[0-9.]*" $cgalpath | awk '{print $3}'` } libzip_sysver() { libzippath="$1/include/zipconf.h" if [ ! -e "$libzippath" ]; then libzippath="$1/include/`gcc -dumpmachine 2>/dev/null`/zipconf.h"; fi if [ ! -e "$libzippath" ]; then return; fi libzip_sysver_result="`grep 'define *LIBZIP_VERSION *"[0-9.]*"' "$libzippath" | awk '{print $3}' | tr -d '"' `" } glib2_sysver() { #Get architecture triplet - e.g. x86_64-linux-gnu glib2archtriplet=`gcc -dumpmachine 2>/dev/null` if [ -z "$VAR" ]; then if [ "`command -v dpkg-architectures`" ]; then glib2archtriplet=`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null` fi fi glib2path=$1/lib/$glib2archtriplet/glib-2.0/include/glibconfig.h if [ ! -e $glib2path ]; then #No glib found #glib can be installed in /usr/lib/i386-linux-gnu/glib-2.0/ on arch i686-linux-gnu (sometimes?) if [ "$glib2archtriplet" = "i686-linux-gnu" ]; then glib2archtriplet=i386-linux-gnu glib2path=$1/lib/$glib2archtriplet/glib-2.0/include/glibconfig.h fi fi if [ ! -e $glib2path ]; then glib2path=$1/lib/glib-2.0/include/glibconfig.h fi if [ ! -e $glib2path ]; then glib2path=$1/lib64/glib-2.0/include/glibconfig.h fi if [ ! -e $glib2path ]; then return fi glib2major=`grep "define *GLIB_MAJOR_VERSION *[0-9.]*" $glib2path | awk '{print $3}'` glib2minor=`grep "define *GLIB_MINOR_VERSION *[0-9.]*" $glib2path | awk '{print $3}'` glib2micro=`grep "define *GLIB_MICRO_VERSION *[0-9.]*" $glib2path | awk '{print $3}'` glib2_sysver_result="${glib2major}.${glib2minor}.${glib2micro}" } fontconfig_sysver() { fcpath=$1/include/fontconfig/fontconfig.h if [ ! -e $fcpath ]; then return; fi fcmajor=`grep "define *FC_MAJOR.*[0-9.]*" $fcpath | awk '{print $3}'` fcminor=`grep "define *FC_MINOR.*[0-9.]*" $fcpath | awk '{print $3}'` fcrevison=`grep "define *FC_REVISION.*[0-9.]*" $fcpath | awk '{print $3}'` fontconfig_sysver_result="${fcmajor}.${fcminor}.${fcrevision}" } freetype2_sysver() { freetype2path=$1/include/freetype2/freetype/freetype.h if [ ! -e $freetype2path ]; then return; fi ftmajor=`grep "define *FREETYPE_MAJOR *[0-9.]*" $freetype2path | awk '{print $3}'` ftminor=`grep "define *FREETYPE_MINOR *[0-9.]*" $freetype2path | awk '{print $3}'` ftpatch=`grep "define *FREETYPE_PATCH *[0-9.]*" $freetype2path | awk '{print $3}'` freetype2_sysver_result="${ftmajor}.${ftminor}.${ftpatch}" } harfbuzz_sysver() { harfbuzzpath=$1/include/harfbuzz/hb-version.h if [ ! -e $harfbuzzpath ]; then return; fi hbmajor=`grep "define *HB_VERSION_MAJOR *[0-9.]*" $harfbuzzpath | awk '{print $3}'` hbminor=`grep "define *HB_VERSION_MINOR *[0-9.]*" $harfbuzzpath | awk '{print $3}'` hbmicro=`grep "define *HB_VERSION_MICRO *[0-9.]*" $harfbuzzpath | awk '{print $3}'` harfbuzz_sysver_result="${hbmajor}.${hbminor}.${hbmicro}" } boost_sysver() { boostpath=$1/include/boost/version.hpp if [ ! -e $boostpath ]; then return; fi bsver=`grep 'define *BOOST_LIB_VERSION *[0-9_"]*' $boostpath | awk '{print $3}'` bsver=`echo $bsver | sed s/'"'//g | sed s/'_'/'.'/g` boost_sysver_result=$bsver } mpfr_sysver() { mpfrpath=$1/include/mpfr.h if [ ! -e $mpfrpath ]; then return; fi mpfrsver=`grep 'define *MPFR_VERSION_STRING *' $mpfrpath | awk '{print $3}'` mpfrsver=`echo $mpfrsver | sed s/"-.*"// | sed s/'"'//g` mpfr_sysver_result=$mpfrsver } gmp_sysver() { gmppaths="`find $1/include -name 'gmp.h' -o -name 'gmp-*.h' 2>/dev/null`" if [ ! "$gmppaths" ]; then debug "gmp_sysver no gmp.h beneath $1" return fi for gmpfile in $gmppaths; do if [ "`grep __GNU_MP_VERSION $gmpfile`" ]; then gmpmaj=`grep "define *__GNU_MP_VERSION *[0-9]*" $gmpfile | awk '{print $3}'` gmpmin=`grep "define *__GNU_MP_VERSION_MINOR *[0-9]*" $gmpfile | awk '{print $3}'` gmppat=`grep "define *__GNU_MP_VERSION_PATCHLEVEL *[0-9]*" $gmpfile | awk '{print $3}'` fi done gmp_sysver_result="$gmpmaj.$gmpmin.$gmppat" } qt_sysver() { if [ "`command -v qtchooser`" ]; then qtver=`qtchooser -run-tool=qmake -qt=5 -v 2>&1` if [ $? -eq 0 ] ; then export QT_SELECT=5 else qtver=`qtchooser -run-tool=qmake -qt=4 -v 2>&1` if [ $? -eq 0 ] ; then export QT_SELECT=4 fi fi qtver=`echo "$qtver" | grep "Using Qt version" | awk '{print $4}'` else export QT_SELECT=5 qtpath=$1/include/qt5/QtCore if [ ! -e $qtpath ]; then qtpath=$1/include/i686-linux-gnu/qt5/QtCore fi if [ ! -e $qtpath ]; then qtpath=$1/include/x86_64-linux-gnu/qt5/QtCore fi if [ ! -e $qtpath ]; then export QT_SELECT=4 qtpath=$1/include/qt4/QtCore/ fi if [ ! -e $qtpath ]; then qtpath=$1/include/QtCore fi if [ ! -e $qtpath ]; then # netbsd qtpath=$1/qt4/include/QtCore fi fi if [ -z "$qtver" ]; then if [ ! -e "$qtpath" ]; then unset QT_SELECT return fi qtver=`grep 'define *QT_VERSION_STR *' "$qtpath"/qglobal.h` # fix for Qt 5.7 if [ -z "$qtver" ]; then if [ -e "$qtpath/qconfig-32.h" ]; then QCONFIG="qconfig-32.h" elif [ -e "$qtpath/qconfig-64.h" ]; then QCONFIG="qconfig-64.h" else QCONFIG="qconfig.h" fi qtver=`grep 'define *QT_VERSION_STR *' "$qtpath"/$QCONFIG` fi qtver=`echo $qtver | awk '{print $3}' | sed s/'"'//g` fi qt_sysver_result=$qtver } qscintilla2_sysver() { # expecting the QT_SELECT already set in case we found qtchooser if qmake -v >/dev/null 2>&1 ; then QMAKE=qmake elif [ "`command -v qmake-qt4`" ]; then QMAKE=qmake-qt4 fi debug using qmake: $QMAKE qtincdir="`$QMAKE -query QT_INSTALL_HEADERS`" qscipath="$qtincdir/Qsci/qsciglobal.h" debug using qtincdir: $qtincdir debug using qscipath: $qscipath if [ ! -e $qscipath ]; then debug qscipath doesnt exist. giving up on version. return fi qsciver=`grep define.*QSCINTILLA_VERSION_STR "$qscipath" | awk '{print $3}'` qsciver=`echo $qsciver | sed s/'"'//g` qscintilla2_sysver_result="$qsciver" } glew_sysver() { glewh=$1/include/GL/glew.h if [ -e $glewh ]; then # glew has no traditional version number in it's headers # so we either test for what we need and 'guess', or assign it to 0.0 # the resulting number is a 'lower bound', not exactly what is installed if [ "`grep __GLEW_VERSION_4_2 $glewh`" ]; then glew_sysver_result=1.7.0 fi if [ ! $glew_sysver_result ]; then if [ "`grep __GLEW_ARB_occlusion_query2 $glewh`" ]; then glew_sysver_result=1.5.4 fi fi if [ ! $glew_sysver_result ]; then glew_sysver_result=0.0 fi fi } imagemagick_sysver() { if [ ! -x $1/bin/convert ]; then return; fi imver=`$1/bin/convert --version | grep -i version` imagemagick_sysver_result=`echo $imver | sed s/"[^0-9. ]"/" "/g | awk '{print $1}'` } flex_sysver() { flexbin=$1/bin/flex if [ -x $1/bin/gflex ]; then flexbin=$1/bin/gflex; fi # openbsd if [ ! -x $flexbin ]; then return ; fi flex_sysver_result=`$flexbin --version | sed s/"[^0-9.]"/" "/g` } bison_sysver() { # bison (GNU Bison) 2.7.12-4996 if [ ! -x $1/bin/bison ]; then return ; fi bison_sver=`$1/bin/bison --version | grep bison` debug bison_sver1: $bison_sver bison_sver=`echo $bison_sver | awk -F ")" ' { print $2 } '` debug bison_sver2: $bison_sver bison_sver=`echo $bison_sver | awk -F "-" ' { print $1 } '` debug bison_sver3: $bison_sver bison_sysver_result=$bison_sver } gcc_sysver() { bingcc=$1/bin/g++ if [ ! -x $1/bin/g++ ]; then if [ "`command -v g++`" ]; then # fallback to $PATH bingcc=g++; fi fi debug using bingcc: $bingcc if [ ! -x $bingcc ]; then return; fi if [ ! "`$bingcc --version`" ]; then return; fi gccver=`$bingcc --version| grep -i g++ | awk -F "(" ' { print $2 } '` debug g++ output1: $gccver gccver=`echo $gccver | awk -F ")" ' { print $2 } '` debug g++ output2: $gccver gccver=`echo $gccver | awk ' { print $1 } '` debug g++ output3: $gccver gcc_sysver_result=$gccver } git_sysver() { if [ ! -x $1/bin/git ]; then return ; fi git_sysver_result=`$1/bin/git --version | grep git | sed s/"[^0-9.]"/" "/g` } curl_sysver() { if [ ! -x $1/bin/curl ]; then return; fi curl_sysver_result=`$1/bin/curl --version | grep curl | sed s/"[^0-9. ]"/" "/g | awk '{print $1}'` } cmake_sysver() { if [ ! -x $1/bin/cmake ]; then return ; fi cmake_sysver_result=`$1/bin/cmake --version | grep cmake | sed s/"[^0-9.]"/" "/g | awk '{ print $1 }'` } make_sysver() { make_sysver_tmp= binmake=$1/bin/make if [ -x $1/bin/gmake ]; then binmake=$1/bin/gmake ;fi if [ ! -x $binmake ]; then return ;fi make_sysver_tmp=`$binmake --version 2>&1` debug finding gnu make: raw make response: $make_sysver_tmp if [ ! "`echo $make_sysver_tmp | grep -i gnu`" ]; then return; fi make_sysver_tmp=`$binmake --version 2>&1 | grep -i 'gnu make' | sed s/"[^0-9.]"/" "/g` if [ "`echo $make_sysver_tmp | grep [0-9]`" ]; then make_sysver_result=$make_sysver_tmp fi } bash_sysver() { if [ -x /bin/bash ]; then binbash=/bin/bash ;fi if [ -x /usr/bin/bash ]; then binbash=/usr/bin/bash ;fi if [ -x $1/bin/bash ]; then binbash=$1/bin/bash ;fi if [ ! -x $binbash ]; then return; fi bash_sysver_result=`$binbash --version | grep bash | sed s/"[^0-9. ]"/" "/g|awk '{print $1}'` } python_sysver() { if [ ! -x $1/bin/python ]; then return; fi python_sysver_result=`$1/bin/python --version 2>&1 | awk '{print $2}'` } pkg_config_search() { debug pkg_config_search $* pkg_config_search_result= pcstmp= if [ ! $1 ]; then return; fi pkgname=$1 pkg-config --exists $pkgname 2>&1 if [ $? = 0 ]; then pkg_config_search_result=`pkg-config --modversion $pkgname` else debug pkg_config_search failed on $*, result of run was: $pcstmp fi } get_minversion_from_readme() { debug get_minversion_from_readme $* # Extract dependency name if [ ! $1 ]; then return; fi depname=$1 debug $depname local grv_tmp= for READFILE in README.md ../README.md "`dirname "$0"`/../README.md" do if [ ! -e "$READFILE" ] then debug "get_minversion_from_readme $READFILE not found" continue fi debug "get_minversion_from_readme $READFILE found" grep -qi ".$depname.*([0-9]" $READFILE || continue grv_tmp="`grep -i ".$depname.*([0-9]" $READFILE | sed s/"*"//`" debug $grv_tmp grv_tmp="`echo $grv_tmp | awk -F"(" '{print $2}'`" debug $grv_tmp grv_tmp="`echo $grv_tmp | awk -F"-" '{print $1}'`" debug $grv_tmp grv_tmp="`echo $grv_tmp | sed s/"x"/"0"/g`" debug $grv_tmp grv_tmp="`echo $grv_tmp | sed s/"[^0-9.]"//g`" debug $grv_tmp if [ "z$grv_tmp" = "z" ] then debug "get_minversion_from_readme no result for $depname from $READFILE" continue fi get_minversion_from_readme_result=$grv_tmp return 0 done if [ "z$grv_tmp" = "z" ] then debug "get_minversion_from_readme no result for $depname found anywhere" get_minversion_from_readme_result="" return 0 fi } find_min_version() { find_min_version_result= fmvtmp= if [ ! $1 ] ; then return; fi fmvdep=$1 get_minversion_from_readme $fmvdep fmvtmp=$get_minversion_from_readme_result # items not included in README.md if [ $fmvdep = "git" ]; then fmvtmp=1.5 ; fi if [ $fmvdep = "curl" ]; then fmvtmp=6 ; fi if [ $fmvdep = "make" ]; then fmvtmp=3 ; fi if [ $fmvdep = "python" ]; then fmvtmp=2 ; fi find_min_version_result=$fmvtmp } vers_to_int() { # change x.y.z.p into an integer that can be compared using -lt or -gt # 1.2.3.4 into 1020304 # 1.11.0.12 into 1110012 # 2011.2.3 into 20110020300 # it will work as long as the resulting int is less than 2.147 billion # and y z and p are less than 99 vers_to_int_result= if [ ! $1 ] ; then return ; fi vtoi_ver=$1 vtoi_test=`echo $vtoi_ver | sed s/"[^0-9.]"//g` debug vers_to_int $* :: vtoi_ver: $vtoi_ver vtoi_test: $vtoi_test if [ ! "$vtoi_test" = "$vtoi_ver" ]; then debug failure in version-to-integer conversion. debug '"'$vtoi_ver'"' has letters, etc in it. setting to 0 vtoi_ver="0" fi vers_to_int_result=`echo $vtoi_ver | awk -F. '{print $1*1000000+$2*10000+$3*100+$4}'` vtoi_ver= vtoi_test= } version_less_than_or_equal() { if [ ! $1 ]; then return; fi if [ ! $2 ]; then return; fi v1=$1 v2=$2 vers_to_int $v1 v1int=$vers_to_int_result vers_to_int $v2 v2int=$vers_to_int_result debug "v1, v2, v1int, v2int" , $v1, $v2, $v1int, $v2int if [ $v1int -le $v2int ]; then debug "v1 <= v2" return 0 else debug "v1 > v2" return 1 fi v1= v2= v1int= v2int= } compare_version() { debug compare_version $* compare_version_result="NotOK" if [ ! $1 ] ; then return; fi if [ ! $2 ] ; then return; fi cvminver=$1 cvinstver=$2 cvtmp= version_less_than_or_equal $cvminver $cvinstver if [ $? = 0 ]; then cvtmp="OK" else cvtmp="NotOK" fi compare_version_result=$cvtmp cvtmp= } pretty_print() { # there are four columns, passed as $1 $2 $3 and $4 # 1 = name of dependency # 2 = version found in README # 3 = version found on system # 4 = whether it is OK or not debug pretty_print $* brightred="\033[40;31m" red="\033[40;31m" brown="\033[40;33m" yellow="\033[40;33m" white="\033[40;37m" purple="\033[40;35m" green="\033[40;32m" cyan="\033[40;36m" gray="\033[40;37m" nocolor="\033[0m" ppstr="%s%-18s" pp_format='{printf("'$ppstr$ppstr$ppstr$ppstr$nocolor'\n",$1,$2,$3,$4,$5,$6,$7,$8)}' pp_title="$gray depname $gray minimum $gray found $gray OKness" if [ $1 ]; then pp_depname=$1; fi if [ $pp_depname = "title" ]; then echo -e $pp_title | awk $pp_format return ; fi if [ $2 ]; then pp_minver=$2; else pp_minver="unknown"; fi if [ $3 ]; then pp_foundver=$3; else pp_foundver="unknown"; fi if [ $4 ]; then pp_okness=$4; else pp_okness="NotOK"; fi if [ $pp_okness = "NotOK" ]; then pp_foundcolor=$purple; pp_cmpcolor=$purple; else pp_foundcolor=$gray; pp_cmpcolor=$green; fi echo -e $cyan $pp_depname $gray $pp_minver $pp_foundcolor $pp_foundver $pp_cmpcolor $pp_okness | awk $pp_format pp_depname= pp_minver= pp_foundver= pp_okness= } find_installed_version() { debug find_installed_version $* find_installed_version_result=unknown fsv_tmp= depname=$1 # try to find/parse headers and/or binary output # break on the first match. (change the order to change precedence) if [ ! $fsv_tmp ]; then for syspath in $OPENSCAD_LIBRARIES "/usr/local" "/opt/local" "/usr/pkg" "/usr"; do if [ -e $syspath ]; then # strip hyphens from dependency name depnameclean=`echo $depname | sed s/-//g` debug $depnameclean"_sysver" $syspath eval $depnameclean"_sysver" $syspath fsv_tmp=`eval echo "$"$depnameclean"_sysver_result"` if [ $fsv_tmp ]; then break; fi fi done fi # use pkg-config to search if [ ! $fsv_tmp ]; then if [ "`command -v pkg-config`" ]; then debug plain search failed. trying pkg_config... pkg_config_search $depname fsv_tmp=$pkg_config_search_result fi fi if [ $fsv_tmp ]; then find_installed_version_result=$fsv_tmp else debug all searches failed. unknown version. fi } check_old_local() { warnon= if [ "`uname | grep -i linux`" ]; then header_list="opencsg.h CGAL boost GL/glew.h gmp.h mpfr.h eigen3" for i in $header_list; do if [ -e /usr/local/include/$i ]; then echo "Warning: you have a copy of "$i" under /usr/local/include" warnon=1 fi done liblist="libboost_system libboost_system-mt libopencsg libCGAL libglew" for i in $liblist; do if [ -e /usr/local/lib/$i.so ]; then echo "Warning: you have a copy of "$i" under /usr/local/lib" warnon=1 fi done if [ -e /usr/local/lib/pkgconfig ]; then echo "Warning: you have pkgconfig under /usr/local/lib" warnon=1 fi fi if [ $warnon ]; then echo "Please verify these local copies don't conflict with the system" fi } check_misc() { if [ "`uname -a|grep -i netbsd`" ]; then echo "NetBSD: Please manually verify the X Sets have been installed" fi if [ "`uname -a|grep -i darwin`" ]; then sparkle= libs="~/Library /Library" for libhome in $libs; do echo "$libhome/Frameworks/Sparkle.framework..." if [ -d $libhome/Frameworks/Sparkle.framework ]; then echo "Found in $libhome" sparkle=$libhome break fi done if [ -n "$sparkle" ]; then echo "OS X: Make sure Sparkle.framework is installed in your Frameworks path" else echo "OS X: Sparkle.framework found in $libhome" fi fi } checkargs() { for i in $*; do if [ $i = "debug" ]; then DEBUG=1 ; fi done } main() { deps="qt qscintilla2 cgal gmp mpfr boost opencsg glew eigen glib2 fontconfig freetype2 harfbuzz libzip bison flex make double-conversion" #deps="$deps curl git" # not technically necessary for build #deps="$deps python cmake imagemagick" # only needed for tests #deps="cgal" pretty_print title for depname in $deps; do debug "processing $dep" find_installed_version $depname dep_sysver=$find_installed_version_result find_min_version $depname dep_minver=$find_min_version_result compare_version $dep_minver $dep_sysver dep_compare=$compare_version_result pretty_print $depname "$dep_minver" "$dep_sysver" $dep_compare done check_old_local check_misc } checkargs $* main exit 0 openscad-2019.05/scripts/chrpath_linux.c0000644000076500000240000004714013402025764020613 0ustar kintelstaff00000000000000/*************************************************************************** * * * This is a pre-configured single file version of chrpath for linux. * * It is used in the binary installer for OpenSCAD on Linux. * * * * This file has been created by running * * cat *.h *.c | sed 's, *# *include *",//&,' > ../chrpath_linux.c * * in the configured chrpath-0.13 source directory (as found in the debian * * package repository as the original download site seams to be down). * * * * chrpath is licensed under the terms of GPLv2: * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * The Authors are: * * * * Geoffrey Keating * * Implemented first version of chrpath.c based on first version of * * killrpath. * * Peeter Joot * * Implemented first version of killrpath.c. * * Petter Reinholdtsen * * Collected both implementations and made userfriendly wrapper. * * * * With patches from: * * * * Darren Salt * * David Hull * * Bradford W. Johnson * * Thomas Anders * * Tollef Fog Heen * * * ***************************************************************************/ /* config.h. Generated by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #define HAVE_ELF_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 /* Define to 1 if you have the `getopt_long' function. */ #define HAVE_GETOPT_LONG 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_LINK_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_LINK_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Name of package */ #define PACKAGE "chrpath" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "pere@hungry.com" /* Define to the full name of this package. */ #define PACKAGE_NAME ""chrpath"" /* Define to the full name and version of this package. */ #define PACKAGE_STRING ""chrpath" "0.13"" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "-chrpath-" /* Define to the version of this package. */ #define PACKAGE_VERSION ""0.13"" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "0.13" /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ #ifndef PROTOS_H #define PROTOS_H #include //#include "config.h" #ifdef WORDS_BIGENDIAN #define ELFDATA2 ELFDATA2MSB #else #define ELFDATA2 ELFDATA2LSB #endif #if SIZEOF_VOID_P == 8 #define Elf_Ehdr Elf64_Ehdr #define ELFCLASS ELFCLASS64 #define Elf_Phdr Elf64_Phdr #define Elf_Shdr Elf64_Shdr #define Elf_Dyn Elf64_Dyn #elif SIZEOF_VOID_P == 4 #define Elf_Ehdr Elf32_Ehdr #define ELFCLASS ELFCLASS32 #define Elf_Phdr Elf32_Phdr #define Elf_Shdr Elf32_Shdr #define Elf_Dyn Elf32_Dyn #else #error "Unknown word size (SIZEOF_VOID_P)!" #endif int killrpath(const char *filename); int chrpath(const char *filename, const char *newpath, int convert); int elf_open(const char *filename, int flags, Elf_Ehdr *ehdr); void elf_close(int fd); int elf_find_dynamic_section(int fd, Elf_Ehdr *ehdr, Elf_Phdr *phdr); const char *elf_tagname(int tag); int elf_dynpath_tag(int tag); #endif /* PROTOS_H */ /* Re: changing embedded RPATH in existing executables. To: geoffk@ozemail.com.au Subject: Re: changing embedded RPATH in existing executables. From: (peeter joot) Date: Fri, 30 Apr 1999 16:14:44 -0400 (EDT) Cc: peeterj@ca.ibm.com, egcs@cygnus.com, libc-hacker@cygnus.com, linux-gcc@vger.rutgers.edu Reply-To: > _Changing_ is a little tricky, but the attached program strips rpaths > from executables (I find it essential for debugging the binutils). > It's endian-dependent, if you want this for x86 you can just change > the occurrences of 'MSB' to 'LSB' and compile (I should really fix > that). Hi Geoff, With your program as a guide (and some peeks into libbfd, elf.h, a bit of the glibc dynamic loader code, objdump, and a hex-editor) I was able to figure out enough to find and change the rpath string. That was fun! This program assumes (unlike your original program) that there is only one DT_RPATH tag in the dynamic section as even with multiple '-Wl,-rpath,' commands in the link this seems to occur (they all get concatonated into a : separated path). Thanks for your help. If you want to use this on non-x86 you have to change the occurances of LSB back to MSB:) Peeter -- */ #ifdef HAVE_CONFIG_H //# include "config.h" #endif #include #include #include #include #if defined(HAVE_LINK_H) # include #endif /* HAVE_LINK_H */ #include #include #include //#include "protos.h" /** * Reads an ELF file, and reads or alters the RPATH setting. * * TODO: * modify to add RPATH setting if none exists. */ int chrpath(const char *filename, const char *newpath, int convert) { int fd; Elf_Ehdr ehdr; int i; Elf_Phdr phdr; Elf_Shdr shdr; Elf_Dyn *dyns; int rpathoff; char * strtab; char * rpath; unsigned int rpathlen; int oflags; int rpath_dyns_index; if (NULL == newpath && 0 == convert) oflags = O_RDONLY; else oflags = O_RDWR; fd = elf_open(filename, oflags, &ehdr); if (fd == -1) { perror ("elf_open"); return 1; } if (0 != elf_find_dynamic_section(fd, &ehdr, &phdr)) { perror("found no dynamic section"); return 1; } dyns = malloc(phdr.p_filesz); if (dyns == NULL) { perror ("allocating memory for dynamic section"); return 1; } memset(dyns, 0, phdr.p_filesz); if (lseek(fd, phdr.p_offset, SEEK_SET) == -1 || read(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz) { perror ("reading dynamic section"); free(dyns); return 1; } rpathoff = -1; for ( rpath_dyns_index = 0; dyns[rpath_dyns_index].d_tag != DT_NULL; ++rpath_dyns_index ) { if ( elf_dynpath_tag(dyns[rpath_dyns_index].d_tag) ) { rpathoff = dyns[rpath_dyns_index].d_un.d_ptr; break; } } if (rpathoff == -1) { printf("%s: no rpath or runpath tag found.\n", filename); free(dyns); return 2; } if (lseek(fd, ehdr.e_shoff, SEEK_SET) == -1) { perror ("positioning for sections"); free(dyns); return 1; } for (i = 0; i < ehdr.e_shnum; i++) { if (read(fd, &shdr, sizeof(shdr)) != sizeof(shdr)) { perror ("reading section header"); free(dyns); return 1; } if (shdr.sh_type == SHT_STRTAB) break; } if (i == ehdr.e_shnum) { fprintf (stderr, "No string table found.\n"); free(dyns); return 2; } strtab = (char *)malloc(shdr.sh_size); if (strtab == NULL) { perror ("allocating memory for string table"); free(dyns); return 1; } memset(strtab, 0, shdr.sh_size); if (lseek(fd, shdr.sh_offset, SEEK_SET) == -1) { perror ("positioning for string table"); free(strtab); free(dyns); return 1; } if (read(fd, strtab, shdr.sh_size) != (int)shdr.sh_size) { perror ("reading string table"); free(strtab); free(dyns); return 1; } if ((int)shdr.sh_size < rpathoff) { fprintf(stderr, "%s string offset not contained in string table", elf_tagname(dyns[rpath_dyns_index].d_tag)); free(strtab); free(dyns); return 5; } rpath = strtab+rpathoff; #if defined(DT_RUNPATH) if (convert && dyns[rpath_dyns_index].d_tag == DT_RPATH) { dyns[rpath_dyns_index].d_tag = DT_RUNPATH; if (lseek(fd, phdr.p_offset, SEEK_SET) == -1 || write(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz) { perror ("converting RPATH to RUNPATH"); return 1; } printf("%s: RPATH converted to RUNPATH\n", filename); } #endif /* DT_RUNPATH */ printf("%s: %s=%s\n", filename, elf_tagname(dyns[rpath_dyns_index].d_tag), rpath); if (NULL == newpath) { free(dyns); free(strtab); return 0; } rpathlen = strlen(rpath); /* * Calculate the maximum rpath length (will be equal to rpathlen unless * we have previously truncated it). */ for ( i = rpathoff + rpathlen ; (i < (int)shdr.sh_size && strtab[i] == '\0') ; i++ ) ; i--; if (i > (int)(rpathoff + rpathlen)) rpathlen = i - rpathoff; if (strlen(newpath) > rpathlen) { fprintf(stderr, "new rpath '%s' too large; maximum length %i\n", newpath, rpathlen); free(dyns); free(strtab); return 7; } memset(rpath, 0, rpathlen); strcpy(rpath, newpath); if (lseek(fd, shdr.sh_offset+rpathoff, SEEK_SET) == -1) { perror ("positioning for RPATH"); free(dyns); free(strtab); return 1; } if (write(fd, rpath, rpathlen) != (int)rpathlen) { perror ("writing RPATH"); free(dyns); free(strtab); return 1; } printf("%s: new %s: %s\n", filename, elf_tagname(dyns[rpath_dyns_index].d_tag), rpath); elf_close(fd); free(dyns); dyns = NULL; free(strtab); return 0; } #ifdef HAVE_CONFIG_H //# include "config.h" #endif #include #if defined(HAVE_SYS_LINK_H) # include /* Find DT_RPATH on Solaris 2.6 */ #endif /* HAVE_SYS_LINK_H */ #include #include #include #include #include #include #include //#include "protos.h" int elf_open(const char *filename, int flags, Elf_Ehdr *ehdr) { int fd; fd = open(filename, flags); if (fd == -1) { perror ("open"); return -1; } if (read(fd, ehdr, sizeof(*ehdr)) != sizeof(*ehdr)) { perror ("reading header"); close(fd); return -1; } if (0 != memcmp(ehdr->e_ident, ELFMAG, SELFMAG) || ehdr->e_ident[EI_CLASS] != ELFCLASS || ehdr->e_ident[EI_DATA] != ELFDATA2 || ehdr->e_ident[EI_VERSION] != EV_CURRENT) { fprintf(stderr, #ifdef WORDS_BIGENDIAN "`%s' probably isn't a %d-bit MSB-first ELF file.\n", #else /* not WORD_BIGENDIAN */ "`%s' probably isn't a %d-bit LSB-first ELF file.\n", #endif /* not WORD_BIGENDIAN */ filename, SIZEOF_VOID_P * 8); close(fd); errno = ENOEXEC; /* Hm, is this the best errno code to use? */ return -1; } if (ehdr->e_phentsize != sizeof(Elf_Phdr)) { fprintf(stderr, "section size was read as %d, not %d!\n", ehdr->e_phentsize, (int)sizeof(Elf_Phdr)); close(fd); return -1; } return fd; } int elf_find_dynamic_section(int fd, Elf_Ehdr *ehdr, Elf_Phdr *phdr) { int i; if (lseek(fd, ehdr->e_phoff, SEEK_SET) == -1) { perror ("positioning for sections"); return 1; } for (i = 0; i < ehdr->e_phnum; i++) { if (read(fd, phdr, sizeof(*phdr)) != sizeof(*phdr)) { perror ("reading section header"); return 1; } if (phdr->p_type == PT_DYNAMIC) break; } if (i == ehdr->e_phnum) { fprintf (stderr, "No dynamic section found.\n"); return 2; } if (0 == phdr->p_filesz) { fprintf (stderr, "Length of dynamic section is zero.\n"); return 3; } return 0; } void elf_close(int fd) { close(fd); } const char * elf_tagname(int tag) { switch (tag) { case DT_RPATH: return "RPATH"; break; #if defined(DT_RUNPATH) case DT_RUNPATH: return "RUNPATH"; break; #endif /* DT_RUNPATH */ } return "UNKNOWN"; } int elf_dynpath_tag(int tag) { return ( tag == DT_RPATH #if defined(DT_RUNPATH) || tag == DT_RUNPATH #endif /* DT_RUNPATH */ ); } /* Taken from another list: _Changing_ is a little tricky, but the attached program strips rpaths from executables (I find it essential for debugging the binutils). It's endian-dependent, if you want this for x86 you can just change the occurrences of 'MSB' to 'LSB' and compile (I should really fix that). -- Geoffrey Keating */ #ifdef HAVE_CONFIG_H //# include "config.h" #endif #include #include #include #include #if defined(HAVE_LINK_H) # include #endif /* HAVE_LINK_H */ #include //#include "protos.h" #include /* Reads an ELF file, nukes all the RPATH entries. */ int killrpath(const char *filename) { int fd; Elf_Ehdr ehdr; int i; Elf_Phdr phdr; Elf_Dyn *dyns; int dynpos; fd = elf_open(filename, O_RDWR, &ehdr); if (fd == -1) { perror ("elf_open"); return 1; } if (0 != elf_find_dynamic_section(fd, &ehdr, &phdr)) { perror("found no dynamic section"); return 1; } dyns = malloc(phdr.p_memsz); if (dyns == NULL) { perror ("allocating memory for dynamic section"); return 1; } memset(dyns, 0, phdr.p_memsz); if (lseek(fd, phdr.p_offset, SEEK_SET) == -1 || read(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz) { perror ("reading dynamic section"); return 1; } dynpos = 0; for (i = 0; dyns[i].d_tag != DT_NULL; i++) { dyns[dynpos] = dyns[i]; if ( ! elf_dynpath_tag(dyns[i].d_tag) ) dynpos++; } for (; dynpos < i; dynpos++) dyns[dynpos].d_tag = DT_NULL; if (lseek(fd, phdr.p_offset, SEEK_SET) == -1 || write(fd, dyns, phdr.p_filesz) != (int)phdr.p_filesz) { perror ("writing dynamic section"); return 1; } elf_close(fd); return 0; } /* * Author: Petter Reinholdtsen * date: 2001-01-20 * * Alter ELF rpath information (insert, modify, remove). * * Based on source from Peeter Joot and Geoffrey * Keating . */ #ifdef HAVE_CONFIG_H //# include "config.h" #endif #include #include #include #ifdef HAVE_GETOPT_H #include #endif //#include "protos.h" #ifdef HAVE_GETOPT_LONG # define GETOPT_LONG getopt_long static struct option long_options[] = { {"convert", 0, 0, 'c'}, {"delete", 0, 0, 'd'}, {"help", 0, 0, 'h'}, {"keepgoing", 0, 0, 'k'}, {"list", 0, 0, 'l'}, {"replace", 1, 0, 'r'}, {"version", 0, 0, 'v'} }; #else /* not HAVE_GETOPT_LONG */ # define GETOPT_LONG(argc,argv,optstr,lopts,lidx) getopt(argc,argv,optstr) #endif /* not HAVE_GETOPT_LONG */ static void usage(char *progname) { printf("Usage: %s [-v|-d|-c|-r ] [ ...]\n\n", progname); printf(" -v|--version Display program version number\n"); printf(" -d|--delete Delete current rpath/runpath setting\n"); #if defined(DT_RUNPATH) printf(" -c|--convert Convert rpath to runpath\n"); #endif /* DT_RUNPATH */ printf(" -r |--replace Replace current rpath/runpath setting\n"); printf(" with the path given\n"); printf(" -l|--list List the current rpath/runpath (default)\n"); printf(" -h|--help Show this usage information.\n"); #ifndef HAVE_GETOPT_LONG printf("\n *** The long options are not available on this platform"); #endif /* not HAVE_GETOPT_LONG */ #if !defined(DT_RUNPATH) printf("\n *** There is no support for runpath on this platform"); #endif /* DT_RUNPATH */ printf("\n"); } int main(int argc, char * const argv[]) { int retval = 0; int convert = 0; /* convert to given type */ int remove = 0; /* remove or not */ int keep_going = 0; /* Break on first error, or keep going? */ char *newpath = NULL; /* insert this path */ int opt; #ifdef HAVE_GETOPT_LONG int option_index = 0; #endif /* HAVE_GETOPT_LONG */ if (argc < 2) { usage(argv[0]); return 1; } do { opt = GETOPT_LONG(argc, argv, "cdhklr:v", long_options, &option_index); switch (opt) { #if defined(DT_RUNPATH) case 'c': convert = 1; break; #endif /* DT_RUNPATH */ case 'd': remove = 1; break; case 'k': keep_going = 1; break; case 'r': newpath = optarg; break; case 'v': printf("%s version %s\n", PACKAGE, VERSION); exit(0); break; case 'l': /* This is the default action */ newpath = NULL; break; case -1: break; default: printf("Invalid argument '%c'\n", opt); case 'h': usage(argv[0]); exit(0); break; } } while (-1 != opt); while (optind < argc && (!retval || keep_going)) { if (remove) retval |= killrpath(argv[optind++]); else /* list by default, replace if path is set */ retval |= chrpath(argv[optind++], newpath, convert); } return retval; } openscad-2019.05/scripts/circleci-download-artifacts.py0000755000076500000240000000530613417146620023513 0ustar kintelstaff00000000000000#!/usr/bin/env python3 # # Script for retrieving the artifact download URLs from CircleCI via the # REST API. This fetches all artifacts from the last build for both the # 32bit (mxe-i686-openscad) and 64bit (mxe-x86_64-openscad) docker builds # # The script does not actually download the binaries, that can be done # using wget or similar tools, e.g.: # # wget $(./circleci-download-artifacts.py) # # A cache file in the current folder is used to remember the build # numbers from the last run. If there are no new builds on CircleCI, # artifacts attached to those builds will not be reported again. To # force full download, remove the file (.circleci-last-builds.json). # # Currently there is no check for successful build as the latest # setup still reports docker push failures even though the actual # build was successful. # import json import urllib3 cache_file = '.circleci-last-builds.json' circleci_url = 'https://circleci.com/api/v1.1/project/github/openscad/openscad' http = urllib3.PoolManager() def filter(x, job): if x["status"] != 'success': return False if x["branch"] != 'master': return False return x["build_parameters"]["CIRCLE_JOB"] == job def latest_builds(): response = http.request('GET', circleci_url, headers={ 'Accept': 'application/json' }) data = json.loads(response.data.decode('UTF-8')) builds32 = [ x["build_num"] for x in data if filter(x, 'openscad-mxe-32bit') ] builds64 = [ x["build_num"] for x in data if filter(x, 'openscad-mxe-64bit') ] appimages64 = [ x["build_num"] for x in data if filter(x, 'openscad-appimage-64bit') ] builds = { '32bit': max(builds32), '64bit': max(builds64), 'appimage-64bit': max(appimages64) } return builds def latest_artifacts(builds): result = [] for build in builds: response = http.request('GET', circleci_url + '/{0}/artifacts'.format(build), headers={ 'Accept': 'application/json' }) data = json.loads(response.data.decode('UTF-8')) urls = [ x["url"] for x in data ] result.extend(urls) return result def new_builds(): try: with open(cache_file) as infile: last_builds = json.load(infile) except: last_builds = {} builds = latest_builds() with open(cache_file, 'w') as outfile: json.dump(builds, outfile) new_builds = [] if '32bit' not in last_builds or last_builds['32bit'] != builds['32bit']: new_builds.append(builds['32bit']) if '64bit' not in last_builds or last_builds['64bit'] != builds['64bit']: new_builds.append(builds['64bit']) if 'appimage-64bit' not in last_builds or last_builds['appimage-64bit'] != builds['appimage-64bit']: new_builds.append(builds['appimage-64bit']) return new_builds def main(): builds = new_builds() artifacts = latest_artifacts(builds) for url in artifacts: print(url) main() openscad-2019.05/scripts/common-build-dependencies.sh0000644000076500000240000001275113402025764023144 0ustar kintelstaff00000000000000# # This script contains functions for building various libraries # used by OpenSCAD. # It's supposed to be included from the system specific scripts. # # scripts/uni-build-dependencies.sh - generic linux/bsd # scripts/macosx-build- - mac osx options # scripts/mingw-x-build- - not used, MXE handles all dependencies. build_freetype() { version="$1" extra_config_flags="$2" if [ -e "$DEPLOYDIR/include/freetype2" ]; then echo "freetype already installed. not building" return fi echo "Building freetype $version..." cd "$BASEDIR"/src rm -rf "freetype-$version" if [ ! -f "freetype-$version.tar.gz" ]; then curl --insecure -LO "http://download.savannah.gnu.org/releases/freetype/freetype-$version.tar.gz" fi tar xzf "freetype-$version.tar.gz" cd "freetype-$version" ./configure --prefix="$DEPLOYDIR" $extra_config_flags make -j"$NUMCPU" make install } build_libxml2() { version="$1" if [ -e $DEPLOYDIR/include/libxml2 ]; then echo "libxml2 already installed. not building" return fi echo "Building libxml2 $version..." cd "$BASEDIR"/src rm -rf "libxml2-$version" if [ ! -f "libxml2-$version.tar.gz" ]; then curl --insecure -LO "ftp://xmlsoft.org/libxml2/libxml2-$version.tar.gz" fi tar xzf "libxml2-$version.tar.gz" cd "libxml2-$version" ./configure --prefix="$DEPLOYDIR" --without-ftp --without-http --without-python make -j$NUMCPU make install } build_fontconfig() { version=$1 extra_config_flags="$2" if [ -e $DEPLOYDIR/include/fontconfig ]; then echo "fontconfig already installed. not building" return fi echo "Building fontconfig $version..." cd "$BASEDIR"/src rm -rf "fontconfig-$version" if [ ! -f "fontconfig-$version.tar.gz" ]; then curl --insecure -LO "http://www.freedesktop.org/software/fontconfig/release/fontconfig-$version.tar.gz" fi tar xzf "fontconfig-$version.tar.gz" cd "fontconfig-$version" export PKG_CONFIG_PATH="$DEPLOYDIR/lib/pkgconfig" ./configure --prefix=/ --enable-libxml2 --disable-docs $extra_config_flags unset PKG_CONFIG_PATH DESTDIR="$DEPLOYDIR" make -j$NUMCPU DESTDIR="$DEPLOYDIR" make install } build_libffi() { version="$1" if [ -e "$DEPLOYDIR/lib/libffi.a" ]; then echo "libffi already installed. not building" return fi echo "Building libffi $version..." cd "$BASEDIR"/src rm -rf "libffi-$version" if [ ! -f "libffi-$version.tar.gz" ]; then curl --insecure -LO "ftp://sourceware.org/pub/libffi/libffi-$version.tar.gz" fi tar xzf "libffi-$version.tar.gz" cd "libffi-$version" ./configure --prefix="$DEPLOYDIR" make -j$NUMCPU make install } build_gettext() { version="$1" if [ -f "$DEPLOYDIR"/lib/libgettextpo.a ]; then echo "gettext already installed. not building" return fi echo "Building gettext $version..." cd "$BASEDIR"/src rm -rf "gettext-$version" if [ ! -f "gettext-$version.tar.gz" ]; then curl --insecure -LO "http://ftpmirror.gnu.org/gettext/gettext-$version.tar.gz" fi tar xzf "gettext-$version.tar.gz" cd "gettext-$version" ./configure --prefix="$DEPLOYDIR" --disable-java --disable-native-java make -j$NUMCPU make install } build_glib2() { version="$1" if [ -f "$DEPLOYDIR/include/glib-2.0/glib.h" ]; then echo "glib2 already installed. not building" return fi echo "Building glib2 $version..." cd "$BASEDIR"/src rm -rf "glib-$version" maj_min_version="${version%.*}" #Drop micro if [ ! -f "glib-$version.tar.xz" ]; then curl --insecure -LO "http://ftp.gnome.org/pub/gnome/sources/glib/$maj_min_version/glib-$version.tar.xz" fi tar xJf "glib-$version.tar.xz" cd "glib-$version" export PKG_CONFIG_PATH="$DEPLOYDIR/lib/pkgconfig" ./configure --disable-gtk-doc --disable-man --prefix="$DEPLOYDIR" CFLAGS="-I$DEPLOYDIR/include" LDFLAGS="-L$DEPLOYDIR/lib" unset PKG_CONFIG_PATH make -j$NUMCPU make install } build_ragel() { version=$1 if [ -f $DEPLOYDIR/bin/ragel ]; then echo "ragel already installed. not building" return fi echo "Building ragel $version..." cd "$BASEDIR"/src rm -rf "ragel-$version" if [ ! -f "ragel-$version.tar.gz" ]; then curl --insecure -LO "http://www.colm.net/files/ragel/ragel-$version.tar.gz" fi tar xzf "ragel-$version.tar.gz" cd "ragel-$version" sed -e "s/setiosflags(ios::right)/std::&/g" ragel/javacodegen.cpp > ragel/javacodegen.cpp.new && mv ragel/javacodegen.cpp.new ragel/javacodegen.cpp ./configure --prefix="$DEPLOYDIR" make -j$NUMCPU make install } build_harfbuzz() { version=$1 extra_config_flags="$2" if [ -e $DEPLOYDIR/include/harfbuzz ]; then echo "harfbuzz already installed. not building" return fi echo "Building harfbuzz $version..." cd "$BASEDIR"/src rm -rf "harfbuzz-$version" if [ ! -f "harfbuzz-$version.tar.gz" ]; then curl --insecure -LO "http://cgit.freedesktop.org/harfbuzz/snapshot/harfbuzz-$version.tar.gz" fi tar xzf "harfbuzz-$version.tar.gz" cd "harfbuzz-$version" # we do not need gtkdocize sed -e "s/gtkdocize/echo/g" autogen.sh > autogen.sh.bak && mv autogen.sh.bak autogen.sh # disable doc directories as they make problems on Mac OS Build sed -e "s/SUBDIRS = src util test docs/SUBDIRS = src util test/g" Makefile.am > Makefile.am.bak && mv Makefile.am.bak Makefile.am sed -e "s/^docs.*$//" configure.ac > configure.ac.bak && mv configure.ac.bak configure.ac sh ./autogen.sh --prefix="$DEPLOYDIR" --with-freetype=yes --with-gobject=no --with-cairo=no --with-icu=no $extra_config_flags make -j$NUMCPU make install } openscad-2019.05/scripts/coverity.sh0000755000076500000240000000047213402025764017777 0ustar kintelstaff00000000000000#!/bin/bash UPLOAD_DIR=coverity UPLOAD_HOST=openscad@files.openscad.org UPLOAD_FILENAME="coverity-${TRAVIS_BUILD_NUMBER}-scm-log.txt" COVERITY_LOG=/home/travis/build/openscad/openscad/cov-int/scm_log.txt if [ -f "$COVERITY_LOG" ]; then scp "${COVERITY_LOG}" "${UPLOAD_HOST}:${UPLOAD_DIR}/${UPLOAD_FILENAME}" fi openscad-2019.05/scripts/create-stl.sh0000755000076500000240000000043713402025764020177 0ustar kintelstaff00000000000000#!/bin/sh if [ $# != 2 ]; then echo "Usage: $0 scad-file stl-file" exit 1 fi scadfile=$1 stlfile=$2 cmd="openscad" [ -x "./openscad" ] && cmd="./openscad" [ -x "./OpenSCAD.app/Contents/MacOS/OpenSCAD" ] && cmd="./OpenSCAD.app/Contents/MacOS/OpenSCAD" "$cmd" -s $stlfile $scadfile openscad-2019.05/scripts/docker-build.sh0000755000076500000240000000263013402025764020475 0ustar kintelstaff00000000000000#! /bin/bash # # openscad-docker-build.sh -- a simple script to compile openscad using a docker container. # # (C) 2018 jnweiger@gmail.com # Distribute under GPL-2.0 or ask. test -d openscad || git clone --depth=50 --branch=master https://github.com/openscad/openscad.git openscad (cd openscad; git submodule update --init --recursive) mkdir -p docker cat <<'EOF'> docker/Dockerfile # openscad build env. FROM ubuntu:16.04 RUN apt-get update -y; apt-get install -y git gcc ENV CXX=g++ ENV CC=gcc RUN $CC --version RUN apt-get install -qq sudo; echo >> /etc/sudoers 'ALL ALL=(ALL) NOPASSWD: ALL' EOF if [ "$(md5sum docker/Dockerfile)" != "$(cat docker/Dockerfile.md5 2>/dev/null)" ]; then docker build -t openscad-build docker md5sum docker/Dockerfile > docker/Dockerfile.md5 fi # Continue docker build outside the Dockerfile. # This is needed, as docker build cannot have volumes and cannot react to changed github contents. RUN() { rm -f docker/cid docker run --cidfile docker/cid -v $PWD/openscad:/github/openscad -v /etc/passwd:/etc/passwd:ro --user $(stat -c "%u:%g" openscad) --workdir /github/openscad openscad-build "$@" } commit() { docker commit $(cat docker/cid) openscad-build; } RUN sudo ./scripts/uni-get-dependencies.sh commit RUN bash -c ./scripts/check-dependencies.sh RUN qmake openscad.pro RUN make ls -la openscad/openscad # should show the final binary... RUN sudo checkinstall -D make install openscad-2019.05/scripts/examples-html/Makefile0000644000076500000240000000253213402025764022013 0ustar kintelstaff00000000000000EXAMPLES := ../../examples LOG := out.log SRC=$(wildcard $(EXAMPLES)/*/*.scad) PNG=$(patsubst $(EXAMPLES)/%.scad,html/%.png,$(SRC)) HTML=$(patsubst $(EXAMPLES)/%.scad,html/%.html,$(SRC)) OPENSCAD := $(shell ls ../../openscad ../../OpenSCAD.app/Contents/MacOS/OpenSCAD 2>/dev/null | head -n 1) ARGS := --imgsize=1200,900 --camera=0,0,0,55,0,25,180 --viewall --autocenter all : info $(PNG) $(HTML) example-data.js assets .PHONY: info info: @echo Using $(OPENSCAD) .PHONY: clean clean : rm -rf html $(LOG) .PHONY: assets assets : cp -a assets html/ .PHONY: example-data.js example-data.js : ( \ echo "openscad_examples = ["; \ for a in `grep '\[' ../../examples/examples.json | tr -d ' \t":[]'`; \ do \ echo " {"; \ echo " name : \"$$a\","; \ echo " files : ["; \ for f in "$(EXAMPLES)/$$a/"*.scad ; \ do \ echo " \"`basename -s .scad $$f`\","; \ done; \ echo " ]"; \ echo " },"; \ done; \ echo "];" \ ) > html/example-data.js html/%.png : $(EXAMPLES)/%.scad mkdir -p `dirname $@` $(OPENSCAD) $(ARGS) -o $@ $< > $(LOG) 2>&1 html/%.html : $(EXAMPLES)/%.scad template-pre.html template-post.html #echo $(notdir $(patsubst %.scad,%.png,$<)) mkdir -p `dirname $@` sed -e 's/@@IMAGE@@/$(notdir $(patsubst %.scad,%.png,$<))/g' template-pre.html > $@ sed -e 's//\>/;' $< >> $@ cat template-post.html >> $@ openscad-2019.05/scripts/examples-html/assets/css/main.css0000644000076500000240000000142313402025764024101 0ustar kintelstaff00000000000000.green { color:#518e04; } #wrapper { position: fixed; top: 0; left: 0; width:100%; height: 100%; } #content { position: absolute; top: 65px; left: 10px; right: 10px; bottom: 10px; border-width: 1px; border-style: groove; overflow: auto; background: #fdf6e3; } #logo { position: absolute; top: 5px; left: 5px; } #logo h1 { position: absolute; top: 2px; left: 80px; width: 20em; margin: 0px; font-family: "Open Sans", sans-serif; font-size: 22px; } #logo img { width: 60px; height: 60px; } #image { position: absolute; z-index: 50; top: 80px; right: 30px; } #image img { width: 200px; height: 150px; border-width: 1px; border-style: groove; }openscad-2019.05/scripts/examples-html/assets/css/menu.css0000644000076500000240000000471413402025764024127 0ustar kintelstaff00000000000000// http://www.olivergast.de/2012/04/18/css3-dropdown-menu/ #menu { width: 800px; margin: 50px auto; } #menu h3 { font-size: 12px; color: #fff; padding: 10px; margin: 0; background: #000; line-height: 20px; } #menu ul { position: absolute; top: 30px; margin: 0 auto; margin-left: 20px; list-style: none; } #menu ul li { float: left; margin: 0 0 0 14px; font-size: 14px; font-family: 'Arial', sans-serif; line-height: 30px; } #menu ul li a { color: #000; text-decoration: none; -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; transition: all .5s ease-in-out; } #menu ul li a:hover { color: #999; } #menu ul li div { float: left; width: 4px; height: 4px; margin: 10px 5px; padding: 4px; background: #999; -webkit-border-radius: 12px; -moz-border-radius: 12px; border-radius: 12px; -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; transition: all .5s ease-in-out; } #menu ul li:hover div { background: #000; } #menu ul ul { position: absolute; z-index: 100; top: -9999px; background: #fff; padding: 0; margin: 0 0 0 -5px; -webkit-box-shadow: 0 10px 20px #888; -moz-box-shadow: 0 10px 20px #888; box-shadow: 0 10px 20px #888; } #menu ul ul:before { position: absolute; content:""; width: 10px; height: 10px; top: -5px; left: 11px; background: #000; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); } #menu ul li:hover ul { top: 30px; } #menu ul ul li { float: none; font-size: 12px; padding: 5px 10px; text-align: left; margin: 0; border-bottom: 1px solid #ddd; line-height: 20px; -webkit-transition: all .5s ease-in-out; -moz-transition: all .5s ease-in-out; -o-transition: all .5s ease-in-out; -ms-transition: all .5s ease-in-out; transition: all .5s ease-in-out; } #menu ul ul a { color: #333; text-decoration: none; } #menu ul ul li.all { font-size: 12px; border-bottom: none; text-transform: none; } #menu ul ul li:hover { background: #333; color: #fff; } openscad-2019.05/scripts/examples-html/assets/css/solarized-light-linenumbers.css0000644000076500000240000000060213402025764030575 0ustar kintelstaff00000000000000.rainbow { border-spacing: 0; border-collapse: collapse; } .rainbow .line:hover { background-color: #eee8d5; } .rainbow .line .line-number { text-align: right; background-color: #eee8d5; padding-left: 0.8em; padding-right: 0.8em; } .rainbow .line .line-number:before { content: attr(data-line-number); } .rainbow .line .line-code { padding-left: 1em; width: 100%; } openscad-2019.05/scripts/examples-html/assets/css/solarized-light.css0000644000076500000240000000263713402025764026266 0ustar kintelstaff00000000000000/** * Solarized Light theme * * Adaptation of Solarized Light from ethanschoonover.com/solarized * * @author Ethan Schoonover * @author David Litmark * @version 1.0.0 */ pre { background: #fdf6e3; /* base3 */ word-wrap: break-word; margin: 0px; padding: 6px; color: #657b83; /* base00 */ font-size: 12px; } pre, code { font-family: 'Monaco', courier, monospace; } pre .comment { color: #93a1a1; /* base1 */ } pre .constant { color: #657b83; /* base00 */ } pre .constant.language { color: #268bd2; /* blue */ } pre .constant.regexp { color: #2aa198; /* cyan */ } pre .storage { color: #268bd2; /* blue */ } pre .string, pre .comment.docstring { color: #2aa198; /* cyan */ } pre .support.tag.script, pre .support.tag.style { color: #2aa198; /* cyan */ } pre .string.regexp { color: #2aa198; /* cyan */ } pre .string.regexp.open, pre .string.regexp.close { color: #2aa198; /* cyan */ } pre .keyword, pre .selector { color: #859900; /* green */ } pre .inherited-class { font-style: italic; } pre .entity { color: #b58900; /* yellow */ } pre .support, *[data-language="c"] .function.call { color: #859900; /* green */ } pre .support.method { color: #657b83; /* base00 */ } pre .support.property { color: #657b83; /* base00 */ } pre .variable.global, pre .variable.class, pre .variable.instance { color: #657b83; /* base00 */ } openscad-2019.05/scripts/examples-html/assets/images/openscad.png0000644000076500000240000024072713402025764025436 0ustar kintelstaff00000000000000PNG  IHDR`DLgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs  IDATx݇Ց?㟏`LB$@A!@"(""(@@L068a TOuu۷{'T= Juzz:?;W$ :ÇoIceЉɰSQgqgɉ#wڵ+=f$V$ X-IZZZZZZZZZ ǟLvPv `G\W$g'#Pjiiiiiii5~*;H X?BF^+ܯVKKKKKKK+{C`ZifgjiiiiiiiES[.`!]{`$wTjiiiiiiuQ>NHl#ټJAAחV_a(^رDr׍?TjiiiiiiO}cSv`':$sV6,EA:_J X X+vv Z------: 48lU a.K~ʿ{o_Zo uY?#* V tdaN:*d:> hןp(` XL7]}ݎ3wPjiiiii[C, o VIȮc)+fZx@_>>zx(`9b v쌕M`kd`Ŭ+7LծVKէd<Z[ jPdF0ZtBVKKKKKWWN+̋2i XlQxMX cW̮Bvɴ* &mjF+3@׫ ^ Xl5WW,Z6 Y*Lkתyپ!N X XȜ|,@fdOVjiiiiiR7U&WVXl+X3;: ]xhiiiii VEjh7WΟ_v,GV[`!s1@척;``5Vf]bVKKKKKUNop(` \lm6 Z!@ i5y :@UXع;5yB6k6L[)۫e)5DQ3UUX^-"d]]jGv긭zmTd[Y--- *=ʢ` `WV[>`Z E,BpS[G^vbVKKK+cW ׷eZ1WVz}j-Xɗ|l'5LߣS---,(Vw'<KU*`ۆLyXdtvYWZ`\ 0 wRk3U*`"' &ogBv \ZZZZ2s8mZkp}gU*`m؅d Xl) vʸ*Win(7\DkYp59V7qV\ UU`9b]::NbU['l][Vv2yjS.@Vb% U*`yX@,#L!bq֥Dpmo4e2]׷k"1^?fʒ# X׬xm&`Cz[b'$N!vc/9[F| K*` ,ⵙFr"`y'vc눅[q5Ď9![ᚵ*{F9OKK_2$ WīVUHWQ(dڄ:b'A瞼Ef*\ӏ $ZZZmZ^W뽔puREU*`}4J@; N`p {~ʑ:*:\ZZZچPp'NVY}ݎ>jClw[=>L>~l=e>j2_0*^'$ Xll?gNI%F;j8Q~2ⸯUWEWc; X;(`]^XV+i` C, b{Ru.VZ>\1sAٟ#ZXtd2*?O XVk좤.A%@`Aµ5JSJ--p>b{]\?V*` $ںpާ MN٢rΉ_~WABkJA{Z*\ +MٟCJȊ,^sPh"|rXwU*`;`Kg쐺 X87k;S=دUZ e{m*b#O)` Xl&Ek뀽mM(bN%"bBk\!UST--&Tl=V6 סVVXVX#Q,"!+!wacϩ6r*\K+Mٟ[ *cIx=pZVUvͼG,2`!X { _ _(\ˇ"VK̻ղBOpVm`1ٵ ,dbM놡=c0eʩ"xv$8j p庛t,`9b V,k;>+Ȁu!;'n]M.ac=QĖ׬h*b:`U:LY)i2\,EVXk+C aa ]XX`(ȓtbO UXF6  WVTWXHkV>pU*` ,,dL XL:Fva'&o$y1``! JVk3f5\)sV6 >wp[ cV:`w"Vw:bQDl;$*bڴx"xul;շ K\db' ACPiY$JpUji@[5;P+l ZJU*`yNV"bE;v\"b앣 `҄va]tֆXks᪈*"x}?Z\ X޲pʚyߏpR)`1UBo̚5 vkZ KSr-*wZe=\f,"VUv/`1XzZV,fmYYl ;钭BBDĆ]yX,d_!ᚄV+E+Oٟӵ""xMh$e׵@ XXV] spR]0i; `1$5ĞEX= ~R\hb3ZZ]=ҎWW]U*`;Ԁ7~+P"b Xi,Ed`hV GGµ9pŔ]Kc j6 ax- 4 XV[,d;+lVZ;`g] #"A7bF GۮpMBkUU`Ϋm@񊀵mkU*`L] vM",E,c,"`ث|$-M`q";$C>o: UU@{^m:e XVWX,G pRv6,"ABx XXAؾ}pm>\TOٟھ$ZҪ,~@'e9`1BfO: ,G ^Gta7XkpUji5X!^; \ga p\ Q*` XۮP,^䢀 Oges&ncP^}Q `+V#8#օR {d 2} -Vxy:PZXՅW۟o X]KXD,tR ^1ӡ[[U&_ZGD1B?"\״WWM6oeI\x((hwZJ Xlgv[,c"^墈XȅkXL ,E%gta #8įPĞ@j`F `V|*`RTw׶īE"VU`1Wz̀_fO"^1X:BX 눝pޖ&XS0 {L.xp.bݯ2H6j}aUmwUV݅U*` K~`oQ1ؕsPB` EYE;\2n+5$l Xv Sl ]XDAGE\Ҕm-,k.x|%jGVU"`1!z̀, PRĆ` `g1"bA.U|+15b"]X: R*\W8^c >Zؑ"*` Kw1x ^)bA,=h:~b".rQ"b1;-L\cء G] |[}j+VT&~We iӮ?b X?`)^W >3 ,ll=Fkj1zЀ""`1XH#c`mյZ {p-4eAK2WuY[Ɓ rk3᪀ Xl;v],,D ^i XD",|;`|"ԣ=1؅= &Xl}U6 X-땬z]m72 X{ xW p@`uz1"=f (bM#KA>[+{r{f3k `.؅"?WQ6X-h /m뵭F!] 3;f0 Xlvӊ]*w,·G\","{-,$lq~2Fr7Ll_5wa?,*\q{Lm-RAU+[I^?iw]fءuA[9 U2`HVXV@,_@(`!x++ l!e)`/gGAB=i {vM ;Xb[ܫ\q|(Ҕm -V֠zXu]PykG5ڮy6B~[(`,"o!૴*e3v0EKAcoT.8ӁeʱvIgÚ"V$j[ ^9`p i1Dnlb쳛O<0?o<57ɓw xݰl CMw 嫴Wڋ\+^v=:`!8B@ XJ 2vvV7xqi+rG[e5`f|,nd)bmDǗkQ6 ؟wF{b+OG]{]C-W|E+Z1k\ )Kk\+.NX,$l^1g_iGTօ=  JS/ {qo~$<ܒ6Hxز8b[w?VSuڅ{T Y!ԍA1uJњ\9Z yt A6LL+q.a(` @[+B{k&9' `YY, oo=-Lؓ7#/Dfaa@*`:ǫ.˾ղq#FGlY- ټ 8dwL[?&'yCS6`7"V\p'XKt BkN"`k (`Y5~d5xREBþb;/]Xk1pUjut׿};׎k6XX`q^X٢c)dn Yy>HpMW#7[;*2 xt.a(`5Z5 ^1Wz"׸&G˯qA,E"`/!E:`cꀍ!6F<*NL”AK+2ގ+ͼZ^lWآ[-@fJD"Z}jCk3*uTr,5xk[uM(`2BgWi!^i(`)Y+=)/r%yQfEVkcXڅ&w+ ᪀*c^?dI^Ɓx^1E'^ؼ!|,,52phMk pܞ3,SEl5pKZxk(`W$]'mKɚOR55E.hXH_sB .,ykpUjuTx}]x혇["6Oqd+M F _v W1 yhqh'`i^)biG,,"Jk_EK;`)`q,,E, xPBϨOc ;AYX*tZQkpÞenj̱\EH׶ʬex4 ز?| %!X YkZy5*cj9 (`5`D,@x[vH AR&]㢗 W ,v̈gVE`XD,?K!b)`6ŸS W?7hie*Xu+'ɧ28"!⫝̸+k>[ Bـg=\!:'\%ွ f_ `7 +"kUs"စ ^)bDltVXzȀ"Pb 9ok\u8)KB>u"bYc1_ ઈjۊ{}O}  :n@qp SHl;Y ]$ȶ|,=XDjEZj+b~oF(`W XiYhHpBhq5Z тPB)YDd(bט.X XD, `#VBµXBإgJٟˌ[I}#5J-c'kQBcپ0n\= p6gH}x4WV#!ֶBw`1t+KWhvκ|k XF\䢗5. XX<) `!U C;:`},p-4eJVf'v,^ԅ ;Cc-cт$Ė1+A/[ yr5OѕY=gCnDB,UB,<ܺsi=X>x[pF6iF wK;}NxP9Y!sX,G,=υF U6:}l}H6g ;PPͧ۬<zqȦlpm@#p5YIp?MB ^1 &m+!6P^5& X,X X8f@b#xH]bB b઀j­ ym}EjVV]}Xǜ{dB604i yνB ͫv5g`)`Y+GBѢ]tv1VK`! X<'=(`Xc'rD +\+ZZсV [r߱[C[6V[1u5Y@lѐ-k>U;8VnЎbp # x@B,•& Xi}]g!b -+#_9`gEˎ@Ƒs"O"`XV,E,{jꀭ>QkpUjL+5pK}ODEqZ>8dBcWP]~Y0K\KN| wג\ڰW=kKG$Ć ĺq|╯ hAK큭C񊡀R^1X,AB(`T#3,G,v\=#j p- X }86% .,kUrݍm&dW^yQt[k } Mo:fm~>#UB> "BbXBvmc3qXW =#Eb(`! sA<+cX, 1!lօU6WQ̄B ˌ[)l5WbWV2``#s}GZQ Fc]]3ʚk7,f}MN8w pd+t]16_#f"! re}UK/pPRZW ,Gߋ_)`X4 Oɞ-+2EғXD,ųu@>hUV>"x%׆62["^?6~Drd5S|xUTz: iֹvECL|{W 2`{UëX#.z}# ຎ!V:# Y1Xi,xb(^1XD,KRB(`!Xqfx/E∀u.,gaֺ ᪈*뾾7}6Zꬲx^V;g]5GB(`/?dcBœX1> kuB5_*`R+xn?"[$b[9̽fH,>~8r`EBl {ע[ W6.R ׆CBJl^*/>JjC,•#Ͼr޽ XX~>6EQRg`x"bc;` `9bXX|EK@ƜMī,"EB,3@BB,v`*\+)8ZZ[Y^m_ ß٣.4 "]k2k uÂz@"Үppphh}}#IB4*X.X~:#*BJx刽a&X8b0mc;`)^)bt2E]+ uXX) pŸ7]gԺ )9ZX#*Շ[)7HMl#Vi:^? ̽jl-oPkx]Eج- u_<_WL`6K@@{prJĆX~:v"^9b9 Ar3 ['^!23⛑+,쀅33a.,2EĚj:`!~?>Uկ XUUXm}U0BLiu@=:wU?윛W|XeAux=Pf,+(+mLЊpxK pmOW 4`pAVӱxy"=xPPRJ;`|vy[P^|ַb+\X+EBS,` A7= .lU WVenan>oօX/kZ/kֹ&v_ ^y60ckCl} ZQa4d3ucgoA{uG7# \i\+Wn̈́+YӱG\: YEZ_ ̽rBX~R"bXD,=%xPX,W1 ő,ta?xy9@B_2]XcPWH-7KU ઀ʭL56A nElx-?N/H"w_vX+xxͱo:.+&wίCծfIpB~x!V¾`H8`m]XW b%W W̝˪px o Erp+vc ^)bX+F:dxŜPb_ 3/cX8\Їl!@Bpvpmv86I]Xkv*`r)p!Wgkg)`k^a^} ?{jyd8WD uDnY*pOzT4>Eľjပk&•FBl.•FJc9bW̪BJWgQb(^*X S<+!'oəpFBk"bX!ꀅcx.u`)E},RGb刍_Wo>ߧOJ_`o9!6xcWX\wCԁ!*v8` ,U:mL8`XDtJk!+񊡀׸ R5]#]X,taUhAx2E!oP6H< ͻJRtD,ͧMbݓz_RHz1h+!;b9``[I ^\b$ĺpAnYSW RW+GlxBZ וG `v9dHI PB(`1<)' X"Zk ]^@,|[hVX7H1:+qW7h9ZZ>ƒf4zIx?F?'E_ҷ/K>B4YԅM36X@+-YoU{.UQrpQb8`p+E,uL8`Z,#xŸ{2q28 ^q,"7@+v^10=XXvS \7{@VU}}u_[yӡ-2ɐr׶|n7(6bXr,kfHx4yVB/`:Y+ͽrںM^׷W`XD(^9bX"bW B(^)b)`t,"t3kE"`XD,=f`,BD: x{j.,ۀ]XkpUjJoハjՍƫ}}%qط*g|GX׼+!QjHνrH,ūX.+ ,=+!0uۛP"^9b|,G씱[p.X}W&#5RB(^k\ P8 ,l+_K o9۳YpmXTe>9u k'ַ$+-6|+v_j, w &`o<ph JnIuua_Њc[`}o=DN\o9XX%VzEAb PR"^9bWXA%.X,"EB,쇥E,uaU]Y!4x_1`?/^?–ou@,"`qMVF[?x, wׇFw彗FxmA(^%J倕hoR"2p#6-atؤW}upIb(^9b|,G,倝6{1B(^)bWXXX~  XzX8fK8M .[Tu,m#/3*β=޲mOOvxmt=VɌWO^z,l&W b)\4>Mx-m5إQJWXi5NDB,+E,#xXo͹XWX+,PYMA5f+,?dpQ_ 9aH,lxw=W rpW"tX,|;]دW.pm X-g|Wg9P eI: jk®W<kz{ k[h8^"W?JXDܫ- b}opqn{zl=, ,JC N +E,"KWhŎCF xPk\N+>₝XD,,:]XP6W'g|avA$lV5,M+*5T؜@G+G[VֵY_VB,5vqWĆh}FoǺ6\ilx5īXe,+,Or \ G 8`# X~_ CcfXX6 `1µ1zʶVUdY>I4f= [Y:k>gb֧*V"_ޢpM-i;9^1p"JC:{&p}BJxER1 (`)b]b(`!n%k\~ 1sT!|pMWV>zM;FBl+6֢lÊ} x6uq8b|mtkg <4ج-p+ 'i-(\XZ WX W t,BX+G,p+ W+\zd5.X@){9Y," B$b(|5;\!;|ͤBetuV}V|'`}2ZmyU$^h ҏiހ}Dl|k+-GV V[X~25 `oX {EXWb4b4`al#VRRr^bjb)^)bW pBvߌ1WK\v 2(`82,uX`a,"{I[ JSZk:M}>څmi\ D myt6&+{W"uizM X[X .9&-`iǕX>6}ks`yUBl.@uYe`W %xb(^1.,E,=dxq,"pB ^;+\UVluVX5݅m&`θ64'^x{^} lb x?yMXqA36\]GoKF,ǫX4WX Y•FrB\W< ׷8`!WX~1E>΂PX,\B"b1RqB1kz*`La?J,?*>lވu4O6!5& '^=Yzm> |X XG[µ-iub%x:Zi|k{ `csf_RAl4\_1DB,+E,#xޖ&3:4t RB%`k[ K\5Z6Bl/X>Zdv̈jV }gI~*puVֻ`t+OSOfAi2U~l:+Rm޳׬-ׇ`wm-~~2X V_yE뼼k}E<e@g_%J8^%X) PR"^9b>~Fn,=bA\"^kJ 5.k `1R:u Q.5\i6VI-_X j I٢;z,`ux~|lxW3)Nv*`%ȵpm[iƽ"- X[W-DVع.,+**r. WX+E,"E"`K\ ~`"W o NL ./D+l+}ˑ«ki:i5ÌXKJX+lpؤ[\6RJ]6c lW  qB(^)bW 녧Ä@(`Iʏ@#Xz= JeAb:BK+M;^XYw~פGZYZt5WzjVze}JX>زnh2`k[ē?#h42ؤ[>xz% EP. W +倅_.瀅PR"^)bW tQ  XB_V:`,o3A y`kzҔ)&y!L_ 1^+nWcF6 ru.i p tu&VWWyEP^w& WX+,C ׷ JC񊑮pQB%. Xz w"`a,"w"`I= lpUva+?^v_%˹TB`ӌ|:>&+g=FMyM|֠b}XY*z-pnwv`]\bYn\g&>M{>vͼGB{W x:VB,+E,+,*~ٝ*ȩ6Dp+\ix=16`,nR|t"\}\]X؁ֶJ+ ~Y>ئ=81VN3ywM}Vkj,kgbmbs,϶VSi:YnΫ/`qOȯ_SVB`ŠW ხݰ) \z^?I>JkTSu_? w_.lkzkހ?؊i@;b)\%^1p:BJKJ xPb8`)b8xWp X^B]゜08X`/ ]ٲO aC`锦BiJN?` 9N^xv_G ls $χ94,Dz%]4XX V_R>$}xf^m^%ĺ.oaV̪giV.[vΕD •J~DŽoqB(^)b)`WX,"JKwR"bmd9C9C>K XB )WZ|ҍt_q|r6`};PՅ}YGU5ok4r `#{}kXiNXc-l[,ElҹX_r>s&.rĦ}yhsi4.x{j +k+,#xM`OBW(^!A\l @,X@ _ tpUvA'M5W>gdtaXlaxu|o>NC{չ5kk^; if5XX_r>wO5V 6Ħ}Ż$X:rR"^mo@*vحL8kWX|E{_yw`.`.,">BB 0 `0 pUvA.JIJ WZIfkejj 1$65m"5@{^SX vF.m=q@,VB,\BHuuacH$k;X`C,{mt}K, PR\1"`(^%J ΋BJ7PrG\t w"bX XD,u9%L'e)`?&X>1xp+dQ ,3>'w.i@:#k 3#;āR/|Bqg\[Rw_]G kZ6`cwX,|X te˶6K<`9bmbmM>a0."ZeH|z%U%!VgIc)b@(^%ڶG\㷊"ֶxP,NZ%]$] Ped%.+^,qApg-¿ g WҔ, >~Fp(:yǿ{ 6K6i3c{\3nH5`c z"5`fXbxgYM:+֧ MP&!uplmtX~XiGk| ^퀕7pR"^9`;zi-pvk!QpN"^9`!ؓj (`+G7^EWlfWl؁/`Sva/1|<ӌk+|/l%IX۞W_&~G^ X ]g6 nXX߇[!^U:˻Iuu6H\i8^mNX+E,#xPb(^)` XX. Xz ,:;#PUkz1;m'eYQZk7 ض ~[gl- ][ .mJ9koumN: taˉW#YĦ9^c V3YXw/`V- M\7 x!u:֧oQBl+ xEr ^: Ȥ gd ЊW8`K\5 ߁8F0uV\Z|,lw.ta}n%4 T}`xIsa dv_{^3MqͲm ̓JO.lIֆX ?AdSZ16rҎ Vb}bW Kr&m q\W +R(^)b\`9bXD(RFN z8]`!X"`a@Wl| BgdlBo_?Ek$<h}dA~сI"b@AW 8\ye5#=w XXשX YV 6X xvSӱ`- XW KpEJЂM`pBX&'),^◸׸dB8`a-9PN p= eK+ǂO}NF.rJX{f#Ff\0k+ֵ& k=V?_f?G8qAX ?UJ/`!V :6N"`m,n7JW +E xEr7Kb'׾#W)H>%0tԣjBJy/ne8 (\ivV(c^̿`IM"둗ψum &Vr辦\el캖I[p3۩XO+XH̃it\ Ť,EwcyMuA-Xl,Jlcm;`moEoi"ARR"^)bW WLZB/ Xs ^aqQB عWmSQ&UA@`߷'G^M笫ퟝi@]׵,cVd54>HAZ 4FRTl<`mp}z^&Ie5 >l{_]gc]Wؤ[ 4G, nԩ[,+o! ^1tzĠx!`x;G ]Xw \\!}g^ʡFMYi*yV!הjMV i6 t#`mpG[Igb,G+MB<Wf+#jC,t %B(^9b x{CQ +B xIqF/q!,6P0FWv2\ܲg.li5P0>1,}Bp1Pz6uɺiZlygb\,OXb16nq W 1&Յ%Ӫq6:J p: W +;pQL|KpN{L:o ߯}=m֕yl[Q᪀퀂Oj B,l䔬͠tc l](MҿC.k 7)KDluk0,sifӀk+MXټ+^zTNS4i}x]4>Abi8`:*!v#q,Ķ}@ xm+{:b)\)`)^)`t++X . X~X{n !v*`;ТW" oBl٬&#--iiD[) RP`t_lcy ??;麖9Vb|OTlV)YK.Rn^U/`7KjC,e^%ĺ6 `ӱ>Wk}UB}]JXbrB(^1W,+_~x=~RX=eLo1Fa|ր$Wi@*9P mHs"ZNR6p}&|\Ю"qõk;b>. n5 ΫX>2X+F `[p+mx{BD|KX`hMaV_"}F6 XD,2lFUc* W9}glie,G bw n*HfE <&m{N+܏2ebsl`?x.!66 ?Bl,UJRvjl$f^%Bl,lӱF#!ֶB" xprVXX*^06p Xڅvk^]pM+U ?;0@b|yZ|ה[Rm\S6v&6{UBjV~Ȭ`%`T'b qu]}KJX߇[4.J'c%>`,+E,+  xERkYX*E,c X=!kV@SX| 0zXkEHlnH\k@Wp~#v̈oK+=BbWM_=bWށ\uq9/ ^1XӾ,̥Khغ* 8\1e[L+C/Y&6F2;W.{麰1~I=눁O4S[D,x- l K2ɢlҦfzt&V4X Hxuu`9\]]63恴Kw^iZWW X=c,}E~[l&V_!η `}Wf:Zi5Yo6؍w \,xpu!p+,WXi•U ZMC ʑEwrJݱpXuqWl!^qw-|lu=3!e{L+efX b+=jl$lZ>8diV-Ie /6WC, l#lo1R5ͺ,,F,lB#ʓw1"ʓX>2HyUb9^9`]p)vi8^)bW +,º(^)` -<%{j,M+\?e5 Wl|" /p9˺ei;bY·͵Isw@36 dYWep Oju `m,hD,= iU)Y `,r}Ult06ںW #OD,+"xER* ^1x Ucꀅ``Lv;\mZe ]:be#4 U[<ν5a Ö4+[EV6-b_6'b}!K#wa$&62,pnpuw^9b[[ZK*!+`N xHW+qٯ^:k&X~uKe*\9ze{L+Eg ",GnX)^R `IgV![Rz;%`9bdVsm`31[XwVzj*>;9Jsw;x};^ŤūeMVCxY2[c-׃=yƽHxX+On\,& Ib)`4Yb9^)`mes +nxMԅMX+AӚCuv"'`%+!vݢj8^]u/q}ˆXXղ>˺}U4>`:GH,DZc7# W ,uƱ_K,D,EC.k4wϴM'5;`%FZ:u[/K3.xtT3jxV3 mպa `s^ݘT}5MEt_; >'b,?+5 b^Y&$R$6\lX`6D^B+Gs}V? ǫaxp1Hx4H .,wM *\1eL˳>) iva߭+m+1ʝܠԆVaxϸe `@Ax, m =z\,"p&!V(Z9`i$~a$fc\Mzy=ޒn]ktO\EJxbFp}uWpQRb# hQk\`,.QFS˴< _x\$pFK!FJ X b%JzEVtSjrۿ>yHȪ M&Zez}y9`kZi@`1>MBt&VkVs(\} hnHke<X恤W>B î% K: KHW,3K 9㘯3~ - W 0ۍpUF\,}ش]X.>ԝSf$j%i0q5Ն>ӚFk{%=jU吵v@k#s` `\oU,dL.rlp<>5xp$t_C9TB_ՂH+(^%B C'dx !B ?kp=ejvg`pXzĀu`Jsiź =->h+^-~H+,~85YPXK X {S`^ kbmW IEK pi}>˵}]EK R7PO؉v!Q` FK,]xv@M.j'dc#(>٤_i6 JlmL{;xy9FdORVQ{^ }^H'b `7]Mb9\v*bo]Tι ֬bpulv^1IlV1I4Xi}+,=@K xPR^1W c,_d9`g]clQp:.P4\mT 1l9`JM˧;'Hߺ l-ҮȢJZ%>ԪOڔUYH!Y}Wc; XY3ckU, lPp*#J|*m ? I2u_Xbֶq5/siaY5y$>ڢf^)bi(\mM<qmH0x=y cWXix=dϙPG5,(^)`EbW%)YXKUf+ `k4Z`-_vVmom3.X$ V^}csMe/J[|2u_}N, `ӬL,Ek#EJlIp =p@<@wm+ف> 񊑶pR"^)`WL`ۅxmx <'{e2` +`ۢl!ͨIDAT:3Fхg2qF8mfBzՒT2lHa `y2sMV nh`}jk _ zrE/`X[vӍ?%-`[иhֵy@:<`JueW~21B(^1XW,{QBo8ka#rF AN ::`mQo SٻRw0q> ooZ6 4 3s)Vd&-i.jk3Xko8@̯_LQ,?+.mq4i o8\}hIB,XQ[::w^i, XX}AbPK,zйxx#tnwI]7~ yzmQˑs94M&+&A5+*, ٴ,? H ؔRmHkd ؤZXbօX7E``mpqvpJc,Elң-Xk`m\Wkktv`%Y YWX:J񊉍0J o  l=}7~dc c;:~=(j >Qr'|˳"`Rl.lVJ3K>ci*q+^Zyg@[ Yyn(\ll=p ؇i`,t IMu2mM8^%lpYE+;F;_KJ˷pJEXa,2*\!X^ ?.v \/ؽgliy|3F+|vI]X/:>gi%&w7m!Vۿ>w [|>[ [u/q=jcWm@k,`ՖFq.d,' iP6i@^)b6@Fxy•&y% C:4W^q XWgo ,;sn^m 8` 6K^b]F uU Pͼ*ik I[Rnp>JW:rkklh}IXGmօؼO4 X\;EyWW`gxYW`4WX+U%w_!p@ZEuu`)`X+AXXsX8fp+ W^} weLˣ^ >'_I};u[ݰKbv`XmCyUXB|7 xo~L<ʺ"+,یk{^iֆWl:J'bi콫{}MhK<`,"Jcl~XюӱW +"VzE+Y`qϿ"b鿃 cbx!`Xx@_7UFk*b} hEGw]˗~ &r#5,`0f2`iRJixM; GZ~'L+ֆVl҉X< P%-`V4]uu7LA8`C\2ɗBd}6b)\%JIW/k+E,}EJK~vW QHW+dVY``+5@*`۬rkM+M;b%~W7ՅTNʬR5Ö aO\|WdI<K#rEy倥y]; m"5+`]޿v71ΥHxuh:hI,G:pu2^/w<޲rV^ǫXMg xpB d9`9jc $^x7M$BSB``cێpUWltyR"Vl҃7%`1y<z#6z̡@~ǂUX} xVee|-yPLj=ۚjA^yl1@jˋZ`X ib)Z}+u\}lF>*vZ6\ilM:KB,R:}v"`4+Ä}?gB*Ђ+_j:W,]!f,F gPY}ݎnez&Bvg|R+9XF7ڊXM,m⼩cXkZXiˀ׆Ofjq؏_' yrֆW`R]B ~"#5 ."XyXZ`9]mK+ pp:P"\m/ݯ6RRJ(^)`|}{%*:+d¨9 xE0u{Wk!Ac._RAlAYTH%캺vz]a>r1w4XLl&=$k iƽLyX"ye<>嘥hֆXSpMB"ǣ-`;'aq6i!#V:˯ozLhjxPb,ūXC#`lv4,|?"^)` ?9z6v \mV~7`X闦݈XUC;#Y  wS]HM${lw熁T[[ uBՆWuW5Xm M<ij9?SlZֆ׼KR~#Hxm&`]EJgb9\3 V`]EJ42XH;_9b?ImpͿe1]F`\(Gm@d}XW +E,ū/`.,"Xڡ/_Ile&qKu*^۬(o`!PDl yΓ#ybInB6\y,[ݫR\Za5S+=kZo(`<$A덻D"p.&-`t?زGB,@Նؤ\3\9`}VgIxM8^s"`9^1 -W_xPB(^;eLi?93quW{*W]i:weM8`߯!6 ވZ[O͏n=1=T]!51ؤ:>g`}7 H1SE{Bx^N8刕.lI).VB쭋Y $R;lrh\M:ӦY#[im}WXXi|;G`y_u_ivq_3E"z ;S7]9Gl'UۆE`!pyt V6&nգj[6 4iE1;`yXsyM zZֳF:.56.V,M`\ 9\ gE9\]umE:ty+,+,#6+Ͽ^1>ErB ^ v"`aک`;zL(cZ)8`QClLf~ܱJњ7\9Z;>Gn>>Tv&l9?T'! ?R$)✫$XC-c-CrZ&`Wnk&ޞ<{Y}6 ku+MkExx _d,jΞW:ހŔXb)XXz.5-` ^]IIPwm.3+mHYWOXi} x8$ `91ځoX iX|?.]⢀||w2\mXz w(`k]A,?=6 g%\Zs\55j R=WayqK-OR7 *^X)ܷ=ؗrӰX<Kʓ73Ac,Gldޕʲ!wE+|$hK,XitF+•Vz_W"Cx~cxuJ xE6='~,, ۝ Wȼzƕ1A^>'`,$ WppmIh-WSymTϙnjMN֡~麬~vwkl+  i+Y j={V+BJaڰ56x"VJ"bZi ב p[[qEK6"\E8^)bG[>IbYe>ZE;W W , X xCֆWb׶R,`IXؽXV_]%B I[a66Qj]z; >i0.,i|$X>  NSr1_ ûN XD,*KZN=BʶVk~ AZqVp Wozr6؄=i7 ,OGZ `x`kl^mxd XiX)yjKR/!6J=qk闑8|uHEڶp{څ{TN8wHy@k,~.+,v)^%"b+Ӈu`gOvn1l EUk#pUqYxD:`%~ѕ~|L׏9^&+ p=g Ⱦ$CiVdQЦ+?Qpk΀u=32C-YXzVJk:+v7~$Ytzih Gk-`fNR~,ҤA,,E,ԍM,uttU,"o ߟIWHfFX\m̹6 )aZ  {*]cS'cMZZ W 1ľܮ|l?R}tDCOzҙ֬zVYu=ݓZ(}yfx}@{J9n,Ʉ46J^%#H`}`8$&m)Њ =K #.ݫRd b!^|dF _GHs~:`3].6͸@U'pUZ!xmv[+ <|͕ ^tX_nÀ'`ixdem5Oj(ǶiieX^)`%U)ibV5EK شklPb8Z)\)`1@X,=tz[ ^GM_"^#`K\WkO?W XԫY{7IW-u"wo5ņgW`ck9)G\غIErJpEld%RR"^W +3/3U p]ӿHj ,Ǐ2x`:JkL5xh޻tXj^lW^g]y L^\Ãt=` d)X~HiXKblx d06&5,E`![^'pp}mmXWȎ_~e*>Xfc;`)^9`(`cv rWk컏 7x}׿׺UknW+b~{VّXizw^cã efy5*riJd,yՌCgsj-23#6 Cr )5Y XXK㈽uQ46il @1sxvL|fM`I[(^}\*V񊀥W18`.,/qv+{Ɣm/ʼ]z(;GR$ ׻-m4Eյt 4i{ ] "К\y5FiyrͲW'Lb,OX[Wt`cO1YXL'b)Xy*h`lx;o^mJq@ZU4\)`1Im/ǺQZ1ϴw`'^+,ӀW;V+]CmU, !`9*Q2e]Vüiq5EzŤ^e )K:^]Z1C%Z{yyz^LiXĪFfގd,' V$"Zyl=ؒs͂Xnlk@6>VxW4r& +WXǖ"ꂫkΕUFW}XH ۊpc/\!  WD6յ }u=J XUMVH@u=ӳYB5 VX< OFI XĉW`J `'2s ,}-lbzجc0Z+`pG\Jj;6)ob,} bkp4T*,]>{\#)K_ūF+(BZ[q"`%ȶ`)bӰ5JB*V fњK hI,E rYp\2wd˞E ЊlT}!^q=;XX+\X(\ӎ 4li%pǏ"ݯfe+E+d&Ih 4>{\-5Xހ%ū+ `{o$y6 yg ֆuHp zzr,\BJVB,,UJ1 ,R2kb W9VP%g XD {"m*^[25lm(`1NJ cJ3yĞQi`WGd@Zd,"B^0S`֤}l5`1Ig`is/g,'2Ⱥ P%hlxM"XH8b-`[66ҍm F xEҟ|WKvU1=3-K5 W`mUt5+\]hEҤYqM+ `&xM"ˍW`1y.v,zU`$• 2c$ ,yz\?Ar;\?0k#(@#p}US&\![+=UXI&%_֓`͌ X#-n- XD,,ll]VeNMLR"hR6 Dk`a'(G« $ VF!ۊccE `"| jp}*XմHlH WR*\mJpm(l+rĺXw^ `i^4 zP뗏0`h IE>~ǞR4`o~X$Jhs,"(Ҵ Wȁ[̝x]Jm5RZ`O;'~ SO([ T k#(+ʁ+E+ py4XBi=ilJF`y,i6vXA֋Z6eV4<|5 x) ~Bv$B-]blYXuiD?L:p׵\dfJ5'{pM{p]7I+Fl),}x7xHl#uUX<,Dk^4in!Xy4`OV`Wb[n!`!W W W-S͆?ZuνWL# .quc6-`1})/,&@Ÿ(`{]t ,'U^Valx XVej <&2`7use>m,"Vl+5,FnV5WC\#W_f+}äl ż~XjٽZ潭yz;Oܹ5M^l\<,+ 6Į"E >mppMk;ֆV+2k[+k+?vkW-g1Frv;\1 W: X+Y״xxK X[^}@F[ `l~Xl.,Q4 } hIk;UlCŏ# 1 0}cuY\I~j9VިV¶2ieb6"6W `y6"#օW X)zk *X R+@ &!`T,GkV.v0YW`)XyJ)p۶gΔ*bӌ|, D,mJp\-Ptu!=M^p倭waGpiG:\i{\=Kb,_V /I.J) I-ػlxvͮpXbof` X V)=!jL4^; ,EA 8`!s" Xk vx<Փ7ikekxV@, H}uS`#^ _XצI"B,<¹?)yWd, .v"\%"d+Źj,6npjZ}@`Gp=N>mK\yp-ʆ}j:np]ya&W{\@N+zϹip% b+qxm˃ ߉X=&U6:ȟRyfVkւCMW" X4x`\<>xM XlVW_,3`m5&! إHpEl`cdܫha7.Nīziwbvlc w/^+| #^#]µMlhWRyf!!` W;\]פ]Y{d Z8o<ߧ&IVcX_=`_dӭjmƒ-,,?qVӡ iJp'da>%B7ͯ~"^wkTl`[۷ӛ Y\E piWҤ<Ÿh,\O EQ[`EF̀BH޻zW1UYAD,D/b%)OW"b)Z}W_s5+\]vEB$^-9,cXk WٸlF1 U\!K& \9Zy!H# 뺢`lub1GZvǛyνz6q׫yCh U).J6{alxvm4eՅW\iU y 챂,.,yɀUh f5} l W\!_vpLfJYٿt 4x}Dz 7< SQ xuW^Xd Im`iX V`X24.&!VW\ɓTk֮\9`; i Y2`DKYelP6;?Y]*^N9,5WL^˂R-i=bR^~F.lb)XYX"],6 Wlɴ $(\9^)i' ȶ|,x^!׍+ꀅUx AY` xp WWv6j/`]hZfVKCXx8q.pAlX V \\,G R8^+O;rN=qT%/Ķ|,, 7,9XYW?ˆO?^k`]x {Y8#2nr5º;8 ]ٴjU6 taoV+fUt \%Ҵ*\!n `)G6#!BQ#Wbm+^O ?`THрu"x^a X^5R`d(Xy| hŤ+$+\!WV? M. +`[dّW y5j'\mhK{W^t@JƓ"x!M'H@MXXXW+ `mlJ#9D='a] $T< `>p.Նf2wQir68VWnP`VS+MW-Z+UȆ$W ՜K df5-`MX?84IHsX5q]JtQ >t[\'a,@DkXȜۈxaU e•jld;y>Xsm7,,$-\iaV\mh-e 'V y ,l툵mH«膁ޙb,/ٯˇk{#jiQRJ$v긭J\OWkyGVʆ{&||bCl7dž]T`l8Jt \i+ 2{ɝr(Rm_?#ӳ bi,wO ElÀ˄=8d)`%ȺX^4.En'&-`i8Xy۪p]_$rW 6 2Vd]>nlU6[)O'جh)I ,>x k<;_RcօWXn 4~|0H:<=ҺCV,/`7,_DR`)b<, >hy֑dl;xaJjlnlAXo{+`ˬJIlZt \%n?P?ٗq>p %X{ʤp޽5DŽ1╆"DŽxq<'–Bp-b?.ixvĺV`U>WF:`mI2PAҦU)VlVYXĪEκbX\u!ꋾ[xw:nQbEAcnvliU6[9آJөplqx+f4W qpွ. w׭"6ĦLYM:XL@WX Aڲt4XeV~c Yp(d;q>v(`[Fb+v Wp*\ms0WY >}K4d<w_xpPf=B}5%`m)Cn;VY``-U[RV p6iL `\WLUY=zL\)icX+?ޤJ>y! i ӉplX>~PW؍ cC5G!v|Z8`)b"!Zyld=B`[j#r `y+p ,R XCs;;+~l$U[,bUJv \!9*\1XBV,,ο>?G[B ViJ*pMB+$ kFU=L;o"B6cXٍC(`%n XM.d'+ZyCbi5J. HuӯRY3n5YK7`o5yveѤl3j[Jp5;]q,ȶ|Uu<g6+`^eՓآrA+%CB"d/ƆX w—JW ؍C(`%ף_w&UZX"KJ!!X< +Ņ$'b9X,{ ׹sWZ5pBگ `lR l z[rpŌ* G,BvMGGb,f+z@Z`1|U3+MW`)dɡ`xV/`4< XxU[*" `޷f`aƾlu] v˫ ״Vk'L']w`WۗK!{a&w刽#c G,c\!H㊏,͋zZC{(`\e" b9w+s6Y` z(b9do]6#v HE:BZ(`5XY`yݭuVl^Ab=6 X`pzl 4E@ ,)`KQN:`ˆ+MՅV ׫+! p{ۊ {|Zl=-Xkq!=D4 XW>}1F/}B6orȖu;:k初{6W:s pu6 2nU,V麪Fa;%U`UpY3o@k cCɒh$Ȯ[>4 G,C(`9do >`8b)do[]vă-Y4؟;K[ E֕CjV/`XYwv Οm$yO^9: Wp8&66ҍĵ[{VPM/ܯmjv e)p "CGBC(`%Ȯ[>$+ :zedo_X|`5ؗAk X^KZ>ǑM+vqFBk+?)V_&!bU LJxm:\צW+ūbu , l[`J)p\ {Ӣh$Į~ !pĮ"!J#!6״}c`>{\v"XR,Mv‰X^%#\gLkK{K[dhlO`Y-.ҤBl#r@XD,k」BVB+=њIxU;OYV6:VJ-j>8>mrv WW31@e'sub+^1bW-` p)-#!6ሥyy57OfY$]Ғrg`#ɡV!|RiWڮjIXWuWokB*^qwt\YW  Vp5`;Fl2g.u !r^Y+cX ٛnlB+Av!!^i8b_"ֶ++`XjKZ:⺤9[dj+[s&Ī{Eߍxm%RJDϺ X}R6`;A+•#J]1D,,`uaxwz Cb p]|h5XYO=6 `1 ` EIX)XL 4?} ųm2VdYo`u m1؎yxq WnR4\Ed&!h1-Ɔؕ#^]]$d,ƆX+&W@J)Ow:V,fC6-`'aq#cօ5-`mxM פX6z \x+MVĶXAQfQ!l'7v :\]># ~a%3c승b~W b8b)dW]tpbpW-@+3` d%5UswtR]i lppٍXWz`٦*Vv+dbu!&jlڹ2d]FB,1ٕ JCޒRN4#| V&pݼfօo_zu]ٸ|g/3mYX)yv(\hIpᵝ![X ls`;4o#Av# ^i$ĮX߄wg9b<+H]k;@VH[ ^(`Eғ<.&ֆX<pMG:rK#4nX Yt_:*mHhm7^|b`17<q 6޸( 7AveɔF,OVj2\]x۪ͣ-k%U<+M'吝116b8d b$.y E,by^4X "k =8P`n (`9bzX(X7b1+. iWTwlf,\9^}ԽVaʄld,οPeïSnpjNw`ee `1׹b!v^ ,@qb郫4x cmE 6 Y_Jh8f)XyX +iw&u]IfAc:ZB N mw p\>j&X YD쬫AJ.@.CK!낭ؤXcm f6r/fY3w6 m6`'_ZV_N 3S$p l'4/kluJ`Õ#JsEvy5!h^ `mna(b)d?U {&,MZõiE\ҺSZ9`1˪XW ,!tp} ^1 Zu> Ga~ fWt\!B:/' "24ል@z9o16#^m5 4`>ˀX iv X`m 9WncPeحi҄v5ⵝSΫ2!McImIy`a+& Z4_wⅽ f6NL16&!v {  "`J@yƆF5` d Xd YVY D,3eb3xvQ XM/y!H돃> md}X(F_'õlJ4^9T+Av+'hA~m,4b8ԄBv쨽d X[7 #Ց2![$`Nf`c(VP/\1-+vC#,;luZ: Fg-p}.Kj0 xœX2B] ޽rYY*m-Vـ!XnOȺ;EkZI|L^5,Xz<vaօGD p `!+/ OyPq!!ێc:>BU6:-EE&/R*\=Xe_^&. ?zo` Y|Vh57br,OҖ)vKqՆX^k;p$83vٜ~18+f灖 zN+[:>U6:-tYpAk#p@7\znY^hcN? "0f_`ǜIހm+Z,V, ?rKs \삩xE^?:^ `ΩAҔC>Nj*|vc>pLh+zi!{q=իorU ˂ q"u `mXU=Vb  XSfj O5sbjx]\+,pp޼xP"d 6B`.Bu xxʫOҫlub:4W1g^z^ ;L80/eţxu3w<XBikk҈n!V%>ByuM+)ؼX@*= I 5·ZSF pxE.}d5+oBjk ^o~ɺx- xٍ- li(`N+J3]*矾[e*mޑWıUt?'`/9/$?W_ుf]jbCvE vNY=wGgڡ g`1.jJga!. x倝W+,•vɬ#xv~"\1k 񊀽mɐB,O^XĖ n+HN=1Nk pL]ԫL WK/5 W ,G`K' dC@6 `i$ 񊀍"x\1sZQ&k +eCM%╦Qȶs7]na>5lub6>c:t3\{ՄM\$^#Ϋ OZ֬ZOрI K!+vr .u5O^r"AֲNNv_q֕AWk 7- +g߸XīB=n Z^,pt3\m2Nk`/,xW~W+ 0Jlqb`o^7 u=ZuӍ+Ve?}WLmwȶXlxE:U6:5 Wn+5r.5 ^]=] ^1`y`kހp]kBY+Z,ϾJiVVtW`  N=Ԅz`͎FuW+Z}58,ct+êArתܳ\q++ÕGYīP N t*\!sI mEB.W+{W&] `d H`ǜ+ؑ5JM꺎W/5rb'`S6W dӞUJh X+)xE\1ץp`"\)`)^!tEu+d^.wrMp=ܛq!V!ۺ`u}V Ut2\iB\^_"`/5 WسNACঀH2#;\]Xs؋F p ^b,+d(^6 ^/Auc\)^_{Ƀ7g"5 bvK`NNӍpuq& xMy02P{I?~NY]J<^GXL+Ss 3r_ ȊZ#"x.j+ujjupX+eL(^wus\ -W]97/Vwcש1N+MU앰5H`{'vٻ pH1UO>X)T]xp`F@F-$V WiDVdJbN:^k]=^ox]=J`+f \lrj8\zBe+ `1 օln,v_ Vt^wAa W;v yusv7qv)?0MBCΪ ^g`nv+ l)XF[u=,%p`FgWJu^WxE6 \13ZKכp]|QXl{k W4 >h- fuհ5.$ =ī gkq],ՅX׍w,B6`d[> ^j< wm_Xf^:\)^!W +Ex]kCCnX^ږ\ ltcˆlc>U6:9gp V+ ?H^]=xoX,X >m&:BJmGξbX^eڄq^|ַbov#C"`Wέf~k+jȖW(\a5ȶs76+dq-Ye# p̻஁ .e1xu3w5xr 7AR X),b}k,6Of;BFha뚖`1M츑H`uzW+ ^!W +V%CMz,x #xi!\Iط.MDB!6t\%: 肽 ^]yV.v&ik[}7`}Cv,aZ0)q I+.pPM 0u"\!;CܷX.Z_j*bZټūluz6د+p8OŰ5 W \k^Y]|g+Xv̀%E&KfBxE8_55q:^WxupƣLddF M Ɉm}m*yn+Mu|K^{I .gXk`O8fcb\˃rR?!;\ZӜ`Yg~3 G ^W \ `7-X_E=b6.^k+Z].@i=r0i{ ٶnh*xn+dUt<\1.;f'`GI`<!^mb?znXWr1 dlG|O)ز{9ߊU采x\1Usx\1W Z^7jkڜ# k]vr6 t2\]{.?r$BIhS`m5W.v`1 ñ*XW̌+,c W;@׵yv=0$ W rG޳H6`m\[<Oǚ;dY}FU6!W NΫګry{&3l=V+]wU$`;\ l` VmXe3+7Aqx bZ +t]W޷LhPYp0"m6q )jV+S Y~Q^2xM,c)'coo`]G- w2ڪ ة2^ EӾU6%E5TB.; 1TsX+c92Xds;B0ӞP~4zE{j =lQBk\W_7v z;kdz2#GU]kxMtu-Lvl_JvKmXe-pDb./w`/Esa5 CW` XWpUr~EXL+(bX~]bU R}]1Iր0W :^plͻ޻ k#nP3l"!ڰ]7u \)`ˀe0Z\md>I g,Ejx"6qkP"{Vlag`-A J[,Ū)X)YpDk 4ׅ6;Dj ^7_vkUȺ! ~ l;Uٸt \1_{hRjF^9.m9{i?0ဥbl6d[װlʑ̀%![&`!-I5Xx]X+] ^7LC  8WLimvv_۴ʆ]4▁cW"`?oOW`G '}`rOS`T/gXv%Gӯ+Zݡ'_$-0#Oޢ2jP<ւyZ뭋ZA+^)\MU4ؤm;6aMpb\`Ԟ.Ej'~X+Fy6ik [>4XL^֢Xb[JxE6 [ yE¸+t]k׍02 Zp}pͱ٫4`[ Y?6a-&Rv\]}^ سGj)'أءvcU`]Y}ݎaҞ64A6`--?+% `+ uC w-nf]a\`֪A!^K:`|b[zYy nS{ WWȒ)t\%p/W`ρ܀= ^]=;8[+ASh3kKW;`XLemM4]j͋w^o[<<Ժa W[\1X+MClf,t__ vaM&ۮp5W{8k. .18B0rf% R]m"`9aWXؓak`>z`6+-`9d6pUW ؂+@6 `e-U)؛kpF.0.pI;6 ^ ~ xêluSM5pr { qS`1`,#6 (b9`9d֖3+KBz9Y p \~uu]sT ئ  [b:>QU6-34݉յ.p<IF^&FQAb""CwЊt]@EAQQPco]lb46 D$&y\gYkjW]1c&Zs`RO '`gQؙ3(KpKpKp2`y.+C6 `W Y`uT^4pڢPgӮ'`^Udil O`;5EC pmerSX `(5xU`m18U`m7O&Őm$`]4μo^2^l:mN 8}Nn' T[%ri={« 3d6 3Xk5Z/ro(g;R5O0]0XL>T-~]42|kfFCӷqN+J]b9^]53 lW6rkl XWoA(V-!>[UyVdq I! "*E#5'=\MmEJΝ;HYam%rmE jǙrU^MXXX[sYB0o[Xf]p>۪.V_+: ħY`pvl+Õ|Ҽ} ]a]E-YSGx Xb^l+i1R]MXvjV| N_ݽnX;.TmerWa9am=s \` \`鷓nʩ> p`Cֺ ހ;`qX S`JF\mur%`?Rm3-jlzVA^Ẫz6m4=`J&+4d W-E#jBl+UgyKAm >;'T Xl@t X[yJ@+ꥇ{0gY[`? ~3j^3`q Q 9f! NoÕpxu՚ST]7gf Pvn ^MCeZiꦫ &ClZ6jX543`K" X-đmW>}ju͕#Udcƫ W s';g &]ZOzNl-ZUXN3mV,g^ޱT4:]9m*p˧6ng6ع:`MzX߆,ޒ%',#Ig9ټhL;(ؼ{}ef KE fV;cJ߇['E*\mx7\W;g 6逝O\ ` T+U_2mѪ&&,4k# fꧩXze-ۨ_gXƫt4i,n!R4k-\5-Q&. >& jlO&t \,4 `M5Vk6Y۵v$շhuHrW5Y:}_IYծpmu2`{^m]H+1]9v^Mp=tj[jWbzGM#$d[s,+`-Zܝz `9E6 dq6/p Ijp5p.Z8T^m] j,+gdm]zGZK.f3\Wy]B0bOLorոXf}xo.7Sm5Aַ!K.h`m]5ŚVVն{ֲ&&AlBOcquɜp \ׯ?a&. ~$KpxM W®#V&|Vk:؃Uvdm-ZcZ9d/>_Z+dqq gѴ."-V#]*.p5viPW`xWY X[ 6iX٬5a6-`F-EP/jlѿ$I-eVd>N_R4аVp>~mW@IDATeNRxviU 9-CґC_[ʵ! Z4EZ5 ^ W N+Bլp5V"ֶ5)`m%PAT U[[ z<ŵ!K^1 MKa[ Nl.vc֍ Z2`$MX,]>v:`?c?g>7 ^?moVPHh $xWݗc{ 7|V]jë ԝ;.,g\)-^\,@דY`eo5 Z\|v_oc۳[ `G [)H t۬*xE.EC u#jluzXi.kZrMV/8LU_,٢[_ւY`e 5k ؗ?^XE,4ǵ/qi 5; i)J 6rbդp]<4K|5Akl-Y- X d%`MؠcG=cםupۈX\+bdҬ)jˇ \פ#+Cĺ5fݒsXmkKֵ|pj[@-!n_-(Q"v[*+)j?pÕQmpkj&YjlK;;QYji@, H 1`fC-a4 s}:@ Gl+Xu|> +& dmX UK,6`E%<2Y>?W7d[ZA+>zxEZ1E# Mf,jk%rk9ޮ:d۳,5aހ=w~i6h*`yn6OYYHhn]2}kB>Х0iSZ ,շ;IVN-g/90R]7` 7ώmį WYbq wV!vz~YS} lF3OE͊G_*Q zB ZZ]-$b\qXZ Yߖ*j5Vlm%r} .ꀕM2e&Al3]+hVVxǸ:Y W WkJ]eYj7`sZrM ؞[f^zYCQͺE+o^pF;\~qjU%`"=;^i E گ p>d+`Vikֵр֩VRǏgpQZ:lwxD :b<k!;!^&i34=b_ڪpn ^8\i[5;l5մֵA6_!HrB B6)b@y5ӵ 34b, Sd-6+z׼j)ic>l-c z]쾪 ؤVМ+iV"afClmIJׇՓv6a%ڔUXz4QuշsmK Xyj''l]+(rvl\+ ~ޘaa)fh *=pÕMXVX3dOueF`XӟV0b[Vz $^o`M(CS"'DluՆN+ZXd}[vvPmZ`eX>lU\Wub|Ibqu0^լOWb[- 9u%#\\*Wk\EBokZ.<+[`]m D Dp˃rlZA=Ż+Thzzئ ?3MXDWoF &VoVևS%kl_g嘨4e47R#V4;4i?~qYK CkCW vi{VVrIkRښۖ f+^ X_XB $]H`gyZA@J#A)dh8D- #\Mx?{zz5PgT4;@kkڒe@,oò- bVb5$uJs'/"JO*xEg +p5Õs'GRg(չXd%#: kl]z Xܤ4+iYARh#6Jp}MW>2`T|V¬XS@`];v~Qm pIM4uSWXٔxNՇX\+hG^I!xUWI1֎Xˈԟ<>9Yy5•jZת-HX$MI~YLY&̦ XY`MYihX}ƻU4^_:Ec 7!\vkXIJUI[ +hi:VX9Ʃ Yk5VBֻV_777 !f,NcZ"RsZ{7 KS X5}vFQƫ$Vr]sZSZ::@hPIX|c#vil^+_6 R4|yp妅+5濄RMe4ue,uB*Wu0Hʚ+tV5h?>&< ٱV"HR4lan e O\+p}6 pҀK Z ;X YVYk-3\INV4ֳR! V_R%~xE\S4l]=@!dk 6Vu{k Zok Ik[Z+`9<4a_T،KV_B`k-kV =ǔ.)ah~ x J Wẫ=OffO:P5 `MMXWٴKZ*1ۊe Ao=ؼ!JcZ: xEFhz8bimexJy)Lsʪ LԱSl ,Uu:6-`c3@gmkk6! Zx9瓳WwFf(mލv+U+t**;S2ϕ@1jKnXY`-lJRט-jEwJ``{gه(JZA Q G+4,E fV#Ơi[ \lϪ\M۳lx*%:uڄ0 +`}՗ xAֵ00t l[]`TEXuru4kTW+44E ͧ? V]-HҔpeﺀ {2ˈWX3=լT Y xeچ5ok-egu6X3ZyiW[%`WniņQ8-4!^iy-q/4?Į-K5۩pK'V:P]55 `ʩ. KpJYkl#Ok'ݖC*Scd9;UV"\Vѿ~#Hǧh|HF#k 5rmvQF o0Ku A5 `M^ +k,O TY<3\I6kMhuV"tkCN] WWE&IBE,="XylNpM74jT^Cֶ4 bmC%؄eidTRRm Y>Ջp< X}ִ]0c .ZA>%2^?{{+y^R4JҵF,6lVkґX>4B,#Vv $2PeMMB ٦쩢&ʿ' `]?GyOڶhsk 4VBV"zƶO^JkaW_Ҕ)^h~en(_- hWO9-\]p}YF(տ\$: `eoHIg $րYߣϓV״]<`cHvmos! V@p맪\Ϋ:y}wL+BOB+i,}r1kp Z w_vBՄTת:H&ĚzM[,[|c||L"X-\m94ޫ!6 dq YqZW Z$LB-<`V]38^k_MpU%•k% 2d]u&<4Uvg 4KbU .?\u!U< ##Ry+^R4|bDvc`صӏ+]5#l{/v9:!0z)֤u.`.hv?po86 8 `{L]9Ps`-9X,ZA' T+t(׿: +b1AWOO_X3uϼ=+O*ʈuLTIj-+[ykTZRXsY7ey|?? glX,Bizaj觚4f}ࣗGDp+x%JcWqKW5箛y|ڮ<̀啵M \pݹrDiw] Kƪk QTHM6v"Ae6:45ŠMZEvΛgn"PZoU5qerQ46t#T%^i%x%J7+}?`7곖zmU.@%^]>er+=Di7 {A(a޺hpu\|X'sɥVP=}uAZZ|>Vb6mX 6ɦ,--Syo:oU;*XݬumrmѲrMhXlyZ+ɫ!^yLӷGa+tb^) kBh:>\ݼDU:y\MT-K[bޱ$-m[zRiJw-V3]OV%޻25#SKBC%:$]H'9I!Մ$5uЯeZʧcC XY+`Zu "[MhݰR6vQnm熫|tIyDoJ ^\7곆aX:idy,R%`o70i2`^.Kݶ:LUK^1kpAgLJ$IORMe1FT=wRGJY4sZyKV{J}[lv1u󺰷^{TT`=V}˧x%{<"xk})ah>p6* s 2 W*Jxkx:$Ea5WУ,ӪNY[72Z 7 {Bl^ޱdawp5l9tdX,53=L`*?RrAU>f!t Y48,:W `m\ۼ)`R{hht QU`J}1޷XfVCKo\W+㟅p ?ũ+ 14]UEAM=bUwU?rp޶(,+vKw_>\%ב!+=תi4!V!ބTf+`mM hcVU\VY x\45ٗ謜h 5 -Z\ZM#jh6ZhJRԏ^Sx%,0eAGFZ`}py^- Ѓ,zNXRD%n)_u!u«l;\sYW~xw1HʻͤW%df!5-`g{NXyi@V6 `Xi 5 `."0Vu5U,aU n +ZOc_xh*UV?p2\?ymdW*OcJ_ÕA<)fhrYݶlh鎥Cdo_zR)+!򄁭oo-uU]ŕˇOG5PeP*W8!kbzu2l;9N k\4Ϣ hu^m VoA`5T^,!6ZDpa֭W.cTcۏbsogsF``UFkO UpZ4"ắ|Jp2\Sp H3,p}>˹_gMci8IJ?he޻bD잦cVU>W:2&]~k?)Tcu]9]Sp6"zVqrֻ)k6e`mk ՎMZ X-W*cbݹت޿:`V\F+p̰\W*Õ)tJx-BAZ0E# 6 \O_gW +yy<5l(8 ;Xh(ӘՐM*5 Dk& HX'Y۰1Wր4]2fYB«ouVUSX<U,UoUG;NPNTʣCx%r%\ _RX 9hW YBݹ*@ʓUwfҏX3U! 1bڵ~`B%ee|dI dI~+lEj#cqv55 `.55 `oZ{.H,ƪ^wT !^UWU*her%\~6,G2\ |] uA6IXCx /M쳘)}^{Ji%G|b!Mnbң.~@jlHVm\K &$Ҍs oֽLU l!V6-`6ԕ=Z+jj*kjëu1Jh}dQ%Zgg2ZQT+a T9a GZl=J}>{}wZIt:4!˯ | Ȑu'Gl1f=raKh&ĚfJ+dk:~YњN׵%3 g}c.&m+յ@4tEʀ-#ʣx[͕`hhe2Ze%\ڀ2衖2P+] {+x\{[7)\%^U pB,ݝdꏋ+6V-}CӒlaT1\vA|aKim~z}~?2?8b+] y@« i渚gf o@ՄWU ;>k`+GJɡW9e@Uv}5>e~C-L@a)q\\mi>l[YBY~D@BgVN h\R>9NqOcִA˶̠&]j}^,@Z `]k·xSVN]:ciԕm 5XWj%eIhh7VU+UVU*h)V2@p\xw])(ECShxH0i(CK%|;24!kW$d?kzteŬ 6VNR]lUH= XTzV6ˢjoԱ5 `Zo+U؛Է ڜ`UֶEj[D /"h3]%ZDUt{U\ VVY}U.밨|h2\*hAHkxm$\eL?d,߱$)-Cl4t5=n9h԰J^p!T+m2u񬃝s Vݰ+;ޑ"*U/h}JE\}€\FhJR|ߕJU# R)z$pe2\:m#*P'=K*!!ˣnim|~)#v:bC 6]_smJT9K X)ke`I9YkB*`Z@V6UiV9K+5Z]}uէ Е Wz%ٰ_+UÕ~"Ң)|4peW= Y:%Ҿ{,c fO3bI}^,QB6R L6_kzdkSj+fF@=Y,^ujo؝j[Bqj^Dִ@_FO`TF+U=*h,B+iI=\@ R4ڥXW=4ߓ!].AvN^;H(C ;iPTVi8u!'<$^* : U)kv`cDq\qP%X&YB[DggX"WOxXj4ֳ#\F|*pALl&=CqJy|JHU.M^;W_n5>`ѷʼngs Y穩թd^}Q UV6,ט+׬VoVk^cltUuq湖 JVrƫ>U+UjZF@heeGZZU\+ !؊m\>yoWxo ˸"*M`L)ZWLu?yy6_ TlsWyևFWzj{Mhu9UT7U65ZBc@<˶@G2X]WFHf~jVy.V;cE AK(lFb2Kh4R!d PY>+zmƗSo[7Y_SWIW*\_6 UarU2˜$Zi*Gm#|Sz6(,s\9ZDUSWY} *+J}S{-ZW*?@Jp/AO0l+\0d%AwF;zu@{$.Q*?gjX%f*WUǬs댃VYY7J1˄W,^|l%US Ygw `}XM\ \Nh W+ جY]/ Tѷ.>9F Z5K@+:{RPI7}4,7!TkAj. ~eJkW/=Z碁UM ۮ;m1X:Zex{c%Xms\,םa%Z?y`W9˕'2Z+燫J+ªoppEJXl,P$`gȪB asW+z>2blŷ۫}K߄Rc[^U}jғV<($/؛uGZ]gkmV׻ˣvV*X@ 0Zeu-5.p=WrEI dNe煐]^~E8D EڞI Y:UDf{myUP5}͵`hAad IH Xwcԕ T֕MW߲ T mwkU<*W\4ϵ\F+Wr-UpZÕ {AKр,^J!J,CvYZ~ϐU{| ui ƍUe꟏ՆX5{Ngz%g`Z7_eoMYa`xuϽau>{~:$WZ*r AVWڠw\9 H˧hL6k8%!Y,=2b^WnʻP,]U]X/M51eܕk#sVMlحm,AV\}c$`mcdqBU V VY,U4˕J_8 Z"䞢aوC/NtEpSW/kz}/MtyuRyif)Iu& ku-U7I (, GX5uϽqX V^JeQX V9*hV.tUӽ8qEiHFf f}{z]+,]5 uGJe.Jس}+>`$ڐ|'5X+a*u o91XT1X8,V*mz!QXT^*gr \ߕaע ґ)kQd,CͮZp$ok\ߎgJ8Ʈ.XPj;5\C[zU}&kZ2|ZhM3 뮍DfsMp҃nom iGaQ 3\oaIY/w\V啯 O\A"E4Ki 0Kw3 e5FY>΍}I2 )TV}>sE_#l cַ*++3P}LKI<ĺCê^I\iXW(,ªqVVY9 *fUVuU|8mEi Ryqu^ꪁxp/ \+P2dns=NHQshU/l[exo.X׊ |ZmsT]\+$}w0O4`GaY;|U;5 AZ.Epml(vY1'xd+RuWk&k2 $3Y`m-cԪW)I{vƫd_f,غWqUuHUy~! 9hztWEtH< ~|mt'6&|Hm%T kŸ#S,!uY|@UؤSVV$9Q@_x#^rjV:qw\ys\J`հV& m?<}M hELaUn%2y~)K?ԆΤsV]_sM(7uܕ5 `MllS~=ƒ`uMi$>M`!Wj1K\ A"zԋuGFw6շWU@Z^/vI8u}A+'lxL M&ꃪ)i' +hk^rմ1m*WAI6aNmru:IWR,$WBS>'zYqYZmubM9e n;X6I4E' XmYCc-Y(WߖE`h٭[ Ԗ[qv9awC_Q})?f٨8IGU%e2Ϊ{M8]}tXO3{,ScpÃMYTצ,-BNU " Rl>ĚO?pHx422E7:fn^Wz]fuN ku&LL \!$`zx ܽn4BBk># aD:aZW҄Mq~95?_*h+\V[̵Avªjz=RXcYސXA/WڵoAAܵ1H(}+~]>Cs/鄘j^ڑj SV.;N06+)]}釃jzez1ze " R!5=O#] 05cXϛQ`״ʦme˪n?^.+Ujڊm2s YJW">+?}WE{  [r<* 4R]OX/GM} PH?)65ͣ+VVmX58|a܊EG򸫢BAiX_0P:Xy%RoT?Q ;(c: {GW&g}pvOYk  4]'U;˯%0wnWy{j*hu:^ףvT]>YҕR;YRiR@>  lF)"(6]LUiZTm{+r6_]沚AAcBBBxoGfl=>2[}pgUZ `]"aQtGZѩjAAO{g۪; Z1j~F|_/4,@껳ʧoOTFAAO߲7}s%oFVT[}Jx$7%                                                                                                                                                                                                                         zqO{*B%tEXtdate:create2011-11-07T02:03:53+01:00h%tEXtdate:modify2011-11-07T02:03:53+01:00 IENDB`openscad-2019.05/scripts/examples-html/assets/js/README0000644000076500000240000000100013402025764023136 0ustar kintelstaff00000000000000JavaScript Libraries: Rainbow by Craig Campbell * https://github.com/ccampbell/rainbow * Apache License, Version 2.0 Rainbow.linenumbers.js by Blender3D * https://github.com/Blender3D/rainbow.linenumbers.js * Apache License, Version 2.0 Dropdown Menu by Oliver Gast * http://www.olivergast.de/blog/2012/04/18/css3-dropdown-menu/ * (update in http://www.olivergast.de/blog/2015/05/12/css-ein-horizontales-dropdown-menue-reloaded/) * No specific license, download states "download for free usage" openscad-2019.05/scripts/examples-html/assets/js/language/generic.js0000644000076500000240000000342713402025764026032 0ustar kintelstaff00000000000000/** * Generic language patterns * * @author Craig Campbell * @version 1.0.13 */ Rainbow.extend([ { 'matches': { 1: [ { 'name': 'keyword.operator', 'pattern': /\=|\+/g }, { 'name': 'keyword.dot', 'pattern': /\./g } ], 2: { 'name': 'string', 'matches': { 'name': 'constant.character.escape', 'pattern': /\\('|"){1}/g } } }, 'pattern': /(\(|\s|\[|\=|:|\+|\.|\{)(('|")([^\\\1]|\\.)*?(\3))/gm }, { 'name': 'comment', 'pattern': /\/\*[\s\S]*?\*\/|(\/\/|\#)[\s\S]*?$/gm }, { 'name': 'constant.numeric', 'pattern': /\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi }, { 'matches': { 1: 'keyword' }, 'pattern': /\b(and|array|as|b(ool(ean)?|reak)|c(ase|atch|har|lass|on(st|tinue))|d(ef|elete|o(uble)?)|e(cho|lse(if)?|xit|xtends|xcept)|f(inally|loat|or(each)?|unction)|global|if|import|int(eger)?|long|new|object|or|pr(int|ivate|otected)|public|return|self|st(ring|ruct|atic)|switch|th(en|is|row)|try|(un)?signed|var|void|while)(?=\(|\b)/gi }, { 'name': 'constant.language', 'pattern': /true|false|null/g }, { 'name': 'keyword.operator', 'pattern': /\+|\!|\-|&(gt|lt|amp);|\||\*|\=/g }, { 'matches': { 1: 'function.call' }, 'pattern': /(\w+?)(?=\()/g }, { 'matches': { 1: 'storage.function', 2: 'entity.name.function' }, 'pattern': /(function)\s(.*?)(?=\()/g } ]); openscad-2019.05/scripts/examples-html/assets/js/language/javascript.js0000644000076500000240000000406213402025764026560 0ustar kintelstaff00000000000000/** * Javascript patterns * * @author Craig Campbell * @version 1.0.9 */ Rainbow.extend('javascript', [ /** * matches $. or $( */ { 'name': 'selector', 'pattern': /(\s|^)\$(?=\.|\()/g }, { 'name': 'support', 'pattern': /\b(window|document)\b/g }, { 'matches': { 1: 'support.property' }, 'pattern': /\.(length|node(Name|Value))\b/g }, { 'matches': { 1: 'support.function' }, 'pattern': /(setTimeout|setInterval)(?=\()/g }, { 'matches': { 1: 'support.method' }, 'pattern': /\.(getAttribute|push|getElementById|getElementsByClassName|log|setTimeout|setInterval)(?=\()/g }, /** * matches any escaped characters inside of a js regex pattern * * @see https://github.com/ccampbell/rainbow/issues/22 * * this was causing single line comments to fail so it now makes sure * the opening / is not directly followed by a * * * @todo check that there is valid regex in match group 1 */ { 'name': 'string.regexp', 'matches': { 1: 'string.regexp.open', 2: { 'name': 'constant.regexp.escape', 'pattern': /\\(.){1}/g }, 3: 'string.regexp.close', 4: 'string.regexp.modifier' }, 'pattern': /(\/)(?!\*)(.+)(\/)([igm]{0,3})/g }, /** * matches runtime function declarations */ { 'matches': { 1: 'storage', 3: 'entity.function' }, 'pattern': /(var)?(\s|^)(\S*)(?=\s?=\s?function\()/g }, /** * matches constructor call */ { 'matches': { 1: 'keyword', 2: 'entity.function' }, 'pattern': /(new)\s+(.*)(?=\()/g }, /** * matches any function call in the style functionName: function() */ { 'name': 'entity.function', 'pattern': /(\w+)(?=:\s{0,}function)/g } ]); openscad-2019.05/scripts/examples-html/assets/js/menu.js0000644000076500000240000000230113402025764023565 0ustar kintelstaff00000000000000function addSubmenu(menu, name, files) { var ul = document.createElement('ul'); ul.appendChild(document.createElement('h3')); for (var a = 0; a < files.length; a++) { var menulink = document.createElement('a'); menulink.href = "../" + name + "/" + files[a] + ".html"; ul.appendChild(menulink); var li = document.createElement('li'); li.appendChild(document.createTextNode(files[a])); menulink.appendChild(li); } menu.appendChild(ul); } function addMenu() { var menudiv = document.getElementById("menu"); var menu = document.createElement('ul'); menudiv.appendChild(menu); for (var a = 0; a < openscad_examples.length; a++) { var entry = document.createElement('li'); var menulink = document.createElement('a'); menulink.href = "#"; entry.appendChild(menulink); var entrydiv = document.createElement('div'); menulink.appendChild(entrydiv); menulink.appendChild(document.createTextNode(openscad_examples[a].name)); addSubmenu(entry, openscad_examples[a].name, openscad_examples[a].files); menu.appendChild(entry); } } function load() { addMenu(); } openscad-2019.05/scripts/examples-html/assets/js/rainbow.js0000644000076500000240000006471213402025764024300 0ustar kintelstaff00000000000000/** * Copyright 2013 Craig Campbell * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Rainbow is a simple code syntax highlighter * * @preserve @version 1.2 * @url rainbowco.de */ window['Rainbow'] = (function() { /** * array of replacements to process at the end * * @type {Object} */ var replacements = {}, /** * an array of start and end positions of blocks to be replaced * * @type {Object} */ replacement_positions = {}, /** * an array of the language patterns specified for each language * * @type {Object} */ language_patterns = {}, /** * an array of languages and whether they should bypass the default patterns * * @type {Object} */ bypass_defaults = {}, /** * processing level * * replacements are stored at this level so if there is a sub block of code * (for example php inside of html) it runs at a different level * * @type {number} */ CURRENT_LEVEL = 0, /** * constant used to refer to the default language * * @type {number} */ DEFAULT_LANGUAGE = 0, /** * used as counters so we can selectively call setTimeout * after processing a certain number of matches/replacements * * @type {number} */ match_counter = 0, /** * @type {number} */ replacement_counter = 0, /** * @type {null|string} */ global_class, /** * @type {null|Function} */ onHighlight; /** * cross browser get attribute for an element * * @see http://stackoverflow.com/questions/3755227/cross-browser-javascript-getattribute-method * * @param {Node} el * @param {string} attr attribute you are trying to get * @returns {string|number} */ function _attr(el, attr, attrs, i) { var result = (el.getAttribute && el.getAttribute(attr)) || 0; if (!result) { attrs = el.attributes; for (i = 0; i < attrs.length; ++i) { if (attrs[i].nodeName === attr) { return attrs[i].nodeValue; } } } return result; } /** * adds a class to a given code block * * @param {Element} el * @param {string} class_name class name to add * @returns void */ function _addClass(el, class_name) { el.className += el.className ? ' ' + class_name : class_name; } /** * checks if a block has a given class * * @param {Element} el * @param {string} class_name class name to check for * @returns {boolean} */ function _hasClass(el, class_name) { return (' ' + el.className + ' ').indexOf(' ' + class_name + ' ') > -1; } /** * gets the language for this block of code * * @param {Element} block * @returns {string|null} */ function _getLanguageForBlock(block) { // if this doesn't have a language but the parent does then use that // this means if for example you have:
        // with a bunch of  blocks inside then you do not have
        // to specify the language for each block
        var language = _attr(block, 'data-language') || _attr(block.parentNode, 'data-language');

        // this adds support for specifying language via a css class
        // you can use the Google Code Prettify style: 
        // or the HTML5 style: 

        if (!language) {
            var pattern = /\blang(?:uage)?-(\w+)/,
                match = block.className.match(pattern) || block.parentNode.className.match(pattern);

            if (match) {
                language = match[1];
            }
        }

        return language;
    }

    /**
     * makes sure html entities are always used for tags
     *
     * @param {string} code
     * @returns {string}
     */
    function _htmlEntities(code) {
        return code.replace(//g, '>').replace(/&(?![\w\#]+;)/g, '&');
    }

    /**
     * determines if a new match intersects with an existing one
     *
     * @param {number} start1    start position of existing match
     * @param {number} end1      end position of existing match
     * @param {number} start2    start position of new match
     * @param {number} end2      end position of new match
     * @returns {boolean}
     */
    function _intersects(start1, end1, start2, end2) {
        if (start2 >= start1 && start2 < end1) {
            return true;
        }

        return end2 > start1 && end2 < end1;
    }

    /**
     * determines if two different matches have complete overlap with each other
     *
     * @param {number} start1   start position of existing match
     * @param {number} end1     end position of existing match
     * @param {number} start2   start position of new match
     * @param {number} end2     end position of new match
     * @returns {boolean}
     */
    function _hasCompleteOverlap(start1, end1, start2, end2) {

        // if the starting and end positions are exactly the same
        // then the first one should stay and this one should be ignored
        if (start2 == start1 && end2 == end1) {
            return false;
        }

        return start2 <= start1 && end2 >= end1;
    }

    /**
     * determines if the match passed in falls inside of an existing match
     * this prevents a regex pattern from matching inside of a bigger pattern
     *
     * @param {number} start - start position of new match
     * @param {number} end - end position of new match
     * @returns {boolean}
     */
    function _matchIsInsideOtherMatch(start, end) {
        for (var key in replacement_positions[CURRENT_LEVEL]) {
            key = parseInt(key, 10);

            // if this block completely overlaps with another block
            // then we should remove the other block and return false
            if (_hasCompleteOverlap(key, replacement_positions[CURRENT_LEVEL][key], start, end)) {
                delete replacement_positions[CURRENT_LEVEL][key];
                delete replacements[CURRENT_LEVEL][key];
            }

            if (_intersects(key, replacement_positions[CURRENT_LEVEL][key], start, end)) {
                return true;
            }
        }

        return false;
    }

    /**
     * takes a string of code and wraps it in a span tag based on the name
     *
     * @param {string} name     name of the pattern (ie keyword.regex)
     * @param {string} code     block of code to wrap
     * @returns {string}
     */
    function _wrapCodeInSpan(name, code) {
        return '' + code + '';
    }

    /**
     * finds out the position of group match for a regular expression
     *
     * @see http://stackoverflow.com/questions/1985594/how-to-find-index-of-groups-in-match
     *
     * @param {Object} match
     * @param {number} group_number
     * @returns {number}
     */
    function _indexOfGroup(match, group_number) {
        var index = 0,
            i;

        for (i = 1; i < group_number; ++i) {
            if (match[i]) {
                index += match[i].length;
            }
        }

        return index;
    }

    /**
     * matches a regex pattern against a block of code
     * finds all matches that should be processed and stores the positions
     * of where they should be replaced within the string
     *
     * this is where pretty much all the work is done but it should not
     * be called directly
     *
     * @param {RegExp} pattern
     * @param {string} code
     * @returns void
     */
    function _processPattern(regex, pattern, code, callback)
    {
        if (typeof regex === "undefined" || regex === null) {
            //console.warn("undefined regular expression")
            return callback();
        }
        var match = regex.exec(code);

        if (!match) {
            return callback();
        }

        ++match_counter;

        // treat match 0 the same way as name
        if (!pattern['name'] && typeof pattern['matches'][0] == 'string') {
            pattern['name'] = pattern['matches'][0];
            delete pattern['matches'][0];
        }

        var replacement = match[0],
            start_pos = match.index,
            end_pos = match[0].length + start_pos,

            /**
             * callback to process the next match of this pattern
             */
            processNext = function() {
                var nextCall = function() {
                    _processPattern(regex, pattern, code, callback);
                };

                // every 100 items we process let's call set timeout
                // to let the ui breathe a little
                return match_counter % 100 > 0 ? nextCall() : setTimeout(nextCall, 0);
            };

        // if this is not a child match and it falls inside of another
        // match that already happened we should skip it and continue processing
        if (_matchIsInsideOtherMatch(start_pos, end_pos)) {
            return processNext();
        }

        /**
         * callback for when a match was successfully processed
         *
         * @param {string} replacement
         * @returns void
         */
        var onMatchSuccess = function(replacement) {
                // if this match has a name then wrap it in a span tag
                if (pattern['name']) {
                    replacement = _wrapCodeInSpan(pattern['name'], replacement);
                }

                // console.log('LEVEL', CURRENT_LEVEL, 'replace', match[0], 'with', replacement, 'at position', start_pos, 'to', end_pos);

                // store what needs to be replaced with what at this position
                if (!replacements[CURRENT_LEVEL]) {
                    replacements[CURRENT_LEVEL] = {};
                    replacement_positions[CURRENT_LEVEL] = {};
                }

                replacements[CURRENT_LEVEL][start_pos] = {
                    'replace': match[0],
                    'with': replacement
                };

                // store the range of this match so we can use it for comparisons
                // with other matches later
                replacement_positions[CURRENT_LEVEL][start_pos] = end_pos;

                // process the next match
                processNext();
            },

            // if this pattern has sub matches for different groups in the regex
            // then we should process them one at a time by rerunning them through
            // this function to generate the new replacement
            //
            // we run through them backwards because the match position of earlier
            // matches will not change depending on what gets replaced in later
            // matches
            group_keys = keys(pattern['matches']),

            /**
             * callback for processing a sub group
             *
             * @param {number} i
             * @param {Array} group_keys
             * @param {Function} callback
             */
            processGroup = function(i, group_keys, callback) {
                if (i >= group_keys.length) {
                    return callback(replacement);
                }

                var processNextGroup = function() {
                        processGroup(++i, group_keys, callback);
                    },
                    block = match[group_keys[i]];

                // if there is no match here then move on
                if (!block) {
                    return processNextGroup();
                }

                var group = pattern['matches'][group_keys[i]],
                    language = group['language'],

                    /**
                     * process group is what group we should use to actually process
                     * this match group
                     *
                     * for example if the subgroup pattern looks like this
                     * 2: {
                     *     'name': 'keyword',
                     *     'pattern': /true/g
                     * }
                     *
                     * then we use that as is, but if it looks like this
                     *
                     * 2: {
                     *     'name': 'keyword',
                     *     'matches': {
                     *          'name': 'special',
                     *          'pattern': /whatever/g
                     *      }
                     * }
                     *
                     * we treat the 'matches' part as the pattern and keep
                     * the name around to wrap it with later
                     */
                    process_group = group['name'] && group['matches'] ? group['matches'] : group,

                    /**
                     * takes the code block matched at this group, replaces it
                     * with the highlighted block, and optionally wraps it with
                     * a span with a name
                     *
                     * @param {string} block
                     * @param {string} replace_block
                     * @param {string|null} match_name
                     */
                    _replaceAndContinue = function(block, replace_block, match_name) {
                        replacement = _replaceAtPosition(_indexOfGroup(match, group_keys[i]), block, match_name ? _wrapCodeInSpan(match_name, replace_block) : replace_block, replacement);
                        processNextGroup();
                    };

                // if this is a sublanguage go and process the block using that language
                if (language) {
                    return _highlightBlockForLanguage(block, language, function(code) {
                        _replaceAndContinue(block, code);
                    });
                }

                // if this is a string then this match is directly mapped to selector
                // so all we have to do is wrap it in a span and continue
                if (typeof group === 'string') {
                    return _replaceAndContinue(block, block, group);
                }

                // the process group can be a single pattern or an array of patterns
                // _processCodeWithPatterns always expects an array so we convert it here
                _processCodeWithPatterns(block, process_group.length ? process_group : [process_group], function(code) {
                    _replaceAndContinue(block, code, group['matches'] ? group['name'] : 0);
                });
            };

        processGroup(0, group_keys, onMatchSuccess);
    }

    /**
     * should a language bypass the default patterns?
     *
     * if you call Rainbow.extend() and pass true as the third argument
     * it will bypass the defaults
     */
    function _bypassDefaultPatterns(language)
    {
        return bypass_defaults[language];
    }

    /**
     * returns a list of regex patterns for this language
     *
     * @param {string} language
     * @returns {Array}
     */
    function _getPatternsForLanguage(language) {
        var patterns = language_patterns[language] || [],
            default_patterns = language_patterns[DEFAULT_LANGUAGE] || [];

        return _bypassDefaultPatterns(language) ? patterns : patterns.concat(default_patterns);
    }

    /**
     * substring replace call to replace part of a string at a certain position
     *
     * @param {number} position         the position where the replacement should happen
     * @param {string} replace          the text we want to replace
     * @param {string} replace_with     the text we want to replace it with
     * @param {string} code             the code we are doing the replacing in
     * @returns {string}
     */
    function _replaceAtPosition(position, replace, replace_with, code) {
        var sub_string = code.substr(position);
        return code.substr(0, position) + sub_string.replace(replace, replace_with);
    }

   /**
     * sorts an object by index descending
     *
     * @param {Object} object
     * @return {Array}
     */
    function keys(object) {
        var locations = [],
            replacement,
            pos;

        for(var location in object) {
            if (object.hasOwnProperty(location)) {
                locations.push(location);
            }
        }

        // numeric descending
        return locations.sort(function(a, b) {
            return b - a;
        });
    }

    /**
     * processes a block of code using specified patterns
     *
     * @param {string} code
     * @param {Array} patterns
     * @returns void
     */
    function _processCodeWithPatterns(code, patterns, callback)
    {
        // we have to increase the level here so that the
        // replacements will not conflict with each other when
        // processing sub blocks of code
        ++CURRENT_LEVEL;

        // patterns are processed one at a time through this function
        function _workOnPatterns(patterns, i)
        {
            // still have patterns to process, keep going
            if (i < patterns.length) {
                return _processPattern(patterns[i]['pattern'], patterns[i], code, function() {
                    _workOnPatterns(patterns, ++i);
                });
            }

            // we are done processing the patterns
            // process the replacements and update the DOM
            _processReplacements(code, function(code) {

                // when we are done processing replacements
                // we are done at this level so we can go back down
                delete replacements[CURRENT_LEVEL];
                delete replacement_positions[CURRENT_LEVEL];
                --CURRENT_LEVEL;
                callback(code);
            });
        }

        _workOnPatterns(patterns, 0);
    }

    /**
     * process replacements in the string of code to actually update the markup
     *
     * @param {string} code         the code to process replacements in
     * @param {Function} onComplete   what to do when we are done processing
     * @returns void
     */
    function _processReplacements(code, onComplete) {

        /**
         * processes a single replacement
         *
         * @param {string} code
         * @param {Array} positions
         * @param {number} i
         * @param {Function} onComplete
         * @returns void
         */
        function _processReplacement(code, positions, i, onComplete) {
            if (i < positions.length) {
                ++replacement_counter;
                var pos = positions[i],
                    replacement = replacements[CURRENT_LEVEL][pos];
                code = _replaceAtPosition(pos, replacement['replace'], replacement['with'], code);

                // process next function
                var next = function() {
                    _processReplacement(code, positions, ++i, onComplete);
                };

                // use a timeout every 250 to not freeze up the UI
                return replacement_counter % 250 > 0 ? next() : setTimeout(next, 0);
            }

            onComplete(code);
        }

        var string_positions = keys(replacements[CURRENT_LEVEL]);
        _processReplacement(code, string_positions, 0, onComplete);
    }

    /**
     * takes a string of code and highlights it according to the language specified
     *
     * @param {string} code
     * @param {string} language
     * @param {Function} onComplete
     * @returns void
     */
    function _highlightBlockForLanguage(code, language, onComplete) {
        var patterns = _getPatternsForLanguage(language);
        _processCodeWithPatterns(_htmlEntities(code), patterns, onComplete);
    }

    /**
     * highlight an individual code block
     *
     * @param {Array} code_blocks
     * @param {number} i
     * @returns void
     */
    function _highlightCodeBlock(code_blocks, i, onComplete) {
        if (i < code_blocks.length) {
            var block = code_blocks[i],
                language = _getLanguageForBlock(block);

            if (!_hasClass(block, 'rainbow') && language) {
                language = language.toLowerCase();

                _addClass(block, 'rainbow');

                return _highlightBlockForLanguage(block.innerHTML, language, function(code) {
                    block.innerHTML = code;

                    // reset the replacement arrays
                    replacements = {};
                    replacement_positions = {};

                    // if you have a listener attached tell it that this block is now highlighted
                    if (onHighlight) {
                        onHighlight(block, language);
                    }

                    // process the next block
                    setTimeout(function() {
                        _highlightCodeBlock(code_blocks, ++i, onComplete);
                    }, 0);
                });
            }
            return _highlightCodeBlock(code_blocks, ++i, onComplete);
        }

        if (onComplete) {
            onComplete();
        }
    }

    /**
     * start highlighting all the code blocks
     *
     * @returns void
     */
    function _highlight(node, onComplete) {

        // the first argument can be an Event or a DOM Element
        // I was originally checking instanceof Event but that makes it break
        // when using mootools
        //
        // @see https://github.com/ccampbell/rainbow/issues/32
        //
        node = node && typeof node.getElementsByTagName == 'function' ? node : document;

        var pre_blocks = node.getElementsByTagName('pre'),
            code_blocks = node.getElementsByTagName('code'),
            i,
            final_pre_blocks = [],
            final_code_blocks = [];

        // first loop through all pre blocks to find which ones to highlight
        // also strip whitespace
        for (i = 0; i < pre_blocks.length; ++i) {

            // strip whitespace around code tags when they are inside of a pre tag
            // this makes the themes look better because you can't accidentally
            // add extra linebreaks at the start and end
            //
            // when the pre tag contains a code tag then strip any extra whitespace
            // for example
            // 
            //      var foo = true;
            // 
// // will become //
var foo = true;
// // if you want to preserve whitespace you can use a pre tag on its own // without a code tag inside of it if (pre_blocks[i].getElementsByTagName('code').length) { pre_blocks[i].innerHTML = pre_blocks[i].innerHTML.replace(/^\s+/, '').replace(/\s+$/, ''); continue; } // if the pre block has no code blocks then we are going to want to // process it directly final_pre_blocks.push(pre_blocks[i]); } // @see http://stackoverflow.com/questions/2735067/how-to-convert-a-dom-node-list-to-an-array-in-javascript // we are going to process all blocks for (i = 0; i < code_blocks.length; ++i) { final_code_blocks.push(code_blocks[i]); } _highlightCodeBlock(final_code_blocks.concat(final_pre_blocks), 0, onComplete); } /** * public methods */ return { /** * extends the language pattern matches * * @param {*} language name of language * @param {*} patterns array of patterns to add on * @param {boolean|null} bypass if true this will bypass the default language patterns */ extend: function(language, patterns, bypass) { // if there is only one argument then we assume that we want to // extend the default language rules if (arguments.length == 1) { patterns = language; language = DEFAULT_LANGUAGE; } bypass_defaults[language] = bypass; language_patterns[language] = patterns.concat(language_patterns[language] || []); }, /** * call back to let you do stuff in your app after a piece of code has been highlighted * * @param {Function} callback */ onHighlight: function(callback) { onHighlight = callback; }, /** * method to set a global class that will be applied to all spans * * @param {string} class_name */ addClass: function(class_name) { global_class = class_name; }, /** * starts the magic rainbow * * @returns void */ color: function() { // if you want to straight up highlight a string you can pass the string of code, // the language, and a callback function if (typeof arguments[0] == 'string') { return _highlightBlockForLanguage(arguments[0], arguments[1], arguments[2]); } // if you pass a callback function then we rerun the color function // on all the code and call the callback function on complete if (typeof arguments[0] == 'function') { return _highlight(0, arguments[0]); } // otherwise we use whatever node you passed in with an optional // callback function as the second parameter _highlight(arguments[0], arguments[1]); } }; }) (); /** * adds event listener to start highlighting */ (function() { if (document.addEventListener) { return document.addEventListener('DOMContentLoaded', Rainbow.color, false); } window.attachEvent('onload', Rainbow.color); }) (); // When using Google closure compiler in advanced mode some methods // get renamed. This keeps a public reference to these methods so they can // still be referenced from outside this library. Rainbow["onHighlight"] = Rainbow.onHighlight; Rainbow["addClass"] = Rainbow.addClass; openscad-2019.05/scripts/examples-html/assets/js/rainbow.linenumbers.js0000644000076500000240000000765613402025764026626 0ustar kintelstaff00000000000000// Only install the plugin if Rainbow is present and has been loaded if (window.Rainbow) window.Rainbow.linenumbers = (function(Rainbow) { /** * Splits up a single element into individual lines * * @param {HTMLElement} elem * @returns {Array} */ function splitElement(elem) { if (elem.nodeType === 3) { // Just split up the text node return elem.nodeValue.split('\n'); } // Otherwise, we need to split up the HTML var sourceLines = elem.innerHTML.split('\n'); var lines = []; // Wraps each chunk in the parent element. For example: // foo\nbar -> [foo, bar] for (var i = 0; i < sourceLines.length; i++) { // Handles \nbar -> [, bar] if (sourceLines[i] === '') { lines.push(''); } else { var wrapper = elem.cloneNode(true); wrapper.innerHTML = sourceLines[i]; var div = document.createElement('div'); div.appendChild(wrapper.cloneNode(true)); lines.push(div.innerHTML); } } return lines; }; /** * Splits up the element containing highlighted source code * into an array of lines * * @param {HTMLElement} block * @returns {Array} */ function splitLines(block) { var lines = ['']; for (var i = 0; i < block.childNodes.length; i++) { var elemLines = splitElement(block.childNodes[i]); // The first element in elemLines is // a continuation of the previous line lines[lines.length - 1] += elemLines[0]; // The remaining elements get their own lines for (var j = 1; j < elemLines.length; j++) { lines.push(elemLines[j]); } } // Returns the array of lines return lines; }; // Callback is called when Rainbow has highlighted a block Rainbow.onHighlight(function(block) { // This addresses an issue when Rainbow.color() is called multiple times. // Since code element is replaced with table element below, // second pass of Rainbow.color() will result in block.parentNode being null. if (!block || !block.parentNode) { return; } // Create a table wrapper var table = document.createElement('table'); table.className = 'rainbow'; table.setAttribute('data-language', block.getAttribute('data-language')); // Split up the lines of the block var lines = splitLines(block); // For each line for (var i = 0; i < lines.length; i++) { var line = lines[i]; var index = i + 1; // Create a row var row = table.insertRow(-1); row.className = 'line line-' + index; // Create a cell which displays the line number with CSS var lineNumber = row.insertCell(-1); lineNumber.className = 'line-number'; lineNumber.setAttribute('data-line-number', index); // Add in the actual line of source code var code = row.insertCell(-1); code.className = 'line-code'; // If the line is blank, add a newline to make it copyable. if (line === '') { line = '\n'; } code.innerHTML = line; } // If the block is a
 element, its parent is not an element
        // generated by Rainbow (i.e. it could be ). We don't want
        // to clear this.
        var parent = (block.nodeName.toLowerCase() === 'pre') ? block : block.parentNode;

        // Clear the parent element and use the table in place of the  block
        parent.innerHTML = '';
        parent.appendChild(table);
    });
})(window.Rainbow);openscad-2019.05/scripts/examples-html/assets/js/rainbow.linenumbers.min.js0000644000076500000240000000167713402025764027405 0ustar  kintelstaff00000000000000window.Rainbow&&(window.Rainbow.linenumbers=function(m){m.onHighlight(function(c){if(c&&c.parentNode){var h=document.createElement("table");h.className="rainbow";h.setAttribute("data-language",c.getAttribute("data-language"));for(var e=[""],d=0;d=e[d][c])delete e[d][c],delete j[d][c];if(a>=c&&ac&&b'+b+""}function s(a,b,c,h){var f=a.exec(c);if(f){++t;!b.name&&"string"==typeof b.matches[0]&&(b.name=b.matches[0],delete b.matches[0]);var k=f[0],i=f.index,u=f[0].length+i,g=function(){function f(){s(a,b,c,h)}t%100>0?f():setTimeout(f,0)};if(C(i,u))g();else{var m=v(b.matches),l=function(a,c,h){if(a>=c.length)h(k);else{var d=f[c[a]];if(d){var e=b.matches[c[a]],i=e.language,g=e.name&&e.matches?
e.matches:e,j=function(b,d,e){var i;i=0;var g;for(g=1;g/g,">").replace(/&(?![\w\#]+;)/g,
"&"),b,c)}function o(a,b,c){if(b
                
openscad-2019.05/scripts/examples-html/template-pre.html0000644000076500000240000000273413402025764023644 0ustar kintelstaff00000000000000

openscad-2019.05/scripts/generate-potfiles.sh0000755000076500000240000000102513402025764021543 0ustar  kintelstaff00000000000000#!/bin/bash
#
# Generate list of files for translation. The output is saved to po/POTFILES
# which is needed for the xgettext call.

for ui in objects/ui_*.h
do
        for d in mingw64 mingw32 .
        do
            if [ -f "$d/$ui" ]
            then
                echo "$d/$ui"
            fi
        done
done

for src in src/*.h src/*.cc src/*.cpp src/*.mm
do
	echo $src
done

for src in src/parameter/*.h src/parameter/*.cc src/parameter/*.cpp
do
	echo $src
done

for src in src/input/*.h src/input/*.cc
do
	echo $src
done
openscad-2019.05/scripts/git-archive-all.py0000755000076500000240000004344613402025764021131 0ustar  kintelstaff00000000000000#! /usr/bin/env python
# coding=utf-8

from __future__ import print_function
from __future__ import unicode_literals

__version__ = "1.7"

import sys
from os import path, extsep
from subprocess import Popen, PIPE, CalledProcessError


class GitArchiver(object):
    """
    GitArchiver

    Scan a git repository and export all tracked files, and submodules.
    Checks for .gitattributes files in each directory and uses 'export-ignore'
    pattern entries for ignore files in the archive.

    Automatically detects output format extension: zip, tar, bz2, or gz.
    """

    def __init__(self, prefix='', verbose=False, exclude=True, force_sub=False, extra=None, main_repo_abspath=None):
        """
        @type prefix:   string
        @param prefix:  Prefix used to prepend all paths in the resulting archive.

        @type verbose:  bool
        @param verbose: Determines verbosity of the output (stdout).

        @type exclude:  bool
        @param exclude: Determines whether archiver should follow rules specified in .gitattributes files.
                        Defaults to True.

        @type force_sub:    bool
        @param force_sub:   Determines whether submodules are initialized and updated before archiving.
                            Defaults to False

        @type extra:    list
        @param extra:   List of extra paths to include in the resulting archive.

        @type main_repo_abspath:    string
        @param main_repo_abspath:   Absolute path to the main repository (or one of subdirectories).
                                    If None, current cwd is used.
                                    If given path is path to a subdirectory (but not a submodule directory!)
                                    it will be replaced with abspath to toplevel directory of the repository.
        """
        if extra is None:
            extra = []

        if main_repo_abspath is None:
            main_repo_abspath = path.abspath('')
        elif not path.isabs(main_repo_abspath):
            raise ValueError("You MUST pass absolute path to the main git repository.")

        # Raises an exception if there is no repo under main_repo_abspath.
        try:
            self.run_shell("[ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1", main_repo_abspath)
        except Exception as e:
            raise ValueError("Not a git repository (or any of the parent directories).".format(path=main_repo_abspath))

        # Detect toplevel directory of the repo.
        main_repo_abspath = path.abspath(self.read_git_shell('git rev-parse --show-toplevel', main_repo_abspath).rstrip())

        self.prefix = prefix
        self.verbose = verbose
        self.exclude = exclude
        self.extra = extra
        self.force_sub = force_sub
        self.main_repo_abspath = main_repo_abspath

    def create(self, output_path, dry_run=False, output_format=None):
        """
        Creates the archive, written to the given output_file_path

        Type of the archive is determined either by extension of output_file_path or by the format argument.
        Supported formats are: gz, zip, bz2, tar, tgz

        @type output_path:     string
        @param output_path:    Output file path.

        @type dry_run:  bool
        @param dry_run: Determines whether create should do nothing but print what it would archive.

        @type output_format:    string
        @param output_format:   Determines format of the output archive.
                                If None, format is determined from extension of output_file_path.
        """
        if output_format is None:
            file_name, file_ext = path.splitext(output_path)
            output_format = file_ext[len(extsep):].lower()

        if output_format == 'zip':
            from zipfile import ZipFile, ZIP_DEFLATED

            if not dry_run:
                archive = ZipFile(path.abspath(output_path), 'w')
                add = lambda file_path, file_name: archive.write(file_path, path.join(self.prefix, file_name), ZIP_DEFLATED)
        elif output_format in ['tar', 'bz2', 'gz', 'tgz']:
            import tarfile

            if output_format == 'tar':
                t_mode = 'w'
            elif output_format == 'tgz':
                t_mode = 'w:gz'
            else:
                t_mode = 'w:{f}'.format(f=output_format)

            if not dry_run:
                archive = tarfile.open(path.abspath(output_path), t_mode)
                add = lambda file_path, file_name: archive.add(file_path, path.join(self.prefix, file_name))
        else:
            raise RuntimeError("Unknown format: {f}".format(f=output_format))

        for file_path in self.extra:
            if not dry_run:
                if self.verbose:
                    print("Compressing {f} => {a}...".format(f=file_path,
                                                             a=path.join(self.prefix, file_path)))
                add(file_path, file_path)
            else:
                print("{f} => {a}".format(f=file_path,
                                          a=path.join(self.prefix, file_path)))

        for file_path in self.list_files():
            if not dry_run:
                if self.verbose:
                    print("Compressing {f} => {a}...".format(f=path.join(self.main_repo_abspath, file_path),
                                                             a=path.join(self.prefix, file_path)))
                add(path.join(self.main_repo_abspath, file_path), file_path)
            else:
                print("{f} => {a}".format(f=path.join(self.main_repo_abspath, file_path),
                                          a=path.join(self.prefix, file_path)))

        if not dry_run:
            archive.close()

    def get_path_components(self, repo_abspath, abspath):
        """
        Splits given abspath into components until repo_abspath is reached.

        E.g. if repo_abspath is '/Documents/Hobby/ParaView/' and abspath is
        '/Documents/Hobby/ParaView/Catalyst/Editions/Base/', function will return:
        ['.', 'Catalyst', 'Editions', 'Base']

        First element is always '.' (concrete symbol depends on OS).

        @type repo_abspath:     string
        @param repo_abspath:    Absolute path to the git repository.

        @type abspath:  string
        @param abspath: Absolute path to within repo_abspath.

        @rtype:     list
        @return:    List of path components.
        """
        components = []

        while not path.samefile(abspath, repo_abspath):
            abspath, tail = path.split(abspath)

            if len(tail):
                components.insert(0, tail)

        components.insert(0, path.relpath(repo_abspath, repo_abspath))
        return components

    def get_exclude_patterns(self, repo_abspath, repo_file_paths):
        """
        Returns exclude patterns for a given repo. It looks for .gitattributes files in repo_file_paths.

        Resulting dictionary will contain exclude patterns per path (relative to the repo_abspath).
        E.g. {('.', 'Catalyst', 'Editions', 'Base'), ['Foo*', '*Bar']}

        @type repo_abspath:     string
        @param repo_abspath:    Absolute path to the git repository.

        @type repo_file_paths:  list
        @param repo_file_paths: List of paths relative to the repo_abspath that are under git control.

        @rtype:         dict
        @return:    Dictionary representing exclude patterns.
                    Keys are tuples of strings. Values are lists of strings.
                    Returns None if self.exclude is not set.
        """
        if not self.exclude:
            return None

        def read_attributes(attributes_abspath):
            patterns = []
            if path.isfile(attributes_abspath):
                attributes = open(attributes_abspath, 'r').readlines()
                patterns = []
                for line in attributes:
                    tokens = line.strip().split()
                    if "export-ignore" in tokens[1:]:
                        patterns.append(tokens[0])
            return patterns

        exclude_patterns = {(): []}

        # There may be no gitattributes.
        try:
            global_attributes_abspath = self.read_shell("git config --get core.attributesfile", repo_abspath).rstrip()
            exclude_patterns[()] = read_attributes(global_attributes_abspath)
        except:
            # And valid to not have them.
            pass

        for attributes_abspath in [path.join(repo_abspath, f) for f in repo_file_paths if f.endswith(".gitattributes")]:
            # Each .gitattributes affects only files within its directory.
            key = tuple(self.get_path_components(repo_abspath, path.dirname(attributes_abspath)))
            exclude_patterns[key] = read_attributes(attributes_abspath)

        local_attributes_abspath = path.join(repo_abspath, ".git", "info", "attributes")
        key = tuple(self.get_path_components(repo_abspath, repo_abspath))

        if key in exclude_patterns:
            exclude_patterns[key].extend(read_attributes(local_attributes_abspath))
        else:
            exclude_patterns[key] = read_attributes(local_attributes_abspath)

        return exclude_patterns

    def is_file_excluded(self, repo_abspath, repo_file_path, exclude_patterns):
        """
        Checks whether file at a given path is excluded.

        @type repo_abspath: string
        @param repo_abspath: Absolute path to the git repository.

        @type repo_file_path:   string
        @param repo_file_path:  Path to a file within repo_abspath.

        @type exclude_patterns:     dict
        @param exclude_patterns:    Exclude patterns with format specified for get_exclude_patterns.

        @rtype: bool
        @return: True if file should be excluded. Otherwise False.
        """
        if exclude_patterns is None or not len(exclude_patterns):
            return False

        from fnmatch import fnmatch

        file_name = path.basename(repo_file_path)
        components = self.get_path_components(repo_abspath, path.join(repo_abspath, path.dirname(repo_file_path)))

        is_excluded = False
        # We should check all patterns specified in intermediate directories to the given file.
        # At the end we should also check for the global patterns (key '()' or empty tuple).
        while not is_excluded:
            key = tuple(components)
            if key in exclude_patterns:
                patterns = exclude_patterns[key]
                for p in patterns:
                    if fnmatch(file_name, p) or fnmatch(repo_file_path, p):
                        if self.verbose:
                            print("Exclude pattern matched {pattern}: {path}".format(pattern=p, path=repo_file_path))
                        is_excluded = True

            if not len(components):
                break

            components.pop()

        return is_excluded

    def list_files(self, repo_path=''):
        """
        An iterator method that yields a file path relative to main_repo_abspath
        for each file that should be included in the archive.
        Skips those that match the exclusion patterns found in
        any discovered .gitattributes files along the way.

        Recurs into submodules as well.

        @type repo_path:    string
        @param repo_path:   Path to the git submodule repository within the main git repository.

        @rtype:     iterator
        @return:    Iterator to traverse files under git control relative to main_repo_abspath.
        """
        repo_abspath = path.join(self.main_repo_abspath, repo_path)
        repo_file_paths = self.read_git_shell("git ls-files --cached --full-name --no-empty-directory", repo_abspath).splitlines()
        exclude_patterns = self.get_exclude_patterns(repo_abspath, repo_file_paths)

        for repo_file_path in repo_file_paths:
            # Git puts path in quotes if file path has unicode characters.
            repo_file_path = repo_file_path.strip('"')  # file path relative to current repo
            file_name = path.basename(repo_file_path)

            # Only list symlinks and files that don't start with git.
            if file_name.startswith(".git") or (not path.islink(repo_file_path) and path.isdir(repo_file_path)):
                continue

            main_repo_file_path = path.join(repo_path, repo_file_path)  # file path relative to the main repo

            if self.is_file_excluded(repo_abspath, repo_file_path, exclude_patterns):
                continue

            # Yield both repo_file_path and main_repo_file_path to preserve structure of the repo.
            yield main_repo_file_path

        if self.force_sub:
            self.run_shell("git submodule init", repo_abspath)
            self.run_shell("git submodule update", repo_abspath)

        # List files of every submodule.
        for submodule_path in self.read_shell("git submodule --quiet foreach 'pwd'", repo_abspath).splitlines():
            # In order to get output path we need to exclude repository path from submodule_path.
            submodule_path = path.relpath(submodule_path, self.main_repo_abspath)
            for file_path in self.list_files(submodule_path):
                yield file_path

    @staticmethod
    def run_shell(cmd, cwd=None):
        """
        Runs shell command.

        @type cmd:  string
        @param cmd: Command to be executed.

        @type cwd:  string
        @param cwd: Working directory.

        @rtype:     int
        @return:    Return code of the command.

        @raise CalledProcessError:  Raises exception if return code of the command is non-zero.
        """
        p = Popen(cmd, shell=True, cwd=cwd)
        p.wait()

        if p.returncode:
            raise CalledProcessError(returncode=p.returncode, cmd=cmd)

        return p.returncode

    @staticmethod
    def read_shell(cmd, cwd=None, encoding='utf-8'):
        """
        Runs shell command and reads output.

        @type cmd:  string
        @param cmd: Command to be executed.

        @type cwd:  string
        @param cwd: Working directory.

        @type encoding: string
        @param encoding: Encoding used to decode bytes returned by Popen into string.

        @rtype:     string
        @return:    Output of the command.

        @raise CalledProcessError:  Raises exception if return code of the command is non-zero.
        """
        p = Popen(cmd, shell=True, stdout=PIPE, cwd=cwd)
        output, _ = p.communicate()
        output = output.decode(encoding)

        if p.returncode:
            raise CalledProcessError(returncode=p.returncode, cmd=cmd, output=output)

        return output

    @staticmethod
    def read_git_shell(cmd, cwd=None):
        """
        Runs git shell command, reads output and decodes it into unicode string

        @type cmd:  string
        @param cmd: Command to be executed.

        @type cwd:  string
        @param cwd: Working directory.

        @rtype:     string
        @return:    Output of the command.

        @raise CalledProcessError:  Raises exception if return code of the command is non-zero.
        """
        p = Popen(cmd, shell=True, stdout=PIPE, cwd=cwd)
        output, _ = p.communicate()
        output = output.decode('unicode_escape').encode('raw_unicode_escape').decode('utf-8')

        if p.returncode:
            raise CalledProcessError(returncode=p.returncode, cmd=cmd, output=output)

        return output


if __name__ == '__main__':
    from optparse import OptionParser

    parser = OptionParser(usage="usage: %prog [-v] [--prefix PREFIX] [--no-exclude] [--force-submodules] [--dry-run] OUTPUT_FILE",
                          version="%prog {version}".format(version=__version__))

    parser.add_option('--prefix',
                      type='string',
                      dest='prefix',
                      default='',
                      help="Prepend PREFIX to each filename in the archive. OUTPUT_FILE name is used by default to avoid tarbomb.")

    parser.add_option('-v', '--verbose',
                      action='store_true',
                      dest='verbose',
                      help='Enable verbose mode.')

    parser.add_option('--no-exclude',
                      action='store_false',
                      dest='exclude',
                      default=True,
                      help="Don't read .gitattributes files for patterns containing export-ignore attrib.")

    parser.add_option('--force-submodules',
                      action='store_true',
                      dest='force_sub',
                      help="Force a git submodule init && git submodule update at each level before iterating submodules.")

    parser.add_option('--extra',
                      action='append',
                      dest='extra',
                      default=[],
                      help="Any additional files to include in the archive.")
    parser.add_option('--dry-run',
                      action='store_true',
                      dest='dry_run',
                      help="Don't actually archive anything, just show what would be done.")

    options, args = parser.parse_args()

    if len(args) != 1:
        parser.error("You must specify exactly one output file")

    output_file_path = args[0]

    if path.isdir(output_file_path):
        parser.error("You cannot use directory as output")

    # avoid tarbomb
    if options.prefix:
        options.prefix = path.join(options.prefix, '')
    else:
        import re

        output_name = path.basename(output_file_path)
        output_name = re.sub('(\.zip|\.tar|\.tgz|\.gz|\.bz2|\.tar\.gz|\.tar\.bz2)$', '', output_name) or "Archive"
        options.prefix = path.join(output_name, '')

    try:
        archiver = GitArchiver(options.prefix,
                               options.verbose,
                               options.exclude,
                               options.force_sub,
                               options.extra)
        archiver.create(output_file_path, options.dry_run)
    except Exception as e:
        parser.exit(2, "{exception}\n".format(exception=e))

    sys.exit(0)
openscad-2019.05/scripts/github-release.sh0000755000076500000240000000043413402025764021031 0ustar  kintelstaff00000000000000#!/bin/bash

# Usage (in github root folder): ./scripts/github-release.sh 
#
# Requires release.token and releases/.md

curl https://api.github.com/repos/openscad/openscad/releases -H "Authorization: token $()" -d "$(./scripts/makereleasejson.py $1)"
openscad-2019.05/scripts/installer-linux.sh0000755000076500000240000000257313402025764021271 0ustar  kintelstaff00000000000000#!/bin/bash

# change to the install source directory
cd "$( dirname "$( type -p $0 )" )"

if ! [ -f bin/openscad -a -d lib/openscad -a -d examples -a -d libraries ]; then
	echo "Error: Can't change to install source directory!" >&2
	exit 1
fi

echo "This will install openscad. Please enter the install prefix"
echo "or press Ctrl-C to abort the install process:"
read -p "[/usr/local]: " prefix

if [ "$prefix" = "" ]; then
	prefix="/usr/local"
fi

if [ ! -d "$prefix" ]; then
	echo; echo "Install prefix \`$prefix' does not exist. Press ENTER to continue"
	echo "or press Ctrl-C to abort the install process:"
	read -p "press enter to continue> "
fi

mkdir -p "$prefix"/{bin,lib/openscad,share/openscad/examples,share/openscad/libraries}

if ! [ -w "$prefix"/bin/ -a -w "$prefix"/lib/openscad -a -w "$prefix"/share/openscad ]; then
	echo "You does not seam to have write permissions for prefix \`$prefix'!" >&2
	echo "Maybe you should have run this install script using \`sudo'?" >&2
	exit 1
fi

echo "Copying application wrappers..."
cp -rv bin/. "$prefix"/bin/

echo "Copying application..."
cp -rv lib/. "$prefix"/lib/

echo "Copying examples..."
cp -rv examples/. "$prefix"/share/openscad/examples/

echo "Copying libraries..."
cp -rv libraries/. "$prefix"/share/openscad/libraries/

echo "Copying support files..."
cp -rv share/. "$prefix"/share/

echo "Installation finished. Have a nice day."
openscad-2019.05/scripts/installer.nsi0000644000076500000240000000426013402025764020303 0ustar  kintelstaff00000000000000InstallDir ""
!include "LogicLib.nsh"
!include "mingw-file-association.nsh"
!include "x64.nsh"
Name "OpenSCAD"
OutFile "openscad_setup.exe"
!include "installer_arch.nsi"
DirText "This will install OpenSCAD on your computer. Choose a directory"
Section "install"
SetOutPath $INSTDIR
File openscad.exe
File openscad.com
File /r /x mingw-cross-env examples
File /r /x mingw-cross-env libraries
File /r /x mingw-cross-env fonts
File /r /x mingw-cross-env locale
File /r /x mingw-cross-env color-schemes
${registerExtension} "$INSTDIR\openscad.exe" ".scad" "OpenSCAD_File"
CreateShortCut $SMPROGRAMS\OpenSCAD.lnk $INSTDIR\openscad.exe
WriteUninstaller $INSTDIR\Uninstall.exe
# see https://msdn.microsoft.com/en-us/library/aa372105(v=vs.85).aspx
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "DisplayName" "OpenSCAD (remove only)"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "DisplayVersion" "${VERSION}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "Publisher" "The OpenSCAD Developers"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "URLInfoAbout" "http://www.openscad.org/"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "URLUpdateInfo" "http://www.openscad.org/downloads.html"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "HelpLink" "http://forum.openscad.org/"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD" "UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegStr HKCR ".scad" "PerceivedType" "text"
SectionEnd
Section "Uninstall"
${unregisterExtension} ".scad" "OpenSCAD_File"
Delete $INSTDIR\Uninstall.exe
Delete $INSTDIR\MyProg.exe
Delete $SMPROGRAMS\OpenSCAD.lnk
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD"
RMDir /r $INSTDIR\fonts
RMDir /r $INSTDIR\color-schemes
RMDir /r $INSTDIR\examples
RMDir /r $INSTDIR\libraries\mcad
RMDir /r $INSTDIR\locale
Delete $INSTDIR\libraries\boxes.scad
Delete $INSTDIR\libraries\shapes.scad
RMDir $INSTDIR\libraries
Delete $INSTDIR\openscad.exe
Delete $INSTDIR\openscad.com
RMDir $INSTDIR
SectionEnd
openscad-2019.05/scripts/installer32.nsi0000644000076500000240000000010613402025764020443 0ustar  kintelstaff00000000000000Function .onInit
  StrCpy $InstDir $PROGRAMFILES\OpenSCAD
FunctionEnd
openscad-2019.05/scripts/installer64.nsi0000644000076500000240000000031313402025764020450 0ustar  kintelstaff00000000000000Function .onInit
${If} ${RunningX64}
  StrCpy $InstDir $PROGRAMFILES64\OpenSCAD
  SetRegView 64
${Else}
  Messagebox MB_OK "This is 64 bit OpenSCAD, your machine is 32 bits. Error."
${EndIf}
FunctionEnd
openscad-2019.05/scripts/macosx-build-dependencies.sh0000755000076500000240000005547413441107073023157 0ustar  kintelstaff00000000000000#!/bin/bash
#
# This script builds all library dependencies of OpenSCAD for Mac OS X.
# The libraries will be build in 64-bit mode and backwards compatible with 10.8 "Mountain Lion".
# 
# This script must be run from the OpenSCAD source root directory
#
# Usage: macosx-build-dependencies.sh [-16lcdfv] []
#  -d   Build for deployment (if not specified, e.g. Sparkle won't be built)
#  -f   Force build even if package is installed
#  -v   Verbose
#
# Prerequisites:
# - MacPorts: curl, cmake
#

if [ "`echo $* | grep \\\-v `" ]; then
  set -x
fi

BASEDIR=$PWD/../libraries
OPENSCADDIR=$PWD
SRCDIR=$BASEDIR/src
DEPLOYDIR=$BASEDIR/install
MAC_OSX_VERSION_MIN=10.9
OPTION_DEPLOY=false
OPTION_FORCE=0

PACKAGES=(
    "double_conversion 3.1.1"
    "eigen 3.3.7"
    "gmp 6.1.2"
    "mpfr 4.0.2"
    "glew 2.1.0"
    "gettext 0.19.8"
    "libffi 3.2.1"
    "freetype 2.9.1"
    "ragel 6.10"
    "harfbuzz 2.3.1"
    "libzip 1.5.1"
    "libxml2 2.9.9"
    "fontconfig 2.13.1"
    "hidapi 0.8.0-rc1"
    "libuuid 1.6.2"
    "lib3mf 1.8.1"
    "glib2 2.56.3"
    "boost 1.65.1"
    "cgal 4.13"
    "qt5 5.9.7"
    "opencsg 1.4.2"
    "qscintilla 2.10.8"
)
DEPLOY_PACKAGES=(
    "sparkle 1.21.3"
)

printUsage()
{
  echo "Usage: $0 [-cdfv] []"
  echo
  echo "  -d   Build for deployment"
  echo "  -f   Force build even if package is installed"
  echo "  -v   Verbose"
  echo
  echo "  If  is not specified, builds all packages"
}

# Outputs all package names
all_packages()
{
    for i in $(seq 0 $(( ${#PACKAGES[@]} - 1 )) ); do
        local p=${PACKAGES[$i]}
        echo -n "${p%%\ *} " # Cut at first space
    done
}

# Usage: package_version 
# Outputs the package version for the given package
package_version()
{
    for i in $(seq 0 $(( ${#PACKAGES[@]} - 1 )) ); do
        local p=${PACKAGES[$i]}
        if [ "$1" = "${p%%\ *}" ]; then
            echo "${p#*\ }" # cut until first space
            return 0
        fi
    done
    return 1
}

# Usage: build  
build()
{
    local package=$1
    local version=$2

    local should_install=$(( $OPTION_FORCE == 1 ))
    if [[ $should_install == 0 ]]; then
        is_installed $package $version
        should_install=$?
    fi
    if [[ $should_install == 1 ]]; then
        set -e
        build_$package $version
        set +e
    fi
}

# Usage: is_installed  []
# Returns success (0) if the/a version of the package is already installed
is_installed()
{
    if check_$1 $2; then
      echo "$1 already installed - not building"
      return 0
    fi
    return 1
}

# Usage: check_dir 
# Checks if $DEPLOYDIR/ exists and is a folder
# Returns success (0) if the folder exists
check_dir()
{
    test -d "$DEPLOYDIR/$1"
}

# Usage: check_file 
# Checks if $DEPLOYDIR/ exists and is a file
# Returns success (0) if the file exists
check_file()
{
    test -f "$DEPLOYDIR/$1"
}


check_double_conversion()
{
    check_file lib/libdouble-conversion.a
}

build_double_conversion()
{
  version="$1"

  echo "Building double-conversion $version..."
  cd "$BASEDIR"/src
  rm -rf "double-conversion-$version"
  if [ ! -f "double-conversion-$version.tar.gz" ]; then
    curl -L "https://github.com/google/double-conversion/archive/v$version.tar.gz" -o double-conversion-$version.tar.gz
  fi
  tar xzf "double-conversion-$version.tar.gz"
  cd "double-conversion-$version"
  cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DCMAKE_OSX_DEPLOYMENT_TARGET="$MAC_OSX_VERSION_MIN" .
  make -j$NUMCPU
  make install
}

check_qt5()
{
    check_dir lib/QtCore.framework
}

build_qt5()
{
  version=$1

  echo "Building Qt" $version "..."
  cd $BASEDIR/src
  v=(${version//./ }) # Split into array
  rm -rf qt-opensource-opensource-src-$version
  if [ ! -f qt-everywhere-opensource-src-$version.tar.xz ]; then
      curl -LO http://download.qt.io/official_releases/qt/${v[0]}.${v[1]}/$version/single/qt-everywhere-opensource-src-$version.tar.xz
  fi
  tar xzf qt-everywhere-opensource-src-$version.tar.xz
  cd qt-everywhere-opensource-src-$version
  patch -p1 < $OPENSCADDIR/patches/qt5/qt-5.9.7-macos.patch 
  ./configure -prefix $DEPLOYDIR -release -opensource -confirm-license \
		-nomake examples -nomake tests \
		-no-xcb -no-glib -no-harfbuzz -no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-odbc \
		-no-sql-psql -no-sql-sqlite2 -no-sql-tds -no-cups \
                -skip qtx11extras -skip qtandroidextras -skip qtserialport -skip qtserialbus \
                -skip qtactiveqt -skip qtxmlpatterns -skip qtdeclarative -skip qtscxml \
                -skip qtpurchasing -skip qtcanvas3d -skip qtwayland \
                -skip qtconnectivity -skip qtwebsockets -skip qtwebchannel -skip qtsensors \
                -skip qtdatavis3d -skip qtcharts -skip qtwinextras \
                -skip qtgraphicaleffects -skip qtquickcontrols2 -skip qtquickcontrols \
                -skip qtvirtualkeyboard -skip qtlocation -skip qtwebengine -skip qtwebview \
                -skip qtscript -skip qttranslations -skip qtdoc
  make -j"$NUMCPU" 
  make install
}

check_qscintilla()
{
    check_file include/Qsci/qsciscintilla.h 
}

build_qscintilla()
{
  version=$1
  echo "Building QScintilla" $version "..."
  cd $BASEDIR/src
  rm -rf QScintilla_gpl-$version
  if [ ! -f QScintilla_gpl-$version.tar.gz ]; then
    curl -LO http://downloads.sourceforge.net/project/pyqt/QScintilla2/QScintilla-$version/QScintilla_gpl-$version.tar.gz
  fi
  tar xzf QScintilla_gpl-$version.tar.gz
  cd QScintilla_gpl-$version/Qt4Qt5
#  patch -p2 < $OPENSCADDIR/patches/QScintilla-2.9.3-xcode8.patch
  qmake qscintilla.pro
  make -j"$NUMCPU" install
  install_name_tool -id @rpath/libqscintilla2_qt5.dylib $DEPLOYDIR/lib/libqscintilla2_qt5.dylib
}

check_gmp()
{
    check_file lib/libgmp.dylib
}

build_gmp()
{
  version=$1

  echo "Building gmp" $version "..."
  cd $BASEDIR/src
  rm -rf gmp-$version
  if [ ! -f gmp-$version.tar.bz2 ]; then
    curl -O https://gmplib.org/download/gmp/gmp-$version.tar.bz2
  fi
  tar xjf gmp-$version.tar.bz2
  cd gmp-$version
  # Note: We're building against the core2 CPU profile as that's the minimum required hardware for running OS X 10.9
  ./configure --prefix=$DEPLOYDIR CXXFLAGS="$CXXSTDFLAGS" CFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN" LDFLAGS="$LDSTDFLAGS -mmacosx-version-min=$MAC_OSX_VERSION_MIN" --enable-cxx --host=core2-apple-darwin13.0.0
  make -j"$NUMCPU" install

  install_name_tool -id @rpath/libgmp.dylib $DEPLOYDIR/lib/libgmp.dylib
  install_name_tool -id @rpath/libgmpxx.dylib $DEPLOYDIR/lib/libgmpxx.dylib
  install_name_tool -change $DEPLOYDIR/lib/libgmp.10.dylib @rpath/libgmp.dylib $DEPLOYDIR/lib/libgmpxx.dylib
}

# As with gmplib, mpfr is built separately in 32-bit and 64-bit mode and then merged
# afterwards.
check_mpfr()
{
    check_file include/mpfr.h
}

build_mpfr()
{
  version=$1

  echo "Building mpfr" $version "..."
  cd $BASEDIR/src
  rm -rf mpfr-$version
  if [ ! -f mpfr-$version.tar.bz2 ]; then
    curl -L -O http://www.mpfr.org/mpfr-$version/mpfr-$version.tar.bz2
  fi
  tar xjf mpfr-$version.tar.bz2
  cd mpfr-$version

  ./configure --prefix=$DEPLOYDIR --with-gmp=$DEPLOYDIR CFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN -arch x86_64" LDFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN -arch x86_64"
  make -j"$NUMCPU" install

  install_name_tool -id @rpath/libmpfr.dylib $DEPLOYDIR/lib/libmpfr.dylib
}

check_boost()
{
    check_file lib/libboost_system.dylib
}

build_boost()
{
  version=$1

  bversion=`echo $version | tr "." "_"`
  echo "Building boost" $version "..."
  cd $BASEDIR/src
  rm -rf boost_$bversion
  if [ ! -f boost_$bversion.tar.bz2 ]; then
    curl -LO http://downloads.sourceforge.net/project/boost/boost/$version/boost_$bversion.tar.bz2
  fi
  tar xjf boost_$bversion.tar.bz2
  cd boost_$bversion
  ./bootstrap.sh --prefix=$DEPLOYDIR --with-libraries=thread,program_options,filesystem,chrono,system,regex,date_time,atomic
  BOOST_TOOLSET="toolset=clang"
  echo "using clang ;" >> tools/build/user-config.jam 
  ./b2 -j"$NUMCPU" -d+2 $BOOST_TOOLSET cflags="-mmacosx-version-min=$MAC_OSX_VERSION_MIN -arch x86_64" linkflags="-mmacosx-version-min=$MAC_OSX_VERSION_MIN -arch x86_64 -headerpad_max_install_names" install
}

check_cgal()
{
    check_file lib/libCGAL.dylib
}

build_cgal()
{
  version=$1

  echo "Building CGAL" $version "..."
  cd $BASEDIR/src
  rm -rf CGAL-$version
  if [ ! -f CGAL-$version.tar.xz ]; then
    curl -LO https://github.com/CGAL/cgal/releases/download/releases%2FCGAL-$version/CGAL-$version.tar.xz
  fi
  tar xzf CGAL-$version.tar.xz
  cd CGAL-$version
  cmake . -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DCMAKE_BUILD_TYPE=Release -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.dylib -DGMPXX_LIBRARIES=$DEPLOYDIR/lib/libgmpxx.dylib -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.dylib -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_Qt5=OFF -DWITH_CGAL_ImageIO=OFF -DBUILD_SHARED_LIBS=TRUE -DCMAKE_OSX_DEPLOYMENT_TARGET="$MAC_OSX_VERSION_MIN" -DCMAKE_OSX_ARCHITECTURES="x86_64" -DBOOST_ROOT=$DEPLOYDIR -DBoost_USE_MULTITHREADED=false
  make -j"$NUMCPU" install
  make install
  install_name_tool -id @rpath/libCGAL.dylib $DEPLOYDIR/lib/libCGAL.dylib
  install_name_tool -id @rpath/libCGAL_Core.dylib $DEPLOYDIR/lib/libCGAL_Core.dylib
  install_name_tool -change libCGAL.11.dylib @rpath/libCGAL.dylib $DEPLOYDIR/lib/libCGAL_Core.dylib
}

check_glew()
{
    check_file lib/libGLEW.dylib
}

build_glew()
{
  version=$1

  echo "Building GLEW" $version "..."
  cd $BASEDIR/src
  rm -rf glew-$version
  if [ ! -f glew-$version.tgz ]; then
    curl -LO http://downloads.sourceforge.net/project/glew/glew/$version/glew-$version.tgz
  fi
  tar xzf glew-$version.tgz
  cd glew-$version
  mkdir -p $DEPLOYDIR/lib/pkgconfig
  make GLEW_DEST=$DEPLOYDIR CFLAGS.EXTRA="-no-cpp-precomp -dynamic -fno-common -mmacosx-version-min=$MAC_OSX_VERSION_MIN -arch x86_64" LDFLAGS.EXTRA="-install_name @rpath/libGLEW.dylib -mmacosx-version-min=$MAC_OSX_VERSION_MIN -arch x86_64" POPT="-Os" STRIP= install
}

check_opencsg()
{
    check_file lib/libopencsg.dylib
}

build_opencsg()
{
  version=$1

  echo "Building OpenCSG" $version "..."
  cd $BASEDIR/src
  rm -rf OpenCSG-$version
  if [ ! -f OpenCSG-$version.tar.gz ]; then
    curl -O http://www.opencsg.org/OpenCSG-$version.tar.gz
  fi
  tar xzf OpenCSG-$version.tar.gz
  cd OpenCSG-$version
  patch -p1 < $OPENSCADDIR/patches/OpenCSG-$version-MacOSX-port.patch
  qmake -r INSTALLDIR=$DEPLOYDIR
  make install
  install_name_tool -id @rpath/libopencsg.dylib $DEPLOYDIR/lib/libopencsg.dylib
}

# Usage: func []
check_eigen()
{
    # To check version:
    # include/eigen3/Eigen/src/Core/util/Macros.h:
    #  #define EIGEN_WORLD_VERSION 3
    #  #define EIGEN_MAJOR_VERSION 2
    #  #define EIGEN_MINOR_VERSION 3

    check_dir include/eigen3
}

# Usage: func 
build_eigen()
{
  version=$1

  echo "Building eigen" $version "..."
  cd $BASEDIR/src
  rm -rf eigen-$version

  if [ ! -f eigen-$version.tar.bz2 ]; then
    curl -LO http://bitbucket.org/eigen/eigen/get/$version.tar.bz2
    mv $version.tar.bz2 eigen-$version.tar.bz2
  fi
  EIGENDIR=`tar tjf eigen-$version.tar.bz2 | head -1 | cut -f1 -d"/"`
  rm -rf $EIGENDIR
  tar xjf eigen-$version.tar.bz2
  ln -s ./$EIGENDIR eigen-$version
  cd eigen-$version
  mkdir build
  cd build
  cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DEIGEN_TEST_NOQT=TRUE -DCMAKE_OSX_DEPLOYMENT_TARGET="$MAC_OSX_VERSION_MIN" -DCMAKE_OSX_ARCHITECTURES="x86_64" ..
  make -j"$NUMCPU" install
}

check_sparkle()
{
    check_file lib/Sparkle.framework/Sparkle
}

# Usage:
#   build_sparkle :
#   build_sparkle 

build_sparkle()
{
# Binary install:
  version=$1
  cd $BASEDIR/src
  rm -rf Sparkle-$version
  if [ ! -f Sparkle-$version.tar.bz2 ]; then
    curl -LO https://github.com/sparkle-project/Sparkle/releases/download/$version/Sparkle-$version.tar.bz2
  fi
  mkdir Sparkle-$version
  cd Sparkle-$version
  tar xjf ../Sparkle-$version.tar.bz2
  cp -Rf Sparkle.framework $DEPLOYDIR/lib/ 

# Build from source:
#  v=$1
#  github=${1%%:*}  # Cut at first colon
#  version=${1#*:}  # cut until first colon
#
#  echo "Building Sparkle" $version "..."
#
#  # Let Sparkle use the default compiler
#  unset CC
#  unset CXX
#
#  cd $BASEDIR/src
#  rm -rf Sparkle-$version
#  if [ ! -f Sparkle-$version.zip ]; then
#      curl -o Sparkle-$version.zip https://nodeload.github.com/$github/Sparkle/zip/$version
#  fi
#  unzip -q Sparkle-$version.zip
#  cd Sparkle-$version
#  patch -p1 < $OPENSCADDIR/patches/sparkle.patch
#  xcodebuild clean
#  xcodebuild -arch x86_64
#  rm -rf $DEPLOYDIR/lib/Sparkle.framework
#  cp -Rf build/Release/Sparkle.framework $DEPLOYDIR/lib/ 
#  Install_name_tool -id $DEPLOYDIR/lib/Sparkle.framework/Versions/A/Sparkle $DEPLOYDIR/lib/Sparkle.framework/Sparkle
}

check_freetype()
{
    check_file lib/libfreetype.dylib
}

build_freetype()
{
  version="$1"
  extra_config_flags="--without-png"

  echo "Building freetype $version..."
  cd "$BASEDIR"/src
  rm -rf "freetype-$version"
  if [ ! -f "freetype-$version.tar.gz" ]; then
    curl --insecure -LO "http://downloads.sourceforge.net/project/freetype/freetype2/$version/freetype-$version.tar.gz"
  fi
  tar xzf "freetype-$version.tar.gz"
  cd "freetype-$version"

  export FREETYPE_CFLAGS="-I$DEPLOYDIR/include -I$DEPLOYDIR/include/freetype2"
  export FREETYPE_LIBS="-L$DEPLOYDIR/lib -lfreetype"
  PKG_CONFIG_LIBDIR="$DEPLOYDOR/lib/pkgconfig" ./configure --prefix="$DEPLOYDIR" CFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN LDFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN $extra_config_flags
  make -j"$NUMCPU"
  make install
  install_name_tool -id @rpath/libfreetype.dylib $DEPLOYDIR/lib/libfreetype.dylib
}
 
check_libzip()
{
    check_file lib/libzip.dylib
}

build_libzip()
{
  version="$1"

  echo "Building libzip $version..."
  cd "$BASEDIR"/src
  rm -rf "libzip-$version"
  if [ ! -f "libzip-$version.tar.gz" ]; then
    curl -LO "https://libzip.org/download/libzip-$version.tar.gz"
  fi
  tar xzf "libzip-$version.tar.gz"
  cd "libzip-$version"
  cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DCMAKE_OSX_DEPLOYMENT_TARGET="$MAC_OSX_VERSION_MIN" .
  make -j$NUMCPU
  make install
  install_name_tool -id @rpath/libzip.dylib $DEPLOYDIR/lib/libzip.dylib
}

check_libxml2()
{
    check_file lib/libxml2.dylib
}

build_libxml2()
{
  version="$1"

  echo "Building libxml2 $version..."
  cd "$BASEDIR"/src
  rm -rf "libxml2-$version"
  if [ ! -f "libxml2-$version.tar.gz" ]; then
    curl --insecure -LO "ftp://xmlsoft.org/libxml2/libxml2-$version.tar.gz"
  fi
  tar xzf "libxml2-$version.tar.gz"
  cd "libxml2-$version"
  ./configure --prefix="$DEPLOYDIR" --with-zlib=/usr --without-lzma --without-ftp --without-http --without-python CFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN LDFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN
  make -j$NUMCPU
  make install
  install_name_tool -id @rpath/libxml2.dylib $DEPLOYDIR/lib/libxml2.dylib
}

check_fontconfig()
{
    check_file lib/libfontconfig.dylib
}

build_fontconfig()
{
  version=$1

  echo "Building fontconfig $version..."
  cd "$BASEDIR"/src
  rm -rf "fontconfig-$version"
  if [ ! -f "fontconfig-$version.tar.gz" ]; then
    curl -LO "https://www.freedesktop.org/software/fontconfig/release/fontconfig-$version.tar.gz"
  fi
  tar xzf "fontconfig-$version.tar.gz"
  cd "fontconfig-$version"
  export PKG_CONFIG_PATH="$DEPLOYDIR/lib/pkgconfig"
  # FIXME: The "ac_cv_func_mkostemp=no" is a workaround for fontconfig's autotools config not respecting any passed
  # -no_weak_imports linker flag. This may be improved in future versions of fontconfig
  ./configure --prefix="$DEPLOYDIR" --enable-libxml2 CFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN LDFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN ac_cv_func_mkostemp=no
  unset PKG_CONFIG_PATH
  make -j$NUMCPU
  make install
  install_name_tool -id @rpath/libfontconfig.dylib $DEPLOYDIR/lib/libfontconfig.dylib
}

check_libffi()
{
    check_file lib/libffi.dylib
}

build_libffi()
{
  version="$1"

  echo "Building libffi $version..."
  cd "$BASEDIR"/src
  rm -rf "libffi-$version"
  if [ ! -f "libffi-$version.tar.gz" ]; then
    curl --insecure -LO "ftp://sourceware.org/pub/libffi/libffi-$version.tar.gz"
  fi
  tar xzf "libffi-$version.tar.gz"
  cd "libffi-$version"
  ./configure --prefix="$DEPLOYDIR"
  make -j$NUMCPU
  make install
  install_name_tool -id @rpath/libffi.dylib $DEPLOYDIR/lib/libffi.dylib
}

check_gettext()
{
    check_file lib/libgettextlib.dylib
}

build_gettext()
{
  version="$1"

  echo "Building gettext $version..."
  cd "$BASEDIR"/src
  rm -rf "gettext-$version"
  if [ ! -f "gettext-$version.tar.gz" ]; then
    curl --insecure -LO "http://ftpmirror.gnu.org/gettext/gettext-$version.tar.gz"
  fi
  tar xzf "gettext-$version.tar.gz"
  cd "gettext-$version"
  patch -p1 < $OPENSCADDIR/patches/gettext.patch
  ./configure --with-included-glib --prefix="$DEPLOYDIR" CFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN LDFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN
  make -j$NUMCPU
  make install
  install_name_tool -id $DEPLOYDIR/lib/libintl.dylib $DEPLOYDIR/lib/libintl.dylib
}

check_glib2()
{
    check_file lib/libglib-2.0.dylib
}

build_glib2()
{
  version="$1"

  echo "Building glib2 $version..."

  cd "$BASEDIR"/src
  rm -rf "glib-$version"
  maj_min_version="${version%.*}" #Drop micro
  if [ ! -f "glib-$version.tar.xz" ]; then
    curl --insecure -LO "http://ftp.gnome.org/pub/gnome/sources/glib/$maj_min_version/glib-$version.tar.xz"
  fi
  tar xJf "glib-$version.tar.xz"
  cd "glib-$version"

  export PKG_CONFIG_PATH="$DEPLOYDIR/lib/pkgconfig"
  ./configure --disable-gtk-doc --disable-man --without-pcre --prefix="$DEPLOYDIR" CFLAGS="-I$DEPLOYDIR/include -mmacosx-version-min=$MAC_OSX_VERSION_MIN" LDFLAGS="-L$DEPLOYDIR/lib -mmacosx-version-min=$MAC_OSX_VERSION_MIN"
  unset PKG_CONFIG_PATH
  make -j$NUMCPU
  make install
  install_name_tool -id @rpath/libglib-2.0.dylib $DEPLOYDIR/lib/libglib-2.0.dylib
}

check_ragel()
{
    check_file bin/ragel
}

build_ragel()
{
  version=$1

  echo "Building ragel $version..."
  cd "$BASEDIR"/src
  rm -rf "ragel-$version"
  if [ ! -f "ragel-$version.tar.gz" ]; then
    curl --insecure -LO "http://www.colm.net/files/ragel/ragel-$version.tar.gz"
  fi
  tar xzf "ragel-$version.tar.gz"
  cd "ragel-$version"
  ./configure --prefix="$DEPLOYDIR"
  make -j$NUMCPU
  make install
}

check_harfbuzz()
{
    check_file lib/libharfbuzz.dylib
}

build_harfbuzz()
{
    set -x
  version=$1
  extra_config_flags="--with-coretext=auto --with-glib=no --disable-gtk-doc-html"

  echo "Building harfbuzz $version..."
  cd "$BASEDIR"/src
  rm -rf "harfbuzz-$version"
  if [ ! -f "harfbuzz-$version.tar.gz" ]; then
    curl -LO "https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-$version.tar.bz2"
  fi
  tar xzf "harfbuzz-$version.tar.bz2"
  cd "harfbuzz-$version"
  PKG_CONFIG_LIBDIR="$DEPLOYDIR/lib/pkgconfig" ./configure --prefix="$DEPLOYDIR" --with-freetype=yes --with-gobject=no --with-cairo=no --with-icu=no CFLAGS=-mmacosx-version-min=$MAC_OSX_VERSION_MIN CXXFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN" LDFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN" $extra_config_flags
  make -j$NUMCPU
  make install
  install_name_tool -id @rpath/libharfbuzz.dylib $DEPLOYDIR/lib/libharfbuzz.dylib
}

check_hidapi()
{
    check_file lib/libhidapi.a
}

build_hidapi()
{
  version=$1

  echo "Building hidapi $version..."
  cd "$BASEDIR"/src
  rm -rf "hidapi-hidapi-$version"
  if [ ! -f "hidapi-$version.zip" ]; then
    curl --insecure -LO "https://github.com/signal11/hidapi/archive/hidapi-${version}.zip"
  fi
  unzip "hidapi-$version.zip"
  cd "hidapi-hidapi-$version"
  ./bootstrap # Needed when building from github sources
  ./configure --prefix=$DEPLOYDIR CFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN" LDFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN"
  make -j"$NUMCPU" install
  install_name_tool -id @rpath/libhidapi.dylib $DEPLOYDIR/lib/libhidapi.dylib
}

check_libuuid()
{
    check_file lib/libuuid.dylib
}

build_libuuid()
{
  version=$1
  cd $BASEDIR/src
  rm -rf uuid-$version
  if [ ! -f uuid-$version.tar.gz ]; then
    curl -L https://mirrors.ocf.berkeley.edu/debian/pool/main/o/ossp-uuid/ossp-uuid_$version.orig.tar.gz -o uuid-$version.tar.gz
  fi
  tar xzf uuid-$version.tar.gz
  cd uuid-$version
  patch -p1 < $OPENSCADDIR/patches/uuid-1.6.2.patch
  ./configure -prefix $DEPLOYDIR CFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN" LDFLAGS="-mmacosx-version-min=$MAC_OSX_VERSION_MIN" --without-perl --without-php --without-pgsql
  make -j"$NUMCPU"
  make install
  install_name_tool -id @rpath/libuuid.dylib $DEPLOYDIR/lib/libuuid.dylib
}

check_lib3mf()
{
    check_file lib/lib3mf.dylib
}

build_lib3mf()
{
  version=$1

  echo "Building lib3mf" $version "..."
  cd $BASEDIR/src
  rm -rf lib3mf-$version
  if [ ! -f $version.tar.gz ]; then
    curl -L https://github.com/3MFConsortium/lib3mf/archive/v$version.tar.gz -o lib3mf-$version.tar.gz
  fi
  tar xzf lib3mf-$version.tar.gz
  cd lib3mf-$version
  cmake -DLIB3MF_TESTS=false -DCMAKE_PREFIX_PATH=$DEPLOYDIR -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR  -DCMAKE_OSX_DEPLOYMENT_TARGET="$MAC_OSX_VERSION_MIN" .
  make -j"$NUMCPU" VERBOSE=1
  make -j"$NUMCPU" install
}

if [ ! -f $OPENSCADDIR/openscad.pro ]; then
  echo "Must be run from the OpenSCAD source root directory"
  exit 0
fi
OPENSCAD_SCRIPTDIR=$PWD/scripts

while getopts '3lcdfv' c
do
  case $c in
    d) OPTION_DEPLOY=true;;
    f) OPTION_FORCE=1;;
    v) echo verbose on;;
    *) printUsage;exit 1;;
  esac
done

OPTION_PACKAGES="${@:$OPTIND}"

OSX_VERSION=`sw_vers -productVersion | cut -d. -f2`
if (( $OSX_VERSION >= 14 )); then
  echo "Detected Mojave (10.14) or later"
elif (( $OSX_VERSION >= 13 )); then
  echo "Detected High Sierra (10.13) or later"
elif (( $OSX_VERSION >= 12 )); then
  echo "Detected Sierra (10.12) or later"
elif (( $OSX_VERSION >= 11 )); then
  echo "Detected El Capitan (10.11) or later"
elif (( $OSX_VERSION >= 10 )); then
  echo "Detected Yosemite (10.10) or later"
elif (( $OSX_VERSION >= 9 )); then
  echo "Detected Mavericks (10.9)"
elif (( $OSX_VERSION >= 8 )); then
  echo "Detected Mountain Lion (10.8)"
else
  echo "Detected Lion (10.7) or earlier"
fi

echo "Building for $MAC_OSX_VERSION_MIN or later"

if [ ! $NUMCPU ]; then
  NUMCPU=$(sysctl -n hw.ncpu)
  echo "Setting number of CPUs to $NUMCPU"
fi

if $OPTION_DEPLOY; then
  echo "Building deployment version of libraries"
fi

if (( $OPTION_FORCE )); then
  echo "Forcing rebuild"
fi

echo "Using basedir:" $BASEDIR
mkdir -p $SRCDIR $DEPLOYDIR

# Only build deploy packages in deploy mode
if $OPTION_DEPLOY; then
  # Array concatenation
  PACKAGES=("${PACKAGES[@]}" "${DEPLOY_PACKAGES[@]}")
fi

# Build specified (or all) packages
ALL_PACKAGES=$(all_packages)
echo $ALL_PACKAGES
if [ -z "$OPTION_PACKAGES" ]; then
  OPTION_PACKAGES=$ALL_PACKAGES
fi

echo "Building packages: $OPTION_PACKAGES"
echo

for package in $OPTION_PACKAGES; do
  if [[ $ALL_PACKAGES =~ $package ]]; then
    build $package $(package_version $package)
  else
    echo "Skipping unknown package $package"
  fi
done

if [ "`echo $* | grep \\\-v `" ]; then
  set +x
  echo verbose macosx dependency build finished running
fi
openscad-2019.05/scripts/macosx-build-homebrew.sh0000755000076500000240000000261113441031436022321 0ustar  kintelstaff00000000000000#!/bin/bash
#
# This script builds  library dependencies of OpenSCAD for Mac OS X using Homebrew.
# 
# This script must be run from the OpenSCAD source root directory
#
# Prerequisites:
# - Homebrew (http://brew.sh)
#

OPENSCADDIR=$PWD

printUsage()
{
  echo "Usage: $0"
}

log()
{
  echo "$(date):" "$@"
}

if [ ! -f $OPENSCADDIR/openscad.pro ]; then
  echo "Must be run from the OpenSCAD source root directory"
  exit 0
fi

log "Listing homebrew configuration"
time brew config

log "Updating homebrew"
time brew update

# Install special packages not yet in upstream homebrew repo.
# Check if there's already an active openscad tap and skip
# tap/untap in that case.
TAP=:
if ! brew tap | grep ^openscad/ >/dev/null 2>/dev/null
then
	log "Tapping openscad homebrew repo"
	TAP=brew
fi
$TAP tap openscad/homebrew-tap

# FIXME: We used to require unlinking boost, but doing so also causes us to lose boost.
# Disabling until we can figure out why we unlinked in the first place
# brew unlink boost
for formula in pkg-config eigen boost cgal glew glib opencsg freetype libzip libxml2 fontconfig harfbuzz qt5 qscintilla2 lib3mf double-conversion imagemagick ccache; do
  log "Installing formula $formula"
  brew ls --versions $formula
  time brew install $formula
done

for formula in gettext qt5 qscintilla2; do
  log "Linking formula $formula"
  time brew link --force $formula
done

$TAP untap openscad/homebrew-tap
openscad-2019.05/scripts/macosx-sanity-check.py0000755000076500000240000001542713441110622022020 0ustar  kintelstaff00000000000000#!/usr/bin/env python

#
# This is be used to verify that all the dependant libraries of a  Mac OS X executable 
# are present and that they are backwards compatible with at least 10.9.
# Run with an executable as parameter
# Will return 0 if the executable an all libraries are OK
# Returns != 0 and prints some textural description on error
#
# Author: Marius Kintel 
#
# This script lives here:
# https://github.com/kintel/MacOSX-tools
#

import sys
import os
import subprocess
import re
from distutils.version import StrictVersion

DEBUG = False

cxxlib = None

def usage():
    print("Usage: " + sys.argv[0] + " ", sys.stderr)
    sys.exit(1)

# Try to find the given library by searching in the typical locations
# Returns the full path to the library or None if the library is not found.
def lookup_library(file):
    found = None
    if re.search("@rpath", file):
        file = re.sub("^@rpath", lc_rpath, file)
        if os.path.exists(file): found = file
        if DEBUG: print("@rpath resolved: " + str(file))
    if not found:
        if re.search("\.app/", file):
            found = file
            if DEBUG: print("App found: " + str(found))
        elif re.search("@executable_path", file):
            abs = re.sub("^@executable_path", executable_path, file)
            if os.path.exists(abs): found = abs
            if DEBUG: print("Lib in @executable_path found: " + str(found))
        elif re.search("\.framework/", file):
            found = os.path.join("/Library/Frameworks", file)
            if DEBUG: print("Framework found: " + str(found))
        else:
            for path in os.getenv("DYLD_LIBRARY_PATH", "").split(':'):
                abs = os.path.join(path, file)
                if os.path.exists(abs): found = abs
                if DEBUG: print("Library found: " + str(found))
    return found

# Returns a list of dependent libraries, excluding system libs
def find_dependencies(file):
    libs = []

    args = ["otool", "-L", file]
    if DEBUG: print("Executing " + " ".join(args))
    p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    output,err = p.communicate()
    if p.returncode != 0: 
        print("Failed with return code " + str(p.returncode) + ":")
        print(err)
        return None
    deps = output.split('\n')
    for dep in deps:
        # print(dep)
        # Fail if libstc++ and libc++ was mixed
        global cxxlib
        match = re.search("lib(std)?c\+\+", dep)
        if match:
            if not cxxlib:
                cxxlib = match.group(0)
            else:
                if cxxlib != match.group(0):
                    print("Error: Mixing libc++ and libstdc++")
                    return None
        dep = re.sub(".*:$", "", dep) # Take away header line
        dep = re.sub("^\t", "", dep) # Remove initial tabs
        dep = re.sub(" \(.*\)$", "", dep) # Remove trailing parentheses
        if len(dep) > 0 and not re.search("/System/Library", dep) and not re.search("/usr/lib", dep):
            libs.append(dep)
    return libs

def validate_lib(lib):
    p  = subprocess.Popen(["otool", "-l", lib], stdout=subprocess.PIPE, universal_newlines=True)
    output = p.communicate()[0]
    if p.returncode != 0: return False
    # Check deployment target
    m = re.search("LC_VERSION_MIN_MACOSX.*\n(.*)\n\s+version (.*)", output, re.MULTILINE)
    if not m:
        print("Error: LC_VERSION_MIN_MACOSX not found in " + lib)
        return False
    deploymenttarget = m.group(2)
    if StrictVersion(deploymenttarget) > StrictVersion('10.9'):
        print("Error: Unsupported deployment target " + m.group(2) + " found: " + lib)
        return False
# We don't support Snow Leopard anymore
#    if re.search("LC_DYLD_INFO_ONLY", output):
#        print("Error: Requires Snow Leopard: " + lib)
#        return False

    # This is a check for a weak symbols from a build made on 10.12 or newer sneaking into a build for an
    # earlier deployment target. The 'mkostemp' symbol tends to be introduced by fontconfig.
    p  = subprocess.Popen(["nm", "-g", lib], stdout=subprocess.PIPE, universal_newlines=True)
    output = p.communicate()[0]
    if p.returncode != 0: return False
    match = re.search("mkostemp", output)
    if match:
        print("Error: Reference to mkostemp() found - only supported on macOS 10.12->")
        return None

    p  = subprocess.Popen(["lipo", lib, "-verify_arch", "x86_64"], stdout=subprocess.PIPE, universal_newlines=True)
    output = p.communicate()[0]
    if p.returncode != 0: 
        print("Error: x86_64 architecture not supported: " + lib)
        return False

# We don't support 32-bit binaries anymore
#    p  = subprocess.Popen(["lipo", lib, "-verify_arch", "i386"], stdout=subprocess.PIPE, universal_newlines=True)
#    output = p.communicate()[0]
#    if p.returncode != 0: 
#        print("Error: i386 architecture not supported: " + lib)
#        return False
    return True

if __name__ == '__main__':
    error = False
    if len(sys.argv) != 2: usage()
    executable = sys.argv[1]
    if DEBUG: print("Processing " + executable)
    executable_path = os.path.dirname(executable)

    # Find the Runpath search path (LC_RPATH)
    p  = subprocess.Popen(["otool", "-l", executable], stdout=subprocess.PIPE, universal_newlines=True)
    output = p.communicate()[0]
    if p.returncode != 0: 
        print('Error otool -l failed on main executable')
        sys.exit(1)
    # Check deployment target
    m = re.search("LC_RPATH\n(.*)\n\s+path ([^ ]+)", output, re.MULTILINE)
    lc_rpath = m.group(2)
    if DEBUG: print('Runpath search path: ' + lc_rpath)

    # processed is a dict {libname : [parents]} - each parent is dependant on libname
    processed = {}
    pending = [executable]
    processed[executable] = []
    while len(pending) > 0:
        dep = pending.pop()
        if DEBUG: print("Evaluating " + dep)
        deps = find_dependencies(dep)
#        if DEBUG: print("Deps: " + ' '.join(deps))
        assert(deps)
        for d in deps:
            absfile = lookup_library(d)
            if absfile == None:
                print("Not found: " + d)
                print("  ..required by " + str(processed[dep]))
                error = True
                continue
            if not re.match(executable_path, absfile):
                print("Error: External dependency " + d)
                sys.exit(1)
            if absfile in processed:
                processed[absfile].append(dep)
            else: 
                processed[absfile] = [dep]
                if DEBUG: print("Pending: " + absfile)
                pending.append(absfile)

    for dep in processed:
       if DEBUG: print("Validating: " + dep)
       if not validate_lib(dep):
           print("..required by " + str(processed[dep]))
           error = True
    if error: sys.exit(1)
    else: sys.exit(0)
openscad-2019.05/scripts/makereleasejson.py0000755000076500000240000000033713402025764021321 0ustar  kintelstaff00000000000000#!/usr/bin/env python

# Used by github-release.sh

import sys
import json

v = sys.argv[1]
print(json.JSONEncoder().encode({
'tag_name': 'openscad-'+v,
'name': 'OpenSCAD '+v,
'body': open('./releases/'+v+'.md').read()
}))
openscad-2019.05/scripts/makereleasenotes.sh0000755000076500000240000000031613402025764021457 0ustar  kintelstaff00000000000000#!/bin/sh

echo "" > RELEASE_NOTES.md
for v in `ls -r releases/*.md`; do
  mdfile=${v#releases/}
  version=${mdfile%.md}
  echo "# OpenSCAD $version\n" >> RELEASE_NOTES.md
  cat $v >> RELEASE_NOTES.md
done
openscad-2019.05/scripts/mingw-file-association.nsh0000644000076500000240000001413713402025764022661 0ustar  kintelstaff00000000000000/*
nsis.sourceforge.net COPYRIGHT
Copyright (C) 1995-2009 Contributors

Note the 'edit' page of the wiki at nsis.sourceforge.net specifically 
states the following:

"All contributions sent to this wiki are generally considered to be in 
the zlib/libpng license (see License for details)."

The NSIS 'license' link on the wiki states the following:

"All NSIS source code, plug-ins, documentation, examples, header files 
and graphics, with the exception of the compression modules and where 
otherwise noted, are licensed under the zlib/libpng license."

http://nsis.sourceforge.net/File_Assocation lists these authors:

Author: Vytautas (talk, contrib)
Author: intersol (talk, contrib)
Author: chefkoch (talk, contrib)

ZLIB/LIBPNG LICENSE
-------------------

This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

      1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
      2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
      3. This notice may not be removed or altered from any source distribution.
*/

/*
_____________________________________________________________________________
 
                       File Association
_____________________________________________________________________________
 
 Based on code taken from http://nsis.sourceforge.net/File_Association 
 
 Usage in script:
 1. !include "FileAssociation.nsh"
 2. [Section|Function]
      ${FileAssociationFunction} "Param1" "Param2" "..." $var
    [SectionEnd|FunctionEnd]
 
 FileAssociationFunction=[RegisterExtension|UnRegisterExtension]
 
_____________________________________________________________________________
 
 ${RegisterExtension} "[executable]" "[extension]" "[description]"
 
"[executable]"     ; executable which opens the file format
                   ;
"[extension]"      ; extension, which represents the file format to open
                   ;
"[description]"    ; description for the extension. This will be display in Windows Explorer.
                   ;
 
 
 ${UnRegisterExtension} "[extension]" "[description]"
 
"[extension]"      ; extension, which represents the file format to open
                   ;
"[description]"    ; description for the extension. This will be display in Windows Explorer.
                   ;
 
_____________________________________________________________________________
 
                         Macros
_____________________________________________________________________________
 
 Change log window verbosity (default: 3=no script)
 
 Example:
 !include "FileAssociation.nsh"
 !insertmacro RegisterExtension
 ${FileAssociation_VERBOSE} 4   # all verbosity
 !insertmacro UnRegisterExtension
 ${FileAssociation_VERBOSE} 3   # no script
*/
 
 
!ifndef FileAssociation_INCLUDED
!define FileAssociation_INCLUDED
 
!include Util.nsh
 
!verbose push
!verbose 3
!ifndef _FileAssociation_VERBOSE
  !define _FileAssociation_VERBOSE 3
!endif
!verbose ${_FileAssociation_VERBOSE}
!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE`
!verbose pop
 
!macro FileAssociation_VERBOSE _VERBOSE
  !verbose push
  !verbose 3
  !undef _FileAssociation_VERBOSE
  !define _FileAssociation_VERBOSE ${_VERBOSE}
  !verbose pop
!macroend
 
 
 
!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION
  !verbose push
  !verbose ${_FileAssociation_VERBOSE}
  Push `${_DESCRIPTION}`
  Push `${_EXTENSION}`
  Push `${_EXECUTABLE}`
  ${CallArtificialFunction} RegisterExtension_
  !verbose pop
!macroend
 
!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION
  !verbose push
  !verbose ${_FileAssociation_VERBOSE}
  Push `${_EXTENSION}`
  Push `${_DESCRIPTION}`
  ${CallArtificialFunction} UnRegisterExtension_
  !verbose pop
!macroend
 
 
 
!define RegisterExtension `!insertmacro RegisterExtensionCall`
!define un.RegisterExtension `!insertmacro RegisterExtensionCall`
 
!macro RegisterExtension
!macroend
 
!macro un.RegisterExtension
!macroend
 
!macro RegisterExtension_
  !verbose push
  !verbose ${_FileAssociation_VERBOSE}
 
  Exch $R2 ;exe
  Exch
  Exch $R1 ;ext
  Exch
  Exch 2
  Exch $R0 ;desc
  Exch 2
  Push $0
  Push $1
 
  ReadRegStr $1 HKCR $R1 ""  ; read current file association
  StrCmp "$1" "" NoBackup  ; is it empty
  StrCmp "$1" "$R0" NoBackup  ; is it our own
    WriteRegStr HKCR $R1 "backup_val" "$1"  ; backup current value
NoBackup:
  WriteRegStr HKCR $R1 "" "$R0"  ; set our file association
 
  ReadRegStr $0 HKCR $R0 ""
  StrCmp $0 "" 0 Skip
    WriteRegStr HKCR "$R0" "" "$R0"
    WriteRegStr HKCR "$R0\shell" "" "open"
    WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0"
Skip:
  WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"'
  WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0"
  WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"'
 
  Pop $1
  Pop $0
  Pop $R2
  Pop $R1
  Pop $R0
 
  !verbose pop
!macroend
 
 
 
!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall`
!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall`
 
!macro UnRegisterExtension
!macroend
 
!macro un.UnRegisterExtension
!macroend
 
!macro UnRegisterExtension_
  !verbose push
  !verbose ${_FileAssociation_VERBOSE}
 
  Exch $R1 ;desc
  Exch
  Exch $R0 ;ext
  Exch
  Push $0
  Push $1
 
  ReadRegStr $1 HKCR $R0 ""
  StrCmp $1 $R1 0 NoOwn ; only do this if we own it
  ReadRegStr $1 HKCR $R0 "backup_val"
  StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key
  DeleteRegKey HKCR $R0
  Goto NoOwn
 
Restore:
  WriteRegStr HKCR $R0 "" $1
  DeleteRegValue HKCR $R0 "backup_val"
  DeleteRegKey HKCR $R1 ;Delete key with association name settings
 
NoOwn:
 
  Pop $1
  Pop $0
  Pop $R1
  Pop $R0
 
  !verbose pop
!macroend
 
!endif # !FileAssociation_INCLUDED

openscad-2019.05/scripts/mingw-x-build-dependencies.sh0000755000076500000240000000731113452167375023253 0ustar  kintelstaff00000000000000#!/bin/sh -e
#
# This script builds all library dependencies of OpenSCAD for cross-compilation
# from linux to mingw32/64 for windows, using the MXE cross build system.
#
# This script must be run from the OpenSCAD source root directory
#
# Usage:
#        ./scripts/mingw-x-build-dependencies.sh              # 32 bit
#        ./scripts/mingw-x-build-dependencies.sh 64           # 64 bit
#
# If you just want to download, and build later:
#
#        ./scripts/mingw-x-build-dependencies.sh download     # 32 bit download
#        ./scripts/mingw-x-build-dependencies.sh 64 download  # 64 bit download
#
# Prerequisites:
#
# Please see http://mxe.cc/#requirements
#
# Also see http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Cross-compiling_for_Windows_on_Linux_or_Mac_OS_X
#
# Also note due to https://github.com/openscad/openscad/pull/2030 we
# are using the experimental .posix version of the mxe build. This lets
# us work with std::mutex in CGAL, as well as DrCodeWizzards Qsettings mutex
#
# Notes:
#
# Originally this was based on Tony Theodore's branch of MXE, which is now
# integrated into official MXE.
#
# Targets:
#
# MXE allows 4 separate targets with the MXE_TARGETS environment variable.
# As of 2015 shared are not guaranteed to work.
#
# 64 bit static linked libraries MXE_TARGETS=x86_64-w64-mingw32.static.posix
# 32 bit static linked libraries MXE_TARGETS=i686-w64-mingw32.static.posix
# 64 bit shared libraries        MXE_TARGETS=x86_64-w64-mingw32.shared.posix
# 32 bit shared libraries        MXE_TARGETS=i686-w64-mingw32.shared.posix
#

OPENSCADDIR=$PWD
if [ ! -f $OPENSCADDIR/openscad.pro ]; then
	echo "Must be run from the OpenSCAD source root directory"
	exit 0
fi
echo OPENSCADDIR: $OPENSCADDIR

if [ ! $NUMCPU ]; then
	echo "note: you can 'export NUMCPU=x' for multi-core compiles (x=number)";
	NUMCPU=1
fi
if [ ! $NUMJOBS ]; then
	echo "note: you can 'export NUMJOBS=x' for building multiple pkgs at once"
	if [ $NUMCPU -gt 2 ]; then
		NUMJOBS=$((NUMCPU/2))
	else
		NUMJOBS=1
	fi
fi

. ./scripts/setenv-mingw-xbuild.sh $*

if [ ! -e $BASEDIR ]; then
	mkdir -p $BASEDIR
fi

if [ ! -e $MXEDIR ]; then
	mkdir -p $MXEDIR
	cd $MXEDIR/..
	echo "Downloading MXE into " $PWD
	git clone https://github.com/openscad/mxe.git $MXEDIR
fi

echo "entering" $MXEDIR
cd $MXEDIR
if [ "`git config --get remote.origin.url | grep github.com.openscad`" ]; then
 echo 'checkout openscad-snapshot-build branch'
 git checkout openscad-snapshot-build
fi
if [ "`echo $* | grep 64`" ]; then
 MXE_TARGETS='x86_64-w64-mingw32.static.posix'
 if [ "`echo $* | grep download`" ]; then
  PACKAGES='download-mpfr download-eigen download-opencsg download-cgal download-qtbase download-qtmultimedia download-glib download-libxml2 download-freetype download-fontconfig download-harfbuzz download-libzip download-lib3mf download-double-conversion'
 else
  PACKAGES='qtbase qtmultimedia qscintilla2 mpfr eigen opencsg cgal glib libxml2 freetype fontconfig harfbuzz libzip lib3mf double-conversion'
 fi
else
 MXE_TARGETS='i686-w64-mingw32.static.posix'
 if [ "`echo $* | grep download`" ]; then
  PACKAGES='download-mpfr download-eigen download-opencsg download-cgal download-qtbase download-qtmultimedia download-nsis download-glib download-libxml2 download-freetype download-fontconfig download-harfbuzz download-libzip download-lib3mf download-double-conversion'
 else
  PACKAGES='qtbase qtmultimedia qscintilla2 mpfr eigen opencsg cgal nsis glib libxml2 freetype fontconfig harfbuzz libzip lib3mf double-conversion'
 fi
fi
echo make MXE_PLUGIN_DIRS=plugins/gcc7 $PACKAGES MXE_TARGETS=$MXE_TARGETS -j $NUMCPU JOBS=$NUMJOBS
make MXE_PLUGIN_DIRS=plugins/gcc7 $PACKAGES MXE_TARGETS=$MXE_TARGETS -j $NUMCPU JOBS=$NUMJOBS

echo "leaving" $MXEDIR

echo "entering $OPENSCADDIR"
cd $OPENSCADDIR

openscad-2019.05/scripts/msys2-install-dependencies.sh0000644000076500000240000000121413427162620023270 0ustar  kintelstaff00000000000000#!/bin/bash

date "+### %Y-%m-%d %T msys2-install-dependencies started"

#pacman --noconfirm --ask 20 -Sy
#pacman --noconfirm --ask 20 -Su

pacman --query --explicit

for pkg in mingw-w64-x86_64-gdb mingw-w64-x86_64-boost mingw-w64-x86_64-cgal mingw-w64-x86_64-eigen3 mingw-w64-x86_64-glew mingw-w64-x86_64-qscintilla mingw-w64-x86_64-opencsg mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libzip mingw-w64-x86_64-cmake mingw-w64-x86_64-mesa mingw-w64-x86_64-double-conversion make bison git 
do
	date "+### %Y-%m-%d %T install ${pkg}"
	pacman --noconfirm --ask 20 --sync --needed ${pkg}
done

date "+### %Y-%m-%d %T msys2-install-dependencies finished"
openscad-2019.05/scripts/openscad-linux0000755000076500000240000000034513402025764020452 0ustar  kintelstaff00000000000000#!/bin/bash

cd "$( dirname "$( type -p $0 )" )"
libdir=$PWD/../lib/openscad/
cd "$OLDPWD"

export LIBGL_DRIVERS_PATH="$libdir"/dri
export LD_LIBRARY_PATH="$libdir${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
exec $libdir/openscad "$@"
openscad-2019.05/scripts/publish-macosx.sh0000755000076500000240000000662113465203575021102 0ustar  kintelstaff00000000000000#!/bin/sh
#
# Usage:
#   ./scripts/publish-macosx.sh [buildonly]
#
VERSION=2019.05
VERSIONDATE=2019.05.10

export NUMCPU=$(sysctl -n hw.ncpu)

human_filesize()
{
  awk -v sum=$1 'BEGIN {
    hum[1024**3]="GB"; hum[1024**2]="MB"; hum[1024]="KB"; 
    for (x=1024**3; x>=1024; x/=1024) { 
      if (sum>=x) { printf "%.1f %s\n",sum/x,hum[x]; break }
    }
  }'
}

# Pass version= packagefile= filesize=
update_www_download_links()
{
    # Make the passed variables available
    local $*
    filesize=$(human_filesize $filesize)
    webdir=../openscad.github.com
    # FIXME: release vs. snapshot
    incfile=inc/mac_snapshot_links.js
    BASEURL='http://files.openscad.org/snapshots'
    DATECODE=`date +"%Y.%m.%d"`
    
    if [ -f $webdir/$incfile ]; then
        cd $webdir
        echo "fileinfo['MAC_SNAPSHOT_URL'] = '$BASEURL/$packagefile'" > $incfile
        echo "fileinfo['MAC_SNAPSHOT_NAME'] = 'OpenSCAD $version'" >> $incfile
        echo "fileinfo['MAC_SNAPSHOT_SIZE'] = '$filesize'" >> $incfile
        echo 'modified mac_snapshot_links.js'
        
        git --no-pager diff
        echo "Web page updated. Remember to commit and push openscad.github.com"
    else
        echo "Web page not found at $incfile"
    fi
}

# Cmd-line parameters
DOUPLOAD=1
if [ "`echo $* | grep buildonly`" ]; then
  echo "Build only, no upload"
  DOUPLOAD=
fi

if test -z "$VERSIONDATE"; then
  VERSIONDATE=`date "+%Y.%m.%d"`
fi
if test -z "$VERSION"; then
  VERSION=$VERSIONDATE
  SNAPSHOT=snapshot
fi
SHORTVERSION=${VERSION%%-*}

# Turn off ccache, just for safety
PATH=${PATH//\/opt\/local\/libexec\/ccache:}

export MACOSX_DEPLOYMENT_TARGET=10.9

# This is the same location as DEPLOYDIR in macosx-build-dependencies.sh
export OPENSCAD_LIBRARIES=$PWD/../libraries/install

# Make sure that the correct Qt tools are used
export PATH=$OPENSCAD_LIBRARIES/bin:$PATH

`dirname $0`/release-common.sh -v $VERSION $SNAPSHOT
if [[ $? != 0 ]]; then
  exit 1
fi

echo "Sanity check of the app bundle..."
`dirname $0`/macosx-sanity-check.py OpenSCAD.app/Contents/MacOS/OpenSCAD
if [[ $? != 0 ]]; then
  exit 1
fi

SIGNATURE=$(openssl dgst -sha1 -binary < OpenSCAD-$VERSION.dmg  | openssl dgst -dss1 -sign $HOME/.ssh/openscad-appcast.pem | openssl enc -base64)

if [[ $VERSION == $VERSIONDATE ]]; then
  APPCASTFILE=appcast-snapshots.xml
else
  APPCASTFILE=appcast.xml
fi
echo "Creating appcast $APPCASTFILE..."
FILESIZE=$(stat -f "%z" OpenSCAD-$VERSION.dmg)
sed -e "s,@VERSION@,$VERSION,g" -e "s,@SHORTVERSION@,$SHORTVERSION,g" -e "s,@VERSIONDATE@,$VERSIONDATE,g" -e "s,@DSASIGNATURE@,$SIGNATURE,g" -e "s,@FILESIZE@,$FILESIZE,g" $APPCASTFILE.in > $APPCASTFILE
cp $APPCASTFILE ../openscad.github.com
if [[ $VERSION == $VERSIONDATE ]]; then
  cp $APPCASTFILE ../openscad.github.com/appcast-snapshots.xml
fi

if [ ! $DOUPLOAD ]; then
  exit 0
fi

echo "Uploading..."
if [[ $VERSION == $VERSIONDATE ]]; then
  scp OpenSCAD-$VERSION.dmg openscad@files.openscad.org:www/snapshots
else
  scp OpenSCAD-$VERSION.dmg openscad@files.openscad.org:www
fi
if [[ $? != 0 ]]; then
  exit 1
fi
scp $APPCASTFILE openscad@files.openscad.org:www/
if [[ $? != 0 ]]; then
  exit 1
fi
if [[ $VERSION == $VERSIONDATE ]]; then
  scp $APPCASTFILE openscad@files.openscad.org:www/appcast-snapshots.xml
  if [[ $? != 0 ]]; then
    exit 1
  fi
fi

# Update snapshot filename on web page
update_www_download_links version=$VERSION packagefile=OpenSCAD-$VERSION.dmg filesize=$FILESIZE
openscad-2019.05/scripts/publish-mingw-x.sh0000755000076500000240000000236313465203575021175 0ustar  kintelstaff00000000000000#!/bin/sh

# This is run as part of the checklist in docs/release-checklist.txt
#

if test -z "$VERSION"; then
  VERSION=2019.05
  COMMIT=-c
fi

# Turn off ccache, just for safety
CCACHE_DISABLE=1

. ./scripts/setenv-mingw-xbuild.sh

if [ ! -e $MXEDIR ]; then
  echo "MXEDIR: $MXEDIR"
  echo "MXEDIR is a non-existent path. Mingw cross tools not found."
  echo
  echo " Please run ./scripts/mingw-x-build-dependencies.sh to install MXE"
  echo " or modify MXEDIR to point to the root of your cross-tools setup"
  echo " ( Please see http://mxe.cc for more info ) "
  echo
  exit 1
fi

if [ ! -f $OPENSCADDIR/openscad.pro ]; then
  echo "Must be run from the OpenSCAD source root directory"
  exit 1
fi

./scripts/release-common.sh -v $VERSION $COMMIT mingw32

if [ $? != 0 ]; then
	echo "release-common.sh returned error code: $?. build stopped."
  exit 1
fi

echo "Please upload these files to the appropriate location"
BINFILE=$DEPLOYDIR/OpenSCAD-$VERSION.zip
INSTALLFILE=$DEPLOYDIR/OpenSCAD-$VERSION-Installer.exe
echo $BINFILE
echo $INSTALLFILE

echo
echo "Then copy/paste these commands into your shell:"
echo

# Update snapshot filename on web page
echo ./scripts/update-web.sh OpenSCAD-$VERSION.zip
echo ./scripts/update-web.sh OpenSCAD-$VERSION-Installer.exe
openscad-2019.05/scripts/release-common.sh0000755000076500000240000005444513465203575021061 0ustar  kintelstaff00000000000000#!/bin/bash
#
# This script creates a binary release of OpenSCAD. This should work
# under Mac OS X, Linux 32bit, Linux 64bit, and Linux->Win32 MXE cross-build.
# Windows under msys has not been tested recently.
#
# The script will create a file called openscad-. in
# the current directory (or under ./mingw32 or ./mingw64)
#
# Usage: release-common.sh [-v ] [-c] [-mingw[32|64]] [-tests]
#  -v       Version string (e.g. -v 2010.01)
#  -d       Version date (e.g. -d 2010.01.23)
#  -mingw32 Cross-compile for win32 using MXE
#  -mingw64 Cross-compile for win64 using MXE
#  -snapshot Build a snapshot binary (make e.g. experimental features available, build with commit info)
#  -tests   Build additional package containing the regression tests
#
# If no version string or version date is given, todays date will be used (YYYY-MM-DD)
# If only version date is given, it will be used also as version string.
# If no make target is given, release will be used on Windows, none one Mac OS X
#
# The mingw cross compile depends on the MXE cross-build tools. Please
# see the README.md file on how to install these dependencies. To debug
# the mingw-cross build process, set env var FAKEMAKE=1 to fake-make the
# .exe files
#

# convert end-of-line in given file from unix \n to dos/windows(TM) \r\n
# see https://kb.iu.edu/data/acux.html
lf2crlf()
{
  fname=$1
  if [ "`command -v unix2dos`" ]; then
    unix2dos $fname
    return
  fi
  if [ "`command -v awk`" ]; then
    echo using awk to convert end of line markers in $fname
    awk 'sub("$", "\r")' $fname > $fname".temp"
    mv $fname".temp" $fname
    return
  fi
  echo 'warning- cant change eol to cr eol'
}

printUsage()
{
  echo "Usage: $0 -v  -d  -c -mingw32
  echo
  echo "  Example: $0 -v 2010.01
}

OPENSCADDIR=$PWD
if [ ! -f $OPENSCADDIR/openscad.pro ]; then
  echo "Must be run from the OpenSCAD source root directory"
  exit 1
fi

CONFIG=deploy

if [[ "$OSTYPE" =~ "darwin" ]]; then
  OS=MACOSX
elif [[ $OSTYPE == "msys" ]]; then
  OS=WIN
elif [[ $OSTYPE == "linux-gnu" ]]; then
  OS=LINUX
  if [[ `uname -m` == "x86_64" ]]; then
    ARCH=64
  else
    ARCH=32
  fi
  echo "Detected build-machine ARCH: $ARCH"
fi

if [ "`echo $* | grep mingw`" ]; then
  OS=UNIX_CROSS_WIN
  ARCH=32
  if [ "`echo $* | grep mingw64`" ]; then
    ARCH=64
  fi
fi

if [ $OS ]; then
  echo "Detected OS: $OS"
else
  echo "Error: Couldn't detect OSTYPE"
  exit
fi

case $OS in
    LINUX|MACOSX) 
        TARGET=
        # for QT4 set QT_SELECT=4
        export QT_SELECT=5
    ;;
    WIN)
        export QTDIR=/c/devmingw/qt2009.03
        export QTMAKESPEC=win32-g++
        export PATH=$PATH:/c/devmingw/qt2009.03/bin:/c/devmingw/qt2009.03/qt/bin
        TARGET=release
        ZIP="/c/Program Files/7-Zip/7z.exe"
        ZIPARGS="a -tzip"
    ;;
    UNIX_CROSS_WIN)
        SHARED=
        if [ "`echo $* | grep shared`" ]; then
          SHARED=-shared
        fi
        MINGWCONFIG=mingw-cross-env$SHARED
        . ./scripts/setenv-mingw-xbuild.sh $ARCH $SHARED
        TARGET=release
        ZIP="zip"
        ZIPARGS="-r -q"
        echo Mingw-cross build using ARCH=$ARCH MXELIBTYPE=$MXELIBTYPE
    ;;
esac

if [ "`echo $* | grep snapshot`" ]; then
  CONFIG="$CONFIG snapshot experimental"
  OPENSCAD_COMMIT=`git log -1 --pretty=format:"%h"`
fi

BUILD_TESTS=
if [ "`echo $* | grep tests`" ]; then
  BUILD_TESTS=1
fi

while getopts 'v:d:c' c
do
  case $c in
    v) VERSION=$OPTARG;;
    d) VERSIONDATE=$OPTARG;;
  esac
done

if test -z "$VERSIONDATE"; then
    VERSIONDATE=2019.05.10
fi
if test -z "$VERSION"; then
    VERSION=2019.05
fi

export VERSIONDATE
export VERSION

if [ $FAKEMAKE ]; then
  echo 'fake make on:' $FAKEMAKE
else
  FAKEMAKE=
fi

echo "Checking pre-requisites..."

case $OS in
    UNIX_CROSS_WIN)
        MAKENSIS=
        if [ "`command -v makensis`" ]; then
            MAKENSIS=makensis
        elif [ "`command -v i686-pc-mingw32-makensis`" ]; then
            # we cant find systems nsis so look for the MXE's version.
            # MXE has its own makensis, but its only available under
            # 32-bit MXE. note that the cross-version in theory works
            # the same as the linux version so we can use them, in
            # theory, interchangeably. its not really a 'cross' nsis
            # todo - when doing 64 bit mingw build, see if we can call
            # 32bit nsis here.
            MAKENSIS=i686-pc-mingw32-makensis
        else
            echo "makensis not found. please install nsis on your system."
            echo "(for example, on debian linux, try apt-get install nsis)"
            exit 1
        fi
        echo NSIS makensis found: $MAKENSIS
    ;;
esac

if [ ! -e $OPENSCADDIR/libraries/MCAD/__init__.py ]; then
  echo "Downloading MCAD"
  git submodule init
  git submodule update
else
  echo "MCAD found:" $OPENSCADDIR/libraries/MCAD
fi

if [ -d .git ]; then
  git submodule update
fi

echo "Building openscad-$VERSION ($VERSIONDATE) $CONFIG..."

if [ ! $NUMCPU ]; then
  echo "note: you can 'export NUMCPU=x' for multi-core compiles (x=number)";
  NUMCPU=1
fi
echo "NUMCPU: " $NUMCPU



case $OS in
    UNIX_CROSS_WIN)
        cd $DEPLOYDIR
        qmake VERSION=$VERSION OPENSCAD_COMMIT=$OPENSCAD_COMMIT CONFIG+="$CONFIG" CONFIG+=link_pkgconfig CONFIG+=$MINGWCONFIG CONFIG-=debug $OPENSCADDIR/openscad.pro
        cd $OPENSCADDIR
    ;;
    *)
        QMAKE="`command -v qmake-qt5`"
        if [ ! -x "$QMAKE" ]
        then
          QMAKE=qmake
        fi
        "$QMAKE" VERSION=$VERSION OPENSCAD_COMMIT=$OPENSCAD_COMMIT CONFIG+="$CONFIG" CONFIG-=debug openscad.pro
    ;;
esac

case $OS in
    UNIX_CROSS_WIN)
        cd $DEPLOYDIR
        make clean ## comment out for test-run
        cd $OPENSCADDIR
    ;;
    *)
        make -s clean
    ;;
esac

case $OS in
    MACOSX) 
        rm -rf OpenSCAD.app
    ;;
    WIN)
        #if the following files are missing their tried removal stops the build process on msys
        touch -t 200012121010 parser_yacc.h parser_yacc.cpp lexer_lex.cpp
    ;;
    UNIX_CROSS_WIN)
        # kludge to enable paralell make
        touch -t 200012121010 $OPENSCADDIR/src/parser_yacc.h
        touch -t 200012121010 $OPENSCADDIR/src/parser_yacc.cpp
        touch -t 200012121010 $OPENSCADDIR/src/parser_yacc.hpp
        touch -t 200012121010 $OPENSCADDIR/src/lexer_lex.cpp
    ;;
esac

echo "Building GUI binary..."

case $OS in
    UNIX_CROSS_WIN)
        # make main openscad.exe
        cd $DEPLOYDIR
        if [ $FAKEMAKE ]; then
            echo "notexe. debugging build process" > $TARGET/openscad.exe
        else
            make $TARGET -j$NUMCPU
        fi
        if [ ! -e $TARGET/openscad.exe ]; then
            echo "cant find $TARGET/openscad.exe. build failed. stopping."
            exit
        fi
        # make console pipe-able openscad.com - see winconsole.pro for info
        qmake ../winconsole/winconsole.pro
        make
        if [ ! -e $TARGET/openscad.com ]; then
            echo "cant find $TARGET/openscad.com. build failed. stopping."
            exit
        fi
        cd $OPENSCADDIR
    ;;
    LINUX)
        if [ $FAKEMAKE ]; then
            echo "notexe. debugging build process" > $TARGET/openscad
        else
            make $TARGET -j$NUMCPU
        fi
    ;;
    *)
        make -j$NUMCPU $TARGET
    ;;
esac

if [[ $? != 0 ]]; then
  echo "Error building OpenSCAD. Aborting."
  exit 1
fi

echo "Creating directory structure..."

case $OS in
    MACOSX)
        EXAMPLESDIR=OpenSCAD.app/Contents/Resources/examples
        LIBRARYDIR=OpenSCAD.app/Contents/Resources/libraries
        FONTDIR=OpenSCAD.app/Contents/Resources/fonts
        TRANSLATIONDIR=OpenSCAD.app/Contents/Resources/locale
        COLORSCHEMESDIR=OpenSCAD.app/Contents/Resources/color-schemes
    ;;
    UNIX_CROSS_WIN)
        cd $OPENSCADDIR
        EXAMPLESDIR=$DEPLOYDIR/openscad-$VERSION/examples/
        LIBRARYDIR=$DEPLOYDIR/openscad-$VERSION/libraries/
        FONTDIR=$DEPLOYDIR/openscad-$VERSION/fonts/
        TRANSLATIONDIR=$DEPLOYDIR/openscad-$VERSION/locale/
        COLORSCHEMESDIR=$DEPLOYDIR/openscad-$VERSION/color-schemes/
        rm -rf $DEPLOYDIR/openscad-$VERSION
        mkdir $DEPLOYDIR/openscad-$VERSION
    ;;
    *)
        EXAMPLESDIR=openscad-$VERSION/examples/
        LIBRARYDIR=openscad-$VERSION/libraries/
        FONTDIR=openscad-$VERSION/fonts/
        TRANSLATIONDIR=openscad-$VERSION/locale/
        COLORSCHEMESDIR=openscad-$VERSION/color-schemes/
        rm -rf openscad-$VERSION
        mkdir openscad-$VERSION
    ;;
esac

if [ -n $EXAMPLESDIR ]; then
    echo $EXAMPLESDIR
    mkdir -p $EXAMPLESDIR
    rm -f examples.tar
    tar cf examples.tar examples
    cd $EXAMPLESDIR/.. && tar xf $OPENSCADDIR/examples.tar && cd $OPENSCADDIR
    rm -f examples.tar
    chmod -R 644 $EXAMPLESDIR/*/*
fi
if [ -n $FONTDIR ]; then
  echo $FONTDIR
  mkdir -p $FONTDIR
  cp -a fonts/10-liberation.conf $FONTDIR
  cp -a fonts/Liberation-2.00.1 $FONTDIR
  case $OS in
    MACOSX) 
      cp -a fonts/05-osx-fonts.conf $FONTDIR
      cp -a fonts-osx/* $FONTDIR
      ;;
    UNIX_CROSS_WIN)
      cp -a "$DEPLOYDIR"/mingw-cross-env/etc/fonts/. "$FONTDIR"
      ;;
  esac
fi
if [ -n $COLORSCHEMESDIR ]; then
  echo $COLORSCHEMESDIR
  mkdir -p $COLORSCHEMESDIR
  cp -a color-schemes/* $COLORSCHEMESDIR
fi
if [ -n $LIBRARYDIR ]; then
    echo $LIBRARYDIR
    mkdir -p $LIBRARYDIR
    # exclude the .git stuff from MCAD which is a git submodule.
    # tar is a relatively portable way to do exclusion, without the
    # risks of rm
    rm -f libraries.tar
    tar cf libraries.tar --exclude=.git* libraries
    cd $LIBRARYDIR/.. && tar xf $OPENSCADDIR/libraries.tar && cd $OPENSCADDIR
    rm -f libraries.tar
    chmod -R u=rwx,go=r,+X $LIBRARYDIR/*
fi
if [ -n $TRANSLATIONDIR ]; then
  echo $TRANSLATIONDIR
  mkdir -p $TRANSLATIONDIR
  cd locale && tar cvf $OPENSCADDIR/translations.tar */*/*.mo && cd $OPENSCADDIR
  cd $TRANSLATIONDIR && tar xvf $OPENSCADDIR/translations.tar && cd $OPENSCADDIR
  rm -f translations.tar
fi

echo "Creating archive.."

case $OS in
    MACOSX)
        /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $VERSIONDATE" OpenSCAD.app/Contents/Info.plist
        macdeployqt OpenSCAD.app -dmg -no-strip
        mv OpenSCAD.dmg OpenSCAD-$VERSION.dmg
        hdiutil internet-enable -yes -quiet OpenSCAD-$VERSION.dmg
        echo "Binary created: OpenSCAD-$VERSION.dmg"
    ;;
    WIN)
        #package
        cp win32deps/* openscad-$VERSION
        cp $TARGET/openscad.exe openscad-$VERSION
        cp $TARGET/openscad.com openscad-$VERSION
        rm -f openscad-$VERSION.x86-$ARCH.zip
        "$ZIP" $ZIPARGS openscad-$VERSION.x86-$ARCH.zip openscad-$VERSION
        rm -rf openscad-$VERSION
        echo "Binary created: openscad-$VERSION.zip"
    ;;
    UNIX_CROSS_WIN)
        cd $OPENSCADDIR
        cd $DEPLOYDIR
        BINFILE=$DEPLOYDIR/OpenSCAD-$VERSION-x86-$ARCH.zip
        INSTFILE=$DEPLOYDIR/OpenSCAD-$VERSION-x86-$ARCH-Installer.exe

        #package
        if [ "`echo $* | grep shared`" ]; then
          flprefix=$DEPLOYDIR/mingw-cross-env/bin
          echo Copying dlls for shared library build
          echo from $flprefix
          echo to $DEPLOYDIR/$TARGET
          flist=
          # fl="$fl opengl.dll" # use Windows version?
          # fl="$fl libmpfr.dll" # does not exist
          fl="$fl libgmp-10.dll"
          fl="$fl libgmpxx-4.dll"
          fl="$fl libboost_filesystem-mt.dll"
          fl="$fl libboost_program_options-mt.dll"
          fl="$fl libboost_regex-mt.dll"
          fl="$fl libboost_chrono-mt.dll"
          fl="$fl libboost_system-mt.dll"
          fl="$fl libboost_thread_win32-mt.dll"
          fl="$fl libCGAL.dll"
          fl="$fl libCGAL_Core.dll"
          fl="$fl GLEW.dll"
          fl="$fl libglib-2.0-0.dll"
          fl="$fl libopencsg-1.dll"
          fl="$fl libharfbuzz-0.dll"
          # fl="$fl libharfbuzz-gobject-0.dll" # ????
          fl="$fl libfontconfig-1.dll"
          fl="$fl libexpat-1.dll"
          fl="$fl libbz2.dll"
          fl="$fl libintl-8.dll"
          fl="$fl libiconv-2.dll"
          fl="$fl libfreetype-6.dll"
          fl="$fl libpcre16-0.dll"
          fl="$fl zlib1.dll"
          fl="$fl libpng16-16.dll"
          fl="$fl icudt54.dll"
          fl="$fl icudt.dll"
          fl="$fl icuin.dll"
          fl="$fl libstdc++-6.dll"
          fl="$fl ../qt5/lib/qscintilla2.dll"
          fl="$fl ../qt5/bin/Qt5PrintSupport.dll"
          fl="$fl ../qt5/bin/Qt5Core.dll"
          fl="$fl ../qt5/bin/Qt5Gui.dll"
          fl="$fl ../qt5/bin/Qt5OpenGL.dll"
          #  fl="$fl ../qt5/bin/QtSvg4.dll" # why is this here?
          fl="$fl ../qt5/bin/Qt5Widgets.dll"
          fl="$fl ../qt5/bin/Qt5PrintSupport.dll"
          fl="$fl ../qt5/bin/Qt5PrintSupport.dll"
          for dllfile in $fl; do
            if [ -e $flprefix/$dllfile ]; then
                echo $flprefix/$dllfile
                cp $flprefix/$dllfile $DEPLOYDIR/$TARGET/
            else
                echo cannot find $flprefix/$dllfile
                echo stopping build.
                exit 1
            fi
          done
        fi

        echo "Copying main binary .exe, .com, and dlls"
        echo "from $DEPLOYDIR/$TARGET"
        echo "to $DEPLOYDIR/openscad-$VERSION"
        TMPTAR=$DEPLOYDIR/tmpmingw.$ARCH.$MXELIBTYPE.tar
        cd $DEPLOYDIR/$TARGET
        tar cvf $TMPTAR --exclude=winconsole.o .
        cd $DEPLOYDIR/openscad-$VERSION
        tar xvf $TMPTAR
        cd $DEPLOYDIR
        rm -f $TMPTAR


        echo "Creating binary zip package"
        rm -f OpenSCAD-$VERSION.x86-$ARCH.zip
        "$ZIP" $ZIPARGS $BINFILE openscad-$VERSION
        cd $OPENSCADDIR
        echo "Binary zip package created"

        echo "Creating installer"
        echo "Copying NSIS files to $DEPLOYDIR/openscad-$VERSION"
        cp ./scripts/installer$ARCH.nsi $DEPLOYDIR/openscad-$VERSION/installer_arch.nsi
        cp ./scripts/installer.nsi $DEPLOYDIR/openscad-$VERSION/
        cp ./scripts/mingw-file-association.nsh $DEPLOYDIR/openscad-$VERSION/
        cp ./scripts/x64.nsh $DEPLOYDIR/openscad-$VERSION/
        cp ./scripts/LogicLib.nsh $DEPLOYDIR/openscad-$VERSION/
        cd $DEPLOYDIR/openscad-$VERSION
        NSISDEBUG=-V2
        # NSISDEBUG=      # leave blank for full log
        echo $MAKENSIS $NSISDEBUG "-DVERSION=$VERSION" installer.nsi
        $MAKENSIS $NSISDEBUG "-DVERSION=$VERSION" installer.nsi
        cp $DEPLOYDIR/openscad-$VERSION/openscad_setup.exe $INSTFILE
        cd $OPENSCADDIR

        if [ -e $BINFILE ]; then
            if [ -e $INSTFILE ]; then
                echo
                echo "Binary created:" $BINFILE
                echo "Installer created:" $INSTFILE
                echo
            else
                echo "Build failed. Cannot find" $INSTFILE
            fi
        else
            echo "Build failed. Cannot find" $BINFILE
            exit 1
        fi
    ;;
    LINUX)
        # Do stuff from release-linux.sh
        mkdir openscad-$VERSION/bin
        mkdir -p openscad-$VERSION/lib/openscad
        cp scripts/openscad-linux openscad-$VERSION/bin/openscad
        cp openscad openscad-$VERSION/lib/openscad/
        if [[ $ARCH == 64 ]]; then
              gcc -o chrpath_linux -DSIZEOF_VOID_P=8 scripts/chrpath_linux.c
        else
              gcc -o chrpath_linux -DSIZEOF_VOID_P=4 scripts/chrpath_linux.c
        fi
        ./chrpath_linux -d openscad-$VERSION/lib/openscad/openscad

        QTLIBDIR=$(dirname $(ldd openscad | grep Qt5Gui | head -n 1 | awk '{print $3;}'))
        ( ldd openscad ; ldd "$QTLIBDIR"/qt5/plugins/platforms/libqxcb.so ) \
          | sed -re 's,.* => ,,; s,[\t ].*,,;' -e '/^$/d' -e '/libc\.so|libm\.so|libdl\.so|libgcc_|libpthread\.so/d' \
          | sort -u \
          | xargs cp -vt "openscad-$VERSION/lib/openscad/"
        PLATFORMDIR="openscad-$VERSION/lib/openscad/platforms/"
        mkdir -p "$PLATFORMDIR"
        cp -av "$QTLIBDIR"/qt5/plugins/platforms/libqxcb.so "$PLATFORMDIR"
        DRIDRIVERDIR=$(find /usr/lib -xdev -type d -name dri)
        if [ -d "$DRIDRIVERDIR" ]
        then
          DRILIB="openscad-$VERSION/lib/openscad/dri/"
          mkdir -p "$DRILIB"
          cp -av "$DRIDRIVERDIR"/swrast_dri.so "$DRILIB"
        fi

        strip openscad-$VERSION/lib/openscad/*
        mkdir -p openscad-$VERSION/share/appdata
        cp icons/openscad.{desktop,png,xml} openscad-$VERSION/share/appdata
        cp scripts/installer-linux.sh openscad-$VERSION/install.sh
        chmod 755 -R openscad-$VERSION/
        PACKAGEFILE=openscad-$VERSION.x86-$ARCH.tar.gz
        tar cz openscad-$VERSION > $PACKAGEFILE
        echo
        echo "Binary created:" $PACKAGEFILE
        echo
    ;;
esac

if [ $BUILD_TESTS ]; then
  echo "Building test suite..."
  case $OS in
    UNIX_CROSS_WIN)
        TESTBUILD_MACHINE=$MXE_TARGETS
        # dont use build-machine triple in TESTBUILDDIR because the 'mingw32'
        # will confuse people who are on 64 bit machines
        TESTBUILDDIR=tests-build
        OPENSCAD_BINDIR="$DEPLOYDIR/openscad-$VERSION"
        OPENSCAD_BINARY="$OPENSCAD_BINDIR/openscad.com"
        export OPENSCAD_BINARY
        cd $DEPLOYDIR
        mkdir $TESTBUILDDIR
        cd $TESTBUILDDIR
        OPENSCAD_LIBRARIES=$MXETARGETDIR $MXE_TARGETS-cmake $OPENSCADDIR/tests/ \
          -DCMAKE_TOOLCHAIN_FILE=../tests/CMingw-cross-env.cmake \
          -DMINGW_CROSS_ENV_DIR=$MXEDIR \
          -DMACHINE=$TESTBUILD_MACHINE
        if [ $FAKEMAKE ]; then
            echo "notexe. debugging build process" > openscad_nogui.exe
        else
            make -j$NUMCPU
        fi
        cd $OPENSCADDIR
    ;;
    *)
        echo 'test suite build not implemented for osx/linux'
    ;;
  esac
fi # BUILD_TESTS

if [ $BUILD_TESTS ]; then
  echo "Creating regression tests package..."
  case $OS in
    MACOSX)
        echo 'building regression test package on OSX not implemented'
    ;;
    WIN)
        echo 'building regression test package on Win not implemented'
    ;;
    UNIX_CROSS_WIN)
        # Tests output subdirectory
        OPENSCAD_TESTSDIR=OpenSCAD-Tests-$VERSION
        # Build a .zip file containing all the files we need to run a
        # ctest on Windows(TM). For the sake of simplicity, we do not
        # create an installer for the tests.

        cd $DEPLOYDIR
        if [ -e ./$OPENSCAD_TESTSDIR ]; then
          rm -rf ./$OPENSCAD_TESTSDIR
        fi
        mkdir $OPENSCAD_TESTSDIR

        # copy release files into test package dir
        echo "Copying release files"
        echo "from $DEPLOYDIR/openscad-$VERSION"
        echo "to $DEPLOYDIR/$OPENSCAD_TESTSDIR"
        TMPTAR=$DEPLOYDIR/tmpmingw.$ARCH.$MXELIBTYPE.tar
        cd $DEPLOYDIR/openscad-$VERSION
        tar pcvf $TMPTAR --exclude=*.ns* --exclude=*setup.exe .
        cd $DEPLOYDIR/$OPENSCAD_TESTSDIR
        tar pxf $TMPTAR
        rm -f $TMPTAR

        echo "Copying files..."
        cd $OPENSCADDIR
        # This copies a lot of unnecessary stuff but that's OK.
        # as above, we use tar as a somewhat portable way to do 'exclude'
        # while copying.
        rm -f ./ostests.tar
        for subdir in tests testdata; do
          tar prvf ./ostests.tar --exclude=.git* --exclude=*.cc.obj --exclude=*.cc --exclude=*.h --exclude=CMake* --exclude=*.a $subdir
        done
        cd $DEPLOYDIR
        tar prvf $OPENSCADDIR/ostests.tar --exclude=.git* --exclude=*.cc.obj --exclude=CMakeFiles --exclude=*.a $TESTBUILDDIR

        cd $DEPLOYDIR/$OPENSCAD_TESTSDIR
        tar pxf $OPENSCADDIR/ostests.tar
        rm -f $OPENSCADDIR/ostests.tar

        # Now we have the basic files copied into our tree that will become
        # our .zip file. We also want to move some files around for easier
        # access for the user:
        cd $DEPLOYDIR/$OPENSCAD_TESTSDIR
        echo "Copying files for ease of use when running from cmdline"
        mv -v ./tests/OpenSCAD_Test_Console.py .
        mv -v ./tests/WinReadme.txt .
        mv -v ./tests/mingw_convert_ctest.py $TESTBUILDDIR
        mv -v ./tests/mingwcon.bat $TESTBUILDDIR

        echo "Creating mingw_cross_info.py file"
        cd $DEPLOYDIR/$OPENSCAD_TESTSDIR/$TESTBUILDDIR
        if [ -e ./mingw_cross_info.py ]; then
          rm -f ./mingw_cross_info.py
        fi
        echo "# created automatically by release-common.sh from within linux " >> mingw_cross_info.py
        echo "linux_abs_basedir='"$OPENSCADDIR"'" >> mingw_cross_info.py
        echo "linux_abs_builddir='"$OPENSCAD_BINDIR"'" >> mingw_cross_info.py
        # Parse CTestTestfiles to find linux python strings
        PYTHON_PATH=`grep -o -m 1 -h [^\"]*python[^\"]* CTestTestfile.cmake`
        echo "linux_python='$PYTHON_PATH'" >> mingw_cross_info.py
        # note- this has to match the CMakeLists.txt line that sets the
        # convert executable... and CMingw-cross-env.cmake's skip-imagemagick
        # setting. what a kludge!
        echo "linux_convert='/bin/echo'" >> mingw_cross_info.py
        echo "win_installdir='OpenSCAD_Tests_"$VERSIONDATE"'" >> mingw_cross_info.py

        echo 'Converting linefeed to carriage-return+linefeed'
        for textfile in `find . | grep txt$`; do lf2crlf $textfile; done
        for textfile in `find . | grep py$`; do lf2crlf $textfile; done
        for textfile in `find . | grep cmake$`; do lf2crlf $textfile; done
        for textfile in `find . | grep bat$`; do lf2crlf $textfile; done

        # Test binaries can be hundreds of megabytes due to debugging info.
        # By default, we strip that. In most cases we wont need it and it
        # causes too many problems to have >100MB files.
        echo "stripping .exe binaries"
        cd $DEPLOYDIR/$OPENSCAD_TESTSDIR
        if [ "`command -v $TESTBUILD_MACHINE'-strip' `" ]; then
            for exefile in *exe; do
                ls -sh $exefile
                echo $TESTBUILD_MACHINE'-strip' $exefile
                $TESTBUILD_MACHINE'-strip' $exefile
                ls -sh $exefile
            done
        fi

        # Build the actual .zip archive based on the file tree we've built above
        cd $DEPLOYDIR
        ZIPFILE=$OPENSCAD_TESTSDIR-x86-$ARCH.zip
        echo "Creating binary zip package for Tests:" $ZIPFILE
        rm -f ./$ZIPFILE
        "$ZIP" $ZIPARGS $ZIPFILE $OPENSCAD_TESTSDIR

        if [ -e $ZIPFILE ]; then
            echo "ZIP package created:" `pwd`/$ZIPFILE
        else
            echo "Build of Regression Tests package failed. Cannot find" `pwd`/$ZIPFILE
            exit 1
        fi
        cd $OPENSCADDIR
    ;;
    LINUX)
        echo 'building regression test package on linux not implemented'
    ;;
  esac
else
  echo "Not building regression tests package"
fi # BUILD_TESTS

openscad-2019.05/scripts/setenv-mingw-xbuild.sh0000644000076500000240000000553613432700636022047 0ustar  kintelstaff00000000000000#!/bin/sh -e
#
# set environment variables for mingw/mxe cross-build
#
# Usage:
#
#  source ./scripts/setenv-mingw-xbuild.sh           # 32 bit build
#  source ./scripts/setenv-mingw-xbuild.sh shared    # 32 bit build, shared libs
#  source ./scripts/setenv-mingw-xbuild.sh 64        # 64 bit build
#  source ./scripts/setenv-mingw-xbuild.sh 64 shared # 64 bit build, shared libs
#  source ./scripts/setenv-mingw-xbuild.sh clean     # Clean up exported variables
#  source ./scripts/setenv-mingw-xbuild.sh qt5       # use qt5 (experimental)
#
# Prerequisites:
#
# Please see http://mxe.cc/#requirements
#
# Also see http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Cross-compiling_for_Windows_on_Linux_or_Mac_OS_X
#

OPENSCADDIR=$PWD

if [ ! $BASEDIR ]; then
	BASEDIR=$HOME/openscad_deps
fi

MXELIBTYPE=static.posix
if [ "`echo $* | grep shared `" ]; then
	MXELIBTYPE=shared.posix
fi

if [ ! $DEPLOYDIR ]; then
	if [ "`echo $* | grep 64 `" ]; then
		DEPLOYDIR=$OPENSCADDIR/mingw64.$MXELIBTYPE
	else
		DEPLOYDIR=$OPENSCADDIR/mingw32.$MXELIBTYPE
	fi
fi

if [ ! $MXEDIR ]; then
	if [ "`echo $* | grep 64 `" ]; then
		MXEDIR=$BASEDIR/mxe
	else
		MXEDIR=$BASEDIR/mxe
	fi
	if [ ! -e $MXEDIR ]; then
		if [ -e /opt/mxe ]; then
			MXEDIR=/opt/mxe
		fi
	fi
fi

if [ ! $MXEQTSUBDIR ]; then
	if [ "`echo $* | grep qt4 `" ]; then
		# qt4 is just 'qt' in MXE, see http://mxe.cc
		MXEQTSUBDIR=qt
	else
		# default is qt5 see issue #252
		MXEQTSUBDIR=qt5
	fi
fi

if [ ! -e $DEPLOYDIR ]; then
  mkdir -p $DEPLOYDIR
fi

if [ "`echo $* | grep 64 `" ]; then
  MXE_TARGETS=x86_64-w64-mingw32.$MXELIBTYPE
else
  MXE_TARGETS=i686-w64-mingw32.$MXELIBTYPE
fi
MXETARGETDIR=$MXEDIR/usr/$MXE_TARGETS

if [ ! $MINGWX_SAVED_ORIGINAL_PATH ]; then
  MINGWX_SAVED_ORIGINAL_PATH=$PATH
  echo current path saved
fi

PATH=$MXEDIR/usr/bin:$PATH
PATH=$MXETARGETDIR/$MXEQTSUBDIR/bin:$PATH

if [ "`echo $* | grep clean`" ]; then
  BASEDIR=
  MXEDIR=
  MXETARGETDIR=
  DEPLOYDIR=
  PATH=$MINGWX_SAVED_ORIGINAL_PATH
  MINGWX_SAVED_ORIGINAL_PATH=
  MXEQTSUBDIR=
else
  echo 'linking' $MXETARGETDIR
  echo '     to' $DEPLOYDIR/mingw-cross-env
  rm -f $DEPLOYDIR/mingw-cross-env
  ln -s $MXETARGETDIR $DEPLOYDIR/mingw-cross-env
fi

export OPENSCAD_LIBRARIES
export BASEDIR
export MXEDIR
export MXE_TARGETS
export MXETARGETDIR
export MXELIBTYPE
export DEPLOYDIR
export PATH
export MINGWX_SAVED_ORIGINAL_PATH
export MXEQTSUBDIR

echo OPENSCAD_LIBRARIES: $OPENSCAD_LIBRARIES
echo BASEDIR: $BASEDIR
echo MXEDIR: $MXEDIR
echo MXETARGETDIR: $MXETARGETDIR
echo MXELIBTYPE: $MXELIBTYPE
echo DEPLOYDIR: $DEPLOYDIR
echo MXEQTSUBDIR: $MXEQTSUBDIR
if [ "`echo $* | grep clean`" ]; then
  echo PATH restored to pre-setenv-mingw-x state
else
  echo PATH modified: $MXEDIR/usr/bin
  echo PATH modified: $MXETARGETDIR/$MXEQTSUBDIR/bin
fi

if [ "`echo $PATH | grep anaconda.*bin`" ]; then
  echo please remove pytho anaconda/bin from your PATH, exit, and rerun this
fi

openscad-2019.05/scripts/setenv-unibuild.sh0000644000076500000240000000705413402025764021250 0ustar  kintelstaff00000000000000# setup environment variables for building OpenSCAD against custom built
# dependency libraries. works on Linux/BSD.
#
# Please see the 'uni-build-dependencies.sh' file for usage information
#

setenv_common()
{
 if [ ! $BASEDIR ]; then
  if [ -f openscad.pro ]; then
    # if in main openscad dir, put under $HOME
    BASEDIR=$HOME/openscad_deps
  else
    # otherwise, assume its being run 'out of tree'. treat it somewhat like
    # "configure" or "cmake", so you can build dependencies where u wish.
    echo "Warning: Not in OpenSCAD src dir... using current directory as base of build"
    BASEDIR=$PWD/openscad_deps
  fi
 fi
 DEPLOYDIR=$BASEDIR

 export BASEDIR
 export PATH=$BASEDIR/bin:$PATH
 export LD_LIBRARY_PATH=$DEPLOYDIR/lib:$DEPLOYDIR/lib64
 export LD_RUN_PATH=$DEPLOYDIR/lib:$DEPLOYDIR/lib64
 export OPENSCAD_LIBRARIES=$DEPLOYDIR
 export GLEWDIR=$DEPLOYDIR

 echo BASEDIR: $BASEDIR
 echo DEPLOYDIR: $DEPLOYDIR
 echo PATH modified
 echo LD_LIBRARY_PATH modified
 echo LD_RUN_PATH modified
 echo OPENSCAD_LIBRARIES modified
 echo GLEWDIR modified

 if [ "`uname -m | grep sparc64`" ]; then
   echo detected sparc64. forcing 32 bit with export ABI=32
   ABI=32
   export ABI
 fi
}

setenv_freebsd()
{
 echo .... freebsd detected. 
 echo .... if you have freebsd >9, it is advisable to install
 echo .... the clang compiler and re-run this script as 
 echo .... '. ./scripts/setenv-unibuild.sh clang'
 setenv_common
 QMAKESPEC=freebsd-g++
 QTDIR=/usr/local/share/qt4
 export QMAKESPEC
 export QTDIR
}

setenv_netbsd()
{
 setenv_common
 echo --- netbsd build situation is complex. it comes with gcc4.5
 echo --- which is incompatable with updated CGAL. 
 echo --- you may need to hack with newer gcc to make it work
 QMAKESPEC=netbsd-g++
 QTDIR=/usr/pkg/qt4
 PATH=/usr/pkg/qt4/bin:$PATH
 LD_LIBRARY_PATH=/usr/pkg/qt4/lib:$LD_LIBRARY_PATH
 LD_LIBRARY_PATH=/usr/X11R7/lib:$LD_LIBRARY_PATH
 LD_LIBRARY_PATH=/usr/pkg/lib:$LD_LIBRARY_PATH

 export QMAKESPEC
 export QTDIR
 export PATH
 export LD_LIBRARY_PATH
}

setenv_linux_clang()
{
 export CC=clang
 export CXX=clang++
 export QMAKESPEC=unsupported/linux-clang

 echo CC has been modified: $CC
 echo CXX has been modified: $CXX
 echo QMAKESPEC has been modified: $QMAKESPEC
}

setenv_freebsd_clang()
{
 export CC=clang
 export CXX=clang++
 export QMAKESPEC=freebsd-clang

 echo CC has been modified: $CC
 echo CXX has been modified: $CXX
 echo QMAKESPEC has been modified: $QMAKESPEC
}

setenv_netbsd_clang()
{
 echo --------------------- this is not yet supported. netbsd 6 lacks
 echo --------------------- certain things needed for clang support
 export CC=clang
 export CXX=clang++
 export QMAKESPEC=./patches/mkspecs/netbsd-clang

 echo CC has been modified: $CC
 echo CXX has been modified: $CXX
 echo QMAKESPEC has been modified: $QMAKESPEC
}

clean_note()
{
 if [ "`command -v qmake-qt4`" ]; then
  QMAKEBIN=qmake-qt4
 else
  QMAKEBIN=qmake
 fi
 echo "Please re-run" $QMAKEBIN "and run 'make clean' if necessary"
}

if [ "`uname | grep -i 'linux\|debian'`" ]; then
 setenv_common
 if [ "`echo $* | grep clang`" ]; then
  setenv_linux_clang
 fi
elif [ "`uname | grep -i freebsd`" ]; then
 setenv_freebsd
 if [ "`echo $* | grep clang`" ]; then
  setenv_freebsd_clang
 fi
elif [ "`uname | grep -i netbsd`" ]; then
 setenv_netbsd
 if [ "`echo $* | grep clang`" ]; then
  setenv_netbsd_clang
 fi
else
 # guess
 setenv_common
 echo unknown system. guessed env variables. see 'setenv-unibuild.sh'
fi

if [ -e $DEPLOYDIR/include/Qt ]; then
  echo "Qt found under $DEPLOYDIR ... "
  QTDIR=$DEPLOYDIR
  export QTDIR
  echo "QTDIR modified to $DEPLOYDIR"
fi

clean_note

openscad-2019.05/scripts/translation-make.sh0000755000076500000240000000047213402025764021404 0ustar  kintelstaff00000000000000#!/bin/sh

# Script for use from qmake to generate the translation
# related files.
#

SCRIPTDIR="`dirname \"$0\"`"
TOPDIR="`dirname \"$SCRIPTDIR\"`"

SCRIPT=./scripts/translation-update.sh

if [ ! -f "$SCRIPT" ]
then
	cd "$TOPDIR" || exit 1
fi

echo "Compiling language files (CWD = `pwd`)..."
"$SCRIPT" updatemo
openscad-2019.05/scripts/translation-update.sh0000755000076500000240000000672213414440252021751 0ustar  kintelstaff00000000000000#!/bin/sh

# see doc/translation.txt for more info

updatepot()
{
 # check we have all files from POTFILES present
 while read f
 do
   if [ ! -f "$f" ]; then
     echo "cannot find file '$f' from POTFILES"
     exit 1
   fi
 done < locale/POTFILES

 grep ui_MainWindow.h locale/POTFILES >/dev/null 2>/dev/null
 if [ $? -ne 0 ] ; then
   echo "cannot find .../ui_xxxxx.h files. perhaps if you run make...?"
   exit 1
 fi

 # extract example names from the index JSON file
 cat -n examples/examples.json \
	| grep '\[$' | sed -e 's/^[ \ŧ]*//; s/:.*//' \
	| awk '{ printf "#: examples/examples.json:%d\nmsgid %s\nmsgstr \"\"\n\n", $1, $2 }' \
	> ./locale/json-strings.pot

 # extract strings from appdata file
 itstool -o ./locale/appdata-strings.pot ./openscad.appdata.xml.in --its=./contrib/appdata.its

 VER=`date +"%Y.%m.%d"`
 OPTS=
 OPTS=$OPTS' --package-name=OpenSCAD'
 OPTS=$OPTS' --package-version='$VER
 OPTS=$OPTS' --default-domain=openscad'
 OPTS=$OPTS' --language=c++' 
 OPTS=$OPTS' --keyword=' #without WORD means not to use default keywords
 OPTS=$OPTS' --keyword=_'
 OPTS=$OPTS' --keyword=q_'
 OPTS=$OPTS' --keyword=_:1,2c'
 OPTS=$OPTS' --keyword=q_:1,2c'
 OPTS=$OPTS' --keyword=ngettext:1,2'
 OPTS=$OPTS' --files-from=./locale/POTFILES'
 cmd="${GETTEXT_PATH}xgettext "$OPTS' -o ./locale/openscad-tmp.pot'
 echo $cmd
 $cmd
 if [ ! $? = 0 ]; then
  echo error running xgettext
  exit 1
 fi

 cmd="${GETTEXT_PATH}msgcat -o ./locale/openscad.pot ./locale/openscad-tmp.pot ./locale/json-strings.pot ./locale/appdata-strings.pot"
 echo $cmd
 $cmd
 if [ ! $? = 0 ]; then
  echo error running msgcat
  exit 1
 fi

 sed -e s/"CHARSET"/"UTF-8"/g ./locale/openscad.pot > ./locale/openscad.pot.new && mv ./locale/openscad.pot.new ./locale/openscad.pot
 rm -f ./locale/json-strings.pot ./locale/openscad-tmp.pot ./locale/appdata-strings.pot
}

updatepo()
{
 for LANGCODE in `cat ./locale/LINGUAS | grep -v "#"`; do
  OPTS='--update --backup=t'
  cmd="$GETTEXT_PATH"'msgmerge '$OPTS' ./locale/'$LANGCODE'.po ./locale/openscad.pot'
  echo $cmd
  $cmd
  if [ ! $? = 0 ]; then
   echo error running msgmerge
   exit 1
  fi
 done
}

updatemo()
{
 for LANGCODE in `cat locale/LINGUAS | grep -v "#"`; do
  mkdir -p ./locale/$LANGCODE/LC_MESSAGES
  OPTS='-c -v'
  cmd="$GETTEXT_PATH"'msgfmt '$OPTS' -o ./locale/'$LANGCODE'/LC_MESSAGES/openscad.mo ./locale/'$LANGCODE'.po'
  echo $cmd
  $cmd
  if [ ! $? = 0 ]; then
   echo error running msgfmt
   exit 1
  fi
 done

 if which itstool > /dev/null 2>&1; then
  # ugly workaround for bug https://bugs.freedesktop.org/show_bug.cgi?id=90937
  for LANGCODE in `cat locale/LINGUAS | grep -v "#"`; do
   ln -s openscad.mo ./locale/$LANGCODE/LC_MESSAGES/$LANGCODE.mo
  done

  # generate translated appdata file
  itstool -j ./openscad.appdata.xml.in -o ./openscad.appdata.xml ./locale/*/LC_MESSAGES/[a-z][a-z].mo

  # clean the mess
  for LANGCODE in `cat locale/LINGUAS | grep -v "#"`; do
   unlink ./locale/$LANGCODE/LC_MESSAGES/$LANGCODE.mo
  done
 else
  if [ x"$(uname -s)" = x"Linux" ]; then
   echo "itstool missing, won't apply translations to openscad.appdata.xml"
  fi
  cp -f ./openscad.appdata.xml.in ./openscad.appdata.xml
 fi
}

GETTEXT_PATH=""
#if [ "x$OPENSCAD_LIBRARIES" != x ]; then
#	GETTEXT_PATH="$OPENSCAD_LIBRARIES/bin/"
#fi

SCRIPTDIR="`dirname \"$0\"`"
TOPDIR="`dirname \"$SCRIPTDIR\"`"

cd "$TOPDIR" || exit 1

if [ "x$1" = xupdatemo ]; then
 updatemo
else
 echo "Generating POTFILES..."
 ./scripts/generate-potfiles.sh > locale/POTFILES
 updatepot && updatepo && updatemo
fi

openscad-2019.05/scripts/travis-ci.sh0000755000076500000240000000456513402025764020043 0ustar  kintelstaff00000000000000#!/bin/bash

set -e

travis_nanoseconds() {
  python -c 'import time; print("{:d}".format(int(time.time()*1000000000)))'
}

travis_start() {
  travis_timer_id=`printf %08x $(( RANDOM * RANDOM ))`
  travis_start_time=`travis_nanoseconds`
  echo -e "travis_time:start:$travis_timer_id\r\033[0m$2"
  echo -e "travis_fold:start:$1\n$2"
}

travis_finish() {
  echo "travis_fold:end:$1"
  travis_end_time=`travis_nanoseconds`
  local duration=$(( $travis_end_time - $travis_start_time ))
  echo -en "\ntravis_time:end:$travis_timer_id:start=$travis_start_time,finish=$travis_end_time,duration=$duration\r\033[0m"
}

PARALLEL=-j2

# This should be set via .travis.yml depending on the OS/Distribution
# PARALLEL_CTEST=-j1

travis_start qmake "Building OpenSCAD using qmake"
qmake CONFIG+=experimental CONFIG+=nogui && make $PARALLEL
travis_finish qmake

travis_start cmake "Building tests using cmake"

cd tests
cmake .
if [[ $? != 0 ]]; then
  echo "Error configuring test suite"
  exit 1
fi
make $PARALLEL
if [[ $? != 0 ]]; then
  echo "Error building test suite"
  exit 1
fi

travis_finish cmake

travis_start ctest "Running tests using ctest"

# Exclude tests known the cause issues on Travis
# opencsgtest_rotate_extrude-tests - Fails on Ubuntu 12.04 using Gallium 0.4 drivers
# *_text-font-direction-tests - Fails due to old freetype (issue #899)
# throwntogethertest_issue964 - Fails due to non-planar quad being tessellated slightly different
# opencsgtest_issue1165 - z buffer tearing

# Fails on Apple's software renderer:
# opencsgtest_issue1258
# throwntogethertest_issue1089
# throwntogethertest_issue1215
ctest $PARALLEL_CTEST -E "\
opencsgtest_rotate_extrude-tests|\
opencsgtest_render-tests|\
opencsgtest_rotate_extrude-hole|\
opencsgtest_internal-cavity|\
opencsgtest_internal-cavity-polyhedron|\
opencsgtest_minkowski3-erosion|\
opencsgtest_issue835|\
opencsgtest_issue911|\
opencsgtest_issue913|\
opencsgtest_issue1215|\
opencsgtest_issue1105d|\
dxfpngtest_text-font-direction-tests|\
cgalpngtest_text-font-direction-tests|\
opencsgtest_text-font-direction-tests|\
csgpngtest_text-font-direction-tests|\
svgpngtest_text-font-direction-tests|\
throwntogethertest_text-font-direction-tests|\
throwntogethertest_issue964|\
opencsgtest_issue1165|\
opencsgtest_issue1258|\
throwntogethertest_issue1089|\
throwntogethertest_issue1215\
"
if [[ $? != 0 ]]; then
  echo "Test failure"
  exit 1
fi

travis_finish ctest
openscad-2019.05/scripts/uni-build-dependencies.sh0000755000076500000240000006040413402025764022450 0ustar  kintelstaff00000000000000#!/bin/sh -e

# uni-build-dependencies by don bright 2012. copyright assigned to
# Marius Kintel and Clifford Wolf, 2012. released under the GPL 2, or
# later, as described in the file named 'COPYING' in OpenSCAD's project root.

# This script builds most dependencies, both libraries and binary tools,
# of OpenSCAD for Linux/BSD. It is based on macosx-build-dependencies.sh
#
# By default it builds under $HOME/openscad_deps. You can alter this by
# setting the BASEDIR environment variable or with the 'out of tree'
# feature
#
# Usage:
#   cd openscad
#   . ./scripts/setenv-unibuild.sh
#   ./scripts/uni-build-dependencies.sh
#
# Out-of-tree usage:
#
#   cd somepath
#   . /path/to/openscad/scripts/setenv-unibuild.sh
#   /path/to/openscad/scripts/uni-build-dependencies.sh
#
# Prerequisites:
# - wget or curl
# - OpenGL (GL/gl.h)
# - GLU (GL/glu.h)
# - gcc
# - Qt4
#
# If your system lacks qt4, build like this:
#
#   ./scripts/uni-build-dependencies.sh qt4
#   . ./scripts/setenv-unibuild.sh #(Rerun to re-detect qt4)
#
# If your system lacks glu, gettext, or glib2, you can build them as well:
#
#   ./scripts/uni-build-dependencies.sh glu
#   ./scripts/uni-build-dependencies.sh glib2
#   ./scripts/uni-build-dependencies.sh gettext
#
# If you want to try Clang compiler (experimental, only works on linux):
#
#   . ./scripts/setenv-unibuild.sh clang
#
# If you want to try Qt5 (experimental)
#
#   . ./scripts/setenv-unibuild.sh qt5
#

printUsage()
{
  echo "Usage: $0"
  echo
}

check_env()
{
  SLEEP=0
  if [ x != x"$CFLAGS" ]
  then
    echo "*** WARNING: You have CFLAGS set to '$CFLAGS'"
    SLEEP=2
  fi
  if [ x != x"$CXXFLAGS" ]
  then
    echo "*** WARNING: You have CXXFLAGS set to '$CXXFLAGS'"
    SLEEP=2
  fi
  if [ x != x"$LDFLAGS" ]
  then
    echo "*** WARNING: You have LDFLAGS set to '$LDFLAGS'"
    SLEEP=2
  fi
  [ $SLEEP -gt 0 ] && sleep $SLEEP || true
}

detect_glu()
{
  detect_glu_result=
  if [ -e $DEPLOYDIR/include/GL/glu.h ]; then
    detect_glu_include=$DEPLOYDIR/include
    detect_glu_result=1;
  fi
  if [ -e /usr/include/GL/glu.h ]; then
    detect_glu_include=/usr/include
    detect_glu_result=1;
  fi
  if [ -e /usr/local/include/GL/glu.h ]; then
    detect_glu_include=/usr/local/include
    detect_glu_result=1;
  fi
  if [ -e /usr/pkg/X11R7/include/GL/glu.h ]; then
    detect_glu_include=/usr/pkg/X11R7/include
    detect_glu_result=1;
  fi
  return
}

build_glu()
{
  version=$1
  if [ -e $DEPLOYDIR/lib/libGLU.so ]; then
    echo "GLU already installed. not building"
    return
  fi
  echo "Building GLU" $version "..."
  cd $BASEDIR/src
  rm -rf glu-$version
  if [ ! -f glu-$version.tar.gz ]; then
    curl -O http://cgit.freedesktop.org/mesa/glu/snapshot/glu-$version.tar.gz
  fi
  tar xzf glu-$version.tar.gz
  cd glu-$version
  ./autogen.sh --prefix=$DEPLOYDIR
  make -j$NUMCPU
  make install
}

build_qt4()
{
  version=$1
  if [ -e $DEPLOYDIR/include/Qt ]; then
    echo "qt already installed. not building"
    return
  fi
  echo "Building Qt" $version "..."
  cd $BASEDIR/src
  rm -rf qt-everywhere-opensource-src-$version
  if [ ! -f qt-everywhere-opensource-src-$version.tar.gz ]; then
    curl -O http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-$version.tar.gz
  fi
  tar xzf qt-everywhere-opensource-src-$version.tar.gz
  cd qt-everywhere-opensource-src-$version
  ./configure -prefix $DEPLOYDIR -opensource -confirm-license -fast -no-qt3support -no-svg -no-phonon -no-audio-backend -no-multimedia -no-javascript-jit -no-script -no-scripttools -no-declarative -no-xmlpatterns -nomake demos -nomake examples -nomake docs -nomake translations -no-webkit
  make -j$NUMCPU
  make install
  QTDIR=$DEPLOYDIR
  export QTDIR
  echo "----------"
  echo " Please set QTDIR to $DEPLOYDIR ( or run '. scripts/setenv-unibuild.sh' )"
  echo "----------"
}

build_qt5()
{
  version=$1

  if [ -f $DEPLOYDIR/lib/libQt5Core.a ]; then
    echo "Qt5 already installed. not building"
    return
  fi

  echo "Building Qt" $version "..."
  cd $BASEDIR/src
  rm -rf qt-everywhere-opensource-src-$version
  v=`echo "$version" | sed -e 's/\.[0-9]$//'`
  if [ ! -f qt-everywhere-opensource-src-$version.tar.gz ]; then
     curl -O -L http://download.qt-project.org/official_releases/qt/$v/$version/single/qt-everywhere-opensource-src-$version.tar.gz
  fi
  tar xzf qt-everywhere-opensource-src-$version.tar.gz
  cd qt-everywhere-opensource-src-$version
  ./configure -prefix $DEPLOYDIR -release -static -opensource -confirm-license \
                -nomake examples -nomake tests \
                -qt-xcb -no-c++11 -no-glib -no-harfbuzz -no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-odbc \
                -no-sql-psql -no-sql-sqlite2 -no-sql-tds -no-cups -no-qml-debug \
                -skip activeqt -skip connectivity -skip declarative -skip doc \
                -skip enginio -skip graphicaleffects -skip location -skip multimedia \
                -skip quick1 -skip quickcontrols -skip script -skip sensors -skip serialport \
                -skip svg -skip webkit -skip webkit-examples -skip websockets -skip xmlpatterns
  make -j"$NUMCPU" install
}

build_qt5scintilla2()
{
  version=$1

  if [ -d $DEPLOYDIR/lib/libqt5scintilla2.a ]; then
    echo "Qt5Scintilla2 already installed. not building"
    return
  fi

  echo "Building Qt5Scintilla2" $version "..."
  cd $BASEDIR/src
  rm -rf ./QScintilla-gpl-$version.tar.gz
  if [ ! -f QScintilla-gpl-$version.tar.gz ]; then
     curl -L -o "QScintilla-gpl-$version.tar.gz" "http://downloads.sourceforge.net/project/pyqt/QScintilla2/QScintilla-$version/QScintilla-gpl-$version.tar.gz?use_mirror=switch"
  fi
  tar xzf QScintilla-gpl-$version.tar.gz
  cd QScintilla-gpl-$version/Qt4Qt5/
  qmake CONFIG+=staticlib
  tmpinstalldir=$DEPLOYDIR/tmp/qsci$version
  INSTALL_ROOT=$tmpinstalldir make -j"$NUMCPU" install

  if [ -d $tmpinstalldir/usr/share ]; then
    cp -av $tmpinstalldir/usr/share $DEPLOYDIR/
    cp -av $tmpinstalldir/usr/include $DEPLOYDIR/
    cp -av $tmpinstalldir/usr/lib $DEPLOYDIR/
  fi

  if [ ! -e $DEPLOYDIR/include/Qsci ]; then
    # workaround numerous bugs in qscintilla build system, see 
    # ../qscintilla2.prf and ../scintilla.pri for more info
    qsci_staticlib=`find $tmpinstalldir -name libqscintilla2.a`
    qsci_include=`find $tmpinstalldir -name Qsci`
    if [ -e $qsci_staticlib ]; then
      cp -av $qsci_include $DEPLOYDIR/include/
      cp -av $qsci_staticlib $DEPLOYDIR/lib/
    else
      echo problems finding built qscintilla libraries and include headers
    fi
    if [ -e $DEPLOYDIR/lib/libqscintilla2.a ]; then
      cp $DEPLOYDIR/lib/libqscintilla2.a $DEPLOYDIR/lib/libqt5scintilla2.a
    fi
  fi
}

build_bison()
{
  version=$1
  echo "Building bison" $version
  cd $BASEDIR/src
  rm -rf bison-$version
  if [ ! -f bison-$version.tar.gz ]; then
    curl --insecure -O http://ftp.gnu.org/gnu/bison/bison-$version.tar.gz
  fi
  tar zxf bison-$version.tar.gz
  cd bison-$version
  ./configure --prefix=$DEPLOYDIR
  make -j$NUMCPU
  make install
}

build_git()
{
  version=$1
  echo "Building git" $version "..."
  cd $BASEDIR/src
  rm -rf git-$version
  if [ ! -f git-$version.tar.gz ]; then
    curl --insecure -O http://git-core.googlecode.com/files/git-$version.tar.gz
  fi
  tar zxf git-$version.tar.gz
  cd git-$version
  ./configure --prefix=$DEPLOYDIR
  make -j$NUMCPU
  make install
}

build_cmake()
{
  version=$1
  echo "Building cmake" $version "..."
  cd $BASEDIR/src
  rm -rf cmake-$version
  if [ ! -f cmake-$version.tar.gz ]; then
    curl --insecure -O http://www.cmake.org/files/v2.8/cmake-$version.tar.gz
  fi
  tar zxf cmake-$version.tar.gz
  cd cmake-$version
  mkdir build
  cd build
  ../configure --prefix=$DEPLOYDIR
  make -j$NUMCPU
  make install
}

build_curl()
{
  version=$1
  echo "Building curl" $version "..."
  cd $BASEDIR/src
  rm -rf curl-$version
  if [ ! -f curl-$version.tar.bz2 ]; then
    wget http://curl.haxx.se/download/curl-$version.tar.bz2
  fi
  tar xjf curl-$version.tar.bz2
  cd curl-$version
  mkdir build
  cd build
  ../configure --prefix=$DEPLOYDIR
  make -j$NUMCPU
  make install
}

build_gmp()
{
  version=$1
  if [ -e $DEPLOYDIR/include/gmp.h ]; then
    echo "gmp already installed. not building"
    return
  fi
  echo "Building gmp" $version "..."
  cd $BASEDIR/src
  rm -rf gmp-$version
  if [ ! -f gmp-$version.tar.bz2 ]; then
    curl --insecure -O https://gmplib.org/download/gmp/gmp-$version.tar.bz2
  fi
  tar xjf gmp-$version.tar.bz2
  cd gmp-$version
  mkdir build
  cd build
  ../configure --prefix=$DEPLOYDIR --enable-cxx
  make -j$NUMCPU
  make install
}

build_mpfr()
{
  version=$1
  if [ -e $DEPLOYDIR/include/mpfr.h ]; then
    echo "mpfr already installed. not building"
    return
  fi
  echo "Building mpfr" $version "..."
  cd $BASEDIR/src
  rm -rf mpfr-$version
  if [ ! -f mpfr-$version.tar.bz2 ]; then
    curl --insecure -O ftp.gnu.org/gnu/mpfr/mpfr-$version.tar.bz2
  fi
  tar xjf mpfr-$version.tar.bz2
  cd mpfr-$version
  mkdir build
  cd build
  ../configure --prefix=$DEPLOYDIR --with-gmp=$DEPLOYDIR
  make -j$NUMCPU
  make install
  cd ..
}

build_boost()
{
  if [ -e $DEPLOYDIR/include/boost ]; then
    echo "boost already installed. not building"
    return
  fi
  version=$1
  bversion=`echo $version | tr "." "_"`
  echo "Building boost" $version "..."
  cd $BASEDIR/src
  rm -rf boost_$bversion
  if [ ! -f boost_$bversion.tar.bz2 ]; then
    curl --insecure -LO http://downloads.sourceforge.net/project/boost/boost/$version/boost_$bversion.tar.bz2
  fi
  if [ ! $? -eq 0 ]; then
    echo download failed. 
    exit 1
  fi
  tar xjf boost_$bversion.tar.bz2
  cd boost_$bversion
  if [ "`gcc --version|grep 4.7`" ]; then
    if [ "`echo $version | grep 1.47`" ]; then
      echo gcc 4.7 incompatible with boost 1.47. edit boost version in $0
      exit
    fi
  fi
  # We only need certain portions of boost
  if [ -e ./bootstrap.sh ]; then
    BSTRAPBIN=./bootstrap.sh
  else
    BSTRAPBIN=./configure
  fi
  $BSTRAPBIN --prefix=$DEPLOYDIR --with-libraries=thread,program_options,filesystem,system,regex
	if [ -e ./b2 ]; then
    BJAMBIN=./b2;
  elif [ -e ./bjam ]; then
    BJAMBIN=./bjam
  elif [ -e ./Makefile ]; then
    BJAMBIN=make
  fi
  if [ $CXX ]; then
    if [ $CXX = "clang++" ]; then
      $BJAMBIN -j$NUMCPU toolset=clang
    fi
  else
    $BJAMBIN -j$NUMCPU
  fi
  if [ $? = 0 ]; then
    $BJAMBIN install
  else
    echo boost build failed
    exit 1
  fi
  if [ "`ls $DEPLOYDIR/include/ | grep boost.[0-9]`" ]; then
    if [ ! -e $DEPLOYDIR/include/boost ]; then
      echo "boost is old, make a symlink to $DEPLOYDIR/include/boost & rerun"
      exit 1
    fi
  fi
}

build_cgal()
{
  if [ -e $DEPLOYDIR/include/CGAL/version.h ]; then
    echo "CGAL already installed. not building"
    return
  fi
  version=$1
  echo "Building CGAL" $version "..."
  cd $BASEDIR/src
  rm -rf CGAL-$version
  ver4_8="curl -L --insecure -O https://github.com/CGAL/cgal/releases/download/releases%2FCGAL-4.8/CGAL-4.8.tar.xz"
  ver4_7="curl -L --insecure -O https://github.com/CGAL/cgal/releases/download/releases%2FCGAL-4.7/CGAL-4.7.tar.gz"
  ver4_4="curl --insecure -O https://gforge.inria.fr/frs/download.php/file/33524/CGAL-4.4.tar.bz2"
  ver4_2="curl --insecure -O https://gforge.inria.fr/frs/download.php/32360/CGAL-4.2.tar.bz2"
  ver4_1="curl --insecure -O https://gforge.inria.fr/frs/download.php/31640/CGAL-4.1.tar.bz2"
  ver4_0_2="curl --insecure -O https://gforge.inria.fr/frs/download.php/31174/CGAL-4.0.2.tar.bz2"
  ver4_0="curl --insecure -O https://gforge.inria.fr/frs/download.php/30387/CGAL-4.0.tar.gz"
  ver3_9="curl --insecure -O https://gforge.inria.fr/frs/download.php/29125/CGAL-3.9.tar.gz"
  ver3_8="curl --insecure -O https://gforge.inria.fr/frs/download.php/28500/CGAL-3.8.tar.gz"
  ver3_7="curl --insecure -O https://gforge.inria.fr/frs/download.php/27641/CGAL-3.7.tar.gz"
  vernull="echo already downloaded..skipping"
  download_cmd=ver`echo $version | sed s/"\."/"_"/ | sed s/"\."/"_"/`

  if [ -e CGAL-$version.tar.gz ]; then
    download_cmd=vernull;
  fi
  if [ -e CGAL-$version.tar.bz2 ]; then
    download_cmd=vernull;
  fi
  if [ -e CGAL-$version.tar.xz ]; then
    download_cmd=vernull;
  fi

  eval echo "$"$download_cmd
  `eval echo "$"$download_cmd`

  zipper=gzip
  suffix=gz
  if [ -e CGAL-$version.tar.bz2 ]; then
    zipper=bzip2
    suffix=bz2
  fi
  if [ -e CGAL-$version.tar.xz ]; then
    zipper=xz
    suffix=xz
  fi

  $zipper -f -d CGAL-$version.tar.$suffix;
  tar xf CGAL-$version.tar

  cd CGAL-$version

  # older cmakes have buggy FindBoost that can result in
  # finding the system libraries but OPENSCAD_LIBRARIES include paths
  # NB! This was removed 2015-12-02 - if this problem resurfaces, fix it only for the relevant platforms as this
  # messes up more recent installations of cmake and CGAL.
  # FINDBOOST_CMAKE=$OPENSCAD_SCRIPTDIR/../tests/FindBoost.cmake
  # cp $FINDBOOST_CMAKE ./cmake/modules/

  mkdir bin
  cd bin
  rm -rf ./*
  if [ "`uname -a| grep ppc64`" ]; then
    CGAL_BUILDTYPE="Release" # avoid assertion violation
  else
    CGAL_BUILDTYPE="Debug"
  fi

  DEBUGBOOSTFIND=0 # for debugging FindBoost.cmake (not for debugging boost)
  Boost_NO_SYSTEM_PATHS=1
  if [ "`echo $2 | grep use-sys-libs`" ]; then
    cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DCMAKE_BUILD_TYPE=$CGAL_BUILDTYPE -DBoost_DEBUG=$DEBUGBOOSTFIND ..
  else
    cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.so -DGMPXX_LIBRARIES=$DEPLOYDIR/lib/libgmpxx.so -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.so -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DBOOST_LIBRARYDIR=$DEPLOYDIR/lib -DBOOST_INCLUDEDIR=$DEPLOYDIR/include -DCMAKE_BUILD_TYPE=$CGAL_BUILDTYPE -DBoost_DEBUG=$DEBUGBOOSTFIND -DBoost_NO_SYSTEM_PATHS=1 ..
  fi
  make -j$NUMCPU
  make install
}

build_glew()
{
  GLEW_INSTALLED=
  if [ -e $DEPLOYDIR/lib64/libGLEW.so ]; then
    GLEW_INSTALLED=1
  fi
  if [ -e $DEPLOYDIR/lib/libGLEW.so ]; then
    GLEW_INSTALLED=1
  fi
  if [ $GLEW_INSTALLED ]; then
    echo "glew already installed. not building"
    return
  fi
  version=$1
  echo "Building GLEW" $version "..."
  cd $BASEDIR/src
  rm -rf glew-$version
  if [ ! -f glew-$version.tgz ]; then
    curl --insecure -LO http://downloads.sourceforge.net/project/glew/glew/$version/glew-$version.tgz
  fi
  tar xzf glew-$version.tgz
  cd glew-$version
  mkdir -p $DEPLOYDIR/lib/pkgconfig

  # Glew's makefile is not built for Linux Multiarch. We aren't trying
  # to fix everything here, just the test machines OScad normally runs on

  # Fedora 64-bit
  if [ "`uname -m | grep 64`" ]; then
    if [ -e /usr/lib64/libXmu.so.6 ]; then
      sed -ibak s/"\-lXmu"/"\-L\/usr\/lib64\/libXmu.so.6"/ config/Makefile.linux
    fi
  fi

  # debian hurd i386
  if [ "`uname -m | grep 386`" ]; then
    if [ -e /usr/lib/i386-gnu/libXi.so.6 ]; then
      sed -ibak s/"-lXi"/"\-L\/usr\/lib\/i386-gnu\/libXi.so.6"/ config/Makefile.gnu
    fi
  fi

  # clang linux
  if [ $CC ]; then
    sed -ibak s/"CC = cc"/"# CC = cc"/ config/Makefile.linux
  fi

  MAKER=make
  if [ "`uname | grep BSD`" ]; then
    if [ "`command -v gmake`" ]; then
      MAKER=gmake
    else
      echo "building glew on BSD requires gmake (gnu make)"
      exit
    fi
  fi

  GLEW_DEST=$DEPLOYDIR $MAKER -j$NUMCPU
  GLEW_DEST=$DEPLOYDIR $MAKER install
}

build_opencsg()
{
  if [ -e $DEPLOYDIR/lib/libopencsg.so ]; then
    echo "OpenCSG already installed. not building"
    return
  fi
  version=$1
  echo "Building OpenCSG" $version "..."
  cd $BASEDIR/src
  rm -rf OpenCSG-$version
  if [ ! -f OpenCSG-$version.tar.gz ]; then
    curl --insecure -O http://www.opencsg.org/OpenCSG-$version.tar.gz
  fi
  tar xzf OpenCSG-$version.tar.gz
  cd OpenCSG-$version

  # modify the .pro file for qmake, then use qmake to
  # manually rebuild the src/Makefile (some systems don't auto-rebuild it)

  cp opencsg.pro opencsg.pro.bak
  cat opencsg.pro.bak | sed s/example// > opencsg.pro

  detect_glu
  GLU_INCLUDE=$detect_glu_include
  if [ ! $detect_glu_result ]; then
    build_glu 9.0.0
  fi

  if [ "`command -v qmake-qt4`" ]; then
    OPENCSG_QMAKE=qmake-qt4
  elif [ "`command -v qmake4`" ]; then
    OPENCSG_QMAKE=qmake4
  elif [ "`command -v qmake-qt5`" ]; then
    OPENCSG_QMAKE=qmake-qt5
  elif [ "`command -v qmake5`" ]; then
    OPENCSG_QMAKE=qmake5
  elif [ "`command -v qmake`" ]; then
    OPENCSG_QMAKE=qmake
  else
    echo qmake not found... using standard OpenCSG makefiles
    OPENCSG_QMAKE=make
    cp Makefile Makefile.bak
    cp src/Makefile src/Makefile.bak

    cat Makefile.bak | sed s/example// |sed s/glew// > Makefile
    cat src/Makefile.bak | sed s@^INCPATH.*@INCPATH\ =\ -I$BASEDIR/include\ -I../include\ -I..\ -I$GLU_INCLUDE\ -I.@ > src/Makefile
    cp src/Makefile src/Makefile.bak2
    cat src/Makefile.bak2 | sed s@^LIBS.*@LIBS\ =\ -L$BASEDIR/lib\ -L/usr/X11R6/lib\ -lGLU\ -lGL@ > src/Makefile
    tmp=$version
    version=$tmp
  fi

  if [ ! $OPENCSG_QMAKE = "make" ]; then
    OPENCSG_QMAKE=$OPENCSG_QMAKE' "QMAKE_CXXFLAGS+=-I'$GLU_INCLUDE'"'
  fi
  echo OPENCSG_QMAKE: $OPENCSG_QMAKE

  cd $BASEDIR/src/OpenCSG-$version/src
  $OPENCSG_QMAKE

  cd $BASEDIR/src/OpenCSG-$version
  $OPENCSG_QMAKE

  make

  ls lib/* include/*
  if [ -e lib/.libs ]; then ls lib/.libs/*; fi # netbsd
  echo "installing to -->" $DEPLOYDIR
  mkdir -p $DEPLOYDIR/lib
  mkdir -p $DEPLOYDIR/include
  install lib/* $DEPLOYDIR/lib
  install include/* $DEPLOYDIR/include
  if [ -e lib/.libs ]; then install lib/.libs/* $DEPLOYDIR/lib; fi #netbsd

  cd $BASEDIR
}

build_eigen()
{
  version=$1
  if [ -e $DEPLOYDIR/include/eigen3 ]; then
    if [ `echo $version | grep 3....` ]; then
      echo "Eigen3 already installed. not building"
      return
    fi
  fi
  echo "Building eigen" $version "..."
  cd $BASEDIR/src
  rm -rf eigen-$version
  EIGENDIR="none"
  if [ $version = "3.2.2" ]; then EIGENDIR=eigen-eigen-1306d75b4a21; fi
  if [ $version = "3.1.1" ]; then EIGENDIR=eigen-eigen-43d9075b23ef; fi
  if [ $EIGENDIR = "none" ]; then
    echo Unknown eigen version. Please edit script.
    exit 1
  fi
  rm -rf ./$EIGENDIR
  if [ ! -f eigen-$version.tar.bz2 ]; then
    curl --insecure -LO http://bitbucket.org/eigen/eigen/get/$version.tar.bz2
    mv $version.tar.bz2 eigen-$version.tar.bz2
  fi
  tar xjf eigen-$version.tar.bz2
  ln -s ./$EIGENDIR eigen-$version
  cd eigen-$version
  mkdir build
  cd build
  cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DEIGEN_TEST_NO_OPENGL=1 ..
  make -j$NUMCPU
  make install
}


# glib2 and dependencies

#build_gettext()
#{
#  version=$1
#  ls -l $DEPLOYDIR/include/gettext-po.h
#  if [ -e $DEPLOYDIR/include/gettext-po.h ]; then
#    echo "gettext already installed. not building"
#    return
#  fi
#
#  echo "Building gettext $version..."
#
#  cd "$BASEDIR"/src
#  rm -rf "gettext-$version"
#  if [ ! -f "glib-$version.tar.gz" ]; then
#    curl --insecure -LO "http://ftpmirror.gnu.org/gettext/gettext-$version.tar.gz"
#  fi
#  tar xzf "gettext-$version.tar.gz"
#  cd "gettext-$version"
#
#  ./configure --prefix="$DEPLOYDIR"
#  make -j$NUMCPU
#  make install
#}

build_pkgconfig()
{
  if [ "`command -v pkg-config`" ]; then
    echo "pkg-config already installed. not building"
    return
  fi
  version=$1
  echo "Building pkg-config $version..."

  cd "$BASEDIR"/src
  rm -rf "pkg-config-$version"
  if [ ! -f "pkg-config-$version.tar.gz" ]; then
    curl --insecure -LO "http://pkgconfig.freedesktop.org/releases/pkg-config-$version.tar.gz"
  fi
  tar xzf "pkg-config-$version.tar.gz"
  cd "pkg-config-$version"

  ./configure --prefix="$DEPLOYDIR" --with-internal-glib
  make -j$NUMCPU
  make install
}

build_libffi()
{
  if [ -e $DEPLOYDIR/include/ffi.h ]; then
    echo "libffi already installed. not building"
    return
  fi
  version=$1
  echo "Building libffi $version..."

  cd "$BASEDIR"/src
  rm -rf "libffi-$version"
  if [ ! -f "libffi-$version.tar.gz" ]; then
    curl --insecure -LO "ftp://sourceware.org/pub/libffi/libffi-$version.tar.gz"
    curl --insecure -LO "http://www.linuxfromscratch.org/patches/blfs/svn/libffi-$version-includedir-1.patch"
  fi
  tar xzf "libffi-$version.tar.gz"
  cd "libffi-$version"
  if [ ! "`command -v patch`" ]; then
    echo cannot proceed, need 'patch' program
    exit 1
  fi
  patch -Np1 -i ../libffi-3.0.13-includedir-1.patch
  ./configure --prefix="$DEPLOYDIR"
  make -j$NUMCPU
  make install
}

#build_glib2()
#{
#  version="$1"
#  maj_min_version="${version%.*}" #Drop micro#
#
#  if [ -e $DEPLOYDIR/lib/glib-2.0 ]; then
#    echo "glib2 already installed. not building"
#    return
#  fi
#
# echo "Building glib2 $version..."
#  cd "$BASEDIR"/src
#  rm -rf "glib-$version"
#  if [ ! -f "glib-$version.tar.xz" ]; then
#    curl --insecure -LO "http://ftp.gnome.org/pub/gnome/sources/glib/$maj_min_version/glib-$version.tar.xz"
#  fi
#  tar xJf "glib-$version.tar.xz"
#  cd "glib-$version"

#  ./configure --disable-gtk-doc --disable-man --prefix="$DEPLOYDIR" CFLAGS="-I$DEPLOYDIR/include" LDFLAGS="-L$DEPLOYDIR/lib"
#  make -j$NUMCPU
#  make install
#}

## end of glib2 stuff

# this section allows 'out of tree' builds, as long as the system has
# the 'dirname' command installed

if [ "`command -v dirname`" ]; then
  RUNDIR=$PWD
  OPENSCAD_SCRIPTDIR=`dirname $0`
  cd $OPENSCAD_SCRIPTDIR
  OPENSCAD_SCRIPTDIR=$PWD
  cd $RUNDIR
else
  if [ ! -f openscad.pro ]; then
    echo "Must be run from the OpenSCAD source root directory (dont have 'dirname')"
    exit 1
  else
    OPENSCAD_SCRIPTDIR=$PWD
  fi
fi

check_env

. $OPENSCAD_SCRIPTDIR/setenv-unibuild.sh # '.' is equivalent to 'source'
. $OPENSCAD_SCRIPTDIR/common-build-dependencies.sh
SRCDIR=$BASEDIR/src

if [ ! $NUMCPU ]; then
  echo "Note: The NUMCPU environment variable can be set for parallel builds"
  NUMCPU=1
fi

if [ ! -d $BASEDIR/bin ]; then
  mkdir -p $BASEDIR/bin
fi

echo "Using basedir:" $BASEDIR
echo "Using deploydir:" $DEPLOYDIR
echo "Using srcdir:" $SRCDIR
echo "Number of CPUs for parallel builds:" $NUMCPU
mkdir -p $SRCDIR $DEPLOYDIR

# this section builds some basic tools, if they are missing or outdated
# they are installed under $BASEDIR/bin which we have added to our PATH

if [ ! "`command -v curl`" ]; then
  # to prevent "end of file" NSS error -5938 (ssl) use a newer version of curl
  build_curl 7.49.0
fi

if [ ! "`command -v bison`" ]; then
  build_bison 2.6.1
fi

# NB! For cmake, also update the actual download URL in the function
if [ ! "`command -v cmake`" ]; then
  build_cmake 2.8.8
fi
# see README for needed version (this should match 1 []"
  exit 1
fi

if [[ $OSTYPE =~ "darwin" ]]; then
  OS=MACOSX
elif [[ $OSTYPE == "linux-gnu" ]]; then
  OS=LINUX
fi

indexfile=../openscad.github.com/index.html
if [ -f $indexfile ]; then
  if [ $OS == MACOSX ]; then
    sed -i .backup -e "s/^\(.*mac-snapshot.*\)\(OpenSCAD-.*\.dmg\)\(.*\)\(OpenSCAD-.*dmg\)\(.*$\)/\\1$file1\\3$file1\\5/" $indexfile
  elif [ $OS == LINXWIN ]; then
    file2=$2
    sed -i .backup -e "s/^\(.*win-snapshot-zip.*\)\(OpenSCAD-.*\.zip\)\(.*\)\(OpenSCAD-.*zip\)\(.*$\)/\\1$file1\\3$file1\\5/" $indexfile
    sed -i .backup -e "s/^\(.*win-snapshot-exe.*\)\(OpenSCAD-.*-Installer\.exe\)\(.*\)\(OpenSCAD-.*-Installer.exe\)\(.*$\)/\\1$file2\\3$file2\\5/" $indexfile
  elif [ $OS == LINUX ]; then
    file2=$2
    sed -i .backup -e "s/^\(.*linux-snapshot-32.*\)\(openscad-.*-32\.tar\.gz\)\(.*\)\(openscad-.*-32\.tar\.gz\)\(.*$\)/\\1$file1\\3$file1\\5/" $indexfile
    sed -i .backup -e "s/^\(.*linux-snapshot-64.*\)\(openscad-.*-64\.tar\.gz\)\(.*\)\(openscad-.*-64\.tar\.gz\)\(.*$\)/\\1$file2\\3$file2\\5/" $indexfile
  fi
  echo "Web page updated. Remember to commit and push openscad.github.com"
else
  echo "Web page not found at $indexfile"
fi
openscad-2019.05/scripts/winmanifest.xml0000644000076500000240000000226613402025764020645 0ustar  kintelstaff00000000000000

    OpenSCAD
    
        
            
                	
            
        
    
     
         
             
            
            
            
            
             
            
            
            
            
         
    

openscad-2019.05/scripts/x64.nsh0000644000076500000240000000254413402025764016731 0ustar  kintelstaff00000000000000; ---------------------
;       x64.nsh
; ---------------------
; see mingw-file-association.nshmingw-file-association.nsh for license info
;
; A few simple macros to handle installations on x64 machines.
;
; RunningX64 checks if the installer is running on x64.
;
;   ${If} ${RunningX64}
;     MessageBox MB_OK "running on x64"
;   ${EndIf}
;
; DisableX64FSRedirection disables file system redirection.
; EnableX64FSRedirection enables file system redirection.
;
;   SetOutPath $SYSDIR
;   ${DisableX64FSRedirection}
;   File some.dll # extracts to C:\Windows\System32
;   ${EnableX64FSRedirection}
;   File some.dll # extracts to C:\Windows\SysWOW64
;

!ifndef ___X64__NSH___
!define ___X64__NSH___

!include LogicLib.nsh

!macro _RunningX64 _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  System::Call kernel32::GetCurrentProcess()i.s
  System::Call kernel32::IsWow64Process(is,*i.s)
  Pop $_LOGICLIB_TEMP
  !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
!macroend

!define RunningX64 `"" RunningX64 ""`

!macro DisableX64FSRedirection

  System::Call kernel32::Wow64EnableWow64FsRedirection(i0)

!macroend

!define DisableX64FSRedirection "!insertmacro DisableX64FSRedirection"

!macro EnableX64FSRedirection

  System::Call kernel32::Wow64EnableWow64FsRedirection(i1)

!macroend

!define EnableX64FSRedirection "!insertmacro EnableX64FSRedirection"

!endif # !___X64__NSH___
openscad-2019.05/setenv_mac.sh0000644000076500000240000000055613402025764016570 0ustar  kintelstaff00000000000000export OPENSCAD_LIBRARIES=$PWD/../libraries/install
export PKG_CONFIG_PATH=$OPENSCAD_LIBRARIES/lib/pkgconfig
export DYLD_LIBRARY_PATH=$OPENSCAD_LIBRARIES/lib
export DYLD_FRAMEWORK_PATH=$OPENSCAD_LIBRARIES/lib

# Our own Qt
export PATH=$OPENSCAD_LIBRARIES/bin:$PATH
unset QMAKESPEC

# ccache:
export PATH=/opt/local/libexec/ccache:$PATH
export CCACHE_BASEDIR=$PWD/..
openscad-2019.05/snap/snapcraft.yaml0000644000076500000240000000431613450032304017703 0ustar  kintelstaff00000000000000name: openscad-nightly
version: 'git'
summary: Script file based graphical CAD environment
description: |
  OpenSCAD is a software for creating solid 3D CAD objects. It focuses on CAD
  aspects rather than artistic ones.
  .
  OpenSCAD is not an interactive modeller. Instead it is something like a
  3D-compiler that reads in a script file that describes the object and renders
  the 3D model from this script. This gives the designer full control over the
  modelling process and enables him to easily change any step in the modelling
  process or make designes that are defined by configurable parameters.
  .
  NOTE: This is the development snapshot, automatically built from the source
  repository.

grade: stable
confinement: strict

apps:
  openscad-nightly:
    command: desktop-launch openscad-nightly
    plugs: [desktop, x11, wayland, opengl, home, pulseaudio, network, removable-media]
    desktop: usr/share/applications/openscad-nightly.desktop

parts:
  opencsg:
    disable-parallel: true
    source: http://www.opencsg.org/OpenCSG-1.4.2.tar.gz
    plugin: qmake
    override-build: |
      ( cd src && qmake INSTALLDIR=/usr && sed -i 's,-isystem /usr/include,,' Makefile )
      make -C src
      make -C src INSTALL_ROOT="${SNAPCRAFT_PART_INSTALL}" install
    qt-version: qt5
    build-packages:
    - freeglut3-dev

  openscad-nightly:
    disable-parallel: true
    plugin: qmake
    qt-version: qt5
    after: [desktop-qt5, opencsg]
    project-files: [ "openscad.pro" ]
    options: [ "PREFIX=/usr", "CONFIG+=experimental", "CONFIG-=debug", "SUFFIX=-nightly" ]
    build-packages:
    - git
    - qt5-default
    - qtbase5-dev
    - qtmultimedia5-dev
    - libqt5opengl5-dev
    - qt5-qmake
    - libcgal-dev
    - libeigen3-dev
    - libglib2.0-dev
    - bison
    - flex
    - libglew-dev
    - libgmp-dev
    - libmpfr-dev
    - python
    - cmake
    - libboost-dev
    - libboost-regex-dev
    - libboost-system-dev
    - libboost-filesystem-dev
    - libdouble-conversion-dev
    - chrpath
    - gettext
    - pkg-config
    - imagemagick
    - libzip-dev
    - libgl-dev
    - libxml2-dev
    - libharfbuzz-dev
    - libfreetype6-dev
    - libfontconfig1-dev
    - libqt5scintilla2-dev
    stage-packages:
    - qtwayland5
openscad-2019.05/sounds/complete.wav0000644000076500000240000023327613402025764017761 0ustar  kintelstaff00000000000000RIFF6WAVEfmt DXLISTNINFOINAMsucesso/successIARTGabriel Rodrigues de AraujoICRD2014data<6wU6z^4c8	[6{[<jE(	~of\JE/ERdu4Dbg>H'()z%{&}'R~Fk0E			
i

)/j(
g







p
b
B

O(n8















y
h

	V	&9HX*vpe/pFU#Me;Q!b	RDgzTokS/BV_UWMNED:RnT!e4b(m%[A`~
|DR\SJS<WiB"Hb|?(_[pR3u=d/`3p"_"43>=T Y>;xL-/t				
8
L
l
z
*
		A	unij,U	
72

9.eiD~

}	\G1u*=kz
(B %/,.\
qWP-|a3mqb@=WVD|9kn
	W		

Y


&*18?C
o=7JM	'Gi 

	Q=Y@V[l		}


d

t	Vx4Z7l9Z0NpZ!^/F]sc3i0>OHy0TKC<00"9:;
,uk2'p/JkP6y	;+|Dx)7;ow
'
	'3		,C
d~o
	3+Q]/
q	Dx]a*oS,f	

]_(m-Mn(@V^wIv2k47Pgk9Q
i6g-[4ZBpW		
			]	.	h7T_B!gH1uR,
Plj2tQ_|Kv]K(}eK"vs	
'
>YmvY
R
	gu9mY6&R
c[$`1'lgA.|&{GV		F		JX<dq$Xh0	
.tdR6R@xz
1
	nghiH6'I2Np\(m2SL$m{.D9\|	<X}$xOeHY#@xm#i
L_C2.u3t+C	7
Pl
\+gJkfa3Z*mM
&	o}$Dg	

G



~
0
7
	j1W$$2	`Z@`J7$BrK$jR+}m]I=&8DOf7o@kaLC.#Ns9E\@x
N|u	uy#AE=?::5A
6r
)y
		lq=vs;FM[a	p
sQ

vHdmG!g
E	{<H/Psbs_*W~12fJ.'()a	;f^n`3nOP?
D_T3oWW=~			cW!;Tp}KHk* CczKT`is(zn
!4jgM;o$-BVq}k|
C&;K_n>B	#	jC,
.sfIWg_

uP/N.Cf
)P~(AW
t)<-Dg}FZIekP9X"p`0"I&]O0]#T)^)5H^wwpN-
!^#@/
{I=Hv	"py\C:j!Dtr3@m	C$2HRl9c		
EgG)-))
%xhu
P'
)r:q;HNPQ94/6ZucQ
Lh-JcP-J{A6g}34~!k7^?pE~7queKi-
h,	H?hY&T!g EFBC?O`r{IKe;6Jq]F6(gtu#x56u;qK0$'$M`v&8_i&	{
Y3:u6

	`y
/k4_%n@EkLp49vt6yTp*QHlELP-	
=l-E]mLLk="
k
A
dRAz
T	#Sp6'?N%6.97|9`;0r7O9"}'/HNlQYR!0^#as8">lX%i]K9N0yqS
\9jO:[3p`f\jI
*w)S
SR^_jdZm	
$
Oz-s#{j>tO/|?Rm"$?Rk@*),^$Io9\.fIN]v3 .n&")Vz%"O
-T0%$|qd@K(s,	(P
1}:w
g
v|LWRW	oXNE9B+
f	IM:9^7{4GQUn#ZymegB"l*]Y))*SvYfG{{;o:;YfK1"+
I&~%{	
ga{U	vlHkj$-.{,p8%|%m(*4C`y4>H\L7Wat~Is;&>U'	
jrG&oAkM3l1V: kL{eZO~
	}6g%O`	&%N
$
		eIS?]x#m^\o
*GI;1!WfN-2Q;#"wrPk^wk 
}Tqry|	eU
L

6
nB
		1kdD{2,
^v u8tVH
mP
)	`goxvPI{2`&X=}~b1XAiB7J'`BdB+$\D"_`a\j~S}b
"=P	iN:S
?
l	1m;s>"<
!CYW<jsg/W/L2{x;"8\41W	

n
3NdD|H l?3+dW+
k		^k		

%Ln%\
-	*qioz9SsqM^q/wZ2kPJR4Wm8)K_QO#btjd[f;f0		R	S	
n
QIc	

B|bb^&PJV'1
*	V=S0TiL#	@Vs
	)6EPa;l,Op~xr-K$%SvW? Y; $htx|#_z
k52&uRW+BMNlOk=A
,9-Vh&gDpS&d9$0s5@s
.<

jL,
kI&6{
Zl

'de
 
eAH
P	1y?		e	4z-@~u'{	v	pW4D\q1#"]L{k0,a*_H0q^u/;Xcjp#AFlN%
d_!{8		
q*@f	$|^JM@jm4b&'Q+09 Qzh9]-xW;vfG!B?;65)d,T%-6BOTe'PA	

"B '!!2ix@	)zG	L


&qs@
			v[
Sb1U,U
H
J
	8f>&P~Y(Zk!5[s1/@
s<0HBn1
Y5^r@~04)sw)==en9$#*R:oV=| ,"=FU]s~z<DR3rj.`2aMzn~0_	


/
*4Q
&
Z

;	0jQr	%%5

	UtL4
Q

X
	vR9m
%<8f&D!]~^G4Tgjve`="oL1AU-	\l*1|Bfu	*?
	 EK!S&		 Cu7O`W}}pjZ@zdh`V;Yy?l3g k?MI[>63jzItJO	G+mJbg<#MFr5+!
2 

	=	
~Me,
		8	o~Wd:H9t6IKD8kN,^`fdX7CY@Zifl<bT}
Nb5

']=Y5"
.
	x@W9QnF)g$,rL/GOG8jPk!T:#W&F&dY=0LhUW6ci7lD)>X$^27'T?H	@J)PovH
w9)&h,UUwcpP0K*
tmJAJXf
knJJ

	t7	
V
x


	n9	.
d



0
	"&I$*-67dyJuy,2G_
;U}{[=xa'nxe7w8$}[U^T^W/M2^	k
S

e
^2
uX@)&vLk`	ZOC5RfR%zO'
pH-
^.wb
Js>5/#Mo>^ WOC
NE;
Y3Uy7US4K?t[|,
q
L


-yhp
w
	9`9NZKaR	yPfB{}5*4044L>+v^ Y1Ps#AH]z-k  j4+ t@			$cD	2
X
=RHC64
&&
@
	B
os	#qp	// #RETA)t8S=Cj@<]{fK3=ygstw`MtDAb*-?S^"xrhwl#
+[*[4gA.:y{
M[~_fC62i=Bh[[(,?f	M
h




u
h
h
]


On
8

f@
!
		rO!	
;



\	e
o|
8*TD:>zp2u:moIZ&McjRB:\6ir}+2g	YqBsC[D<G		|c"/bs[H6k\Y~KQTUe)=%
M(*)&&'!DjrDFSNm




K

IxP/:<fRDI
0
;
j	4M7PMEy#iL^Sk:&61>aO}qGjN5<$;rU|K!._`D'sF0[WZ&\?cLcf5/	-
e
[
H
@
[	1$Z_x8{O%On1h	L0	9MnLB<Er)MqJF/"	
Jb$r
dW~g_jHc]3UQn]rT-v6o<-SxqP2#
#vc_@j"Gda`l	u
=d|V6h
k
	{		d

2
	t			
A\~

#$6
^	dgE!C2e_eZ^0'QxFD6aK;PJUO?0|7~I}5r6\/d %g~:x3&MW
h@O(IlD7B+4=f
RB:
}

B	q		C
6pX/p
}	%	Q







	<{.,G^UNvM5@EPS[;cuO|V
M;>LrQ0aTmsi'u?\&0t!xJkb	(





-Fd.8
I	VdoB-}!VkkOPD!)a48K[UqY,C/VE<.;8rFgc<=		M{<4bDA?{36Z}
A
_5ltH|	U&Zz}1UDO!Kc~dYX8pha0!0;,U=&K!Ny	R	N
SEZQG?$@=dPU^g:!.>KWl*nl							0


P
	]	kxWuqt|St3v\F`1ArE	1;JTv]/yk!4ZV;[{c!\f'X'QnBCMyvzUx#y&

E
				J,hO	[

ruI1Z
N


	
2
d
	U.|th``I0VpPEI=Jv_GQ]b}"o8cFw"Qq|2wf%i _ortjo
/
;)||3>?NXk\tc%)mNf*1v>z]2l,=I?6.tke'-Qc2v7p&jT5NZp7FK2
w	n
b
$
	/	SyU.2	']~
P|^D	'	
FcC	G	;lUczvsUx|9&a: ;Ooy_\|;b	\2-@X/WKr8v&Q~xrsR><fC		
u

-
a	1`yxOxX%vur3L5K-i>SQMqJNV^1)"i1]2#K;Gy
o6~,Ayr6V\UR)`:k$9h%xcpaF)O
0U*|wA_a8Y2{/l+(xH	'

!

l
5
	K
quRueg`i	;
y

v

		I	|			

R

		_	 	Kb7UVS#vJ"	Z8F1MgY
GS_NGepEa_6L
{qNd#Q=.&m1_@	gLb(dr
`3!\,mZwN)u}nt;T4=4(sMPE		v
l^
		|	
8

D
	$	O(]_CRxt61/(B!WO&]7P
!8Pg4
%/f_\z"t[.yd]9#y^]Q(iXK9zl	

h
	;5w$		l
	m	P; |t1rm)XspriniF&!Nd5ZyL2\EB@EIN	R	_	=u2d:"z=)pb9
q]!}CNNZu:?J{@ERH3_ttyoy7m1"w9r}_2				V[h0 *p9Jq5
Y&JwZmtVBoAF;)7uU;IGDA|]`&R
x}J4d	2e?v_R451310Us]lE@nH'|h#LB?mJ.Z'#qjB(W22-)!Gq_5cG}$xijhnioZR		
l
1

	
/


`9+R

"
	m>CmTs&		BP`O10Q&(mE	g('X8k2}k%0L`zf#f&?rC':)_B_qH+<Ng
KZA2LMI#oFv	0	U	rb27FCog\OhA.T_"nv{.)[ %+%3zRz#f)bAsQF&Z#/FNQc					b	Ja0*G:@I 
ZIa%ei[VQ3	e>"{;,uuk15o4
rx!}"]yS[by)			(xC\!`P!}5BhX%Q`v]0Iv@f~ulfH@L #D#:%eO- kpdU|]3(>1bGDs68WwG@S-WIV"Z#?w)+]|l C(Ok4x'@+L49u:F<cw	


!N
P	a#c!Uf0lf>WXM
Ghab.ZHyE1,zG\OHX`px;&T<`p-m%6CYnc^r2JK_j4tD-,h o1,~Oy	T
:x
W	5j5&R|<a<?>LlovaO}P bO8	Z~ @d'=|8Yoki#zW(~H12~IRY|U		4qEo_@kI=YJy)bX]XUJw^Pw1qhaZ'Lo$bl2~MIXztS;{2Wv7	m@}<O	=p	{&9><`I,t3LuUqY[hqZ+ c/iiue
M;2(PlYgM%>~*JuL.g,perPx2xbdwfBd#Cvfpza#tuste
?-
/(]/;j%*6:}E`"9Kk$		
M5
@
S
m


X
	2	sl^LF4}		^vSj}S [?oiYUNOLSzqL$b1r.:j	mD&	'|)ZlMeRlY`&}W#,)			OzEib.D]9@8&Gpa(nL)WztZJ5@h/!\F:;#gUFb<KCn	..q2POw_Oo."g*t3tzD>_d3T"eD)~bPE:DcH*+N =2g7~st8'45?6+$i~K5R rc@	|2(;he'`OHgK+7QD!JQ1<P
X7jq/FCcZJNKh^6~C!M(fgFAmCk0?\$|^<~LS1mQ9-[Y`;8UV-%(*']
)f:UxT:X
kLK1Mt+b!M!,N^OL3<		p

F
B
z	_XQ7d, 					Y^aK[1a&DZ!4\DMU;ehsvmOmM09/k">bu;h	/~8Ojq`
/pJqBJh^PC *	LkU,GQV_c+|%tRbgwR#JX\'Ztr|j;Ebb\^XZXa\euWKKZB/i*K\?Kxypul
(i*~*_hak
n<<IvG2;bAnt]'h_/yz4I?-S*&:J7
7WAvJjwBkfLbn|%Z3_"
N6f-YU<fTiQ4cf@U>~@rNq	u<%K~@tvvoeb{d|!	-J_@nY0^0HPhpm;77-Ur2W3RhoG%lDN$g*I?LUs	Dih
		

	[	s&8U	d		
C
	AvvI,Kj./xRF!]v_Gw
"7Qb=|EVw=8>E2:
~bD&A ?_DU4hLGxt? 	'Fp&]"slmjw
UK@B&('&K{.8F)yzwsDgxU ;  
l(6h.^z	Q-}^L.Gq,=Oj>$}8@lO~pWJ1R$Ymg^TN=p)ZhD4^5R[A5j
	_oYCY!XkOEOY=IOz9^$:LJAG5&h-57<=(1\N
Nj&7LVYeetX.E]xc6u>wNK0v[}ZWFpD1)5^
BE#+-aw38mu{485">HF?33ihKwAsdwpZyX.F7^N		M		f*YK.		gUl8aR>.C\UEb!Yc>w)#;6{Or/o/zo^.h8OSm"m=Ko
Ml(xFw/n<Iow
@s%m0Y&VZu0y\Gj+RowLpHvO+0IWi'y}AG2"Bi)q}L@$*[7Fx6ZX<-#GVD0+66<B(H_Ak&#Ju<	1FWu4!-|uppV8lTD*)m|
[I5^H{
KZETb8ph3(FxjVL)vXzpxoyi9IVvOf5	){ `2B*(O9#_j`oZ#	`3Zcwsh1F!mEnq,_MgkM
g.	{			P	H	<nEy~(t]*mtfXG:/8\n9r9-D1k/i*Y%a;6@:D.8ibAmB~m`cur3e
<n
1?5
1raK5K2L:E;;%G^2
1>Vz)%>_qTPAk4
Z%GqEg?_8y

.czp4_f?g*ZeC/Z`R!h3{BgY.xU|8{X8f(g8i%CiFN-FmFvY5W'd,@YC]v%`WY	*qLi@yx.=h_D?oL'ZuF\3"S%_Ju,
`2E-I=T3a#]U/t=h67Y
U'^O%p_x@P:/(S]	WqM7a~Br21>I.},R}]3\2V6Tb'W9okOPpDPkZ%"[b;=!Q2!#Z\jly}F*-.01Vg4d^8o;a[rB<61*QWL\5zE?+h-Td/q^)q$ap,"B[|{~Pz0j(~a%8_AQQv@3&8D{8h!
7aPdrfN/,X8^}wlqv
J^4v(t\;ZBwgf2~jR(*&lG';(g5V9N6\x\WtA{>S{44]ZTNHBz<sze:$C
bJByK=e\xQ6DYaru@GyJq=CX$CsX6Q%1llK(;6}5p/}V+)>C
[)j:`CZb)W(k(Knp6u!Vd4U3X}=[,Bgr3lYvM{PvNm?!hbA			+$Nq9~^C	K[,pgO@%Ygmtkk2\CWb-DzGqs$%a|18[_@'f!N	X>UY^NAiS8J
;_GyEM&s>zl:4)t@zRQrOW{;?W(ppk@!jK{CO 8"bL1_)Ri[J@.y H_Q[dBKJI{OFe$/=\_^dcf
WT)Al'=r.X	uX"T'_Q#!H~~Y!9 
#=&|,M*q= s!t<>u g*T1b;-+^WS<qH?oC~<0^u]5s}}pN55Um@p487GXk{`w~b8msO;$E
}Z@fF61|T^+Y.V:)qH?~P0!i +e+JYUr	'7q7.Qp,*)b:NCGP~9QTAK}zbxLe<
WEcnzS)TPPT[<+}!GxXGeDPCD\mdfhjl+@Od@!dv
Yj>hmu	=Fy>\mi)nf-R`}p/GR(T]NV=FF_vNqm3Md}]f6R,ee<gxX*c3;CaoF
g",p5s7!
3	[9W$b">fxU+&#$%A
m!}*D]M>K5#
r3#6nh}1qB;y#:}"o MX};@
(ZJ`-J~z{\MuKZ1
9ec!3:HKdy8I6wZDFmtVj\*!EF)x~N1rJjP=.>wY+wB8Y![YUM
-PxD{701'
P/MDB#.O}?!pX
O+p!Y h[4nv.G
&7VwW14<#P~d5_p-0X9Z:ByF[pV7Cm
SGa}!\PA0m(Gk&`gMoi'aif+i>
qKAI^dvV=xJJm]OvqfiK5;yJ4#ZH-Gs'$E^{]C
#yE	bKE@C=71(&
qr$Ch2:J<o6Z&'3~;j+Y>'VI
V}KnB0bE=qn_PA2-Qv8]|ktAW2e2A-qzy7	VmC;710('Wsd@v
' 5Iak1
v''Ty1=IV}ms;i2b.yV3p$gf	4:!^1p84fW;i2mf4mp3)	Dxe"3^0hCuMeo$Eu4"N"k^	n;8EK3"]#K4p}
&:Sk,2=Y};
qOWSzvkd"g?mNPC6H8i6y:!T~th\Q@Ap,H9<8:591YKD6"PyUt]*^y
P,?Siw>Mr!19&e<FyV|^KNnS=!b;>{G| ]H>ldeY\S%kje-F[y`+qZ7?qbZYh;vWLJRLNI!mAk$<Z]K4|ER\3PI-e+a0r+
OM%^7OpHd:2R>Ca"vE`U	0G"	1]MK3YI4&l#Y"K2=N}l^J9WiZJ6n
Er?A
LA%k$m~?ODWd}Ip	[L)DHIg.Y`9HM#z[Bu	SCp}ITfq,~%'Mos6!0\k7{5Gi
PyZkCb,h4u, VKzqjGgf\g'UXGJ5Z.-w!
?PY.0zE4:Q[o5(Yvd/az]'X_aTZ8
?p	{Z2
OUpQBd8Hazb>}q~&R|iE$m%BNJ7e^UKF(3^kcZUWd;Lx-m-tYayR} V#C;CL]:a&Hhf52^Tq]X#P&|mtD/}:R.l?|\x`IB6
KrD@at#sF:[pWA~yyk_HOc[Z'`>}W%R3ML&C`rd-1U&^v`U/	&(;>:PLW$]@+s#rnUQM|/-Z
ZQos@QKQY1szGL;D-=Nb^@EJSU]p!^lQ`o{]'QlC;Si\uT~+n%/>\Qt[}zbSv&'oCeb)/3k27T<S-RHsF`>#%Jqt:D<|	nw
dL{~hUG[`r]BwhK9-5ohv-xO'%'!'R#	d@RoRiX`4j7q&(Z~2{QB	,Lf\q0|Z59LE6TmA\#$a3L'",NLSUZYS;	5^e
!W_
IHn"l:s~2ga[a_bab*9.t>WjAg,Ip"4]bDCHX_B
jB{-nXz2jL cJKlC0LT\{I*dc$:)=6&;_3HEFjDtaB/I@5 .KP
L6GLFOI]fVvWN4'F'4e>l'~JHBA;97Oz!vZ!x4k/IRX
aYr!
!Y&pF!6K^5s)8?E@0h
(O1j58^]"v

:GOw9UvjFZ!D^  ''!"4E]p|Gp=h6Lb&t2pPbYV} 3n8qe)n?tVKEJX[ )9ET_e< f #v<5rA6ZoX  tX?/dQ7mIi\i4ED5,^ 3CT +@c[GzAhS:"''3YO<( T?, =r7^sDsDq{mvM3SpWU2I I =mY; k'TPKFB3_ju 4Dlhu+Go!JO#NR0q<>?>@>nP4[1btb kA'coy5] !FlF+9Jdi`T'vVDb|pHDhgep$m\.$wF'L+Jr.7vHxDorJ%Zk9_4iD}M_fthv*;:?HV]cB&AjR\sz[dnvR u<9o)RzoI!m,+xgA</&vZ q&>Ol{uy-5 y"R;4J^ur?]*B YhUQATB=Sqb@9Ju23Q}W8$+8=*?ryfXwf\Y[- 9R.|@s[3lSOY\ek =y[%a>2RLH1Zj~Y9^1 \&PPxX"tj6gG!XJ#o wD P =zZ06|!pZMvQZz\K2w@ e4"vB ijhvxO=+.b`8qg'xoH&p2|u V:3P,WbV**TQNC?5.%C8& @_cI.{fN&-uw-0ERgn[SXko"0IV`>p)WsQ \+Z2lD &:Rjm5`FYyL ;UW>r#>Y{46020#4;PZk{c ,jUA49b,,,tYG-D`= ^M#h(LAA=9:*!(#-,84Ud&WhkF<I(6O6OQX_2C)mFHdvaQ*\V! (Ow E{{PW'PvnaZU{-lGbq QX&rwO4ASc[ &QzmreW:=gR$A*( V B2|@nC(=F!Gn SINZ(yj&_Cc.e^:-E?3j[1[cu/w0X-vzG wJ?L]f<%>k =as;;cCedZKjL:1h ,HLp9Q Iv4RXY`$6;Wq._2-r+<INSC=*'?AHIFGbw4iFV+"z-*4BLN( \|Jf? -@XQ6?GQXw .)H)k,C!sGkRv.e7$kO+N!{>zM!|V!Oi#  CM//?\iQRU?*.hk}]9 8f:t kEq2v=+ V F%u6$ ( {`\/ ia ` m4)=I_[dXOM58>B6D S<2jnV~k_xF/ycO73E$-;BQ|j6 P.%pHnHH_Wau{R4S|/:$v4Qd^DobV77[U?8&'pB u";VocH1s=1cS`0b; 7c`7qp3qOF0%p,E$W]jzQ6v&M~?cG0k` hYH2r&Ow?'{3ndh[`ZTjI\ s&,tXY!m@^[QPJfkb)-\8RJmLVh  '750l)0|+CTyTwp\"^$9u%H\iruxj.tj{Qe1[`@GjSI XVsr.s}scVHAY{(sO"0DNCjE=tl>y1 qf<|ufy#pXNEvhjosq,X8m;?64.(%:C9=jE#gOHWp_w2KLC92$u5%)F c*Sh}GvnFKw$C [B+OYpAz InwpojGC>;  7@-K"[Nre:2$SV kK#^ +MjGvJ_9Aq_A 2Gb$}pv 5m#==xwkR[[)BXovzV44d(o~3U_uzLBB2.eS_q~uX, F;;0*[; (5>=0\3 ).{X^In9Kp:vLznXI!((//TDC[6Pg#vVg< sYJ4)M'9KapY 'MAA:6;<(DWzrytwrcY^~7UD9.dpkVK8*AXlt}p.Q: 0csA#! ku.Ee)&LiFvU1 +KjaENPZ\3a&APpvHE W(7A$ j7FzIfpoi_ZK,Tg|p@w: N{6o'\0H@lZlsv'Il!KyX4{dv vcUK Y/+aP#hw5_~Q`[CwG& v(fg%qT- 3i ! "'-,6V6J,8J)39CFQ^n,FVg{(_e6n+^SMKj)ma->e},%f _[hldOD2NtiX=CB$/|lqpvyaA'ZD9kG s[LB6& Mw\C% +:UhqN|-(3{gONW]chnx!`T)6K_u[ #C\|7:# j5!Ht #=\^ez[``XQaiyi$f$(c"_5B;}@u@mO*oXK:,?W +>4%-7Ji&gjC1q%/4Kfu_L74Pu1L?5$}dJ'%/Nx?d;%T[_*eP^'iCmI'oeLArMx t=U5,2c- -S`/sK-*@kR)`nDb5D%_G}D) b"sskgiYW?5Ik]FI4 &6O_ywhP>(qy':Z_YY]qxl^|-PkZ; hbLt uO6mX, DA# 'bTnYA&c? }Y -d=pze<qc&hA!L&V6Ws'XsvX@%G(FE%Ms,Ara"RkC~DlK0'J]aRE:, nko{U3u-h@S4Xj^Q@/%!,Q:x|k`N=W79U#h(NwiP2Pm;w_F)%T{ 1$ )J~=lheWUG4B9-(zQOb<Snlj\xT9Ye =f h< e/ &KeW/oi\S}O~^VX &8Tk-MjprF#`A_ Dq$8 :Nbu]6#8Dd {5iL, X1}Z/*R}q; u3F8+21vT&lM35PgGq8l(>_g-{#?^W_YW21L<cXP9 j l3*kc? qF* P =]SRLMD=!Gk2*'.'103\Q.59AB?t8!"+.1EZo1If^m;i[hzxA x{ EoF>T+#%36A=U4FRezq '-238:B>;41~fJJz#[o3ZxqS<('?c-7BMGj%mF3(;H\l|4WnxR6~\: 5B[rmG&,e,UMHE h= 8LbhE*tuubQ<:[9fmjnpt06#b _?QbzMkO;=]Fxn-zjQ* 9{;} ;|uib^ZSPm/iu]UF79NctkP%j:;acI:;=IfvCv(kNJ_wc'vm\TD;=7JPcU-S/-2Lj_@cZ?6 -'!lbVKk= 0IayoNI<@XzP'.S0]{|TB>>DO\XF*O`AAEAAGF/ '(9=]n-SX3v:sez)_zq_B1 2duP *Z*{,Nls@ 5\}sWNMWU[`j{dn3BYeaE1x* }dH vda\04@G Y$'FNbjzvPpr|^@ N.;Ng{%Hbhls@dS>% Fv3sdk_YME6 8y5VwE{dO7 |> Eru@xutx~wR%wx]VZTU!cmfp.@MY 2[xzdRG64xF7c3c}~{lSK:?GMSV fI^ 1SwyufZL d{< 0a7#wA +J\kZC4 "4?U|U(1Cbw$t<hS& 0Moxpe^D/6no:sgWI+n{1+$%Bq%qjarC ikoos  +:M_$NsY3'mcWk/`>f~tBw7-RxxuehhllnnWXH:,t\ 0RYdlt+XbhihC!Ktk6ptW=?B?evmF<* %DlsK3 a/Y!#L:Auejikos?,7InADSo 3EW^E22Y*MzL{ y1RBk\(#<7&_:(+CYu|]MA6*wPH/*7ooy{N3f~]D#2r'"26Sq-"vTBV[qc`b|:tv&= `RTIU]lbK98Nhb>0q4[~wphp F|j`8/:,$  -BNcv[/ g> nb(B^o~U(E|cf qTNj>`RypT>% {S(#O04=D=1*/Tu!~J=0+,99:$  /DhvW9 !& @xKrU>`A1A`srI%  8?LXmxkXOTQXr},LhK#6CPbn ,F7aggkihjhuI?TUC6$&0;Na$(&'}q{e7saC8GNY_jhS7/):[xO |4{Z<"0?M\m?WOLLCEFgznaUNW_SJA-!"Qy=Up~omeau~Y:J :N^T-uwicQJ90""4B: hO,  v\WU_|"Q ",/;G7ge~'BRk]?! ] tq$<UPA0!scXOI:+ +?WK?5+""'(4@J[cs~Q#?pxi^O@8\!40tr{}n`C!KhuV5  ~iI5-FVS<ugc}*18587<@@BXq-@)?o-CVX]\e`Z-5@J]viK2}S0 ,>^rpW=% kK$GtvcK5 $@]w5X~~rhK00>GNSZ`gwtV?- 1HlqkVF4uQ" 0Tr  5]gproL"#  .;GN/ gG7/2NmvSE-" ,FVgguz,;TfUK:-  ! (LbnX:(8OPYO7"7\msvWF!6Iaw kP2)*.248/(*0)+'132-+7BYhq`G8Y43Md[H9( (9Iex?\z  !<SOKEB70 wre\P8)  '7=1fN9'3Ic}}{vozz";GA:D>>:ACGHDFDIIIKC-2G`|}kP<(!  "&&-,8/"}uncYL;5+&+FZs*69:?.)/<DGMIJADCSYcxuqb^OLHBHGNcpiP0(:DTME;2'#(52>55+!         #&,-,/*.,*2(5,50421/,(#              openscad-2019.05/src/AST.cc0000644000076500000240000000206713445047371015641 0ustar kintelstaff00000000000000#include "AST.h" #include #include "boost-utils.h" const Location Location::NONE(0, 0, 0, 0, std::make_shared(fs::path{})); bool operator==(Location const& lhs, Location const& rhs){ return lhs.firstLine() == rhs.firstLine() && lhs.firstColumn() == rhs.firstColumn() && lhs.lastLine() == rhs.lastLine() && lhs.lastColumn() == rhs.lastColumn() && lhs.filePath() == rhs.filePath(); } bool operator != (Location const& lhs, Location const& rhs) { return ! (lhs==rhs); } bool Location::isNone() const{ return ((*this)==Location::NONE); } std::string Location::toRelativeString(const std::string &docPath) const{ if(this->isNone()) return "location unknown"; return "in file "+boostfs_uncomplete((*path), docPath).generic_string()+ ", "+"line " + std::to_string(this->firstLine()); } std::ostream &operator<<(std::ostream &stream, const ASTNode &ast) { ast.print(stream, ""); return stream; } std::string ASTNode::dump(const std::string &indent) const { std::ostringstream stream; print(stream, indent); return stream.str(); } openscad-2019.05/src/AST.h0000644000076500000240000000270713445047371015504 0ustar kintelstaff00000000000000#pragma once #include #include #include namespace fs = boost::filesystem; #include class Location { public: Location(int firstLine, int firstCol, int lastLine, int lastCol, std::shared_ptr path) : first_line(firstLine), first_col(firstCol), last_line(lastLine), last_col(lastCol), path(std::move(path)) { } std::string fileName() const { return path ? path->generic_string() : ""; } const fs::path& filePath() const { return *path; } int firstLine() const { return first_line; } int firstColumn() const { return first_col; } int lastLine() const { return last_line; } int lastColumn() const { return last_col; } bool isNone() const; std::string toRelativeString(const std::string &docPath) const; static const Location NONE; private: int first_line; int first_col; int last_line; int last_col; std::shared_ptr path; }; bool operator == (Location const& lhs, Location const& rhs); bool operator != (Location const& lhs, Location const& rhs); class ASTNode { public: ASTNode(const Location &loc) : loc(loc) {} virtual ~ASTNode() {} virtual void print(std::ostream &stream, const std::string &indent) const = 0; std::string dump(const std::string &indent) const; const Location &location() const { return loc; } void setLocation(const Location &loc) { this->loc = loc; } protected: Location loc; }; std::ostream &operator<<(std::ostream &stream, const ASTNode &ast); openscad-2019.05/src/AboutDialog.h0000644000076500000240000000102113417146620017227 0ustar kintelstaff00000000000000#pragma once #include "version.h" #include "qtgettext.h" #include "ui_AboutDialog.h" class AboutDialog : public QDialog, public Ui::AboutDialog { Q_OBJECT; public: AboutDialog(QWidget *) { setupUi(this); this->setWindowTitle( QString(_("About OpenSCAD")) + " " + openscad_shortversionnumber.c_str()); QString tmp = this->aboutText->toHtml(); tmp.replace("__VERSION__", openscad_detailedversionnumber.c_str()); this->aboutText->setHtml(tmp); } public slots: void on_okPushButton_clicked() { accept(); } }; openscad-2019.05/src/AboutDialog.html0000644000076500000240000002561113452420547017761 0ustar kintelstaff00000000000000

 Flattr this! 

OpenSCAD version __VERSION__

Copyright (C) 2009-2019 The OpenSCAD Developers

License

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

Please visit this link for a copy of the license: GPL 2.0

Tools & Libraries used

OpenSCAD Maintainer: Marius Kintel

OpenSCAD Github Project members (public)

Package Maintainers

Patches

Jochen Kunz, Gert Menke, OskarLinde, Giles Bathgate, chrysn, Stefan Farthofer, Andrew Plumb, Brody, vicnet, Miro Hrončok, tim-caper, Tim Deagan, a-e-m, Jason Lewis, Keven, Wil Chung, Bazza, Ben Gamari, Benny, Len Trigg, david, Frode Lillerud, Patrick Bogen, Ricardo Markiewicz, boxofrox, steelman, Henner Zeller, Michael Thomson, Steve Kelly, ivoknutsel, mrrobinson, tjhowse, David Palmer, Ivoah, 5263, NeoTheFox, will1471, jgelderloos, NateTG, 1i7, Logxen, Jörn Lund, mermerico, qSLX, Scott Lahteine, Steve Purcell, Nico Weber, David Eccles, Mattias Andrée, gregjurman, brianolson, colah, Peter Uithoven, Liam Marshall, andromodon, hoijui, Anna Maryina, Tony Theodore, Konrad Malkowski, Jasleen Kaur, Kyrylo Romanenko, Doug Moen,

Translation

Miro Hrončok, Torsten Paul, Ernesto Bazzano, Keven Villeneuve, NeoTheFox, Marek Pikuła, Alexandre Prokoudine, Kyrylo Romanenko

Mailing list, bug reports, testing, contribs, help, &c

nop head, Triffid Hunter, Len Trigg, Kliment Yanev, Christian Siefkes, Andrew Plumb, Whosawhatsis, MichaelAtOz, Tony Buser, mrhdias, ibyte8bits, Koen Kooi, Tomas Mudrunka, knuds, cadr, mshearn, Hans L, Brett Sutton, hmnapier, Eero af Heurlin, caliston, 5263, ghost, 42loop, uniqx, Michael Thomson, Michael Ivko, Pierre Doucet, myglc2, Alan Cox, Peter Falke, Michael Ambrus, Gordon Wrigley, Ed Nisley, Stony Smith, Pasca Andrei, David Goodenough, William A Adams, mrrobinson, 1i7, benhowes, 5263, Craig Trader, Miro Hrončok, Tony Theodore ... and many others

Hosting & resources

Laurent Guerby and the GCC Compile Farm, with OSUOSL, IRILL, FSF France, AMD, Intel, IBM, &c.

Sound resources

Trademarks are property of their owners and do not imply affiliation with OpenSCAD

Apologies to anyone left out. Please file an issue on OpenSCAD's github if you know of someone who belongs here.

openscad-2019.05/src/AboutDialog.ui0000644000076500000240000000754313402025764017433 0ustar kintelstaff00000000000000 AboutDialog 0 0 628 419 0 0 About OpenSCAD 16 6 0 6 96 96 96 96 :/icons/openscad.png true <html><head/><body> <p style="font-family: 'Open Sans', 'Droid Sans', 'sans-serif'; font-weight: bold; padding-bottom: 0; margin-bottom: 0; font-size: 22pt;"><span style="color: green;">Open</span>SCAD</p> <p style="font-family: 'Open Sans', 'Droid Sans', 'sans-serif'; font-weight: normal; font-size: 14pt; padding-top: 0; margin-top: 0; margin-left: 2em;">The Programmers Solid 3D CAD Modeller</p> </body></html> Qt::Horizontal QSizePolicy::Fixed 20 2 400 200 true qrc:/src/AboutDialog.html true OK Qt::Horizontal 40 20 openscad-2019.05/src/AppleEvents.cc0000644000076500000240000000164213402025764017431 0ustar kintelstaff00000000000000#include "AppleEvents.h" #include #include #include #include #include "MainWindow.h" extern "C" { OSErr eventHandler(const AppleEvent *ev, AppleEvent *reply, SRefCon refcon); } OSErr eventHandler(const AppleEvent *, AppleEvent *, SRefCon ) { // FIXME: Ugly hack; just using the first MainWindow we can find MainWindow *mainwin = nullptr; for (auto &w : QApplication::topLevelWidgets()) { mainwin = qobject_cast(w); if (mainwin) break; } if (mainwin) { mainwin->actionReloadRenderPreview(); } return noErr; } void installAppleEventHandlers() { // Reload handler auto err = AEInstallEventHandler('SCAD', 'relo', NewAEEventHandlerUPP(eventHandler), nullptr, true); __Require_noErr(err, CantInstallAppleEventHandler); return; CantInstallAppleEventHandler: fprintf(stderr, "AEInstallEventHandler() failed: %d\n", err); ; } openscad-2019.05/src/AppleEvents.h0000644000076500000240000000006013402025764017264 0ustar kintelstaff00000000000000#pragma once void installAppleEventHandlers(); openscad-2019.05/src/Assignment.cc0000644000076500000240000000422213402025764017310 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Assignment.h" #include "annotation.h" #include "expression.h" #include void Assignment::addAnnotations(AnnotationList *annotations) { for (auto &annotation : *annotations) { this->annotations.insert({annotation.getName(), &annotation}); } } bool Assignment::hasAnnotations() const { return !annotations.empty(); } const Annotation * Assignment::annotation(const std::string &name) const { auto found = annotations.find(name); return found == annotations.end() ? nullptr : found->second; } void Assignment::print(std::ostream &stream, const std::string &indent) const { if (this->hasAnnotations()) { const Annotation *group = this->annotation("Group"); if (group) group->print(stream, indent); const Annotation *description = this->annotation("Description"); if (description) description->print(stream, indent); const Annotation *parameter = this->annotation("Parameter"); if (parameter) parameter->print(stream, indent); } stream << indent << this->name << " = " << *this->expr << ";\n"; } openscad-2019.05/src/Assignment.h0000644000076500000240000000170713402025764017157 0ustar kintelstaff00000000000000#pragma once #include #include #include "value.h" #include "AST.h" #include "memory.h" #include "annotation.h" class Assignment : public ASTNode { public: Assignment(std::string name, const Location &loc) : ASTNode(loc), name(name) { } Assignment(std::string name, shared_ptr expr = shared_ptr(), const Location &loc = Location::NONE) : ASTNode(loc), name(name), expr(expr) { } void print(std::ostream &stream, const std::string &indent) const override; virtual void addAnnotations(AnnotationList *annotations); virtual bool hasAnnotations() const; virtual const Annotation *annotation(const std::string &name) const; // FIXME: Make protected std::string name; shared_ptr expr; protected: AnnotationMap annotations; }; typedef std::vector AssignmentList; typedef std::unordered_map AssignmentMap; openscad-2019.05/src/AutoUpdater.cc0000644000076500000240000000116413402025764017437 0ustar kintelstaff00000000000000#include "AutoUpdater.h" #include #include AutoUpdater *AutoUpdater::updater_instance = nullptr; void AutoUpdater::init() { #ifdef OPENSCAD_UPDATER if (!this->updateAction) { auto mb = new QMenuBar(); this->updateMenu = mb->addMenu("special"); this->updateAction = new QAction("Check for Update..", this); // Add to application menu this->updateAction->setMenuRole(QAction::ApplicationSpecificRole); this->updateAction->setEnabled(true); this->connect(this->updateAction, SIGNAL(triggered()), this, SLOT(checkForUpdates())); this->updateMenu->addAction(this->updateAction); } #endif } openscad-2019.05/src/AutoUpdater.h0000644000076500000240000000135213402025764017300 0ustar kintelstaff00000000000000#pragma once #include #include class AutoUpdater : public QObject { Q_OBJECT; public: AutoUpdater() : updateAction(nullptr) {} ~AutoUpdater() {} virtual void setAutomaticallyChecksForUpdates(bool on) = 0; virtual bool automaticallyChecksForUpdates() = 0; virtual void setEnableSnapshots(bool on) = 0; virtual bool enableSnapshots() = 0; virtual QString lastUpdateCheckDate() = 0; virtual void init(); static AutoUpdater *updater() { return updater_instance; } static void setUpdater(AutoUpdater *updater) { updater_instance = updater; } public slots: virtual void checkForUpdates() = 0; public: class QAction *updateAction; class QMenu *updateMenu; protected: static AutoUpdater *updater_instance; }; openscad-2019.05/src/BaseVisitable.h0000644000076500000240000000201113402025764017551 0ustar kintelstaff00000000000000#pragma once #include // FIXME: Default constructor Response() enum class Response {ContinueTraversal, AbortTraversal, PruneTraversal}; class BaseVisitor { public: virtual ~BaseVisitor() {} }; template class Visitor { public: virtual Response visit(class State &state, const T&) = 0; }; class BaseVisitable { public: virtual ~BaseVisitable() {} virtual Response accept(class State&, BaseVisitor&) const = 0; protected: template static Response acceptImpl(class State &state, const T &node, BaseVisitor &visitor) { if (Visitor *p = dynamic_cast*>(&visitor)) { return p->visit(state, node); } // FIXME: If we want to allow for missing nodes in visitors, we need // to handle it here, e.g. by calling some handler. // See e.g. page 225 of Alexandrescu's "Modern C++ Design" return Response::AbortTraversal; } }; #define VISITABLE() \ Response accept(class State &state, BaseVisitor &visitor) const override { \ return acceptImpl(state, *this, visitor); \ } openscad-2019.05/src/CGALCache.cc0000644000076500000240000000255413433421332016633 0ustar kintelstaff00000000000000#include "CGALCache.h" #include "printutils.h" #include "CGAL_Nef_polyhedron.h" CGALCache *CGALCache::inst = nullptr; CGALCache::CGALCache(size_t limit) : cache(limit) { } shared_ptr CGALCache::get(const std::string &id) const { const auto &N = this->cache[id]->N; #ifdef DEBUG PRINTB("CGAL Cache hit: %s (%d bytes)", id.substr(0, 40) % (N ? N->memsize() : 0)); #endif return N; } bool CGALCache::insert(const std::string &id, const shared_ptr &N) { auto inserted = this->cache.insert(id, new cache_entry(N), N ? N->memsize() : 0); #ifdef DEBUG if (inserted) PRINTB("CGAL Cache insert: %s (%d bytes)", id.substr(0, 40) % (N ? N->memsize() : 0)); else PRINTB("CGAL Cache insert failed: %s (%d bytes)", id.substr(0, 40) % (N ? N->memsize() : 0)); #endif return inserted; } size_t CGALCache::maxSizeMB() const { return this->cache.maxCost()/(1024*1024); } void CGALCache::setMaxSizeMB(size_t limit) { this->cache.setMaxCost(limit*1024*1024); } void CGALCache::clear() { cache.clear(); } void CGALCache::print() { PRINTB("CGAL Polyhedrons in cache: %d", this->cache.size()); PRINTB("CGAL cache size in bytes: %d", this->cache.totalCost()); } CGALCache::cache_entry::cache_entry(const shared_ptr &N) : N(N) { if (print_messages_stack.size() > 0) this->msg = print_messages_stack.back(); } openscad-2019.05/src/CGALCache.h0000644000076500000240000000144013432700636016474 0ustar kintelstaff00000000000000#pragma once #include "cache.h" #include "memory.h" /*! */ class CGALCache { public: CGALCache(size_t limit = 100*1024*1024); static CGALCache *instance() { if (!inst) inst = new CGALCache; return inst; } bool contains(const std::string &id) const { return this->cache.contains(id); } shared_ptr get(const std::string &id) const; bool insert(const std::string &id, const shared_ptr &N); size_t maxSizeMB() const; void setMaxSizeMB(size_t limit); void clear(); void print(); private: static CGALCache *inst; struct cache_entry { shared_ptr N; std::string msg; cache_entry(const shared_ptr &N); ~cache_entry() { } }; Cache cache; }; openscad-2019.05/src/CGALRenderer.cc0000644000076500000240000001156713402025764017407 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef _MSC_VER // Boost conflicts with MPFR under MSVC (google it) #include #endif // dxfdata.h must come first for Eigen SIMD alignment issues #include "dxfdata.h" #include "polyset.h" #include "polyset-utils.h" #include "printutils.h" #include "CGALRenderer.h" #include "CGAL_OGL_Polyhedron.h" #include "CGAL_Nef_polyhedron.h" #include "cgal.h" //#include "Preferences.h" CGALRenderer::CGALRenderer(shared_ptr geom) { if (auto ps = dynamic_pointer_cast(geom)) { assert(ps->getDimension() == 3); // We need to tessellate here, in case the generated PolySet contains concave polygons // See testdata/scad/3D/features/polyhedron-concave-test.scad auto ps_tri = new PolySet(3, ps->convexValue()); ps_tri->setConvexity(ps->getConvexity()); PolysetUtils::tessellate_faces(*ps, *ps_tri); this->polyset.reset(ps_tri); } else if (auto poly = dynamic_pointer_cast(geom)) { this->polyset.reset(poly->tessellate()); } else if (auto new_N = dynamic_pointer_cast(geom)) { assert(new_N->getDimension() == 3); if (!new_N->isEmpty()) { this->N = new_N; } } } CGALRenderer::~CGALRenderer() { } shared_ptr CGALRenderer::getPolyhedron() const { if (this->N && !this->polyhedron) buildPolyhedron(); return this->polyhedron; } void CGALRenderer::buildPolyhedron() const { PRINTD("buildPolyhedron"); this->polyhedron.reset(new CGAL_OGL_Polyhedron(*this->colorscheme)); CGAL::OGL::Nef3_Converter::convert_to_OGLPolyhedron(*this->N->p3, this->polyhedron.get()); // CGAL_NEF3_MARKED_FACET_COLOR <- CGAL_FACE_BACK_COLOR // CGAL_NEF3_UNMARKED_FACET_COLOR <- CGAL_FACE_FRONT_COLOR this->polyhedron->init(); PRINTD("buildPolyhedron() end"); } // Overridden from Renderer void CGALRenderer::setColorScheme(const ColorScheme &cs) { PRINTD("setColorScheme"); Renderer::setColorScheme(cs); this->polyhedron.reset(); // Mark as dirty PRINTD("setColorScheme done"); } void CGALRenderer::draw(bool showfaces, bool showedges) const { PRINTD("draw()"); if (this->polyset) { PRINTD("draw() polyset"); if (this->polyset->getDimension() == 2) { // Draw 2D polygons glDisable(GL_LIGHTING); // FIXME: const QColor &col = Preferences::inst()->color(Preferences::CGAL_FACE_2D_COLOR); glColor3f(0.0f, 0.75f, 0.60f); for (size_t i=0; i < this->polyset->polygons.size(); i++) { glBegin(GL_POLYGON); for (size_t j=0; j < this->polyset->polygons[i].size(); j++) { const auto &p = this->polyset->polygons[i][j]; glVertex3d(p[0], p[1], 0); } glEnd(); } // Draw 2D edges glDisable(GL_DEPTH_TEST); glLineWidth(2); // FIXME: const QColor &col2 = Preferences::inst()->color(Preferences::CGAL_EDGE_2D_COLOR); glColor3f(1.0f, 0.0f, 0.0f); this->polyset->render_edges(CSGMODE_NONE); glEnable(GL_DEPTH_TEST); } else { // Draw 3D polygons const Color4f c(-1,-1,-1,-1); setColor(ColorMode::MATERIAL, c.data(), nullptr); this->polyset->render_surface(CSGMODE_NORMAL, Transform3d::Identity(), nullptr); } } else { auto polyhedron = getPolyhedron(); if (polyhedron) { PRINTD("draw() polyhedron"); if (showfaces) polyhedron->set_style(SNC_BOUNDARY); else polyhedron->set_style(SNC_SKELETON); polyhedron->draw(showfaces && showedges); } } PRINTD("draw() end"); } BoundingBox CGALRenderer::getBoundingBox() const { BoundingBox bbox; if (this->polyset) { bbox = this->polyset->getBoundingBox(); } else { auto polyhedron = getPolyhedron(); if (polyhedron) { auto cgalbbox = polyhedron->bbox(); bbox = BoundingBox( Vector3d(cgalbbox.xmin(), cgalbbox.ymin(), cgalbbox.zmin()), Vector3d(cgalbbox.xmax(), cgalbbox.ymax(), cgalbbox.zmax())); } } return bbox; } openscad-2019.05/src/CGALRenderer.h0000644000076500000240000000112613402025764017237 0ustar kintelstaff00000000000000#pragma once #include "renderer.h" #include "CGAL_Nef_polyhedron.h" class CGALRenderer : public Renderer { public: CGALRenderer(shared_ptr geom); ~CGALRenderer(); void draw(bool showfaces, bool showedges) const override; void setColorScheme(const ColorScheme &cs) override; BoundingBox getBoundingBox() const override; private: shared_ptr getPolyhedron() const; void buildPolyhedron() const; mutable shared_ptr polyhedron; shared_ptr N; shared_ptr polyset; }; openscad-2019.05/src/CGAL_Nef_polyhedron.cc0000644000076500000240000001051413402025764020742 0ustar kintelstaff00000000000000#include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalutils.h" #include "printutils.h" #include "polyset.h" #include "svg.h" CGAL_Nef_polyhedron::CGAL_Nef_polyhedron(CGAL_Nef_polyhedron3 *p) { if (p) p3.reset(p); } // Copy constructor CGAL_Nef_polyhedron::CGAL_Nef_polyhedron(const CGAL_Nef_polyhedron &src) { if (src.p3) this->p3.reset(new CGAL_Nef_polyhedron3(*src.p3)); } CGAL_Nef_polyhedron& CGAL_Nef_polyhedron::operator+=(const CGAL_Nef_polyhedron &other) { (*this->p3) += (*other.p3); return *this; } CGAL_Nef_polyhedron& CGAL_Nef_polyhedron::operator*=(const CGAL_Nef_polyhedron &other) { (*this->p3) *= (*other.p3); return *this; } CGAL_Nef_polyhedron& CGAL_Nef_polyhedron::operator-=(const CGAL_Nef_polyhedron &other) { (*this->p3) -= (*other.p3); return *this; } CGAL_Nef_polyhedron &CGAL_Nef_polyhedron::minkowski(const CGAL_Nef_polyhedron &other) { (*this->p3) = CGAL::minkowski_sum_3(*this->p3, *other.p3); return *this; } size_t CGAL_Nef_polyhedron::memsize() const { if (this->isEmpty()) return 0; auto memsize = sizeof(CGAL_Nef_polyhedron); memsize += this->p3->bytes(); return memsize; } bool CGAL_Nef_polyhedron::isEmpty() const { return !this->p3 || this->p3->is_empty(); } /*! Creates a new PolySet and initializes it with the data from this polyhedron Note: Can return nullptr if an error occurred */ // FIXME: Deprecated by CGALUtils::createPolySetFromNefPolyhedron3 #if 0 PolySet *CGAL_Nef_polyhedron::convertToPolyset() const { if (this->isEmpty()) return new PolySet(3); PolySet *ps = nullptr; CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); ps = new PolySet(3); ps->setConvexity(this->convexity); bool err = true; std::string errmsg(""); CGAL_Polyhedron P; try { // Cast away constness: // convert_to_Polyhedron() wasn't const in earlier versions of CGAL. CGAL_Nef_polyhedron3 *nonconst_nef3 = const_cast(this->p3.get()); err = nefworkaround::convert_to_Polyhedron( *(nonconst_nef3), P ); //this->p3->convert_to_Polyhedron(P); } catch (const CGAL::Failure_exception &e) { err = true; errmsg = std::string(e.what()); } if (!err) err = CGALUtils::createPolySetFromPolyhedron(P, *ps); if (err) { PRINT("ERROR: CGAL NefPolyhedron->Polyhedron conversion failed."); if (errmsg!="") PRINTB("ERROR: %s",errmsg); delete ps; ps = nullptr; } CGAL::set_error_behaviour(old_behaviour); return ps; } #endif void CGAL_Nef_polyhedron::resize(const Vector3d &newsize, const Eigen::Matrix &autosize) { // Based on resize() in Giles Bathgate's RapCAD (but not exactly) if (this->isEmpty()) return; auto bb = CGALUtils::boundingBox(*this->p3); std::vector scale, bbox_size; for (unsigned int i=0;i<3;i++) { scale.push_back(NT3(1)); bbox_size.push_back(bb.max_coord(i) - bb.min_coord(i)); } int newsizemax_index = 0; for (unsigned int i=0;igetDimension();i++) { if (newsize[i]) { if (bbox_size[i] == NT3(0)) { PRINT("WARNING: Resize in direction normal to flat object is not implemented"); return; } else { scale[i] = NT3(newsize[i]) / bbox_size[i]; } if (newsize[i] > newsize[newsizemax_index]) newsizemax_index = i; } } auto autoscale = NT3(1); if (newsize[newsizemax_index] != 0) { autoscale = NT3(newsize[newsizemax_index]) / bbox_size[newsizemax_index]; } for (unsigned int i=0;igetDimension();i++) { if (autosize[i] && newsize[i]==0) scale[i] = autoscale; } Eigen::Matrix4d t; t << CGAL::to_double(scale[0]), 0, 0, 0, 0, CGAL::to_double(scale[1]), 0, 0, 0, 0, CGAL::to_double(scale[2]), 0, 0, 0, 0, 1; this->transform(Transform3d(t)); } std::string CGAL_Nef_polyhedron::dump() const { return OpenSCAD::dump_svg( *this->p3 ); } void CGAL_Nef_polyhedron::transform( const Transform3d &matrix ) { if (!this->isEmpty()) { if (matrix.matrix().determinant() == 0) { PRINT("WARNING: Scaling a 3D object with 0 - removing object"); this->reset(); } else { CGAL_Aff_transformation t( matrix(0,0), matrix(0,1), matrix(0,2), matrix(0,3), matrix(1,0), matrix(1,1), matrix(1,2), matrix(1,3), matrix(2,0), matrix(2,1), matrix(2,2), matrix(2,3), matrix(3,3)); this->p3->transform(t); } } } openscad-2019.05/src/CGAL_Nef_polyhedron.h0000644000076500000240000000252513402025764020607 0ustar kintelstaff00000000000000#pragma once #include "Geometry.h" #include "cgal.h" #include "memory.h" #include #include "linalg.h" class CGAL_Nef_polyhedron : public Geometry { public: CGAL_Nef_polyhedron(CGAL_Nef_polyhedron3 *p = nullptr); CGAL_Nef_polyhedron(const CGAL_Nef_polyhedron &src); ~CGAL_Nef_polyhedron() {} size_t memsize() const override; // FIXME: Implement, but we probably want a high-resolution BBox.. BoundingBox getBoundingBox() const override { assert(false && "not implemented"); return BoundingBox(); } std::string dump() const override; unsigned int getDimension() const override { return 3; } // Empty means it is a geometric node which has zero area/volume bool isEmpty() const override; Geometry *copy() const override { return new CGAL_Nef_polyhedron(*this); } void reset() { p3.reset(); } CGAL_Nef_polyhedron &operator+=(const CGAL_Nef_polyhedron &other); CGAL_Nef_polyhedron &operator*=(const CGAL_Nef_polyhedron &other); CGAL_Nef_polyhedron &operator-=(const CGAL_Nef_polyhedron &other); CGAL_Nef_polyhedron &minkowski(const CGAL_Nef_polyhedron &other); // FIXME: Deprecated by CGALUtils::createPolySetFromNefPolyhedron3 // class PolySet *convertToPolyset() const; void transform( const Transform3d &matrix ); void resize(const Vector3d &newsize, const Eigen::Matrix &autosize); shared_ptr p3; }; openscad-2019.05/src/CGAL_OGL_Polyhedron.h0000644000076500000240000001111613445047371020461 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #ifndef NULLGL #include "colormap.h" #include "rendersettings.h" #include "ext/CGAL/OGL_helper.h" #include "printutils.h" using CGAL::OGL::SNC_BOUNDARY; using CGAL::OGL::SNC_SKELETON; class CGAL_OGL_Polyhedron : public CGAL::OGL::Polyhedron { public: enum CGALColorIndex { MARKED_VERTEX_COLOR = 0, MARKED_EDGE_COLOR, MARKED_FACET_COLOR, UNMARKED_VERTEX_COLOR, UNMARKED_EDGE_COLOR, UNMARKED_FACET_COLOR, NUM_COLORS }; CGAL_OGL_Polyhedron(const ColorScheme &cs) { PRINTD("CGAL_OGL_Polyhedron()"); // Set default colors. setColor(CGALColorIndex::MARKED_VERTEX_COLOR,0xb7,0xe8,0x5c); setColor(CGALColorIndex::UNMARKED_VERTEX_COLOR,0xff,0xf6,0x7c); // Face and Edge colors are taken from default colorscheme setColorScheme(cs); PRINTD("CGAL_OGL_Polyhedron() end"); } void draw(bool showedges) const override { PRINTD("draw()"); if(this->style == SNC_BOUNDARY) { glCallList(this->object_list_+2); if(showedges) { glDisable(GL_LIGHTING); glCallList(this->object_list_+1); glCallList(this->object_list_); } } else { glDisable(GL_LIGHTING); glCallList(this->object_list_+1); glCallList(this->object_list_); } PRINTD("draw() end"); } // overrides function in OGL_helper.h CGAL::Color getVertexColor(Vertex_iterator v) const override { PRINTD("getVertexColor"); CGAL::Color c = v->mark() ? colors[CGALColorIndex::UNMARKED_VERTEX_COLOR] : colors[CGALColorIndex::MARKED_VERTEX_COLOR]; return c; } // overrides function in OGL_helper.h CGAL::Color getEdgeColor(Edge_iterator e) const override { PRINTD("getEdgeColor"); CGAL::Color c = e->mark() ? colors[CGALColorIndex::UNMARKED_EDGE_COLOR] : colors[CGALColorIndex::MARKED_EDGE_COLOR]; return c; } // overrides function in OGL_helper.h CGAL::Color getFacetColor(Halffacet_iterator f, bool /*is_back_facing*/) const override { PRINTD("getFacetColor"); CGAL::Color c = f->mark() ? colors[CGALColorIndex::UNMARKED_FACET_COLOR] : colors[CGALColorIndex::MARKED_FACET_COLOR]; return c; } void setColor(CGAL_OGL_Polyhedron::CGALColorIndex color_index, const Color4f &c) { PRINTDB("setColor %i %f %f %f",color_index%c[0]%c[1]%c[2]); this->colors[color_index] = CGAL::Color(c[0]*255,c[1]*255,c[2]*255); } void setColor(CGAL_OGL_Polyhedron::CGALColorIndex color_index, unsigned char r, unsigned char g, unsigned char b) { PRINTDB("setColor %i %i %i %i",color_index%r%g%b); this->colors[color_index] = CGAL::Color(r,g,b); } // set this->colors based on the given colorscheme. vertex colors // are not set here as colorscheme doesn't yet hold vertex colors. void setColorScheme(const ColorScheme &cs) { PRINTD("setColorScheme"); setColor(CGALColorIndex::MARKED_FACET_COLOR, ColorMap::getColor(cs, RenderColor::CGAL_FACE_BACK_COLOR)); setColor(CGALColorIndex::UNMARKED_FACET_COLOR, ColorMap::getColor(cs, RenderColor::CGAL_FACE_FRONT_COLOR)); setColor(CGALColorIndex::MARKED_EDGE_COLOR, ColorMap::getColor(cs, RenderColor::CGAL_EDGE_BACK_COLOR)); setColor(CGALColorIndex::UNMARKED_EDGE_COLOR, ColorMap::getColor(cs, RenderColor::CGAL_EDGE_FRONT_COLOR)); } private: CGAL::Color colors[CGALColorIndex::NUM_COLORS]; }; // CGAL_OGL_Polyhedron #else // NULLGL #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") class CGAL_OGL_Polyhedron { public: CGAL_OGL_Polyhedron() {} void draw(bool showedges) const {} CGAL::Bbox_3 bbox() const { return CGAL::Bbox_3(-1,-1,-1,1,1,1); } }; #endif // NULLGL openscad-2019.05/src/CSGTreeEvaluator.cc0000644000076500000240000002001113427162620020311 0ustar kintelstaff00000000000000#include "CSGTreeEvaluator.h" #include "state.h" #include "csgops.h" #include "module.h" #include "ModuleInstantiation.h" #include "csgnode.h" #include "transformnode.h" #include "colornode.h" #include "rendernode.h" #include "cgaladvnode.h" #include "printutils.h" #include "GeometryEvaluator.h" #include "polyset.h" #include "polyset-utils.h" #include #include #include #include #include /*! \class CSGTreeEvaluator A visitor responsible for creating a binary tree of CSGNode nodes used for rendering with OpenCSG. */ shared_ptr CSGTreeEvaluator::buildCSGTree(const AbstractNode &node) { this->traverse(node); shared_ptr t(this->stored_term[node.index()]); if (t) { if (t->isHighlight()) this->highlightNodes.push_back(t); if (t->isBackground()) { this->backgroundNodes.push_back(t); t.reset(); } } return this->rootNode = t; } void CSGTreeEvaluator::applyBackgroundAndHighlight(State & /*state*/, const AbstractNode &node) { for(const auto &chnode : this->visitedchildren[node.index()]) { shared_ptr t(this->stored_term[chnode->index()]); this->stored_term.erase(chnode->index()); if (t) { if (t->isBackground()) this->backgroundNodes.push_back(t); if (t->isHighlight()) this->highlightNodes.push_back(t); } } } void CSGTreeEvaluator::applyToChildren(State & /*state*/, const AbstractNode &node, OpenSCADOperator op) { shared_ptr t1; for(const auto &chnode : this->visitedchildren[node.index()]) { shared_ptr t2(this->stored_term[chnode->index()]); this->stored_term.erase(chnode->index()); if (t2 && !t1) { t1 = t2; } else if (t2 && t1) { shared_ptr t; // Handle background if (t1->isBackground() && // For difference, we inherit the flag from the positive object (t2->isBackground() || op == OpenSCADOperator::DIFFERENCE)) { t = CSGOperation::createCSGNode(op, t1, t2); t->setBackground(true); } // Background objects are simply moved to backgroundNodes else if (t2->isBackground()) { t = t1; this->backgroundNodes.push_back(t2); } else if (t1->isBackground()) { t = t2; this->backgroundNodes.push_back(t1); } else { t = CSGOperation::createCSGNode(op, t1, t2); } // Handle highlight switch (op) { case OpenSCADOperator::DIFFERENCE: if (t != t1 && t1->isHighlight()) { t->setHighlight(true); } else if (t != t2 && t2->isHighlight()) { this->highlightNodes.push_back(t2); } break; case OpenSCADOperator::INTERSECTION: if (t && t != t1 && t != t2 && t1->isHighlight() && t2->isHighlight()) { t->setHighlight(true); } else { if (t != t1 && t1->isHighlight()) { this->highlightNodes.push_back(t1); } if (t != t2 && t2->isHighlight()) { this->highlightNodes.push_back(t2); } } break; case OpenSCADOperator::UNION: if (t != t1 && t != t2 && t1->isHighlight() && t2->isHighlight()) { t->setHighlight(true); } else if (t != t1 && t1->isHighlight()) { this->highlightNodes.push_back(t1); t = t2; } else if (t != t2 && t2->isHighlight()) { this->highlightNodes.push_back(t2); t = t1; } break; case OpenSCADOperator::MINKOWSKI: case OpenSCADOperator::HULL: case OpenSCADOperator::RESIZE: break; } t1 = t; } } if (t1) { if (node.modinst->isBackground()) t1->setBackground(true); if (node.modinst->isHighlight()) t1->setHighlight(true); } this->stored_term[node.index()] = t1; } Response CSGTreeEvaluator::visit(State &state, const AbstractNode &node) { if (state.isPostfix()) { applyToChildren(state, node, OpenSCADOperator::UNION); addToParent(state, node); } return Response::ContinueTraversal; } Response CSGTreeEvaluator::visit(State &state, const AbstractIntersectionNode &node) { if (state.isPostfix()) { applyToChildren(state, node, OpenSCADOperator::INTERSECTION); addToParent(state, node); } return Response::ContinueTraversal; } shared_ptr CSGTreeEvaluator::evaluateCSGNodeFromGeometry( State &state, const shared_ptr &geom, const ModuleInstantiation *modinst, const AbstractNode &node) { // We cannot render Polygon2d directly, so we preprocess (tessellate) it here auto g = geom; if (!g->isEmpty()) { auto p2d = dynamic_pointer_cast(geom); if (p2d) { g.reset(p2d->tessellate()); } // 3D Polysets are tessellated before inserting into Geometry cache, inside GeometryEvaluator::evaluateGeometry } shared_ptr t(new CSGLeaf(g, state.matrix(), state.color(), STR(node.name() << node.index()))); if (modinst->isHighlight()) t->setHighlight(true); else if (modinst->isBackground()) t->setBackground(true); return t; } Response CSGTreeEvaluator::visit(State &state, const AbstractPolyNode &node) { if (state.isPostfix()) { shared_ptr t1; if (this->geomevaluator) { auto geom = this->geomevaluator->evaluateGeometry(node, false); if (geom) { t1 = evaluateCSGNodeFromGeometry(state, geom, node.modinst, node); } node.progress_report(); } this->stored_term[node.index()] = t1; addToParent(state, node); } return Response::ContinueTraversal; } Response CSGTreeEvaluator::visit(State &state, const CsgOpNode &node) { if (state.isPostfix()) { applyToChildren(state, node, node.type); addToParent(state, node); } return Response::ContinueTraversal; } Response CSGTreeEvaluator::visit(State &state, const TransformNode &node) { if (state.isPrefix()) { if (matrix_contains_infinity(node.matrix) || matrix_contains_nan(node.matrix)) { PRINT("WARNING: Transformation matrix contains Not-a-Number and/or Infinity - removing object."); return Response::PruneTraversal; } state.setMatrix(state.matrix() * node.matrix); } if (state.isPostfix()) { applyToChildren(state, node, OpenSCADOperator::UNION); addToParent(state, node); } return Response::ContinueTraversal; } Response CSGTreeEvaluator::visit(State &state, const ColorNode &node) { if (state.isPrefix()) { if (!state.color().isValid()) state.setColor(node.color); } if (state.isPostfix()) { applyToChildren(state, node, OpenSCADOperator::UNION); addToParent(state, node); } return Response::ContinueTraversal; } // FIXME: If we've got CGAL support, render this node as a CGAL union into a PolySet Response CSGTreeEvaluator::visit(State &state, const RenderNode &node) { if (state.isPostfix()) { shared_ptr t1; shared_ptr geom; if (this->geomevaluator) { geom = this->geomevaluator->evaluateGeometry(node, false); if (geom) { t1 = evaluateCSGNodeFromGeometry(state, geom, node.modinst, node); } node.progress_report(); } this->stored_term[node.index()] = t1; addToParent(state, node); } return Response::ContinueTraversal; } Response CSGTreeEvaluator::visit(State &state, const CgaladvNode &node) { if (state.isPostfix()) { shared_ptr t1; // FIXME: Calling evaluator directly since we're not a PolyNode. Generalize this. shared_ptr geom; if (this->geomevaluator) { geom = this->geomevaluator->evaluateGeometry(node, false); if (geom) { t1 = evaluateCSGNodeFromGeometry(state, geom, node.modinst, node); } node.progress_report(); } this->stored_term[node.index()] = t1; applyBackgroundAndHighlight(state, node); addToParent(state, node); } return Response::ContinueTraversal; } /*! Adds ourself to out parent's list of traversed children. Call this for _every_ node which affects output during traversal. Usually, this should be called from the postfix stage, but for some nodes, we defer traversal letting other components (e.g. CGAL) render the subgraph, and we'll then call this from prefix and prune further traversal. */ void CSGTreeEvaluator::addToParent(const State &state, const AbstractNode &node) { this->visitedchildren.erase(node.index()); if (state.parent()) { this->visitedchildren[state.parent()->index()].push_back(&node); } } openscad-2019.05/src/CSGTreeEvaluator.h0000644000076500000240000000422213402025764020161 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include "NodeVisitor.h" #include "memory.h" #include "csgnode.h" class CSGTreeEvaluator : public NodeVisitor { public: CSGTreeEvaluator(const class Tree &tree, class GeometryEvaluator *geomevaluator = nullptr) : tree(tree), geomevaluator(geomevaluator) { } ~CSGTreeEvaluator() {} Response visit(State &state, const class AbstractNode &node) override; Response visit(State &state, const class AbstractIntersectionNode &node) override; Response visit(State &state, const class AbstractPolyNode &node) override; Response visit(State &state, const class CsgOpNode &node) override; Response visit(State &state, const class TransformNode &node) override; Response visit(State &state, const class ColorNode &node) override; Response visit(State &state, const class RenderNode &node) override; Response visit(State &state, const class CgaladvNode &node) override; shared_ptr buildCSGTree(const AbstractNode &node); const shared_ptr &getRootNode() const { return this->rootNode; } const std::vector> &getHighlightNodes() const { return this->highlightNodes; } const std::vector> &getBackgroundNodes() const { return this->backgroundNodes; } private: void addToParent(const State &state, const AbstractNode &node); void applyToChildren(State &state, const AbstractNode &node, OpenSCADOperator op); shared_ptr evaluateCSGNodeFromGeometry(State &state, const shared_ptr &geom, const class ModuleInstantiation *modinst, const AbstractNode &node); void applyBackgroundAndHighlight(State &state, const AbstractNode &node); typedef std::list ChildList; std::map visitedchildren; protected: const Tree &tree; class GeometryEvaluator *geomevaluator; shared_ptr rootNode; std::vector> highlightNodes; std::vector> backgroundNodes; std::map> stored_term; // The term evaluated from each node index }; openscad-2019.05/src/CSGTreeNormalizer.cc0000644000076500000240000002233413452415427020507 0ustar kintelstaff00000000000000#include #include "CSGTreeNormalizer.h" #include "csgnode.h" #include "printutils.h" // Helper function to debug normalization bugs #if 0 static bool validate_tree(const shared_ptr &node) { if (node->getType() == OpenSCADOperator::PRIMITIVE) return true; if (!node->left() || !node->right()) return false; if (!validate_tree(node->left())) return false; if (!validate_tree(node->right())) return false; return true; } #endif /*! NB! for e.g. empty intersections, this can normalize a tree to nothing and return nullptr. */ shared_ptr CSGTreeNormalizer::normalize(const shared_ptr &root) { this->aborted = false; this->nodecount = 0; shared_ptr temp = root; temp = normalizePass(temp); this->rootnode.reset(); return temp; } /*! After aborting, a subtree might have become invalidated (nullptr child node) since terms can be instantiated multiple times. This will search for nullptr children an recursively repair the corresponding subtree. */ shared_ptr CSGTreeNormalizer::cleanup_term(shared_ptr &t) { if (shared_ptr op = dynamic_pointer_cast(t)) { if (op->left()) op->left() = cleanup_term(op->left()); if (op->right()) op->right() = cleanup_term(op->right()); return collapse_null_terms(op); } return t; } static bool isUnion(shared_ptr node) { shared_ptr op = dynamic_pointer_cast(node); return op && op->getType() == OpenSCADOperator::UNION; } static bool hasRightNonLeaf(shared_ptr node) { shared_ptr op = dynamic_pointer_cast(node); return op->right() && (dynamic_pointer_cast(op->right()) == nullptr); } static bool hasLeftUnion(shared_ptr node) { shared_ptr op = dynamic_pointer_cast(node); return op && isUnion(op->left()); } shared_ptr CSGTreeNormalizer::normalizePass(shared_ptr node) { // This function implements the CSG normalization // Reference: // Goldfeather, J., Molnar, S., Turk, G., and Fuchs, H. Near // Realtime CSG Rendering Using Tree Normalization and Geometric // Pruning. IEEE Computer Graphics and Applications, 9(3):20-28, // 1989. // http://www.cc.gatech.edu/~turk/my_papers/pxpl_csg.pdf // Iterative tree traversal used to workaround stack limits for very large inputs. // This uses dreaded goto calls but is easily verifiable to be // functionally equivalent to the original recursive function, // compared to the previous attempt. // See Issue #2883 for problem with previous iterative implementation // See Pull Request #2343 for the initial reasons for making this not recursive. // stores current node and bool indicating if it was a left or right call; typedef std::pair, bool> stackframe_t; std::stack callstack; entrypoint: if (dynamic_pointer_cast(node)) goto return_node; do { while (node && match_and_replace(node)) { } this->nodecount++; if (nodecount > this->limit) { PRINTB("WARNING: Normalized tree is growing past %d elements. Aborting normalization.\n", this->limit); this->aborted = true; return shared_ptr(); } if (!node || dynamic_pointer_cast(node)) goto return_node; goto normalize_left_if_op; cont_left: ; } while (!this->aborted && !isUnion(node) && (hasRightNonLeaf(node) || hasLeftUnion(node))); if (!this->aborted) { goto normalize_right; cont_right: ; } // FIXME: Do we need to take into account any transformation of item here? node = collapse_null_terms(node); if (this->aborted) { if (node) node = cleanup_term(node); } return_node: if (callstack.empty()) { return node; } else { stackframe_t frame = callstack.top(); callstack.pop(); if (frame.second) { // came from a left call frame.first->left() = node; node = frame.first; goto cont_left; } else { // came from a right call frame.first->right() = node; node = frame.first; goto cont_right; } } normalize_left_if_op: if (shared_ptr op = dynamic_pointer_cast(node)) { callstack.emplace(op, true); node = op->left(); goto entrypoint; } goto cont_left; normalize_right: shared_ptr op = dynamic_pointer_cast(node); assert(op); callstack.emplace(op, false); node = op->right(); goto entrypoint; } shared_ptr CSGTreeNormalizer::collapse_null_terms(const shared_ptr &node) { shared_ptr op = dynamic_pointer_cast(node); if (op) { if (!op->right()) { this->nodecount--; if (op->getType() == OpenSCADOperator::UNION || op->getType() == OpenSCADOperator::DIFFERENCE) return op->left(); else return op->right(); } if (!op->left()) { this->nodecount--; if (op->getType() == OpenSCADOperator::UNION) return op->right(); else return op->left(); } } return node; } bool CSGTreeNormalizer::match_and_replace(shared_ptr &node) { shared_ptr op = dynamic_pointer_cast(node); if (!op) return false; if (op->getType() == OpenSCADOperator::UNION) return false; // Part A: The 'x . (y . z)' expressions shared_ptr rightop = dynamic_pointer_cast(op->right()); if (rightop) { shared_ptr x = op->left(); shared_ptr y = rightop->left(); shared_ptr z = rightop->right(); // 1. x - (y + z) -> (x - y) - z if (op->getType() == OpenSCADOperator::DIFFERENCE && rightop->getType() == OpenSCADOperator::UNION) { node = CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, x, y), z); return true; } // 2. x * (y + z) -> (x * y) + (x * z) else if (op->getType() == OpenSCADOperator::INTERSECTION && rightop->getType() == OpenSCADOperator::UNION) { node = CSGOperation::createCSGNode(OpenSCADOperator::UNION, CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, y), CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, z)); return true; } // 3. x - (y * z) -> (x - y) + (x - z) else if (op->getType() == OpenSCADOperator::DIFFERENCE && rightop->getType() == OpenSCADOperator::INTERSECTION) { node = CSGOperation::createCSGNode(OpenSCADOperator::UNION, CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, x, y), CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, x, z)); return true; } // 4. x * (y * z) -> (x * y) * z else if (op->getType() == OpenSCADOperator::INTERSECTION && rightop->getType() == OpenSCADOperator::INTERSECTION) { node = CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, y), z); return true; } // 5. x - (y - z) -> (x - y) + (x * z) else if (op->getType() == OpenSCADOperator::DIFFERENCE && rightop->getType() == OpenSCADOperator::DIFFERENCE) { node = CSGOperation::createCSGNode(OpenSCADOperator::UNION, CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, x, y), CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, z)); return true; } // 6. x * (y - z) -> (x * y) - z else if (op->getType() == OpenSCADOperator::INTERSECTION && rightop->getType() == OpenSCADOperator::DIFFERENCE) { node = CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, y), z); return true; } } shared_ptr leftop = dynamic_pointer_cast(op->left()); if (leftop) { // Part B: The '(x . y) . z' expressions shared_ptr x = leftop->left(); shared_ptr y = leftop->right(); shared_ptr z = op->right(); // 7. (x - y) * z -> (x * z) - y if (leftop->getType() == OpenSCADOperator::DIFFERENCE && op->getType() == OpenSCADOperator::INTERSECTION) { node = CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, z), y); return true; } // 8. (x + y) - z -> (x - z) + (y - z) else if (leftop->getType() == OpenSCADOperator::UNION && op->getType() == OpenSCADOperator::DIFFERENCE) { node = CSGOperation::createCSGNode(OpenSCADOperator::UNION, CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, x, z), CSGOperation::createCSGNode(OpenSCADOperator::DIFFERENCE, y, z)); return true; } // 9. (x + y) * z -> (x * z) + (y * z) else if (leftop->getType() == OpenSCADOperator::UNION && op->getType() == OpenSCADOperator::INTERSECTION) { node = CSGOperation::createCSGNode(OpenSCADOperator::UNION, CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, x, z), CSGOperation::createCSGNode(OpenSCADOperator::INTERSECTION, y, z)); return true; } } return false; } // Counts all non-leaf nodes unsigned int CSGTreeNormalizer::count(const shared_ptr &node) const { if (shared_ptr op = dynamic_pointer_cast(node)) { return 1 + count(op->left()) + count(op->right()); } return 0; } openscad-2019.05/src/CSGTreeNormalizer.h0000644000076500000240000000122613402025764020342 0ustar kintelstaff00000000000000#pragma once #include "memory.h" class CSGTreeNormalizer { public: CSGTreeNormalizer(size_t limit) : aborted(false), limit(limit), nodecount(0) {} ~CSGTreeNormalizer() {} shared_ptr normalize(const shared_ptr &term); private: shared_ptr normalizePass(shared_ptr term) ; bool match_and_replace(shared_ptr &term); shared_ptr collapse_null_terms(const shared_ptr &term); shared_ptr cleanup_term(shared_ptr &t); unsigned int count(const shared_ptr &term) const; bool aborted; size_t limit; size_t nodecount; shared_ptr rootnode; }; openscad-2019.05/src/Camera.cc0000644000076500000240000000634013441031431016362 0ustar kintelstaff00000000000000#include "Camera.h" #include "rendersettings.h" #include "printutils.h" #include "degree_trig.h" static const double DEFAULT_DISTANCE = 140.0; Camera::Camera() : projection(ProjectionType::PERSPECTIVE), fov(22.5), viewall(false), autocenter(false) { PRINTD("Camera()"); // gimbal cam values resetView(); pixel_width = RenderSettings::inst()->img_width; pixel_height = RenderSettings::inst()->img_height; } void Camera::setup(std::vector params) { if (params.size() == 7) { setVpt(params[0], params[1], params[2]); setVpr(params[3], params[4], params[5]); viewer_distance = params[6]; } else if (params.size() == 6) { const Eigen::Vector3d eye(params[0], params[1], params[2]); const Eigen::Vector3d center(params[3], params[4], params[5]); object_trans = -center; auto dir = center - eye; viewer_distance = dir.norm(); object_rot.z() = (!dir[1] && !dir[0]) ? dir[2] < 0 ? 0 : 180 : -atan2_degrees(dir[1], dir[0]) + 90; object_rot.y() = 0; Eigen::Vector3d projection(dir[0], dir[1], 0); object_rot.x() = -atan2_degrees(dir[2], projection.norm()); } else { assert("Gimbal cam needs 7 numbers, Vector camera needs 6"); } } /*! Moves camera so that the given bbox is fully visible. */ void Camera::viewAll(const BoundingBox &bbox) { if (bbox.isEmpty()) { setVpt(0, 0, 0); setVpd(DEFAULT_DISTANCE); } else { if (this->autocenter) { // autocenter = point camera at the center of the bounding box. this->object_trans = -bbox.center(); } double bboxRadius = bbox.diagonal().norm() / 2; double radius = (bbox.center() + object_trans).norm() + bboxRadius; this->viewer_distance = radius / sin_degrees(this->fov / 2); PRINTDB("modified obj trans x y z %f %f %f",object_trans.x() % object_trans.y() % object_trans.z()); PRINTDB("modified obj rot x y z %f %f %f",object_rot.x() % object_rot.y() % object_rot.z()); } } void Camera::zoom(int zoom, bool relative) { if (relative) { this->viewer_distance *= pow(0.9, zoom / 120.0); } else { this->viewer_distance = zoom; } } void Camera::setProjection(ProjectionType type) { this->projection = type; } void Camera::resetView() { setVpr(55, 0, 25); // set in user space units setVpt(0, 0, 0); setVpd(DEFAULT_DISTANCE); } Eigen::Vector3d Camera::getVpt() const { return -object_trans; } void Camera::setVpt(double x, double y, double z) { object_trans << -x, -y, -z; } static double wrap(double angle) { return fmod(360.0 + angle, 360.0); // force angle to be 0-360 } Eigen::Vector3d Camera::getVpr() const { return Eigen::Vector3d(wrap(90 -object_rot.x()), wrap(-object_rot.y()), wrap(-object_rot.z())); } void Camera::setVpr(double x, double y, double z) { object_rot << wrap(90 - x), wrap(-y), wrap(-z); } void Camera::setVpd(double d) { viewer_distance = d; } double Camera::zoomValue() const { return viewer_distance; } std::string Camera::statusText() const { const auto vpt = getVpt(); const auto vpr = getVpr(); boost::format fmt(_("Viewport: translate = [ %.2f %.2f %.2f ], rotate = [ %.2f %.2f %.2f ], distance = %.2f")); fmt % vpt.x() % vpt.y() % vpt.z() % vpr.x() % vpr.y() % vpr.z() % viewer_distance; return fmt.str(); } openscad-2019.05/src/Camera.h0000644000076500000240000000312513402025764016233 0ustar kintelstaff00000000000000#pragma once /* Camera For usage, see QGLView.cc, GLView.cc, export_png.cc, openscad.cc There are two different types of cameras represented in this class: *Gimbal camera - uses Euler Angles, object translation, and viewer distance *Vector camera - uses 'eye', 'center', and 'up' vectors ('lookat' style) They are not necessarily kept in sync. There are two modes of projection, Perspective and Orthogonal. */ #include "linalg.h" #include #include class Camera { public: enum class ProjectionType { ORTHOGONAL, PERSPECTIVE } projection; Camera(); void setup(std::vector params); void gimbalDefaultTranslate(); void setProjection(ProjectionType type); void zoom(int delta, bool relative); double zoomValue() const; void resetView(); void viewAll(const BoundingBox &bbox); std::string statusText() const; // accessors to get and set camera settings in the user space format (different for historical reasons) Eigen::Vector3d getVpt() const; void setVpt(double x, double y, double z); Eigen::Vector3d getVpr() const; void setVpr(double x, double y, double z); void setVpd(double d); // Gimbalcam Eigen::Vector3d object_trans; Eigen::Vector3d object_rot; // Perspective settings double fov; // Field of view // true if camera should try to view everything in a given // bounding box. bool viewall; // true if camera should point at center of bounding box // (normally it points at 0,0,0 or at given coordinates) bool autocenter; unsigned int pixel_width; unsigned int pixel_height; protected: // Perspective settings double viewer_distance; }; openscad-2019.05/src/CocoaUtils.h0000644000076500000240000000025013402025764017104 0ustar kintelstaff00000000000000#pragma once #include class CocoaUtils { public: static void endApplication(); static void nslog(const std::string &str, void *userdata); }; openscad-2019.05/src/CocoaUtils.mm0000644000076500000240000000053213402025764017271 0ustar kintelstaff00000000000000#include "CocoaUtils.h" #import void CocoaUtils::endApplication() { [[NSNotificationCenter defaultCenter] postNotificationName:@"NSApplicationWillTerminateNotification" object:nil]; } void CocoaUtils::nslog(const std::string &str, void * /* userdata */) { NSLog(@"%s", str.c_str()); } openscad-2019.05/src/Console.cc0000644000076500000240000000467613423115164016614 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "Console.h" #include "printutils.h" Console::Console(QWidget *parent) : QPlainTextEdit(parent) { setupUi(this); connect(this->actionClear, SIGNAL(triggered()), this, SLOT(actionClearConsole_triggered())); connect(this->actionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs_triggered())); } Console::~Console() { } void Console::actionClearConsole_triggered() { this->document()->clear(); } void Console::actionSaveAs_triggered() { const auto& text = this->document()->toPlainText(); const auto fileName = QFileDialog::getSaveFileName(this, _("Save console content")); QFile file(fileName); if (file.open(QIODevice::ReadWrite)) { QTextStream stream(&file); stream << text; stream.flush(); PRINTB("Console content saved to '%s'.", fileName.toStdString()); } } void Console::contextMenuEvent(QContextMenuEvent *event) { // Clear leaves characterCount() at 1, not 0 const bool hasContent = this->document()->characterCount() > 1; this->actionClear->setEnabled(hasContent); this->actionSaveAs->setEnabled(hasContent); QMenu *menu = createStandardContextMenu(); menu->insertAction(menu->actions().at(0), this->actionClear); menu->addSeparator(); menu->addAction(this->actionSaveAs); menu->exec(event->globalPos()); delete menu; } openscad-2019.05/src/Console.h0000644000076500000240000000277313423115164016452 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include "qtgettext.h" #include "ui_Console.h" class Console : public QPlainTextEdit, public Ui::Console { Q_OBJECT public: Console(QWidget *parent = nullptr); virtual ~Console(); void contextMenuEvent(QContextMenuEvent *event) override; public slots: void actionClearConsole_triggered(); void actionSaveAs_triggered(); }; openscad-2019.05/src/Console.ui0000644000076500000240000000130713417146620016634 0ustar kintelstaff00000000000000 Console 0 0 400 300 Clear Clear console Save As Save console content to file openscad-2019.05/src/CsgInfo.h0000644000076500000240000000421413402025764016373 0ustar kintelstaff00000000000000#pragma once #include "csgnode.h" #include "Tree.h" #include "GeometryEvaluator.h" #include "CSGTreeEvaluator.h" #include "CSGTreeNormalizer.h" #include "rendersettings.h" #include "printutils.h" /* Small helper class for compiling and normalizing node trees into CSG products */ class CsgInfo { public: CsgInfo() {} shared_ptr root_products; shared_ptr highlights_products; shared_ptr background_products; bool compile_products(const Tree &tree) { const AbstractNode *root_node = tree.root(); GeometryEvaluator geomevaluator(tree); CSGTreeEvaluator evaluator(tree, &geomevaluator); shared_ptr csgRoot = evaluator.buildCSGTree(*root_node); std::vector > highlightNodes = evaluator.getHighlightNodes(); std::vector > backgroundNodes = evaluator.getBackgroundNodes(); PRINT("Compiling design (CSG Products normalization)..."); CSGTreeNormalizer normalizer(RenderSettings::inst()->openCSGTermLimit); if (csgRoot) { shared_ptr normalizedRoot = normalizer.normalize(csgRoot); if (normalizedRoot) { this->root_products.reset(new CSGProducts()); this->root_products->import(normalizedRoot); PRINTB("Normalized CSG tree has %d elements", int(this->root_products->size())); } else { this->root_products.reset(); PRINT("WARNING: CSG normalization resulted in an empty tree"); } } if (highlightNodes.size() > 0) { PRINTB("Compiling highlights (%i CSG Trees)...", highlightNodes.size() ); this->highlights_products.reset(new CSGProducts()); for (unsigned int i = 0; i < highlightNodes.size(); i++) { highlightNodes[i] = normalizer.normalize(highlightNodes[i]); this->highlights_products->import(highlightNodes[i]); } } if (backgroundNodes.size() > 0) { PRINTB("Compiling background (%i CSG Trees)...", backgroundNodes.size()); this->background_products.reset(new CSGProducts()); for (unsigned int i = 0; i < backgroundNodes.size(); i++) { backgroundNodes[i] = normalizer.normalize(backgroundNodes[i]); this->background_products->import(backgroundNodes[i]); } } return true; } }; openscad-2019.05/src/Dock.cc0000644000076500000240000000116613402025764016064 0ustar kintelstaff00000000000000#include #include "QSettingsCached.h" #include "Dock.h" Dock::Dock(QWidget *parent) : QDockWidget(parent), action(nullptr), updateSettings(true) { } Dock::~Dock() { } void Dock::disableSettingsUpdate() { updateSettings = false; } void Dock::setVisible(bool visible) { if (updateSettings) { QSettingsCached settings; settings.setValue(configKey, !visible); } if (action != nullptr) { action->setChecked(!visible); } QDockWidget::setVisible(visible); } void Dock::setConfigKey(const QString configKey) { this->configKey = configKey; } void Dock::setAction(QAction *action) { this->action = action; } openscad-2019.05/src/Dock.h0000644000076500000240000000071613402025764015726 0ustar kintelstaff00000000000000#pragma once #include #include #include class Dock : public QDockWidget { Q_OBJECT public: Dock(QWidget *parent = nullptr); ~Dock(); void setConfigKey(const QString configKey); void setAction(QAction *action); void disableSettingsUpdate(); public slots: void setVisible(bool visible) override; private: QString configKey; QAction *action; bool updateSettings; }; openscad-2019.05/src/DrawingCallback.cc0000644000076500000240000000635113441031431020204 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "Polygon2d.h" #include "DrawingCallback.h" DrawingCallback::DrawingCallback(unsigned long fn) : pen(Vector2d(0, 0)), offset(Vector2d(0, 0)), advance(Vector2d(0, 0)), fn(fn), polygon(nullptr) { } DrawingCallback::~DrawingCallback() { } void DrawingCallback::start_glyph() { this->polygon = new Polygon2d(); this->polygon->setSanitized(true); } void DrawingCallback::finish_glyph() { if (this->outline.vertices.size() > 0) { this->polygon->addOutline(this->outline); this->outline.vertices.clear(); } if (this->polygon->outlines().size() == 0) { delete this->polygon; this->polygon = nullptr; } if (this->polygon) this->polygons.push_back(this->polygon); } std::vector DrawingCallback::get_result() { return this->polygons; } void DrawingCallback::set_glyph_offset(double offset_x, double offset_y) { offset = Vector2d(offset_x, offset_y); } void DrawingCallback::add_glyph_advance(double advance_x, double advance_y) { advance += Vector2d(advance_x, advance_y); } void DrawingCallback::add_vertex(const Vector2d &v) { this->outline.vertices.push_back(v + offset + advance); } void DrawingCallback::move_to(const Vector2d &to) { if (this->outline.vertices.size() > 0) { this->polygon->addOutline(this->outline); this->outline.vertices.clear(); } add_vertex(to); pen = to; } void DrawingCallback::line_to(const Vector2d &to) { add_vertex(to); pen = to; } // Quadric Bezier curve void DrawingCallback::curve_to(const Vector2d &c1, const Vector2d &to) { for (unsigned long idx = 1;idx <= fn;idx++) { const double a = idx * (1.0 / (double)fn); add_vertex(pen * pow(1-a, 2) + c1 * 2 * pow(1-a, 1) * a + to * pow(a, 2)); } pen = to; } // Cubic Bezier curve void DrawingCallback::curve_to(const Vector2d &c1, const Vector2d &c2, const Vector2d &to) { for (unsigned long idx = 1;idx <= fn;idx++) { const double a = idx * (1.0 / (double)fn); add_vertex(pen * pow(1-a, 3) + c1 * 3 * pow(1-a, 2) * a + c2 * 3 * pow(1-a, 1) * pow(a, 2) + to * pow(a, 3)); } pen = to; } openscad-2019.05/src/DrawingCallback.h0000644000076500000240000000375413441031431020052 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include #include "Polygon2d.h" class DrawingCallback { public: DrawingCallback(unsigned long fn); virtual ~DrawingCallback(); void start_glyph(); void finish_glyph(); void set_glyph_offset(double offset_x, double offset_y); void add_glyph_advance(double advance_x, double advance_y); std::vector get_result(); void move_to(const Vector2d &to); void line_to(const Vector2d &to); void curve_to(const Vector2d &c1, const Vector2d &to); void curve_to(const Vector2d &c1, const Vector2d &c2, const Vector2d &to); private: Vector2d pen; Vector2d offset; Vector2d advance; unsigned long fn; Outline2d outline; class Polygon2d *polygon; std::vector polygons; void add_vertex(const Vector2d &v); }; openscad-2019.05/src/EventFilter.h0000644000076500000240000000170313402025764017272 0ustar kintelstaff00000000000000#pragma once #include #include #include "OpenSCADApp.h" #include "launchingscreen.h" class SCADEventFilter : public QObject { Q_OBJECT; public: SCADEventFilter(QObject *parent) : QObject(parent) {} protected: bool eventFilter(QObject *obj, QEvent *event) override { // Handle Apple event for opening files, only available on OS X if (event->type() == QEvent::FileOpen) { QFileOpenEvent *foe = static_cast(event); const QString &filename = foe->file(); if (LaunchingScreen *ls = LaunchingScreen::getDialog()) { // We need to invoke the method since, apparently, we receive // this event in another thread. QMetaObject::invokeMethod(ls, "openFile", Qt::QueuedConnection, Q_ARG(QString, filename)); } else { scadApp->requestOpenFile(filename); } return true; } else { // standard event processing return QObject::eventFilter(obj, event); } } }; openscad-2019.05/src/FileModule.cc0000644000076500000240000001343713435353202017232 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "FileModule.h" #include "ModuleCache.h" #include "node.h" #include "printutils.h" #include "exceptions.h" #include "modcontext.h" #include "parsersettings.h" #include "StatCache.h" #include "evalcontext.h" #include #include #include "boost-utils.h" namespace fs = boost::filesystem; #include "FontCache.h" #include FileModule::FileModule(const std::string &path, const std::string &filename) : ASTNode(Location::NONE), is_handling_dependencies(false), path(path), filename(filename) { } FileModule::~FileModule() { } void FileModule::print(std::ostream &stream, const std::string &indent) const { scope.print(stream, indent); } void FileModule::registerUse(const std::string path) { auto ext = fs::path(path).extension().generic_string(); if (boost::iequals(ext, ".otf") || boost::iequals(ext, ".ttf")) { if (fs::is_regular(path)) { FontCache::instance()->register_font_file(path); } else { PRINTB("ERROR: Can't read font with path '%s'", path); } } else { usedlibs.insert(path); } } void FileModule::registerInclude(const std::string &localpath, const std::string &fullpath) { this->includes[localpath] = {fullpath}; } time_t FileModule::includesChanged() const { time_t latest = 0; for (const auto &item : this->includes) { auto mtime = include_modified(item.second); if (mtime > latest) latest = mtime; } return latest; } time_t FileModule::include_modified(const IncludeFile &inc) const { struct stat st; if (StatCache::stat(inc.filename.c_str(), st) == 0) { return st.st_mtime; } return 0; } /*! Check if any dependencies have been modified and recompile them. Returns true if anything was recompiled. */ time_t FileModule::handleDependencies(bool is_root) { if(is_root) ModuleCache::clear_markers(); else if (this->is_handling_dependencies) return 0; this->is_handling_dependencies = true; std::vector> updates; // If a lib in usedlibs was previously missing, we need to relocate it // by searching the applicable paths. We can identify a previously missing module // as it will have a relative path. time_t latest = 0; for (auto filename : this->usedlibs) { auto found = true; // Get an absolute filename for the module if (!fs::path(filename).is_absolute()) { auto fullpath = find_valid_path(this->path, filename); if (!fullpath.empty()) { auto newfilename = fullpath.generic_string(); updates.emplace_back(filename, newfilename); filename = newfilename; } else { found = false; } } if (found) { auto oldmodule = ModuleCache::instance()->lookup(filename); FileModule *newmodule; auto mtime = ModuleCache::instance()->evaluate(this->getFullpath(),filename, newmodule); if (mtime > latest) latest = mtime; auto changed = newmodule && newmodule != oldmodule; // Detect appearance but not removal of files, and keep old module // on compile errors (FIXME: Is this correct behavior?) if (changed) { PRINTDB(" %s: %p -> %p", filename % oldmodule % newmodule); } else { PRINTDB(" %s: %p", filename % oldmodule); } } } // Relative filenames which were located are reinserted as absolute filenames for (const auto &files : updates) { this->usedlibs.erase(files.first); this->usedlibs.insert(files.second); } return latest; } AbstractNode *FileModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { assert(evalctx == nullptr); FileContext context(ctx); return this->instantiateWithFileContext(&context, inst, evalctx); } AbstractNode *FileModule::instantiateWithFileContext(FileContext *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { assert(evalctx == nullptr); auto node = new RootNode(inst); try { ctx->initializeModule(*this); // May throw an ExperimentalFeatureException // FIXME: Set document path to the path of the module auto instantiatednodes = this->scope.instantiateChildren(ctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } catch (EvaluationException &e) { //PRINT(e.what()); //please output the message before throwing the exception } return node; } //please preferably use getFilename //if you compare filenames (which is the origin of this methode), //please call getFilename first and use this methode only as a fallback const std::string FileModule::getFullpath() const { if(fs::path(this->filename).is_absolute()){ return this->filename; }else if(!this->path.empty()){ return (fs::path(this->path) / fs::path(this->filename)).generic_string(); }else{ return ""; } } openscad-2019.05/src/FileModule.h0000644000076500000240000000352513435353202017071 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include "module.h" #include "value.h" #include "localscope.h" class FileModule : public AbstractModule, public ASTNode { public: FileModule(const std::string &path, const std::string &filename); ~FileModule(); AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx = nullptr) const override; void print(std::ostream &stream, const std::string &indent) const override; AbstractNode *instantiateWithFileContext(class FileContext *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const; void setModulePath(const std::string &path) { this->path = path; } const std::string &modulePath() const { return this->path; } void registerUse(const std::string path); void registerInclude(const std::string &localpath, const std::string &fullpath); std::time_t includesChanged() const; std::time_t handleDependencies(bool is_root = true); bool hasIncludes() const { return !this->includes.empty(); } bool usesLibraries() const { return !this->usedlibs.empty(); } bool isHandlingDependencies() const { return this->is_handling_dependencies; } void clearHandlingDependencies() { this->is_handling_dependencies = false; } void setFilename(const std::string &filename) { this->filename = filename; } const std::string &getFilename() const { return this->filename; } const std::string getFullpath() const; LocalScope scope; typedef std::unordered_set ModuleContainer; ModuleContainer usedlibs; private: struct IncludeFile { std::string filename; }; std::time_t include_modified(const IncludeFile &inc) const; typedef std::unordered_map IncludeContainer; IncludeContainer includes; bool is_handling_dependencies; std::string path; std::string filename; }; openscad-2019.05/src/FontCache.cc0000644000076500000240000003106513441031431017026 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "boosty.h" #include "FontCache.h" #include "PlatformUtils.h" #include "parsersettings.h" extern std::vector librarypath; std::vector fontpath; namespace fs = boost::filesystem; const std::string get_fontconfig_version() { const unsigned int version = FcGetVersion(); const OpenSCAD::library_version_number header_version{FC_MAJOR, FC_MINOR, FC_REVISION}; const OpenSCAD::library_version_number runtime_version{version / 10000, (version / 100) % 100, version % 100}; return OpenSCAD::get_version_string(header_version, runtime_version); } const std::string get_harfbuzz_version() { unsigned int major, minor, micro; hb_version(&major, &minor, µ); const OpenSCAD::library_version_number header_version{HB_VERSION_MAJOR, HB_VERSION_MINOR, HB_VERSION_MICRO}; const OpenSCAD::library_version_number runtime_version{major, minor, micro}; return OpenSCAD::get_version_string(header_version, runtime_version); } const std::string get_freetype_version() { return FontCache::instance()->get_freetype_version(); } FontInfo::FontInfo(const std::string &family, const std::string &style, const std::string &file) : family(family), style(style), file(file) { } FontInfo::~FontInfo() { } bool FontInfo::operator<(const FontInfo &rhs) const { if (family < rhs.family) { return true; } if (style < rhs.style) { return true; } return file < rhs.file; } const std::string &FontInfo::get_family() const { return family; } const std::string &FontInfo::get_style() const { return style; } const std::string &FontInfo::get_file() const { return file; } FontCache * FontCache::self = nullptr; FontCache::InitHandlerFunc *FontCache::cb_handler = FontCache::defaultInitHandler; void *FontCache::cb_userdata = nullptr; const std::string FontCache::DEFAULT_FONT("Liberation Sans:style=Regular"); /** * Default implementation for the font cache initialization. In case no other * handler is registered, the cache build is just called synchronously in the * current thread by this handler. */ void FontCache::defaultInitHandler(FontCacheInitializer *initializer, void *) { initializer->run(); } FontCache::FontCache() { this->init_ok = false; this->library = nullptr; // If we've got a bundled fonts.conf, initialize fontconfig with our own config // by overriding the built-in fontconfig path. // For system installs and dev environments, we leave this alone fs::path fontdir(PlatformUtils::resourcePath("fonts")); if (fs::is_regular_file(fontdir / "fonts.conf")) { PlatformUtils::setenv("FONTCONFIG_PATH", (fs::absolute(fontdir).generic_string()).c_str(), 0); } // Just load the configs. We'll build the fonts once all configs are loaded this->config = FcInitLoadConfig(); if (!this->config) { PRINT("FONT-WARNING: Can't initialize fontconfig library, text() objects will not be rendered"); return; } // Add the built-in fonts & config fs::path builtinfontpath(PlatformUtils::resourcePath("fonts")); if (fs::is_directory(builtinfontpath)) { FcConfigParseAndLoad(this->config, reinterpret_cast(builtinfontpath.generic_string().c_str()), false); add_font_dir(boosty::canonical(builtinfontpath).generic_string()); } const char *home = getenv("HOME"); // Add Linux font folders, the system folders are expected to be // configured by the system configuration for fontconfig. if (home) { add_font_dir(std::string(home) + "/.fonts"); } const char *env_font_path = getenv("OPENSCAD_FONT_PATH"); if (env_font_path != nullptr) { std::string paths(env_font_path); const std::string sep = PlatformUtils::pathSeparatorChar(); typedef boost::split_iterator string_split_iterator; for (string_split_iterator it = boost::make_split_iterator(paths, boost::first_finder(sep, boost::is_iequal())); it != string_split_iterator(); it++) { const fs::path p(boost::copy_range(*it)); if (fs::exists(p) && fs::is_directory(p)) { std::string path = fs::absolute(p).string(); add_font_dir(path); } } } FontCacheInitializer initializer(this->config); cb_handler(&initializer, cb_userdata); // For use by LibraryInfo FcStrList *dirs = FcConfigGetFontDirs(this->config); while (FcChar8 *dir = FcStrListNext(dirs)) { fontpath.push_back(std::string((const char *)dir)); } FcStrListDone(dirs); const FT_Error error = FT_Init_FreeType(&this->library); if (error) { PRINT("FONT-WARNING: Can't initialize freetype library, text() objects will not be rendered"); return; } this->init_ok = true; } FontCache::~FontCache() { } FontCache * FontCache::instance() { if (!self) { self = new FontCache(); } return self; } const std::string FontCache::get_freetype_version() const { if (!this->is_init_ok()) { return "(not initialized)"; } FT_Int major, minor, micro; FT_Library_Version(this->library, &major, &minor, µ); const OpenSCAD::library_version_number header_version{FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH}; const OpenSCAD::library_version_number runtime_version{static_cast(major), static_cast(minor), static_cast(micro)}; return OpenSCAD::get_version_string(header_version, runtime_version); } void FontCache::registerProgressHandler(InitHandlerFunc *handler, void *userdata) { FontCache::cb_handler = handler; FontCache::cb_userdata = userdata; } void FontCache::register_font_file(const std::string &path) { if (!FcConfigAppFontAddFile(this->config, reinterpret_cast (path.c_str()))) { PRINTB("Can't register font '%s'", path); } } void FontCache::add_font_dir(const std::string &path) { if (!fs::is_directory(path)) { return; } if (!FcConfigAppFontAddDir(this->config, reinterpret_cast (path.c_str()))) { PRINTB("Can't register font directory '%s'", path); } } FontInfoList *FontCache::list_fonts() const { FcObjectSet *object_set = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_FILE, nullptr); FcPattern *pattern = FcPatternCreate(); init_pattern(pattern); FcFontSet *font_set = FcFontList(this->config, pattern, object_set); FcObjectSetDestroy(object_set); FcPatternDestroy(pattern); FontInfoList *list = new FontInfoList(); for (int a = 0; a < font_set->nfont; a++) { FcValue file_value; FcPatternGet(font_set->fonts[a], FC_FILE, 0, &file_value); FcValue family_value; FcPatternGet(font_set->fonts[a], FC_FAMILY, 0, &family_value); FcValue style_value; FcPatternGet(font_set->fonts[a], FC_STYLE, 0, &style_value); std::string family((const char *) family_value.u.s); std::string style((const char *) style_value.u.s); std::string file((const char *) file_value.u.s); list->push_back(FontInfo(family, style, file)); } FcFontSetDestroy(font_set); return list; } bool FontCache::is_init_ok() const { return this->init_ok; } void FontCache::clear() { this->cache.clear(); } void FontCache::dump_cache(const std::string &info) { std::cout << info << ":"; for (cache_t::iterator it = this->cache.begin(); it != this->cache.end(); it++) { std::cout << " " << (*it).first << " (" << (*it).second.second << ")"; } std::cout << std::endl; } void FontCache::check_cleanup() { if (this->cache.size() < MAX_NR_OF_CACHE_ENTRIES) { return; } cache_t::iterator pos = this->cache.begin()++; for (cache_t::iterator it = this->cache.begin(); it != this->cache.end(); it++) { if ((*pos).second.second > (*it).second.second) { pos = it; } } FT_Done_Face((*pos).second.first); this->cache.erase(pos); } FT_Face FontCache::get_font(const std::string &font) { FT_Face face; cache_t::iterator it = this->cache.find(font); if (it == this->cache.end()) { face = find_face(font); if (!face) { return nullptr; } check_cleanup(); } else { face = (*it).second.first; } this->cache[font] = cache_entry_t(face, time(nullptr)); return face; } FT_Face FontCache::find_face(const std::string &font) const { std::string trimmed(font); boost::algorithm::trim(trimmed); const std::string lookup = trimmed.empty() ? DEFAULT_FONT : trimmed; PRINTDB("font = \"%s\", lookup = \"%s\"", font % lookup); FT_Face face = find_face_fontconfig(lookup); if (face) { PRINTDB("result = \"%s\", style = \"%s\"", face->family_name % face->style_name); } else { PRINTD("font not found"); } return face; } void FontCache::init_pattern(FcPattern *pattern) const { FcValue true_value; true_value.type = FcTypeBool; true_value.u.b = true; FcPatternAdd(pattern, FC_OUTLINE, true_value, true); FcPatternAdd(pattern, FC_SCALABLE, true_value, true); } FT_Face FontCache::find_face_fontconfig(const std::string &font) const { FcResult result; FcPattern *pattern = FcNameParse((unsigned char *)font.c_str()); init_pattern(pattern); FcConfigSubstitute(this->config, pattern, FcMatchPattern); FcDefaultSubstitute(pattern); FcPattern *match = FcFontMatch(this->config, pattern, &result); FcValue file_value; if (FcPatternGet(match, FC_FILE, 0, &file_value) != FcResultMatch) { return nullptr; } FcValue font_index; if (FcPatternGet(match, FC_INDEX, 0, &font_index)) { return nullptr; } FT_Face face; FT_Error error = FT_New_Face(this->library, (const char *) file_value.u.s, font_index.u.i, &face); FcPatternDestroy(pattern); FcPatternDestroy(match); for (int a = 0; a < face->num_charmaps; a++) { FT_CharMap charmap = face->charmaps[a]; PRINTDB("charmap = %d: platform = %d, encoding = %d", a % charmap->platform_id % charmap->encoding_id); } if (FT_Select_Charmap(face, ft_encoding_unicode) == 0) { PRINTDB("Successfully selected unicode charmap: %s/%s", face->family_name % face->style_name); } else { bool charmap_set = false; if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS); if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_ISO, TT_ISO_ID_10646); if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_APPLE_UNICODE, -1); if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS); if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN); if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_ISO, TT_ISO_ID_8859_1); if (!charmap_set) charmap_set = try_charmap(face, TT_PLATFORM_ISO, TT_ISO_ID_7BIT_ASCII); if (!charmap_set) PRINTB("Font-Warning: Could not select a char map for font %s/%s", face->family_name % face->style_name); } return error ? nullptr : face; } bool FontCache::try_charmap(FT_Face face, int platform_id, int encoding_id) const { for (int idx = 0; idx < face->num_charmaps; idx++) { FT_CharMap charmap = face->charmaps[idx]; if ((charmap->platform_id == platform_id) && ((encoding_id < 0) || (charmap->encoding_id == encoding_id))) { if (FT_Set_Charmap(face, charmap) == 0) { PRINTDB("Selected charmap: platform_id = %d, encoding_id = %d", charmap->platform_id % charmap->encoding_id); if (is_windows_symbol_font(face)) { PRINTDB("Detected windows symbol font with character codes in the Private Use Area of Unicode at 0xf000: %s/%s", face->family_name % face->style_name); } return true; } } } return false; } bool FontCache::is_windows_symbol_font(const FT_Face &face) const { if (face->charmap->platform_id != TT_PLATFORM_MICROSOFT) { return false; } if (face->charmap->encoding_id != TT_MS_ID_SYMBOL_CS) { return false; } FT_UInt gindex; FT_ULong charcode = FT_Get_First_Char(face, &gindex); if ((gindex == 0) || (charcode < 0xf000)) { return false; } return true; } openscad-2019.05/src/FontCache.h0000644000076500000240000000721713402025764016703 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include #include #include #include FT_FREETYPE_H #include FT_TRUETYPE_IDS_H #include #include #include #include #include #include "version_helper.h" class FontInfo { public: FontInfo(const std::string &family, const std::string &style, const std::string &file); virtual ~FontInfo(); const std::string &get_family() const; const std::string &get_style() const; const std::string &get_file() const; bool operator<(const FontInfo &rhs) const; private: std::string family; std::string style; std::string file; }; typedef std::vector FontInfoList; /** * Slow call of the font cache initialization. This is separated here so it * can be passed to the GUI to run in a separate thread while showing a * progress dialog. */ class FontCacheInitializer { public: FontCacheInitializer(FcConfig *config) : config(config) { } void run() { FcConfigBuildFonts(config); } private: FcConfig *config; }; class FontCache { public: const static std::string DEFAULT_FONT; const static unsigned int MAX_NR_OF_CACHE_ENTRIES = 3; FontCache(); virtual ~FontCache(); bool is_init_ok() const; FT_Face get_font(const std::string &font); bool is_windows_symbol_font(const FT_Face &face) const; void register_font_file(const std::string &path); void clear(); FontInfoList *list_fonts() const; const std::string get_freetype_version() const; static FontCache *instance(); typedef void (InitHandlerFunc)(FontCacheInitializer *initializer, void *userdata); static void registerProgressHandler(InitHandlerFunc *handler, void *userdata = nullptr); private: typedef std::pair cache_entry_t; typedef std::map cache_t; static FontCache *self; static InitHandlerFunc *cb_handler; static void *cb_userdata; static void defaultInitHandler(FontCacheInitializer *delegate, void *userdata); bool init_ok; cache_t cache; FcConfig *config; FT_Library library; void check_cleanup(); void dump_cache(const std::string &info); void add_font_dir(const std::string &path); void init_pattern(FcPattern *pattern) const; FT_Face find_face(const std::string &font) const; FT_Face find_face_fontconfig(const std::string &font) const; bool try_charmap(FT_Face face, int platform_id, int encoding_id) const; }; openscad-2019.05/src/FontListDialog.cc0000644000076500000240000001127313402025764020066 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "qtgettext.h" #include "FontListDialog.h" #include "FontCache.h" FontListDialog::FontListDialog() { model = nullptr; proxy = nullptr; setupUi(this); connect(this->okButton, SIGNAL(clicked()), this, SLOT(accept())); } FontListDialog::~FontListDialog() { } void FontListDialog::on_copyButton_clicked() { font_selected(selection); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(selection); } void FontListDialog::on_filterLineEdit_textChanged(const QString &text) { proxy->setFilterWildcard(text); } void FontListDialog::selection_changed(const QItemSelection ¤t, const QItemSelection &) { if (current.count() == 0) { copyButton->setEnabled(false); tableView->setDragText(""); return; } const QModelIndex &idx = proxy->mapToSource(current.indexes().at(0)); const QString name = model->item(idx.row(), 0)->text(); const QString style = model->item(idx.row(), 1)->text(); selection = QString("\"%1:style=%2\"").arg(quote(name)).arg(quote(style)); copyButton->setEnabled(true); tableView->setDragText(selection); } void FontListDialog::update_font_list() { copyButton->setEnabled(false); if (proxy) { delete proxy; proxy = nullptr; } if (model) { delete model; model = nullptr; } FontInfoList *list = FontCache::instance()->list_fonts(); model = new QStandardItemModel(list->size(), 3, this); model->setHorizontalHeaderItem(0, new QStandardItem(QString("Font name"))); model->setHorizontalHeaderItem(1, new QStandardItem(QString("Font style"))); model->setHorizontalHeaderItem(2, new QStandardItem(QString("Filename"))); int idx = 0; for (FontInfoList::iterator it = list->begin();it != list->end();it++, idx++) { FontInfo font_info = (*it); QStandardItem *family = new QStandardItem(QString(font_info.get_family().c_str())); family->setEditable(false); model->setItem(idx, 0, family); QStandardItem *style = new QStandardItem(QString(font_info.get_style().c_str())); style->setEditable(false); model->setItem(idx, 1, style); QStandardItem *file = new QStandardItem(QString(font_info.get_file().c_str())); file->setEditable(false); model->setItem(idx, 2, file); } proxy = new QSortFilterProxyModel(this); proxy->setSourceModel(model); proxy->setFilterCaseSensitivity(Qt::CaseInsensitive); this->tableView->setModel(proxy); this->tableView->setSelectionMode(QAbstractItemView::SingleSelection); this->tableView->sortByColumn(0, Qt::AscendingOrder); this->tableView->resizeColumnsToContents(); this->tableView->setSortingEnabled(true); connect(tableView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(selection_changed(const QItemSelection &, const QItemSelection &))); delete list; } /** * Quote a string according to the requirements of font-config. * See http://www.freedesktop.org/software/fontconfig/fontconfig-user.html * * The '\', '-', ':' and ',' characters in family names must be preceded * by a '\' character to avoid having them misinterpreted. Similarly, values * containing '\', '=', '_', ':' and ',' must also have them preceded by a * '\' character. The '\' characters are stripped out of the family name and * values as the font name is read. * * @param text unquoted string * @return quoted text */ QString FontListDialog::quote(const QString& text) { QString result = text; result.replace('\\', "\\\\\\\\") .replace('-', "\\\\-") .replace(':', "\\\\:") .replace(',', "\\\\,") .replace('=', "\\\\=") .replace('_', "\\\\_"); return result; } openscad-2019.05/src/FontListDialog.h0000644000076500000240000000131513402025764017724 0ustar kintelstaff00000000000000#pragma once #include #include #include "qtgettext.h" #include "ui_FontListDialog.h" class FontListDialog : public QDialog, public Ui::FontListDialog { Q_OBJECT; public: FontListDialog(); ~FontListDialog(); void update_font_list(); public slots: void on_copyButton_clicked(); void on_filterLineEdit_textChanged(const QString &); void selection_changed(const QItemSelection &, const QItemSelection &); signals: void font_selected(const QString font); private: QString quote(const QString& text); QString selection; QStandardItemModel *model; QSortFilterProxyModel *proxy; }; openscad-2019.05/src/FontListDialog.ui0000644000076500000240000000766713402025764020132 0ustar kintelstaff00000000000000 FontListDialog 0 0 762 449 OpenSCAD Font List 16 6 0 0 &OK Copy to Clipboard Qt::Horizontal QSizePolicy::Fixed 40 20 Filter: true QAbstractItemView::DragOnly QAbstractItemView::SelectRows <html><head/><body><p>This list shows the fonts currently registered with OpenSCAD.</p><p>Example:</p><pre style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier';"> text(&quot;OpenSCAD&quot;, font = &quot;DejaVu Sans&quot;);</span></pre><pre style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier';"> text(&quot;OpenSCAD&quot;, font = &quot;Liberation Sans:style=Italic&quot;);</span></pre></body></html> Qt::RichText true Qt::Vertical QSizePolicy::Fixed 20 6 FontListTableView QTableView
FontListTableView.h
openscad-2019.05/src/FontListTableView.cc0000644000076500000240000000411713402025764020550 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include "qtgettext.h" #include "FontListDialog.h" FontListTableView::FontListTableView(QWidget *parent) : QTableView(parent) { } void FontListTableView::setDragText(const QString &text) { this->text = text.trimmed(); } void FontListTableView::startDrag(Qt::DropActions supportedActions) { if (text.isEmpty()) return; auto mimeData = new QMimeData; mimeData->setText(text); QFontMetrics fm(font()); QRect rect(0, 0, fm.width(text) + 8, fm.height() + 8); QPixmap pixmap(rect.width(), rect.height()); pixmap.fill({240, 240, 240, 160}); QPainter painter(&pixmap); painter.setFont(font()); painter.drawText(rect, Qt::AlignCenter, text); painter.drawRect(0, 0, rect.width() - 1, rect.height() - 1); auto drag = new QDrag(this); drag->setPixmap(pixmap); drag->setMimeData(mimeData); drag->setHotSpot({-10, rect.height() + 6}); drag->exec(supportedActions, Qt::CopyAction); } openscad-2019.05/src/FontListTableView.h0000644000076500000240000000047613402025764020416 0ustar kintelstaff00000000000000#pragma once #include class FontListTableView : public QTableView { Q_OBJECT; public: FontListTableView(QWidget *parent = nullptr); void setDragText(const QString &text); protected: void startDrag(Qt::DropActions supportedActions) override; private: QString text; }; openscad-2019.05/src/FreetypeRenderer.cc0000644000076500000240000002443413441031431020450 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include #include "printutils.h" #include "FontCache.h" #include "DrawingCallback.h" #include "FreetypeRenderer.h" #include FT_OUTLINE_H #define SCRIPT_UNTAG(tag) ((uint8_t)((tag)>>24)) % ((uint8_t)((tag)>>16)) % ((uint8_t)((tag)>>8)) % ((uint8_t)(tag)) static inline Vector2d get_scaled_vector(const FT_Vector *ft_vector, double scale) { return Vector2d(ft_vector->x / scale, ft_vector->y / scale); } const double FreetypeRenderer::scale = 1000; FreetypeRenderer::FreetypeRenderer() { funcs.move_to = outline_move_to_func; funcs.line_to = outline_line_to_func; funcs.conic_to = outline_conic_to_func; funcs.cubic_to = outline_cubic_to_func; funcs.delta = 0; funcs.shift = 0; } FreetypeRenderer::~FreetypeRenderer() { } int FreetypeRenderer::outline_move_to_func(const FT_Vector *to, void *user) { DrawingCallback *cb = reinterpret_cast(user); cb->move_to(get_scaled_vector(to, scale)); return 0; } int FreetypeRenderer::outline_line_to_func(const FT_Vector *to, void *user) { DrawingCallback *cb = reinterpret_cast(user); cb->line_to(get_scaled_vector(to, scale)); return 0; } int FreetypeRenderer::outline_conic_to_func(const FT_Vector *c1, const FT_Vector *to, void *user) { DrawingCallback *cb = reinterpret_cast(user); cb->curve_to(get_scaled_vector(c1, scale), get_scaled_vector(to, scale)); return 0; } int FreetypeRenderer::outline_cubic_to_func(const FT_Vector *c1, const FT_Vector *c2, const FT_Vector *to, void *user) { DrawingCallback *cb = reinterpret_cast(user); cb->curve_to(get_scaled_vector(c1, scale), get_scaled_vector(c2, scale), get_scaled_vector(to, scale)); return 0; } double FreetypeRenderer::calc_x_offset(std::string halign, double width) const { if (halign == "right") { return -width; } else if (halign == "center") { return -width / 2.0; } else { if (halign != "left") { PRINTB("Unknown value for the halign parameter (use \"left\", \"right\" or \"center\"): '%s'", halign); } return 0; } } double FreetypeRenderer::calc_y_offset(std::string valign, double ascend, double descend) const { if (valign == "top") { return -ascend; } else if (valign == "center") { return descend / 2.0 - ascend / 2.0; } else if (valign == "bottom") { return descend; } else { if (valign != "baseline") { PRINTB("Unknown value for the valign parameter (use \"baseline\", \"bottom\", \"top\" or \"center\"): '%s'", valign); } return 0; } } hb_direction_t FreetypeRenderer::get_direction(const FreetypeRenderer::Params ¶ms, const hb_script_t script) const { hb_direction_t param_direction = hb_direction_from_string(params.direction.c_str(), -1); if (param_direction != HB_DIRECTION_INVALID) { return param_direction; } hb_direction_t direction = hb_script_get_horizontal_direction(script); PRINTDB("Detected direction '%s' for %s", hb_direction_to_string(direction) % params.text.c_str()); return direction; } bool FreetypeRenderer::is_ignored_script(const hb_script_t script) const { switch (script) { case HB_SCRIPT_COMMON: case HB_SCRIPT_INHERITED: case HB_SCRIPT_UNKNOWN: case HB_SCRIPT_INVALID: return true; default: return false; } } hb_script_t FreetypeRenderer::get_script(const FreetypeRenderer::Params ¶ms, hb_glyph_info_t *glyph_info, unsigned int glyph_count) const { hb_script_t param_script = hb_script_from_string(params.script.c_str(), -1); if (param_script != HB_SCRIPT_INVALID) { return param_script; } hb_script_t script = HB_SCRIPT_INVALID; for (unsigned int idx = 0;idx < glyph_count;idx++) { hb_codepoint_t cp = glyph_info[idx].codepoint; hb_script_t s = hb_unicode_script(hb_unicode_funcs_get_default(), cp); if (!is_ignored_script(s)) { if (script == HB_SCRIPT_INVALID) { script = s; } else if ((script != s) && (script != HB_SCRIPT_UNKNOWN)) { script = HB_SCRIPT_UNKNOWN; } } } PRINTDB("Detected script '%c%c%c%c' for %s", SCRIPT_UNTAG(script) % params.text.c_str()); return script; } void FreetypeRenderer::detect_properties(FreetypeRenderer::Params ¶ms) const { hb_buffer_t *hb_buf = hb_buffer_create(); hb_buffer_add_utf8(hb_buf, params.text.c_str(), strlen(params.text.c_str()), 0, strlen(params.text.c_str())); unsigned int glyph_count; hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(hb_buf, &glyph_count); hb_script_t script = get_script(params, glyph_info, glyph_count); hb_buffer_destroy(hb_buf); if (!is_ignored_script(script)) { char script_buf[5] = { 0, }; hb_tag_to_string(hb_script_to_iso15924_tag(script), script_buf); params.set_script(script_buf); } hb_direction_t direction = get_direction(params, script); params.set_direction(hb_direction_to_string(direction)); } std::vector FreetypeRenderer::render(const FreetypeRenderer::Params ¶ms) const { FT_Face face; FT_Error error; DrawingCallback callback(params.segments); FontCache *cache = FontCache::instance(); if (!cache->is_init_ok()) { return std::vector(); } face = cache->get_font(params.font); if (face == nullptr) { return std::vector(); } error = FT_Set_Char_Size(face, 0, params.size * scale, 100, 100); if (error) { PRINTB("Can't set font size for font %s", params.font); return std::vector(); } hb_font_t *hb_ft_font = hb_ft_font_create(face, nullptr); hb_buffer_t *hb_buf = hb_buffer_create(); hb_buffer_set_direction(hb_buf, hb_direction_from_string(params.direction.c_str(), -1)); hb_buffer_set_script(hb_buf, hb_script_from_string(params.script.c_str(), -1)); hb_buffer_set_language(hb_buf, hb_language_from_string(params.language.c_str(), -1)); if (FontCache::instance()->is_windows_symbol_font(face)) { // Special handling for symbol fonts like Webdings. // see http://www.microsoft.com/typography/otspec/recom.htm // // We go through the string char by char and if the codepoint // value is between 0x00 and 0xff, then the codepoint is translated // to the 0xf000 page (Private Use Area of Unicode). All other // values are untouched, so using the correct codepoint directly // (e.g. \uf021 for the spider in Webdings) still works. const char *p = params.text.c_str(); if (g_utf8_validate(p, -1, nullptr)) { char buf[8]; while (*p != 0) { memset(buf, 0, 8); gunichar c = g_utf8_get_char(p); c = (c < 0x0100) ? 0xf000 + c : c; g_unichar_to_utf8(c, buf); hb_buffer_add_utf8(hb_buf, buf, strlen(buf), 0, strlen(buf)); p = g_utf8_next_char(p); } } else { PRINTB("Warning: Ignoring text with invalid UTF-8 encoding: \"%s\"", params.text.c_str()); } } else { hb_buffer_add_utf8(hb_buf, params.text.c_str(), strlen(params.text.c_str()), 0, strlen(params.text.c_str())); } hb_shape(hb_ft_font, hb_buf, nullptr, 0); unsigned int glyph_count; hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(hb_buf, &glyph_count); hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(hb_buf, &glyph_count); GlyphArray glyph_array; for (unsigned int idx = 0;idx < glyph_count;idx++) { FT_UInt glyph_index = glyph_info[idx].codepoint; error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (error) { PRINTB("Could not load glyph %u for char at index %u in text '%s'", glyph_index % idx % params.text); continue; } FT_Glyph glyph; error = FT_Get_Glyph(face->glyph, &glyph); if (error) { PRINTB("Could not get glyph %u for char at index %u in text '%s'", glyph_index % idx % params.text); continue; } const GlyphData *glyph_data = new GlyphData(glyph, idx, &glyph_pos[idx]); glyph_array.push_back(glyph_data); } double width = 0, ascend = 0, descend = 0; for (GlyphArray::iterator it = glyph_array.begin();it != glyph_array.end();it++) { const GlyphData *glyph = (*it); FT_BBox bbox; FT_Glyph_Get_CBox(glyph->get_glyph(), FT_GLYPH_BBOX_GRIDFIT, &bbox); if (HB_DIRECTION_IS_HORIZONTAL(hb_buffer_get_direction(hb_buf))) { double asc = std::max(0.0, bbox.yMax / 64.0 / 16.0); double desc = std::max(0.0, -bbox.yMin / 64.0 / 16.0); width += glyph->get_x_advance() * params.spacing; ascend = std::max(ascend, asc); descend = std::max(descend, desc); } else { double w_bbox = (bbox.xMax - bbox.xMin) / 64.0 / 16.0; width = std::max(width, w_bbox); ascend += glyph->get_y_advance() * params.spacing; } } double x_offset = calc_x_offset(params.halign, width); double y_offset = calc_y_offset(params.valign, ascend, descend); for (GlyphArray::iterator it = glyph_array.begin();it != glyph_array.end();it++) { const GlyphData *glyph = (*it); callback.start_glyph(); callback.set_glyph_offset(x_offset + glyph->get_x_offset(), y_offset + glyph->get_y_offset()); FT_Outline outline = reinterpret_cast(glyph->get_glyph())->outline; FT_Outline_Decompose(&outline, &funcs, &callback); double adv_x = glyph->get_x_advance() * params.spacing; double adv_y = glyph->get_y_advance() * params.spacing; callback.add_glyph_advance(adv_x, adv_y); callback.finish_glyph(); } hb_buffer_destroy(hb_buf); hb_font_destroy(hb_ft_font); return callback.get_result(); } openscad-2019.05/src/FreetypeRenderer.h0000644000076500000240000001272413402025764020322 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include #include #include #include FT_FREETYPE_H #include FT_GLYPH_H class FreetypeRenderer { public: class Params { public: void set_size(double size) { this->size = size; } void set_spacing(double spacing) { this->spacing = spacing; } void set_fn(double fn) { this->fn = fn; } void set_fa(double fa) { this->fa = fa; } void set_fs(double fs) { this->fs = fs; } void set_segments(double segments) { this->segments = segments; } void set_text(std::string text) { this->text = text; } void set_font(std::string font) { this->font = font; } void set_direction(std::string direction) { this->direction = direction; } void set_language(std::string language) { this->language = language; } void set_script(std::string script) { this->script = script; } void set_halign(std::string halign) { this->halign = halign; } void set_valign(std::string valign) { this->valign = valign; } friend std::ostream & operator << (std::ostream &stream, const FreetypeRenderer::Params ¶ms) { return stream << "text = \"" << params.text << "\", size = " << params.size << ", spacing = " << params.spacing << ", font = \"" << params.font << "\", direction = \"" << params.direction << "\", language = \"" << params.language << (params.script.empty() ? "" : "\", script = \"") << params.script << "\", halign = \"" << params.halign << "\", valign = \"" << params.valign << "\", $fn = " << params.fn << ", $fa = " << params.fa << ", $fs = " << params.fs; } private: double size, spacing, fn, fa, fs, segments; std::string text, font, direction, language, script, halign, valign; friend class FreetypeRenderer; }; FreetypeRenderer(); virtual ~FreetypeRenderer(); void detect_properties(FreetypeRenderer::Params ¶ms) const; std::vector render(const FreetypeRenderer::Params ¶ms) const; private: const static double scale; FT_Outline_Funcs funcs; class GlyphData { public: GlyphData(FT_Glyph glyph, unsigned int idx, hb_glyph_position_t *glyph_pos) : glyph(glyph), idx(idx), glyph_pos(glyph_pos) {} unsigned int get_idx() const { return idx; }; FT_Glyph get_glyph() const { return glyph; }; double get_x_offset() const { return glyph_pos->x_offset / 64.0 / 16.0; }; double get_y_offset() const { return glyph_pos->y_offset / 64.0 / 16.0; }; double get_x_advance() const { return glyph_pos->x_advance / 64.0 / 16.0; }; double get_y_advance() const { return glyph_pos->y_advance / 64.0 / 16.0; }; private: FT_Glyph glyph; unsigned int idx; hb_glyph_position_t *glyph_pos; }; struct done_glyph : public std::unary_function { void operator() (const GlyphData *glyph_data) { FT_Done_Glyph(glyph_data->get_glyph()); delete glyph_data; } }; class GlyphArray : public std::vector { public: virtual ~GlyphArray() { std::for_each(begin(), end(), done_glyph()); } }; bool is_ignored_script(const hb_script_t script) const; hb_script_t get_script(const FreetypeRenderer::Params ¶ms, hb_glyph_info_t *glyph_info, unsigned int glyph_count) const; hb_direction_t get_direction(const FreetypeRenderer::Params ¶ms, const hb_script_t script) const; double calc_x_offset(std::string halign, double width) const; double calc_y_offset(std::string valign, double ascend, double descend) const; static int outline_move_to_func(const FT_Vector *to, void *user); static int outline_line_to_func(const FT_Vector *to, void *user); static int outline_conic_to_func(const FT_Vector *c1, const FT_Vector *to, void *user); static int outline_cubic_to_func(const FT_Vector *c1, const FT_Vector *c2, const FT_Vector *to, void *user); }; openscad-2019.05/src/GLView.cc0000644000076500000240000006667413414554253016363 0ustar kintelstaff00000000000000#include "GLView.h" #include "stdio.h" #include "colormap.h" #include "rendersettings.h" #include "printutils.h" #include "renderer.h" #include "degree_trig.h" #include #ifdef _WIN32 #include #elif !defined(__APPLE__) #include #endif #ifdef ENABLE_OPENCSG #include #endif GLView::GLView() { aspectratio = 1; showedges = false; showfaces = true; showaxes = false; showcrosshairs = false; showscale = false; renderer = nullptr; colorscheme = &ColorMap::inst()->defaultColorScheme(); cam = Camera(); far_far_away = RenderSettings::inst()->far_gl_clip_limit; #ifdef ENABLE_OPENCSG is_opencsg_capable = false; has_shaders = false; opencsg_support = true; static int sId = 0; this->opencsg_id = sId++; for (int i = 0; i < 10; i++) this->shaderinfo[i] = 0; #endif } void GLView::setRenderer(Renderer* r) { renderer = r; } /* update the color schemes of the Renderer attached to this GLView to match the colorscheme of this GLView.*/ void GLView::updateColorScheme() { if (this->renderer) this->renderer->setColorScheme(*this->colorscheme); } /* change this GLView's colorscheme to the one given, and update the Renderer attached to this GLView as well. */ void GLView::setColorScheme(const ColorScheme &cs) { this->colorscheme = &cs; this->updateColorScheme(); } void GLView::setColorScheme(const std::string &cs) { const auto colorscheme = ColorMap::inst()->findColorScheme(cs); if (colorscheme) { setColorScheme(*colorscheme); } else { PRINTB("UI-WARNING: GLView: unknown colorscheme %s", cs); } } void GLView::resizeGL(int w, int h) { #ifdef ENABLE_OPENCSG shaderinfo[9] = w; shaderinfo[10] = h; #endif cam.pixel_width = w; cam.pixel_height = h; glViewport(0, 0, w, h); aspectratio = 1.0*w/h; } void GLView::setCamera(const Camera &cam) { this->cam = cam; } void GLView::setupCamera() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); auto dist = cam.zoomValue(); switch (this->cam.projection) { case Camera::ProjectionType::PERSPECTIVE: { gluPerspective(cam.fov, aspectratio, 0.1 * dist, 100 * dist); break; } default: case Camera::ProjectionType::ORTHOGONAL: { auto height = dist * tan_degrees(cam.fov / 2); glOrtho(-height * aspectratio, height * aspectratio, -height, height, -100 * dist, +100 * dist); break; } } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, -dist, 0.0, // eye 0.0, 0.0, 0.0, // center 0.0, 0.0, 1.0); // up glRotated(cam.object_rot.x(), 1.0, 0.0, 0.0); glRotated(cam.object_rot.y(), 0.0, 1.0, 0.0); glRotated(cam.object_rot.z(), 0.0, 0.0, 1.0); } void GLView::paintGL() { glDisable(GL_LIGHTING); auto bgcol = ColorMap::getColor(*this->colorscheme, RenderColor::BACKGROUND_COLOR); auto axescolor = ColorMap::getColor(*this->colorscheme, RenderColor::AXES_COLOR); auto crosshaircol = ColorMap::getColor(*this->colorscheme, RenderColor::CROSSHAIR_COLOR); glClearColor(bgcol[0], bgcol[1], bgcol[2], 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); setupCamera(); // The crosshair should be fixed at the center of the viewport... if (showcrosshairs) GLView::showCrosshairs(crosshaircol); glTranslated(cam.object_trans.x(), cam.object_trans.y(), cam.object_trans.z()); // ...the axis lines need to follow the object translation. if (showaxes) GLView::showAxes(axescolor); // mark the scale along the axis lines if (showaxes && showscale) GLView::showScalemarkers(axescolor); glEnable(GL_LIGHTING); glDepthFunc(GL_LESS); glCullFace(GL_BACK); glDisable(GL_CULL_FACE); glLineWidth(2); glColor3d(1.0, 0.0, 0.0); if (this->renderer) { #if defined(ENABLE_OPENCSG) // FIXME: This belongs in the OpenCSG renderer, but it doesn't know about this ID yet OpenCSG::setContext(this->opencsg_id); #endif this->renderer->draw(showfaces, showedges); } glDisable(GL_LIGHTING); if (showaxes) GLView::showSmallaxes(axescolor); } #ifdef ENABLE_OPENCSG void GLView::enable_opencsg_shaders() { const char *openscad_disable_gl20_env = getenv("OPENSCAD_DISABLE_GL20"); if (openscad_disable_gl20_env && !strcmp(openscad_disable_gl20_env, "0")) { openscad_disable_gl20_env = nullptr; } // All OpenGL 2 contexts are OpenCSG capable if (GLEW_VERSION_2_0) { if (!openscad_disable_gl20_env) { this->is_opencsg_capable = true; this->has_shaders = true; } } // If OpenGL < 2, check for extensions else { if (GLEW_ARB_framebuffer_object) this->is_opencsg_capable = true; else if (GLEW_EXT_framebuffer_object && GLEW_EXT_packed_depth_stencil) { this->is_opencsg_capable = true; } #ifdef _WIN32 else if (WGLEW_ARB_pbuffer && WGLEW_ARB_pixel_format) this->is_opencsg_capable = true; #elif !defined(__APPLE__) else if (GLXEW_SGIX_pbuffer && GLXEW_SGIX_fbconfig) this->is_opencsg_capable = true; #endif } if (!GLEW_VERSION_2_0 || !this->is_opencsg_capable) { display_opencsg_warning(); } if (opencsg_support && this->has_shaders) { /* Uniforms: 1 color1 - face color 2 color2 - edge color 7 xscale 8 yscale Attributes: 3 trig 4 pos_b 5 pos_c 6 mask Other: 9 width 10 height Outputs: tp tr shading */ const char *vs_source = "uniform float xscale, yscale;\n" "attribute vec3 pos_b, pos_c;\n" "attribute vec3 trig, mask;\n" "varying vec3 tp, tr;\n" "varying float shading;\n" "void main() {\n" " vec4 p0 = gl_ModelViewProjectionMatrix * gl_Vertex;\n" " vec4 p1 = gl_ModelViewProjectionMatrix * vec4(pos_b, 1.0);\n" " vec4 p2 = gl_ModelViewProjectionMatrix * vec4(pos_c, 1.0);\n" " float a = distance(vec2(xscale*p1.x/p1.w, yscale*p1.y/p1.w), vec2(xscale*p2.x/p2.w, yscale*p2.y/p2.w));\n" " float b = distance(vec2(xscale*p0.x/p0.w, yscale*p0.y/p0.w), vec2(xscale*p1.x/p1.w, yscale*p1.y/p1.w));\n" " float c = distance(vec2(xscale*p0.x/p0.w, yscale*p0.y/p0.w), vec2(xscale*p2.x/p2.w, yscale*p2.y/p2.w));\n" " float s = (a + b + c) / 2.0;\n" " float A = sqrt(s*(s-a)*(s-b)*(s-c));\n" " float ha = 2.0*A/a;\n" " gl_Position = p0;\n" " tp = mask * ha;\n" " tr = trig;\n" " vec3 normal, lightDir;\n" " normal = normalize(gl_NormalMatrix * gl_Normal);\n" " lightDir = normalize(vec3(gl_LightSource[0].position));\n" " shading = 0.2 + abs(dot(normal, lightDir));\n" "}\n"; /* Inputs: tp && tr - if any components of tp < tr, use color2 (edge color) shading - multiplied by color1. color2 is is without lighting */ const char *fs_source = "uniform vec4 color1, color2;\n" "varying vec3 tp, tr, tmp;\n" "varying float shading;\n" "void main() {\n" " gl_FragColor = vec4(color1.r * shading, color1.g * shading, color1.b * shading, color1.a);\n" " if (tp.x < tr.x || tp.y < tr.y || tp.z < tr.z)\n" " gl_FragColor = color2;\n" "}\n"; auto vs = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vs, 1, (const GLchar**)&vs_source, nullptr); glCompileShader(vs); auto fs = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fs, 1, (const GLchar**)&fs_source, nullptr); glCompileShader(fs); auto edgeshader_prog = glCreateProgram(); glAttachShader(edgeshader_prog, vs); glAttachShader(edgeshader_prog, fs); glLinkProgram(edgeshader_prog); shaderinfo[0] = edgeshader_prog; shaderinfo[1] = glGetUniformLocation(edgeshader_prog, "color1"); shaderinfo[2] = glGetUniformLocation(edgeshader_prog, "color2"); shaderinfo[3] = glGetAttribLocation(edgeshader_prog, "trig"); shaderinfo[4] = glGetAttribLocation(edgeshader_prog, "pos_b"); shaderinfo[5] = glGetAttribLocation(edgeshader_prog, "pos_c"); shaderinfo[6] = glGetAttribLocation(edgeshader_prog, "mask"); shaderinfo[7] = glGetUniformLocation(edgeshader_prog, "xscale"); shaderinfo[8] = glGetUniformLocation(edgeshader_prog, "yscale"); auto err = glGetError(); if (err != GL_NO_ERROR) { fprintf(stderr, "OpenGL Error: %s\n", gluErrorString(err)); } GLint status; glGetProgramiv(edgeshader_prog, GL_LINK_STATUS, &status); if (status == GL_FALSE) { int loglen; char logbuffer[1000]; glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer); fprintf(stderr, "OpenGL Program Linker Error:\n%.*s", loglen, logbuffer); } else { int loglen; char logbuffer[1000]; glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer); if (loglen > 0) { fprintf(stderr, "OpenGL Program Link OK:\n%.*s", loglen, logbuffer); } glValidateProgram(edgeshader_prog); glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer); if (loglen > 0) { fprintf(stderr, "OpenGL Program Validation results:\n%.*s", loglen, logbuffer); } } } } #endif void GLView::initializeGL() { glEnable(GL_DEPTH_TEST); glDepthRange(-far_far_away, +far_far_away); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat light_position0[] = {-1.0, +1.0, +1.0, 0.0}; GLfloat light_position1[] = {+1.0, -1.0, -1.0, 0.0}; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position0); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT1, GL_POSITION, light_position1); glEnable(GL_LIGHT1); glEnable(GL_LIGHTING); glEnable(GL_NORMALIZE); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); // The following line is reported to fix issue #71 glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 64); glEnable(GL_COLOR_MATERIAL); #ifdef ENABLE_OPENCSG enable_opencsg_shaders(); #endif } void GLView::showSmallaxes(const Color4f &col) { auto dpi = this->getDPI(); // Small axis cross in the lower left corner glDepthFunc(GL_ALWAYS); // Set up an orthographic projection of the axis cross in the corner glMatrixMode(GL_PROJECTION); glLoadIdentity(); glTranslatef(-0.8f, -0.8f, 0.0f); auto scale = 90; glOrtho(-scale*dpi*aspectratio,scale*dpi*aspectratio, -scale*dpi,scale*dpi, -scale*dpi,scale*dpi); gluLookAt(0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotated(cam.object_rot.x(), 1.0, 0.0, 0.0); glRotated(cam.object_rot.y(), 0.0, 1.0, 0.0); glRotated(cam.object_rot.z(), 0.0, 0.0, 1.0); glLineWidth(dpi); glBegin(GL_LINES); glColor3d(1.0, 0.0, 0.0); glVertex3d(0, 0, 0); glVertex3d(10*dpi, 0, 0); glColor3d(0.0, 1.0, 0.0); glVertex3d(0, 0, 0); glVertex3d(0, 10*dpi, 0); glColor3d(0.0, 0.0, 1.0); glVertex3d(0, 0, 0); glVertex3d(0, 0, 10*dpi); glEnd(); GLdouble mat_model[16]; glGetDoublev(GL_MODELVIEW_MATRIX, mat_model); GLdouble mat_proj[16]; glGetDoublev(GL_PROJECTION_MATRIX, mat_proj); GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); GLdouble xlabel_x, xlabel_y, xlabel_z; gluProject(12*dpi, 0, 0, mat_model, mat_proj, viewport, &xlabel_x, &xlabel_y, &xlabel_z); xlabel_x = std::round(xlabel_x); xlabel_y = std::round(xlabel_y); GLdouble ylabel_x, ylabel_y, ylabel_z; gluProject(0, 12*dpi, 0, mat_model, mat_proj, viewport, &ylabel_x, &ylabel_y, &ylabel_z); ylabel_x = std::round(ylabel_x); ylabel_y = std::round(ylabel_y); GLdouble zlabel_x, zlabel_y, zlabel_z; gluProject(0, 0, 12*dpi, mat_model, mat_proj, viewport, &zlabel_x, &zlabel_y, &zlabel_z); zlabel_x = std::round(zlabel_x); zlabel_y = std::round(zlabel_y); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glTranslated(-1, -1, 0); glScaled(2.0/viewport[2], 2.0/viewport[3], 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(col[0], col[1], col[2]); float d = 3*dpi; glBegin(GL_LINES); // X Label glVertex3d(xlabel_x-d, xlabel_y-d, 0); glVertex3d(xlabel_x+d, xlabel_y+d, 0); glVertex3d(xlabel_x-d, xlabel_y+d, 0); glVertex3d(xlabel_x+d, xlabel_y-d, 0); // Y Label glVertex3d(ylabel_x-d, ylabel_y-d, 0); glVertex3d(ylabel_x+d, ylabel_y+d, 0); glVertex3d(ylabel_x-d, ylabel_y+d, 0); glVertex3d(ylabel_x, ylabel_y, 0); // Z Label glVertex3d(zlabel_x-d, zlabel_y-d, 0); glVertex3d(zlabel_x+d, zlabel_y-d, 0); glVertex3d(zlabel_x-d, zlabel_y+d, 0); glVertex3d(zlabel_x+d, zlabel_y+d, 0); glVertex3d(zlabel_x-d, zlabel_y-d, 0); glVertex3d(zlabel_x+d, zlabel_y+d, 0); glEnd(); } void GLView::showAxes(const Color4f &col) { auto l = cam.zoomValue(); // Large gray axis cross inline with the model glLineWidth(this->getDPI()); glColor3f(col[0], col[1], col[2]); glBegin(GL_LINES); glVertex3d(0, 0, 0); glVertex3d(+l, 0, 0); glVertex3d(0, 0, 0); glVertex3d(0, +l, 0); glVertex3d(0, 0, 0); glVertex3d(0, 0, +l); glEnd(); glPushAttrib(GL_LINE_BIT); glEnable(GL_LINE_STIPPLE); glLineStipple(3, 0xAAAA); glBegin(GL_LINES); glVertex3d(0, 0, 0); glVertex3d(-l, 0, 0); glVertex3d(0, 0, 0); glVertex3d(0, -l, 0); glVertex3d(0, 0, 0); glVertex3d(0, 0, -l); glEnd(); glPopAttrib(); } void GLView::showCrosshairs(const Color4f &col) { glLineWidth(this->getDPI()); glColor3f(col[0], col[1], col[2]); glBegin(GL_LINES); for (double xf = -1; xf <= +1; xf += 2) for (double yf = -1; yf <= +1; yf += 2) { auto vd = cam.zoomValue()/8; glVertex3d(-xf*vd, -yf*vd, -vd); glVertex3d(+xf*vd, +yf*vd, +vd); } glEnd(); } void GLView::showScalemarkers(const Color4f &col) { // Add scale ticks on large axes auto l = cam.zoomValue(); glLineWidth(this->getDPI()); glColor3f(col[0], col[1], col[2]); // Take log of l, discretize, then exponentiate. This is done so that the tick // denominations change every time the viewport gets 10x bigger or smaller, // but stays constant in-between. l_adjusted is a step function of l. const int log_l = static_cast(floor(log10(l))); const double l_adjusted = pow(10, log_l); // Calculate tick width. const double tick_width = l_adjusted / 10.0; const int size_div_sm = 60; // divisor for l to determine minor tick size int line_cnt = 0; for (double i=0; i 0 && line_cnt % 10 == 0){ // major tick size_div = size_div_sm * .5; // resize to a major tick GLView::decodeMarkerValue(i, l, size_div_sm); // print number } else { // minor tick size_div = size_div_sm; // set the minor tick to the standard size // Draw additional labels if there are few major tick labels visible due to // zoom. Because the spacing/units of major tick marks only change when the // viewport changes size by a factor of 10, it can be hard to see the // major tick labels when when the viewport is slightly larger than size at // which the last tick spacing change occurred. When zoom level is such // that very few major tick marks are visible, additional labels are drawn // every 2 minor ticks. We can detect that very few major ticks are visible // by checking if the viewport size is larger than the adjusted scale by // only a small ratio. const double more_labels_threshold = 3; // draw additional labels every 2 minor ticks const int more_labels_freq = 2; if (line_cnt > 0 && line_cnt % more_labels_freq == 0 && l / l_adjusted < more_labels_threshold) { GLView::decodeMarkerValue(i, l, size_div_sm); // print number } } line_cnt++; /* * The length of each tick is proportional to the length of the axis * (which changes with the zoom value.) l/size_div provides the * proportional length * * Commented glVertex3d lines provide additional 'arms' for the tick * the number of arms will (hopefully) eventually be driven via Preferences */ // positive axes glBegin(GL_LINES); // x glVertex3d(i,0,0); glVertex3d(i,-l/size_div,0); // 1 arm //glVertex3d(i,-l/size_div,0); glVertex3d(i,l/size_div,0); // 2 arms //glVertex3d(i,0,-l/size_div); glVertex3d(i,0,l/size_div); // 4 arms (w/ 2 arms line) // y glVertex3d(0,i,0); glVertex3d(-l/size_div,i,0); // 1 arm //glVertex3d(-l/size_div,i,0); glVertex3d(l/size_div,i,0); // 2 arms //glVertex3d(0,i,-l/size_div); glVertex3d(0,i,l/size_div); // 4 arms (w/ 2 arms line) // z glVertex3d(0,0,i); glVertex3d(-l/size_div,0,i); // 1 arm //glVertex3d(-l/size_div,0,i); glVertex3d(l/size_div,0,i); // 2 arms //glVertex3d(0,-l/size_div,i); glVertex3d(0,l/size_div,i); // 4 arms (w/ 2 arms line) glEnd(); // negative axes glPushAttrib(GL_LINE_BIT); glEnable(GL_LINE_STIPPLE); glLineStipple(3, 0xAAAA); glBegin(GL_LINES); // x glVertex3d(-i,0,0); glVertex3d(-i,-l/size_div,0); // 1 arm //glVertex3d(-i,-l/size_div,0); glVertex3d(-i,l/size_div,0); // 2 arms //glVertex3d(-i,0,-l/size_div); glVertex3d(-i,0,l/size_div); // 4 arms (w/ 2 arms line) // y glVertex3d(0,-i,0); glVertex3d(-l/size_div,-i,0); // 1 arm //glVertex3d(-l/size_div,-i,0); glVertex3d(l/size_div,-i,0); // 2 arms //glVertex3d(0,-i,-l/size_div); glVertex3d(0,-i,l/size_div); // 4 arms (w/ 2 arms line) // z glVertex3d(0,0,-i); glVertex3d(-l/size_div,0,-i); // 1 arm //glVertex3d(-l/size_div,0,-i); glVertex3d(l/size_div,0,-i); // 2 arms //glVertex3d(0,-l/size_div,-i); glVertex3d(0,l/size_div,-i); // 4 arms (w/ 2 arms line) glEnd(); glPopAttrib(); } } void GLView::decodeMarkerValue(double i, double l, int size_div_sm) { const auto unsigned_digit = STR(i); // setup how far above the axis (or tick TBD) to draw the number double dig_buf = (l/size_div_sm)/4; // setup the size of the character box double dig_w = (l/size_div_sm)/2; double dig_h = (l/size_div_sm) + dig_buf; // setup the distance between characters double kern = dig_buf; double dig_wk = (dig_w) + kern; // set up ordering for different axes int ax[6][3] = { {0,1,2}, {1,0,2}, {1,2,0}, {0,1,2}, {1,0,2}, {1,2,0}}; // set up character vertex sequences for different axes int or_2[6][6]={ {0,1,3,2,4,5}, {1,0,2,3,5,4}, {1,0,2,3,5,4}, {1,0,2,3,5,4}, {0,1,3,2,4,5}, {0,1,3,2,4,5}}; int or_3[6][7]={ {0,1,3,2,3,5,4}, {1,0,2,3,2,4,5}, {1,0,2,3,2,4,5}, {1,0,2,3,2,4,5}, {0,1,3,2,3,5,4}, {0,1,3,2,3,5,4}}; int or_4[6][5]={ {0,2,3,1,5}, {1,3,2,0,4}, {1,3,2,0,4}, {1,3,2,0,4}, {0,2,3,1,5}, {0,2,3,1,5}}; int or_5[6][6]={ {1,0,2,3,5,4}, {0,1,3,2,4,5}, {0,1,3,2,4,5}, {0,1,3,2,4,5}, {1,0,2,3,5,4}, {1,0,2,3,5,4}}; int or_6[6][6]={ {1,0,4,5,3,2}, {0,1,5,4,2,3}, {0,1,5,4,2,3}, {0,1,5,4,2,3}, {1,0,4,5,3,2}, {1,0,4,5,3,2}}; int or_7[6][3]={ {0,1,4}, {1,0,5}, {1,0,5}, {1,0,5}, {0,1,4}, {0,1,4}}; int or_9[6][5]={ {5,1,0,2,3}, {4,0,1,3,2}, {4,0,1,3,2}, {4,0,1,3,2}, {5,1,0,2,3}, {5,1,0,2,3}}; int or_e[6][7]={ {1,0,2,3,2,4,5}, {0,1,3,2,3,5,4}, {0,1,3,2,3,5,4}, {0,1,3,2,3,5,4}, {1,0,2,3,2,4,5}, {1,0,2,3,2,4,5}}; // walk through axes for (int di=0;di<6;di++){ // setup negative axes double polarity = 1; auto digit = unsigned_digit; if (di>2){ polarity = -1; digit.insert(0, "-"); } // fix the axes that need to run the opposite direction if (di>0 && di<4){ std::reverse(digit.begin(),digit.end()); } // walk through and render the characters of the string for(std::string::size_type char_num = 0; char_num < digit.size(); ++char_num){ // setup the vertices for the char rendering based on the axis and position double dig_vrt[6][3] = { {polarity*((i+((char_num)*dig_wk))-(dig_w/2)),dig_h,0}, {polarity*((i+((char_num)*dig_wk))+(dig_w/2)),dig_h,0}, {polarity*((i+((char_num)*dig_wk))-(dig_w/2)),dig_h/2+dig_buf,0}, {polarity*((i+((char_num)*dig_wk))+(dig_w/2)),dig_h/2+dig_buf,0}, {polarity*((i+((char_num)*dig_wk))-(dig_w/2)),dig_buf,0}, {polarity*((i+((char_num)*dig_wk))+(dig_w/2)),dig_buf,0}}; // convert the char into lines appropriate for the axis being used // psuedo 7 segment vertices are: // A--B // | | // C--D // | | // E--F switch(digit[char_num]){ case '1': glBegin(GL_LINES); glVertex3d(dig_vrt[0][ax[di][0]],dig_vrt[0][ax[di][1]],dig_vrt[0][ax[di][2]]); //a glVertex3d(dig_vrt[4][ax[di][0]],dig_vrt[4][ax[di][1]],dig_vrt[4][ax[di][2]]); //e glEnd(); break; case '2': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_2[di][0]][ax[di][0]],dig_vrt[or_2[di][0]][ax[di][1]],dig_vrt[or_2[di][0]][ax[di][2]]); //a glVertex3d(dig_vrt[or_2[di][1]][ax[di][0]],dig_vrt[or_2[di][1]][ax[di][1]],dig_vrt[or_2[di][1]][ax[di][2]]); //b glVertex3d(dig_vrt[or_2[di][2]][ax[di][0]],dig_vrt[or_2[di][2]][ax[di][1]],dig_vrt[or_2[di][2]][ax[di][2]]); //d glVertex3d(dig_vrt[or_2[di][3]][ax[di][0]],dig_vrt[or_2[di][3]][ax[di][1]],dig_vrt[or_2[di][3]][ax[di][2]]); //c glVertex3d(dig_vrt[or_2[di][4]][ax[di][0]],dig_vrt[or_2[di][4]][ax[di][1]],dig_vrt[or_2[di][4]][ax[di][2]]); //e glVertex3d(dig_vrt[or_2[di][5]][ax[di][0]],dig_vrt[or_2[di][5]][ax[di][1]],dig_vrt[or_2[di][5]][ax[di][2]]); //f glEnd(); break; case '3': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_3[di][0]][ax[di][0]],dig_vrt[or_3[di][0]][ax[di][1]],dig_vrt[or_3[di][0]][ax[di][2]]); //a glVertex3d(dig_vrt[or_3[di][1]][ax[di][0]],dig_vrt[or_3[di][1]][ax[di][1]],dig_vrt[or_3[di][1]][ax[di][2]]); //b glVertex3d(dig_vrt[or_3[di][2]][ax[di][0]],dig_vrt[or_3[di][2]][ax[di][1]],dig_vrt[or_3[di][2]][ax[di][2]]); //d glVertex3d(dig_vrt[or_3[di][3]][ax[di][0]],dig_vrt[or_3[di][3]][ax[di][1]],dig_vrt[or_3[di][3]][ax[di][2]]); //c glVertex3d(dig_vrt[or_3[di][4]][ax[di][0]],dig_vrt[or_3[di][4]][ax[di][1]],dig_vrt[or_3[di][4]][ax[di][2]]); //d glVertex3d(dig_vrt[or_3[di][5]][ax[di][0]],dig_vrt[or_3[di][5]][ax[di][1]],dig_vrt[or_3[di][5]][ax[di][2]]); //f glVertex3d(dig_vrt[or_3[di][6]][ax[di][0]],dig_vrt[or_3[di][6]][ax[di][1]],dig_vrt[or_3[di][6]][ax[di][2]]); //e glEnd(); break; case '4': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_4[di][0]][ax[di][0]],dig_vrt[or_4[di][0]][ax[di][1]],dig_vrt[or_4[di][0]][ax[di][2]]); //a glVertex3d(dig_vrt[or_4[di][1]][ax[di][0]],dig_vrt[or_4[di][1]][ax[di][1]],dig_vrt[or_4[di][1]][ax[di][2]]); //c glVertex3d(dig_vrt[or_4[di][2]][ax[di][0]],dig_vrt[or_4[di][2]][ax[di][1]],dig_vrt[or_4[di][2]][ax[di][2]]); //d glVertex3d(dig_vrt[or_4[di][3]][ax[di][0]],dig_vrt[or_4[di][3]][ax[di][1]],dig_vrt[or_4[di][3]][ax[di][2]]); //b glVertex3d(dig_vrt[or_4[di][4]][ax[di][0]],dig_vrt[or_4[di][4]][ax[di][1]],dig_vrt[or_4[di][4]][ax[di][2]]); //f glEnd(); break; case '5': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_5[di][0]][ax[di][0]],dig_vrt[or_5[di][0]][ax[di][1]],dig_vrt[or_5[di][0]][ax[di][2]]); //b glVertex3d(dig_vrt[or_5[di][1]][ax[di][0]],dig_vrt[or_5[di][1]][ax[di][1]],dig_vrt[or_5[di][1]][ax[di][2]]); //a glVertex3d(dig_vrt[or_5[di][2]][ax[di][0]],dig_vrt[or_5[di][2]][ax[di][1]],dig_vrt[or_5[di][2]][ax[di][2]]); //c glVertex3d(dig_vrt[or_5[di][3]][ax[di][0]],dig_vrt[or_5[di][3]][ax[di][1]],dig_vrt[or_5[di][3]][ax[di][2]]); //d glVertex3d(dig_vrt[or_5[di][4]][ax[di][0]],dig_vrt[or_5[di][4]][ax[di][1]],dig_vrt[or_5[di][4]][ax[di][2]]); //f glVertex3d(dig_vrt[or_5[di][5]][ax[di][0]],dig_vrt[or_5[di][5]][ax[di][1]],dig_vrt[or_5[di][5]][ax[di][2]]); //e glEnd(); break; case '6': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_6[di][0]][ax[di][0]],dig_vrt[or_6[di][0]][ax[di][1]],dig_vrt[or_6[di][0]][ax[di][2]]); //b glVertex3d(dig_vrt[or_6[di][1]][ax[di][0]],dig_vrt[or_6[di][1]][ax[di][1]],dig_vrt[or_6[di][1]][ax[di][2]]); //a glVertex3d(dig_vrt[or_6[di][2]][ax[di][0]],dig_vrt[or_6[di][2]][ax[di][1]],dig_vrt[or_6[di][2]][ax[di][2]]); //e glVertex3d(dig_vrt[or_6[di][3]][ax[di][0]],dig_vrt[or_6[di][3]][ax[di][1]],dig_vrt[or_6[di][3]][ax[di][2]]); //f glVertex3d(dig_vrt[or_6[di][4]][ax[di][0]],dig_vrt[or_6[di][4]][ax[di][1]],dig_vrt[or_6[di][4]][ax[di][2]]); //d glVertex3d(dig_vrt[or_6[di][5]][ax[di][0]],dig_vrt[or_6[di][5]][ax[di][1]],dig_vrt[or_6[di][5]][ax[di][2]]); //c glEnd(); break; case '7': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_7[di][0]][ax[di][0]],dig_vrt[or_7[di][0]][ax[di][1]],dig_vrt[or_7[di][0]][ax[di][2]]); //a glVertex3d(dig_vrt[or_7[di][1]][ax[di][0]],dig_vrt[or_7[di][1]][ax[di][1]],dig_vrt[or_7[di][1]][ax[di][2]]); //b glVertex3d(dig_vrt[or_7[di][2]][ax[di][0]],dig_vrt[or_7[di][2]][ax[di][1]],dig_vrt[or_7[di][2]][ax[di][2]]); //e glEnd(); break; case '8': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[2][ax[di][0]],dig_vrt[2][ax[di][1]],dig_vrt[2][ax[di][2]]); //c glVertex3d(dig_vrt[3][ax[di][0]],dig_vrt[3][ax[di][1]],dig_vrt[3][ax[di][2]]); //d glVertex3d(dig_vrt[1][ax[di][0]],dig_vrt[1][ax[di][1]],dig_vrt[1][ax[di][2]]); //b glVertex3d(dig_vrt[0][ax[di][0]],dig_vrt[0][ax[di][1]],dig_vrt[0][ax[di][2]]); //a glVertex3d(dig_vrt[4][ax[di][0]],dig_vrt[4][ax[di][1]],dig_vrt[4][ax[di][2]]); //e glVertex3d(dig_vrt[5][ax[di][0]],dig_vrt[5][ax[di][1]],dig_vrt[5][ax[di][2]]); //f glVertex3d(dig_vrt[3][ax[di][0]],dig_vrt[3][ax[di][1]],dig_vrt[3][ax[di][2]]); //d glEnd(); break; case '9': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_9[di][0]][ax[di][0]],dig_vrt[or_9[di][0]][ax[di][1]],dig_vrt[or_9[di][0]][ax[di][2]]); //f glVertex3d(dig_vrt[or_9[di][1]][ax[di][0]],dig_vrt[or_9[di][1]][ax[di][1]],dig_vrt[or_9[di][1]][ax[di][2]]); //b glVertex3d(dig_vrt[or_9[di][2]][ax[di][0]],dig_vrt[or_9[di][2]][ax[di][1]],dig_vrt[or_9[di][2]][ax[di][2]]); //a glVertex3d(dig_vrt[or_9[di][3]][ax[di][0]],dig_vrt[or_9[di][3]][ax[di][1]],dig_vrt[or_9[di][3]][ax[di][2]]); //c glVertex3d(dig_vrt[or_9[di][4]][ax[di][0]],dig_vrt[or_9[di][4]][ax[di][1]],dig_vrt[or_9[di][4]][ax[di][2]]); //d glEnd(); break; case '0': glBegin(GL_LINE_LOOP); glVertex3d(dig_vrt[0][ax[di][0]],dig_vrt[0][ax[di][1]],dig_vrt[0][ax[di][2]]); //a glVertex3d(dig_vrt[1][ax[di][0]],dig_vrt[1][ax[di][1]],dig_vrt[1][ax[di][2]]); //b glVertex3d(dig_vrt[5][ax[di][0]],dig_vrt[5][ax[di][1]],dig_vrt[5][ax[di][2]]); //f glVertex3d(dig_vrt[4][ax[di][0]],dig_vrt[4][ax[di][1]],dig_vrt[4][ax[di][2]]); //e glEnd(); break; case '-': glBegin(GL_LINES); glVertex3d(dig_vrt[2][ax[di][0]],dig_vrt[2][ax[di][1]],dig_vrt[2][ax[di][2]]); //c glVertex3d(dig_vrt[3][ax[di][0]],dig_vrt[3][ax[di][1]],dig_vrt[3][ax[di][2]]); //d glEnd(); break; case '.': glBegin(GL_LINES); glVertex3d(dig_vrt[4][ax[di][0]],dig_vrt[4][ax[di][1]],dig_vrt[4][ax[di][2]]); //e glVertex3d(dig_vrt[5][ax[di][0]],dig_vrt[5][ax[di][1]],dig_vrt[5][ax[di][2]]); //f glEnd(); break; case 'e': glBegin(GL_LINE_STRIP); glVertex3d(dig_vrt[or_e[di][0]][ax[di][0]],dig_vrt[or_e[di][0]][ax[di][1]],dig_vrt[or_e[di][0]][ax[di][2]]); //b glVertex3d(dig_vrt[or_e[di][1]][ax[di][0]],dig_vrt[or_e[di][1]][ax[di][1]],dig_vrt[or_e[di][1]][ax[di][2]]); //a glVertex3d(dig_vrt[or_e[di][2]][ax[di][0]],dig_vrt[or_e[di][2]][ax[di][1]],dig_vrt[or_e[di][2]][ax[di][2]]); //c glVertex3d(dig_vrt[or_e[di][3]][ax[di][0]],dig_vrt[or_e[di][3]][ax[di][1]],dig_vrt[or_e[di][3]][ax[di][2]]); //d glVertex3d(dig_vrt[or_e[di][4]][ax[di][0]],dig_vrt[or_e[di][4]][ax[di][1]],dig_vrt[or_e[di][4]][ax[di][2]]); //c glVertex3d(dig_vrt[or_e[di][5]][ax[di][0]],dig_vrt[or_e[di][5]][ax[di][1]],dig_vrt[or_e[di][5]][ax[di][2]]); //e glVertex3d(dig_vrt[or_e[di][6]][ax[di][0]],dig_vrt[or_e[di][6]][ax[di][1]],dig_vrt[or_e[di][6]][ax[di][2]]); //f glEnd(); break; } } } } openscad-2019.05/src/GLView.h0000644000076500000240000000474213402025764016206 0ustar kintelstaff00000000000000#pragma once /* GLView: A basic OpenGL rectangle for rendering images. This class is inherited by: *QGLview - for Qt GUI *OffscreenView - for offscreen rendering, in tests and from command-line (This class is also overridden by NULLGL.cc for special experiments) The view assumes either a Gimbal Camera (rotation,translation,distance) or Vector Camera (eye,center/target) is being used. See Camera.h. The cameras are not kept in sync. QGLView only uses GimbalCamera while OffscreenView can use either one. Some actions (showCrossHairs) only work properly on Gimbal Camera. */ #include #include #include #include "system-gl.h" #include #include "Camera.h" #include "colormap.h" class GLView { public: GLView(); void setRenderer(class Renderer* r); Renderer *getRenderer() const { return this->renderer; } void initializeGL(); void resizeGL(int w, int h); virtual void paintGL(); void setCamera(const Camera &cam); void setupCamera(); void setColorScheme(const ColorScheme &cs); void setColorScheme(const std::string &cs); void updateColorScheme(); bool showAxes() const { return this->showaxes; } void setShowAxes(bool enabled) { this->showaxes = enabled; } bool showScaleProportional() const { return this->showscale; } void setShowScaleProportional(bool enabled) { this->showscale = enabled; } bool showEdges() const { return this->showedges; } void setShowEdges(bool enabled) { this->showedges = enabled; } bool showFaces() const { return this->showfaces; } void setShowFaces(bool enabled) { this->showfaces = enabled; } bool showCrosshairs() const { return this->showcrosshairs; } void setShowCrosshairs(bool enabled) { this->showcrosshairs = enabled; } virtual bool save(const char *filename) = 0; virtual std::string getRendererInfo() const = 0; virtual float getDPI() { return 1.0f; } Renderer *renderer; const ColorScheme *colorscheme; Camera cam; double far_far_away; double aspectratio; bool showaxes; bool showfaces; bool showedges; bool showcrosshairs; bool showscale; #ifdef ENABLE_OPENCSG GLint shaderinfo[11]; bool is_opencsg_capable; bool has_shaders; void enable_opencsg_shaders(); virtual void display_opencsg_warning() = 0; bool opencsg_support; int opencsg_id; #endif private: void showCrosshairs(const Color4f &col); void showAxes(const Color4f &col); void showSmallaxes(const Color4f &col); void showScalemarkers(const Color4f &col); void decodeMarkerValue(double i, double l, int size_div_sm); }; openscad-2019.05/src/Geometry.cc0000644000076500000240000000002613402025764016771 0ustar kintelstaff00000000000000#include "Geometry.h" openscad-2019.05/src/Geometry.h0000644000076500000240000000131013402025764016630 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "linalg.h" #include "memory.h" class Geometry { public: typedef std::pair> GeometryItem; typedef std::list Geometries; Geometry() : convexity(1) {} virtual ~Geometry() {} virtual size_t memsize() const = 0; virtual BoundingBox getBoundingBox() const = 0; virtual std::string dump() const = 0; virtual unsigned int getDimension() const = 0; virtual bool isEmpty() const = 0; virtual Geometry *copy() const = 0; unsigned int getConvexity() const { return convexity; } void setConvexity(int c) { this->convexity = c; } protected: int convexity; }; openscad-2019.05/src/GeometryCache.cc0000644000076500000240000000302213433421332017707 0ustar kintelstaff00000000000000#include "GeometryCache.h" #include "printutils.h" #include "Geometry.h" #ifdef DEBUG #ifndef ENABLE_CGAL #define ENABLE_CGAL #endif #include "CGAL_Nef_polyhedron.h" #endif GeometryCache *GeometryCache::inst = nullptr; shared_ptr GeometryCache::get(const std::string &id) const { const auto &geom = this->cache[id]->geom; #ifdef DEBUG PRINTDB("Geometry Cache hit: %s (%d bytes)", id.substr(0, 40) % (geom ? geom->memsize() : 0)); #endif return geom; } bool GeometryCache::insert(const std::string &id, const shared_ptr &geom) { auto inserted = this->cache.insert(id, new cache_entry(geom), geom ? geom->memsize() : 0); #ifdef DEBUG assert(!dynamic_cast(geom.get())); if (inserted) PRINTDB("Geometry Cache insert: %s (%d bytes)", id.substr(0, 40) % (geom ? geom->memsize() : 0)); else PRINTDB("Geometry Cache insert failed: %s (%d bytes)", id.substr(0, 40) % (geom ? geom->memsize() : 0)); #endif return inserted; } size_t GeometryCache::maxSizeMB() const { return this->cache.maxCost()/(1024*1024); } void GeometryCache::setMaxSizeMB(size_t limit) { this->cache.setMaxCost(limit*1024*1024); } void GeometryCache::print() { PRINTB("Geometries in cache: %d", this->cache.size()); PRINTB("Geometry cache size in bytes: %d", this->cache.totalCost()); } GeometryCache::cache_entry::cache_entry(const shared_ptr &geom) : geom(geom) { if (print_messages_stack.size() > 0) this->msg = print_messages_stack.back(); } openscad-2019.05/src/GeometryCache.h0000644000076500000240000000152513432700636017565 0ustar kintelstaff00000000000000#pragma once #include "cache.h" #include "memory.h" #include "Geometry.h" class GeometryCache { public: GeometryCache(size_t memorylimit = 100*1024*1024) : cache(memorylimit) {} static GeometryCache *instance() { if (!inst) inst = new GeometryCache; return inst; } bool contains(const std::string &id) const { return this->cache.contains(id); } shared_ptr get(const std::string &id) const; bool insert(const std::string &id, const shared_ptr &geom); size_t maxSizeMB() const; void setMaxSizeMB(size_t limit); void clear() { cache.clear(); } void print(); private: static GeometryCache *inst; struct cache_entry { shared_ptr geom; std::string msg; cache_entry(const shared_ptr &geom); ~cache_entry() { } }; Cache cache; }; openscad-2019.05/src/GeometryEvaluator.cc0000644000076500000240000010777013441031431020661 0ustar kintelstaff00000000000000#include "GeometryEvaluator.h" #include "Tree.h" #include "GeometryCache.h" #include "CGALCache.h" #include "Polygon2d.h" #include "module.h" #include "ModuleInstantiation.h" #include "state.h" #include "offsetnode.h" #include "transformnode.h" #include "linearextrudenode.h" #include "rotateextrudenode.h" #include "csgnode.h" #include "cgaladvnode.h" #include "projectionnode.h" #include "csgops.h" #include "textnode.h" #include "CGAL_Nef_polyhedron.h" #include "cgalutils.h" #include "rendernode.h" #include "clipper-utils.h" #include "polyset-utils.h" #include "polyset.h" #include "calc.h" #include "printutils.h" #include "svg.h" #include "calc.h" #include "dxfdata.h" #include "degree_trig.h" #include // C alternative tokens (xor) #include #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #pragma pop_macro("NDEBUG") GeometryEvaluator::GeometryEvaluator(const class Tree &tree): tree(tree) { } /*! Set allownef to false to force the result to _not_ be a Nef polyhedron */ shared_ptr GeometryEvaluator::evaluateGeometry(const AbstractNode &node, bool allownef) { const std::string &key = this->tree.getIdString(node); if (!GeometryCache::instance()->contains(key)) { shared_ptr N; if (CGALCache::instance()->contains(key)) { N = CGALCache::instance()->get(key); } // If not found in any caches, we need to evaluate the geometry if (N) { this->root = N; } else { this->traverse(node); } if (!allownef) { if (shared_ptr N = dynamic_pointer_cast(this->root)) { PolySet *ps = new PolySet(3); ps->setConvexity(N->getConvexity()); this->root.reset(ps); if (!N->isEmpty()) { bool err = CGALUtils::createPolySetFromNefPolyhedron3(*N->p3, *ps); if (err) { PRINT("ERROR: Nef->PolySet failed"); } } } // We cannot render concave polygons, so tessellate any 3D PolySets auto ps = dynamic_pointer_cast(this->root); if (ps && !ps->isEmpty()) { // Since is_convex() doesn't handle non-planar faces, we need to tessellate // also in the indeterminate state so we cannot just use a boolean comparison. See #1061 bool convex{ps->convexValue()}; if (!convex) { assert(ps->getDimension() == 3); auto ps_tri = new PolySet(3, ps->convexValue()); ps_tri->setConvexity(ps->getConvexity()); PolysetUtils::tessellate_faces(*ps, *ps_tri); this->root.reset(ps_tri); } } } smartCacheInsert(node, this->root); return this->root; } return GeometryCache::instance()->get(key); } GeometryEvaluator::ResultObject GeometryEvaluator::applyToChildren(const AbstractNode &node, OpenSCADOperator op) { unsigned int dim = 0; for(const auto &item : this->visitedchildren[node.index()]) { if (!item.first->modinst->isBackground() && item.second) { if (!dim) dim = item.second->getDimension(); else if (dim != item.second->getDimension()) { std::string loc = item.first->modinst->location().toRelativeString(this->tree.getDocumentPath()); PRINTB("WARNING: Mixing 2D and 3D objects is not supported, %s", loc); break; } } } if (dim == 2) { Polygon2d *p2d = applyToChildren2D(node, op); assert(p2d); return ResultObject(p2d); } else if (dim == 3) return applyToChildren3D(node, op); return ResultObject(); } /*! Applies the operator to all child nodes of the given node. May return nullptr or any 3D Geometry object (can be either PolySet or CGAL_Nef_polyhedron) */ GeometryEvaluator::ResultObject GeometryEvaluator::applyToChildren3D(const AbstractNode &node, OpenSCADOperator op) { Geometry::Geometries children = collectChildren3D(node); if (children.size() == 0) return ResultObject(); if (op == OpenSCADOperator::HULL) { PolySet *ps = new PolySet(3, true); if (CGALUtils::applyHull(children, *ps)) { return ps; } delete ps; return ResultObject(); } // Only one child -> this is a noop if (children.size() == 1) return ResultObject(children.front().second); if (op == OpenSCADOperator::MINKOWSKI) { Geometry::Geometries actualchildren; for(const auto &item : children) { if (!item.second->isEmpty()) actualchildren.push_back(item); } if (actualchildren.empty()) return ResultObject(); if (actualchildren.size() == 1) return ResultObject(actualchildren.front().second); return ResultObject(CGALUtils::applyMinkowski(actualchildren)); } CGAL_Nef_polyhedron *N = CGALUtils::applyOperator(children, op); // FIXME: Clarify when we can return nullptr and what that means if (!N) N = new CGAL_Nef_polyhedron; return ResultObject(N); } /*! Apply 2D hull. May return an empty geometry but will not return nullptr. */ Polygon2d *GeometryEvaluator::applyHull2D(const AbstractNode &node) { std::vector children = collectChildren2D(node); Polygon2d *geometry = new Polygon2d(); typedef CGAL::Point_2> CGALPoint2; // Collect point cloud std::list points; for(const auto &p : children) { for(const auto &o : p->outlines()) { for(const auto &v : o.vertices) { points.push_back(CGALPoint2(v[0], v[1])); } } } if (points.size() > 0) { // Apply hull std::list result; CGAL::convex_hull_2(points.begin(), points.end(), std::back_inserter(result)); // Construct Polygon2d Outline2d outline; for(const auto &p : result) { outline.vertices.push_back(Vector2d(p[0], p[1])); } geometry->addOutline(outline); } return geometry; } Geometry *GeometryEvaluator::applyHull3D(const AbstractNode &node) { Geometry::Geometries children = collectChildren3D(node); PolySet *P = new PolySet(3); if (CGALUtils::applyHull(children, *P)) { return P; } delete P; return nullptr; } Polygon2d *GeometryEvaluator::applyMinkowski2D(const AbstractNode &node) { std::vector children = collectChildren2D(node); if (!children.empty()) { return ClipperUtils::applyMinkowski(children); } return nullptr; } /*! Returns a list of Polygon2d children of the given node. May return empty Polygon2d object, but not nullptr objects */ std::vector GeometryEvaluator::collectChildren2D(const AbstractNode &node) { std::vector children; for(const auto &item : this->visitedchildren[node.index()]) { const AbstractNode *chnode = item.first; const shared_ptr &chgeom = item.second; if (chnode->modinst->isBackground()) continue; // NB! We insert into the cache here to ensure that all children of // a node is a valid object. If we inserted as we created them, the // cache could have been modified before we reach this point due to a large // sibling object. smartCacheInsert(*chnode, chgeom); if (chgeom) { if (chgeom->getDimension() == 2) { const Polygon2d *polygons = dynamic_cast(chgeom.get()); assert(polygons); children.push_back(polygons); } else { std::string loc = item.first->modinst->location().toRelativeString(this->tree.getDocumentPath()); PRINTB("WARNING: Ignoring 3D child object for 2D operation, %s", loc); } } } return children; } /*! Since we can generate both Nef and non-Nef geometry, we need to insert it into the appropriate cache. This method inserts the geometry into the appropriate cache if it's not already cached. */ void GeometryEvaluator::smartCacheInsert(const AbstractNode &node, const shared_ptr &geom) { const std::string &key = this->tree.getIdString(node); shared_ptr N = dynamic_pointer_cast(geom); if (N) { if (!CGALCache::instance()->contains(key)) CGALCache::instance()->insert(key, N); } else { if (!GeometryCache::instance()->contains(key)) { if (!GeometryCache::instance()->insert(key, geom)) { PRINT("WARNING: GeometryEvaluator: Node didn't fit into cache"); } } } } bool GeometryEvaluator::isSmartCached(const AbstractNode &node) { const std::string &key = this->tree.getIdString(node); return (GeometryCache::instance()->contains(key) || CGALCache::instance()->contains(key)); } shared_ptr GeometryEvaluator::smartCacheGet(const AbstractNode &node, bool preferNef) { const std::string &key = this->tree.getIdString(node); shared_ptr geom; bool hasgeom = GeometryCache::instance()->contains(key); bool hascgal = CGALCache::instance()->contains(key); if (hascgal && (preferNef || !hasgeom)) geom = CGALCache::instance()->get(key); else if (hasgeom) geom = GeometryCache::instance()->get(key); return geom; } /*! Returns a list of 3D Geometry children of the given node. May return empty geometries, but not nullptr objects */ Geometry::Geometries GeometryEvaluator::collectChildren3D(const AbstractNode &node) { Geometry::Geometries children; for(const auto &item : this->visitedchildren[node.index()]) { const AbstractNode *chnode = item.first; const shared_ptr &chgeom = item.second; if (chnode->modinst->isBackground()) continue; // NB! We insert into the cache here to ensure that all children of // a node is a valid object. If we inserted as we created them, the // cache could have been modified before we reach this point due to a large // sibling object. smartCacheInsert(*chnode, chgeom); if (chgeom) { if (chgeom->getDimension() == 2) { std::string loc = item.first->modinst->location().toRelativeString(this->tree.getDocumentPath()); PRINTB("WARNING: Ignoring 2D child object for 3D operation, %s", loc); } else if (chgeom->isEmpty() || chgeom->getDimension() == 3) { children.push_back(item); } } } return children; } /*! */ Polygon2d *GeometryEvaluator::applyToChildren2D(const AbstractNode &node, OpenSCADOperator op) { node.progress_report(); if (op == OpenSCADOperator::MINKOWSKI) { return applyMinkowski2D(node); } else if (op == OpenSCADOperator::HULL) { return applyHull2D(node); } std::vector children = collectChildren2D(node); if (children.empty()) { return nullptr; } if (children.size() == 1) { return new Polygon2d(*children[0]); // Copy } ClipperLib::ClipType clipType; switch (op) { case OpenSCADOperator::UNION: clipType = ClipperLib::ctUnion; break; case OpenSCADOperator::INTERSECTION: clipType = ClipperLib::ctIntersection; break; case OpenSCADOperator::DIFFERENCE: clipType = ClipperLib::ctDifference; break; default: PRINTB("Error: Unknown boolean operation %d", int(op)); return nullptr; break; } return ClipperUtils::apply(children, clipType); } /*! Adds ourself to our parent's list of traversed children. Call this for _every_ node which affects output during traversal. Usually, this should be called from the postfix stage, but for some nodes, we defer traversal letting other components (e.g. CGAL) render the subgraph, and we'll then call this from prefix and prune further traversal. The added geometry can be nullptr if it wasn't possible to evaluate it. */ void GeometryEvaluator::addToParent(const State &state, const AbstractNode &node, const shared_ptr &geom) { this->visitedchildren.erase(node.index()); if (state.parent()) { this->visitedchildren[state.parent()->index()].push_back(std::make_pair(&node, geom)); } else { // Root node this->root = geom; assert(this->visitedchildren.empty()); } } /*! Custom nodes are handled here => implicit union */ Response GeometryEvaluator::visit(State &state, const AbstractNode &node) { if (state.isPrefix()) { if (isSmartCached(node)) return Response::PruneTraversal; state.setPreferNef(true); // Improve quality of CSG by avoiding conversion loss } if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { geom = applyToChildren(node, OpenSCADOperator::UNION).constptr(); } else { geom = smartCacheGet(node, state.preferNef()); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } /*! */ Response GeometryEvaluator::visit(State &state, const GroupNode &node) { return visit(state, (const AbstractNode &)node); } Response GeometryEvaluator::visit(State &state, const RootNode &node) { // Just union the top-level objects return visit(state, (const GroupNode &)node); } Response GeometryEvaluator::visit(State &state, const OffsetNode &node) { if (state.isPrefix() && isSmartCached(node)) return Response::PruneTraversal; if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { const Geometry *geometry = applyToChildren2D(node, OpenSCADOperator::UNION); if (geometry) { const Polygon2d *polygon = dynamic_cast(geometry); // ClipperLib documentation: The formula for the number of steps in a full // circular arc is ... Pi / acos(1 - arc_tolerance / abs(delta)) double n = Calc::get_fragments_from_r(std::abs(node.delta), node.fn, node.fs, node.fa); double arc_tolerance = std::abs(node.delta) * (1 - cos_degrees(180 / n)); const Polygon2d *result = ClipperUtils::applyOffset(*polygon, node.delta, node.join_type, node.miter_limit, arc_tolerance); assert(result); geom.reset(result); delete geometry; } } else { geom = smartCacheGet(node, false); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } /*! RenderNodes just pass on convexity */ Response GeometryEvaluator::visit(State &state, const RenderNode &node) { if (state.isPrefix()) { if (isSmartCached(node)) return Response::PruneTraversal; state.setPreferNef(true); // Improve quality of CSG by avoiding conversion loss } if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { ResultObject res = applyToChildren(node, OpenSCADOperator::UNION); geom = res.constptr(); if (shared_ptr ps = dynamic_pointer_cast(geom)) { // If we got a const object, make a copy shared_ptr newps; if (res.isConst()) newps.reset(new PolySet(*ps)); else newps = dynamic_pointer_cast(res.ptr()); newps->setConvexity(node.convexity); geom = newps; } else if (shared_ptr N = dynamic_pointer_cast(geom)) { // If we got a const object, make a copy shared_ptr newN; if (res.isConst()) newN.reset((CGAL_Nef_polyhedron*)N->copy()); else newN = dynamic_pointer_cast(res.ptr()); newN->setConvexity(node.convexity); geom = newN; } } else { geom = smartCacheGet(node, state.preferNef()); } node.progress_report(); addToParent(state, node, geom); } return Response::ContinueTraversal; } /*! Leaf nodes can create their own geometry, so let them do that input: None output: PolySet or Polygon2d */ Response GeometryEvaluator::visit(State &state, const LeafNode &node) { if (state.isPrefix()) { shared_ptr geom; if (!isSmartCached(node)) { const Geometry *geometry = node.createGeometry(); assert(geometry); if (const Polygon2d *polygon = dynamic_cast(geometry)) { if (!polygon->isSanitized()) { Polygon2d *p = ClipperUtils::sanitize(*polygon); delete geometry; geometry = p; } } geom.reset(geometry); } else geom = smartCacheGet(node, state.preferNef()); addToParent(state, node, geom); node.progress_report(); } return Response::PruneTraversal; } Response GeometryEvaluator::visit(State &state, const TextNode &node) { if (state.isPrefix()) { shared_ptr geom; if (!isSmartCached(node)) { std::vector geometrylist = node.createGeometryList(); std::vector polygonlist; for(const auto &geometry : geometrylist) { const Polygon2d *polygon = dynamic_cast(geometry); assert(polygon); polygonlist.push_back(polygon); } geom.reset(ClipperUtils::apply(polygonlist, ClipperLib::ctUnion)); } else geom = GeometryCache::instance()->get(this->tree.getIdString(node)); addToParent(state, node, geom); node.progress_report(); } return Response::PruneTraversal; } /*! input: List of 2D or 3D objects (not mixed) output: Polygon2d or 3D PolySet operation: o Perform csg op on children */ Response GeometryEvaluator::visit(State &state, const CsgOpNode &node) { if (state.isPrefix()) { if (isSmartCached(node)) return Response::PruneTraversal; state.setPreferNef(true); // Improve quality of CSG by avoiding conversion loss } if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { geom = applyToChildren(node, node.type).constptr(); } else { geom = smartCacheGet(node, state.preferNef()); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } /*! input: List of 2D or 3D objects (not mixed) output: Polygon2d or 3D PolySet operation: o Union all children o Perform transform */ Response GeometryEvaluator::visit(State &state, const TransformNode &node) { if (state.isPrefix() && isSmartCached(node)) return Response::PruneTraversal; if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { if (matrix_contains_infinity(node.matrix) || matrix_contains_nan(node.matrix)) { // due to the way parse/eval works we can't currently distinguish between NaN and Inf std::string loc = node.modinst->location().toRelativeString(this->tree.getDocumentPath()); PRINTB("WARNING: Transformation matrix contains Not-a-Number and/or Infinity - removing object. %s", loc); } else { // First union all children ResultObject res = applyToChildren(node, OpenSCADOperator::UNION); if ((geom = res.constptr())) { if (geom->getDimension() == 2) { shared_ptr polygons = dynamic_pointer_cast(geom); assert(polygons); // If we got a const object, make a copy shared_ptr newpoly; if (res.isConst()) newpoly.reset(new Polygon2d(*polygons)); else newpoly = dynamic_pointer_cast(res.ptr()); Transform2d mat2; mat2.matrix() << node.matrix(0,0), node.matrix(0,1), node.matrix(0,3), node.matrix(1,0), node.matrix(1,1), node.matrix(1,3), node.matrix(3,0), node.matrix(3,1), node.matrix(3,3); newpoly->transform(mat2); // A 2D transformation may flip the winding order of a polygon. // If that happens with a sanitized polygon, we need to reverse // the winding order for it to be correct. if (newpoly->isSanitized() && mat2.matrix().determinant() <= 0) { geom.reset(ClipperUtils::sanitize(*newpoly)); } } else if (geom->getDimension() == 3) { shared_ptr ps = dynamic_pointer_cast(geom); if (ps) { // If we got a const object, make a copy shared_ptr newps; if (res.isConst()) newps.reset(new PolySet(*ps)); else newps = dynamic_pointer_cast(res.ptr()); newps->transform(node.matrix); geom = newps; } else { shared_ptr N = dynamic_pointer_cast(geom); assert(N); // If we got a const object, make a copy shared_ptr newN; if (res.isConst()) newN.reset((CGAL_Nef_polyhedron*)N->copy()); else newN = dynamic_pointer_cast(res.ptr()); newN->transform(node.matrix); geom = newN; } } } } } else { geom = smartCacheGet(node, state.preferNef()); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } static void translate_PolySet(PolySet &ps, const Vector3d &translation) { for(auto &p : ps.polygons) { for(auto &v : p) { v += translation; } } } static void add_slice(PolySet *ps, const Polygon2d &poly, double rot1, double rot2, double h1, double h2, const Vector2d &scale1, const Vector2d &scale2) { Eigen::Affine2d trans1(Eigen::Scaling(scale1) * Eigen::Affine2d(rotate_degrees(-rot1))); Eigen::Affine2d trans2(Eigen::Scaling(scale2) * Eigen::Affine2d(rotate_degrees(-rot2))); bool splitfirst = sin_degrees(rot1 - rot2) > 0.0; for(const auto &o : poly.outlines()) { Vector2d prev1 = trans1 * o.vertices[0]; Vector2d prev2 = trans2 * o.vertices[0]; for (size_t i=1;i<=o.vertices.size();i++) { Vector2d curr1 = trans1 * o.vertices[i % o.vertices.size()]; Vector2d curr2 = trans2 * o.vertices[i % o.vertices.size()]; ps->append_poly(); // Make sure to split negative outlines correctly if (splitfirst xor !o.positive) { ps->insert_vertex(prev1[0], prev1[1], h1); ps->insert_vertex(curr2[0], curr2[1], h2); ps->insert_vertex(curr1[0], curr1[1], h1); if (scale2[0] > 0 || scale2[1] > 0) { ps->append_poly(); ps->insert_vertex(curr2[0], curr2[1], h2); ps->insert_vertex(prev1[0], prev1[1], h1); ps->insert_vertex(prev2[0], prev2[1], h2); } } else { ps->insert_vertex(prev1[0], prev1[1], h1); ps->insert_vertex(prev2[0], prev2[1], h2); ps->insert_vertex(curr1[0], curr1[1], h1); if (scale2[0] > 0 || scale2[1] > 0) { ps->append_poly(); ps->insert_vertex(prev2[0], prev2[1], h2); ps->insert_vertex(curr2[0], curr2[1], h2); ps->insert_vertex(curr1[0], curr1[1], h1); } } prev1 = curr1; prev2 = curr2; } } } /*! Input to extrude should be sanitized. This means non-intersecting, correct winding order etc., the input coming from a library like Clipper. */ static Geometry *extrudePolygon(const LinearExtrudeNode &node, const Polygon2d &poly) { boost::tribool isConvex{poly.is_convex()}; // Twise or non-uniform scale makes convex polygons into unknown polyhedrons if (isConvex && (node.twist != 0 || node.scale_x != node.scale_y)) isConvex = unknown; PolySet *ps = new PolySet(3, isConvex); ps->setConvexity(node.convexity); if (node.height <= 0) return ps; double h1, h2; if (node.center) { h1 = -node.height/2.0; h2 = +node.height/2.0; } else { h1 = 0; h2 = node.height; } PolySet *ps_bottom = poly.tessellate(); // bottom // Flip vertex ordering for bottom polygon for(auto &p : ps_bottom->polygons) { std::reverse(p.begin(), p.end()); } translate_PolySet(*ps_bottom, Vector3d(0,0,h1)); ps->append(*ps_bottom); delete ps_bottom; if (node.scale_x > 0 || node.scale_y > 0) { Polygon2d top_poly(poly); Eigen::Affine2d trans(Eigen::Scaling(node.scale_x, node.scale_y) * Eigen::Affine2d(rotate_degrees(-node.twist))); top_poly.transform(trans); // top PolySet *ps_top = top_poly.tessellate(); translate_PolySet(*ps_top, Vector3d(0,0,h2)); ps->append(*ps_top); delete ps_top; } size_t slices = node.slices; for (unsigned int j = 0; j < slices; j++) { double rot1 = node.twist*j / slices; double rot2 = node.twist*(j+1) / slices; double height1 = h1 + (h2-h1)*j / slices; double height2 = h1 + (h2-h1)*(j+1) / slices; Vector2d scale1(1 - (1-node.scale_x)*j / slices, 1 - (1-node.scale_y)*j / slices); Vector2d scale2(1 - (1-node.scale_x)*(j+1) / slices, 1 - (1-node.scale_y)*(j+1) / slices); add_slice(ps, poly, rot1, rot2, height1, height2, scale1, scale2); } return ps; } /*! input: List of 2D objects output: 3D PolySet operation: o Union all children o Perform extrude */ Response GeometryEvaluator::visit(State &state, const LinearExtrudeNode &node) { if (state.isPrefix() && isSmartCached(node)) return Response::PruneTraversal; if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { const Geometry *geometry = nullptr; if (!node.filename.empty()) { DxfData dxf(node.fn, node.fs, node.fa, node.filename, node.layername, node.origin_x, node.origin_y, node.scale_x); Polygon2d *p2d = dxf.toPolygon2d(); if (p2d) geometry = ClipperUtils::sanitize(*p2d); delete p2d; } else { geometry = applyToChildren2D(node, OpenSCADOperator::UNION); } if (geometry) { const Polygon2d *polygons = dynamic_cast(geometry); Geometry *extruded = extrudePolygon(node, *polygons); assert(extruded); geom.reset(extruded); delete geometry; } } else { geom = smartCacheGet(node, false); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } static void fill_ring(std::vector &ring, const Outline2d &o, double a, bool flip) { if (flip) { unsigned int l = o.vertices.size()-1; for (unsigned int i=0 ;isetConvexity(node.convexity); double min_x = 0; double max_x = 0; unsigned int fragments = 0; for(const auto &o : poly.outlines()) { for(const auto &v : o.vertices) { min_x = fmin(min_x, v[0]); max_x = fmax(max_x, v[0]); if ((max_x - min_x) > max_x && (max_x - min_x) > fabs(min_x)) { PRINTB("ERROR: all points for rotate_extrude() must have the same X coordinate sign (range is %.2f -> %.2f)", min_x % max_x); delete ps; return nullptr; } } fragments = (unsigned int)fmax(Calc::get_fragments_from_r(max_x - min_x, node.fn, node.fs, node.fa) * std::abs(node.angle) / 360, 1); } bool flip_faces = (min_x >= 0 && node.angle > 0 && node.angle != 360) || (min_x < 0 && (node.angle < 0 || node.angle == 360)); if (node.angle != 360) { PolySet *ps_start = poly.tessellate(); // starting face Transform3d rot(angle_axis_degrees(90, Vector3d::UnitX())); ps_start->transform(rot); // Flip vertex ordering if (!flip_faces) { for(auto &p : ps_start->polygons) { std::reverse(p.begin(), p.end()); } } ps->append(*ps_start); delete ps_start; PolySet *ps_end = poly.tessellate(); Transform3d rot2(angle_axis_degrees(node.angle, Vector3d::UnitZ()) * angle_axis_degrees(90, Vector3d::UnitX())); ps_end->transform(rot2); if (flip_faces) { for(auto &p : ps_end->polygons) { std::reverse(p.begin(), p.end()); } } ps->append(*ps_end); delete ps_end; } for(const auto &o : poly.outlines()) { std::vector rings[2]; rings[0].resize(o.vertices.size()); rings[1].resize(o.vertices.size()); fill_ring(rings[0], o, (node.angle == 360) ? -90 : 90, flip_faces); // first ring for (unsigned int j = 0; j < fragments; j++) { double a; if (node.angle == 360) a = -90 + ((j+1)%fragments) * 360.0 / fragments; // start on the -X axis, for legacy support else a = 90 - (j+1)* node.angle / fragments; // start on the X axis fill_ring(rings[(j+1)%2], o, a, flip_faces); for (size_t i=0;iappend_poly(); ps->insert_vertex(rings[j%2][i]); ps->insert_vertex(rings[(j+1)%2][(i+1)%o.vertices.size()]); ps->insert_vertex(rings[j%2][(i+1)%o.vertices.size()]); ps->append_poly(); ps->insert_vertex(rings[j%2][i]); ps->insert_vertex(rings[(j+1)%2][i]); ps->insert_vertex(rings[(j+1)%2][(i+1)%o.vertices.size()]); } } } return ps; } /*! input: List of 2D objects output: 3D PolySet operation: o Union all children o Perform extrude */ Response GeometryEvaluator::visit(State &state, const RotateExtrudeNode &node) { if (state.isPrefix() && isSmartCached(node)) return Response::PruneTraversal; if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { const Geometry *geometry = nullptr; if (!node.filename.empty()) { DxfData dxf(node.fn, node.fs, node.fa, node.filename, node.layername, node.origin_x, node.origin_y, node.scale); Polygon2d *p2d = dxf.toPolygon2d(); if (p2d) geometry = ClipperUtils::sanitize(*p2d); delete p2d; } else { geometry = applyToChildren2D(node, OpenSCADOperator::UNION); } if (geometry) { const Polygon2d *polygons = dynamic_cast(geometry); Geometry *rotated = rotatePolygon(node, *polygons); geom.reset(rotated); delete geometry; } } else { geom = smartCacheGet(node, false); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } /*! FIXME: Not in use */ Response GeometryEvaluator::visit(State & /*state*/, const AbstractPolyNode & /*node*/) { assert(false); return Response::AbortTraversal; } /*! input: List of 3D objects output: Polygon2d operation: o Union all children o Perform projection */ Response GeometryEvaluator::visit(State &state, const ProjectionNode &node) { if (state.isPrefix() && isSmartCached(node)) return Response::PruneTraversal; if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { if (!node.cut_mode) { ClipperLib::Clipper sumclipper; for(const auto &item : this->visitedchildren[node.index()]) { const AbstractNode *chnode = item.first; const shared_ptr &chgeom = item.second; // FIXME: Don't use deep access to modinst members if (chnode->modinst->isBackground()) continue; const Polygon2d *poly = nullptr; // CGAL version of Geometry projection // Causes crashes in createNefPolyhedronFromGeometry() for this model: // projection(cut=false) { // cube(10); // difference() { // sphere(10); // cylinder(h=30, r=5, center=true); // } // } #if 0 shared_ptr chPS = dynamic_pointer_cast(chgeom); const PolySet *ps2d = nullptr; shared_ptr chN = dynamic_pointer_cast(chgeom); if (chN) chPS.reset(chN->convertToPolyset()); if (chPS) ps2d = PolysetUtils::flatten(*chPS); if (ps2d) { CGAL_Nef_polyhedron *N2d = CGALUtils::createNefPolyhedronFromGeometry(*ps2d); poly = N2d->convertToPolygon2d(); } #endif // Clipper version of Geometry projection // Clipper doesn't handle meshes very well. // It's better in V6 but not quite there. FIXME: stand-alone example. #if 1 // project chgeom -> polygon2d shared_ptr chPS = dynamic_pointer_cast(chgeom); if (!chPS) { shared_ptr chN = dynamic_pointer_cast(chgeom); if (chN) { PolySet *ps = new PolySet(3); bool err = CGALUtils::createPolySetFromNefPolyhedron3(*chN->p3, *ps); if (err) { PRINT("ERROR: Nef->PolySet failed"); } else { chPS.reset(ps); } } } if (chPS) poly = PolysetUtils::project(*chPS); #endif if (poly) { ClipperLib::Paths result = ClipperUtils::fromPolygon2d(*poly); // Using NonZero ensures that we don't create holes from polygons sharing // edges since we're unioning a mesh result = ClipperUtils::process(result, ClipperLib::ctUnion, ClipperLib::pftNonZero); // Add correctly winded polygons to the main clipper sumclipper.AddPaths(result, ClipperLib::ptSubject, true); } delete poly; } ClipperLib::PolyTree sumresult; // This is key - without StrictlySimple, we tend to get self-intersecting results sumclipper.StrictlySimple(true); sumclipper.Execute(ClipperLib::ctUnion, sumresult, ClipperLib::pftNonZero, ClipperLib::pftNonZero); if (sumresult.Total() > 0) geom.reset(ClipperUtils::toPolygon2d(sumresult)); } else { shared_ptr newgeom = applyToChildren3D(node, OpenSCADOperator::UNION).constptr(); if (newgeom) { shared_ptr Nptr = dynamic_pointer_cast(newgeom); if (!Nptr) { Nptr.reset(CGALUtils::createNefPolyhedronFromGeometry(*newgeom)); } if (!Nptr->isEmpty()) { Polygon2d *poly = CGALUtils::project(*Nptr, node.cut_mode); if (poly) { poly->setConvexity(node.convexity); geom.reset(poly); } } } } } else { geom = smartCacheGet(node, false); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } /*! input: List of 2D or 3D objects (not mixed) output: any Geometry operation: o Perform cgal operation */ Response GeometryEvaluator::visit(State &state, const CgaladvNode &node) { if (state.isPrefix() && isSmartCached(node)) return Response::PruneTraversal; if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { switch (node.type) { case CgaladvType::MINKOWSKI: { ResultObject res = applyToChildren(node, OpenSCADOperator::MINKOWSKI); geom = res.constptr(); // If we added convexity, we need to pass it on if (geom && geom->getConvexity() != node.convexity) { shared_ptr editablegeom; // If we got a const object, make a copy if (res.isConst()) editablegeom.reset(geom->copy()); else editablegeom = res.ptr(); geom = editablegeom; editablegeom->setConvexity(node.convexity); } break; } case CgaladvType::HULL: { geom = applyToChildren(node, OpenSCADOperator::HULL).constptr(); break; } case CgaladvType::RESIZE: { ResultObject res = applyToChildren(node, OpenSCADOperator::UNION); geom = res.constptr(); if (geom) { shared_ptr editablegeom; // If we got a const object, make a copy if (res.isConst()) editablegeom.reset(geom->copy()); else editablegeom = res.ptr(); geom = editablegeom; shared_ptr N = dynamic_pointer_cast(editablegeom); if (N) { N->resize(node.newsize, node.autosize); } else { shared_ptr poly = dynamic_pointer_cast(editablegeom); if (poly) { poly->resize(Vector2d(node.newsize[0], node.newsize[1]), Eigen::Matrix(node.autosize[0], node.autosize[1])); } else { shared_ptr ps = dynamic_pointer_cast(editablegeom); if (ps) { ps->resize(node.newsize, node.autosize); } else { assert(false); } } } } break; } default: assert(false && "not implemented"); } } else { geom = smartCacheGet(node, state.preferNef()); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } Response GeometryEvaluator::visit(State &state, const AbstractIntersectionNode &node) { if (state.isPrefix()) { if (isSmartCached(node)) return Response::PruneTraversal; state.setPreferNef(true); // Improve quality of CSG by avoiding conversion loss } if (state.isPostfix()) { shared_ptr geom; if (!isSmartCached(node)) { geom = applyToChildren(node, OpenSCADOperator::INTERSECTION).constptr(); } else { geom = smartCacheGet(node, state.preferNef()); } addToParent(state, node, geom); node.progress_report(); } return Response::ContinueTraversal; } openscad-2019.05/src/GeometryEvaluator.h0000644000076500000240000000627713402025764020534 0ustar kintelstaff00000000000000#pragma once #include "NodeVisitor.h" #include "enums.h" #include "memory.h" #include "Geometry.h" #include #include #include #include class GeometryEvaluator : public NodeVisitor { public: GeometryEvaluator(const class Tree &tree); ~GeometryEvaluator() {} shared_ptr evaluateGeometry(const AbstractNode &node, bool allownef); Response visit(State &state, const AbstractNode &node) override; Response visit(State &state, const AbstractIntersectionNode &node) override; Response visit(State &state, const AbstractPolyNode &node) override; Response visit(State &state, const LinearExtrudeNode &node) override; Response visit(State &state, const RotateExtrudeNode &node) override; Response visit(State &state, const GroupNode &node) override; Response visit(State &state, const RootNode &node) override; Response visit(State &state, const LeafNode &node) override; Response visit(State &state, const TransformNode &node) override; Response visit(State &state, const CsgOpNode &node) override; Response visit(State &state, const CgaladvNode &node) override; Response visit(State &state, const ProjectionNode &node) override; Response visit(State &state, const RenderNode &node) override; Response visit(State &state, const TextNode &node) override; Response visit(State &state, const OffsetNode &node) override; const Tree &getTree() const { return this->tree; } private: class ResultObject { public: ResultObject() : is_const(true) {} ResultObject(const Geometry *g) : is_const(true), const_pointer(g) {} ResultObject(shared_ptr &g) : is_const(true), const_pointer(g) {} ResultObject(Geometry *g) : is_const(false), pointer(g) {} ResultObject(shared_ptr &g) : is_const(false), pointer(g) {} bool isConst() const { return is_const; } shared_ptr ptr() { assert(!is_const); return pointer; } shared_ptr constptr() const { return is_const ? const_pointer : static_pointer_cast(pointer); } private: bool is_const; shared_ptr pointer; shared_ptr const_pointer; }; void smartCacheInsert(const AbstractNode &node, const shared_ptr &geom); shared_ptr smartCacheGet(const AbstractNode &node, bool preferNef); bool isSmartCached(const AbstractNode &node); std::vector collectChildren2D(const AbstractNode &node); Geometry::Geometries collectChildren3D(const AbstractNode &node); Polygon2d *applyMinkowski2D(const AbstractNode &node); Polygon2d *applyHull2D(const AbstractNode &node); Geometry *applyHull3D(const AbstractNode &node); void applyResize3D(class CGAL_Nef_polyhedron &N, const Vector3d &newsize, const Eigen::Matrix &autosize); Polygon2d *applyToChildren2D(const AbstractNode &node, OpenSCADOperator op); ResultObject applyToChildren3D(const AbstractNode &node, OpenSCADOperator op); ResultObject applyToChildren(const AbstractNode &node, OpenSCADOperator op); void addToParent(const State &state, const AbstractNode &node, const shared_ptr &geom); std::map visitedchildren; const Tree &tree; shared_ptr root; public: }; openscad-2019.05/src/GeometryUtils.cc0000644000076500000240000003343713402025764020026 0ustar kintelstaff00000000000000#include "GeometryUtils.h" #include "ext/libtess2/Include/tesselator.h" #include "printutils.h" #include "Reindexer.h" #include #include #include #include static void *stdAlloc(void* userData, unsigned int size) { TESS_NOTUSED(userData); return malloc(size); } static void stdFree(void* userData, void* ptr) { TESS_NOTUSED(userData); free(ptr); } typedef std::pair IndexedEdge; /*! Helper class for keeping track of edges in a mesh. Can probably be replaced with a proper HalfEdge mesh later on */ class EdgeDict { public: // Counts occurrences of edges typedef std::unordered_map> IndexedEdgeDict; EdgeDict() { } void add(const IndexedFace &face) { for (size_t i=0;icount(e) > 0) this->remove(e); else this->add(e.second, e.first); } } void remove(const IndexedTriangle &t) { for (int i=0;i<3;i++) { IndexedEdge e(t[i], t[(i+1)%3]); // If the edge exist, remove it if (this->count(e) > 0) this->remove(e); else this->add(e.second, e.first); } } void add(const IndexedTriangle &t) { for (int i=0;i<3;i++) { IndexedEdge e(t[(i+1)%3], t[i]); // If an opposite edge exists, they cancel out if (this->count(e) > 0) this->remove(e); else this->add(e.second, e.first); } } void add(int start, int end) { this->add(IndexedEdge(start,end)); } void add(const IndexedEdge &e) { this->edges[e]++; PRINTDB("add: (%d,%d)", e.first % e.second); } void remove(int start, int end) { this->remove(IndexedEdge(start,end)); } void remove(const IndexedEdge &e) { this->edges[e]--; if (this->edges[e] == 0) this->edges.erase(e); PRINTDB("remove: (%d,%d)", e.first % e.second); } int count(int start, int end) { return this->count(IndexedEdge(start, end)); } int count(const IndexedEdge &e) { auto it = this->edges.find(e); if (it != edges.end()) return it->second; return 0; } bool empty() const { return this->edges.empty(); } size_t size() const { return this->edges.size(); } void print() const { for (const auto &v : this->edges) { const auto &e = v.first; PRINTDB(" (%d,%d)%s", e.first % e.second % ((v.second > 1) ? boost::lexical_cast(v.second).c_str() : "")); } } void remove_from_v2e(int vidx, int next, int prev) { auto &l = v2e[vidx]; auto it = std::find(l.begin(), l.end(), next); if (it != l.end()) l.erase(it); if (l.empty()) v2e.erase(vidx); auto &l2 = v2e_reverse[vidx]; it = std::find(l2.begin(), l2.end(), prev); if (it != l2.end()) l2.erase(it); if (l2.empty()) v2e_reverse.erase(vidx); } void extractTriangle(int vidx, int next, std::vector &triangles) { assert(v2e_reverse.find(vidx) != v2e_reverse.end()); assert(!v2e_reverse[vidx].empty()); auto prev = v2e_reverse[vidx].front(); IndexedTriangle t(prev, vidx, next); PRINTDB("Clipping ear: %d %d %d", t[0] % t[1] % t[2]); triangles.push_back(t); // Remove the generated triangle from the original. // Add new boundary edges to the edge dict this->remove(t); // If next->prev doesn't exists, add prev->next auto v2eit = std::find(v2e[next].begin(), v2e[next].end(), prev); if (v2eit == v2e[next].end()) { v2e[prev].push_back(next); v2e_reverse[next].push_back(prev); } remove_from_v2e(vidx, next, prev); remove_from_v2e(prev, vidx, next); remove_from_v2e(next, prev, vidx); } // Triangulate remaining loops and add to triangles void triangulateLoops(std::vector &triangles) { // First, look for self-intersections in edges v2e.clear(); v2e_reverse.clear(); for (const auto &v : this->edges) { const auto &e = v.first; for (int i=0;i>::iterator it; for (it = v2e.begin();it != v2e.end();it++) { if (it->second.size() == 1) { // First single vertex auto vidx = it->first; auto next = it->second.front(); extractTriangle(vidx, next, triangles); break; } } // Only duplicate vertices left if (it == v2e.end() && !v2e.empty()) { auto vidx = v2e.begin()->first; auto next = v2e.begin()->second.front(); extractTriangle(vidx, next, triangles); } } } IndexedEdgeDict edges; std::unordered_map> v2e; std::unordered_map> v2e_reverse; }; /*! Tessellates input contours into a triangle mesh. The input contours may consist of positive (CCW) and negative (CW) contours. These define holes, and possibly islands. The output will be written as indices into the input vertex vector. This function should be robust wrt. malformed input. It will only use existing vertices and is guaranteed to maintain connectivity if the input polygon is part of a polygon mesh. One requirement: The input vertices must be distinct (i.e. duplicated must resolve to the same index). Returns true on error, false on success. */ bool GeometryUtils::tessellatePolygonWithHoles(const Vector3f *vertices, const std::vector &faces, std::vector &triangles, const Vector3f *normal) { // Algorithm outline: // o Remove consecutive equal vertices and null ears (i.e. 23,24,23) // o Ignore polygons with < 3 vertices // o Pass-through polygons with 3 vertices // o Pass polygon to libtess2 // o Postprocess to clean up misbehaviors in libtess2 // No polygon. FIXME: Will this ever happen or can we assert here? if (faces.empty()) return false; // Remove consecutive equal vertices, as well as null ears auto cleanfaces = faces; for (auto &face : cleanfaces) { size_t i=0; while (face.size() >= 3 && i < face.size()) { if (face[i] == face[(i+1)%face.size()]) { // Two consecutively equal indices face.erase(face.begin()+i); } else if (face[(i+face.size()-1)%face.size()] == face[(i+1)%face.size()]) { // Null ear if (i == 0) face.erase(face.begin() + i, face.begin() + i + 2); else face.erase(face.begin() + i - 1, face.begin() + i + 1); i--; } else { // Filter away inf and nan vertices as they cause libtess2 to crash const auto &v = vertices[face[i]]; int k; for (k=0;k<3;k++) { if (std::isnan(v[k]) || std::isinf(v[k])) { face.erase(face.begin()+i); break; } } if (k == 3) i++; } } } // First polygon has < 3 points - no output if (cleanfaces[0].size() < 3) return false; // Remove collapsed holes for (size_t i=1;i contour; // Since libtess2's indices is based on the running number of points added, we need to map back // to our indices. allindices does the mapping. std::vector allindices; for (const auto &face : cleanfaces) { contour.clear(); for (auto idx : face) { const auto &v = vertices[idx]; contour.push_back(v[0]); contour.push_back(v[1]); contour.push_back(v[2]); allindices.push_back(idx); } assert(face.size() >= 3); PRINTDB("Contour: %d\n", face.size()); tessAddContour(tess, 3, &contour.front(), sizeof(TESSreal) * 3, face.size()); numContours++; } if (!tessTesselate(tess, TESS_WINDING_ODD, TESS_CONSTRAINED_DELAUNAY_TRIANGLES, 3, 3, normalvec)) return -1; const auto vindices = tessGetVertexIndices(tess); const auto elements = tessGetElements(tess); auto numelems = tessGetElementCount(tess); /* At this point, we have a delaunay triangle mesh. However, as libtess2 might merge vertices, as well as insert new vertices for intersecting edges, we need to detect these and insert dummy triangles to maintain external connectivity. In addition, libtess2 may generate flipped triangles, i.e. triangles where the edge direction is reversed compared to the input polygon. This will also destroy connectivity and we need to flip those back. */ /* Algorithm: A) Collect all triangles using _only_ existing vertices -> triangles B) Locate all unused vertices C) For each unused vertex, create a triangle connecting it to the existing mesh */ auto inputSize = allindices.size(); // inputSize is number of points added to libtess2 std::vector vflags(inputSize); // Inits with 0's IndexedTriangle tri; IndexedTriangle mappedtri; for (int t=0;t 0) { reverse = false; break; } else if (edges.count(e.second, e.first) > 0) { reverse = true; } } if (reverse) { mappedtri.reverseInPlace(); PRINTDB(" reversed: %d %d %d", mappedtri[0] % mappedtri[1] % mappedtri[2]); } // Remove the generated triangle from the original. // Add new boundary edges to the edge dict edges.remove(mappedtri); triangles.push_back(mappedtri); } } if (!edges.empty()) { PRINTDB(" %d edges remaining after main triangulation", edges.size()); edges.print(); // Collect loops from remaining edges and triangulate loops manually edges.triangulateLoops(triangles); if (!edges.empty()) { PRINTDB(" %d edges remaining after loop triangulation", edges.size()); edges.print(); } } #if 0 for (int i=0;i uniqueVertices; std::vector indexedfaces{{}}; auto &currface = indexedfaces.back(); for (const auto &v : polygon) { auto idx = uniqueVertices.lookup(v.cast()); if (currface.empty() || idx != currface.back()) currface.push_back(idx); } if (currface.front() == currface.back()) currface.pop_back(); if (currface.size() >= 3) { // Cull empty triangles const auto verts = uniqueVertices.getArray(); std::vector indexedtriangles; err = tessellatePolygonWithHoles(verts, indexedfaces, indexedtriangles, normal); for (const auto &t : indexedtriangles) { triangles.push_back(Polygon()); Polygon &p = triangles.back(); p.push_back(verts[t[0]].cast()); p.push_back(verts[t[1]].cast()); p.push_back(verts[t[2]].cast()); } } return err; } int GeometryUtils::findUnconnectedEdges(const std::vector> &polygons) { EdgeDict edges; for (const auto &faces : polygons) { for (const auto &face : faces) { edges.add(face); } } #if 1 // for debugging if (!edges.empty()) { PRINTD("Unconnected:"); edges.print(); } #endif return edges.size(); } int GeometryUtils::findUnconnectedEdges(const std::vector &triangles) { EdgeDict edges; for (const auto &t : triangles) { edges.add(t); } #if 1 // for debugging if (!edges.empty()) { PRINTD("Unconnected:"); edges.print(); } #endif return edges.size(); } openscad-2019.05/src/GeometryUtils.h0000644000076500000240000000213613402025764017660 0ustar kintelstaff00000000000000#pragma once #include "linalg.h" #include typedef std::vector Polygon; typedef std::vector Polygons; typedef std::vector IndexedFace; typedef Vector3i IndexedTriangle; struct IndexedPolygons { std::vector vertices; std::vector faces; }; struct IndexedTriangleMesh { std::vector vertices; std::vector triangles; }; // Indexed polygon mesh, where each polygon can have holes struct IndexedPolyMesh { std::vector vertices; std::vector> polygons; }; namespace GeometryUtils { bool tessellatePolygon(const Polygon &polygon, Polygons &triangles, const Vector3f *normal = nullptr); bool tessellatePolygonWithHoles(const Vector3f *vertices, const std::vector &faces, std::vector &triangles, const Vector3f *normal = nullptr); int findUnconnectedEdges(const std::vector> &polygons); int findUnconnectedEdges(const std::vector &triangles); } openscad-2019.05/src/GroupModule.cc0000644000076500000240000000335413402025764017447 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "GroupModule.h" #include "ModuleInstantiation.h" #include "node.h" #include "builtin.h" #include "evalcontext.h" AbstractNode *GroupModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { (void)ctx; // avoid unusued parameter warning auto node = new GroupNode(inst); inst->scope.apply(*evalctx); auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } void register_builtin_group() { Builtins::init("group", new GroupModule()); } openscad-2019.05/src/GroupModule.h0000644000076500000240000000041513402025764017304 0ustar kintelstaff00000000000000#pragma once #include "module.h" class GroupModule : public AbstractModule { public: GroupModule() { } ~GroupModule() { } class AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, class EvalContext *evalctx = nullptr) const override; }; openscad-2019.05/src/LibraryInfo.cc0000644000076500000240000001253513423455221017424 0ustar kintelstaff00000000000000#include "LibraryInfo.h" #include #include #ifdef USE_SCINTILLA_EDITOR #include #include "input/InputDriverManager.h" #endif #include "version_check.h" #include "PlatformUtils.h" #include "openscad.h" #include "version.h" #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #ifdef ENABLE_CGAL #include "cgal.h" #include #if defined(__GNUG__) #define GCC_INT_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 ) #if GCC_INT_VERSION > 40600 || defined(__clang__) #include #define __openscad_info_demangle__ 1 #endif // GCC_INT_VERSION #endif // GNUG #endif // ENABLE_CGAL #ifdef ENABLE_LIBZIP #include #else #define LIBZIP_VERSION "" #endif extern std::vector librarypath; extern std::vector fontpath; extern const std::string get_lib3mf_version(); extern const std::string get_fontconfig_version(); extern const std::string get_harfbuzz_version(); extern const std::string get_freetype_version(); extern const char * LODEPNG_VERSION_STRING; std::string LibraryInfo::info() { std::ostringstream s; #if defined(__x86_64__) || defined(_M_X64) std::string bits(" 64bit"); #elif defined(__i386) || defined(_M_IX86) std::string bits(" 32bit"); #else std::string bits(""); #endif #if defined(__GNUG__) && !defined(__clang__) std::string compiler_info( "GCC " + std::string(TOSTRING(__VERSION__)) + bits); #elif defined(_MSC_VER) std::string compiler_info( "MSVC " + std::string(TOSTRING(_MSC_FULL_VER)) + bits); #elif defined(__clang__) std::string compiler_info( "Clang " + std::string(TOSTRING(__clang_version__)) + bits); #else std::string compiler_info( "unknown compiler" ); #endif #if defined( __MINGW64__ ) std::string mingwstatus("MingW64"); #elif defined( __MINGW32__ ) std::string mingwstatus("MingW32"); #else std::string mingwstatus("No"); #endif #ifdef DEBUG std::string debugstatus("Yes"); #else std::string debugstatus("No"); #endif #ifndef OPENCSG_VERSION_STRING #define OPENCSG_VERSION_STRING "unknown, <1.3.2" #endif #ifdef QT_VERSION std::string qtVersion = qVersion(); #else std::string qtVersion = "Qt disabled - Commandline Test Version"; #endif #ifdef ENABLE_CGAL std::string cgal_3d_kernel = typeid(CGAL_Kernel3).name(); std::string cgal_2d_kernel = typeid(CGAL_Kernel2).name(); std::string cgal_2d_kernelEx = typeid(CGAL_ExactKernel2).name(); #if defined(__openscad_info_demangle__) int status; cgal_3d_kernel = std::string( abi::__cxa_demangle( cgal_3d_kernel.c_str(), nullptr, nullptr, &status ) ); cgal_2d_kernel = std::string( abi::__cxa_demangle( cgal_2d_kernel.c_str(), nullptr, nullptr, &status ) ); cgal_2d_kernelEx = std::string( abi::__cxa_demangle( cgal_2d_kernelEx.c_str(), nullptr, nullptr, &status ) ); #endif // demangle boost::replace_all( cgal_3d_kernel, "CGAL::", "" ); boost::replace_all( cgal_2d_kernel, "CGAL::", "" ); boost::replace_all( cgal_2d_kernelEx, "CGAL::", "" ); #else // ENABLE_CGAL std::string cgal_3d_kernel = ""; std::string cgal_2d_kernel = ""; std::string cgal_2d_kernelEx = ""; #endif // ENABLE_CGAL const char *env_path = getenv("OPENSCADPATH"); const char *env_font_path = getenv("OPENSCAD_FONT_PATH"); s << "OpenSCAD Version: " << openscad_detailedversionnumber << "\nSystem information: " << PlatformUtils::sysinfo() << "\nUser Agent: " << PlatformUtils::user_agent() << "\nCompiler: " << compiler_info << "\nMinGW build: " << mingwstatus << "\nDebug build: " << debugstatus << "\nBoost version: " << BOOST_LIB_VERSION << "\nEigen version: " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << "\nCGAL version, kernels: " << TOSTRING(CGAL_VERSION) << ", " << cgal_3d_kernel << ", " << cgal_2d_kernel << ", " << cgal_2d_kernelEx << "\nOpenCSG version: " << OPENCSG_VERSION_STRING << "\nQt version: " << qtVersion #ifdef USE_SCINTILLA_EDITOR << "\nQScintilla version: " << QSCINTILLA_VERSION_STR << "\nInputDrivers: " << InputDriverManager::instance()->listDrivers() #endif << "\nGLib version: " << GLIB_MAJOR_VERSION << "." << GLIB_MINOR_VERSION << "." << GLIB_MICRO_VERSION << "\nlodepng version: " << LODEPNG_VERSION_STRING << "\nlibzip version: " << LIBZIP_VERSION << "\nfontconfig version: " << get_fontconfig_version() << "\nfreetype version: " << get_freetype_version() << "\nharfbuzz version: " << get_harfbuzz_version() << "\nlib3mf version: " << get_lib3mf_version() << "\nApplication Path: " << PlatformUtils::applicationPath() << "\nDocuments Path: " << PlatformUtils::documentsPath() << "\nUser Documents Path: " << PlatformUtils::userDocumentsPath() << "\nResource Path: " << PlatformUtils::resourceBasePath() << "\nUser Library Path: " << PlatformUtils::userLibraryPath() << "\nUser Config Path: " << PlatformUtils::userConfigPath() << "\nBackup Path: " << PlatformUtils::backupPath() << "\nOPENSCADPATH: " << (env_path == nullptr ? "" : env_path) << "\nOpenSCAD library path:\n"; for (std::vector::iterator it = librarypath.begin();it != librarypath.end();it++) { s << " " << *it << "\n"; } s << "\nOPENSCAD_FONT_PATH: " << (env_font_path == nullptr ? "" : env_font_path) << "\nOpenSCAD font path:\n"; for (std::vector::iterator it = fontpath.begin();it != fontpath.end();it++) { s << " " << *it << "\n"; } return s.str(); } openscad-2019.05/src/LibraryInfo.h0000644000076500000240000000012013402025764017253 0ustar kintelstaff00000000000000#pragma once #include namespace LibraryInfo { std::string info(); } openscad-2019.05/src/LibraryInfoDialog.cc0000644000076500000240000000247113402025764020544 0ustar kintelstaff00000000000000 #include "LibraryInfoDialog.h" #include #include #include #include "LibraryInfo.h" LibraryInfoDialog::LibraryInfoDialog(const QString& rendererInfo) { setupUi(this); connect(this->okButton, SIGNAL(clicked()), this, SLOT(accept())); update_library_info(rendererInfo); } LibraryInfoDialog::~LibraryInfoDialog() { } void LibraryInfoDialog::update_library_info(const QString& rendererInfo) { //Get library infos QString info(LibraryInfo::info().c_str()); info += rendererInfo; //Parse infos and make it html info = info.replace("\n", "
"); auto end = false; int startIndex = 0; while (!end) { int endIndex = info.indexOf(":", startIndex); if(endIndex != -1) { //add bold to property name info = info.insert(startIndex, ""); endIndex += 3; info = info.replace(endIndex, 1, ":"); startIndex = info.indexOf("
", endIndex); //handle property with multiple lines auto endInd = info.indexOf(":", startIndex); if (endInd != -1) { QStringRef lines(&info, startIndex, endInd - startIndex); auto lastIndex = lines.lastIndexOf("
"); startIndex = lastIndex != -1 ? lastIndex+startIndex : startIndex; } } else { end = true; } } this->infoTextBox->setHtml(info); } openscad-2019.05/src/LibraryInfoDialog.h0000644000076500000240000000053413402025764020404 0ustar kintelstaff00000000000000#pragma once #include #include #include "qtgettext.h" #include "ui_LibraryInfoDialog.h" class LibraryInfoDialog : public QDialog, public Ui::LibraryInfoDialog { Q_OBJECT; public: LibraryInfoDialog(const QString& rendererInfo); ~LibraryInfoDialog(); void update_library_info(const QString& rendererInfo); }; openscad-2019.05/src/LibraryInfoDialog.ui0000644000076500000240000000354213402025764020574 0ustar kintelstaff00000000000000 LibraryInfoDialog 0 0 587 466 Lib & Build Info QLayout::SetDefaultConstraint 6 0 0 0 20 OpenSCAD Detailed Library and Build Information 0 0 true 0 0 &OK openscad-2019.05/src/MainWindow.h0000644000076500000240000002226613461460312017123 0ustar kintelstaff00000000000000#pragma once #include "qtgettext.h" #include #include #include "ui_MainWindow.h" #include "UIUtils.h" #include "openscad.h" #include "builtincontext.h" #include "module.h" #include "ModuleInstantiation.h" #include "Tree.h" #include "memory.h" #include "editor.h" #include "export.h" #include #include #include #include #include #include "input/InputDriver.h" class MainWindow : public QMainWindow, public Ui::MainWindow, public InputEventHandler { Q_OBJECT public: QString fileName; class Preferences *prefs; QTimer *animate_timer; int anim_step; int anim_numsteps; double anim_tval; bool anim_dumping; int anim_dump_start_step; QTimer *autoReloadTimer; std::string autoReloadId; QTimer *waitAfterReloadTimer; QTime renderingTime; BuiltinContext top_ctx; FileModule *root_module; // Result of parsing FileModule *parsed_module; // Last parse for include list ModuleInstantiation root_inst; // Top level instance AbstractNode *absolute_root_node; // Result of tree evaluation AbstractNode *root_node; // Root if the root modifier (!) is used Tree tree; #ifdef ENABLE_CGAL shared_ptr root_geom; class CGALRenderer *cgalRenderer; #endif #ifdef ENABLE_OPENCSG class OpenCSGRenderer *opencsgRenderer; #endif class ThrownTogetherRenderer *thrownTogetherRenderer; QString last_compiled_doc; QAction *actionRecentFile[UIUtils::maxRecentFiles]; QMap knownFileExtensions; QLabel *versionLabel; QWidget *editorDockTitleWidget; QWidget *consoleDockTitleWidget; QWidget *parameterDockTitleWidget; QString editortype; bool useScintilla; int compileErrors; int compileWarnings; MainWindow(const QString &filename); ~MainWindow(); protected: void closeEvent(QCloseEvent *event) override; private slots: void updatedAnimTval(); void updatedAnimFps(); void updatedAnimSteps(); void updatedAnimDump(bool checked); void updateTVal(); void updateMdiMode(bool mdi); void updateUndockMode(bool undockMode); void updateReorderMode(bool reorderMode); void setFileName(const QString &filename); void setFont(const QString &family, uint size); void setColorScheme(const QString &cs); void showProgress(); void openCSGSettingsChanged(); void consoleOutput(const QString &msg); void updateActionUndoState(); private: void initActionIcon(QAction *action, const char *darkResource, const char *lightResource); void handleFileDrop(const QString &filename); void refreshDocument(); void updateCamera(const class FileContext &ctx); void updateTemporalVariables(); bool fileChangedOnDisk(); void parseTopLevelDocument(bool rebuildParameterWidget); void updateCompileResult(); void compile(bool reload, bool forcedone = false, bool rebuildParameterWidget=true); void compileCSG(); bool maybeSave(); void saveError(const QIODevice &file, const std::string &msg); bool checkEditorModified(); QString dumpCSGTree(AbstractNode *root); static void consoleOutput(const std::string &msg, void *userdata); static void noOutput(const std::string &, void*) {}; // /dev/null void loadViewSettings(); void loadDesignSettings(); void updateWindowSettings(bool console, bool editor, bool customizer, bool toolbar); void saveBackup(); void writeBackup(class QFile *file); void show_examples(); void setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel); void addKeyboardShortCut(const QList &actions); void updateStatusBar(class ProgressWidget *progressWidget); void exceptionCleanup(); EditorInterface *editor; class LibraryInfoDialog* library_info_dialog; class FontListDialog *font_list_dialog; private slots: void actionNew(); void actionOpen(); void actionOpenRecent(); void actionOpenExample(); void updateRecentFiles(); void clearRecentFiles(); void updateRecentFileActions(); void actionSave(); void actionSaveAs(); void actionReload(); void actionShowLibraryFolder(); void convertTabsToSpaces(); void instantiateRoot(); void compileDone(bool didchange); void compileEnded(); void changeParameterWidget(); private slots: void copyViewportTranslation(); void copyViewportRotation(); void copyViewportDistance(); void preferences(); void hideToolbars(); void hideEditor(); void hideConsole(); void showConsole(); void hideParameters(); private slots: void selectFindType(int); void hideFind(); void showFind(); void findString(QString); void showFindAndReplace(); void findNext(); void findPrev(); void useSelectionForFind(); void replace(); void replaceAll(); // Mac OSX FindBuffer support void findBufferChanged(); void updateFindBuffer(QString); bool event(QEvent* event) override; protected: bool eventFilter(QObject* obj, QEvent *event) override; private slots: void actionRenderPreview(bool rebuildParameterWidget=true); void csgRender(); void csgReloadRender(); void action3DPrint(); void sendToOctoPrint(); void sendToPrintService(); #ifdef ENABLE_CGAL void actionRender(); void actionRenderDone(shared_ptr); void cgalRender(); #endif void actionCheckValidity(); void actionDisplayAST(); void actionDisplayCSGTree(); void actionDisplayCSGProducts(); bool canExport(unsigned int dim); void actionExport(FileFormat format, const char *type_name, const char *suffix, unsigned int dim); void actionExportSTL(); void actionExport3MF(); void actionExportOFF(); void actionExportAMF(); void actionExportDXF(); void actionExportSVG(); void actionExportCSG(); void actionExportImage(); void actionCopyViewport(); void actionFlushCaches(); public: void viewModeActionsUncheck(); void setCurrentOutput(); void clearCurrentOutput(); void hideCurrentOutput(); bool isEmpty(); void onAxisChanged(InputEventAxisChanged *event) override; void onButtonChanged(InputEventButtonChanged *event) override; void onTranslateEvent(InputEventTranslate *event) override; void onRotateEvent(InputEventRotate *event) override; void onRotate2Event(InputEventRotate2 *event) override; void onActionEvent(InputEventAction *event) override; void onZoomEvent(InputEventZoom *event) override; void changedTopLevelConsole(bool); QList getTranslation() const; QList getRotation() const; public slots: void openFile(const QString &filename); void actionReloadRenderPreview(); void on_editorDock_visibilityChanged(bool); void on_consoleDock_visibilityChanged(bool); void on_parameterDock_visibilityChanged(bool); void on_toolButtonCompileResultClose_clicked(); void editorTopLevelChanged(bool); void consoleTopLevelChanged(bool); void parameterTopLevelChanged(bool); void processEvents(); #ifdef ENABLE_OPENCSG void viewModePreview(); #endif #ifdef ENABLE_CGAL void viewModeSurface(); void viewModeWireframe(); #endif void viewModeThrownTogether(); void viewModeShowEdges(); void viewModeShowAxes(); void viewModeShowCrosshairs(); void viewModeShowScaleProportional(); void viewModeAnimate(); void viewAngleTop(); void viewAngleBottom(); void viewAngleLeft(); void viewAngleRight(); void viewAngleFront(); void viewAngleBack(); void viewAngleDiagonal(); void viewCenter(); void viewPerspective(); void viewOrthogonal(); void viewTogglePerspective(); void viewResetView(); void viewAll(); void animateUpdateDocChanged(); void animateUpdate(); void dragEnterEvent(QDragEnterEvent *event) override; void dropEvent(QDropEvent *event) override; void helpAbout(); void helpHomepage(); void helpManual(); void helpCheatSheet(); void helpLibrary(); void helpFontInfo(); void quit(); void checkAutoReload(); void waitAfterReload(); void autoReloadSet(bool); void setContentsChanged(); private: bool network_progress_func(const double permille); static void report_func(const class AbstractNode*, void *vp, int mark); static bool mdiMode; static bool undockMode; static bool reorderMode; static const int tabStopWidth; static QElapsedTimer *progressThrottle; shared_ptr csgRoot; // Result of the CSGTreeEvaluator shared_ptr normalizedRoot; // Normalized CSG tree shared_ptr root_products; shared_ptr highlights_products; shared_ptr background_products; char const * afterCompileSlot; bool procevents; class QTemporaryFile *tempFile; class ProgressWidget *progresswidget; class CGALWorker *cgalworker; QMutex consolemutex; bool contentschanged; // Set if the source code has changes since the last render (F6) time_t includes_mtime; // latest include mod time time_t deps_mtime; // latest dependency mod time std::unordered_map export_paths; // for each file type, where it was exported to last void clearExportPaths(); // clear exports paths when main file is changed by open, new, etc. QString exportPath(const char *suffix); // look up the last export path and generate one if not found int last_parser_error_pos; // last highlighted error position signals: void highlightError(int); void unhighlightLastError(); }; class GuiLocker { public: GuiLocker() { GuiLocker::lock(); } ~GuiLocker() { GuiLocker::unlock(); } static bool isLocked() { return gui_locked > 0; } static void lock() { gui_locked++; } static void unlock() { gui_locked--; } private: static unsigned int gui_locked; }; openscad-2019.05/src/MainWindow.ui0000644000076500000240000012536713423115164017317 0ustar kintelstaff00000000000000 MainWindow 0 0 1118 636 0 0 0 0 0 0 0 0 0 0 0 0 QFrame::Box QFrame::Raised 6 6 6 4 4 1 0 75 true Message true :/icons/close.png:/icons/close.png 22 22 Qt::ToolButtonIconOnly true QToolButton { border: none; } :/icons/information-icons-error.png:/icons/information-icons-error.png 22 22 false 0 0 200 100 true QFrame::NoFrame QFrame::Raised 0 0 0 0 0 Time: FPS: Steps: Dump Pictures animate_panel qglview viewerToolBar frameCompileResult 0 0 1118 18 &File Recen&t Files &Examples E&xport &Edit &Design &View &Help 16777215 23 1 0 0 0 0 0 true 0 0 QFrame::NoFrame QFrame::Raised 0 0 0 0 Find Replace Search string Prev. Next Done Replacement string Replace All 8 0 0 0 0 10 10 Qt::ClickFocus true Customizer Widget 2 0 0 0 0 0 :/images/blackNew.png:/images/blackNew.png &New Ctrl+N :/images/Open-32.png:/images/Open-32.png &Open... Ctrl+O :/images/Save-32.png:/images/Save-32.png &Save Ctrl+S Save &As... Ctrl+Shift+S &Reload Ctrl+R &Quit Ctrl+Q QAction::QuitRole false :/images/Command-Undo-32.png:/images/Command-Undo-32.png &Undo Ctrl+Z Qt::WidgetWithChildrenShortcut :/images/Command-Redo-32.png:/images/Command-Redo-32.png &Redo Ctrl+Shift+Z Qt::WidgetWithChildrenShortcut Ctrl+Y Qt::WidgetWithChildrenShortcut Cu&t Ctrl+X Qt::WidgetWithChildrenShortcut &Copy Ctrl+C Qt::WidgetWithChildrenShortcut &Paste Ctrl+V Qt::WidgetWithChildrenShortcut :/images/Increase-Indent-32.png:/images/Increase-Indent-32.png &Indent Ctrl+I C&omment Ctrl+D Unco&mment Ctrl+Shift+D Copy viewport ima&ge Ctrl+Shift+C Copy viewport transl&ation Ctrl+T Cop&y viewport rotation Copy vie&wport distance Increase Font &Size Ctrl++ Decrease Font Si&ze Ctrl+- true H&ide editor &Reload and Preview F4 :/images/preview-32.png:/images/preview-32.png &Preview F5 :/images/render-32.png:/images/render-32.png R&ender F6 :/images/3dprint-32.png:/images/3dprint-32.png &3D Print F8 &Check Validity Display A&ST... Display CSG &Tree... Display CSG Pr&oducts... :/images/STL.png:/images/STL.png Export as &STL... F7 :/images/OFF.png:/images/OFF.png Export as &OFF... true Preview F9 true Surfaces F10 true Wireframe F11 true Thrown Together F12 true :/images/Rotation-32.png:/images/Rotation-32.png Show Edges Ctrl+1 true :/images/blackaxes.png:/images/blackaxes.png Show Axes Ctrl+2 true :/images/cross.png:/images/cross.png Show Crosshairs Ctrl+3 true :/images/scalemarkers.png:/images/scalemarkers.png Show Scale Markers true Animate :/images/blackUp.png:/images/blackUp.png &Top Ctrl+4 :/images/blackbottom.png:/images/blackbottom.png &Bottom Ctrl+5 :/images/blackleft.png:/images/blackleft.png &Left Ctrl+6 :/images/rightright.png:/images/rightright.png &Right Ctrl+7 :/images/blackfront.png:/images/blackfront.png &Front Ctrl+8 :/images/blackback.png:/images/blackback.png Bac&k Ctrl+9 &Diagonal Ctrl+0 Ce&nter true :/images/perspective1.png:/images/perspective1.png &Perspective true :/images/orthogonal.png:/images/orthogonal.png &Orthogonal true H&ide console true &About QAction::AboutRole &Documentation Clear Recent :/images/DXF.png:/images/DXF.png Export as &DXF... &Close Ctrl+W &Preferences QAction::PreferencesRole &Find... Ctrl+F Fin&d and Replace... Ctrl+Alt+F Find Ne&xt Ctrl+G Find Pre&vious Ctrl+Shift+G Use Se&lection for Find Ctrl+E &Flush Caches &OpenSCAD Homepage true &Automatic Reload and Preview :/images/PNG.png:/images/PNG.png Export as &Image... :/images/CSG.png:/images/CSG.png Export as &CSG... &Library info Show &Library Folder... :/images/Command-Reset-32.png:/images/Command-Reset-32.png Reset View &Font List :/images/CSG.png:/images/CSG.png Export as S&VG... :/images/AMF.png:/images/AMF.png Export as &AMF... :/images/3MF.png:/images/3MF.png Export as &3MF... :/images/zoomin.png:/images/zoomin.png Zoom In Ctrl+] :/images/zoomout.png:/images/zoomout.png Zoom Out Ctrl+[ :/images/zoom-all.png:/images/zoom-all.png View All Ctrl+Shift+V Conv&ert Tabs to Spaces true Hide toolbars :/images/Decrease-Indent-32.png:/images/Decrease-Indent-32.png U&nindent Ctrl+Shift+I &Cheat Sheet true true Hide Customizer QGLView QWidget
QGLView.h
1
Dock QDockWidget
Dock.h
1
ParameterWidget QWidget
parameter/ParameterWidget.h
1
QWordSearchField QFrame
QWordSearchField.h
1
Console QPlainTextEdit
Console.h
fileActionClose triggered() MainWindow close() -1 -1 340 323
openscad-2019.05/src/ModuleCache.cc0000644000076500000240000000761313441031431017347 0ustar kintelstaff00000000000000#include "ModuleCache.h" #include "StatCache.h" #include "FileModule.h" #include "printutils.h" #include "openscad.h" #include #include #include #include #include /*! FIXME: Implement an LRU scheme to avoid having an ever-growing module cache */ ModuleCache *ModuleCache::inst = nullptr; /*! Reevaluate the given file and all its dependencies and recompile anything needing reevaluation. Updates the cache if necessary. The given filename must be absolute. Sets the given module reference to the new module, or nullptr on any error (e.g. compile error or file not found). Returns the latest modification time of the module, its dependencies or includes. */ std::time_t ModuleCache::evaluate(const std::string &mainFile,const std::string &filename, FileModule *&module) { module = nullptr; auto entry = this->entries.find(filename); bool found{entry != this->entries.end()}; FileModule *lib_mod{found ? entry->second.module : nullptr}; // Don't try to recursively evaluate - if the file changes // during evaluation, that would be really bad. if (lib_mod && lib_mod->isHandlingDependencies()) return 0; // Create cache ID struct stat st; bool valid = (StatCache::stat(filename.c_str(), st) == 0); // If file isn't there, just return and let the cache retain the old module if (!valid) return 0; // If the file is present, we'll always cache some result std::string cache_id = str(boost::format("%x.%x") % st.st_mtime % st.st_size); cache_entry &cacheEntry = this->entries[filename]; // Initialize entry, if new if (!found) { cacheEntry.module = nullptr; cacheEntry.parsed_module = nullptr; cacheEntry.cache_id = cache_id; cacheEntry.includes_mtime = st.st_mtime; } cacheEntry.mtime = st.st_mtime; bool shouldCompile = true; if (found) { // Files should only be recompiled if the cache ID changed if (cacheEntry.cache_id == cache_id) { shouldCompile = false; // Recompile if includes changed if (cacheEntry.parsed_module) { std::time_t mtime = cacheEntry.parsed_module->includesChanged(); if (mtime > cacheEntry.includes_mtime) { cacheEntry.includes_mtime = mtime; shouldCompile = true; } } } } #ifdef DEBUG // Causes too much debug output //if (!shouldCompile) PRINTB("Using cached library: %s (%p)", filename % lib_mod); #endif // If cache lookup failed (non-existing or old timestamp), compile module if (shouldCompile) { #ifdef DEBUG if (found) { PRINTDB("Recompiling cached library: %s (%s)", filename % cache_id); } else { PRINTDB("Compiling library '%s'.", filename); } #endif std::string text; { std::ifstream ifs(filename.c_str()); if (!ifs.is_open()) { PRINTB("WARNING: Can't open library file '%s'\n", filename); return 0; } text = STR(ifs.rdbuf() << "\n\x03\n" << commandline_commands); } print_messages_push(); delete cacheEntry.parsed_module; lib_mod = parse(cacheEntry.parsed_module, text, filename, mainFile, false) ? cacheEntry.parsed_module : nullptr; PRINTDB("compiled module: %s", filename); cacheEntry.module = lib_mod; cacheEntry.cache_id = cache_id; auto mod = lib_mod ? lib_mod : cacheEntry.parsed_module; if(!found && mod) cacheEntry.includes_mtime = mod->includesChanged(); print_messages_pop(); } module = lib_mod; // FIXME: Do we need to handle include-only cases? std::time_t deps_mtime = lib_mod ? lib_mod->handleDependencies(false) : 0; return std::max({deps_mtime, cacheEntry.mtime, cacheEntry.includes_mtime}); } void ModuleCache::clear() { this->entries.clear(); } FileModule *ModuleCache::lookup(const std::string &filename) { auto it = this->entries.find(filename); return it != this->entries.end() ? it->second.module : nullptr; } void ModuleCache::clear_markers() { for (auto entry : instance()->entries) if(auto lib = entry.second.module) lib->clearHandlingDependencies(); } openscad-2019.05/src/ModuleCache.h0000644000076500000240000000163113435353202017211 0ustar kintelstaff00000000000000#pragma once #include #include #include /*! Caches FileModules based on their filenames */ class ModuleCache { public: static ModuleCache *instance() { if (!inst) inst = new ModuleCache; return inst; } std::time_t evaluate(const std::string &mainFile, const std::string &filename, class FileModule *&module); class FileModule *lookup(const std::string &filename); size_t size() { return this->entries.size(); } void clear(); static void clear_markers(); private: ModuleCache() {} ~ModuleCache() {} static ModuleCache *inst; struct cache_entry { class FileModule *module{}; class FileModule *parsed_module{}; // the last version parsed for the include list std::string cache_id; std::time_t mtime{}; // time file last modified std::time_t includes_mtime{}; // time the includes last changed }; std::unordered_map entries; }; openscad-2019.05/src/ModuleInstantiation.cc0000644000076500000240000000604413440766524021206 0ustar kintelstaff00000000000000#include "compiler_specific.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "expression.h" #include "exceptions.h" #include "printutils.h" #include namespace fs = boost::filesystem; ModuleInstantiation::~ModuleInstantiation() { } IfElseModuleInstantiation::~IfElseModuleInstantiation() { } /*! Returns the absolute path to the given filename, unless it's empty. NB! This will actually search for the file, to be backwards compatible with <= 2013.01 (see issue #217) */ std::string ModuleInstantiation::getAbsolutePath(const std::string &filename) const { if (!filename.empty() && !fs::path(filename).is_absolute()) { return fs::absolute(fs::path(this->modpath) / filename).string(); } else { return filename; } } void ModuleInstantiation::print(std::ostream &stream, const std::string &indent, const bool inlined) const { if (!inlined) stream << indent; stream << modname + "("; for (size_t i=0; i < this->arguments.size(); i++) { const Assignment &arg = this->arguments[i]; if (i > 0) stream << ", "; if (!arg.name.empty()) stream << arg.name << " = "; stream << *arg.expr; } if (scope.numElements() == 0) { stream << ");\n"; } else if (scope.numElements() == 1) { stream << ") "; scope.print(stream, indent, true); } else { stream << ") {\n"; scope.print(stream, indent + "\t", false); stream << indent << "}\n"; } } void IfElseModuleInstantiation::print(std::ostream &stream, const std::string &indent, const bool inlined) const { ModuleInstantiation::print(stream, indent, inlined); if (else_scope.numElements() > 0) { stream << indent << "else "; if (else_scope.numElements() == 1) { else_scope.print(stream, indent, true); } else { stream << "{\n"; else_scope.print(stream, indent + "\t", false); stream << indent << "}\n"; } } } /** * This is separated because PRINTB uses quite a lot of stack space * and the method using it evaluate() * is called often when recursive modules are evaluated. * noinline is required, as we here specifically optimize for stack usage * during normal operating, not runtime during error handling. */ static void NOINLINE print_trace(const ModuleInstantiation *mod, const Context *ctx){ PRINTB("TRACE: called by '%s', %s.", mod->name() % mod->location().toRelativeString(ctx->documentPath())); } AbstractNode *ModuleInstantiation::evaluate(const Context *ctx) const { EvalContext c(ctx, this->arguments, this->loc, &this->scope); #if 0 && DEBUG PRINT("New eval ctx:"); c.dump(nullptr, this); #endif try{ AbstractNode *node = ctx->instantiate_module(*this, &c); // Passes c as evalctx return node; }catch(EvaluationException &e){ if(e.traceDepth>0){ print_trace(this, ctx); e.traceDepth--; } throw; } } std::vector ModuleInstantiation::instantiateChildren(const Context *evalctx) const { return this->scope.instantiateChildren(evalctx); } std::vector IfElseModuleInstantiation::instantiateElseChildren(const Context *evalctx) const { return this->else_scope.instantiateChildren(evalctx); } openscad-2019.05/src/ModuleInstantiation.h0000644000076500000240000000371313440766524021050 0ustar kintelstaff00000000000000#pragma once #include "AST.h" #include "localscope.h" #include typedef std::vector ModuleInstantiationList; class ModuleInstantiation : public ASTNode { public: ModuleInstantiation(const std::string &name, const AssignmentList &args = AssignmentList(), const std::string &source_path = std::string(), const Location &loc = Location::NONE) : ASTNode(loc), arguments(args), tag_root(false), tag_highlight(false), tag_background(false), modname(name), modpath(source_path) { } ~ModuleInstantiation(); virtual void print(std::ostream &stream, const std::string &indent, const bool inlined) const; void print(std::ostream &stream, const std::string &indent) const override { print(stream, indent, false); }; class AbstractNode *evaluate(const class Context *ctx) const; std::vector instantiateChildren(const Context *evalctx) const; // This is only needed for import() and the deprecated *_extrude() modules const std::string &path() const { return this->modpath; } std::string getAbsolutePath(const std::string &filename) const; const std::string &name() const { return this->modname; } bool isBackground() const { return this->tag_background; } bool isHighlight() const { return this->tag_highlight; } bool isRoot() const { return this->tag_root; } AssignmentList arguments; LocalScope scope; bool tag_root; bool tag_highlight; bool tag_background; protected: std::string modname; std::string modpath; }; class IfElseModuleInstantiation : public ModuleInstantiation { public: IfElseModuleInstantiation(shared_ptr expr, const std::string &source_path, const Location &loc) : ModuleInstantiation("if", AssignmentList{Assignment("", expr)}, source_path, loc) { } ~IfElseModuleInstantiation(); std::vector instantiateElseChildren(const Context *evalctx) const; void print(std::ostream &stream, const std::string &indent, const bool inlined) const final; LocalScope else_scope; }; openscad-2019.05/src/NULLGL.cc0000644000076500000240000000413013441031431016162 0ustar kintelstaff00000000000000#include "GLView.h" GLView::GLView() {} void GLView::setRenderer(Renderer* r) {} void GLView::initializeGL() {} void GLView::resizeGL(int w, int h) {} void GLView::setCamera(const Camera &cam ) {assert(false && "not implemented");} void GLView::paintGL() {} void GLView::showSmallaxes(const Color4f &col) {} void GLView::showAxes(const Color4f &col) {} void GLView::showCrosshairs(const Color4f &col) {} void GLView::setColorScheme(const ColorScheme &cs){assert(false && "not implemented");} void GLView::setColorScheme(const std::string &cs) {assert(false && "not implemented");} #include "ThrownTogetherRenderer.h" ThrownTogetherRenderer::ThrownTogetherRenderer(shared_ptr root_products, shared_ptr highlight_products, shared_ptr background_products) {} void ThrownTogetherRenderer::draw(bool showfaces, bool showedges) const {}; BoundingBox ThrownTogetherRenderer::getBoundingBox() const { assert(false && "not implemented"); return BoundingBox(); } void ThrownTogetherRenderer::renderCSGProducts(const CSGProducts &products, bool highlight_mode, bool background_mode, bool showedges, bool fberror) const {} void ThrownTogetherRenderer::renderChainObject(const class CSGChainObject &csgobj, bool highlight_mode, bool background_mode, bool showedges, bool fberror, OpenSCADOperator type) const {} #include "CGALRenderer.h" CGALRenderer::CGALRenderer(shared_ptr geom) {} CGALRenderer::~CGALRenderer() {} void CGALRenderer::draw(bool showfaces, bool showedges) const {} BoundingBox CGALRenderer::getBoundingBox() const { assert(false && "not implemented"); return BoundingBox(); } void CGALRenderer::setColorScheme(const ColorScheme &cs){assert(false && "not implemented");} #include "system-gl.h" double gl_version() { return -1; } std::string glew_dump() { return std::string("GL Renderer: NULLGL Glew\n"); } std::string glew_extensions_dump() { return std::string("NULLGL Glew Extensions"); } bool report_glerror(const char * function) { return false; } openscad-2019.05/src/Network.h0000644000076500000240000001071113417146620016474 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include #include "printutils.h" #include "PlatformUtils.h" #include "NetworkSignal.h" class NetworkException: public std::exception { public: NetworkException(const QNetworkReply::NetworkError& error, const QString& errorMessage) : error(error), errorMessage(errorMessage) { } virtual ~NetworkException() {} const QNetworkReply::NetworkError& getError() const { return error; } const QString& getErrorMessage() const { return errorMessage; } const char* what() const throw() override { return errorMessage.toStdString().c_str(); } private: QNetworkReply::NetworkError error; QString errorMessage; }; using network_progress_func_t = std::function; template class NetworkRequest { public: using setup_func_t = std::function; using reply_func_t = std::function; using transform_func_t = std::function; NetworkRequest(const QUrl url, const std::vector accepted_codes, const int timeout_seconds) : url(url), accepted_codes(accepted_codes), timeout_seconds(timeout_seconds) { } virtual ~NetworkRequest() { } void set_progress_func(network_progress_func_t progress_func) { this->progress_func = progress_func; } ResultType execute(setup_func_t setup_func, reply_func_t reply_func, transform_func_t transform_func); private: QUrl url; std::vector accepted_codes; int timeout_seconds; network_progress_func_t progress_func = nullptr; }; template ResultType NetworkRequest::execute(NetworkRequest::setup_func_t setup_func, NetworkRequest::reply_func_t reply_func, NetworkRequest::transform_func_t transform_func) { QNetworkRequest request(url); request.setHeader(QNetworkRequest::UserAgentHeader, QString::fromStdString(PlatformUtils::user_agent())); setup_func(request); QNetworkAccessManager nam; QNetworkReply *reply = reply_func(nam, request); QTimer timer; QEventLoop loop; NetworkSignal forwarder{nullptr, [&](qint64 bytesSent, qint64 bytesTotal) { const double permille = (1000.0 * bytesSent) / bytesTotal; timer.start(); if (progress_func && progress_func(permille)) { reply->abort(); } }}; QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); QObject::connect(reply, SIGNAL(uploadProgress(qint64, qint64)), &forwarder, SLOT(network_progress(qint64, qint64))); timer.setSingleShot(true); timer.start(timeout_seconds * 1000); loop.exec(); bool isTimeout = false; if (timer.isActive()) { timer.stop(); } if (!reply->isFinished()) { reply->abort(); isTimeout = true; } reply->deleteLater(); if (isTimeout) { throw NetworkException{QNetworkReply::TimeoutError, _("Timeout error")}; } if (reply->error() != QNetworkReply::NoError) { throw NetworkException{reply->error(), reply->errorString()}; } const auto statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (std::find(accepted_codes.begin(), accepted_codes.end(), statusCode) == accepted_codes.end()) { QString reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); throw NetworkException{QNetworkReply::ProtocolFailure, reason}; } return transform_func(reply); } openscad-2019.05/src/NetworkSignal.h0000644000076500000240000000326113417146620017634 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include using network_progress_func_t = std::function; class NetworkSignal : public QObject { Q_OBJECT; using callback_t = std::function; NetworkSignal(QObject *parent, callback_t callback) : QObject(parent), callback(callback) { } virtual ~NetworkSignal() { } public slots: void network_progress(qint64 bytesSent, qint64 bytesTotal) { callback(bytesSent, bytesTotal); } private: callback_t callback; template friend class NetworkRequest; }; openscad-2019.05/src/NodeVisitor.cc0000644000076500000240000000205013402025764017442 0ustar kintelstaff00000000000000#include "NodeVisitor.h" #include "state.h" State NodeVisitor::nullstate(nullptr); Response NodeVisitor::traverse(const AbstractNode &node, const State &state) { State newstate = state; newstate.setNumChildren(node.getChildren().size()); Response response = Response::ContinueTraversal; newstate.setPrefix(true); newstate.setParent(state.parent()); response = node.accept(newstate, *this); // Pruned traversals mean don't traverse children if (response == Response::ContinueTraversal) { newstate.setParent(&node); for(const auto &chnode : node.getChildren()) { response = this->traverse(*chnode, newstate); if (response == Response::AbortTraversal) return response; // Abort immediately } } // Postfix is executed for all non-aborted traversals if (response != Response::AbortTraversal) { newstate.setParent(state.parent()); newstate.setPrefix(false); newstate.setPostfix(true); response = node.accept(newstate, *this); } if (response != Response::AbortTraversal) response = Response::ContinueTraversal; return response; } openscad-2019.05/src/NodeVisitor.h0000644000076500000240000000715213402025764017314 0ustar kintelstaff00000000000000#pragma once #include "BaseVisitable.h" #include "node.h" #include "state.h" class NodeVisitor : public BaseVisitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor, public Visitor { public: NodeVisitor() {} ~NodeVisitor() {} Response traverse(const AbstractNode &node, const class State &state = NodeVisitor::nullstate); Response visit(class State &state, const class AbstractNode &node) override = 0; Response visit(class State &state, const class AbstractIntersectionNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class AbstractPolyNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class GroupNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const RootNode &node) override { return visit(state, (const class GroupNode &)node); } Response visit(class State &state, const class LeafNode &node) override { return visit(state, (const class AbstractPolyNode &)node); } Response visit(class State &state, const class CgaladvNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class CsgOpNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class LinearExtrudeNode &node) override { return visit(state, (const class AbstractPolyNode &)node); } Response visit(class State &state, const class RotateExtrudeNode &node) override { return visit(state, (const class AbstractPolyNode &)node); } Response visit(class State &state, const class ImportNode &node) override { return visit(state, (const class LeafNode &)node); } Response visit(class State &state, const class PrimitiveNode &node) override { return visit(state, (const class LeafNode &)node); } Response visit(class State &state, const class TextNode &node) override { return visit(state, (const class AbstractPolyNode &)node); } Response visit(class State &state, const class ProjectionNode &node) override { return visit(state, (const class AbstractPolyNode &)node); } Response visit(class State &state, const class RenderNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class SurfaceNode &node) override { return visit(state, (const class LeafNode &)node); } Response visit(class State &state, const class TransformNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class ColorNode &node) override { return visit(state, (const class AbstractNode &)node); } Response visit(class State &state, const class OffsetNode &node) override { return visit(state, (const class AbstractPolyNode &)node); } // Add visit() methods for new visitable subtypes of AbstractNode here private: static State nullstate; }; openscad-2019.05/src/OctoPrint.cc0000644000076500000240000001472213423455221017125 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "settings.h" #include "OctoPrint.h" #include "printutils.h" #include "PlatformUtils.h" OctoPrint::OctoPrint() { } OctoPrint::~OctoPrint() { } const QString OctoPrint::url() const { return QString::fromStdString(Settings::Settings::inst()->get(Settings::Settings::octoPrintUrl).toString()); } const std::string OctoPrint::apiKey() const { return Settings::Settings::inst()->get(Settings::Settings::octoPrintApiKey).toString(); } const QJsonDocument OctoPrint::getJsonData(const QString endpoint) const { if (url().trimmed().isEmpty()) { throw NetworkException{QNetworkReply::ProtocolFailure, "OctoPrint URL not configured."}; } auto networkRequest = NetworkRequest{QUrl{url() + endpoint}, { 200 }, 30}; return networkRequest.execute( [&](QNetworkRequest& request) { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader(QByteArray{"X-Api-Key"}, QByteArray{apiKey().c_str()}); }, [](QNetworkAccessManager& nam, QNetworkRequest& request) { return nam.get(request); }, [](QNetworkReply *reply) -> const QJsonDocument { const auto doc = QJsonDocument::fromJson(reply->readAll()); PRINTDB("Response: %s", QString{doc.toJson()}.toStdString()); return doc; } ); } const std::vector> OctoPrint::getSlicers() const { const auto obj = getJsonData("/slicing").object(); std::vector> slicers; for (const auto & key : obj.keys()) { slicers.emplace_back(std::make_pair(key, obj[key].toObject().value("displayName").toString())); } return slicers; } const std::vector> OctoPrint::getProfiles(const QString slicer) const { const auto obj = getJsonData("/slicing").object(); std::vector> profiles; for (const auto & key : obj.keys()) { const auto entry = obj[key].toObject(); const auto name = entry.value("key").toString(); const auto isDefault = entry.value("default").toBool(); if ((slicer == name) || (slicer.isEmpty() && isDefault)) { const auto profilesObject = entry.value("profiles").toObject(); for (const auto & profileKey : profilesObject.keys()) { const auto displayName = profilesObject[profileKey].toObject().value("displayName").toString(); profiles.emplace_back(std::make_pair(profileKey, displayName)); } break; } } return profiles; } const std::pair OctoPrint::getVersion() const { const auto obj = getJsonData("/version").object(); const auto api_version = obj.value("api").toString(); const auto server_version = obj.value("server").toString(); const auto result = std::make_pair(api_version, server_version); return result; } const QString OctoPrint::upload(const QString exportFileName, const QString fileName, network_progress_func_t progress_func) const { QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant{"form-data; name=\"file\"; filename=\"" + fileName + "\""}); filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant{"application/octet-stream"}); QFile *file = new QFile(exportFileName, multiPart); file->open(QIODevice::ReadOnly); filePart.setBodyDevice(file); multiPart->append(filePart); auto networkRequest = NetworkRequest{QUrl{url() + "/files/local"}, { 200, 201 }, 180}; networkRequest.set_progress_func(progress_func); return networkRequest.execute( [&](QNetworkRequest& request) { request.setHeader(QNetworkRequest::UserAgentHeader, QString::fromStdString(PlatformUtils::user_agent())); request.setRawHeader(QByteArray{"X-Api-Key"}, QByteArray{apiKey().c_str()}); }, [&](QNetworkAccessManager& nam, QNetworkRequest& request) { const auto reply = nam.post(request, multiPart); multiPart->setParent(reply); return reply; }, [](QNetworkReply *reply) -> const QString { const auto doc = QJsonDocument::fromJson(reply->readAll()); PRINTDB("Response: %s", QString{doc.toJson()}.toStdString()); const auto location = reply->header(QNetworkRequest::LocationHeader).toString(); PRINTB("Uploaded successfully to %s", location.toStdString()); return location; } ); } void OctoPrint::slice(const QString fileUrl, const QString slicer, const QString profile, const bool select, const bool print) const { QJsonObject jsonInput; jsonInput.insert("command", QString{"slice"}); jsonInput.insert("slicer", slicer); jsonInput.insert("profile", profile); jsonInput.insert("select", QString{select ? "true" : "false"}); jsonInput.insert("print", QString{print ? "true" : "false"}); auto networkRequest = NetworkRequest{QUrl{fileUrl}, { 200, 202 }, 30}; return networkRequest.execute( [&](QNetworkRequest& request) { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader(QByteArray{"X-Api-Key"}, QByteArray{apiKey().c_str()}); }, [&](QNetworkAccessManager& nam, QNetworkRequest& request) { return nam.post(request, QJsonDocument(jsonInput).toJson()); }, [](QNetworkReply *reply) { const auto doc = QJsonDocument::fromJson(reply->readAll()); PRINTDB("Response: %s", QString{doc.toJson()}.toStdString()); PRINT("Slice command successfully executed."); } ); } openscad-2019.05/src/OctoPrint.h0000644000076500000240000000474013423115164016765 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) // Dummy class for compiling Preferences.cc for Qt4 struct OctoPrint { OctoPrint() {} ~OctoPrint() {} const std::pair getVersion() const { return {}; } const std::vector> getSlicers() const { return {}; } const std::vector> getProfiles(const QString) const { return {}; } }; struct NetworkException { const QString getErrorMessage() const { return ""; } }; #else #include #include #include #include #include "Network.h" class OctoPrint { public: OctoPrint(); virtual ~OctoPrint(); const QString url() const; const std::string apiKey() const; const std::pair getVersion() const; const std::vector> getSlicers() const; const std::vector> getProfiles(const QString slicer) const; const QString upload(const QString exportFileName, const QString fileName, network_progress_func_t progress_func) const; void slice(const QString fileUrl, const QString slicer, const QString profile, const bool select, const bool print) const; private: const QJsonDocument getJsonData(const QString endpoint) const; }; #endifopenscad-2019.05/src/OctoPrintInfo.html0000644000076500000240000003103713424335753020326 0ustar kintelstaff00000000000000

OctoPrint

This is intended for exporting and printing the design via OctoPrint running in the local network.

octoprint.org

openscad-2019.05/src/OffscreenContext.h0000644000076500000240000000115013402025764020316 0ustar kintelstaff00000000000000#pragma once // Here we implement a 'portability' pattern but since we are mixing // Objective-C with C++, it is a bit different. The main struct // isn't defined in the header, but instead inside the source code files #include #include #include #include "fbo.h" struct OffscreenContext *create_offscreen_context(int w, int h); bool teardown_offscreen_context(OffscreenContext *ctx); bool save_framebuffer(OffscreenContext *ctx, const char * filename); bool save_framebuffer(OffscreenContext *ctx, std::ostream &output); std::string offscreen_context_getinfo(OffscreenContext *ctx); openscad-2019.05/src/OffscreenContextAll.hpp0000644000076500000240000000406313402025764021315 0ustar kintelstaff00000000000000// Functions shared by OffscreenContext[platform].cc // #include this directly after definition of struct OffscreenContext. #include #include void bind_offscreen_context(OffscreenContext *ctx) { if (ctx) fbo_bind(ctx->fbo); } /* Capture framebuffer from OpenGL and write it to the given filename as PNG. */ bool save_framebuffer(OffscreenContext *ctx, const char *filename) { std::ofstream fstream(filename,std::ios::out|std::ios::binary); if (!fstream.is_open()) { std::cerr << "Can't open file " << filename << " for writing"; return false; } else { save_framebuffer(ctx, fstream); fstream.close(); } return true; } /*! Capture framebuffer from OpenGL and write it to the given ostream. Called by save_framebuffer() from platform-specific code. */ bool save_framebuffer_common(OffscreenContext *ctx, std::ostream &output) { if (!ctx) return false; int samplesPerPixel = 4; // R, G, B and A std::vector pixels(ctx->width * ctx->height * samplesPerPixel); glReadPixels(0, 0, ctx->width, ctx->height, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]); // Flip it vertically - images read from OpenGL buffers are upside-down int rowBytes = samplesPerPixel * ctx->width; unsigned char *flippedBuffer = (unsigned char *)malloc(rowBytes * ctx->height); if (!flippedBuffer) { std::cerr << "Unable to allocate flipped buffer for corrected image."; return 1; } flip_image(&pixels[0], flippedBuffer, samplesPerPixel, ctx->width, ctx->height); bool writeok = write_png(output, flippedBuffer, ctx->width, ctx->height); free(flippedBuffer); return writeok; } // Called by create_offscreen_context() from platform-specific code. OffscreenContext *create_offscreen_context_common(OffscreenContext *ctx) { if (!ctx) return nullptr; GLenum err = glewInit(); // must come after Context creation and before FBO c$ if (GLEW_OK != err) { std::cerr << "Unable to init GLEW: " << glewGetErrorString(err) << "\n"; return nullptr; } ctx->fbo = fbo_new(); if (!fbo_init(ctx->fbo, ctx->width, ctx->height)) { return nullptr; } return ctx; } openscad-2019.05/src/OffscreenContextCGL.mm0000644000076500000240000001014413414444427021035 0ustar kintelstaff00000000000000#include "OffscreenContext.h" #include "imageutils.h" #include "fbo.h" #include #include #import // for NSOpenGL... #include #include #define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } } struct OffscreenContext { NSOpenGLContext *openGLContext; NSAutoreleasePool *pool; int width; int height; fbo_t *fbo; }; #include "OffscreenContextAll.hpp" std::string offscreen_context_getinfo(OffscreenContext *) { struct utsname name; uname(&name); SInt32 majorVersion,minorVersion,bugFixVersion; Gestalt(gestaltSystemVersionMajor, &majorVersion); Gestalt(gestaltSystemVersionMinor, &minorVersion); Gestalt(gestaltSystemVersionBugFix, &bugFixVersion); const char *arch = "unknown"; if (sizeof(int*) == 4) arch = "32-bit"; else if (sizeof(int*) == 8) arch = "64-bit"; std::ostringstream out; out << "GL context creator: Cocoa / CGL\n" << "PNG generator: Core Foundation\n" << "OS info: Mac OS X " << majorVersion << "." << minorVersion << "." << bugFixVersion << " (" << name.machine << " kernel)\n" << "Machine: " << arch << "\n"; return out.str(); } OffscreenContext *create_offscreen_context(int w, int h) { OffscreenContext *ctx = new OffscreenContext; ctx->width = w; ctx->height = h; ctx->pool = [NSAutoreleasePool new]; // Create an OpenGL context just so that OpenGL calls will work. // Will not be used for actual rendering. NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFANoRecovery, NSOpenGLPFADepthSize, 24, NSOpenGLPFAStencilSize, 8, // Enable this to force software rendering // NSOpenGLPFARendererID, kCGLRendererGenericID, // Took out the acceleration requirement to be able to run the tests // in a non-accelerated VM. // NSOpenGLPFAAccelerated, (NSOpenGLPixelFormatAttribute) 0 }; NSOpenGLPixelFormat *pixFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease]; // Create and make current the OpenGL context to render with (with color and depth buffers) ctx->openGLContext = [[NSOpenGLContext alloc] initWithFormat:pixFormat shareContext:nil]; if (!ctx->openGLContext) { std::cerr << "Unable to create NSOpenGLContext\n"; return nullptr; } [ctx->openGLContext makeCurrentContext]; // glewInit must come after Context creation and before FBO calls. GLenum err = glewInit(); if (GLEW_OK != err) { std::cerr << "Unable to init GLEW: " << glewGetErrorString(err) << std::endl; return nullptr; } glew_dump(); ctx->fbo = fbo_new(); if (!fbo_init(ctx->fbo, w, h)) { return nullptr; } return ctx; } bool teardown_offscreen_context(OffscreenContext *ctx) { fbo_unbind(ctx->fbo); fbo_delete(ctx->fbo); /* * Cleanup */ [ctx->openGLContext clearDrawable]; [ctx->openGLContext release]; [ctx->pool release]; return true; } /*! Capture framebuffer from OpenGL and write it to the given ostream */ bool save_framebuffer(OffscreenContext *ctx, std::ostream &output) { if (!ctx) return false; // Read pixels from OpenGL int samplesPerPixel = 4; // R, G, B and A int rowBytes = samplesPerPixel * ctx->width; unsigned char *bufferData = (unsigned char *)malloc(rowBytes * ctx->height); if (!bufferData) { std::cerr << "Unable to allocate buffer for image extraction."; return 1; } glReadPixels(0, 0, ctx->width, ctx->height, GL_RGBA, GL_UNSIGNED_BYTE, bufferData); REPORTGLERROR("reading pixels from framebuffer"); // Flip it vertically - images read from OpenGL buffers are upside-down unsigned char *flippedBuffer = (unsigned char *)malloc(rowBytes * ctx->height); if (!flippedBuffer) { std::cout << "Unable to allocate flipped buffer for corrected image."; return 1; } flip_image(bufferData, flippedBuffer, samplesPerPixel, ctx->width, ctx->height); bool writeok = write_png(output, flippedBuffer, ctx->width, ctx->height); free(flippedBuffer); free(bufferData); return writeok; } openscad-2019.05/src/OffscreenContextGLX.cc0000644000076500000240000002015413414554253021037 0ustar kintelstaff00000000000000/* Create an OpenGL context without creating an OpenGL Window. for Linux. See also glxgears.c by Brian Paul from mesa-demos (mesa3d.org) http://cgit.freedesktop.org/mesa/demos/tree/src/xdemos?id=mesa-demos-8.0.1 http://www.opengl.org/sdk/docs/man/xhtml/glXIntro.xml http://www.mesa3d.org/brianp/sig97/offscrn.htm http://glprogramming.com/blue/ch07.html OffscreenContext.mm (Mac OSX version) */ /* * Some portions of the code below are: * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. * * 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 * BRIAN PAUL 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 "OffscreenContext.h" #include "printutils.h" #include "imageutils.h" #include "system-gl.h" #include "fbo.h" #include #include #include #include #include #include // for uname struct OffscreenContext { OffscreenContext(int width, int height) : openGLContext(nullptr), xdisplay(nullptr), xwindow(0), width(width), height(height), fbo(nullptr) {} GLXContext openGLContext; Display *xdisplay; Window xwindow; int width; int height; fbo_t *fbo; }; #include "OffscreenContextAll.hpp" std::string get_os_info() { struct utsname u; if (uname(&u) < 0) { return STR("OS info: unknown, uname() error\n"); } else { return STR("OS info: " << u.sysname << " " << u.release << " " << u.version << "\n" << "Machine: " << u.machine); } return ""; } std::string offscreen_context_getinfo(OffscreenContext *ctx) { assert(ctx); if (!ctx->xdisplay) { return std::string("No GL Context initialized. No information to report\n"); } int major, minor; glXQueryVersion(ctx->xdisplay, &major, &minor); return STR("GL context creator: GLX\n" << "PNG generator: lodepng\n" << "GLX version: " << major << "." << minor << "\n" << get_os_info()); } static XErrorHandler original_xlib_handler = nullptr; static auto XCreateWindow_failed = false; static int XCreateWindow_error(Display *dpy, XErrorEvent *event) { std::cerr << "XCreateWindow failed: XID: " << event->resourceid << " request: " << static_cast(event->request_code) << " minor: " << static_cast(event->minor_code) << "\n"; char description[1024]; XGetErrorText( dpy, event->error_code, description, 1023 ); std::cerr << " error message: " << description << "\n"; XCreateWindow_failed = true; return 0; } /* create a dummy X window without showing it. (without 'mapping' it) and save information to the ctx. This purposely does not use glxCreateWindow, to avoid crashes, "failed to create drawable" errors, and Mesa "WARNING: Application calling GLX 1.3 function when GLX 1.3 is not supported! This is an application bug!" This function will alter ctx.openGLContext and ctx.xwindow if successfull */ bool create_glx_dummy_window(OffscreenContext &ctx) { int attributes[] = { GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT, //support all 3, for OpenCSG GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_DEPTH_SIZE, 24, // depth-stencil for OpenCSG GLX_STENCIL_SIZE, 8, GLX_DOUBLEBUFFER, true, None }; auto dpy = ctx.xdisplay; int num_returned = 0; auto fbconfigs = glXChooseFBConfig( dpy, DefaultScreen(dpy), attributes, &num_returned ); if (fbconfigs == nullptr) { std::cerr << "glXChooseFBConfig failed\n"; return false; } auto visinfo = glXGetVisualFromFBConfig( dpy, fbconfigs[0] ); if (visinfo == nullptr) { std::cerr << "glXGetVisualFromFBConfig failed\n"; XFree(fbconfigs); return false; } // can't depend on xWin==nullptr at failure. use a custom Xlib error handler instead. original_xlib_handler = XSetErrorHandler(XCreateWindow_error); auto root = DefaultRootWindow(dpy); XSetWindowAttributes xwin_attr; auto width = ctx.width; auto height = ctx.height; xwin_attr.background_pixmap = None; xwin_attr.background_pixel = 0; xwin_attr.border_pixel = 0; xwin_attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); xwin_attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; unsigned long int mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; auto xWin = XCreateWindow( dpy, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &xwin_attr ); // Window xWin = XCreateSimpleWindow( dpy, DefaultRootWindow(dpy), 0,0,42,42, 0,0,0 ); XSync(dpy, false); if (XCreateWindow_failed) { XFree(visinfo); XFree(fbconfigs); return false; } XSetErrorHandler(original_xlib_handler); // Most programs would call XMapWindow here. But we don't, to keep the window hidden // XMapWindow( dpy, xWin ); auto context = glXCreateNewContext(dpy, fbconfigs[0], GLX_RGBA_TYPE, nullptr, true); if (context == nullptr) { std::cerr << "glXCreateNewContext failed\n"; XDestroyWindow(dpy, xWin); XFree(visinfo); XFree(fbconfigs); return false; } //GLXWindow glxWin = glXCreateWindow( dpy, fbconfigs[0], xWin, nullptr ); if (!glXMakeContextCurrent( dpy, xWin, xWin, context )) { //if (!glXMakeContextCurrent( dpy, glxWin, glxWin, context )) { std::cerr << "glXMakeContextCurrent failed\n"; glXDestroyContext(dpy, context); XDestroyWindow(dpy, xWin); XFree(visinfo); XFree(fbconfigs); return false; } ctx.openGLContext = context; ctx.xwindow = xWin; XFree(visinfo); XFree(fbconfigs); return true; } bool create_glx_dummy_context(OffscreenContext &ctx); OffscreenContext *create_offscreen_context(int w, int h) { auto ctx = new OffscreenContext(w, h); // before an FBO can be setup, a GLX context must be created // this call alters ctx->xDisplay and ctx->openGLContext // and ctx->xwindow if successful if (!create_glx_dummy_context(*ctx)) { delete ctx; return nullptr; } return create_offscreen_context_common(ctx); } bool teardown_offscreen_context(OffscreenContext *ctx) { if (ctx) { fbo_unbind(ctx->fbo); fbo_delete(ctx->fbo); XDestroyWindow( ctx->xdisplay, ctx->xwindow ); glXDestroyContext( ctx->xdisplay, ctx->openGLContext ); XCloseDisplay( ctx->xdisplay ); return true; } return false; } bool save_framebuffer(OffscreenContext *ctx, std::ostream &output) { glXSwapBuffers(ctx->xdisplay, ctx->xwindow); return save_framebuffer_common(ctx, output); } #pragma GCC diagnostic ignored "-Waddress" bool create_glx_dummy_context(OffscreenContext &ctx) { // This will alter ctx.openGLContext and ctx.xdisplay and ctx.xwindow if successfull int major; int minor; auto result = false; ctx.xdisplay = XOpenDisplay(nullptr); if (ctx.xdisplay == nullptr) { std::cerr << "Unable to open a connection to the X server.\n"; auto dpyenv = getenv("DISPLAY"); std::cerr << "DISPLAY=" << (dpyenv?dpyenv:"") << "\n"; return false; } // glxQueryVersion is not always reliable. Use it, but then // also check to see if GLX 1.3 functions exist glXQueryVersion(ctx.xdisplay, &major, &minor); if (major==1 && minor<=2 && glXGetVisualFromFBConfig==nullptr) { std::cerr << "Error: GLX version 1.3 functions missing. " << "Your GLX version: " << major << "." << minor << std::endl; } else { result = create_glx_dummy_window(ctx); } if (!result) XCloseDisplay(ctx.xdisplay); return result; } openscad-2019.05/src/OffscreenContextNULL.cc0000644000076500000240000000310713441031431021142 0ustar kintelstaff00000000000000/* Create an NULL OpenGL context that doesn't actually use any OpenGL code, and can be compiled on a system without OpenGL. */ #include #include "OffscreenContext.h" #include "printutils.h" #include "imageutils.h" #include #include #include using namespace std; struct OffscreenContext { int width; int height; }; void offscreen_context_init(OffscreenContext &ctx, int width, int height) { ctx.width = width; ctx.height = height; } string offscreen_context_getinfo(OffscreenContext *ctx) { const char *arch = "unknown"; if (sizeof(int*) == 4) arch = "32-bit"; else if (sizeof(int*) == 8) arch = "64-bit"; #ifdef OPENSCAD_OS auto OSInfo = OPENSCAD_OS; #else auto OSInfo = "unknown"; #endif return STR("OS info: " << OSInfo << "\nMachine: " << arch << "\n"); } OffscreenContext *create_offscreen_context(int w, int h) { OffscreenContext *ctx = new OffscreenContext; offscreen_context_init( *ctx, w, h ); return ctx; } bool teardown_offscreen_context(OffscreenContext *ctx) { return true; } bool save_framebuffer(OffscreenContext *ctx, char const * filename) { std::ofstream fstream(filename,std::ios::out|std::ios::binary); if (!fstream.is_open()) { std::cerr << "Can't open file " << filename << " for writing"; return false; } else { save_framebuffer(ctx, fstream); fstream.close(); } return true; } bool save_framebuffer(OffscreenContext *ctx, std::ostream &output) { output << "NULLGL framebuffer"; return true; } openscad-2019.05/src/OffscreenContextWGL.cc0000644000076500000240000001423413452415427021041 0ustar kintelstaff00000000000000/* Create an OpenGL context without creating an OpenGL Window. for Windows. For more info: http://www.nullterminator.net/opengl32.html by Blaine Hodge http://msdn.microsoft.com/en-us/library/ee418815(v=vs.85).aspx http://www.cprogramming.com/tutorial/wgl_wiggle_functions.html by RoD ( which includes robot.cc by Steven Billington ) http://blogs.msdn.com/b/oldnewthing/archive/2006/12/04/1205831.aspx by Tom */ #undef NOGDI #include #include #include "OffscreenContext.h" #include "printutils.h" #include "imageutils.h" #include "system-gl.h" #include "fbo.h" #include // must be included after glew.h #include #include #include struct OffscreenContext { HWND window; HDC dev_context; HGLRC openGLContext; int width; int height; fbo_t *fbo; }; #include "OffscreenContextAll.hpp" void offscreen_context_init(OffscreenContext &ctx, int width, int height) { ctx.window = (HWND)nullptr; ctx.dev_context = (HDC)nullptr; ctx.openGLContext = (HGLRC)nullptr; ctx.width = width; ctx.height = height; ctx.fbo = nullptr; } std::string get_os_info() { OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); SYSTEM_INFO si; GetSystemInfo(&si); std::map archs; archs[PROCESSOR_ARCHITECTURE_AMD64] = "amd64"; archs[PROCESSOR_ARCHITECTURE_IA64] = "itanium"; archs[PROCESSOR_ARCHITECTURE_INTEL] = "x86"; archs[PROCESSOR_ARCHITECTURE_UNKNOWN] = "unknown"; std::ostringstream out; out << "OS info: " << "Microsoft(TM) Windows(TM) " << osvi.dwMajorVersion << " " << osvi.dwMinorVersion << " " << osvi.dwBuildNumber << " " << osvi.szCSDVersion; if (archs.find(si.wProcessorArchitecture) != archs.end()) out << " " << archs[si.wProcessorArchitecture]; out << "\n"; out << "Machine: " << si.dwProcessorType; return out.str(); } std::string offscreen_context_getinfo(OffscreenContext * /*ctx*/) { // should probably get some info from WGL context here? return STR("GL context creator: WGL\n" << "PNG generator: lodepng\n" << get_os_info()); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { return DefWindowProc( hwnd, message, wparam, lparam ); } bool create_wgl_dummy_context(OffscreenContext &ctx) { // this function alters ctx->window and ctx->openGLContext // and ctx->dev_context if successfull // create window HINSTANCE inst = GetModuleHandleW(0); WNDCLASSW wc; ZeroMemory( &wc, sizeof( wc ) ); wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.hInstance = inst; wc.lpszClassName = L"OpenSCAD"; ATOM class_atom = RegisterClassW( &wc ); if ( class_atom == 0 ) { std::cerr << "MS GDI - RegisterClass failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; return false; } LPCTSTR lpClassName = L"OpenSCAD"; LPCTSTR lpWindowName = L"OpenSCAD"; DWORD dwStyle = WS_CAPTION | WS_POPUPWINDOW; // | WS_VISIBLE int x = 0; int y = 0; int nWidth = ctx.width; int nHeight = ctx.height; HWND hWndParent = nullptr; HMENU hMenu = nullptr; HINSTANCE hInstance = inst; LPVOID lpParam = nullptr; HWND window = CreateWindowW( lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam ); if ( window==nullptr ) { std::cerr << "MS GDI - CreateWindow failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; return false; } // create WGL context, make current PIXELFORMATDESCRIPTOR pixformat; int chosenformat; HDC dev_context = GetDC( window ); if ( dev_context == nullptr ) { std::cerr << "MS GDI - GetDC failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; return false; } ZeroMemory( &pixformat, sizeof( pixformat ) ); pixformat.nSize = sizeof( pixformat ); pixformat.nVersion = 1; pixformat.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pixformat.iPixelType = PFD_TYPE_RGBA; pixformat.cGreenBits = 8; pixformat.cRedBits = 8; pixformat.cBlueBits = 8; pixformat.cAlphaBits = 8; pixformat.cDepthBits = 24; pixformat.cStencilBits = 8; chosenformat = ChoosePixelFormat( dev_context, &pixformat ); if (chosenformat==0) { std::cerr << "MS GDI - ChoosePixelFormat failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; return false; } bool spfok = SetPixelFormat( dev_context, chosenformat, &pixformat ); if (!spfok) { std::cerr << "MS GDI - SetPixelFormat failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; return false; } HGLRC gl_render_context = wglCreateContext( dev_context ); if ( gl_render_context == nullptr ) { std::cerr << "MS WGL - wglCreateContext failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; ReleaseDC( ctx.window, ctx.dev_context ); return false; } bool mcok = wglMakeCurrent( dev_context, gl_render_context ); if (!mcok) { std::cerr << "MS WGL - wglMakeCurrent failed\n"; std::cerr << "last-error code: " << GetLastError() << "\n"; return false; } ctx.window = window; ctx.dev_context = dev_context; ctx.openGLContext = gl_render_context; return true; } OffscreenContext *create_offscreen_context(int w, int h) { OffscreenContext *ctx = new OffscreenContext; offscreen_context_init( *ctx, w, h ); // Before an FBO can be setup, a WGL context must be created. // This call alters ctx->window and ctx->openGLContext // and ctx->dev_context if successfull if (!create_wgl_dummy_context( *ctx )) { return nullptr; } return create_offscreen_context_common( ctx ); } bool teardown_offscreen_context(OffscreenContext *ctx) { if (ctx) { fbo_unbind(ctx->fbo); fbo_delete(ctx->fbo); wglMakeCurrent( nullptr, nullptr ); wglDeleteContext( ctx->openGLContext ); ReleaseDC( ctx->window, ctx->dev_context ); return true; } return false; } bool save_framebuffer(OffscreenContext *ctx, std::ostream &output) { if (!ctx) return false; wglSwapLayerBuffers( ctx->dev_context, WGL_SWAP_MAIN_PLANE ); return save_framebuffer_common( ctx, output ); } openscad-2019.05/src/OffscreenView.cc0000644000076500000240000000162413441031431017737 0ustar kintelstaff00000000000000#include "OffscreenView.h" #include "system-gl.h" #include #include #include #include #include #include "printutils.h" OffscreenView::OffscreenView(int width, int height) { this->ctx = create_offscreen_context(width, height); if ( this->ctx == nullptr ) throw -1; GLView::initializeGL(); GLView::resizeGL(width, height); } OffscreenView::~OffscreenView() { teardown_offscreen_context(this->ctx); } #ifdef ENABLE_OPENCSG void OffscreenView::display_opencsg_warning() { PRINT("OpenSCAD recommended OpenGL version is 2.0."); } #endif bool OffscreenView::save(const char *filename) { return save_framebuffer(this->ctx, filename); } bool OffscreenView::save(std::ostream &output) { return save_framebuffer(this->ctx, output); } std::string OffscreenView::getRendererInfo() const { return STR(glew_dump() << offscreen_context_getinfo(this->ctx)); } openscad-2019.05/src/OffscreenView.h0000644000076500000240000000100313402025764017601 0ustar kintelstaff00000000000000#pragma once #include "OffscreenContext.h" #include #include #include #include "system-gl.h" #include #include "GLView.h" class OffscreenView : public GLView { public: OffscreenView(int width, int height); ~OffscreenView(); bool save(std::ostream &output); OffscreenContext *ctx; // overrides bool save(const char *filename) override; std::string getRendererInfo() const override; #ifdef ENABLE_OPENCSG void display_opencsg_warning() override; #endif }; openscad-2019.05/src/OpenCSGRenderer.cc0000644000076500000240000001422113441031431020114 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "system-gl.h" #include "OpenCSGRenderer.h" #include "polyset.h" #include "csgnode.h" #ifdef ENABLE_OPENCSG #include class OpenCSGPrim : public OpenCSG::Primitive { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW OpenCSGPrim(OpenCSG::Operation operation, unsigned int convexity) : OpenCSG::Primitive(operation, convexity), csgmode(Renderer::CSGMODE_NONE) { } shared_ptr geom; Transform3d m; Renderer::csgmode_e csgmode; void render() override { glPushMatrix(); glMultMatrixd(m.data()); Renderer::render_surface(geom, csgmode, m); glPopMatrix(); } }; #endif OpenCSGRenderer::OpenCSGRenderer(shared_ptr root_products, shared_ptr highlights_products, shared_ptr background_products, GLint *shaderinfo) : root_products(root_products), highlights_products(highlights_products), background_products(background_products), shaderinfo(shaderinfo) { } void OpenCSGRenderer::draw(bool /*showfaces*/, bool showedges) const { GLint *shaderinfo = this->shaderinfo; if (!shaderinfo[0]) shaderinfo = nullptr; if (this->root_products) { renderCSGProducts(*this->root_products, showedges ? shaderinfo : nullptr, false, false); } if (this->background_products) { renderCSGProducts(*this->background_products, showedges ? shaderinfo : nullptr, false, true); } if (this->highlights_products) { renderCSGProducts(*this->highlights_products, showedges ? shaderinfo : nullptr, true, false); } } // Primitive for rendering using OpenCSG OpenCSGPrim *OpenCSGRenderer::createCSGPrimitive(const CSGChainObject &csgobj, OpenCSG::Operation operation, bool highlight_mode, bool background_mode, OpenSCADOperator type) const { OpenCSGPrim *prim = new OpenCSGPrim(operation, csgobj.leaf->geom->getConvexity()); prim->geom = csgobj.leaf->geom; prim->m = csgobj.leaf->matrix; prim->csgmode = get_csgmode(highlight_mode, background_mode, type); return prim; } void OpenCSGRenderer::renderCSGProducts(const CSGProducts &products, GLint *shaderinfo, bool highlight_mode, bool background_mode) const { #ifdef ENABLE_OPENCSG for(const auto &product : products.products) { std::vector primitives; for(const auto &csgobj : product.intersections) { if (csgobj.leaf->geom) primitives.push_back(createCSGPrimitive(csgobj, OpenCSG::Intersection, highlight_mode, background_mode, OpenSCADOperator::INTERSECTION)); } for(const auto &csgobj : product.subtractions) { if (csgobj.leaf->geom) primitives.push_back(createCSGPrimitive(csgobj, OpenCSG::Subtraction, highlight_mode, background_mode, OpenSCADOperator::DIFFERENCE)); } if (primitives.size() > 1) { OpenCSG::render(primitives); glDepthFunc(GL_EQUAL); } if (shaderinfo) glUseProgram(shaderinfo[0]); for(const auto &csgobj : product.intersections) { const Color4f &c = csgobj.leaf->color; csgmode_e csgmode = get_csgmode(highlight_mode, background_mode); ColorMode colormode = ColorMode::NONE; if (highlight_mode) { colormode = ColorMode::HIGHLIGHT; } else if (background_mode) { colormode = ColorMode::BACKGROUND; } else { colormode = ColorMode::MATERIAL; } glPushMatrix(); glMultMatrixd(csgobj.leaf->matrix.data()); const Color4f c1 = setColor(colormode, c.data(), shaderinfo); if (c1[3] == 1.0f) { // object is opaque, draw normally render_surface(csgobj.leaf->geom, csgmode, csgobj.leaf->matrix, shaderinfo); } else { // object is transparent, so draw rear faces first. Issue #1496 glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); render_surface(csgobj.leaf->geom, csgmode, csgobj.leaf->matrix, shaderinfo); glCullFace(GL_BACK); render_surface(csgobj.leaf->geom, csgmode, csgobj.leaf->matrix, shaderinfo); glDisable(GL_CULL_FACE); } glPopMatrix(); } for(const auto &csgobj : product.subtractions) { const Color4f &c = csgobj.leaf->color; csgmode_e csgmode = get_csgmode(highlight_mode, background_mode, OpenSCADOperator::DIFFERENCE); ColorMode colormode = ColorMode::NONE; if (highlight_mode) { colormode = ColorMode::HIGHLIGHT; } else if (background_mode) { colormode = ColorMode::BACKGROUND; } else { colormode = ColorMode::CUTOUT; } setColor(colormode, c.data(), shaderinfo); glPushMatrix(); glMultMatrixd(csgobj.leaf->matrix.data()); // negative objects should only render rear faces glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); render_surface(csgobj.leaf->geom, csgmode, csgobj.leaf->matrix, shaderinfo); glDisable(GL_CULL_FACE); glPopMatrix(); } if (shaderinfo) glUseProgram(0); for(auto &p : primitives) delete p; glDepthFunc(GL_LEQUAL); } #endif } BoundingBox OpenCSGRenderer::getBoundingBox() const { BoundingBox bbox; if (this->root_products) bbox = this->root_products->getBoundingBox(); if (this->highlights_products) bbox.extend(this->highlights_products->getBoundingBox()); if (this->background_products) bbox.extend(this->background_products->getBoundingBox()); return bbox; } openscad-2019.05/src/OpenCSGRenderer.h0000644000076500000240000000174513402025764017776 0ustar kintelstaff00000000000000#pragma once #include "renderer.h" #include "system-gl.h" #ifdef ENABLE_OPENCSG #include #endif #include "csgnode.h" class OpenCSGRenderer : public Renderer { public: OpenCSGRenderer(shared_ptr root_products, shared_ptr highlights_products, shared_ptr background_products, GLint *shaderinfo); void draw(bool showfaces, bool showedges) const override; BoundingBox getBoundingBox() const override; private: #ifdef ENABLE_OPENCSG class OpenCSGPrim *createCSGPrimitive(const class CSGChainObject &csgobj, OpenCSG::Operation operation, bool highlight_mode, bool background_mode, OpenSCADOperator type) const; #endif void renderCSGProducts(const class CSGProducts &products, GLint *shaderinfo, bool highlight_mode, bool background_mode) const; shared_ptr root_products; shared_ptr highlights_products; shared_ptr background_products; GLint *shaderinfo; }; openscad-2019.05/src/OpenCSGWarningDialog.cc0000644000076500000240000000132113402025764021101 0ustar kintelstaff00000000000000#include "OpenCSGWarningDialog.h" #include "Preferences.h" OpenCSGWarningDialog::OpenCSGWarningDialog(QWidget*) { setupUi(this); connect(this->showBox, SIGNAL(toggled(bool)), Preferences::inst()->openCSGWarningBox, SLOT(setChecked(bool))); connect(this->showBox, SIGNAL(toggled(bool)), Preferences::inst(), SLOT(on_openCSGWarningBox_toggled(bool))); connect(this->enableOpenCSGBox, SIGNAL(toggled(bool)), Preferences::inst()->enableOpenCSGBox, SLOT(setChecked(bool))); connect(this->enableOpenCSGBox, SIGNAL(toggled(bool)), Preferences::inst(), SLOT(on_enableOpenCSGBox_toggled(bool))); } void OpenCSGWarningDialog::setText(const QString &text) { this->warningText->setPlainText(text); } openscad-2019.05/src/OpenCSGWarningDialog.h0000644000076500000240000000041313402025764020744 0ustar kintelstaff00000000000000#pragma once #include "qtgettext.h" #include "ui_OpenCSGWarningDialog.h" class OpenCSGWarningDialog : public QDialog, public Ui::OpenCSGWarningDialog { Q_OBJECT; public: OpenCSGWarningDialog(QWidget *parent); public slots: void setText(const QString &text); }; openscad-2019.05/src/OpenCSGWarningDialog.ui0000644000076500000240000000533213402025764021137 0ustar kintelstaff00000000000000 OpenCSGWarningDialog 0 0 412 275 OpenGL Warning true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Enable OpenCSG true Show this message again true Qt::Horizontal 40 20 Close closeButton clicked() OpenCSGWarningDialog accept() 361 246 205 137 openscad-2019.05/src/OpenSCADApp.cc0000644000076500000240000000541313410050067017171 0ustar kintelstaff00000000000000#include "OpenSCADApp.h" #include "MainWindow.h" #ifdef Q_OS_MAC #include "EventFilter.h" #endif #include #include #include #include "QSettingsCached.h" OpenSCADApp::OpenSCADApp(int &argc ,char **argv) : QApplication(argc, argv), fontCacheDialog(nullptr) { #ifdef Q_OS_MAC this->installEventFilter(new SCADEventFilter(this)); #endif } OpenSCADApp::~OpenSCADApp() { delete this->fontCacheDialog; } #include // See: https://bugreports.qt.io/browse/QTBUG-65592 void OpenSCADApp::workaround_QTBUG_65592(QObject* o, QEvent* e) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) QMainWindow* mw; if (o->isWidgetType() && e->type() == QEvent::MouseButtonPress && (mw = qobject_cast< QMainWindow* >(o))) { for (auto& ch : mw->children()) { if (auto dw = qobject_cast< QDockWidget* >(ch)) { auto pname = "_wa-QTBUG-65592"; auto v = dw->property(pname); if (v.isNull()) { dw->setProperty(pname, true); mw->restoreDockWidget(dw); auto area = mw->dockWidgetArea(dw); auto orient = area == Qt::TopDockWidgetArea || area == Qt::BottomDockWidgetArea ? Qt::Horizontal : Qt::Vertical; mw->resizeDocks({dw}, {orient == Qt::Horizontal ? dw->width() : dw->height() }, orient); } } } } #endif } bool OpenSCADApp::notify(QObject *object, QEvent *event) { QString msg; try { workaround_QTBUG_65592(object, event); return QApplication::notify(object, event); } catch (const std::exception &e) { msg = e.what(); } catch (...) { msg = _("Unknown error"); } // This happens when an uncaught exception is thrown in a Qt event handler QMessageBox::critical(nullptr, QString(_("Critical Error")), QString(_("A critical error was caught. The application may have become unstable:\n%1")).arg(QString(msg))); return false; } /*! Requests to open a file from an external event, e.g. by double-clicking a filename. */ void OpenSCADApp::requestOpenFile(const QString &filename) { for (auto win : this->windowManager.getWindows()) { // if we have an empty open window, use that one if (win->isEmpty()) { win->openFile(filename); return; } } // ..otherwise, create a new one new MainWindow(filename); } void OpenSCADApp::showFontCacheDialog() { if (!this->fontCacheDialog) this->fontCacheDialog = new QProgressDialog(); this->fontCacheDialog->setLabelText(_("Fontconfig needs to update its font cache.\nThis can take up to a couple of minutes.")); this->fontCacheDialog->setMinimum(0); this->fontCacheDialog->setMaximum(0); this->fontCacheDialog->setCancelButton(nullptr); this->fontCacheDialog->exec(); } void OpenSCADApp::hideFontCacheDialog() { assert(this->fontCacheDialog); this->fontCacheDialog->reset(); } void OpenSCADApp::releaseQSettingsCached() { QSettingsCached{}.release(); } openscad-2019.05/src/OpenSCADApp.h0000644000076500000240000000116513410050067017033 0ustar kintelstaff00000000000000#pragma once #include #include "WindowManager.h" class OpenSCADApp : public QApplication { Q_OBJECT public: OpenSCADApp(int &argc ,char **argv); ~OpenSCADApp(); bool notify(QObject *object, QEvent *event) override; void workaround_QTBUG_65592(QObject *object, QEvent *event); void requestOpenFile(const QString &filename); public slots: void showFontCacheDialog(); void hideFontCacheDialog(); void releaseQSettingsCached(); public: WindowManager windowManager; private: class QProgressDialog *fontCacheDialog; }; #define scadApp (static_cast(QCoreApplication::instance())) openscad-2019.05/src/Package.h0000644000076500000240000000060313402025764016374 0ustar kintelstaff00000000000000#pragma once #include "AST.h" #include class Package : public ASTNode { public: Package() {} virtual ~Package() {} void setPath(const std::string &path) { this->_path = path; } const std::string &path() const { return this->_path; } LocalScope scope; typedef std::unordered_set ModuleContainer; ModuleContainer usedlibs; private: std::string _path; }; openscad-2019.05/src/PlatformUtils-mac.mm0000644000076500000240000000471413417146620020576 0ustar kintelstaff00000000000000#include "PlatformUtils.h" #include #include #include #import #include "version.h" std::string PlatformUtils::pathSeparatorChar() { return ":"; } std::string PlatformUtils::userDocumentsPath() { return documentsPath(); } std::string PlatformUtils::documentsPath() { return std::string([[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] UTF8String]); } std::string PlatformUtils::userConfigPath() { NSError *error; NSURL *appSupportDir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error]; return std::string([[appSupportDir path] UTF8String]) + std::string("/") + PlatformUtils::OPENSCAD_FOLDER_NAME; } unsigned long PlatformUtils::stackLimit() { struct rlimit limit; int ret = getrlimit(RLIMIT_STACK, &limit); if (ret == 0) { if (limit.rlim_cur > STACK_BUFFER_SIZE) { return limit.rlim_cur - STACK_BUFFER_SIZE; } if (limit.rlim_max > STACK_BUFFER_SIZE) { return limit.rlim_max - STACK_BUFFER_SIZE; } } return STACK_LIMIT_DEFAULT; } const std::string PlatformUtils::user_agent() { std::string result; result += "OpenSCAD/"; result += openscad_detailedversionnumber; result += " ("; result += sysinfo(false); result += ")"; return result; } const std::string PlatformUtils::sysinfo(bool extended) { std::string result; result += "Mac OS X "; result += [[[NSProcessInfo processInfo] operatingSystemVersionString] UTF8String]; int64_t physical_memory; int32_t numcpu; size_t length64 = sizeof(int64_t); size_t length32 = sizeof(int32_t);; sysctlbyname("hw.memsize", &physical_memory, &length64, nullptr, 0); sysctlbyname("hw.physicalcpu", &numcpu, &length32, nullptr, 0); size_t modellen = 0; sysctlbyname("hw.model", nullptr, &modellen, nullptr, 0); if (modellen) { char *model = (char *)malloc(modellen*sizeof(char)); sysctlbyname("hw.model", model, &modellen, nullptr, 0); result += " "; result += model; free(model); } if (extended) { result += " "; result += boost::lexical_cast(numcpu); result += " CPU"; if (numcpu > 1) result += "s"; result += " "; result += PlatformUtils::toMemorySizeString(physical_memory, 2); result += " RAM "; } return result; } void PlatformUtils::ensureStdIO(void) {} openscad-2019.05/src/PlatformUtils-posix.cc0000644000076500000240000001442513417146620021154 0ustar kintelstaff00000000000000#include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "PlatformUtils.h" namespace fs=boost::filesystem; static std::mutex user_agent_mutex; static std::string readText(const std::string &path) { std::ifstream s{path.c_str()}; s.seekg(0, std::ios::end); if (s.fail() || s.tellg() > 4096) { return ""; } s.seekg(0, std::ios::beg); std::string text{(std::istreambuf_iterator(s)), std::istreambuf_iterator()}; return text; } // see http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html static fs::path getXdgConfigDir() { const char *xdg_env = getenv("XDG_CONFIG_HOME"); if (xdg_env && fs::exists(fs::path{xdg_env})) { return fs::path{xdg_env}; } else { const char *home = getenv("HOME"); if (home) { return fs::path{home} / ".config"; } } return fs::path{}; } // see https://www.freedesktop.org/wiki/Software/xdg-user-dirs/ // This partially implements the xdg-user-dir handling by reading the // user-dirs.dirs file generated by the xdg-user-dirs-update tool. Missing // is any handling of shell style quotes so this may fail with unusual // setup. static std::string getXdgUserDir(const std::string &dir) { const fs::path config_dir = getXdgConfigDir() / "user-dirs.dirs"; const std::string user_dirs{readText(config_dir.generic_string())}; boost::smatch results; boost::regex documents_dir{"^" + dir + "=\"[$]HOME/([^\"]+)\""}; if (boost::regex_search(user_dirs, results, documents_dir)) { return results[1]; } return ""; } std::string PlatformUtils::pathSeparatorChar() { return ":"; } std::string PlatformUtils::userDocumentsPath() { fs::path user_documents_path; const char *xdg_env = getenv("XDG_DOCUMENTS_DIR"); if (xdg_env && fs::exists(fs::path(xdg_env))) { user_documents_path = fs::path(xdg_env); } else { const char *home = getenv("HOME"); if (home) { fs::path home_path{home}; const auto user_dirs = getXdgUserDir("XDG_DOCUMENTS_DIR"); if (!user_dirs.empty() && fs::exists(home_path / user_dirs)) { user_documents_path = home_path / user_dirs; } else if (fs::exists(fs::path(home))) { user_documents_path = fs::path(home); } } } if (fs::is_directory(user_documents_path)) { return fs::absolute(user_documents_path).generic_string(); } return ""; } std::string PlatformUtils::documentsPath() { const char *home = getenv("HOME"); if (home) { fs::path docpath(home); docpath = docpath / ".local" / "share"; return docpath.generic_string(); } else { return ""; } } std::string PlatformUtils::userConfigPath() { const fs::path config_path{getXdgConfigDir() / OPENSCAD_FOLDER_NAME}; if (fs::is_directory(config_path)) { return fs::absolute(config_path).generic_string(); } return ""; } unsigned long PlatformUtils::stackLimit() { struct rlimit limit; int ret = getrlimit(RLIMIT_STACK, &limit); if (ret == 0) { if (limit.rlim_cur == RLIM_INFINITY) { return STACK_LIMIT_DEFAULT; } if (limit.rlim_cur > STACK_BUFFER_SIZE) { return limit.rlim_cur - STACK_BUFFER_SIZE; } if (limit.rlim_max == RLIM_INFINITY) { return STACK_LIMIT_DEFAULT; } if (limit.rlim_max > STACK_BUFFER_SIZE) { return limit.rlim_max - STACK_BUFFER_SIZE; } } return STACK_LIMIT_DEFAULT; } /** * Check /etc/os-release as defined by systemd. * @see http://0pointer.de/blog/projects/os-release.html * @see http://www.freedesktop.org/software/systemd/man/os-release.html * @return the PRETTY_NAME from the os-release file or an empty string. */ static const std::string checkOsRelease() { std::string os_release(readText("/etc/os-release")); boost::smatch results; boost::regex pretty_name("^PRETTY_NAME=\"([^\"]+)\""); if (boost::regex_search(os_release, results, pretty_name)) { return results[1]; } return ""; } static const std::string checkEtcIssue() { std::string issue(readText("/etc/issue")); boost::regex nl("\n.*$"); issue = boost::regex_replace(issue, nl, ""); boost::regex esc("\\\\."); issue = boost::regex_replace(issue, esc, ""); boost::algorithm::trim(issue); return issue; } static const std::string detectDistribution() { std::string osrelease = checkOsRelease(); if (!osrelease.empty()) { return osrelease; } std::string etcissue = checkEtcIssue(); if (!etcissue.empty()) { return etcissue; } return ""; } static const std::string get_distribution(const std::string& separator) { std::string result; std::string distribution = detectDistribution(); if (!distribution.empty()) { result += separator; result += distribution; } return result; } static const std::string get_system_info(bool extended = true) { std::string result; struct utsname osinfo; if (uname(&osinfo) == 0) { result += osinfo.sysname; result += " "; if (extended) { result += osinfo.release; result += " "; result += osinfo.version; result += " "; } result += osinfo.machine; } else { result += "Unknown Unix"; } return result; } const std::string PlatformUtils::user_agent() { static std::string result; std::lock_guard lock(user_agent_mutex); if (result.empty()) { result += "OpenSCAD/"; result += openscad_detailedversionnumber; result += " ("; result += get_system_info(false); result += get_distribution("; "); result += ")"; } return result; } const std::string PlatformUtils::sysinfo(bool extended) { std::string result; result += get_system_info(true); result += get_distribution(" "); if (extended) { long numcpu = sysconf(_SC_NPROCESSORS_ONLN); if (numcpu > 0) { result += " "; result += boost::lexical_cast(numcpu); result += " CPU"; if (numcpu > 1) { result += "s"; } } long pages = sysconf(_SC_PHYS_PAGES); long pagesize = sysconf(_SC_PAGE_SIZE); if ((pages > 0) && (pagesize > 0)) { result += " "; result += PlatformUtils::toMemorySizeString(pages * pagesize, 2); result += " RAM"; } } return result; } void PlatformUtils::ensureStdIO(void) {} openscad-2019.05/src/PlatformUtils-win.cc0000644000076500000240000001432113441031431020570 0ustar kintelstaff00000000000000#include "PlatformUtils.h" #include "printutils.h" #include "findversion.h" #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #undef NOGDI #include #ifndef _WIN32_IE #define _WIN32_IE 0x0501 // SHGFP_TYPE_CURRENT #endif // Ugly hack to disable definitions in shobjidl.h which use unavailable // structure LOGFONTW. #define __IPreviewHandlerVisuals_INTERFACE_DEFINED__ #define __IVisualProperties_INTERFACE_DEFINED__ #include #include "version.h" std::string PlatformUtils::pathSeparatorChar() { return ";"; } // convert from windows api w_char strings (usually utf16) to utf8 std::string std::string winapi_wstr_to_utf8( std::wstring wstr ) { UINT CodePage = CP_UTF8; DWORD dwFlags = 0; LPCWSTR lpWideCharStr = &wstr[0]; int cchWideChar = static_cast(wstr.size()); LPSTR lpMultiByteStr = nullptr; int cbMultiByte = 0; LPCSTR lpDefaultChar = nullptr; LPBOOL lpUsedDefaultChar = nullptr; int numbytes = WideCharToMultiByte( CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar ); //PRINTB("utf16 to utf8 conversion: numbytes %i",numbytes); std::string utf8_str(numbytes,0); lpMultiByteStr = &utf8_str[0]; cbMultiByte = numbytes; int result = WideCharToMultiByte( CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar ); if (result != numbytes) { DWORD errcode = GetLastError(); PRINT("ERROR: error converting w_char str to utf8 string"); PRINTB("ERROR: error code %i",errcode); } return utf8_str; } // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx static const std::string getFolderPath(int nFolder) { std::wstring path(MAX_PATH,0); HWND hwndOwner = 0; HANDLE hToken = nullptr; DWORD dwFlags = SHGFP_TYPE_CURRENT; LPWSTR pszPath = &path[0]; int result = SHGetFolderPathW( hwndOwner, nFolder, hToken, dwFlags, pszPath ); if (result == S_OK) { path = std::wstring( path.c_str() ); // strip extra nullptrs // Use boost::filesystem to decide how to convert from wstring // to string. Normally the path encoding is system local and // we don't want to force conversion to UTF-8. fs::path p(path); return p.string(); } return ""; } std::string PlatformUtils::userDocumentsPath() { return documentsPath(); } // retrieve the path to 'My Documents' for the current user under windows // In XP this is 'c:\documents and settings\username\my documents' // In Vista, 7, 8+ this is 'c:\users\username\documents' // This code may have problems with unusual dir types in Vista because // Mingw does not provide access to the updated SHGetKnownFolderPath std::string PlatformUtils::documentsPath() { const std::string retval = getFolderPath(CSIDL_PERSONAL); if (retval.empty()) { PRINT("ERROR: Could not find My Documents location"); } return retval; } std::string PlatformUtils::userConfigPath() { const std::string retval = getFolderPath(CSIDL_LOCAL_APPDATA); if (retval.empty()) { PRINT("ERROR: Could not find Local AppData location"); } return retval + std::string("/") + PlatformUtils::OPENSCAD_FOLDER_NAME; } unsigned long PlatformUtils::stackLimit() { return STACK_LIMIT_DEFAULT; } typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); // see http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx static BOOL IsWow64() { BOOL bIsWow64 = FALSE; //IsWow64Process is not available on all supported versions of Windows. //Use GetModuleHandle to get a handle to the DLL that contains the function //and GetProcAddress to get a pointer to the function if available. LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); if (nullptr != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) { return false; } } return bIsWow64; } const std::string PlatformUtils::user_agent() { std::string result; result += "OpenSCAD/"; result += openscad_detailedversionnumber; result += " ("; result += sysinfo(false); result += ")"; return result; } const std::string PlatformUtils::sysinfo(bool extended) { std::string result; OSVERSIONINFOEX osinfo; osinfo.dwOSVersionInfoSize = sizeof(osinfo); if (GetVersionExEx(&osinfo) == 0) { result += "Unknown Windows(TM)"; } else { boost::format fmt("Windows(TM) %d.%d SP %d.%d NTW %i MSDN 724833"); fmt % osinfo.dwMajorVersion % osinfo.dwMinorVersion % osinfo.wServicePackMajor % osinfo.wServicePackMinor % (osinfo.wProductType == VER_NT_WORKSTATION); result += fmt.str(); } SYSTEM_INFO systeminfo; bool isWow64 = IsWow64(); if (isWow64) { GetNativeSystemInfo(&systeminfo); } else { GetSystemInfo(&systeminfo); } if (extended) { int numcpu = systeminfo.dwNumberOfProcessors; boost::format fmt(" %d CPU%s%s"); fmt % numcpu % (numcpu > 1 ? "s" : "") % (isWow64 ? " WOW64" : ""); result += fmt.str(); MEMORYSTATUSEX memoryinfo; memoryinfo.dwLength = sizeof(memoryinfo); if (GlobalMemoryStatusEx(&memoryinfo) != 0) { result += " "; result += PlatformUtils::toMemorySizeString(memoryinfo.ullTotalPhys, 2); result += " RAM"; } } return result; } #include #include #include // attach to parent console if standard IO handles not available // It may be good idea to redirect the output to file(s) here in some future. void PlatformUtils::ensureStdIO(void) { // Preserve existing handles whenever available. // HANDLE hRead = (HANDLE)_get_osfhandle(_fileno(stdin)); HANDLE hWrite = (HANDLE)_get_osfhandle(_fileno(stdout)); HANDLE hError = (HANDLE)_get_osfhandle(_fileno(stderr)); if (/* INVALID_HANDLE_VALUE != hRead && */ INVALID_HANDLE_VALUE != hWrite && INVALID_HANDLE_VALUE != hError) return; // I see nothing to do about error(s) here. if (!AttachConsole(ATTACH_PARENT_PROCESS)) return; // Let CRT machinery performs proper setup. // if (INVALID_HANDLE_VALUE == hRead) (void)_wfreopen(L"CONIN$", L"rt", stdin); if (INVALID_HANDLE_VALUE == hWrite) (void)_wfreopen(L"CONOUT$", L"wt", stdout); if (INVALID_HANDLE_VALUE == hError) (void)_wfreopen(L"CONOUT$", L"wt", stderr); std::ios_base::sync_with_stdio(); } openscad-2019.05/src/PlatformUtils.cc0000644000076500000240000001267413402025764020017 0ustar kintelstaff00000000000000#include #include #include "PlatformUtils.h" #include "boosty.h" #ifdef INSTALL_SUFFIX #define RESOURCE_FOLDER(path) path INSTALL_SUFFIX #else #define RESOURCE_FOLDER(path) path #endif extern std::vector librarypath; extern std::vector fontpath; namespace { bool path_initialized = false; std::string applicationpath; std::string resourcespath; } const char *PlatformUtils::OPENSCAD_FOLDER_NAME = "OpenSCAD"; static std::string lookupResourcesPath() { fs::path resourcedir(applicationpath); PRINTDB("Looking up resource folder with application path '%s'", resourcedir.generic_string().c_str()); #ifdef __APPLE__ const char *searchpath[] = { "../Resources", // Resources can be bundled on Mac. "../../..", // Dev location "..", // Test location nullptr }; #else #ifdef _WIN32 const char *searchpath[] = { ".", // Release location RESOURCE_FOLDER("../share/openscad"), // MSYS2 location "..", // Dev location nullptr }; #else const char *searchpath[] = { RESOURCE_FOLDER("../share/openscad"), RESOURCE_FOLDER("../../share/openscad"), ".", "..", "../..", nullptr }; #endif #endif fs::path tmpdir; for (int a = 0;searchpath[a] != nullptr;a++) { tmpdir = resourcedir / searchpath[a]; // The resource folder is the folder which contains "color-schemes" (as well as // "examples" and "locale", and optionally "libraries" and "fonts") const fs::path checkdir = tmpdir / "color-schemes"; PRINTDB("Checking '%s'", checkdir.generic_string().c_str()); if (is_directory(checkdir)) { resourcedir = tmpdir; PRINTDB("Found resource folder '%s'", tmpdir.generic_string().c_str()); break; } } // resourcedir defaults to applicationPath std::string result = boosty::canonical(resourcedir).generic_string(); PRINTDB("Using resource folder '%s'", result); return result; } void PlatformUtils::registerApplicationPath(const std::string &apppath) { applicationpath = apppath; resourcespath = lookupResourcesPath(); path_initialized = true; } std::string PlatformUtils::applicationPath() { if (!path_initialized) { throw std::runtime_error("PlatformUtils::applicationPath(): application path not initialized!"); } return applicationpath; } bool PlatformUtils::createUserLibraryPath() { std::string path = PlatformUtils::userLibraryPath(); bool OK = false; try { if (!fs::exists(fs::path(path))) { //PRINTB("Creating library folder %s", path ); OK = fs::create_directories( path ); } if (!OK) { PRINTB("ERROR: Cannot create %s", path ); } } catch (const fs::filesystem_error& ex) { PRINTB("ERROR: %s",ex.what()); } return OK; } std::string PlatformUtils::userLibraryPath() { fs::path path; try { std::string pathstr = PlatformUtils::documentsPath(); if (pathstr=="") return ""; path = fs::path( pathstr ); if (!fs::exists(path)) return ""; path = boosty::canonical( path ); //PRINTB("path size %i",boosty::stringy(path).size()); //PRINTB("lib path found: [%s]", path ); if (path.empty()) return ""; path /= OPENSCAD_FOLDER_NAME; path /= "libraries"; //PRINTB("Appended path %s", path ); //PRINTB("Exists: %i", fs::exists(path) ); } catch (const fs::filesystem_error& ex) { PRINTB("ERROR: %s",ex.what()); } return path.generic_string(); } std::string PlatformUtils::backupPath() { fs::path path; try { std::string pathstr = PlatformUtils::documentsPath(); if (pathstr=="") return ""; path = fs::path( pathstr ); if (!fs::exists(path)) return ""; path = boosty::canonical( path ); if (path.empty()) return ""; path /= OPENSCAD_FOLDER_NAME; path /= "backups"; } catch (const fs::filesystem_error& ex) { PRINTB("ERROR: %s",ex.what()); } return path.generic_string(); } bool PlatformUtils::createBackupPath() { std::string path = PlatformUtils::backupPath(); bool OK = false; try { if (!fs::exists(fs::path(path))) { OK = fs::create_directories( path ); } if (!OK) { PRINTB("ERROR: Cannot create %s", path ); } } catch (const fs::filesystem_error& ex) { PRINTB("ERROR: %s",ex.what()); } return OK; } // This is the built-in read-only resources path std::string PlatformUtils::resourceBasePath() { if (!path_initialized) { throw std::runtime_error("PlatformUtils::resourcesPath(): application path not initialized!"); } return resourcespath; } fs::path PlatformUtils::resourcePath(const std::string &resource) { fs::path base(resourceBasePath()); if (!fs::is_directory(base)) { return fs::path(); } fs::path resource_dir = base / resource; if (!fs::is_directory(resource_dir)) { return fs::path(); } return resource_dir; } int PlatformUtils::setenv(const char *name, const char *value, int overwrite) { #if defined(_WIN32) const char *ptr = getenv(name); if ((overwrite == 0) && (ptr != nullptr)) { return 0; } char buf[4096]; snprintf(buf, sizeof(buf), "%s=%s", name, value); return _putenv(buf); #else return ::setenv(name, value, overwrite); #endif } std::string PlatformUtils::toMemorySizeString(uint64_t bytes, int digits) { static const char *units[] = { "B", "kB", "MB", "GB", "TB", nullptr }; int idx = 0; double val = bytes; while (true) { if (val < 1024.0) { break; } if (units[idx + 1] == nullptr) { break; } idx++; val /= 1024.0; } boost::format fmt("%f %s"); fmt % boost::io::group(std::setprecision(digits), val) % units[idx]; return fmt.str(); } openscad-2019.05/src/PlatformUtils.h0000644000076500000240000001021513437012201017634 0ustar kintelstaff00000000000000#pragma once #include #include namespace fs=boost::filesystem; #define STACK_BUFFER_SIZE (128 * 1024) #define STACK_LIMIT_DEFAULT (STACKSIZE - STACK_BUFFER_SIZE) namespace PlatformUtils { extern const char *OPENSCAD_FOLDER_NAME; void registerApplicationPath(const std::string &applicationpath); std::string applicationPath(); /** * The OpenSCAD document path which is used for searching user * libraries and storing backup files. * On Linux this is $HOME/.local/share, on Windows the CSIDL_PERSONAL * directory (My Documents) and on MacOS it is the NSDocumentDirectory * ($HOME/Documents). * * @return the application documents path */ std::string documentsPath(); /** * The user documents path where files are saved/exported to by * default. On Linux this is the $XDG_DOCUMENTS_DIR, if this is * not set, the $XDG_CONFIG_HOME/user-dirs.dirs file will be checked. * On Windows and MacOS this is currently identical to documentsPath(). * * @return the path for saving user documents */ std::string userDocumentsPath(); std::string resourceBasePath(); fs::path resourcePath(const std::string& resource); std::string userLibraryPath(); /** * Base path where user configuration can be read and written to. On * Linux this is the $XDG_CONFIG_HOME, on Windows the local AppData * folder CSIDL_LOCAL_APPDATA. * On success the returned path can be used directly as base folder * as it already includes an OpenSCAD specific part. * * @return absolute path to the writable configuration folder or * an empty string if the config path does not exist. */ std::string userConfigPath(); bool createUserLibraryPath(); std::string backupPath(); bool createBackupPath(); /** * Return a human readable text describing the operating system * the application is currently running on. This is mainly intended * to provide information for bug reports (e.g. to be included in * the LibraryInfoDialog). * * If there is some error to retrieve the details, at least the * OS type is reported based on what platform the application was * built for. * * Extended sysinfo will return more info, like CPUs and RAM * @return system information. */ const std::string sysinfo(bool extended = true); /** * Return short text describing the operating system usable as * UserAgent string for networking purposes. This is intended * to not leak too detail data about the system but still enough * to give some indication for troubleshooting on server side. * * @return the short system infor */ const std::string user_agent(); /** * Platform abstraction to set environment variables. Windows/MinGW * does not support setenv(), but needs _putenv(). * * @param name name of the environment variable. * @param value the value to set for the environment variable. * @return 0 on success. */ int setenv(const char *name, const char *value, int overwrite); /** * Return system defined stack limit. If the system does not define * a specific limit, the platform specific code will select a value. * * @return maximum stack size in bytes. */ unsigned long stackLimit(); /** * Single character separating path specifications in a list * (e.g. OPENSCADPATH). On Windows that's ';' and on most other * systems ':'. * * @return the path separator */ std::string pathSeparatorChar(); /* Provide stdout/stderr if not available. * Currently limited to MS Windows GUI application console only. */ void ensureStdIO(void); /** * Convert the number of bytes to a human readable string with * a given number of digits. */ std::string toMemorySizeString(uint64_t bytes, int digits); } openscad-2019.05/src/Polygon2d-CGAL.cc0000644000076500000240000001033413437640540017565 0ustar kintelstaff00000000000000#include "Polygon2d-CGAL.h" #include "polyset.h" #include "printutils.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #pragma pop_macro("NDEBUG") #include namespace Polygon2DCGAL { struct FaceInfo { FaceInfo() : nesting_level(42) {} int nesting_level; bool in_domain() { return nesting_level%2 == 1; } }; typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Triangulation_vertex_base_2 Vb; typedef CGAL::Triangulation_face_base_with_info_2 Fbb; typedef CGAL::Constrained_triangulation_face_base_2 Fb; typedef CGAL::Triangulation_data_structure_2 TDS; typedef CGAL::Exact_predicates_tag Itag; typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; typedef CDT::Point Point; typedef CGAL::Polygon_2 Polygon_2; void mark_domains(CDT &ct, CDT::Face_handle start, int index, std::list &border) { if (start->info().nesting_level != -1) return; std::list queue; queue.push_back(start); while (!queue.empty()) { auto fh = queue.front(); queue.pop_front(); if (fh->info().nesting_level == -1) { fh->info().nesting_level = index; for (int i = 0; i < 3; i++) { CDT::Edge e(fh,i); auto n = fh->neighbor(i); if (n->info().nesting_level == -1) { if (ct.is_constrained(e)) border.push_back(e); else queue.push_back(n); } } } } } // Explore set of facets connected with non constrained edges, // and attribute to each such set a nesting level. // We start from facets incident to the infinite vertex, with a nesting // level of 0. Then we recursively consider the non-explored facets incident // to constrained edges bounding the former set and increase the nesting level by 1. // Facets in the domain are those with an odd nesting level. void mark_domains(CDT &cdt) { for(CDT::All_faces_iterator it = cdt.all_faces_begin(); it != cdt.all_faces_end(); ++it) { it->info().nesting_level = -1; } int index = 0; std::list border; mark_domains(cdt, cdt.infinite_face(), index++, border); while (!border.empty()) { CDT::Edge e = border.front(); border.pop_front(); CDT::Face_handle n = e.first->neighbor(e.second); if (n->info().nesting_level == -1) { mark_domains(cdt, n, e.first->info().nesting_level+1, border); } } } } /*! Triangulates this polygon2d and returns a 2D PolySet. */ PolySet *Polygon2d::tessellate() const { PRINTDB("Polygon2d::tessellate(): %d outlines", this->outlines().size()); auto polyset = new PolySet(*this); Polygon2DCGAL::CDT cdt; // Uses a constrained Delaunay triangulator. CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { // Adds all vertices, and add all contours as constraints. for (const auto &outline : this->outlines()) { // Start with last point auto prev = cdt.insert({outline.vertices[outline.vertices.size()-1][0], outline.vertices[outline.vertices.size()-1][1]}); for (const auto &v : outline.vertices) { auto curr = cdt.insert({v[0], v[1]}); if (prev != curr) { // Ignore duplicate vertices cdt.insert_constraint(prev, curr); prev = curr; } } } } catch (const CGAL::Precondition_exception &e) { PRINTB("CGAL error in Polygon2d::tesselate(): %s", e.what()); CGAL::set_error_behaviour(old_behaviour); return nullptr; } CGAL::set_error_behaviour(old_behaviour); // To extract triangles which is part of our polygon, we need to filter away // triangles inside holes. mark_domains(cdt); for (auto fit = cdt.finite_faces_begin(); fit != cdt.finite_faces_end(); ++fit) { if (fit->info().in_domain()) { polyset->append_poly(); for (int i=0;i<3;i++) { polyset->append_vertex(fit->vertex(i)->point()[0], fit->vertex(i)->point()[1], 0); } } } return polyset; } openscad-2019.05/src/Polygon2d-CGAL.h0000644000076500000240000000023613402025764017424 0ustar kintelstaff00000000000000#pragma once #include "Polygon2d.h" #include "cgal.h" #include "CGAL_Nef_polyhedron.h" namespace Polygon2DCGAL { CGAL_Nef_polyhedron toNefPolyhedron(); }; openscad-2019.05/src/Polygon2d.cc0000644000076500000240000000561613414457253017072 0ustar kintelstaff00000000000000#include "Polygon2d.h" #include "printutils.h" /*! Class for holding 2D geometry. This class will hold 2D geometry consisting of a number of closed polygons. Each polygon can contain holes and islands. Both polygons, holes and island contours may intersect each other. We can store sanitized vs. unsanitized polygons. Sanitized polygons will have opposite winding order for holes and is guaranteed to not have intersecting geometry. The winding order will be counter-clockwise for positive outlines and clockwise for holes. Sanitization is typically done by ClipperUtils, but if you create geometry which you know is sanitized, the flag can be set manually. */ size_t Polygon2d::memsize() const { size_t mem = 0; for (const auto &o : this->outlines()) { mem += o.vertices.size() * sizeof(Vector2d) + sizeof(Outline2d); } mem += sizeof(Polygon2d); return mem; } BoundingBox Polygon2d::getBoundingBox() const { BoundingBox bbox; for (const auto &o : this->outlines()) { for (const auto &v : o.vertices) { bbox.extend(Vector3d(v[0], v[1], 0)); } } return bbox; } std::string Polygon2d::dump() const { std::ostringstream out; for (const auto &o : this->theoutlines) { out << "contour:\n"; for (const auto &v : o.vertices) { out << " " << v.transpose(); } out << "\n"; } return out.str(); } bool Polygon2d::isEmpty() const { return this->theoutlines.empty(); } void Polygon2d::transform(const Transform2d &mat) { if (mat.matrix().determinant() == 0) { PRINT("WARNING: Scaling a 2D object with 0 - removing object"); this->theoutlines.clear(); return; } for (auto &o : this->theoutlines) { for (auto &v : o.vertices) { v = mat * v; } } } void Polygon2d::resize(const Vector2d &newsize, const Eigen::Matrix &autosize) { auto bbox = this->getBoundingBox(); // Find largest dimension int maxdim = (newsize[1] && newsize[1] > newsize[0]) ? 1 : 0; // Default scale (scale with 1 if the new size is 0) Vector2d scale(newsize[0] > 0 ? newsize[0] / bbox.sizes()[0] : 1, newsize[1] > 0 ? newsize[1] / bbox.sizes()[1] : 1); // Autoscale where applicable double autoscale = newsize[maxdim] > 0 ? newsize[maxdim] / bbox.sizes()[maxdim] : 1; Vector2d newscale(!autosize[0] || (newsize[0] > 0) ? scale[0] : autoscale, !autosize[1] || (newsize[1] > 0) ? scale[1] : autoscale); Transform2d t; t.matrix() << newscale[0], 0, 0, 0, newscale[1], 0, 0, 0, 1; this->transform(t); } bool Polygon2d::is_convex() const { if (theoutlines.size() > 1) return false; if (theoutlines.empty()) return true; auto const &pts = theoutlines[0].vertices; int N = pts.size(); // Check for a right turn. This assumes the polygon is simple. for (int i = 0; i < N; i++) { const auto &d1 = pts[(i+1)%N] - pts[i]; const auto &d2 = pts[(i+2)%N] - pts[(i+1)%N]; double zcross = d1[0] * d2[1] - d1[1] * d2[0]; if (zcross < 0) return false; } return true; } openscad-2019.05/src/Polygon2d.h0000644000076500000240000000223113441031431016704 0ustar kintelstaff00000000000000#pragma once #include #include "Geometry.h" #include "linalg.h" /*! A single contour. positive is (optionally) used to distinguish between polygon contours and hold contours. */ struct Outline2d { Outline2d() : positive(true) {} VectorOfVector2d vertices; bool positive; }; class Polygon2d : public Geometry { public: Polygon2d() : sanitized(false) {} size_t memsize() const override; BoundingBox getBoundingBox() const override; std::string dump() const override; unsigned int getDimension() const override { return 2; } bool isEmpty() const override; Geometry *copy() const override { return new Polygon2d(*this); } void addOutline(const Outline2d &outline) { this->theoutlines.push_back(outline); } class PolySet *tessellate() const; typedef std::vector Outlines2d; const Outlines2d &outlines() const { return theoutlines; } void transform(const Transform2d &mat); void resize(const Vector2d &newsize, const Eigen::Matrix &autosize); bool isSanitized() const { return this->sanitized; } void setSanitized(bool s) { this->sanitized = s; } bool is_convex() const; private: Outlines2d theoutlines; bool sanitized; }; openscad-2019.05/src/Preferences.cc0000644000076500000240000011001413452415427017442 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Preferences.h" #include #include #include #include #include #include #include "GeometryCache.h" #include "AutoUpdater.h" #include "feature.h" #ifdef ENABLE_CGAL #include "CGALCache.h" #endif #include "colormap.h" #include "rendersettings.h" #include "QSettingsCached.h" #include "input/InputDriverManager.h" #include "SettingsWriter.h" #include "OctoPrint.h" Preferences *Preferences::instance = nullptr; const char * Preferences::featurePropertyName = "FeatureProperty"; Q_DECLARE_METATYPE(Feature *); class SettingsReader : public Settings::SettingsVisitor { QSettingsCached settings; Value getValue(const Settings::SettingsEntry& entry, const std::string& value) const { std::string trimmed_value(value); boost::trim(trimmed_value); if (trimmed_value.empty()) { return entry.defaultValue(); } try { switch (entry.defaultValue().type()) { case Value::ValueType::STRING: return Value(trimmed_value); case Value::ValueType::NUMBER: if(entry.range().toRange().step_value()<1 && entry.range().toRange().step_value()>0){ return Value(boost::lexical_cast(trimmed_value)); } return Value(boost::lexical_cast(trimmed_value)); case Value::ValueType::BOOL: boost::to_lower(trimmed_value); if ("false" == trimmed_value) { return Value(false); } else if ("true" == trimmed_value) { return Value(true); } return Value(boost::lexical_cast(trimmed_value)); default: assert(false && "invalid value type for settings"); return entry.defaultValue(); } } catch (const boost::bad_lexical_cast& e) { return entry.defaultValue(); } } void handle(Settings::SettingsEntry& entry) const override { Settings::Settings *s = Settings::Settings::inst(); std::string key = entry.category() + "/" + entry.name(); std::string value = settings.value(QString::fromStdString(key)).toString().toStdString(); const Value v = getValue(entry, value); PRINTDB("SettingsReader R: %s = '%s' => '%s'", key.c_str() % value.c_str() % v.toString()); s->set(entry, v); } }; Preferences::Preferences(QWidget *parent) : QMainWindow(parent) { setupUi(this); } void Preferences::init() { // Editor pane // Setup default font (Try to use a nice monospace font) #if (QT_VERSION < QT_VERSION_CHECK(5, 2, 0)) #if defined (Q_OS_WIN) const QString fontfamily{"Console"}; #elif defined (Q_OS_MAC) const QString fontfamily{"Monaco"}; #else const QString fontfamily{"Mono"}; #endif QFont font; font.setStyleHint(QFont::TypeWriter); font.setFamily(fontfamily); // this runs Qt's font matching algorithm #else const QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont); #endif const QString found_family{QFontInfo{font}.family()}; this->defaultmap["editor/fontfamily"] = found_family; this->defaultmap["editor/fontsize"] = 12; this->defaultmap["editor/syntaxhighlight"] = "For Light Background"; this->defaultmap[Preferences::PREF_EDITOR_TYPE] = Preferences::EDITOR_TYPE_QSCINTILLA; #if defined (Q_OS_MAC) this->defaultmap["editor/ctrlmousewheelzoom"] = false; #else this->defaultmap["editor/ctrlmousewheelzoom"] = true; #endif uint savedsize = getValue("editor/fontsize").toUInt(); QFontDatabase db; for(auto size : db.standardSizes()) { this->fontSize->addItem(QString::number(size)); if (static_cast(size) == savedsize) { this->fontSize->setCurrentIndex(this->fontSize->count()-1); } } // reset GUI fontsize if fontSize->addItem emitted signals that changed it. this->fontSize->setEditText( QString("%1").arg( savedsize ) ); // Setup default settings this->defaultmap["advanced/opencsg_show_warning"] = true; this->defaultmap["advanced/enable_opencsg_opengl1x"] = true; this->defaultmap["advanced/polysetCacheSize"] = qulonglong(GeometryCache::instance()->maxSizeMB())*1024*1024; this->defaultmap["advanced/polysetCacheSizeMB"] = getValue("advanced/polysetCacheSize").toULongLong()/(1024*1024); // carry over old settings if they exist #ifdef ENABLE_CGAL this->defaultmap["advanced/cgalCacheSize"] = qulonglong(CGALCache::instance()->maxSizeMB())*1024*1024; this->defaultmap["advanced/cgalCacheSizeMB"] = getValue("advanced/cgalCacheSize").toULongLong()/(1024*1024); // carry over old settings if they exist #endif this->defaultmap["advanced/openCSGLimit"] = RenderSettings::inst()->openCSGTermLimit; this->defaultmap["advanced/forceGoldfeather"] = false; this->defaultmap["advanced/mdi"] = true; this->defaultmap["advanced/undockableWindows"] = false; this->defaultmap["advanced/reorderWindows"] = true; this->defaultmap["launcher/showOnStartup"] = true; this->defaultmap["advanced/localization"] = true; this->defaultmap["advanced/autoReloadRaise"] = false; this->defaultmap["advanced/enableSoundNotification"] = true; this->defaultmap["advanced/timeThresholdOnRenderCompleteSound"] = 0; this->defaultmap["advanced/enableHardwarnings"] = false; this->defaultmap["advanced/enableParameterCheck"] = true; this->defaultmap["advanced/enableParameterRangeCheck"] = false; // Toolbar QActionGroup *group = new QActionGroup(this); addPrefPage(group, prefsAction3DView, page3DView); addPrefPage(group, prefsActionEditor, pageEditor); #ifdef OPENSCAD_UPDATER addPrefPage(group, prefsActionUpdate, pageUpdate); #else this->toolBar->removeAction(prefsActionUpdate); #endif #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) addPrefPage(group, prefsAction3DPrint, page3DPrint); #else this->toolBar->removeAction(prefsAction3DPrint); #endif #ifdef ENABLE_EXPERIMENTAL addPrefPage(group, prefsActionFeatures, pageFeatures); #else this->toolBar->removeAction(prefsActionFeatures); #endif addPrefPage(group, prefsActionInput, pageInput); addPrefPage(group, prefsActionInputButton, pageInputButton); addPrefPage(group, prefsActionAdvanced, pageAdvanced); connect(group, SIGNAL(triggered(QAction*)), this, SLOT(actionTriggered(QAction*))); prefsAction3DView->setChecked(true); this->actionTriggered(this->prefsAction3DView); // 3D View pane this->defaultmap["3dview/colorscheme"] = "Cornfield"; // Advanced pane const int absolute_max = (sizeof(void*) == 8) ? 1024 * 1024 : 2048; // 1TB for 64bit or 2GB for 32bit QValidator *memvalidator = new QIntValidator(1,absolute_max,this); QValidator *validator = new QIntValidator(this); #ifdef ENABLE_CGAL this->cgalCacheSizeMBEdit->setValidator(memvalidator); #endif this->polysetCacheSizeMBEdit->setValidator(memvalidator); this->opencsgLimitEdit->setValidator(validator); this->timeThresholdOnRenderCompleteSoundEdit->setValidator(validator); initComboBox(this->comboBoxIndentUsing, Settings::Settings::indentStyle); initComboBox(this->comboBoxLineWrap, Settings::Settings::lineWrap); initComboBox(this->comboBoxLineWrapIndentationStyle, Settings::Settings::lineWrapIndentationStyle); initComboBox(this->comboBoxLineWrapVisualizationEnd, Settings::Settings::lineWrapVisualizationEnd); initComboBox(this->comboBoxLineWrapVisualizationStart, Settings::Settings::lineWrapVisualizationBegin); initComboBox(this->comboBoxShowWhitespace, Settings::Settings::showWhitespace); initComboBox(this->comboBoxTabKeyFunction, Settings::Settings::tabKeyFunction); initSpinBox(this->spinBoxIndentationWidth, Settings::Settings::indentationWidth); initSpinBox(this->spinBoxLineWrapIndentationIndent, Settings::Settings::lineWrapIndentation); initSpinBox(this->spinBoxShowWhitespaceSize, Settings::Settings::showWhitespaceSize); initSpinBox(this->spinBoxTabWidth, Settings::Settings::tabWidth); initComboBox(this->comboBoxOctoPrintFileFormat, Settings::Settings::octoPrintFileFormat); initComboBox(this->comboBoxOctoPrintAction, Settings::Settings::octoPrintAction); SettingsReader settingsReader; Settings::Settings *s = Settings::Settings::inst(); s->visit(settingsReader); const QString slicer = QString::fromStdString(s->get(Settings::Settings::octoPrintSlicerEngine).toString()); const QString slicerDesc = QString::fromStdString(s->get(Settings::Settings::octoPrintSlicerEngineDesc).toString()); const QString profile = QString::fromStdString(s->get(Settings::Settings::octoPrintSlicerProfile).toString()); const QString profileDesc = QString::fromStdString(s->get(Settings::Settings::octoPrintSlicerProfileDesc).toString()); this->comboBoxOctoPrintSlicingEngine->clear(); this->comboBoxOctoPrintSlicingEngine->addItem(_(""), QVariant{""}); if (!slicer.isEmpty()) { this->comboBoxOctoPrintSlicingEngine->addItem(slicerDesc, QVariant{slicer}); } this->comboBoxOctoPrintSlicingProfile->clear(); this->comboBoxOctoPrintSlicingProfile->addItem(_(""), QVariant{""}); if (!profile.isEmpty()) { this->comboBoxOctoPrintSlicingProfile->addItem(profileDesc, QVariant{profile}); } emit editorConfigChanged(); } Preferences::~Preferences() { removeDefaultSettings(); instance = nullptr; } /** * Add a page for the preferences GUI. This handles both the action grouping * and the registration of the widget for each action to have a generalized * callback to switch pages. * * @param group The action group for all page actions. This one will have the * callback attached after creating all actions/pages. * @param action The action specific for the added page. * @param widget The widget that should be shown when the action is triggered. * This must be a child page of the stackedWidget. */ void Preferences::addPrefPage(QActionGroup *group, QAction *action, QWidget *widget) { group->addAction(action); prefPages[action] = widget; } /** * Callback to switch pages in the preferences GUI. * * @param action The action triggered by the user. */ void Preferences::actionTriggered(QAction *action) { this->stackedWidget->setCurrentWidget(prefPages[action]); } /** * Called at least on showing / closing the Preferences dialog * and when switching tabs. */ void Preferences::hidePasswords() { this->pushButtonOctoPrintApiKey->setChecked(false); this->lineEditOctoPrintApiKey->setEchoMode(QLineEdit::EchoMode::PasswordEchoOnEdit); } void Preferences::on_stackedWidget_currentChanged(int) { hidePasswords(); this->labelOctoPrintCheckConnection->setText(""); this->AxisConfig->updateStates(); this->ButtonConfig->updateStates(); } /** * Callback for the dynamically created checkboxes on the features * page. The specific Feature object is associated as property with * the callback. * * @param state the state of the checkbox. */ void Preferences::featuresCheckBoxToggled(bool state) { const QObject *sender = QObject::sender(); if (sender == nullptr) { return; } QVariant v = sender->property(featurePropertyName); if (!v.isValid()) { return; } Feature *feature = v.value(); feature->enable(state); QSettingsCached settings; settings.setValue(QString("feature/%1").arg(QString::fromStdString(feature->get_name())), state); emit ExperimentalChanged(); } /** * Setup feature GUI and synchronize the Qt settings with the feature values. * * When running in GUI mode, the feature setting that might have been set * from commandline is ignored. This always uses the value coming from the * QSettings. */ void Preferences::setupFeaturesPage() { int row = 0; for (Feature::iterator it = Feature::begin();it != Feature::end();it++) { Feature *feature = *it; QString featurekey = QString("feature/%1").arg(QString::fromStdString(feature->get_name())); this->defaultmap[featurekey] = false; // spacer item between the features, just for some optical separation gridLayoutExperimentalFeatures->addItem(new QSpacerItem(1, 8, QSizePolicy::Expanding, QSizePolicy::Fixed), row, 1, 1, 1, Qt::AlignCenter); row++; QCheckBox *cb = new QCheckBox(QString::fromStdString(feature->get_name()), pageFeatures); QFont bold_font(cb->font()); bold_font.setBold(true); cb->setFont(bold_font); // synchronize Qt settings with the feature settings bool value = getValue(featurekey).toBool(); feature->enable(value); cb->setChecked(value); cb->setProperty(featurePropertyName, QVariant::fromValue(feature)); connect(cb, SIGNAL(toggled(bool)), this, SLOT(featuresCheckBoxToggled(bool))); gridLayoutExperimentalFeatures->addWidget(cb, row, 0, 1, 2, Qt::AlignLeading); row++; QLabel *l = new QLabel(QString::fromStdString(feature->get_description()), pageFeatures); l->setTextFormat(Qt::RichText); gridLayoutExperimentalFeatures->addWidget(l, row, 1, 1, 1, Qt::AlignLeading); row++; } // Force fixed indentation, the checkboxes use column span of 2 so // first row is not constrained in size by the visible controls. The // fixed size space essentially gives the first row the width of the // spacer item itself. gridLayoutExperimentalFeatures->addItem(new QSpacerItem(20, 0, QSizePolicy::Fixed, QSizePolicy::Fixed), 1, 0, 1, 1, Qt::AlignLeading); } void Preferences::on_colorSchemeChooser_itemSelectionChanged() { QString scheme = this->colorSchemeChooser->currentItem()->text(); QSettingsCached settings; settings.setValue("3dview/colorscheme", scheme); emit colorSchemeChanged( scheme ); } void Preferences::on_fontChooser_activated(const QString &family) { QSettingsCached settings; settings.setValue("editor/fontfamily", family); emit fontChanged(family, getValue("editor/fontsize").toUInt()); } void Preferences::on_fontSize_currentIndexChanged(const QString &size) { uint intsize = size.toUInt(); QSettingsCached settings; settings.setValue("editor/fontsize", intsize); emit fontChanged(getValue("editor/fontfamily").toString(), intsize); } void Preferences::on_editorType_currentIndexChanged(int idx) { QSettingsCached settings; settings.setValue(Preferences::PREF_EDITOR_TYPE, idx == 0 ? Preferences::EDITOR_TYPE_SIMPLE : Preferences::EDITOR_TYPE_QSCINTILLA); } void Preferences::on_syntaxHighlight_activated(const QString &s) { QSettingsCached settings; settings.setValue("editor/syntaxhighlight", s); emit syntaxHighlightChanged(s); } void unimplemented_msg() { QMessageBox mbox; mbox.setText("Sorry, this feature is not implemented on your Operating System"); mbox.exec(); } void Preferences::on_updateCheckBox_toggled(bool on) { if (AutoUpdater *updater =AutoUpdater::updater()) { updater->setAutomaticallyChecksForUpdates(on); } else { unimplemented_msg(); } } void Preferences::on_snapshotCheckBox_toggled(bool on) { if (AutoUpdater *updater =AutoUpdater::updater()) { updater->setEnableSnapshots(on); } else { unimplemented_msg(); } } void Preferences::on_checkNowButton_clicked() { if (AutoUpdater *updater = AutoUpdater::updater()) { updater->checkForUpdates(); } else { unimplemented_msg(); } } void Preferences::on_mdiCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/mdi", state); emit updateMdiMode(state); } void Preferences::on_reorderCheckBox_toggled(bool state) { if (!state) { undockCheckBox->setChecked(false); } undockCheckBox->setEnabled(state); QSettingsCached settings; settings.setValue("advanced/reorderWindows", state); emit updateReorderMode(state); } void Preferences::on_undockCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/undockableWindows", state); emit updateUndockMode(state); } void Preferences::on_openCSGWarningBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/opencsg_show_warning",state); } void Preferences::on_enableOpenCSGBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/enable_opencsg_opengl1x", state); } void Preferences::on_cgalCacheSizeMBEdit_textChanged(const QString &text) { QSettingsCached settings; settings.setValue("advanced/cgalCacheSizeMB", text); #ifdef ENABLE_CGAL CGALCache::instance()->setMaxSizeMB(text.toULong()); #endif } void Preferences::on_polysetCacheSizeMBEdit_textChanged(const QString &text) { QSettingsCached settings; settings.setValue("advanced/polysetCacheSizeMB", text); GeometryCache::instance()->setMaxSizeMB(text.toULong()); } void Preferences::on_opencsgLimitEdit_textChanged(const QString &text) { QSettingsCached settings; settings.setValue("advanced/openCSGLimit", text); // FIXME: Set this globally? } void Preferences::on_localizationCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/localization", state); } void Preferences::on_autoReloadRaiseCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/autoReloadRaise", state); } void Preferences::on_forceGoldfeatherBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/forceGoldfeather", state); emit openCSGSettingsChanged(); } void Preferences::on_mouseWheelZoomBox_toggled(bool state) { QSettingsCached settings; settings.setValue("editor/ctrlmousewheelzoom", state); } void Preferences::on_launcherBox_toggled(bool state) { QSettingsCached settings; settings.setValue("launcher/showOnStartup", state); } void Preferences::on_checkBoxShowWarningsIn3dView_toggled(bool val) { Settings::Settings::inst()->set(Settings::Settings::showWarningsIn3dView, Value(val)); writeSettings(); } void Preferences::on_checkBoxMouseCentricZoom_toggled(bool val) { Settings::Settings::inst()->set(Settings::Settings::mouseCentricZoom, Value(val)); writeSettings(); emit updateMouseCentricZoom(val); } void Preferences::on_spinBoxIndentationWidth_valueChanged(int val) { Settings::Settings::inst()->set(Settings::Settings::indentationWidth, Value(val)); writeSettings(); } void Preferences::on_spinBoxTabWidth_valueChanged(int val) { Settings::Settings::inst()->set(Settings::Settings::tabWidth, Value(val)); writeSettings(); } void Preferences::on_comboBoxLineWrap_activated(int val) { applyComboBox(comboBoxLineWrap, val, Settings::Settings::lineWrap); } void Preferences::on_comboBoxLineWrapIndentationStyle_activated(int val) { spinBoxLineWrapIndentationIndent->setDisabled(comboBoxLineWrapIndentationStyle->currentText() == "Same"); applyComboBox(comboBoxLineWrapIndentationStyle, val, Settings::Settings::lineWrapIndentationStyle); } void Preferences::on_spinBoxLineWrapIndentationIndent_valueChanged(int val) { Settings::Settings::inst()->set(Settings::Settings::lineWrapIndentation, Value(val)); writeSettings(); } void Preferences::on_comboBoxLineWrapVisualizationStart_activated(int val) { applyComboBox(comboBoxLineWrapVisualizationStart, val, Settings::Settings::lineWrapVisualizationBegin); } void Preferences::on_comboBoxLineWrapVisualizationEnd_activated(int val) { applyComboBox(comboBoxLineWrapVisualizationEnd, val, Settings::Settings::lineWrapVisualizationEnd); } void Preferences::on_comboBoxShowWhitespace_activated(int val) { applyComboBox(comboBoxShowWhitespace, val, Settings::Settings::showWhitespace); } void Preferences::on_spinBoxShowWhitespaceSize_valueChanged(int val) { Settings::Settings::inst()->set(Settings::Settings::showWhitespaceSize, Value(val)); writeSettings(); } void Preferences::on_checkBoxAutoIndent_toggled(bool val) { Settings::Settings::inst()->set(Settings::Settings::autoIndent, Value(val)); writeSettings(); } void Preferences::on_checkBoxBackspaceUnindents_toggled(bool val) { Settings::Settings::inst()->set(Settings::Settings::backspaceUnindents, Value(val)); writeSettings(); } void Preferences::on_comboBoxIndentUsing_activated(int val) { applyComboBox(comboBoxIndentUsing, val, Settings::Settings::indentStyle); } void Preferences::on_comboBoxTabKeyFunction_activated(int val) { applyComboBox(comboBoxTabKeyFunction, val, Settings::Settings::tabKeyFunction); } void Preferences::on_checkBoxHighlightCurrentLine_toggled(bool val) { Settings::Settings::inst()->set(Settings::Settings::highlightCurrentLine, Value(val)); writeSettings(); } void Preferences::on_checkBoxEnableBraceMatching_toggled(bool val) { Settings::Settings::inst()->set(Settings::Settings::enableBraceMatching, Value(val)); writeSettings(); } void Preferences::on_checkBoxEnableLineNumbers_toggled(bool checked) { Settings::Settings::inst()->set(Settings::Settings::enableLineNumbers, Value(checked)); writeSettings(); } void Preferences::on_enableSoundOnRenderCompleteCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/enableSoundNotification", state); this->timeThresholdOnRenderCompleteSoundLabel->setEnabled(state); this->secLabel->setEnabled(state); this->timeThresholdOnRenderCompleteSoundEdit->setEnabled(state); } void Preferences::on_timeThresholdOnRenderCompleteSoundEdit_textChanged(const QString &text) { QSettingsCached settings; settings.setValue("advanced/timeThresholdOnRenderCompleteSound", text); } void Preferences::on_enableHardwarningsCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/enableHardwarnings", state); } void Preferences::on_enableParameterCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/enableParameterCheck", state); } void Preferences::on_enableRangeCheckBox_toggled(bool state) { QSettingsCached settings; settings.setValue("advanced/enableParameterRangeCheck", state); } void Preferences::on_enableHidapiTraceCheckBox_toggled(bool checked) { Settings::Settings::inst()->set(Settings::Settings::inputEnableDriverHIDAPILog, Value(checked)); writeSettings(); } void Preferences::on_comboBoxOctoPrintAction_activated(int val) { applyComboBox(comboBoxOctoPrintAction, val, Settings::Settings::octoPrintAction); } void Preferences::on_lineEditOctoPrintURL_editingFinished() { Settings::Settings::inst()->set(Settings::Settings::octoPrintUrl, this->lineEditOctoPrintURL->text().toStdString()); writeSettings(); } void Preferences::on_lineEditOctoPrintApiKey_editingFinished() { Settings::Settings::inst()->set(Settings::Settings::octoPrintApiKey, this->lineEditOctoPrintApiKey->text().toStdString()); writeSettings(); } void Preferences::on_pushButtonOctoPrintApiKey_clicked() { this->lineEditOctoPrintApiKey->setEchoMode(this->pushButtonOctoPrintApiKey->isChecked() ? QLineEdit::EchoMode::Normal : QLineEdit::EchoMode::PasswordEchoOnEdit); } void Preferences::on_comboBoxOctoPrintFileFormat_activated(int val) { applyComboBox(this->comboBoxOctoPrintFileFormat, val, Settings::Settings::octoPrintFileFormat); } void Preferences::on_pushButtonOctoPrintCheckConnection_clicked() { OctoPrint octoPrint; try { QString api_version; QString server_version; std::tie(api_version, server_version) = octoPrint.getVersion(); this->labelOctoPrintCheckConnection->setText(QString{_("Success: Server Version = %2, API Version = %1")}.arg(api_version).arg(server_version)); } catch (const NetworkException& e) { QMessageBox::critical(this, _("Error"), e.getErrorMessage(), QMessageBox::Ok); this->labelOctoPrintCheckConnection->setText(""); } } void Preferences::on_pushButtonOctoPrintSlicingEngine_clicked() { OctoPrint octoPrint; const QString selection = this->comboBoxOctoPrintSlicingEngine->currentText(); try { const auto slicers = octoPrint.getSlicers(); this->comboBoxOctoPrintSlicingEngine->clear(); this->comboBoxOctoPrintSlicingEngine->addItem(_(""), QVariant{""}); for (const auto & entry : slicers) { this->comboBoxOctoPrintSlicingEngine->addItem(entry.second, QVariant{entry.first}); } const int idx = this->comboBoxOctoPrintSlicingEngine->findText(selection); if (idx >= 0) { this->comboBoxOctoPrintSlicingEngine->setCurrentIndex(idx); } } catch (const NetworkException& e) { QMessageBox::critical(this, _("Error"), e.getErrorMessage(), QMessageBox::Ok); } } void Preferences::on_comboBoxOctoPrintSlicingEngine_activated(int val) { const QString text = this->comboBoxOctoPrintSlicingEngine->itemData(val).toString(); const QString desc = text.isEmpty() ? QString{} : this->comboBoxOctoPrintSlicingEngine->itemText(val); Settings::Settings::inst()->set(Settings::Settings::octoPrintSlicerEngine, text.toStdString()); Settings::Settings::inst()->set(Settings::Settings::octoPrintSlicerEngineDesc, desc.toStdString()); Settings::Settings::inst()->set(Settings::Settings::octoPrintSlicerProfile, ""); Settings::Settings::inst()->set(Settings::Settings::octoPrintSlicerProfileDesc, ""); writeSettings(); this->comboBoxOctoPrintSlicingProfile->setCurrentIndex(0); } void Preferences::on_pushButtonOctoPrintSlicingProfile_clicked() { OctoPrint octoPrint; const QString selection = this->comboBoxOctoPrintSlicingProfile->currentText(); const QString slicer = this->comboBoxOctoPrintSlicingEngine->itemData(this->comboBoxOctoPrintSlicingEngine->currentIndex()).toString(); try { const auto profiles = octoPrint.getProfiles(slicer); this->comboBoxOctoPrintSlicingProfile->clear(); this->comboBoxOctoPrintSlicingProfile->addItem(_(""), QVariant{""}); for (const auto & entry : profiles) { this->comboBoxOctoPrintSlicingProfile->addItem(entry.second, QVariant{entry.first}); } const int idx = this->comboBoxOctoPrintSlicingProfile->findText(selection); if (idx >= 0) { this->comboBoxOctoPrintSlicingProfile->setCurrentIndex(idx); } } catch (const NetworkException& e) { QMessageBox::critical(this, _("Error"), e.getErrorMessage(), QMessageBox::Ok); } } void Preferences::on_comboBoxOctoPrintSlicingProfile_activated(int val) { const QString text = this->comboBoxOctoPrintSlicingProfile->itemData(val).toString(); const QString desc = text.isEmpty() ? QString{} : this->comboBoxOctoPrintSlicingProfile->itemText(val); Settings::Settings::inst()->set(Settings::Settings::octoPrintSlicerProfile, text.toStdString()); Settings::Settings::inst()->set(Settings::Settings::octoPrintSlicerProfileDesc, desc.toStdString()); writeSettings(); } void Preferences::writeSettings() { SettingsWriter settingsWriter; Settings::Settings::inst()->visit(settingsWriter); fireEditorConfigChanged(); } void Preferences::fireEditorConfigChanged() const { emit editorConfigChanged(); } void Preferences::keyPressEvent(QKeyEvent *e) { #ifdef Q_OS_MAC if (e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Period) { close(); } else #endif if ((e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_W) || e->key() == Qt::Key_Escape) { close(); } } void Preferences::showEvent(QShowEvent *e) { QMainWindow::showEvent(e); hidePasswords(); } void Preferences::closeEvent(QCloseEvent *e) { hidePasswords(); QMainWindow::closeEvent(e); } /*! Removes settings that are the same as the default settings to avoid overwriting future changes to default settings. */ void Preferences::removeDefaultSettings() { QSettingsCached settings; for (QSettings::SettingsMap::const_iterator iter = this->defaultmap.begin(); iter != this->defaultmap.end(); iter++) { if (settings.value(iter.key()) == iter.value()) { settings.remove(iter.key()); } } } QVariant Preferences::getValue(const QString &key) const { QSettingsCached settings; assert(settings.contains(key) || this->defaultmap.contains(key)); return settings.value(key, this->defaultmap[key]); } void Preferences::updateGUI() { const Settings::Settings *s = Settings::Settings::inst(); QList found = this->colorSchemeChooser->findItems(getValue("3dview/colorscheme").toString(), Qt::MatchExactly); if (!found.isEmpty()) this->colorSchemeChooser->setCurrentItem(found.first()); QString fontfamily = getValue("editor/fontfamily").toString(); int fidx = this->fontChooser->findText(fontfamily,Qt::MatchContains); if (fidx >= 0) { this->fontChooser->setCurrentIndex(fidx); } QString fontsize = getValue("editor/fontsize").toString(); int sidx = this->fontSize->findText(fontsize); if (sidx >= 0) { this->fontSize->setCurrentIndex(sidx); } else { this->fontSize->setEditText(fontsize); } QString shighlight = getValue("editor/syntaxhighlight").toString(); int shidx = this->syntaxHighlight->findText(shighlight); if (shidx >= 0) { this->syntaxHighlight->setCurrentIndex(shidx); } else { int offidx = this->syntaxHighlight->findText("Off"); if (offidx >= 0) { this->syntaxHighlight->setCurrentIndex(offidx); } } QString editortypevar = getValue(Preferences::PREF_EDITOR_TYPE).toString(); int edidx = editortypevar == Preferences::EDITOR_TYPE_SIMPLE ? 0 : 1; this->editorType->setCurrentIndex(edidx); this->mouseWheelZoomBox->setChecked(getValue("editor/ctrlmousewheelzoom").toBool()); if (AutoUpdater *updater = AutoUpdater::updater()) { this->updateCheckBox->setChecked(updater->automaticallyChecksForUpdates()); this->snapshotCheckBox->setChecked(updater->enableSnapshots()); this->lastCheckedLabel->setText(updater->lastUpdateCheckDate()); } this->openCSGWarningBox->setChecked(getValue("advanced/opencsg_show_warning").toBool()); this->enableOpenCSGBox->setChecked(getValue("advanced/enable_opencsg_opengl1x").toBool()); this->cgalCacheSizeMBEdit->setText(getValue("advanced/cgalCacheSizeMB").toString()); this->polysetCacheSizeMBEdit->setText(getValue("advanced/polysetCacheSizeMB").toString()); this->opencsgLimitEdit->setText(getValue("advanced/openCSGLimit").toString()); this->localizationCheckBox->setChecked(getValue("advanced/localization").toBool()); this->autoReloadRaiseCheckBox->setChecked(getValue("advanced/autoReloadRaise").toBool()); this->forceGoldfeatherBox->setChecked(getValue("advanced/forceGoldfeather").toBool()); this->mdiCheckBox->setChecked(getValue("advanced/mdi").toBool()); this->reorderCheckBox->setChecked(getValue("advanced/reorderWindows").toBool()); this->undockCheckBox->setChecked(getValue("advanced/undockableWindows").toBool()); this->undockCheckBox->setEnabled(this->reorderCheckBox->isChecked()); this->launcherBox->setChecked(getValue("launcher/showOnStartup").toBool()); this->enableSoundOnRenderCompleteCheckBox->setChecked(getValue("advanced/enableSoundNotification").toBool()); this->timeThresholdOnRenderCompleteSoundLabel->setEnabled(getValue("advanced/enableSoundNotification").toBool()); this->secLabel->setEnabled(getValue("advanced/enableSoundNotification").toBool()); this->timeThresholdOnRenderCompleteSoundEdit->setText(getValue("advanced/timeThresholdOnRenderCompleteSound").toString()); this->timeThresholdOnRenderCompleteSoundEdit->setEnabled(getValue("advanced/enableSoundNotification").toBool()); this->enableHardwarningsCheckBox->setChecked(getValue("advanced/enableHardwarnings").toBool()); this->enableParameterCheckBox->setChecked(getValue("advanced/enableParameterCheck").toBool()); this->enableRangeCheckBox->setChecked(getValue("advanced/enableParameterRangeCheck").toBool()); this->enableHidapiTraceCheckBox->setChecked(s->get(Settings::Settings::inputEnableDriverHIDAPILog)); updateComboBox(this->comboBoxLineWrap, Settings::Settings::lineWrap); updateComboBox(this->comboBoxLineWrapIndentationStyle, Settings::Settings::lineWrapIndentationStyle); updateComboBox(this->comboBoxLineWrapVisualizationStart, Settings::Settings::lineWrapVisualizationBegin); updateComboBox(this->comboBoxLineWrapVisualizationEnd, Settings::Settings::lineWrapVisualizationEnd); updateComboBox(this->comboBoxShowWhitespace, Settings::Settings::showWhitespace); updateComboBox(this->comboBoxIndentUsing, Settings::Settings::indentStyle); updateComboBox(this->comboBoxTabKeyFunction, Settings::Settings::tabKeyFunction); this->spinBoxIndentationWidth->setValue(s->get(Settings::Settings::indentationWidth).toDouble()); this->spinBoxTabWidth->setValue(s->get(Settings::Settings::tabWidth).toDouble()); this->spinBoxLineWrapIndentationIndent->setValue(s->get(Settings::Settings::lineWrapIndentation).toDouble()); this->spinBoxShowWhitespaceSize->setValue(s->get(Settings::Settings::showWhitespaceSize).toDouble()); this->checkBoxAutoIndent->setChecked(s->get(Settings::Settings::autoIndent).toBool()); this->checkBoxBackspaceUnindents->setChecked(s->get(Settings::Settings::backspaceUnindents).toBool()); this->checkBoxHighlightCurrentLine->setChecked(s->get(Settings::Settings::highlightCurrentLine).toBool()); this->checkBoxEnableBraceMatching->setChecked(s->get(Settings::Settings::enableBraceMatching).toBool()); this->checkBoxShowWarningsIn3dView->setChecked(s->get(Settings::Settings::showWarningsIn3dView).toBool()); this->checkBoxMouseCentricZoom->setChecked(s->get(Settings::Settings::mouseCentricZoom).toBool()); this->checkBoxEnableLineNumbers->setChecked(s->get(Settings::Settings::enableLineNumbers).toBool()); this->spinBoxLineWrapIndentationIndent->setDisabled(this->comboBoxLineWrapIndentationStyle->currentText() == "Same"); this->lineEditOctoPrintURL->setText(QString::fromStdString(s->get(Settings::Settings::octoPrintUrl).toString())); this->lineEditOctoPrintApiKey->setText(QString::fromStdString(s->get(Settings::Settings::octoPrintApiKey).toString())); updateComboBox(this->comboBoxOctoPrintAction, Settings::Settings::octoPrintAction); updateComboBox(this->comboBoxOctoPrintSlicingEngine, Settings::Settings::octoPrintSlicerEngine); updateComboBox(this->comboBoxOctoPrintSlicingProfile, Settings::Settings::octoPrintSlicerProfile); } void Preferences::initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry) { comboBox->clear(); // Range is a vector of 2D vectors: [[name, value], ...] for(const auto &v : entry.range().toVector()) { QString val = QString::fromStdString(v[0]->toString()); QString qtext = QString::fromStdString(gettext(v[1]->toString().c_str())); comboBox->addItem(qtext, val); } } void Preferences::initSpinBox(QSpinBox *spinBox, const Settings::SettingsEntry& entry) { RangeType range = entry.range().toRange(); spinBox->setMinimum(range.begin_value()); spinBox->setMaximum(range.end_value()); } void Preferences::updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry) { Settings::Settings *s = Settings::Settings::inst(); const Value &value = s->get(entry); QString text = QString::fromStdString(value.toString()); int idx = comboBox->findData(text); if (idx >= 0) { comboBox->setCurrentIndex(idx); } else { const Value &defaultValue = entry.defaultValue(); QString defaultText = QString::fromStdString(defaultValue.toString()); int defIdx = comboBox->findData(defaultText); if (defIdx >= 0) { comboBox->setCurrentIndex(defIdx); } else { comboBox->setCurrentIndex(0); } } } void Preferences::applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry) { QString s = comboBox->itemData(val).toString(); Settings::Settings::inst()->set(entry, Value(s.toStdString())); writeSettings(); } void Preferences::apply() const { emit fontChanged(getValue("editor/fontfamily").toString(), getValue("editor/fontsize").toUInt()); emit requestRedraw(); emit openCSGSettingsChanged(); emit syntaxHighlightChanged(getValue("editor/syntaxhighlight").toString()); } void Preferences::create(QStringList colorSchemes) { if (instance != nullptr) { return; } std::list names = ColorMap::inst()->colorSchemeNames(true); QStringList renderColorSchemes; for(const auto &name : names) renderColorSchemes << name.c_str(); instance = new Preferences(); instance->syntaxHighlight->clear(); instance->syntaxHighlight->addItems(colorSchemes); instance->colorSchemeChooser->clear(); instance->colorSchemeChooser->addItems(renderColorSchemes); instance->init(); instance->AxisConfig->init(); instance->setupFeaturesPage(); instance->updateGUI(); } Preferences *Preferences::inst() { assert(instance != nullptr); return instance; } openscad-2019.05/src/Preferences.h0000644000076500000240000001217513452415427017315 0ustar kintelstaff00000000000000#pragma once #include #include #include "qtgettext.h" #include "ui_Preferences.h" #include "settings.h" class Preferences : public QMainWindow, public Ui::Preferences { Q_OBJECT; public: static constexpr const char* PREF_EDITOR_TYPE = "editor/editortype"; static constexpr const char* EDITOR_TYPE_SIMPLE = "Simple Editor"; static constexpr const char* EDITOR_TYPE_QSCINTILLA = "QScintilla Editor"; ~Preferences(); static void create(QStringList colorSchemes); static Preferences *inst(); QVariant getValue(const QString &key) const; void init(); void apply() const; void updateGUI(); void fireEditorConfigChanged() const; public slots: void actionTriggered(class QAction *); void featuresCheckBoxToggled(bool); void on_stackedWidget_currentChanged(int); void on_colorSchemeChooser_itemSelectionChanged(); void on_fontChooser_activated(const QString &); void on_fontSize_currentIndexChanged(const QString &); void on_syntaxHighlight_activated(const QString &); void on_openCSGWarningBox_toggled(bool); void on_enableOpenCSGBox_toggled(bool); void on_cgalCacheSizeMBEdit_textChanged(const QString &); void on_polysetCacheSizeMBEdit_textChanged(const QString &); void on_opencsgLimitEdit_textChanged(const QString &); void on_forceGoldfeatherBox_toggled(bool); void on_mouseWheelZoomBox_toggled(bool); void on_localizationCheckBox_toggled(bool); void on_autoReloadRaiseCheckBox_toggled(bool); void on_updateCheckBox_toggled(bool); void on_snapshotCheckBox_toggled(bool); void on_mdiCheckBox_toggled(bool); void on_reorderCheckBox_toggled(bool); void on_undockCheckBox_toggled(bool); void on_checkNowButton_clicked(); void on_launcherBox_toggled(bool); void on_editorType_currentIndexChanged(int); void on_enableSoundOnRenderCompleteCheckBox_toggled(bool); void on_enableHardwarningsCheckBox_toggled(bool); void on_enableParameterCheckBox_toggled(bool); void on_enableRangeCheckBox_toggled(bool); void on_enableHidapiTraceCheckBox_toggled(bool); void on_checkBoxShowWarningsIn3dView_toggled(bool); void on_checkBoxMouseCentricZoom_toggled(bool); void on_timeThresholdOnRenderCompleteSoundEdit_textChanged(const QString &); // // editor settings // // Indentation void on_checkBoxAutoIndent_toggled(bool); void on_checkBoxBackspaceUnindents_toggled(bool); void on_comboBoxIndentUsing_activated(int); void on_spinBoxIndentationWidth_valueChanged(int); void on_spinBoxTabWidth_valueChanged(int); void on_comboBoxTabKeyFunction_activated(int); void on_comboBoxShowWhitespace_activated(int); void on_spinBoxShowWhitespaceSize_valueChanged(int); // Line wrap void on_comboBoxLineWrap_activated(int); void on_comboBoxLineWrapIndentationStyle_activated(int); void on_spinBoxLineWrapIndentationIndent_valueChanged(int); void on_comboBoxLineWrapVisualizationStart_activated(int); void on_comboBoxLineWrapVisualizationEnd_activated(int); // Display void on_checkBoxHighlightCurrentLine_toggled(bool); void on_checkBoxEnableBraceMatching_toggled(bool); void on_checkBoxEnableLineNumbers_toggled(bool); // Print void on_pushButtonOctoPrintCheckConnection_clicked(); void on_pushButtonOctoPrintSlicingEngine_clicked(); void on_comboBoxOctoPrintSlicingEngine_activated(int); void on_pushButtonOctoPrintSlicingProfile_clicked(); void on_comboBoxOctoPrintSlicingProfile_activated(int); void on_comboBoxOctoPrintAction_activated(int); void on_comboBoxOctoPrintFileFormat_activated(int); void on_lineEditOctoPrintURL_editingFinished(); void on_lineEditOctoPrintApiKey_editingFinished(); void on_pushButtonOctoPrintApiKey_clicked(); signals: void requestRedraw() const; void updateMdiMode(bool mdi) const; void updateUndockMode(bool undockMode) const; void updateReorderMode(bool undockMode) const; void fontChanged(const QString &family, uint size) const; void colorSchemeChanged(const QString &scheme) const; void openCSGSettingsChanged() const; void syntaxHighlightChanged(const QString &s) const; void editorTypeChanged(const QString &type); void editorConfigChanged() const; void ExperimentalChanged() const ; void updateMouseCentricZoom(bool state) const; private: Preferences(QWidget *parent = nullptr); void keyPressEvent(QKeyEvent *e) override; void showEvent(QShowEvent *e) override; void closeEvent(QCloseEvent *e) override; void removeDefaultSettings(); void setupFeaturesPage(); void writeSettings(); void hidePasswords(); void addPrefPage(QActionGroup *group, QAction *action, QWidget *widget); /** Initialize combobox list values from the settings range values */ void initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry); /** Initialize spinbox min/max values from the settings range values */ void initSpinBox(QSpinBox *spinBox, const Settings::SettingsEntry& entry); /** Update combobox from current settings */ void updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry); /** Set value from combobox to settings */ void applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry); QSettings::SettingsMap defaultmap; QHash prefPages; static Preferences *instance; static const char *featurePropertyName; }; openscad-2019.05/src/Preferences.ui0000644000076500000240000022023013452415427017474 0ustar kintelstaff00000000000000 Preferences 0 0 636 498 0 0 Preferences true 5 0 0 0 0 Color scheme: 0 0 false -1 Qt::Horizontal 40 20 Show Warnings and Errors in 3D View false mouse centric zoom false 0 0 0 0 0 true 0 0 512 793 Qt::Horizontal QSizePolicy::Expanding 30 20 Editor Type Simple Editor QScintilla Editor 10 50 false (requires restart) Qt::Horizontal QSizePolicy::Expanding 30 20 Qt::Horizontal QSizePolicy::Expanding 30 20 Font false Lucida Grande 12 true Qt::Horizontal 40 20 Qt::Horizontal QSizePolicy::Expanding 30 20 Color syntax highlighting Qt::Horizontal 198 20 Ctrl/Cmd-Mouse-wheel zooms text 0 0 Qt::Horizontal QSizePolicy::Expanding 30 20 Indentation Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 99 4 Qt::Horizontal 40 20 Qt::Horizontal 223 20 Auto Indent true Qt::Horizontal 223 20 Backspace unindents false Qt::Horizontal 40 20 Indent using Spaces Tabs Qt::Horizontal 40 20 Qt::Horizontal 40 20 Indentation width Qt::Horizontal 40 20 Tab width Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Tab key function Indent Insert Tab Qt::Horizontal 40 20 Qt::Horizontal 40 20 Show whitespace Never Always Only after indentation Size Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 9 Qt::Horizontal 40 20 Display Enable brace matching Highlight current line Display Line Numbers Qt::Vertical 20 40 Line wrap None Wrap at character boundaries Wrap at word boundaries Qt::Horizontal 40 20 Qt::Horizontal 40 20 Line wrap indentation Qt::Horizontal 40 20 Line wrap visualization Style Fixed Same Indented Indent Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 Start 0 0 None Text Border Margin End 0 0 None Text Border Margin Qt::Horizontal 40 20 Qt::Horizontal 40 20 Line wrap Qt::Horizontal 40 20 Automatically check for updates true Include development snapshots Qt::Horizontal 40 20 0 Qt::Horizontal 40 20 Check Now Qt::Horizontal 40 20 Qt::Horizontal 40 20 false 11 Last checked: Qt::Horizontal 40 20 Qt::Vertical 20 89 0 0 0 0 75 true Features QFrame::NoFrame QFrame::Plain Qt::ScrollBarAlwaysOff true 0 0 84 26 8 Qt::Vertical 20 282 OctoPrint http://octopi.local/api URL Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter API Key Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 160 0 Qt::Horizontal 40 20 Load 160 0 Qt::Horizontal 40 20 Load Qt::Horizontal 40 20 Check Slicing Profile Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Slicing Engine Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter File Format Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 Action Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 QLineEdit::PasswordEchoOnEdit Show true Note: The API key is stored unencrypted in the application settings. Qt::Vertical 20 40 0 0 0 0 QFrame::Plain Qt::ScrollBarAlwaysOn true 0 0 602 891 9 9 9 OpenCSG Show capability warning true Enable for OpenGL 1.x Turn off rendering at elements Force Goldfeather CGAL CGAL Cache size MB 0 PolySet Cache size MB User Interface Allow opening multiple documents Enable docking of Editor and Console in different places Enable undocking of Editor and Console to separate windows Show Welcome Screen Enable user interface localization (requires restart of OpenSCAD) true Bring window to front after automatic reload false Play sound notification on render complete false 40 0 30 0 Play sound when render completion time is at least sec OpenSCAD Language Features Warn when there is a parameter mismatch in user module calls false Stop on the first warning false Check the parameter range for builtin modules false Qt::Vertical 20 40 Debugging Enable tracing of HIDAPI events (requires restart of OpenSCAD) 0 0 0 0 true 0 0 98 28 0 0 0 0 true 0 0 98 28 false Qt::TopToolBarArea 32 32 Qt::ToolButtonTextUnderIcon false TopToolBarArea false true :/icons/prefs3DView.png:/icons/prefs3DView.png 3D View true :/icons/prefsAdvanced.png:/icons/prefsAdvanced.png Advanced true :/icons/prefsEditor.png:/icons/prefsEditor.png Editor true :/icons/prefsUpdate.png:/icons/prefsUpdate.png Update true :/icons/prefsFeatures.png:/icons/prefsFeatures.png Features Enable/Disable experimental features true :/icons/prefsInputAxis.png:/icons/prefsInputAxis.png Axes Input driver configuration and Axis mapping true :/icons/prefsInputButtons.png:/icons/prefsInputButtons.png Buttons true :/icons/prefs3DPrint.png:/icons/prefs3DPrint.png 3D Print 3D Printing Services AxisConfigWidget QWidget
input/AxisConfigWidget.h
1
ButtonConfigWidget QWidget
input/ButtonConfigWidget.h
1
openscad-2019.05/src/PrintInitDialog.cc0000644000076500000240000000436613424335753020257 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "PrintService.h" #include "PrintInitDialog.h" PrintInitDialog::PrintInitDialog() { setupUi(this); const auto printService = PrintService::inst(); this->textBrowser->setSource(QUrl{"qrc:/src/PrintInitDialog.html"}); this->okButton->setEnabled(false); if (printService->isEnabled()) { this->printServiceButton->setText(this->printServiceButton->text().arg(printService->getDisplayName())); } else { this->printServiceButton->setText(_("Print Service not available")); this->printServiceButton->setEnabled(false); } } PrintInitDialog::~PrintInitDialog() { } void PrintInitDialog::on_printServiceButton_clicked() { this->textBrowser->setHtml(PrintService::inst()->getInfoHtml()); this->result = print_service_t::PRINT_SERVICE; this->okButton->setEnabled(true); } void PrintInitDialog::on_octoPrintButton_clicked() { this->textBrowser->setSource(QUrl{"qrc:/src/OctoPrintInfo.html"}); this->result = print_service_t::OCTOPRINT; this->okButton->setEnabled(true); } void PrintInitDialog::on_okButton_clicked() { accept(); } void PrintInitDialog::on_cancelButton_clicked() { reject(); } openscad-2019.05/src/PrintInitDialog.h0000644000076500000240000000322613424335753020113 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include "qtgettext.h" #include "ui_PrintInitDialog.h" enum class print_service_t { PRINT_SERVICE, OCTOPRINT }; class PrintInitDialog : public QDialog, public Ui::PrintInitDialog { Q_OBJECT; public: PrintInitDialog(); ~PrintInitDialog(); print_service_t getResult() const { return this->result; } public slots: void on_printServiceButton_clicked(); void on_octoPrintButton_clicked(); void on_okButton_clicked(); void on_cancelButton_clicked(); private: print_service_t result; QString htmlTemplate; }; openscad-2019.05/src/PrintInitDialog.html0000644000076500000240000000010013424335753020614 0ustar kintelstaff00000000000000

Select print service below

openscad-2019.05/src/PrintInitDialog.ui0000644000076500000240000000670413424335753020305 0ustar kintelstaff00000000000000 PrintInitDialog 0 0 504 246 3D Print 16 6 0 0 &OK Cancel 480 128 true qrc:/src/PrintInitDialog.html true Qt::Vertical QSizePolicy::Fixed 20 6 false %1 true true OctoPrint true true Qt::Horizontal 40 20 openscad-2019.05/src/PrintService.cc0000644000076500000240000001255513427162620017625 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "printutils.h" #include "PrintService.h" std::mutex PrintService::printServiceMutex; PrintService::PrintService() { enabled = false; try { init(); } catch (const NetworkException& e) { PRINTB("ERROR: %s", e.getErrorMessage().toStdString()); } if (enabled) { PRINTB("External print service available: %s (upload limit = %d MB)", displayName.toStdString() % fileSizeLimitMB); } } PrintService::~PrintService() { } PrintService * PrintService::inst() { static PrintService *instance = nullptr; std::lock_guard lock(printServiceMutex); if (instance == nullptr) { instance = new PrintService(); } return instance; } void PrintService::init() { auto networkRequest = NetworkRequest{QUrl{"https://files.openscad.org/print-service.json"}, { 200 }, 30}; return networkRequest.execute( [](QNetworkRequest& request) { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); }, [](QNetworkAccessManager& nam, QNetworkRequest& request) { return nam.get(request); }, [&](QNetworkReply *reply) { const auto doc = QJsonDocument::fromJson(reply->readAll()); PRINTDB("Response: %s", QString{doc.toJson()}.toStdString()); const QStringList services = doc.object().keys(); if (services.length() >= 1) { service = services.at(0); if (!service.isEmpty()) { initService(doc.object().value(service).toObject()); } } } ); } void PrintService::initService(const QJsonObject& serviceObject) { displayName = serviceObject.value("displayName").toString(); apiUrl = serviceObject.value("apiUrl").toString(); fileSizeLimitMB = serviceObject.value("fileSizeLimitMB").toInt(); infoHtml = serviceObject.value("infoHtml").toString(); infoUrl = serviceObject.value("infoUrl").toString(); enabled = !displayName.isEmpty() && !apiUrl.isEmpty() && !infoHtml.isEmpty() && !infoUrl.isEmpty() && fileSizeLimitMB != 0; } /** * This function uploads a design to the 3D printing API endpoint and * returns an URL that, when accessed, will show the design as a part * that can be configured and added to the shopping cart. If it's not * successful, it throws an exception with a message. * * Inputs: * fileName - Then name we should give the file when it is uploaded * for the order process. * Outputs: * The resulting url to go to next to continue the order process. */ const QString PrintService::upload(const QString& fileName, const QString& contentBase64, network_progress_func_t progress_func) { QJsonObject jsonInput; jsonInput.insert("fileName", fileName); jsonInput.insert("file", contentBase64); // Safe guard against QJson silently dropping the file content if it's // too big. This seems to be configured at MaxSize = (1<<27) - 1 in Qt // via qtbase/src/corelib/json/qjson_p.h // Due to the base64 encoding having 33% overhead, that should allow for // about 96MB data. if (jsonInput.value("file") == QJsonValue::Undefined) { const QString msg = "Could not encode STL into JSON. Perhaps it is too large of a file? Maybe try reducing the model resolution."; throw NetworkException(QNetworkReply::ProtocolFailure, msg); } auto networkRequest = NetworkRequest{QUrl{apiUrl}, { 200, 201 }, 180}; networkRequest.set_progress_func(progress_func); return networkRequest.execute( [](QNetworkRequest& request) { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); }, [&](QNetworkAccessManager& nam, QNetworkRequest& request) { return nam.post(request, QJsonDocument(jsonInput).toJson()); }, [](QNetworkReply *reply) { const auto doc = QJsonDocument::fromJson(reply->readAll()); PRINTDB("Response: %s", QString{doc.toJson()}.toStdString()); // Extract cartUrl which gives the page to open in a webbrowser to view uploaded part const auto cartUrlValue = doc.object().value("data").toObject().value("cartUrl"); const auto cartUrl = cartUrlValue.toString(); if ((cartUrlValue == QJsonValue::Undefined) || (cartUrl.isEmpty())) { const QString msg = "Could not get data.cartUrl field from response."; throw NetworkException(QNetworkReply::ProtocolFailure, msg); } PRINTB("Upload finished, opening URL %s.", cartUrl.toStdString()); return cartUrl; } ); } openscad-2019.05/src/PrintService.h0000644000076500000240000000421213417146620017457 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include #include "Network.h" class PrintService { public: static PrintService * inst(); bool isEnabled() const { return enabled; } const QString getService() const { return service; } const QString getDisplayName() const { return displayName; } const QString getApiUrl() const { return apiUrl; } long getFileSizeLimit() const { return fileSizeLimitMB * 1024 * 1024; } long getFileSizeLimitMB() const { return fileSizeLimitMB; } const QString getInfoHtml() const { return infoHtml; } const QString getInfoUrl() const { return infoUrl; } const QString upload(const QString& exportFileName, const QString& fileName, network_progress_func_t progress_func); private: PrintService(); virtual ~PrintService(); void init(); void initService(const QJsonObject& serviceObject); bool enabled; QString service; QString displayName; QString apiUrl; int fileSizeLimitMB; QString infoUrl; QString infoHtml; static std::mutex printServiceMutex; };openscad-2019.05/src/ProgressWidget.cc0000644000076500000240000000157613402025764020161 0ustar kintelstaff00000000000000#include "ProgressWidget.h" #include ProgressWidget::ProgressWidget(QWidget *parent) :QWidget(parent) { setupUi(this); setRange(0, 1000); setValue(0); this->wascanceled = false; this->starttime.start(); connect(this->stopButton, SIGNAL(clicked()), this, SLOT(cancel())); QTimer::singleShot(1000, this, SIGNAL(requestShow())); } bool ProgressWidget::wasCanceled() const { return this->wascanceled; } /*! Returns milliseconds since this widget was created */ int ProgressWidget::elapsedTime() const { return this->starttime.elapsed(); } void ProgressWidget::cancel() { this->wascanceled = true; } void ProgressWidget::setRange(int minimum, int maximum) { this->progressBar->setRange(minimum, maximum); } void ProgressWidget::setValue(int progress) { this->progressBar->setValue(progress); } int ProgressWidget::value() const { return this->progressBar->value(); } openscad-2019.05/src/ProgressWidget.h0000644000076500000240000000101313402025764020005 0ustar kintelstaff00000000000000#pragma once #include "qtgettext.h" #include "ui_ProgressWidget.h" #include class ProgressWidget : public QWidget, public Ui::ProgressWidget { Q_OBJECT; Q_PROPERTY(bool wasCanceled READ wasCanceled); public: ProgressWidget(QWidget *parent = nullptr); bool wasCanceled() const; int elapsedTime() const; public slots: void setRange(int minimum, int maximum); void setValue(int progress); int value() const; void cancel(); signals: void requestShow(); private: bool wascanceled; QTime starttime; }; openscad-2019.05/src/ProgressWidget.ui0000644000076500000240000000340513402025764020202 0ustar kintelstaff00000000000000 ProgressWidget 0 0 121 20 5 0 1000 24 %v / %m 0 0 12 12 12 12 :/icons/stopbutton.png:/icons/stopbutton.png 12 12 true openscad-2019.05/src/QGLView.cc0000644000076500000240000003112713423115164016457 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "qtgettext.h" #include "QGLView.h" #include "Preferences.h" #include "renderer.h" #include "degree_trig.h" #include #include #include #include #include #include #include #include #include #include #include #include "OpenCSGWarningDialog.h" #include "QSettingsCached.h" #include #include #ifdef ENABLE_OPENCSG # include #endif QGLView::QGLView(QWidget *parent) : #ifdef USE_QOPENGLWIDGET QOpenGLWidget(parent) #else QGLWidget(parent) #endif { init(); } #if defined(_WIN32) && !defined(USE_QOPENGLWIDGET) static bool running_under_wine = false; #endif void QGLView::init() { resetView(); this->mouse_drag_active = false; this->statusLabel = nullptr; setMouseTracking(true); #if defined(_WIN32) && !defined(USE_QOPENGLWIDGET) // see paintGL() + issue160 + wine FAQ #include HMODULE hntdll = GetModuleHandle(L"ntdll.dll"); if (hntdll) if ( (void *)GetProcAddress(hntdll, "wine_get_version") ) running_under_wine = true; #endif } void QGLView::resetView() { cam.resetView(); } void QGLView::viewAll() { if (auto renderer = this->getRenderer()) { auto bbox = renderer->getBoundingBox(); cam.autocenter = true; cam.viewAll(renderer->getBoundingBox()); } } void QGLView::initializeGL() { auto err = glewInit(); if (err != GLEW_OK) { fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err)); } GLView::initializeGL(); } std::string QGLView::getRendererInfo() const { std::ostringstream info; info << glew_dump(); // Don't translate as translated text in the Library Info dialog is not wanted #ifdef USE_QOPENGLWIDGET info << "\nQt graphics widget: QOpenGLWidget"; auto qsf = this->format(); auto rbits = qsf.redBufferSize(); auto gbits = qsf.greenBufferSize(); auto bbits = qsf.blueBufferSize(); auto abits = qsf.alphaBufferSize(); auto dbits = qsf.depthBufferSize(); auto sbits = qsf.stencilBufferSize(); info << boost::format("\nQSurfaceFormat: RGBA(%d%d%d%d), depth(%d), stencil(%d)\n\n") % rbits % gbits % bbits % abits % dbits % sbits; #else info << "\nQt graphics widget: QGLWidget"; #endif info << glew_extensions_dump(); return info.str(); } #ifdef ENABLE_OPENCSG void QGLView::display_opencsg_warning() { if (Preferences::inst()->getValue("advanced/opencsg_show_warning").toBool()) { QTimer::singleShot(0, this, SLOT(display_opencsg_warning_dialog())); } } void QGLView::display_opencsg_warning_dialog() { auto dialog = new OpenCSGWarningDialog(this); QString message; if (this->is_opencsg_capable) { message += _("Warning: You may experience OpenCSG rendering errors.\n\n"); } else { message += _("Warning: Missing OpenGL capabilities for OpenCSG - OpenCSG has been disabled.\n\n"); dialog->enableOpenCSGBox->hide(); } message += _("It is highly recommended to use OpenSCAD on a system with " "OpenGL 2.0 or later.\n" "Your renderer information is as follows:\n"); QString rendererinfo(_("GLEW version %1\n%2 (%3)\nOpenGL version %4\n")); message += rendererinfo.arg((const char *)glewGetString(GLEW_VERSION), (const char *)glGetString(GL_RENDERER), (const char *)glGetString(GL_VENDOR), (const char *)glGetString(GL_VERSION)); dialog->setText(message); dialog->enableOpenCSGBox->setChecked(Preferences::inst()->getValue("advanced/enable_opencsg_opengl1x").toBool()); dialog->exec(); opencsg_support = this->is_opencsg_capable && Preferences::inst()->getValue("advanced/enable_opencsg_opengl1x").toBool(); } #endif void QGLView::resizeGL(int w, int h) { GLView::resizeGL(w,h); } void QGLView::paintGL() { GLView::paintGL(); if (statusLabel) { auto status = QString("%1 (%2x%3)") .arg(QString::fromStdString(cam.statusText())) .arg(size().rwidth()) .arg(size().rheight()); statusLabel->setText(status); } #if defined(_WIN32) && !defined(USE_QOPENGLWIDGET) if (running_under_wine) swapBuffers(); #endif } void QGLView::mousePressEvent(QMouseEvent *event) { mouse_drag_active = true; last_mouse = event->globalPos(); } void QGLView::mouseDoubleClickEvent (QMouseEvent *event) { setupCamera(); int viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; glGetIntegerv( GL_VIEWPORT, viewport); glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); double x = event->pos().x() * this->getDPI(); double y = viewport[3] - event->pos().y() * this->getDPI(); GLfloat z = 0; glGetError(); // clear error state so we don't pick up previous errors glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z); auto glError = glGetError(); if (glError != GL_NO_ERROR) { return; } if (z == 1) return; // outside object GLdouble px, py, pz; auto success = gluUnProject(x, y, z, modelview, projection, viewport, &px, &py, &pz); if (success == GL_TRUE) { cam.object_trans -= Vector3d(px, py, pz); updateGL(); emit doAnimateUpdate(); } } void QGLView::normalizeAngle(GLdouble& angle) { while(angle < 0) angle += 360; while(angle > 360) angle -= 360; } void QGLView::mouseMoveEvent(QMouseEvent *event) { auto this_mouse = event->globalPos(); double dx = (this_mouse.x() - last_mouse.x()) * 0.7; double dy = (this_mouse.y() - last_mouse.y()) * 0.7; if (mouse_drag_active) { if (event->buttons() & Qt::LeftButton #ifdef Q_OS_MAC && !(event->modifiers() & Qt::MetaModifier) #endif ) { // Left button rotates in xz, Shift-left rotates in xy // On Mac, Ctrl-Left is handled as right button on other platforms if ((QApplication::keyboardModifiers() & Qt::ShiftModifier) != 0) { rotate(dy, dx, 0.0, true); } else { rotate(dy, 0.0, dx, true); } normalizeAngle(cam.object_rot.x()); normalizeAngle(cam.object_rot.y()); normalizeAngle(cam.object_rot.z()); } else { // Right button pans in the xz plane // Middle button pans in the xy plane // Shift-right and Shift-middle zooms if ((QApplication::keyboardModifiers() & Qt::ShiftModifier) != 0) { zoom(-12.0 * dy, true); } else { double mx = +(dx) * 3.0 * cam.zoomValue() / QWidget::width(); double mz = -(dy) * 3.0 * cam.zoomValue() / QWidget::height(); double my = 0; #if (QT_VERSION < QT_VERSION_CHECK(4, 7, 0)) if (event->buttons() & Qt::MidButton) { #else if (event->buttons() & Qt::MiddleButton) { #endif my = mz; mz = 0; // actually lock the x-position // (turns out to be easier to use than xy panning) mx = 0; } translate(mx, my, mz, true); } } } last_mouse = this_mouse; } void QGLView::mouseReleaseEvent(QMouseEvent*) { mouse_drag_active = false; releaseMouse(); } const QImage & QGLView::grabFrame() { // Force reading from front buffer. Some configurations will read from the back buffer here. glReadBuffer(GL_FRONT); this->frame = grabFrameBuffer(); return this->frame; } bool QGLView::save(const char *filename) { return this->frame.save(filename, "PNG"); } void QGLView::wheelEvent(QWheelEvent *event) { const auto pos = event->pos(); #if QT_VERSION >= 0x050000 const int v = event->angleDelta().y(); #else const int v = event->delta(); #endif if(this->mouseCentricZoom){ zoomCursor(pos.x(), pos.y(), v); }else{ zoom(v, true); } } void QGLView::ZoomIn(void) { zoom(120, true); } void QGLView::ZoomOut(void) { zoom(-120, true); } void QGLView::zoom(double v, bool relative) { this->cam.zoom(v, relative); updateGL(); } void QGLView::zoomCursor(int x, int y, int zoom) { const auto old_dist = cam.zoomValue(); this->cam.zoom(zoom, true); const auto dist = cam.zoomValue(); const auto ratio = old_dist / dist - 1.0; // screen coordinates from -1 to 1 const auto screen_x = 2.0 * (x + 0.5) / this->cam.pixel_width - 1.0; const auto screen_y = 1.0 - 2.0 * (y + 0.5) / this->cam.pixel_height; const auto height = dist * tan_degrees(cam.fov / 2); const auto mx = ratio*screen_x*(aspectratio*height); const auto mz = ratio*screen_y*height; translate(-mx, 0, -mz, true); } void QGLView::setOrthoMode(bool enabled) { if (enabled) this->cam.setProjection(Camera::ProjectionType::ORTHOGONAL); else this->cam.setProjection(Camera::ProjectionType::PERSPECTIVE); } void QGLView::translate(double x, double y, double z, bool relative, bool viewPortRelative) { Matrix3d aax, aay, aaz; aax = angle_axis_degrees(-cam.object_rot.x(), Vector3d::UnitX()); aay = angle_axis_degrees(-cam.object_rot.y(), Vector3d::UnitY()); aaz = angle_axis_degrees(-cam.object_rot.z(), Vector3d::UnitZ()); Matrix3d tm3 = aaz * aay * aax; Matrix4d tm = Matrix4d::Identity(); if (viewPortRelative) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { tm(j, i) = tm3(j, i); } } } Matrix4d vec; vec << 0, 0, 0, x, 0, 0, 0, y, 0, 0, 0, z, 0, 0, 0, 1 ; tm = tm * vec; double f = relative ? 1 : 0; cam.object_trans.x() = f * cam.object_trans.x() + tm(0, 3); cam.object_trans.y() = f * cam.object_trans.y() + tm(1, 3); cam.object_trans.z() = f * cam.object_trans.z() + tm(2, 3); updateGL(); emit doAnimateUpdate(); } void QGLView::rotate(double x, double y, double z, bool relative) { double f = relative ? 1 : 0; cam.object_rot.x() = f * cam.object_rot.x() + x; cam.object_rot.y() = f * cam.object_rot.y() + y; cam.object_rot.z() = f * cam.object_rot.z() + z; normalizeAngle(cam.object_rot.x()); normalizeAngle(cam.object_rot.y()); normalizeAngle(cam.object_rot.z()); updateGL(); emit doAnimateUpdate(); } void QGLView::rotate2(double x, double y, double z) { // This vector describes the rotation. // The direction of the vector is the angle around which to rotate, and // the length of the vector is the angle by which to rotate Vector3d rot = Vector3d(-x, -y, -z); // get current rotation matrix Matrix3d aax, aay, aaz, rmx; aax = angle_axis_degrees(-cam.object_rot.x(), Vector3d::UnitX()); aay = angle_axis_degrees(-cam.object_rot.y(), Vector3d::UnitY()); aaz = angle_axis_degrees(-cam.object_rot.z(), Vector3d::UnitZ()); rmx = aaz * (aay * aax); // rotate rmx = rmx * angle_axis_degrees(rot.norm(), rot.normalized()); // back to euler // see: http://staff.city.ac.uk/~sbbh653/publications/euler.pdf double theta, psi, phi; if (abs(rmx(2, 0)) != 1) { theta = -asin_degrees(rmx(2, 0)); psi = atan2_degrees(rmx(2, 1) / cos_degrees(theta), rmx(2, 2) / cos_degrees(theta)); phi = atan2_degrees(rmx(1, 0) / cos_degrees(theta), rmx(0, 0) / cos_degrees(theta)); } else { phi = 0; if (rmx(2, 0) == -1) { theta = 90; psi = phi + atan2_degrees(rmx(0, 1), rmx(0, 2)); } else { theta = -90; psi = -phi + atan2_degrees(-rmx(0, 1), -rmx(0, 2)); } } cam.object_rot.x() = -psi; cam.object_rot.y() = -theta; cam.object_rot.z() = -phi; normalizeAngle(cam.object_rot.x()); normalizeAngle(cam.object_rot.y()); normalizeAngle(cam.object_rot.z()); updateGL(); emit doAnimateUpdate(); } openscad-2019.05/src/QGLView.h0000644000076500000240000000534713423115164016326 0ustar kintelstaff00000000000000#pragma once #include "system-gl.h" #include #ifdef USE_QOPENGLWIDGET #include #else #include #endif #include #include #include #include "GLView.h" #include "renderer.h" class QGLView : #ifdef USE_QOPENGLWIDGET public QOpenGLWidget, #else public QGLWidget, #endif public GLView { Q_OBJECT Q_PROPERTY(bool showFaces READ showFaces WRITE setShowFaces); Q_PROPERTY(bool showEdges READ showEdges WRITE setShowEdges); Q_PROPERTY(bool showAxes READ showAxes WRITE setShowAxes); Q_PROPERTY(bool showCrosshairs READ showCrosshairs WRITE setShowCrosshairs); Q_PROPERTY(bool orthoMode READ orthoMode WRITE setOrthoMode); Q_PROPERTY(double showScaleProportional READ showScaleProportional WRITE setShowScaleProportional); public: QGLView(QWidget *parent = nullptr); #ifdef ENABLE_OPENCSG bool hasOpenCSGSupport() { return this->opencsg_support; } #endif // Properties bool orthoMode() const { return (this->cam.projection == Camera::ProjectionType::ORTHOGONAL); } void setOrthoMode(bool enabled); bool showScaleProportional() const { return this->showscale; } void setShowScaleProportional(bool enabled) { this->showscale = enabled; } std::string getRendererInfo() const override; #if QT_VERSION >= 0x050100 float getDPI() override { return this->devicePixelRatio(); } #endif const QImage & grabFrame(); bool save(const char *filename) override; void resetView(); void viewAll(); public slots: void ZoomIn(void); void ZoomOut(void); #ifdef USE_QOPENGLWIDGET inline void updateGL() { update(); } #endif void setMouseCentricZoom(bool var){ this->mouseCentricZoom=var; } public: QLabel *statusLabel; #ifdef USE_QOPENGLWIDGET inline QImage grabFrameBuffer() { return grabFramebuffer(); } #endif void zoom(double v, bool relative); void zoomCursor(int x, int y, int zoom); void rotate(double x, double y, double z, bool relative); void rotate2(double x, double y, double z); void translate(double x, double y, double z, bool relative, bool viewPortRelative = true); private: void init(); bool mouse_drag_active; bool mouseCentricZoom=true; QPoint last_mouse; QImage frame; // Used by grabFrame() and save() void wheelEvent(QWheelEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; void normalizeAngle(GLdouble& angle); #ifdef ENABLE_OPENCSG void display_opencsg_warning() override; private slots: void display_opencsg_warning_dialog(); #endif signals: void doAnimateUpdate(); }; openscad-2019.05/src/QSettingsCached.cc0000644000076500000240000000020413402025764020205 0ustar kintelstaff00000000000000#include "QSettingsCached.h" std::unique_ptr QSettingsCached::qsettingsPointer; std::mutex QSettingsCached::ctor_mutex; openscad-2019.05/src/QSettingsCached.h0000644000076500000240000000336613402025764020063 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include #include #include "printutils.h" class QSettingsCached { public: QSettingsCached() { if (qsettingsPointer.get() == nullptr) { std::lock_guard lock{ctor_mutex}; if (qsettingsPointer.get() == nullptr) { qsettingsPointer.reset(new QSettings()); } } } inline void setValue(const QString &key, const QVariant &value) { PRINTDB("QSettings::setValue(): %s = '%s'", key.toStdString() % value.toString().toStdString()); qsettingsPointer->setValue(key,value); // It is safe to access qsettings from Multiple sources. it is thread safe // Disabling forced sync to persisted storage on write. Will rely on automatic behavior of QSettings // qsettingsPointer->sync(); // force write to file system on each modification of open scad settings } inline QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const { return qsettingsPointer->value(key, defaultValue); } inline void remove(const QString &key) { qsettingsPointer->remove(key); // Disabling forced sync to persisted storage on write. Will rely on automatic behavior of QSettings // qsettingsPointer->sync(); } inline bool contains(const QString &key) { return qsettingsPointer->contains(key); } void release() { delete qsettingsPointer.release(); } private: static std::unique_ptr qsettingsPointer; static std::mutex ctor_mutex; }; openscad-2019.05/src/QWordSearchField.cc0000644000076500000240000000307113402025764020327 0ustar kintelstaff00000000000000#include "QWordSearchField.h" #include QWordSearchField::QWordSearchField(QFrame *parent) : QLineEdit(parent) { findcount = 0; fieldLabel = new QLabel(this); fieldLabel->setTextFormat(Qt::PlainText); fieldLabel->setText(QString("00")); fieldLabel->setCursor(Qt::ArrowCursor); fieldLabel->setStyleSheet("QLabel { border: none; padding: 0px; }"); fieldLabel->hide(); connect(this, SIGNAL(findCountChanged()), this, SLOT(updateFieldLabel())); auto frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(fieldLabel->sizeHint().width() + frameWidth + 1)); auto minsize = minimumSizeHint(); setMinimumSize(qMax(minsize.width(), fieldLabel->sizeHint().height() + frameWidth * 2 + 2), qMax(minsize.height(), fieldLabel->sizeHint().height() + frameWidth * 2 + 2)); } void QWordSearchField::resizeEvent(QResizeEvent *) { resizeSearchField(); } void QWordSearchField::resizeSearchField() { auto size = fieldLabel->sizeHint(); auto frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); fieldLabel->move(rect().right() - frameWidth - size.width(), (rect().bottom() + 1 - size.height())/2); } void QWordSearchField::updateFieldLabel() { if (findcount > 0) { fieldLabel->setText(QString::number(findcount)); fieldLabel->setVisible(true); } else { fieldLabel->setText(QString("")); fieldLabel->setVisible(false); } resizeSearchField(); } void QWordSearchField::setFindCount(int value) { if (value != findcount) { findcount = value; emit findCountChanged(); } } openscad-2019.05/src/QWordSearchField.h0000644000076500000240000000112113402025764020163 0ustar kintelstaff00000000000000#ifndef QWORDSEARCHFIELD_H #define QWORDSEARCHFIELD_H #include #include class QWordSearchField : public QLineEdit { Q_OBJECT public: QWordSearchField(QFrame *parent = nullptr); int findCount() const { return findcount; } protected: void resizeEvent(QResizeEvent *) override; void resizeSearchField(); private slots: void updateFieldLabel(); public slots: void setFindCount(int value); signals: void findCountChanged(); private: QLabel *fieldLabel; int findcount; }; #endif /* QWORDSEARCHFIELD_H */ openscad-2019.05/src/Reindexer.h0000644000076500000240000000314413402025764016771 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include "hash.h" /*! Reindexes a collection of elements of type T. Typically used to compress an element array by creating and reusing indexes to a new array or to merge two index tables to two arrays into a common index. The latter is necessary for VBO's or for unifying texture coordinate indices to multiple texture coordinate arrays. */ template class Reindexer { public: /*! Looks up a value. Will insert the value if it doesn't already exist. Returns the new index. */ int lookup(const T &val) { typename std::unordered_map::const_iterator iter = this->map.find(val); if (iter != this->map.end()) return iter->second; else { this->map.insert(std::make_pair(val, this->map.size())); return this->map.size() - 1; } } /*! Returns the current size of the new element array */ std::size_t size() const { return this->map.size(); } /*! Return the new element array. */ const T *getArray() { this->vec.resize(this->map.size()); typename std::unordered_map::const_iterator iter = this->map.begin(); while (iter != this->map.end()) { this->vec[iter->second] = iter->first; iter++; } return &this->vec[0]; } /*! Copies the internal vector to the given destination */ template void copy(OutputIterator dest) { this->getArray(); std::copy(this->vec.begin(), this->vec.end(), dest); } private: std::unordered_map map; std::vector vec; }; openscad-2019.05/src/SettingsWriter.cc0000644000076500000240000000342313402025764020177 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Preferences.h" #include "SettingsWriter.h" #include "QSettingsCached.h" void SettingsWriter::handle(Settings::SettingsEntry& entry) const { Settings::Settings *s = Settings::Settings::inst(); QSettingsCached settings; QString key = QString::fromStdString(entry.category() + "/" + entry.name()); if (entry.is_default()) { settings.remove(key); PRINTDB("SettingsWriter D: %s", key.toStdString().c_str()); } else { const Value &value = s->get(entry); settings.setValue(key, QString::fromStdString(value.toString())); PRINTDB("SettingsWriter W: %s = '%s'", key.toStdString().c_str() % value.toString().c_str()); } } openscad-2019.05/src/SettingsWriter.h0000644000076500000240000000243713402025764020045 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "settings.h" class SettingsWriter : public Settings::SettingsVisitor { public: virtual void handle(Settings::SettingsEntry& entry) const; }; openscad-2019.05/src/SparkleAutoUpdater.h0000644000076500000240000000104113402025764020615 0ustar kintelstaff00000000000000/* * License: MIT License (http://opensource.org/licenses/MIT) * See SparkleAutoUpdater.mm */ #pragma once #include #include "AutoUpdater.h" class SparkleAutoUpdater : public AutoUpdater { Q_OBJECT; public: SparkleAutoUpdater(); ~SparkleAutoUpdater(); void checkForUpdates(); void setAutomaticallyChecksForUpdates(bool on); bool automaticallyChecksForUpdates(); void setEnableSnapshots(bool on); bool enableSnapshots(); QString lastUpdateCheckDate(); private: void updateFeed(); class Private; Private *d; }; openscad-2019.05/src/SparkleAutoUpdater.mm0000644000076500000240000000427013423115164021003 0ustar kintelstaff00000000000000/* * Copyright (C) 2008 Remko Troncon. * See https://github.com/remko/mixing-cocoa-and-qt * https://el-tramo.be/blog/mixing-cocoa-and-qt * License: BSD. Assuming 2-clause BSD reference by Sparke based on context: * https://github.com/sparkle-project/Sparkle/blob/master/LICENSE * Copyright (C) 2013 Marius Kintel. * License: MIT License (http://opensource.org/licenses/MIT) */ #include "SparkleAutoUpdater.h" #include "PlatformUtils.h" #include #include NSString *const SUEnableSnapshotsKey = @"SUEnableSnapshots"; class SparkleAutoUpdater::Private { public: SUUpdater* updater; }; SparkleAutoUpdater::SparkleAutoUpdater() { d = new Private; d->updater = [SUUpdater sharedUpdater]; [d->updater retain]; updateFeed(); } SparkleAutoUpdater::~SparkleAutoUpdater() { [d->updater release]; delete d; } void SparkleAutoUpdater::checkForUpdates() { [d->updater checkForUpdatesInBackground]; } void SparkleAutoUpdater::setAutomaticallyChecksForUpdates(bool on) { [d->updater setAutomaticallyChecksForUpdates:on]; } bool SparkleAutoUpdater::automaticallyChecksForUpdates() { return [d->updater automaticallyChecksForUpdates]; } void SparkleAutoUpdater::setEnableSnapshots(bool on) { [[NSUserDefaults standardUserDefaults] setBool:on forKey:SUEnableSnapshotsKey]; updateFeed(); } bool SparkleAutoUpdater::enableSnapshots() { return [[NSUserDefaults standardUserDefaults] boolForKey:SUEnableSnapshotsKey]; } QString SparkleAutoUpdater::lastUpdateCheckDate() { NSDate *date = [d->updater lastUpdateCheckDate]; NSString *datestring = date ? [NSString stringWithFormat:@"Last checked: %@", date] : @""; return QString::fromUtf8([datestring UTF8String]); } #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) void SparkleAutoUpdater::updateFeed() { NSString *urlstring = [NSString stringWithFormat:@"https://files.openscad.org/appcast%@.xml", enableSnapshots() ? @"-snapshots" : @""]; [d->updater setFeedURL:[NSURL URLWithString:urlstring]]; NSString *userAgent = [NSString stringWithFormat:@"OpenSCAD %s %s", TOSTRING(OPENSCAD_VERSION), PlatformUtils::sysinfo(false).c_str()]; [d->updater setUserAgentString: userAgent]; } openscad-2019.05/src/StatCache.cc0000644000076500000240000000443213435353202017037 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "StatCache.h" #include "printutils.h" #include #include #include namespace { const float stale = 190; // 190ms, maximum lifetime of a cache entry chosen to be shorter than the automatic reload poll time double millis_clock(void) { return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } struct CacheEntry { struct stat st; // result from stat double timestamp; // the time stat was called }; std::unordered_map statMap; } // namespace namespace StatCache { int stat(const std::string &path, struct ::stat &st) { auto iter = statMap.find(path); if (iter != statMap.end()) { // Have we got an entry for this file? if (millis_clock() - iter->second.timestamp < stale) { st = iter->second.st; // Not stale yet so return it return 0; } statMap.erase(iter); // Remove stale entry } if (auto rv = ::stat(path.c_str(), &st)) return rv; // stat failed statMap[path] = {st, millis_clock()}; return 0; } } // namespace StatCache openscad-2019.05/src/StatCache.h0000644000076500000240000000241513402025764016703 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include namespace StatCache { int stat(const std::string &path, struct ::stat &st); } openscad-2019.05/src/ThrownTogetherRenderer.cc0000644000076500000240000001146113402025764021655 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "ThrownTogetherRenderer.h" #include "polyset.h" #include "printutils.h" #include "system-gl.h" ThrownTogetherRenderer::ThrownTogetherRenderer(shared_ptr root_products, shared_ptr highlight_products, shared_ptr background_products) : root_products(root_products), highlight_products(highlight_products), background_products(background_products) { } void ThrownTogetherRenderer::draw(bool /*showfaces*/, bool showedges) const { PRINTD("Thrown draw"); if (this->root_products) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); renderCSGProducts(*this->root_products, false, false, showedges, false); glCullFace(GL_FRONT); glColor3ub(255, 0, 255); renderCSGProducts(*this->root_products, false, false, showedges, true); glDisable(GL_CULL_FACE); } if (this->background_products) renderCSGProducts(*this->background_products, false, true, showedges, false); if (this->highlight_products) renderCSGProducts(*this->highlight_products, true, false, showedges, false); } void ThrownTogetherRenderer::renderChainObject(const CSGChainObject &csgobj, bool highlight_mode, bool background_mode, bool showedges, bool fberror, OpenSCADOperator type) const { if (this->geomVisitMark[std::make_pair(csgobj.leaf->geom.get(), &csgobj.leaf->matrix)]++ > 0) return; const Color4f &c = csgobj.leaf->color; csgmode_e csgmode = get_csgmode(highlight_mode, background_mode, type); ColorMode colormode = ColorMode::NONE; ColorMode edge_colormode = ColorMode::NONE; if (highlight_mode) { colormode = ColorMode::HIGHLIGHT; edge_colormode = ColorMode::HIGHLIGHT_EDGES; } else if (background_mode) { if (csgobj.flags & CSGNode::FLAG_HIGHLIGHT) { colormode = ColorMode::HIGHLIGHT; } else { colormode = ColorMode::BACKGROUND; } edge_colormode = ColorMode::BACKGROUND_EDGES; } else if (fberror) { } else if (type == OpenSCADOperator::DIFFERENCE) { if (csgobj.flags & CSGNode::FLAG_HIGHLIGHT) { colormode = ColorMode::HIGHLIGHT; } else { colormode = ColorMode::CUTOUT; } edge_colormode = ColorMode::CUTOUT_EDGES; } else { if (csgobj.flags & CSGNode::FLAG_HIGHLIGHT) { colormode = ColorMode::HIGHLIGHT; } else { colormode = ColorMode::MATERIAL; } edge_colormode = ColorMode::MATERIAL_EDGES; } const Transform3d &m = csgobj.leaf->matrix; setColor(colormode, c.data()); glPushMatrix(); glMultMatrixd(m.data()); render_surface(csgobj.leaf->geom, csgmode, m); if (showedges) { // FIXME? glColor4f((c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0); setColor(edge_colormode); render_edges(csgobj.leaf->geom, csgmode); } glPopMatrix(); } void ThrownTogetherRenderer::renderCSGProducts(const CSGProducts &products, bool highlight_mode, bool background_mode, bool showedges, bool fberror) const { PRINTD("Thrown renderCSGProducts"); glDepthFunc(GL_LEQUAL); this->geomVisitMark.clear(); for(const auto &product : products.products) { for(const auto &csgobj : product.intersections) { renderChainObject(csgobj, highlight_mode, background_mode, showedges, fberror, OpenSCADOperator::INTERSECTION); } for(const auto &csgobj : product.subtractions) { renderChainObject(csgobj, highlight_mode, background_mode, showedges, fberror, OpenSCADOperator::DIFFERENCE); } } } BoundingBox ThrownTogetherRenderer::getBoundingBox() const { BoundingBox bbox; if (this->root_products) bbox = this->root_products->getBoundingBox(); if (this->highlight_products) bbox.extend(this->highlight_products->getBoundingBox()); if (this->background_products) bbox.extend(this->background_products->getBoundingBox()); return bbox; } openscad-2019.05/src/ThrownTogetherRenderer.h0000644000076500000240000000213513402025764021515 0ustar kintelstaff00000000000000#pragma once #include "renderer.h" #include "csgnode.h" #include #include class ThrownTogetherRenderer : public Renderer { public: ThrownTogetherRenderer(shared_ptr root_products, shared_ptr highlight_products, shared_ptr background_products); void draw(bool showfaces, bool showedges) const override; BoundingBox getBoundingBox() const override; private: void renderCSGProducts(const CSGProducts &products, bool highlight_mode, bool background_mode, bool showedges, bool fberror) const; void renderChainObject(const class CSGChainObject &csgobj, bool highlight_mode, bool background_mode, bool showedges, bool fberror, OpenSCADOperator type) const; shared_ptr root_products; shared_ptr highlight_products; shared_ptr background_products; mutable std::unordered_map, int, boost::hash>> geomVisitMark; }; openscad-2019.05/src/Tree.cc0000644000076500000240000000417213433421332016076 0ustar kintelstaff00000000000000#include "Tree.h" #include "nodedumper.h" #include "printutils.h" #include #include #include #include Tree::~Tree() { this->nodecachemap.clear(); } /*! Returns the cached string representation of the subtree rooted by \a node. If node is not cached, the cache will be rebuilt. */ const std::string Tree::getString(const AbstractNode &node, const std::string &indent) const { assert(this->root_node); bool idString = false; // Retrieve a nodecache given a tuple of NodeDumper constructor options NodeCache &nodecache = this->nodecachemap[std::make_tuple(indent,idString)]; if (!nodecache.contains(node)) { NodeDumper dumper(nodecache, this->root_node, indent, idString); dumper.traverse(*this->root_node); assert(nodecache.contains(*this->root_node) && "NodeDumper failed to create a cache"); } return nodecache[node]; } /*! Returns the cached ID string representation of the subtree rooted by \a node. If node is not cached, the cache will be rebuilt. The difference between this method and getString() is that the ID string is stripped for whitespace. Especially indentation whitespace is important to strip to enable cache hits for equivalent nodes from different scopes. */ const std::string Tree::getIdString(const AbstractNode &node) const { assert(this->root_node); const std::string indent = ""; const bool idString = true; // Retrieve a nodecache given a tuple of NodeDumper constructor options NodeCache &nodecache = this->nodecachemap[make_tuple(indent,idString)]; if (!nodecache.contains(node)) { nodecache.clear(); NodeDumper dumper(nodecache, this->root_node, indent, idString); dumper.traverse(*this->root_node); assert(nodecache.contains(*this->root_node) && "NodeDumper failed to create id cache"); } return nodecache[node]; } /*! Sets a new root. Will clear the existing cache. */ void Tree::setRoot(const AbstractNode *root) { this->root_node = root; this->nodecachemap.clear(); } void Tree::setDocumentPath(const std::string path){ this->document_path = path; } const std::string Tree::getDocumentPath() const { return this->document_path; } openscad-2019.05/src/Tree.h0000644000076500000240000000162613433421332015741 0ustar kintelstaff00000000000000#pragma once #include "nodecache.h" #include /*! For now, just an abstraction of the node tree which keeps a dump cache based on node indices around. Note that since node trees don't survive a recompilation, the tree cannot either. */ class Tree { public: Tree(const AbstractNode *root = nullptr) : root_node(root) {} ~Tree(); void setRoot(const AbstractNode *root); void setDocumentPath(const std::string path); const AbstractNode *root() const { return this->root_node; } const std::string getString(const AbstractNode &node, const std::string &indent) const; const std::string getIdString(const AbstractNode &node) const; const std::string getDocumentPath() const; private: const AbstractNode *root_node; // keep a separate nodecache per tuple of NodeDumper constructor parameters mutable std::map, NodeCache> nodecachemap; std::string document_path; }; openscad-2019.05/src/UIUtils.cc0000644000076500000240000001073413423115164016540 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include #include "version.h" #include "UIUtils.h" #include "qtgettext.h" #include "PlatformUtils.h" #include "QSettingsCached.h" #include #include QFileInfo UIUtils::openFile(QWidget *parent) { QSettingsCached settings; QString last_dirname = settings.value("lastOpenDirName").toString(); QString new_filename = QFileDialog::getOpenFileName(parent, "Open File", last_dirname, "OpenSCAD Designs (*.scad *.csg)"); if (new_filename.isEmpty()) { return QFileInfo(); } QFileInfo fileInfo(new_filename); QDir last_dir = fileInfo.dir(); last_dirname = last_dir.path(); settings.setValue("lastOpenDirName", last_dirname); return fileInfo; } QStringList UIUtils::recentFiles() { QSettingsCached settings; // set up project and program properly in main.cpp QStringList files = settings.value("recentFileList").toStringList(); // Remove any duplicate or empty entries from the list #if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) files.removeDuplicates(); #endif files.removeAll(QString()); // Now remove any entries which do not exist for (int i = files.size() - 1; i >= 0; --i) { QFileInfo fileInfo(files[i]); if (!QFile(fileInfo.absoluteFilePath()).exists()) files.removeAt(i); } while (files.size() > UIUtils::maxRecentFiles) { files.removeAt(files.size() - 1); } settings.setValue("recentFileList", files); return files; } using namespace boost::property_tree; static ptree *examples_tree = nullptr; static ptree *examplesTree() { if (!examples_tree) { std::string path = (PlatformUtils::resourcePath("examples") / "examples.json").string(); try { examples_tree = new ptree; read_json(path, *examples_tree); } catch (const std::exception & e) { PRINTB("Error reading examples.json: %s", e.what()); delete examples_tree; examples_tree = nullptr; } } return examples_tree; } QStringList UIUtils::exampleCategories() { // categories in File menu item - Examples QStringList categories; ptree *pt = examplesTree(); if (pt) { for(const auto &v : *pt) { // v.first is the name of the child. // v.second is the child tree. categories << QString::fromStdString(v.first); } } return categories; } QFileInfoList UIUtils::exampleFiles(const QString &category) { QFileInfoList examples; ptree *pt = examplesTree(); if (pt) { fs::path examplesPath = PlatformUtils::resourcePath("examples") / category.toStdString(); for(const auto &v : pt->get_child(category.toStdString())) { examples << QFileInfo(QString::fromStdString((examplesPath / v.second.data()).string())); } } return examples; } void UIUtils::openHomepageURL() { QDesktopServices::openUrl(QUrl("https://www.openscad.org/")); } static void openVersionedURL(QString url) { QDesktopServices::openUrl(QUrl(url.arg(openscad_shortversionnumber.c_str()))); } void UIUtils::openUserManualURL() { openVersionedURL("https://www.openscad.org/documentation.html?version=%1"); } void UIUtils::openCheatSheetURL() { #ifdef OPENSCAD_SNAPSHOT openVersionedURL("https://www.openscad.org/cheatsheet/snapshot.html?version=%1"); #else openVersionedURL("https://www.openscad.org/cheatsheet/index.html?version=%1"); #endif } openscad-2019.05/src/UIUtils.h0000644000076500000240000000303613402025764016402 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include namespace UIUtils { static const int maxRecentFiles = 10; QFileInfo openFile(QWidget *parent = nullptr); QStringList recentFiles(); QStringList exampleCategories(); QFileInfoList exampleFiles(const QString &category); void openHomepageURL(); void openUserManualURL(); void openCheatSheetURL(); } openscad-2019.05/src/UserModule.cc0000644000076500000240000000651213441031431017257 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "UserModule.h" #include "ModuleInstantiation.h" #include "node.h" #include "evalcontext.h" #include "exceptions.h" #include "stackcheck.h" #include "modcontext.h" #include "expression.h" #include "printutils.h" #include "compiler_specific.h" #include std::vector UserModule::module_stack; static void NOINLINE print_err(std::string name, const Location &loc,const Context *ctx){ std::string locs = loc.toRelativeString(ctx->documentPath()); PRINTB("ERROR: Recursion detected calling module '%s' %s", name % locs); } AbstractNode *UserModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { if (StackCheck::inst().check()) { print_err(inst->name(),loc,ctx); throw RecursionException::create("module", inst->name(),loc); return nullptr; } // At this point we know that nobody will modify the dependencies of the local scope // passed to this instance, so we can populate the context inst->scope.apply(*evalctx); ModuleContext c(ctx, evalctx); // set $children first since we might have variables depending on it c.set_variable("$children", ValuePtr(double(inst->scope.children.size()))); module_stack.push_back(inst->name()); c.set_variable("$parent_modules", ValuePtr(double(module_stack.size()))); c.initializeModule(*this); // FIXME: Set document path to the path of the module #if 0 && DEBUG c.dump(this, inst); #endif AbstractNode *node = new GroupNode(inst); std::vector instantiatednodes = this->scope.instantiateChildren(&c); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); module_stack.pop_back(); return node; } void UserModule::print(std::ostream &stream, const std::string &indent) const { std::string tab; if (!this->name.empty()) { stream << indent << "module " << this->name << "("; for (size_t i=0; i < this->definition_arguments.size(); i++) { const Assignment &arg = this->definition_arguments[i]; if (i > 0) stream << ", "; stream << arg.name; if (arg.expr) stream << " = " << *arg.expr; } stream << ") {\n"; tab = "\t"; } scope.print(stream, indent + tab); if (!this->name.empty()) { stream << indent << "}\n"; } } openscad-2019.05/src/UserModule.h0000644000076500000240000000155613437640540017140 0ustar kintelstaff00000000000000#pragma once #include #include #include "module.h" #include "localscope.h" class UserModule : public AbstractModule, public ASTNode { public: UserModule(const char *name, const Location &loc) : ASTNode(loc), name(name) { } UserModule(const char *name, const class Feature& feature, const Location &loc) : AbstractModule(feature), ASTNode(loc), name(name) { } ~UserModule() {} AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx = nullptr) const override; void print(std::ostream &stream, const std::string &indent) const override; static const std::string& stack_element(int n) { return module_stack[n]; }; static int stack_size() { return module_stack.size(); }; std::string name; AssignmentList definition_arguments; LocalScope scope; private: static std::vector module_stack; }; openscad-2019.05/src/WindowManager.cc0000644000076500000240000000057213402025764017746 0ustar kintelstaff00000000000000#include "WindowManager.h" #include "MainWindow.h" WindowManager::WindowManager() { } WindowManager::~WindowManager() { } void WindowManager::add(MainWindow *mainwin) { this->windows.insert(mainwin); } void WindowManager::remove(MainWindow *mainwin) { this->windows.remove(mainwin); } const QSet &WindowManager::getWindows() const { return this->windows; } openscad-2019.05/src/WindowManager.h0000644000076500000240000000047013402025764017605 0ustar kintelstaff00000000000000#pragma once #include #include class WindowManager : public QObject { Q_OBJECT public: WindowManager(); ~WindowManager(); void add(class MainWindow *mainwin); void remove(class MainWindow *mainwin); const QSet &getWindows() const; private: QSet windows; }; openscad-2019.05/src/annotation.cc0000644000076500000240000000323713402025764017357 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "annotation.h" #include "expression.h" #include "context.h" Annotation::Annotation(const std::string &name, shared_ptr expr) : name(name), expr(expr) { } Annotation::~Annotation() { } ValuePtr Annotation::evaluate(class Context *ctx) const { return this->expr->evaluate(ctx); } const std::string & Annotation::getName() const { return name; } void Annotation::print(std::ostream &stream, const std::string &indent) const { stream << indent << "//" << name << "(" << *this->expr << ")" << std::endl; } openscad-2019.05/src/annotation.h0000644000076500000240000000107313402025764017215 0ustar kintelstaff00000000000000#pragma once #include #include #include "memory.h" #include "value.h" class Annotation { public: Annotation(const std::string &name, shared_ptr expr); virtual ~Annotation(); virtual void print(std::ostream &stream, const std::string &indent) const; const std::string &getName() const; virtual ValuePtr evaluate(class Context *ctx) const; private: std::string name; shared_ptr expr; }; typedef std::vector AnnotationList; typedef std::unordered_map AnnotationMap; openscad-2019.05/src/boost-utils.cc0000644000076500000240000000754013402025764017472 0ustar kintelstaff00000000000000#include "boosty.h" #include "boost-utils.h" #include #include namespace fs=boost::filesystem; // Will normalize the given path, i.e. remove any redundant ".." path elements. fs::path boostfs_normalize(const fs::path &path) { auto absPath = fs::absolute(path); auto it = absPath.begin(); auto result = *it; if (it != absPath.end()) it++; // Get canonical version of the existing part for (;exists(result) && it != absPath.end(); ++it) { result /= *it; } result = boosty::canonical(result.parent_path()); if (it!=absPath.begin()) it--; // For the rest remove ".." and "." in a path with no symlinks for (; it != absPath.end(); ++it) { // Just move back on ../ if (*it == "..") { result = result.parent_path(); } // Ignore "." else if (*it != ".") { // Just cat other path entries result /= *it; } } return result; } /** * https://svn.boost.org/trac/boost/ticket/1976#comment:2 * * "The idea: uncomplete(/foo/new, /foo/bar) => ../new * The use case for this is any time you get a full path (from an open dialog, perhaps) * and want to store a relative path so that the group of files can be moved to a different * directory without breaking the paths. An IDE would be a simple example, so that the * project file could be safely checked out of subversion." * * ALGORITHM: * iterate path and base * compare all elements so far of path and base * whilst they are the same, no write to output * when they change, or one runs out: * write to output, ../ times the number of remaining elements in base * write to output, the remaining elements in path */ fs::path boostfs_uncomplete(fs::path const p, fs::path const base) { if (p == base) return "./"; /*!! this breaks stuff if path is a filename rather than a directory, which it most likely is... but then base shouldn't be a filename so... */ // create absolute paths fs::path abs_p = fs::absolute(boostfs_normalize(p)); fs::path abs_base = fs::absolute(boostfs_normalize(base)); fs::path from_path, from_base, output; fs::path::iterator path_it = abs_p.begin(), path_end = abs_p.end(); fs::path::iterator base_it = abs_base.begin(), base_end = abs_base.end(); // check for emptiness if ((path_it == path_end) || (base_it == base_end)) { throw std::runtime_error("path or base was empty; couldn't generate relative path"); } #ifdef WIN32 // drive letters are different; don't generate a relative path if (*path_it != *base_it) return p; // now advance past drive letters; relative paths should only go up // to the root of the drive and not past it ++path_it, ++base_it; #endif // Cache system-dependent dot, double-dot and slash strings const std::string _dot = "."; const std::string _dots = ".."; const std::string _sep = "/"; // iterate over path and base while (true) { // compare all elements so far of path and base to find greatest common root; // when elements of path and base differ, or run out: if ((path_it == path_end) || (base_it == base_end) || (*path_it != *base_it)) { // write to output, ../ times the number of remaining elements in base; // this is how far we've had to come down the tree from base to get to the common root for (; base_it != base_end; ++base_it) { if (*base_it == _dot) continue; else if (*base_it == _sep) continue; output /= "../"; } // write to output, the remaining elements in path; // this is the path relative from the common root fs::path::iterator path_it_start = path_it; for (; path_it != path_end; ++path_it) { if (path_it != path_it_start) output /= "/"; if (*path_it == _dot) continue; if (*path_it == _sep) continue; output /= *path_it; } break; } // add directory level to both paths and continue iteration from_path /= fs::path(*path_it); from_base /= fs::path(*base_it); ++path_it, ++base_it; } return output; } openscad-2019.05/src/boost-utils.h0000644000076500000240000000262113414444607017333 0ustar kintelstaff00000000000000#pragma once #include #include "printutils.h" namespace fs = boost::filesystem; fs::path boostfs_normalize(const fs::path &path); fs::path boostfs_uncomplete(fs::path const p, fs::path const base); #include #include /* Convert number types but print WARNING for failures during conversion. This is useful for situations where it is important to not fail silently during casting or conversion. (For example, accidentally converting 64 bit types to 32 bit types, float to int, etc). For positive overflow, return max of Tout template type For negative overflow, return min of Tout template type On other conversion failures, return 0. */ template Tout boost_numeric_cast( Tin input ) { Tout result = 0; std::ostringstream status; status.str("ok"); try { result = boost::numeric_cast(input); } catch (boost::numeric::negative_overflow& e) { status << e.what(); result = std::numeric_limits::min(); } catch (boost::numeric::positive_overflow& e) { status << e.what(); result = std::numeric_limits::max(); } catch (boost::numeric::bad_numeric_cast& e) { status << e.what(); result = 0; } if (status.str() != "ok") { PRINTB("WARNING: problem converting this number: %s", std::to_string(input)); PRINTB("WARNING: %s", status.str()); PRINTB("WARNING: setting result to %u", result); } return result; } openscad-2019.05/src/boosty.h0000644000076500000240000000450613402025764016366 0ustar kintelstaff00000000000000// boosty.h by don bright 2012. Copyright assigned to Marius Kintel and // Clifford Wolf 2012. Released under the GPL 2, or later, as described in // the file named 'COPYING' in OpenSCAD's project root. #pragma once /* boosty is a wrapper around boost so that OpenSCAD can work with old versions of boost found on popular versions of linux, circa early 2012. design the boost filsystem changed around 1.46-1.48. we do a large #ifdef based on boost version that wraps various functions appropriately. in a few years, this file should be deleted as unnecessary. see also http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/index.htm http://www.boost.org/doc/libs/1_45_0/libs/filesystem/v2/doc/index.htm http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/index.htm http://www.boost.org/doc/libs/1_35_0/libs/filesystem/doc/index.htm include/boost/wave/util/filesystem_compatability.hpp */ #include #include #include #include namespace fs = boost::filesystem; #include "printutils.h" namespace boosty { #if BOOST_VERSION >= 104800 inline fs::path canonical( fs::path p, fs::path p2 ) { return fs::canonical( p, p2 ); } inline fs::path canonical( fs::path p ) { return fs::canonical( p ); } #else inline fs::path canonical( fs::path p, fs::path p2 ) { #if defined (__WIN32__) || defined(__APPLE__) #error you should be using a newer version of boost on win/mac #endif // based on the code in boost fs::path result; if (p=="") p=p2; std::string result_s; std::vector resultv, pieces; std::vector::iterator pi; std::string tmps = p.generic_string(); boost::split( pieces, tmps, boost::is_any_of("/") ); for ( pi = pieces.begin(); pi != pieces.end(); ++pi ) { if (*pi == "..") resultv.erase( resultv.end() ); else resultv.push_back( *pi ); } for ( pi = resultv.begin(); pi != resultv.end(); ++pi ) { if ((*pi).length()>0) result_s = result_s + "/" + *pi; } result = fs::path( result_s ); if (fs::is_symlink(result)) { PRINT("WARNING: canonical() wrapper can't do symlinks. rebuild openscad with boost >=1.48"); PRINT("WARNING: or don't use symbolic links"); } return result; } inline fs::path canonical( fs::path p ) { return canonical( p, fs::current_path() ); } #endif } // namespace openscad-2019.05/src/builtin.cc0000644000076500000240000000624713402025764016657 0ustar kintelstaff00000000000000#include "builtin.h" #include "function.h" #include "module.h" #include "expression.h" Builtins *Builtins::instance(bool erase) { static Builtins *builtins = new Builtins; if (erase) { delete builtins; builtins = nullptr; } return builtins; } void Builtins::init(const std::string &name, class AbstractModule *module) { #ifndef ENABLE_EXPERIMENTAL if (module->is_experimental()) return; #endif Builtins::instance()->modules.emplace(name, module); } void Builtins::init(const std::string &name, class AbstractFunction *function) { #ifndef ENABLE_EXPERIMENTAL if (function->is_experimental()) return; #endif Builtins::instance()->functions.emplace(name, function); } extern void register_builtin_functions(); extern void register_builtin_group(); extern void register_builtin_csgops(); extern void register_builtin_transform(); extern void register_builtin_color(); extern void register_builtin_primitives(); extern void register_builtin_surface(); extern void register_builtin_control(); extern void register_builtin_render(); extern void register_builtin_import(); extern void register_builtin_projection(); extern void register_builtin_cgaladv(); extern void register_builtin_offset(); extern void register_builtin_dxf_linear_extrude(); extern void register_builtin_dxf_rotate_extrude(); extern void register_builtin_text(); extern void initialize_builtin_dxf_dim(); /*! Registers all builtin functions. Call once for the whole app. */ void Builtins::initialize() { register_builtin_functions(); initialize_builtin_dxf_dim(); register_builtin_group(); register_builtin_csgops(); register_builtin_transform(); register_builtin_color(); register_builtin_primitives(); register_builtin_surface(); register_builtin_control(); register_builtin_render(); register_builtin_import(); register_builtin_projection(); register_builtin_cgaladv(); register_builtin_offset(); register_builtin_dxf_linear_extrude(); register_builtin_dxf_rotate_extrude(); register_builtin_text(); this->deprecations.emplace("dxf_linear_extrude", "linear_extrude()"); this->deprecations.emplace("dxf_rotate_extrude", "rotate_extrude()"); this->deprecations.emplace("import_stl", "import()"); this->deprecations.emplace("import_dxf", "import()"); this->deprecations.emplace("import_off", "import()"); this->deprecations.emplace("assign", "a regular assignment"); } std::string Builtins::isDeprecated(const std::string &name) const { if (this->deprecations.find(name) != this->deprecations.end()) { return this->deprecations.at(name); } return {}; } Builtins::Builtins() { this->assignments.emplace_back("$fn", make_shared(0.0)); this->assignments.emplace_back("$fs", make_shared(2.0)); this->assignments.emplace_back("$fa", make_shared(12.0)); this->assignments.emplace_back("$t", make_shared(0.0)); this->assignments.emplace_back("$preview", make_shared(ValuePtr::undefined)); //undef as should always be overwritten. Value::VectorType zero3{0.0, 0.0, 0.0}; this->assignments.emplace_back("$vpt", make_shared(zero3)); this->assignments.emplace_back("$vpr", make_shared(zero3)); this->assignments.emplace_back("$vpd", make_shared(500)); } openscad-2019.05/src/builtin.h0000644000076500000240000000176113402025764016515 0ustar kintelstaff00000000000000#pragma once #include #include #include "module.h" #include "localscope.h" #include "Assignment.h" class Builtins { public: using FunctionContainer = std::unordered_map; using ModuleContainer = std::unordered_map; static Builtins *instance(bool erase = false); static void init(const std::string &name, class AbstractModule *module); static void init(const std::string &name, class AbstractFunction *function); void initialize(); std::string isDeprecated(const std::string &name) const; const AssignmentList &getAssignments() const { return this->assignments; } const FunctionContainer &getFunctions() const { return this->functions; } const ModuleContainer &getModules() const { return modules; } private: Builtins(); ~Builtins() = default; AssignmentList assignments; FunctionContainer functions; ModuleContainer modules; std::unordered_map deprecations; }; openscad-2019.05/src/builtincontext.cc0000644000076500000240000000341513414440264020255 0ustar kintelstaff00000000000000#include "builtincontext.h" #include "builtin.h" #include "expression.h" #include "function.h" #include "ModuleInstantiation.h" #include "printutils.h" #include "evalcontext.h" BuiltinContext::BuiltinContext() { for(const auto &ass : Builtins::instance()->getAssignments()) { this->set_variable(ass.name, ass.expr->evaluate(this)); } this->set_constant("PI", ValuePtr(M_PI)); } ValuePtr BuiltinContext::evaluate_function(const std::string &name, const EvalContext *evalctx) const { const auto &search = Builtins::instance()->getFunctions().find(name); if (search != Builtins::instance()->getFunctions().end()) { AbstractFunction *f = search->second; if (f->is_enabled()) return f->evaluate(this, evalctx); else PRINTB("WARNING: Experimental builtin function '%s' is not enabled, %s", name % evalctx->loc.toRelativeString(this->documentPath())); } return Context::evaluate_function(name, evalctx); } class AbstractNode *BuiltinContext::instantiate_module(const class ModuleInstantiation &inst, EvalContext *evalctx) const { const std::string &name = inst.name(); const auto &search = Builtins::instance()->getModules().find(name); if (search != Builtins::instance()->getModules().end()) { AbstractModule *m = search->second; if (!m->is_enabled()) { PRINTB("WARNING: Experimental builtin module '%s' is not enabled, %s", name % evalctx->loc.toRelativeString(this->documentPath())); } std::string replacement = Builtins::instance()->instance()->isDeprecated(name); if (!replacement.empty()) { PRINT_DEPRECATION("The %s() module will be removed in future releases. Use %s instead. %s", name % replacement % evalctx->loc.toRelativeString(this->documentPath())); } return m->instantiate(this, &inst, evalctx); } return Context::instantiate_module(inst, evalctx); } openscad-2019.05/src/builtincontext.h0000644000076500000240000000055213414440264020116 0ustar kintelstaff00000000000000#pragma once #include #include "context.h" class BuiltinContext : public Context { public: BuiltinContext(); ~BuiltinContext() {} ValuePtr evaluate_function(const std::string &name, const EvalContext *evalctx) const override; class AbstractNode *instantiate_module(const class ModuleInstantiation &inst, EvalContext *evalctx) const override; }; openscad-2019.05/src/cache.h0000644000076500000240000001213013433421332016075 0ustar kintelstaff00000000000000/**************************************************************************** ** ** OpenSCAD (www.openscad.org) ** Copyright (C) 2009-2011 Clifford Wolf and ** Marius Kintel ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #pragma once #include #include #include "printutils.h" template class Cache { struct Node { inline Node() : keyPtr(nullptr), t(nullptr), c(0), p(nullptr), n(nullptr) {} inline Node(T *data, size_t cost) : keyPtr(nullptr), t(data), c(cost), p(nullptr), n(nullptr) {} const Key *keyPtr; T *t; size_t c; Node *p,*n; }; typedef typename std::unordered_map map_type; typedef typename map_type::iterator iterator_type; typedef typename map_type::value_type value_type; std::unordered_map hash; Node *f, *l; void *unused; size_t mx, total; inline void unlink(Node &n) { if (n.p) n.p->n = n.n; if (n.n) n.n->p = n.p; if (l == &n) l = n.p; if (f == &n) f = n.n; total -= n.c; T *obj = n.t; hash.erase(*n.keyPtr); delete obj; } inline T *relink(const Key &key) { iterator_type i = hash.find(key); if (i == hash.end()) return nullptr; Node &n = i->second; if (f != &n) { if (n.p) n.p->n = n.n; if (n.n) n.n->p = n.p; if (l == &n) l = n.p; n.p = nullptr; n.n = f; f->p = &n; f = &n; } return n.t; } public: inline explicit Cache(size_t maxCost = 100) : f(nullptr), l(nullptr), unused(nullptr), mx(maxCost), total(0) { } inline ~Cache() { clear(); } inline size_t maxCost() const { return mx; } void setMaxCost(size_t m) { mx = m; trim(mx); } inline size_t totalCost() const { return total; } inline size_t size() const { return hash.size(); } inline bool empty() const { return hash.empty(); } void clear() { while (f) { delete f->t; f = f->n; } hash.clear(); l = nullptr; total = 0; } bool insert(const Key &key, T *object, size_t cost); T *object(const Key &key) const { return const_cast*>(this)->relink(key); } inline bool contains(const Key &key) const { return hash.find(key) != hash.end(); } T *operator[](const Key &key) const { return object(key); } bool remove(const Key &key); T *take(const Key &key); private: void trim(size_t m); }; template inline bool Cache::remove(const Key &key) { iterator_type i = hash.find(key); if (i == hash.end()) { return false; } else { unlink(i->second); return true; } } template inline T *Cache::take(const Key &key) { iterator_type i = hash.find(key); if (i == hash.end()) return 0; Node &n = *i; T *t = n.t; n.t = 0; unlink(n); return t; } template bool Cache::insert(const Key &akey, T *aobject, size_t acost) { remove(akey); if (acost > mx) { delete aobject; return false; } trim(mx - acost); Node node(aobject, acost); hash[akey] = node; iterator_type i = hash.find(akey); total += acost; Node *n = &i->second; n->keyPtr = &i->first; if (f) f->p = n; n->n = f; f = n; if (!l) l = f; return true; } template void Cache::trim(size_t m) { Node *n = l; while (n && total > m) { Node *u = n; n = n->p; #ifdef DEBUG PRINTB("Trimming cache: %1% (%2% bytes)", u->keyPtr->substr(0, 40) % u->c); #endif unlink(*u); } } openscad-2019.05/src/calc.cc0000644000076500000240000000331713402025764016106 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "calc.h" #include "grid.h" #include /*! Returns the number of subdivision of a whole circle, given radius and the three special variables $fn, $fs and $fa */ int Calc::get_fragments_from_r(double r, double fn, double fs, double fa) { // FIXME: It would be better to refuse to create an object. Let's do more strict error handling // in future versions of OpenSCAD if (r < GRID_FINE || std::isinf(fn) || std::isnan(fn)) return 3; if (fn > 0.0) return static_cast(fn >= 3 ? fn : 3); return static_cast(ceil(fmax(fmin(360.0 / fa, r*2*M_PI / fs), 5))); } openscad-2019.05/src/calc.h0000644000076500000240000000014713402025764015746 0ustar kintelstaff00000000000000#pragma once namespace Calc { int get_fragments_from_r(double r, double fn, double fs, double fa); } openscad-2019.05/src/cgal.h0000644000076500000240000000501413437640540015753 0ustar kintelstaff00000000000000#pragma once #ifdef ENABLE_CGAL // NDEBUG must be disabled when including CGAL headers, otherwise CGAL assertions // will not be thrown, causing OpenSCAD's CGAL error checking to fail. // To be on the safe side, this has to be done when including any CGAL header file. // FIXME: It might be possible to rewrite the error checking to get rid of this // requirement. kintel 20111206. #pragma push_macro("NDEBUG") #undef NDEBUG #include "ext/CGAL/CGAL_workaround_Mark_bounded_volumes.h" // This file must be included prior to CGAL/Nef_polyhedron_3.h #include #include #include #include #include #include #include "ext/CGAL/CGAL_Nef3_workaround.h" #include #include #include #include #include #include #include #include #include #include #pragma pop_macro("NDEBUG") typedef CGAL::Gmpq NT2; typedef CGAL::Extended_cartesian CGAL_Kernel2; typedef CGAL::Nef_polyhedron_2 CGAL_Nef_polyhedron2; typedef CGAL_Kernel2::Aff_transformation_2 CGAL_Aff_transformation2; typedef CGAL::Exact_predicates_exact_constructions_kernel CGAL_ExactKernel2; typedef CGAL::Polygon_2 CGAL_Poly2; typedef CGAL::Polygon_with_holes_2 CGAL_Poly2h; typedef CGAL::Gmpq NT3; typedef CGAL::Cartesian CGAL_Kernel3; //typedef CGAL::Exact_predicates_exact_constructions_kernel::FT NT3; //typedef CGAL::Exact_predicates_exact_constructions_kernel CGAL_Kernel3; typedef CGAL::Nef_polyhedron_3 CGAL_Nef_polyhedron3; typedef CGAL_Nef_polyhedron3::Aff_transformation_3 CGAL_Aff_transformation; typedef CGAL::Polyhedron_3 CGAL_Polyhedron; typedef CGAL::Point_3 CGAL_Point_3; typedef CGAL::Triangle_3 CGAL_Triangle_3; typedef CGAL::Iso_cuboid_3 CGAL_Iso_cuboid_3; typedef std::vector CGAL_Polygon_3; // CGAL_Nef_polyhedron2 uses CGAL_Kernel2, but Iso_rectangle_2 needs to match // CGAL_Nef_polyhedron2::Explorer::Point which is different than // CGAL_Kernel2::Point. Hence the suffix 'e' typedef CGAL_Nef_polyhedron2::Explorer::Point CGAL_Point_2e; typedef CGAL::Iso_rectangle_2> CGAL_Iso_rectangle_2e; #endif /* ENABLE_CGAL */ openscad-2019.05/src/cgaladv.cc0000644000076500000240000001076213445050256016610 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "cgaladvnode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "builtin.h" #include "polyset.h" #include #include #include using namespace boost::assign; // bring 'operator+=()' into scope class CgaladvModule : public AbstractModule { public: CgaladvType type; CgaladvModule(CgaladvType type) : type(type) { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *CgaladvModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new CgaladvNode(inst, type); AssignmentList args; if (type == CgaladvType::MINKOWSKI) args += Assignment("convexity"); if (type == CgaladvType::RESIZE) args += Assignment("newsize"), Assignment("auto"); Context c(ctx); c.setVariables(evalctx, args); inst->scope.apply(*evalctx); auto convexity = ValuePtr::undefined; auto path = ValuePtr::undefined; if (type == CgaladvType::MINKOWSKI) { convexity = c.lookup_variable("convexity", true); } if (type == CgaladvType::RESIZE) { auto ns = c.lookup_variable("newsize"); node->newsize << 0,0,0; if ( ns->type() == Value::ValueType::VECTOR ) { const Value::VectorType &vs = ns->toVector(); if ( vs.size() >= 1 ) node->newsize[0] = vs[0]->toDouble(); if ( vs.size() >= 2 ) node->newsize[1] = vs[1]->toDouble(); if ( vs.size() >= 3 ) node->newsize[2] = vs[2]->toDouble(); } auto autosize = c.lookup_variable("auto"); node->autosize << false, false, false; if ( autosize->type() == Value::ValueType::VECTOR ) { const Value::VectorType &va = autosize->toVector(); if ( va.size() >= 1 ) node->autosize[0] = va[0]->toBool(); if ( va.size() >= 2 ) node->autosize[1] = va[1]->toBool(); if ( va.size() >= 3 ) node->autosize[2] = va[2]->toBool(); } else if ( autosize->type() == Value::ValueType::BOOL ) { node->autosize << autosize->toBool(),autosize->toBool(),autosize->toBool(); } } node->convexity = static_cast(convexity->toDouble()); node->path = path; auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string CgaladvNode::name() const { switch (this->type) { case CgaladvType::MINKOWSKI: return "minkowski"; break; case CgaladvType::HULL: return "hull"; break; case CgaladvType::RESIZE: return "resize"; break; default: assert(false); } return "internal_error"; } std::string CgaladvNode::toString() const { std::ostringstream stream; stream << this->name(); switch (type) { case CgaladvType::MINKOWSKI: stream << "(convexity = " << this->convexity << ")"; break; case CgaladvType::HULL: stream << "()"; break; case CgaladvType::RESIZE: stream << "(newsize = [" << this->newsize[0] << "," << this->newsize[1] << "," << this->newsize[2] << "]" << ", auto = [" << this->autosize[0] << "," << this->autosize[1] << "," << this->autosize[2] << "]" << ")"; break; default: assert(false); } return stream.str(); } void register_builtin_cgaladv() { Builtins::init("minkowski", new CgaladvModule(CgaladvType::MINKOWSKI)); Builtins::init("hull", new CgaladvModule(CgaladvType::HULL)); Builtins::init("resize", new CgaladvModule(CgaladvType::RESIZE)); } openscad-2019.05/src/cgaladvnode.h0000644000076500000240000000101113445050256017303 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "value.h" #include "linalg.h" enum class CgaladvType { MINKOWSKI, HULL, RESIZE }; class CgaladvNode : public AbstractNode { public: VISITABLE(); CgaladvNode(const ModuleInstantiation *mi, CgaladvType type) : AbstractNode(mi), type(type) { convexity = 1; } ~CgaladvNode() { } std::string toString() const override; std::string name() const override; ValuePtr path; unsigned int convexity; Vector3d newsize; Eigen::Matrix autosize; CgaladvType type; }; openscad-2019.05/src/cgalfwd.h0000644000076500000240000000252313402025764016453 0ustar kintelstaff00000000000000#pragma once #ifndef CGAL_FORWARD #include "cgal.h" #else #ifdef ENABLE_CGAL #include namespace CGAL { class Gmpq; template class Extended_cartesian; class HDS_items; template class Nef_polyhedron_2; } typedef CGAL::Gmpq NT; typedef CGAL::Extended_cartesian CGAL_Kernel2; typedef CGAL::Nef_polyhedron_2 CGAL_Nef_polyhedron2; namespace CGAL { template class Cartesian; template struct Default_items; class SNC_indexed_items; template class Nef_polyhedron_3; } typedef CGAL::Cartesian CGAL_Kernel3; typedef CGAL::Nef_polyhedron_3 CGAL_Nef_polyhedron3; namespace CGAL { #ifndef CGAL_ALLOCATOR # define CGAL_ALLOCATOR(T) std::allocator< T > #endif class HalfedgeDS_items_2; template class HalfedgeDS_default; class Polyhedron_items_3; template class Polyhedron_3; } typedef CGAL::Polyhedron_3, CGAL_ALLOCATOR(int)> CGAL_Polyhedron; #endif /* ENABLE_CGAL */ #endif openscad-2019.05/src/cgalutils-applyops.cc0000644000076500000240000003300413437640540021037 0ustar kintelstaff00000000000000// this file is split into many separate cgalutils* files // in order to workaround gcc 4.9.1 crashing on systems with only 2GB of RAM #ifdef ENABLE_CGAL #include "cgalutils.h" #include "polyset.h" #include "printutils.h" #include "Polygon2d.h" #include "polyset-utils.h" #include "grid.h" #include "node.h" #include "cgal.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #include // Apply CGAL bugfix for CGAL-4.5.x #if CGAL_VERSION_NR > CGAL_VERSION_NUMBER(4,5,1) || CGAL_VERSION_NR < CGAL_VERSION_NUMBER(4,5,0) #include #else #include "ext/CGAL/convex_hull_3_bugfix.h" #endif #pragma pop_macro("NDEBUG") #include "svg.h" #include "Reindexer.h" #include "GeometryUtils.h" #include #include #include namespace CGALUtils { template bool is_weakly_convex(Polyhedron const& p) { for (typename Polyhedron::Edge_const_iterator i = p.edges_begin(); i != p.edges_end(); ++i) { typename Polyhedron::Plane_3 p(i->opposite()->vertex()->point(), i->vertex()->point(), i->next()->vertex()->point()); if (p.has_on_positive_side(i->opposite()->next()->vertex()->point()) && CGAL::squared_distance(p, i->opposite()->next()->vertex()->point()) > 1e-8) { return false; } } // Also make sure that there is only one shell: std::unordered_set visited; // c++11 // visited.reserve(p.size_of_facets()); std::queue to_explore; to_explore.push(p.facets_begin()); // One arbitrary facet visited.insert(to_explore.front()); while (!to_explore.empty()) { typename Polyhedron::Facet_const_handle f = to_explore.front(); to_explore.pop(); typename Polyhedron::Facet::Halfedge_around_facet_const_circulator he, end; end = he = f->facet_begin(); CGAL_For_all(he,end) { typename Polyhedron::Facet_const_handle o = he->opposite()->facet(); if (!visited.count(o)) { visited.insert(o); to_explore.push(o); } } } return visited.size() == p.size_of_facets(); } /*! Applies op to all children and returns the result. The child list should be guaranteed to contain non-NULL 3D or empty Geometry objects */ CGAL_Nef_polyhedron *applyOperator(const Geometry::Geometries &children, OpenSCADOperator op) { CGAL_Nef_polyhedron *N = nullptr; CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { // Speeds up n-ary union operations significantly CGAL::Nef_nary_union_3 nary_union; int nary_union_num_inserted = 0; for(const auto &item : children) { const shared_ptr &chgeom = item.second; shared_ptr chN = dynamic_pointer_cast(chgeom); if (!chN) { const PolySet *chps = dynamic_cast(chgeom.get()); if (chps) chN.reset(createNefPolyhedronFromGeometry(*chps)); } if (op == OpenSCADOperator::UNION) { if (!chN->isEmpty()) { // nary_union.add_polyhedron() can issue assertion errors: // https://github.com/openscad/openscad/issues/802 nary_union.add_polyhedron(*chN->p3); nary_union_num_inserted++; } continue; } // Initialize N with first expected geometric object if (!N) { N = new CGAL_Nef_polyhedron(*chN); continue; } // Intersecting something with nothing results in nothing if (chN->isEmpty()) { if (op == OpenSCADOperator::INTERSECTION) *N = *chN; continue; } // empty op => empty if (N->isEmpty()) continue; switch (op) { case OpenSCADOperator::INTERSECTION: *N *= *chN; break; case OpenSCADOperator::DIFFERENCE: *N -= *chN; break; case OpenSCADOperator::MINKOWSKI: N->minkowski(*chN); break; default: PRINTB("ERROR: Unsupported CGAL operator: %d", static_cast(op)); } item.first->progress_report(); } if (op == OpenSCADOperator::UNION && nary_union_num_inserted > 0) { N = new CGAL_Nef_polyhedron(new CGAL_Nef_polyhedron3(nary_union.get_union())); } } // union && difference assert triggered by testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad and testdata/scad/bugs/issue204.scad catch (const CGAL::Failure_exception &e) { std::string opstr = op == OpenSCADOperator::INTERSECTION ? "intersection" : op == OpenSCADOperator::DIFFERENCE ? "difference" : op == OpenSCADOperator::UNION ? "union" : "UNKNOWN"; PRINTB("ERROR: CGAL error in CGALUtils::applyBinaryOperator %s: %s", opstr % e.what()); } CGAL::set_error_behaviour(old_behaviour); return N; } bool applyHull(const Geometry::Geometries &children, PolySet &result) { typedef CGAL::Epick K; // Collect point cloud // NB! CGAL's convex_hull_3() doesn't like std::set iterators, so we use a list // instead. std::list points; for(const auto &item : children) { const shared_ptr &chgeom = item.second; const CGAL_Nef_polyhedron *N = dynamic_cast(chgeom.get()); if (N) { if (!N->isEmpty()) { for (CGAL_Nef_polyhedron3::Vertex_const_iterator i = N->p3->vertices_begin(); i != N->p3->vertices_end(); ++i) { points.push_back(vector_convert(i->point())); } } } else { const PolySet *ps = dynamic_cast(chgeom.get()); if (ps) { for(const auto &p : ps->polygons) { for(const auto &v : p) { points.push_back(K::Point_3(v[0], v[1], v[2])); } } } } } if (points.size() <= 3) return false; // Apply hull bool success = false; if (points.size() >= 4) { CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CGAL::Polyhedron_3 r; CGAL::convex_hull_3(points.begin(), points.end(), r); PRINTDB("After hull vertices: %d", r.size_of_vertices()); PRINTDB("After hull facets: %d", r.size_of_facets()); PRINTDB("After hull closed: %d", r.is_closed()); PRINTDB("After hull valid: %d", r.is_valid()); success = !createPolySetFromPolyhedron(r, result); } catch (const CGAL::Failure_exception &e) { PRINTB("ERROR: CGAL error in applyHull(): %s", e.what()); } CGAL::set_error_behaviour(old_behaviour); } return success; } /*! children cannot contain nullptr objects */ Geometry const * applyMinkowski(const Geometry::Geometries &children) { CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); CGAL::Timer t,t_tot; assert(children.size() >= 2); Geometry::Geometries::const_iterator it = children.begin(); t_tot.start(); Geometry const* operands[2] = {it->second.get(), nullptr}; try { while (++it != children.end()) { operands[1] = it->second.get(); typedef CGAL::Epick Hull_kernel; std::list P[2]; std::list> result_parts; for (size_t i = 0; i < 2; i++) { CGAL_Polyhedron poly; const PolySet * ps = dynamic_cast(operands[i]); const CGAL_Nef_polyhedron * nef = dynamic_cast(operands[i]); if (ps) CGALUtils::createPolyhedronFromPolySet(*ps, poly); else if (nef && nef->p3->is_simple()) nefworkaround::convert_to_Polyhedron(*nef->p3, poly); else throw 0; if ((ps && ps->is_convex()) || (!ps && is_weakly_convex(poly))) { PRINTDB("Minkowski: child %d is convex and %s",i % (ps?"PolySet":"Nef")); P[i].push_back(poly); } else { CGAL_Nef_polyhedron3 decomposed_nef; if (ps) { PRINTDB("Minkowski: child %d is nonconvex PolySet, transforming to Nef and decomposing...", i); CGAL_Nef_polyhedron *p = createNefPolyhedronFromGeometry(*ps); if (!p->isEmpty()) decomposed_nef = *p->p3; delete p; } else { PRINTDB("Minkowski: child %d is nonconvex Nef, decomposing...",i); decomposed_nef = *nef->p3; } t.start(); CGAL::convex_decomposition_3(decomposed_nef); // the first volume is the outer volume, which ignored in the decomposition CGAL_Nef_polyhedron3::Volume_const_iterator ci = ++decomposed_nef.volumes_begin(); for(; ci != decomposed_nef.volumes_end(); ++ci) { if(ci->mark()) { CGAL_Polyhedron poly; decomposed_nef.convert_inner_shell_to_polyhedron(ci->shells_begin(), poly); P[i].push_back(poly); } } PRINTDB("Minkowski: decomposed into %d convex parts", P[i].size()); t.stop(); PRINTDB("Minkowski: decomposition took %f s", t.time()); } } std::vector points[2]; std::vector minkowski_points; for (size_t i = 0; i < P[0].size(); i++) { for (size_t j = 0; j < P[1].size(); j++) { t.start(); points[0].clear(); points[1].clear(); for (int k = 0; k < 2; k++) { std::list::iterator it = P[k].begin(); std::advance(it, k==0?i:j); CGAL_Polyhedron const& poly = *it; points[k].reserve(poly.size_of_vertices()); for (CGAL_Polyhedron::Vertex_const_iterator pi = poly.vertices_begin(); pi != poly.vertices_end(); ++pi) { CGAL_Polyhedron::Point_3 const& p = pi->point(); points[k].push_back(Hull_kernel::Point_3(to_double(p[0]),to_double(p[1]),to_double(p[2]))); } } minkowski_points.clear(); minkowski_points.reserve(points[0].size() * points[1].size()); for (size_t i = 0; i < points[0].size(); i++) { for (size_t j = 0; j < points[1].size(); j++) { minkowski_points.push_back(points[0][i]+(points[1][j]-CGAL::ORIGIN)); } } if (minkowski_points.size() <= 3) { t.stop(); continue; } CGAL::Polyhedron_3 result; t.stop(); PRINTDB("Minkowski: Point cloud creation (%d ⨉ %d -> %d) took %f ms", points[0].size() % points[1].size() % minkowski_points.size() % (t.time()*1000)); t.reset(); t.start(); CGAL::convex_hull_3(minkowski_points.begin(), minkowski_points.end(), result); std::vector strict_points; strict_points.reserve(minkowski_points.size()); for (CGAL::Polyhedron_3::Vertex_iterator i = result.vertices_begin(); i != result.vertices_end(); ++i) { Hull_kernel::Point_3 const& p = i->point(); CGAL::Polyhedron_3::Vertex::Halfedge_handle h,e; h = i->halfedge(); e = h; bool collinear = false; bool coplanar = true; do { Hull_kernel::Point_3 const& q = h->opposite()->vertex()->point(); if (coplanar && !CGAL::coplanar(p,q, h->next_on_vertex()->opposite()->vertex()->point(), h->next_on_vertex()->next_on_vertex()->opposite()->vertex()->point())) { coplanar = false; } for (CGAL::Polyhedron_3::Vertex::Halfedge_handle j = h->next_on_vertex(); j != h && !collinear && ! coplanar; j = j->next_on_vertex()) { Hull_kernel::Point_3 const& r = j->opposite()->vertex()->point(); if (CGAL::collinear(p,q,r)) { collinear = true; } } h = h->next_on_vertex(); } while (h != e && !collinear); if (!collinear && !coplanar) strict_points.push_back(p); } result.clear(); CGAL::convex_hull_3(strict_points.begin(), strict_points.end(), result); t.stop(); PRINTDB("Minkowski: Computing convex hull took %f s", t.time()); t.reset(); result_parts.push_back(result); } } if (it != boost::next(children.begin())) delete operands[0]; if (result_parts.size() == 1) { PolySet *ps = new PolySet(3,true); createPolySetFromPolyhedron(*result_parts.begin(), *ps); operands[0] = ps; } else if (!result_parts.empty()) { t.start(); PRINTDB("Minkowski: Computing union of %d parts",result_parts.size()); Geometry::Geometries fake_children; for (std::list>::iterator i = result_parts.begin(); i != result_parts.end(); ++i) { PolySet ps(3,true); createPolySetFromPolyhedron(*i, ps); fake_children.push_back(std::make_pair((const AbstractNode*)nullptr, shared_ptr(createNefPolyhedronFromGeometry(ps)))); } CGAL_Nef_polyhedron *N = CGALUtils::applyOperator(fake_children, OpenSCADOperator::UNION); // FIXME: This should really never throw. // Assert once we figured out what went wrong with issue #1069? if (!N) throw 0; t.stop(); PRINTDB("Minkowski: Union done: %f s",t.time()); t.reset(); operands[0] = N; } else { operands[0] = new CGAL_Nef_polyhedron(); } } t_tot.stop(); PRINTDB("Minkowski: Total execution time %f s", t_tot.time()); t_tot.reset(); CGAL::set_error_behaviour(old_behaviour); return operands[0]; } catch (...) { // If anything throws we simply fall back to Nef Minkowski PRINTD("Minkowski: Falling back to Nef Minkowski"); CGAL_Nef_polyhedron *N = applyOperator(children, OpenSCADOperator::MINKOWSKI); CGAL::set_error_behaviour(old_behaviour); return N; } } }; // namespace CGALUtils #endif // ENABLE_CGAL openscad-2019.05/src/cgalutils-polyhedron.cc0000644000076500000240000002604013445047371021357 0ustar kintelstaff00000000000000#ifdef ENABLE_CGAL #include "cgalutils.h" #include "polyset.h" #include "printutils.h" #include "polyset-utils.h" #include "grid.h" #include "cgal.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") #include #undef GEN_SURFACE_DEBUG namespace /* anonymous */ { template class CGAL_Build_PolySet : public CGAL::Modifier_base { typedef typename Polyhedron::HalfedgeDS HDS; typedef CGAL::Polyhedron_incremental_builder_3 CGAL_Polybuilder; public: typedef typename CGAL_Polybuilder::Point_3 CGALPoint; const PolySet &ps; CGAL_Build_PolySet(const PolySet &ps) : ps(ps) { } /* Using Grid here is important for performance reasons. See following model. If we don't grid the geometry before converting to a Nef Polyhedron, the quads in the cylinders to tessellated into triangles since floating point incertainty causes the faces to not be 100% planar. The incertainty is exaggerated by the transform. This wasn't a problem earlier since we used Nef for everything, but optimizations since then has made us keep it in floating point space longer. minkowski() { cube([200, 50, 7], center = true); rotate([90,0,0]) cylinder($fn = 8, h = 1, r = 8.36, center = true); rotate([0,90,0]) cylinder($fn = 8, h = 1, r = 8.36, center = true); } */ #if 1 // Use Grid void operator()(HDS& hds) override { CGAL_Polybuilder B(hds, true); Grid3d grid(GRID_FINE); std::vector vertices; std::vector> indices; // Align all vertices to grid and build vertex array in vertices for(const auto &p : ps.polygons) { indices.push_back(std::vector()); indices.back().reserve(p.size()); for (auto v : boost::adaptors::reverse(p)) { // align v to the grid; the CGALPoint will receive the aligned vertex size_t idx = grid.align(v); if (idx == vertices.size()) { CGALPoint p(v[0], v[1], v[2]); vertices.push_back(p); } indices.back().push_back(idx); } } #ifdef GEN_SURFACE_DEBUG printf("polyhedron(faces=["); int pidx = 0; #endif B.begin_surface(vertices.size(), ps.polygons.size()); for(const auto &p : vertices) { B.add_vertex(p); } for(auto &pindices : indices) { #ifdef GEN_SURFACE_DEBUG if (pidx++ > 0) printf(","); #endif // We remove duplicate indices since there is a bug in CGAL's // Polyhedron_incremental_builder_3::test_facet() which fails to detect this std::vector::iterator last = std::unique(pindices.begin(), pindices.end()); std::advance(last, -1); if (*last != pindices.front()) last++; // In case the first & last are equal pindices.erase(last, pindices.end()); if (pindices.size() >=3 && B.test_facet(pindices.begin(), pindices.end())) { B.add_facet(pindices.begin(), pindices.end()); } #ifdef GEN_SURFACE_DEBUG printf("["); int fidx = 0; for (auto i : boost::adaptors::reverse(pindices)) { if (fidx++ > 0) printf(","); printf("%ld", i); } printf("]"); #endif } B.end_surface(); #ifdef GEN_SURFACE_DEBUG printf("],\n"); #endif #ifdef GEN_SURFACE_DEBUG printf("points=["); for (int i=0;i 0) printf(","); const CGALPoint &p = vertices[i]; printf("[%g,%g,%g]", CGAL::to_double(p.x()), CGAL::to_double(p.y()), CGAL::to_double(p.z())); } printf("]);\n"); #endif } #else // Don't use Grid void operator()(HDS& hds) { CGAL_Polybuilder B(hds, true); Reindexer vertices; std::vector indices(3); // Estimating same # of vertices as polygons (very rough) B.begin_surface(ps.polygons.size(), ps.polygons.size()); int pidx = 0; #ifdef GEN_SURFACE_DEBUG printf("polyhedron(faces=["); #endif for(const auto &p : ps.polygons) { #ifdef GEN_SURFACE_DEBUG if (pidx++ > 0) printf(","); #endif indices.clear(); for (const auto &v, boost::adaptors::reverse(p)) { size_t s = vertices.size(); size_t idx = vertices.lookup(v); // If we added a vertex, also add it to the CGAL builder if (idx == s) B.add_vertex(CGALPoint(v[0], v[1], v[2])); indices.push_back(idx); } // We perform this test since there is a bug in CGAL's // Polyhedron_incremental_builder_3::test_facet() which // fails to detect duplicate indices bool err = false; for (std::size_t i = 0; i < indices.size(); ++i) { // check if vertex indices[i] is already in the sequence [0..i-1] for (std::size_t k = 0; k < i && !err; ++k) { if (indices[k] == indices[i]) { err = true; break; } } } if (!err && B.test_facet(indices.begin(), indices.end())) { B.add_facet(indices.begin(), indices.end()); #ifdef GEN_SURFACE_DEBUG printf("["); int fidx = 0; for(auto i : indices) { if (fidx++ > 0) printf(","); printf("%ld", i); } printf("]"); #endif } } B.end_surface(); #ifdef GEN_SURFACE_DEBUG printf("],\n"); printf("points=["); for (int vidx=0;vidx 0) printf(","); const Vector3d &v = vertices.getArray()[vidx]; printf("[%g,%g,%g]", v[0], v[1], v[2]); } printf("]);\n"); #endif } #endif }; // This code is from CGAL/demo/Polyhedron/Scene_nef_polyhedron_item.cpp // quick hacks to convert polyhedra from exact to inexact and vice-versa template struct Copy_polyhedron_to : public CGAL::Modifier_base { Copy_polyhedron_to(const Polyhedron_input& in_poly) : in_poly(in_poly) {} void operator()(typename Polyhedron_output::HalfedgeDS& out_hds) override { typedef typename Polyhedron_output::HalfedgeDS Output_HDS; CGAL::Polyhedron_incremental_builder_3 builder(out_hds); typedef typename Polyhedron_input::Vertex_const_iterator Vertex_const_iterator; typedef typename Polyhedron_input::Facet_const_iterator Facet_const_iterator; typedef typename Polyhedron_input::Halfedge_around_facet_const_circulator HFCC; builder.begin_surface(in_poly.size_of_vertices(), in_poly.size_of_facets(), in_poly.size_of_halfedges()); for (Vertex_const_iterator vi = in_poly.vertices_begin(), end = in_poly.vertices_end(); vi != end ; ++vi) { typename Polyhedron_output::Point_3 p(::CGAL::to_double(vi->point().x()), ::CGAL::to_double(vi->point().y()), ::CGAL::to_double(vi->point().z())); builder.add_vertex(p); } typedef CGAL::Inverse_index Index; Index index(in_poly.vertices_begin(), in_poly.vertices_end()); for (Facet_const_iterator fi = in_poly.facets_begin(), end = in_poly.facets_end(); fi != end; ++fi) { HFCC hc = fi->facet_begin(); HFCC hc_end = hc; // std::size_t n = circulator_size(hc); // CGAL_assertion(n >= 3); builder.begin_facet (); do { builder.add_vertex_to_facet(index[hc->vertex()]); ++hc; } while(hc != hc_end); builder.end_facet(); } builder.end_surface(); } // end operator()(..) private: const Polyhedron_input& in_poly; }; // end Copy_polyhedron_to<> } namespace CGALUtils { template void copyPolyhedron(const Polyhedron_A &poly_a, Polyhedron_B &poly_b) { Copy_polyhedron_to modifier(poly_a); poly_b.delegate(modifier); } template void copyPolyhedron(const CGAL::Polyhedron_3 &, CGAL_Polyhedron &); template void copyPolyhedron(const CGAL_Polyhedron &, CGAL::Polyhedron_3 &); template bool createPolyhedronFromPolySet(const PolySet &ps, Polyhedron &p) { bool err = false; CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CGAL_Build_PolySet builder(ps); p.delegate(builder); } catch (const CGAL::Assertion_exception &e) { PRINTB("CGAL error in CGALUtils::createPolyhedronFromPolySet: %s", e.what()); err = true; } CGAL::set_error_behaviour(old_behaviour); return err; } template bool createPolyhedronFromPolySet(const PolySet &ps, CGAL_Polyhedron &p); template bool createPolyhedronFromPolySet(const PolySet &ps, CGAL::Polyhedron_3 &p); template bool createPolySetFromPolyhedron(const Polyhedron &p, PolySet &ps) { bool err = false; typedef typename Polyhedron::Vertex Vertex; typedef typename Polyhedron::Facet_const_iterator FCI; typedef typename Polyhedron::Halfedge_around_facet_const_circulator HFCC; for (FCI fi = p.facets_begin(); fi != p.facets_end(); ++fi) { HFCC hc = fi->facet_begin(); HFCC hc_end = hc; ps.append_poly(); do { Vertex const& v = *((hc++)->vertex()); double x = CGAL::to_double(v.point().x()); double y = CGAL::to_double(v.point().y()); double z = CGAL::to_double(v.point().z()); ps.append_vertex(x, y, z); } while (hc != hc_end); } return err; } template bool createPolySetFromPolyhedron(const CGAL_Polyhedron &p, PolySet &ps); template bool createPolySetFromPolyhedron(const CGAL::Polyhedron_3 &p, PolySet &ps); template bool createPolySetFromPolyhedron(const CGAL::Polyhedron_3 &p, PolySet &ps); template bool createPolySetFromPolyhedron(const CGAL::Polyhedron_3> &p, PolySet &ps); class Polyhedron_writer { std::ostream *out; bool firstv; std::vector indices; public: Polyhedron_writer() : out(nullptr), firstv(true) {} void write_header(std::ostream &stream, std::size_t /*vertices*/, std::size_t /*halfedges*/, std::size_t /*facets*/ /*bool normals = false*/) { this->out = &stream; *out << "polyhedron(points=["; firstv = true; } void write_footer() { *out << "]);" << std::endl; } void write_vertex( const double& x, const double& y, const double& z) { *out << (firstv ? "" : ",") << '[' << x << ',' << y << ',' << z << ']'; firstv = false; } void write_facet_header() { *out << "], faces=["; firstv = true; } void write_facet_begin( std::size_t /*no*/) { *out << (firstv ? "" : ",") << '['; indices.clear(); firstv = false; } void write_facet_vertex_index( std::size_t index) { indices.push_back(index); } void write_facet_end() { bool firsti = true; for (auto i : boost::adaptors::reverse(indices)) { *out << (firsti ? "" : ",") << i; firsti = false; } *out << ']'; } }; template std::string printPolyhedron(const Polyhedron &p) { std::ostringstream sstream; sstream.precision(20); Polyhedron_writer writer; generic_print_polyhedron(sstream, p, writer); return sstream.str(); } template std::string printPolyhedron(const CGAL_Polyhedron &p); }; // namespace CGALUtils #endif /* ENABLE_CGAL */ openscad-2019.05/src/cgalutils-project.cc0000644000076500000240000002221513437640540020640 0ustar kintelstaff00000000000000// this file is split into many separate cgalutils* files // in order to workaround gcc 4.9.1 crashing on systems with only 2GB of RAM #ifdef ENABLE_CGAL #include "cgalutils.h" #include "polyset.h" #include "printutils.h" #include "Polygon2d.h" #include "polyset-utils.h" #include "grid.h" #include "node.h" #include "cgal.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #include // Apply CGAL bugfix for CGAL-4.5.x #if CGAL_VERSION_NR > CGAL_VERSION_NUMBER(4,5,1) || CGAL_VERSION_NR < CGAL_VERSION_NUMBER(4,5,0) #include #else #include "ext/CGAL/convex_hull_3_bugfix.h" #endif #pragma pop_macro("NDEBUG") #include "svg.h" #include "GeometryUtils.h" #include #include static void add_outline_to_poly(CGAL_Nef_polyhedron2::Explorer &explorer, CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator circ, CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator end, bool positive, Polygon2d *poly) { Outline2d outline; CGAL_For_all(circ, end) { if (explorer.is_standard(explorer.target(circ))) { CGAL_Nef_polyhedron2::Explorer::Point ep = explorer.point(explorer.target(circ)); outline.vertices.push_back(Vector2d(to_double(ep.x()), to_double(ep.y()))); } } if (!outline.vertices.empty()) { outline.positive = positive; poly->addOutline(outline); } } static Polygon2d *convertToPolygon2d(const CGAL_Nef_polyhedron2 &p2) { Polygon2d *poly = new Polygon2d; typedef CGAL_Nef_polyhedron2::Explorer Explorer; typedef Explorer::Face_const_iterator fci_t; typedef Explorer::Halfedge_around_face_const_circulator heafcc_t; Explorer E = p2.explorer(); for (fci_t fit = E.faces_begin(), facesend = E.faces_end(); fit != facesend; ++fit) { if (!fit->mark()) continue; heafcc_t fcirc(E.face_cycle(fit)), fend(fcirc); add_outline_to_poly(E, fcirc, fend, true, poly); for (CGAL_Nef_polyhedron2::Explorer::Hole_const_iterator j = E.holes_begin(fit);j != E.holes_end(fit); ++j) { CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator hcirc(j), hend(hcirc); add_outline_to_poly(E, hcirc, hend, false, poly); } } poly->setSanitized(true); return poly; } /* ZRemover This class converts one or more Nef3 polyhedra into a Nef2 polyhedron by stripping off the 'z' coordinates from the vertices. The resulting Nef2 poly is accumulated in the 'output_nefpoly2d' member variable. The 'z' coordinates will either be all 0s, for an xy-plane intersected Nef3, or, they will be a mixture of -eps and +eps, for a thin-box intersected Nef3. Notes on CGAL's Nef Polyhedron2: 1. The 'mark' on a 2d Nef face is important when doing unions/intersections. If the 'mark' of a face is wrong the resulting nef2 poly will be unexpected. 2. The 'mark' can be dependent on the points fed to the Nef2 constructor. This is why we iterate through the 3d faces using the halfedge cycle source()->target() instead of the ordinary source()->source(). The the latter can generate sequences of points that will fail the the CGAL::is_simple_2() test, resulting in improperly marked nef2 polys. 3. 3d facets have 'two sides'. we throw out the 'down' side to prevent dups. The class uses the 'visitor' pattern from the CGAL manual. See also http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3_ref/Class_Nef_polyhedron3.html OGL_helper.h */ class ZRemover { public: CGAL_Nef_polyhedron2::Boundary boundary; shared_ptr tmpnef2d; shared_ptr output_nefpoly2d; CGAL::Direction_3 up; ZRemover() { output_nefpoly2d.reset( new CGAL_Nef_polyhedron2() ); boundary = CGAL_Nef_polyhedron2::INCLUDED; up = CGAL::Direction_3(0,0,1); } void visit( CGAL_Nef_polyhedron3::Vertex_const_handle ) {} void visit( CGAL_Nef_polyhedron3::Halfedge_const_handle ) {} void visit( CGAL_Nef_polyhedron3::SHalfedge_const_handle ) {} void visit( CGAL_Nef_polyhedron3::SHalfloop_const_handle ) {} void visit( CGAL_Nef_polyhedron3::SFace_const_handle ) {} void visit( CGAL_Nef_polyhedron3::Halffacet_const_handle hfacet ); }; void ZRemover::visit(CGAL_Nef_polyhedron3::Halffacet_const_handle hfacet) { PRINTDB(" ",hfacet->mark()); if (hfacet->plane().orthogonal_direction() != this->up) { PRINTD(" "); PRINTD(" "); return; } // possible optimization - throw out facets that are vertically oriented CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator fci; int contour_counter = 0; CGAL_forall_facet_cycles_of(fci, hfacet) { if (fci.is_shalfedge()) { PRINTD(" "); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(fci), cend(c1); std::vector contour; CGAL_For_all(c1, cend) { CGAL_Nef_polyhedron3::Point_3 point3d = c1->source()->target()->point(); CGAL_Nef_polyhedron2::Explorer::Point point2d(CGAL::to_double(point3d.x()), CGAL::to_double(point3d.y())); contour.push_back(point2d); } if (contour.size()==0) continue; if (OpenSCAD::debug!="") PRINTDB(" ", CGAL::is_simple_2(contour.begin(), contour.end())); tmpnef2d.reset(new CGAL_Nef_polyhedron2(contour.begin(), contour.end(), boundary)); if (contour_counter == 0) { PRINTDB(" ", contour.size()); *(output_nefpoly2d) += *(tmpnef2d); } else { PRINTDB(" ", contour.size()); *(output_nefpoly2d) *= *(tmpnef2d); } /*log << "\n\n" << OpenSCAD::dump_svg(*tmpnef2d) << "\n" << "\n\n" << OpenSCAD::dump_svg(*output_nefpoly2d) << "\n";*/ contour_counter++; } else { PRINTD(" "); } PRINTD(" "); } PRINTD(" "); } namespace CGALUtils { Polygon2d *project(const CGAL_Nef_polyhedron &N, bool cut) { Polygon2d *poly = nullptr; if (N.getDimension() != 3) return poly; CGAL_Nef_polyhedron newN; if (cut) { CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CGAL_Nef_polyhedron3::Plane_3 xy_plane = CGAL_Nef_polyhedron3::Plane_3(0,0,1,0); newN.p3.reset(new CGAL_Nef_polyhedron3(N.p3->intersection(xy_plane, CGAL_Nef_polyhedron3::PLANE_ONLY))); } catch (const CGAL::Failure_exception &e) { PRINTDB("CGALUtils::project during plane intersection: %s", e.what()); try { PRINTD("Trying alternative intersection using very large thin box: "); std::vector pts; // dont use z of 0. there are bugs in CGAL. double inf = 1e8; double eps = 0.001; CGAL_Point_3 minpt(-inf, -inf, -eps); CGAL_Point_3 maxpt( inf, inf, eps); CGAL_Iso_cuboid_3 bigcuboid(minpt, maxpt); for (int i=0;i<8;i++) pts.push_back(bigcuboid.vertex(i)); CGAL_Polyhedron bigbox; CGAL::convex_hull_3(pts.begin(), pts.end(), bigbox); CGAL_Nef_polyhedron3 nef_bigbox(bigbox); newN.p3.reset(new CGAL_Nef_polyhedron3(nef_bigbox.intersection(*N.p3))); } catch (const CGAL::Failure_exception &e) { PRINTB("ERROR: CGAL error in CGALUtils::project during bigbox intersection: %s", e.what()); } } if (!newN.p3 || newN.p3->is_empty()) { CGAL::set_error_behaviour(old_behaviour); PRINT("WARNING: projection() failed."); return poly; } PRINTDB("%s",OpenSCAD::svg_header(480, 100000)); try { ZRemover zremover; CGAL_Nef_polyhedron3::Volume_const_iterator i; CGAL_Nef_polyhedron3::Shell_entry_const_iterator j; CGAL_Nef_polyhedron3::SFace_const_handle sface_handle; for (i = newN.p3->volumes_begin(); i != newN.p3->volumes_end(); ++i) { PRINTDB("",i->mark()); for (j = i->shells_begin(); j != i->shells_end(); ++j) { PRINTDB(""); } PRINTD(""); } poly = convertToPolygon2d(*zremover.output_nefpoly2d); } catch (const CGAL::Failure_exception &e) { PRINTB("ERROR: CGAL error in CGALUtils::project while flattening: %s", e.what()); } PRINTD(""); CGAL::set_error_behaviour(old_behaviour); } // In projection mode all the triangles are projected manually into the XY plane else { PolySet ps(3); bool err = CGALUtils::createPolySetFromNefPolyhedron3(*N.p3, ps); if (err) { PRINT("ERROR: Nef->PolySet failed"); return poly; } poly = PolysetUtils::project(ps); } return poly; } } // namespace #endif // ENABLE_CGAL openscad-2019.05/src/cgalutils-tess-old.cc0000644000076500000240000005550713437640540020736 0ustar kintelstaff00000000000000/* This is our custom tessellator of Nef Polyhedron faces. The problem with Nef faces is that sometimes the 'default' tessellator of Nef Polyhedron doesn't work. This is particularly true with situations where the polygon face is not, actually, 'simple', according to CGAL itself. This can occur on a bad quality STL import but also for other reasons. The resulting Nef face will appear to the average human eye as an ordinary, simple polygon... but in reality it has multiple edges that are slightly-out-of-alignment and sometimes they backtrack on themselves. When the triangulator is fed a polygon with self-intersecting edges, it's default behavior is to throw an exception. The other terminology for this is to say that the 'constraints' in the triangulation are 'intersecting'. The 'constraints' represent the edges of the polygon. The 'triangulation' is the covering of all the polygon points with triangles. How do we allow interseting constraints during triangulation? We use an 'Itag' for the triangulation, per the CGAL docs. This allows the triangulator to run without throwing an exception when it encounters self-intersecting polygon edges. The trick here is that when it finds an intersection, it actually creates a new point. The triangulator creates new points in 2d, but they aren't matched to any 3d points on our 3d polygon plane. (The plane of the Nef face). How to fix this problem? We actually 'project back up' or 'lift' into the 3d plane from the 2d point. This is handled in the 'deproject()' function. There is also the issue of the Simplicity of Nef Polyhedron face polygons. They are often not simple. The intersecting-constraints Triangulation can triangulate non-simple polygons, but of course it's result is also non-simple. This means that CGAL functions like orientation_2() and bounded_side() simply will not work on the resulting polygons because they all require input polygons to pass the 'is_simple2()' test. We have to use alternatives in order to create our triangles. There is also the question of which underlying number type to use. Some of the CGAL functions simply dont guarantee good results with a type like double. Although much the math here is somewhat simple, like line-line intersection, and involves only simple algebra, the approximations required when using floating-point types can cause the answers to be wrong. For example questions like 'is a point inside a triangle' do not have good answers under floating-point systems where a line may have a slope that is not expressible exactly as a floating point number. There are ways to deal with floating point inaccuracy but it is much, much simpler to use Rational numbers, although potentially much slower in many cases. */ #include "cgalutils.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #pragma pop_macro("NDEBUG") typedef CGAL_Kernel3 Kernel; //typedef CGAL::Triangulation_vertex_base_2 Vb; typedef CGAL::Triangulation_vertex_base_2 Vb; //typedef CGAL::Constrained_triangulation_face_base_2 Fb; typedef CGAL::Delaunay_mesh_face_base_2 Fb; typedef CGAL::Triangulation_data_structure_2 TDS; typedef CGAL::Exact_intersections_tag ITAG; typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; //typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; typedef CDT::Vertex_handle Vertex_handle; typedef CDT::Point CDTPoint; typedef CGAL::Ray_2 CGAL_Ray_2; typedef CGAL::Line_3 CGAL_Line_3; typedef CGAL::Point_2 CGAL_Point_2; typedef CGAL::Vector_2 CGAL_Vector_2; typedef CGAL::Segment_2 CGAL_Segment_2; typedef CGAL::Direction_2 CGAL_Direction_2; typedef CGAL::Direction_3 CGAL_Direction_3; typedef CGAL::Plane_3 CGAL_Plane_3; /* The idea of 'projection' is how we make 3d points appear as though they were 2d points to the tessellation algorithm. We take the 3-d plane on which the polygon lies, and then 'project' or 'cast its shadow' onto one of three standard planes, the xyplane, the yzplane, or the xzplane, depending on which projection will prevent the polygon looking like a flat line. (imagine, the triangle 0,0,1 0,1,1 0,1,0 ... if viewed from the 'top' it looks line a flat line. so we want to view it from the side). Thus we create a sequence of x,y points to feed to the algorithm, but those points might actually be x,z pairs or y,z pairs... it is an illusion we present to the triangulation algorithm by way of 'projection'. We get a resulting sequence of triangles with x,y coordinates, which we then 'deproject' back to x,z or y,z, in 3d space as needed. For example the square 0,0,0 0,0,1 0,1,1 0,1,0 becomes '0,0 0,1 1,1 1,0', is then split into two triangles, 0,0 1,0 1,1 and 0,0 1,1 0,1. those two triangles then are projected back to 3d as 0,0,0 0,1,0 0,1,1 and 0,0 0,1,1 0,0,1. There is an additional trick we do with projection related to Polygon orientation and the orientation of our output triangles, and thus, which way they are facing in space (aka their 'normals' or 'oriented side'). The basic issues is this: every 3d flat polygon can be thought of as having two sides. In Computer Graphics the convention is that the 'outside' or 'oriented side' or 'normal' is determined by looking at the triangle in terms of the 'ordering' or 'winding' of the points. If the points come in a 'clockwise' order, you must be looking at the triangle from 'inside'. If the points come in a 'counterclockwise' order, you must be looking at the triangle from the outside. For example, the triangle 0,0,0 1,0,0 0,1,0, when viewed from the 'top', has points in a counterclockwise order, so the 'up' side is the 'normal' or 'outside'. if you look at that same triangle from the 'bottom' side, the points will appear to be 'clockwise', so the 'down' side is the 'inside', and is the opposite of the 'normal' side. How do we keep track of all that when doing a triangulation? We could check each triangle as it was generated, and fix it's orientation before we feed it back to our output list. That is done by, for example, checking the orientation of the input polygon and then forcing the triangle to match that orientation during output. This is what CGAL's Nef Polyhedron does, you can read it inside /usr/include/CGAL/Nef_polyhedron_3.h. Or.... we could actually add an additional 'projection' to the incoming polygon points so that our triangulation algorithm is guaranteed to create triangles with the proper orientation in the first place. How? First, we assume that the triangulation algorithm will always produce 'counterclockwise' triangles in our plain old x-y plane. The method is based on the following curious fact: That is, if you take the points of a polygon, and flip the x,y coordinate of each point, making y:=x and x:=y, then you essentially get a 'mirror image' of the original polygon... but the orientation will be flipped. Given a clockwise polygon, the 'flip' will result in a 'counterclockwise' polygon mirror-image and vice versa. Now, there is a second curious fact that helps us here. In 3d, we are using the plane equation of ax+by+cz+d=0, where a,b,c determine its direction. If you notice, there are actually mutiple sets of numbers a:b:c that will describe the exact same plane. For example the 'ground' plane, called the XYplane, where z is everywhere 0, has the equation 0x+0y+1z+0=0, simplifying to a solution for x,y,z of z=0 and x,y = any numbers in your number system. However you can also express this as 0x+0y+-1z=0. The x,y,z solution is the same: z is everywhere 0, x and y are any number, even though a,b,c are different. We can say that the plane is 'oriented' differently, if we wish. But how can we link that concept to the points on the polygon? Well, if you generate a plane using the standard plane-equation generation formula, given three points M,N,P, then you will get a plane equation with . However if you feed the points in the reverse order, P,N,M, so that they are now oriented in the opposite order, you will get a plane equation with the signs flipped. <-a:-b:-c:-d> This means you can essentially consider that a plane has an 'orientation' based on it's equation, by looking at the signs of a,b,c relative to some other quantity. This means that you can 'flip' the projection of the input polygon points so that the projection will match the orientation of the input plane, thus guaranteeing that the output triangles will be oriented in the same direction as the input polygon was. In other words, even though we technically 'lose information' when we project from 3d->2d, we can actually keep the concept of 'orientation' through the whole triangulation process, and not have to recalculate the proper orientation during output. For example take two side-squares of a cube and the plane equations formed by feeding the points in counterclockwise, as if looking in from outside the cube: 0,0,0 0,1,0 0,1,1 0,0,1 <-1:0:0:0> 1,0,0 1,1,0 1,1,1 1,0,1 <1:0:0:1> They are both projected onto the YZ plane. They look the same: 0,0 1,0 1,1 0,1 0,0 1,0 1,1 0,1 But the second square plane has opposite orientation, so we flip the x and y for each point: 0,0 1,0 1,1 0,1 0,0 0,1 1,1 1,0 Only now do we feed these two 2-d squares to the tessellation algorithm. The result is 4 triangles. When de-projected back to 3d, they will have the appropriate winding that will match that of the original 3d faces. And the first two triangles will have opposite orientation from the last two. */ typedef enum { XYPLANE, YZPLANE, XZPLANE, NONE } plane_t; struct projection_t { plane_t plane; bool flip; }; CGAL_Point_2 get_projected_point( CGAL_Point_3 &p3, projection_t projection ) { NT3 x,y; if (projection.plane == XYPLANE) { x = p3.x(); y = p3.y(); } else if (projection.plane == XZPLANE) { x = p3.x(); y = p3.z(); } else if (projection.plane == YZPLANE) { x = p3.y(); y = p3.z(); } else if (projection.plane == NONE) { x = 0; y = 0; } if (projection.flip) return CGAL_Point_2( y,x ); return CGAL_Point_2( x,y ); } /* given 2d point, 3d plane, and 3d->2d projection, 'deproject' from 2d back onto a point on the 3d plane. true on failure, false on success */ bool deproject( CGAL_Point_2 &p2, projection_t &projection, CGAL_Plane_3 &plane, CGAL_Point_3 &p3 ) { NT3 x,y; CGAL_Line_3 l; CGAL_Point_3 p; CGAL_Point_2 pf( p2.x(), p2.y() ); if (projection.flip) pf = CGAL_Point_2( p2.y(), p2.x() ); if (projection.plane == XYPLANE) { p = CGAL_Point_3( pf.x(), pf.y(), 0 ); l = CGAL_Line_3( p, CGAL_Direction_3(0,0,1) ); } else if (projection.plane == XZPLANE) { p = CGAL_Point_3( pf.x(), 0, pf.y() ); l = CGAL_Line_3( p, CGAL_Direction_3(0,1,0) ); } else if (projection.plane == YZPLANE) { p = CGAL_Point_3( 0, pf.x(), pf.y() ); l = CGAL_Line_3( p, CGAL_Direction_3(1,0,0) ); } CGAL::Object obj = CGAL::intersection( l, plane ); const CGAL_Point_3 *point_test = CGAL::object_cast(&obj); if (point_test) { p3 = *point_test; return false; } PRINT("ERROR: deproject failure"); return true; } /* this simple criteria guarantees CGALs triangulation algorithm will terminate (i.e. not lock up and freeze the program) */ template class DummyCriteria { public: typedef double Quality; class Is_bad { public: CGAL::Mesh_2::Face_badness operator()(const Quality) const { return CGAL::Mesh_2::NOT_BAD; } CGAL::Mesh_2::Face_badness operator()(const typename T::Face_handle&, Quality&q) const { q = 1; return CGAL::Mesh_2::NOT_BAD; } }; Is_bad is_bad_object() const { return Is_bad(); } }; NT3 sign( const NT3 &n ) { if (n>0) return NT3(1); if (n<0) return NT3(-1); return NT3(0); } /* wedge, also related to 'determinant', 'signed parallelogram area', 'side', 'turn', 'winding', '2d portion of cross-product', etc etc. this function can tell you whether v1 is 'counterclockwise' or 'clockwise' from v2, based on the sign of the result. when the input Vectors are formed from three points, A-B and B-C, it can tell you if the path along the points A->B->C is turning left or right.*/ NT3 wedge( CGAL_Vector_2 &v1, CGAL_Vector_2 &v2 ) { return v1.x()*v2.y()-v2.x()*v1.y(); } /* given a point and a possibly non-simple polygon, determine if the point is inside the polygon or not, using the given winding rule. note that even_odd is not implemented. */ typedef enum { NONZERO_WINDING, EVEN_ODD } winding_rule_t; bool inside(CGAL_Point_2 &p1,std::vector &pgon, winding_rule_t winding_rule) { NT3 winding_sum = NT3(0); CGAL_Point_2 p2; CGAL_Ray_2 eastray(p1,CGAL_Direction_2(1,0)); for (size_t i=0;i(&obj); if (point_test) { p2 = *point_test; CGAL_Vector_2 v1( p1, p2 ); CGAL_Vector_2 v2( p2, head ); NT3 this_winding = wedge( v1, v2 ); winding_sum += sign(this_winding); } else { continue; } } if (winding_sum != NT3(0) && winding_rule == NONZERO_WINDING ) return true; return false; } projection_t find_good_projection( CGAL_Plane_3 &plane ) { projection_t goodproj; goodproj.plane = NONE; goodproj.flip = false; NT3 qxy = plane.a()*plane.a()+plane.b()*plane.b(); NT3 qyz = plane.b()*plane.b()+plane.c()*plane.c(); NT3 qxz = plane.a()*plane.a()+plane.c()*plane.c(); NT3 min = std::min(qxy,std::min(qyz,qxz)); if (min==qxy) { goodproj.plane = XYPLANE; if (sign(plane.c())>0) goodproj.flip = true; } else if (min==qyz) { goodproj.plane = YZPLANE; if (sign(plane.a())>0) goodproj.flip = true; } else if (min==qxz) { goodproj.plane = XZPLANE; if (sign(plane.b())<0) goodproj.flip = true; } else PRINT("ERROR: failed to find projection"); return goodproj; } namespace CGALUtils { /* given a single near-planar 3d polygon with holes, tessellate into a sequence of polygons without holes. as of writing, this means conversion into a sequence of 3d triangles. the given plane should be the same plane holding the polygon and it's holes. */ bool tessellate3DFaceWithHolesNew(std::vector &polygons, Polygons &triangles, CGAL_Plane_3 &plane) { if (polygons.size()==1 && polygons[0].size()==3) { PRINTD("input polygon has 3 points. shortcut tessellation."); Polygon t; t.push_back(Vector3d(CGAL::to_double(polygons[0][0].x()), CGAL::to_double(polygons[0][0].y()), CGAL::to_double(polygons[0][0].z()))); t.push_back(Vector3d(CGAL::to_double(polygons[0][1].x()), CGAL::to_double(polygons[0][1].y()), CGAL::to_double(polygons[0][1].z()))); t.push_back(Vector3d(CGAL::to_double(polygons[0][2].x()), CGAL::to_double(polygons[0][2].y()), CGAL::to_double(polygons[0][2].z()))); triangles.push_back( t ); return false; } bool err = false; CDT cdt; std::map vertmap; PRINTD("finding good projection"); projection_t goodproj = find_good_projection( plane ); PRINTDB("plane %s",plane ); PRINTDB("proj: %i %i",goodproj.plane % goodproj.flip); PRINTD("Inserting points and edges into Constrained Delaunay Triangulation"); std::vector< std::vector> polygons2d; for (size_t i=0;i vhandles; std::vector polygon2d; for (size_t j=0;j list_of_seeds; for (size_t i=1;i &pgon = polygons2d[i]; for (size_t j=0;j::iterator li = list_of_seeds.begin(); for (;li!=list_of_seeds.end();li++) { //PRINTB("seed %s",*li); double x = CGAL::to_double( li->x() ); double y = CGAL::to_double( li->y() ); PRINTDB("seed %f,%f",x%y); } PRINTD("seeding done"); PRINTD( "meshing" ); CGAL::refine_Delaunay_mesh_2_without_edge_refinement( cdt, list_of_seeds.begin(), list_of_seeds.end(), DummyCriteria() ); PRINTD("meshing done"); // this fails because it calls is_simple and is_simple fails on many // Nef Polyhedron faces //CGAL::Orientation original_orientation = // CGAL::orientation_2( orienpgon.begin(), orienpgon.end() ); CDT::Finite_faces_iterator fit; for( fit=cdt.finite_faces_begin(); fit!=cdt.finite_faces_end(); fit++ ) { if(fit->is_in_domain()) { CDTPoint p1 = cdt.triangle( fit )[0]; CDTPoint p2 = cdt.triangle( fit )[1]; CDTPoint p3 = cdt.triangle( fit )[2]; CGAL_Point_3 cp1,cp2,cp3; if (vertmap.count(p1)) cp1 = vertmap[p1]; else err = deproject( p1, goodproj, plane, cp1 ); if (vertmap.count(p2)) cp2 = vertmap[p2]; else err = deproject( p2, goodproj, plane, cp2 ); if (vertmap.count(p3)) cp3 = vertmap[p3]; else err = deproject( p3, goodproj, plane, cp3 ); if (err) PRINT("WARNING: 2d->3d deprojection failure"); Polygon tri; tri.push_back(Vector3d(CGAL::to_double(cp1.x()), CGAL::to_double(cp1.y()), CGAL::to_double(cp1.z()))); tri.push_back(Vector3d(CGAL::to_double(cp2.x()), CGAL::to_double(cp2.y()), CGAL::to_double(cp2.z()))); tri.push_back(Vector3d(CGAL::to_double(cp3.x()), CGAL::to_double(cp3.y()), CGAL::to_double(cp3.z()))); triangles.push_back( tri ); } } PRINTDB("built %i triangles",triangles.size()); return err; } /* given a single near-planar 3d polygon with holes, tessellate into a sequence of polygons without holes. as of writing, this means conversion into a sequence of 3d triangles. the given plane should be the same plane holding the polygon and it's holes. */ bool tessellate3DFaceWithHoles(std::vector &polygons, std::vector &triangles, CGAL_Plane_3 &plane) { if (polygons.size()==1 && polygons[0].size()==3) { PRINTD("input polygon has 3 points. shortcut tessellation."); CGAL_Polygon_3 t; t.push_back(polygons[0][2]); t.push_back(polygons[0][1]); t.push_back(polygons[0][0]); triangles.push_back( t ); return false; } bool err = false; CDT cdt; std::map vertmap; PRINTD("finding good projection"); projection_t goodproj = find_good_projection( plane ); PRINTDB("plane %s",plane ); PRINTDB("proj: %i %i",goodproj.plane % goodproj.flip); PRINTD("Inserting points and edges into Constrained Delaunay Triangulation"); std::vector< std::vector> polygons2d; for (size_t i=0;i vhandles; std::vector polygon2d; for (size_t j=0;j list_of_seeds; for (size_t i=1;i &pgon = polygons2d[i]; for (size_t j=0;j::iterator li = list_of_seeds.begin(); for (;li!=list_of_seeds.end();li++) { //PRINTB("seed %s",*li); double x = CGAL::to_double( li->x() ); double y = CGAL::to_double( li->y() ); PRINTDB("seed %f,%f",x%y); } PRINTD("seeding done"); PRINTD( "meshing" ); CGAL::refine_Delaunay_mesh_2_without_edge_refinement( cdt, list_of_seeds.begin(), list_of_seeds.end(), DummyCriteria() ); PRINTD("meshing done"); // this fails because it calls is_simple and is_simple fails on many // Nef Polyhedron faces //CGAL::Orientation original_orientation = // CGAL::orientation_2( orienpgon.begin(), orienpgon.end() ); CDT::Finite_faces_iterator fit; for( fit=cdt.finite_faces_begin(); fit!=cdt.finite_faces_end(); fit++ ) { if(fit->is_in_domain()) { CDTPoint p1 = cdt.triangle( fit )[0]; CDTPoint p2 = cdt.triangle( fit )[1]; CDTPoint p3 = cdt.triangle( fit )[2]; CGAL_Point_3 cp1,cp2,cp3; CGAL_Polygon_3 pgon; if (vertmap.count(p1)) cp1 = vertmap[p1]; else err = deproject( p1, goodproj, plane, cp1 ); if (vertmap.count(p2)) cp2 = vertmap[p2]; else err = deproject( p2, goodproj, plane, cp2 ); if (vertmap.count(p3)) cp3 = vertmap[p3]; else err = deproject( p3, goodproj, plane, cp3 ); if (err) PRINT("WARNING: 2d->3d deprojection failure"); pgon.push_back( cp1 ); pgon.push_back( cp2 ); pgon.push_back( cp3 ); triangles.push_back( pgon ); } } PRINTDB("built %i triangles",triangles.size()); return err; } }; openscad-2019.05/src/cgalutils-tess.cc0000644000076500000240000001452013437640540020150 0ustar kintelstaff00000000000000#include "cgalutils.h" //#include "cgal.h" //#include "tess.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #if CGAL_VERSION_NR >= CGAL_VERSION_NUMBER(4,11,0) #include #else #include #endif #include #pragma pop_macro("NDEBUG") struct FaceInfo { int nesting_level; bool in_domain() { return nesting_level%2 == 1; } }; typedef CGAL::Triangulation_2_filtered_projection_traits_3 Projection; typedef CGAL::Triangulation_face_base_with_info_2 Fbb; typedef CGAL::Triangulation_data_structure_2< CGAL::Triangulation_vertex_base_2, CGAL::Constrained_triangulation_face_base_2> Tds; typedef CGAL::Constrained_Delaunay_triangulation_2< Projection, Tds, CGAL::Exact_predicates_tag> CDT; static void mark_domains(CDT &ct, CDT::Face_handle start, int index, std::list& border) { if (start->info().nesting_level != -1) return; std::list queue; queue.push_back(start); while (!queue.empty()) { CDT::Face_handle fh = queue.front(); queue.pop_front(); if (fh->info().nesting_level == -1) { fh->info().nesting_level = index; for (int i = 0; i < 3; i++) { CDT::Edge e(fh,i); CDT::Face_handle n = fh->neighbor(i); if (n->info().nesting_level == -1) { if (ct.is_constrained(e)) border.push_back(e); else queue.push_back(n); } } } } } //explore set of facets connected with non constrained edges, //and attribute to each such set a nesting level. //We start from facets incident to the infinite vertex, with a nesting //level of 0. Then we recursively consider the non-explored facets incident //to constrained edges bounding the former set and increase the nesting level by 1. //Facets in the domain are those with an odd nesting level. static void mark_domains(CDT& cdt) { for(CDT::All_faces_iterator it = cdt.all_faces_begin(); it != cdt.all_faces_end(); ++it) { it->info().nesting_level = -1; } std::list border; mark_domains(cdt, cdt.infinite_face(), 0, border); while (!border.empty()) { CDT::Edge e = border.front(); border.pop_front(); CDT::Face_handle n = e.first->neighbor(e.second); if (n->info().nesting_level == -1) { mark_domains(cdt, n, e.first->info().nesting_level+1, border); } } } namespace CGALUtils { /*! polygons define a polygon, potentially with holes. Each contour should be added as a separate PolygonK instance. The tessellator will handle almost planar polygons. If the normal is given, we will assume this as the normal vector of the polygon. Otherwise, we will try to calculate it using Newell's method. The resulting triangles is added to the given triangles vector. */ bool tessellatePolygonWithHoles(const PolyholeK &polygons, Polygons &triangles, const K::Vector_3 *normal) { // No polygon. FIXME: Will this ever happen or can we assert here? if (polygons.empty()) return false; // No hole if (polygons.size() == 1) return tessellatePolygon(polygons.front(), triangles, normal); K::Vector_3 normalvec; if (normal) { normalvec = *normal; } else { // Calculate best guess at face normal using Newell's method CGAL::normal_vector_newell_3(polygons.front().begin(), polygons.front().end(), normalvec); } double sqrl = normalvec.squared_length(); if (sqrl > 0.0) normalvec = normalvec / sqrt(sqrl); // Pass the normal vector to the (undocumented) // CGAL::Triangulation_2_filtered_projection_traits_3. This // trait deals with projection from 3D to 2D using the normal // vector as a hint, and allows for near-planar polygons to be passed to // the Constrained Delaunay Triangulator. Projection actualProjection(normalvec); CDT cdt(actualProjection); for(const auto &poly : polygons) { for (size_t i=0;iinfo().in_domain()) { Polygon tri; for (int i=0;i<3;i++) { Vertex3K v = cdt.triangle(fit)[i]; tri.push_back(Vector3d(v.x(), v.y(), v.z())); } triangles.push_back(tri); } } return false; } bool tessellatePolygon(const PolygonK &polygon, Polygons &triangles, const K::Vector_3 *normal) { if (polygon.size() == 3) { PRINTD("input polygon has 3 points. shortcut tessellation."); Polygon t; t.push_back(Vector3d(polygon[0].x(), polygon[0].y(), polygon[0].z())); t.push_back(Vector3d(polygon[1].x(), polygon[1].y(), polygon[1].z())); t.push_back(Vector3d(polygon[2].x(), polygon[2].y(), polygon[2].z())); triangles.push_back(t); return false; } K::Vector_3 normalvec; if (normal) { normalvec = *normal; } else { // Calculate best guess at face normal using Newell's method CGAL::normal_vector_newell_3(polygon.begin(), polygon.end(), normalvec); } double sqrl = normalvec.squared_length(); if (sqrl > 0.0) normalvec = normalvec / sqrt(sqrl); // Pass the normal vector to the (undocumented) // CGAL::Triangulation_2_filtered_projection_traits_3. This // trait deals with projection from 3D to 2D using the normal // vector as a hint, and allows for near-planar polygons to be passed to // the Constrained Delaunay Triangulator. Projection actualProjection(normalvec); CDT cdt(actualProjection); for (size_t i=0;iinfo().in_domain()) { Polygon tri; for (int i=0;i<3;i++) { K::Point_3 v = cdt.triangle(fit)[i]; tri.push_back(Vector3d(v.x(), v.y(), v.z())); } triangles.push_back(tri); } } return false; } }; // namespace CGALUtils openscad-2019.05/src/cgalutils.cc0000644000076500000240000006354313437640540017205 0ustar kintelstaff00000000000000// this file is split into many separate cgalutils* files // in order to workaround gcc 4.9.1 crashing on systems with only 2GB of RAM #ifdef ENABLE_CGAL #include "cgalutils.h" #include "polyset.h" #include "printutils.h" #include "Polygon2d.h" #include "polyset-utils.h" #include "grid.h" #include "node.h" #include "degree_trig.h" #include "cgal.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #include // Apply CGAL bugfix for CGAL-4.5.x #if CGAL_VERSION_NR > CGAL_VERSION_NUMBER(4,5,1) || CGAL_VERSION_NR < CGAL_VERSION_NUMBER(4,5,0) #include #else #include "ext/CGAL/convex_hull_3_bugfix.h" #endif #pragma pop_macro("NDEBUG") #include "svg.h" #include "Reindexer.h" #include "hash.h" #include "GeometryUtils.h" #include #include static CGAL_Nef_polyhedron *createNefPolyhedronFromPolySet(const PolySet &ps) { if (ps.isEmpty()) return new CGAL_Nef_polyhedron(); assert(ps.getDimension() == 3); // Since is_convex doesn't work well with non-planar faces, // we tessellate the polyset before checking. PolySet psq(ps); psq.quantizeVertices(); PolySet ps_tri(3, psq.convexValue()); PolysetUtils::tessellate_faces(psq, ps_tri); if (ps_tri.is_convex()) { typedef CGAL::Epick K; // Collect point cloud // FIXME: Use unordered container (need hash) // NB! CGAL's convex_hull_3() doesn't like std::set iterators, so we use a list // instead. std::list points; for (const auto &poly : psq.polygons) { for (const auto &p : poly) { points.push_back(vector_convert(p)); } } if (points.size() <= 3) return new CGAL_Nef_polyhedron(); // Apply hull CGAL::Polyhedron_3 r; CGAL::convex_hull_3(points.begin(), points.end(), r); CGAL_Polyhedron r_exact; CGALUtils::copyPolyhedron(r, r_exact); return new CGAL_Nef_polyhedron(new CGAL_Nef_polyhedron3(r_exact)); } CGAL_Nef_polyhedron3 *N = nullptr; auto plane_error = false; CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CGAL_Polyhedron P; auto err = CGALUtils::createPolyhedronFromPolySet(psq, P); if (!err) { PRINTDB("Polyhedron is closed: %d", P.is_closed()); PRINTDB("Polyhedron is valid: %d", P.is_valid(false, 0)); } if (!err) N = new CGAL_Nef_polyhedron3(P); } catch (const CGAL::Assertion_exception &e) { // First two tests matches against CGAL < 4.10, the last two tests matches against CGAL >= 4.10 if ((std::string(e.what()).find("Plane_constructor") != std::string::npos && std::string(e.what()).find("has_on") != std::string::npos) || std::string(e.what()).find("ss_plane.has_on(sv_prev->point())") != std::string::npos || std::string(e.what()).find("ss_circle.has_on(sp)") != std::string::npos) { PRINT("PolySet has nonplanar faces. Attempting alternate construction"); plane_error=true; } else { PRINTB("ERROR: CGAL error in CGAL_Nef_polyhedron3(): %s", e.what()); } } if (plane_error) try { CGAL_Polyhedron P; auto err = CGALUtils::createPolyhedronFromPolySet(ps_tri, P); if (!err) { PRINTDB("Polyhedron is closed: %d", P.is_closed()); PRINTDB("Polyhedron is valid: %d", P.is_valid(false, 0)); } if (!err) N = new CGAL_Nef_polyhedron3(P); } catch (const CGAL::Assertion_exception &e) { PRINTB("ERROR: Alternate construction failed. CGAL error in CGAL_Nef_polyhedron3(): %s", e.what()); } CGAL::set_error_behaviour(old_behaviour); return new CGAL_Nef_polyhedron(N); } static CGAL_Nef_polyhedron *createNefPolyhedronFromPolygon2d(const Polygon2d &polygon) { shared_ptr ps(polygon.tessellate()); return createNefPolyhedronFromPolySet(*ps); } namespace CGALUtils { CGAL_Iso_cuboid_3 boundingBox(const CGAL_Nef_polyhedron3 &N) { CGAL_Iso_cuboid_3 result(0,0,0,0,0,0); CGAL_Nef_polyhedron3::Vertex_const_iterator vi; std::vector points; // can be optimized by rewriting bounding_box to accept vertices CGAL_forall_vertices(vi, N) points.push_back(vi->point()); if (points.size()) result = CGAL::bounding_box(points.begin(), points.end()); return result; } namespace { // lexicographic comparison bool operator < (Vector3d const& a, Vector3d const& b) { for (int i = 0; i < 3; i++) { if (a[i] < b[i]) return true; else if (a[i] == b[i]) continue; return false; } return false; } } struct VecPairCompare { bool operator ()(std::pair const& a, std::pair const& b) const { return a.first < b.first || (!(b.first < a.first) && a.second < b.second); } }; /*! Check if all faces of a polyset is within 0.1 degree of being convex. NB! This function can give false positives if the polyset contains non-planar faces. To be on the safe side, consider passing a tessellated polyset. See issue #1061. */ bool is_approximately_convex(const PolySet &ps) { const double angle_threshold = cos_degrees(.1); // .1° typedef CGAL::Simple_cartesian K; typedef K::Vector_3 Vector; typedef K::Point_3 Point; typedef K::Plane_3 Plane; // compute edge to face relations and plane equations typedef std::pair Edge; typedef std::map Edge_to_facet_map; Edge_to_facet_map edge_to_facet_map; std::vector facet_planes; facet_planes.reserve(ps.polygons.size()); for (size_t i = 0; i < ps.polygons.size(); i++) { Plane plane; auto N = ps.polygons[i].size(); if (N >= 3) { std::vector v(N); for (size_t j = 0; j < N; j++) { v[j] = vector_convert(ps.polygons[i][j]); Edge edge(ps.polygons[i][j],ps.polygons[i][(j+1)%N]); if (edge_to_facet_map.count(edge)) return false; // edge already exists: nonmanifold edge_to_facet_map[edge] = i; } Vector normal; CGAL::normal_vector_newell_3(v.begin(), v.end(), normal); plane = Plane(v[0], normal); } facet_planes.push_back(plane); } for (size_t i = 0; i < ps.polygons.size(); i++) { auto N = ps.polygons[i].size(); if (N < 3) continue; for (size_t j = 0; j < N; j++) { Edge other_edge(ps.polygons[i][(j+1)%N], ps.polygons[i][j]); if (edge_to_facet_map.count(other_edge) == 0) return false;// //Edge_to_facet_map::const_iterator it = edge_to_facet_map.find(other_edge); //if (it == edge_to_facet_map.end()) return false; // not a closed manifold //int other_facet = it->second; int other_facet = edge_to_facet_map[other_edge]; auto p = vector_convert(ps.polygons[i][(j+2)%N]); if (facet_planes[other_facet].has_on_positive_side(p)) { // Check angle const auto& u = facet_planes[other_facet].orthogonal_vector(); const auto& v = facet_planes[i].orthogonal_vector(); double cos_angle = u / sqrt(u*u) * v / sqrt(v*v); if (cos_angle < angle_threshold) { return false; } } } } std::set explored_facets; std::queue facets_to_visit; facets_to_visit.push(0); explored_facets.insert(0); while(!facets_to_visit.empty()) { int f = facets_to_visit.front(); facets_to_visit.pop(); for (size_t i = 0; i < ps.polygons[f].size(); i++) { int j = (i+1) % ps.polygons[f].size(); auto it = edge_to_facet_map.find(Edge(ps.polygons[f][j], ps.polygons[f][i])); if (it == edge_to_facet_map.end()) return false; // Nonmanifold if (!explored_facets.count(it->second)) { explored_facets.insert(it->second); facets_to_visit.push(it->second); } } } // Make sure that we were able to reach all polygons during our visit return explored_facets.size() == ps.polygons.size(); } CGAL_Nef_polyhedron *createNefPolyhedronFromGeometry(const Geometry &geom) { auto ps = dynamic_cast(&geom); if (ps) { return createNefPolyhedronFromPolySet(*ps); } else { auto poly2d = dynamic_cast(&geom); if (poly2d) return createNefPolyhedronFromPolygon2d(*poly2d); } assert(false && "createNefPolyhedronFromGeometry(): Unsupported geometry type"); return nullptr; } /* Create a PolySet from a Nef Polyhedron 3. return false on success, true on failure. The trick to this is that Nef Polyhedron3 faces have 'holes' in them. . . while PolySet (and many other 3d polyhedron formats) do not allow for holes in their faces. The function documents the method used to deal with this */ #if 1 bool createPolySetFromNefPolyhedron3(const CGAL_Nef_polyhedron3 &N, PolySet &ps) { // 1. Build Indexed PolyMesh // 2. Validate mesh (manifoldness) // 3. Triangulate each face // -> IndexedTriangleMesh // 4. Validate mesh (manifoldness) // 5. Create PolySet bool err = false; // 1. Build Indexed PolyMesh Reindexer allVertices; std::vector> polygons; CGAL_Nef_polyhedron3::Halffacet_const_iterator hfaceti; CGAL_forall_halffacets(hfaceti, N) { CGAL::Plane_3 plane(hfaceti->plane()); // Since we're downscaling to float, vertices might merge during this conversion. // To avoid passing equal vertices to the tessellator, we remove consecutively identical // vertices. polygons.push_back(std::vector()); auto &faces = polygons.back(); // the 0-mark-volume is the 'empty' volume of space. skip it. if (!hfaceti->incident_volume()->mark()) { CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator cyclei; CGAL_forall_facet_cycles_of(cyclei, hfaceti) { CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(cyclei); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c2(c1); faces.push_back(IndexedFace()); auto &currface = faces.back(); CGAL_For_all(c1, c2) { CGAL_Point_3 p = c1->source()->center_vertex()->point(); // Create vertex indices and remove consecutive duplicate vertices auto idx = allVertices.lookup(vector_convert(p)); if (currface.empty() || idx != currface.back()) currface.push_back(idx); } if (!currface.empty() && currface.front() == currface.back()) currface.pop_back(); if (currface.size() < 3) faces.pop_back(); // Cull empty triangles } } if (faces.empty()) polygons.pop_back(); // Cull empty faces } // 2. Validate mesh (manifoldness) auto unconnected = GeometryUtils::findUnconnectedEdges(polygons); if (unconnected > 0) { PRINTB("Error: Non-manifold mesh encountered: %d unconnected edges", unconnected); } // 3. Triangulate each face const auto verts = allVertices.getArray(); std::vector allTriangles; for (const auto &faces : polygons) { #if 0 // For debugging std::cerr << "---\n"; for(const auto &poly : faces) { for(auto i : poly) { std::cerr << i << " "; } std::cerr << "\n"; } #if 0 // debug std::cerr.precision(20); for(const auto &poly : faces) { for(auto i : poly) { std::cerr << verts[i][0] << "," << verts[i][1] << "," << verts[i][2] << "\n"; } std::cerr << "\n"; } #endif // debug std::cerr << "-\n"; #endif // debug #if 0 // For debugging std::cerr.precision(20); for (size_t i=0;i nvec = plane.orthogonal_vector(); // K::Vector_3 normal(CGAL::to_double(nvec.x()), CGAL::to_double(nvec.y()), CGAL::to_double(nvec.z())); std::vector triangles; auto err = GeometryUtils::tessellatePolygonWithHoles(verts, faces, triangles, nullptr); if (!err) { for (const auto &t : triangles) { assert(t[0] >= 0 && t[0] < static_cast(allVertices.size())); assert(t[1] >= 0 && t[1] < static_cast(allVertices.size())); assert(t[2] >= 0 && t[2] < static_cast(allVertices.size())); allTriangles.push_back(t); } } } #if 0 // For debugging for(const auto &t : allTriangles) { std::cerr << t[0] << " " << t[1] << " " << t[2] << "\n"; } #endif // debug // 4. Validate mesh (manifoldness) auto unconnected2 = GeometryUtils::findUnconnectedEdges(allTriangles); if (unconnected2 > 0) { PRINTB("Error: Non-manifold triangle mesh created: %d unconnected edges", unconnected2); } for (const auto &t : allTriangles) { ps.append_poly(); ps.append_vertex(verts[t[0]]); ps.append_vertex(verts[t[1]]); ps.append_vertex(verts[t[2]]); } #if 0 // For debugging std::cerr.precision(20); for (size_t i=0;i plane(hfaceti->plane()); std::vector polyholes; // the 0-mark-volume is the 'empty' volume of space. skip it. if (hfaceti->incident_volume()->mark()) continue; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator cyclei; CGAL_forall_facet_cycles_of(cyclei, hfaceti) { CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(cyclei); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c2(c1); CGAL_Polygon_3 polygon; CGAL_For_all(c1, c2) { auto p = c1->source()->center_vertex()->point(); polygon.push_back(p); } polyholes.push_back(polygon); } /* at this stage, we have a sequence of polygons. the first is the "outside edge' or 'body' or 'border', and the rest of the polygons are 'holes' within the first. there are several options here to get rid of the holes. we choose to go ahead and let the tessellater deal with the holes, and then just output the resulting 3d triangles*/ auto nvec = plane.orthogonal_vector(); K::Vector_3 normal(CGAL::to_double(nvec.x()), CGAL::to_double(nvec.y()), CGAL::to_double(nvec.z())); std::vector triangles; auto err = CGALUtils::tessellate3DFaceWithHoles(polyholes, triangles, plane); if (!err) { for (const auto &p : triangles) { if (p.size() != 3) { PRINT("WARNING: triangle doesn't have 3 points. skipping"); continue; } ps.append_poly(); ps.append_vertex(CGAL::to_double(p[2].x()), CGAL::to_double(p[2].y()), CGAL::to_double(p[2].z())); ps.append_vertex(CGAL::to_double(p[1].x()), CGAL::to_double(p[1].y()), CGAL::to_double(p[1].z())); ps.append_vertex(CGAL::to_double(p[0].x()), CGAL::to_double(p[0].y()), CGAL::to_double(p[0].z())); } } } return err; } #endif // createPolySetFromNefPolyhedron3 #if 0 bool createPolySetFromNefPolyhedron3(const CGAL_Nef_polyhedron3 &N, PolySet &ps) { bool err = false; CGAL_Nef_polyhedron3::Halffacet_const_iterator hfaceti; CGAL_forall_halffacets(hfaceti, N) { CGAL::Plane_3 plane(hfaceti->plane()); std::vector polyholes; // the 0-mark-volume is the 'empty' volume of space. skip it. if (hfaceti->incident_volume()->mark()) continue; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator cyclei; CGAL_forall_facet_cycles_of(cyclei, hfaceti) { CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(cyclei); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c2(c1); CGAL_Polygon_3 polygon; CGAL_For_all(c1, c2) { CGAL_Point_3 p = c1->source()->center_vertex()->point(); polygon.push_back(p); } polyholes.push_back(polygon); } /* at this stage, we have a sequence of polygons. the first is the "outside edge' or 'body' or 'border', and the rest of the polygons are 'holes' within the first. there are several options here to get rid of the holes. we choose to go ahead and let the tessellater deal with the holes, and then just output the resulting 3d triangles*/ CGAL::Vector_3 nvec = plane.orthogonal_vector(); K::Vector_3 normal(CGAL::to_double(nvec.x()), CGAL::to_double(nvec.y()), CGAL::to_double(nvec.z())); std::vector triangles; bool err = CGALUtils::tessellate3DFaceWithHolesNew(polyholes, triangles, plane); if (!err) { for(const auto &p : triangles) { if (p.size() != 3) { PRINT("WARNING: triangle doesn't have 3 points. skipping"); continue; } ps.append_poly(); ps.append_vertex(p[0].x(), p[0].y(), p[0].z()); ps.append_vertex(p[1].x(), p[1].y(), p[1].z()); ps.append_vertex(p[2].x(), p[2].y(), p[2].z()); } } } return err; } #endif // createPolySetFromNefPolyhedron3 #if 0 bool createPolySetFromNefPolyhedron3(const CGAL_Nef_polyhedron3 &N, PolySet &ps) { bool err = false; // Grid all vertices in a Nef polyhedron to merge close vertices. Grid3d grid(GRID_FINE); CGAL_Nef_polyhedron3::Halffacet_const_iterator hfaceti; CGAL_forall_halffacets(hfaceti, N) { CGAL::Plane_3 plane(hfaceti->plane()); PolyholeK polyholes; // the 0-mark-volume is the 'empty' volume of space. skip it. if (hfaceti->incident_volume()->mark()) continue; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator cyclei; CGAL_forall_facet_cycles_of(cyclei, hfaceti) { CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(cyclei); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c2(c1); PolygonK polygon; std::vector indices; // Vertex indices in one polygon CGAL_For_all(c1, c2) { CGAL_Point_3 p = c1->source()->center_vertex()->point(); Vector3d v = vector_convert(p); indices.push_back(grid.align(v)); polygon.push_back(Vertex3K(v[0], v[1], v[2])); } // Remove consecutive duplicate vertices PolygonK::iterator currp = polygon.begin(); for (size_t i=0;i= 3) polyholes.push_back(polygon); } /* at this stage, we have a sequence of polygons. the first is the "outside edge' or 'body' or 'border', and the rest of the polygons are 'holes' within the first. there are several options here to get rid of the holes. we choose to go ahead and let the tessellater deal with the holes, and then just output the resulting 3d triangles*/ // We cannot trust the plane from Nef polyhedron to be correct. // Passing an incorrect normal vector can cause a crash in the constrained delaunay triangulator // See http://cgal-discuss.949826.n4.nabble.com/Nef3-Wrong-normal-vector-reported-causes-triangulator-crash-tt4660282.html // CGAL::Vector_3 nvec = plane.orthogonal_vector(); // K::Vector_3 normal(CGAL::to_double(nvec.x()), CGAL::to_double(nvec.y()), CGAL::to_double(nvec.z())); std::vector triangles; bool err = CGALUtils::tessellatePolygonWithHolesNew(polyholes, triangles, nullptr); if (!err) { for(const auto &p : triangles) { if (p.size() != 3) { PRINT("WARNING: triangle doesn't have 3 points. skipping"); continue; } ps.append_poly(); ps.append_vertex(p[0].x(), p[0].y(), p[0].z()); ps.append_vertex(p[1].x(), p[1].y(), p[1].z()); ps.append_vertex(p[2].x(), p[2].y(), p[2].z()); } } } return err; } #endif // createPolySetFromNefPolyhedron3 #if 0 bool createPolySetFromNefPolyhedron3(const CGAL_Nef_polyhedron3 &N, PolySet &ps) { bool err = false; CGAL_Nef_polyhedron3::Halffacet_const_iterator hfaceti; CGAL_forall_halffacets(hfaceti, N) { CGAL::Plane_3 plane(hfaceti->plane()); PolyholeK polyholes; // the 0-mark-volume is the 'empty' volume of space. skip it. if (hfaceti->incident_volume()->mark()) continue; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator cyclei; CGAL_forall_facet_cycles_of(cyclei, hfaceti) { CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(cyclei); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c2(c1); PolygonK polygon; CGAL_For_all(c1, c2) { CGAL_Point_3 p = c1->source()->center_vertex()->point(); float v[3] = { CGAL::to_double(p.x()), CGAL::to_double(p.y()), CGAL::to_double(p.z()) }; polygon.push_back(Vertex3K(v[0], v[1], v[2])); } polyholes.push_back(polygon); } std::cout << "---\n"; for(const auto &poly : polyholes) { for(const auto &v : poly) { std::cout << v.x() << "," << v.y() << "," << v.z() << "\n"; } std::cout << "\n"; } std::cout << "-\n"; /* at this stage, we have a sequence of polygons. the first is the "outside edge' or 'body' or 'border', and the rest of the polygons are 'holes' within the first. there are several options here to get rid of the holes. we choose to go ahead and let the tessellater deal with the holes, and then just output the resulting 3d triangles*/ // We cannot trust the plane from Nef polyhedron to be correct. // Passing an incorrect normal vector can cause a crash in the constrained delaunay triangulator // See http://cgal-discuss.949826.n4.nabble.com/Nef3-Wrong-normal-vector-reported-causes-triangulator-crash-tt4660282.html // CGAL::Vector_3 nvec = plane.orthogonal_vector(); // K::Vector_3 normal(CGAL::to_double(nvec.x()), CGAL::to_double(nvec.y()), CGAL::to_double(nvec.z())); std::vector triangles; bool err = CGALUtils::tessellatePolygonWithHolesNew(polyholes, triangles, nullptr); if (!err) { for(const auto &p : triangles) { if (p.size() != 3) { PRINT("WARNING: triangle doesn't have 3 points. skipping"); continue; } ps.append_poly(); ps.append_vertex(p[0].x(), p[0].y(), p[0].z()); ps.append_vertex(p[1].x(), p[1].y(), p[1].z()); ps.append_vertex(p[2].x(), p[2].y(), p[2].z()); // std::cout << p[0].x() << "," << p[0].y() << "," << p[0].z() << "\n"; // std::cout << p[1].x() << "," << p[1].y() << "," << p[1].z() << "\n"; // std::cout << p[2].x() << "," << p[2].y() << "," << p[2].z() << "\n\n"; } } } return err; } #endif // createPolySetFromNefPolyhedron3 #if 0 bool createPolySetFromNefPolyhedron3(const CGAL_Nef_polyhedron3 &N, PolySet &ps) { bool err = false; CGAL_Nef_polyhedron3::Halffacet_const_iterator hfaceti; CGAL_forall_halffacets(hfaceti, N) { CGAL::Plane_3 plane(hfaceti->plane()); // Since we're downscaling to float, vertices might merge during this conversion. // To avoid passing equal vertices to the tessellator, we remove consecutively identical // vertices. Reindexer uniqueVertices; IndexedPolygons polyhole; // the 0-mark-volume is the 'empty' volume of space. skip it. if (hfaceti->incident_volume()->mark()) continue; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator cyclei; CGAL_forall_facet_cycles_of(cyclei, hfaceti) { CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(cyclei); CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c2(c1); polyhole.faces.push_back(IndexedFace()); IndexedFace &currface = polyhole.faces.back(); CGAL_For_all(c1, c2) { CGAL_Point_3 p = c1->source()->center_vertex()->point(); // Create vertex indices and remove consecutive duplicate vertices int idx = uniqueVertices.lookup(vector_convert(p)); if (currface.empty() || idx != currface.back()) currface.push_back(idx); } if (currface.front() == currface.back()) currface.pop_back(); if (currface.size() < 3) polyhole.faces.pop_back(); // Cull empty triangles } uniqueVertices.copy(std::back_inserter(polyhole.vertices)); #if 0 // For debugging std::cerr << "---\n"; std::cerr.precision(20); for(const auto &poly : polyhole.faces) { for(auto i : poly) { std::cerr << polyhole.vertices[i][0] << "," << polyhole.vertices[i][1] << "," << polyhole.vertices[i][2] << "\n"; } std::cerr << "\n"; } std::cerr << "-\n"; #endif // debug /* at this stage, we have a sequence of polygons. the first is the "outside edge' or 'body' or 'border', and the rest of the polygons are 'holes' within the first. there are several options here to get rid of the holes. we choose to go ahead and let the tessellater deal with the holes, and then just output the resulting 3d triangles*/ // We cannot trust the plane from Nef polyhedron to be correct. // Passing an incorrect normal vector can cause a crash in the constrained delaunay triangulator // See http://cgal-discuss.949826.n4.nabble.com/Nef3-Wrong-normal-vector-reported-causes-triangulator-crash-tt4660282.html // CGAL::Vector_3 nvec = plane.orthogonal_vector(); // K::Vector_3 normal(CGAL::to_double(nvec.x()), CGAL::to_double(nvec.y()), CGAL::to_double(nvec.z())); std::vector triangles; auto err = GeometryUtils::tessellatePolygonWithHoles(polyhole, triangles, nullptr); const auto verts = &polyhole.vertices.front(); if (!err) { for (const auto &t : triangles) { ps.append_poly(); ps.append_vertex(verts[t[0]]); ps.append_vertex(verts[t[1]]); ps.append_vertex(verts[t[2]]); } } } } #endif // createPolySetFromNefPolyhedron3 }; // namespace CGALUtils #endif /* ENABLE_CGAL */ openscad-2019.05/src/cgalutils.h0000644000076500000240000000426613437640540017044 0ustar kintelstaff00000000000000#pragma once #include "cgal.h" #include "polyset.h" #include "CGAL_Nef_polyhedron.h" #include "enums.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") typedef CGAL::Epick K; typedef CGAL::Point_3 Vertex3K; typedef std::vector PolygonK; typedef std::vector PolyholeK; namespace /* anonymous */ { template Result vector_convert(V const& v) { return Result(CGAL::to_double(v[0]),CGAL::to_double(v[1]),CGAL::to_double(v[2])); } } namespace CGALUtils { bool applyHull(const Geometry::Geometries &children, PolySet &P); CGAL_Nef_polyhedron *applyOperator(const Geometry::Geometries &children, OpenSCADOperator op); //FIXME: Old, can be removed: //void applyBinaryOperator(CGAL_Nef_polyhedron &target, const CGAL_Nef_polyhedron &src, OpenSCADOperator op); Polygon2d *project(const CGAL_Nef_polyhedron &N, bool cut); CGAL_Iso_cuboid_3 boundingBox(const CGAL_Nef_polyhedron3 &N); bool is_approximately_convex(const PolySet &ps); Geometry const* applyMinkowski(const Geometry::Geometries &children); template std::string printPolyhedron(const Polyhedron &p); template bool createPolySetFromPolyhedron(const Polyhedron &p, PolySet &ps); template bool createPolyhedronFromPolySet(const PolySet &ps, Polyhedron &p); template void copyPolyhedron(const Polyhedron_A &poly_a, Polyhedron_B &poly_b); CGAL_Nef_polyhedron *createNefPolyhedronFromGeometry(const class Geometry &geom); bool createPolySetFromNefPolyhedron3(const CGAL_Nef_polyhedron3 &N, PolySet &ps); bool tessellatePolygon(const PolygonK &polygon, Polygons &triangles, const K::Vector_3 *normal = nullptr); bool tessellatePolygonWithHoles(const PolyholeK &polygons, Polygons &triangles, const K::Vector_3 *normal = nullptr); bool tessellate3DFaceWithHoles(std::vector &polygons, std::vector &triangles, CGAL::Plane_3 &plane); }; openscad-2019.05/src/cgalworker.cc0000644000076500000240000000171413417146624017350 0ustar kintelstaff00000000000000#include "cgalworker.h" #include #include "Tree.h" #include "GeometryEvaluator.h" #include "progress.h" #include "printutils.h" #include "exceptions.h" CGALWorker::CGALWorker() { this->tree = nullptr; this->thread = new QThread(); if (this->thread->stackSize() < 1024*1024) this->thread->setStackSize(1024*1024); connect(this->thread, SIGNAL(started()), this, SLOT(work())); moveToThread(this->thread); } CGALWorker::~CGALWorker() { delete this->thread; } void CGALWorker::start(const Tree &tree) { this->tree = &tree; this->thread->start(); } void CGALWorker::work() { shared_ptr root_geom; try { GeometryEvaluator evaluator(*this->tree); root_geom = evaluator.evaluateGeometry(*this->tree->root(), true); } catch (const ProgressCancelException &e) { PRINT("Rendering cancelled."); } catch (const HardWarningException &e) { PRINT("Rendering cancelled on first warning."); } emit done(root_geom); thread->quit(); } openscad-2019.05/src/cgalworker.h0000644000076500000240000000053113402025764017201 0ustar kintelstaff00000000000000#pragma once #include #include "memory.h" class CGALWorker : public QObject { Q_OBJECT; public: CGALWorker(); ~CGALWorker(); public slots: void start(const class Tree &tree); protected slots: void work(); signals: void done(shared_ptr); protected: class QThread *thread; const class Tree *tree; }; openscad-2019.05/src/clipper-utils.cc0000644000076500000240000002166013402025764020001 0ustar kintelstaff00000000000000#include "clipper-utils.h" #include "printutils.h" namespace ClipperUtils { ClipperLib::Path fromOutline2d(const Outline2d &outline, bool keep_orientation) { ClipperLib::Path p; for (const auto &v : outline.vertices) { p.emplace_back(v[0]*CLIPPER_SCALE, v[1]*CLIPPER_SCALE); } // Make sure all polygons point up, since we project also // back-facing polygon in PolysetUtils::project() if (!keep_orientation && !ClipperLib::Orientation(p)) std::reverse(p.begin(), p.end()); return p; } ClipperLib::Paths fromPolygon2d(const Polygon2d &poly) { ClipperLib::Paths result; for (const auto &outline : poly.outlines()) { result.push_back(fromOutline2d(outline, poly.isSanitized() ? true : false)); } return result; } Polygon2d *sanitize(const Polygon2d &poly) { return toPolygon2d(sanitize(ClipperUtils::fromPolygon2d(poly))); } ClipperLib::PolyTree sanitize(const ClipperLib::Paths &paths) { ClipperLib::PolyTree result; ClipperLib::Clipper clipper; try { clipper.AddPaths(paths, ClipperLib::ptSubject, true); } catch(...) { // Most likely caught a RangeTest exception from clipper // Note that Clipper up to v6.2.1 incorrectly throws // an exception of type char* rather than a clipperException() PRINT("WARNING: Range check failed for polygon. skipping"); } clipper.Execute(ClipperLib::ctUnion, result, ClipperLib::pftEvenOdd); return result; } /*! We want to use a PolyTree to convert to Polygon2d, since only PolyTrees have an explicit notion of holes. We could use a Paths structure, but we'd have to check the orientation of each path before adding it to the Polygon2d. */ Polygon2d *toPolygon2d(const ClipperLib::PolyTree &poly) { auto result = new Polygon2d; auto node = poly.GetFirst(); while (node) { Outline2d outline; // Apparently, when using offset(), clipper gets the hole status wrong //outline.positive = !node->IsHole(); outline.positive = Orientation(node->Contour); ClipperLib::Path cleaned_path; ClipperLib::CleanPolygon(node->Contour, cleaned_path); // CleanPolygon can in some cases reduce the polygon down to no vertices if (cleaned_path.size() >= 3) { for (const auto &ip : cleaned_path) { outline.vertices.emplace_back(1.0*ip.X/CLIPPER_SCALE, 1.0*ip.Y/CLIPPER_SCALE); } result->addOutline(outline); } node = node->GetNext(); } result->setSanitized(true); return result; } ClipperLib::Paths process(const ClipperLib::Paths &polygons, ClipperLib::ClipType cliptype, ClipperLib::PolyFillType polytype) { ClipperLib::Paths result; ClipperLib::Clipper clipper; clipper.AddPaths(polygons, ClipperLib::ptSubject, true); clipper.Execute(cliptype, result, polytype); return result; } /*! Apply the clipper operator to the given paths. May return an empty Polygon2d, but will not return nullptr. */ Polygon2d *apply(const std::vector &pathsvector, ClipperLib::ClipType clipType) { ClipperLib::Clipper clipper; if (clipType == ClipperLib::ctIntersection && pathsvector.size() >= 2) { // intersection operations must be split into a sequence of binary operations auto source = pathsvector[0]; ClipperLib::PolyTree result; for (unsigned int i = 1; i < pathsvector.size(); i++) { clipper.AddPaths(source, ClipperLib::ptSubject, true); clipper.AddPaths(pathsvector[i], ClipperLib::ptClip, true); clipper.Execute(clipType, result, ClipperLib::pftNonZero, ClipperLib::pftNonZero); if (i != pathsvector.size()-1) { ClipperLib::PolyTreeToPaths(result, source); clipper.Clear(); } } return ClipperUtils::toPolygon2d(result); } bool first = true; for (const auto &paths : pathsvector) { clipper.AddPaths(paths, first ? ClipperLib::ptSubject : ClipperLib::ptClip, true); if (first) first = false; } ClipperLib::PolyTree sumresult; clipper.Execute(clipType, sumresult, ClipperLib::pftNonZero, ClipperLib::pftNonZero); // The returned result will have outlines ordered according to whether // they're positive or negative: Positive outlines counter-clockwise and // negative outlines clockwise. return ClipperUtils::toPolygon2d(sumresult); } /*! Apply the clipper operator to the given polygons. May return an empty Polygon2d, but will not return nullptr. */ Polygon2d *apply(const std::vector &polygons, ClipperLib::ClipType clipType) { std::vector pathsvector; for (const auto &polygon : polygons) { auto polypaths = fromPolygon2d(*polygon); if (!polygon->isSanitized()) ClipperLib::PolyTreeToPaths(sanitize(polypaths), polypaths); pathsvector.push_back(polypaths); } auto res = apply(pathsvector, clipType); assert(res); return res; } // This is a copy-paste from ClipperLib with the modification that the union operation is not performed // The reason is numeric robustness. With the insides missing, the intersection points created by the union operation may // (due to rounding) be located at slightly different locations than the original geometry and this // can give rise to cracks static void minkowski_outline(const ClipperLib::Path& poly, const ClipperLib::Path& path, ClipperLib::Paths& quads, bool isSum, bool isClosed) { int delta = (isClosed ? 1 : 0); size_t polyCnt = poly.size(); size_t pathCnt = path.size(); ClipperLib::Paths pp; pp.reserve(pathCnt); if (isSum) for (size_t i = 0; i < pathCnt; ++i) { ClipperLib::Path p; p.reserve(polyCnt); for (size_t j = 0; j < poly.size(); ++j) p.push_back(ClipperLib::IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y)); pp.push_back(p); } else for (size_t i = 0; i < pathCnt; ++i) { ClipperLib::Path p; p.reserve(polyCnt); for (size_t j = 0; j < poly.size(); ++j) p.push_back(ClipperLib::IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y)); pp.push_back(p); } quads.reserve((pathCnt + delta) * (polyCnt + 1)); for (size_t i = 0; i < pathCnt - 1 + delta; ++i) for (size_t j = 0; j < polyCnt; ++j) { ClipperLib::Path quad; quad.reserve(4); quad.push_back(pp[i % pathCnt][j % polyCnt]); quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]); quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); if (!Orientation(quad)) ClipperLib::ReversePath(quad); quads.push_back(quad); } } // Add the polygon a translated to an arbitrary point of each separate component of b. // Ideally, we would translate to the midpoint of component b, but the point can // be chosen arbitrarily since the translated object would always stay inside // the minkowski sum. static void fill_minkowski_insides(const ClipperLib::Paths &a, const ClipperLib::Paths &b, ClipperLib::Paths &target) { for (const auto &b_path : b) { // We only need to add for positive components of b if (!b_path.empty() && ClipperLib::Orientation(b_path) == 1) { const auto &delta = b_path[0]; // arbitrary point for (const auto &path : a) { target.push_back(path); for (auto &point : target.back()) { point.X += delta.X; point.Y += delta.Y; } } } } } Polygon2d *applyMinkowski(const std::vector &polygons) { if (polygons.size() == 1) return new Polygon2d(*polygons[0]); // Just copy ClipperLib::Clipper c; auto lhs = ClipperUtils::fromPolygon2d(*polygons[0]); for (size_t i=1; i &polygons); Polygon2d *apply(const std::vector &polygons, ClipperLib::ClipType); Polygon2d *apply(const std::vector &pathsvector, ClipperLib::ClipType); }; openscad-2019.05/src/color.cc0000644000076500000240000002370513441031431016314 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "colornode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "builtin.h" #include "printutils.h" #include #include #include #include #include #include #include #include using namespace boost::assign; // bring 'operator+=()' into scope class ColorModule : public AbstractModule { public: ColorModule(); ~ColorModule(); AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; private: static std::unordered_map webcolors; }; // Colors extracted from https://drafts.csswg.org/css-color/ on 2015-08-02 // CSS Color Module Level 4 - Editor’s Draft, 29 May 2015 std::unordered_map ColorModule::webcolors{ {"aliceblue", {240, 248, 255}}, {"antiquewhite", {250, 235, 215}}, {"aqua", {0, 255, 255}}, {"aquamarine", {127, 255, 212}}, {"azure", {240, 255, 255}}, {"beige", {245, 245, 220}}, {"bisque", {255, 228, 196}}, {"black", {0, 0, 0}}, {"blanchedalmond", {255, 235, 205}}, {"blue", {0, 0, 255}}, {"blueviolet", {138, 43, 226}}, {"brown", {165, 42, 42}}, {"burlywood", {222, 184, 135}}, {"cadetblue", {95, 158, 160}}, {"chartreuse", {127, 255, 0}}, {"chocolate", {210, 105, 30}}, {"coral", {255, 127, 80}}, {"cornflowerblue", {100, 149, 237}}, {"cornsilk", {255, 248, 220}}, {"crimson", {220, 20, 60}}, {"cyan", {0, 255, 255}}, {"darkblue", {0, 0, 139}}, {"darkcyan", {0, 139, 139}}, {"darkgoldenrod", {184, 134, 11}}, {"darkgray", {169, 169, 169}}, {"darkgreen", {0, 100, 0}}, {"darkgrey", {169, 169, 169}}, {"darkkhaki", {189, 183, 107}}, {"darkmagenta", {139, 0, 139}}, {"darkolivegreen", {85, 107, 47}}, {"darkorange", {255, 140, 0}}, {"darkorchid", {153, 50, 204}}, {"darkred", {139, 0, 0}}, {"darksalmon", {233, 150, 122}}, {"darkseagreen", {143, 188, 143}}, {"darkslateblue", {72, 61, 139}}, {"darkslategray", {47, 79, 79}}, {"darkslategrey", {47, 79, 79}}, {"darkturquoise", {0, 206, 209}}, {"darkviolet", {148, 0, 211}}, {"deeppink", {255, 20, 147}}, {"deepskyblue", {0, 191, 255}}, {"dimgray", {105, 105, 105}}, {"dimgrey", {105, 105, 105}}, {"dodgerblue", {30, 144, 255}}, {"firebrick", {178, 34, 34}}, {"floralwhite", {255, 250, 240}}, {"forestgreen", {34, 139, 34}}, {"fuchsia", {255, 0, 255}}, {"gainsboro", {220, 220, 220}}, {"ghostwhite", {248, 248, 255}}, {"gold", {255, 215, 0}}, {"goldenrod", {218, 165, 32}}, {"gray", {128, 128, 128}}, {"green", {0, 128, 0}}, {"greenyellow", {173, 255, 47}}, {"grey", {128, 128, 128}}, {"honeydew", {240, 255, 240}}, {"hotpink", {255, 105, 180}}, {"indianred", {205, 92, 92}}, {"indigo", {75, 0, 130}}, {"ivory", {255, 255, 240}}, {"khaki", {240, 230, 140}}, {"lavender", {230, 230, 250}}, {"lavenderblush", {255, 240, 245}}, {"lawngreen", {124, 252, 0}}, {"lemonchiffon", {255, 250, 205}}, {"lightblue", {173, 216, 230}}, {"lightcoral", {240, 128, 128}}, {"lightcyan", {224, 255, 255}}, {"lightgoldenrodyellow", {250, 250, 210}}, {"lightgray", {211, 211, 211}}, {"lightgreen", {144, 238, 144}}, {"lightgrey", {211, 211, 211}}, {"lightpink", {255, 182, 193}}, {"lightsalmon", {255, 160, 122}}, {"lightseagreen", {32, 178, 170}}, {"lightskyblue", {135, 206, 250}}, {"lightslategray", {119, 136, 153}}, {"lightslategrey", {119, 136, 153}}, {"lightsteelblue", {176, 196, 222}}, {"lightyellow", {255, 255, 224}}, {"lime", {0, 255, 0}}, {"limegreen", {50, 205, 50}}, {"linen", {250, 240, 230}}, {"magenta", {255, 0, 255}}, {"maroon", {128, 0, 0}}, {"mediumaquamarine", {102, 205, 170}}, {"mediumblue", {0, 0, 205}}, {"mediumorchid", {186, 85, 211}}, {"mediumpurple", {147, 112, 219}}, {"mediumseagreen", {60, 179, 113}}, {"mediumslateblue", {123, 104, 238}}, {"mediumspringgreen", {0, 250, 154}}, {"mediumturquoise", {72, 209, 204}}, {"mediumvioletred", {199, 21, 133}}, {"midnightblue", {25, 25, 112}}, {"mintcream", {245, 255, 250}}, {"mistyrose", {255, 228, 225}}, {"moccasin", {255, 228, 181}}, {"navajowhite", {255, 222, 173}}, {"navy", {0, 0, 128}}, {"oldlace", {253, 245, 230}}, {"olive", {128, 128, 0}}, {"olivedrab", {107, 142, 35}}, {"orange", {255, 165, 0}}, {"orangered", {255, 69, 0}}, {"orchid", {218, 112, 214}}, {"palegoldenrod", {238, 232, 170}}, {"palegreen", {152, 251, 152}}, {"paleturquoise", {175, 238, 238}}, {"palevioletred", {219, 112, 147}}, {"papayawhip", {255, 239, 213}}, {"peachpuff", {255, 218, 185}}, {"peru", {205, 133, 63}}, {"pink", {255, 192, 203}}, {"plum", {221, 160, 221}}, {"powderblue", {176, 224, 230}}, {"purple", {128, 0, 128}}, {"rebeccapurple", {102, 51, 153}}, {"red", {255, 0, 0}}, {"rosybrown", {188, 143, 143}}, {"royalblue", {65, 105, 225}}, {"saddlebrown", {139, 69, 19}}, {"salmon", {250, 128, 114}}, {"sandybrown", {244, 164, 96}}, {"seagreen", {46, 139, 87}}, {"seashell", {255, 245, 238}}, {"sienna", {160, 82, 45}}, {"silver", {192, 192, 192}}, {"skyblue", {135, 206, 235}}, {"slateblue", {106, 90, 205}}, {"slategray", {112, 128, 144}}, {"slategrey", {112, 128, 144}}, {"snow", {255, 250, 250}}, {"springgreen", {0, 255, 127}}, {"steelblue", {70, 130, 180}}, {"tan", {210, 180, 140}}, {"teal", {0, 128, 128}}, {"thistle", {216, 191, 216}}, {"tomato", {255, 99, 71}}, {"turquoise", {64, 224, 208}}, {"violet", {238, 130, 238}}, {"wheat", {245, 222, 179}}, {"white", {255, 255, 255}}, {"whitesmoke", {245, 245, 245}}, {"yellow", {255, 255, 0}}, {"yellowgreen", {154, 205, 50}}, // additional OpenSCAD specific entry {"transparent", {0, 0, 0, 0}} }; ColorModule::ColorModule() { } ColorModule::~ColorModule() { } // Parses hex colors according to: https://drafts.csswg.org/css-color/#typedef-hex-color. // If the input is invalid, returns boost::none. // Supports the following formats: // * "#rrggbb" // * "#rrggbbaa" // * "#rgb" // * "#rgba" boost::optional parse_hex_color(const std::string& hex) { // validate size. short syntax uses one hex digit per color channel instead of 2. const bool short_syntax = hex.size() == 4 || hex.size() == 5; const bool long_syntax = hex.size() == 7 || hex.size() == 9; if (!short_syntax && !long_syntax) return boost::none; // validate if (hex[0] != '#') return boost::none; if (!std::all_of(std::begin(hex)+1, std::end(hex), [](char c) { return std::isxdigit(static_cast(c)); })) { return boost::none; } // number of characters per color channel const int stride = short_syntax ? 1 : 2; const float channel_max = short_syntax ? 15.0f : 255.0f; Color4f rgba; rgba[3] = 1.0; // default alpha to 100% for (unsigned i = 0; i < (hex.size() - 1) / stride; i++) { const std::string chunk = hex.substr(1 + i*stride, stride); // convert the hex character(s) from base 16 to base 10 rgba[i] = stoi(chunk, nullptr, 16) / channel_max; } return rgba; } AbstractNode *ColorModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new ColorNode(inst); AssignmentList args{Assignment("c"), Assignment("alpha")}; Context c(ctx); c.setVariables(evalctx, args); inst->scope.apply(*evalctx); auto v = c.lookup_variable("c"); if (v->type() == Value::ValueType::VECTOR) { for (size_t i = 0; i < 4; i++) { node->color[i] = i < v->toVector().size() ? (float)v->toVector()[i]->toDouble() : 1.0f; if (node->color[i] > 1 || node->color[i] < 0){ PRINTB_NOCACHE("WARNING: color() expects numbers between 0.0 and 1.0. Value of %.1f is out of range, %s", node->color[i] % inst->location().toRelativeString(ctx->documentPath())); } } } else if (v->type() == Value::ValueType::STRING) { auto colorname = v->toString(); boost::algorithm::to_lower(colorname); if (webcolors.find(colorname) != webcolors.end()) { node->color = webcolors.at(colorname); } else { // Try parsing it as a hex color such as "#rrggbb". const auto hexColor = parse_hex_color(colorname); if (hexColor) { node->color = *hexColor; } else { PRINTB_NOCACHE("WARNING: Unable to parse color \"%s\", %s. ", colorname % inst->location().toRelativeString(ctx->documentPath())); PRINT_NOCACHE("WARNING: Please see https://en.wikipedia.org/wiki/Web_colors"); } } } auto alpha = c.lookup_variable("alpha"); if (alpha->type() == Value::ValueType::NUMBER) { node->color[3] = alpha->toDouble(); } auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string ColorNode::toString() const { return STR("color([" << this->color[0] << ", " << this->color[1] << ", " << this->color[2] << ", " << this->color[3] << "])"); } std::string ColorNode::name() const { return "color"; } void register_builtin_color() { Builtins::init("color", new ColorModule()); } openscad-2019.05/src/colormap.cc0000644000076500000240000002250513441031431017007 0ustar kintelstaff00000000000000#include "colormap.h" #include "printutils.h" #include "PlatformUtils.h" #include #include namespace fs=boost::filesystem; static const char *DEFAULT_COLOR_SCHEME_NAME = "Cornfield"; // See http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv static void rgbtohsv(float r, float g, float b, float &h, float &s, float &v) { float K = 0.f; if (g < b) { std::swap(g, b); K = -1.f; } if (r < g) { std::swap(r, g); K = -2.f / 6.f - K; } float chroma = r - std::min(g, b); h = fabs(K + (g - b) / (6.f * chroma + 1e-20f)); s = chroma / (r + 1e-20f); v = r; } RenderColorScheme::RenderColorScheme() : _path("") { _name = DEFAULT_COLOR_SCHEME_NAME; _index = 1000; _show_in_gui = true; _color_scheme.insert(ColorScheme::value_type(RenderColor::BACKGROUND_COLOR, Color4f(0xff, 0xff, 0xe5))); _color_scheme.insert(ColorScheme::value_type(RenderColor::AXES_COLOR, Color4f(0x00, 0x00, 0x00))); _color_scheme.insert(ColorScheme::value_type(RenderColor::OPENCSG_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c))); _color_scheme.insert(ColorScheme::value_type(RenderColor::OPENCSG_FACE_BACK_COLOR, Color4f(0x9d, 0xcb, 0x51))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CGAL_FACE_FRONT_COLOR, Color4f(0xf9, 0xd7, 0x2c))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CGAL_FACE_2D_COLOR, Color4f(0x00, 0xbf, 0x99))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CGAL_FACE_BACK_COLOR, Color4f(0x9d, 0xcb, 0x51))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CGAL_EDGE_FRONT_COLOR, Color4f(0xff, 0xec, 0x5e))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CGAL_EDGE_BACK_COLOR, Color4f(0xab, 0xd8, 0x56))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CGAL_EDGE_2D_COLOR, Color4f(0xff, 0x00, 0x00))); _color_scheme.insert(ColorScheme::value_type(RenderColor::CROSSHAIR_COLOR, Color4f(0x80, 0x00, 0x00))); } RenderColorScheme::RenderColorScheme(fs::path path) : _path(path) { try { boost::property_tree::read_json(path.generic_string().c_str(), pt); _name = pt.get("name"); _index = pt.get("index"); _show_in_gui = pt.get("show-in-gui"); addColor(RenderColor::BACKGROUND_COLOR, "background"); addColor(RenderColor::AXES_COLOR, "axes-color"); addColor(RenderColor::OPENCSG_FACE_FRONT_COLOR, "opencsg-face-front"); addColor(RenderColor::OPENCSG_FACE_BACK_COLOR, "opencsg-face-back"); addColor(RenderColor::CGAL_FACE_FRONT_COLOR, "cgal-face-front"); addColor(RenderColor::CGAL_FACE_2D_COLOR, "cgal-face-2d"); addColor(RenderColor::CGAL_FACE_BACK_COLOR, "cgal-face-back"); addColor(RenderColor::CGAL_EDGE_FRONT_COLOR, "cgal-edge-front"); addColor(RenderColor::CGAL_EDGE_BACK_COLOR, "cgal-edge-back"); addColor(RenderColor::CGAL_EDGE_2D_COLOR, "cgal-edge-2d"); addColor(RenderColor::CROSSHAIR_COLOR, "crosshair"); } catch (const std::exception & e) { PRINTB("Error reading color scheme file '%s': %s", path.generic_string().c_str() % e.what()); _error = e.what(); _name = ""; _index = 0; _show_in_gui = false; } } RenderColorScheme::~RenderColorScheme() { } bool RenderColorScheme::valid() const { return !_name.empty(); } const std::string & RenderColorScheme::name() const { return _name; } int RenderColorScheme::index() const { return _index; } bool RenderColorScheme::showInGui() const { return _show_in_gui; } std::string RenderColorScheme::path() const { return _path.string(); } std::string RenderColorScheme::error() const { return _error; } ColorScheme & RenderColorScheme::colorScheme() { return _color_scheme; } const boost::property_tree::ptree & RenderColorScheme::propertyTree() const { return pt; } void RenderColorScheme::addColor(RenderColor colorKey, std::string key) { const boost::property_tree::ptree& colors = pt.get_child("colors"); std::string color = colors.get(key); if ((color.length() == 7) && (color.at(0) == '#')) { char *endptr; unsigned int val = strtol(color.substr(1).c_str(), &endptr, 16); int r = (val >> 16) & 0xff; int g = (val >> 8) & 0xff; int b = val & 0xff; _color_scheme.insert(ColorScheme::value_type(colorKey, Color4f(r, g, b))); } else { throw std::invalid_argument(std::string("invalid color value for key '") + key + "': '" + color + "'"); } } ColorMap *ColorMap::inst(bool erase) { static ColorMap *instance = new ColorMap; if (erase) { delete instance; instance = nullptr; } return instance; } ColorMap::ColorMap() { colorSchemeSet = enumerateColorSchemes(); dump(); } ColorMap::~ColorMap() { } const char * ColorMap::defaultColorSchemeName() const { return DEFAULT_COLOR_SCHEME_NAME; } const ColorScheme &ColorMap::defaultColorScheme() const { return *findColorScheme(DEFAULT_COLOR_SCHEME_NAME); } const ColorScheme *ColorMap::findColorScheme(const std::string &name) const { for (colorscheme_set_t::const_iterator it = colorSchemeSet.begin();it != colorSchemeSet.end();it++) { RenderColorScheme *scheme = (*it).second.get(); if (name == scheme->name()) { return &scheme->colorScheme(); } } return nullptr; } void ColorMap::dump() const { PRINTD("Listing available color schemes..."); std::list names = colorSchemeNames(); unsigned int length = 0; for (std::list::const_iterator it = names.begin();it != names.end();it++) { length = (*it).length() > length ? (*it).length() : length; } for (colorscheme_set_t::const_iterator it = colorSchemeSet.begin();it != colorSchemeSet.end();it++) { const RenderColorScheme *cs = (*it).second.get(); const char gui = cs->showInGui() ? 'G' : '-'; if (cs->path().empty()) { PRINTDB("%6d:%c: %s (built-in)", cs->index() % gui % boost::io::group(std::setw(length), cs->name())); } else { PRINTDB("%6d:%c: %s from %s", cs->index() % gui % boost::io::group(std::setw(length), cs->name()) % cs->path()); } } PRINTD("done."); } std::list ColorMap::colorSchemeNames(bool guiOnly) const { std::list colorSchemeNames; for (colorscheme_set_t::const_iterator it = colorSchemeSet.begin();it != colorSchemeSet.end();it++) { const RenderColorScheme *scheme = (*it).second.get(); if (guiOnly && !scheme->showInGui()) { continue; } colorSchemeNames.push_back(scheme->name()); } return colorSchemeNames; } Color4f ColorMap::getColor(const ColorScheme &cs, const RenderColor rc) { if (cs.count(rc)) return cs.at(rc); if (ColorMap::inst()->defaultColorScheme().count(rc)) return ColorMap::inst()->defaultColorScheme().at(rc); return Color4f(0, 0, 0, 127); } Color4f ColorMap::getColorHSV(const Color4f &col) { float h, s, v; rgbtohsv(col[0], col[1], col[2], h, s, v); return Color4f(h, s, v, col[3]); } /** * Calculate contrast color. Based on the article * http://gamedev.stackexchange.com/questions/38536/given-a-rgb-color-x-how-to-find-the-most-contrasting-color-y * * @param col the input color * @return a color with high contrast to the input color */ Color4f ColorMap::getContrastColor(const Color4f &col) { Color4f hsv = ColorMap::getColorHSV(col); float Y = 0.2126f * col[0] + 0.7152f * col[1] + 0.0722f * col[2]; float S = hsv[1]; if (S < 0.5) { // low saturation, choose between black / white based on luminance Y float val = Y > 0.5 ? 0.0f : 1.0f; return Color4f(val, val, val, 1.0f); } else { float H = 360 * hsv[0]; if ((H < 60) || (H > 300)) { return Color4f(0.0f, 1.0f, 1.0f, 1.0f); // red -> cyan } else if (H < 180) { return Color4f(1.0f, 0.0f, 1.0f, 1.0f); // green -> magenta } else { return Color4f(1.0f, 1.0f, 0.0f, 1.0f); // blue -> yellow } } } void ColorMap::enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path basePath) { const fs::path color_schemes = basePath / "color-schemes" / "render"; PRINTDB("Enumerating color schemes from '%s'", color_schemes.generic_string().c_str()); fs::directory_iterator end_iter; if (fs::exists(color_schemes) && fs::is_directory(color_schemes)) { for (fs::directory_iterator dir_iter(color_schemes); dir_iter != end_iter; ++dir_iter) { if (!fs::is_regular_file(dir_iter->status())) { continue; } const fs::path path = (*dir_iter).path(); if (!(path.extension() == ".json")) { continue; } RenderColorScheme *colorScheme = new RenderColorScheme(path); if (colorScheme->valid() && (findColorScheme(colorScheme->name()) == nullptr)) { result_set.insert(colorscheme_set_t::value_type(colorScheme->index(), shared_ptr(colorScheme))); PRINTDB("Found file '%s' with color scheme '%s' and index %d", colorScheme->path() % colorScheme->name() % colorScheme->index()); } else { PRINTDB("Invalid file '%s': %s", colorScheme->path() % colorScheme->error()); delete colorScheme; } } } } ColorMap::colorscheme_set_t ColorMap::enumerateColorSchemes() { colorscheme_set_t result_set; RenderColorScheme *defaultColorScheme = new RenderColorScheme(); result_set.insert(colorscheme_set_t::value_type(defaultColorScheme->index(), shared_ptr(defaultColorScheme))); enumerateColorSchemesInPath(result_set, PlatformUtils::resourceBasePath()); enumerateColorSchemesInPath(result_set, PlatformUtils::userConfigPath()); return result_set; } openscad-2019.05/src/colormap.h0000644000076500000240000000447413402025764016667 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "linalg.h" #include "memory.h" #include #include namespace fs = boost::filesystem; enum class RenderColor { BACKGROUND_COLOR, AXES_COLOR, OPENCSG_FACE_FRONT_COLOR, OPENCSG_FACE_BACK_COLOR, CGAL_FACE_FRONT_COLOR, CGAL_FACE_2D_COLOR, CGAL_FACE_BACK_COLOR, CGAL_EDGE_FRONT_COLOR, CGAL_EDGE_BACK_COLOR, CGAL_EDGE_2D_COLOR, CROSSHAIR_COLOR }; typedef std::map ColorScheme; class RenderColorScheme { private: const fs::path _path; boost::property_tree::ptree pt; std::string _name; std::string _error; int _index; bool _show_in_gui; ColorScheme _color_scheme; public: /** * Constructor for the default color scheme Cornfield. */ RenderColorScheme(); /** * Constructor for reading external JSON files. */ RenderColorScheme(const fs::path path); virtual ~RenderColorScheme(); const std::string & name() const; int index() const; bool valid() const; bool showInGui() const; ColorScheme & colorScheme(); const boost::property_tree::ptree & propertyTree() const; private: std::string path() const; std::string error() const; void addColor(RenderColor colorKey, std::string key); friend class ColorMap; }; class ColorMap { typedef std::multimap, std::less> colorscheme_set_t; public: static ColorMap *inst(bool erase = false); const char * defaultColorSchemeName() const; const ColorScheme & defaultColorScheme() const; const ColorScheme *findColorScheme(const std::string &name) const; std::list colorSchemeNames(bool guiOnly = false) const; static Color4f getColor(const ColorScheme &cs, const RenderColor rc); static Color4f getContrastColor(const Color4f &col); static Color4f getColorHSV(const Color4f &col); private: ColorMap(); virtual ~ColorMap(); void dump() const; colorscheme_set_t enumerateColorSchemes(); void enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path path); colorscheme_set_t colorSchemeSet; }; openscad-2019.05/src/colornode.h0000644000076500000240000000046613402025764017034 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "linalg.h" class ColorNode : public AbstractNode { public: VISITABLE(); ColorNode(const ModuleInstantiation *mi) : AbstractNode(mi), color(-1.0f, -1.0f, -1.0f, 1.0f) { } std::string toString() const override; std::string name() const override; Color4f color; }; openscad-2019.05/src/comment.cpp0000644000076500000240000001717613402025764017053 0ustar kintelstaff00000000000000#include "comment.h" #include "expression.h" #include "annotation.h" #include #include #include // gcc 4.8 and earlier have issues with std::regex see // #2291 and https://stackoverflow.com/questions/12530406/is-gcc-4-8-or-earlier-buggy-about-regular-expressions // therefor, we use boost::regex #include struct GroupInfo { std::string commentString; int lineNo; }; typedef std::vector GroupList; /* Finds line to break stop parsing parsing parameters */ static int getLineToStop( const std::string &fulltext){ int lineNo=1; bool inString=false; for (unsigned int i=0; i 0) return ""; if (comment[startText] == ';') noOfSemicolon++; } } if (startText + 2 > comment.length()) return ""; std::string result = comment.substr(startText + 2); return result; } /* Extracts a parameter description from comment on the given line. Returns description, without any "//" */ static std::string getDescription(const std::string &fulltext, int line) { if (line < 1) return ""; unsigned int start = 0; for (; start match; while(boost::regex_search(comment, match, regex)) { std::string groupName = match[1].str(); if (finalGroupName.empty()) { finalGroupName = groupName; } else { finalGroupName = finalGroupName + "-" + groupName; } groupName.clear(); comment = match.suffix(); } groupInfo.commentString = finalGroupName; groupInfo.lineNo = lineNo; return groupInfo; } /* This function collect all groups of parameters described in the scad file. */ static GroupList collectGroups(const std::string &fulltext) { GroupList groupList; // container of all group names int lineNo = 1; // tracks line number bool inString = false; // check if its string or (line-) comment // iterate through whole scad file for (unsigned int i=0; i(ValuePtr(std::string("")))); // Get all groups of parameters GroupList groupList = collectGroups(fulltext); int parseTill=getLineToStop(fulltext); // Extract parameters for all literal assignments for (auto &assignment : root_module->scope.assignments) { if (!assignment.expr.get()->isLiteral()) continue; // Only consider literals // get location of assignment node int firstLine = assignment.location().firstLine(); if(firstLine>=parseTill || ( assignment.location().fileName() != "" && assignment.location().fileName() != root_module->getFilename() && assignment.location().fileName() != root_module->getFullpath() )) { continue; } // making list to add annotations AnnotationList *annotationList = new AnnotationList(); // Extracting the parameter comment std::string comment = getComment(fulltext, firstLine); // getting the node for parameter annotation shared_ptr params = CommentParser::parser(comment.c_str()); if (!params) { params = EmptyStringLiteral; } // adding parameter to the list annotationList->push_back(Annotation("Parameter", params)); //extracting the description std::string descr = getDescription(fulltext, firstLine - 1); if (descr != "") { //creating node for description shared_ptr expr(new Literal(ValuePtr(std::string(descr.c_str())))); annotationList->push_back(Annotation("Description", expr)); } // Look for the group to which the given assignment belong for (const auto &groupInfo :boost::adaptors::reverse(groupList)){ if (groupInfo.lineNo < firstLine) { //creating node for description shared_ptr expr(new Literal(ValuePtr(groupInfo.commentString))); annotationList->push_back(Annotation("Group", expr)); break; } } assignment.addAnnotations(annotationList); } } openscad-2019.05/src/comment.h0000644000076500000240000000033613402025764016506 0ustar kintelstaff00000000000000#pragma once #include "FileModule.h" #include "Assignment.h" namespace CommentParser { shared_ptr parser(const char *text); void collectParameters(const std::string& fulltext, FileModule *root_module); } openscad-2019.05/src/comment_lexer.l0000644000076500000240000000356213441031431017704 0ustar kintelstaff00000000000000%option prefix="comment_lexer" %{ #include "Assignment.h" #include "expression.h" #include "value.h" #include "comment_parser.hxx" #include YY_BUFFER_STATE yy_scan_string ( const char *str ) ; std::string stringcon; //isatty for visual c++ and mingw-cross-env #if defined __WIN32__ && ! defined _MSC_VER #include "unistd.h" #endif #if defined __WIN32__ || defined _MSC_VER extern "C" int __cdecl _isatty(int _FileHandle); #define isatty _isatty #define strdup _strdup #define fileno _fileno #endif %} %x cond_string D [0-9] E [Ee][-+]?{D}+ H [0-9a-fA-F] U [\x80-\xbf] U2 [\xc2-\xdf] U3 [\xe0-\xef] U4 [\xf0-\xf4] UNICODE {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} %% [+-]?{D}+{E}? | [+-]?{D}*\.{D}+{E}? | [+-]?{D}+\.{D}*{E}? { try { comment_parserlval.num = boost::lexical_cast(yytext); return NUM; } catch (boost::bad_lexical_cast&) {} } "[" { return yytext[0];} "]" { return yytext[0];} "," { return yytext[0];} ":" { return yytext[0];} [ \t] \" { BEGIN(cond_string); stringcon.clear(); } { \\n { stringcon += '\n'; } \\t { stringcon += '\t'; } \\r { stringcon += '\r'; } \\\\ { stringcon += '\\'; } \\\" { stringcon += '"'; } {UNICODE} { stringcon += yytext; } [^\\\n\"] { stringcon += yytext; } \" { BEGIN(INITIAL); comment_parserlval.text = strdup(stringcon.c_str()); return WORD; } <> { BEGIN(INITIAL); comment_parserlval.text = strdup(stringcon.c_str()); return WORD; } } [^(\[ \] \, \" \:)]* { comment_parserlval.text=strdup(yytext); return WORD;} . { } %% int yywrap(void) { return 1; } void comment_scan_string(const char* str) { yy_switch_to_buffer(yy_scan_string(str)); } openscad-2019.05/src/comment_parser.y0000644000076500000240000000601413441031431020071 0ustar kintelstaff00000000000000%{ #include #include #include "Assignment.h" #include "expression.h" #include "printutils.h" #include "value.h" #include "comment.h" #ifdef _MSC_VER #define strdup _strdup #endif void yyerror(const char *); int comment_lexerlex(void); int comment_parserlex(void); extern void comment_scan_string ( const char *str ); shared_ptr params; %} %union { char *text; char ch; double num; class Vector *vec; class Expression *expr; }; %token NUM %token WORD %type word %type expr %type num %type value %type values %type wordexpr %type params %type labeled_vectors %% params: expr { $$ = $1; params = shared_ptr($$); } ; expr: '[' values ']' { $$ = $2; } | num { $$ = $1; } | wordexpr { $$ = $1; } | '[' num ':' num ']' { $$ = new Range($2, $4, Location::NONE); } | '[' num ':' num ':' num ']' { $$ = new Range($2, $4, $6, Location::NONE); } ; num: NUM { $$ = new Literal(ValuePtr($1)); } ; value: labeled_vectors { $$ = $1; } |num { $$ = $1; } |wordexpr { $$ = $1; } ; values: value { $$ = new Vector(Location::NONE); $$->push_back($1); } |values ',' value { $$ = $1; $$->push_back($3); } ; labeled_vectors: num ':' num { $$ = new Vector(Location::NONE); $$->push_back($1); $$->push_back($3); } |num ':' wordexpr { $$ = new Vector(Location::NONE); $$->push_back($1); $$->push_back($3); } |wordexpr ':' num { $$ = new Vector(Location::NONE); $$->push_back($1); $$->push_back($3); } |wordexpr ':' wordexpr { $$ = new Vector(Location::NONE); $$->push_back($1); $$->push_back($3); } ; wordexpr: word { $$ = new Literal(ValuePtr(std::string($1))); free($1); } ; word: WORD { $$=$1; } | word NUM { std::ostringstream strs; strs << $1 << " " << $2; $$ = strdup(strs.str().c_str()); } | NUM word { std::ostringstream strs; strs << $1 << " " << $2; $$ = strdup(strs.str().c_str()); } | word WORD { std::ostringstream strs; strs << $1 << " " << $2; $$ = strdup(strs.str().c_str()); } %% int comment_parserlex(void) { return comment_lexerlex(); } void yyerror(const char * /*msg*/) { PRINTD("ERROR IN PARAMETER: Parser error in comments of file \n "); params = NULL; } shared_ptr CommentParser::parser(const char *text) { comment_scan_string(text); int parserretval = comment_parserparse(); if (parserretval != 0) return nullptr; return params; } openscad-2019.05/src/compiler_specific.h0000644000076500000240000000244613433421332020522 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2019, OpenSCAD Authors * * 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 #if defined(__clang__) #define NOINLINE __attribute__((noinline)) #elif defined(COMPILER_GCC) #define NOINLINE [[gnu::noinline]] #else #define NOINLINE #endif openscad-2019.05/src/context.cc0000644000076500000240000002073613433421332016667 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "compiler_specific.h" #include "context.h" #include "evalcontext.h" #include "expression.h" #include "function.h" #include "UserModule.h" #include "ModuleInstantiation.h" #include "builtin.h" #include "printutils.h" #include namespace fs = boost::filesystem; // $children is not a config_variable. config_variables have dynamic scope, // meaning they are passed down the call chain implicitly. // $children is simply misnamed and shouldn't have included the '$'. static bool is_config_variable(const std::string &name) { return name[0] == '$' && name != "$children"; } /*! Initializes this context. Optionally initializes a context for an external library. Note that if parent is null, a new stack will be created, and all children will share the root parent's stack. */ Context::Context(const Context *parent) : parent(parent) { if (parent) { assert(parent->ctx_stack && "Parent context stack was null!"); this->ctx_stack = parent->ctx_stack; this->document_path = parent->document_path; } else { this->ctx_stack = new Stack; } this->ctx_stack->push_back(this); } Context::~Context() { assert(this->ctx_stack && "Context stack was null at destruction!"); this->ctx_stack->pop_back(); if (!parent) delete this->ctx_stack; } /*! Initialize context from a module argument list and a evaluation context which may pass variables which will be preferred over default values. */ void Context::setVariables(const EvalContext *evalctx, const AssignmentList &args, const AssignmentList &optargs, bool usermodule) { // Set any default values for (const auto &arg : args) { set_variable(arg.name, arg.expr ? arg.expr->evaluate(this->parent) : ValuePtr::undefined); } if (evalctx) { auto assignments = evalctx->resolveArguments(args, optargs, usermodule && !OpenSCAD::parameterCheck); for (const auto &ass : assignments) { this->set_variable(ass.first, ass.second->evaluate(evalctx)); } } } void Context::set_variable(const std::string &name, const ValuePtr &value) { if (is_config_variable(name)) this->config_variables[name] = value; else this->variables[name] = value; } void Context::set_variable(const std::string &name, const Value &value) { set_variable(name, ValuePtr(value)); } void Context::set_constant(const std::string &name, const ValuePtr &value) { if (this->constants.find(name) != this->constants.end()) { PRINTB("WARNING: Attempt to modify constant '%s'.", name); } else { this->constants[name] = value; } } void Context::set_constant(const std::string &name, const Value &value) { set_constant(name, ValuePtr(value)); } void Context::apply_variables(const Context &other) { for (const auto &var : other.variables) { set_variable(var.first, var.second); } } ValuePtr Context::lookup_variable(const std::string &name, bool silent, const Location &loc) const { if (!this->ctx_stack) { PRINT("ERROR: Context had null stack in lookup_variable()!!"); return ValuePtr::undefined; } if (is_config_variable(name)) { for (int i = this->ctx_stack->size()-1; i >= 0; i--) { const auto &confvars = ctx_stack->at(i)->config_variables; if (confvars.find(name) != confvars.end()) { return confvars.find(name)->second; } } if (!silent) { PRINTB("WARNING: Ignoring unknown variable '%s', %s.", name % loc.toRelativeString(this->documentPath())); } return ValuePtr::undefined; } if (!this->parent && this->constants.find(name) != this->constants.end()) { return this->constants.find(name)->second; } if (this->variables.find(name) != this->variables.end()) { return this->variables.find(name)->second; } if (this->parent) { return this->parent->lookup_variable(name, silent, loc); } if (!silent) { PRINTB("WARNING: Ignoring unknown variable '%s', %s.", name % loc.toRelativeString(this->documentPath())); } return ValuePtr::undefined; } double Context::lookup_variable_with_default(const std::string &variable, const double &def, const Location &loc) const { ValuePtr v = this->lookup_variable(variable, true, loc); return (v->type() == Value::ValueType::NUMBER) ? v->toDouble() : def; } std::string Context::lookup_variable_with_default(const std::string &variable, const std::string &def, const Location &loc) const { ValuePtr v = this->lookup_variable(variable, true, loc); return (v->type() == Value::ValueType::STRING) ? v->toString() : def; } bool Context::has_local_variable(const std::string &name) const { if (is_config_variable(name)) { return config_variables.find(name) != config_variables.end(); } if (!parent && constants.find(name) != constants.end()) { return true; } return variables.find(name) != variables.end(); } /** * This is separated because PRINTB uses quite a lot of stack space * and the methods using it evaluate_function() and instantiate_module() * are called often when recursive functions or modules are evaluated. * noinline prevents compiler optimization, as we here specifically * optimize for stack usage during normal operating, not runtime during * error handling. * * @param what what is ignored * @param name name of the ignored object * @param loc location of the function/modul call * @param docPath document path of the root file, used to calculate the relative path */ static void NOINLINE print_ignore_warning(const char *what, const char *name, const Location &loc, const char *docPath){ PRINTB("WARNING: Ignoring unknown %s '%s', %s.", what % name % loc.toRelativeString(docPath)); } ValuePtr Context::evaluate_function(const std::string &name, const EvalContext *evalctx) const { if (this->parent) return this->parent->evaluate_function(name, evalctx); print_ignore_warning("function", name.c_str(),evalctx->loc,this->documentPath().c_str()); return ValuePtr::undefined; } AbstractNode *Context::instantiate_module(const ModuleInstantiation &inst, EvalContext *evalctx) const { if (this->parent) return this->parent->instantiate_module(inst, evalctx); print_ignore_warning("module", inst.name().c_str(),evalctx->loc,this->documentPath().c_str()); return nullptr; } /*! Returns the absolute path to the given filename, unless it's empty. */ std::string Context::getAbsolutePath(const std::string &filename) const { if (!filename.empty() && !fs::path(filename).is_absolute()) { return fs::absolute(fs::path(this->document_path) / filename).string(); } else { return filename; } } #ifdef DEBUG std::string Context::dump(const AbstractModule *mod, const ModuleInstantiation *inst) { std::ostringstream s; if (inst) { s << boost::format("ModuleContext %p (%p) for %s inst (%p)\n") % this % this->parent % inst->name() % inst; } else { s << boost::format("Context: %p (%p)\n") % this % this->parent; } s << boost::format(" document path: %s\n") % this->document_path; if (mod) { const UserModule *m = dynamic_cast(mod); if (m) { s << " module args:"; for(const auto &arg : m->definition_arguments) { s << boost::format(" %s = %s\n") % arg.name % variables[arg.name]; } } } typedef std::pair ValueMapType; s << " vars:\n"; for(const auto &v : constants) { s << boost::format(" %s = %s\n") % v.first % v.second->toEchoString(); } for(const auto &v : variables) { s << boost::format(" %s = %s\n") % v.first % v.second->toEchoString(); } for(const auto &v : config_variables) { s << boost::format(" %s = %s\n") % v.first % v.second->toEchoString(); } return s.str(); } #endif openscad-2019.05/src/context.h0000644000076500000240000000376113414440264016534 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include "value.h" #include "Assignment.h" #include "memory.h" class Context { public: typedef std::vector Stack; Context(const Context *parent = nullptr); virtual ~Context(); const Context *getParent() const { return this->parent; } virtual ValuePtr evaluate_function(const std::string &name, const class EvalContext *evalctx) const; virtual class AbstractNode *instantiate_module(const class ModuleInstantiation &inst, EvalContext *evalctx) const; void setVariables(const class EvalContext *evalctx, const AssignmentList &args, const AssignmentList &optargs={}, bool usermodule=false); void set_variable(const std::string &name, const ValuePtr &value); void set_variable(const std::string &name, const Value &value); void set_constant(const std::string &name, const ValuePtr &value); void set_constant(const std::string &name, const Value &value); void apply_variables(const Context &other); ValuePtr lookup_variable(const std::string &name, bool silent = false, const Location &loc=Location::NONE) const; double lookup_variable_with_default(const std::string &variable, const double &def, const Location &loc=Location::NONE) const; std::string lookup_variable_with_default(const std::string &variable, const std::string &def, const Location &loc=Location::NONE) const; bool has_local_variable(const std::string &name) const; void setDocumentPath(const std::string &path) { this->document_path = path; } const std::string &documentPath() const { return this->document_path; } std::string getAbsolutePath(const std::string &filename) const; public: protected: const Context *parent; Stack *ctx_stack; typedef std::unordered_map ValueMap; ValueMap constants; ValueMap variables; ValueMap config_variables; std::string document_path; public: #ifdef DEBUG virtual std::string dump(const class AbstractModule *mod, const ModuleInstantiation *inst); #endif }; openscad-2019.05/src/control.cc0000644000076500000240000003003213427162620016656 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "module.h" #include "ModuleInstantiation.h" #include "node.h" #include "evalcontext.h" #include "modcontext.h" #include "expression.h" #include "builtin.h" #include "printutils.h" #include class ControlModule : public AbstractModule { public: // types enum class Type { CHILD, CHILDREN, ECHO, ASSERT, ASSIGN, FOR, LET, INT_FOR, IF }; public: // methods ControlModule(Type type) : type(type) { } ControlModule(Type type, const Feature& feature) : AbstractModule(feature), type(type) { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; static void for_eval(AbstractNode &node, const ModuleInstantiation &inst, size_t l, const Context *ctx, const EvalContext *evalctx); static const EvalContext* getLastModuleCtx(const EvalContext *evalctx); static AbstractNode* getChild(const ValuePtr &value, const EvalContext* modulectx); private: // data Type type; }; // class ControlModule void ControlModule::for_eval(AbstractNode &node, const ModuleInstantiation &inst, size_t l, const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() > l) { const std::string &it_name = evalctx->getArgName(l); ValuePtr it_values = evalctx->getArgValue(l, ctx); Context c(ctx); if (it_values->type() == Value::ValueType::RANGE) { RangeType range = it_values->toRange(); uint32_t steps = range.numValues(); if (steps >= 10000) { PRINTB("WARNING: Bad range parameter in for statement: too many elements (%lu), %s", steps % inst.location().toRelativeString(ctx->documentPath())); } else { for (RangeType::iterator it = range.begin();it != range.end();it++) { c.set_variable(it_name, ValuePtr(*it)); for_eval(node, inst, l+1, &c, evalctx); } } } else if (it_values->type() == Value::ValueType::VECTOR) { for (size_t i = 0; i < it_values->toVector().size(); i++) { c.set_variable(it_name, it_values->toVector()[i]); for_eval(node, inst, l+1, &c, evalctx); } } else if (it_values->type() == Value::ValueType::STRING) { utf8_split(it_values->toString(), [&](ValuePtr v) { c.set_variable(it_name, v); for_eval(node, inst, l+1, &c, evalctx); }); } else if (it_values->type() != Value::ValueType::UNDEFINED) { c.set_variable(it_name, it_values); for_eval(node, inst, l+1, &c, evalctx); } } else if (l > 0) { // At this point, the for loop variables have been set and we can initialize // the local scope (as they may depend on the for loop variables Context c(ctx); for(const auto &ass : inst.scope.assignments) { c.set_variable(ass.name, ass.expr->evaluate(&c)); } std::vector instantiatednodes = inst.instantiateChildren(&c); node.children.insert(node.children.end(), instantiatednodes.begin(), instantiatednodes.end()); } } const EvalContext* ControlModule::getLastModuleCtx(const EvalContext *evalctx) { // Find the last custom module invocation, which will contain // an eval context with the children of the module invokation const Context *tmpc = evalctx; while (tmpc->getParent()) { const ModuleContext *modulectx = dynamic_cast(tmpc->getParent()); if (modulectx) { // This will trigger if trying to invoke child from the root of any file // assert(filectx->evalctx); if (modulectx->evalctx) { return modulectx->evalctx; } return nullptr; } tmpc = tmpc->getParent(); } return nullptr; } // static AbstractNode* ControlModule::getChild(const ValuePtr &value, const EvalContext* modulectx) { if (value->type()!=Value::ValueType::NUMBER) { // Invalid parameter // (e.g. first child of difference is invalid) PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number, vector, range.", value->toString()); return nullptr; } double v; if (!value->getDouble(v)) { PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number, vector, range.", value->toString()); return nullptr; } int n = static_cast(trunc(v)); if (n < 0) { PRINTB("WARNING: Negative children index (%d) not allowed", n); return nullptr; // Disallow negative child indices } if (n >= static_cast(modulectx->numChildren())) { // How to deal with negative objects in this case? // (e.g. first child of difference is invalid) PRINTB("WARNING: Children index (%d) out of bounds (%d children)" , n % modulectx->numChildren()); return nullptr; } // OK return modulectx->getChild(n)->evaluate(modulectx); } AbstractNode *ControlModule::instantiate(const Context* ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { AbstractNode *node = nullptr; switch (this->type) { case Type::CHILD: { printDeprecation("child() will be removed in future releases. Use children() instead."); int n = 0; if (evalctx->numArgs() > 0) { double v; if (evalctx->getArgValue(0)->getDouble(v)) { n = trunc(v); if (n < 0) { PRINTB("WARNING: Negative child index (%d) not allowed, %s", n % evalctx->loc.toRelativeString(ctx->documentPath())); return nullptr; // Disallow negative child indices } } } // Find the last custom module invocation, which will contain // an eval context with the children of the module invokation const EvalContext *modulectx = getLastModuleCtx(evalctx); if (modulectx==nullptr) { return nullptr; } // This will trigger if trying to invoke child from the root of any file if (n < (int)modulectx->numChildren()) { node = modulectx->getChild(n)->evaluate(modulectx); } else { // How to deal with negative objects in this case? // (e.g. first child of difference is invalid) PRINTB("WARNING: Child index (%d) out of bounds (%d children), %s", n % modulectx->numChildren() % evalctx->loc.toRelativeString(ctx->documentPath())); } return node; } break; case Type::CHILDREN: { const EvalContext *modulectx = getLastModuleCtx(evalctx); if (modulectx==nullptr) { return nullptr; } // This will trigger if trying to invoke child from the root of any file // assert(filectx->evalctx); if (evalctx->numArgs()<=0) { // no parameters => all children AbstractNode* node = new GroupNode(inst); for (int n = 0; n < (int)modulectx->numChildren(); ++n) { AbstractNode* childnode = modulectx->getChild(n)->evaluate(modulectx); if (childnode==nullptr) continue; // error node->children.push_back(childnode); } return node; } else if (evalctx->numArgs()>0) { // one (or more ignored) parameter ValuePtr value = evalctx->getArgValue(0); if (value->type() == Value::ValueType::NUMBER) { return getChild(value, modulectx); } else if (value->type() == Value::ValueType::VECTOR) { AbstractNode* node = new GroupNode(inst); const Value::VectorType& vect = value->toVector(); for(const auto &vectvalue : vect) { AbstractNode* childnode = getChild(vectvalue,modulectx); if (childnode==nullptr) continue; // error node->children.push_back(childnode); } return node; } else if (value->type() == Value::ValueType::RANGE) { RangeType range = value->toRange(); uint32_t steps = range.numValues(); if (steps >= 10000) { PRINTB("WARNING: Bad range parameter for children: too many elements (%lu), %s", steps % evalctx->loc.toRelativeString(ctx->documentPath())); return nullptr; } AbstractNode* node = new GroupNode(inst); for (RangeType::iterator it = range.begin();it != range.end();it++) { AbstractNode* childnode = getChild(ValuePtr(*it),modulectx); // with error cases if (childnode==nullptr) continue; // error node->children.push_back(childnode); } return node; } else { // Invalid parameter // (e.g. first child of difference is invalid) PRINTB("WARNING: Bad parameter type (%s) for children, only accept: empty, number, vector, range, %s", value->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); return nullptr; } } return nullptr; } break; case Type::ECHO: { node = new GroupNode(inst); PRINTB("%s", STR("ECHO: " << *evalctx)); } break; case Type::ASSERT: { node = new GroupNode(inst); Context c(evalctx); evaluate_assert(c, evalctx); inst->scope.apply(c); node->children = inst->instantiateChildren(&c); } break; case Type::LET: { node = new GroupNode(inst); Context c(evalctx); evalctx->assignTo(c); inst->scope.apply(c); std::vector instantiatednodes = inst->instantiateChildren(&c); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } break; case Type::ASSIGN: { node = new GroupNode(inst); // We create a new context to avoid parameters from influencing each other // -> parallel evaluation. This is to be backwards compatible. Context c(evalctx); for (size_t i = 0; i < evalctx->numArgs(); i++) { if (!evalctx->getArgName(i).empty()) c.set_variable(evalctx->getArgName(i), evalctx->getArgValue(i)); } // Let any local variables override the parameters inst->scope.apply(c); std::vector instantiatednodes = inst->instantiateChildren(&c); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } break; case Type::FOR: node = new GroupNode(inst); for_eval(*node, *inst, 0, evalctx, evalctx); break; case Type::INT_FOR: node = new AbstractIntersectionNode(inst); for_eval(*node, *inst, 0, evalctx, evalctx); break; case Type::IF: { node = new GroupNode(inst); const IfElseModuleInstantiation *ifelse = dynamic_cast(inst); if (evalctx->numArgs() > 0 && evalctx->getArgValue(0)->toBool()) { inst->scope.apply(*evalctx); std::vector instantiatednodes = ifelse->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } else { ifelse->else_scope.apply(*evalctx); std::vector instantiatednodes = ifelse->instantiateElseChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } } break; } return node; } void register_builtin_control() { Builtins::init("child", new ControlModule(ControlModule::Type::CHILD)); Builtins::init("children", new ControlModule(ControlModule::Type::CHILDREN)); Builtins::init("echo", new ControlModule(ControlModule::Type::ECHO)); Builtins::init("assert", new ControlModule(ControlModule::Type::ASSERT)); Builtins::init("assign", new ControlModule(ControlModule::Type::ASSIGN)); Builtins::init("for", new ControlModule(ControlModule::Type::FOR)); Builtins::init("let", new ControlModule(ControlModule::Type::LET)); Builtins::init("intersection_for", new ControlModule(ControlModule::Type::INT_FOR)); Builtins::init("if", new ControlModule(ControlModule::Type::IF)); } openscad-2019.05/src/csgnode.cc0000644000076500000240000001763713433421332016633 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "csgnode.h" #include "Geometry.h" #include "linalg.h" #include "printutils.h" #include #include #include #include /*! \class CSGNode CSG trees consiste of CSGNode instances; either a CSGLeaf node containing geometry or a CSGOperation performing a basic CSG operation on its operands. Note: To distinguish between geometry evaluated to an empty volume and non-geometric nodes (e.g. echo), a nullptr CSGLeaf is considered a non-geometric node, while a CSGLeaf with a nullptr geometry is considered empty geometry. This is important when e.g. establishing positive vs. negative volumes using the difference operator. */ /*! \class CSGProducts A CSGProducts is just a vector of CSGProduct nodes. primitives, each having a CSG type associated with it. It's created by importing a CSGTerm tree. */ /*! \class CSGProduct A CSGProduct is a vector of intersections and a vector of subtractions, used for CSG rendering. */ shared_ptr CSGOperation::createCSGNode(OpenSCADOperator type, shared_ptr left, shared_ptr right) { // In case we're creating a CSG terms from a pruned tree, left/right can be nullptr if (!right) { if (type == OpenSCADOperator::UNION || type == OpenSCADOperator::DIFFERENCE) return left; else return right; } if (!left) { if (type == OpenSCADOperator::UNION) return right; else return left; } // Pruning the tree. For details, see "Solid Modeling" by Goldfeather: // http://www.cc.gatech.edu/~turk/my_papers/pxpl_csg.pdf const auto &leftbox = left->getBoundingBox(); const auto &rightbox = right->getBoundingBox(); Vector3d newmin, newmax; if (type == OpenSCADOperator::INTERSECTION) { newmin = leftbox.min().array().cwiseMax( rightbox.min().array() ); newmax = leftbox.max().array().cwiseMin( rightbox.max().array() ); BoundingBox newbox(newmin, newmax); if (newbox.isNull()) { return shared_ptr(); // Prune entire product } } else if (type == OpenSCADOperator::DIFFERENCE) { newmin = leftbox.min().array().cwiseMax( rightbox.min().array() ); newmax = leftbox.max().array().cwiseMin( rightbox.max().array() ); BoundingBox newbox( newmin, newmax ); if (newbox.isNull()) { return left; // Prune the negative component } } return shared_ptr(new CSGOperation(type, left, right)); } CSGLeaf::CSGLeaf(const shared_ptr &geom, const Transform3d &matrix, const Color4f &color, const std::string &label) : label(label), matrix(matrix), color(color) { if (geom && !geom->isEmpty()) this->geom = geom; initBoundingBox(); } CSGOperation::CSGOperation(OpenSCADOperator type, shared_ptr left, shared_ptr right) : type(type) { this->children.push_back(left); this->children.push_back(right); initBoundingBox(); } CSGOperation::CSGOperation(OpenSCADOperator type, CSGNode *left, CSGNode *right) : type(type) { this->children.push_back(shared_ptr(left)); this->children.push_back(shared_ptr(right)); initBoundingBox(); } void CSGLeaf::initBoundingBox() { if (!this->geom) return; this->bbox = this->matrix * this->geom->getBoundingBox(); } void CSGOperation::initBoundingBox() { const auto &leftbox = this->left()->getBoundingBox(); const auto &rightbox = this->right()->getBoundingBox(); Vector3d newmin, newmax; switch (this->type) { case OpenSCADOperator::UNION: newmin = leftbox.min().array().cwiseMin( rightbox.min().array() ); newmax = leftbox.max().array().cwiseMax( rightbox.max().array() ); this->bbox = BoundingBox( newmin, newmax ); break; case OpenSCADOperator::INTERSECTION: newmin = leftbox.min().array().cwiseMax( rightbox.min().array() ); newmax = leftbox.max().array().cwiseMin( rightbox.max().array() ); this->bbox = BoundingBox( newmin, newmax ); break; case OpenSCADOperator::DIFFERENCE: this->bbox = leftbox; break; default: assert(false); } } std::string CSGLeaf::dump() { return this->label; } std::string CSGOperation::dump() { switch (type) { case OpenSCADOperator::UNION: return STR("(" << left()->dump() << " + " << right()->dump() << ")"); case OpenSCADOperator::INTERSECTION: return STR("(" << left()->dump() << " * " << right()->dump() << ")"); case OpenSCADOperator::DIFFERENCE: return STR("(" << left()->dump() << " - " << right()->dump() << ")"); default: assert(false); return ""; } } void CSGProducts::import(shared_ptr csgnode, OpenSCADOperator type, CSGNode::Flag flags) { std::stack, OpenSCADOperator, CSGNode::Flag>> callstack; callstack.push(std::make_tuple(csgnode, type, flags)); do { auto args = callstack.top(); callstack.pop(); csgnode = std::get<0>(args); type = std::get<1>(args); flags = std::get<2>(args); auto newflags = static_cast(csgnode->getFlags() | flags); if (auto leaf = dynamic_pointer_cast(csgnode)) { if (type == OpenSCADOperator::UNION && this->currentproduct->intersections.size() > 0) { this->createProduct(); } else if (type == OpenSCADOperator::DIFFERENCE) { this->currentlist = &this->currentproduct->subtractions; } else if (type == OpenSCADOperator::INTERSECTION) { this->currentlist = &this->currentproduct->intersections; } this->currentlist->push_back(CSGChainObject(leaf, newflags)); } else if (auto op = dynamic_pointer_cast(csgnode)) { assert(op->left() && op->right()); callstack.emplace(op->right(), op->getType(), newflags); callstack.emplace(op->left(), type, newflags); } } while(!callstack.empty()); } std::string CSGProduct::dump() const { std::ostringstream dump; dump << this->intersections.front().leaf->label; for(const auto &csgobj : boost::make_iterator_range(this->intersections.begin() + 1, this->intersections.end())) { dump << " *" << csgobj.leaf->label; } for(const auto &csgobj : this->subtractions) { dump << " -" << csgobj.leaf->label; } return dump.str(); } BoundingBox CSGProduct::getBoundingBox() const { BoundingBox bbox; for(const auto &csgobj : this->intersections) { if (csgobj.leaf->geom) { auto psbox = csgobj.leaf->geom->getBoundingBox(); // FIXME: Should intersect rather than extend if (!psbox.isEmpty()) bbox.extend(csgobj.leaf->matrix * psbox); } } return bbox; } std::string CSGProducts::dump() const { std::ostringstream dump; for(const auto &product : this->products) { dump << "+" << product.dump() << "\n"; } return dump.str(); } BoundingBox CSGProducts::getBoundingBox() const { BoundingBox bbox; for(const auto &product : this->products) { bbox.extend(product.getBoundingBox()); } return bbox; } size_t CSGProducts::size() const { size_t count = 0; for(const auto &product : this->products) { count += product.intersections.size() + product.subtractions.size(); } return count; } openscad-2019.05/src/csgnode.h0000644000076500000240000000645613441031431016466 0ustar kintelstaff00000000000000#pragma once #include #include #include "memory.h" #include "linalg.h" #include "enums.h" class CSGNode { public: enum Flag { FLAG_NONE = 0x00, FLAG_BACKGROUND = 0x01, FLAG_HIGHLIGHT = 0x02 }; CSGNode(Flag flags = FLAG_NONE) : flags(flags) {} virtual ~CSGNode() {} virtual std::string dump() = 0; const BoundingBox &getBoundingBox() const { return this->bbox; } unsigned int getFlags() const { return this->flags; } bool isHighlight() const { return this->flags & FLAG_HIGHLIGHT; } bool isBackground() const { return this->flags & FLAG_BACKGROUND; } void setHighlight(bool on) { on ? this->flags |= FLAG_HIGHLIGHT : this->flags &= ~FLAG_HIGHLIGHT; } void setBackground(bool on) { on ? this->flags |= FLAG_BACKGROUND : this->flags &= ~FLAG_BACKGROUND; } protected: virtual void initBoundingBox() = 0; BoundingBox bbox; unsigned int flags; friend class CSGProducts; }; class CSGOperation : public CSGNode { public: CSGOperation() {} ~CSGOperation() {} void initBoundingBox() override; std::string dump() override; shared_ptr &left() { return this->children[0]; } shared_ptr &right() { return this->children[1]; } OpenSCADOperator getType() const { return this->type; } static shared_ptr createCSGNode(OpenSCADOperator type, shared_ptr left, shared_ptr right); static shared_ptr createCSGNode(OpenSCADOperator type, CSGNode *left, CSGNode *right) { return createCSGNode(type, shared_ptr(left), shared_ptr(right)); } private: CSGOperation(OpenSCADOperator type, shared_ptr left, shared_ptr right); CSGOperation(OpenSCADOperator type, CSGNode *left, CSGNode *right); OpenSCADOperator type; std::vector > children; }; class CSGLeaf : public CSGNode { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW CSGLeaf(const shared_ptr &geom, const Transform3d &matrix, const Color4f &color, const std::string &label); ~CSGLeaf() {} void initBoundingBox() override; std::string dump() override; std::string label; shared_ptr geom; Transform3d matrix; Color4f color; friend class CSGProducts; }; /* Flags are accumulated in the CSG tree, so the rendered object may have different flags than the corresponding leaf node. */ class CSGChainObject { public: CSGChainObject(const shared_ptr &leaf, CSGNode::Flag flags = CSGNode::FLAG_NONE) : leaf(leaf), flags(flags) {} shared_ptr leaf; CSGNode::Flag flags; }; class CSGProduct { public: CSGProduct() {} ~CSGProduct() {} std::string dump() const; BoundingBox getBoundingBox() const; std::vector intersections; std::vector subtractions; }; class CSGProducts { public: CSGProducts() { this->createProduct(); } ~CSGProducts() {} void import(shared_ptr csgtree, OpenSCADOperator type = OpenSCADOperator::UNION, CSGNode::Flag flags = CSGNode::FLAG_NONE); std::string dump() const; BoundingBox getBoundingBox() const; std::vector products; size_t size() const; private: void createProduct() { this->products.push_back(CSGProduct()); this->currentproduct = &this->products.back(); this->currentlist = &this->currentproduct->intersections; } std::vector *currentlist; CSGProduct *currentproduct; }; openscad-2019.05/src/csgops.cc0000644000076500000240000000504613402025764016503 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "csgops.h" #include "evalcontext.h" #include "module.h" #include "ModuleInstantiation.h" #include "csgnode.h" #include "builtin.h" #include #include class CsgModule : public AbstractModule { public: OpenSCADOperator type; CsgModule(OpenSCADOperator type) : type(type) { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *CsgModule::instantiate(const Context*, const ModuleInstantiation *inst, EvalContext *evalctx) const { inst->scope.apply(*evalctx); auto node = new CsgOpNode(inst, type); auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string CsgOpNode::toString() const { return this->name() + "()"; } std::string CsgOpNode::name() const { switch (this->type) { case OpenSCADOperator::UNION: return "union"; break; case OpenSCADOperator::DIFFERENCE: return "difference"; break; case OpenSCADOperator::INTERSECTION: return "intersection"; break; default: assert(false); } return "internal_error"; } void register_builtin_csgops() { Builtins::init("union", new CsgModule(OpenSCADOperator::UNION)); Builtins::init("difference", new CsgModule(OpenSCADOperator::DIFFERENCE)); Builtins::init("intersection", new CsgModule(OpenSCADOperator::INTERSECTION)); } openscad-2019.05/src/csgops.h0000644000076500000240000000047513402025764016346 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "enums.h" class CsgOpNode : public AbstractNode { public: VISITABLE(); OpenSCADOperator type; CsgOpNode(const ModuleInstantiation *mi, OpenSCADOperator type) : AbstractNode(mi), type(type) { } std::string toString() const override; std::string name() const override; }; openscad-2019.05/src/degree_trig.cc0000644000076500000240000001356113441031431017455 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // // Trigonometry function taking degrees, accurate for 30, 45, 60 and 90, etc. // #include "degree_trig.h" #include #include #define M_SQRT3 1.73205080756887719318 /* sqrt(3) */ #define M_SQRT3_4 0.86602540378443859659 /* sqrt(3/4) == sqrt(3)/2 */ #define M_SQRT1_3 0.57735026918962573106 /* sqrt(1/3) == sqrt(3)/3 */ static inline double rad2deg(double x) { return x * 180 / M_PI; } static inline double deg2rad(double x) { return x * M_PI / 180; } // this limit assumes 26+26=52 bits mantissa // comment/undefine it to disable domain check #define TRIG_HUGE_VAL ((1L<<26)*360.0*(1L<<26)) double sin_degrees(double x) { // use positive tests because of possible Inf/NaN if (x < 360.0 && x >= 0.0) { // Ok for now } else #ifdef TRIG_HUGE_VAL if (x < TRIG_HUGE_VAL && x > -TRIG_HUGE_VAL) #endif { double revolutions = floor(x/360.0); x -= 360.0*revolutions; } #ifdef TRIG_HUGE_VAL else { // total loss of computational accuracy // the result would be meaningless return std::numeric_limits::quiet_NaN(); } #endif bool oppose = x >= 180.0; if (oppose) x -= 180.0; if (x > 90.0) x = 180.0 - x; if (x < 45.0) { if (x == 30.0) x = 0.5; else x = sin(deg2rad(x)); } else if (x == 45.0) { x = M_SQRT1_2; } else if (x == 60.0) { x = M_SQRT3_4; } else { // Inf/Nan would fall here x = cos(deg2rad(90.0-x)); } return oppose ? -x : x; } double cos_degrees(double x) { // use positive tests because of possible Inf/NaN if (x < 360.0 && x >= 0.0) { // Ok for now } else #ifdef TRIG_HUGE_VAL if (x < TRIG_HUGE_VAL && x > -TRIG_HUGE_VAL) #endif { double revolutions = floor(x/360.0); x -= 360.0*revolutions; } #ifdef TRIG_HUGE_VAL else { // total loss of computational accuracy // the result would be meaningless return std::numeric_limits::quiet_NaN(); } #endif bool oppose = x >= 180.0; if (oppose) x -= 180.0; if (x > 90.0) { x = 180.0 - x; oppose = !oppose; } if (x > 45.0) { if (x == 60.0) x = 0.5; else x = sin(deg2rad(90.0-x)); } else if (x == 45.0) { x = M_SQRT1_2; } else if (x == 30.0) { x = M_SQRT3_4; } else { // Inf/Nan would fall here x = cos(deg2rad(x)); } return oppose ? -x : x; } double tan_degrees(double x) { int cycles = floor((x) / 180.0); // use positive tests because of possible Inf/NaN if (x < 180.0 && x >= 0.0) { // Ok for now } else #ifdef TRIG_HUGE_VAL if (x < TRIG_HUGE_VAL && x > -TRIG_HUGE_VAL) #endif { x -= 180.0*cycles; } #ifdef TRIG_HUGE_VAL else { // total loss of computational accuracy // the result would be meaningless return std::numeric_limits::quiet_NaN(); } #endif bool oppose = x > 90.0; if (oppose) x = 180.0-x; if (x == 0.0) { x = (cycles % 2) == 0 ? 0.0 : -0.0; } else if (x == 30.0) { x = M_SQRT1_3; } else if (x == 45.0) { x = 1.0; } else if (x == 60.0) { x = M_SQRT3; } else if (x == 90.0) { x = (cycles % 2) == 0 ? std::numeric_limits::infinity() : -std::numeric_limits::infinity(); } else { x = tan(deg2rad(x)); } return oppose ? -x : x; } // // Inverse trig // double asin_degrees(double x) { const auto degs = rad2deg(asin(x)); const auto whole = round(degs); if(sin_degrees(whole) == x) return whole; return degs; } double acos_degrees(double x) { const auto degs = rad2deg(acos(x)); const auto whole = round(degs); if(cos_degrees(whole) == x) return whole; return degs; } double atan_degrees(double x) { const auto degs = rad2deg(atan(x)); const auto whole = round(degs); if(tan_degrees(whole) == x) return whole; return degs; } double atan2_degrees(double y, double x) { const auto degs = rad2deg(atan2(y, x)); const auto whole = round(degs); if(fabs(degs - whole) < 3.0E-14) return whole; return degs; } // // Rotation_matrix_from_axis_and_angle // Matrix3d angle_axis_degrees(double a, Vector3d v) { Matrix3d M{Matrix3d::Identity()}; // Formula from https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle // We avoid dividing by the square root of the magnitude as much as possible // to minimise rounding errors. const auto s = sin_degrees(a); const auto c = cos_degrees(a); const auto m = v.squaredNorm(); if (m > 0) { const Vector3d Cv = v * ((1 - c) / m); const Vector3d us = v.normalized() * s; M << Cv[0] * v[0] + c, Cv[1] * v[0] - us[2], Cv[2] * v[0] + us[1], Cv[0] * v[1] + us[2], Cv[1] * v[1] + c, Cv[2] * v[1] - us[0], Cv[0] * v[2] - us[1], Cv[1] * v[2] + us[0], Cv[2] * v[2] + c; } return M; } // // 2D rotation matrix from angle in degrees // Matrix3d rotate_degrees(double angle) { Eigen::Matrix3d m; const auto s = sin_degrees(angle); const auto c = cos_degrees(angle); m << c, -s, 0, s, c, 0, 0, 0, 1; return m; } openscad-2019.05/src/degree_trig.h0000644000076500000240000000306613414440264017326 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // // Trigonometry function taking degrees, accurate for 30, 45, 60 and 90, etc. // #pragma once #include "linalg.h" double sin_degrees(double x); double cos_degrees(double x); double tan_degrees(double x); double asin_degrees(double x); double acos_degrees(double x); double atan_degrees(double x); double atan2_degrees(double y, double x); Matrix3d angle_axis_degrees(double a, Vector3d v); Matrix3d rotate_degrees(double angle); openscad-2019.05/src/dxfdata.cc0000644000076500000240000004763713414456427016643 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "dxfdata.h" #include "grid.h" #include "printutils.h" #include "calc.h" #include #include #include #include #include #include #include #include #include #include "value.h" #include "boost-utils.h" #include "Polygon2d.h" #include "printutils.h" #include "degree_trig.h" namespace fs = boost::filesystem; /*! \class DxfData The DxfData class fulfils multiple tasks, partially for historical reasons. FIXME: It's a bit messy and is a prime target for refactoring. 1) Read DXF file from disk 2) Store contents of DXF files as points, paths and dims 3) Store 2D polygons, both from the polygon() module and from 2D CSG operations. Used for tesselation into triangles 4) Store 2D polygons before exporting to DXF */ struct Line { int idx[2]; // indices into DxfData::points bool disabled; Line(int i1 = -1, int i2 = -1) : idx{i1, i2}, disabled(false) { } }; DxfData::DxfData() { } /*! Reads a layer from the given file, or all layers if layername.empty() */ DxfData::DxfData(double fn, double fs, double fa, const std::string &filename, const std::string &layername, double xorigin, double yorigin, double scale) { std::ifstream stream(filename.c_str()); if (!stream.good()) { PRINTB("WARNING: Can't open DXF file '%s'.", filename); return; } Grid2d> grid(GRID_COARSE); std::vector lines; // Global lines std::unordered_map> blockdata; // Lines in blocks auto in_entities_section = false; auto in_blocks_section = false; std::string current_block; #define ADD_LINE(_x1, _y1, _x2, _y2) do { \ double _p1x = _x1, _p1y = _y1, _p2x = _x2, _p2y = _y2; \ if (!in_entities_section && !in_blocks_section) \ break; \ if (in_entities_section && \ !(layername.empty() || layername == layer)) \ break; \ grid.align(_p1x, _p1y); \ grid.align(_p2x, _p2y); \ grid.data(_p1x, _p1y).push_back(lines.size()); \ grid.data(_p2x, _p2y).push_back(lines.size()); \ if (in_entities_section) \ lines.emplace_back( \ addPoint(_p1x, _p1y), addPoint(_p2x, _p2y)); \ if (in_blocks_section && !current_block.empty()) \ blockdata[current_block].emplace_back( \ addPoint(_p1x, _p1y), addPoint(_p2x, _p2y)); \ } while (0) std::string mode, layer, name, iddata; int dimtype = 0; double coords[7][2]; // Used by DIMENSION entities std::vector xverts; std::vector yverts; double radius = 0; double arc_start_angle = 0, arc_stop_angle = 0; double ellipse_start_angle = 0, ellipse_stop_angle = 0; for (int i = 0; i < 7; i++) { for (int j = 0; j < 2; j++) { coords[i][j] = 0; } } typedef std::unordered_map EntityList; EntityList unsupported_entities_list; // // Parse DXF file. Will populate this->points, this->dims, lines and blockdata // while (!stream.eof()) { std::string id_str, data; std::getline(stream, id_str); boost::trim(id_str); std::getline(stream, data); boost::trim(data); int id; try { id = boost::lexical_cast(id_str); } catch (const boost::bad_lexical_cast &blc) { if (!stream.eof()) { PRINTB("WARNING: Illegal ID '%s' in `%s'", id_str % filename); } break; } try { if (id >= 10 && id <= 16) { if (in_blocks_section) { coords[id-10][0] = boost::lexical_cast(data); } else if (id == 11 || id == 12 || id == 16) { coords[id-10][0] = boost::lexical_cast(data) * scale; } else { coords[id-10][0] = (boost::lexical_cast(data) - xorigin) * scale; } } if (id >= 20 && id <= 26) { if (in_blocks_section) { coords[id-20][1] = boost::lexical_cast(data); } else if (id == 21 || id == 22 || id == 26) { coords[id-20][1] = boost::lexical_cast(data) * scale; } else { coords[id-20][1] = (boost::lexical_cast(data) - yorigin) * scale; } } switch (id) { case 0: if (mode == "SECTION") { in_entities_section = iddata == "ENTITIES"; in_blocks_section = iddata == "BLOCKS"; } else if (mode == "LINE") { ADD_LINE(xverts.at(0), yverts.at(0), xverts.at(1), yverts.at(1)); } else if (mode == "LWPOLYLINE") { // assert(xverts.size() == yverts.size()); // Get maximum to enforce managed exception if xverts.size() != yverts.size() int numverts = std::max(xverts.size(), yverts.size()); for (int i=1;i arc_stop_angle) { arc_stop_angle += 360.0; } double arc_angle = arc_stop_angle - arc_start_angle; n = static_cast(ceil(n * arc_angle / 360)); for (int i = 0; i < n; i++) { double a1 = arc_start_angle + arc_angle * i / n; double a2 = arc_start_angle + arc_angle * (i + 1) / n; ADD_LINE(cos_degrees(a1)*radius + center[0], sin_degrees(a1)*radius + center[1], cos_degrees(a2)*radius + center[0], sin_degrees(a2)*radius + center[1]); } } else if (mode == "ELLIPSE") { // Commented code is meant as documentation of vector math while (ellipse_start_angle > ellipse_stop_angle) ellipse_stop_angle += 2 * M_PI; // Vector2d center(xverts[0], yverts[0]); Vector2d center(xverts.at(0), yverts.at(0)); // Vector2d ce(xverts[1], yverts[1]); Vector2d ce(xverts.at(1), yverts.at(1)); // double r_major = ce.length(); double r_major = sqrt(ce[0]*ce[0] + ce[1]*ce[1]); // double rot_angle = ce.angle(); double rot_angle; { // double dot = ce.dot(Vector2d(1.0, 0.0)); double dot = ce[0]; double cosval = dot / r_major; if (cosval > 1.0) cosval = 1.0; if (cosval < -1.0) cosval = -1.0; rot_angle = acos(cosval); if (ce[1] < 0.0) rot_angle = 2 * M_PI - rot_angle; } // the ratio stored in 'radius; due to the parser code not checking entity type double r_minor = r_major * radius; double sweep_angle = ellipse_stop_angle-ellipse_start_angle; int n = Calc::get_fragments_from_r(r_major, fn, fs, fa); n = static_cast(ceil(n * sweep_angle / (2 * M_PI))); // Vector2d p1; Vector2d p1{0.0, 0.0}; for (int i=0;i<=n;i++) { double a = (ellipse_start_angle + sweep_angle*i/n); // Vector2d p2(cos(a)*r_major, sin(a)*r_minor); Vector2d p2(cos(a)*r_major, sin(a)*r_minor); // p2.rotate(rot_angle); Vector2d p2_rot(cos(rot_angle)*p2[0] - sin(rot_angle)*p2[1], sin(rot_angle)*p2[0] + cos(rot_angle)*p2[1]); // p2 += center; p2_rot[0] += center[0]; p2_rot[1] += center[1]; if (i > 0) { // ADD_LINE(p1[0], p1[1], p2[0], p2[1]); ADD_LINE(p1[0], p1[1], p2_rot[0], p2_rot[1]); } // p1 = p2; p1[0] = p2_rot[0]; p1[1] = p2_rot[1]; } } else if (mode == "INSERT") { // scale is stored in ellipse_start|stop_angle, rotation in arc_start_angle; // due to the parser code not checking entity type int n = blockdata[iddata].size(); for (int i = 0; i < n; i++) { double a = arc_start_angle; double lx1 = this->points[blockdata[iddata][i].idx[0]][0] * ellipse_start_angle; double ly1 = this->points[blockdata[iddata][i].idx[0]][1] * ellipse_stop_angle; double lx2 = this->points[blockdata[iddata][i].idx[1]][0] * ellipse_start_angle; double ly2 = this->points[blockdata[iddata][i].idx[1]][1] * ellipse_stop_angle; double px1 = (cos_degrees(a)*lx1 - sin_degrees(a)*ly1) * scale + xverts.at(0); double py1 = (sin_degrees(a)*lx1 + cos_degrees(a)*ly1) * scale + yverts.at(0); double px2 = (cos_degrees(a)*lx2 - sin_degrees(a)*ly2) * scale + xverts.at(0); double py2 = (sin_degrees(a)*lx2 + cos_degrees(a)*ly2) * scale + yverts.at(0); ADD_LINE(px1, py1, px2, py2); } } else if (mode == "DIMENSION" && (layername.empty() || layername == layer)) { this->dims.push_back(Dim()); this->dims.back().type = dimtype; for (int i = 0; i < 7; i++) { for (int j = 0; j < 2; j++) { this->dims.back().coords[i][j] = coords[i][j]; } } this->dims.back().angle = arc_start_angle; this->dims.back().length = radius; this->dims.back().name = name; } else if (mode == "BLOCK") { current_block = iddata; } else if (mode == "ENDBLK") { current_block.erase(); } else if (mode == "ENDSEC") { } else if (in_blocks_section || (in_entities_section && (layername.empty() || layername == layer))) { unsupported_entities_list[mode]++; } mode = data; layer.erase(); name.erase(); iddata.erase(); dimtype = 0; for (int i = 0; i < 7; i++) { for (int j = 0; j < 2; j++) { coords[i][j] = 0; } } xverts.clear(); yverts.clear(); radius = arc_start_angle = arc_stop_angle = 0; ellipse_start_angle = ellipse_stop_angle = 0; if (mode == "INSERT") { ellipse_start_angle = ellipse_stop_angle = 1.0; // scale } break; case 1: name = data; break; case 2: iddata = data; break; case 8: layer = data; break; case 10: if (in_blocks_section) { xverts.push_back((boost::lexical_cast(data))); } else { xverts.push_back((boost::lexical_cast(data) - xorigin) * scale); } break; case 11: if (in_blocks_section) { xverts.push_back((boost::lexical_cast(data))); } else { xverts.push_back((boost::lexical_cast(data) - xorigin) * scale); } break; case 20: if (in_blocks_section) { yverts.push_back((boost::lexical_cast(data))); } else { yverts.push_back((boost::lexical_cast(data) - yorigin) * scale); } break; case 21: if (in_blocks_section) { yverts.push_back((boost::lexical_cast(data))); } else { yverts.push_back((boost::lexical_cast(data) - yorigin) * scale); } break; case 40: // CIRCLE, ARC: radius // ELLIPSE: minor to major ratio // DIMENSION (radial, diameter): Leader length radius = boost::lexical_cast(data); if (!in_blocks_section) radius *= scale; break; case 41: // ELLIPSE: start_angle // INSERT: X scale ellipse_start_angle = boost::lexical_cast(data); break; case 50: // ARC: start_angle // INSERT: rot angle // DIMENSION: linear and rotated: angle arc_start_angle = boost::lexical_cast(data); break; case 42: // ELLIPSE: stop_angle // INSERT: Y scale ellipse_stop_angle = boost::lexical_cast(data); break; case 51: // ARC arc_stop_angle = boost::lexical_cast(data); break; case 70: // LWPOLYLINE: polyline flag // DIMENSION: dimension type dimtype = boost::lexical_cast(data); break; } } catch (boost::bad_lexical_cast &blc) { PRINTB("WARNING: Illegal value %s in '%s'", data % filename); } catch (const std::out_of_range& oor) { PRINTB("WARNING: not enough input values for %s in '%s'", data % filename); } } for (const auto &i : unsupported_entities_list) { if (layername.empty()) { PRINTB("WARNING: Unsupported DXF Entity '%s' (%x) in %s.", i.first % i.second % QuotedString(boostfs_uncomplete(filename, fs::current_path()).generic_string())); } else { PRINTB("WARNING: Unsupported DXF Entity '%s' (%x) in layer '%s' of %s.", i.first % i.second % layername % QuotedString(boostfs_uncomplete(filename, fs::current_path()).generic_string())); } } // Extract paths from parsed data typedef std::map LineMap; LineMap enabled_lines; for (size_t i = 0; i < lines.size(); i++) { enabled_lines[i] = i; } // extract all open paths while (enabled_lines.size() > 0) { int current_line, current_point; for (const auto &l : enabled_lines) { int idx = l.second; for (int j = 0; j < 2; j++) { auto lv = grid.data(this->points[lines[idx].idx[j]][0], this->points[lines[idx].idx[j]][1]); for (size_t ki = 0; ki < lv.size(); ki++) { int k = lv.at(ki); if (k == idx || lines[k].disabled) continue; goto next_open_path_j; } current_line = idx; current_point = j; goto create_open_path; next_open_path_j:; } } break; create_open_path: this->paths.push_back(Path()); Path *this_path = &this->paths.back(); this_path->indices.push_back(lines[current_line].idx[current_point]); while (1) { this_path->indices.push_back(lines[current_line].idx[!current_point]); const auto &ref_point = this->points[lines[current_line].idx[!current_point]]; lines[current_line].disabled = true; enabled_lines.erase(current_line); auto lv = grid.data(ref_point[0], ref_point[1]); for (size_t ki = 0; ki < lv.size(); ki++) { int k = lv.at(ki); if (lines[k].disabled) continue; if (grid.eq(ref_point[0], ref_point[1], this->points[lines[k].idx[0]][0], this->points[lines[k].idx[0]][1])) { current_line = k; current_point = 0; goto found_next_line_in_open_path; } if (grid.eq(ref_point[0], ref_point[1], this->points[lines[k].idx[1]][0], this->points[lines[k].idx[1]][1])) { current_line = k; current_point = 1; goto found_next_line_in_open_path; } } break; found_next_line_in_open_path:; } } // extract all closed paths while (enabled_lines.size() > 0) { int current_line = enabled_lines.begin()->second; int current_point = 0; this->paths.push_back(Path()); auto& this_path = this->paths.back(); this_path.is_closed = true; this_path.indices.push_back(lines[current_line].idx[current_point]); while (1) { this_path.indices.push_back(lines[current_line].idx[!current_point]); const auto &ref_point = this->points[lines[current_line].idx[!current_point]]; lines[current_line].disabled = true; enabled_lines.erase(current_line); auto lv = grid.data(ref_point[0], ref_point[1]); for (size_t ki = 0; ki < lv.size(); ki++) { int k = lv.at(ki); if (lines[k].disabled) continue; if (grid.eq(ref_point[0], ref_point[1], this->points[lines[k].idx[0]][0], this->points[lines[k].idx[0]][1])) { current_line = k; current_point = 0; goto found_next_line_in_closed_path; } if (grid.eq(ref_point[0], ref_point[1], this->points[lines[k].idx[1]][0], this->points[lines[k].idx[1]][1])) { current_line = k; current_point = 1; goto found_next_line_in_closed_path; } } break; found_next_line_in_closed_path:; } } fixup_path_direction(); #if 0 printf("----- DXF Data -----\n"); for (int i = 0; i < this->paths.size(); i++) { printf("Path %d (%s):\n", i, this->paths[i].is_closed ? "closed" : "open"); for (int j = 0; j < this->paths[i].points.size(); j++) printf(" %f %f\n", (*this->paths[i].points[j])[0], (*this->paths[i].points[j])[1]); } printf("--------------------\n"); fflush(stdout); #endif } /*! Ensures that all paths have the same vertex ordering. FIXME: CW or CCW? */ void DxfData::fixup_path_direction() { for (size_t i = 0; i < this->paths.size(); i++) { if (!this->paths[i].is_closed) break; this->paths[i].is_inner = true; double min_x = this->points[this->paths[i].indices[0]][0]; size_t min_x_point = 0; for (size_t j = 1; j < this->paths[i].indices.size(); j++) { if (this->points[this->paths[i].indices[j]][0] < min_x) { min_x = this->points[this->paths[i].indices[j]][0]; min_x_point = j; } } // rotate points if the path is in non-standard rotation size_t b = min_x_point; size_t a = b == 0 ? this->paths[i].indices.size() - 2 : b - 1; size_t c = b == this->paths[i].indices.size() - 1 ? 1 : b + 1; double ax = this->points[this->paths[i].indices[a]][0] - this->points[this->paths[i].indices[b]][0]; double ay = this->points[this->paths[i].indices[a]][1] - this->points[this->paths[i].indices[b]][1]; double cx = this->points[this->paths[i].indices[c]][0] - this->points[this->paths[i].indices[b]][0]; double cy = this->points[this->paths[i].indices[c]][1] - this->points[this->paths[i].indices[b]][1]; #if 0 printf("Rotate check:\n"); printf(" a/b/c indices = %d %d %d\n", a, b, c); printf(" b->a vector = %f %f (%f)\n", ax, ay, atan2(ax, ay)); printf(" b->c vector = %f %f (%f)\n", cx, cy, atan2(cx, cy)); #endif // FIXME: atan2() usually takes y,x. This variant probably makes the path clockwise.. if (atan2(ax, ay) < atan2(cx, cy)) { std::reverse(this->paths[i].indices.begin(), this->paths[i].indices.end()); } } } /*! Adds a vertex and returns the index into DxfData::points */ int DxfData::addPoint(double x, double y) { this->points.emplace_back(x, y); return this->points.size() - 1; } std::string DxfData::dump() const { std::ostringstream out; out << "DxfData" << "\n num points: " << points.size() << "\n num paths: " << paths.size() << "\n num dims: " << dims.size() << "\n points: "; for (size_t k = 0; k < points.size(); k++ ) { out << "\n x y: " << points[k].transpose(); } out << "\n paths: "; for (size_t i = 0; i < paths.size(); i++) { out << "\n path:" << i << "\n is_closed: " << paths[i].is_closed << "\n is_inner: " << paths[i].is_inner ; DxfData::Path path = paths[i]; for (size_t j = 0; j < path.indices.size(); j++) { out << "\n index[" << j << "]==" << path.indices[j]; } } out << "\nDxfData end"; return out.str(); } /* May return an empty polygon, but will not return nullptr */ Polygon2d *DxfData::toPolygon2d() const { auto poly = new Polygon2d(); for (size_t i = 0; i < this->paths.size(); i++) { const auto &path = this->paths[i]; Outline2d outline; size_t endidx = path.indices.size(); // We don't support open paths; closing them to be compatible with existing behavior if (!path.is_closed) endidx++; for (size_t j = 1; j < endidx; j++) { outline.vertices.push_back(this->points[path.indices[path.indices.size()-j]]); } poly->addOutline(outline); } return poly; } openscad-2019.05/src/dxfdata.h0000644000076500000240000000160013441031431016441 0ustar kintelstaff00000000000000#pragma once #include #include "linalg.h" class DxfData { public: struct Path { std::vector indices; // indices into DxfData::points bool is_closed, is_inner; Path() : is_closed(false), is_inner(false) { } }; struct Dim { unsigned int type; double coords[7][2]; double angle; double length; std::string name; Dim() { for (int i = 0; i < 7; i++) for (int j = 0; j < 2; j++) coords[i][j] = 0; type = 0; angle = 0; length = 0; } }; VectorOfVector2d points; std::vector paths; std::vector dims; DxfData(); DxfData(double fn, double fs, double fa, const std::string &filename, const std::string &layername = "", double xorigin = 0.0, double yorigin = 0.0, double scale = 1.0); int addPoint(double x, double y); void fixup_path_direction(); std::string dump() const; class Polygon2d *toPolygon2d() const; }; openscad-2019.05/src/dxfdim.cc0000644000076500000240000002137113432700636016460 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "dxfdim.h" #include "value.h" #include "function.h" #include "dxfdata.h" #include "builtin.h" #include "printutils.h" #include "fileutils.h" #include "evalcontext.h" #include "handle_dep.h" #include "degree_trig.h" #include #include #include #include std::unordered_map dxf_dim_cache; std::unordered_map dxf_cross_cache; namespace fs = boost::filesystem; ValuePtr builtin_dxf_dim(const Context *ctx, const EvalContext *evalctx) { std::string rawFilename; std::string filename; std::string layername; std::string name; double xorigin = 0; double yorigin = 0; double scale = 1; // FIXME: We don't lookup the file relative to where this function was instantiated // since the path is only available for ModuleInstantiations, not function expressions. // See issue #217 for (size_t i = 0; i < evalctx->numArgs(); i++) { ValuePtr n = evalctx->getArgName(i); ValuePtr v = evalctx->getArgValue(i); if (evalctx->getArgName(i) == "file") { rawFilename = v->toString(); filename = lookup_file(rawFilename, evalctx->documentPath(), ctx->documentPath()); }else if (n == "layer") { layername = v->toString(); }else if (n == "origin"){ bool originOk = v->getVec2(xorigin, yorigin); originOk &= std::isfinite(xorigin) && std::isfinite(yorigin); if(!originOk){ PRINTB("WARNING: dxf_dim(..., origin=%s) could not be converted, %s", v->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } }else if (n == "scale"){ v->getDouble(scale); } else if (n == "name") { name = v->toString(); }else{ PRINTB("WARNING: dxf_dim(..., %s=...) is not supported, %s", n->toString() % evalctx->loc.toRelativeString(ctx->documentPath())); } } fs::path filepath(filename); uintmax_t filesize = -1; time_t lastwritetime = -1; if (fs::exists(filepath)) { if(fs::is_regular_file(filepath)){ filesize = fs::file_size(filepath); lastwritetime = fs::last_write_time(filepath); } }else{ PRINTB("WARNING: Can't open DXF file '%s'! %s", rawFilename % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } std::string key = STR(filename << "|" << layername << "|" << name << "|" << xorigin << "|" << yorigin <<"|" << scale << "|" << lastwritetime << "|" << filesize); if (dxf_dim_cache.find(key) != dxf_dim_cache.end()) return dxf_dim_cache.find(key)->second; handle_dep(filepath.string()); DxfData dxf(36, 0, 0, filename, layername, xorigin, yorigin, scale); for (size_t i = 0; i < dxf.dims.size(); i++) { if (!name.empty() && dxf.dims[i].name != name) continue; DxfData::Dim *d = &dxf.dims[i]; int type = d->type & 7; if (type == 0) { // Rotated, horizontal or vertical double x = d->coords[4][0] - d->coords[3][0]; double y = d->coords[4][1] - d->coords[3][1]; double angle = d->angle; double distance_projected_on_line = std::fabs(x * cos_degrees(angle) + y * sin_degrees(angle)); return dxf_dim_cache[key] = ValuePtr(distance_projected_on_line); } else if (type == 1) { // Aligned double x = d->coords[4][0] - d->coords[3][0]; double y = d->coords[4][1] - d->coords[3][1]; return dxf_dim_cache[key] = ValuePtr(sqrt(x*x + y*y)); } else if (type == 2) { // Angular double a1 = atan2_degrees(d->coords[0][0] - d->coords[5][0], d->coords[0][1] - d->coords[5][1]); double a2 = atan2_degrees(d->coords[4][0] - d->coords[3][0], d->coords[4][1] - d->coords[3][1]); return dxf_dim_cache[key] = ValuePtr(std::fabs(a1 - a2)); } else if (type == 3 || type == 4) { // Diameter or Radius double x = d->coords[5][0] - d->coords[0][0]; double y = d->coords[5][1] - d->coords[0][1]; return dxf_dim_cache[key] = ValuePtr(sqrt(x*x + y*y)); } else if (type == 5) { // Angular 3 Point } else if (type == 6) { // Ordinate return dxf_dim_cache[key] = ValuePtr((d->type & 64) ? d->coords[3][0] : d->coords[3][1]); } PRINTB("WARNING: Dimension '%s' in '%s', layer '%s' has unsupported type! %s", name % rawFilename % layername % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } PRINTB("WARNING: Can't find dimension '%s' in '%s', layer '%s'! %s", name % rawFilename % layername % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } ValuePtr builtin_dxf_cross(const Context *ctx, const EvalContext *evalctx) { std::string filename; std::string rawFilename; std::string layername; double xorigin = 0; double yorigin = 0; double scale = 1; // FIXME: We don't lookup the file relative to where this function was instantiated // since the path is only available for ModuleInstantiations, not function expressions. // See issue #217 for (size_t i = 0; i < evalctx->numArgs(); i++) { ValuePtr n = evalctx->getArgName(i); ValuePtr v = evalctx->getArgValue(i); if (n == "file"){ rawFilename = v->toString(); filename = ctx->getAbsolutePath(rawFilename); }else if (n == "layer"){ layername = v->toString(); }else if (n == "origin"){ bool originOk = v->getVec2(xorigin, yorigin); originOk &= std::isfinite(xorigin) && std::isfinite(yorigin); if(!originOk){ PRINTB("WARNING: dxf_cross(..., origin=%s) could not be converted, %s", v->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } }else if (n == "scale"){ v->getDouble(scale); }else{ PRINTB("WARNING: dxf_cross(..., %s=...) is not supported, %s", n->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } } fs::path filepath(filename); uintmax_t filesize = -1; time_t lastwritetime = -1; if (fs::exists(filepath)) { if(fs::is_regular_file(filepath)){ filesize = fs::file_size(filepath); lastwritetime = fs::last_write_time(filepath); } }else{ PRINTB("WARNING: Can't open DXF file '%s'! %s", rawFilename % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } std::string key = STR(filename << "|" << layername << "|" << xorigin << "|" << yorigin << "|" << scale << "|" << lastwritetime << "|" << filesize); if (dxf_cross_cache.find(key) != dxf_cross_cache.end()) { return dxf_cross_cache.find(key)->second; } handle_dep(filepath.string()); DxfData dxf(36, 0, 0, filename, layername, xorigin, yorigin, scale); double coords[4][2]; for (size_t i = 0, j = 0; i < dxf.paths.size(); i++) { if (dxf.paths[i].indices.size() != 2) continue; coords[j][0] = dxf.points[dxf.paths[i].indices[0]][0]; coords[j++][1] = dxf.points[dxf.paths[i].indices[0]][1]; coords[j][0] = dxf.points[dxf.paths[i].indices[1]][0]; coords[j++][1] = dxf.points[dxf.paths[i].indices[1]][1]; if (j == 4) { double x1 = coords[0][0], y1 = coords[0][1]; double x2 = coords[1][0], y2 = coords[1][1]; double x3 = coords[2][0], y3 = coords[2][1]; double x4 = coords[3][0], y4 = coords[3][1]; double dem = (y4 - y3)*(x2 - x1) - (x4 - x3)*(y2 - y1); if (dem == 0) break; double ua = ((x4 - x3)*(y1 - y3) - (y4 - y3)*(x1 - x3)) / dem; // double ub = ((x2 - x1)*(y1 - y3) - (y2 - y1)*(x1 - x3)) / dem; double x = x1 + ua*(x2 - x1); double y = y1 + ua*(y2 - y1); Value::VectorType ret; ret.push_back(ValuePtr(x)); ret.push_back(ValuePtr(y)); return dxf_cross_cache[key] = ValuePtr(ret); } } PRINTB("WARNING: Can't find cross in '%s', layer '%s'! %s", rawFilename % layername % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } void initialize_builtin_dxf_dim() { Builtins::init("dxf_dim", new BuiltinFunction(&builtin_dxf_dim)); Builtins::init("dxf_cross", new BuiltinFunction(&builtin_dxf_cross)); } openscad-2019.05/src/dxfdim.h0000644000076500000240000000027513402025764016321 0ustar kintelstaff00000000000000#pragma once #include #include "value.h" extern std::unordered_map dxf_dim_cache; extern std::unordered_map dxf_cross_cache; openscad-2019.05/src/editor.cc0000644000076500000240000000070013402025764016463 0ustar kintelstaff00000000000000#include "editor.h" #include "Preferences.h" #include "QSettingsCached.h" void EditorInterface::wheelEvent(QWheelEvent *event) { QSettingsCached settings; bool wheelzoom_enabled = Preferences::inst()->getValue("editor/ctrlmousewheelzoom").toBool(); if ((event->modifiers() == Qt::ControlModifier) && wheelzoom_enabled) { if (event->delta() > 0) zoomIn(); else if (event->delta() < 0) zoomOut(); } else { QWidget::wheelEvent(event); } } openscad-2019.05/src/editor.h0000644000076500000240000000351213445047371016336 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include #include class EditorInterface : public QWidget { Q_OBJECT public: EditorInterface(QWidget *parent) : QWidget(parent) {} ~EditorInterface() {} virtual QSize sizeHint() const override { QSize size; return size;} virtual void setInitialSizeHint(const QSize&) { } void wheelEvent(QWheelEvent*) override; virtual QString toPlainText() = 0; virtual QTextDocument *document(){QTextDocument *t = new QTextDocument; return t;} virtual QString selectedText() = 0; virtual int updateFindIndicators(const QString &findText, bool visibility = true) = 0; virtual bool find(const QString &, bool findNext = false, bool findBackwards = false) = 0; virtual void replaceSelectedText(const QString &newText) = 0; virtual void replaceAll(const QString &findText, const QString &replaceText) = 0; virtual QStringList colorSchemes() = 0; virtual bool canUndo() = 0; signals: void contentsChanged(); void modificationChanged(bool); public slots: virtual void zoomIn() = 0; virtual void zoomOut() = 0; virtual void setContentModified(bool) = 0; virtual bool isContentModified() = 0; virtual void indentSelection() = 0; virtual void unindentSelection() = 0; virtual void commentSelection() = 0; virtual void uncommentSelection() = 0; virtual void setPlainText(const QString &) = 0; virtual void highlightError(int) = 0; virtual void unhighlightLastError() = 0; virtual void setHighlightScheme(const QString&) = 0; virtual void insert(const QString&) = 0; virtual void setText(const QString&) = 0; virtual void undo() = 0; virtual void redo() = 0; virtual void cut() = 0; virtual void copy() = 0; virtual void paste() = 0; virtual void initFont(const QString&, uint) = 0; private: QSize initialSizeHint; }; openscad-2019.05/src/enums.h0000644000076500000240000000023313402025764016167 0ustar kintelstaff00000000000000#pragma once #undef DIFFERENCE //#defined in winuser.h enum class OpenSCADOperator { UNION, INTERSECTION, DIFFERENCE, MINKOWSKI, HULL, RESIZE }; openscad-2019.05/src/evalcontext.cc0000644000076500000240000001113613424454746017550 0ustar kintelstaff00000000000000#include "evalcontext.h" #include "UserModule.h" #include "ModuleInstantiation.h" #include "expression.h" #include "function.h" #include "printutils.h" #include "builtin.h" #include "localscope.h" #include "exceptions.h" EvalContext::EvalContext(const Context *parent, const AssignmentList &args, const Location &loc, const class LocalScope *const scope) : Context(parent), loc(loc), eval_arguments(args), scope(scope) { } const std::string &EvalContext::getArgName(size_t i) const { assert(i < this->eval_arguments.size()); return this->eval_arguments[i].name; } ValuePtr EvalContext::getArgValue(size_t i, const Context *ctx) const { assert(i < this->eval_arguments.size()); const auto &arg = this->eval_arguments[i]; ValuePtr v; if (arg.expr) { v = arg.expr->evaluate(ctx ? ctx : this); } return v; } /*! Resolves arguments specified by evalctx, using args to lookup positional arguments. optargs is for optional arguments that are not positional arguments. Returns an AssignmentMap (string -> Expression*) */ AssignmentMap EvalContext::resolveArguments(const AssignmentList &args, const AssignmentList &optargs, bool silent) const { AssignmentMap resolvedArgs; size_t posarg = 0; bool tooManyWarned=false; // Iterate over positional args for (size_t i=0; inumArgs(); i++) { const auto &name = this->getArgName(i); // name is optional const auto expr = this->getArgs()[i].expr.get(); if (!name.empty()) { if(name.at(0)!='$' && !silent){ bool found=false; for(auto const& arg: args) { if(arg.name == name) found=true; } for(auto const& arg: optargs) { if(arg.name == name) found=true; } if(!found){ PRINTB("WARNING: variable %s not specified as parameter, %s", name % this->loc.toRelativeString(this->documentPath())); } } if(resolvedArgs.find(name) != resolvedArgs.end()){ PRINTB("WARNING: argument %s supplied more then once, %s", name % this->loc.toRelativeString(this->documentPath())); } resolvedArgs[name] = expr; } // If positional, find name of arg with this position else if (posarg < args.size()) resolvedArgs[args[posarg++].name] = expr; else if (!silent && !tooManyWarned){ PRINTB("WARNING: Too many unnamed arguments supplied, %s", this->loc.toRelativeString(this->documentPath())); tooManyWarned=true; } } return resolvedArgs; } size_t EvalContext::numChildren() const { return this->scope ? this->scope->children.size() : 0; } ModuleInstantiation *EvalContext::getChild(size_t i) const { return this->scope ? this->scope->children[i] : nullptr; } void EvalContext::assignTo(Context &target) const { for (const auto &assignment : this->eval_arguments) { ValuePtr v; if (assignment.expr) v = assignment.expr->evaluate(&target); if(assignment.name.empty()){ PRINTB("WARNING: Assignment without variable name %s, %s", v->toEchoString() % this->loc.toRelativeString(target.documentPath())); }else if (target.has_local_variable(assignment.name)) { PRINTB("WARNING: Ignoring duplicate variable assignment %s = %s, %s", assignment.name % v->toEchoString() % this->loc.toRelativeString(target.documentPath())); } else { target.set_variable(assignment.name, v); } } } std::ostream &operator<<(std::ostream &stream, const EvalContext &ec) { for (size_t i = 0; i < ec.numArgs(); i++) { if (i > 0) stream << ", "; if (!ec.getArgName(i).empty()) stream << ec.getArgName(i) << " = "; auto val = ec.getArgValue(i); stream << val->toEchoString(); } return stream; } #ifdef DEBUG std::string EvalContext::dump(const AbstractModule *mod, const ModuleInstantiation *inst) { std::ostringstream s; if (inst) s << boost::format("EvalContext %p (%p) for %s inst (%p)") % this % this->parent % inst->name() % inst; else s << boost::format("Context: %p (%p)") % this % this->parent; s << boost::format(" document path: %s") % this->document_path; s << boost::format(" eval args:"); for (size_t i=0;ieval_arguments.size();i++) { s << boost::format(" %s = %s") % this->eval_arguments[i].name % this->eval_arguments[i].expr; } if (this->scope && this->scope->children.size() > 0) { s << boost::format(" children:"); for(const auto &ch : this->scope->children) { s << boost::format(" %s") % ch->name(); } } if (mod) { const UserModule *m = dynamic_cast(mod); if (m) { s << boost::format(" module args:"); for(const auto &arg : m->definition_arguments) { s << boost::format(" %s = %s") % arg.name % *(variables[arg.name]); } } } return s.str(); } #endif openscad-2019.05/src/evalcontext.h0000644000076500000240000000233113414440264017374 0ustar kintelstaff00000000000000#pragma once #include "context.h" #include "Assignment.h" /*! This hold the evaluation context (the parameters actually sent when calling a module or function, including the children). */ class EvalContext : public Context { public: typedef std::vector InstanceList; EvalContext(const Context *parent, const AssignmentList &args, const Location &loc, const class LocalScope *const scope = nullptr); ~EvalContext() {} size_t numArgs() const { return this->eval_arguments.size(); } const std::string &getArgName(size_t i) const; ValuePtr getArgValue(size_t i, const Context *ctx = nullptr) const; const AssignmentList & getArgs() const { return this->eval_arguments; } AssignmentMap resolveArguments(const AssignmentList &args, const AssignmentList &optargs, bool silent) const; size_t numChildren() const; ModuleInstantiation *getChild(size_t i) const; void assignTo(Context &target) const; #ifdef DEBUG virtual std::string dump(const class AbstractModule *mod, const ModuleInstantiation *inst); #endif const Location &loc; private: const AssignmentList &eval_arguments; const LocalScope *const scope; }; std::ostream &operator<<(std::ostream &stream, const EvalContext &ec); openscad-2019.05/src/exceptions.h0000644000076500000240000000321213424454746017233 0ustar kintelstaff00000000000000#pragma once #include #include #include "expression.h" #include "printutils.h" class EvaluationException : public std::runtime_error { public: EvaluationException(const std::string &what_arg) : std::runtime_error(what_arg) {} ~EvaluationException() throw() {} public: int traceDepth=12; }; class AssertionFailedException : public EvaluationException { public: AssertionFailedException(const std::string &what_arg, const Location &loc) : EvaluationException(what_arg), loc(loc) {} ~AssertionFailedException() throw() {} public: Location loc; }; class RecursionException: public EvaluationException { public: static RecursionException create(const std::string &recursiontype, const std::string &name, const Location &loc) { return RecursionException{STR("ERROR: Recursion detected calling " << recursiontype << " '" << name << "'"), loc}; } ~RecursionException() throw() {} public: Location loc; private: RecursionException(const std::string &what_arg, const Location &loc) : EvaluationException(what_arg), loc(loc) {} }; class LoopCntException: public EvaluationException { public: static LoopCntException create(const std::string &type, const Location &loc) { return LoopCntException{STR("ERROR: " << type << " loop counter exceeded limit"), loc}; } ~LoopCntException() throw() {} public: Location loc; private: LoopCntException(const std::string &what_arg, const Location &loc) : EvaluationException(what_arg), loc(loc) {} }; class HardWarningException : public EvaluationException { public: HardWarningException(const std::string &what_arg) : EvaluationException(what_arg) {} ~HardWarningException() throw() {} }; openscad-2019.05/src/export.cc0000644000076500000240000000542113402025764016523 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "printutils.h" #include "Geometry.h" #include #define QUOTE(x__) # x__ #define QUOTED(x__) QUOTE(x__) void exportFile(const shared_ptr &root_geom, std::ostream &output, FileFormat format) { switch (format) { case FileFormat::STL: export_stl(root_geom, output); break; case FileFormat::OFF: export_off(root_geom, output); break; case FileFormat::AMF: export_amf(root_geom, output); break; case FileFormat::_3MF: export_3mf(root_geom, output); break; case FileFormat::DXF: export_dxf(root_geom, output); break; case FileFormat::SVG: export_svg(root_geom, output); break; case FileFormat::NEFDBG: export_nefdbg(root_geom, output); break; case FileFormat::NEF3: export_nef3(root_geom, output); break; default: assert(false && "Unknown file format"); } } void exportFileByName(const shared_ptr &root_geom, FileFormat format, const char *name2open, const char *name2display) { std::ios::openmode mode = std::ios::out | std::ios::trunc; if (format == FileFormat::_3MF) { mode |= std::ios::binary; } std::ofstream fstream(name2open, mode); if (!fstream.is_open()) { PRINTB(_("Can't open file \"%s\" for export"), name2display); } else { bool onerror = false; fstream.exceptions(std::ios::badbit|std::ios::failbit); try { exportFile(root_geom, fstream, format); } catch (std::ios::failure&) { onerror = true; } try { // make sure file closed - resources released fstream.close(); } catch (std::ios::failure&) { onerror = true; } if (onerror) { PRINTB(_("ERROR: \"%s\" write error. (Disk full?)"), name2display); } } } openscad-2019.05/src/export.h0000644000076500000240000000413613402025764016367 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "Tree.h" #include "Camera.h" #include "memory.h" enum class FileFormat { STL, OFF, AMF, _3MF, DXF, SVG, NEFDBG, NEF3 }; void exportFileByName(const shared_ptr &root_geom, FileFormat format, const char *name2open, const char *name2display); void export_stl(const shared_ptr &geom, std::ostream &output); void export_3mf(const shared_ptr &geom, std::ostream &output); void export_off(const shared_ptr &geom, std::ostream &output); void export_amf(const shared_ptr &geom, std::ostream &output); void export_dxf(const shared_ptr &geom, std::ostream &output); void export_svg(const shared_ptr &geom, std::ostream &output); void export_nefdbg(const shared_ptr &geom, std::ostream &output); void export_nef3(const shared_ptr &geom, std::ostream &output); // void exportFile(const class Geometry *root_geom, std::ostream &output, FileFormat format); enum class Previewer { OPENCSG, THROWNTOGETHER }; enum class RenderType { GEOMETRY, CGAL, OPENCSG, THROWNTOGETHER }; struct ViewOption { const std::string name; bool& value; }; struct ViewOptions { Previewer previewer{Previewer::OPENCSG}; RenderType renderer{RenderType::OPENCSG}; std::map flags{ {"axes", false}, {"scales", false}, {"edges", false}, {"wireframe", false}, {"crosshairs", false}, }; const std::vector names() { std::vector names; boost::copy(flags | boost::adaptors::map_keys, std::back_inserter(names)); return names; } bool &operator[](const std::string &name) { return flags.at(name); } bool operator[](const std::string &name) const { return flags.at(name); } }; bool export_png(const shared_ptr &root_geom, const ViewOptions& options, Camera camera, std::ostream &output); bool export_preview_png(Tree &tree, const ViewOptions& options, Camera camera, std::ostream &output); openscad-2019.05/src/export_3mf.cc0000644000076500000240000001705713414440264017277 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2016 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "polyset.h" #include "polyset-utils.h" #include "printutils.h" #ifdef ENABLE_LIB3MF #ifdef ENABLE_CGAL #include #undef BOOL using namespace NMR; #include #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalutils.h" bool triangle_sort_predicate (const CGAL_Triangle_3 t1, const CGAL_Triangle_3 t2) { if (t1.vertex(0) == t2.vertex(0)) { if (t1.vertex(1) == t2.vertex(1)) { return t1.vertex(2) < t2.vertex(2); } return t1.vertex(1) < t2.vertex(1); } return t1.vertex(0) < t2.vertex(0); } static uint32_t lib3mf_write_callback(const char *data, uint32_t bytes, std::ostream *stream) { stream->write(data, bytes); return !(*stream); } static uint32_t lib3mf_seek_callback(uint64_t pos, std::ostream *stream) { stream->seekp(pos); return !(*stream); } static void export_3mf_error(const std::string msg, PLib3MFModel *model = NULL) { PRINT(msg); if (model) { lib3mf_release(model); } } /*! Saves the current 3D CGAL Nef polyhedron as 3MF to the given file. The file must be open. */ static void append_3mf(const CGAL_Nef_polyhedron &root_N, std::ostream &output) { if (!root_N.p3 || !root_N.p3->is_simple()) { PRINT("EXPORT-WARNING: Export failed, the object isn't a valid 2-manifold."); return; } DWORD interfaceVersionMajor, interfaceVersionMinor, interfaceVersionMicro; HRESULT result = lib3mf_getinterfaceversion(&interfaceVersionMajor, &interfaceVersionMinor, &interfaceVersionMicro); if (result != LIB3MF_OK) { PRINT("EXPORT-ERROR: Error reading 3MF library version"); return; } if ((interfaceVersionMajor != NMR_APIVERSION_INTERFACE_MAJOR)) { PRINTB("EXPORT-ERROR: Invalid 3MF library major version %d.%d.%d, expected %d.%d.%d", interfaceVersionMajor % interfaceVersionMinor % interfaceVersionMicro % NMR_APIVERSION_INTERFACE_MAJOR % NMR_APIVERSION_INTERFACE_MINOR % NMR_APIVERSION_INTERFACE_MICRO); return; } PLib3MFModel *model; result = lib3mf_createmodel(&model); if (result != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't create 3MF model."); return; } PLib3MFModelMeshObject *mesh; if (lib3mf_model_addmeshobject(model, &mesh) != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't add mesh to 3MF model.", model); return; } if (lib3mf_object_setnameutf8(mesh, "OpenSCAD Model") != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't set name for 3MF model.", model); return; } CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CGAL_Polyhedron P; root_N.p3->convert_to_Polyhedron(P); typedef CGAL_Polyhedron::Vertex Vertex; typedef CGAL_Polyhedron::Vertex_const_iterator VCI; typedef CGAL_Polyhedron::Facet_const_iterator FCI; typedef CGAL_Polyhedron::Halfedge_around_facet_const_circulator HFCC; // use sorted sets to get a stable sort order in the exported file typedef std::set vertex_set_t; typedef std::vector triangle_list_t; vertex_set_t vertices; triangle_list_t triangles; for (FCI fi = P.facets_begin(); fi != P.facets_end(); ++fi) { HFCC hc = fi->facet_begin(); HFCC hc_end = hc; Vertex v1, v2, v3; v1 = *VCI((hc++)->vertex()); vertices.insert(v1.point()); v3 = *VCI((hc++)->vertex()); vertices.insert(v3.point()); do { v2 = v3; v3 = *VCI((hc++)->vertex()); CGAL_Polyhedron::Point_3 p1, p2, p3; p1 = v1.point(); p2 = v2.point(); p3 = v3.point(); vertices.insert(p3); triangles.push_back(CGAL_Triangle_3(p1, p2, p3)); } while (hc != hc_end); } for (const auto &vertex : vertices) { MODELMESHVERTEX v; v.m_fPosition[0] = CGAL::to_double(vertex.x()); v.m_fPosition[1] = CGAL::to_double(vertex.y()); v.m_fPosition[2] = CGAL::to_double(vertex.z()); if (lib3mf_meshobject_addvertex(mesh, &v, NULL) != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't add vertex to 3MF model.", model); return; } } std::sort(triangles.begin(), triangles.end(), triangle_sort_predicate); for (const auto &triangle : triangles) { MODELMESHTRIANGLE t; t.m_nIndices[0] = std::distance(vertices.begin(), std::find(vertices.begin(), vertices.end(), triangle.vertex(0))); t.m_nIndices[1] = std::distance(vertices.begin(), std::find(vertices.begin(), vertices.end(), triangle.vertex(1))); t.m_nIndices[2] = std::distance(vertices.begin(), std::find(vertices.begin(), vertices.end(), triangle.vertex(2))); if (lib3mf_meshobject_addtriangle(mesh, &t, NULL) != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't add triangle to 3MF model.", model); return; } } PLib3MFModelBuildItem *builditem; if (lib3mf_model_addbuilditem(model, mesh, NULL, &builditem) != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't add triangle to 3MF model.", model); return; } PLib3MFModelWriter *writer; if (lib3mf_model_querywriter(model, "3mf", &writer) != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Can't get writer for 3MF model.", model); return; } result = lib3mf_writer_writetocallback(writer, (void *)lib3mf_write_callback, (void *)lib3mf_seek_callback, &output); output.flush(); lib3mf_release(writer); lib3mf_release(model); if (result != LIB3MF_OK) { export_3mf_error("EXPORT-ERROR: Error writing 3MF model."); } } catch (CGAL::Assertion_exception& e) { PRINTB("EXPORT-ERROR: CGAL error in CGAL_Nef_polyhedron3::convert_to_Polyhedron(): %s", e.what()); } CGAL::set_error_behaviour(old_behaviour); } static void append_3mf(const shared_ptr &geom, std::ostream &output) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(geom.get())) { append_3mf(*N, output); } else if (const PolySet *ps = dynamic_cast(geom.get())) { // FIXME: Implement this without creating a Nef polyhedron CGAL_Nef_polyhedron *N = CGALUtils::createNefPolyhedronFromGeometry(*ps); append_3mf(*N, output); delete N; } else if (const Polygon2d *poly = dynamic_cast(geom.get())) { assert(false && "Unsupported file format"); } else { assert(false && "Not implemented"); } } void export_3mf(const shared_ptr &geom, std::ostream &output) { append_3mf(geom, output); } #endif // ENABLE_CGAL #else // ENABLE_LIB3MF void export_3mf(const shared_ptr &, std::ostream &) { PRINT("Export to 3MF format was not enabled when building the application."); } #endif // ENABLE_LIB3MF openscad-2019.05/src/export_amf.cc0000644000076500000240000001514413414440717017353 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "polyset.h" #include "polyset-utils.h" #include "dxfdata.h" #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalutils.h" #define QUOTE(x__) # x__ #define QUOTED(x__) QUOTE(x__) struct triangle { std::string vs1; std::string vs2; std::string vs3; }; static int objectid; /*! Saves the current 3D CGAL Nef polyhedron as AMF to the given file. The file must be open. */ static void append_amf(const CGAL_Nef_polyhedron &root_N, std::ostream &output) { if (!root_N.p3->is_simple()) { PRINT("EXPORT-WARNING: Export failed, the object isn't a valid 2-manifold."); return; } CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CGAL_Polyhedron P; root_N.p3->convert_to_Polyhedron(P); typedef CGAL_Polyhedron::Vertex Vertex; typedef CGAL_Polyhedron::Vertex_const_iterator VCI; typedef CGAL_Polyhedron::Facet_const_iterator FCI; typedef CGAL_Polyhedron::Halfedge_around_facet_const_circulator HFCC; std::vector vertices; std::vector triangles; for (FCI fi = P.facets_begin(); fi != P.facets_end(); ++fi) { HFCC hc = fi->facet_begin(); HFCC hc_end = hc; Vertex v1, v2, v3; v1 = *VCI((hc++)->vertex()); v3 = *VCI((hc++)->vertex()); do { v2 = v3; v3 = *VCI((hc++)->vertex()); double x1 = CGAL::to_double(v1.point().x()); double y1 = CGAL::to_double(v1.point().y()); double z1 = CGAL::to_double(v1.point().z()); double x2 = CGAL::to_double(v2.point().x()); double y2 = CGAL::to_double(v2.point().y()); double z2 = CGAL::to_double(v2.point().z()); double x3 = CGAL::to_double(v3.point().x()); double y3 = CGAL::to_double(v3.point().y()); double z3 = CGAL::to_double(v3.point().z()); std::string vs1{STR(x1 << " " << y1 << " " << z1)}; std::string vs2{STR(x2 << " " << y2 << " " << z2)}; std::string vs3{STR(x3 << " " << y3 << " " << z3)}; if (std::find(vertices.begin(), vertices.end(), vs1) == vertices.end()) vertices.push_back(vs1); if (std::find(vertices.begin(), vertices.end(), vs2) == vertices.end()) vertices.push_back(vs2); if (std::find(vertices.begin(), vertices.end(), vs3) == vertices.end()) vertices.push_back(vs3); if (vs1 != vs2 && vs1 != vs3 && vs2 != vs3) { // The above condition ensures that there are 3 distinct vertices, but // they may be collinear. If they are, the unit normal is meaningless // so the default value of "1 0 0" can be used. If the vertices are not // collinear then the unit normal must be calculated from the // components. triangle tri = {vs1, vs2, vs3}; triangles.push_back(tri); } } while (hc != hc_end); } output << " \r\n" << " \r\n"; output << " \r\n"; for (size_t i = 0; i < vertices.size(); i++) { std::string s = vertices[i]; output << " \r\n"; char* chrs = new char[s.length() + 1]; strcpy(chrs, s.c_str()); std::string coords = strtok(chrs, " "); output << " " << coords << "\r\n"; coords = strtok(nullptr, " "); output << " " << coords << "\r\n"; coords = strtok(nullptr, " "); output << " " << coords << "\r\n"; output << " \r\n"; delete[] chrs; } output << " \r\n"; output << " \r\n"; for (size_t i = 0; i < triangles.size(); i++) { triangle t = triangles[i]; output << " \r\n"; size_t index; index = std::distance(vertices.begin(), std::find(vertices.begin(), vertices.end(), t.vs1)); output << " " << index << "\r\n"; index = std::distance(vertices.begin(), std::find(vertices.begin(), vertices.end(), t.vs2)); output << " " << index << "\r\n"; index = std::distance(vertices.begin(), std::find(vertices.begin(), vertices.end(), t.vs3)); output << " " << index << "\r\n"; output << " \r\n"; } output << " \r\n"; output << " \r\n" << " \r\n"; } catch (CGAL::Assertion_exception& e) { PRINTB("EXPORT-ERROR: CGAL error in CGAL_Nef_polyhedron3::convert_to_Polyhedron(): %s", e.what()); } CGAL::set_error_behaviour(old_behaviour); } static void append_amf(const shared_ptr &geom, std::ostream &output) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(geom.get())) { if (!N->isEmpty()) append_amf(*N, output); } else if (const PolySet *ps = dynamic_cast(geom.get())) { // FIXME: Implement this without creating a Nef polyhedron CGAL_Nef_polyhedron *N = CGALUtils::createNefPolyhedronFromGeometry(*ps); if (!N->isEmpty()) append_amf(*N, output); delete N; } else if (dynamic_cast(geom.get())) { assert(false && "Unsupported file format"); } else { assert(false && "Not implemented"); } } void export_amf(const shared_ptr &geom, std::ostream &output) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output output << "\r\n" << "\r\n" << " OpenSCAD " << QUOTED(OPENSCAD_VERSION) #ifdef OPENSCAD_COMMIT << " (git " << QUOTED(OPENSCAD_COMMIT) << ")" #endif << "\r\n"; objectid = 0; append_amf(geom, output); output << "\r\n"; setlocale(LC_NUMERIC, ""); // Set default locale } #endif // ENABLE_CGAL openscad-2019.05/src/export_dxf.cc0000644000076500000240000000623713402025764017372 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "polyset.h" #include "polyset-utils.h" #include "dxfdata.h" /*! Saves the current Polygon2d as DXF to the given absolute filename. */ void export_dxf(const Polygon2d &poly, std::ostream &output) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output // Some importers (e.g. Inkscape) needs a BLOCKS section to be present output << " 0\n" << "SECTION\n" << " 2\n" << "BLOCKS\n" << " 0\n" << "ENDSEC\n" << " 0\n" << "SECTION\n" << " 2\n" << "ENTITIES\n"; for(const auto &o : poly.outlines()) { for (unsigned int i=0;i &geom, std::ostream &output) { if (dynamic_cast(geom.get())) { assert(false && "Unsupported file format"); } else if (const Polygon2d *poly = dynamic_cast(geom.get())) { export_dxf(*poly, output); } else { assert(false && "Export as DXF for this geometry type is not supported"); } } openscad-2019.05/src/export_nef.cc0000644000076500000240000000370613437640540017362 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "printutils.h" #include "Geometry.h" #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalutils.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include // for dumping .nef3 #pragma pop_macro("NDEBUG") void export_nefdbg(const shared_ptr &geom, std::ostream &output) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(geom.get())) { output << N->dump(); } else { PRINT("Not a CGALNefPoly. Add some CSG ops?"); } } void export_nef3(const shared_ptr &geom, std::ostream &output) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(geom.get())) { output << *(N->p3); } else { PRINT("Not a CGALNefPoly. Add some CSG ops?"); } } #endif openscad-2019.05/src/export_off.cc0000644000076500000240000000604613402025764017361 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "polyset.h" #include "polyset-utils.h" #include "dxfdata.h" #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalutils.h" #include "Reindexer.h" #include "grid.h" struct IndexedMesh { IndexedMesh() : numfaces(0) {} Reindexer vertices; std::vector indices; size_t numfaces; }; static void append_geometry(const PolySet &ps, IndexedMesh &mesh) { for(const auto &p : ps.polygons) { for(const auto &v : p) { mesh.indices.push_back(mesh.vertices.lookup(v)); } mesh.numfaces++; mesh.indices.push_back(-1); } } void append_geometry(const shared_ptr &geom, IndexedMesh &mesh) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(geom.get())) { PolySet ps(3); bool err = CGALUtils::createPolySetFromNefPolyhedron3(*(N->p3), ps); if (err) { PRINT("ERROR: Nef->PolySet failed"); } else { append_geometry(ps, mesh); } } else if (const PolySet *ps = dynamic_cast(geom.get())) { append_geometry(*ps, mesh); } else if (dynamic_cast(geom.get())) { assert(false && "Unsupported file format"); } else { assert(false && "Not implemented"); } } void export_off(const shared_ptr &geom, std::ostream &output) { IndexedMesh mesh; append_geometry(geom, mesh); output << "OFF " << mesh.vertices.size() << " " << mesh.numfaces << " 0\n"; const Vector3d *v = mesh.vertices.getArray(); size_t numverts = mesh.vertices.size(); for (size_t i=0;i #include "polyset.h" #include "rendersettings.h" #ifdef ENABLE_CGAL #include "CGALRenderer.h" #include "cgal.h" #include "cgalutils.h" #include "CGAL_Nef_polyhedron.h" static void setupCamera(Camera &cam, const BoundingBox &bbox) { if (cam.viewall) cam.viewAll(bbox); } bool export_png(const shared_ptr &root_geom, const ViewOptions& options, Camera camera, std::ostream &output) { PRINTD("export_png geom"); OffscreenView *glview; try { glview = new OffscreenView(camera.pixel_width, camera.pixel_height); } catch (int error) { fprintf(stderr,"Can't create OpenGL OffscreenView. Code: %i.\n", error); return false; } CGALRenderer cgalRenderer(root_geom); BoundingBox bbox = cgalRenderer.getBoundingBox(); setupCamera(camera, bbox); glview->setCamera(camera); glview->setRenderer(&cgalRenderer); glview->setColorScheme(RenderSettings::inst()->colorscheme); glview->setShowFaces(!options["wireframe"]); glview->setShowCrosshairs(options["crosshairs"]); glview->setShowAxes(options["axes"]); glview->setShowScaleProportional(options["scales"]); glview->setShowEdges(options["edges"]); glview->paintGL(); glview->save(output); return true; } #ifdef ENABLE_OPENCSG #include "OpenCSGRenderer.h" #include #endif #include "ThrownTogetherRenderer.h" bool export_preview_png(Tree &tree, const ViewOptions& options, Camera camera, std::ostream &output) { PRINTD("export_png_preview_common"); CsgInfo csgInfo = CsgInfo(); csgInfo.compile_products(tree); OffscreenView *glview; try { glview = new OffscreenView(camera.pixel_width, camera.pixel_height); } catch (int error) { fprintf(stderr,"Can't create OpenGL OffscreenView. Code: %i.\n", error); return false; } #ifdef ENABLE_OPENCSG OpenCSGRenderer openCSGRenderer(csgInfo.root_products, csgInfo.highlights_products, csgInfo.background_products, glview->shaderinfo); #endif ThrownTogetherRenderer thrownTogetherRenderer(csgInfo.root_products, csgInfo.highlights_products, csgInfo.background_products); if (options.previewer == Previewer::OPENCSG) { #ifdef ENABLE_OPENCSG glview->setRenderer(&openCSGRenderer); #else fprintf(stderr,"This openscad was built without OpenCSG support\n"); return false; #endif } else { glview->setRenderer(&thrownTogetherRenderer); } #ifdef ENABLE_OPENCSG BoundingBox bbox = glview->getRenderer()->getBoundingBox(); setupCamera(camera, bbox); glview->setCamera(camera); OpenCSG::setContext(0); OpenCSG::setOption(OpenCSG::OffscreenSetting, OpenCSG::FrameBufferObject); #endif glview->setColorScheme(RenderSettings::inst()->colorscheme); glview->setShowAxes(options["axes"]); glview->setShowScaleProportional(options["scales"]); glview->setShowEdges(options["edges"]); glview->paintGL(); glview->save(output); return true; } #endif // ENABLE_CGAL openscad-2019.05/src/export_stl.cc0000644000076500000240000001034413414457153017411 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "polyset.h" #include "polyset-utils.h" #include "dxfdata.h" #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalutils.h" namespace { std::string toString(const Vector3d &v) { return STR(v[0] << " " << v[1] << " " << v[2]); } Vector3d fromString(const std::string &vertexString) { Vector3d v; std::istringstream stream{vertexString}; stream >> v[0] >> v[1] >> v[2]; return v; } void append_stl(const PolySet &ps, std::ostream &output) { PolySet triangulated(3); PolysetUtils::tessellate_faces(ps, triangulated); for(const auto &p : triangulated.polygons) { assert(p.size() == 3); // STL only allows triangles std::array vertexStrings; std::transform(p.cbegin(), p.cend(), vertexStrings.begin(), toString); if (vertexStrings[0] != vertexStrings[1] && vertexStrings[0] != vertexStrings[2] && vertexStrings[1] != vertexStrings[2]) { // The above condition ensures that there are 3 distinct vertices, but // they may be collinear. If they are, the unit normal is meaningless // so the default value of "0 0 0" can be used. If the vertices are not // collinear then the unit normal must be calculated from the // components. output << " facet normal "; Vector3d p0 = fromString(vertexStrings[0]); Vector3d p1 = fromString(vertexStrings[1]); Vector3d p2 = fromString(vertexStrings[2]); Vector3d normal = (p1 - p0).cross(p2 - p0); normal.normalize(); if (is_finite(normal) && !is_nan(normal)) { output << normal[0] << " " << normal[1] << " " << normal[2] << "\n"; } else { output << "0 0 0\n"; } output << " outer loop\n"; for (const auto &vertexString : vertexStrings) { output << " vertex " << vertexString << "\n"; } output << " endloop\n"; output << " endfacet\n"; } } } /*! Saves the current 3D CGAL Nef polyhedron as STL to the given file. The file must be open. */ void append_stl(const CGAL_Nef_polyhedron &root_N, std::ostream &output) { if (!root_N.p3->is_simple()) { PRINT("EXPORT-WARNING: Exported object may not be a valid 2-manifold and may need repair"); } PolySet ps(3); if (!CGALUtils::createPolySetFromNefPolyhedron3(*(root_N.p3), ps)) { append_stl(ps, output); } else { PRINT("EXPORT-ERROR: Nef->PolySet failed"); } } void append_stl(const shared_ptr &geom, std::ostream &output) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(geom.get())) { append_stl(*N, output); } else if (const PolySet *ps = dynamic_cast(geom.get())) { append_stl(*ps, output); } else if (dynamic_cast(geom.get())) { assert(false && "Unsupported file format"); } else { assert(false && "Not implemented"); } } } // namespace void export_stl(const shared_ptr &geom, std::ostream &output) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output output << "solid OpenSCAD_Model\n"; append_stl(geom, output); output << "endsolid OpenSCAD_Model\n"; setlocale(LC_NUMERIC, ""); // Set default locale } #endif // ENABLE_CGAL openscad-2019.05/src/export_svg.cc0000644000076500000240000000610113441031431017365 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "export.h" #include "polyset.h" #include "polyset-utils.h" static void append_svg(const Polygon2d &poly, std::ostream &output) { output << "\n"; } static void append_svg(const shared_ptr &geom, std::ostream &output) { if (dynamic_cast(geom.get())) { assert(false && "Unsupported file format"); } else if (const Polygon2d *poly = dynamic_cast(geom.get())) { append_svg(*poly, output); } else { assert(false && "Export as SVG for this geometry type is not supported"); } } void export_svg(const shared_ptr &geom, std::ostream &output) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output BoundingBox bbox = geom->getBoundingBox(); int minx = (int)floor(bbox.min().x()); int miny = (int)floor(-bbox.max().y()); int maxx = (int)ceil(bbox.max().x()); int maxy = (int)ceil(-bbox.min().y()); int width = maxx - minx; int height = maxy - miny; output << "\n" << "\n" << "\n" << "OpenSCAD Model\n"; append_svg(geom, output); output << "\n"; setlocale(LC_NUMERIC, ""); // Set default locale } openscad-2019.05/src/expr.cc0000644000076500000240000005261013445047371016167 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "compiler_specific.h" #include "expression.h" #include "value.h" #include "evalcontext.h" #include #include #include #include #include "printutils.h" #include "stackcheck.h" #include "exceptions.h" #include "feature.h" #include "printutils.h" #include #include using namespace boost::assign; // bring 'operator+=()' into scope // unnamed namespace namespace { bool isListComprehension(const shared_ptr &e) { return dynamic_cast(e.get()); } Value::VectorType flatten(Value::VectorType const& vec) { int n = 0; for (unsigned int i = 0; i < vec.size(); i++) { if (vec[i]->type() == Value::ValueType::VECTOR) { n += vec[i]->toVector().size(); } else { n++; } } Value::VectorType ret; ret.reserve(n); for (unsigned int i = 0; i < vec.size(); i++) { if (vec[i]->type() == Value::ValueType::VECTOR) { std::copy(vec[i]->toVector().begin(),vec[i]->toVector().end(),std::back_inserter(ret)); } else { ret.push_back(vec[i]); } } return ret; } void evaluate_sequential_assignment(const AssignmentList &assignment_list, Context *context, const Location &loc) { EvalContext ctx(context, assignment_list, loc); ctx.assignTo(*context); } } namespace /* anonymous*/ { std::ostream &operator << (std::ostream &o, AssignmentList const& l) { for (size_t i=0; i < l.size(); i++) { const Assignment &arg = l[i]; if (i > 0) o << ", "; if (!arg.name.empty()) o << arg.name << " = "; o << *arg.expr; } return o; } } bool Expression::isLiteral() const { return false; } UnaryOp::UnaryOp(UnaryOp::Op op, Expression *expr, const Location &loc) : Expression(loc), op(op), expr(expr) { } ValuePtr UnaryOp::evaluate(const Context *context) const { switch (this->op) { case (Op::Not): return !this->expr->evaluate(context); case (Op::Negate): return -this->expr->evaluate(context); default: return ValuePtr::undefined; // FIXME: error: } } const char *UnaryOp::opString() const { switch (this->op) { case Op::Not: return "!"; break; case Op::Negate: return "-"; break; default: return ""; // FIXME: Error: unknown op } } bool UnaryOp::isLiteral() const { if(this->expr->isLiteral()) return true; return false; } void UnaryOp::print(std::ostream &stream, const std::string &) const { stream << opString() << *this->expr; } BinaryOp::BinaryOp(Expression *left, BinaryOp::Op op, Expression *right, const Location &loc) : Expression(loc), op(op), left(left), right(right) { } ValuePtr BinaryOp::evaluate(const Context *context) const { switch (this->op) { case Op::LogicalAnd: return this->left->evaluate(context) && this->right->evaluate(context); break; case Op::LogicalOr: return this->left->evaluate(context) || this->right->evaluate(context); break; case Op::Multiply: return this->left->evaluate(context) * this->right->evaluate(context); break; case Op::Divide: return this->left->evaluate(context) / this->right->evaluate(context); break; case Op::Modulo: return this->left->evaluate(context) % this->right->evaluate(context); break; case Op::Plus: return this->left->evaluate(context) + this->right->evaluate(context); break; case Op::Minus: return this->left->evaluate(context) - this->right->evaluate(context); break; case Op::Less: return this->left->evaluate(context) < this->right->evaluate(context); break; case Op::LessEqual: return this->left->evaluate(context) <= this->right->evaluate(context); break; case Op::Greater: return this->left->evaluate(context) > this->right->evaluate(context); break; case Op::GreaterEqual: return this->left->evaluate(context) >= this->right->evaluate(context); break; case Op::Equal: return this->left->evaluate(context) == this->right->evaluate(context); break; case Op::NotEqual: return this->left->evaluate(context) != this->right->evaluate(context); break; default: return ValuePtr::undefined; // FIXME: Error: unknown op } } const char *BinaryOp::opString() const { switch (this->op) { case Op::LogicalAnd: return "&&"; break; case Op::LogicalOr: return "||"; break; case Op::Multiply: return "*"; break; case Op::Divide: return "/"; break; case Op::Modulo: return "%"; break; case Op::Plus: return "+"; break; case Op::Minus: return "-"; break; case Op::Less: return "<"; break; case Op::LessEqual: return "<="; break; case Op::Greater: return ">"; break; case Op::GreaterEqual: return ">="; break; case Op::Equal: return "=="; break; case Op::NotEqual: return "!="; break; default: return ""; // FIXME: Error: unknown op } } void BinaryOp::print(std::ostream &stream, const std::string &) const { stream << "(" << *this->left << " " << opString() << " " << *this->right << ")"; } TernaryOp::TernaryOp(Expression *cond, Expression *ifexpr, Expression *elseexpr, const Location &loc) : Expression(loc), cond(cond), ifexpr(ifexpr), elseexpr(elseexpr) { } ValuePtr TernaryOp::evaluate(const Context *context) const { return (this->cond->evaluate(context) ? this->ifexpr : this->elseexpr)->evaluate(context); } void TernaryOp::print(std::ostream &stream, const std::string &) const { stream << "(" << *this->cond << " ? " << *this->ifexpr << " : " << *this->elseexpr << ")"; } ArrayLookup::ArrayLookup(Expression *array, Expression *index, const Location &loc) : Expression(loc), array(array), index(index) { } ValuePtr ArrayLookup::evaluate(const Context *context) const { return this->array->evaluate(context)[this->index->evaluate(context)]; } void ArrayLookup::print(std::ostream &stream, const std::string &) const { stream << *array << "[" << *index << "]"; } Literal::Literal(const ValuePtr &val, const Location &loc) : Expression(loc), value(val) { } ValuePtr Literal::evaluate(const class Context *) const { return this->value; } void Literal::print(std::ostream &stream, const std::string &) const { stream << *this->value; } Range::Range(Expression *begin, Expression *end, const Location &loc) : Expression(loc), begin(begin), end(end) { } Range::Range(Expression *begin, Expression *step, Expression *end, const Location &loc) : Expression(loc), begin(begin), step(step), end(end) { } ValuePtr Range::evaluate(const Context *context) const { ValuePtr beginValue = this->begin->evaluate(context); if (beginValue->type() == Value::ValueType::NUMBER) { ValuePtr endValue = this->end->evaluate(context); if (endValue->type() == Value::ValueType::NUMBER) { if (!this->step) { RangeType range(beginValue->toDouble(), endValue->toDouble()); return ValuePtr(range); } else { ValuePtr stepValue = this->step->evaluate(context); if (stepValue->type() == Value::ValueType::NUMBER) { RangeType range(beginValue->toDouble(), stepValue->toDouble(), endValue->toDouble()); return ValuePtr(range); } } } } return ValuePtr::undefined; } void Range::print(std::ostream &stream, const std::string &) const { stream << "[" << *this->begin; if (this->step) stream << " : " << *this->step; stream << " : " << *this->end; stream << "]"; } bool Range::isLiteral() const { if(!this->step){ if( begin->isLiteral() && end->isLiteral()) return true; }else{ if( begin->isLiteral() && end->isLiteral() && step->isLiteral()) return true; } return false; } Vector::Vector(const Location &loc) : Expression(loc) { } bool Vector::isLiteral() const { for(const auto &e : this->children) { if (!e->isLiteral()){ return false; } } return true; } void Vector::push_back(Expression *expr) { this->children.push_back(shared_ptr(expr)); } ValuePtr Vector::evaluate(const Context *context) const { Value::VectorType vec; for(const auto &e : this->children) { ValuePtr tmpval = e->evaluate(context); if (isListComprehension(e)) { const Value::VectorType result = tmpval->toVector(); for (size_t i = 0;i < result.size();i++) { vec.push_back(result[i]); } } else { vec.push_back(tmpval); } } return ValuePtr(vec); } void Vector::print(std::ostream &stream, const std::string &) const { stream << "["; for (size_t i=0; i < this->children.size(); i++) { if (i > 0) stream << ", "; stream << *this->children[i]; } stream << "]"; } Lookup::Lookup(const std::string &name, const Location &loc) : Expression(loc), name(name) { } ValuePtr Lookup::evaluate(const Context *context) const { return context->lookup_variable(this->name,false,loc); } ValuePtr Lookup::evaluateSilently(const Context *context) const { return context->lookup_variable(this->name,true); } void Lookup::print(std::ostream &stream, const std::string &) const { stream << this->name; } MemberLookup::MemberLookup(Expression *expr, const std::string &member, const Location &loc) : Expression(loc), expr(expr), member(member) { } ValuePtr MemberLookup::evaluate(const Context *context) const { ValuePtr v = this->expr->evaluate(context); if (v->type() == Value::ValueType::VECTOR) { if (this->member == "x") return v[0]; if (this->member == "y") return v[1]; if (this->member == "z") return v[2]; } else if (v->type() == Value::ValueType::RANGE) { if (this->member == "begin") return v[0]; if (this->member == "step") return v[1]; if (this->member == "end") return v[2]; } return ValuePtr::undefined; } void MemberLookup::print(std::ostream &stream, const std::string &) const { stream << *this->expr << "." << this->member; } FunctionCall::FunctionCall(const std::string &name, const AssignmentList &args, const Location &loc) : Expression(loc), name(name), arguments(args) { } /** * This is separated because PRINTB uses quite a lot of stack space * and the method using it evaluate() * is called often when recursive functions are evaluated. * noinline is required, as we here specifically optimize for stack usage * during normal operating, not runtime during error handling. */ static void NOINLINE print_err(const char *name, const Location &loc,const Context *ctx){ std::string locs = loc.toRelativeString(ctx->documentPath()); PRINTB("ERROR: Recursion detected calling function '%s' %s", name % locs); } /** * This is separated because PRINTB uses quite a lot of stack space * and the method using it evaluate() * is called often when recursive functions are evaluated. * noinline is required, as we here specifically optimize for stack usage * during normal operating, not runtime during error handling. */ static void NOINLINE print_trace(const FunctionCall *val, const Context *ctx){ PRINTB("TRACE: called by '%s', %s.", val->name % val->location().toRelativeString(ctx->documentPath())); } ValuePtr FunctionCall::evaluate(const Context *context) const { if (StackCheck::inst().check()) { print_err(this->name.c_str(),loc,context); throw RecursionException::create("function", this->name,this->loc); } try{ EvalContext c(context, this->arguments, this->loc); ValuePtr result = context->evaluate_function(this->name, &c); return result; }catch(EvaluationException &e){ if(e.traceDepth>0){ print_trace(this, context); e.traceDepth--; } throw; } } void FunctionCall::print(std::ostream &stream, const std::string &) const { stream << this->name << "(" << this->arguments << ")"; } Expression * FunctionCall::create(const std::string &funcname, const AssignmentList &arglist, Expression *expr, const Location &loc) { if (funcname == "assert") { return new Assert(arglist, expr, loc); } else if (funcname == "echo") { return new Echo(arglist, expr, loc); } else if (funcname == "let") { return new Let(arglist, expr, loc); } // TODO: Generate error/warning if expr != 0? return new FunctionCall(funcname, arglist, loc); } Assert::Assert(const AssignmentList &args, Expression *expr, const Location &loc) : Expression(loc), arguments(args), expr(expr) { } ValuePtr Assert::evaluate(const Context *context) const { EvalContext assert_context(context, this->arguments, this->loc); Context c(&assert_context); evaluate_assert(c, &assert_context); ValuePtr result = expr ? expr->evaluate(&c) : ValuePtr::undefined; return result; } void Assert::print(std::ostream &stream, const std::string &) const { stream << "assert(" << this->arguments << ")"; if (this->expr) stream << " " << *this->expr; } Echo::Echo(const AssignmentList &args, Expression *expr, const Location &loc) : Expression(loc), arguments(args), expr(expr) { } ValuePtr Echo::evaluate(const Context *context) const { EvalContext echo_context(context, this->arguments, this->loc); PRINTB("%s", STR("ECHO: " << echo_context)); ValuePtr result = expr ? expr->evaluate(context) : ValuePtr::undefined; return result; } void Echo::print(std::ostream &stream, const std::string &) const { stream << "echo(" << this->arguments << ")"; if (this->expr) stream << " " << *this->expr; } Let::Let(const AssignmentList &args, Expression *expr, const Location &loc) : Expression(loc), arguments(args), expr(expr) { } ValuePtr Let::evaluate(const Context *context) const { Context c(context); evaluate_sequential_assignment(this->arguments, &c, this->loc); return this->expr->evaluate(&c); } void Let::print(std::ostream &stream, const std::string &) const { stream << "let(" << this->arguments << ") " << *expr; } ListComprehension::ListComprehension(const Location &loc) : Expression(loc) { } LcIf::LcIf(Expression *cond, Expression *ifexpr, Expression *elseexpr, const Location &loc) : ListComprehension(loc), cond(cond), ifexpr(ifexpr), elseexpr(elseexpr) { } ValuePtr LcIf::evaluate(const Context *context) const { const shared_ptr &expr = this->cond->evaluate(context) ? this->ifexpr : this->elseexpr; Value::VectorType vec; if (expr) { if (isListComprehension(expr)) { return expr->evaluate(context); } else { vec.push_back(expr->evaluate(context)); } } return ValuePtr(vec); } void LcIf::print(std::ostream &stream, const std::string &) const { stream << "if(" << *this->cond << ") (" << *this->ifexpr << ")"; if (this->elseexpr) { stream << " else (" << *this->elseexpr << ")"; } } LcEach::LcEach(Expression *expr, const Location &loc) : ListComprehension(loc), expr(expr) { } ValuePtr LcEach::evaluate(const Context *context) const { Value::VectorType vec; ValuePtr v = this->expr->evaluate(context); if (v->type() == Value::ValueType::RANGE) { RangeType range = v->toRange(); uint32_t steps = range.numValues(); if (steps >= 1000000) { PRINTB("WARNING: Bad range parameter in for statement: too many elements (%lu), %s", steps % loc.toRelativeString(context->documentPath())); } else { for (RangeType::iterator it = range.begin();it != range.end();it++) { vec.push_back(ValuePtr(*it)); } } } else if (v->type() == Value::ValueType::VECTOR) { Value::VectorType vector = v->toVector(); for (size_t i = 0; i < v->toVector().size(); i++) { vec.push_back(vector[i]); } } else if (v->type() == Value::ValueType::STRING) { utf8_split(v->toString(), [&](ValuePtr v) { vec.push_back(v); }); } else if (v->type() != Value::ValueType::UNDEFINED) { vec.push_back(v); } if (isListComprehension(this->expr)) { return ValuePtr(flatten(vec)); } else { return ValuePtr(vec); } } void LcEach::print(std::ostream &stream, const std::string &) const { stream << "each (" << *this->expr << ")"; } LcFor::LcFor(const AssignmentList &args, Expression *expr, const Location &loc) : ListComprehension(loc), arguments(args), expr(expr) { } ValuePtr LcFor::evaluate(const Context *context) const { Value::VectorType vec; EvalContext for_context(context, this->arguments, this->loc); Context assign_context(context); // comprehension for statements are by the parser reduced to only contain one single element const std::string &it_name = for_context.getArgName(0); ValuePtr it_values = for_context.getArgValue(0, &assign_context); Context c(context); if (it_values->type() == Value::ValueType::RANGE) { RangeType range = it_values->toRange(); uint32_t steps = range.numValues(); if (steps >= 1000000) { PRINTB("WARNING: Bad range parameter in for statement: too many elements (%lu), %s", steps % loc.toRelativeString(context->documentPath())); } else { for (RangeType::iterator it = range.begin();it != range.end();it++) { c.set_variable(it_name, ValuePtr(*it)); vec.push_back(this->expr->evaluate(&c)); } } } else if (it_values->type() == Value::ValueType::VECTOR) { for (size_t i = 0; i < it_values->toVector().size(); i++) { c.set_variable(it_name, it_values->toVector()[i]); vec.push_back(this->expr->evaluate(&c)); } } else if (it_values->type() == Value::ValueType::STRING) { utf8_split(it_values->toString(), [&](ValuePtr v) { c.set_variable(it_name, v); vec.push_back(this->expr->evaluate(&c)); }); } else if (it_values->type() != Value::ValueType::UNDEFINED) { c.set_variable(it_name, it_values); vec.push_back(this->expr->evaluate(&c)); } if (isListComprehension(this->expr)) { return ValuePtr(flatten(vec)); } else { return ValuePtr(vec); } } void LcFor::print(std::ostream &stream, const std::string &) const { stream << "for(" << this->arguments << ") (" << *this->expr << ")"; } LcForC::LcForC(const AssignmentList &args, const AssignmentList &incrargs, Expression *cond, Expression *expr, const Location &loc) : ListComprehension(loc), arguments(args), incr_arguments(incrargs), cond(cond), expr(expr) { } ValuePtr LcForC::evaluate(const Context *context) const { Value::VectorType vec; Context c(context); evaluate_sequential_assignment(this->arguments, &c, this->loc); unsigned int counter = 0; while (this->cond->evaluate(&c)) { vec.push_back(this->expr->evaluate(&c)); if (counter++ == 1000000) { std::string locs = loc.toRelativeString(context->documentPath()); PRINTB("ERROR: for loop counter exceeded limit, %s", locs); throw LoopCntException::create("for", loc); } Context tmp(&c); evaluate_sequential_assignment(this->incr_arguments, &tmp, this->loc); c.apply_variables(tmp); } if (isListComprehension(this->expr)) { return ValuePtr(flatten(vec)); } else { return ValuePtr(vec); } } void LcForC::print(std::ostream &stream, const std::string &) const { stream << "for(" << this->arguments << ";" << *this->cond << ";" << this->incr_arguments << ") " << *this->expr; } LcLet::LcLet(const AssignmentList &args, Expression *expr, const Location &loc) : ListComprehension(loc), arguments(args), expr(expr) { } ValuePtr LcLet::evaluate(const Context *context) const { Context c(context); evaluate_sequential_assignment(this->arguments, &c, this->loc); return this->expr->evaluate(&c); } void LcLet::print(std::ostream &stream, const std::string &) const { stream << "let(" << this->arguments << ") (" << *this->expr << ")"; } void evaluate_assert(const Context &context, const class EvalContext *evalctx) { AssignmentList args; args += Assignment("condition"), Assignment("message"); Context c(&context); AssignmentMap assignments = evalctx->resolveArguments(args, {}, false); for (const auto &arg : args) { auto it = assignments.find(arg.name); if (it != assignments.end()) { c.set_variable(arg.name, assignments[arg.name]->evaluate(evalctx)); } } const ValuePtr condition = c.lookup_variable("condition", false, evalctx->loc); if (!condition->toBool()) { const Expression *expr = assignments["condition"]; const ValuePtr message = c.lookup_variable("message", true); const auto locs = evalctx->loc.toRelativeString(context.documentPath()); const auto exprText = expr ? STR(" '" << *expr << "'") : ""; if (message->isDefined()) { PRINTB("ERROR: Assertion%s failed: %s %s", exprText % message->toEchoString() % locs); } else { PRINTB("ERROR: Assertion%s failed %s", exprText % locs); } throw AssertionFailedException("Assertion Failed", evalctx->loc); } } openscad-2019.05/src/expression.h0000644000076500000240000001616313414440264017247 0ustar kintelstaff00000000000000#pragma once #include "AST.h" #include #include #include "value.h" #include "memory.h" #include "Assignment.h" class Expression : public ASTNode { public: Expression(const Location &loc) : ASTNode(loc) {} ~Expression() {} virtual bool isLiteral() const; virtual ValuePtr evaluate(const class Context *context) const = 0; }; class UnaryOp : public Expression { public: enum class Op { Not, Negate }; bool isLiteral() const override; UnaryOp(Op op, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: const char *opString() const; Op op; shared_ptr expr; }; class BinaryOp : public Expression { public: enum class Op { LogicalAnd, LogicalOr, Multiply, Divide, Modulo, Plus, Minus, Less, LessEqual, Greater, GreaterEqual, Equal, NotEqual }; BinaryOp(Expression *left, Op op, Expression *right, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: const char *opString() const; Op op; shared_ptr left; shared_ptr right; }; class TernaryOp : public Expression { public: TernaryOp(Expression *cond, Expression *ifexpr, Expression *elseexpr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; shared_ptr cond; shared_ptr ifexpr; shared_ptr elseexpr; }; class ArrayLookup : public Expression { public: ArrayLookup(Expression *array, Expression *index, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: shared_ptr array; shared_ptr index; }; class Literal : public Expression { public: Literal(const ValuePtr &val, const Location &loc = Location::NONE); ValuePtr evaluate(const class Context *) const override; void print(std::ostream &stream, const std::string &indent) const override; bool isLiteral() const override { return true;} private: ValuePtr value; }; class Range : public Expression { public: Range(Expression *begin, Expression *end, const Location &loc); Range(Expression *begin, Expression *step, Expression *end, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; bool isLiteral() const override; private: shared_ptr begin; shared_ptr step; shared_ptr end; }; class Vector : public Expression { public: Vector(const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; void push_back(Expression *expr); bool isLiteral() const override; private: std::vector> children; }; class Lookup : public Expression { public: Lookup(const std::string &name, const Location &loc); ValuePtr evaluate(const class Context *context) const override; ValuePtr evaluateSilently(const class Context *context) const; void print(std::ostream &stream, const std::string &indent) const override; private: std::string name; }; class MemberLookup : public Expression { public: MemberLookup(Expression *expr, const std::string &member, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: shared_ptr expr; std::string member; }; class FunctionCall : public Expression { public: FunctionCall(const std::string &funcname, const AssignmentList &arglist, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; static Expression * create(const std::string &funcname, const AssignmentList &arglist, Expression *expr, const Location &loc); public: std::string name; AssignmentList arguments; }; class Assert : public Expression { public: Assert(const AssignmentList &args, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: AssignmentList arguments; shared_ptr expr; }; class Echo : public Expression { public: Echo(const AssignmentList &args, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: AssignmentList arguments; shared_ptr expr; }; class Let : public Expression { public: Let(const AssignmentList &args, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: AssignmentList arguments; shared_ptr expr; }; class ListComprehension : public Expression { public: ListComprehension(const Location &loc); ~ListComprehension() = default; }; class LcIf : public ListComprehension { public: LcIf(Expression *cond, Expression *ifexpr, Expression *elseexpr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: shared_ptr cond; shared_ptr ifexpr; shared_ptr elseexpr; }; class LcFor : public ListComprehension { public: LcFor(const AssignmentList &args, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: AssignmentList arguments; shared_ptr expr; }; class LcForC : public ListComprehension { public: LcForC(const AssignmentList &args, const AssignmentList &incrargs, Expression *cond, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: AssignmentList arguments; AssignmentList incr_arguments; shared_ptr cond; shared_ptr expr; }; class LcEach : public ListComprehension { public: LcEach(Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: shared_ptr expr; }; class LcLet : public ListComprehension { public: LcLet(const AssignmentList &args, Expression *expr, const Location &loc); ValuePtr evaluate(const class Context *context) const override; void print(std::ostream &stream, const std::string &indent) const override; private: AssignmentList arguments; shared_ptr expr; }; void evaluate_assert(const Context &context, const class EvalContext *evalctx); openscad-2019.05/src/ext/CGAL/CGAL_Nef3_workaround.h0000644000076500000240000003104713437640540022214 0ustar kintelstaff00000000000000// Copyright (c) 1997-2002,2005 Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/releases/CGAL-4.0-branch/Nef_3/include/CGAL/Nef_helper_3.h $ // $Id: Nef_helper_3.h 67117 2012-01-13 18:14:48Z lrineau $ // // // Author(s) : Michael Seel // Miguel Granados // Susan Hert // Lutz Kettner // Ralf Osbild // Peter Hachenberger /* modified by don bright for OpenSCAD, 2013. This works around issue #410, where CGAL's Nef_Polyhedron3.convert_to_Polyhedron throws an uncatchable exception, due to an CGAL_Assertion being thrown in Polyhedron Incremental Builder's destructor while a Triangulation exception is still active, resulting in program termination (crashing). The purpose here is not to improve/change the way CGAL's Nef code works, but instead to tweak it slightly to prevent OpenSCAD from crashing. The behavior of the code should otherwise be exactly the same as CGAL's standard code. This file was created by copying three sections from CGAL's Nef_polyhedron3.h that were protected/private: Triangulation_handler2 Build_Polyhedron convert_to_polyhedron Very small code changes have been made. First, there are many template type specifiers added to enable the movement of the code to the outside of the Nef Polyhedron class. Second, there is a try{}catch(...){} block added in the Builder around the Triangulation code. Third, there is an error variable added for non-Exception communication with the caller. Eventually, if CGAL itself is updated and the update is widely distributed, this file may become obsolete and can be deleted from OpenSCAD */ #pragma once #pragma push_macro("NDEBUG")// added for OpenSCAD #undef NDEBUG // added for OpenSCAD #include #include #include #include #include #include #include #include #include #include // added for OpenSCAD #pragma pop_macro("NDEBUG") // added for OpenSCAD #include "printutils.h" // added for OpenSCAD namespace nefworkaround { // added for OpenSCAD template class Triangulation_handler2 { typedef typename CGAL::Triangulation_vertex_base_2 Vb; typedef typename CGAL::Constrained_triangulation_face_base_2 Fb; typedef typename CGAL::Triangulation_data_structure_2 TDS; typedef typename CGAL::Constrained_triangulation_2 CT; typedef typename CT::Face_handle Face_handle; typedef typename CT::Vertex_handle CTVertex_handle; typedef typename CT::Finite_faces_iterator Finite_face_iterator; typedef typename CT::Edge Edge; CT ct; CGAL::Unique_hash_map visited; CGAL::Unique_hash_map ctv2v; Finite_face_iterator fi; typename Nef::Plane_3 supporting_plane; public: Triangulation_handler2(typename Nef::Halffacet_const_handle f) : visited(false), supporting_plane(f->plane()) { typename Nef::Halffacet_cycle_const_iterator fci; for(fci=f->facet_cycles_begin(); fci!=f->facet_cycles_end(); ++fci) { if(fci.is_shalfedge()) { typename Nef::SHalfedge_around_facet_const_circulator sfc(fci), send(sfc); CGAL_For_all(sfc,send) { CGAL_NEF_TRACEN(" insert point" << sfc->source()->source()->point()); CTVertex_handle ctv = ct.insert(sfc->source()->source()->point()); ctv2v[ctv] = sfc->source()->source(); } } } for(fci=f->facet_cycles_begin(); fci!=f->facet_cycles_end(); ++fci) { if(fci.is_shalfedge()) { typename Nef::SHalfedge_around_facet_const_circulator sfc(fci), send(sfc); CGAL_For_all(sfc,send) { CGAL_NEF_TRACEN(" insert constraint" << sfc->source()->source()->point() << "->" << sfc->source()->twin()->source()->point()); ct.insert_constraint(sfc->source()->source()->point(), sfc->source()->twin()->source()->point()); } } } CGAL_assertion(ct.is_valid()); CGAL_NEF_TRACEN("number of finite triangles " << ct.number_of_faces()); typename CT::Face_handle infinite = ct.infinite_face(); typename CT::Vertex_handle ctv = infinite->vertex(1); if(ct.is_infinite(ctv)) ctv = infinite->vertex(2); CGAL_assertion(!ct.is_infinite(ctv)); typename CT::Face_handle opposite; typename CT::Face_circulator vc(ctv,infinite); do { opposite = vc++; } while(!ct.is_constrained(typename CT::Edge(vc,vc->index(opposite)))); typename CT::Face_handle first = vc; CGAL_assertion(!ct.is_infinite(first)); traverse_triangulation(first, first->index(opposite)); fi = ct.finite_faces_begin(); } void traverse_triangulation(Face_handle f, int parent) { visited[f] = true; if(!ct.is_constrained(Edge(f,ct.cw(parent))) && !visited[f->neighbor(ct.cw(parent))]) { Face_handle child(f->neighbor(ct.cw(parent))); traverse_triangulation(child, child->index(f)); } if(!ct.is_constrained(Edge(f,ct.ccw(parent))) && !visited[f->neighbor(ct.ccw(parent))]) { Face_handle child(f->neighbor(ct.ccw(parent))); traverse_triangulation(child, child->index(f)); } } template bool get_next_triangle(Triangle_3& tr) { while(fi != ct.finite_faces_end() && visited[fi] == false) ++fi; if(fi == ct.finite_faces_end()) return false; tr = Triangle_3(fi->vertex(0)->point(), fi->vertex(1)->point(), fi->vertex(2)->point()); ++fi; return true; } bool same_orientation(typename Nef::Plane_3 p1) const { if(p1.a() != 0) return CGAL::sign(p1.a()) == CGAL::sign(supporting_plane.a()); if(p1.b() != 0) return CGAL::sign(p1.b()) == CGAL::sign(supporting_plane.b()); return CGAL::sign(p1.c()) == CGAL::sign(supporting_plane.c()); } template void handle_triangles(PIB& pib, Index& VI) { while(fi != ct.finite_faces_end() && visited[fi] == false) ++fi; while(fi != ct.finite_faces_end()) { typename Nef::Plane_3 plane(fi->vertex(0)->point(), fi->vertex(1)->point(), fi->vertex(2)->point()); pib.begin_facet(); if(same_orientation(plane)) { pib.add_vertex_to_facet(VI[ctv2v[fi->vertex(0)]]); pib.add_vertex_to_facet(VI[ctv2v[fi->vertex(1)]]); pib.add_vertex_to_facet(VI[ctv2v[fi->vertex(2)]]); } else { pib.add_vertex_to_facet(VI[ctv2v[fi->vertex(0)]]); pib.add_vertex_to_facet(VI[ctv2v[fi->vertex(2)]]); pib.add_vertex_to_facet(VI[ctv2v[fi->vertex(1)]]); } pib.end_facet(); do { ++fi; } while(fi != ct.finite_faces_end() && visited[fi] == false); } } }; template class Build_polyhedron : public CGAL::Modifier_base { public: bool error; // added for OpenSCAD class Visitor { typedef typename CGAL::Projection_traits_xy_3 XY; typedef typename CGAL::Projection_traits_yz_3 YZ; typedef typename CGAL::Projection_traits_xz_3 XZ; const CGAL::Object_index& VI; CGAL::Polyhedron_incremental_builder_3& B; const typename Nef::SNC_const_decorator& D; public: bool error;//added for OpenSCAD Visitor(CGAL::Polyhedron_incremental_builder_3& BB, const typename Nef::SNC_const_decorator& sd, CGAL::Object_index& vi) : VI(vi), B(BB), D(sd), error(false) {} void visit(typename Nef::Halffacet_const_handle opposite_facet) { CGAL_NEF_TRACEN("Build_polyhedron: visit facet " << opposite_facet->plane()); CGAL_assertion(Nef::Infi_box::is_standard(opposite_facet->plane())); typename Nef::SHalfedge_const_handle se; typename Nef::Halffacet_cycle_const_iterator fc; typename Nef::Halffacet_const_handle f = !opposite_facet->incident_volume()->mark() ? opposite_facet : opposite_facet->twin(); typename Nef::SHalfedge_around_facet_const_circulator sfc1(f->facet_cycles_begin()), sfc2(sfc1); if(++f->facet_cycles_begin() != f->facet_cycles_end() || ++(++(++sfc1)) != sfc2) { typename Nef::Vector_3 orth = f->plane().orthogonal_vector(); int c = CGAL::abs(orth[0]) > CGAL::abs(orth[1]) ? 0 : 1; c = CGAL::abs(orth[2]) > CGAL::abs(orth[c]) ? 2 : c; try{ // added for OpenSCAD if(c == 0) { Triangulation_handler2 th(f); th.handle_triangles(B, VI); } else if(c == 1) { Triangulation_handler2 th(f); th.handle_triangles(B, VI); } else if(c == 2) { Triangulation_handler2 th(f); th.handle_triangles(B, VI); } else CGAL_error_msg( "wrong value"); } catch (const CGAL::Failure_exception &e) { // added for OpenSCAD PRINTB("WARNING: CGAL NefPolyhedron Triangulation failed: %s", e.what()); // added for OpenSCAD this->error=true; //added for OpenSCAD } // added for OpenSCAD } else { B.begin_facet(); fc = f->facet_cycles_begin(); se = typename Nef::SHalfedge_const_handle(fc); CGAL_assertion(se!=0); typename Nef::SHalfedge_around_facet_const_circulator hc_start(se); typename Nef::SHalfedge_around_facet_const_circulator hc_end(hc_start); CGAL_For_all(hc_start,hc_end) { CGAL_NEF_TRACEN(" add vertex " << hc_start->source()->center_vertex()->point()); B.add_vertex_to_facet(VI[hc_start->source()->center_vertex()]); } B.end_facet(); } } void visit(typename Nef::SFace_const_handle) {} void visit(typename Nef::Halfedge_const_handle) {} void visit(typename Nef::Vertex_const_handle) {} void visit(typename Nef::SHalfedge_const_handle) {} void visit(typename Nef::SHalfloop_const_handle) {} }; public: const typename Nef::SNC_const_decorator& scd; CGAL::Object_index VI; Build_polyhedron(const typename Nef::SNC_const_decorator& s) : error(false), scd(s), VI(s.vertices_begin(),s.vertices_end(),'V') {} void operator()( HDS& hds) override { CGAL::Polyhedron_incremental_builder_3 B(hds, true); int skip_volumes; if(Nef::Infi_box::extended_kernel()) { B.begin_surface(scd.number_of_vertices()-8, scd.number_of_facets()-6, scd.number_of_edges()-12); skip_volumes = 2; } else { B.begin_surface(scd.number_of_vertices(), 2*scd.number_of_vertices()-4, 3*scd.number_of_vertices()-6); skip_volumes = 1; } int vertex_index = 0; typename Nef::Vertex_const_iterator v; CGAL_forall_vertices(v,scd) { if(Nef::Infi_box::is_standard(v->point())) { VI[v]=vertex_index++; B.add_vertex(v->point()); } } Visitor V(B,scd,VI); typename Nef::Volume_const_handle c; CGAL_forall_volumes(c,scd) if(skip_volumes-- <= 0) { scd.visit_shell_objects(typename Nef:: SFace_const_handle(c->shells_begin()),V); } B.end_surface(); this->error=B.error()||V.error; // added for OpenSCAD if (B.error()) B.rollback(); // added for OpenSCAD } }; template bool convert_to_Polyhedron( const CGAL::Nef_polyhedron_3 &N, CGAL::Polyhedron_3 &P ) { // several lines here added for OpenSCAD typedef typename CGAL::Nef_polyhedron_3 Nef3; typedef typename CGAL::Polyhedron_3 Polyhedron; typedef typename Polyhedron::HalfedgeDS HalfedgeDS; CGAL_precondition(N.is_simple()); P.clear(); Build_polyhedron bp(N); P.delegate(bp); return bp.error; } } //namespace nefworkaround openscad-2019.05/src/ext/CGAL/CGAL_workaround_Mark_bounded_volumes.h0000644000076500000240000001014413437640540025560 0ustar kintelstaff00000000000000// Copyright (c) 2005 Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL // $Id$ // // // Author(s) : Ralf Osbild // Rewritten by Oskar Linde // Now marks volumes recursively with alternating marks #ifndef CGAL_NEF3_MARK_BOUNDED_VOLUMES_H #define CGAL_NEF3_MARK_BOUNDED_VOLUMES_H #include #pragma push_macro("NDEBUG") #undef NDEBUG //#include #include #include #include #pragma pop_macro("NDEBUG") namespace CGAL { template class Volume_setter { typedef typename Decorator::Vertex_handle Vertex_handle; typedef typename Decorator::Halfedge_handle Halfedge_handle; typedef typename Decorator::Halffacet_handle Halffacet_handle; typedef typename Decorator::SHalfedge_handle SHalfedge_handle; typedef typename Decorator::SHalfloop_handle SHalfloop_handle; typedef typename Decorator::SFace_handle SFace_handle; Mark m; public: std::set opposite_volumes; Volume_setter(Mark m_in = true) : m(m_in) {} void visit(Vertex_handle ) {} void visit(Halfedge_handle ) {} void visit(Halffacet_handle hf) { opposite_volumes.insert(hf->twin()->incident_volume()); } void visit(SHalfedge_handle ) {} void visit(SHalfloop_handle ) {} void visit(SFace_handle sf) {sf->mark() = m;} }; template class Mark_bounded_volumes : public Modifier_base { typedef typename Nef_3::SNC_structure SNC_structure; typedef typename SNC_structure::SNC_decorator SNC_decorator; typedef typename SNC_structure::Infi_box Infi_box; typedef typename Nef_3::SFace_handle SFace_handle; typedef typename Nef_3::Volume_iterator Volume_iterator; typedef typename Nef_3::Shell_entry_iterator Shell_entry_iterator; typedef typename Nef_3::Mark Mark; Mark flag; public: Mark_bounded_volumes (Mark b=true) : flag(b) {} void mark_volume(SNC_decorator &D, typename SNC_structure::Volume_handle vol_it, bool mark, typename std::set &visited) { Volume_setter vs(mark); vol_it->mark() = mark; // mark Shell_entry_iterator it; CGAL_forall_shells_of(it,vol_it) { D.visit_shell_objects(SFace_handle(it),vs); } for(typename std::set::iterator i = vs.opposite_volumes.begin(); i != vs.opposite_volumes.end(); ++i) { if (!visited.count(*i)) { visited.insert(*i); mark_volume(D, *i, !mark, visited); } } } void operator()(SNC_structure &snc) override { // mark bounded volumes Volume_iterator vol_it = snc.volumes_begin(); CGAL_assertion ( vol_it != snc.volumes_end() ); if ( Infi_box::extended_kernel() ) ++vol_it; // skip Infi_box CGAL_assertion ( vol_it != snc.volumes_end() ); typename std::set visited; // mark the unbounded volume and recursively visit the other volumes SNC_decorator D(snc); visited.insert(vol_it); mark_volume(D, vol_it, !flag, visited); } }; } //namespace CGAL #endif // CGAL_NEF3_MARK_BOUNDED_VOLUMES_H openscad-2019.05/src/ext/CGAL/OGL_helper.h0000644000076500000240000006171213445047371020344 0ustar kintelstaff00000000000000// Copyright (c) 1997-2002 Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org); you may redistribute it under // the terms of the Q Public License version 1.0. // See the file LICENSE.QPL distributed with CGAL. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/trunk/Nef_3/include/CGAL/Nef_3/OGL_helper.h $ // $Id: OGL_helper.h 56667 2010-06-09 07:37:13Z sloriot $ // // // Author(s) : Peter Hachenberger // Modified for OpenSCAD #pragma once #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #pragma pop_macro("NDEBUG") #include "system-gl.h" #include // Overridden in CGAL_renderer /* #define CGAL_NEF3_OGL_MARKED_VERTEX_COLOR 183,232,92 #define CGAL_NEF3_OGL_MARKED_EDGE_COLOR 171,216,86 #define CGAL_NEF3_OGL_MARKED_FACET_COLOR 157,203,81 #define CGAL_NEF3_OGL_MARKED_BACK_FACET_COLOR 157,103,181 #define CGAL_NEF3_OGL_UNMARKED_VERTEX_COLOR 255,246,124 #define CGAL_NEF3_OGL_UNMARKED_EDGE_COLOR 255,236,94 #define CGAL_NEF3_OGL_UNMARKED_FACET_COLOR 249,215,44 #define CGAL_NEF3_OGL_UNMARKED_BACK_FACET_COLOR 249,115,144 */ const bool cull_backfaces = false; const bool color_backfaces = false; #ifdef _WIN32 #include // For the CALLBACK macro #define CGAL_GLU_TESS_CALLBACK CALLBACK #else #define CGAL_GLU_TESS_CALLBACK #endif #ifdef __APPLE__ # include #endif #if defined __APPLE__ && !defined MAC_OS_X_VERSION_10_5 #define CGAL_GLU_TESS_DOTS ... #else #define CGAL_GLU_TESS_DOTS #endif namespace CGAL { namespace OGL { // ---------------------------------------------------------------------------- // Drawable double types: // ---------------------------------------------------------------------------- typedef CGAL::Simple_cartesian DKernel; typedef DKernel::Point_3 Double_point; typedef DKernel::Vector_3 Double_vector; typedef DKernel::Segment_3 Double_segment; typedef DKernel::Aff_transformation_3 Affine_3; // DPoint = a double point including a mark class DPoint : public Double_point { bool m_; public: DPoint() {} DPoint(const Double_point& p, bool m) : Double_point(p) { m_ = m; } DPoint(const DPoint& p) : Double_point(p) { m_ = p.m_; } DPoint& operator=(const DPoint& p) { Double_point::operator=(p); m_ = p.m_; return *this; } bool mark() const { return m_; } }; // DSegment = a double segment including a mark class DSegment : public Double_segment { bool m_; public: DSegment() {} DSegment(const Double_segment& s, bool m) : Double_segment(s) { m_ = m; } DSegment(const DSegment& s) : Double_segment(s) { m_ = s.m_; } DSegment& operator=(const DSegment& s) { Double_segment::operator=(s); m_ = s.m_; return *this; } bool mark() const { return m_; } }; // Double_triple = a class that stores a triple of double // coordinates; we need a pointer to the coordinates in a C array // for OpenGL class Double_triple { typedef double* double_ptr; typedef const double* const_double_ptr; double coords_[3]; public: Double_triple() { coords_[0]=coords_[1]=coords_[2]=0.0; } Double_triple(double x, double y, double z) { coords_[0]=x; coords_[1]=y; coords_[2]=z; } Double_triple(const Double_triple& t) { coords_[0]=t.coords_[0]; coords_[1]=t.coords_[1]; coords_[2]=t.coords_[2]; } Double_triple& operator=(const Double_triple& t) { coords_[0]=t.coords_[0]; coords_[1]=t.coords_[1]; coords_[2]=t.coords_[2]; return *this; } operator double_ptr() const { return const_cast(*this).coords_; } double operator[](unsigned i) { CGAL_assertion(i<3); return coords_[i]; } }; // Double_triple static std::ostream& operator << (std::ostream& os, const Double_triple& t) { os << "(" << t[0] << "," << t[1] << "," << t[2] << ")"; return os; } // DFacet stores the facet cycle vertices in a continuus C array // of three double components, this is necessary due to the OpenGL // tesselator input format ! class DFacet { typedef std::vector Coord_vector; typedef std::vector Cycle_vector; Coord_vector coords_; // stores all vertex coordinates Cycle_vector fc_ends_; // stores entry points of facet cycles Double_triple normal_; // stores normal and mark of facet bool mark_; public: typedef Coord_vector::iterator Coord_iterator; typedef Coord_vector::const_iterator Coord_const_iterator; DFacet() {} void push_back_vertex(double x, double y, double z) { coords_.push_back(Double_triple(x,y,z)); } DFacet(const DFacet& f) { coords_ = f.coords_; fc_ends_ = f.fc_ends_; normal_ = f.normal_; mark_ = f.mark_; } DFacet& operator=(const DFacet& f) { coords_ = f.coords_; fc_ends_ = f.fc_ends_; normal_ = f.normal_; mark_ = f.mark_; return *this; } ~DFacet() { coords_.clear(); fc_ends_.clear(); } void push_back_vertex(const Double_point& p) { push_back_vertex(p.x(),p.y(),p.z()); } void set_normal(double x, double y, double z, bool m) { double l = sqrt(x*x + y*y + z*z); normal_ = Double_triple(x/l,y/l,z/l); mark_ = m; } double dx() const { return normal_[0]; } double dy() const { return normal_[1]; } double dz() const { return normal_[2]; } bool mark() const { return mark_; } double* normal() const { return static_cast(normal_); } void new_facet_cycle() { fc_ends_.push_back(coords_.size()); } unsigned number_of_facet_cycles() const { return fc_ends_.size(); } Coord_iterator facet_cycle_begin(unsigned i) { CGAL_assertion(i(vertex)); GLdouble* pu(static_cast(user)); // CGAL_NEF_TRACEN("vertexCallback coord "< pcache; if (dataOut) { GLdouble *n = new GLdouble[3]; n[0] = coords[0]; n[1] = coords[1]; n[2] = coords[2]; pcache.push_back(n); *dataOut = n; } else { for (std::list::const_iterator i = pcache.begin(); i != pcache.end(); i++) delete[] *i; pcache.clear(); } } enum { SNC_AXES}; enum { SNC_BOUNDARY, SNC_SKELETON }; class Polyhedron : public OGL_base_object { protected: std::list vertices_; std::list edges_; std::list halffacets_; GLuint object_list_; bool init_; Bbox_3 bbox_; int style; std::vector switches; typedef std::list::const_iterator Vertex_iterator; typedef std::list::const_iterator Edge_iterator; typedef std::list::const_iterator Halffacet_iterator; public: Polyhedron() : bbox_(-1,-1,-1,1,1,1), switches(1) { object_list_ = 0; init_ = false; style = SNC_BOUNDARY; switches[SNC_AXES] = false; } /* Polyhedron(const Polyhedron& P) : object_list_(0), init_(false), bbox_(P.bbox_), style(P.style), switches(2) { switches[SNC_AXES] = P.switches[SNC_AXES]; Vertex_iterator v; for(v=P.vertices_.begin();v!=P.vertices_.end();++v) vertices_.push_back(*v); Edge_iterator e; for(e=P.edges_.begin();e!=P.edges_.end();++e) edges_.push_back(*e); Halffacet_iterator f; for(f=P.halffacets_.begin();f!=P.halffacets_.end();++f) halffacets_.push_back(*f); } Polyhedron& operator=(const Polyhedron& P) { if (object_list_) glDeleteLists(object_list_, 4); object_list_ = 0; init_ = false; style = P.style; switches[SNC_AXES] = P.switches[SNC_AXES]; Vertex_iterator v; vertices_.clear(); for(v=P.vertices_.begin();v!=P.vertices_.end();++v) vertices_.push_back(*v); Edge_iterator e; edges_.clear(); for(e=P.edges_.begin();e!=P.edges_.end();++e) edges_.push_back(*e); Halffacet_iterator f; halffacets_.clear(); for(f=P.halffacets_.begin();f!=P.halffacets_.end();++f) halffacets_.push_back(*f); init(); return *this; } */ ~Polyhedron() { if (object_list_) glDeleteLists(object_list_, 4); } void push_back(const Double_point& p, bool m) { vertices_.push_back(DPoint(p,m)); } void push_back(const Double_segment& s, bool m) { edges_.push_back(DSegment(s,m)); } void push_back(const DFacet& f) { halffacets_.push_back(f); } void toggle(int index) override { switches[index] = !switches[index]; } void set_style(int index) override { style = index; } bool is_initialized() const { return init_; } Bbox_3 bbox() const { return bbox_; } Bbox_3& bbox() { return bbox_; } // Overridden in CGAL_renderer virtual CGAL::Color getVertexColor(Vertex_iterator v) const { PRINTD("getVertexColor()"); (void)v; // CGAL::Color cf(CGAL_NEF3_OGL_MARKED_VERTEX_COLOR), // ct(CGAL_NEF3_OGL_UNMARKED_VERTEX_COLOR); // more blue-ish // CGAL::Color c = v->mark() ? ct : cf; CGAL::Color c(0,0,200); return c; } virtual void draw(bool) const = 0; void draw(Vertex_iterator v) const { PRINTD("draw( Vertex_iterator )"); // CGAL_NEF_TRACEN("drawing vertex "<<*v); CGAL::Color c = getVertexColor(v); glPointSize(10); //glPointSize(1); glColor3ub(c.red(), c.green(), c.blue()); glBegin(GL_POINTS); glVertex3d(v->x(),v->y(),v->z()); #ifdef CGAL_NEF_EMPHASIZE_VERTEX glColor3ub(255,0,0); glVertex3d(CGAL_NEF_EMPHASIZE_VERTEX); #endif glEnd(); } // Overridden in CGAL_renderer virtual CGAL::Color getEdgeColor(Edge_iterator e) const { PRINTD("getEdgeColor)"); (void)e; // CGAL::Color cf(CGAL_NEF3_OGL_MARKED_EDGE_COLOR), // ct(CGAL_NEF3_OGL_UNMARKED_EDGE_COLOR); // more blue-ish // CGAL::Color c = e->mark() ? ct : cf; // Overridden in CGAL_renderer CGAL::Color c(200,0,0); return c; } void draw(Edge_iterator e) const { PRINTD("draw(Edge_iterator)"); // CGAL_NEF_TRACEN("drawing edge "<<*e); Double_point p = e->source(), q = e->target(); CGAL::Color c = getEdgeColor(e); glLineWidth(5); //glLineWidth(1); glColor3ub(c.red(),c.green(),c.blue()); glBegin(GL_LINE_STRIP); glVertex3d(p.x(), p.y(), p.z()); glVertex3d(q.x(), q.y(), q.z()); glEnd(); } // Overridden in CGAL_renderer virtual CGAL::Color getFacetColor(Halffacet_iterator /*f*/, bool /*is_back_facing*/) const { PRINTD("getFacetColor"); /* (void)f; // CGAL::Color cf(CGAL_NEF3_OGL_MARKED_FACET_COLOR), // ct(CGAL_NEF3_OGL_UNMARKED_FACET_COLOR); // more blue-ish // CGAL::Color c = (f->mark() ? ct : cf); */ CGAL::Color c(0,200,0); return c; /* if (is_back_facing) return !f->mark() ? CGAL::Color(CGAL_NEF3_OGL_MARKED_BACK_FACET_COLOR) : CGAL::Color(CGAL_NEF3_OGL_UNMARKED_BACK_FACET_COLOR); else return !f->mark() ? CGAL::Color(CGAL_NEF3_OGL_MARKED_FACET_COLOR) : CGAL::Color(CGAL_NEF3_OGL_UNMARKED_FACET_COLOR); */ } void draw(Halffacet_iterator f, bool is_back_facing) const { PRINTD("draw(Halffacet_iterator)"); // CGAL_NEF_TRACEN("drawing facet "<<(f->debug(),"")); GLUtesselator* tess_ = gluNewTess(); gluTessCallback(tess_, GLenum(GLU_TESS_VERTEX_DATA), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &vertexCallback); gluTessCallback(tess_, GLenum(GLU_TESS_COMBINE), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &combineCallback); gluTessCallback(tess_, GLenum(GLU_TESS_BEGIN), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &beginCallback); gluTessCallback(tess_, GLenum(GLU_TESS_END), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &endCallback); gluTessCallback(tess_, GLenum(GLU_TESS_ERROR), (GLvoid (CGAL_GLU_TESS_CALLBACK *)(CGAL_GLU_TESS_DOTS)) &errorCallback); gluTessProperty(tess_, GLenum(GLU_TESS_WINDING_RULE), GLU_TESS_WINDING_POSITIVE); DFacet::Coord_const_iterator cit; CGAL::Color c = getFacetColor(f,is_back_facing); glColor3ub(c.red(),c.green(),c.blue()); gluTessBeginPolygon(tess_,f->normal()); // CGAL_NEF_TRACEN(" "); // CGAL_NEF_TRACEN("Begin Polygon"); gluTessNormal(tess_,f->dx(),f->dy(),f->dz()); // forall facet cycles of f: for(unsigned i = 0; i < f->number_of_facet_cycles(); ++i) { gluTessBeginContour(tess_); // CGAL_NEF_TRACEN(" Begin Contour"); // put all vertices in facet cycle into contour: for(cit = f->facet_cycle_begin(i); cit != f->facet_cycle_end(i); ++cit) { gluTessVertex(tess_, *cit, *cit); // CGAL_NEF_TRACEN(" add Vertex"); } gluTessEndContour(tess_); // CGAL_NEF_TRACEN(" End Contour"); } gluTessEndPolygon(tess_); // CGAL_NEF_TRACEN("End Polygon"); gluDeleteTess(tess_); combineCallback(NULL, NULL, NULL, NULL); } void construct_axes() const { PRINTD("construct_axes"); glLineWidth(2.0); // red x-axis glColor3f(1.0,0.0,0.0); glBegin(GL_LINES); glVertex3f(0.0,0.0,0.0); glVertex3f(5000.0,0.0,0.0); glEnd(); // green y-axis glColor3f(0.0,1.0,0.0); glBegin(GL_LINES); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,5000.0,0.0); glEnd(); // blue z-axis and equator glColor3f(0.0,0.0,1.0); glBegin(GL_LINES); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.0,5000.0); glEnd(); // six coordinate points in pink: glPointSize(10); glBegin(GL_POINTS); glColor3f(1.0,0.0,0.0); glVertex3d(5,0,0); glColor3f(0.0,1.0,0.0); glVertex3d(0,5,0); glColor3f(0.0,0.0,1.0); glVertex3d(0,0,5); glEnd(); } void fill_display_lists() { PRINTD("fill_display_lists"); glNewList(object_list_, GL_COMPILE); Vertex_iterator v; for(v=vertices_.begin();v!=vertices_.end();++v) draw(v); glEndList(); glNewList(object_list_+1, GL_COMPILE); Edge_iterator e; for(e=edges_.begin();e!=edges_.end();++e) draw(e); glEndList(); glNewList(object_list_+2, GL_COMPILE); if (cull_backfaces || color_backfaces) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); } for (int i = 0; i < (color_backfaces ? 2 : 1); i++) { Halffacet_iterator f; for(f=halffacets_.begin();f!=halffacets_.end();++f) draw(f, i); if (color_backfaces) glCullFace(GL_FRONT); } if (cull_backfaces || color_backfaces) { glCullFace(GL_BACK); glDisable(GL_CULL_FACE); } glEndList(); glNewList(object_list_+3, GL_COMPILE); // axes: construct_axes(); glEndList(); } void init() override { PRINTD("init()"); if (init_) return; init_ = true; switches[SNC_AXES] = false; style = SNC_BOUNDARY; object_list_ = glGenLists(4); CGAL_assertion(object_list_); fill_display_lists(); PRINTD("init() end"); } void draw() const override { PRINTD("draw()"); if (!is_initialized()) const_cast(*this).init(); double l = (std::max)( (std::max)( bbox().xmax() - bbox().xmin(), bbox().ymax() - bbox().ymin()), bbox().zmax() - bbox().zmin()); if ( l < 1) // make sure that a single point doesn't screw up here l = 1; glScaled( 4.0/l, 4.0/l, 4.0/l); glTranslated( -(bbox().xmax() + bbox().xmin()) / 2.0, -(bbox().ymax() + bbox().ymin()) / 2.0, -(bbox().zmax() + bbox().zmin()) / 2.0); if (style == SNC_BOUNDARY) { //glEnable(GL_LIGHTING); glCallList(object_list_+2); // facets //glDisable(GL_LIGHTING); } // move edges and vertices a bit towards the view-point, // i.e., 1/100th of the unit vector in camera space // double f = l / 4.0 / 100.0; // glTranslated( z_vec[0] * f, z_vec[1] * f, z_vec[2] * f); glCallList(object_list_+1); // edges glCallList(object_list_); // vertices if (switches[SNC_AXES]) glCallList(object_list_+3); // axis PRINTD("draw() end"); } void debug(std::ostream& os = std::cerr) const { os << "OGL::Polyhedron" << std::endl; os << "Vertices:" << std::endl; Vertex_iterator v; for(v=vertices_.begin();v!=vertices_.end();++v) os << " "<<*v<<", mark="<mark()<debug(); os << std::endl; } os << std::endl; } }; // Polyhedron template class Nef3_Converter { typedef typename Nef_polyhedron::SNC_structure SNC_structure; typedef CGAL::SNC_decorator Base; typedef CGAL::SNC_FM_decorator FM_decorator; public: typedef typename SNC_structure::Vertex_const_iterator Vertex_const_iterator; typedef typename SNC_structure::Halfedge_const_iterator Halfedge_const_iterator; typedef typename SNC_structure::Halffacet_const_iterator Halffacet_const_iterator; typedef typename SNC_structure::Halffacet_cycle_const_iterator Halffacet_cycle_const_iterator; typedef typename SNC_structure::Object_const_handle Object_const_handle; typedef typename SNC_structure::SHalfedge_const_handle SHalfedge_const_handle; typedef typename SNC_structure::SHalfloop_const_handle SHalfloop_const_handle; typedef typename SNC_structure::Vertex_const_handle Vertex_const_handle; typedef typename SNC_structure::Halfedge_const_handle Halfedge_const_handle; typedef typename SNC_structure::Halffacet_const_handle Halffacet_const_handle; typedef typename SNC_structure::Point_3 Point_3; typedef typename SNC_structure::Vector_3 Vector_3; typedef typename SNC_structure::Segment_3 Segment_3; typedef typename SNC_structure::Plane_3 Plane_3; typedef typename SNC_structure::Mark Mark; typedef typename SNC_structure::SHalfedge_around_facet_const_circulator SHalfedge_around_facet_const_circulator; private: static OGL::Double_point double_point(const Point_3& p) { return OGL::Double_point(CGAL::to_double(p.x()), CGAL::to_double(p.y()), CGAL::to_double(p.z())); } static OGL::Double_segment double_segment(const Segment_3& s) { return OGL::Double_segment(double_point(s.source()), double_point(s.target())); } static void draw(Vertex_const_handle v, const Nef_polyhedron& , CGAL::OGL::Polyhedron& P) { Point_3 bp = v->point(); // CGAL_NEF_TRACEN("vertex " << bp); P.push_back(double_point(bp), v->mark()); } static void draw(Halfedge_const_handle e, const Nef_polyhedron& , CGAL::OGL::Polyhedron& P) { Vertex_const_handle s = e->source(); Vertex_const_handle t = e->twin()->source(); Segment_3 seg(s->point(),t->point()); // CGAL_NEF_TRACEN("edge " << seg); P.push_back(double_segment(seg), e->mark()); } static bool same_orientation(Plane_3 p1, Plane_3 p2) { if(p1.a() != 0) return CGAL::sign(p1.a()) == CGAL::sign(p2.a()); if(p1.b() != 0) return CGAL::sign(p1.b()) == CGAL::sign(p2.b()); return CGAL::sign(p1.c()) == CGAL::sign(p2.c()); } static void draw(Halffacet_const_handle f, const Nef_polyhedron& , CGAL::OGL::Polyhedron& P) { if (f->incident_volume()->mark()) return; // Skip halffaces facing solid volume OGL::DFacet g; Halffacet_cycle_const_iterator fc; // all facet cycles: CGAL_forall_facet_cycles_of(fc,f) if ( fc.is_shalfedge() ) { // non-trivial facet cycle g.new_facet_cycle(); SHalfedge_const_handle h = fc; SHalfedge_around_facet_const_circulator hc(h), he(hc); CGAL_For_all(hc,he){ // all vertex coordinates in facet cycle Point_3 sp = hc->source()->source()->point(); // CGAL_NEF_TRACEN(" ");CGAL_NEF_TRACEN("facet" << sp); g.push_back_vertex(double_point(sp)); } } Vector_3 v = f->plane().orthogonal_vector(); g.set_normal(CGAL::to_double(v.x()), CGAL::to_double(v.y()), CGAL::to_double(v.z()), f->mark()); P.push_back(g); } // Returns the bounding box of the finite vertices of the polyhedron. // Returns $[-1,+1]^3$ as bounding box if no finite vertex exists. static Bbox_3 bounded_bbox(const Nef_polyhedron& N) { bool first_vertex = true; Bbox_3 bbox( -1.0, -1.0, -1.0, 1.0, 1.0, 1.0); Vertex_const_iterator vi; CGAL_forall_vertices(vi, N) { Point_3 p = vi->point(); double x = CGAL::to_double(p.hx()); double y = CGAL::to_double(p.hy()); double z = CGAL::to_double(p.hz()); double w = CGAL::to_double(p.hw()); if (N.is_standard(vi)) { if(first_vertex) { bbox = Bbox_3(x/w, y/w, z/w, x/w, y/w, z/w); first_vertex = false; } else { bbox = bbox + Bbox_3(x/w, y/w, z/w, x/w, y/w, z/w); first_vertex = false; } } } return bbox; } static void set_R(Bbox_3& bbox, const Nef_polyhedron& N) { if(N.is_standard_kernel()) return; double size = abs(bbox.xmin()); if(size < bbox.xmax()) size = bbox.xmax(); if(size < bbox.ymin()) size = bbox.ymin(); if(size < bbox.ymax()) size = bbox.ymax(); if(size < bbox.zmin()) size = bbox.zmin(); if(size < bbox.zmax()) size = bbox.zmax(); N.set_size_of_infimaximal_box(size*50); // CGAL_NEF_TRACEN("set infi box size to " << size); Vertex_const_iterator vi; CGAL_forall_vertices(vi, N) if(N.is_standard(vi)) return; bbox = Bbox_3(bbox.xmin()*10,bbox.ymin()*10,bbox.zmin()*10, bbox.xmax()*10,bbox.ymax()*10,bbox.zmax()*10); } public: static void convert_to_OGLPolyhedron(const Nef_polyhedron& N, CGAL::OGL::Polyhedron* P) { Bbox_3 bbox(bounded_bbox(N)); set_R(bbox,N); P->bbox() = bbox; Vertex_const_iterator v; CGAL_forall_vertices(v,*N.sncp()) draw(v,N,*P); Halfedge_const_iterator e; CGAL_forall_edges(e,*N.sncp()) draw(e,N,*P); Halffacet_const_iterator f; CGAL_forall_halffacets(f,*N.sncp()) draw(f,N,*P); } }; // Nef3_Converter } // namespace OGL } //namespace CGAL openscad-2019.05/src/ext/CGAL/convex_hull_3_bugfix.h0000644000076500000240000010377113437640540022500 0ustar kintelstaff00000000000000/* This file contains a bugfix against CGAL-4.5.1, see: http://cgal-discuss.949826.n4.nabble.com/Epick-convex-hull-3-assertion-td4660264.html */ // Copyright (c) 2001,2011 Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // // Author(s) : Susan Hert // : Amol Prakash // : Andreas Fabri #ifndef CGAL_CONVEX_HULL_3_H #define CGAL_CONVEX_HULL_3_H #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma pop_macro("NDEBUG") #include #include #include #include #include #include #include #include #include #include #include #pragma push_macro("NDEBUG") #undef NDEBUG #include #ifndef CGAL_CH_NO_POSTCONDITIONS #include #endif // CGAL_CH_NO_POSTCONDITIONS #pragma pop_macro("NDEBUG") namespace CGAL { namespace internal{ namespace Convex_hull_3{ //struct to select the default traits class for computing convex hull template< class Point_3, class Is_floating_point=typename boost::is_floating_point::Kernel::FT>::type, class Has_filtered_predicates_tag=typename Kernel_traits::Kernel::Has_filtered_predicates_tag > struct Default_traits_for_Chull_3{ typedef typename Kernel_traits::Kernel type; }; //FT is a floating point type and Kernel is a filtered kernel template struct Default_traits_for_Chull_3{ typedef Convex_hull_traits_3< typename Kernel_traits::Kernel > type; }; template struct Default_polyhedron_for_Chull_3{ typedef CGAL::Polyhedron_3 type; }; template struct Default_polyhedron_for_Chull_3>{ typedef typename Convex_hull_traits_3::Polyhedron_3 type; }; //utility class to select the right version of internal predicate Is_on_positive_side_of_plane_3 template ::Kernel::FT>::type, class Has_filtered_predicates_tag=typename Kernel_traits::Kernel::Has_filtered_predicates_tag, class Has_cartesian_tag=typename Kernel_traits::Kernel::Kernel_tag, class Has_classical_point_type = typename boost::is_same< typename Kernel_traits::Kernel::Point_3, typename Traits::Point_3 >::type > struct Use_advanced_filtering{ typedef CGAL::Tag_false type; }; template struct Use_advanced_filtering{ typedef typename Kernel_traits::Kernel K; typedef CGAL::Boolean_tag type; }; //Predicates internally used template ::type > class Is_on_positive_side_of_plane_3{ typedef typename Traits::Point_3 Point_3; typename Traits::Plane_3 plane; typename Traits::Has_on_positive_side_3 has_on_positive_side; public: typedef Protect_FPU_rounding Protector; Is_on_positive_side_of_plane_3(const Traits& traits,const Point_3& p,const Point_3& q,const Point_3& r) :plane(traits.construct_plane_3_object()(p,q,r)),has_on_positive_side(traits.has_on_positive_side_3_object()) {} bool operator() (const Point_3& s) const { return has_on_positive_side(plane,s); } }; //This predicate uses copy of the code from the statically filtered version of //Orientation_3. The rational is that the plane is a member of the functor //so optimization are done to avoid doing several time operations on the plane. //The main operator() first tries the static version of the predicate, then uses //interval arithmetic (the protector must be created before using this predicate) //and in case of failure, exact arithmetic is used. template class Is_on_positive_side_of_plane_3,Tag_true>{ typedef Simple_cartesian::Type> PK; typedef Simple_cartesian CK; typedef Convex_hull_traits_3 Traits; typedef typename Traits::Point_3 Point_3; Cartesian_converter to_CK; Cartesian_converter to_PK; const Point_3& p,q,r; mutable typename CK::Plane_3* ck_plane; mutable typename PK::Plane_3* pk_plane; double m10,m20,m21,Maxx,Maxy,Maxz; static const int STATIC_FILTER_FAILURE = 555; //this function is a made from the statically filtered version of Orientation_3 int static_filtered(double psx,double psy, double psz) const{ // Then semi-static filter. double apsx = CGAL::abs(psx); double apsy = CGAL::abs(psy); double apsz = CGAL::abs(psz); double maxx = (Maxx < apsx)? apsx : Maxx; double maxy = (Maxy < apsy)? apsy : Maxy; double maxz = (Maxz < apsz)? apsz : Maxz; double det = psx*m10 - m20*psy + m21*psz; // Sort maxx < maxy < maxz. if (maxx > maxz) std::swap(maxx, maxz); if (maxy > maxz) std::swap(maxy, maxz); else if (maxy < maxx) std::swap(maxx, maxy); // Protect against underflow in the computation of eps. if (maxx < 1e-97) /* cbrt(min_double/eps) */ { if (maxx == 0) return 0; } // Protect against overflow in the computation of det. else if (maxz < 1e102) /* cbrt(max_double [hadamard]/4) */ { double eps = 5.1107127829973299e-15 * maxx * maxy * maxz; if (det > eps) return 1; if (det < -eps) return -1; } return STATIC_FILTER_FAILURE; } public: typedef typename Interval_nt_advanced::Protector Protector; Is_on_positive_side_of_plane_3(const Traits&,const Point_3& p_,const Point_3& q_,const Point_3& r_) :p(p_),q(q_),r(r_),ck_plane(NULL),pk_plane(NULL) { double pqx = q.x() - p.x(); double pqy = q.y() - p.y(); double pqz = q.z() - p.z(); double prx = r.x() - p.x(); double pry = r.y() - p.y(); double prz = r.z() - p.z(); m10 = pqy*prz - pry*pqz; m20 = pqx*prz - prx*pqz; m21 = pqx*pry - prx*pqy; double aprx = CGAL::abs(prx); double apry = CGAL::abs(pry); double aprz = CGAL::abs(prz); Maxx = CGAL::abs(pqx); if (Maxx < aprx) Maxx = aprx; Maxy = CGAL::abs(pqy); if (Maxy < apry) Maxy = apry; Maxz = CGAL::abs(pqz); if (Maxz < aprz) Maxz = aprz; } ~Is_on_positive_side_of_plane_3(){ if (ck_plane!=NULL) delete ck_plane; if (pk_plane!=NULL) delete pk_plane; } bool operator() (const Point_3& s) const { double psx = s.x() - p.x(); double psy = s.y() - p.y(); double psz = s.z() - p.z(); int static_res = static_filtered(psx,psy,psz); if (static_res != STATIC_FILTER_FAILURE) return static_res == 1; try{ if (ck_plane==NULL) ck_plane=new typename CK::Plane_3(to_CK(p),to_CK(q),to_CK(r)); return ck_plane->has_on_positive_side(to_CK(s)); } catch (Uncertain_conversion_exception){ if (pk_plane==NULL) pk_plane=new typename PK::Plane_3(to_PK(p),to_PK(q),to_PK(r)); return pk_plane->has_on_positive_side(to_PK(s)); } } }; template class Build_coplanar_poly : public Modifier_base { public: Build_coplanar_poly(ForwardIterator i, ForwardIterator j) { start = i; end = j; } void operator()( HDS& hds) { Polyhedron_incremental_builder_3 B(hds,true); ForwardIterator iter = start; int count = 0; while (iter != end) { count++; iter++; } B.begin_surface(count, 1, 2*count); iter = start; while (iter != end) { B.add_vertex(*iter); iter++; } iter = start; B.begin_facet(); int p = 0; while (p < count) { B.add_vertex_to_facet(p); p++; } B.end_facet(); B.end_surface(); } private: ForwardIterator start; ForwardIterator end; }; namespace internal { namespace Convex_hull_3{ BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Traits_has_typedef_Traits_xy_3,Traits_xy_3,false) BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Traits_has_typedef_Traits_yz_3,Traits_xy_3,false) BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Traits_has_typedef_Traits_xz_3,Traits_xy_3,false) template ::value && Traits_has_typedef_Traits_yz_3::value && Traits_has_typedef_Traits_xz_3::value > struct Projection_traits{ typedef typename Kernel_traits::Kernel K; typedef CGAL::Projection_traits_xy_3 Traits_xy_3; typedef CGAL::Projection_traits_yz_3 Traits_yz_3; typedef CGAL::Projection_traits_xz_3 Traits_xz_3; }; template struct Projection_traits{ typedef typename T::Traits_xy_3 Traits_xy_3; typedef typename T::Traits_yz_3 Traits_yz_3; typedef typename T::Traits_xz_3 Traits_xz_3; }; } } //end of namespace internal::Convex_hull_3 template void coplanar_3_hull(InputIterator first, InputIterator beyond, const Point_3& p1, const Point_3& p2, const Point_3& p3, Polyhedron_3& P, const Traits& /* traits */) { typedef typename internal::Convex_hull_3::Projection_traits PTraits; typedef typename PTraits::Traits_xy_3 Traits_xy_3; typedef typename PTraits::Traits_yz_3 Traits_yz_3; typedef typename PTraits::Traits_xz_3 Traits_xz_3; std::list CH_2; typedef typename std::list::iterator CH_2_iterator; Traits_xy_3 traits_xy; typename Traits_xy_3::Left_turn_2 left_turn_in_xy = traits_xy.left_turn_2_object(); if ( left_turn_in_xy(p1,p2,p3) || left_turn_in_xy(p2,p1,p3) ) convex_hull_points_2( first, beyond, std::back_inserter(CH_2), traits_xy ); else{ Traits_yz_3 traits_yz; typename Traits_yz_3::Left_turn_2 left_turn_in_yz = traits_yz.left_turn_2_object(); if ( left_turn_in_yz(p1,p2,p3) || left_turn_in_yz(p2,p1,p3) ) convex_hull_points_2( first, beyond, std::back_inserter(CH_2), traits_yz ); else{ Traits_xz_3 traits_xz; typename Traits_xz_3::Left_turn_2 left_turn_in_xz = traits_xz.left_turn_2_object(); CGAL_assertion( left_turn_in_xz(p1,p2,p3) || left_turn_in_xz(p2,p1,p3) ); convex_hull_points_2( first, beyond, std::back_inserter(CH_2), traits_xz ); } } typedef typename Polyhedron_3::Halfedge_data_structure HDS; Build_coplanar_poly poly(CH_2.begin(),CH_2.end()); P.delegate(poly); } // // visible is the set of facets visible from point and reachable from // start_facet. // template void find_visible_set(TDS_2& tds, const typename Traits::Point_3& point, typename TDS_2::Face_handle start, std::list& visible, std::map& outside, const Traits& traits) { typedef typename Traits::Plane_3 Plane_3; typedef typename TDS_2::Face_handle Face_handle; typedef typename TDS_2::Vertex_handle Vertex_handle; typename Traits::Has_on_positive_side_3 has_on_positive_side = traits.has_on_positive_side_3_object(); std::vector vertices; vertices.reserve(10); int VISITED=1, BORDER=2; visible.clear(); typename std::list::iterator vis_it; visible.push_back(start); start->info() = VISITED; vertices.push_back(start->vertex(0)); vertices.push_back(start->vertex(1)); vertices.push_back(start->vertex(2)); start->vertex(0)->info() = start->vertex(1)->info() = start->vertex(2)->info() = VISITED; for (vis_it = visible.begin(); vis_it != visible.end(); vis_it++) { // check all the neighbors of the current face to see if they have // already been visited or not and if not whether they are visible // or not. for(int i=0; i < 3; i++) { // the facet on the other side of the current halfedge Face_handle f = (*vis_it)->neighbor(i); // if haven't already seen this facet if (f->info() == 0) { f->info() = VISITED; Plane_3 plane(f->vertex(0)->point(),f->vertex(1)->point(),f->vertex(2)->point()); int ind = f->index(*vis_it); if ( has_on_positive_side(plane, point) ){ // is visible visible.push_back(f); Vertex_handle vh = f->vertex(ind); if(vh->info() == 0){ vertices.push_back(vh); vh->info() = VISITED;} } else { f->info() = BORDER; f->vertex(TDS_2::cw(ind))->info() = BORDER; f->vertex(TDS_2::ccw(ind))->info() = BORDER; outside.insert(std::make_pair(f->vertex(TDS_2::cw(ind)), typename TDS_2::Edge(f,ind))); } } else if(f->info() == BORDER) { int ind = f->index(*vis_it); f->vertex(TDS_2::cw(ind))->info() = BORDER; f->vertex(TDS_2::ccw(ind))->info() = BORDER; outside.insert(std::make_pair(f->vertex(TDS_2::cw(ind)), typename TDS_2::Edge(f,ind))); } } } for(typename std::vector::iterator vit = vertices.begin(); vit != vertices.end(); ++vit){ if((*vit)->info() != BORDER){ tds.delete_vertex(*vit); } else { (*vit)->info() = 0; } } } // using a third template parameter for the point instead of getting it from // the traits class as it should be is required by M$VC6 template typename std::list::iterator farthest_outside_point(Face_handle f, std::list& outside_set, const Traits& traits) { typedef typename std::list::iterator Outside_set_iterator; CGAL_ch_assertion(!outside_set.empty()); typename Traits::Plane_3 plane(f->vertex(0)->point(),f->vertex(1)->point(),f->vertex(2)->point()); typename Traits::Less_signed_distance_to_plane_3 less_dist_to_plane = traits.less_signed_distance_to_plane_3_object(); Outside_set_iterator farthest_it = std::max_element(outside_set.begin(), outside_set.end(), boost::bind(less_dist_to_plane, plane, _1, _2)); return farthest_it; } template void partition_outside_sets(const std::list& new_facets, std::list& vis_outside_set, std::list& pending_facets, const Traits& traits) { typename std::list::const_iterator f_list_it; typename std::list::iterator point_it, to_splice; // walk through all the new facets and check each unassigned outside point // to see if it belongs to the outside set of this new facet. for (f_list_it = new_facets.begin(); (f_list_it != new_facets.end()) && (! vis_outside_set.empty()); ++f_list_it) { Face_handle f = *f_list_it; Is_on_positive_side_of_plane_3 is_on_positive_side( traits,f->vertex(0)->point(),f->vertex(1)->point(),f->vertex(2)->point()); std::list& point_list = f->points; for (point_it = vis_outside_set.begin();point_it != vis_outside_set.end();){ if( is_on_positive_side(*point_it) ) { to_splice = point_it; ++point_it; point_list.splice(point_list.end(), vis_outside_set, to_splice); } else { ++point_it; } } if(! point_list.empty()){ pending_facets.push_back(f); f->it = boost::prior(pending_facets.end()); } else { f->it = pending_facets.end(); } } for (; f_list_it != new_facets.end();++f_list_it) (*f_list_it)->it = pending_facets.end(); } template void ch_quickhull_3_scan(TDS_2& tds, std::list& pending_facets, const Traits& traits) { typedef typename TDS_2::Edge Edge; typedef typename TDS_2::Face_handle Face_handle; typedef typename TDS_2::Vertex_handle Vertex_handle; typedef typename Traits::Point_3 Point_3; typedef std::list Outside_set; typedef typename std::list::iterator Outside_set_iterator; typedef std::map Border_edges; std::list visible_set; typename std::list::iterator vis_set_it; Outside_set vis_outside_set; Border_edges border; while (!pending_facets.empty()) { vis_outside_set.clear(); Face_handle f_handle = pending_facets.front(); Outside_set_iterator farthest_pt_it = farthest_outside_point(f_handle, f_handle->points, traits); Point_3 farthest_pt = *farthest_pt_it; f_handle->points.erase(farthest_pt_it); find_visible_set(tds, farthest_pt, f_handle, visible_set, border, traits); // for each visible facet for (vis_set_it = visible_set.begin(); vis_set_it != visible_set.end(); vis_set_it++) { // add its outside set to the global outside set list std::list& point_list = (*vis_set_it)->points; if(! point_list.empty()){ vis_outside_set.splice(vis_outside_set.end(), point_list, point_list.begin(), point_list.end()); } if((*vis_set_it)->it != pending_facets.end()){ pending_facets.erase((*vis_set_it)->it); } (*vis_set_it)->info() = 0; } std::vector edges; edges.reserve(border.size()); typename Border_edges::iterator it = border.begin(); Edge e = it->second; e.first->info() = 0; edges.push_back(e); border.erase(it); while(! border.empty()){ it = border.find(e.first->vertex(TDS_2::ccw(e.second))); assert(it != border.end()); e = it->second; e.first->info() = 0; edges.push_back(e); border.erase(it); } // If we want to reuse the faces we must only pass |edges| many, and call delete_face for the others. // Also create facets if necessary std::ptrdiff_t diff = visible_set.size() - edges.size(); if(diff < 0){ for(int i = 0; i<-diff;i++){ visible_set.push_back(tds.create_face()); } } else { for(int i = 0; ipoint() = farthest_pt; vh->info() = 0; // now partition the set of outside set points among the new facets. partition_outside_sets(visible_set, vis_outside_set, pending_facets, traits); } } template void non_coplanar_quickhull_3(std::list& points, TDS_2& tds, const Traits& traits) { typedef typename Traits::Point_3 Point_3; typedef typename TDS_2::Face_handle Face_handle; typedef typename TDS_2::Face_iterator Face_iterator; typedef typename std::list::iterator P3_iterator; std::list pending_facets; typename Is_on_positive_side_of_plane_3::Protector p; // for each facet, look at each unassigned point and decide if it belongs // to the outside set of this facet. for(Face_iterator fit = tds.faces_begin(); fit != tds.faces_end(); ++fit){ Is_on_positive_side_of_plane_3 is_on_positive_side( traits,fit->vertex(0)->point(),fit->vertex(1)->point(),fit->vertex(2)->point() ); for (P3_iterator point_it = points.begin() ; point_it != points.end(); ) { if( is_on_positive_side(*point_it) ) { P3_iterator to_splice = point_it; ++point_it; fit->points.splice(fit->points.end(), points, to_splice); } else { ++point_it; } } } // add all the facets with non-empty outside sets to the set of facets for // further consideration for(Face_iterator fit = tds.faces_begin(); fit != tds.faces_end(); ++fit){ if (! fit->points.empty()){ pending_facets.push_back(fit); fit->it = boost::prior(pending_facets.end()); } else { fit->it = pending_facets.end(); } } ch_quickhull_3_scan(tds, pending_facets, traits); //std::cout << "|V(tds)| = " << tds.number_of_vertices() << std::endl; // CGAL_ch_expensive_postcondition(all_points_inside(points.begin(), // points.end(),P,traits)); // CGAL_ch_postcondition(is_strongly_convex_3(P, traits)); } namespace internal{ template class Build_convex_hull_from_TDS_2 : public CGAL::Modifier_base { typedef std::map Vertex_map; const TDS& t; template static unsigned get_vertex_index( Vertex_map& vertex_map, typename TDS::Vertex_handle vh, Builder& builder, unsigned& vindex) { std::pair res=vertex_map.insert(std::make_pair(vh,vindex)); if (res.second){ builder.add_vertex(vh->point()); ++vindex; } return res.first->second; } public: Build_convex_hull_from_TDS_2(const TDS& t_):t(t_) { CGAL_assertion(t.dimension()==2); } void operator()( HDS& hds) { // Postcondition: `hds' is a valid polyhedral surface. CGAL::Polyhedron_incremental_builder_3 B( hds, true); Vertex_map vertex_map; //start the surface B.begin_surface( t.number_of_vertices(), t.number_of_faces()); unsigned vindex=0; for (typename TDS::Face_iterator it=t.faces_begin();it!=t.faces_end();++it) { unsigned i0=get_vertex_index(vertex_map,it->vertex(0),B,vindex); unsigned i1=get_vertex_index(vertex_map,it->vertex(1),B,vindex); unsigned i2=get_vertex_index(vertex_map,it->vertex(2),B,vindex); B.begin_facet(); B.add_vertex_to_facet( i0 ); B.add_vertex_to_facet( i1 ); B.add_vertex_to_facet( i2 ); B.end_facet(); } B.end_surface(); } }; } //namespace internal template void ch_quickhull_polyhedron_3(std::list& points, InputIterator point1_it, InputIterator point2_it, InputIterator point3_it, Polyhedron_3& P, const Traits& traits) { typedef typename Traits::Point_3 Point_3; typedef typename Traits::Plane_3 Plane_3; typedef typename std::list::iterator P3_iterator; typedef Triangulation_data_structure_2< Triangulation_vertex_base_with_info_2>, Convex_hull_face_base_2> Tds; typedef typename Tds::Vertex_handle Vertex_handle; typedef typename Tds::Face_handle Face_handle; // found three points that are not collinear, so construct the plane defined // by these points and then find a point that has maximum distance from this // plane. typename Traits::Construct_plane_3 construct_plane = traits.construct_plane_3_object(); Plane_3 plane = construct_plane(*point3_it, *point2_it, *point1_it); typedef typename Traits::Less_signed_distance_to_plane_3 Dist_compare; Dist_compare compare_dist = traits.less_signed_distance_to_plane_3_object(); typename Traits::Coplanar_3 coplanar = traits.coplanar_3_object(); // find both min and max here since using signed distance. If all points // are on the negative side of the plane, the max element will be on the // plane. std::pair min_max; min_max = CGAL::min_max_element(points.begin(), points.end(), boost::bind(compare_dist, plane, _1, _2), boost::bind(compare_dist, plane, _1, _2)); P3_iterator max_it; if (coplanar(*point1_it, *point2_it, *point3_it, *min_max.second)) { max_it = min_max.first; // want the orientation of the points defining the plane to be positive // so have to reorder these points if all points were on negative side // of plane std::swap(*point1_it, *point3_it); } else max_it = min_max.second; // if the maximum distance point is on the plane then all are coplanar if (coplanar(*point1_it, *point2_it, *point3_it, *max_it)) { coplanar_3_hull(points.begin(), points.end(), *point1_it, *point2_it, *point3_it, P, traits); } else { Tds tds; Vertex_handle v0 = tds.create_vertex(); v0->set_point(*point1_it); Vertex_handle v1 = tds.create_vertex(); v1->set_point(*point2_it); Vertex_handle v2 = tds.create_vertex(); v2->set_point(*point3_it); Vertex_handle v3 = tds.create_vertex(); v3->set_point(*max_it); v0->info() = v1->info() = v2->info() = v3->info() = 0; Face_handle f0 = tds.create_face(v0,v1,v2); Face_handle f1 = tds.create_face(v3,v1,v0); Face_handle f2 = tds.create_face(v3,v2,v1); Face_handle f3 = tds.create_face(v3,v0,v2); tds.set_dimension(2); f0->set_neighbors(f2, f3, f1); f1->set_neighbors(f0, f3, f2); f2->set_neighbors(f0, f1, f3); f3->set_neighbors(f0, f2, f1); points.erase(point1_it); points.erase(point2_it); points.erase(point3_it); points.erase(max_it); if (!points.empty()){ non_coplanar_quickhull_3(points, tds, traits); internal::Build_convex_hull_from_TDS_2 builder(tds); P.delegate(builder); } else P.make_tetrahedron(v0->point(),v1->point(),v2->point(),v3->point()); } } } } //namespace internal::Convex_hull_3 template void convex_hull_3(InputIterator first, InputIterator beyond, Object& ch_object, const Traits& traits) { typedef typename Traits::Point_3 Point_3; typedef std::list Point_3_list; typedef typename Point_3_list::iterator P3_iterator; typedef std::pair P3_iterator_pair; if (first == beyond) // No point return; // If the first and last point are equal the collinearity test some lines below will always be true. Point_3_list points(first, beyond); std::size_t size = points.size(); while((size > 1) && (points.front() == points.back())){ points.pop_back(); --size; } if ( size == 1 ) // 1 point { ch_object = make_object(*points.begin()); return; } else if ( size == 2 ) // 2 points { typedef typename Traits::Segment_3 Segment_3; typename Traits::Construct_segment_3 construct_segment = traits.construct_segment_3_object(); Segment_3 seg = construct_segment(*points.begin(), *(++points.begin())); ch_object = make_object(seg); return; } else if ( size == 3 ) // 3 points { typedef typename Traits::Triangle_3 Triangle_3; typename Traits::Construct_triangle_3 construct_triangle = traits.construct_triangle_3_object(); Triangle_3 tri = construct_triangle(*(points.begin()), *(++points.begin()), *(--points.end())); ch_object = make_object(tri); return; } // at least 4 points typename Traits::Collinear_3 collinear = traits.collinear_3_object(); P3_iterator point1_it = points.begin(); P3_iterator point2_it = points.begin(); point2_it++; P3_iterator point3_it = points.end(); point3_it--; // find three that are not collinear while (point2_it != points.end() && collinear(*point1_it,*point2_it,*point3_it)) point2_it++; // all are collinear, so the answer is a segment if (point2_it == points.end()) { typedef typename Traits::Less_distance_to_point_3 Less_dist; Less_dist less_dist = traits.less_distance_to_point_3_object(); P3_iterator_pair endpoints = min_max_element(points.begin(), points.end(), boost::bind(less_dist, *points.begin(), _1, _2), boost::bind(less_dist, *points.begin(), _1, _2)); typename Traits::Construct_segment_3 construct_segment = traits.construct_segment_3_object(); typedef typename Traits::Segment_3 Segment_3; Segment_3 seg = construct_segment(*endpoints.first, *endpoints.second); ch_object = make_object(seg); return; } // result will be a polyhedron typename internal::Convex_hull_3::Default_polyhedron_for_Chull_3::type P; P3_iterator minx, maxx, miny, it; minx = maxx = miny = it = points.begin(); ++it; for(; it != points.end(); ++it){ if(it->x() < minx->x()) minx = it; if(it->x() > maxx->x()) maxx = it; if(it->y() < miny->y()) miny = it; } if(! collinear(*minx, *maxx, *miny) ){ internal::Convex_hull_3::ch_quickhull_polyhedron_3(points, minx, maxx, miny, P, traits); } else { internal::Convex_hull_3::ch_quickhull_polyhedron_3(points, point1_it, point2_it, point3_it, P, traits); } CGAL_assertion(P.size_of_vertices()>=3); if (boost::next(P.vertices_begin(),3) == P.vertices_end()){ typedef typename Traits::Triangle_3 Triangle_3; typename Traits::Construct_triangle_3 construct_triangle = traits.construct_triangle_3_object(); Triangle_3 tri = construct_triangle(P.halfedges_begin()->vertex()->point(), P.halfedges_begin()->next()->vertex()->point(), P.halfedges_begin()->opposite()->vertex()->point()); ch_object = make_object(tri); } else ch_object = make_object(P); } template void convex_hull_3(InputIterator first, InputIterator beyond, Object& ch_object) { typedef typename std::iterator_traits::value_type Point_3; typedef typename internal::Convex_hull_3::Default_traits_for_Chull_3::type Traits; convex_hull_3(first, beyond, ch_object, Traits()); } template void convex_hull_3(InputIterator first, InputIterator beyond, Polyhedron_3& polyhedron, const Traits& traits) { typedef typename Traits::Point_3 Point_3; typedef std::list Point_3_list; typedef typename Point_3_list::iterator P3_iterator; Point_3_list points(first, beyond); CGAL_ch_precondition(points.size() > 3); // at least 4 points typename Traits::Collinear_3 collinear = traits.collinear_3_object(); typename Traits::Equal_3 equal = traits.equal_3_object(); P3_iterator point1_it = points.begin(); P3_iterator point2_it = points.begin(); point2_it++; // find three that are not collinear while (point2_it != points.end() && equal(*point1_it,*point2_it)) ++point2_it; CGAL_ch_precondition_msg(point2_it != points.end(), "All points are equal; cannot construct polyhedron."); P3_iterator point3_it = point2_it; ++point3_it; CGAL_ch_precondition_msg(point3_it != points.end(), "Only two points with different coordinates; cannot construct polyhedron."); while (point3_it != points.end() && collinear(*point1_it,*point2_it,*point3_it)) ++point3_it; CGAL_ch_precondition_msg(point3_it != points.end(), "All points are collinear; cannot construct polyhedron."); polyhedron.clear(); // result will be a polyhedron internal::Convex_hull_3::ch_quickhull_polyhedron_3(points, point1_it, point2_it, point3_it, polyhedron, traits); } template void convex_hull_3(InputIterator first, InputIterator beyond, Polyhedron_3& polyhedron) { typedef typename std::iterator_traits::value_type Point_3; typedef typename internal::Convex_hull_3::Default_traits_for_Chull_3::type Traits; convex_hull_3(first, beyond, polyhedron, Traits()); } } // namespace CGAL #endif // CGAL_CONVEX_HULL_3_H openscad-2019.05/src/ext/hidapi/hid.c0000644000076500000240000006156113435353202017645 0ustar kintelstaff00000000000000/******************************************************* HIDAPI - Multi-Platform library for communication with HID devices. Alan Ott Signal 11 Software 8/22/2009 Copyright 2009, All Rights Reserved. At the discretion of the user of this library, this software may be licensed under the terms of the GNU General Public License v3, a BSD-Style license, or the original HIDAPI license as outlined in the LICENSE.txt, LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt files located at the root of the source distribution. These files may also be found in the public source code repository located at: http://github.com/signal11/hidapi . ********************************************************/ #include #ifndef _NTDEF_ typedef LONG NTSTATUS; #endif #ifdef __MINGW32__ #include #include #endif #ifdef __CYGWIN__ #include #define _wcsdup wcsdup #endif /* The maximum number of characters that can be passed into the HidD_Get*String() functions without it failing.*/ #define MAX_STRING_WCHARS 0xFFF /*#define HIDAPI_USE_DDK*/ #ifdef __cplusplus extern "C" { #endif #include #include #ifdef HIDAPI_USE_DDK #include #endif /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ #define HID_OUT_CTL_CODE(id) \ CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) #ifdef __cplusplus } /* extern "C" */ #endif #include #include #include "hidapi.h" #undef MIN #define MIN(x,y) ((x) < (y)? (x): (y)) #ifdef _MSC_VER /* Thanks Microsoft, but I know how to use strncpy(). */ #pragma warning(disable:4996) #endif #ifdef __cplusplus extern "C" { #endif #ifndef HIDAPI_USE_DDK /* Since we're not building with the DDK, and the HID header files aren't part of the SDK, we have to define all this stuff here. In lookup_functions(), the function pointers defined below are set. */ typedef struct _HIDD_ATTRIBUTES{ ULONG Size; USHORT VendorID; USHORT ProductID; USHORT VersionNumber; } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; typedef USHORT USAGE; typedef struct _HIDP_CAPS { USAGE Usage; USAGE UsagePage; USHORT InputReportByteLength; USHORT OutputReportByteLength; USHORT FeatureReportByteLength; USHORT Reserved[17]; USHORT fields_not_used_by_hidapi[10]; } HIDP_CAPS, *PHIDP_CAPS; typedef void* PHIDP_PREPARSED_DATA; #define HIDP_STATUS_SUCCESS 0x110000 typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib); typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len); typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length); typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length); typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len); typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data); typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data); typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps); typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers); static HidD_GetAttributes_ HidD_GetAttributes; static HidD_GetSerialNumberString_ HidD_GetSerialNumberString; static HidD_GetManufacturerString_ HidD_GetManufacturerString; static HidD_GetProductString_ HidD_GetProductString; static HidD_SetFeature_ HidD_SetFeature; static HidD_GetFeature_ HidD_GetFeature; static HidD_GetIndexedString_ HidD_GetIndexedString; static HidD_GetPreparsedData_ HidD_GetPreparsedData; static HidD_FreePreparsedData_ HidD_FreePreparsedData; static HidP_GetCaps_ HidP_GetCaps; static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers; static HMODULE lib_handle = NULL; static BOOLEAN initialized = FALSE; #endif /* HIDAPI_USE_DDK */ struct hid_device_ { HANDLE device_handle; BOOL blocking; USHORT output_report_length; size_t input_report_length; void *last_error_str; DWORD last_error_num; BOOL read_pending; char *read_buf; OVERLAPPED ol; }; static hid_device *new_hid_device() { hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); dev->device_handle = INVALID_HANDLE_VALUE; dev->blocking = TRUE; dev->output_report_length = 0; dev->input_report_length = 0; dev->last_error_str = NULL; dev->last_error_num = 0; dev->read_pending = FALSE; dev->read_buf = NULL; memset(&dev->ol, 0, sizeof(dev->ol)); dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); return dev; } static void free_hid_device(hid_device *dev) { CloseHandle(dev->ol.hEvent); CloseHandle(dev->device_handle); LocalFree(dev->last_error_str); free(dev->read_buf); free(dev); } static void register_error(hid_device *device, const char *op) { WCHAR *ptr, *msg; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPVOID)&msg, 0/*sz*/, NULL); /* Get rid of the CR and LF that FormatMessage() sticks at the end of the message. Thanks Microsoft! */ ptr = msg; while (*ptr) { if (*ptr == '\r') { *ptr = 0x0000; break; } ptr++; } /* Store the message off in the Device entry so that the hid_error() function can pick it up. */ LocalFree(device->last_error_str); device->last_error_str = msg; } #ifndef HIDAPI_USE_DDK static int lookup_functions() { lib_handle = LoadLibraryA("hid.dll"); if (lib_handle) { #define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; RESOLVE(HidD_GetAttributes); RESOLVE(HidD_GetSerialNumberString); RESOLVE(HidD_GetManufacturerString); RESOLVE(HidD_GetProductString); RESOLVE(HidD_SetFeature); RESOLVE(HidD_GetFeature); RESOLVE(HidD_GetIndexedString); RESOLVE(HidD_GetPreparsedData); RESOLVE(HidD_FreePreparsedData); RESOLVE(HidP_GetCaps); RESOLVE(HidD_SetNumInputBuffers); #undef RESOLVE } else return -1; return 0; } #endif static HANDLE open_device(const char *path, BOOL enumerate) { HANDLE handle; DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; handle = CreateFileA(path, desired_access, share_mode, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ 0); return handle; } int HID_API_EXPORT hid_init(void) { #ifndef HIDAPI_USE_DDK if (!initialized) { if (lookup_functions() < 0) { hid_exit(); return -1; } initialized = TRUE; } #endif return 0; } int HID_API_EXPORT hid_exit(void) { #ifndef HIDAPI_USE_DDK if (lib_handle) FreeLibrary(lib_handle); lib_handle = NULL; initialized = FALSE; #endif return 0; } struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) { BOOL res; struct hid_device_info *root = NULL; /* return object */ struct hid_device_info *cur_dev = NULL; /* Windows objects for interacting with the driver. */ GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; SP_DEVINFO_DATA devinfo_data; SP_DEVICE_INTERFACE_DATA device_interface_data; SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; HDEVINFO device_info_set = INVALID_HANDLE_VALUE; int device_index = 0; int i; if (hid_init() < 0) return NULL; /* Initialize the Windows objects. */ memset(&devinfo_data, 0x0, sizeof(devinfo_data)); devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); /* Get information for all the devices belonging to the HID class. */ device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); /* Iterate over each device in the HID class, looking for the right one. */ for (;;) { HANDLE write_handle = INVALID_HANDLE_VALUE; DWORD required_size = 0; HIDD_ATTRIBUTES attrib; res = SetupDiEnumDeviceInterfaces(device_info_set, NULL, &InterfaceClassGuid, device_index, &device_interface_data); if (!res) { /* A return of FALSE from this function means that there are no more devices. */ break; } /* Call with 0-sized detail size, and let the function tell us how long the detail struct needs to be. The size is put in &required_size. */ res = SetupDiGetDeviceInterfaceDetailA(device_info_set, &device_interface_data, NULL, 0, &required_size, NULL); /* Allocate a long enough structure for device_interface_detail_data. */ device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); /* Get the detailed data for this device. The detail data gives us the device path for this device, which is then passed into CreateFile() to get a handle to the device. */ res = SetupDiGetDeviceInterfaceDetailA(device_info_set, &device_interface_data, device_interface_detail_data, required_size, NULL, NULL); if (!res) { /* register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); Continue to the next device. */ goto cont; } /* Make sure this device is of Setup Class "HIDClass" and has a driver bound to it. */ for (i = 0; ; i++) { char driver_name[256]; /* Populate devinfo_data. This function will return failure when there are no more interfaces left. */ res = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); if (!res) goto cont; res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); if (!res) goto cont; if (strcmp(driver_name, "HIDClass") == 0) { /* See if there's a driver bound. */ res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); if (res) break; } } //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); /* Open a handle to the device */ write_handle = open_device(device_interface_detail_data->DevicePath, TRUE); /* Check validity of write_handle. */ if (write_handle == INVALID_HANDLE_VALUE) { /* Unable to open the device. */ //register_error(dev, "CreateFile"); goto cont_close; } /* Get the Vendor ID and Product ID for this device. */ attrib.Size = sizeof(HIDD_ATTRIBUTES); HidD_GetAttributes(write_handle, &attrib); //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); /* Check the VID/PID to see if we should add this device to the enumeration list. */ if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && (product_id == 0x0 || attrib.ProductID == product_id)) { #define WSTR_LEN 512 const char *str; struct hid_device_info *tmp; PHIDP_PREPARSED_DATA pp_data = NULL; HIDP_CAPS caps; BOOLEAN res; NTSTATUS nt_res; wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */ size_t len; /* VID/PID match. Create the record. */ tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); if (cur_dev) { cur_dev->next = tmp; } else { root = tmp; } cur_dev = tmp; /* Get the Usage Page and Usage for this device. */ res = HidD_GetPreparsedData(write_handle, &pp_data); if (res) { nt_res = HidP_GetCaps(pp_data, &caps); if (nt_res == HIDP_STATUS_SUCCESS) { cur_dev->usage_page = caps.UsagePage; cur_dev->usage = caps.Usage; } HidD_FreePreparsedData(pp_data); } /* Fill out the record */ cur_dev->next = NULL; str = device_interface_detail_data->DevicePath; if (str) { len = strlen(str); cur_dev->path = (char*) calloc(len+1, sizeof(char)); strncpy(cur_dev->path, str, len+1); cur_dev->path[len] = '\0'; } else cur_dev->path = NULL; /* Serial Number */ res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr)); wstr[WSTR_LEN-1] = 0x0000; if (res) { cur_dev->serial_number = _wcsdup(wstr); } /* Manufacturer String */ res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr)); wstr[WSTR_LEN-1] = 0x0000; if (res) { cur_dev->manufacturer_string = _wcsdup(wstr); } /* Product String */ res = HidD_GetProductString(write_handle, wstr, sizeof(wstr)); wstr[WSTR_LEN-1] = 0x0000; if (res) { cur_dev->product_string = _wcsdup(wstr); } /* VID/PID */ cur_dev->vendor_id = attrib.VendorID; cur_dev->product_id = attrib.ProductID; /* Release Number */ cur_dev->release_number = attrib.VersionNumber; /* Interface Number. It can sometimes be parsed out of the path on Windows if a device has multiple interfaces. See http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or search for "Hardware IDs for HID Devices" at MSDN. If it's not in the path, it's set to -1. */ cur_dev->interface_number = -1; if (cur_dev->path) { char *interface_component = strstr(cur_dev->path, "&mi_"); if (interface_component) { char *hex_str = interface_component + 4; char *endptr = NULL; cur_dev->interface_number = strtol(hex_str, &endptr, 16); if (endptr == hex_str) { /* The parsing failed. Set interface_number to -1. */ cur_dev->interface_number = -1; } } } } cont_close: CloseHandle(write_handle); cont: /* We no longer need the detail data. It can be freed */ free(device_interface_detail_data); device_index++; } /* Close the device information handle. */ SetupDiDestroyDeviceInfoList(device_info_set); return root; } void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) { /* TODO: Merge this with the Linux version. This function is platform-independent. */ struct hid_device_info *d = devs; while (d) { struct hid_device_info *next = d->next; free(d->path); free(d->serial_number); free(d->manufacturer_string); free(d->product_string); free(d); d = next; } } HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) { /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ struct hid_device_info *devs, *cur_dev; const char *path_to_open = NULL; hid_device *handle = NULL; devs = hid_enumerate(vendor_id, product_id); cur_dev = devs; while (cur_dev) { if (cur_dev->vendor_id == vendor_id && cur_dev->product_id == product_id) { if (serial_number) { if (wcscmp(serial_number, cur_dev->serial_number) == 0) { path_to_open = cur_dev->path; break; } } else { path_to_open = cur_dev->path; break; } } cur_dev = cur_dev->next; } if (path_to_open) { /* Open the device */ handle = hid_open_path(path_to_open); } hid_free_enumeration(devs); return handle; } HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) { hid_device *dev; HIDP_CAPS caps; PHIDP_PREPARSED_DATA pp_data = NULL; BOOLEAN res; NTSTATUS nt_res; if (hid_init() < 0) { return NULL; } dev = new_hid_device(); /* Open a handle to the device */ dev->device_handle = open_device(path, FALSE); /* Check validity of write_handle. */ if (dev->device_handle == INVALID_HANDLE_VALUE) { /* Unable to open the device. */ register_error(dev, "CreateFile"); goto err; } /* Set the Input Report buffer size to 64 reports. */ res = HidD_SetNumInputBuffers(dev->device_handle, 64); if (!res) { register_error(dev, "HidD_SetNumInputBuffers"); goto err; } /* Get the Input Report length for the device. */ res = HidD_GetPreparsedData(dev->device_handle, &pp_data); if (!res) { register_error(dev, "HidD_GetPreparsedData"); goto err; } nt_res = HidP_GetCaps(pp_data, &caps); if (nt_res != HIDP_STATUS_SUCCESS) { register_error(dev, "HidP_GetCaps"); goto err_pp_data; } dev->output_report_length = caps.OutputReportByteLength; dev->input_report_length = caps.InputReportByteLength; HidD_FreePreparsedData(pp_data); dev->read_buf = (char*) malloc(dev->input_report_length); return dev; err_pp_data: HidD_FreePreparsedData(pp_data); err: free_hid_device(dev); return NULL; } int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length) { DWORD bytes_written; BOOL res; OVERLAPPED ol; unsigned char *buf; memset(&ol, 0, sizeof(ol)); /* Make sure the right number of bytes are passed to WriteFile. Windows expects the number of bytes which are in the _longest_ report (plus one for the report number) bytes even if the data is a report which is shorter than that. Windows gives us this value in caps.OutputReportByteLength. If a user passes in fewer bytes than this, create a temporary buffer which is the proper size. */ if (length >= dev->output_report_length) { /* The user passed the right number of bytes. Use the buffer as-is. */ buf = (unsigned char *) data; } else { /* Create a temporary buffer and copy the user's data into it, padding the rest with zeros. */ buf = (unsigned char *) malloc(dev->output_report_length); memcpy(buf, data, length); memset(buf + length, 0, dev->output_report_length - length); length = dev->output_report_length; } res = WriteFile(dev->device_handle, buf, length, NULL, &ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* WriteFile() failed. Return error. */ register_error(dev, "WriteFile"); bytes_written = -1; goto end_of_function; } } /* Wait here until the write is done. This makes hid_write() synchronous. */ res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/); if (!res) { /* The Write operation failed. */ register_error(dev, "WriteFile"); bytes_written = -1; goto end_of_function; } end_of_function: if (buf != data) free(buf); return bytes_written; } int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) { DWORD bytes_read = 0; size_t copy_len = 0; BOOL res; /* Copy the handle for convenience. */ HANDLE ev = dev->ol.hEvent; if (!dev->read_pending) { /* Start an Overlapped I/O read. */ dev->read_pending = TRUE; memset(dev->read_buf, 0, dev->input_report_length); ResetEvent(ev); res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* ReadFile() has failed. Clean up and return error. */ CancelIo(dev->device_handle); dev->read_pending = FALSE; goto end_of_function; } } } if (milliseconds >= 0) { /* See if there is any data yet. */ res = WaitForSingleObject(ev, milliseconds); if (res != WAIT_OBJECT_0) { /* There was no data this time. Return zero bytes available, but leave the Overlapped I/O running. */ return 0; } } /* Either WaitForSingleObject() told us that ReadFile has completed, or we are in non-blocking mode. Get the number of bytes read. The actual data has been copied to the data[] array which was passed to ReadFile(). */ res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); /* Set pending back to false, even if GetOverlappedResult() returned error. */ dev->read_pending = FALSE; if (res && bytes_read > 0) { if (dev->read_buf[0] == 0x0) { /* If report numbers aren't being used, but Windows sticks a report number (0x0) on the beginning of the report anyway. To make this work like the other platforms, and to make it work more like the HID spec, we'll skip over this byte. */ bytes_read--; copy_len = length > bytes_read ? bytes_read : length; memcpy(data, dev->read_buf+1, copy_len); } else { /* Copy the whole buffer, report number and all. */ copy_len = length > bytes_read ? bytes_read : length; memcpy(data, dev->read_buf, copy_len); } } end_of_function: if (!res) { register_error(dev, "GetOverlappedResult"); return -1; } return copy_len; } int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) { return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); } int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) { dev->blocking = !nonblock; return 0; /* Success */ } int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) { BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, length); if (!res) { register_error(dev, "HidD_SetFeature"); return -1; } return length; } int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) { BOOL res; #if 0 res = HidD_GetFeature(dev->device_handle, data, length); if (!res) { register_error(dev, "HidD_GetFeature"); return -1; } return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ #else DWORD bytes_returned; OVERLAPPED ol; memset(&ol, 0, sizeof(ol)); res = DeviceIoControl(dev->device_handle, IOCTL_HID_GET_FEATURE, data, length, data, length, &bytes_returned, &ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* DeviceIoControl() failed. Return error. */ register_error(dev, "Send Feature Report DeviceIoControl"); return -1; } } /* Wait here until the write is done. This makes hid_get_feature_report() synchronous. */ res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/); if (!res) { /* The operation failed. */ register_error(dev, "Send Feature Report GetOverLappedResult"); return -1; } /* bytes_returned does not include the first byte which contains the report ID. The data buffer actually contains one more byte than bytes_returned. */ bytes_returned++; return bytes_returned; #endif } void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) { if (!dev) return; CancelIo(dev->device_handle); free_hid_device(dev); } int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) { BOOL res; res = HidD_GetManufacturerString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); if (!res) { register_error(dev, "HidD_GetManufacturerString"); return -1; } return 0; } int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) { BOOL res; res = HidD_GetProductString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); if (!res) { register_error(dev, "HidD_GetProductString"); return -1; } return 0; } int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) { BOOL res; res = HidD_GetSerialNumberString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); if (!res) { register_error(dev, "HidD_GetSerialNumberString"); return -1; } return 0; } int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) { BOOL res; res = HidD_GetIndexedString(dev->device_handle, string_index, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); if (!res) { register_error(dev, "HidD_GetIndexedString"); return -1; } return 0; } HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) { return (wchar_t*)dev->last_error_str; } /*#define PICPGM*/ /*#define S11*/ #define P32 #ifdef S11 unsigned short VendorID = 0xa0a0; unsigned short ProductID = 0x0001; #endif #ifdef P32 unsigned short VendorID = 0x04d8; unsigned short ProductID = 0x3f; #endif #ifdef PICPGM unsigned short VendorID = 0x04d8; unsigned short ProductID = 0x0033; #endif #if 0 int __cdecl main(int argc, char* argv[]) { int res; unsigned char buf[65]; UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); /* Set up the command buffer. */ memset(buf,0x00,sizeof(buf)); buf[0] = 0; buf[1] = 0x81; /* Open the device. */ int handle = open(VendorID, ProductID, L"12345"); if (handle < 0) printf("unable to open device\n"); /* Toggle LED (cmd 0x80) */ buf[1] = 0x80; res = write(handle, buf, 65); if (res < 0) printf("Unable to write()\n"); /* Request state (cmd 0x81) */ buf[1] = 0x81; write(handle, buf, 65); if (res < 0) printf("Unable to write() (2)\n"); /* Read requested state */ read(handle, buf, 65); if (res < 0) printf("Unable to read()\n"); /* Print out the returned buffer. */ for (int i = 0; i < 4; i++) printf("buf[%d]: %d\n", i, buf[i]); return 0; } #endif #ifdef __cplusplus } /* extern "C" */ #endif openscad-2019.05/src/ext/hidapi/hidapi.h0000644000076500000240000003305613402025764020345 0ustar kintelstaff00000000000000/******************************************************* HIDAPI - Multi-Platform library for communication with HID devices. Alan Ott Signal 11 Software 8/22/2009 Copyright 2009, All Rights Reserved. At the discretion of the user of this library, this software may be licensed under the terms of the GNU General Public License v3, a BSD-Style license, or the original HIDAPI license as outlined in the LICENSE.txt, LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt files located at the root of the source distribution. These files may also be found in the public source code repository located at: http://github.com/signal11/hidapi . ********************************************************/ /** @file * @defgroup API hidapi API */ #ifndef HIDAPI_H__ #define HIDAPI_H__ #include #ifdef _WIN32 #define HID_API_EXPORT __declspec(dllexport) #define HID_API_CALL #else #define HID_API_EXPORT /**< API export macro */ #define HID_API_CALL /**< API call macro */ #endif #define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ #ifdef __cplusplus extern "C" { #endif struct hid_device_; typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ /** hidapi info structure */ struct hid_device_info { /** Platform-specific device path */ char *path; /** Device Vendor ID */ unsigned short vendor_id; /** Device Product ID */ unsigned short product_id; /** Serial Number */ wchar_t *serial_number; /** Device Release Number in binary-coded decimal, also known as Device Version Number */ unsigned short release_number; /** Manufacturer String */ wchar_t *manufacturer_string; /** Product string */ wchar_t *product_string; /** Usage Page for this Device/Interface (Windows/Mac only). */ unsigned short usage_page; /** Usage for this Device/Interface (Windows/Mac only).*/ unsigned short usage; /** The USB interface which this logical device represents. Valid on both Linux implementations in all cases, and valid on the Windows implementation only if the device contains more than one interface. */ int interface_number; /** Pointer to the next device */ struct hid_device_info *next; }; /** @brief Initialize the HIDAPI library. This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by hid_enumerate() and any of the hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously. @ingroup API @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_init(void); /** @brief Finalize the HIDAPI library. This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks. @ingroup API @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_exit(void); /** @brief Enumerate the HID Devices. This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @p vendor_id is set to 0 then any vendor matches. If @p product_id is set to 0 then any product matches. If @p vendor_id and @p product_id are both set to 0, then all HID devices will be returned. @ingroup API @param vendor_id The Vendor ID (VID) of the types of device to open. @param product_id The Product ID (PID) of the types of device to open. @returns This function returns a pointer to a linked list of type struct #hid_device, containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling hid_free_enumeration(). */ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); /** @brief Free an enumeration Linked List This function frees a linked list created by hid_enumerate(). @ingroup API @param devs Pointer to a list of struct_device returned from hid_enumerate(). */ void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); /** @brief Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number. If @p serial_number is NULL, the first device with the specified VID and PID is opened. @ingroup API @param vendor_id The Vendor ID (VID) of the device to open. @param product_id The Product ID (PID) of the device to open. @param serial_number The Serial Number of the device to open (Optionally NULL). @returns This function returns a pointer to a #hid_device object on success or NULL on failure. */ HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); /** @brief Open a HID device by its path name. The path name be determined by calling hid_enumerate(), or a platform-specific path name can be used (eg: /dev/hidraw0 on Linux). @ingroup API @param path The path name of the device to open @returns This function returns a pointer to a #hid_device object on success or NULL on failure. */ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); /** @brief Write an Output report to a HID device. The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to hid_write() will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to hid_write(), the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17. hid_write() will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0). @ingroup API @param device A device handle returned from hid_open(). @param data The data to send, including the report number as the first byte. @param length The length in bytes of the data to send. @returns This function returns the actual number of bytes written and -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); /** @brief Read an Input report from a HID device with timeout. Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into. @param length The number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number. @param milliseconds timeout in milliseconds or -1 for blocking wait. @returns This function returns the actual number of bytes read and -1 on error. If no packet was available to be read within the timeout period, this function returns 0. */ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); /** @brief Read an Input report from a HID device. Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into. @param length The number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number. @returns This function returns the actual number of bytes read and -1 on error. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0. */ int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); /** @brief Set the device handle to be non-blocking. In non-blocking mode calls to hid_read() will return immediately with a value of 0 if there is no data to be read. In blocking mode, hid_read() will wait (block) until there is data to read before returning. Nonblocking can be turned on and off at any time. @ingroup API @param device A device handle returned from hid_open(). @param nonblock enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking. @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); /** @brief Send a Feature report to the device. Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to hid_send_feature_report() will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to hid_send_feature_report(): the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17. @ingroup API @param device A device handle returned from hid_open(). @param data The data to send, including the report number as the first byte. @param length The length in bytes of the data to send, including the report number. @returns This function returns the actual number of bytes written and -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); /** @brief Get a feature report from a HID device. Set the first byte of @p data[] to the Report ID of the report to be read. Make sure to allow space for this extra byte in @p data[]. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1]. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into, including the Report ID. Set the first byte of @p data[] to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports. @param length The number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report. @returns This function returns the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on error. */ int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); /** @brief Close a HID device. @ingroup API @param device A device handle returned from hid_open(). */ void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); /** @brief Get The Manufacturer String from a HID device. @ingroup API @param device A device handle returned from hid_open(). @param string A wide string buffer to put the data into. @param maxlen The length of the buffer in multiples of wchar_t. @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); /** @brief Get The Product String from a HID device. @ingroup API @param device A device handle returned from hid_open(). @param string A wide string buffer to put the data into. @param maxlen The length of the buffer in multiples of wchar_t. @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); /** @brief Get The Serial Number String from a HID device. @ingroup API @param device A device handle returned from hid_open(). @param string A wide string buffer to put the data into. @param maxlen The length of the buffer in multiples of wchar_t. @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); /** @brief Get a string from a HID device, based on its string index. @ingroup API @param device A device handle returned from hid_open(). @param string_index The index of the string to get. @param string A wide string buffer to put the data into. @param maxlen The length of the buffer in multiples of wchar_t. @returns This function returns 0 on success and -1 on error. */ int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); /** @brief Get a string describing the last error which occurred. @ingroup API @param device A device handle returned from hid_open(). @returns This function returns a string containing the last error which occurred or NULL if none has occurred. */ HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); #ifdef __cplusplus } #endif #endif openscad-2019.05/src/ext/libtess2/Include/tesselator.h0000755000076500000240000002302313402025764023144 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Mikko Mononen, July 2009. */ #ifndef TESSELATOR_H #define TESSELATOR_H #ifdef __cplusplus extern "C" { #endif // See OpenGL Red Book for description of the winding rules // http://www.glprogramming.com/red/chapter11.html enum TessWindingRule { TESS_WINDING_ODD, TESS_WINDING_NONZERO, TESS_WINDING_POSITIVE, TESS_WINDING_NEGATIVE, TESS_WINDING_ABS_GEQ_TWO, }; // The contents of the tessGetElements() depends on element type being passed to tessTesselate(). // Tesselation result element types: // TESS_POLYGONS // Each element in the element array is polygon defined as 'polySize' number of vertex indices. // If a polygon has than 'polySize' vertices, the remaining indices are stored as TESS_UNDEF. // Example, drawing a polygon: // const int nelems = tessGetElementCount(tess); // const TESSindex* elems = tessGetElements(tess); // for (int i = 0; i < nelems; i++) { // const TESSindex* poly = &elems[i * polySize]; // glBegin(GL_POLYGON); // for (int j = 0; j < polySize; j++) { // if (poly[j] == TESS_UNDEF) break; // glVertex2fv(&verts[poly[j]*vertexSize]); // } // glEnd(); // } // // TESS_CONNECTED_POLYGONS // Each element in the element array is polygon defined as 'polySize' number of vertex indices, // followed by 'polySize' indices to neighour polygons, that is each element is 'polySize' * 2 indices. // If a polygon has than 'polySize' vertices, the remaining indices are stored as TESS_UNDEF. // If a polygon edge is a boundary, that is, not connected to another polygon, the neighbour index is TESS_UNDEF. // Example, flood fill based on seed polygon: // const int nelems = tessGetElementCount(tess); // const TESSindex* elems = tessGetElements(tess); // unsigned char* visited = (unsigned char*)calloc(nelems); // TESSindex stack[50]; // int nstack = 0; // stack[nstack++] = seedPoly; // visited[startPoly] = 1; // while (nstack > 0) { // TESSindex idx = stack[--nstack]; // const TESSindex* poly = &elems[idx * polySize * 2]; // const TESSindex* nei = &poly[polySize]; // for (int i = 0; i < polySize; i++) { // if (poly[i] == TESS_UNDEF) break; // if (nei[i] != TESS_UNDEF && !visited[nei[i]]) // stack[nstack++] = nei[i]; // visited[nei[i]] = 1; // } // } // } // // TESS_BOUNDARY_CONTOURS // Each element in the element array is [base index, count] pair defining a range of vertices for a contour. // The first value is index to first vertex in contour and the second value is number of vertices in the contour. // Example, drawing contours: // const int nelems = tessGetElementCount(tess); // const TESSindex* elems = tessGetElements(tess); // for (int i = 0; i < nelems; i++) { // const TESSindex base = elems[i * 2]; // const TESSindex count = elems[i * 2 + 1]; // glBegin(GL_LINE_LOOP); // for (int j = 0; j < count; j++) { // glVertex2fv(&verts[(base+j) * vertexSize]); // } // glEnd(); // } // // TESS_CONSTRAINED_DELAUNAY_TRIANGLES // Similar to TESS_POLYGONS, but we output only triangles and we attempt to provide a valid // Constrained Delaunay triangulation. enum TessElementType { TESS_POLYGONS, TESS_CONNECTED_POLYGONS, TESS_BOUNDARY_CONTOURS, TESS_CONSTRAINED_DELAUNAY_TRIANGLES }; typedef float TESSreal; typedef int TESSindex; typedef struct TESStesselator TESStesselator; typedef struct TESSalloc TESSalloc; #define TESS_UNDEF (~(TESSindex)0) #define TESS_NOTUSED(v) do { (void)(1 ? (void)0 : ( (void)(v) ) ); } while(0) // Custom memory allocator interface. // The internal memory allocator allocates mesh edges, vertices and faces // as well as dictionary nodes and active regions in buckets and uses simple // freelist to speed up the allocation. The bucket size should roughly match your // expected input data. For example if you process only hundreds of vertices, // a bucket size of 128 might be ok, where as when processing thousands of vertices // bucket size of 1024 might be approproate. The bucket size is a compromise between // how often to allocate memory from the system versus how much extra space the system // should allocate. Reasonable defaults are show in commects below, they will be used if // the bucket sizes are zero. // // The use may left the memrealloc to be null. In that case, the tesselator will not try to // dynamically grow int's internal arrays. The tesselator only needs the reallocation when it // has found intersecting segments and needs to add new vertex. This defency can be cured by // allocating some extra vertices beforehand. The 'extraVertices' variable allows to specify // number of expected extra vertices. struct TESSalloc { void *(*memalloc)( void *userData, unsigned int size ); void *(*memrealloc)( void *userData, void* ptr, unsigned int size ); void (*memfree)( void *userData, void *ptr ); void* userData; // User data passed to the allocator functions. int meshEdgeBucketSize; // 512 int meshVertexBucketSize; // 512 int meshFaceBucketSize; // 256 int dictNodeBucketSize; // 512 int regionBucketSize; // 256 int extraVertices; // Number of extra vertices allocated for the priority queue. }; // // Example use: // // // // // tessNewTess() - Creates a new tesselator. // Use tessDeleteTess() to delete the tesselator. // Parameters: // alloc - pointer to a filled TESSalloc struct or NULL to use default malloc based allocator. // Returns: // new tesselator object. TESStesselator* tessNewTess( TESSalloc* alloc ); // tessDeleteTess() - Deletes a tesselator. // Parameters: // tess - pointer to tesselator object to be deleted. void tessDeleteTess( TESStesselator *tess ); // tessAddContour() - Adds a contour to be tesselated. // The type of the vertex coordinates is assumed to be TESSreal. // Parameters: // tess - pointer to tesselator object. // size - number of coordinates per vertex. Must be 2 or 3. // pointer - pointer to the first coordinate of the first vertex in the array. // stride - defines offset in bytes between consecutive vertices. // count - number of vertices in contour. void tessAddContour( TESStesselator *tess, int size, const void* pointer, int stride, int count ); // tessTesselate() - tesselate contours. // Parameters: // tess - pointer to tesselator object. // windingRule - winding rules used for tesselation, must be one of TessWindingRule. // elementType - defines the tesselation result element type, must be one of TessElementType. // polySize - defines maximum vertices per polygons if output is polygons. If elementType is TESS_CONSTRAINED_DELAUNAY_TRIANGLES, this parameter is ignored. // vertexSize - defines the number of coordinates in tesselation result vertex, must be 2 or 3. // normal - defines the normal of the input contours, of null the normal is calculated automatically. // Returns: // 1 if succeed, 0 if failed. int tessTesselate( TESStesselator *tess, int windingRule, int elementType, int polySize, int vertexSize, const TESSreal* normal ); // tessGetVertexCount() - Returns number of vertices in the tesselated output. int tessGetVertexCount( TESStesselator *tess ); // tessGetVertices() - Returns pointer to first coordinate of first vertex. const TESSreal* tessGetVertices( TESStesselator *tess ); // tessGetVertexIndices() - Returns pointer to first vertex index. // Vertex indices can be used to map the generated vertices to the original vertices. // Every point added using tessAddContour() will get a new index starting at 0. // New vertices generated at the intersections of segments are assigned value TESS_UNDEF. const TESSindex* tessGetVertexIndices( TESStesselator *tess ); // tessGetElementCount() - Returns number of elements in the the tesselated output. int tessGetElementCount( TESStesselator *tess ); // tessGetElements() - Returns pointer to the first element. const TESSindex* tessGetElements( TESStesselator *tess ); #ifdef __cplusplus }; #endif #endif // TESSELATOR_H openscad-2019.05/src/ext/libtess2/Source/bucketalloc.c0000755000076500000240000001160113402025764023116 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Mikko Mononen, July 2009. */ #include #include #include "../Include/tesselator.h" //#define CHECK_BOUNDS typedef struct BucketAlloc BucketAlloc; typedef struct Bucket Bucket; struct Bucket { Bucket *next; }; struct BucketAlloc { void *freelist; Bucket *buckets; unsigned int itemSize; unsigned int bucketSize; const char *name; TESSalloc* alloc; }; static int CreateBucket( struct BucketAlloc* ba ) { size_t size; Bucket* bucket; void* freelist; unsigned char* head; unsigned char* it; // Allocate memory for the bucket size = sizeof(Bucket) + ba->itemSize * ba->bucketSize; bucket = (Bucket*)ba->alloc->memalloc( ba->alloc->userData, size ); if ( !bucket ) return 0; bucket->next = 0; // Add the bucket into the list of buckets. bucket->next = ba->buckets; ba->buckets = bucket; // Add new items to the free list. freelist = ba->freelist; head = (unsigned char*)bucket + sizeof(Bucket); it = head + ba->itemSize * ba->bucketSize; do { it -= ba->itemSize; // Store pointer to next free item. *((void**)it) = freelist; // Pointer to next location containing a free item. freelist = (void*)it; } while ( it != head ); // Update pointer to next location containing a free item. ba->freelist = (void*)it; return 1; } static void *NextFreeItem( struct BucketAlloc *ba ) { return *(void**)ba->freelist; } struct BucketAlloc* createBucketAlloc( TESSalloc* alloc, const char* name, unsigned int itemSize, unsigned int bucketSize ) { BucketAlloc* ba = (BucketAlloc*)alloc->memalloc( alloc->userData, sizeof(BucketAlloc) ); ba->alloc = alloc; ba->name = name; ba->itemSize = itemSize; if ( ba->itemSize < sizeof(void*) ) ba->itemSize = sizeof(void*); ba->bucketSize = bucketSize; ba->freelist = 0; ba->buckets = 0; if ( !CreateBucket( ba ) ) { alloc->memfree( alloc->userData, ba ); return 0; } return ba; } void* bucketAlloc( struct BucketAlloc *ba ) { void *it; // If running out of memory, allocate new bucket and update the freelist. if ( !ba->freelist || !NextFreeItem( ba ) ) { if ( !CreateBucket( ba ) ) return 0; } // Pop item from in front of the free list. it = ba->freelist; ba->freelist = NextFreeItem( ba ); return it; } void bucketFree( struct BucketAlloc *ba, void *ptr ) { #ifdef CHECK_BOUNDS int inBounds = 0; Bucket *bucket; // Check that the pointer is allocated with this allocator. bucket = ba->buckets; while ( bucket ) { void *bucketMin = (void*)((unsigned char*)bucket + sizeof(Bucket)); void *bucketMax = (void*)((unsigned char*)bucket + sizeof(Bucket) + ba->itemSize * ba->bucketSize); if ( ptr >= bucketMin && ptr < bucketMax ) { inBounds = 1; break; } bucket = bucket->next; } if ( inBounds ) { // Add the node in front of the free list. *(void**)ptr = ba->freelist; ba->freelist = ptr; } else { printf("ERROR! pointer 0x%p does not belong to allocator '%s'\n", ba->name); } #else // Add the node in front of the free list. *(void**)ptr = ba->freelist; ba->freelist = ptr; #endif } void deleteBucketAlloc( struct BucketAlloc *ba ) { TESSalloc* alloc = ba->alloc; Bucket *bucket = ba->buckets; Bucket *next; while ( bucket ) { next = bucket->next; alloc->memfree( alloc->userData, bucket ); bucket = next; } ba->freelist = 0; ba->buckets = 0; alloc->memfree( alloc->userData, ba ); } openscad-2019.05/src/ext/libtess2/Source/bucketalloc.h0000755000076500000240000000400613402025764023124 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Mikko Mononen, July 2009. */ #ifndef MEMALLOC_H #define MEMALLOC_H #ifdef __cplusplus extern "C" { #endif #include "tesselator.h" struct BucketAlloc *createBucketAlloc( TESSalloc* alloc, const char *name, unsigned int itemSize, unsigned int bucketSize ); void *bucketAlloc( struct BucketAlloc *ba); void bucketFree( struct BucketAlloc *ba, void *ptr ); void deleteBucketAlloc( struct BucketAlloc *ba ); #ifdef __cplusplus }; #endif #endif openscad-2019.05/src/ext/libtess2/Source/dict.c0000755000076500000240000000657113402025764021563 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #include #include "../Include/tesselator.h" #include "bucketalloc.h" #include "dict.h" /* really tessDictListNewDict */ Dict *dictNewDict( TESSalloc* alloc, void *frame, int (*leq)(void *frame, DictKey key1, DictKey key2) ) { Dict *dict = (Dict *)alloc->memalloc( alloc->userData, sizeof( Dict )); DictNode *head; if (dict == NULL) return NULL; head = &dict->head; head->key = NULL; head->next = head; head->prev = head; dict->frame = frame; dict->leq = leq; if (alloc->dictNodeBucketSize < 16) alloc->dictNodeBucketSize = 16; if (alloc->dictNodeBucketSize > 4096) alloc->dictNodeBucketSize = 4096; dict->nodePool = createBucketAlloc( alloc, "Dict", sizeof(DictNode), alloc->dictNodeBucketSize ); return dict; } /* really tessDictListDeleteDict */ void dictDeleteDict( TESSalloc* alloc, Dict *dict ) { deleteBucketAlloc( dict->nodePool ); alloc->memfree( alloc->userData, dict ); } /* really tessDictListInsertBefore */ DictNode *dictInsertBefore( Dict *dict, DictNode *node, DictKey key ) { DictNode *newNode; do { node = node->prev; } while( node->key != NULL && ! (*dict->leq)(dict->frame, node->key, key)); newNode = (DictNode *)bucketAlloc( dict->nodePool ); if (newNode == NULL) return NULL; newNode->key = key; newNode->next = node->next; node->next->prev = newNode; newNode->prev = node; node->next = newNode; return newNode; } /* really tessDictListDelete */ void dictDelete( Dict *dict, DictNode *node ) /*ARGSUSED*/ { node->next->prev = node->prev; node->prev->next = node->next; bucketFree( dict->nodePool, node ); } /* really tessDictListSearch */ DictNode *dictSearch( Dict *dict, DictKey key ) { DictNode *node = &dict->head; do { node = node->next; } while( node->key != NULL && ! (*dict->leq)(dict->frame, key, node->key)); return node; } openscad-2019.05/src/ext/libtess2/Source/dict.h0000755000076500000240000000530313402025764021560 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #ifndef DICT_LIST_H #define DICT_LIST_H typedef void *DictKey; typedef struct Dict Dict; typedef struct DictNode DictNode; Dict *dictNewDict( TESSalloc* alloc, void *frame, int (*leq)(void *frame, DictKey key1, DictKey key2) ); void dictDeleteDict( TESSalloc* alloc, Dict *dict ); /* Search returns the node with the smallest key greater than or equal * to the given key. If there is no such key, returns a node whose * key is NULL. Similarly, Succ(Max(d)) has a NULL key, etc. */ DictNode *dictSearch( Dict *dict, DictKey key ); DictNode *dictInsertBefore( Dict *dict, DictNode *node, DictKey key ); void dictDelete( Dict *dict, DictNode *node ); #define dictKey(n) ((n)->key) #define dictSucc(n) ((n)->next) #define dictPred(n) ((n)->prev) #define dictMin(d) ((d)->head.next) #define dictMax(d) ((d)->head.prev) #define dictInsert(d,k) (dictInsertBefore((d),&(d)->head,(k))) /*** Private data structures ***/ struct DictNode { DictKey key; DictNode *next; DictNode *prev; }; struct Dict { DictNode head; void *frame; struct BucketAlloc *nodePool; int (*leq)(void *frame, DictKey key1, DictKey key2); }; #endif openscad-2019.05/src/ext/libtess2/Source/geom.c0000755000076500000240000002232013402025764021555 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ //#include "tesos.h" #include #include "mesh.h" #include "geom.h" #include int tesvertLeq( TESSvertex *u, TESSvertex *v ) { /* Returns TRUE if u is lexicographically <= v. */ return VertLeq( u, v ); } TESSreal tesedgeEval( TESSvertex *u, TESSvertex *v, TESSvertex *w ) { /* Given three vertices u,v,w such that VertLeq(u,v) && VertLeq(v,w), * evaluates the t-coord of the edge uw at the s-coord of the vertex v. * Returns v->t - (uw)(v->s), ie. the signed distance from uw to v. * If uw is vertical (and thus passes thru v), the result is zero. * * The calculation is extremely accurate and stable, even when v * is very close to u or w. In particular if we set v->t = 0 and * let r be the negated result (this evaluates (uw)(v->s)), then * r is guaranteed to satisfy MIN(u->t,w->t) <= r <= MAX(u->t,w->t). */ TESSreal gapL, gapR; assert( VertLeq( u, v ) && VertLeq( v, w )); gapL = v->s - u->s; gapR = w->s - v->s; if( gapL + gapR > 0 ) { if( gapL < gapR ) { return (v->t - u->t) + (u->t - w->t) * (gapL / (gapL + gapR)); } else { return (v->t - w->t) + (w->t - u->t) * (gapR / (gapL + gapR)); } } /* vertical line */ return 0; } TESSreal tesedgeSign( TESSvertex *u, TESSvertex *v, TESSvertex *w ) { /* Returns a number whose sign matches EdgeEval(u,v,w) but which * is cheaper to evaluate. Returns > 0, == 0 , or < 0 * as v is above, on, or below the edge uw. */ TESSreal gapL, gapR; assert( VertLeq( u, v ) && VertLeq( v, w )); gapL = v->s - u->s; gapR = w->s - v->s; if( gapL + gapR > 0 ) { return (v->t - w->t) * gapL + (v->t - u->t) * gapR; } /* vertical line */ return 0; } /*********************************************************************** * Define versions of EdgeSign, EdgeEval with s and t transposed. */ TESSreal testransEval( TESSvertex *u, TESSvertex *v, TESSvertex *w ) { /* Given three vertices u,v,w such that TransLeq(u,v) && TransLeq(v,w), * evaluates the t-coord of the edge uw at the s-coord of the vertex v. * Returns v->s - (uw)(v->t), ie. the signed distance from uw to v. * If uw is vertical (and thus passes thru v), the result is zero. * * The calculation is extremely accurate and stable, even when v * is very close to u or w. In particular if we set v->s = 0 and * let r be the negated result (this evaluates (uw)(v->t)), then * r is guaranteed to satisfy MIN(u->s,w->s) <= r <= MAX(u->s,w->s). */ TESSreal gapL, gapR; assert( TransLeq( u, v ) && TransLeq( v, w )); gapL = v->t - u->t; gapR = w->t - v->t; if( gapL + gapR > 0 ) { if( gapL < gapR ) { return (v->s - u->s) + (u->s - w->s) * (gapL / (gapL + gapR)); } else { return (v->s - w->s) + (w->s - u->s) * (gapR / (gapL + gapR)); } } /* vertical line */ return 0; } TESSreal testransSign( TESSvertex *u, TESSvertex *v, TESSvertex *w ) { /* Returns a number whose sign matches TransEval(u,v,w) but which * is cheaper to evaluate. Returns > 0, == 0 , or < 0 * as v is above, on, or below the edge uw. */ TESSreal gapL, gapR; assert( TransLeq( u, v ) && TransLeq( v, w )); gapL = v->t - u->t; gapR = w->t - v->t; if( gapL + gapR > 0 ) { return (v->s - w->s) * gapL + (v->s - u->s) * gapR; } /* vertical line */ return 0; } int tesvertCCW( TESSvertex *u, TESSvertex *v, TESSvertex *w ) { /* For almost-degenerate situations, the results are not reliable. * Unless the floating-point arithmetic can be performed without * rounding errors, *any* implementation will give incorrect results * on some degenerate inputs, so the client must have some way to * handle this situation. */ return (u->s*(v->t - w->t) + v->s*(w->t - u->t) + w->s*(u->t - v->t)) >= 0; } /* Given parameters a,x,b,y returns the value (b*x+a*y)/(a+b), * or (x+y)/2 if a==b==0. It requires that a,b >= 0, and enforces * this in the rare case that one argument is slightly negative. * The implementation is extremely stable numerically. * In particular it guarantees that the result r satisfies * MIN(x,y) <= r <= MAX(x,y), and the results are very accurate * even when a and b differ greatly in magnitude. */ #define RealInterpolate(a,x,b,y) \ (a = (a < 0) ? 0 : a, b = (b < 0) ? 0 : b, \ ((a <= b) ? ((b == 0) ? ((x+y) / 2) \ : (x + (y-x) * (a/(a+b)))) \ : (y + (x-y) * (b/(a+b))))) #ifndef FOR_TRITE_TEST_PROGRAM #define Interpolate(a,x,b,y) RealInterpolate(a,x,b,y) #else /* Claim: the ONLY property the sweep algorithm relies on is that * MIN(x,y) <= r <= MAX(x,y). This is a nasty way to test that. */ #include extern int RandomInterpolate; double Interpolate( double a, double x, double b, double y) { printf("*********************%d\n",RandomInterpolate); if( RandomInterpolate ) { a = 1.2 * drand48() - 0.1; a = (a < 0) ? 0 : ((a > 1) ? 1 : a); b = 1.0 - a; } return RealInterpolate(a,x,b,y); } #endif #define Swap(a,b) do { TESSvertex *t = a; a = b; b = t; } while(0) void tesedgeIntersect( TESSvertex *o1, TESSvertex *d1, TESSvertex *o2, TESSvertex *d2, TESSvertex *v ) /* Given edges (o1,d1) and (o2,d2), compute their point of intersection. * The computed point is guaranteed to lie in the intersection of the * bounding rectangles defined by each edge. */ { TESSreal z1, z2; /* This is certainly not the most efficient way to find the intersection * of two line segments, but it is very numerically stable. * * Strategy: find the two middle vertices in the VertLeq ordering, * and interpolate the intersection s-value from these. Then repeat * using the TransLeq ordering to find the intersection t-value. */ if( ! VertLeq( o1, d1 )) { Swap( o1, d1 ); } if( ! VertLeq( o2, d2 )) { Swap( o2, d2 ); } if( ! VertLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); } if( ! VertLeq( o2, d1 )) { /* Technically, no intersection -- do our best */ v->s = (o2->s + d1->s) / 2; } else if( VertLeq( d1, d2 )) { /* Interpolate between o2 and d1 */ z1 = EdgeEval( o1, o2, d1 ); z2 = EdgeEval( o2, d1, d2 ); if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; } v->s = Interpolate( z1, o2->s, z2, d1->s ); } else { /* Interpolate between o2 and d2 */ z1 = EdgeSign( o1, o2, d1 ); z2 = -EdgeSign( o1, d2, d1 ); if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; } v->s = Interpolate( z1, o2->s, z2, d2->s ); } /* Now repeat the process for t */ if( ! TransLeq( o1, d1 )) { Swap( o1, d1 ); } if( ! TransLeq( o2, d2 )) { Swap( o2, d2 ); } if( ! TransLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); } if( ! TransLeq( o2, d1 )) { /* Technically, no intersection -- do our best */ v->t = (o2->t + d1->t) / 2; } else if( TransLeq( d1, d2 )) { /* Interpolate between o2 and d1 */ z1 = TransEval( o1, o2, d1 ); z2 = TransEval( o2, d1, d2 ); if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; } v->t = Interpolate( z1, o2->t, z2, d1->t ); } else { /* Interpolate between o2 and d2 */ z1 = TransSign( o1, o2, d1 ); z2 = -TransSign( o1, d2, d1 ); if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; } v->t = Interpolate( z1, o2->t, z2, d2->t ); } } /* Calculate the angle between v1-v2 and v1-v0 */ TESSreal calcAngle( TESSvertex *v0, TESSvertex *v1, TESSvertex *v2 ) { TESSreal num; TESSreal den; TESSreal a[2]; TESSreal b[2]; a[0] = v2->s - v1->s; a[1] = v2->t - v1->t; b[0] = v0->s - v1->s; b[1] = v0->t - v1->t; num = a[0] * b[0] + a[1] * b[1]; den = sqrt( a[0] * a[0] + a[1] * a[1] ) * sqrt( b[0] * b[0] + b[1] * b[1] ); if ( den > 0.0 ) num /= den; if ( num < -1.0 ) num = -1.0; if ( num > 1.0 ) num = 1.0; return acos( num ); } /* Returns 1 is edge is locally delaunay */ int tesedgeIsLocallyDelaunay( TESShalfEdge *e ) { return (calcAngle(e->Lnext->Org, e->Lnext->Lnext->Org, e->Org) + calcAngle(e->Sym->Lnext->Org, e->Sym->Lnext->Lnext->Org, e->Sym->Org)) < (M_PI + 0.01); } openscad-2019.05/src/ext/libtess2/Source/geom.h0000755000076500000240000000651113402025764021566 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #ifndef GEOM_H #define GEOM_H #include "mesh.h" #ifdef NO_BRANCH_CONDITIONS /* MIPS architecture has special instructions to evaluate boolean * conditions -- more efficient than branching, IF you can get the * compiler to generate the right instructions (SGI compiler doesn't) */ #define VertEq(u,v) (((u)->s == (v)->s) & ((u)->t == (v)->t)) #define VertLeq(u,v) (((u)->s < (v)->s) | \ ((u)->s == (v)->s & (u)->t <= (v)->t)) #else #define VertEq(u,v) ((u)->s == (v)->s && (u)->t == (v)->t) #define VertLeq(u,v) (((u)->s < (v)->s) || ((u)->s == (v)->s && (u)->t <= (v)->t)) #endif #define EdgeEval(u,v,w) tesedgeEval(u,v,w) #define EdgeSign(u,v,w) tesedgeSign(u,v,w) /* Versions of VertLeq, EdgeSign, EdgeEval with s and t transposed. */ #define TransLeq(u,v) (((u)->t < (v)->t) || ((u)->t == (v)->t && (u)->s <= (v)->s)) #define TransEval(u,v,w) testransEval(u,v,w) #define TransSign(u,v,w) testransSign(u,v,w) #define EdgeGoesLeft(e) VertLeq( (e)->Dst, (e)->Org ) #define EdgeGoesRight(e) VertLeq( (e)->Org, (e)->Dst ) #define EdgeIsInternal(e) e->Rface && e->Rface->inside #define ABS(x) ((x) < 0 ? -(x) : (x)) #define VertL1dist(u,v) (ABS(u->s - v->s) + ABS(u->t - v->t)) #define VertCCW(u,v,w) tesvertCCW(u,v,w) int tesvertLeq( TESSvertex *u, TESSvertex *v ); TESSreal tesedgeEval( TESSvertex *u, TESSvertex *v, TESSvertex *w ); TESSreal tesedgeSign( TESSvertex *u, TESSvertex *v, TESSvertex *w ); TESSreal testransEval( TESSvertex *u, TESSvertex *v, TESSvertex *w ); TESSreal testransSign( TESSvertex *u, TESSvertex *v, TESSvertex *w ); int tesvertCCW( TESSvertex *u, TESSvertex *v, TESSvertex *w ); void tesedgeIntersect( TESSvertex *o1, TESSvertex *d1, TESSvertex *o2, TESSvertex *d2, TESSvertex *v ); int tesedgeIsLocallyDelaunay( TESShalfEdge *e ); #endif openscad-2019.05/src/ext/libtess2/Source/mesh.c0000755000076500000240000006237313402025764021576 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ //#include "tesos.h" #include #include #include "mesh.h" #include "geom.h" #include "bucketalloc.h" #define TRUE 1 #define FALSE 0 /************************ Utility Routines ************************/ /* Allocate and free half-edges in pairs for efficiency. * The *only* place that should use this fact is allocation/free. */ typedef struct { TESShalfEdge e, eSym; } EdgePair; /* MakeEdge creates a new pair of half-edges which form their own loop. * No vertex or face structures are allocated, but these must be assigned * before the current edge operation is completed. */ static TESShalfEdge *MakeEdge( TESSmesh* mesh, TESShalfEdge *eNext ) { TESShalfEdge *e; TESShalfEdge *eSym; TESShalfEdge *ePrev; EdgePair *pair = (EdgePair *)bucketAlloc( mesh->edgeBucket ); if (pair == NULL) return NULL; e = &pair->e; eSym = &pair->eSym; /* Make sure eNext points to the first edge of the edge pair */ if( eNext->Sym < eNext ) { eNext = eNext->Sym; } /* Insert in circular doubly-linked list before eNext. * Note that the prev pointer is stored in Sym->next. */ ePrev = eNext->Sym->next; eSym->next = ePrev; ePrev->Sym->next = e; e->next = eNext; eNext->Sym->next = eSym; e->Sym = eSym; e->Onext = e; e->Lnext = eSym; e->Org = NULL; e->Lface = NULL; e->winding = 0; e->activeRegion = NULL; e->mark = 0; eSym->Sym = e; eSym->Onext = eSym; eSym->Lnext = e; eSym->Org = NULL; eSym->Lface = NULL; eSym->winding = 0; eSym->activeRegion = NULL; eSym->mark = 0; return e; } /* Splice( a, b ) is best described by the Guibas/Stolfi paper or the * CS348a notes (see mesh.h). Basically it modifies the mesh so that * a->Onext and b->Onext are exchanged. This can have various effects * depending on whether a and b belong to different face or vertex rings. * For more explanation see tessMeshSplice() below. */ static void Splice( TESShalfEdge *a, TESShalfEdge *b ) { TESShalfEdge *aOnext = a->Onext; TESShalfEdge *bOnext = b->Onext; aOnext->Sym->Lnext = b; bOnext->Sym->Lnext = a; a->Onext = bOnext; b->Onext = aOnext; } /* MakeVertex( newVertex, eOrig, vNext ) attaches a new vertex and makes it the * origin of all edges in the vertex loop to which eOrig belongs. "vNext" gives * a place to insert the new vertex in the global vertex list. We insert * the new vertex *before* vNext so that algorithms which walk the vertex * list will not see the newly created vertices. */ static void MakeVertex( TESSvertex *newVertex, TESShalfEdge *eOrig, TESSvertex *vNext ) { TESShalfEdge *e; TESSvertex *vPrev; TESSvertex *vNew = newVertex; assert(vNew != NULL); /* insert in circular doubly-linked list before vNext */ vPrev = vNext->prev; vNew->prev = vPrev; vPrev->next = vNew; vNew->next = vNext; vNext->prev = vNew; vNew->anEdge = eOrig; /* leave coords, s, t undefined */ /* fix other edges on this vertex loop */ e = eOrig; do { e->Org = vNew; e = e->Onext; } while( e != eOrig ); } /* MakeFace( newFace, eOrig, fNext ) attaches a new face and makes it the left * face of all edges in the face loop to which eOrig belongs. "fNext" gives * a place to insert the new face in the global face list. We insert * the new face *before* fNext so that algorithms which walk the face * list will not see the newly created faces. */ static void MakeFace( TESSface *newFace, TESShalfEdge *eOrig, TESSface *fNext ) { TESShalfEdge *e; TESSface *fPrev; TESSface *fNew = newFace; assert(fNew != NULL); /* insert in circular doubly-linked list before fNext */ fPrev = fNext->prev; fNew->prev = fPrev; fPrev->next = fNew; fNew->next = fNext; fNext->prev = fNew; fNew->anEdge = eOrig; fNew->trail = NULL; fNew->marked = FALSE; /* The new face is marked "inside" if the old one was. This is a * convenience for the common case where a face has been split in two. */ fNew->inside = fNext->inside; /* fix other edges on this face loop */ e = eOrig; do { e->Lface = fNew; e = e->Lnext; } while( e != eOrig ); } /* KillEdge( eDel ) destroys an edge (the half-edges eDel and eDel->Sym), * and removes from the global edge list. */ static void KillEdge( TESSmesh *mesh, TESShalfEdge *eDel ) { TESShalfEdge *ePrev, *eNext; /* Half-edges are allocated in pairs, see EdgePair above */ if( eDel->Sym < eDel ) { eDel = eDel->Sym; } /* delete from circular doubly-linked list */ eNext = eDel->next; ePrev = eDel->Sym->next; eNext->Sym->next = ePrev; ePrev->Sym->next = eNext; bucketFree( mesh->edgeBucket, eDel ); } /* KillVertex( vDel ) destroys a vertex and removes it from the global * vertex list. It updates the vertex loop to point to a given new vertex. */ static void KillVertex( TESSmesh *mesh, TESSvertex *vDel, TESSvertex *newOrg ) { TESShalfEdge *e, *eStart = vDel->anEdge; TESSvertex *vPrev, *vNext; /* change the origin of all affected edges */ e = eStart; do { e->Org = newOrg; e = e->Onext; } while( e != eStart ); /* delete from circular doubly-linked list */ vPrev = vDel->prev; vNext = vDel->next; vNext->prev = vPrev; vPrev->next = vNext; bucketFree( mesh->vertexBucket, vDel ); } /* KillFace( fDel ) destroys a face and removes it from the global face * list. It updates the face loop to point to a given new face. */ static void KillFace( TESSmesh *mesh, TESSface *fDel, TESSface *newLface ) { TESShalfEdge *e, *eStart = fDel->anEdge; TESSface *fPrev, *fNext; /* change the left face of all affected edges */ e = eStart; do { e->Lface = newLface; e = e->Lnext; } while( e != eStart ); /* delete from circular doubly-linked list */ fPrev = fDel->prev; fNext = fDel->next; fNext->prev = fPrev; fPrev->next = fNext; bucketFree( mesh->faceBucket, fDel ); } /****************** Basic Edge Operations **********************/ /* tessMeshMakeEdge creates one edge, two vertices, and a loop (face). * The loop consists of the two new half-edges. */ TESShalfEdge *tessMeshMakeEdge( TESSmesh *mesh ) { TESSvertex *newVertex1 = (TESSvertex*)bucketAlloc(mesh->vertexBucket); TESSvertex *newVertex2 = (TESSvertex*)bucketAlloc(mesh->vertexBucket); TESSface *newFace = (TESSface*)bucketAlloc(mesh->faceBucket); TESShalfEdge *e; /* if any one is null then all get freed */ if (newVertex1 == NULL || newVertex2 == NULL || newFace == NULL) { if (newVertex1 != NULL) bucketFree( mesh->vertexBucket, newVertex1 ); if (newVertex2 != NULL) bucketFree( mesh->vertexBucket, newVertex2 ); if (newFace != NULL) bucketFree( mesh->faceBucket, newFace ); return NULL; } e = MakeEdge( mesh, &mesh->eHead ); if (e == NULL) return NULL; MakeVertex( newVertex1, e, &mesh->vHead ); MakeVertex( newVertex2, e->Sym, &mesh->vHead ); MakeFace( newFace, e, &mesh->fHead ); return e; } /* tessMeshSplice( eOrg, eDst ) is the basic operation for changing the * mesh connectivity and topology. It changes the mesh so that * eOrg->Onext <- OLD( eDst->Onext ) * eDst->Onext <- OLD( eOrg->Onext ) * where OLD(...) means the value before the meshSplice operation. * * This can have two effects on the vertex structure: * - if eOrg->Org != eDst->Org, the two vertices are merged together * - if eOrg->Org == eDst->Org, the origin is split into two vertices * In both cases, eDst->Org is changed and eOrg->Org is untouched. * * Similarly (and independently) for the face structure, * - if eOrg->Lface == eDst->Lface, one loop is split into two * - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one * In both cases, eDst->Lface is changed and eOrg->Lface is unaffected. * * Some special cases: * If eDst == eOrg, the operation has no effect. * If eDst == eOrg->Lnext, the new face will have a single edge. * If eDst == eOrg->Lprev, the old face will have a single edge. * If eDst == eOrg->Onext, the new vertex will have a single edge. * If eDst == eOrg->Oprev, the old vertex will have a single edge. */ int tessMeshSplice( TESSmesh* mesh, TESShalfEdge *eOrg, TESShalfEdge *eDst ) { int joiningLoops = FALSE; int joiningVertices = FALSE; if( eOrg == eDst ) return 1; if( eDst->Org != eOrg->Org ) { /* We are merging two disjoint vertices -- destroy eDst->Org */ joiningVertices = TRUE; KillVertex( mesh, eDst->Org, eOrg->Org ); } if( eDst->Lface != eOrg->Lface ) { /* We are connecting two disjoint loops -- destroy eDst->Lface */ joiningLoops = TRUE; KillFace( mesh, eDst->Lface, eOrg->Lface ); } /* Change the edge structure */ Splice( eDst, eOrg ); if( ! joiningVertices ) { TESSvertex *newVertex = (TESSvertex*)bucketAlloc( mesh->vertexBucket ); if (newVertex == NULL) return 0; /* We split one vertex into two -- the new vertex is eDst->Org. * Make sure the old vertex points to a valid half-edge. */ MakeVertex( newVertex, eDst, eOrg->Org ); eOrg->Org->anEdge = eOrg; } if( ! joiningLoops ) { TESSface *newFace = (TESSface*)bucketAlloc( mesh->faceBucket ); if (newFace == NULL) return 0; /* We split one loop into two -- the new loop is eDst->Lface. * Make sure the old face points to a valid half-edge. */ MakeFace( newFace, eDst, eOrg->Lface ); eOrg->Lface->anEdge = eOrg; } return 1; } /* tessMeshDelete( eDel ) removes the edge eDel. There are several cases: * if (eDel->Lface != eDel->Rface), we join two loops into one; the loop * eDel->Lface is deleted. Otherwise, we are splitting one loop into two; * the newly created loop will contain eDel->Dst. If the deletion of eDel * would create isolated vertices, those are deleted as well. * * This function could be implemented as two calls to tessMeshSplice * plus a few calls to memFree, but this would allocate and delete * unnecessary vertices and faces. */ int tessMeshDelete( TESSmesh *mesh, TESShalfEdge *eDel ) { TESShalfEdge *eDelSym = eDel->Sym; int joiningLoops = FALSE; /* First step: disconnect the origin vertex eDel->Org. We make all * changes to get a consistent mesh in this "intermediate" state. */ if( eDel->Lface != eDel->Rface ) { /* We are joining two loops into one -- remove the left face */ joiningLoops = TRUE; KillFace( mesh, eDel->Lface, eDel->Rface ); } if( eDel->Onext == eDel ) { KillVertex( mesh, eDel->Org, NULL ); } else { /* Make sure that eDel->Org and eDel->Rface point to valid half-edges */ eDel->Rface->anEdge = eDel->Oprev; eDel->Org->anEdge = eDel->Onext; Splice( eDel, eDel->Oprev ); if( ! joiningLoops ) { TESSface *newFace= (TESSface*)bucketAlloc( mesh->faceBucket ); if (newFace == NULL) return 0; /* We are splitting one loop into two -- create a new loop for eDel. */ MakeFace( newFace, eDel, eDel->Lface ); } } /* Claim: the mesh is now in a consistent state, except that eDel->Org * may have been deleted. Now we disconnect eDel->Dst. */ if( eDelSym->Onext == eDelSym ) { KillVertex( mesh, eDelSym->Org, NULL ); KillFace( mesh, eDelSym->Lface, NULL ); } else { /* Make sure that eDel->Dst and eDel->Lface point to valid half-edges */ eDel->Lface->anEdge = eDelSym->Oprev; eDelSym->Org->anEdge = eDelSym->Onext; Splice( eDelSym, eDelSym->Oprev ); } /* Any isolated vertices or faces have already been freed. */ KillEdge( mesh, eDel ); return 1; } /******************** Other Edge Operations **********************/ /* All these routines can be implemented with the basic edge * operations above. They are provided for convenience and efficiency. */ /* tessMeshAddEdgeVertex( eOrg ) creates a new edge eNew such that * eNew == eOrg->Lnext, and eNew->Dst is a newly created vertex. * eOrg and eNew will have the same left face. */ TESShalfEdge *tessMeshAddEdgeVertex( TESSmesh *mesh, TESShalfEdge *eOrg ) { TESShalfEdge *eNewSym; TESShalfEdge *eNew = MakeEdge( mesh, eOrg ); if (eNew == NULL) return NULL; eNewSym = eNew->Sym; /* Connect the new edge appropriately */ Splice( eNew, eOrg->Lnext ); /* Set the vertex and face information */ eNew->Org = eOrg->Dst; { TESSvertex *newVertex= (TESSvertex*)bucketAlloc( mesh->vertexBucket ); if (newVertex == NULL) return NULL; MakeVertex( newVertex, eNewSym, eNew->Org ); } eNew->Lface = eNewSym->Lface = eOrg->Lface; return eNew; } /* tessMeshSplitEdge( eOrg ) splits eOrg into two edges eOrg and eNew, * such that eNew == eOrg->Lnext. The new vertex is eOrg->Dst == eNew->Org. * eOrg and eNew will have the same left face. */ TESShalfEdge *tessMeshSplitEdge( TESSmesh *mesh, TESShalfEdge *eOrg ) { TESShalfEdge *eNew; TESShalfEdge *tempHalfEdge= tessMeshAddEdgeVertex( mesh, eOrg ); if (tempHalfEdge == NULL) return NULL; eNew = tempHalfEdge->Sym; /* Disconnect eOrg from eOrg->Dst and connect it to eNew->Org */ Splice( eOrg->Sym, eOrg->Sym->Oprev ); Splice( eOrg->Sym, eNew ); /* Set the vertex and face information */ eOrg->Dst = eNew->Org; eNew->Dst->anEdge = eNew->Sym; /* may have pointed to eOrg->Sym */ eNew->Rface = eOrg->Rface; eNew->winding = eOrg->winding; /* copy old winding information */ eNew->Sym->winding = eOrg->Sym->winding; return eNew; } /* tessMeshConnect( eOrg, eDst ) creates a new edge from eOrg->Dst * to eDst->Org, and returns the corresponding half-edge eNew. * If eOrg->Lface == eDst->Lface, this splits one loop into two, * and the newly created loop is eNew->Lface. Otherwise, two disjoint * loops are merged into one, and the loop eDst->Lface is destroyed. * * If (eOrg == eDst), the new face will have only two edges. * If (eOrg->Lnext == eDst), the old face is reduced to a single edge. * If (eOrg->Lnext->Lnext == eDst), the old face is reduced to two edges. */ TESShalfEdge *tessMeshConnect( TESSmesh *mesh, TESShalfEdge *eOrg, TESShalfEdge *eDst ) { TESShalfEdge *eNewSym; int joiningLoops = FALSE; TESShalfEdge *eNew = MakeEdge( mesh, eOrg ); if (eNew == NULL) return NULL; eNewSym = eNew->Sym; if( eDst->Lface != eOrg->Lface ) { /* We are connecting two disjoint loops -- destroy eDst->Lface */ joiningLoops = TRUE; KillFace( mesh, eDst->Lface, eOrg->Lface ); } /* Connect the new edge appropriately */ Splice( eNew, eOrg->Lnext ); Splice( eNewSym, eDst ); /* Set the vertex and face information */ eNew->Org = eOrg->Dst; eNewSym->Org = eDst->Org; eNew->Lface = eNewSym->Lface = eOrg->Lface; /* Make sure the old face points to a valid half-edge */ eOrg->Lface->anEdge = eNewSym; if( ! joiningLoops ) { TESSface *newFace= (TESSface*)bucketAlloc( mesh->faceBucket ); if (newFace == NULL) return NULL; /* We split one loop into two -- the new loop is eNew->Lface */ MakeFace( newFace, eNew, eOrg->Lface ); } return eNew; } /******************** Other Operations **********************/ /* tessMeshZapFace( fZap ) destroys a face and removes it from the * global face list. All edges of fZap will have a NULL pointer as their * left face. Any edges which also have a NULL pointer as their right face * are deleted entirely (along with any isolated vertices this produces). * An entire mesh can be deleted by zapping its faces, one at a time, * in any order. Zapped faces cannot be used in further mesh operations! */ void tessMeshZapFace( TESSmesh *mesh, TESSface *fZap ) { TESShalfEdge *eStart = fZap->anEdge; TESShalfEdge *e, *eNext, *eSym; TESSface *fPrev, *fNext; /* walk around face, deleting edges whose right face is also NULL */ eNext = eStart->Lnext; do { e = eNext; eNext = e->Lnext; e->Lface = NULL; if( e->Rface == NULL ) { /* delete the edge -- see TESSmeshDelete above */ if( e->Onext == e ) { KillVertex( mesh, e->Org, NULL ); } else { /* Make sure that e->Org points to a valid half-edge */ e->Org->anEdge = e->Onext; Splice( e, e->Oprev ); } eSym = e->Sym; if( eSym->Onext == eSym ) { KillVertex( mesh, eSym->Org, NULL ); } else { /* Make sure that eSym->Org points to a valid half-edge */ eSym->Org->anEdge = eSym->Onext; Splice( eSym, eSym->Oprev ); } KillEdge( mesh, e ); } } while( e != eStart ); /* delete from circular doubly-linked list */ fPrev = fZap->prev; fNext = fZap->next; fNext->prev = fPrev; fPrev->next = fNext; bucketFree( mesh->faceBucket, fZap ); } /* tessMeshNewMesh() creates a new mesh with no edges, no vertices, * and no loops (what we usually call a "face"). */ TESSmesh *tessMeshNewMesh( TESSalloc* alloc ) { TESSvertex *v; TESSface *f; TESShalfEdge *e; TESShalfEdge *eSym; TESSmesh *mesh = (TESSmesh *)alloc->memalloc( alloc->userData, sizeof( TESSmesh )); if (mesh == NULL) { return NULL; } if (alloc->meshEdgeBucketSize < 16) alloc->meshEdgeBucketSize = 16; if (alloc->meshEdgeBucketSize > 4096) alloc->meshEdgeBucketSize = 4096; if (alloc->meshVertexBucketSize < 16) alloc->meshVertexBucketSize = 16; if (alloc->meshVertexBucketSize > 4096) alloc->meshVertexBucketSize = 4096; if (alloc->meshFaceBucketSize < 16) alloc->meshFaceBucketSize = 16; if (alloc->meshFaceBucketSize > 4096) alloc->meshFaceBucketSize = 4096; mesh->edgeBucket = createBucketAlloc( alloc, "Mesh Edges", sizeof(EdgePair), alloc->meshEdgeBucketSize ); mesh->vertexBucket = createBucketAlloc( alloc, "Mesh Vertices", sizeof(TESSvertex), alloc->meshVertexBucketSize ); mesh->faceBucket = createBucketAlloc( alloc, "Mesh Faces", sizeof(TESSface), alloc->meshFaceBucketSize ); v = &mesh->vHead; f = &mesh->fHead; e = &mesh->eHead; eSym = &mesh->eHeadSym; v->next = v->prev = v; v->anEdge = NULL; f->next = f->prev = f; f->anEdge = NULL; f->trail = NULL; f->marked = FALSE; f->inside = FALSE; e->next = e; e->Sym = eSym; e->Onext = NULL; e->Lnext = NULL; e->Org = NULL; e->Lface = NULL; e->winding = 0; e->activeRegion = NULL; eSym->next = eSym; eSym->Sym = e; eSym->Onext = NULL; eSym->Lnext = NULL; eSym->Org = NULL; eSym->Lface = NULL; eSym->winding = 0; eSym->activeRegion = NULL; return mesh; } /* tessMeshUnion( mesh1, mesh2 ) forms the union of all structures in * both meshes, and returns the new mesh (the old meshes are destroyed). */ TESSmesh *tessMeshUnion( TESSalloc* alloc, TESSmesh *mesh1, TESSmesh *mesh2 ) { TESSface *f1 = &mesh1->fHead; TESSvertex *v1 = &mesh1->vHead; TESShalfEdge *e1 = &mesh1->eHead; TESSface *f2 = &mesh2->fHead; TESSvertex *v2 = &mesh2->vHead; TESShalfEdge *e2 = &mesh2->eHead; /* Add the faces, vertices, and edges of mesh2 to those of mesh1 */ if( f2->next != f2 ) { f1->prev->next = f2->next; f2->next->prev = f1->prev; f2->prev->next = f1; f1->prev = f2->prev; } if( v2->next != v2 ) { v1->prev->next = v2->next; v2->next->prev = v1->prev; v2->prev->next = v1; v1->prev = v2->prev; } if( e2->next != e2 ) { e1->Sym->next->Sym->next = e2->next; e2->next->Sym->next = e1->Sym->next; e2->Sym->next->Sym->next = e1; e1->Sym->next = e2->Sym->next; } alloc->memfree( alloc->userData, mesh2 ); return mesh1; } static int CountFaceVerts( TESSface *f ) { TESShalfEdge *eCur = f->anEdge; int n = 0; do { n++; eCur = eCur->Lnext; } while (eCur != f->anEdge); return n; } int tessMeshMergeConvexFaces( TESSmesh *mesh, int maxVertsPerFace ) { TESSface *f; TESShalfEdge *eCur, *eNext, *eSym; TESSvertex *vStart; int curNv, symNv; for( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) { // Skip faces which are outside the result. if( !f->inside ) continue; eCur = f->anEdge; vStart = eCur->Org; while (1) { eNext = eCur->Lnext; eSym = eCur->Sym; // Try to merge if the neighbour face is valid. if( eSym && eSym->Lface && eSym->Lface->inside ) { // Try to merge the neighbour faces if the resulting polygons // does not exceed maximum number of vertices. curNv = CountFaceVerts( f ); symNv = CountFaceVerts( eSym->Lface ); if( (curNv+symNv-2) <= maxVertsPerFace ) { // Merge if the resulting poly is convex. if( VertCCW( eCur->Lprev->Org, eCur->Org, eSym->Lnext->Lnext->Org ) && VertCCW( eSym->Lprev->Org, eSym->Org, eCur->Lnext->Lnext->Org ) ) { eNext = eSym->Lnext; if( !tessMeshDelete( mesh, eSym ) ) return 0; eCur = 0; } } } if( eCur && eCur->Lnext->Org == vStart ) break; // Continue to next edge. eCur = eNext; } } return 1; } void tessMeshFlipEdge( TESSmesh *mesh, TESShalfEdge *edge ) { TESShalfEdge *a0 = edge; TESShalfEdge *a1 = a0->Lnext; TESShalfEdge *a2 = a1->Lnext; TESShalfEdge *b0 = edge->Sym; TESShalfEdge *b1 = b0->Lnext; TESShalfEdge *b2 = b1->Lnext; TESSvertex *aOrg = a0->Org; TESSvertex *aOpp = a2->Org; TESSvertex *bOrg = b0->Org; TESSvertex *bOpp = b2->Org; TESSface *fa = a0->Lface; TESSface *fb = b0->Lface; assert(EdgeIsInternal(edge)); assert(a2->Lnext == a0); assert(b2->Lnext == b0); a0->Org = bOpp; a0->Onext = b1->Sym; b0->Org = aOpp; b0->Onext = a1->Sym; a2->Onext = b0; b2->Onext = a0; b1->Onext = a2->Sym; a1->Onext = b2->Sym; a0->Lnext = a2; a2->Lnext = b1; b1->Lnext = a0; b0->Lnext = b2; b2->Lnext = a1; a1->Lnext = b0; a1->Lface = fb; b1->Lface = fa; fa->anEdge = a0; fb->anEdge = b0; if (aOrg->anEdge == a0) aOrg->anEdge = b1; if (bOrg->anEdge == b0) bOrg->anEdge = a1; assert( a0->Lnext->Onext->Sym == a0 ); assert( a0->Onext->Sym->Lnext == a0 ); assert( a0->Org->anEdge->Org == a0->Org ); assert( a1->Lnext->Onext->Sym == a1 ); assert( a1->Onext->Sym->Lnext == a1 ); assert( a1->Org->anEdge->Org == a1->Org ); assert( a2->Lnext->Onext->Sym == a2 ); assert( a2->Onext->Sym->Lnext == a2 ); assert( a2->Org->anEdge->Org == a2->Org ); assert( b0->Lnext->Onext->Sym == b0 ); assert( b0->Onext->Sym->Lnext == b0 ); assert( b0->Org->anEdge->Org == b0->Org ); assert( b1->Lnext->Onext->Sym == b1 ); assert( b1->Onext->Sym->Lnext == b1 ); assert( b1->Org->anEdge->Org == b1->Org ); assert( b2->Lnext->Onext->Sym == b2 ); assert( b2->Onext->Sym->Lnext == b2 ); assert( b2->Org->anEdge->Org == b2->Org ); assert(aOrg->anEdge->Org == aOrg); assert(bOrg->anEdge->Org == bOrg); assert(a0->Oprev->Onext->Org == a0->Org); } #ifdef DELETE_BY_ZAPPING /* tessMeshDeleteMesh( mesh ) will free all storage for any valid mesh. */ void tessMeshDeleteMesh( TESSalloc* alloc, TESSmesh *mesh ) { TESSface *fHead = &mesh->fHead; while( fHead->next != fHead ) { tessMeshZapFace( fHead->next ); } assert( mesh->vHead.next == &mesh->vHead ); alloc->memfree( alloc->userData, mesh ); } #else /* tessMeshDeleteMesh( mesh ) will free all storage for any valid mesh. */ void tessMeshDeleteMesh( TESSalloc* alloc, TESSmesh *mesh ) { deleteBucketAlloc(mesh->edgeBucket); deleteBucketAlloc(mesh->vertexBucket); deleteBucketAlloc(mesh->faceBucket); alloc->memfree( alloc->userData, mesh ); } #endif #ifndef NDEBUG /* tessMeshCheckMesh( mesh ) checks a mesh for self-consistency. */ void tessMeshCheckMesh( TESSmesh *mesh ) { TESSface *fHead = &mesh->fHead; TESSvertex *vHead = &mesh->vHead; TESShalfEdge *eHead = &mesh->eHead; TESSface *f, *fPrev; TESSvertex *v, *vPrev; TESShalfEdge *e, *ePrev; fPrev = fHead; for( fPrev = fHead ; (f = fPrev->next) != fHead; fPrev = f) { assert( f->prev == fPrev ); e = f->anEdge; do { assert( e->Sym != e ); assert( e->Sym->Sym == e ); assert( e->Lnext->Onext->Sym == e ); assert( e->Onext->Sym->Lnext == e ); assert( e->Lface == f ); e = e->Lnext; } while( e != f->anEdge ); } assert( f->prev == fPrev && f->anEdge == NULL ); vPrev = vHead; for( vPrev = vHead ; (v = vPrev->next) != vHead; vPrev = v) { assert( v->prev == vPrev ); e = v->anEdge; do { assert( e->Sym != e ); assert( e->Sym->Sym == e ); assert( e->Lnext->Onext->Sym == e ); assert( e->Onext->Sym->Lnext == e ); assert( e->Org == v ); e = e->Onext; } while( e != v->anEdge ); } assert( v->prev == vPrev && v->anEdge == NULL ); ePrev = eHead; for( ePrev = eHead ; (e = ePrev->next) != eHead; ePrev = e) { assert( e->Sym->next == ePrev->Sym ); assert( e->Sym != e ); assert( e->Sym->Sym == e ); assert( e->Org != NULL ); assert( e->Dst != NULL ); assert( e->Lnext->Onext->Sym == e ); assert( e->Onext->Sym->Lnext == e ); } assert( e->Sym->next == ePrev->Sym && e->Sym == &mesh->eHeadSym && e->Sym->Sym == e && e->Org == NULL && e->Dst == NULL && e->Lface == NULL && e->Rface == NULL ); } #endif openscad-2019.05/src/ext/libtess2/Source/mesh.h0000755000076500000240000003022113402025764021566 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #ifndef MESH_H #define MESH_H #include "../Include/tesselator.h" typedef struct TESSmesh TESSmesh; typedef struct TESSvertex TESSvertex; typedef struct TESSface TESSface; typedef struct TESShalfEdge TESShalfEdge; typedef struct ActiveRegion ActiveRegion; /* The mesh structure is similar in spirit, notation, and operations * to the "quad-edge" structure (see L. Guibas and J. Stolfi, Primitives * for the manipulation of general subdivisions and the computation of * Voronoi diagrams, ACM Transactions on Graphics, 4(2):74-123, April 1985). * For a simplified description, see the course notes for CS348a, * "Mathematical Foundations of Computer Graphics", available at the * Stanford bookstore (and taught during the fall quarter). * The implementation also borrows a tiny subset of the graph-based approach * use in Mantyla's Geometric Work Bench (see M. Mantyla, An Introduction * to Sold Modeling, Computer Science Press, Rockville, Maryland, 1988). * * The fundamental data structure is the "half-edge". Two half-edges * go together to make an edge, but they point in opposite directions. * Each half-edge has a pointer to its mate (the "symmetric" half-edge Sym), * its origin vertex (Org), the face on its left side (Lface), and the * adjacent half-edges in the CCW direction around the origin vertex * (Onext) and around the left face (Lnext). There is also a "next" * pointer for the global edge list (see below). * * The notation used for mesh navigation: * Sym = the mate of a half-edge (same edge, but opposite direction) * Onext = edge CCW around origin vertex (keep same origin) * Dnext = edge CCW around destination vertex (keep same dest) * Lnext = edge CCW around left face (dest becomes new origin) * Rnext = edge CCW around right face (origin becomes new dest) * * "prev" means to substitute CW for CCW in the definitions above. * * The mesh keeps global lists of all vertices, faces, and edges, * stored as doubly-linked circular lists with a dummy header node. * The mesh stores pointers to these dummy headers (vHead, fHead, eHead). * * The circular edge list is special; since half-edges always occur * in pairs (e and e->Sym), each half-edge stores a pointer in only * one direction. Starting at eHead and following the e->next pointers * will visit each *edge* once (ie. e or e->Sym, but not both). * e->Sym stores a pointer in the opposite direction, thus it is * always true that e->Sym->next->Sym->next == e. * * Each vertex has a pointer to next and previous vertices in the * circular list, and a pointer to a half-edge with this vertex as * the origin (NULL if this is the dummy header). There is also a * field "data" for client data. * * Each face has a pointer to the next and previous faces in the * circular list, and a pointer to a half-edge with this face as * the left face (NULL if this is the dummy header). There is also * a field "data" for client data. * * Note that what we call a "face" is really a loop; faces may consist * of more than one loop (ie. not simply connected), but there is no * record of this in the data structure. The mesh may consist of * several disconnected regions, so it may not be possible to visit * the entire mesh by starting at a half-edge and traversing the edge * structure. * * The mesh does NOT support isolated vertices; a vertex is deleted along * with its last edge. Similarly when two faces are merged, one of the * faces is deleted (see tessMeshDelete below). For mesh operations, * all face (loop) and vertex pointers must not be NULL. However, once * mesh manipulation is finished, TESSmeshZapFace can be used to delete * faces of the mesh, one at a time. All external faces can be "zapped" * before the mesh is returned to the client; then a NULL face indicates * a region which is not part of the output polygon. */ struct TESSvertex { TESSvertex *next; /* next vertex (never NULL) */ TESSvertex *prev; /* previous vertex (never NULL) */ TESShalfEdge *anEdge; /* a half-edge with this origin */ /* Internal data (keep hidden) */ TESSreal coords[3]; /* vertex location in 3D */ TESSreal s, t; /* projection onto the sweep plane */ int pqHandle; /* to allow deletion from priority queue */ TESSindex n; /* to allow identify unique vertices */ TESSindex idx; /* to allow map result to original verts */ }; struct TESSface { TESSface *next; /* next face (never NULL) */ TESSface *prev; /* previous face (never NULL) */ TESShalfEdge *anEdge; /* a half edge with this left face */ /* Internal data (keep hidden) */ TESSface *trail; /* "stack" for conversion to strips */ TESSindex n; /* to allow identiy unique faces */ char marked; /* flag for conversion to strips */ char inside; /* this face is in the polygon interior */ }; struct TESShalfEdge { TESShalfEdge *next; /* doubly-linked list (prev==Sym->next) */ TESShalfEdge *Sym; /* same edge, opposite direction */ TESShalfEdge *Onext; /* next edge CCW around origin */ TESShalfEdge *Lnext; /* next edge CCW around left face */ TESSvertex *Org; /* origin vertex (Overtex too long) */ TESSface *Lface; /* left face */ /* Internal data (keep hidden) */ ActiveRegion *activeRegion; /* a region with this upper edge (sweep.c) */ int winding; /* change in winding number when crossing from the right face to the left face */ int mark; /* Used by the Edge Flip algorithm */ }; #define Rface Sym->Lface #define Dst Sym->Org #define Oprev Sym->Lnext #define Lprev Onext->Sym #define Dprev Lnext->Sym #define Rprev Sym->Onext #define Dnext Rprev->Sym /* 3 pointers */ #define Rnext Oprev->Sym /* 3 pointers */ struct TESSmesh { TESSvertex vHead; /* dummy header for vertex list */ TESSface fHead; /* dummy header for face list */ TESShalfEdge eHead; /* dummy header for edge list */ TESShalfEdge eHeadSym; /* and its symmetric counterpart */ struct BucketAlloc* edgeBucket; struct BucketAlloc* vertexBucket; struct BucketAlloc* faceBucket; }; /* The mesh operations below have three motivations: completeness, * convenience, and efficiency. The basic mesh operations are MakeEdge, * Splice, and Delete. All the other edge operations can be implemented * in terms of these. The other operations are provided for convenience * and/or efficiency. * * When a face is split or a vertex is added, they are inserted into the * global list *before* the existing vertex or face (ie. e->Org or e->Lface). * This makes it easier to process all vertices or faces in the global lists * without worrying about processing the same data twice. As a convenience, * when a face is split, the "inside" flag is copied from the old face. * Other internal data (v->data, v->activeRegion, f->data, f->marked, * f->trail, e->winding) is set to zero. * * ********************** Basic Edge Operations ************************** * * tessMeshMakeEdge( mesh ) creates one edge, two vertices, and a loop. * The loop (face) consists of the two new half-edges. * * tessMeshSplice( eOrg, eDst ) is the basic operation for changing the * mesh connectivity and topology. It changes the mesh so that * eOrg->Onext <- OLD( eDst->Onext ) * eDst->Onext <- OLD( eOrg->Onext ) * where OLD(...) means the value before the meshSplice operation. * * This can have two effects on the vertex structure: * - if eOrg->Org != eDst->Org, the two vertices are merged together * - if eOrg->Org == eDst->Org, the origin is split into two vertices * In both cases, eDst->Org is changed and eOrg->Org is untouched. * * Similarly (and independently) for the face structure, * - if eOrg->Lface == eDst->Lface, one loop is split into two * - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one * In both cases, eDst->Lface is changed and eOrg->Lface is unaffected. * * tessMeshDelete( eDel ) removes the edge eDel. There are several cases: * if (eDel->Lface != eDel->Rface), we join two loops into one; the loop * eDel->Lface is deleted. Otherwise, we are splitting one loop into two; * the newly created loop will contain eDel->Dst. If the deletion of eDel * would create isolated vertices, those are deleted as well. * * ********************** Other Edge Operations ************************** * * tessMeshAddEdgeVertex( eOrg ) creates a new edge eNew such that * eNew == eOrg->Lnext, and eNew->Dst is a newly created vertex. * eOrg and eNew will have the same left face. * * tessMeshSplitEdge( eOrg ) splits eOrg into two edges eOrg and eNew, * such that eNew == eOrg->Lnext. The new vertex is eOrg->Dst == eNew->Org. * eOrg and eNew will have the same left face. * * tessMeshConnect( eOrg, eDst ) creates a new edge from eOrg->Dst * to eDst->Org, and returns the corresponding half-edge eNew. * If eOrg->Lface == eDst->Lface, this splits one loop into two, * and the newly created loop is eNew->Lface. Otherwise, two disjoint * loops are merged into one, and the loop eDst->Lface is destroyed. * * ************************ Other Operations ***************************** * * tessMeshNewMesh() creates a new mesh with no edges, no vertices, * and no loops (what we usually call a "face"). * * tessMeshUnion( mesh1, mesh2 ) forms the union of all structures in * both meshes, and returns the new mesh (the old meshes are destroyed). * * tessMeshDeleteMesh( mesh ) will free all storage for any valid mesh. * * tessMeshZapFace( fZap ) destroys a face and removes it from the * global face list. All edges of fZap will have a NULL pointer as their * left face. Any edges which also have a NULL pointer as their right face * are deleted entirely (along with any isolated vertices this produces). * An entire mesh can be deleted by zapping its faces, one at a time, * in any order. Zapped faces cannot be used in further mesh operations! * * tessMeshCheckMesh( mesh ) checks a mesh for self-consistency. */ TESShalfEdge *tessMeshMakeEdge( TESSmesh *mesh ); int tessMeshSplice( TESSmesh *mesh, TESShalfEdge *eOrg, TESShalfEdge *eDst ); int tessMeshDelete( TESSmesh *mesh, TESShalfEdge *eDel ); TESShalfEdge *tessMeshAddEdgeVertex( TESSmesh *mesh, TESShalfEdge *eOrg ); TESShalfEdge *tessMeshSplitEdge( TESSmesh *mesh, TESShalfEdge *eOrg ); TESShalfEdge *tessMeshConnect( TESSmesh *mesh, TESShalfEdge *eOrg, TESShalfEdge *eDst ); TESSmesh *tessMeshNewMesh( TESSalloc* alloc ); TESSmesh *tessMeshUnion( TESSalloc* alloc, TESSmesh *mesh1, TESSmesh *mesh2 ); int tessMeshMergeConvexFaces( TESSmesh *mesh, int maxVertsPerFace ); void tessMeshDeleteMesh( TESSalloc* alloc, TESSmesh *mesh ); void tessMeshZapFace( TESSmesh *mesh, TESSface *fZap ); void tessMeshFlipEdge( TESSmesh *mesh, TESShalfEdge *edge ); #ifdef NDEBUG #define tessMeshCheckMesh( mesh ) #else void tessMeshCheckMesh( TESSmesh *mesh ); #endif #endif openscad-2019.05/src/ext/libtess2/Source/priorityq.c0000755000076500000240000003201413402025764022671 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ //#include "tesos.h" #include #include #include "../Include/tesselator.h" #include "priorityq.h" #define INIT_SIZE 32 #define TRUE 1 #define FALSE 0 #ifdef FOR_TRITE_TEST_PROGRAM #define LEQ(x,y) (*pq->leq)(x,y) #else /* Violates modularity, but a little faster */ #include "geom.h" #define LEQ(x,y) VertLeq((TESSvertex *)x, (TESSvertex *)y) #endif /* Include all the code for the regular heap-based queue here. */ /* The basic operations are insertion of a new key (pqInsert), * and examination/extraction of a key whose value is minimum * (pqMinimum/pqExtractMin). Deletion is also allowed (pqDelete); * for this purpose pqInsert returns a "handle" which is supplied * as the argument. * * An initial heap may be created efficiently by calling pqInsert * repeatedly, then calling pqInit. In any case pqInit must be called * before any operations other than pqInsert are used. * * If the heap is empty, pqMinimum/pqExtractMin will return a NULL key. * This may also be tested with pqIsEmpty. */ /* Since we support deletion the data structure is a little more * complicated than an ordinary heap. "nodes" is the heap itself; * active nodes are stored in the range 1..pq->size. When the * heap exceeds its allocated size (pq->max), its size doubles. * The children of node i are nodes 2i and 2i+1. * * Each node stores an index into an array "handles". Each handle * stores a key, plus a pointer back to the node which currently * represents that key (ie. nodes[handles[i].node].handle == i). */ #define pqHeapMinimum(pq) ((pq)->handles[(pq)->nodes[1].handle].key) #define pqHeapIsEmpty(pq) ((pq)->size == 0) /* really pqHeapNewPriorityQHeap */ PriorityQHeap *pqHeapNewPriorityQ( TESSalloc* alloc, int size, int (*leq)(PQkey key1, PQkey key2) ) { PriorityQHeap *pq = (PriorityQHeap *)alloc->memalloc( alloc->userData, sizeof( PriorityQHeap )); if (pq == NULL) return NULL; pq->size = 0; pq->max = size; pq->nodes = (PQnode *)alloc->memalloc( alloc->userData, (size + 1) * sizeof(pq->nodes[0]) ); if (pq->nodes == NULL) { alloc->memfree( alloc->userData, pq ); return NULL; } pq->handles = (PQhandleElem *)alloc->memalloc( alloc->userData, (size + 1) * sizeof(pq->handles[0]) ); if (pq->handles == NULL) { alloc->memfree( alloc->userData, pq->nodes ); alloc->memfree( alloc->userData, pq ); return NULL; } pq->initialized = FALSE; pq->freeList = 0; pq->leq = leq; pq->nodes[1].handle = 1; /* so that Minimum() returns NULL */ pq->handles[1].key = NULL; return pq; } /* really pqHeapDeletePriorityQHeap */ void pqHeapDeletePriorityQ( TESSalloc* alloc, PriorityQHeap *pq ) { alloc->memfree( alloc->userData, pq->handles ); alloc->memfree( alloc->userData, pq->nodes ); alloc->memfree( alloc->userData, pq ); } static void FloatDown( PriorityQHeap *pq, int curr ) { PQnode *n = pq->nodes; PQhandleElem *h = pq->handles; PQhandle hCurr, hChild; int child; hCurr = n[curr].handle; for( ;; ) { child = curr << 1; if( child < pq->size && LEQ( h[n[child+1].handle].key, h[n[child].handle].key )) { ++child; } assert(child <= pq->max); hChild = n[child].handle; if( child > pq->size || LEQ( h[hCurr].key, h[hChild].key )) { n[curr].handle = hCurr; h[hCurr].node = curr; break; } n[curr].handle = hChild; h[hChild].node = curr; curr = child; } } static void FloatUp( PriorityQHeap *pq, int curr ) { PQnode *n = pq->nodes; PQhandleElem *h = pq->handles; PQhandle hCurr, hParent; int parent; hCurr = n[curr].handle; for( ;; ) { parent = curr >> 1; hParent = n[parent].handle; if( parent == 0 || LEQ( h[hParent].key, h[hCurr].key )) { n[curr].handle = hCurr; h[hCurr].node = curr; break; } n[curr].handle = hParent; h[hParent].node = curr; curr = parent; } } /* really pqHeapInit */ void pqHeapInit( PriorityQHeap *pq ) { int i; /* This method of building a heap is O(n), rather than O(n lg n). */ for( i = pq->size; i >= 1; --i ) { FloatDown( pq, i ); } pq->initialized = TRUE; } /* really pqHeapInsert */ /* returns INV_HANDLE iff out of memory */ PQhandle pqHeapInsert( TESSalloc* alloc, PriorityQHeap *pq, PQkey keyNew ) { int curr; PQhandle free; curr = ++ pq->size; if( (curr*2) > pq->max ) { if (!alloc->memrealloc) { return INV_HANDLE; } else { PQnode *saveNodes= pq->nodes; PQhandleElem *saveHandles= pq->handles; // If the heap overflows, double its size. pq->max <<= 1; pq->nodes = (PQnode *)alloc->memrealloc( alloc->userData, pq->nodes, (size_t)((pq->max + 1) * sizeof( pq->nodes[0] ))); if (pq->nodes == NULL) { pq->nodes = saveNodes; // restore ptr to free upon return return INV_HANDLE; } pq->handles = (PQhandleElem *)alloc->memrealloc( alloc->userData, pq->handles, (size_t) ((pq->max + 1) * sizeof( pq->handles[0] ))); if (pq->handles == NULL) { pq->handles = saveHandles; // restore ptr to free upon return return INV_HANDLE; } } } if( pq->freeList == 0 ) { free = curr; } else { free = pq->freeList; pq->freeList = pq->handles[free].node; } pq->nodes[curr].handle = free; pq->handles[free].node = curr; pq->handles[free].key = keyNew; if( pq->initialized ) { FloatUp( pq, curr ); } assert(free != INV_HANDLE); return free; } /* really pqHeapExtractMin */ PQkey pqHeapExtractMin( PriorityQHeap *pq ) { PQnode *n = pq->nodes; PQhandleElem *h = pq->handles; PQhandle hMin = n[1].handle; PQkey min = h[hMin].key; if( pq->size > 0 ) { n[1].handle = n[pq->size].handle; h[n[1].handle].node = 1; h[hMin].key = NULL; h[hMin].node = pq->freeList; pq->freeList = hMin; if( -- pq->size > 0 ) { FloatDown( pq, 1 ); } } return min; } /* really pqHeapDelete */ void pqHeapDelete( PriorityQHeap *pq, PQhandle hCurr ) { PQnode *n = pq->nodes; PQhandleElem *h = pq->handles; int curr; assert( hCurr >= 1 && hCurr <= pq->max && h[hCurr].key != NULL ); curr = h[hCurr].node; n[curr].handle = n[pq->size].handle; h[n[curr].handle].node = curr; if( curr <= -- pq->size ) { if( curr <= 1 || LEQ( h[n[curr>>1].handle].key, h[n[curr].handle].key )) { FloatDown( pq, curr ); } else { FloatUp( pq, curr ); } } h[hCurr].key = NULL; h[hCurr].node = pq->freeList; pq->freeList = hCurr; } /* Now redefine all the function names to map to their "Sort" versions. */ /* really tessPqSortNewPriorityQ */ PriorityQ *pqNewPriorityQ( TESSalloc* alloc, int size, int (*leq)(PQkey key1, PQkey key2) ) { PriorityQ *pq = (PriorityQ *)alloc->memalloc( alloc->userData, sizeof( PriorityQ )); if (pq == NULL) return NULL; pq->heap = pqHeapNewPriorityQ( alloc, size, leq ); if (pq->heap == NULL) { alloc->memfree( alloc->userData, pq ); return NULL; } // pq->keys = (PQkey *)memAlloc( INIT_SIZE * sizeof(pq->keys[0]) ); pq->keys = (PQkey *)alloc->memalloc( alloc->userData, size * sizeof(pq->keys[0]) ); if (pq->keys == NULL) { pqHeapDeletePriorityQ( alloc, pq->heap ); alloc->memfree( alloc->userData, pq ); return NULL; } pq->size = 0; pq->max = size; //INIT_SIZE; pq->initialized = FALSE; pq->leq = leq; return pq; } /* really tessPqSortDeletePriorityQ */ void pqDeletePriorityQ( TESSalloc* alloc, PriorityQ *pq ) { assert(pq != NULL); if (pq->heap != NULL) pqHeapDeletePriorityQ( alloc, pq->heap ); if (pq->order != NULL) alloc->memfree( alloc->userData, pq->order ); if (pq->keys != NULL) alloc->memfree( alloc->userData, pq->keys ); alloc->memfree( alloc->userData, pq ); } #define LT(x,y) (! LEQ(y,x)) #define GT(x,y) (! LEQ(x,y)) #define Swap(a,b) do {PQkey *tmp = *a; *a = *b; *b = tmp;} while(0) /* really tessPqSortInit */ int pqInit( TESSalloc* alloc, PriorityQ *pq ) { PQkey **p, **r, **i, **j, *piv; struct { PQkey **p, **r; } Stack[50], *top = Stack; unsigned int seed = 2016473283; /* Create an array of indirect pointers to the keys, so that we * the handles we have returned are still valid. */ /* pq->order = (PQkey **)memAlloc( (size_t) (pq->size * sizeof(pq->order[0])) ); */ pq->order = (PQkey **)alloc->memalloc( alloc->userData, (size_t)((pq->size+1) * sizeof(pq->order[0])) ); /* the previous line is a patch to compensate for the fact that IBM */ /* machines return a null on a malloc of zero bytes (unlike SGI), */ /* so we have to put in this defense to guard against a memory */ /* fault four lines down. from fossum@austin.ibm.com. */ if (pq->order == NULL) return 0; p = pq->order; r = p + pq->size - 1; for( piv = pq->keys, i = p; i <= r; ++piv, ++i ) { *i = piv; } /* Sort the indirect pointers in descending order, * using randomized Quicksort */ top->p = p; top->r = r; ++top; while( --top >= Stack ) { p = top->p; r = top->r; while( r > p + 10 ) { seed = seed * 1539415821 + 1; i = p + seed % (r - p + 1); piv = *i; *i = *p; *p = piv; i = p - 1; j = r + 1; do { do { ++i; } while( GT( **i, *piv )); do { --j; } while( LT( **j, *piv )); Swap( i, j ); } while( i < j ); Swap( i, j ); /* Undo last swap */ if( i - p < r - j ) { top->p = j+1; top->r = r; ++top; r = i-1; } else { top->p = p; top->r = i-1; ++top; p = j+1; } } /* Insertion sort small lists */ for( i = p+1; i <= r; ++i ) { piv = *i; for( j = i; j > p && LT( **(j-1), *piv ); --j ) { *j = *(j-1); } *j = piv; } } pq->max = pq->size; pq->initialized = TRUE; pqHeapInit( pq->heap ); /* always succeeds */ #ifndef NDEBUG p = pq->order; r = p + pq->size - 1; for( i = p; i < r; ++i ) { assert( LEQ( **(i+1), **i )); } #endif return 1; } /* really tessPqSortInsert */ /* returns INV_HANDLE iff out of memory */ PQhandle pqInsert( TESSalloc* alloc, PriorityQ *pq, PQkey keyNew ) { int curr; if( pq->initialized ) { return pqHeapInsert( alloc, pq->heap, keyNew ); } curr = pq->size; if( ++ pq->size >= pq->max ) { if (!alloc->memrealloc) { return INV_HANDLE; } else { PQkey *saveKey= pq->keys; // If the heap overflows, double its size. pq->max <<= 1; pq->keys = (PQkey *)alloc->memrealloc( alloc->userData, pq->keys, (size_t)(pq->max * sizeof( pq->keys[0] ))); if (pq->keys == NULL) { pq->keys = saveKey; // restore ptr to free upon return return INV_HANDLE; } } } assert(curr != INV_HANDLE); pq->keys[curr] = keyNew; /* Negative handles index the sorted array. */ return -(curr+1); } /* really tessPqSortExtractMin */ PQkey pqExtractMin( PriorityQ *pq ) { PQkey sortMin, heapMin; if( pq->size == 0 ) { return pqHeapExtractMin( pq->heap ); } sortMin = *(pq->order[pq->size-1]); if( ! pqHeapIsEmpty( pq->heap )) { heapMin = pqHeapMinimum( pq->heap ); if( LEQ( heapMin, sortMin )) { return pqHeapExtractMin( pq->heap ); } } do { -- pq->size; } while( pq->size > 0 && *(pq->order[pq->size-1]) == NULL ); return sortMin; } /* really tessPqSortMinimum */ PQkey pqMinimum( PriorityQ *pq ) { PQkey sortMin, heapMin; if( pq->size == 0 ) { return pqHeapMinimum( pq->heap ); } sortMin = *(pq->order[pq->size-1]); if( ! pqHeapIsEmpty( pq->heap )) { heapMin = pqHeapMinimum( pq->heap ); if( LEQ( heapMin, sortMin )) { return heapMin; } } return sortMin; } /* really tessPqSortIsEmpty */ int pqIsEmpty( PriorityQ *pq ) { return (pq->size == 0) && pqHeapIsEmpty( pq->heap ); } /* really tessPqSortDelete */ void pqDelete( PriorityQ *pq, PQhandle curr ) { if( curr >= 0 ) { pqHeapDelete( pq->heap, curr ); return; } curr = -(curr+1); assert( curr < pq->max && pq->keys[curr] != NULL ); pq->keys[curr] = NULL; while( pq->size > 0 && *(pq->order[pq->size-1]) == NULL ) { -- pq->size; } } openscad-2019.05/src/ext/libtess2/Source/priorityq.h0000755000076500000240000000725013402025764022702 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #ifndef PRIORITYQ_H #define PRIORITYQ_H /* The basic operations are insertion of a new key (pqInsert), * and examination/extraction of a key whose value is minimum * (pqMinimum/pqExtractMin). Deletion is also allowed (pqDelete); * for this purpose pqInsert returns a "handle" which is supplied * as the argument. * * An initial heap may be created efficiently by calling pqInsert * repeatedly, then calling pqInit. In any case pqInit must be called * before any operations other than pqInsert are used. * * If the heap is empty, pqMinimum/pqExtractMin will return a NULL key. * This may also be tested with pqIsEmpty. */ /* Since we support deletion the data structure is a little more * complicated than an ordinary heap. "nodes" is the heap itself; * active nodes are stored in the range 1..pq->size. When the * heap exceeds its allocated size (pq->max), its size doubles. * The children of node i are nodes 2i and 2i+1. * * Each node stores an index into an array "handles". Each handle * stores a key, plus a pointer back to the node which currently * represents that key (ie. nodes[handles[i].node].handle == i). */ typedef void *PQkey; typedef int PQhandle; typedef struct PriorityQHeap PriorityQHeap; #define INV_HANDLE 0x0fffffff typedef struct { PQhandle handle; } PQnode; typedef struct { PQkey key; PQhandle node; } PQhandleElem; struct PriorityQHeap { PQnode *nodes; PQhandleElem *handles; int size, max; PQhandle freeList; int initialized; int (*leq)(PQkey key1, PQkey key2); }; typedef struct PriorityQ PriorityQ; struct PriorityQ { PriorityQHeap *heap; PQkey *keys; PQkey **order; PQhandle size, max; int initialized; int (*leq)(PQkey key1, PQkey key2); }; PriorityQ *pqNewPriorityQ( TESSalloc* alloc, int size, int (*leq)(PQkey key1, PQkey key2) ); void pqDeletePriorityQ( TESSalloc* alloc, PriorityQ *pq ); int pqInit( TESSalloc* alloc, PriorityQ *pq ); PQhandle pqInsert( TESSalloc* alloc, PriorityQ *pq, PQkey key ); PQkey pqExtractMin( PriorityQ *pq ); void pqDelete( PriorityQ *pq, PQhandle handle ); PQkey pqMinimum( PriorityQ *pq ); int pqIsEmpty( PriorityQ *pq ); #endif openscad-2019.05/src/ext/libtess2/Source/sweep.c0000755000076500000240000013317113402025764021760 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #include #include #include /* longjmp */ #include "mesh.h" #include "geom.h" #include "tess.h" #include "dict.h" #include "priorityq.h" #include "bucketalloc.h" #include "sweep.h" #define TRUE 1 #define FALSE 0 #ifdef FOR_TRITE_TEST_PROGRAM extern void DebugEvent( TESStesselator *tess ); #else #define DebugEvent( tess ) #endif /* * Invariants for the Edge Dictionary. * - each pair of adjacent edges e2=Succ(e1) satisfies EdgeLeq(e1,e2) * at any valid location of the sweep event * - if EdgeLeq(e2,e1) as well (at any valid sweep event), then e1 and e2 * share a common endpoint * - for each e, e->Dst has been processed, but not e->Org * - each edge e satisfies VertLeq(e->Dst,event) && VertLeq(event,e->Org) * where "event" is the current sweep line event. * - no edge e has zero length * * Invariants for the Mesh (the processed portion). * - the portion of the mesh left of the sweep line is a planar graph, * ie. there is *some* way to embed it in the plane * - no processed edge has zero length * - no two processed vertices have identical coordinates * - each "inside" region is monotone, ie. can be broken into two chains * of monotonically increasing vertices according to VertLeq(v1,v2) * - a non-invariant: these chains may intersect (very slightly) * * Invariants for the Sweep. * - if none of the edges incident to the event vertex have an activeRegion * (ie. none of these edges are in the edge dictionary), then the vertex * has only right-going edges. * - if an edge is marked "fixUpperEdge" (it is a temporary edge introduced * by ConnectRightVertex), then it is the only right-going edge from * its associated vertex. (This says that these edges exist only * when it is necessary.) */ #define MAX(x,y) ((x) >= (y) ? (x) : (y)) #define MIN(x,y) ((x) <= (y) ? (x) : (y)) /* When we merge two edges into one, we need to compute the combined * winding of the new edge. */ #define AddWinding(eDst,eSrc) (eDst->winding += eSrc->winding, \ eDst->Sym->winding += eSrc->Sym->winding) static void SweepEvent( TESStesselator *tess, TESSvertex *vEvent ); static void WalkDirtyRegions( TESStesselator *tess, ActiveRegion *regUp ); static int CheckForRightSplice( TESStesselator *tess, ActiveRegion *regUp ); static int EdgeLeq( TESStesselator *tess, ActiveRegion *reg1, ActiveRegion *reg2 ) /* * Both edges must be directed from right to left (this is the canonical * direction for the upper edge of each region). * * The strategy is to evaluate a "t" value for each edge at the * current sweep line position, given by tess->event. The calculations * are designed to be very stable, but of course they are not perfect. * * Special case: if both edge destinations are at the sweep event, * we sort the edges by slope (they would otherwise compare equally). */ { TESSvertex *event = tess->event; TESShalfEdge *e1, *e2; TESSreal t1, t2; e1 = reg1->eUp; e2 = reg2->eUp; if( e1->Dst == event ) { if( e2->Dst == event ) { /* Two edges right of the sweep line which meet at the sweep event. * Sort them by slope. */ if( VertLeq( e1->Org, e2->Org )) { return EdgeSign( e2->Dst, e1->Org, e2->Org ) <= 0; } return EdgeSign( e1->Dst, e2->Org, e1->Org ) >= 0; } return EdgeSign( e2->Dst, event, e2->Org ) <= 0; } if( e2->Dst == event ) { return EdgeSign( e1->Dst, event, e1->Org ) >= 0; } /* General case - compute signed distance *from* e1, e2 to event */ t1 = EdgeEval( e1->Dst, event, e1->Org ); t2 = EdgeEval( e2->Dst, event, e2->Org ); return (t1 >= t2); } static void DeleteRegion( TESStesselator *tess, ActiveRegion *reg ) { if( reg->fixUpperEdge ) { /* It was created with zero winding number, so it better be * deleted with zero winding number (ie. it better not get merged * with a real edge). */ assert( reg->eUp->winding == 0 ); } reg->eUp->activeRegion = NULL; dictDelete( tess->dict, reg->nodeUp ); bucketFree( tess->regionPool, reg ); } static int FixUpperEdge( TESStesselator *tess, ActiveRegion *reg, TESShalfEdge *newEdge ) /* * Replace an upper edge which needs fixing (see ConnectRightVertex). */ { assert( reg->fixUpperEdge ); if ( !tessMeshDelete( tess->mesh, reg->eUp ) ) return 0; reg->fixUpperEdge = FALSE; reg->eUp = newEdge; newEdge->activeRegion = reg; return 1; } static ActiveRegion *TopLeftRegion( TESStesselator *tess, ActiveRegion *reg ) { TESSvertex *org = reg->eUp->Org; TESShalfEdge *e; /* Find the region above the uppermost edge with the same origin */ do { reg = RegionAbove( reg ); } while( reg->eUp->Org == org ); /* If the edge above was a temporary edge introduced by ConnectRightVertex, * now is the time to fix it. */ if( reg->fixUpperEdge ) { e = tessMeshConnect( tess->mesh, RegionBelow(reg)->eUp->Sym, reg->eUp->Lnext ); if (e == NULL) return NULL; if ( !FixUpperEdge( tess, reg, e ) ) return NULL; reg = RegionAbove( reg ); } return reg; } static ActiveRegion *TopRightRegion( ActiveRegion *reg ) { TESSvertex *dst = reg->eUp->Dst; /* Find the region above the uppermost edge with the same destination */ do { reg = RegionAbove( reg ); } while( reg->eUp->Dst == dst ); return reg; } static ActiveRegion *AddRegionBelow( TESStesselator *tess, ActiveRegion *regAbove, TESShalfEdge *eNewUp ) /* * Add a new active region to the sweep line, *somewhere* below "regAbove" * (according to where the new edge belongs in the sweep-line dictionary). * The upper edge of the new region will be "eNewUp". * Winding number and "inside" flag are not updated. */ { ActiveRegion *regNew = (ActiveRegion *)bucketAlloc( tess->regionPool ); if (regNew == NULL) longjmp(tess->env,1); regNew->eUp = eNewUp; regNew->nodeUp = dictInsertBefore( tess->dict, regAbove->nodeUp, regNew ); if (regNew->nodeUp == NULL) longjmp(tess->env,1); regNew->fixUpperEdge = FALSE; regNew->sentinel = FALSE; regNew->dirty = FALSE; eNewUp->activeRegion = regNew; return regNew; } static int IsWindingInside( TESStesselator *tess, int n ) { switch( tess->windingRule ) { case TESS_WINDING_ODD: return (n & 1); case TESS_WINDING_NONZERO: return (n != 0); case TESS_WINDING_POSITIVE: return (n > 0); case TESS_WINDING_NEGATIVE: return (n < 0); case TESS_WINDING_ABS_GEQ_TWO: return (n >= 2) || (n <= -2); } /*LINTED*/ assert( FALSE ); /*NOTREACHED*/ return( FALSE ); } static void ComputeWinding( TESStesselator *tess, ActiveRegion *reg ) { reg->windingNumber = RegionAbove(reg)->windingNumber + reg->eUp->winding; reg->inside = IsWindingInside( tess, reg->windingNumber ); } static void FinishRegion( TESStesselator *tess, ActiveRegion *reg ) /* * Delete a region from the sweep line. This happens when the upper * and lower chains of a region meet (at a vertex on the sweep line). * The "inside" flag is copied to the appropriate mesh face (we could * not do this before -- since the structure of the mesh is always * changing, this face may not have even existed until now). */ { TESShalfEdge *e = reg->eUp; TESSface *f = e->Lface; f->inside = reg->inside; f->anEdge = e; /* optimization for tessMeshTessellateMonoRegion() */ DeleteRegion( tess, reg ); } static TESShalfEdge *FinishLeftRegions( TESStesselator *tess, ActiveRegion *regFirst, ActiveRegion *regLast ) /* * We are given a vertex with one or more left-going edges. All affected * edges should be in the edge dictionary. Starting at regFirst->eUp, * we walk down deleting all regions where both edges have the same * origin vOrg. At the same time we copy the "inside" flag from the * active region to the face, since at this point each face will belong * to at most one region (this was not necessarily true until this point * in the sweep). The walk stops at the region above regLast; if regLast * is NULL we walk as far as possible. At the same time we relink the * mesh if necessary, so that the ordering of edges around vOrg is the * same as in the dictionary. */ { ActiveRegion *reg, *regPrev; TESShalfEdge *e, *ePrev; regPrev = regFirst; ePrev = regFirst->eUp; while( regPrev != regLast ) { regPrev->fixUpperEdge = FALSE; /* placement was OK */ reg = RegionBelow( regPrev ); e = reg->eUp; if( e->Org != ePrev->Org ) { if( ! reg->fixUpperEdge ) { /* Remove the last left-going edge. Even though there are no further * edges in the dictionary with this origin, there may be further * such edges in the mesh (if we are adding left edges to a vertex * that has already been processed). Thus it is important to call * FinishRegion rather than just DeleteRegion. */ FinishRegion( tess, regPrev ); break; } /* If the edge below was a temporary edge introduced by * ConnectRightVertex, now is the time to fix it. */ e = tessMeshConnect( tess->mesh, ePrev->Lprev, e->Sym ); if (e == NULL) longjmp(tess->env,1); if ( !FixUpperEdge( tess, reg, e ) ) longjmp(tess->env,1); } /* Relink edges so that ePrev->Onext == e */ if( ePrev->Onext != e ) { if ( !tessMeshSplice( tess->mesh, e->Oprev, e ) ) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, ePrev, e ) ) longjmp(tess->env,1); } FinishRegion( tess, regPrev ); /* may change reg->eUp */ ePrev = reg->eUp; regPrev = reg; } return ePrev; } static void AddRightEdges( TESStesselator *tess, ActiveRegion *regUp, TESShalfEdge *eFirst, TESShalfEdge *eLast, TESShalfEdge *eTopLeft, int cleanUp ) /* * Purpose: insert right-going edges into the edge dictionary, and update * winding numbers and mesh connectivity appropriately. All right-going * edges share a common origin vOrg. Edges are inserted CCW starting at * eFirst; the last edge inserted is eLast->Oprev. If vOrg has any * left-going edges already processed, then eTopLeft must be the edge * such that an imaginary upward vertical segment from vOrg would be * contained between eTopLeft->Oprev and eTopLeft; otherwise eTopLeft * should be NULL. */ { ActiveRegion *reg, *regPrev; TESShalfEdge *e, *ePrev; int firstTime = TRUE; /* Insert the new right-going edges in the dictionary */ e = eFirst; do { assert( VertLeq( e->Org, e->Dst )); AddRegionBelow( tess, regUp, e->Sym ); e = e->Onext; } while ( e != eLast ); /* Walk *all* right-going edges from e->Org, in the dictionary order, * updating the winding numbers of each region, and re-linking the mesh * edges to match the dictionary ordering (if necessary). */ if( eTopLeft == NULL ) { eTopLeft = RegionBelow( regUp )->eUp->Rprev; } regPrev = regUp; ePrev = eTopLeft; for( ;; ) { reg = RegionBelow( regPrev ); e = reg->eUp->Sym; if( e->Org != ePrev->Org ) break; if( e->Onext != ePrev ) { /* Unlink e from its current position, and relink below ePrev */ if ( !tessMeshSplice( tess->mesh, e->Oprev, e ) ) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, ePrev->Oprev, e ) ) longjmp(tess->env,1); } /* Compute the winding number and "inside" flag for the new regions */ reg->windingNumber = regPrev->windingNumber - e->winding; reg->inside = IsWindingInside( tess, reg->windingNumber ); /* Check for two outgoing edges with same slope -- process these * before any intersection tests (see example in tessComputeInterior). */ regPrev->dirty = TRUE; if( ! firstTime && CheckForRightSplice( tess, regPrev )) { AddWinding( e, ePrev ); DeleteRegion( tess, regPrev ); if ( !tessMeshDelete( tess->mesh, ePrev ) ) longjmp(tess->env,1); } firstTime = FALSE; regPrev = reg; ePrev = e; } regPrev->dirty = TRUE; assert( regPrev->windingNumber - e->winding == reg->windingNumber ); if( cleanUp ) { /* Check for intersections between newly adjacent edges. */ WalkDirtyRegions( tess, regPrev ); } } static void SpliceMergeVertices( TESStesselator *tess, TESShalfEdge *e1, TESShalfEdge *e2 ) /* * Two vertices with idential coordinates are combined into one. * e1->Org is kept, while e2->Org is discarded. */ { if ( !tessMeshSplice( tess->mesh, e1, e2 ) ) longjmp(tess->env,1); } static void VertexWeights( TESSvertex *isect, TESSvertex *org, TESSvertex *dst, TESSreal *weights ) /* * Find some weights which describe how the intersection vertex is * a linear combination of "org" and "dest". Each of the two edges * which generated "isect" is allocated 50% of the weight; each edge * splits the weight between its org and dst according to the * relative distance to "isect". */ { TESSreal t1 = VertL1dist( org, isect ); TESSreal t2 = VertL1dist( dst, isect ); weights[0] = (TESSreal)0.5 * t2 / (t1 + t2); weights[1] = (TESSreal)0.5 * t1 / (t1 + t2); isect->coords[0] += weights[0]*org->coords[0] + weights[1]*dst->coords[0]; isect->coords[1] += weights[0]*org->coords[1] + weights[1]*dst->coords[1]; isect->coords[2] += weights[0]*org->coords[2] + weights[1]*dst->coords[2]; } static void GetIntersectData( TESStesselator *tess, TESSvertex *isect, TESSvertex *orgUp, TESSvertex *dstUp, TESSvertex *orgLo, TESSvertex *dstLo ) /* * We've computed a new intersection point, now we need a "data" pointer * from the user so that we can refer to this new vertex in the * rendering callbacks. */ { TESSreal weights[4]; TESS_NOTUSED( tess ); isect->coords[0] = isect->coords[1] = isect->coords[2] = 0; isect->idx = TESS_UNDEF; VertexWeights( isect, orgUp, dstUp, &weights[0] ); VertexWeights( isect, orgLo, dstLo, &weights[2] ); } static int CheckForRightSplice( TESStesselator *tess, ActiveRegion *regUp ) /* * Check the upper and lower edge of "regUp", to make sure that the * eUp->Org is above eLo, or eLo->Org is below eUp (depending on which * origin is leftmost). * * The main purpose is to splice right-going edges with the same * dest vertex and nearly identical slopes (ie. we can't distinguish * the slopes numerically). However the splicing can also help us * to recover from numerical errors. For example, suppose at one * point we checked eUp and eLo, and decided that eUp->Org is barely * above eLo. Then later, we split eLo into two edges (eg. from * a splice operation like this one). This can change the result of * our test so that now eUp->Org is incident to eLo, or barely below it. * We must correct this condition to maintain the dictionary invariants. * * One possibility is to check these edges for intersection again * (ie. CheckForIntersect). This is what we do if possible. However * CheckForIntersect requires that tess->event lies between eUp and eLo, * so that it has something to fall back on when the intersection * calculation gives us an unusable answer. So, for those cases where * we can't check for intersection, this routine fixes the problem * by just splicing the offending vertex into the other edge. * This is a guaranteed solution, no matter how degenerate things get. * Basically this is a combinatorial solution to a numerical problem. */ { ActiveRegion *regLo = RegionBelow(regUp); TESShalfEdge *eUp = regUp->eUp; TESShalfEdge *eLo = regLo->eUp; if( VertLeq( eUp->Org, eLo->Org )) { if( EdgeSign( eLo->Dst, eUp->Org, eLo->Org ) > 0 ) return FALSE; /* eUp->Org appears to be below eLo */ if( ! VertEq( eUp->Org, eLo->Org )) { /* Splice eUp->Org into eLo */ if ( tessMeshSplitEdge( tess->mesh, eLo->Sym ) == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eUp, eLo->Oprev ) ) longjmp(tess->env,1); regUp->dirty = regLo->dirty = TRUE; } else if( eUp->Org != eLo->Org ) { /* merge the two vertices, discarding eUp->Org */ pqDelete( tess->pq, eUp->Org->pqHandle ); SpliceMergeVertices( tess, eLo->Oprev, eUp ); } } else { if( EdgeSign( eUp->Dst, eLo->Org, eUp->Org ) < 0 ) return FALSE; /* eLo->Org appears to be above eUp, so splice eLo->Org into eUp */ RegionAbove(regUp)->dirty = regUp->dirty = TRUE; if (tessMeshSplitEdge( tess->mesh, eUp->Sym ) == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eLo->Oprev, eUp ) ) longjmp(tess->env,1); } return TRUE; } static int CheckForLeftSplice( TESStesselator *tess, ActiveRegion *regUp ) /* * Check the upper and lower edge of "regUp", to make sure that the * eUp->Dst is above eLo, or eLo->Dst is below eUp (depending on which * destination is rightmost). * * Theoretically, this should always be true. However, splitting an edge * into two pieces can change the results of previous tests. For example, * suppose at one point we checked eUp and eLo, and decided that eUp->Dst * is barely above eLo. Then later, we split eLo into two edges (eg. from * a splice operation like this one). This can change the result of * the test so that now eUp->Dst is incident to eLo, or barely below it. * We must correct this condition to maintain the dictionary invariants * (otherwise new edges might get inserted in the wrong place in the * dictionary, and bad stuff will happen). * * We fix the problem by just splicing the offending vertex into the * other edge. */ { ActiveRegion *regLo = RegionBelow(regUp); TESShalfEdge *eUp = regUp->eUp; TESShalfEdge *eLo = regLo->eUp; TESShalfEdge *e; assert( ! VertEq( eUp->Dst, eLo->Dst )); if( VertLeq( eUp->Dst, eLo->Dst )) { if( EdgeSign( eUp->Dst, eLo->Dst, eUp->Org ) < 0 ) return FALSE; /* eLo->Dst is above eUp, so splice eLo->Dst into eUp */ RegionAbove(regUp)->dirty = regUp->dirty = TRUE; e = tessMeshSplitEdge( tess->mesh, eUp ); if (e == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eLo->Sym, e ) ) longjmp(tess->env,1); e->Lface->inside = regUp->inside; } else { if( EdgeSign( eLo->Dst, eUp->Dst, eLo->Org ) > 0 ) return FALSE; /* eUp->Dst is below eLo, so splice eUp->Dst into eLo */ regUp->dirty = regLo->dirty = TRUE; e = tessMeshSplitEdge( tess->mesh, eLo ); if (e == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eUp->Lnext, eLo->Sym ) ) longjmp(tess->env,1); e->Rface->inside = regUp->inside; } return TRUE; } static int CheckForIntersect( TESStesselator *tess, ActiveRegion *regUp ) /* * Check the upper and lower edges of the given region to see if * they intersect. If so, create the intersection and add it * to the data structures. * * Returns TRUE if adding the new intersection resulted in a recursive * call to AddRightEdges(); in this case all "dirty" regions have been * checked for intersections, and possibly regUp has been deleted. */ { ActiveRegion *regLo = RegionBelow(regUp); TESShalfEdge *eUp = regUp->eUp; TESShalfEdge *eLo = regLo->eUp; TESSvertex *orgUp = eUp->Org; TESSvertex *orgLo = eLo->Org; TESSvertex *dstUp = eUp->Dst; TESSvertex *dstLo = eLo->Dst; TESSreal tMinUp, tMaxLo; TESSvertex isect, *orgMin; TESShalfEdge *e; assert( ! VertEq( dstLo, dstUp )); assert( EdgeSign( dstUp, tess->event, orgUp ) <= 0 ); assert( EdgeSign( dstLo, tess->event, orgLo ) >= 0 ); assert( orgUp != tess->event && orgLo != tess->event ); assert( ! regUp->fixUpperEdge && ! regLo->fixUpperEdge ); if( orgUp == orgLo ) return FALSE; /* right endpoints are the same */ tMinUp = MIN( orgUp->t, dstUp->t ); tMaxLo = MAX( orgLo->t, dstLo->t ); if( tMinUp > tMaxLo ) return FALSE; /* t ranges do not overlap */ if( VertLeq( orgUp, orgLo )) { if( EdgeSign( dstLo, orgUp, orgLo ) > 0 ) return FALSE; } else { if( EdgeSign( dstUp, orgLo, orgUp ) < 0 ) return FALSE; } /* At this point the edges intersect, at least marginally */ DebugEvent( tess ); tesedgeIntersect( dstUp, orgUp, dstLo, orgLo, &isect ); /* The following properties are guaranteed: */ assert( MIN( orgUp->t, dstUp->t ) <= isect.t ); assert( isect.t <= MAX( orgLo->t, dstLo->t )); assert( MIN( dstLo->s, dstUp->s ) <= isect.s ); assert( isect.s <= MAX( orgLo->s, orgUp->s )); if( VertLeq( &isect, tess->event )) { /* The intersection point lies slightly to the left of the sweep line, * so move it until it''s slightly to the right of the sweep line. * (If we had perfect numerical precision, this would never happen * in the first place). The easiest and safest thing to do is * replace the intersection by tess->event. */ isect.s = tess->event->s; isect.t = tess->event->t; } /* Similarly, if the computed intersection lies to the right of the * rightmost origin (which should rarely happen), it can cause * unbelievable inefficiency on sufficiently degenerate inputs. * (If you have the test program, try running test54.d with the * "X zoom" option turned on). */ orgMin = VertLeq( orgUp, orgLo ) ? orgUp : orgLo; if( VertLeq( orgMin, &isect )) { isect.s = orgMin->s; isect.t = orgMin->t; } if( VertEq( &isect, orgUp ) || VertEq( &isect, orgLo )) { /* Easy case -- intersection at one of the right endpoints */ (void) CheckForRightSplice( tess, regUp ); return FALSE; } if( (! VertEq( dstUp, tess->event ) && EdgeSign( dstUp, tess->event, &isect ) >= 0) || (! VertEq( dstLo, tess->event ) && EdgeSign( dstLo, tess->event, &isect ) <= 0 )) { /* Very unusual -- the new upper or lower edge would pass on the * wrong side of the sweep event, or through it. This can happen * due to very small numerical errors in the intersection calculation. */ if( dstLo == tess->event ) { /* Splice dstLo into eUp, and process the new region(s) */ if (tessMeshSplitEdge( tess->mesh, eUp->Sym ) == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eLo->Sym, eUp ) ) longjmp(tess->env,1); regUp = TopLeftRegion( tess, regUp ); if (regUp == NULL) longjmp(tess->env,1); eUp = RegionBelow(regUp)->eUp; FinishLeftRegions( tess, RegionBelow(regUp), regLo ); AddRightEdges( tess, regUp, eUp->Oprev, eUp, eUp, TRUE ); return TRUE; } if( dstUp == tess->event ) { /* Splice dstUp into eLo, and process the new region(s) */ if (tessMeshSplitEdge( tess->mesh, eLo->Sym ) == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eUp->Lnext, eLo->Oprev ) ) longjmp(tess->env,1); regLo = regUp; regUp = TopRightRegion( regUp ); e = RegionBelow(regUp)->eUp->Rprev; regLo->eUp = eLo->Oprev; eLo = FinishLeftRegions( tess, regLo, NULL ); AddRightEdges( tess, regUp, eLo->Onext, eUp->Rprev, e, TRUE ); return TRUE; } /* Special case: called from ConnectRightVertex. If either * edge passes on the wrong side of tess->event, split it * (and wait for ConnectRightVertex to splice it appropriately). */ if( EdgeSign( dstUp, tess->event, &isect ) >= 0 ) { RegionAbove(regUp)->dirty = regUp->dirty = TRUE; if (tessMeshSplitEdge( tess->mesh, eUp->Sym ) == NULL) longjmp(tess->env,1); eUp->Org->s = tess->event->s; eUp->Org->t = tess->event->t; } if( EdgeSign( dstLo, tess->event, &isect ) <= 0 ) { regUp->dirty = regLo->dirty = TRUE; if (tessMeshSplitEdge( tess->mesh, eLo->Sym ) == NULL) longjmp(tess->env,1); eLo->Org->s = tess->event->s; eLo->Org->t = tess->event->t; } /* leave the rest for ConnectRightVertex */ return FALSE; } /* General case -- split both edges, splice into new vertex. * When we do the splice operation, the order of the arguments is * arbitrary as far as correctness goes. However, when the operation * creates a new face, the work done is proportional to the size of * the new face. We expect the faces in the processed part of * the mesh (ie. eUp->Lface) to be smaller than the faces in the * unprocessed original contours (which will be eLo->Oprev->Lface). */ if (tessMeshSplitEdge( tess->mesh, eUp->Sym ) == NULL) longjmp(tess->env,1); if (tessMeshSplitEdge( tess->mesh, eLo->Sym ) == NULL) longjmp(tess->env,1); if ( !tessMeshSplice( tess->mesh, eLo->Oprev, eUp ) ) longjmp(tess->env,1); eUp->Org->s = isect.s; eUp->Org->t = isect.t; eUp->Org->pqHandle = pqInsert( &tess->alloc, tess->pq, eUp->Org ); if (eUp->Org->pqHandle == INV_HANDLE) { pqDeletePriorityQ( &tess->alloc, tess->pq ); tess->pq = NULL; longjmp(tess->env,1); } GetIntersectData( tess, eUp->Org, orgUp, dstUp, orgLo, dstLo ); RegionAbove(regUp)->dirty = regUp->dirty = regLo->dirty = TRUE; return FALSE; } static void WalkDirtyRegions( TESStesselator *tess, ActiveRegion *regUp ) /* * When the upper or lower edge of any region changes, the region is * marked "dirty". This routine walks through all the dirty regions * and makes sure that the dictionary invariants are satisfied * (see the comments at the beginning of this file). Of course * new dirty regions can be created as we make changes to restore * the invariants. */ { ActiveRegion *regLo = RegionBelow(regUp); TESShalfEdge *eUp, *eLo; for( ;; ) { /* Find the lowest dirty region (we walk from the bottom up). */ while( regLo->dirty ) { regUp = regLo; regLo = RegionBelow(regLo); } if( ! regUp->dirty ) { regLo = regUp; regUp = RegionAbove( regUp ); if( regUp == NULL || ! regUp->dirty ) { /* We've walked all the dirty regions */ return; } } regUp->dirty = FALSE; eUp = regUp->eUp; eLo = regLo->eUp; if( eUp->Dst != eLo->Dst ) { /* Check that the edge ordering is obeyed at the Dst vertices. */ if( CheckForLeftSplice( tess, regUp )) { /* If the upper or lower edge was marked fixUpperEdge, then * we no longer need it (since these edges are needed only for * vertices which otherwise have no right-going edges). */ if( regLo->fixUpperEdge ) { DeleteRegion( tess, regLo ); if ( !tessMeshDelete( tess->mesh, eLo ) ) longjmp(tess->env,1); regLo = RegionBelow( regUp ); eLo = regLo->eUp; } else if( regUp->fixUpperEdge ) { DeleteRegion( tess, regUp ); if ( !tessMeshDelete( tess->mesh, eUp ) ) longjmp(tess->env,1); regUp = RegionAbove( regLo ); eUp = regUp->eUp; } } } if( eUp->Org != eLo->Org ) { if( eUp->Dst != eLo->Dst && ! regUp->fixUpperEdge && ! regLo->fixUpperEdge && (eUp->Dst == tess->event || eLo->Dst == tess->event) ) { /* When all else fails in CheckForIntersect(), it uses tess->event * as the intersection location. To make this possible, it requires * that tess->event lie between the upper and lower edges, and also * that neither of these is marked fixUpperEdge (since in the worst * case it might splice one of these edges into tess->event, and * violate the invariant that fixable edges are the only right-going * edge from their associated vertex). */ if( CheckForIntersect( tess, regUp )) { /* WalkDirtyRegions() was called recursively; we're done */ return; } } else { /* Even though we can't use CheckForIntersect(), the Org vertices * may violate the dictionary edge ordering. Check and correct this. */ (void) CheckForRightSplice( tess, regUp ); } } if( eUp->Org == eLo->Org && eUp->Dst == eLo->Dst ) { /* A degenerate loop consisting of only two edges -- delete it. */ AddWinding( eLo, eUp ); DeleteRegion( tess, regUp ); if ( !tessMeshDelete( tess->mesh, eUp ) ) longjmp(tess->env,1); regUp = RegionAbove( regLo ); } } } static void ConnectRightVertex( TESStesselator *tess, ActiveRegion *regUp, TESShalfEdge *eBottomLeft ) /* * Purpose: connect a "right" vertex vEvent (one where all edges go left) * to the unprocessed portion of the mesh. Since there are no right-going * edges, two regions (one above vEvent and one below) are being merged * into one. "regUp" is the upper of these two regions. * * There are two reasons for doing this (adding a right-going edge): * - if the two regions being merged are "inside", we must add an edge * to keep them separated (the combined region would not be monotone). * - in any case, we must leave some record of vEvent in the dictionary, * so that we can merge vEvent with features that we have not seen yet. * For example, maybe there is a vertical edge which passes just to * the right of vEvent; we would like to splice vEvent into this edge. * * However, we don't want to connect vEvent to just any vertex. We don''t * want the new edge to cross any other edges; otherwise we will create * intersection vertices even when the input data had no self-intersections. * (This is a bad thing; if the user's input data has no intersections, * we don't want to generate any false intersections ourselves.) * * Our eventual goal is to connect vEvent to the leftmost unprocessed * vertex of the combined region (the union of regUp and regLo). * But because of unseen vertices with all right-going edges, and also * new vertices which may be created by edge intersections, we don''t * know where that leftmost unprocessed vertex is. In the meantime, we * connect vEvent to the closest vertex of either chain, and mark the region * as "fixUpperEdge". This flag says to delete and reconnect this edge * to the next processed vertex on the boundary of the combined region. * Quite possibly the vertex we connected to will turn out to be the * closest one, in which case we won''t need to make any changes. */ { TESShalfEdge *eNew; TESShalfEdge *eTopLeft = eBottomLeft->Onext; ActiveRegion *regLo = RegionBelow(regUp); TESShalfEdge *eUp = regUp->eUp; TESShalfEdge *eLo = regLo->eUp; int degenerate = FALSE; if( eUp->Dst != eLo->Dst ) { (void) CheckForIntersect( tess, regUp ); } /* Possible new degeneracies: upper or lower edge of regUp may pass * through vEvent, or may coincide with new intersection vertex */ if( VertEq( eUp->Org, tess->event )) { if ( !tessMeshSplice( tess->mesh, eTopLeft->Oprev, eUp ) ) longjmp(tess->env,1); regUp = TopLeftRegion( tess, regUp ); if (regUp == NULL) longjmp(tess->env,1); eTopLeft = RegionBelow( regUp )->eUp; FinishLeftRegions( tess, RegionBelow(regUp), regLo ); degenerate = TRUE; } if( VertEq( eLo->Org, tess->event )) { if ( !tessMeshSplice( tess->mesh, eBottomLeft, eLo->Oprev ) ) longjmp(tess->env,1); eBottomLeft = FinishLeftRegions( tess, regLo, NULL ); degenerate = TRUE; } if( degenerate ) { AddRightEdges( tess, regUp, eBottomLeft->Onext, eTopLeft, eTopLeft, TRUE ); return; } /* Non-degenerate situation -- need to add a temporary, fixable edge. * Connect to the closer of eLo->Org, eUp->Org. */ if( VertLeq( eLo->Org, eUp->Org )) { eNew = eLo->Oprev; } else { eNew = eUp; } eNew = tessMeshConnect( tess->mesh, eBottomLeft->Lprev, eNew ); if (eNew == NULL) longjmp(tess->env,1); /* Prevent cleanup, otherwise eNew might disappear before we've even * had a chance to mark it as a temporary edge. */ AddRightEdges( tess, regUp, eNew, eNew->Onext, eNew->Onext, FALSE ); eNew->Sym->activeRegion->fixUpperEdge = TRUE; WalkDirtyRegions( tess, regUp ); } /* Because vertices at exactly the same location are merged together * before we process the sweep event, some degenerate cases can't occur. * However if someone eventually makes the modifications required to * merge features which are close together, the cases below marked * TOLERANCE_NONZERO will be useful. They were debugged before the * code to merge identical vertices in the main loop was added. */ #define TOLERANCE_NONZERO FALSE static void ConnectLeftDegenerate( TESStesselator *tess, ActiveRegion *regUp, TESSvertex *vEvent ) /* * The event vertex lies exacty on an already-processed edge or vertex. * Adding the new vertex involves splicing it into the already-processed * part of the mesh. */ { TESShalfEdge *e, *eTopLeft, *eTopRight, *eLast; ActiveRegion *reg; e = regUp->eUp; if( VertEq( e->Org, vEvent )) { /* e->Org is an unprocessed vertex - just combine them, and wait * for e->Org to be pulled from the queue */ assert( TOLERANCE_NONZERO ); SpliceMergeVertices( tess, e, vEvent->anEdge ); return; } if( ! VertEq( e->Dst, vEvent )) { /* General case -- splice vEvent into edge e which passes through it */ if (tessMeshSplitEdge( tess->mesh, e->Sym ) == NULL) longjmp(tess->env,1); if( regUp->fixUpperEdge ) { /* This edge was fixable -- delete unused portion of original edge */ if ( !tessMeshDelete( tess->mesh, e->Onext ) ) longjmp(tess->env,1); regUp->fixUpperEdge = FALSE; } if ( !tessMeshSplice( tess->mesh, vEvent->anEdge, e ) ) longjmp(tess->env,1); SweepEvent( tess, vEvent ); /* recurse */ return; } /* vEvent coincides with e->Dst, which has already been processed. * Splice in the additional right-going edges. */ assert( TOLERANCE_NONZERO ); regUp = TopRightRegion( regUp ); reg = RegionBelow( regUp ); eTopRight = reg->eUp->Sym; eTopLeft = eLast = eTopRight->Onext; if( reg->fixUpperEdge ) { /* Here e->Dst has only a single fixable edge going right. * We can delete it since now we have some real right-going edges. */ assert( eTopLeft != eTopRight ); /* there are some left edges too */ DeleteRegion( tess, reg ); if ( !tessMeshDelete( tess->mesh, eTopRight ) ) longjmp(tess->env,1); eTopRight = eTopLeft->Oprev; } if ( !tessMeshSplice( tess->mesh, vEvent->anEdge, eTopRight ) ) longjmp(tess->env,1); if( ! EdgeGoesLeft( eTopLeft )) { /* e->Dst had no left-going edges -- indicate this to AddRightEdges() */ eTopLeft = NULL; } AddRightEdges( tess, regUp, eTopRight->Onext, eLast, eTopLeft, TRUE ); } static void ConnectLeftVertex( TESStesselator *tess, TESSvertex *vEvent ) /* * Purpose: connect a "left" vertex (one where both edges go right) * to the processed portion of the mesh. Let R be the active region * containing vEvent, and let U and L be the upper and lower edge * chains of R. There are two possibilities: * * - the normal case: split R into two regions, by connecting vEvent to * the rightmost vertex of U or L lying to the left of the sweep line * * - the degenerate case: if vEvent is close enough to U or L, we * merge vEvent into that edge chain. The subcases are: * - merging with the rightmost vertex of U or L * - merging with the active edge of U or L * - merging with an already-processed portion of U or L */ { ActiveRegion *regUp, *regLo, *reg; TESShalfEdge *eUp, *eLo, *eNew; ActiveRegion tmp; /* assert( vEvent->anEdge->Onext->Onext == vEvent->anEdge ); */ /* Get a pointer to the active region containing vEvent */ tmp.eUp = vEvent->anEdge->Sym; /* __GL_DICTLISTKEY */ /* tessDictListSearch */ regUp = (ActiveRegion *)dictKey( dictSearch( tess->dict, &tmp )); regLo = RegionBelow( regUp ); if( !regLo ) { // This may happen if the input polygon is coplanar. return; } eUp = regUp->eUp; eLo = regLo->eUp; /* Try merging with U or L first */ if( EdgeSign( eUp->Dst, vEvent, eUp->Org ) == 0 ) { ConnectLeftDegenerate( tess, regUp, vEvent ); return; } /* Connect vEvent to rightmost processed vertex of either chain. * e->Dst is the vertex that we will connect to vEvent. */ reg = VertLeq( eLo->Dst, eUp->Dst ) ? regUp : regLo; if( regUp->inside || reg->fixUpperEdge) { if( reg == regUp ) { eNew = tessMeshConnect( tess->mesh, vEvent->anEdge->Sym, eUp->Lnext ); if (eNew == NULL) longjmp(tess->env,1); } else { TESShalfEdge *tempHalfEdge= tessMeshConnect( tess->mesh, eLo->Dnext, vEvent->anEdge); if (tempHalfEdge == NULL) longjmp(tess->env,1); eNew = tempHalfEdge->Sym; } if( reg->fixUpperEdge ) { if ( !FixUpperEdge( tess, reg, eNew ) ) longjmp(tess->env,1); } else { ComputeWinding( tess, AddRegionBelow( tess, regUp, eNew )); } SweepEvent( tess, vEvent ); } else { /* The new vertex is in a region which does not belong to the polygon. * We don''t need to connect this vertex to the rest of the mesh. */ AddRightEdges( tess, regUp, vEvent->anEdge, vEvent->anEdge, NULL, TRUE ); } } static void SweepEvent( TESStesselator *tess, TESSvertex *vEvent ) /* * Does everything necessary when the sweep line crosses a vertex. * Updates the mesh and the edge dictionary. */ { ActiveRegion *regUp, *reg; TESShalfEdge *e, *eTopLeft, *eBottomLeft; tess->event = vEvent; /* for access in EdgeLeq() */ DebugEvent( tess ); /* Check if this vertex is the right endpoint of an edge that is * already in the dictionary. In this case we don't need to waste * time searching for the location to insert new edges. */ e = vEvent->anEdge; while( e->activeRegion == NULL ) { e = e->Onext; if( e == vEvent->anEdge ) { /* All edges go right -- not incident to any processed edges */ ConnectLeftVertex( tess, vEvent ); return; } } /* Processing consists of two phases: first we "finish" all the * active regions where both the upper and lower edges terminate * at vEvent (ie. vEvent is closing off these regions). * We mark these faces "inside" or "outside" the polygon according * to their winding number, and delete the edges from the dictionary. * This takes care of all the left-going edges from vEvent. */ regUp = TopLeftRegion( tess, e->activeRegion ); if (regUp == NULL) longjmp(tess->env,1); reg = RegionBelow( regUp ); eTopLeft = reg->eUp; eBottomLeft = FinishLeftRegions( tess, reg, NULL ); /* Next we process all the right-going edges from vEvent. This * involves adding the edges to the dictionary, and creating the * associated "active regions" which record information about the * regions between adjacent dictionary edges. */ if( eBottomLeft->Onext == eTopLeft ) { /* No right-going edges -- add a temporary "fixable" edge */ ConnectRightVertex( tess, regUp, eBottomLeft ); } else { AddRightEdges( tess, regUp, eBottomLeft->Onext, eTopLeft, eTopLeft, TRUE ); } } /* Make the sentinel coordinates big enough that they will never be * merged with real input features. */ static void AddSentinel( TESStesselator *tess, TESSreal smin, TESSreal smax, TESSreal t ) /* * We add two sentinel edges above and below all other edges, * to avoid special cases at the top and bottom. */ { TESShalfEdge *e; ActiveRegion *reg = (ActiveRegion *)bucketAlloc( tess->regionPool ); if (reg == NULL) longjmp(tess->env,1); e = tessMeshMakeEdge( tess->mesh ); if (e == NULL) longjmp(tess->env,1); e->Org->s = smax; e->Org->t = t; e->Dst->s = smin; e->Dst->t = t; tess->event = e->Dst; /* initialize it */ reg->eUp = e; reg->windingNumber = 0; reg->inside = FALSE; reg->fixUpperEdge = FALSE; reg->sentinel = TRUE; reg->dirty = FALSE; reg->nodeUp = dictInsert( tess->dict, reg ); if (reg->nodeUp == NULL) longjmp(tess->env,1); } static void InitEdgeDict( TESStesselator *tess ) /* * We maintain an ordering of edge intersections with the sweep line. * This order is maintained in a dynamic dictionary. */ { TESSreal w, h; TESSreal smin, smax, tmin, tmax; tess->dict = dictNewDict( &tess->alloc, tess, (int (*)(void *, DictKey, DictKey)) EdgeLeq ); if (tess->dict == NULL) longjmp(tess->env,1); w = (tess->bmax[0] - tess->bmin[0]); h = (tess->bmax[1] - tess->bmin[1]); /* If the bbox is empty, ensure that sentinels are not coincident by slightly enlarging it. To avoid floating point precision issues, make sure to enlarge by a minimal amount. */ smin = tess->bmin[0] - (w > 0.01 ? w : 0.01); smax = tess->bmax[0] + (w > 0.01 ? w : 0.01); tmin = tess->bmin[1] - (h > 0.01 ? h : 0.01); tmax = tess->bmax[1] + (h > 0.01 ? h : 0.01); AddSentinel( tess, smin, smax, tmin ); AddSentinel( tess, smin, smax, tmax ); } static void DoneEdgeDict( TESStesselator *tess ) { ActiveRegion *reg; int fixedEdges = 0; while( (reg = (ActiveRegion *)dictKey( dictMin( tess->dict ))) != NULL ) { /* * At the end of all processing, the dictionary should contain * only the two sentinel edges, plus at most one "fixable" edge * created by ConnectRightVertex(). */ if( ! reg->sentinel ) { assert( reg->fixUpperEdge ); assert( ++fixedEdges == 1 ); } assert( reg->windingNumber == 0 ); DeleteRegion( tess, reg ); /* tessMeshDelete( reg->eUp );*/ } dictDeleteDict( &tess->alloc, tess->dict ); } static void RemoveDegenerateEdges( TESStesselator *tess ) /* * Remove zero-length edges, and contours with fewer than 3 vertices. */ { TESShalfEdge *e, *eNext, *eLnext; TESShalfEdge *eHead = &tess->mesh->eHead; /*LINTED*/ for( e = eHead->next; e != eHead; e = eNext ) { eNext = e->next; eLnext = e->Lnext; if( VertEq( e->Org, e->Dst ) && e->Lnext->Lnext != e ) { /* Zero-length edge, contour has at least 3 edges */ SpliceMergeVertices( tess, eLnext, e ); /* deletes e->Org */ if ( !tessMeshDelete( tess->mesh, e ) ) longjmp(tess->env,1); /* e is a self-loop */ e = eLnext; eLnext = e->Lnext; } if( eLnext->Lnext == e ) { /* Degenerate contour (one or two edges) */ if( eLnext != e ) { if( eLnext == eNext || eLnext == eNext->Sym ) { eNext = eNext->next; } if ( !tessMeshDelete( tess->mesh, eLnext ) ) longjmp(tess->env,1); } if( e == eNext || e == eNext->Sym ) { eNext = eNext->next; } if ( !tessMeshDelete( tess->mesh, e ) ) longjmp(tess->env,1); } } } static int InitPriorityQ( TESStesselator *tess ) /* * Insert all vertices into the priority queue which determines the * order in which vertices cross the sweep line. */ { PriorityQ *pq; TESSvertex *v, *vHead; int vertexCount = 0; vHead = &tess->mesh->vHead; for( v = vHead->next; v != vHead; v = v->next ) { vertexCount++; } /* Make sure there is enough space for sentinels. */ vertexCount += MAX( 8, tess->alloc.extraVertices ); pq = tess->pq = pqNewPriorityQ( &tess->alloc, vertexCount, (int (*)(PQkey, PQkey)) tesvertLeq ); if (pq == NULL) return 0; vHead = &tess->mesh->vHead; for( v = vHead->next; v != vHead; v = v->next ) { v->pqHandle = pqInsert( &tess->alloc, pq, v ); if (v->pqHandle == INV_HANDLE) break; } if (v != vHead || !pqInit( &tess->alloc, pq ) ) { pqDeletePriorityQ( &tess->alloc, tess->pq ); tess->pq = NULL; return 0; } return 1; } static void DonePriorityQ( TESStesselator *tess ) { pqDeletePriorityQ( &tess->alloc, tess->pq ); } static int RemoveDegenerateFaces( TESStesselator *tess, TESSmesh *mesh ) /* * Delete any degenerate faces with only two edges. WalkDirtyRegions() * will catch almost all of these, but it won't catch degenerate faces * produced by splice operations on already-processed edges. * The two places this can happen are in FinishLeftRegions(), when * we splice in a "temporary" edge produced by ConnectRightVertex(), * and in CheckForLeftSplice(), where we splice already-processed * edges to ensure that our dictionary invariants are not violated * by numerical errors. * * In both these cases it is *very* dangerous to delete the offending * edge at the time, since one of the routines further up the stack * will sometimes be keeping a pointer to that edge. */ { TESSface *f, *fNext; TESShalfEdge *e; /*LINTED*/ for( f = mesh->fHead.next; f != &mesh->fHead; f = fNext ) { fNext = f->next; e = f->anEdge; assert( e->Lnext != e ); if( e->Lnext->Lnext == e ) { /* A face with only two edges */ AddWinding( e->Onext, e ); if ( !tessMeshDelete( tess->mesh, e ) ) return 0; } } return 1; } int tessComputeInterior( TESStesselator *tess ) /* * tessComputeInterior( tess ) computes the planar arrangement specified * by the given contours, and further subdivides this arrangement * into regions. Each region is marked "inside" if it belongs * to the polygon, according to the rule given by tess->windingRule. * Each interior region is guaranteed be monotone. */ { TESSvertex *v, *vNext; /* Each vertex defines an event for our sweep line. Start by inserting * all the vertices in a priority queue. Events are processed in * lexicographic order, ie. * * e1 < e2 iff e1.x < e2.x || (e1.x == e2.x && e1.y < e2.y) */ RemoveDegenerateEdges( tess ); if ( !InitPriorityQ( tess ) ) return 0; /* if error */ InitEdgeDict( tess ); while( (v = (TESSvertex *)pqExtractMin( tess->pq )) != NULL ) { for( ;; ) { vNext = (TESSvertex *)pqMinimum( tess->pq ); if( vNext == NULL || ! VertEq( vNext, v )) break; /* Merge together all vertices at exactly the same location. * This is more efficient than processing them one at a time, * simplifies the code (see ConnectLeftDegenerate), and is also * important for correct handling of certain degenerate cases. * For example, suppose there are two identical edges A and B * that belong to different contours (so without this code they would * be processed by separate sweep events). Suppose another edge C * crosses A and B from above. When A is processed, we split it * at its intersection point with C. However this also splits C, * so when we insert B we may compute a slightly different * intersection point. This might leave two edges with a small * gap between them. This kind of error is especially obvious * when using boundary extraction (TESS_BOUNDARY_ONLY). */ vNext = (TESSvertex *)pqExtractMin( tess->pq ); SpliceMergeVertices( tess, v->anEdge, vNext->anEdge ); } SweepEvent( tess, v ); } /* Set tess->event for debugging purposes */ tess->event = ((ActiveRegion *) dictKey( dictMin( tess->dict )))->eUp->Org; DebugEvent( tess ); DoneEdgeDict( tess ); DonePriorityQ( tess ); if ( !RemoveDegenerateFaces( tess, tess->mesh ) ) return 0; tessMeshCheckMesh( tess->mesh ); return 1; } openscad-2019.05/src/ext/libtess2/Source/sweep.h0000755000076500000240000000621113402025764021757 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #ifndef SWEEP_H #define SWEEP_H #include "mesh.h" /* tessComputeInterior( tess ) computes the planar arrangement specified * by the given contours, and further subdivides this arrangement * into regions. Each region is marked "inside" if it belongs * to the polygon, according to the rule given by tess->windingRule. * Each interior region is guaranteed be monotone. */ int tessComputeInterior( TESStesselator *tess ); /* The following is here *only* for access by debugging routines */ #include "dict.h" /* For each pair of adjacent edges crossing the sweep line, there is * an ActiveRegion to represent the region between them. The active * regions are kept in sorted order in a dynamic dictionary. As the * sweep line crosses each vertex, we update the affected regions. */ struct ActiveRegion { TESShalfEdge *eUp; /* upper edge, directed right to left */ DictNode *nodeUp; /* dictionary node corresponding to eUp */ int windingNumber; /* used to determine which regions are * inside the polygon */ int inside; /* is this region inside the polygon? */ int sentinel; /* marks fake edges at t = +/-infinity */ int dirty; /* marks regions where the upper or lower * edge has changed, but we haven't checked * whether they intersect yet */ int fixUpperEdge; /* marks temporary edges introduced when * we process a "right vertex" (one without * any edges leaving to the right) */ }; #define RegionBelow(r) ((ActiveRegion *) dictKey(dictPred((r)->nodeUp))) #define RegionAbove(r) ((ActiveRegion *) dictKey(dictSucc((r)->nodeUp))) #endif openscad-2019.05/src/ext/libtess2/Source/tess.c0000755000076500000240000006715213402025764021620 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #include #include #include #include "bucketalloc.h" #include "tess.h" #include "mesh.h" #include "sweep.h" #include "geom.h" #include #include #include #define TRUE 1 #define FALSE 0 #define Dot(u,v) (u[0]*v[0] + u[1]*v[1] + u[2]*v[2]) #if defined(FOR_TRITE_TEST_PROGRAM) || defined(TRUE_PROJECT) static void Normalize( TESSreal v[3] ) { TESSreal len = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; assert( len > 0 ); len = sqrtf( len ); v[0] /= len; v[1] /= len; v[2] /= len; } #endif #define ABS(x) ((x) < 0 ? -(x) : (x)) static int LongAxis( TESSreal v[3] ) { int i = 0; if( ABS(v[1]) > ABS(v[0]) ) { i = 1; } if( ABS(v[2]) > ABS(v[i]) ) { i = 2; } return i; } static int ShortAxis( TESSreal v[3] ) { int i = 0; if( ABS(v[1]) < ABS(v[0]) ) { i = 1; } if( ABS(v[2]) < ABS(v[i]) ) { i = 2; } return i; } static void ComputeNormal( TESStesselator *tess, TESSreal norm[3] ) { TESSvertex *v, *v1, *v2; TESSreal c, tLen2, maxLen2; TESSreal maxVal[3], minVal[3], d1[3], d2[3], tNorm[3]; TESSvertex *maxVert[3], *minVert[3]; TESSvertex *vHead = &tess->mesh->vHead; int i; v = vHead->next; for( i = 0; i < 3; ++i ) { c = v->coords[i]; minVal[i] = c; minVert[i] = v; maxVal[i] = c; maxVert[i] = v; } for( v = vHead->next; v != vHead; v = v->next ) { for( i = 0; i < 3; ++i ) { c = v->coords[i]; if( c < minVal[i] ) { minVal[i] = c; minVert[i] = v; } if( c > maxVal[i] ) { maxVal[i] = c; maxVert[i] = v; } } } /* Find two vertices separated by at least 1/sqrt(3) of the maximum * distance between any two vertices */ i = 0; if( maxVal[1] - minVal[1] > maxVal[0] - minVal[0] ) { i = 1; } if( maxVal[2] - minVal[2] > maxVal[i] - minVal[i] ) { i = 2; } if( minVal[i] >= maxVal[i] ) { /* All vertices are the same -- normal doesn't matter */ norm[0] = 0; norm[1] = 0; norm[2] = 1; return; } /* Look for a third vertex which forms the triangle with maximum area * (Length of normal == twice the triangle area) */ maxLen2 = 0; v1 = minVert[i]; v2 = maxVert[i]; d1[0] = v1->coords[0] - v2->coords[0]; d1[1] = v1->coords[1] - v2->coords[1]; d1[2] = v1->coords[2] - v2->coords[2]; for( v = vHead->next; v != vHead; v = v->next ) { d2[0] = v->coords[0] - v2->coords[0]; d2[1] = v->coords[1] - v2->coords[1]; d2[2] = v->coords[2] - v2->coords[2]; tNorm[0] = d1[1]*d2[2] - d1[2]*d2[1]; tNorm[1] = d1[2]*d2[0] - d1[0]*d2[2]; tNorm[2] = d1[0]*d2[1] - d1[1]*d2[0]; tLen2 = tNorm[0]*tNorm[0] + tNorm[1]*tNorm[1] + tNorm[2]*tNorm[2]; if( tLen2 > maxLen2 ) { maxLen2 = tLen2; norm[0] = tNorm[0]; norm[1] = tNorm[1]; norm[2] = tNorm[2]; } } if( maxLen2 <= 0 ) { /* All points lie on a single line -- any decent normal will do */ norm[0] = norm[1] = norm[2] = 0; norm[ShortAxis(d1)] = 1; } } static void CheckOrientation( TESStesselator *tess ) { TESSreal area; TESSface *f, *fHead = &tess->mesh->fHead; TESSvertex *v, *vHead = &tess->mesh->vHead; TESShalfEdge *e; /* When we compute the normal automatically, we choose the orientation * so that the the sum of the signed areas of all contours is non-negative. */ area = 0; for( f = fHead->next; f != fHead; f = f->next ) { e = f->anEdge; if( e->winding <= 0 ) continue; do { area += (e->Org->s - e->Dst->s) * (e->Org->t + e->Dst->t); e = e->Lnext; } while( e != f->anEdge ); } if( area < 0 ) { /* Reverse the orientation by flipping all the t-coordinates */ for( v = vHead->next; v != vHead; v = v->next ) { v->t = - v->t; } tess->tUnit[0] = - tess->tUnit[0]; tess->tUnit[1] = - tess->tUnit[1]; tess->tUnit[2] = - tess->tUnit[2]; } } #ifdef FOR_TRITE_TEST_PROGRAM #include extern int RandomSweep; #define S_UNIT_X (RandomSweep ? (2*drand48()-1) : 1.0) #define S_UNIT_Y (RandomSweep ? (2*drand48()-1) : 0.0) #else #if defined(SLANTED_SWEEP) /* The "feature merging" is not intended to be complete. There are * special cases where edges are nearly parallel to the sweep line * which are not implemented. The algorithm should still behave * robustly (ie. produce a reasonable tesselation) in the presence * of such edges, however it may miss features which could have been * merged. We could minimize this effect by choosing the sweep line * direction to be something unusual (ie. not parallel to one of the * coordinate axes). */ #define S_UNIT_X (TESSreal)0.50941539564955385 /* Pre-normalized */ #define S_UNIT_Y (TESSreal)0.86052074622010633 #else #define S_UNIT_X (TESSreal)1.0 #define S_UNIT_Y (TESSreal)0.0 #endif #endif /* Determine the polygon normal and project vertices onto the plane * of the polygon. */ void tessProjectPolygon( TESStesselator *tess ) { TESSvertex *v, *vHead = &tess->mesh->vHead; TESSreal norm[3]; TESSreal *sUnit, *tUnit; int i, first, computedNormal = FALSE; norm[0] = tess->normal[0]; norm[1] = tess->normal[1]; norm[2] = tess->normal[2]; if( norm[0] == 0 && norm[1] == 0 && norm[2] == 0 ) { ComputeNormal( tess, norm ); computedNormal = TRUE; } sUnit = tess->sUnit; tUnit = tess->tUnit; i = LongAxis( norm ); #if defined(FOR_TRITE_TEST_PROGRAM) || defined(TRUE_PROJECT) /* Choose the initial sUnit vector to be approximately perpendicular * to the normal. */ Normalize( norm ); sUnit[i] = 0; sUnit[(i+1)%3] = S_UNIT_X; sUnit[(i+2)%3] = S_UNIT_Y; /* Now make it exactly perpendicular */ w = Dot( sUnit, norm ); sUnit[0] -= w * norm[0]; sUnit[1] -= w * norm[1]; sUnit[2] -= w * norm[2]; Normalize( sUnit ); /* Choose tUnit so that (sUnit,tUnit,norm) form a right-handed frame */ tUnit[0] = norm[1]*sUnit[2] - norm[2]*sUnit[1]; tUnit[1] = norm[2]*sUnit[0] - norm[0]*sUnit[2]; tUnit[2] = norm[0]*sUnit[1] - norm[1]*sUnit[0]; Normalize( tUnit ); #else /* Project perpendicular to a coordinate axis -- better numerically */ sUnit[i] = 0; sUnit[(i+1)%3] = S_UNIT_X; sUnit[(i+2)%3] = S_UNIT_Y; tUnit[i] = 0; tUnit[(i+1)%3] = (norm[i] > 0) ? -S_UNIT_Y : S_UNIT_Y; tUnit[(i+2)%3] = (norm[i] > 0) ? S_UNIT_X : -S_UNIT_X; #endif /* Project the vertices onto the sweep plane */ for( v = vHead->next; v != vHead; v = v->next ) { v->s = Dot( v->coords, sUnit ); v->t = Dot( v->coords, tUnit ); } if( computedNormal ) { CheckOrientation( tess ); } /* Compute ST bounds. */ first = 1; for( v = vHead->next; v != vHead; v = v->next ) { if (first) { tess->bmin[0] = tess->bmax[0] = v->s; tess->bmin[1] = tess->bmax[1] = v->t; first = 0; } else { if (v->s < tess->bmin[0]) tess->bmin[0] = v->s; if (v->s > tess->bmax[0]) tess->bmax[0] = v->s; if (v->t < tess->bmin[1]) tess->bmin[1] = v->t; if (v->t > tess->bmax[1]) tess->bmax[1] = v->t; } } } #define AddWinding(eDst,eSrc) (eDst->winding += eSrc->winding, \ eDst->Sym->winding += eSrc->Sym->winding) /* tessMeshTessellateMonoRegion( face ) tessellates a monotone region * (what else would it do??) The region must consist of a single * loop of half-edges (see mesh.h) oriented CCW. "Monotone" in this * case means that any vertical line intersects the interior of the * region in a single interval. * * Tessellation consists of adding interior edges (actually pairs of * half-edges), to split the region into non-overlapping triangles. * * The basic idea is explained in Preparata and Shamos (which I don''t * have handy right now), although their implementation is more * complicated than this one. The are two edge chains, an upper chain * and a lower chain. We process all vertices from both chains in order, * from right to left. * * The algorithm ensures that the following invariant holds after each * vertex is processed: the untessellated region consists of two * chains, where one chain (say the upper) is a single edge, and * the other chain is concave. The left vertex of the single edge * is always to the left of all vertices in the concave chain. * * Each step consists of adding the rightmost unprocessed vertex to one * of the two chains, and forming a fan of triangles from the rightmost * of two chain endpoints. Determining whether we can add each triangle * to the fan is a simple orientation test. By making the fan as large * as possible, we restore the invariant (check it yourself). */ int tessMeshTessellateMonoRegion( TESSmesh *mesh, TESSface *face ) { TESShalfEdge *up, *lo; /* All edges are oriented CCW around the boundary of the region. * First, find the half-edge whose origin vertex is rightmost. * Since the sweep goes from left to right, face->anEdge should * be close to the edge we want. */ up = face->anEdge; assert( up->Lnext != up && up->Lnext->Lnext != up ); for( ; VertLeq( up->Dst, up->Org ); up = up->Lprev ) ; for( ; VertLeq( up->Org, up->Dst ); up = up->Lnext ) ; lo = up->Lprev; while( up->Lnext != lo ) { if( VertLeq( up->Dst, lo->Org )) { /* up->Dst is on the left. It is safe to form triangles from lo->Org. * The EdgeGoesLeft test guarantees progress even when some triangles * are CW, given that the upper and lower chains are truly monotone. */ while( lo->Lnext != up && (EdgeGoesLeft( lo->Lnext ) || EdgeSign( lo->Org, lo->Dst, lo->Lnext->Dst ) <= 0 )) { TESShalfEdge *tempHalfEdge= tessMeshConnect( mesh, lo->Lnext, lo ); if (tempHalfEdge == NULL) return 0; lo = tempHalfEdge->Sym; } lo = lo->Lprev; } else { /* lo->Org is on the left. We can make CCW triangles from up->Dst. */ while( lo->Lnext != up && (EdgeGoesRight( up->Lprev ) || EdgeSign( up->Dst, up->Org, up->Lprev->Org ) >= 0 )) { TESShalfEdge *tempHalfEdge= tessMeshConnect( mesh, up, up->Lprev ); if (tempHalfEdge == NULL) return 0; up = tempHalfEdge->Sym; } up = up->Lnext; } } /* Now lo->Org == up->Dst == the leftmost vertex. The remaining region * can be tessellated in a fan from this leftmost vertex. */ assert( lo->Lnext != up ); while( lo->Lnext->Lnext != up ) { TESShalfEdge *tempHalfEdge= tessMeshConnect( mesh, lo->Lnext, lo ); if (tempHalfEdge == NULL) return 0; lo = tempHalfEdge->Sym; } return 1; } /* tessMeshTessellateInterior( mesh ) tessellates each region of * the mesh which is marked "inside" the polygon. Each such region * must be monotone. */ int tessMeshTessellateInterior( TESSmesh *mesh ) { TESSface *f, *next; /*LINTED*/ for( f = mesh->fHead.next; f != &mesh->fHead; f = next ) { /* Make sure we don''t try to tessellate the new triangles. */ next = f->next; if( f->inside ) { if ( !tessMeshTessellateMonoRegion( mesh, f ) ) return 0; } } return 1; } typedef struct EdgeStackNode EdgeStackNode; typedef struct EdgeStack EdgeStack; struct EdgeStackNode { TESShalfEdge *edge; EdgeStackNode *next; }; struct EdgeStack { EdgeStackNode *top; struct BucketAlloc *nodeBucket; }; int stackInit( EdgeStack *stack, TESSalloc *alloc ) { stack->top = NULL; stack->nodeBucket = createBucketAlloc( alloc, "CDT nodes", sizeof(EdgeStackNode), 512 ); return stack->nodeBucket != NULL; } void stackDelete( EdgeStack *stack ) { deleteBucketAlloc( stack->nodeBucket ); } int stackEmpty( EdgeStack *stack ) { return stack->top == NULL; } void stackPush( EdgeStack *stack, TESShalfEdge *e ) { EdgeStackNode *node = (EdgeStackNode *)bucketAlloc( stack->nodeBucket ); if ( ! node ) return; node->edge = e; node->next = stack->top; stack->top = node; } TESShalfEdge *stackPop( EdgeStack *stack ) { TESShalfEdge *e = NULL; EdgeStackNode *node = stack->top; if (node) { stack->top = node->next; e = node->edge; bucketFree( stack->nodeBucket, node ); } return e; } /* Starting with a valid triangulation, uses the Edge Flip algorithm to refine the triangulation into a Constrained Delaunay Triangulation. */ int tessMeshRefineDelaunay( TESSmesh *mesh, TESSalloc *alloc ) { /* At this point, we have a valid, but not optimal, triangulation. We refine the triangulation using the Edge Flip algorithm */ /* 1) Find all internal edges 2) Mark all dual edges 3) insert all dual edges into a queue */ TESSface *f; EdgeStack stack; TESShalfEdge *e; TESShalfEdge *edges[4]; stackInit(&stack, alloc); for( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) { if ( f->inside) { e = f->anEdge; do { e->mark = EdgeIsInternal(e); /* Mark internal edges */ if (e->mark && !e->Sym->mark) stackPush(&stack, e); /* Insert into queue */ e = e->Lnext; } while (e != f->anEdge); } } // Pop stack until we find a reversed edge // Flip the reversed edge, and insert any of the four opposite edges // which are internal and not already in the stack (!marked) while (!stackEmpty(&stack)) { e = stackPop(&stack); e->mark = e->Sym->mark = 0; if (!tesedgeIsLocallyDelaunay(e)) { int i; tessMeshFlipEdge(mesh, e); // for each opposite edge edges[0] = e->Lnext; edges[1] = e->Lprev; edges[2] = e->Sym->Lnext; edges[3] = e->Sym->Lprev; for (i=0;i<3;i++) { if (!edges[i]->mark && EdgeIsInternal(edges[i])) { edges[i]->mark = edges[i]->Sym->mark = 1; stackPush(&stack, edges[i]); } } } } stackDelete(&stack); return 1; } /* tessMeshDiscardExterior( mesh ) zaps (ie. sets to NULL) all faces * which are not marked "inside" the polygon. Since further mesh operations * on NULL faces are not allowed, the main purpose is to clean up the * mesh so that exterior loops are not represented in the data structure. */ void tessMeshDiscardExterior( TESSmesh *mesh ) { TESSface *f, *next; /*LINTED*/ for( f = mesh->fHead.next; f != &mesh->fHead; f = next ) { /* Since f will be destroyed, save its next pointer. */ next = f->next; if( ! f->inside ) { tessMeshZapFace( mesh, f ); } } } /* tessMeshSetWindingNumber( mesh, value, keepOnlyBoundary ) resets the * winding numbers on all edges so that regions marked "inside" the * polygon have a winding number of "value", and regions outside * have a winding number of 0. * * If keepOnlyBoundary is TRUE, it also deletes all edges which do not * separate an interior region from an exterior one. */ int tessMeshSetWindingNumber( TESSmesh *mesh, int value, int keepOnlyBoundary ) { TESShalfEdge *e, *eNext; for( e = mesh->eHead.next; e != &mesh->eHead; e = eNext ) { eNext = e->next; if( e->Rface->inside != e->Lface->inside ) { /* This is a boundary edge (one side is interior, one is exterior). */ e->winding = (e->Lface->inside) ? value : -value; } else { /* Both regions are interior, or both are exterior. */ if( ! keepOnlyBoundary ) { e->winding = 0; } else { if ( !tessMeshDelete( mesh, e ) ) return 0; } } } return 1; } void* heapAlloc( void* userData, unsigned int size ) { TESS_NOTUSED( userData ); return malloc( size ); } void* heapRealloc( void *userData, void* ptr, unsigned int size ) { TESS_NOTUSED( userData ); return realloc( ptr, size ); } void heapFree( void* userData, void* ptr ) { TESS_NOTUSED( userData ); free( ptr ); } static TESSalloc defaulAlloc = { heapAlloc, heapRealloc, heapFree, 0, 0, 0, 0, 0, 0, 0, }; TESStesselator* tessNewTess( TESSalloc* alloc ) { TESStesselator* tess; if (alloc == NULL) alloc = &defaulAlloc; /* Only initialize fields which can be changed by the api. Other fields * are initialized where they are used. */ tess = (TESStesselator *)alloc->memalloc( alloc->userData, sizeof( TESStesselator )); if ( tess == NULL ) { return 0; /* out of memory */ } tess->alloc = *alloc; /* Check and set defaults. */ if (tess->alloc.meshEdgeBucketSize == 0) tess->alloc.meshEdgeBucketSize = 512; if (tess->alloc.meshVertexBucketSize == 0) tess->alloc.meshVertexBucketSize = 512; if (tess->alloc.meshFaceBucketSize == 0) tess->alloc.meshFaceBucketSize = 256; if (tess->alloc.dictNodeBucketSize == 0) tess->alloc.dictNodeBucketSize = 512; if (tess->alloc.regionBucketSize == 0) tess->alloc.regionBucketSize = 256; tess->normal[0] = 0; tess->normal[1] = 0; tess->normal[2] = 0; tess->bmin[0] = 0; tess->bmin[1] = 0; tess->bmax[0] = 0; tess->bmax[1] = 0; tess->windingRule = TESS_WINDING_ODD; if (tess->alloc.regionBucketSize < 16) tess->alloc.regionBucketSize = 16; if (tess->alloc.regionBucketSize > 4096) tess->alloc.regionBucketSize = 4096; tess->regionPool = createBucketAlloc( &tess->alloc, "Regions", sizeof(ActiveRegion), tess->alloc.regionBucketSize ); // Initialize to begin polygon. tess->mesh = NULL; tess->outOfMemory = 0; tess->vertexIndexCounter = 0; tess->vertices = 0; tess->vertexIndices = 0; tess->vertexCount = 0; tess->elements = 0; tess->elementCount = 0; return tess; } void tessDeleteTess( TESStesselator *tess ) { struct TESSalloc alloc = tess->alloc; deleteBucketAlloc( tess->regionPool ); if( tess->mesh != NULL ) { tessMeshDeleteMesh( &alloc, tess->mesh ); tess->mesh = NULL; } if (tess->vertices != NULL) { alloc.memfree( alloc.userData, tess->vertices ); tess->vertices = 0; } if (tess->vertexIndices != NULL) { alloc.memfree( alloc.userData, tess->vertexIndices ); tess->vertexIndices = 0; } if (tess->elements != NULL) { alloc.memfree( alloc.userData, tess->elements ); tess->elements = 0; } alloc.memfree( alloc.userData, tess ); } static TESSindex GetNeighbourFace(TESShalfEdge* edge) { if (!edge->Rface) return TESS_UNDEF; if (!edge->Rface->inside) return TESS_UNDEF; return edge->Rface->n; } void OutputPolymesh( TESStesselator *tess, TESSmesh *mesh, int elementType, int polySize, int vertexSize ) { TESSvertex* v = 0; TESSface* f = 0; TESShalfEdge* edge = 0; int maxFaceCount = 0; int maxVertexCount = 0; int faceVerts, i; TESSindex *elements = 0; TESSreal *vert; // Assume that the input data is triangles now. // Try to merge as many polygons as possible if (polySize > 3) { if (!tessMeshMergeConvexFaces( mesh, polySize )) { tess->outOfMemory = 1; return; } } // Mark unused for ( v = mesh->vHead.next; v != &mesh->vHead; v = v->next ) v->n = TESS_UNDEF; // Create unique IDs for all vertices and faces. for ( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) { f->n = TESS_UNDEF; if( !f->inside ) continue; edge = f->anEdge; faceVerts = 0; do { v = edge->Org; if ( v->n == TESS_UNDEF ) { v->n = maxVertexCount; maxVertexCount++; } faceVerts++; edge = edge->Lnext; } while (edge != f->anEdge); assert( faceVerts <= polySize ); f->n = maxFaceCount; ++maxFaceCount; } tess->elementCount = maxFaceCount; if (elementType == TESS_CONNECTED_POLYGONS) maxFaceCount *= 2; tess->elements = (TESSindex*)tess->alloc.memalloc( tess->alloc.userData, sizeof(TESSindex) * maxFaceCount * polySize ); if (!tess->elements) { tess->outOfMemory = 1; return; } tess->vertexCount = maxVertexCount; tess->vertices = (TESSreal*)tess->alloc.memalloc( tess->alloc.userData, sizeof(TESSreal) * tess->vertexCount * vertexSize ); if (!tess->vertices) { tess->outOfMemory = 1; return; } tess->vertexIndices = (TESSindex*)tess->alloc.memalloc( tess->alloc.userData, sizeof(TESSindex) * tess->vertexCount ); if (!tess->vertexIndices) { tess->outOfMemory = 1; return; } // Output vertices. for ( v = mesh->vHead.next; v != &mesh->vHead; v = v->next ) { if ( v->n != TESS_UNDEF ) { // Store coordinate vert = &tess->vertices[v->n*vertexSize]; vert[0] = v->coords[0]; vert[1] = v->coords[1]; if ( vertexSize > 2 ) vert[2] = v->coords[2]; // Store vertex index. tess->vertexIndices[v->n] = v->idx; } } // Output indices. elements = tess->elements; for ( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) { if ( !f->inside ) continue; // Store polygon edge = f->anEdge; faceVerts = 0; do { v = edge->Org; *elements++ = v->n; faceVerts++; edge = edge->Lnext; } while (edge != f->anEdge); // Fill unused. for (i = faceVerts; i < polySize; ++i) *elements++ = TESS_UNDEF; // Store polygon connectivity if ( elementType == TESS_CONNECTED_POLYGONS ) { edge = f->anEdge; do { *elements++ = GetNeighbourFace( edge ); edge = edge->Lnext; } while (edge != f->anEdge); // Fill unused. for (i = faceVerts; i < polySize; ++i) *elements++ = TESS_UNDEF; } } } void OutputContours( TESStesselator *tess, TESSmesh *mesh, int vertexSize ) { TESSface *f = 0; TESShalfEdge *edge = 0; TESShalfEdge *start = 0; TESSreal *verts = 0; TESSindex *elements = 0; TESSindex *vertInds = 0; int startVert = 0; int vertCount = 0; tess->vertexCount = 0; tess->elementCount = 0; for ( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) { if ( !f->inside ) continue; start = edge = f->anEdge; do { ++tess->vertexCount; edge = edge->Lnext; } while ( edge != start ); ++tess->elementCount; } tess->elements = (TESSindex*)tess->alloc.memalloc( tess->alloc.userData, sizeof(TESSindex) * tess->elementCount * 2 ); if (!tess->elements) { tess->outOfMemory = 1; return; } tess->vertices = (TESSreal*)tess->alloc.memalloc( tess->alloc.userData, sizeof(TESSreal) * tess->vertexCount * vertexSize ); if (!tess->vertices) { tess->outOfMemory = 1; return; } tess->vertexIndices = (TESSindex*)tess->alloc.memalloc( tess->alloc.userData, sizeof(TESSindex) * tess->vertexCount ); if (!tess->vertexIndices) { tess->outOfMemory = 1; return; } verts = tess->vertices; elements = tess->elements; vertInds = tess->vertexIndices; startVert = 0; for ( f = mesh->fHead.next; f != &mesh->fHead; f = f->next ) { if ( !f->inside ) continue; vertCount = 0; start = edge = f->anEdge; do { *verts++ = edge->Org->coords[0]; *verts++ = edge->Org->coords[1]; if ( vertexSize > 2 ) *verts++ = edge->Org->coords[2]; *vertInds++ = edge->Org->idx; ++vertCount; edge = edge->Lnext; } while ( edge != start ); elements[0] = startVert; elements[1] = vertCount; elements += 2; startVert += vertCount; } } void tessAddContour( TESStesselator *tess, int size, const void* vertices, int stride, int numVertices ) { const unsigned char *src = (const unsigned char*)vertices; TESShalfEdge *e; int i; if ( tess->mesh == NULL ) tess->mesh = tessMeshNewMesh( &tess->alloc ); if ( tess->mesh == NULL ) { tess->outOfMemory = 1; return; } if ( size < 2 ) size = 2; if ( size > 3 ) size = 3; e = NULL; for( i = 0; i < numVertices; ++i ) { const TESSreal* coords = (const TESSreal*)src; src += stride; if( e == NULL ) { /* Make a self-loop (one vertex, one edge). */ e = tessMeshMakeEdge( tess->mesh ); if ( e == NULL ) { tess->outOfMemory = 1; return; } if ( !tessMeshSplice( tess->mesh, e, e->Sym ) ) { tess->outOfMemory = 1; return; } } else { /* Create a new vertex and edge which immediately follow e * in the ordering around the left face. */ if ( tessMeshSplitEdge( tess->mesh, e ) == NULL ) { tess->outOfMemory = 1; return; } e = e->Lnext; } /* The new vertex is now e->Org. */ e->Org->coords[0] = coords[0]; e->Org->coords[1] = coords[1]; if ( size > 2 ) e->Org->coords[2] = coords[2]; else e->Org->coords[2] = 0; /* Store the insertion number so that the vertex can be later recognized. */ e->Org->idx = tess->vertexIndexCounter++; /* The winding of an edge says how the winding number changes as we * cross from the edge''s right face to its left face. We add the * vertices in such an order that a CCW contour will add +1 to * the winding number of the region inside the contour. */ e->winding = 1; e->Sym->winding = -1; } } int tessTesselate( TESStesselator *tess, int windingRule, int elementType, int polySize, int vertexSize, const TESSreal* normal ) { TESSmesh *mesh; int rc = 1; if (tess->vertices != NULL) { tess->alloc.memfree( tess->alloc.userData, tess->vertices ); tess->vertices = 0; } if (tess->elements != NULL) { tess->alloc.memfree( tess->alloc.userData, tess->elements ); tess->elements = 0; } if (tess->vertexIndices != NULL) { tess->alloc.memfree( tess->alloc.userData, tess->vertexIndices ); tess->vertexIndices = 0; } tess->vertexIndexCounter = 0; if (normal) { tess->normal[0] = normal[0]; tess->normal[1] = normal[1]; tess->normal[2] = normal[2]; } tess->windingRule = windingRule; if (vertexSize < 2) vertexSize = 2; if (vertexSize > 3) vertexSize = 3; if (setjmp(tess->env) != 0) { /* come back here if out of memory */ return 0; } if (!tess->mesh) { return 0; } /* Determine the polygon normal and project vertices onto the plane * of the polygon. */ tessProjectPolygon( tess ); /* tessComputeInterior( tess ) computes the planar arrangement specified * by the given contours, and further subdivides this arrangement * into regions. Each region is marked "inside" if it belongs * to the polygon, according to the rule given by tess->windingRule. * Each interior region is guaranteed be monotone. */ if ( !tessComputeInterior( tess ) ) { longjmp(tess->env,1); /* could've used a label */ } mesh = tess->mesh; /* If the user wants only the boundary contours, we throw away all edges * except those which separate the interior from the exterior. * Otherwise we tessellate all the regions marked "inside". */ if (elementType == TESS_BOUNDARY_CONTOURS) { rc = tessMeshSetWindingNumber( mesh, 1, TRUE ); } else { rc = tessMeshTessellateInterior( mesh ); if (elementType == TESS_CONSTRAINED_DELAUNAY_TRIANGLES) { rc = tessMeshRefineDelaunay( mesh, &tess->alloc ); elementType = TESS_POLYGONS; polySize = 3; } } if (rc == 0) longjmp(tess->env,1); /* could've used a label */ tessMeshCheckMesh( mesh ); if (elementType == TESS_BOUNDARY_CONTOURS) { OutputContours( tess, mesh, vertexSize ); /* output contours */ } else { OutputPolymesh( tess, mesh, elementType, polySize, vertexSize ); /* output polygons */ } tessMeshDeleteMesh( &tess->alloc, mesh ); tess->mesh = NULL; if (tess->outOfMemory) return 0; return 1; } int tessGetVertexCount( TESStesselator *tess ) { return tess->vertexCount; } const TESSreal* tessGetVertices( TESStesselator *tess ) { return tess->vertices; } const TESSindex* tessGetVertexIndices( TESStesselator *tess ) { return tess->vertexIndices; } int tessGetElementCount( TESStesselator *tess ) { return tess->elementCount; } const int* tessGetElements( TESStesselator *tess ) { return tess->elements; } openscad-2019.05/src/ext/libtess2/Source/tess.h0000755000076500000240000000557713402025764021630 0ustar kintelstaff00000000000000/* ** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) ** Copyright (C) [dates of first publication] Silicon Graphics, Inc. ** All Rights Reserved. ** ** 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 including the dates of first publication and either this ** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC. ** 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. ** ** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not ** be used in advertising or otherwise to promote the sale, use or other dealings in ** this Software without prior written authorization from Silicon Graphics, Inc. */ /* ** Author: Eric Veach, July 1994. */ #ifndef TESS_H #define TESS_H #include #include "bucketalloc.h" #include "mesh.h" #include "dict.h" #include "priorityq.h" #include "../Include/tesselator.h" #ifdef __cplusplus extern "C" { #endif //typedef struct TESStesselator TESStesselator; struct TESStesselator { /*** state needed for collecting the input data ***/ TESSmesh *mesh; /* stores the input contours, and eventually the tessellation itself */ int outOfMemory; /*** state needed for projecting onto the sweep plane ***/ TESSreal normal[3]; /* user-specified normal (if provided) */ TESSreal sUnit[3]; /* unit vector in s-direction (debugging) */ TESSreal tUnit[3]; /* unit vector in t-direction (debugging) */ TESSreal bmin[2]; TESSreal bmax[2]; /*** state needed for the line sweep ***/ int windingRule; /* rule for determining polygon interior */ Dict *dict; /* edge dictionary for sweep line */ PriorityQ *pq; /* priority queue of vertex events */ TESSvertex *event; /* current sweep event being processed */ struct BucketAlloc* regionPool; TESSindex vertexIndexCounter; TESSreal *vertices; TESSindex *vertexIndices; int vertexCount; TESSindex *elements; int elementCount; TESSalloc alloc; jmp_buf env; /* place to jump to when memAllocs fail */ }; #ifdef __cplusplus }; #endif #endif openscad-2019.05/src/ext/lodepng/lodepng.cpp0000644000076500000240000073375313402025764021277 0ustar kintelstaff00000000000000/* LodePNG version 20180910 Copyright (c) 2005-2018 Lode Vandevenne This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* The manual and changelog are in the header file "lodepng.h" Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. */ #include "lodepng.h" #include #include #include #if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ #pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ #pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ #endif /*_MSC_VER */ const char* LODEPNG_VERSION_STRING = "20180910"; /* This source file is built up in the following large parts. The code sections with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. -Tools for C and common code for PNG and Zlib -C Code for Zlib (huffman, deflate, ...) -C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) -The C++ wrapper around all of the above */ /*The malloc, realloc and free functions defined here with "lodepng_" in front of the name, so that you can easily change them to others related to your platform if needed. Everything else in the code calls these. Pass -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out #define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and define them in your own project's source files without needing to change lodepng source code. Don't forget to remove "static" if you copypaste them from here.*/ #ifdef LODEPNG_COMPILE_ALLOCATORS static void* lodepng_malloc(size_t size) { #ifdef LODEPNG_MAX_ALLOC if(size > LODEPNG_MAX_ALLOC) return 0; #endif return malloc(size); } static void* lodepng_realloc(void* ptr, size_t new_size) { #ifdef LODEPNG_MAX_ALLOC if(new_size > LODEPNG_MAX_ALLOC) return 0; #endif return realloc(ptr, new_size); } static void lodepng_free(void* ptr) { free(ptr); } #else /*LODEPNG_COMPILE_ALLOCATORS*/ void* lodepng_malloc(size_t size); void* lodepng_realloc(void* ptr, size_t new_size); void lodepng_free(void* ptr); #endif /*LODEPNG_COMPILE_ALLOCATORS*/ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ /* // Tools for C, and common code for PNG and Zlib. // */ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ #define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) #define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) /* Often in case of an error a value is assigned to a variable and then it breaks out of a loop (to go to the cleanup phase of a function). This macro does that. It makes the error handling code shorter and more readable. Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); */ #define CERROR_BREAK(errorvar, code)\ {\ errorvar = code;\ break;\ } /*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ #define ERROR_BREAK(code) CERROR_BREAK(error, code) /*Set error var to the error code, and return it.*/ #define CERROR_RETURN_ERROR(errorvar, code)\ {\ errorvar = code;\ return code;\ } /*Try the code, if it returns error, also return the error.*/ #define CERROR_TRY_RETURN(call)\ {\ unsigned error = call;\ if(error) return error;\ } /*Set error var to the error code, and return from the void function.*/ #define CERROR_RETURN(errorvar, code)\ {\ errorvar = code;\ return;\ } /* About uivector, ucvector and string: -All of them wrap dynamic arrays or text strings in a similar way. -LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. -The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. -They're not used in the interface, only internally in this file as static functions. -As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. */ #ifdef LODEPNG_COMPILE_ZLIB /*dynamic vector of unsigned ints*/ typedef struct uivector { unsigned* data; size_t size; /*size in number of unsigned longs*/ size_t allocsize; /*allocated size in bytes*/ } uivector; static void uivector_cleanup(void* p) { ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; lodepng_free(((uivector*)p)->data); ((uivector*)p)->data = NULL; } /*returns 1 if success, 0 if failure ==> nothing done*/ static unsigned uivector_reserve(uivector* p, size_t allocsize) { if(allocsize > p->allocsize) { size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); void* data = lodepng_realloc(p->data, newsize); if(data) { p->allocsize = newsize; p->data = (unsigned*)data; } else return 0; /*error: not enough memory*/ } return 1; } /*returns 1 if success, 0 if failure ==> nothing done*/ static unsigned uivector_resize(uivector* p, size_t size) { if(!uivector_reserve(p, size * sizeof(unsigned))) return 0; p->size = size; return 1; /*success*/ } /*resize and give all new elements the value*/ static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) { size_t oldsize = p->size, i; if(!uivector_resize(p, size)) return 0; for(i = oldsize; i < size; ++i) p->data[i] = value; return 1; } static void uivector_init(uivector* p) { p->data = NULL; p->size = p->allocsize = 0; } #ifdef LODEPNG_COMPILE_ENCODER /*returns 1 if success, 0 if failure ==> nothing done*/ static unsigned uivector_push_back(uivector* p, unsigned c) { if(!uivector_resize(p, p->size + 1)) return 0; p->data[p->size - 1] = c; return 1; } #endif /*LODEPNG_COMPILE_ENCODER*/ #endif /*LODEPNG_COMPILE_ZLIB*/ /* /////////////////////////////////////////////////////////////////////////// */ /*dynamic vector of unsigned chars*/ typedef struct ucvector { unsigned char* data; size_t size; /*used size*/ size_t allocsize; /*allocated size*/ } ucvector; /*returns 1 if success, 0 if failure ==> nothing done*/ static unsigned ucvector_reserve(ucvector* p, size_t allocsize) { if(allocsize > p->allocsize) { size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); void* data = lodepng_realloc(p->data, newsize); if(data) { p->allocsize = newsize; p->data = (unsigned char*)data; } else return 0; /*error: not enough memory*/ } return 1; } /*returns 1 if success, 0 if failure ==> nothing done*/ static unsigned ucvector_resize(ucvector* p, size_t size) { if(!ucvector_reserve(p, size * sizeof(unsigned char))) return 0; p->size = size; return 1; /*success*/ } #ifdef LODEPNG_COMPILE_PNG static void ucvector_cleanup(void* p) { ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; lodepng_free(((ucvector*)p)->data); ((ucvector*)p)->data = NULL; } static void ucvector_init(ucvector* p) { p->data = NULL; p->size = p->allocsize = 0; } #endif /*LODEPNG_COMPILE_PNG*/ #ifdef LODEPNG_COMPILE_ZLIB /*you can both convert from vector to buffer&size and vica versa. If you use init_buffer to take over a buffer and size, it is not needed to use cleanup*/ static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) { p->data = buffer; p->allocsize = p->size = size; } #endif /*LODEPNG_COMPILE_ZLIB*/ #if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) /*returns 1 if success, 0 if failure ==> nothing done*/ static unsigned ucvector_push_back(ucvector* p, unsigned char c) { if(!ucvector_resize(p, p->size + 1)) return 0; p->data[p->size - 1] = c; return 1; } #endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_PNG #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*free string pointer and set it to NULL*/ static void string_cleanup(char** out) { lodepng_free(*out); *out = NULL; } /* dynamically allocates a new string with a copy of the null terminated input text */ static char* alloc_string(const char* in) { size_t insize = strlen(in); char* out = (char*)lodepng_malloc(insize + 1); if(out) { size_t i; for(i = 0; i != insize; ++i) { out[i] = in[i]; } out[i] = 0; } return out; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ #endif /*LODEPNG_COMPILE_PNG*/ /* ////////////////////////////////////////////////////////////////////////// */ unsigned lodepng_read32bitInt(const unsigned char* buffer) { return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); } #if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) /*buffer must have at least 4 allocated bytes available*/ static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) { buffer[0] = (unsigned char)((value >> 24) & 0xff); buffer[1] = (unsigned char)((value >> 16) & 0xff); buffer[2] = (unsigned char)((value >> 8) & 0xff); buffer[3] = (unsigned char)((value ) & 0xff); } #endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ #ifdef LODEPNG_COMPILE_ENCODER static void lodepng_add32bitInt(ucvector* buffer, unsigned value) { ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); } #endif /*LODEPNG_COMPILE_ENCODER*/ /* ////////////////////////////////////////////////////////////////////////// */ /* / File IO / */ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_DISK /* returns negative value on error. This should be pure C compatible, so no fstat. */ static long lodepng_filesize(const char* filename) { FILE* file; long size; file = fopen(filename, "rb"); if(!file) return -1; if(fseek(file, 0, SEEK_END) != 0) { fclose(file); return -1; } size = ftell(file); /* It may give LONG_MAX as directory size, this is invalid for us. */ if(size == LONG_MAX) size = -1; fclose(file); return size; } /* load file into buffer that already has the correct allocated size. Returns error code.*/ static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) { FILE* file; size_t readsize; file = fopen(filename, "rb"); if(!file) return 78; readsize = fread(out, 1, size, file); fclose(file); if (readsize != size) return 78; return 0; } unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) { long size = lodepng_filesize(filename); if (size < 0) return 78; *outsize = (size_t)size; *out = (unsigned char*)lodepng_malloc((size_t)size); if(!(*out) && size > 0) return 83; /*the above malloc failed*/ return lodepng_buffer_file(*out, (size_t)size, filename); } /*write given buffer to the file, overwriting the file, it doesn't append to it.*/ unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) { FILE* file; file = fopen(filename, "wb" ); if(!file) return 79; fwrite(buffer, 1, buffersize, file); fclose(file); return 0; } #endif /*LODEPNG_COMPILE_DISK*/ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ /* // End of common code and tools. Begin of Zlib related code. // */ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_ZLIB #ifdef LODEPNG_COMPILE_ENCODER /*TODO: this ignores potential out of memory errors*/ #define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\ {\ /*add a new byte at the end*/\ if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ ++(*bitpointer);\ } static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) { size_t i; for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); } static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) { size_t i; for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); } #endif /*LODEPNG_COMPILE_ENCODER*/ #ifdef LODEPNG_COMPILE_DECODER #define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) { unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); ++(*bitpointer); return result; } static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) { unsigned result = 0, i; for(i = 0; i != nbits; ++i) { result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; ++(*bitpointer); } return result; } #endif /*LODEPNG_COMPILE_DECODER*/ /* ////////////////////////////////////////////////////////////////////////// */ /* / Deflate - Huffman / */ /* ////////////////////////////////////////////////////////////////////////// */ #define FIRST_LENGTH_CODE_INDEX 257 #define LAST_LENGTH_CODE_INDEX 285 /*256 literals, the end code, some length codes, and 2 unused codes*/ #define NUM_DEFLATE_CODE_SYMBOLS 288 /*the distance codes have their own symbols, 30 used, 2 unused*/ #define NUM_DISTANCE_SYMBOLS 32 /*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ #define NUM_CODE_LENGTH_CODES 19 /*the base lengths represented by codes 257-285*/ static const unsigned LENGTHBASE[29] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; /*the extra bits used by codes 257-285 (added to base length)*/ static const unsigned LENGTHEXTRA[29] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; /*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ static const unsigned DISTANCEBASE[30] = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; /*the extra bits of backwards distances (added to base)*/ static const unsigned DISTANCEEXTRA[30] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; /*the order in which "code length alphabet code lengths" are stored, out of this the huffman tree of the dynamic huffman tree lengths is generated*/ static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* ////////////////////////////////////////////////////////////////////////// */ /* Huffman tree struct, containing multiple representations of the tree */ typedef struct HuffmanTree { unsigned* tree2d; unsigned* tree1d; unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ unsigned maxbitlen; /*maximum number of bits a single code can get*/ unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ } HuffmanTree; /*function used for debug purposes to draw the tree in ascii art with C++*/ /* static void HuffmanTree_draw(HuffmanTree* tree) { std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; for(size_t i = 0; i != tree->tree1d.size; ++i) { if(tree->lengths.data[i]) std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; } std::cout << std::endl; }*/ static void HuffmanTree_init(HuffmanTree* tree) { tree->tree2d = 0; tree->tree1d = 0; tree->lengths = 0; } static void HuffmanTree_cleanup(HuffmanTree* tree) { lodepng_free(tree->tree2d); lodepng_free(tree->tree1d); lodepng_free(tree->lengths); } /*the tree representation used by the decoder. return value is error*/ static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) { unsigned nodefilled = 0; /*up to which node it is filled*/ unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ unsigned n, i; tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); if(!tree->tree2d) return 83; /*alloc fail*/ /* convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means uninited, a value >= numcodes is an address to another bit, a value < numcodes is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as many columns as codes - 1. A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. Here, the internal nodes are stored (what their 0 and 1 option point to). There is only memory for such good tree currently, if there are more nodes (due to too long length codes), error 55 will happen */ for(n = 0; n < tree->numcodes * 2; ++n) { tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ } for(n = 0; n < tree->numcodes; ++n) /*the codes*/ { for(i = 0; i != tree->lengths[n]; ++i) /*the bits for this code*/ { unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); /*oversubscribed, see comment in lodepng_error_text*/ if(treepos > 2147483647 || treepos + 2 > tree->numcodes) return 55; if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ { if(i + 1 == tree->lengths[n]) /*last bit*/ { tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ treepos = 0; } else { /*put address of the next step in here, first that address has to be found of course (it's just nodefilled + 1)...*/ ++nodefilled; /*addresses encoded with numcodes added to it*/ tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; treepos = nodefilled; } } else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; } } for(n = 0; n < tree->numcodes * 2; ++n) { if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ } return 0; } /* Second step for the ...makeFromLengths and ...makeFromFrequencies functions. numcodes, lengths and maxbitlen must already be filled in correctly. return value is error. */ static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) { uivector blcount; uivector nextcode; unsigned error = 0; unsigned bits, n; uivector_init(&blcount); uivector_init(&nextcode); tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); if(!tree->tree1d) error = 83; /*alloc fail*/ if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) error = 83; /*alloc fail*/ if(!error) { /*step 1: count number of instances of each code length*/ for(bits = 0; bits != tree->numcodes; ++bits) ++blcount.data[tree->lengths[bits]]; /*step 2: generate the nextcode values*/ for(bits = 1; bits <= tree->maxbitlen; ++bits) { nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; } /*step 3: generate all the codes*/ for(n = 0; n != tree->numcodes; ++n) { if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; } } uivector_cleanup(&blcount); uivector_cleanup(&nextcode); if(!error) return HuffmanTree_make2DTree(tree); else return error; } /* given the code lengths (as stored in the PNG file), generate the tree as defined by Deflate. maxbitlen is the maximum bits that a code in the tree can have. return value is error. */ static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, size_t numcodes, unsigned maxbitlen) { unsigned i; tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); if(!tree->lengths) return 83; /*alloc fail*/ for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; tree->numcodes = (unsigned)numcodes; /*number of symbols*/ tree->maxbitlen = maxbitlen; return HuffmanTree_makeFromLengths2(tree); } #ifdef LODEPNG_COMPILE_ENCODER /*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ /*chain node for boundary package merge*/ typedef struct BPMNode { int weight; /*the sum of all weights in this chain*/ unsigned index; /*index of this leaf node (called "count" in the paper)*/ struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ int in_use; } BPMNode; /*lists of chains*/ typedef struct BPMLists { /*memory pool*/ unsigned memsize; BPMNode* memory; unsigned numfree; unsigned nextfree; BPMNode** freelist; /*two heads of lookahead chains per list*/ unsigned listsize; BPMNode** chains0; BPMNode** chains1; } BPMLists; /*creates a new chain node with the given parameters, from the memory in the lists */ static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) { unsigned i; BPMNode* result; /*memory full, so garbage collect*/ if(lists->nextfree >= lists->numfree) { /*mark only those that are in use*/ for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; for(i = 0; i != lists->listsize; ++i) { BPMNode* node; for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; } /*collect those that are free*/ lists->numfree = 0; for(i = 0; i != lists->memsize; ++i) { if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; } lists->nextfree = 0; } result = lists->freelist[lists->nextfree++]; result->weight = weight; result->index = index; result->tail = tail; return result; } /*sort the leaves with stable mergesort*/ static void bpmnode_sort(BPMNode* leaves, size_t num) { BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num); size_t width, counter = 0; for(width = 1; width < num; width *= 2) { BPMNode* a = (counter & 1) ? mem : leaves; BPMNode* b = (counter & 1) ? leaves : mem; size_t p; for(p = 0; p < num; p += 2 * width) { size_t q = (p + width > num) ? num : (p + width); size_t r = (p + 2 * width > num) ? num : (p + 2 * width); size_t i = p, j = q, k; for(k = p; k < r; k++) { if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; else b[k] = a[j++]; } } counter++; } if(counter & 1) memcpy(leaves, mem, sizeof(*leaves) * num); lodepng_free(mem); } /*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) { unsigned lastindex = lists->chains1[c]->index; if(c == 0) { if(lastindex >= numpresent) return; lists->chains0[c] = lists->chains1[c]; lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); } else { /*sum of the weights of the head nodes of the previous lookahead chains.*/ int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; lists->chains0[c] = lists->chains1[c]; if(lastindex < numpresent && sum > leaves[lastindex].weight) { lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); return; } lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); /*in the end we are only interested in the chain of the last list, so no need to recurse if we're at the last one (this gives measurable speedup)*/ if(num + 1 < (int)(2 * numpresent - 2)) { boundaryPM(lists, leaves, numpresent, c - 1, num); boundaryPM(lists, leaves, numpresent, c - 1, num); } } } unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, size_t numcodes, unsigned maxbitlen) { unsigned error = 0; unsigned i; size_t numpresent = 0; /*number of symbols with non-zero frequency*/ BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); if(!leaves) return 83; /*alloc fail*/ for(i = 0; i != numcodes; ++i) { if(frequencies[i] > 0) { leaves[numpresent].weight = (int)frequencies[i]; leaves[numpresent].index = i; ++numpresent; } } for(i = 0; i != numcodes; ++i) lengths[i] = 0; /*ensure at least two present symbols. There should be at least one symbol according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To make these work as well ensure there are at least two symbols. The Package-Merge code below also doesn't work correctly if there's only one symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ if(numpresent == 0) { lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ } else if(numpresent == 1) { lengths[leaves[0].index] = 1; lengths[leaves[0].index == 0 ? 1 : 0] = 1; } else { BPMLists lists; BPMNode* node; bpmnode_sort(leaves, numpresent); lists.listsize = maxbitlen; lists.memsize = 2 * maxbitlen * (maxbitlen + 1); lists.nextfree = 0; lists.numfree = lists.memsize; lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*)); lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ if(!error) { for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; bpmnode_create(&lists, leaves[0].weight, 1, 0); bpmnode_create(&lists, leaves[1].weight, 2, 0); for(i = 0; i != lists.listsize; ++i) { lists.chains0[i] = &lists.memory[0]; lists.chains1[i] = &lists.memory[1]; } /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; } } lodepng_free(lists.memory); lodepng_free(lists.freelist); lodepng_free(lists.chains0); lodepng_free(lists.chains1); } lodepng_free(leaves); return error; } /*Create the Huffman tree given the symbol frequencies*/ static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, size_t mincodes, size_t numcodes, unsigned maxbitlen) { unsigned error = 0; while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ tree->maxbitlen = maxbitlen; tree->numcodes = (unsigned)numcodes; /*number of symbols*/ tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); if(!tree->lengths) return 83; /*alloc fail*/ /*initialize all lengths to 0*/ memset(tree->lengths, 0, numcodes * sizeof(unsigned)); error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); if(!error) error = HuffmanTree_makeFromLengths2(tree); return error; } static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) { return tree->tree1d[index]; } static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) { return tree->lengths[index]; } #endif /*LODEPNG_COMPILE_ENCODER*/ /*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ static unsigned generateFixedLitLenTree(HuffmanTree* tree) { unsigned i, error = 0; unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); if(!bitlen) return 83; /*alloc fail*/ /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ for(i = 0; i <= 143; ++i) bitlen[i] = 8; for(i = 144; i <= 255; ++i) bitlen[i] = 9; for(i = 256; i <= 279; ++i) bitlen[i] = 7; for(i = 280; i <= 287; ++i) bitlen[i] = 8; error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); lodepng_free(bitlen); return error; } /*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ static unsigned generateFixedDistanceTree(HuffmanTree* tree) { unsigned i, error = 0; unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); if(!bitlen) return 83; /*alloc fail*/ /*there are 32 distance codes, but 30-31 are unused*/ for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); lodepng_free(bitlen); return error; } #ifdef LODEPNG_COMPILE_DECODER /* returns the code, or (unsigned)(-1) if error happened inbitlength is the length of the complete buffer, in bits (so its byte length times 8) */ static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, const HuffmanTree* codetree, size_t inbitlength) { unsigned treepos = 0, ct; for(;;) { if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ /* decode the symbol from the tree. The "readBitFromStream" code is inlined in the expression below because this is the biggest bottleneck while decoding */ ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; ++(*bp); if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ } } #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_DECODER /* ////////////////////////////////////////////////////////////////////////// */ /* / Inflator (Decompressor) / */ /* ////////////////////////////////////////////////////////////////////////// */ /*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) { /*TODO: check for out of memory errors*/ generateFixedLitLenTree(tree_ll); generateFixedDistanceTree(tree_d); } /*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, const unsigned char* in, size_t* bp, size_t inlength) { /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ unsigned error = 0; unsigned n, HLIT, HDIST, HCLEN, i; size_t inbitlength = inlength * 8; /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ unsigned* bitlen_ll = 0; /*lit,len code lengths*/ unsigned* bitlen_d = 0; /*dist code lengths*/ /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ unsigned* bitlen_cl = 0; HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ if((*bp) + 14 > (inlength << 3)) return 49; /*error: the bit pointer is or will go past the memory*/ /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ HLIT = readBitsFromStream(bp, in, 5) + 257; /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ HDIST = readBitsFromStream(bp, in, 5) + 1; /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ HCLEN = readBitsFromStream(bp, in, 4) + 4; if((*bp) + HCLEN * 3 > (inlength << 3)) return 50; /*error: the bit pointer is or will go past the memory*/ HuffmanTree_init(&tree_cl); while(!error) { /*read the code length codes out of 3 * (amount of code length codes) bits*/ bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); for(i = 0; i != NUM_CODE_LENGTH_CODES; ++i) { if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ } error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); if(error) break; /*now we can use this tree to read the lengths for the tree that this function will return*/ bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); for(i = 0; i != NUM_DEFLATE_CODE_SYMBOLS; ++i) bitlen_ll[i] = 0; for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen_d[i] = 0; /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ i = 0; while(i < HLIT + HDIST) { unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); if(code <= 15) /*a length code*/ { if(i < HLIT) bitlen_ll[i] = code; else bitlen_d[i - HLIT] = code; ++i; } else if(code == 16) /*repeat previous*/ { unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ unsigned value; /*set value to the previous code*/ if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ if((*bp + 2) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ replength += readBitsFromStream(bp, in, 2); if(i < HLIT + 1) value = bitlen_ll[i - 1]; else value = bitlen_d[i - HLIT - 1]; /*repeat this value in the next lengths*/ for(n = 0; n < replength; ++n) { if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ if(i < HLIT) bitlen_ll[i] = value; else bitlen_d[i - HLIT] = value; ++i; } } else if(code == 17) /*repeat "0" 3-10 times*/ { unsigned replength = 3; /*read in the bits that indicate repeat length*/ if((*bp + 3) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ replength += readBitsFromStream(bp, in, 3); /*repeat this value in the next lengths*/ for(n = 0; n < replength; ++n) { if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ if(i < HLIT) bitlen_ll[i] = 0; else bitlen_d[i - HLIT] = 0; ++i; } } else if(code == 18) /*repeat "0" 11-138 times*/ { unsigned replength = 11; /*read in the bits that indicate repeat length*/ if((*bp + 7) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ replength += readBitsFromStream(bp, in, 7); /*repeat this value in the next lengths*/ for(n = 0; n < replength; ++n) { if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ if(i < HLIT) bitlen_ll[i] = 0; else bitlen_d[i - HLIT] = 0; ++i; } } else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ { if(code == (unsigned)(-1)) { /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol (10=no endcode, 11=wrong jump outside of tree)*/ error = (*bp) > inbitlength ? 10 : 11; } else error = 16; /*unexisting code, this can never happen*/ break; } } if(error) break; if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); if(error) break; error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); break; /*end of error-while*/ } lodepng_free(bitlen_cl); lodepng_free(bitlen_ll); lodepng_free(bitlen_d); HuffmanTree_cleanup(&tree_cl); return error; } /*inflate a block with dynamic of fixed Huffman tree*/ static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength, unsigned btype) { unsigned error = 0; HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ HuffmanTree tree_d; /*the huffman tree for distance codes*/ size_t inbitlength = inlength * 8; HuffmanTree_init(&tree_ll); HuffmanTree_init(&tree_d); if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); while(!error) /*decode all symbols until end reached, breaks at end code*/ { /*code_ll is literal, length or end code*/ unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); if(code_ll <= 255) /*literal symbol*/ { /*ucvector_push_back would do the same, but for some reason the two lines below run 10% faster*/ if(!ucvector_resize(out, (*pos) + 1)) ERROR_BREAK(83 /*alloc fail*/); out->data[*pos] = (unsigned char)code_ll; ++(*pos); } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ { unsigned code_d, distance; unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ size_t start, forward, backward, length; /*part 1: get length base*/ length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; /*part 2: get extra bits and add the value of that to length*/ numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; if((*bp + numextrabits_l) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ length += readBitsFromStream(bp, in, numextrabits_l); /*part 3: get distance code*/ code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); if(code_d > 29) { if(code_d == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ { /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol (10=no endcode, 11=wrong jump outside of tree)*/ error = (*bp) > inlength * 8 ? 10 : 11; } else error = 18; /*error: invalid distance code (30-31 are never used)*/ break; } distance = DISTANCEBASE[code_d]; /*part 4: get extra bits from distance*/ numextrabits_d = DISTANCEEXTRA[code_d]; if((*bp + numextrabits_d) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ distance += readBitsFromStream(bp, in, numextrabits_d); /*part 5: fill in all the out[n] values based on the length and dist*/ start = (*pos); if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ backward = start - distance; if(!ucvector_resize(out, (*pos) + length)) ERROR_BREAK(83 /*alloc fail*/); if (distance < length) { for(forward = 0; forward < length; ++forward) { out->data[(*pos)++] = out->data[backward++]; } } else { memcpy(out->data + *pos, out->data + backward, length); *pos += length; } } else if(code_ll == 256) { break; /*end code, break the loop*/ } else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ { /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol (10=no endcode, 11=wrong jump outside of tree)*/ error = ((*bp) > inlength * 8) ? 10 : 11; break; } } HuffmanTree_cleanup(&tree_ll); HuffmanTree_cleanup(&tree_d); return error; } static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) { size_t p; unsigned LEN, NLEN, n, error = 0; /*go to first boundary of byte*/ while(((*bp) & 0x7) != 0) ++(*bp); p = (*bp) / 8; /*byte position*/ /*read LEN (2 bytes) and NLEN (2 bytes)*/ if(p + 4 >= inlength) return 52; /*error, bit pointer will jump past memory*/ LEN = in[p] + 256u * in[p + 1]; p += 2; NLEN = in[p] + 256u * in[p + 1]; p += 2; /*check if 16-bit NLEN is really the one's complement of LEN*/ if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ /*read the literal data: LEN bytes are now stored in the out buffer*/ if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ for(n = 0; n < LEN; ++n) out->data[(*pos)++] = in[p++]; (*bp) = p * 8; return error; } static unsigned lodepng_inflatev(ucvector* out, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ size_t bp = 0; unsigned BFINAL = 0; size_t pos = 0; /*byte position in the out buffer*/ unsigned error = 0; (void)settings; while(!BFINAL) { unsigned BTYPE; if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ BFINAL = readBitFromStream(&bp, in); BTYPE = 1u * readBitFromStream(&bp, in); BTYPE += 2u * readBitFromStream(&bp, in); if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ if(error) return error; } return error; } unsigned lodepng_inflate(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { unsigned error; ucvector v; ucvector_init_buffer(&v, *out, *outsize); error = lodepng_inflatev(&v, in, insize, settings); *out = v.data; *outsize = v.size; return error; } static unsigned inflate(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { if(settings->custom_inflate) { return settings->custom_inflate(out, outsize, in, insize, settings); } else { return lodepng_inflate(out, outsize, in, insize, settings); } } #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER /* ////////////////////////////////////////////////////////////////////////// */ /* / Deflator (Compressor) / */ /* ////////////////////////////////////////////////////////////////////////// */ static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; /*bitlen is the size in bits of the code*/ static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) { addBitsToStreamReversed(bp, compressed, code, bitlen); } /*search the index in the array, that has the largest value smaller than or equal to the given value, given array must be sorted (if no value is smaller, it returns the size of the given array)*/ static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) { /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ size_t left = 1; size_t right = array_size - 1; while(left <= right) { size_t mid = (left + right) >> 1; if (array[mid] >= value) right = mid - 1; else left = mid + 1; } if(left >= array_size || array[left] > value) left--; return left; } static void addLengthDistance(uivector* values, size_t length, size_t distance) { /*values in encoded vector are those used by deflate: 0-255: literal bytes 256: end 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) 286-287: invalid*/ unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); uivector_push_back(values, extra_length); uivector_push_back(values, dist_code); uivector_push_back(values, extra_distance); } /*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 bytes as input because 3 is the minimum match length for deflate*/ static const unsigned HASH_NUM_VALUES = 65536; static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ typedef struct Hash { int* head; /*hash value to head circular pos - can be outdated if went around window*/ /*circular pos to prev circular pos*/ unsigned short* chain; int* val; /*circular pos to hash value*/ /*TODO: do this not only for zeros but for any repeated byte. However for PNG it's always going to be the zeros that dominate, so not important for PNG*/ int* headz; /*similar to head, but for chainz*/ unsigned short* chainz; /*those with same amount of zeros*/ unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ } Hash; static unsigned hash_init(Hash* hash, unsigned windowsize) { unsigned i; hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) { return 83; /*alloc fail*/ } /*initialize hash table*/ for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; for(i = 0; i != windowsize; ++i) hash->val[i] = -1; for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ return 0; } static void hash_cleanup(Hash* hash) { lodepng_free(hash->head); lodepng_free(hash->val); lodepng_free(hash->chain); lodepng_free(hash->zeros); lodepng_free(hash->headz); lodepng_free(hash->chainz); } static unsigned getHash(const unsigned char* data, size_t size, size_t pos) { unsigned result = 0; if(pos + 2 < size) { /*A simple shift and xor hash is used. Since the data of PNGs is dominated by zeroes due to the filters, a better hash does not have a significant effect on speed in traversing the chain, and causes more time spend on calculating the hash.*/ result ^= (unsigned)(data[pos + 0] << 0u); result ^= (unsigned)(data[pos + 1] << 4u); result ^= (unsigned)(data[pos + 2] << 8u); } else { size_t amount, i; if(pos >= size) return 0; amount = size - pos; for(i = 0; i != amount; ++i) result ^= (unsigned)(data[pos + i] << (i * 8u)); } return result & HASH_BIT_MASK; } static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) { const unsigned char* start = data + pos; const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; if(end > data + size) end = data + size; data = start; while(data != end && *data == 0) ++data; /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ return (unsigned)(data - start); } /*wpos = pos & (windowsize - 1)*/ static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) { hash->val[wpos] = (int)hashval; if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; hash->head[hashval] = (int)wpos; hash->zeros[wpos] = numzeros; if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; hash->headz[numzeros] = (int)wpos; } /* LZ77-encode the data. Return value is error code. The input are raw bytes, the output is in the form of unsigned integers with codes representing for example literal bytes, or length/distance pairs. It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a sliding window (of windowsize) is used, and all past bytes in that window can be used as the "dictionary". A brute force search through all possible distances would be slow, and this hash technique is one out of several ways to speed this up. */ static unsigned encodeLZ77(uivector* out, Hash* hash, const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, unsigned minmatch, unsigned nicematch, unsigned lazymatching) { size_t pos; unsigned i, error = 0; /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ unsigned numzeros = 0; unsigned offset; /*the offset represents the distance in LZ77 terminology*/ unsigned length; unsigned lazy = 0; unsigned lazylength = 0, lazyoffset = 0; unsigned hashval; unsigned current_offset, current_length; unsigned prev_offset; const unsigned char *lastptr, *foreptr, *backptr; unsigned hashpos; if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; for(pos = inpos; pos < insize; ++pos) { size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ unsigned chainlength = 0; hashval = getHash(in, insize, pos); if(usezeros && hashval == 0) { if(numzeros == 0) numzeros = countZeros(in, insize, pos); else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; } else { numzeros = 0; } updateHashChain(hash, wpos, hashval, numzeros); /*the length and offset found for the current position*/ length = 0; offset = 0; hashpos = hash->chain[wpos]; lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; /*search for the longest string*/ prev_offset = 0; for(;;) { if(chainlength++ >= maxchainlength) break; current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ prev_offset = current_offset; if(current_offset > 0) { /*test the next characters*/ foreptr = &in[pos]; backptr = &in[pos - current_offset]; /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ if(numzeros >= 3) { unsigned skip = hash->zeros[hashpos]; if(skip > numzeros) skip = numzeros; backptr += skip; foreptr += skip; } while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ { ++backptr; ++foreptr; } current_length = (unsigned)(foreptr - &in[pos]); if(current_length > length) { length = current_length; /*the longest length*/ offset = current_offset; /*the offset that is related to this longest length*/ /*jump out once a length of max length is found (speed gain). This also jumps out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ if(current_length >= nicematch) break; } } if(hashpos == hash->chain[hashpos]) break; if(numzeros >= 3 && length > numzeros) { hashpos = hash->chainz[hashpos]; if(hash->zeros[hashpos] != numzeros) break; } else { hashpos = hash->chain[hashpos]; /*outdated hash value, happens if particular value was not encountered in whole last window*/ if(hash->val[hashpos] != (int)hashval) break; } } if(lazymatching) { if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { lazy = 1; lazylength = length; lazyoffset = offset; continue; /*try the next byte*/ } if(lazy) { lazy = 0; if(pos == 0) ERROR_BREAK(81); if(length > lazylength + 1) { /*push the previous character as literal*/ if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); } else { length = lazylength; offset = lazyoffset; hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ hash->headz[numzeros] = -1; /*idem*/ --pos; } } } if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); /*encode it as length/distance pair or literal value*/ if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ { if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); } else if(length < minmatch || (length == 3 && offset > 4096)) { /*compensate for the fact that longer offsets have more extra bits, a length of only 3 may be not worth it then*/ if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); } else { addLengthDistance(out, length, offset); for(i = 1; i < length; ++i) { ++pos; wpos = pos & (windowsize - 1); hashval = getHash(in, insize, pos); if(usezeros && hashval == 0) { if(numzeros == 0) numzeros = countZeros(in, insize, pos); else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; } else { numzeros = 0; } updateHashChain(hash, wpos, hashval, numzeros); } } } /*end of the loop through each character of input*/ return error; } /* /////////////////////////////////////////////////////////////////////////// */ static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) { /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; unsigned datapos = 0; for(i = 0; i != numdeflateblocks; ++i) { unsigned BFINAL, BTYPE, LEN, NLEN; unsigned char firstbyte; BFINAL = (i == numdeflateblocks - 1); BTYPE = 0; firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); ucvector_push_back(out, firstbyte); LEN = 65535; if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; NLEN = 65535 - LEN; ucvector_push_back(out, (unsigned char)(LEN & 255)); ucvector_push_back(out, (unsigned char)(LEN >> 8)); ucvector_push_back(out, (unsigned char)(NLEN & 255)); ucvector_push_back(out, (unsigned char)(NLEN >> 8)); /*Decompressed data*/ for(j = 0; j < 65535 && datapos < datasize; ++j) { ucvector_push_back(out, data[datapos++]); } } return 0; } /* write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. tree_ll: the tree for lit and len codes. tree_d: the tree for distance codes. */ static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, const HuffmanTree* tree_ll, const HuffmanTree* tree_d) { size_t i = 0; for(i = 0; i != lz77_encoded->size; ++i) { unsigned val = lz77_encoded->data[i]; addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); if(val > 256) /*for a length code, 3 more things have to be added*/ { unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; unsigned length_extra_bits = lz77_encoded->data[++i]; unsigned distance_code = lz77_encoded->data[++i]; unsigned distance_index = distance_code; unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; unsigned distance_extra_bits = lz77_encoded->data[++i]; addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), HuffmanTree_getLength(tree_d, distance_code)); addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); } } } /*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, const unsigned char* data, size_t datapos, size_t dataend, const LodePNGCompressSettings* settings, unsigned final) { unsigned error = 0; /* A block is compressed as follows: The PNG data is lz77 encoded, resulting in literal bytes and length/distance pairs. This is then huffman compressed with two huffman trees. One huffman tree is used for the lit and len values ("ll"), another huffman tree is used for the dist values ("d"). These two trees are stored using their code lengths, and to compress even more these code lengths are also run-length encoded and huffman compressed. This gives a huffman tree of code lengths "cl". The code lenghts used to describe this third tree are the code length code lengths ("clcl"). */ /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ uivector lz77_encoded; HuffmanTree tree_ll; /*tree for lit,len values*/ HuffmanTree tree_d; /*tree for distance codes*/ HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ uivector frequencies_ll; /*frequency of lit,len codes*/ uivector frequencies_d; /*frequency of dist codes*/ uivector frequencies_cl; /*frequency of code length codes*/ uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl (these are written as is in the file, it would be crazy to compress these using yet another huffman tree that needs to be represented by yet another set of code lengths)*/ uivector bitlen_cl; size_t datasize = dataend - datapos; /* Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: bitlen_lld is to tree_cl what data is to tree_ll and tree_d. bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. */ unsigned BFINAL = final; size_t numcodes_ll, numcodes_d, i; unsigned HLIT, HDIST, HCLEN; uivector_init(&lz77_encoded); HuffmanTree_init(&tree_ll); HuffmanTree_init(&tree_d); HuffmanTree_init(&tree_cl); uivector_init(&frequencies_ll); uivector_init(&frequencies_d); uivector_init(&frequencies_cl); uivector_init(&bitlen_lld); uivector_init(&bitlen_lld_e); uivector_init(&bitlen_cl); /*This while loop never loops due to a break at the end, it is here to allow breaking out of it to the cleanup phase on error conditions.*/ while(!error) { if(settings->use_lz77) { error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, settings->minmatch, settings->nicematch, settings->lazymatching); if(error) break; } else { if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ } if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); /*Count the frequencies of lit, len and dist codes*/ for(i = 0; i != lz77_encoded.size; ++i) { unsigned symbol = lz77_encoded.data[i]; ++frequencies_ll.data[symbol]; if(symbol > 256) { unsigned dist = lz77_encoded.data[i + 2]; ++frequencies_d.data[dist]; i += 3; } } frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15); if(error) break; /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15); if(error) break; numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; /*store the code lengths of both generated trees in bitlen_lld*/ for(i = 0; i != numcodes_ll; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); for(i = 0; i != numcodes_d; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), 17 (3-10 zeroes), 18 (11-138 zeroes)*/ for(i = 0; i != (unsigned)bitlen_lld.size; ++i) { unsigned j = 0; /*amount of repititions*/ while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) ++j; if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ { ++j; /*include the first zero*/ if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ { uivector_push_back(&bitlen_lld_e, 17); uivector_push_back(&bitlen_lld_e, j - 3); } else /*repeat code 18 supports max 138 zeroes*/ { if(j > 138) j = 138; uivector_push_back(&bitlen_lld_e, 18); uivector_push_back(&bitlen_lld_e, j - 11); } i += (j - 1); } else if(j >= 3) /*repeat code for value other than zero*/ { size_t k; unsigned num = j / 6, rest = j % 6; uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); for(k = 0; k < num; ++k) { uivector_push_back(&bitlen_lld_e, 16); uivector_push_back(&bitlen_lld_e, 6 - 3); } if(rest >= 3) { uivector_push_back(&bitlen_lld_e, 16); uivector_push_back(&bitlen_lld_e, rest - 3); } else j -= rest; i += j; } else /*too short to benefit from repeat code*/ { uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); } } /*generate tree_cl, the huffmantree of huffmantrees*/ if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); for(i = 0; i != bitlen_lld_e.size; ++i) { ++frequencies_cl.data[bitlen_lld_e.data[i]]; /*after a repeat code come the bits that specify the number of repetitions, those don't need to be in the frequencies_cl calculation*/ if(bitlen_lld_e.data[i] >= 16) ++i; } error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, frequencies_cl.size, frequencies_cl.size, 7); if(error) break; if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); for(i = 0; i != tree_cl.numcodes; ++i) { /*lenghts of code length tree is in the order as specified by deflate*/ bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); } while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) { /*remove zeros at the end, but minimum size must be 4*/ if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); } if(error) break; /* Write everything into the output After the BFINAL and BTYPE, the dynamic block consists out of the following: - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN - (HCLEN+4)*3 bits code lengths of code length alphabet - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length alphabet, + possible repetition codes 16, 17, 18) - HDIST + 1 code lengths of distance alphabet (encoded using the code length alphabet, + possible repetition codes 16, 17, 18) - compressed data - 256 (end code) */ /*Write block type*/ addBitToStream(bp, out, BFINAL); addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ /*write the HLIT, HDIST and HCLEN values*/ HLIT = (unsigned)(numcodes_ll - 257); HDIST = (unsigned)(numcodes_d - 1); HCLEN = (unsigned)bitlen_cl.size - 4; /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) --HCLEN; addBitsToStream(bp, out, HLIT, 5); addBitsToStream(bp, out, HDIST, 5); addBitsToStream(bp, out, HCLEN, 4); /*write the code lenghts of the code length alphabet*/ for(i = 0; i != HCLEN + 4; ++i) addBitsToStream(bp, out, bitlen_cl.data[i], 3); /*write the lenghts of the lit/len AND the dist alphabet*/ for(i = 0; i != bitlen_lld_e.size; ++i) { addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); /*extra bits of repeat codes*/ if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); } /*write the compressed data symbols*/ writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); /*error: the length of the end code 256 must be larger than 0*/ if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); /*write the end code*/ addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); break; /*end of error-while*/ } /*cleanup*/ uivector_cleanup(&lz77_encoded); HuffmanTree_cleanup(&tree_ll); HuffmanTree_cleanup(&tree_d); HuffmanTree_cleanup(&tree_cl); uivector_cleanup(&frequencies_ll); uivector_cleanup(&frequencies_d); uivector_cleanup(&frequencies_cl); uivector_cleanup(&bitlen_lld_e); uivector_cleanup(&bitlen_lld); uivector_cleanup(&bitlen_cl); return error; } static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, const unsigned char* data, size_t datapos, size_t dataend, const LodePNGCompressSettings* settings, unsigned final) { HuffmanTree tree_ll; /*tree for literal values and length codes*/ HuffmanTree tree_d; /*tree for distance codes*/ unsigned BFINAL = final; unsigned error = 0; size_t i; HuffmanTree_init(&tree_ll); HuffmanTree_init(&tree_d); generateFixedLitLenTree(&tree_ll); generateFixedDistanceTree(&tree_d); addBitToStream(bp, out, BFINAL); addBitToStream(bp, out, 1); /*first bit of BTYPE*/ addBitToStream(bp, out, 0); /*second bit of BTYPE*/ if(settings->use_lz77) /*LZ77 encoded*/ { uivector lz77_encoded; uivector_init(&lz77_encoded); error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, settings->minmatch, settings->nicematch, settings->lazymatching); if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); uivector_cleanup(&lz77_encoded); } else /*no LZ77, but still will be Huffman compressed*/ { for(i = datapos; i < dataend; ++i) { addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); } } /*add END code*/ if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); /*cleanup*/ HuffmanTree_cleanup(&tree_ll); HuffmanTree_cleanup(&tree_d); return error; } static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings) { unsigned error = 0; size_t i, blocksize, numdeflateblocks; size_t bp = 0; /*the bit pointer*/ Hash hash; if(settings->btype > 2) return 61; else if(settings->btype == 0) return deflateNoCompression(out, in, insize); else if(settings->btype == 1) blocksize = insize; else /*if(settings->btype == 2)*/ { /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ blocksize = insize / 8 + 8; if(blocksize < 65536) blocksize = 65536; if(blocksize > 262144) blocksize = 262144; } numdeflateblocks = (insize + blocksize - 1) / blocksize; if(numdeflateblocks == 0) numdeflateblocks = 1; error = hash_init(&hash, settings->windowsize); if(error) return error; for(i = 0; i != numdeflateblocks && !error; ++i) { unsigned final = (i == numdeflateblocks - 1); size_t start = i * blocksize; size_t end = start + blocksize; if(end > insize) end = insize; if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); } hash_cleanup(&hash); return error; } unsigned lodepng_deflate(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings) { unsigned error; ucvector v; ucvector_init_buffer(&v, *out, *outsize); error = lodepng_deflatev(&v, in, insize, settings); *out = v.data; *outsize = v.size; return error; } static unsigned deflate(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings) { if(settings->custom_deflate) { return settings->custom_deflate(out, outsize, in, insize, settings); } else { return lodepng_deflate(out, outsize, in, insize, settings); } } #endif /*LODEPNG_COMPILE_DECODER*/ /* ////////////////////////////////////////////////////////////////////////// */ /* / Adler32 */ /* ////////////////////////////////////////////////////////////////////////// */ static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) { unsigned s1 = adler & 0xffff; unsigned s2 = (adler >> 16) & 0xffff; while(len > 0) { /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ unsigned amount = len > 5552 ? 5552 : len; len -= amount; while(amount > 0) { s1 += (*data++); s2 += s1; --amount; } s1 %= 65521; s2 %= 65521; } return (s2 << 16) | s1; } /*Return the adler32 of the bytes data[0..len-1]*/ static unsigned adler32(const unsigned char* data, unsigned len) { return update_adler32(1L, data, len); } /* ////////////////////////////////////////////////////////////////////////// */ /* / Zlib / */ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_DECODER unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { unsigned error = 0; unsigned CM, CINFO, FDICT; if(insize < 2) return 53; /*error, size of zlib data too small*/ /*read information from zlib header*/ if((in[0] * 256 + in[1]) % 31 != 0) { /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ return 24; } CM = in[0] & 15; CINFO = (in[0] >> 4) & 15; /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ FDICT = (in[1] >> 5) & 1; /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ if(CM != 8 || CINFO > 7) { /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ return 25; } if(FDICT != 0) { /*error: the specification of PNG says about the zlib stream: "The additional flags shall not specify a preset dictionary."*/ return 26; } error = inflate(out, outsize, in + 2, insize - 2, settings); if(error) return error; if(!settings->ignore_adler32) { unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); unsigned checksum = adler32(*out, (unsigned)(*outsize)); if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ } return 0; /*no error*/ } static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { if(settings->custom_zlib) { return settings->custom_zlib(out, outsize, in, insize, settings); } else { return lodepng_zlib_decompress(out, outsize, in, insize, settings); } } #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings) { /*initially, *out must be NULL and outsize 0, if you just give some random *out that's pointing to a non allocated buffer, this'll crash*/ ucvector outv; size_t i; unsigned error; unsigned char* deflatedata = 0; size_t deflatesize = 0; /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ unsigned FLEVEL = 0; unsigned FDICT = 0; unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; unsigned FCHECK = 31 - CMFFLG % 31; CMFFLG += FCHECK; /*ucvector-controlled version of the output buffer, for dynamic array*/ ucvector_init_buffer(&outv, *out, *outsize); ucvector_push_back(&outv, (unsigned char)(CMFFLG >> 8)); ucvector_push_back(&outv, (unsigned char)(CMFFLG & 255)); error = deflate(&deflatedata, &deflatesize, in, insize, settings); if(!error) { unsigned ADLER32 = adler32(in, (unsigned)insize); for(i = 0; i != deflatesize; ++i) ucvector_push_back(&outv, deflatedata[i]); lodepng_free(deflatedata); lodepng_add32bitInt(&outv, ADLER32); } *out = outv.data; *outsize = outv.size; return error; } /* compress using the default or custom zlib function */ static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings) { if(settings->custom_zlib) { return settings->custom_zlib(out, outsize, in, insize, settings); } else { return lodepng_zlib_compress(out, outsize, in, insize, settings); } } #endif /*LODEPNG_COMPILE_ENCODER*/ #else /*no LODEPNG_COMPILE_ZLIB*/ #ifdef LODEPNG_COMPILE_DECODER static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ return settings->custom_zlib(out, outsize, in, insize, settings); } #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings) { if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ return settings->custom_zlib(out, outsize, in, insize, settings); } #endif /*LODEPNG_COMPILE_ENCODER*/ #endif /*LODEPNG_COMPILE_ZLIB*/ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_ENCODER /*this is a good tradeoff between speed and compression ratio*/ #define DEFAULT_WINDOWSIZE 2048 void lodepng_compress_settings_init(LodePNGCompressSettings* settings) { /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ settings->btype = 2; settings->use_lz77 = 1; settings->windowsize = DEFAULT_WINDOWSIZE; settings->minmatch = 3; settings->nicematch = 128; settings->lazymatching = 1; settings->custom_zlib = 0; settings->custom_deflate = 0; settings->custom_context = 0; } const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; #endif /*LODEPNG_COMPILE_ENCODER*/ #ifdef LODEPNG_COMPILE_DECODER void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) { settings->ignore_adler32 = 0; settings->custom_zlib = 0; settings->custom_inflate = 0; settings->custom_context = 0; } const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0}; #endif /*LODEPNG_COMPILE_DECODER*/ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ /* // End of Zlib related code. Begin of PNG related code. // */ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_PNG /* ////////////////////////////////////////////////////////////////////////// */ /* / CRC32 / */ /* ////////////////////////////////////////////////////////////////////////// */ #ifndef LODEPNG_NO_COMPILE_CRC /* CRC polynomial: 0xedb88320 */ static unsigned lodepng_crc32_table[256] = { 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u }; /*Return the CRC of the bytes buf[0..len-1].*/ unsigned lodepng_crc32(const unsigned char* data, size_t length) { unsigned r = 0xffffffffu; size_t i; for(i = 0; i < length; ++i) { r = lodepng_crc32_table[(r ^ data[i]) & 0xff] ^ (r >> 8); } return r ^ 0xffffffffu; } #else /* !LODEPNG_NO_COMPILE_CRC */ unsigned lodepng_crc32(const unsigned char* data, size_t length); #endif /* !LODEPNG_NO_COMPILE_CRC */ /* ////////////////////////////////////////////////////////////////////////// */ /* / Reading and writing single bits and bytes from/to stream for LodePNG / */ /* ////////////////////////////////////////////////////////////////////////// */ static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) { unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); ++(*bitpointer); return result; } static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) { unsigned result = 0; size_t i; for(i = 0 ; i < nbits; ++i) { result <<= 1; result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); } return result; } #ifdef LODEPNG_COMPILE_DECODER static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) { /*the current bit in bitstream must be 0 for this to work*/ if(bit) { /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); } ++(*bitpointer); } #endif /*LODEPNG_COMPILE_DECODER*/ static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) { /*the current bit in bitstream may be 0 or 1 for this to work*/ if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); ++(*bitpointer); } /* ////////////////////////////////////////////////////////////////////////// */ /* / PNG chunks / */ /* ////////////////////////////////////////////////////////////////////////// */ unsigned lodepng_chunk_length(const unsigned char* chunk) { return lodepng_read32bitInt(&chunk[0]); } void lodepng_chunk_type(char type[5], const unsigned char* chunk) { unsigned i; for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; type[4] = 0; /*null termination char*/ } unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) { if(strlen(type) != 4) return 0; return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); } unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) { return((chunk[4] & 32) != 0); } unsigned char lodepng_chunk_private(const unsigned char* chunk) { return((chunk[6] & 32) != 0); } unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) { return((chunk[7] & 32) != 0); } unsigned char* lodepng_chunk_data(unsigned char* chunk) { return &chunk[8]; } const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) { return &chunk[8]; } unsigned lodepng_chunk_check_crc(const unsigned char* chunk) { unsigned length = lodepng_chunk_length(chunk); unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ unsigned checksum = lodepng_crc32(&chunk[4], length + 4); if(CRC != checksum) return 1; else return 0; } void lodepng_chunk_generate_crc(unsigned char* chunk) { unsigned length = lodepng_chunk_length(chunk); unsigned CRC = lodepng_crc32(&chunk[4], length + 4); lodepng_set32bitInt(chunk + 8 + length, CRC); } unsigned char* lodepng_chunk_next(unsigned char* chunk) { if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ return chunk + 8; } else { unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; return chunk + total_chunk_length; } } const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) { if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ return chunk + 8; } else { unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; return chunk + total_chunk_length; } } unsigned char* lodepng_chunk_find(unsigned char* chunk, const unsigned char* end, const char type[5]) { for(;;) { if(chunk + 12 >= end) return 0; if(lodepng_chunk_type_equals(chunk, type)) return chunk; chunk = lodepng_chunk_next(chunk); } } const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]) { for(;;) { if(chunk + 12 >= end) return 0; if(lodepng_chunk_type_equals(chunk, type)) return chunk; chunk = lodepng_chunk_next_const(chunk); } } unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) { unsigned i; unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; unsigned char *chunk_start, *new_buffer; size_t new_length = (*outlength) + total_chunk_length; if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); if(!new_buffer) return 83; /*alloc fail*/ (*out) = new_buffer; (*outlength) = new_length; chunk_start = &(*out)[new_length - total_chunk_length]; for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; return 0; } unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, const char* type, const unsigned char* data) { unsigned i; unsigned char *chunk, *new_buffer; size_t new_length = (*outlength) + length + 12; if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); if(!new_buffer) return 83; /*alloc fail*/ (*out) = new_buffer; (*outlength) = new_length; chunk = &(*out)[(*outlength) - length - 12]; /*1: length*/ lodepng_set32bitInt(chunk, (unsigned)length); /*2: chunk name (4 letters)*/ chunk[4] = (unsigned char)type[0]; chunk[5] = (unsigned char)type[1]; chunk[6] = (unsigned char)type[2]; chunk[7] = (unsigned char)type[3]; /*3: the data*/ for(i = 0; i != length; ++i) chunk[8 + i] = data[i]; /*4: CRC (of the chunkname characters and the data)*/ lodepng_chunk_generate_crc(chunk); return 0; } /* ////////////////////////////////////////////////////////////////////////// */ /* / Color types and such / */ /* ////////////////////////////////////////////////////////////////////////// */ /*return type is a LodePNG error code*/ static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ { switch(colortype) { case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ default: return 31; } return 0; /*allowed color type / bits combination*/ } static unsigned getNumColorChannels(LodePNGColorType colortype) { switch(colortype) { case 0: return 1; /*grey*/ case 2: return 3; /*RGB*/ case 3: return 1; /*palette*/ case 4: return 2; /*grey + alpha*/ case 6: return 4; /*RGBA*/ } return 0; /*unexisting color type*/ } static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) { /*bits per pixel is amount of channels * bits per channel*/ return getNumColorChannels(colortype) * bitdepth; } /* ////////////////////////////////////////////////////////////////////////// */ void lodepng_color_mode_init(LodePNGColorMode* info) { info->key_defined = 0; info->key_r = info->key_g = info->key_b = 0; info->colortype = LCT_RGBA; info->bitdepth = 8; info->palette = 0; info->palettesize = 0; } void lodepng_color_mode_cleanup(LodePNGColorMode* info) { lodepng_palette_clear(info); } unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) { size_t i; lodepng_color_mode_cleanup(dest); *dest = *source; if(source->palette) { dest->palette = (unsigned char*)lodepng_malloc(1024); if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ for(i = 0; i != source->palettesize * 4; ++i) dest->palette[i] = source->palette[i]; } return 0; } LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) { LodePNGColorMode result; lodepng_color_mode_init(&result); result.colortype = colortype; result.bitdepth = bitdepth; return result; } static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) { size_t i; if(a->colortype != b->colortype) return 0; if(a->bitdepth != b->bitdepth) return 0; if(a->key_defined != b->key_defined) return 0; if(a->key_defined) { if(a->key_r != b->key_r) return 0; if(a->key_g != b->key_g) return 0; if(a->key_b != b->key_b) return 0; } if(a->palettesize != b->palettesize) return 0; for(i = 0; i != a->palettesize * 4; ++i) { if(a->palette[i] != b->palette[i]) return 0; } return 1; } void lodepng_palette_clear(LodePNGColorMode* info) { if(info->palette) lodepng_free(info->palette); info->palette = 0; info->palettesize = 0; } unsigned lodepng_palette_add(LodePNGColorMode* info, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { unsigned char* data; /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with the max of 256 colors, it'll have the exact alloc size*/ if(!info->palette) /*allocate palette if empty*/ { /*room for 256 colors with 4 bytes each*/ data = (unsigned char*)lodepng_realloc(info->palette, 1024); if(!data) return 83; /*alloc fail*/ else info->palette = data; } info->palette[4 * info->palettesize + 0] = r; info->palette[4 * info->palettesize + 1] = g; info->palette[4 * info->palettesize + 2] = b; info->palette[4 * info->palettesize + 3] = a; ++info->palettesize; return 0; } /*calculate bits per pixel out of colortype and bitdepth*/ unsigned lodepng_get_bpp(const LodePNGColorMode* info) { return lodepng_get_bpp_lct(info->colortype, info->bitdepth); } unsigned lodepng_get_channels(const LodePNGColorMode* info) { return getNumColorChannels(info->colortype); } unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) { return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; } unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) { return (info->colortype & 4) != 0; /*4 or 6*/ } unsigned lodepng_is_palette_type(const LodePNGColorMode* info) { return info->colortype == LCT_PALETTE; } unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) { size_t i; for(i = 0; i != info->palettesize; ++i) { if(info->palette[i * 4 + 3] < 255) return 1; } return 0; } unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) { return info->key_defined || lodepng_is_alpha_type(info) || lodepng_has_palette_alpha(info); } size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); size_t n = (size_t)w * (size_t)h; return ((n / 8) * bpp) + ((n & 7) * bpp + 7) / 8; } size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) { return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); } #ifdef LODEPNG_COMPILE_PNG #ifdef LODEPNG_COMPILE_DECODER /*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, and in addition has one extra byte per line: the filter byte. So this gives a larger result than lodepng_get_raw_size. */ static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, const LodePNGColorMode* color) { size_t bpp = lodepng_get_bpp(color); /* + 1 for the filter byte, and possibly plus padding bits per line */ size_t line = ((size_t)(w / 8) * bpp) + 1 + ((w & 7) * bpp + 7) / 8; return (size_t)h * line; } /* Safely check if multiplying two integers will overflow (no undefined behavior, compiler removing the code, etc...) and output result. */ static int lodepng_mulofl(size_t a, size_t b, size_t* result) { *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ return (a != 0 && *result / a != b); } /* Safely check if adding two integers will overflow (no undefined behavior, compiler removing the code, etc...) and output result. */ static int lodepng_addofl(size_t a, size_t b, size_t* result) { *result = a + b; /* Unsigned addition is well defined and safe in C90 */ return *result < a; } /*Safely checks whether size_t overflow can be caused due to amount of pixels. This check is overcautious rather than precise. If this check indicates no overflow, you can safely compute in a size_t (but not an unsigned): -(size_t)w * (size_t)h * 8 -amount of bytes in IDAT (including filter, padding and Adam7 bytes) -amount of bytes in raw color model Returns 1 if overflow possible, 0 if not. */ static int lodepng_pixel_overflow(unsigned w, unsigned h, const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) { size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); size_t numpixels, total; size_t line; /* bytes per line in worst case */ if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ /* Bytes per scanline with the expression "(w / 8) * bpp) + ((w & 7) * bpp + 7) / 8" */ if(lodepng_mulofl((size_t)(w / 8), bpp, &line)) return 1; if(lodepng_addofl(line, ((w & 7) * bpp + 7) / 8, &line)) return 1; if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ return 0; /* no overflow */ } #endif /*LODEPNG_COMPILE_DECODER*/ #endif /*LODEPNG_COMPILE_PNG*/ #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS static void LodePNGUnknownChunks_init(LodePNGInfo* info) { unsigned i; for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; } static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) { unsigned i; for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); } static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) { unsigned i; LodePNGUnknownChunks_cleanup(dest); for(i = 0; i != 3; ++i) { size_t j; dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ for(j = 0; j < src->unknown_chunks_size[i]; ++j) { dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; } } return 0; } /******************************************************************************/ static void LodePNGText_init(LodePNGInfo* info) { info->text_num = 0; info->text_keys = NULL; info->text_strings = NULL; } static void LodePNGText_cleanup(LodePNGInfo* info) { size_t i; for(i = 0; i != info->text_num; ++i) { string_cleanup(&info->text_keys[i]); string_cleanup(&info->text_strings[i]); } lodepng_free(info->text_keys); lodepng_free(info->text_strings); } static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { size_t i = 0; dest->text_keys = 0; dest->text_strings = 0; dest->text_num = 0; for(i = 0; i != source->text_num; ++i) { CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); } return 0; } void lodepng_clear_text(LodePNGInfo* info) { LodePNGText_cleanup(info); } unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) { char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); if(!new_keys || !new_strings) { lodepng_free(new_keys); lodepng_free(new_strings); return 83; /*alloc fail*/ } ++info->text_num; info->text_keys = new_keys; info->text_strings = new_strings; info->text_keys[info->text_num - 1] = alloc_string(key); info->text_strings[info->text_num - 1] = alloc_string(str); return 0; } /******************************************************************************/ static void LodePNGIText_init(LodePNGInfo* info) { info->itext_num = 0; info->itext_keys = NULL; info->itext_langtags = NULL; info->itext_transkeys = NULL; info->itext_strings = NULL; } static void LodePNGIText_cleanup(LodePNGInfo* info) { size_t i; for(i = 0; i != info->itext_num; ++i) { string_cleanup(&info->itext_keys[i]); string_cleanup(&info->itext_langtags[i]); string_cleanup(&info->itext_transkeys[i]); string_cleanup(&info->itext_strings[i]); } lodepng_free(info->itext_keys); lodepng_free(info->itext_langtags); lodepng_free(info->itext_transkeys); lodepng_free(info->itext_strings); } static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { size_t i = 0; dest->itext_keys = 0; dest->itext_langtags = 0; dest->itext_transkeys = 0; dest->itext_strings = 0; dest->itext_num = 0; for(i = 0; i != source->itext_num; ++i) { CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], source->itext_transkeys[i], source->itext_strings[i])); } return 0; } void lodepng_clear_itext(LodePNGInfo* info) { LodePNGIText_cleanup(info); } unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, const char* transkey, const char* str) { char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); if(!new_keys || !new_langtags || !new_transkeys || !new_strings) { lodepng_free(new_keys); lodepng_free(new_langtags); lodepng_free(new_transkeys); lodepng_free(new_strings); return 83; /*alloc fail*/ } ++info->itext_num; info->itext_keys = new_keys; info->itext_langtags = new_langtags; info->itext_transkeys = new_transkeys; info->itext_strings = new_strings; info->itext_keys[info->itext_num - 1] = alloc_string(key); info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); info->itext_strings[info->itext_num - 1] = alloc_string(str); return 0; } /* same as set but does not delete */ static unsigned lodepng_assign_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { info->iccp_name = alloc_string(name); info->iccp_profile = (unsigned char*)lodepng_malloc(profile_size); if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ memcpy(info->iccp_profile, profile, profile_size); info->iccp_profile_size = profile_size; return 0; /*ok*/ } unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { if(info->iccp_name) lodepng_clear_icc(info); return lodepng_assign_icc(info, name, profile, profile_size); } void lodepng_clear_icc(LodePNGInfo* info) { string_cleanup(&info->iccp_name); lodepng_free(info->iccp_profile); info->iccp_profile = NULL; info->iccp_profile_size = 0; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ void lodepng_info_init(LodePNGInfo* info) { lodepng_color_mode_init(&info->color); info->interlace_method = 0; info->compression_method = 0; info->filter_method = 0; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS info->background_defined = 0; info->background_r = info->background_g = info->background_b = 0; LodePNGText_init(info); LodePNGIText_init(info); info->time_defined = 0; info->phys_defined = 0; info->gama_defined = 0; info->chrm_defined = 0; info->srgb_defined = 0; info->iccp_defined = 0; info->iccp_name = NULL; info->iccp_profile = NULL; LodePNGUnknownChunks_init(info); #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } void lodepng_info_cleanup(LodePNGInfo* info) { lodepng_color_mode_cleanup(&info->color); #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS LodePNGText_cleanup(info); LodePNGIText_cleanup(info); lodepng_clear_icc(info); LodePNGUnknownChunks_cleanup(info); #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) { lodepng_info_cleanup(dest); *dest = *source; lodepng_color_mode_init(&dest->color); CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); if(source->iccp_defined) { CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); } LodePNGUnknownChunks_init(dest); CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ return 0; } /* ////////////////////////////////////////////////////////////////////////// */ /*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) { unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ unsigned p = index & m; in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ in = in << (bits * (m - p)); if(p == 0) out[index * bits / 8] = in; else out[index * bits / 8] |= in; } typedef struct ColorTree ColorTree; /* One node of a color tree This is the data structure used to count the number of unique colors and to get a palette index for a color. It's like an octree, but because the alpha channel is used too, each node has 16 instead of 8 children. */ struct ColorTree { ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ int index; /*the payload. Only has a meaningful value if this is in the last level*/ }; static void color_tree_init(ColorTree* tree) { int i; for(i = 0; i != 16; ++i) tree->children[i] = 0; tree->index = -1; } static void color_tree_cleanup(ColorTree* tree) { int i; for(i = 0; i != 16; ++i) { if(tree->children[i]) { color_tree_cleanup(tree->children[i]); lodepng_free(tree->children[i]); } } } /*returns -1 if color not present, its index otherwise*/ static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { int bit = 0; for(bit = 0; bit < 8; ++bit) { int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); if(!tree->children[i]) return -1; else tree = tree->children[i]; } return tree ? tree->index : -1; } #ifdef LODEPNG_COMPILE_ENCODER static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { return color_tree_get(tree, r, g, b, a) >= 0; } #endif /*LODEPNG_COMPILE_ENCODER*/ /*color is not allowed to already exist. Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ static void color_tree_add(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) { int bit; for(bit = 0; bit < 8; ++bit) { int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); if(!tree->children[i]) { tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); color_tree_init(tree->children[i]); } tree = tree->children[i]; } tree->index = (int)index; } /*put a pixel, given its RGBA color, into image of any color type*/ static unsigned rgba8ToPixel(unsigned char* out, size_t i, const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { if(mode->colortype == LCT_GREY) { unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; if(mode->bitdepth == 8) out[i] = grey; else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; else { /*take the most significant bits of grey*/ grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); addColorBits(out, i, mode->bitdepth, grey); } } else if(mode->colortype == LCT_RGB) { if(mode->bitdepth == 8) { out[i * 3 + 0] = r; out[i * 3 + 1] = g; out[i * 3 + 2] = b; } else { out[i * 6 + 0] = out[i * 6 + 1] = r; out[i * 6 + 2] = out[i * 6 + 3] = g; out[i * 6 + 4] = out[i * 6 + 5] = b; } } else if(mode->colortype == LCT_PALETTE) { int index = color_tree_get(tree, r, g, b, a); if(index < 0) return 82; /*color not in palette*/ if(mode->bitdepth == 8) out[i] = index; else addColorBits(out, i, mode->bitdepth, (unsigned)index); } else if(mode->colortype == LCT_GREY_ALPHA) { unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; if(mode->bitdepth == 8) { out[i * 2 + 0] = grey; out[i * 2 + 1] = a; } else if(mode->bitdepth == 16) { out[i * 4 + 0] = out[i * 4 + 1] = grey; out[i * 4 + 2] = out[i * 4 + 3] = a; } } else if(mode->colortype == LCT_RGBA) { if(mode->bitdepth == 8) { out[i * 4 + 0] = r; out[i * 4 + 1] = g; out[i * 4 + 2] = b; out[i * 4 + 3] = a; } else { out[i * 8 + 0] = out[i * 8 + 1] = r; out[i * 8 + 2] = out[i * 8 + 3] = g; out[i * 8 + 4] = out[i * 8 + 5] = b; out[i * 8 + 6] = out[i * 8 + 7] = a; } } return 0; /*no error*/ } /*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ static void rgba16ToPixel(unsigned char* out, size_t i, const LodePNGColorMode* mode, unsigned short r, unsigned short g, unsigned short b, unsigned short a) { if(mode->colortype == LCT_GREY) { unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; out[i * 2 + 0] = (grey >> 8) & 255; out[i * 2 + 1] = grey & 255; } else if(mode->colortype == LCT_RGB) { out[i * 6 + 0] = (r >> 8) & 255; out[i * 6 + 1] = r & 255; out[i * 6 + 2] = (g >> 8) & 255; out[i * 6 + 3] = g & 255; out[i * 6 + 4] = (b >> 8) & 255; out[i * 6 + 5] = b & 255; } else if(mode->colortype == LCT_GREY_ALPHA) { unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; out[i * 4 + 0] = (grey >> 8) & 255; out[i * 4 + 1] = grey & 255; out[i * 4 + 2] = (a >> 8) & 255; out[i * 4 + 3] = a & 255; } else if(mode->colortype == LCT_RGBA) { out[i * 8 + 0] = (r >> 8) & 255; out[i * 8 + 1] = r & 255; out[i * 8 + 2] = (g >> 8) & 255; out[i * 8 + 3] = g & 255; out[i * 8 + 4] = (b >> 8) & 255; out[i * 8 + 5] = b & 255; out[i * 8 + 6] = (a >> 8) & 255; out[i * 8 + 7] = a & 255; } } /*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a, const unsigned char* in, size_t i, const LodePNGColorMode* mode) { if(mode->colortype == LCT_GREY) { if(mode->bitdepth == 8) { *r = *g = *b = in[i]; if(mode->key_defined && *r == mode->key_r) *a = 0; else *a = 255; } else if(mode->bitdepth == 16) { *r = *g = *b = in[i * 2 + 0]; if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; else *a = 255; } else { unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ size_t j = i * mode->bitdepth; unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); *r = *g = *b = (value * 255) / highest; if(mode->key_defined && value == mode->key_r) *a = 0; else *a = 255; } } else if(mode->colortype == LCT_RGB) { if(mode->bitdepth == 8) { *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; else *a = 255; } else { *r = in[i * 6 + 0]; *g = in[i * 6 + 2]; *b = in[i * 6 + 4]; if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; else *a = 255; } } else if(mode->colortype == LCT_PALETTE) { unsigned index; if(mode->bitdepth == 8) index = in[i]; else { size_t j = i * mode->bitdepth; index = readBitsFromReversedStream(&j, in, mode->bitdepth); } if(index >= mode->palettesize) { /*This is an error according to the PNG spec, but common PNG decoders make it black instead. Done here too, slightly faster due to no error handling needed.*/ *r = *g = *b = 0; *a = 255; } else { *r = mode->palette[index * 4 + 0]; *g = mode->palette[index * 4 + 1]; *b = mode->palette[index * 4 + 2]; *a = mode->palette[index * 4 + 3]; } } else if(mode->colortype == LCT_GREY_ALPHA) { if(mode->bitdepth == 8) { *r = *g = *b = in[i * 2 + 0]; *a = in[i * 2 + 1]; } else { *r = *g = *b = in[i * 4 + 0]; *a = in[i * 4 + 2]; } } else if(mode->colortype == LCT_RGBA) { if(mode->bitdepth == 8) { *r = in[i * 4 + 0]; *g = in[i * 4 + 1]; *b = in[i * 4 + 2]; *a = in[i * 4 + 3]; } else { *r = in[i * 8 + 0]; *g = in[i * 8 + 2]; *b = in[i * 8 + 4]; *a = in[i * 8 + 6]; } } } /*Similar to getPixelColorRGBA8, but with all the for loops inside of the color mode test cases, optimized to convert the colors much faster, when converting to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with enough memory, if has_alpha is true the output is RGBA. mode has the color mode of the input buffer.*/ static void getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, unsigned has_alpha, const unsigned char* in, const LodePNGColorMode* mode) { unsigned num_channels = has_alpha ? 4 : 3; size_t i; if(mode->colortype == LCT_GREY) { if(mode->bitdepth == 8) { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i]; if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; } } else if(mode->bitdepth == 16) { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i * 2]; if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; } } else { unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ size_t j = 0; for(i = 0; i != numpixels; ++i, buffer += num_channels) { unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; } } } else if(mode->colortype == LCT_RGB) { if(mode->bitdepth == 8) { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 3 + 0]; buffer[1] = in[i * 3 + 1]; buffer[2] = in[i * 3 + 2]; if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255; } } else { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 6 + 0]; buffer[1] = in[i * 6 + 2]; buffer[2] = in[i * 6 + 4]; if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; } } } else if(mode->colortype == LCT_PALETTE) { unsigned index; size_t j = 0; for(i = 0; i != numpixels; ++i, buffer += num_channels) { if(mode->bitdepth == 8) index = in[i]; else index = readBitsFromReversedStream(&j, in, mode->bitdepth); if(index >= mode->palettesize) { /*This is an error according to the PNG spec, but most PNG decoders make it black instead. Done here too, slightly faster due to no error handling needed.*/ buffer[0] = buffer[1] = buffer[2] = 0; if(has_alpha) buffer[3] = 255; } else { buffer[0] = mode->palette[index * 4 + 0]; buffer[1] = mode->palette[index * 4 + 1]; buffer[2] = mode->palette[index * 4 + 2]; if(has_alpha) buffer[3] = mode->palette[index * 4 + 3]; } } } else if(mode->colortype == LCT_GREY_ALPHA) { if(mode->bitdepth == 8) { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; if(has_alpha) buffer[3] = in[i * 2 + 1]; } } else { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; if(has_alpha) buffer[3] = in[i * 4 + 2]; } } } else if(mode->colortype == LCT_RGBA) { if(mode->bitdepth == 8) { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 4 + 0]; buffer[1] = in[i * 4 + 1]; buffer[2] = in[i * 4 + 2]; if(has_alpha) buffer[3] = in[i * 4 + 3]; } } else { for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 8 + 0]; buffer[1] = in[i * 8 + 2]; buffer[2] = in[i * 8 + 4]; if(has_alpha) buffer[3] = in[i * 8 + 6]; } } } } /*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with given color type, but the given color type must be 16-bit itself.*/ static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, const unsigned char* in, size_t i, const LodePNGColorMode* mode) { if(mode->colortype == LCT_GREY) { *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; else *a = 65535; } else if(mode->colortype == LCT_RGB) { *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; if(mode->key_defined && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; else *a = 65535; } else if(mode->colortype == LCT_GREY_ALPHA) { *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; } else if(mode->colortype == LCT_RGBA) { *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; } } unsigned lodepng_convert(unsigned char* out, const unsigned char* in, const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, unsigned w, unsigned h) { size_t i; ColorTree tree; size_t numpixels = (size_t)w * (size_t)h; unsigned error = 0; if(lodepng_color_mode_equal(mode_out, mode_in)) { size_t numbytes = lodepng_get_raw_size(w, h, mode_in); for(i = 0; i != numbytes; ++i) out[i] = in[i]; return 0; } if(mode_out->colortype == LCT_PALETTE) { size_t palettesize = mode_out->palettesize; const unsigned char* palette = mode_out->palette; size_t palsize = (size_t)1u << mode_out->bitdepth; /*if the user specified output palette but did not give the values, assume they want the values of the input color type (assuming that one is palette). Note that we never create a new palette ourselves.*/ if(palettesize == 0) { palettesize = mode_in->palettesize; palette = mode_in->palette; /*if the input was also palette with same bitdepth, then the color types are also equal, so copy literally. This to preserve the exact indices that were in the PNG even in case there are duplicate colors in the palette.*/ if (mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { size_t numbytes = lodepng_get_raw_size(w, h, mode_in); for(i = 0; i != numbytes; ++i) out[i] = in[i]; return 0; } } if(palettesize < palsize) palsize = palettesize; color_tree_init(&tree); for(i = 0; i != palsize; ++i) { const unsigned char* p = &palette[i * 4]; color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); } } if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { for(i = 0; i != numpixels; ++i) { unsigned short r = 0, g = 0, b = 0, a = 0; getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); rgba16ToPixel(out, i, mode_out, r, g, b, a); } } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { getPixelColorsRGBA8(out, numpixels, 1, in, mode_in); } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { getPixelColorsRGBA8(out, numpixels, 0, in, mode_in); } else { unsigned char r = 0, g = 0, b = 0, a = 0; for(i = 0; i != numpixels; ++i) { getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); if (error) break; } } if(mode_out->colortype == LCT_PALETTE) { color_tree_cleanup(&tree); } return error; } /* Converts a single rgb color without alpha from one type to another, color bits truncated to their bitdepth. In case of single channel (grey or palette), only the r channel is used. Slow function, do not use to process all pixels of an image. Alpha channel not supported on purpose: this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the specification it looks like bKGD should ignore the alpha values of the palette since it can use any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ unsigned lodepng_convert_rgb( unsigned* r_out, unsigned* g_out, unsigned* b_out, unsigned r_in, unsigned g_in, unsigned b_in, const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) { unsigned r = 0, g = 0, b = 0; unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ unsigned shift = 16 - mode_out->bitdepth; if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { r = g = b = r_in * mul; } else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { r = r_in * mul; g = g_in * mul; b = b_in * mul; } else if(mode_in->colortype == LCT_PALETTE) { if(r_in >= mode_in->palettesize) return 82; r = mode_in->palette[r_in * 4 + 0] * 257u; g = mode_in->palette[r_in * 4 + 1] * 257u; b = mode_in->palette[r_in * 4 + 2] * 257u; } else { return 31; } /* now convert to output format */ if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { *r_out = r >> shift ; } else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { *r_out = r >> shift ; *g_out = g >> shift ; *b_out = b >> shift ; } else if(mode_out->colortype == LCT_PALETTE) { unsigned i; /* a 16-bit color cannot be in the palette */ if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; for(i = 0; i < mode_out->palettesize; i++) { unsigned j = i * 4; if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && (b >> 8) == mode_out->palette[j + 2]) { *r_out = i; return 0; } } return 82; } else { return 31; } return 0; } #ifdef LODEPNG_COMPILE_ENCODER void lodepng_color_profile_init(LodePNGColorProfile* profile) { profile->colored = 0; profile->key = 0; profile->key_r = profile->key_g = profile->key_b = 0; profile->alpha = 0; profile->numcolors = 0; profile->bits = 1; profile->numpixels = 0; } /*function used for debug purposes with C++*/ /*void printColorProfile(LodePNGColorProfile* p) { std::cout << "colored: " << (int)p->colored << ", "; std::cout << "key: " << (int)p->key << ", "; std::cout << "key_r: " << (int)p->key_r << ", "; std::cout << "key_g: " << (int)p->key_g << ", "; std::cout << "key_b: " << (int)p->key_b << ", "; std::cout << "alpha: " << (int)p->alpha << ", "; std::cout << "numcolors: " << (int)p->numcolors << ", "; std::cout << "bits: " << (int)p->bits << std::endl; }*/ /*Returns how many bits needed to represent given value (max 8 bit)*/ static unsigned getValueRequiredBits(unsigned char value) { if(value == 0 || value == 255) return 1; /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; return 8; } /*profile must already have been inited. It's ok to set some parameters of profile to done already.*/ unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, const unsigned char* in, unsigned w, unsigned h, const LodePNGColorMode* mode_in) { unsigned error = 0; size_t i; ColorTree tree; size_t numpixels = (size_t)w * (size_t)h; /* mark things as done already if it would be impossible to have a more expensive case */ unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; unsigned numcolors_done = 0; unsigned bpp = lodepng_get_bpp(mode_in); unsigned bits_done = (profile->bits == 1 && bpp == 1) ? 1 : 0; unsigned sixteen = 0; /* whether the input image is 16 bit */ unsigned maxnumcolors = 257; if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, profile->numcolors + (1u << bpp)); profile->numpixels += numpixels; color_tree_init(&tree); /*If the profile was already filled in from previous data, fill its palette in tree and mark things as done already if we know they are the most expensive case already*/ if(profile->alpha) alpha_done = 1; if(profile->colored) colored_done = 1; if(profile->bits == 16) numcolors_done = 1; if(profile->bits >= bpp) bits_done = 1; if(profile->numcolors >= maxnumcolors) numcolors_done = 1; if(!numcolors_done) { for(i = 0; i < profile->numcolors; i++) { const unsigned char* color = &profile->palette[i * 4]; color_tree_add(&tree, color[0], color[1], color[2], color[3], i); } } /*Check if the 16-bit input is truly 16-bit*/ if(mode_in->bitdepth == 16 && !sixteen) { unsigned short r, g, b, a; for(i = 0; i != numpixels; ++i) { getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ { profile->bits = 16; sixteen = 1; bits_done = 1; numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ break; } } } if(sixteen) { unsigned short r = 0, g = 0, b = 0, a = 0; for(i = 0; i != numpixels; ++i) { getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); if(!colored_done && (r != g || r != b)) { profile->colored = 1; colored_done = 1; } if(!alpha_done) { unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); if(a != 65535 && (a != 0 || (profile->key && !matchkey))) { profile->alpha = 1; profile->key = 0; alpha_done = 1; } else if(a == 0 && !profile->alpha && !profile->key) { profile->key = 1; profile->key_r = r; profile->key_g = g; profile->key_b = b; } else if(a == 65535 && profile->key && matchkey) { /* Color key cannot be used if an opaque pixel also has that RGB color. */ profile->alpha = 1; profile->key = 0; alpha_done = 1; } } if(alpha_done && numcolors_done && colored_done && bits_done) break; } if(profile->key && !profile->alpha) { for(i = 0; i != numpixels; ++i) { getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); if(a != 0 && r == profile->key_r && g == profile->key_g && b == profile->key_b) { /* Color key cannot be used if an opaque pixel also has that RGB color. */ profile->alpha = 1; profile->key = 0; alpha_done = 1; } } } } else /* < 16-bit */ { unsigned char r = 0, g = 0, b = 0, a = 0; for(i = 0; i != numpixels; ++i) { getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); if(!bits_done && profile->bits < 8) { /*only r is checked, < 8 bits is only relevant for greyscale*/ unsigned bits = getValueRequiredBits(r); if(bits > profile->bits) profile->bits = bits; } bits_done = (profile->bits >= bpp); if(!colored_done && (r != g || r != b)) { profile->colored = 1; colored_done = 1; if(profile->bits < 8) profile->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ } if(!alpha_done) { unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); if(a != 255 && (a != 0 || (profile->key && !matchkey))) { profile->alpha = 1; profile->key = 0; alpha_done = 1; if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ } else if(a == 0 && !profile->alpha && !profile->key) { profile->key = 1; profile->key_r = r; profile->key_g = g; profile->key_b = b; } else if(a == 255 && profile->key && matchkey) { /* Color key cannot be used if an opaque pixel also has that RGB color. */ profile->alpha = 1; profile->key = 0; alpha_done = 1; if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ } } if(!numcolors_done) { if(!color_tree_has(&tree, r, g, b, a)) { color_tree_add(&tree, r, g, b, a, profile->numcolors); if(profile->numcolors < 256) { unsigned char* p = profile->palette; unsigned n = profile->numcolors; p[n * 4 + 0] = r; p[n * 4 + 1] = g; p[n * 4 + 2] = b; p[n * 4 + 3] = a; } ++profile->numcolors; numcolors_done = profile->numcolors >= maxnumcolors; } } if(alpha_done && numcolors_done && colored_done && bits_done) break; } if(profile->key && !profile->alpha) { for(i = 0; i != numpixels; ++i) { getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); if(a != 0 && r == profile->key_r && g == profile->key_g && b == profile->key_b) { /* Color key cannot be used if an opaque pixel also has that RGB color. */ profile->alpha = 1; profile->key = 0; alpha_done = 1; if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ } } } /*make the profile's key always 16-bit for consistency - repeat each byte twice*/ profile->key_r += (profile->key_r << 8); profile->key_g += (profile->key_g << 8); profile->key_b += (profile->key_b << 8); } color_tree_cleanup(&tree); return error; } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*Adds a single color to the color profile. The profile must already have been inited. The color must be given as 16-bit (with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for all pixels of an image but only for a few additional values. */ static unsigned lodepng_color_profile_add(LodePNGColorProfile* profile, unsigned r, unsigned g, unsigned b, unsigned a) { unsigned error = 0; unsigned char image[8]; LodePNGColorMode mode; lodepng_color_mode_init(&mode); image[0] = r >> 8; image[1] = r; image[2] = g >> 8; image[3] = g; image[4] = b >> 8; image[5] = b; image[6] = a >> 8; image[7] = a; mode.bitdepth = 16; mode.colortype = LCT_RGBA; error = lodepng_get_color_profile(profile, image, 1, 1, &mode); lodepng_color_mode_cleanup(&mode); return error; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*Autochoose color model given the computed profile. mode_in is to copy palette order from when relevant.*/ static unsigned auto_choose_color_from_profile(LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, const LodePNGColorProfile* prof) { unsigned error = 0; unsigned palettebits, palette_ok; size_t i, n; size_t numpixels = prof->numpixels; unsigned alpha = prof->alpha; unsigned key = prof->key; unsigned bits = prof->bits; mode_out->key_defined = 0; if(key && numpixels <= 16) { alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ key = 0; if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ } n = prof->numcolors; palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); palette_ok = n <= 256 && bits <= 8; if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ if(!prof->colored && bits <= palettebits) palette_ok = 0; /*grey is less overhead*/ if(palette_ok) { const unsigned char* p = prof->palette; lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ for(i = 0; i != prof->numcolors; ++i) { error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); if(error) break; } mode_out->colortype = LCT_PALETTE; mode_out->bitdepth = palettebits; if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize && mode_in->bitdepth == mode_out->bitdepth) { /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ lodepng_color_mode_cleanup(mode_out); lodepng_color_mode_copy(mode_out, mode_in); } } else /*8-bit or 16-bit per channel*/ { mode_out->bitdepth = bits; mode_out->colortype = alpha ? (prof->colored ? LCT_RGBA : LCT_GREY_ALPHA) : (prof->colored ? LCT_RGB : LCT_GREY); if(key) { unsigned mask = (1u << mode_out->bitdepth) - 1u; /*profile always uses 16-bit, mask converts it*/ mode_out->key_r = prof->key_r & mask; mode_out->key_g = prof->key_g & mask; mode_out->key_b = prof->key_b & mask; mode_out->key_defined = 1; } } return error; } /*Automatically chooses color type that gives smallest amount of bits in the output image, e.g. grey if there are only greyscale pixels, palette if there are less than 256 colors, color key if only single transparent color, ... Updates values of mode with a potentially smaller color model. mode_out should contain the user chosen color model, but will be overwritten with the new chosen one.*/ unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, const unsigned char* image, unsigned w, unsigned h, const LodePNGColorMode* mode_in) { unsigned error = 0; LodePNGColorProfile prof; lodepng_color_profile_init(&prof); error = lodepng_get_color_profile(&prof, image, w, h, mode_in); if(error) return error; return auto_choose_color_from_profile(mode_out, mode_in, &prof); } #endif /* #ifdef LODEPNG_COMPILE_ENCODER */ /* Paeth predicter, used by PNG filter type 4 The parameters are of type short, but should come from unsigned chars, the shorts are only needed to make the paeth calculation correct. */ static unsigned char paethPredictor(short a, short b, short c) { short pa = abs(b - c); short pb = abs(a - c); short pc = abs(a + b - c - c); if(pc < pa && pc < pb) return (unsigned char)c; else if(pb < pa) return (unsigned char)b; else return (unsigned char)a; } /*shared values used by multiple Adam7 related functions*/ static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ /* Outputs various dimensions and positions in the image related to the Adam7 reduced images. passw: output containing the width of the 7 passes passh: output containing the height of the 7 passes filter_passstart: output containing the index of the start and end of each reduced image with filter bytes padded_passstart output containing the index of the start and end of each reduced image when without filter bytes but with padded scanlines passstart: output containing the index of the start and end of each reduced image without padding between scanlines, but still padding between the images w, h: width and height of non-interlaced image bpp: bits per pixel "padded" is only relevant if bpp is less than 8 and a scanline or image does not end at a full byte */ static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) { /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ unsigned i; /*calculate width and height in pixels of each pass*/ for(i = 0; i != 7; ++i) { passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; if(passw[i] == 0) passh[i] = 0; if(passh[i] == 0) passw[i] = 0; } filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; for(i = 0; i != 7; ++i) { /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ filter_passstart[i + 1] = filter_passstart[i] + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); /*bits padded if needed to fill full byte at end of each scanline*/ padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); /*only padded at end of reduced image*/ passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; } } #ifdef LODEPNG_COMPILE_DECODER /* ////////////////////////////////////////////////////////////////////////// */ /* / PNG Decoder / */ /* ////////////////////////////////////////////////////////////////////////// */ /*read the information from the header and store it in the LodePNGInfo. return value is error*/ unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, const unsigned char* in, size_t insize) { unsigned width, height; LodePNGInfo* info = &state->info_png; if(insize == 0 || in == 0) { CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ } if(insize < 33) { CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ } /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ /* TODO: remove this. One should use a new LodePNGState for new sessions */ lodepng_info_cleanup(info); lodepng_info_init(info); if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ } if(lodepng_chunk_length(in + 8) != 13) { CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ } if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ } /*read the values given in the header*/ width = lodepng_read32bitInt(&in[16]); height = lodepng_read32bitInt(&in[20]); info->color.bitdepth = in[24]; info->color.colortype = (LodePNGColorType)in[25]; info->compression_method = in[26]; info->filter_method = in[27]; info->interlace_method = in[28]; if(width == 0 || height == 0) { CERROR_RETURN_ERROR(state->error, 93); } if(w) *w = width; if(h) *h = height; if(!state->decoder.ignore_crc) { unsigned CRC = lodepng_read32bitInt(&in[29]); unsigned checksum = lodepng_crc32(&in[12], 17); if(CRC != checksum) { CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ } } /*error: only compression method 0 is allowed in the specification*/ if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); /*error: only filter method 0 is allowed in the specification*/ if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); /*error: only interlace methods 0 and 1 exist in the specification*/ if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); return state->error; } static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, size_t bytewidth, unsigned char filterType, size_t length) { /* For PNG filter method 0 unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, the filter works byte per byte (bytewidth = 1) precon is the previous unfiltered scanline, recon the result, scanline the current one the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead recon and scanline MAY be the same memory address! precon must be disjoint. */ size_t i; switch(filterType) { case 0: for(i = 0; i != length; ++i) recon[i] = scanline[i]; break; case 1: for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; break; case 2: if(precon) { for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; } else { for(i = 0; i != length; ++i) recon[i] = scanline[i]; } break; case 3: if(precon) { for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1); for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1); } else { for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1); } break; case 4: if(precon) { for(i = 0; i != bytewidth; ++i) { recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ } for(i = bytewidth; i < length; ++i) { recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); } } else { for(i = 0; i != bytewidth; ++i) { recon[i] = scanline[i]; } for(i = bytewidth; i < length; ++i) { /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ recon[i] = (scanline[i] + recon[i - bytewidth]); } } break; default: return 36; /*error: unexisting filter type given*/ } return 0; } static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { /* For PNG filter method 0 this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) */ unsigned y; unsigned char* prevline = 0; /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ size_t bytewidth = (bpp + 7) / 8; size_t linebytes = (w * bpp + 7) / 8; for(y = 0; y < h; ++y) { size_t outindex = linebytes * y; size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ unsigned char filterType = in[inindex]; CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); prevline = &out[outindex]; } return 0; } /* in: Adam7 interlaced image, with no padding bits between scanlines, but between reduced images so that each reduced image starts at a byte. out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h bpp: bits per pixel out has the following size in bits: w * h * bpp. in is possibly bigger due to padding bits between reduced images. out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation (because that's likely a little bit faster) NOTE: comments about padding bits are only relevant if bpp < 8 */ static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; unsigned i; Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); if(bpp >= 8) { for(i = 0; i != 7; ++i) { unsigned x, y, b; size_t bytewidth = bpp / 8; for(y = 0; y < passh[i]; ++y) for(x = 0; x < passw[i]; ++x) { size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; for(b = 0; b < bytewidth; ++b) { out[pixeloutstart + b] = in[pixelinstart + b]; } } } } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { for(i = 0; i != 7; ++i) { unsigned x, y, b; unsigned ilinebits = bpp * passw[i]; unsigned olinebits = bpp * w; size_t obp, ibp; /*bit pointers (for out and in buffer)*/ for(y = 0; y < passh[i]; ++y) for(x = 0; x < passw[i]; ++x) { ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; for(b = 0; b < bpp; ++b) { unsigned char bit = readBitFromReversedStream(&ibp, in); /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ setBitOfReversedStream0(&obp, out, bit); } } } } } static void removePaddingBits(unsigned char* out, const unsigned char* in, size_t olinebits, size_t ilinebits, unsigned h) { /* After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers for the Adam7 code, the color convert code and the output to the user. in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 only useful if (ilinebits - olinebits) is a value in the range 1..7 */ unsigned y; size_t diff = ilinebits - olinebits; size_t ibp = 0, obp = 0; /*input and output bit pointers*/ for(y = 0; y < h; ++y) { size_t x; for(x = 0; x < olinebits; ++x) { unsigned char bit = readBitFromReversedStream(&ibp, in); setBitOfReversedStream(&obp, out, bit); } ibp += diff; } } /*out must be buffer big enough to contain full image, and in must contain the full decompressed data from the IDAT chunks (with filter index bytes and possible padding bits) return value is error*/ static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, unsigned w, unsigned h, const LodePNGInfo* info_png) { /* This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. Steps: *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace NOTE: the in buffer will be overwritten with intermediate data! */ unsigned bpp = lodepng_get_bpp(&info_png->color); if(bpp == 0) return 31; /*error: invalid colortype*/ if(info_png->interlace_method == 0) { if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) { CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); } /*we can immediately filter into the out buffer, no other steps needed*/ else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); } else /*interlace_method is 1 (Adam7)*/ { unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; unsigned i; Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); for(i = 0; i != 7; ++i) { CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, move bytes instead of bits or move not at all*/ if(bpp < 8) { /*remove padding bits in scanlines; after this there still may be padding bits between the different reduced images: each reduced image still starts nicely at a byte*/ removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, ((passw[i] * bpp + 7) / 8) * 8, passh[i]); } } Adam7_deinterlace(out, in, w, h, bpp); } return 0; } static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { unsigned pos = 0, i; if(color->palette) lodepng_free(color->palette); color->palettesize = chunkLength / 3; color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize); if(!color->palette && color->palettesize) { color->palettesize = 0; return 83; /*alloc fail*/ } if(color->palettesize > 256) return 38; /*error: palette too big*/ for(i = 0; i != color->palettesize; ++i) { color->palette[4 * i + 0] = data[pos++]; /*R*/ color->palette[4 * i + 1] = data[pos++]; /*G*/ color->palette[4 * i + 2] = data[pos++]; /*B*/ color->palette[4 * i + 3] = 255; /*alpha*/ } return 0; /* OK */ } static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { unsigned i; if(color->colortype == LCT_PALETTE) { /*error: more alpha values given than there are palette entries*/ if(chunkLength > color->palettesize) return 39; for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; } else if(color->colortype == LCT_GREY) { /*error: this chunk must be 2 bytes for greyscale image*/ if(chunkLength != 2) return 30; color->key_defined = 1; color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; } else if(color->colortype == LCT_RGB) { /*error: this chunk must be 6 bytes for RGB image*/ if(chunkLength != 6) return 41; color->key_defined = 1; color->key_r = 256u * data[0] + data[1]; color->key_g = 256u * data[2] + data[3]; color->key_b = 256u * data[4] + data[5]; } else return 42; /*error: tRNS chunk not allowed for other color models*/ return 0; /* OK */ } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*background color chunk (bKGD)*/ static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { if(info->color.colortype == LCT_PALETTE) { /*error: this chunk must be 1 byte for indexed color image*/ if(chunkLength != 1) return 43; /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ if(data[0] >= info->color.palettesize) return 103; info->background_defined = 1; info->background_r = info->background_g = info->background_b = data[0]; } else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { /*error: this chunk must be 2 bytes for greyscale image*/ if(chunkLength != 2) return 44; /*the values are truncated to bitdepth in the PNG file*/ info->background_defined = 1; info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { /*error: this chunk must be 6 bytes for greyscale image*/ if(chunkLength != 6) return 45; /*the values are truncated to bitdepth in the PNG file*/ info->background_defined = 1; info->background_r = 256u * data[0] + data[1]; info->background_g = 256u * data[2] + data[3]; info->background_b = 256u * data[4] + data[5]; } return 0; /* OK */ } /*text chunk (tEXt)*/ static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { unsigned error = 0; char *key = 0, *str = 0; unsigned i; while(!error) /*not really a while loop, only used to break on error*/ { unsigned length, string2_begin; length = 0; while(length < chunkLength && data[length] != 0) ++length; /*even though it's not allowed by the standard, no error is thrown if there's no null termination char, if the text is empty*/ if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ key = (char*)lodepng_malloc(length + 1); if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ key[length] = 0; for(i = 0; i != length; ++i) key[i] = (char)data[i]; string2_begin = length + 1; /*skip keyword null terminator*/ length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); str = (char*)lodepng_malloc(length + 1); if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ str[length] = 0; for(i = 0; i != length; ++i) str[i] = (char)data[string2_begin + i]; error = lodepng_add_text(info, key, str); break; } lodepng_free(key); lodepng_free(str); return error; } /*compressed text chunk (zTXt)*/ static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, const unsigned char* data, size_t chunkLength) { unsigned error = 0; unsigned i; unsigned length, string2_begin; char *key = 0; ucvector decoded; ucvector_init(&decoded); while(!error) /*not really a while loop, only used to break on error*/ { for(length = 0; length < chunkLength && data[length] != 0; ++length) ; if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ key = (char*)lodepng_malloc(length + 1); if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ key[length] = 0; for(i = 0; i != length; ++i) key[i] = (char)data[i]; if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ string2_begin = length + 2; if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ length = (unsigned)chunkLength - string2_begin; /*will fail if zlib error, e.g. if length is too small*/ error = zlib_decompress(&decoded.data, &decoded.size, (unsigned char*)(&data[string2_begin]), length, zlibsettings); if(error) break; ucvector_push_back(&decoded, 0); error = lodepng_add_text(info, key, (char*)decoded.data); break; } lodepng_free(key); ucvector_cleanup(&decoded); return error; } /*international text chunk (iTXt)*/ static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, const unsigned char* data, size_t chunkLength) { unsigned error = 0; unsigned i; unsigned length, begin, compressed; char *key = 0, *langtag = 0, *transkey = 0; ucvector decoded; ucvector_init(&decoded); /* TODO: only use in case of compressed text */ while(!error) /*not really a while loop, only used to break on error*/ { /*Quick check if the chunk length isn't too small. Even without check it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ /*read the key*/ for(length = 0; length < chunkLength && data[length] != 0; ++length) ; if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ key = (char*)lodepng_malloc(length + 1); if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ key[length] = 0; for(i = 0; i != length; ++i) key[i] = (char)data[i]; /*read the compression method*/ compressed = data[length + 1]; if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ /*even though it's not allowed by the standard, no error is thrown if there's no null termination char, if the text is empty for the next 3 texts*/ /*read the langtag*/ begin = length + 3; length = 0; for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; langtag = (char*)lodepng_malloc(length + 1); if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ langtag[length] = 0; for(i = 0; i != length; ++i) langtag[i] = (char)data[begin + i]; /*read the transkey*/ begin += length + 1; length = 0; for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; transkey = (char*)lodepng_malloc(length + 1); if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ transkey[length] = 0; for(i = 0; i != length; ++i) transkey[i] = (char)data[begin + i]; /*read the actual text*/ begin += length + 1; length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; if(compressed) { /*will fail if zlib error, e.g. if length is too small*/ error = zlib_decompress(&decoded.data, &decoded.size, (unsigned char*)(&data[begin]), length, zlibsettings); if(error) break; if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; ucvector_push_back(&decoded, 0); } else { if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); decoded.data[length] = 0; for(i = 0; i != length; ++i) decoded.data[i] = data[begin + i]; } error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); break; } lodepng_free(key); lodepng_free(langtag); lodepng_free(transkey); ucvector_cleanup(&decoded); return error; } static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ info->time_defined = 1; info->time.year = 256u * data[0] + data[1]; info->time.month = data[2]; info->time.day = data[3]; info->time.hour = data[4]; info->time.minute = data[5]; info->time.second = data[6]; return 0; /* OK */ } static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ info->phys_defined = 1; info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; info->phys_unit = data[8]; return 0; /* OK */ } static unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ info->gama_defined = 1; info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; return 0; /* OK */ } static unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ info->chrm_defined = 1; info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; return 0; /* OK */ } static unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ info->srgb_defined = 1; info->srgb_intent = data[0]; return 0; /* OK */ } static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, const unsigned char* data, size_t chunkLength) { unsigned error = 0; unsigned i; unsigned length, string2_begin; ucvector decoded; info->iccp_defined = 1; if(info->iccp_name) lodepng_clear_icc(info); for(length = 0; length < chunkLength && data[length] != 0; ++length) ; if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ if(length < 1 || length > 79) return 89; /*keyword too short or long*/ info->iccp_name = (char*)lodepng_malloc(length + 1); if(!info->iccp_name) return 83; /*alloc fail*/ info->iccp_name[length] = 0; for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ string2_begin = length + 2; if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ length = (unsigned)chunkLength - string2_begin; ucvector_init(&decoded); error = zlib_decompress(&decoded.data, &decoded.size, (unsigned char*)(&data[string2_begin]), length, zlibsettings); if(!error) { info->iccp_profile_size = decoded.size; info->iccp_profile = (unsigned char*)lodepng_malloc(decoded.size); if(info->iccp_profile) { memcpy(info->iccp_profile, decoded.data, decoded.size); } else { error = 83; /* alloc fail */ } } ucvector_cleanup(&decoded); return error; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, const unsigned char* in, size_t insize) { const unsigned char* chunk = in + pos; unsigned chunkLength; const unsigned char* data; unsigned unhandled = 0; unsigned error = 0; if (pos + 4 > insize) return 30; chunkLength = lodepng_chunk_length(chunk); if(chunkLength > 2147483647) return 63; data = lodepng_chunk_data_const(chunk); if(data + chunkLength + 4 > in + insize) return 30; if(lodepng_chunk_type_equals(chunk, "PLTE")) { error = readChunk_PLTE(&state->info_png.color, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { error = readChunk_tRNS(&state->info_png.color, data, chunkLength); } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS else if(lodepng_chunk_type_equals(chunk, "bKGD")) { error = readChunk_bKGD(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { error = readChunk_tEXt(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "tIME")) { error = readChunk_tIME(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { error = readChunk_pHYs(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { error = readChunk_gAMA(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { error = readChunk_cHRM(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { error = readChunk_sRGB(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { error = readChunk_iCCP(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ else { /* unhandled chunk is ok (is not an error) */ unhandled = 1; } if(!error && !unhandled && !state->decoder.ignore_crc) { if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ } return error; } /*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, LodePNGState* state, const unsigned char* in, size_t insize) { unsigned char IEND = 0; const unsigned char* chunk; size_t i; ucvector idat; /*the data from idat chunks*/ ucvector scanlines; size_t predict; size_t outsize = 0; /*for unknown chunk order*/ unsigned unknown = 0; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*provide some proper output values if error will happen*/ *out = 0; state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ if(state->error) return; if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ } ucvector_init(&idat); chunk = &in[33]; /*first byte of the first chunk after the header*/ /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. IDAT data is put at the start of the in buffer*/ while(!IEND && !state->error) { unsigned chunkLength; const unsigned char* data; /*the data in the chunk*/ /*error: size of the in buffer too small to contain next chunk*/ if((size_t)((chunk - in) + 12) > insize || chunk < in) { if(state->decoder.ignore_end) break; /*other errors may still happen though*/ CERROR_BREAK(state->error, 30); } /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ chunkLength = lodepng_chunk_length(chunk); /*error: chunk length larger than the max PNG chunk size*/ if(chunkLength > 2147483647) { if(state->decoder.ignore_end) break; /*other errors may still happen though*/ CERROR_BREAK(state->error, 63); } if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) { CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ } data = lodepng_chunk_data_const(chunk); unknown = 0; /*IDAT chunk, containing compressed image data*/ if(lodepng_chunk_type_equals(chunk, "IDAT")) { size_t oldsize = idat.size; size_t newsize; if(lodepng_addofl(oldsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); if(!ucvector_resize(&idat, newsize)) CERROR_BREAK(state->error, 83 /*alloc fail*/); for(i = 0; i != chunkLength; ++i) idat.data[oldsize + i] = data[i]; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS critical_pos = 3; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } /*IEND chunk*/ else if(lodepng_chunk_type_equals(chunk, "IEND")) { IEND = 1; } /*palette chunk (PLTE)*/ else if(lodepng_chunk_type_equals(chunk, "PLTE")) { state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); if(state->error) break; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS critical_pos = 2; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that affects the alpha channel of pixels. */ else if(lodepng_chunk_type_equals(chunk, "tRNS")) { state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); if(state->error) break; } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*background color chunk (bKGD)*/ else if(lodepng_chunk_type_equals(chunk, "bKGD")) { state->error = readChunk_bKGD(&state->info_png, data, chunkLength); if(state->error) break; } /*text chunk (tEXt)*/ else if(lodepng_chunk_type_equals(chunk, "tEXt")) { if(state->decoder.read_text_chunks) { state->error = readChunk_tEXt(&state->info_png, data, chunkLength); if(state->error) break; } } /*compressed text chunk (zTXt)*/ else if(lodepng_chunk_type_equals(chunk, "zTXt")) { if(state->decoder.read_text_chunks) { state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); if(state->error) break; } } /*international text chunk (iTXt)*/ else if(lodepng_chunk_type_equals(chunk, "iTXt")) { if(state->decoder.read_text_chunks) { state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); if(state->error) break; } } else if(lodepng_chunk_type_equals(chunk, "tIME")) { state->error = readChunk_tIME(&state->info_png, data, chunkLength); if(state->error) break; } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { state->error = readChunk_pHYs(&state->info_png, data, chunkLength); if(state->error) break; } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { state->error = readChunk_gAMA(&state->info_png, data, chunkLength); if(state->error) break; } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { state->error = readChunk_cHRM(&state->info_png, data, chunkLength); if(state->error) break; } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { state->error = readChunk_sRGB(&state->info_png, data, chunkLength); if(state->error) break; } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { state->error = readChunk_iCCP(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); if(state->error) break; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { CERROR_BREAK(state->error, 69); } unknown = 1; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS if(state->decoder.remember_unknown_chunks) { state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); if(state->error) break; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ { if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ } if(!IEND) chunk = lodepng_chunk_next_const(chunk); } ucvector_init(&scanlines); /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. If the decompressed size does not match the prediction, the image must be corrupt.*/ if(state->info_png.interlace_method == 0) { predict = lodepng_get_raw_size_idat(*w, *h, &state->info_png.color); } else { /*Adam-7 interlaced: predicted size is the sum of the 7 sub-images sizes*/ const LodePNGColorMode* color = &state->info_png.color; predict = 0; predict += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, color); if(*w > 4) predict += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, color); predict += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, color); if(*w > 2) predict += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, color); predict += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, color); if(*w > 1) predict += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, color); predict += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, color); } if(!state->error && !ucvector_reserve(&scanlines, predict)) state->error = 83; /*alloc fail*/ if(!state->error) { state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, idat.size, &state->decoder.zlibsettings); if(!state->error && scanlines.size != predict) state->error = 91; /*decompressed size doesn't match prediction*/ } ucvector_cleanup(&idat); if(!state->error) { outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); *out = (unsigned char*)lodepng_malloc(outsize); if(!*out) state->error = 83; /*alloc fail*/ } if(!state->error) { for(i = 0; i < outsize; i++) (*out)[i] = 0; state->error = postProcessScanlines(*out, scanlines.data, *w, *h, &state->info_png); } ucvector_cleanup(&scanlines); } unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, LodePNGState* state, const unsigned char* in, size_t insize) { *out = 0; decodeGeneric(out, w, h, state, in, insize); if(state->error) return state->error; if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { /*same color type, no copying or converting of data needed*/ /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype the raw image has to the end user*/ if(!state->decoder.color_convert) { state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); if(state->error) return state->error; } } else { /*color conversion needed; sort of copy of the data*/ unsigned char* data = *out; size_t outsize; /*TODO: check if this works according to the statement in the documentation: "The converter can convert from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) && !(state->info_raw.bitdepth == 8)) { return 56; /*unsupported color mode conversion*/ } outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); *out = (unsigned char*)lodepng_malloc(outsize); if(!(*out)) { state->error = 83; /*alloc fail*/ } else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h); lodepng_free(data); } return state->error; } unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize, LodePNGColorType colortype, unsigned bitdepth) { unsigned error; LodePNGState state; lodepng_state_init(&state); state.info_raw.colortype = colortype; state.info_raw.bitdepth = bitdepth; error = lodepng_decode(out, w, h, &state, in, insize); lodepng_state_cleanup(&state); return error; } unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); } unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); } #ifdef LODEPNG_COMPILE_DISK unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, LodePNGColorType colortype, unsigned bitdepth) { unsigned char* buffer = 0; size_t buffersize; unsigned error; error = lodepng_load_file(&buffer, &buffersize, filename); if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); lodepng_free(buffer); return error; } unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); } unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); } #endif /*LODEPNG_COMPILE_DISK*/ void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) { settings->color_convert = 1; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS settings->read_text_chunks = 1; settings->remember_unknown_chunks = 0; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ settings->ignore_crc = 0; settings->ignore_critical = 0; settings->ignore_end = 0; lodepng_decompress_settings_init(&settings->zlibsettings); } #endif /*LODEPNG_COMPILE_DECODER*/ #if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) void lodepng_state_init(LodePNGState* state) { #ifdef LODEPNG_COMPILE_DECODER lodepng_decoder_settings_init(&state->decoder); #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER lodepng_encoder_settings_init(&state->encoder); #endif /*LODEPNG_COMPILE_ENCODER*/ lodepng_color_mode_init(&state->info_raw); lodepng_info_init(&state->info_png); state->error = 1; } void lodepng_state_cleanup(LodePNGState* state) { lodepng_color_mode_cleanup(&state->info_raw); lodepng_info_cleanup(&state->info_png); } void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) { lodepng_state_cleanup(dest); *dest = *source; lodepng_color_mode_init(&dest->info_raw); lodepng_info_init(&dest->info_png); dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; } #endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ #ifdef LODEPNG_COMPILE_ENCODER /* ////////////////////////////////////////////////////////////////////////// */ /* / PNG Encoder / */ /* ////////////////////////////////////////////////////////////////////////// */ /*chunkName must be string of 4 characters*/ static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) { CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); out->allocsize = out->size; /*fix the allocsize again*/ return 0; } static void writeSignature(ucvector* out) { /*8 bytes PNG signature, aka the magic bytes*/ ucvector_push_back(out, 137); ucvector_push_back(out, 80); ucvector_push_back(out, 78); ucvector_push_back(out, 71); ucvector_push_back(out, 13); ucvector_push_back(out, 10); ucvector_push_back(out, 26); ucvector_push_back(out, 10); } static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) { unsigned error = 0; ucvector header; ucvector_init(&header); lodepng_add32bitInt(&header, w); /*width*/ lodepng_add32bitInt(&header, h); /*height*/ ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ ucvector_push_back(&header, 0); /*compression method*/ ucvector_push_back(&header, 0); /*filter method*/ ucvector_push_back(&header, interlace_method); /*interlace method*/ error = addChunk(out, "IHDR", header.data, header.size); ucvector_cleanup(&header); return error; } static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) { unsigned error = 0; size_t i; ucvector PLTE; ucvector_init(&PLTE); for(i = 0; i != info->palettesize * 4; ++i) { /*add all channels except alpha channel*/ if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); } error = addChunk(out, "PLTE", PLTE.data, PLTE.size); ucvector_cleanup(&PLTE); return error; } static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) { unsigned error = 0; size_t i; ucvector tRNS; ucvector_init(&tRNS); if(info->colortype == LCT_PALETTE) { size_t amount = info->palettesize; /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ for(i = info->palettesize; i != 0; --i) { if(info->palette[4 * (i - 1) + 3] == 255) --amount; else break; } /*add only alpha channel*/ for(i = 0; i != amount; ++i) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); } else if(info->colortype == LCT_GREY) { if(info->key_defined) { ucvector_push_back(&tRNS, (unsigned char)(info->key_r >> 8)); ucvector_push_back(&tRNS, (unsigned char)(info->key_r & 255)); } } else if(info->colortype == LCT_RGB) { if(info->key_defined) { ucvector_push_back(&tRNS, (unsigned char)(info->key_r >> 8)); ucvector_push_back(&tRNS, (unsigned char)(info->key_r & 255)); ucvector_push_back(&tRNS, (unsigned char)(info->key_g >> 8)); ucvector_push_back(&tRNS, (unsigned char)(info->key_g & 255)); ucvector_push_back(&tRNS, (unsigned char)(info->key_b >> 8)); ucvector_push_back(&tRNS, (unsigned char)(info->key_b & 255)); } } error = addChunk(out, "tRNS", tRNS.data, tRNS.size); ucvector_cleanup(&tRNS); return error; } static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, LodePNGCompressSettings* zlibsettings) { ucvector zlibdata; unsigned error = 0; /*compress with the Zlib compressor*/ ucvector_init(&zlibdata); error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); ucvector_cleanup(&zlibdata); return error; } static unsigned addChunk_IEND(ucvector* out) { unsigned error = 0; error = addChunk(out, "IEND", 0, 0); return error; } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) { unsigned error = 0; size_t i; ucvector text; ucvector_init(&text); for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)keyword[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&text, 0); /*0 termination char*/ for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)textstring[i]); error = addChunk(out, "tEXt", text.data, text.size); ucvector_cleanup(&text); return error; } static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, LodePNGCompressSettings* zlibsettings) { unsigned error = 0; ucvector data, compressed; size_t i, textsize = strlen(textstring); ucvector_init(&data); ucvector_init(&compressed); for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&data, 0); /*0 termination char*/ ucvector_push_back(&data, 0); /*compression method: 0*/ error = zlib_compress(&compressed.data, &compressed.size, (unsigned char*)textstring, textsize, zlibsettings); if(!error) { for(i = 0; i != compressed.size; ++i) ucvector_push_back(&data, compressed.data[i]); error = addChunk(out, "zTXt", data.data, data.size); } ucvector_cleanup(&compressed); ucvector_cleanup(&data); return error; } static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) { unsigned error = 0; ucvector data; size_t i, textsize = strlen(textstring); ucvector_init(&data); for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&data, 0); /*null termination char*/ ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ ucvector_push_back(&data, 0); /*compression method*/ for(i = 0; langtag[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)langtag[i]); ucvector_push_back(&data, 0); /*null termination char*/ for(i = 0; transkey[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)transkey[i]); ucvector_push_back(&data, 0); /*null termination char*/ if(compressed) { ucvector compressed_data; ucvector_init(&compressed_data); error = zlib_compress(&compressed_data.data, &compressed_data.size, (unsigned char*)textstring, textsize, zlibsettings); if(!error) { for(i = 0; i != compressed_data.size; ++i) ucvector_push_back(&data, compressed_data.data[i]); } ucvector_cleanup(&compressed_data); } else /*not compressed*/ { for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)textstring[i]); } if(!error) error = addChunk(out, "iTXt", data.data, data.size); ucvector_cleanup(&data); return error; } static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) { unsigned error = 0; ucvector bKGD; ucvector_init(&bKGD); if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { ucvector_push_back(&bKGD, (unsigned char)(info->background_r >> 8)); ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { ucvector_push_back(&bKGD, (unsigned char)(info->background_r >> 8)); ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); ucvector_push_back(&bKGD, (unsigned char)(info->background_g >> 8)); ucvector_push_back(&bKGD, (unsigned char)(info->background_g & 255)); ucvector_push_back(&bKGD, (unsigned char)(info->background_b >> 8)); ucvector_push_back(&bKGD, (unsigned char)(info->background_b & 255)); } else if(info->color.colortype == LCT_PALETTE) { ucvector_push_back(&bKGD, (unsigned char)(info->background_r & 255)); /*palette index*/ } error = addChunk(out, "bKGD", bKGD.data, bKGD.size); ucvector_cleanup(&bKGD); return error; } static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) { unsigned error = 0; unsigned char* data = (unsigned char*)lodepng_malloc(7); if(!data) return 83; /*alloc fail*/ data[0] = (unsigned char)(time->year >> 8); data[1] = (unsigned char)(time->year & 255); data[2] = (unsigned char)time->month; data[3] = (unsigned char)time->day; data[4] = (unsigned char)time->hour; data[5] = (unsigned char)time->minute; data[6] = (unsigned char)time->second; error = addChunk(out, "tIME", data, 7); lodepng_free(data); return error; } static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) { unsigned error = 0; ucvector data; ucvector_init(&data); lodepng_add32bitInt(&data, info->phys_x); lodepng_add32bitInt(&data, info->phys_y); ucvector_push_back(&data, info->phys_unit); error = addChunk(out, "pHYs", data.data, data.size); ucvector_cleanup(&data); return error; } static unsigned addChunk_gAMA(ucvector* out, const LodePNGInfo* info) { unsigned error = 0; ucvector data; ucvector_init(&data); lodepng_add32bitInt(&data, info->gama_gamma); error = addChunk(out, "gAMA", data.data, data.size); ucvector_cleanup(&data); return error; } static unsigned addChunk_cHRM(ucvector* out, const LodePNGInfo* info) { unsigned error = 0; ucvector data; ucvector_init(&data); lodepng_add32bitInt(&data, info->chrm_white_x); lodepng_add32bitInt(&data, info->chrm_white_y); lodepng_add32bitInt(&data, info->chrm_red_x); lodepng_add32bitInt(&data, info->chrm_red_y); lodepng_add32bitInt(&data, info->chrm_green_x); lodepng_add32bitInt(&data, info->chrm_green_y); lodepng_add32bitInt(&data, info->chrm_blue_x); lodepng_add32bitInt(&data, info->chrm_blue_y); error = addChunk(out, "cHRM", data.data, data.size); ucvector_cleanup(&data); return error; } static unsigned addChunk_sRGB(ucvector* out, const LodePNGInfo* info) { unsigned char data = info->srgb_intent; return addChunk(out, "sRGB", &data, 1); } static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCompressSettings* zlibsettings) { unsigned error = 0; ucvector data, compressed; size_t i; ucvector_init(&data); ucvector_init(&compressed); for(i = 0; info->iccp_name[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)info->iccp_name[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&data, 0); /*0 termination char*/ ucvector_push_back(&data, 0); /*compression method: 0*/ error = zlib_compress(&compressed.data, &compressed.size, info->iccp_profile, info->iccp_profile_size, zlibsettings); if(!error) { for(i = 0; i != compressed.size; ++i) ucvector_push_back(&data, compressed.data[i]); error = addChunk(out, "iCCP", data.data, data.size); } ucvector_cleanup(&compressed); ucvector_cleanup(&data); return error; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, size_t length, size_t bytewidth, unsigned char filterType) { size_t i; switch(filterType) { case 0: /*None*/ for(i = 0; i != length; ++i) out[i] = scanline[i]; break; case 1: /*Sub*/ for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; break; case 2: /*Up*/ if(prevline) { for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; } else { for(i = 0; i != length; ++i) out[i] = scanline[i]; } break; case 3: /*Average*/ if(prevline) { for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); } else { for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); } break; case 4: /*Paeth*/ if(prevline) { /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); for(i = bytewidth; i < length; ++i) { out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); } } else { for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); } break; default: return; /*unexisting filter type given*/ } } /* log2 approximation. A slight bit faster than std::log. */ static float flog2(float f) { float result = 0; while(f > 32) { result += 4; f /= 16; } while(f > 2) { ++result; f /= 2; } return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); } static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) { /* For PNG filter method 0 out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are the scanlines with 1 extra byte per scanline */ unsigned bpp = lodepng_get_bpp(info); /*the width of a scanline in bytes, not including the filter type*/ size_t linebytes = (w * bpp + 7) / 8; /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ size_t bytewidth = (bpp + 7) / 8; const unsigned char* prevline = 0; unsigned x, y; unsigned error = 0; LodePNGFilterStrategy strategy = settings->filter_strategy; /* There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. use fixed filtering, with the filter None). * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply all five filters and select the filter that produces the smallest sum of absolute values per row. This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum heuristic is used. */ if(settings->filter_palette_zero && (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO; if(bpp == 0) return 31; /*error: invalid color type*/ if(strategy == LFS_ZERO) { for(y = 0; y != h; ++y) { size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ size_t inindex = linebytes * y; out[outindex] = 0; /*filter type byte*/ filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0); prevline = &in[inindex]; } } else if(strategy == LFS_MINSUM) { /*adaptive filtering*/ size_t sum[5]; unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ size_t smallest = 0; unsigned char type, bestType = 0; for(type = 0; type != 5; ++type) { attempt[type] = (unsigned char*)lodepng_malloc(linebytes); if(!attempt[type]) return 83; /*alloc fail*/ } if(!error) { for(y = 0; y != h; ++y) { /*try the 5 filter types*/ for(type = 0; type != 5; ++type) { filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); /*calculate the sum of the result*/ sum[type] = 0; if(type == 0) { for(x = 0; x != linebytes; ++x) sum[type] += (unsigned char)(attempt[type][x]); } else { for(x = 0; x != linebytes; ++x) { /*For differences, each byte should be treated as signed, values above 127 are negative (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. This means filtertype 0 is almost never chosen, but that is justified.*/ unsigned char s = attempt[type][x]; sum[type] += s < 128 ? s : (255U - s); } } /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ if(type == 0 || sum[type] < smallest) { bestType = type; smallest = sum[type]; } } prevline = &in[y * linebytes]; /*now fill the out values*/ out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; } } for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); } else if(strategy == LFS_ENTROPY) { float sum[5]; unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ float smallest = 0; unsigned type, bestType = 0; unsigned count[256]; for(type = 0; type != 5; ++type) { attempt[type] = (unsigned char*)lodepng_malloc(linebytes); if(!attempt[type]) return 83; /*alloc fail*/ } for(y = 0; y != h; ++y) { /*try the 5 filter types*/ for(type = 0; type != 5; ++type) { filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); for(x = 0; x != 256; ++x) count[x] = 0; for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; ++count[type]; /*the filter type itself is part of the scanline*/ sum[type] = 0; for(x = 0; x != 256; ++x) { float p = count[x] / (float)(linebytes + 1); sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; } /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ if(type == 0 || sum[type] < smallest) { bestType = type; smallest = sum[type]; } } prevline = &in[y * linebytes]; /*now fill the out values*/ out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; } for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); } else if(strategy == LFS_PREDEFINED) { for(y = 0; y != h; ++y) { size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ size_t inindex = linebytes * y; unsigned char type = settings->predefined_filters[y]; out[outindex] = type; /*filter type byte*/ filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); prevline = &in[inindex]; } } else if(strategy == LFS_BRUTE_FORCE) { /*brute force filter chooser. deflate the scanline after every filter attempt to see which one deflates best. This is very slow and gives only slightly smaller, sometimes even larger, result*/ size_t size[5]; unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ size_t smallest = 0; unsigned type = 0, bestType = 0; unsigned char* dummy; LodePNGCompressSettings zlibsettings = settings->zlibsettings; /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, to simulate the true case where the tree is the same for the whole image. Sometimes it gives better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare cases better compression. It does make this a bit less slow, so it's worth doing this.*/ zlibsettings.btype = 1; /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG images only, so disable it*/ zlibsettings.custom_zlib = 0; zlibsettings.custom_deflate = 0; for(type = 0; type != 5; ++type) { attempt[type] = (unsigned char*)lodepng_malloc(linebytes); if(!attempt[type]) return 83; /*alloc fail*/ } for(y = 0; y != h; ++y) /*try the 5 filter types*/ { for(type = 0; type != 5; ++type) { unsigned testsize = (unsigned)linebytes; /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); size[type] = 0; dummy = 0; zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); lodepng_free(dummy); /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ if(type == 0 || size[type] < smallest) { bestType = type; smallest = size[type]; } } prevline = &in[y * linebytes]; out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; } for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); } else return 88; /* unknown filter strategy */ return error; } static void addPaddingBits(unsigned char* out, const unsigned char* in, size_t olinebits, size_t ilinebits, unsigned h) { /*The opposite of the removePaddingBits function olinebits must be >= ilinebits*/ unsigned y; size_t diff = olinebits - ilinebits; size_t obp = 0, ibp = 0; /*bit pointers*/ for(y = 0; y != h; ++y) { size_t x; for(x = 0; x < ilinebits; ++x) { unsigned char bit = readBitFromReversedStream(&ibp, in); setBitOfReversedStream(&obp, out, bit); } /*obp += diff; --> no, fill in some value in the padding bits too, to avoid "Use of uninitialised value of size ###" warning from valgrind*/ for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); } } /* in: non-interlaced image with size w*h out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with no padding bits between scanlines, but between reduced images so that each reduced image starts at a byte. bpp: bits per pixel there are no padding bits, not between scanlines, not between reduced images in has the following size in bits: w * h * bpp. out is possibly bigger due to padding bits between reduced images NOTE: comments about padding bits are only relevant if bpp < 8 */ static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; unsigned i; Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); if(bpp >= 8) { for(i = 0; i != 7; ++i) { unsigned x, y, b; size_t bytewidth = bpp / 8; for(y = 0; y < passh[i]; ++y) for(x = 0; x < passw[i]; ++x) { size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; for(b = 0; b < bytewidth; ++b) { out[pixeloutstart + b] = in[pixelinstart + b]; } } } } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { for(i = 0; i != 7; ++i) { unsigned x, y, b; unsigned ilinebits = bpp * passw[i]; unsigned olinebits = bpp * w; size_t obp, ibp; /*bit pointers (for out and in buffer)*/ for(y = 0; y < passh[i]; ++y) for(x = 0; x < passw[i]; ++x) { ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); for(b = 0; b < bpp; ++b) { unsigned char bit = readBitFromReversedStream(&ibp, in); setBitOfReversedStream(&obp, out, bit); } } } } } /*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. return value is error**/ static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, unsigned w, unsigned h, const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) { /* This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter */ unsigned bpp = lodepng_get_bpp(&info_png->color); unsigned error = 0; if(info_png->interlace_method == 0) { *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ *out = (unsigned char*)lodepng_malloc(*outsize); if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ if(!error) { /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) { unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8)); if(!padded) error = 83; /*alloc fail*/ if(!error) { addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); error = filter(*out, padded, w, h, &info_png->color, settings); } lodepng_free(padded); } else { /*we can immediately filter into the out buffer, no other steps needed*/ error = filter(*out, in, w, h, &info_png->color, settings); } } } else /*interlace_method is 1 (Adam7)*/ { unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; unsigned char* adam7; Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ *out = (unsigned char*)lodepng_malloc(*outsize); if(!(*out)) error = 83; /*alloc fail*/ adam7 = (unsigned char*)lodepng_malloc(passstart[7]); if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ if(!error) { unsigned i; Adam7_interlace(adam7, in, w, h, bpp); for(i = 0; i != 7; ++i) { if(bpp < 8) { unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); if(!padded) ERROR_BREAK(83); /*alloc fail*/ addPaddingBits(padded, &adam7[passstart[i]], ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); error = filter(&(*out)[filter_passstart[i]], padded, passw[i], passh[i], &info_png->color, settings); lodepng_free(padded); } else { error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], passw[i], passh[i], &info_png->color, settings); } if(error) break; } } lodepng_free(adam7); } return error; } /* palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... returns 0 if the palette is opaque, returns 1 if the palette has a single color with alpha 0 ==> color key returns 2 if the palette is semi-translucent. */ static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) { size_t i; unsigned key = 0; unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ for(i = 0; i != palettesize; ++i) { if(!key && palette[4 * i + 3] == 0) { r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; key = 1; i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ } else if(palette[4 * i + 3] != 255) return 2; /*when key, no opaque RGB may have key's RGB*/ else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; } return key; } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) { unsigned char* inchunk = data; while((size_t)(inchunk - data) < datasize) { CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); out->allocsize = out->size; /*fix the allocsize again*/ inchunk = lodepng_chunk_next(inchunk); } return 0; } static unsigned isGreyICCProfile(const unsigned char* profile, unsigned size) { /* It is a grey profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 are "RGB ". We do not perform any full parsing of the ICC profile here, other than check those 4 bytes to grayscale profile. Other than that, validity of the profile is not checked. This is needed only because the PNG specification requires using a non-grey color model if there is an ICC profile with "RGB " (sadly limiting compression opportunities if the input data is greyscale RGB data), and requires using a grey color model if it is "GRAY". */ if(size < 20) return 0; return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; } static unsigned isRGBICCProfile(const unsigned char* profile, unsigned size) { /* See comment in isGreyICCProfile*/ if(size < 20) return 0; return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ unsigned lodepng_encode(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h, LodePNGState* state) { unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ size_t datasize = 0; ucvector outv; LodePNGInfo info; ucvector_init(&outv); lodepng_info_init(&info); /*provide some proper output values if error will happen*/ *out = 0; *outsize = 0; state->error = 0; /*check input values validity*/ if((state->info_png.color.colortype == LCT_PALETTE || state->encoder.force_palette) && (state->info_png.color.palettesize == 0 || state->info_png.color.palettesize > 256)) { state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ goto cleanup; } if(state->encoder.zlibsettings.btype > 2) { state->error = 61; /*error: unexisting btype*/ goto cleanup; } if(state->info_png.interlace_method > 1) { state->error = 71; /*error: unexisting interlace mode*/ goto cleanup; } state->error = checkColorValidity(state->info_png.color.colortype, state->info_png.color.bitdepth); if(state->error) goto cleanup; /*error: unexisting color type given*/ state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); if(state->error) goto cleanup; /*error: unexisting color type given*/ /* color convert and compute scanline filter types */ lodepng_info_copy(&info, &state->info_png); if(state->encoder.auto_convert) { #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS if(state->info_png.background_defined) { unsigned bg_r = state->info_png.background_r; unsigned bg_g = state->info_png.background_g; unsigned bg_b = state->info_png.background_b; unsigned r = 0, g = 0, b = 0; LodePNGColorProfile prof; LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); lodepng_convert_rgb(&r, &g, &b, bg_r, bg_g, bg_b, &mode16, &state->info_png.color); lodepng_color_profile_init(&prof); state->error = lodepng_get_color_profile(&prof, image, w, h, &state->info_raw); if(state->error) goto cleanup; lodepng_color_profile_add(&prof, r, g, b, 65535); state->error = auto_choose_color_from_profile(&info.color, &state->info_raw, &prof); if(state->error) goto cleanup; if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, bg_r, bg_g, bg_b, &info.color, &state->info_png.color)) { state->error = 104; goto cleanup; } } else #endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ { state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw); if(state->error) goto cleanup; } } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS if(state->info_png.iccp_defined) { unsigned grey_icc = isGreyICCProfile(state->info_png.iccp_profile, state->info_png.iccp_profile_size); unsigned grey_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; /* TODO: perhaps instead of giving errors or less optimal compression, we can automatically modify the ICC profile here to say "GRAY" or "RGB " to match the PNG color type, unless this will require non trivial changes to the rest of the ICC profile */ if(!grey_icc && !isRGBICCProfile(state->info_png.iccp_profile, state->info_png.iccp_profile_size)) { state->error = 100; /* Disallowed profile color type for PNG */ goto cleanup; } if(!state->encoder.auto_convert && grey_icc != grey_png) { /* Non recoverable: encoder not allowed to convert color type, and requested color type not compatible with ICC color type */ state->error = 101; goto cleanup; } if(grey_icc && !grey_png) { /* Non recoverable: trying to set greyscale ICC profile while colored pixels were given */ state->error = 102; goto cleanup; /* NOTE: this relies on the fact that lodepng_auto_choose_color never returns palette for greyscale pixels */ } if(!grey_icc && grey_png) { /* Recoverable but an unfortunate loss in compression density: We have greyscale pixels but are forced to store them in more expensive RGB format that will repeat each value 3 times because the PNG spec does not allow an RGB ICC profile with internal greyscale color data */ if(info.color.colortype == LCT_GREY) info.color.colortype = LCT_RGB; if(info.color.colortype == LCT_GREY_ALPHA) info.color.colortype = LCT_RGBA; if(info.color.bitdepth < 8) info.color.bitdepth = 8; } } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { unsigned char* converted; size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7) / 8; converted = (unsigned char*)lodepng_malloc(size); if(!converted && size) state->error = 83; /*alloc fail*/ if(!state->error) { state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); } if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); lodepng_free(converted); if(state->error) goto cleanup; } else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); /* output all PNG chunks */ { #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS size_t i; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*write signature and chunks*/ writeSignature(&outv); /*IHDR*/ addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*unknown chunks between IHDR and PLTE*/ if(info.unknown_chunks_data[0]) { state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); if(state->error) goto cleanup; } /*color profile chunks must come before PLTE */ if(info.iccp_defined) addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); if(info.srgb_defined) addChunk_sRGB(&outv, &info); if(info.gama_defined) addChunk_gAMA(&outv, &info); if(info.chrm_defined) addChunk_cHRM(&outv, &info); #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*PLTE*/ if(info.color.colortype == LCT_PALETTE) { addChunk_PLTE(&outv, &info.color); } if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { addChunk_PLTE(&outv, &info.color); } /*tRNS*/ if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) { addChunk_tRNS(&outv, &info.color); } if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) { addChunk_tRNS(&outv, &info.color); } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*bKGD (must come between PLTE and the IDAt chunks*/ if(info.background_defined) { state->error = addChunk_bKGD(&outv, &info); if(state->error) goto cleanup; } /*pHYs (must come before the IDAT chunks)*/ if(info.phys_defined) addChunk_pHYs(&outv, &info); /*unknown chunks between PLTE and IDAT*/ if(info.unknown_chunks_data[1]) { state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); if(state->error) goto cleanup; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*IDAT (multiple IDAT chunks must be consecutive)*/ state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); if(state->error) goto cleanup; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*tIME*/ if(info.time_defined) addChunk_tIME(&outv, &info.time); /*tEXt and/or zTXt*/ for(i = 0; i != info.text_num; ++i) { if(strlen(info.text_keys[i]) > 79) { state->error = 66; /*text chunk too large*/ goto cleanup; } if(strlen(info.text_keys[i]) < 1) { state->error = 67; /*text chunk too small*/ goto cleanup; } if(state->encoder.text_compression) { addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); } else { addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); } } /*LodePNG version id in text chunk*/ if(state->encoder.add_id) { unsigned already_added_id_text = 0; for(i = 0; i != info.text_num; ++i) { if(!strcmp(info.text_keys[i], "LodePNG")) { already_added_id_text = 1; break; } } if(already_added_id_text == 0) { addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ } } /*iTXt*/ for(i = 0; i != info.itext_num; ++i) { if(strlen(info.itext_keys[i]) > 79) { state->error = 66; /*text chunk too large*/ goto cleanup; } if(strlen(info.itext_keys[i]) < 1) { state->error = 67; /*text chunk too small*/ goto cleanup; } addChunk_iTXt(&outv, state->encoder.text_compression, info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], &state->encoder.zlibsettings); } /*unknown chunks between IDAT and IEND*/ if(info.unknown_chunks_data[2]) { state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); if(state->error) goto cleanup; } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ addChunk_IEND(&outv); } cleanup: lodepng_info_cleanup(&info); lodepng_free(data); /*instead of cleaning the vector up, give it to the output*/ *out = outv.data; *outsize = outv.size; return state->error; } unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { unsigned error; LodePNGState state; lodepng_state_init(&state); state.info_raw.colortype = colortype; state.info_raw.bitdepth = bitdepth; state.info_png.color.colortype = colortype; state.info_png.color.bitdepth = bitdepth; lodepng_encode(out, outsize, image, w, h, &state); error = state.error; lodepng_state_cleanup(&state); return error; } unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); } unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); } #ifdef LODEPNG_COMPILE_DISK unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { unsigned char* buffer; size_t buffersize; unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); if(!error) error = lodepng_save_file(buffer, buffersize, filename); lodepng_free(buffer); return error; } unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); } unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); } #endif /*LODEPNG_COMPILE_DISK*/ void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) { lodepng_compress_settings_init(&settings->zlibsettings); settings->filter_palette_zero = 1; settings->filter_strategy = LFS_MINSUM; settings->auto_convert = 1; settings->force_palette = 0; settings->predefined_filters = 0; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS settings->add_id = 0; settings->text_compression = 1; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } #endif /*LODEPNG_COMPILE_ENCODER*/ #endif /*LODEPNG_COMPILE_PNG*/ #ifdef LODEPNG_COMPILE_ERROR_TEXT /* This returns the description of a numerical error code in English. This is also the documentation of all the error codes. */ const char* lodepng_error_text(unsigned code) { switch(code) { case 0: return "no error, everything went ok"; case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ case 13: return "problem while processing dynamic deflate block"; case 14: return "problem while processing dynamic deflate block"; case 15: return "problem while processing dynamic deflate block"; case 16: return "unexisting code while processing dynamic deflate block"; case 17: return "end of out buffer memory reached while inflating"; case 18: return "invalid distance code while inflating"; case 19: return "end of out buffer memory reached while inflating"; case 20: return "invalid deflate block BTYPE encountered while decoding"; case 21: return "NLEN is not ones complement of LEN in a deflate block"; /*end of out buffer memory reached while inflating: This can happen if the inflated deflate data is longer than the amount of bytes required to fill up all the pixels of the image, given the color depth and image dimensions. Something that doesn't happen in a normal, well encoded, PNG image.*/ case 22: return "end of out buffer memory reached while inflating"; case 23: return "end of in buffer memory reached while inflating"; case 24: return "invalid FCHECK in zlib header"; case 25: return "invalid compression method in zlib header"; case 26: return "FDICT encountered in zlib header while it's not used for PNG"; case 27: return "PNG file is smaller than a PNG header"; /*Checks the magic file header, the first 8 bytes of the PNG file*/ case 28: return "incorrect PNG signature, it's no PNG or corrupted"; case 29: return "first chunk is not the header chunk"; case 30: return "chunk length too large, chunk broken off at end of file"; case 31: return "illegal PNG color type or bpp"; case 32: return "illegal PNG compression method"; case 33: return "illegal PNG filter method"; case 34: return "illegal PNG interlace method"; case 35: return "chunk length of a chunk is too large or the chunk too small"; case 36: return "illegal PNG filter type encountered"; case 37: return "illegal bit depth for this color type given"; case 38: return "the palette is too big"; /*more than 256 colors*/ case 39: return "tRNS chunk before PLTE or has more entries than palette size"; case 40: return "tRNS chunk has wrong size for greyscale image"; case 41: return "tRNS chunk has wrong size for RGB image"; case 42: return "tRNS chunk appeared while it was not allowed for this color type"; case 43: return "bKGD chunk has wrong size for palette image"; case 44: return "bKGD chunk has wrong size for greyscale image"; case 45: return "bKGD chunk has wrong size for RGB image"; case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?"; case 49: return "jumped past memory while generating dynamic huffman tree"; case 50: return "jumped past memory while generating dynamic huffman tree"; case 51: return "jumped past memory while inflating huffman block"; case 52: return "jumped past memory while inflating"; case 53: return "size of zlib data too small"; case 54: return "repeat symbol in tree while there was no value symbol yet"; /*jumped past tree while generating huffman tree, this could be when the tree will have more leaves than symbols after generating it out of the given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ case 55: return "jumped past tree while generating huffman tree"; case 56: return "given output image colortype or bitdepth not supported for color conversion"; case 57: return "invalid CRC encountered (checking CRC can be disabled)"; case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; case 59: return "requested color conversion not supported"; case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ case 62: return "conversion from color to greyscale not supported"; case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; case 73: return "invalid tIME chunk size"; case 74: return "invalid pHYs chunk size"; /*length could be wrong, or data chopped off*/ case 75: return "no null termination char found while decoding text chunk"; case 76: return "iTXt chunk too short to contain required bytes"; case 77: return "integer overflow in buffer size"; case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ case 79: return "failed to open file for writing"; case 80: return "tried creating a tree of 0 symbols"; case 81: return "lazy matching at pos 0 is impossible"; case 82: return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; case 83: return "memory allocation failed"; case 84: return "given image too small to contain all pixels to be encoded"; case 86: return "impossible offset in lz77 encoding (internal bug)"; case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; case 89: return "text chunk keyword too short or long: must have size 1-79"; /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ case 90: return "windowsize must be a power of two"; case 91: return "invalid decompressed idat size"; case 92: return "integer overflow due to too many pixels"; case 93: return "zero width or height is invalid"; case 94: return "header chunk must have a size of 13 bytes"; case 95: return "integer overflow with combined idat chunk size"; case 96: return "invalid gAMA chunk size"; case 97: return "invalid cHRM chunk size"; case 98: return "invalid sRGB chunk size"; case 99: return "invalid sRGB rendering intent"; case 100: return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; case 101: return "PNG specification does not allow RGB ICC profile on grey color types and vice versa"; case 102: return "not allowed to set greyscale ICC profile with colored pixels by PNG specification"; case 103: return "Invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; case 104: return "Invalid bKGD color while encoding (e.g. palette index out of range)"; } return "unknown error code"; } #endif /*LODEPNG_COMPILE_ERROR_TEXT*/ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ /* // C++ Wrapper // */ /* ////////////////////////////////////////////////////////////////////////// */ /* ////////////////////////////////////////////////////////////////////////// */ #ifdef LODEPNG_COMPILE_CPP namespace lodepng { #ifdef LODEPNG_COMPILE_DISK unsigned load_file(std::vector& buffer, const std::string& filename) { long size = lodepng_filesize(filename.c_str()); if(size < 0) return 78; buffer.resize((size_t)size); return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); } /*write given buffer to the file, overwriting the file, it doesn't append to it.*/ unsigned save_file(const std::vector& buffer, const std::string& filename) { return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); } #endif /* LODEPNG_COMPILE_DISK */ #ifdef LODEPNG_COMPILE_ZLIB #ifdef LODEPNG_COMPILE_DECODER unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, const LodePNGDecompressSettings& settings) { unsigned char* buffer = 0; size_t buffersize = 0; unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings); if(buffer) { out.insert(out.end(), &buffer[0], &buffer[buffersize]); lodepng_free(buffer); } return error; } unsigned decompress(std::vector& out, const std::vector& in, const LodePNGDecompressSettings& settings) { return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); } #endif /* LODEPNG_COMPILE_DECODER */ #ifdef LODEPNG_COMPILE_ENCODER unsigned compress(std::vector& out, const unsigned char* in, size_t insize, const LodePNGCompressSettings& settings) { unsigned char* buffer = 0; size_t buffersize = 0; unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); if(buffer) { out.insert(out.end(), &buffer[0], &buffer[buffersize]); lodepng_free(buffer); } return error; } unsigned compress(std::vector& out, const std::vector& in, const LodePNGCompressSettings& settings) { return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); } #endif /* LODEPNG_COMPILE_ENCODER */ #endif /* LODEPNG_COMPILE_ZLIB */ #ifdef LODEPNG_COMPILE_PNG State::State() { lodepng_state_init(this); } State::State(const State& other) { lodepng_state_init(this); lodepng_state_copy(this, &other); } State::~State() { lodepng_state_cleanup(this); } State& State::operator=(const State& other) { lodepng_state_copy(this, &other); return *this; } #ifdef LODEPNG_COMPILE_DECODER unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, size_t insize, LodePNGColorType colortype, unsigned bitdepth) { unsigned char* buffer; unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); if(buffer && !error) { State state; state.info_raw.colortype = colortype; state.info_raw.bitdepth = bitdepth; size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); out.insert(out.end(), &buffer[0], &buffer[buffersize]); lodepng_free(buffer); } return error; } unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) { return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); } unsigned decode(std::vector& out, unsigned& w, unsigned& h, State& state, const unsigned char* in, size_t insize) { unsigned char* buffer = NULL; unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); if(buffer && !error) { size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); out.insert(out.end(), &buffer[0], &buffer[buffersize]); } lodepng_free(buffer); return error; } unsigned decode(std::vector& out, unsigned& w, unsigned& h, State& state, const std::vector& in) { return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); } #ifdef LODEPNG_COMPILE_DISK unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, LodePNGColorType colortype, unsigned bitdepth) { std::vector buffer; unsigned error = load_file(buffer, filename); if(error) return error; return decode(out, w, h, buffer, colortype, bitdepth); } #endif /* LODEPNG_COMPILE_DECODER */ #endif /* LODEPNG_COMPILE_DISK */ #ifdef LODEPNG_COMPILE_ENCODER unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { unsigned char* buffer; size_t buffersize; unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); if(buffer) { out.insert(out.end(), &buffer[0], &buffer[buffersize]); lodepng_free(buffer); } return error; } unsigned encode(std::vector& out, const std::vector& in, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); } unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, State& state) { unsigned char* buffer; size_t buffersize; unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); if(buffer) { out.insert(out.end(), &buffer[0], &buffer[buffersize]); lodepng_free(buffer); } return error; } unsigned encode(std::vector& out, const std::vector& in, unsigned w, unsigned h, State& state) { if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; return encode(out, in.empty() ? 0 : &in[0], w, h, state); } #ifdef LODEPNG_COMPILE_DISK unsigned encode(const std::string& filename, const unsigned char* in, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { std::vector buffer; unsigned error = encode(buffer, in, w, h, colortype, bitdepth); if(!error) error = save_file(buffer, filename); return error; } unsigned encode(const std::string& filename, const std::vector& in, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); } #endif /* LODEPNG_COMPILE_DISK */ #endif /* LODEPNG_COMPILE_ENCODER */ #endif /* LODEPNG_COMPILE_PNG */ } /* namespace lodepng */ #endif /*LODEPNG_COMPILE_CPP*/ openscad-2019.05/src/ext/lodepng/lodepng.h0000644000076500000240000026360113402025764020732 0ustar kintelstaff00000000000000/* LodePNG version 20180910 Copyright (c) 2005-2018 Lode Vandevenne This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef LODEPNG_H #define LODEPNG_H #include /*for size_t*/ extern const char* LODEPNG_VERSION_STRING; /* The following #defines are used to create code sections. They can be disabled to disable code sections, which can give faster compile time and smaller binary. The "NO_COMPILE" defines are designed to be used to pass as defines to the compiler command to disable them without modifying this header, e.g. -DLODEPNG_NO_COMPILE_ZLIB for gcc. In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to allow implementing a custom lodepng_crc32. */ /*deflate & zlib. If disabled, you must specify alternative zlib functions in the custom_zlib field of the compress and decompress settings*/ #ifndef LODEPNG_NO_COMPILE_ZLIB #define LODEPNG_COMPILE_ZLIB #endif /*png encoder and png decoder*/ #ifndef LODEPNG_NO_COMPILE_PNG #define LODEPNG_COMPILE_PNG #endif /*deflate&zlib decoder and png decoder*/ #ifndef LODEPNG_NO_COMPILE_DECODER #define LODEPNG_COMPILE_DECODER #endif /*deflate&zlib encoder and png encoder*/ #ifndef LODEPNG_NO_COMPILE_ENCODER #define LODEPNG_COMPILE_ENCODER #endif /*the optional built in harddisk file loading and saving functions*/ #ifndef LODEPNG_NO_COMPILE_DISK #define LODEPNG_COMPILE_DISK #endif /*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ #ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS #define LODEPNG_COMPILE_ANCILLARY_CHUNKS #endif /*ability to convert error numerical codes to English text string*/ #ifndef LODEPNG_NO_COMPILE_ERROR_TEXT #define LODEPNG_COMPILE_ERROR_TEXT #endif /*Compile the default allocators (C's free, malloc and realloc). If you disable this, you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your source files with custom allocators.*/ #ifndef LODEPNG_NO_COMPILE_ALLOCATORS #define LODEPNG_COMPILE_ALLOCATORS #endif /*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ #ifdef __cplusplus #ifndef LODEPNG_NO_COMPILE_CPP #define LODEPNG_COMPILE_CPP #endif #endif #ifdef LODEPNG_COMPILE_CPP #include #include #endif /*LODEPNG_COMPILE_CPP*/ #ifdef LODEPNG_COMPILE_PNG /*The PNG color types (also used for raw).*/ typedef enum LodePNGColorType { LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ LCT_RGB = 2, /*RGB: 8,16 bit*/ LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ } LodePNGColorType; #ifdef LODEPNG_COMPILE_DECODER /* Converts PNG data in memory to raw pixel data. out: Output parameter. Pointer to buffer that will contain the raw pixel data. After decoding, its size is w * h * (bytes per pixel) bytes larger than initially. Bytes per pixel depends on colortype and bitdepth. Must be freed after usage with free(*out). Note: for 16-bit per channel colors, uses big endian format like PNG does. w: Output parameter. Pointer to width of pixel data. h: Output parameter. Pointer to height of pixel data. in: Memory buffer with the PNG file. insize: size of the in buffer. colortype: the desired color type for the raw output image. See explanation on PNG color types. bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. Return value: LodePNG error code (0 means no error). */ unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize, LodePNGColorType colortype, unsigned bitdepth); /*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize); /*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize); #ifdef LODEPNG_COMPILE_DISK /* Load PNG from disk, from file with given name. Same as the other decode functions, but instead takes a filename as input. */ unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, LodePNGColorType colortype, unsigned bitdepth); /*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename); /*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename); #endif /*LODEPNG_COMPILE_DISK*/ #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER /* Converts raw pixel data into a PNG image in memory. The colortype and bitdepth of the output PNG image cannot be chosen, they are automatically determined by the colortype, bitdepth and content of the input pixel data. Note: for 16-bit per channel colors, needs big endian format like PNG does. out: Output parameter. Pointer to buffer that will contain the PNG image data. Must be freed after usage with free(*out). outsize: Output parameter. Pointer to the size in bytes of the out buffer. image: The raw pixel data to encode. The size of this buffer should be w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. w: width of the raw pixel data in pixels. h: height of the raw pixel data in pixels. colortype: the color type of the raw input image. See explanation on PNG color types. bitdepth: the bit depth of the raw input image. See explanation on PNG color types. Return value: LodePNG error code (0 means no error). */ unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth); /*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h); /*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h); #ifdef LODEPNG_COMPILE_DISK /* Converts raw pixel data into a PNG file on disk. Same as the other encode functions, but instead takes a filename as output. NOTE: This overwrites existing files without warning! */ unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth); /*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h); /*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h); #endif /*LODEPNG_COMPILE_DISK*/ #endif /*LODEPNG_COMPILE_ENCODER*/ #ifdef LODEPNG_COMPILE_CPP namespace lodepng { #ifdef LODEPNG_COMPILE_DECODER /*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, size_t insize, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::vector& in, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); #ifdef LODEPNG_COMPILE_DISK /* Converts PNG file from disk to raw pixel data in memory. Same as the other decode functions, but instead takes a filename as input. */ unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); #endif /* LODEPNG_COMPILE_DISK */ #endif /* LODEPNG_COMPILE_DECODER */ #ifdef LODEPNG_COMPILE_ENCODER /*Same as lodepng_encode_memory, but encodes to an std::vector. colortype is that of the raw input data. The output PNG color type will be auto chosen.*/ unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); unsigned encode(std::vector& out, const std::vector& in, unsigned w, unsigned h, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); #ifdef LODEPNG_COMPILE_DISK /* Converts 32-bit RGBA raw pixel data into a PNG file on disk. Same as the other encode functions, but instead takes a filename as output. NOTE: This overwrites existing files without warning! */ unsigned encode(const std::string& filename, const unsigned char* in, unsigned w, unsigned h, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); unsigned encode(const std::string& filename, const std::vector& in, unsigned w, unsigned h, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); #endif /* LODEPNG_COMPILE_DISK */ #endif /* LODEPNG_COMPILE_ENCODER */ } /* namespace lodepng */ #endif /*LODEPNG_COMPILE_CPP*/ #endif /*LODEPNG_COMPILE_PNG*/ #ifdef LODEPNG_COMPILE_ERROR_TEXT /*Returns an English description of the numerical error code.*/ const char* lodepng_error_text(unsigned code); #endif /*LODEPNG_COMPILE_ERROR_TEXT*/ #ifdef LODEPNG_COMPILE_DECODER /*Settings for zlib decompression*/ typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; struct LodePNGDecompressSettings { /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ /*use custom zlib decoder instead of built in one (default: null)*/ unsigned (*custom_zlib)(unsigned char**, size_t*, const unsigned char*, size_t, const LodePNGDecompressSettings*); /*use custom deflate decoder instead of built in one (default: null) if custom_zlib is used, custom_deflate is ignored since only the built in zlib function will call custom_deflate*/ unsigned (*custom_inflate)(unsigned char**, size_t*, const unsigned char*, size_t, const LodePNGDecompressSettings*); const void* custom_context; /*optional custom settings for custom functions*/ }; extern const LodePNGDecompressSettings lodepng_default_decompress_settings; void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER /* Settings for zlib compression. Tweaking these settings tweaks the balance between speed and compression ratio. */ typedef struct LodePNGCompressSettings LodePNGCompressSettings; struct LodePNGCompressSettings /*deflate = compress*/ { /*LZ77 related settings*/ unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ /*use custom zlib encoder instead of built in one (default: null)*/ unsigned (*custom_zlib)(unsigned char**, size_t*, const unsigned char*, size_t, const LodePNGCompressSettings*); /*use custom deflate encoder instead of built in one (default: null) if custom_zlib is used, custom_deflate is ignored since only the built in zlib function will call custom_deflate*/ unsigned (*custom_deflate)(unsigned char**, size_t*, const unsigned char*, size_t, const LodePNGCompressSettings*); const void* custom_context; /*optional custom settings for custom functions*/ }; extern const LodePNGCompressSettings lodepng_default_compress_settings; void lodepng_compress_settings_init(LodePNGCompressSettings* settings); #endif /*LODEPNG_COMPILE_ENCODER*/ #ifdef LODEPNG_COMPILE_PNG /* Color mode of an image. Contains all information required to decode the pixel bits to RGBA colors. This information is the same as used in the PNG file format, and is used both for PNG and raw image data in LodePNG. */ typedef struct LodePNGColorMode { /*header (IHDR)*/ LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ /* palette (PLTE and tRNS) Dynamically allocated with the colors of the palette, including alpha. When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use lodepng_palette_clear, then for each color use lodepng_palette_add. If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. When decoding, by default you can ignore this palette, since LodePNG already fills the palette colors in the pixels of the raw RGBA output. The palette is only supported for color type 3. */ unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/ size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ /* transparent color key (tRNS) This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. For greyscale PNGs, r, g and b will all 3 be set to the same. When decoding, by default you can ignore this information, since LodePNG sets pixels with this key to transparent already in the raw RGBA output. The color key is only supported for color types 0 and 2. */ unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ unsigned key_r; /*red/greyscale component of color key*/ unsigned key_g; /*green component of color key*/ unsigned key_b; /*blue component of color key*/ } LodePNGColorMode; /*init, cleanup and copy functions to use with this struct*/ void lodepng_color_mode_init(LodePNGColorMode* info); void lodepng_color_mode_cleanup(LodePNGColorMode* info); /*return value is error code (0 means no error)*/ unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); /* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); void lodepng_palette_clear(LodePNGColorMode* info); /*add 1 color to the palette*/ unsigned lodepng_palette_add(LodePNGColorMode* info, unsigned char r, unsigned char g, unsigned char b, unsigned char a); /*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ unsigned lodepng_get_bpp(const LodePNGColorMode* info); /*get the amount of color channels used, based on colortype in the struct. If a palette is used, it counts as 1 channel.*/ unsigned lodepng_get_channels(const LodePNGColorMode* info); /*is it a greyscale type? (only colortype 0 or 4)*/ unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); /*has it got an alpha channel? (only colortype 2 or 6)*/ unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); /*has it got a palette? (only colortype 3)*/ unsigned lodepng_is_palette_type(const LodePNGColorMode* info); /*only returns true if there is a palette and there is a value in the palette with alpha < 255. Loops through the palette to check this.*/ unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); /* Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). Returns false if the image can only have opaque pixels. In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, or if "key_defined" is true. */ unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); /*Returns the byte size of a raw image buffer with given width, height and color mode*/ size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*The information of a Time chunk in PNG.*/ typedef struct LodePNGTime { unsigned year; /*2 bytes used (0-65535)*/ unsigned month; /*1-12*/ unsigned day; /*1-31*/ unsigned hour; /*0-23*/ unsigned minute; /*0-59*/ unsigned second; /*0-60 (to allow for leap seconds)*/ } LodePNGTime; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*Information about the PNG image, except pixels, width and height.*/ typedef struct LodePNGInfo { /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ unsigned compression_method;/*compression method of the original file. Always 0.*/ unsigned filter_method; /*filter method of the original file*/ unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /* Suggested background color chunk (bKGD) This uses the same color mode and bit depth as the PNG (except no alpha channel), with values truncated to the bit depth in the unsigned integer. For greyscale and palette PNGs, the value is stored in background_r. The values in background_g and background_b are then unused. So when decoding, you may get these in a different color mode than the one you requested for the raw pixels. When encoding with auto_convert, you must use the color model defined in info_png.color for these values. The encoder normally ignores info_png.color when auto_convert is on, but will use it to interpret these values (and convert copies of them to its chosen color model). When encoding, avoid setting this to an expensive color, such as a non-grey value when the image is grey, or the compression will be worse since it will be forced to write the PNG with a more expensive color mode (when auto_convert is on). The decoder does not use this background color to edit the color of pixels. This is a completely optional metadata feature. */ unsigned background_defined; /*is a suggested background color given?*/ unsigned background_r; /*red/grey/palette component of suggested background color*/ unsigned background_g; /*green component of suggested background color*/ unsigned background_b; /*blue component of suggested background color*/ /* non-international text chunks (tEXt and zTXt) The char** arrays each contain num strings. The actual messages are in text_strings, while text_keys are keywords that give a short description what the actual text represents, e.g. Title, Author, Description, or anything else. All the string fields below including keys, names and language tags are null terminated. The PNG specification uses null characters for the keys, names and tags, and forbids null characters to appear in the main text which is why we can use null termination everywhere here. A keyword is minimum 1 character and maximum 79 characters long. It's discouraged to use a single line length longer than 79 characters for texts. Don't allocate these text buffers yourself. Use the init/cleanup functions correctly and use lodepng_add_text and lodepng_clear_text. */ size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ char** text_strings; /*the actual text*/ /* international text chunks (iTXt) Similar to the non-international text chunks, but with additional strings "langtags" and "transkeys". */ size_t itext_num; /*the amount of international texts in this PNG*/ char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ char** itext_strings; /*the actual international text - UTF-8 string*/ /*time chunk (tIME)*/ unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ LodePNGTime time; /*phys chunk (pHYs)*/ unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ unsigned phys_x; /*pixels per unit in x direction*/ unsigned phys_y; /*pixels per unit in y direction*/ unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ /* Color profile related chunks: gAMA, cHRM, sRGB, iCPP LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please use these values with a color management library. See the PNG, ICC and sRGB specifications for more information about the meaning of these values. */ /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ unsigned gama_gamma; /* Gamma exponent times 100000 */ /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ unsigned chrm_white_x; /* White Point x times 100000 */ unsigned chrm_white_y; /* White Point y times 100000 */ unsigned chrm_red_x; /* Red x times 100000 */ unsigned chrm_red_y; /* Red y times 100000 */ unsigned chrm_green_x; /* Green x times 100000 */ unsigned chrm_green_y; /* Green y times 100000 */ unsigned chrm_blue_x; /* Blue x times 100000 */ unsigned chrm_blue_y; /* Blue y times 100000 */ /* sRGB chunk: optional. May not appear at the same time as iCCP. If gAMA is also present gAMA must contain value 45455. If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. */ unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ /* iCCP chunk: optional. May not appear at the same time as sRGB. LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color management and conversions. For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-grey PNG color types and a "GRAY" profile for grey PNG color types. If you disable auto_convert, you must ensure the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder error if the pixel data has non-grey pixels for a GRAY profile, or a silent less-optimal compression of the pixel data if the pixels could be encoded as greyscale but the ICC profile is RGB. To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so make sure you compute it carefully to avoid the above problems. */ unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ char* iccp_name; /* Null terminated string with profile name, 1-79 bytes */ /* The ICC profile in iccp_profile_size bytes. Don't allocate this buffer yourself. Use the init/cleanup functions correctly and use lodepng_set_icc and lodepng_clear_icc. */ unsigned char* iccp_profile; unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ /* End of color profile related chunks */ /* unknown chunks: chunks not known by LodePNG, passed on byte for byte. There are 3 buffers, one for each position in the PNG where unknown chunks can appear. Each buffer contains all unknown chunks for that position consecutively. The 3 positions are: 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag above in here, since the encoder will blindly follow this and could then encode an invalid PNG file (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), or any non-standard PNG chunk. Do not allocate or traverse this data yourself. Use the chunk traversing functions declared later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. */ unsigned char* unknown_chunks_data[3]; size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } LodePNGInfo; /*init, cleanup and copy functions to use with this struct*/ void lodepng_info_init(LodePNGInfo* info); void lodepng_info_cleanup(LodePNGInfo* info); /*return value is error code (0 means no error)*/ unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ /*replaces if exists*/ unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size); void lodepng_clear_icc(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /* Converts raw buffer from one color type to another color type, based on LodePNGColorMode structs to describe the input and output color type. See the reference manual at the end of this header file to see which color conversions are supported. return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel of the output color type (lodepng_get_bpp). For < 8 bpp images, there should not be padding bits at the end of scanlines. For 16-bit per channel colors, uses big endian format like PNG does. Return value is LodePNG error code */ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, unsigned w, unsigned h); #ifdef LODEPNG_COMPILE_DECODER /* Settings for the decoder. This contains settings for the PNG and the Zlib decoder, but not the Info settings from the Info structs. */ typedef struct LodePNGDecoderSettings { LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ unsigned ignore_crc; /*ignore CRC checksums*/ unsigned ignore_critical; /*ignore unknown critical chunks*/ unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters in string keys, etc... */ unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ unsigned remember_unknown_chunks; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } LodePNGDecoderSettings; void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER /*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ typedef enum LodePNGFilterStrategy { /*every filter at zero*/ LFS_ZERO, /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ LFS_MINSUM, /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending on the image, this is better or worse than minsum.*/ LFS_ENTROPY, /* Brute-force-search PNG filters by compressing each filter for each scanline. Experimental, very slow, and only rarely gives better compression than MINSUM. */ LFS_BRUTE_FORCE, /*use predefined_filters buffer: you specify the filter type for each scanline*/ LFS_PREDEFINED } LodePNGFilterStrategy; /*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), which helps decide which color model to use for encoding. Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms. NOTE: This is not related to the ICC color profile, search "iccp_profile" instead to find the ICC/chromacity/... fields in this header file.*/ typedef struct LodePNGColorProfile { unsigned colored; /*not greyscale*/ unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ unsigned short key_g; unsigned short key_b; unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16.*/ unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order*/ unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for greyscale only. 16 if 16-bit per channel required.*/ size_t numpixels; } LodePNGColorProfile; void lodepng_color_profile_init(LodePNGColorProfile* profile); /*Get a LodePNGColorProfile of the image. The profile must already have been inited. NOTE: This is not related to the ICC color profile, search "iccp_profile" instead to find the ICC/chromacity/... fields in this header file.*/ unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, const unsigned char* image, unsigned w, unsigned h, const LodePNGColorMode* mode_in); /*The function LodePNG uses internally to decide the PNG color with auto_convert. Chooses an optimal color model, e.g. grey if only grey pixels, palette if < 256 colors, ...*/ unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, const unsigned char* image, unsigned w, unsigned h, const LodePNGColorMode* mode_in); /*Settings for the encoder.*/ typedef struct LodePNGEncoderSettings { LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to completely follow the official PNG heuristic, filter_palette_zero must be true and filter_strategy must be LFS_MINSUM*/ unsigned filter_palette_zero; /*Which filter strategy to use when not using zeroes due to filter_palette_zero. Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ LodePNGFilterStrategy filter_strategy; /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with the same length as the amount of scanlines in the image, and each value must <= 5. You have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ const unsigned char* predefined_filters; /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). If colortype is 3, PLTE is _always_ created.*/ unsigned force_palette; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*add LodePNG identifier and version as a text chunk, for debugging*/ unsigned add_id; /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ unsigned text_compression; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } LodePNGEncoderSettings; void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); #endif /*LODEPNG_COMPILE_ENCODER*/ #if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) /*The settings, state and information for extended encoding and decoding.*/ typedef struct LodePNGState { #ifdef LODEPNG_COMPILE_DECODER LodePNGDecoderSettings decoder; /*the decoding settings*/ #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER LodePNGEncoderSettings encoder; /*the encoding settings*/ #endif /*LODEPNG_COMPILE_ENCODER*/ LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ unsigned error; #ifdef LODEPNG_COMPILE_CPP /* For the lodepng::State subclass. */ virtual ~LodePNGState(){} #endif } LodePNGState; /*init, cleanup and copy functions to use with this struct*/ void lodepng_state_init(LodePNGState* state); void lodepng_state_cleanup(LodePNGState* state); void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); #endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ #ifdef LODEPNG_COMPILE_DECODER /* Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and getting much more information about the PNG image and color mode. */ unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, LodePNGState* state, const unsigned char* in, size_t insize); /* Read the PNG header, but not the actual data. This returns only the information that is in the IHDR chunk of the PNG, such as width, height and color type. The information is placed in the info_png field of the LodePNGState. */ unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, const unsigned char* in, size_t insize); #endif /*LODEPNG_COMPILE_DECODER*/ /* Reads one metadata chunk (other than IHDR) of the PNG file and outputs what it read in the state. Returns error code on failure. Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const to find the desired chunk type, and if non null use lodepng_inspect_chunk (with chunk_pointer - start_of_file as pos). Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). Requirements: &in[pos] must point to start of a chunk, must use regular lodepng_inspect first since format of most other chunks depends on IHDR, and if there is a PLTE chunk, that one must be inspected before tRNS or bKGD. */ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, const unsigned char* in, size_t insize); #ifdef LODEPNG_COMPILE_ENCODER /*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ unsigned lodepng_encode(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h, LodePNGState* state); #endif /*LODEPNG_COMPILE_ENCODER*/ /* The lodepng_chunk functions are normally not needed, except to traverse the unknown chunks stored in the LodePNGInfo struct, or add new ones to it. It also allows traversing the chunks of an encoded PNG file yourself. The chunk pointer always points to the beginning of the chunk itself, that is the first byte of the 4 length bytes. In the PNG file format, chunks have the following format: -4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) -4 bytes chunk type (ASCII a-z,A-Z only, see below) -length bytes of data (may be 0 bytes if length was 0) -4 bytes of CRC, computed on chunk name + data The first chunk starts at the 8th byte of the PNG file, the entire rest of the file exists out of concatenated chunks with the above format. PNG standard chunk ASCII naming conventions: -First byte: uppercase = critical, lowercase = ancillary -Second byte: uppercase = public, lowercase = private -Third byte: must be uppercase -Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy */ /* Gets the length of the data of the chunk. Total chunk length has 12 bytes more. There must be at least 4 bytes to read from. If the result value is too large, it may be corrupt data. */ unsigned lodepng_chunk_length(const unsigned char* chunk); /*puts the 4-byte type in null terminated string*/ void lodepng_chunk_type(char type[5], const unsigned char* chunk); /*check if the type is the given type*/ unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); /*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); /*0: public, 1: private (see PNG standard)*/ unsigned char lodepng_chunk_private(const unsigned char* chunk); /*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); /*get pointer to the data of the chunk, where the input points to the header of the chunk*/ unsigned char* lodepng_chunk_data(unsigned char* chunk); const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); /*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ unsigned lodepng_chunk_check_crc(const unsigned char* chunk); /*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ void lodepng_chunk_generate_crc(unsigned char* chunk); /* Iterate to next chunks, allows iterating through all chunks of the PNG file. Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, or the 8th byte of a PNG file which always has the first chunk), or alternatively may point to the first byte of the PNG file (which is not a chunk but the magic header, the function will then skip over it and return the first real chunk). Expects at least 8 readable bytes of memory in the input pointer. Will output pointer to the start of the next chunk or the end of the file if there is no more chunk after this. Start this process at the 8th byte of the PNG file. In a non-corrupt PNG file, the last chunk should have name "IEND". */ unsigned char* lodepng_chunk_next(unsigned char* chunk); const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); /*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ unsigned char* lodepng_chunk_find(unsigned char* chunk, const unsigned char* end, const char type[5]); const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]); /* Appends chunk to the data in out. The given chunk should already have its chunk header. The out variable and outlength are updated to reflect the new reallocated buffer. Returns error code (0 if it went ok) */ unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); /* Appends new chunk to out. The chunk to append is given by giving its length, type and data separately. The type is a 4-letter string. The out variable and outlength are updated to reflect the new reallocated buffer. Returne error code (0 if it went ok) */ unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, const char* type, const unsigned char* data); /*Calculate CRC32 of buffer*/ unsigned lodepng_crc32(const unsigned char* buf, size_t len); #endif /*LODEPNG_COMPILE_PNG*/ #ifdef LODEPNG_COMPILE_ZLIB /* This zlib part can be used independently to zlib compress and decompress a buffer. It cannot be used to create gzip files however, and it only supports the part of zlib that is required for PNG, it does not support dictionaries. */ #ifdef LODEPNG_COMPILE_DECODER /*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ unsigned lodepng_inflate(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings); /* Decompresses Zlib data. Reallocates the out buffer and appends the data. The data must be according to the zlib specification. Either, *out must be NULL and *outsize must be 0, or, *out must be a valid buffer and *outsize its size in bytes. out must be freed by user after usage. */ unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings); #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER /* Compresses data with Zlib. Reallocates the out buffer and appends the data. Zlib adds a small header and trailer around the deflate data. The data is output in the format of the zlib specification. Either, *out must be NULL and *outsize must be 0, or, *out must be a valid buffer and *outsize its size in bytes. out must be freed by user after usage. */ unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings); /* Find length-limited Huffman code for given frequencies. This function is in the public interface only for tests, it's used internally by lodepng_deflate. */ unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, size_t numcodes, unsigned maxbitlen); /*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ unsigned lodepng_deflate(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodePNGCompressSettings* settings); #endif /*LODEPNG_COMPILE_ENCODER*/ #endif /*LODEPNG_COMPILE_ZLIB*/ #ifdef LODEPNG_COMPILE_DISK /* Load a file from disk into buffer. The function allocates the out buffer, and after usage you should free it. out: output parameter, contains pointer to loaded buffer. outsize: output parameter, size of the allocated out buffer filename: the path to the file to load return value: error code (0 means ok) */ unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); /* Save a file from buffer to disk. Warning, if it exists, this function overwrites the file without warning! buffer: the buffer to write buffersize: size of the buffer to write filename: the path to the file to save to return value: error code (0 means ok) */ unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); #endif /*LODEPNG_COMPILE_DISK*/ #ifdef LODEPNG_COMPILE_CPP /* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ namespace lodepng { #ifdef LODEPNG_COMPILE_PNG class State : public LodePNGState { public: State(); State(const State& other); virtual ~State(); State& operator=(const State& other); }; #ifdef LODEPNG_COMPILE_DECODER /* Same as other lodepng::decode, but using a State for more settings and information. */ unsigned decode(std::vector& out, unsigned& w, unsigned& h, State& state, const unsigned char* in, size_t insize); unsigned decode(std::vector& out, unsigned& w, unsigned& h, State& state, const std::vector& in); #endif /*LODEPNG_COMPILE_DECODER*/ #ifdef LODEPNG_COMPILE_ENCODER /* Same as other lodepng::encode, but using a State for more settings and information. */ unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, State& state); unsigned encode(std::vector& out, const std::vector& in, unsigned w, unsigned h, State& state); #endif /*LODEPNG_COMPILE_ENCODER*/ #ifdef LODEPNG_COMPILE_DISK /* Load a file from disk into an std::vector. return value: error code (0 means ok) */ unsigned load_file(std::vector& buffer, const std::string& filename); /* Save the binary data in an std::vector to a file on disk. The file is overwritten without warning. */ unsigned save_file(const std::vector& buffer, const std::string& filename); #endif /* LODEPNG_COMPILE_DISK */ #endif /* LODEPNG_COMPILE_PNG */ #ifdef LODEPNG_COMPILE_ZLIB #ifdef LODEPNG_COMPILE_DECODER /* Zlib-decompress an unsigned char buffer */ unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); /* Zlib-decompress an std::vector */ unsigned decompress(std::vector& out, const std::vector& in, const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); #endif /* LODEPNG_COMPILE_DECODER */ #ifdef LODEPNG_COMPILE_ENCODER /* Zlib-compress an unsigned char buffer */ unsigned compress(std::vector& out, const unsigned char* in, size_t insize, const LodePNGCompressSettings& settings = lodepng_default_compress_settings); /* Zlib-compress an std::vector */ unsigned compress(std::vector& out, const std::vector& in, const LodePNGCompressSettings& settings = lodepng_default_compress_settings); #endif /* LODEPNG_COMPILE_ENCODER */ #endif /* LODEPNG_COMPILE_ZLIB */ } /* namespace lodepng */ #endif /*LODEPNG_COMPILE_CPP*/ /* TODO: [.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often [.] check compatibility with various compilers - done but needs to be redone for every newer version [X] converting color to 16-bit per channel types [X] support color profile chunk types (but never let them touch RGB values by default) [ ] support all public PNG chunk types [ ] make sure encoder generates no chunks with size > (2^31)-1 [ ] partial decoding (stream processing) [X] let the "isFullyOpaque" function check color keys and transparent palettes too [X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" [ ] don't stop decoding on errors like 69, 57, 58 (make warnings) [ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... [ ] errors with line numbers (and version) [ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes [ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... [ ] allow user to give data (void*) to custom allocator */ #endif /*LODEPNG_H inclusion guard*/ /* LodePNG Documentation --------------------- 0. table of contents -------------------- 1. about 1.1. supported features 1.2. features not supported 2. C and C++ version 3. security 4. decoding 5. encoding 6. color conversions 6.1. PNG color types 6.2. color conversions 6.3. padding bits 6.4. A note about 16-bits per channel and endianness 7. error values 8. chunks and PNG editing 9. compiler support 10. examples 10.1. decoder C++ example 10.2. decoder C example 11. state settings reference 12. changes 13. contact information 1. about -------- PNG is a file format to store raster images losslessly with good compression, supporting different color types and alpha channel. LodePNG is a PNG codec according to the Portable Network Graphics (PNG) Specification (Second Edition) - W3C Recommendation 10 November 2003. The specifications used are: *) Portable Network Graphics (PNG) Specification (Second Edition): http://www.w3.org/TR/2003/REC-PNG-20031110 *) RFC 1950 ZLIB Compressed Data Format version 3.3: http://www.gzip.org/zlib/rfc-zlib.html *) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: http://www.gzip.org/zlib/rfc-deflate.html The most recent version of LodePNG can currently be found at http://lodev.org/lodepng/ LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds extra functionality. LodePNG exists out of two files: -lodepng.h: the header file for both C and C++ -lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage If you want to start using LodePNG right away without reading this doc, get the examples from the LodePNG website to see how to use it in code, or check the smaller examples in chapter 13 here. LodePNG is simple but only supports the basic requirements. To achieve simplicity, the following design choices were made: There are no dependencies on any external library. There are functions to decode and encode a PNG with a single function call, and extended versions of these functions taking a LodePNGState struct allowing to specify or get more information. By default the colors of the raw image are always RGB or RGBA, no matter what color type the PNG file uses. To read and write files, there are simple functions to convert the files to/from buffers in memory. This all makes LodePNG suitable for loading textures in games, demos and small programs, ... It's less suitable for full fledged image editors, loading PNGs over network (it requires all the image data to be available before decoding can begin), life-critical systems, ... 1.1. supported features ----------------------- The following features are supported by the decoder: *) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, or the same color type as the PNG *) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image *) Adam7 interlace and deinterlace for any color type *) loading the image from harddisk or decoding it from a buffer from other sources than harddisk *) support for alpha channels, including RGBA color model, translucent palettes and color keying *) zlib decompression (inflate) *) zlib compression (deflate) *) CRC32 and ADLER32 checksums *) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. *) the following chunks are supported (generated/interpreted) by both encoder and decoder: IHDR: header information PLTE: color palette IDAT: pixel data IEND: the final chunk tRNS: transparency for palettized images tEXt: textual information zTXt: compressed textual information iTXt: international textual information bKGD: suggested background color pHYs: physical dimensions tIME: modification time 1.2. features not supported --------------------------- The following features are _not_ supported: *) some features needed to make a conformant PNG-Editor might be still missing. *) partial loading/stream processing. All data must be available and is processed in one call. *) The following public chunks are not supported but treated as unknown chunks by LodePNG cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT Some of these are not supported on purpose: LodePNG wants to provide the RGB values stored in the pixels, not values modified by system dependent gamma or color models. 2. C and C++ version -------------------- The C version uses buffers allocated with alloc that you need to free() yourself. You need to use init and cleanup functions for each struct whenever using a struct from the C version to avoid exploits and memory leaks. The C++ version has extra functions with std::vectors in the interface and the lodepng::State class which is a LodePNGState with constructor and destructor. These files work without modification for both C and C++ compilers because all the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers ignore it, and the C code is made to compile both with strict ISO C90 and C++. To use the C++ version, you need to rename the source file to lodepng.cpp (instead of lodepng.c), and compile it with a C++ compiler. To use the C version, you need to rename the source file to lodepng.c (instead of lodepng.cpp), and compile it with a C compiler. 3. Security ----------- Even if carefully designed, it's always possible that LodePNG contains possible exploits. If you discover one, please let me know, and it will be fixed. When using LodePNG, care has to be taken with the C version of LodePNG, as well as the C-style structs when working with C++. The following conventions are used for all C-style structs: -if a struct has a corresponding init function, always call the init function when making a new one -if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks -if a struct has a corresponding copy function, use the copy function instead of "=". The destination must also be inited already. 4. Decoding ----------- Decoding converts a PNG compressed image to a raw pixel buffer. Most documentation on using the decoder is at its declarations in the header above. For C, simple decoding can be done with functions such as lodepng_decode32, and more advanced decoding can be done with the struct LodePNGState and lodepng_decode. For C++, all decoding can be done with the various lodepng::decode functions, and lodepng::State can be used for advanced features. When using the LodePNGState, it uses the following fields for decoding: *) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here *) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get *) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use LodePNGInfo info_png -------------------- After decoding, this contains extra information of the PNG image, except the actual pixels, width and height because these are already gotten directly from the decoder functions. It contains for example the original color type of the PNG image, text comments, suggested background color, etc... More details about the LodePNGInfo struct are at its declaration documentation. LodePNGColorMode info_raw ------------------------- When decoding, here you can specify which color type you want the resulting raw image to be. If this is different from the colortype of the PNG, then the decoder will automatically convert the result. This conversion always works, except if you want it to convert a color PNG to greyscale or to a palette with missing colors. By default, 32-bit color is used for the result. LodePNGDecoderSettings decoder ------------------------------ The settings can be used to ignore the errors created by invalid CRC and Adler32 chunks, and to disable the decoding of tEXt chunks. There's also a setting color_convert, true by default. If false, no conversion is done, the resulting data will be as it was in the PNG (after decompression) and you'll have to puzzle the colors of the pixels together yourself using the color type information in the LodePNGInfo. 5. Encoding ----------- Encoding converts a raw pixel buffer to a PNG compressed image. Most documentation on using the encoder is at its declarations in the header above. For C, simple encoding can be done with functions such as lodepng_encode32, and more advanced decoding can be done with the struct LodePNGState and lodepng_encode. For C++, all encoding can be done with the various lodepng::encode functions, and lodepng::State can be used for advanced features. Like the decoder, the encoder can also give errors. However it gives less errors since the encoder input is trusted, the decoder input (a PNG image that could be forged by anyone) is not trusted. When using the LodePNGState, it uses the following fields for encoding: *) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. *) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has *) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use LodePNGInfo info_png -------------------- When encoding, you use this the opposite way as when decoding: for encoding, you fill in the values you want the PNG to have before encoding. By default it's not needed to specify a color type for the PNG since it's automatically chosen, but it's possible to choose it yourself given the right settings. The encoder will not always exactly match the LodePNGInfo struct you give, it tries as close as possible. Some things are ignored by the encoder. The encoder uses, for example, the following settings from it when applicable: colortype and bitdepth, text chunks, time chunk, the color key, the palette, the background color, the interlace method, unknown chunks, ... When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. If the palette contains any colors for which the alpha channel is not 255 (so there are translucent colors in the palette), it'll add a tRNS chunk. LodePNGColorMode info_raw ------------------------- You specify the color type of the raw image that you give to the input here, including a possible transparent color key and palette you happen to be using in your raw image data. By default, 32-bit color is assumed, meaning your input has to be in RGBA format with 4 bytes (unsigned chars) per pixel. LodePNGEncoderSettings encoder ------------------------------ The following settings are supported (some are in sub-structs): *) auto_convert: when this option is enabled, the encoder will automatically choose the smallest possible color mode (including color key) that can encode the colors of all pixels without information loss. *) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, 2 = dynamic huffman tree (best compression). Should be 2 for proper compression. *) use_lz77: whether or not to use LZ77 for compressed block types. Should be true for proper compression. *) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value 2048 by default, but can be set to 32768 for better, but slow, compression. *) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE chunk if force_palette is true. This can used as suggested palette to convert to by viewers that don't support more than 256 colors (if those still exist) *) add_id: add text chunk "Encoder: LodePNG " to the image. *) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. zTXt chunks use zlib compression on the text. This gives a smaller result on large texts but a larger result on small texts (such as a single program name). It's all tEXt or all zTXt though, there's no separate setting per text yet. 6. color conversions -------------------- An important thing to note about LodePNG, is that the color type of the PNG, and the color type of the raw image, are completely independent. By default, when you decode a PNG, you get the result as a raw image in the color type you want, no matter whether the PNG was encoded with a palette, greyscale or RGBA color. And if you encode an image, by default LodePNG will automatically choose the PNG color type that gives good compression based on the values of colors and amount of colors in the image. It can be configured to let you control it instead as well, though. To be able to do this, LodePNG does conversions from one color mode to another. It can convert from almost any color type to any other color type, except the following conversions: RGB to greyscale is not supported, and converting to a palette when the palette doesn't have a required color is not supported. This is not supported on purpose: this is information loss which requires a color reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey is easy, but there are multiple ways if you want to give some channels more weight). By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB color, no matter what color type the PNG has. And by default when encoding, LodePNG automatically picks the best color model for the output PNG, and expects the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control the color format of the images yourself, you can skip this chapter. 6.1. PNG color types -------------------- A PNG image can have many color types, ranging from 1-bit color to 64-bit color, as well as palettized color modes. After the zlib decompression and unfiltering in the PNG image is done, the raw pixel data will have that color type and thus a certain amount of bits per pixel. If you want the output raw image after decoding to have another color type, a conversion is done by LodePNG. The PNG specification gives the following color types: 0: greyscale, bit depths 1, 2, 4, 8, 16 2: RGB, bit depths 8 and 16 3: palette, bit depths 1, 2, 4 and 8 4: greyscale with alpha, bit depths 8 and 16 6: RGBA, bit depths 8 and 16 Bit depth is the amount of bits per pixel per color channel. So the total amount of bits per pixel is: amount of channels * bitdepth. 6.2. color conversions ---------------------- As explained in the sections about the encoder and decoder, you can specify color types and bit depths in info_png and info_raw to change the default behaviour. If, when decoding, you want the raw image to be something else than the default, you need to set the color type and bit depth you want in the LodePNGColorMode, or the parameters colortype and bitdepth of the simple decoding function. If, when encoding, you use another color type than the default in the raw input image, you need to specify its color type and bit depth in the LodePNGColorMode of the raw image, or use the parameters colortype and bitdepth of the simple encoding function. If, when encoding, you don't want LodePNG to choose the output PNG color type but control it yourself, you need to set auto_convert in the encoder settings to false, and specify the color type you want in the LodePNGInfo of the encoder (including palette: it can generate a palette if auto_convert is true, otherwise not). If the input and output color type differ (whether user chosen or auto chosen), LodePNG will do a color conversion, which follows the rules below, and may sometimes result in an error. To avoid some confusion: -the decoder converts from PNG to raw image -the encoder converts from raw image to PNG -the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image -the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG -when encoding, the color type in LodePNGInfo is ignored if auto_convert is enabled, it is automatically generated instead -when decoding, the color type in LodePNGInfo is set by the decoder to that of the original PNG image, but it can be ignored since the raw image has the color type you requested instead -if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion between the color types is done if the color types are supported. If it is not supported, an error is returned. If the types are the same, no conversion is done. -even though some conversions aren't supported, LodePNG supports loading PNGs from any colortype and saving PNGs to any colortype, sometimes it just requires preparing the raw image correctly before encoding. -both encoder and decoder use the same color converter. Non supported color conversions: -color to greyscale: no error is thrown, but the result will look ugly because only the red channel is taken -anything to palette when that palette does not have that color in it: in this case an error is thrown Supported color conversions: -anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA -any grey or grey+alpha, to grey or grey+alpha -anything to a palette, as long as the palette has the requested colors in it -removing alpha channel -higher to smaller bitdepth, and vice versa If you want no color conversion to be done (e.g. for speed or control): -In the encoder, you can make it save a PNG with any color type by giving the raw color mode and LodePNGInfo the same color mode, and setting auto_convert to false. -In the decoder, you can make it store the pixel data in the same color type as the PNG has, by setting the color_convert setting to false. Settings in info_raw are then ignored. The function lodepng_convert does the color conversion. It is available in the interface but normally isn't needed since the encoder and decoder already call it. 6.3. padding bits ----------------- In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines have a bit amount that isn't a multiple of 8, then padding bits are used so that each scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. The raw input image you give to the encoder, and the raw output image you get from the decoder will NOT have these padding bits, e.g. in the case of a 1-bit image with a width of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, not the first bit of a new byte. 6.4. A note about 16-bits per channel and endianness ---------------------------------------------------- LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like for any other color format. The 16-bit values are stored in big endian (most significant byte first) in these arrays. This is the opposite order of the little endian used by x86 CPU's. LodePNG always uses big endian because the PNG file format does so internally. Conversions to other formats than PNG uses internally are not supported by LodePNG on purpose, there are myriads of formats, including endianness of 16-bit colors, the order in which you store R, G, B and A, and so on. Supporting and converting to/from all that is outside the scope of LodePNG. This may mean that, depending on your use case, you may want to convert the big endian output of LodePNG to little endian with a for loop. This is certainly not always needed, many applications and libraries support big endian 16-bit colors anyway, but it means you cannot simply cast the unsigned char* buffer to an unsigned short* buffer on x86 CPUs. 7. error values --------------- All functions in LodePNG that return an error code, return 0 if everything went OK, or a non-zero code if there was an error. The meaning of the LodePNG error values can be retrieved with the function lodepng_error_text: given the numerical error code, it returns a description of the error in English as a string. Check the implementation of lodepng_error_text to see the meaning of each code. 8. chunks and PNG editing ------------------------- If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG editor that should follow the rules about handling of unknown chunks, or if your program is able to read other types of chunks than the ones handled by LodePNG, then that's possible with the chunk functions of LodePNG. A PNG chunk has the following layout: 4 bytes length 4 bytes type name length bytes data 4 bytes CRC 8.1. iterating through chunks ----------------------------- If you have a buffer containing the PNG image data, then the first chunk (the IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the signature of the PNG and are not part of a chunk. But if you start at byte 8 then you have a chunk, and can check the following things of it. NOTE: none of these functions check for memory buffer boundaries. To avoid exploits, always make sure the buffer contains all the data of the chunks. When using lodepng_chunk_next, make sure the returned value is within the allocated memory. unsigned lodepng_chunk_length(const unsigned char* chunk): Get the length of the chunk's data. The total chunk length is this length + 12. void lodepng_chunk_type(char type[5], const unsigned char* chunk): unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): Get the type of the chunk or compare if it's a certain type unsigned char lodepng_chunk_critical(const unsigned char* chunk): unsigned char lodepng_chunk_private(const unsigned char* chunk): unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). Check if the chunk is private (public chunks are part of the standard, private ones not). Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your program doesn't handle that type of unknown chunk. unsigned char* lodepng_chunk_data(unsigned char* chunk): const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): Get a pointer to the start of the data of the chunk. unsigned lodepng_chunk_check_crc(const unsigned char* chunk): void lodepng_chunk_generate_crc(unsigned char* chunk): Check if the crc is correct or generate a correct one. unsigned char* lodepng_chunk_next(unsigned char* chunk): const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these functions do no boundary checking of the allocated data whatsoever, so make sure there is enough data available in the buffer to be able to go to the next chunk. unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, const char* type, const unsigned char* data): These functions are used to create new chunks that are appended to the data in *out that has length *outlength. The append function appends an existing chunk to the new data. The create function creates a new chunk with the given parameters and appends it. Type is the 4-letter name of the chunk. 8.2. chunks in info_png ----------------------- The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 buffers (each with size) to contain 3 types of unknown chunks: the ones that come before the PLTE chunk, the ones that come between the PLTE and the IDAT chunks, and the ones that come after the IDAT chunks. It's necessary to make the distionction between these 3 cases because the PNG standard forces to keep the ordering of unknown chunks compared to the critical chunks, but does not force any other ordering rules. info_png.unknown_chunks_data[0] is the chunks before PLTE info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT info_png.unknown_chunks_data[2] is the chunks after IDAT The chunks in these 3 buffers can be iterated through and read by using the same way described in the previous subchapter. When using the decoder to decode a PNG, you can make it store all unknown chunks if you set the option settings.remember_unknown_chunks to 1. By default, this option is off (0). The encoder will always encode unknown chunks that are stored in the info_png. If you need it to add a particular chunk that isn't known by LodePNG, you can use lodepng_chunk_append or lodepng_chunk_create to the chunk data in info_png.unknown_chunks_data[x]. Chunks that are known by LodePNG should not be added in that way. E.g. to make LodePNG add a bKGD chunk, set background_defined to true and add the correct parameters there instead. 9. compiler support ------------------- No libraries other than the current standard C library are needed to compile LodePNG. For the C++ version, only the standard C++ library is needed on top. Add the files lodepng.c(pp) and lodepng.h to your project, include lodepng.h where needed, and your program can read/write PNG files. It is compatible with C90 and up, and C++03 and up. If performance is important, use optimization when compiling! For both the encoder and decoder, this makes a large difference. Make sure that LodePNG is compiled with the same compiler of the same version and with the same settings as the rest of the program, or the interfaces with std::vectors and std::strings in C++ can be incompatible. CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. *) gcc and g++ LodePNG is developed in gcc so this compiler is natively supported. It gives no warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ version 4.7.1 on Linux, 32-bit and 64-bit. *) Clang Fully supported and warning-free. *) Mingw The Mingw compiler (a port of gcc for Windows) should be fully supported by LodePNG. *) Visual Studio and Visual C++ Express Edition LodePNG should be warning-free with warning level W4. Two warnings were disabled with pragmas though: warning 4244 about implicit conversions, and warning 4996 where it wants to use a non-standard function fopen_s instead of the standard C fopen. Visual Studio may want "stdafx.h" files to be included in each source file and give an error "unexpected end of file while looking for precompiled header". This is not standard C++ and will not be added to the stock LodePNG. You can disable it for lodepng.cpp only by right clicking it, Properties, C/C++, Precompiled Headers, and set it to Not Using Precompiled Headers there. NOTE: Modern versions of VS should be fully supported, but old versions, e.g. VS6, are not guaranteed to work. *) Compilers on Macintosh LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for C and C++. *) Other Compilers If you encounter problems on any compilers, feel free to let me know and I may try to fix it if the compiler is modern and standards complient. 10. examples ------------ This decoder example shows the most basic usage of LodePNG. More complex examples can be found on the LodePNG website. 10.1. decoder C++ example ------------------------- #include "lodepng.h" #include int main(int argc, char *argv[]) { const char* filename = argc > 1 ? argv[1] : "test.png"; //load and decode std::vector image; unsigned width, height; unsigned error = lodepng::decode(image, width, height, filename); //if there's an error, display it if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... } 10.2. decoder C example ----------------------- #include "lodepng.h" int main(int argc, char *argv[]) { unsigned error; unsigned char* image; size_t width, height; const char* filename = argc > 1 ? argv[1] : "test.png"; error = lodepng_decode32_file(&image, &width, &height, filename); if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); / * use image here * / free(image); return 0; } 11. state settings reference ---------------------------- A quick reference of some settings to set on the LodePNGState For decoding: state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums state.decoder.zlibsettings.custom_...: use custom inflate function state.decoder.ignore_crc: ignore CRC checksums state.decoder.ignore_critical: ignore unknown critical chunks state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors state.decoder.color_convert: convert internal PNG color to chosen one state.decoder.read_text_chunks: whether to read in text metadata chunks state.decoder.remember_unknown_chunks: whether to read in unknown chunks state.info_raw.colortype: desired color type for decoded image state.info_raw.bitdepth: desired bit depth for decoded image state.info_raw....: more color settings, see struct LodePNGColorMode state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo For encoding: state.encoder.zlibsettings.btype: disable compression by setting it to 0 state.encoder.zlibsettings.use_lz77: use LZ77 in compression state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching state.encoder.zlibsettings.lazymatching: try one more LZ77 matching state.encoder.zlibsettings.custom_...: use custom deflate function state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png state.encoder.filter_palette_zero: PNG filter strategy for palette state.encoder.filter_strategy: PNG filter strategy to encode with state.encoder.force_palette: add palette even if not encoding to one state.encoder.add_id: add LodePNG identifier and version as a text chunk state.encoder.text_compression: use compressed text chunks for metadata state.info_raw.colortype: color type of raw input image you provide state.info_raw.bitdepth: bit depth of raw input image you provide state.info_raw: more color settings, see struct LodePNGColorMode state.info_png.color.colortype: desired color type if auto_convert is false state.info_png.color.bitdepth: desired bit depth if auto_convert is false state.info_png.color....: more color settings, see struct LodePNGColorMode state.info_png....: more PNG related settings, see struct LodePNGInfo 12. changes ----------- The version number of LodePNG is the date of the change given in the format yyyymmdd. Some changes aren't backwards compatible. Those are indicated with a (!) symbol. *) 10 sep 2018: added way to inspect metadata chunks without full decoding. *) 19 aug 2018 (!): fixed color mode bKGD is encoded with and made it use palette index in case of palette. *) 10 aug 2018 (!): added support for gAMA, cHRM, sRGB and iCCP chunks. This change is backwards compatible unless you relied on unknown_chunks for those. *) 11 jun 2018: less restrictive check for pixel size integer overflow *) 14 jan 2018: allow optionally ignoring a few more recoverable errors *) 17 sep 2017: fix memory leak for some encoder input error cases *) 27 nov 2016: grey+alpha auto color model detection bugfix *) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). *) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within the limits of pure C90). *) 08 dec 2015: Made load_file function return error if file can't be opened. *) 24 okt 2015: Bugfix with decoding to palette output. *) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. *) 23 aug 2014: Reduced needless memory usage of decoder. *) 28 jun 2014: Removed fix_png setting, always support palette OOB for simplicity. Made ColorProfile public. *) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. *) 22 dec 2013: Power of two windowsize required for optimization. *) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. *) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). *) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" prefix for the custom allocators and made it possible with a new #define to use custom ones in your project without needing to change lodepng's code. *) 28 jan 2013: Bugfix with color key. *) 27 okt 2012: Tweaks in text chunk keyword length error handling. *) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. (no palette). Better deflate tree encoding. New compression tweak settings. Faster color conversions while decoding. Some internal cleanups. *) 23 sep 2012: Reduced warnings in Visual Studio a little bit. *) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions and made it work with function pointers instead. *) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc and free functions and toggle #defines from compiler flags. Small fixes. *) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. *) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed redundant C++ codec classes. Reduced amount of structs. Everything changed, but it is cleaner now imho and functionality remains the same. Also fixed several bugs and shrunk the implementation code. Made new samples. *) 6 nov 2011 (!): By default, the encoder now automatically chooses the best PNG color model and bit depth, based on the amount and type of colors of the raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. *) 9 okt 2011: simpler hash chain implementation for the encoder. *) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. *) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. A bug with the PNG filtertype heuristic was fixed, so that it chooses much better ones (it's quite significant). A setting to do an experimental, slow, brute force search for PNG filter types is added. *) 17 aug 2011 (!): changed some C zlib related function names. *) 16 aug 2011: made the code less wide (max 120 characters per line). *) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. *) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. *) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman to optimize long sequences of zeros. *) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and LodePNG_InfoColor_canHaveAlpha functions for convenience. *) 7 nov 2010: added LodePNG_error_text function to get error code description. *) 30 okt 2010: made decoding slightly faster *) 26 okt 2010: (!) changed some C function and struct names (more consistent). Reorganized the documentation and the declaration order in the header. *) 08 aug 2010: only changed some comments and external samples. *) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. *) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. *) 02 sep 2008: fixed bug where it could create empty tree that linux apps could read by ignoring the problem but windows apps couldn't. *) 06 jun 2008: added more error checks for out of memory cases. *) 26 apr 2008: added a few more checks here and there to ensure more safety. *) 06 mar 2008: crash with encoding of strings fixed *) 02 feb 2008: support for international text chunks added (iTXt) *) 23 jan 2008: small cleanups, and #defines to divide code in sections *) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. *) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. *) 17 jan 2008: ability to encode and decode compressed zTXt chunks added Also various fixes, such as in the deflate and the padding bits code. *) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved filtering code of encoder. *) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A C++ wrapper around this provides an interface almost identical to before. Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code are together in these files but it works both for C and C++ compilers. *) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks *) 30 aug 2007: bug fixed which makes this Borland C++ compatible *) 09 aug 2007: some VS2005 warnings removed again *) 21 jul 2007: deflate code placed in new namespace separate from zlib code *) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images *) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing invalid std::vector element [0] fixed, and level 3 and 4 warnings removed *) 02 jun 2007: made the encoder add a tag with version by default *) 27 may 2007: zlib and png code separated (but still in the same file), simple encoder/decoder functions added for more simple usage cases *) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), moved some examples from here to lodepng_examples.cpp *) 12 may 2007: palette decoding bug fixed *) 24 apr 2007: changed the license from BSD to the zlib license *) 11 mar 2007: very simple addition: ability to encode bKGD chunks. *) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding palettized PNG images. Plus little interface change with palette and texts. *) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. Fixed a bug where the end code of a block had length 0 in the Huffman tree. *) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented and supported by the encoder, resulting in smaller PNGs at the output. *) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. *) 24 jan 2007: gave encoder an error interface. Added color conversion from any greyscale type to 8-bit greyscale with or without alpha. *) 21 jan 2007: (!) Totally changed the interface. It allows more color types to convert to and is more uniform. See the manual for how it works now. *) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: encode/decode custom tEXt chunks, separate classes for zlib & deflate, and at last made the decoder give errors for incorrect Adler32 or Crc. *) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. *) 29 dec 2006: Added support for encoding images without alpha channel, and cleaned out code as well as making certain parts faster. *) 28 dec 2006: Added "Settings" to the encoder. *) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. Removed some code duplication in the decoder. Fixed little bug in an example. *) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. Fixed a bug of the decoder with 16-bit per color. *) 15 okt 2006: Changed documentation structure *) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the given image buffer, however for now it's not compressed. *) 08 sep 2006: (!) Changed to interface with a Decoder class *) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different way. Renamed decodePNG to decodePNGGeneric. *) 29 jul 2006: (!) Changed the interface: image info is now returned as a struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. *) 28 jul 2006: Cleaned the code and added new error checks. Corrected terminology "deflate" into "inflate". *) 23 jun 2006: Added SDL example in the documentation in the header, this example allows easy debugging by displaying the PNG and its transparency. *) 22 jun 2006: (!) Changed way to obtain error value. Added loadFile function for convenience. Made decodePNG32 faster. *) 21 jun 2006: (!) Changed type of info vector to unsigned. Changed position of palette in info vector. Fixed an important bug that happened on PNGs with an uncompressed block. *) 16 jun 2006: Internally changed unsigned into unsigned where needed, and performed some optimizations. *) 07 jun 2006: (!) Renamed functions to decodePNG and placed them in LodePNG namespace. Changed the order of the parameters. Rewrote the documentation in the header. Renamed files to lodepng.cpp and lodepng.h *) 22 apr 2006: Optimized and improved some code *) 07 sep 2005: (!) Changed to std::vector interface *) 12 aug 2005: Initial release (C++, decoder only) 13. contact information ----------------------- Feel free to contact me with suggestions, problems, comments, ... concerning LodePNG. If you encounter a PNG image that doesn't work properly with this decoder, feel free to send it and I'll use it to find and fix the problem. My email address is (puzzle the account and domain together with an @ symbol): Domain: gmail dot com. Account: lode dot vandevenne. Copyright (c) 2005-2018 Lode Vandevenne */ openscad-2019.05/src/ext/polyclipping/clipper.cpp0000755000076500000240000040230313402025764022351 0ustar kintelstaff00000000000000/******************************************************************************* * * * Author : Angus Johnson * * Version : 6.2.1 * * Date : 31 October 2014 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2010-2014 * * * * License: * * Use, modification & distribution is subject to Boost Software License Ver 1. * * http://www.boost.org/LICENSE_1_0.txt * * * * Attributions: * * The code in this library is an extension of Bala Vatti's clipping algorithm: * * "A generic solution to polygon clipping" * * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * * http://portal.acm.org/citation.cfm?id=129906 * * * * Computer graphics and geometric modeling: implementation and algorithms * * By Max K. Agoston * * Springer; 1 edition (January 4, 2005) * * http://books.google.com/books?q=vatti+clipping+agoston * * * * See also: * * "Polygon Offsetting by Computing Winding Numbers" * * Paper no. DETC2005-85513 pp. 565-575 * * ASME 2005 International Design Engineering Technical Conferences * * and Computers and Information in Engineering Conference (IDETC/CIE2005) * * September 24-28, 2005 , Long Beach, California, USA * * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * * * *******************************************************************************/ /******************************************************************************* * * * This is a translation of the Delphi Clipper library and the naming style * * used has retained a Delphi flavour. * * * *******************************************************************************/ #include "clipper.hpp" #include #include #include #include #include #include #include #include namespace ClipperLib { static double const pi = 3.141592653589793238; static double const two_pi = pi *2; static double const def_arc_tolerance = 0.25; enum Direction { dRightToLeft, dLeftToRight }; static int const Unassigned = -1; //edge not currently 'owning' a solution static int const Skip = -2; //edge that would otherwise close a path #define HORIZONTAL (-1.0E+40) #define TOLERANCE (1.0e-20) #define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) struct TEdge { IntPoint Bot; IntPoint Curr; IntPoint Top; IntPoint Delta; double Dx; PolyType PolyTyp; EdgeSide Side; int WindDelta; //1 or -1 depending on winding direction int WindCnt; int WindCnt2; //winding count of the opposite polytype int OutIdx; TEdge *Next; TEdge *Prev; TEdge *NextInLML; TEdge *NextInAEL; TEdge *PrevInAEL; TEdge *NextInSEL; TEdge *PrevInSEL; }; struct IntersectNode { TEdge *Edge1; TEdge *Edge2; IntPoint Pt; }; struct LocalMinimum { cInt Y; TEdge *LeftBound; TEdge *RightBound; }; struct OutPt; struct OutRec { int Idx; bool IsHole; bool IsOpen; OutRec *FirstLeft; //see comments in clipper.pas PolyNode *PolyNd; OutPt *Pts; OutPt *BottomPt; }; struct OutPt { int Idx; IntPoint Pt; OutPt *Next; OutPt *Prev; }; struct Join { OutPt *OutPt1; OutPt *OutPt2; IntPoint OffPt; }; struct LocMinSorter { inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2) { return locMin2.Y < locMin1.Y; } }; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ inline cInt Round(double val) { if ((val < 0)) return static_cast(val - 0.5); else return static_cast(val + 0.5); } //------------------------------------------------------------------------------ inline cInt Abs(cInt val) { return val < 0 ? -val : val; } //------------------------------------------------------------------------------ // PolyTree methods ... //------------------------------------------------------------------------------ void PolyTree::Clear() { for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) delete AllNodes[i]; AllNodes.resize(0); Childs.resize(0); } //------------------------------------------------------------------------------ PolyNode* PolyTree::GetFirst() const { if (!Childs.empty()) return Childs[0]; else return 0; } //------------------------------------------------------------------------------ int PolyTree::Total() const { int result = (int)AllNodes.size(); //with negative offsets, ignore the hidden outer polygon ... if (result > 0 && Childs[0] != AllNodes[0]) result--; return result; } //------------------------------------------------------------------------------ // PolyNode methods ... //------------------------------------------------------------------------------ PolyNode::PolyNode(): Childs(), Parent(0), Index(0), m_IsOpen(false) { } //------------------------------------------------------------------------------ int PolyNode::ChildCount() const { return (int)Childs.size(); } //------------------------------------------------------------------------------ void PolyNode::AddChild(PolyNode& child) { unsigned cnt = (unsigned)Childs.size(); Childs.push_back(&child); child.Parent = this; child.Index = cnt; } //------------------------------------------------------------------------------ PolyNode* PolyNode::GetNext() const { if (!Childs.empty()) return Childs[0]; else return GetNextSiblingUp(); } //------------------------------------------------------------------------------ PolyNode* PolyNode::GetNextSiblingUp() const { if (!Parent) //protects against PolyTree.GetNextSiblingUp() return 0; else if (Index == Parent->Childs.size() - 1) return Parent->GetNextSiblingUp(); else return Parent->Childs[Index + 1]; } //------------------------------------------------------------------------------ bool PolyNode::IsHole() const { bool result = true; PolyNode* node = Parent; while (node) { result = !result; node = node->Parent; } return result; } //------------------------------------------------------------------------------ bool PolyNode::IsOpen() const { return m_IsOpen; } //------------------------------------------------------------------------------ #ifndef use_int32 //------------------------------------------------------------------------------ // Int128 class (enables safe math on signed 64bit integers) // eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 // Int128 val2((long64)9223372036854775807); // Int128 val3 = val1 * val2; // val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) //------------------------------------------------------------------------------ class Int128 { public: ulong64 lo; long64 hi; Int128(long64 _lo = 0) { lo = (ulong64)_lo; if (_lo < 0) hi = -1; else hi = 0; } Int128(const Int128 &val): lo(val.lo), hi(val.hi){} Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} Int128& operator = (const long64 &val) { lo = (ulong64)val; if (val < 0) hi = -1; else hi = 0; return *this; } bool operator == (const Int128 &val) const {return (hi == val.hi && lo == val.lo);} bool operator != (const Int128 &val) const { return !(*this == val);} bool operator > (const Int128 &val) const { if (hi != val.hi) return hi > val.hi; else return lo > val.lo; } bool operator < (const Int128 &val) const { if (hi != val.hi) return hi < val.hi; else return lo < val.lo; } bool operator >= (const Int128 &val) const { return !(*this < val);} bool operator <= (const Int128 &val) const { return !(*this > val);} Int128& operator += (const Int128 &rhs) { hi += rhs.hi; lo += rhs.lo; if (lo < rhs.lo) hi++; return *this; } Int128 operator + (const Int128 &rhs) const { Int128 result(*this); result+= rhs; return result; } Int128& operator -= (const Int128 &rhs) { *this += -rhs; return *this; } Int128 operator - (const Int128 &rhs) const { Int128 result(*this); result -= rhs; return result; } Int128 operator-() const //unary negation { if (lo == 0) return Int128(-hi, 0); else return Int128(~hi, ~lo + 1); } operator double() const { const double shift64 = 18446744073709551616.0; //2^64 if (hi < 0) { if (lo == 0) return (double)hi * shift64; else return -(double)(~lo + ~hi * shift64); } else return (double)(lo + hi * shift64); } }; //------------------------------------------------------------------------------ Int128 Int128Mul (long64 lhs, long64 rhs) { bool negate = (lhs < 0) != (rhs < 0); if (lhs < 0) lhs = -lhs; ulong64 int1Hi = ulong64(lhs) >> 32; ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); if (rhs < 0) rhs = -rhs; ulong64 int2Hi = ulong64(rhs) >> 32; ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); //nb: see comments in clipper.pas ulong64 a = int1Hi * int2Hi; ulong64 b = int1Lo * int2Lo; ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; Int128 tmp; tmp.hi = long64(a + (c >> 32)); tmp.lo = long64(c << 32); tmp.lo += long64(b); if (tmp.lo < b) tmp.hi++; if (negate) tmp = -tmp; return tmp; }; #endif //------------------------------------------------------------------------------ // Miscellaneous global functions //------------------------------------------------------------------------------ void Swap(cInt& val1, cInt& val2) { cInt tmp = val1; val1 = val2; val2 = tmp; } //------------------------------------------------------------------------------ bool Orientation(const Path &poly) { return Area(poly) >= 0; } //------------------------------------------------------------------------------ double Area(const Path &poly) { int size = (int)poly.size(); if (size < 3) return 0; double a = 0; for (int i = 0, j = size -1; i < size; ++i) { a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); j = i; } return -a * 0.5; } //------------------------------------------------------------------------------ double Area(const OutRec &outRec) { OutPt *op = outRec.Pts; if (!op) return 0; double a = 0; do { a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y); op = op->Next; } while (op != outRec.Pts); return a * 0.5; } //------------------------------------------------------------------------------ bool PointIsVertex(const IntPoint &Pt, OutPt *pp) { OutPt *pp2 = pp; do { if (pp2->Pt == Pt) return true; pp2 = pp2->Next; } while (pp2 != pp); return false; } //------------------------------------------------------------------------------ int PointInPolygon (const IntPoint &pt, const Path &path) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf int result = 0; size_t cnt = path.size(); if (cnt < 3) return 0; IntPoint ip = path[0]; for(size_t i = 1; i <= cnt; ++i) { IntPoint ipNext = (i == cnt ? path[0] : path[i]); if (ipNext.Y == pt.Y) { if ((ipNext.X == pt.X) || (ip.Y == pt.Y && ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; } if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) { if (ip.X >= pt.X) { if (ipNext.X > pt.X) result = 1 - result; else { double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); if (!d) return -1; if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; } } else { if (ipNext.X > pt.X) { double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); if (!d) return -1; if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; } } } ip = ipNext; } return result; } //------------------------------------------------------------------------------ int PointInPolygon (const IntPoint &pt, OutPt *op) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary int result = 0; OutPt* startOp = op; for(;;) { if (op->Next->Pt.Y == pt.Y) { if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y && ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1; } if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y)) { if (op->Pt.X >= pt.X) { if (op->Next->Pt.X > pt.X) result = 1 - result; else { double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); if (!d) return -1; if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; } } else { if (op->Next->Pt.X > pt.X) { double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); if (!d) return -1; if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; } } } op = op->Next; if (startOp == op) break; } return result; } //------------------------------------------------------------------------------ bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) { OutPt* op = OutPt1; do { //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon int res = PointInPolygon(op->Pt, OutPt2); if (res >= 0) return res > 0; op = op->Next; } while (op != OutPt1); return true; } //---------------------------------------------------------------------- bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) { #ifndef use_int32 if (UseFullInt64Range) return Int128Mul(e1.Delta.Y, e2.Delta.X) == Int128Mul(e1.Delta.X, e2.Delta.Y); else #endif return e1.Delta.Y * e2.Delta.X == e1.Delta.X * e2.Delta.Y; } //------------------------------------------------------------------------------ bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3, bool UseFullInt64Range) { #ifndef use_int32 if (UseFullInt64Range) return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); else #endif return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); } //------------------------------------------------------------------------------ bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) { #ifndef use_int32 if (UseFullInt64Range) return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); else #endif return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); } //------------------------------------------------------------------------------ inline bool IsHorizontal(TEdge &e) { return e.Delta.Y == 0; } //------------------------------------------------------------------------------ inline double GetDx(const IntPoint pt1, const IntPoint pt2) { return (pt1.Y == pt2.Y) ? HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); } //--------------------------------------------------------------------------- inline void SetDx(TEdge &e) { e.Delta.X = (e.Top.X - e.Bot.X); e.Delta.Y = (e.Top.Y - e.Bot.Y); if (e.Delta.Y == 0) e.Dx = HORIZONTAL; else e.Dx = (double)(e.Delta.X) / e.Delta.Y; } //--------------------------------------------------------------------------- inline void SwapSides(TEdge &Edge1, TEdge &Edge2) { EdgeSide Side = Edge1.Side; Edge1.Side = Edge2.Side; Edge2.Side = Side; } //------------------------------------------------------------------------------ inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2) { int OutIdx = Edge1.OutIdx; Edge1.OutIdx = Edge2.OutIdx; Edge2.OutIdx = OutIdx; } //------------------------------------------------------------------------------ inline cInt TopX(TEdge &edge, const cInt currentY) { return ( currentY == edge.Top.Y ) ? edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y)); } //------------------------------------------------------------------------------ void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) { #ifdef use_xyz ip.Z = 0; #endif double b1, b2; if (Edge1.Dx == Edge2.Dx) { ip.Y = Edge1.Curr.Y; ip.X = TopX(Edge1, ip.Y); return; } else if (Edge1.Delta.X == 0) { ip.X = Edge1.Bot.X; if (IsHorizontal(Edge2)) ip.Y = Edge2.Bot.Y; else { b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx); ip.Y = Round(ip.X / Edge2.Dx + b2); } } else if (Edge2.Delta.X == 0) { ip.X = Edge2.Bot.X; if (IsHorizontal(Edge1)) ip.Y = Edge1.Bot.Y; else { b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx); ip.Y = Round(ip.X / Edge1.Dx + b1); } } else { b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; double q = (b2-b1) / (Edge1.Dx - Edge2.Dx); ip.Y = Round(q); if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) ip.X = Round(Edge1.Dx * q + b1); else ip.X = Round(Edge2.Dx * q + b2); } if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) { if (Edge1.Top.Y > Edge2.Top.Y) ip.Y = Edge1.Top.Y; else ip.Y = Edge2.Top.Y; if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) ip.X = TopX(Edge1, ip.Y); else ip.X = TopX(Edge2, ip.Y); } //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... if (ip.Y > Edge1.Curr.Y) { ip.Y = Edge1.Curr.Y; //use the more vertical edge to derive X ... if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) ip.X = TopX(Edge2, ip.Y); else ip.X = TopX(Edge1, ip.Y); } } //------------------------------------------------------------------------------ void ReversePolyPtLinks(OutPt *pp) { if (!pp) return; OutPt *pp1, *pp2; pp1 = pp; do { pp2 = pp1->Next; pp1->Next = pp1->Prev; pp1->Prev = pp2; pp1 = pp2; } while( pp1 != pp ); } //------------------------------------------------------------------------------ void DisposeOutPts(OutPt*& pp) { if (pp == 0) return; pp->Prev->Next = 0; while( pp ) { OutPt *tmpPp = pp; pp = pp->Next; delete tmpPp; } } //------------------------------------------------------------------------------ inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt) { std::memset(e, 0, sizeof(TEdge)); e->Next = eNext; e->Prev = ePrev; e->Curr = Pt; e->OutIdx = Unassigned; } //------------------------------------------------------------------------------ void InitEdge2(TEdge& e, PolyType Pt) { if (e.Curr.Y >= e.Next->Curr.Y) { e.Bot = e.Curr; e.Top = e.Next->Curr; } else { e.Top = e.Curr; e.Bot = e.Next->Curr; } SetDx(e); e.PolyTyp = Pt; } //------------------------------------------------------------------------------ TEdge* RemoveEdge(TEdge* e) { //removes e from double_linked_list (but without removing from memory) e->Prev->Next = e->Next; e->Next->Prev = e->Prev; TEdge* result = e->Next; e->Prev = 0; //flag as removed (see ClipperBase.Clear) return result; } //------------------------------------------------------------------------------ inline void ReverseHorizontal(TEdge &e) { //swap horizontal edges' Top and Bottom x's so they follow the natural //progression of the bounds - ie so their xbots will align with the //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] Swap(e.Top.X, e.Bot.X); #ifdef use_xyz Swap(e.Top.Z, e.Bot.Z); #endif } //------------------------------------------------------------------------------ void SwapPoints(IntPoint &pt1, IntPoint &pt2) { IntPoint tmp = pt1; pt1 = pt2; pt2 = tmp; } //------------------------------------------------------------------------------ bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) { //precondition: segments are Collinear. if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y)) { if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b); if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b); if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a; if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b; return pt1.X < pt2.X; } else { if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b); if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b); if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a; if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b; return pt1.Y > pt2.Y; } } //------------------------------------------------------------------------------ bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) { OutPt *p = btmPt1->Prev; while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev; double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt)); p = btmPt1->Next; while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next; double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt)); p = btmPt2->Prev; while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev; double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt)); p = btmPt2->Next; while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next; double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt)); return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); } //------------------------------------------------------------------------------ OutPt* GetBottomPt(OutPt *pp) { OutPt* dups = 0; OutPt* p = pp->Next; while (p != pp) { if (p->Pt.Y > pp->Pt.Y) { pp = p; dups = 0; } else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X) { if (p->Pt.X < pp->Pt.X) { dups = 0; pp = p; } else { if (p->Next != pp && p->Prev != pp) dups = p; } } p = p->Next; } if (dups) { //there appears to be at least 2 vertices at BottomPt so ... while (dups != p) { if (!FirstIsBottomPt(p, dups)) pp = dups; dups = dups->Next; while (dups->Pt != pp->Pt) dups = dups->Next; } } return pp; } //------------------------------------------------------------------------------ bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3) { if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) return false; else if (pt1.X != pt3.X) return (pt2.X > pt1.X) == (pt2.X < pt3.X); else return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); } //------------------------------------------------------------------------------ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) { if (seg1a > seg1b) Swap(seg1a, seg1b); if (seg2a > seg2b) Swap(seg2a, seg2b); return (seg1a < seg2b) && (seg2a < seg1b); } //------------------------------------------------------------------------------ // ClipperBase class methods ... //------------------------------------------------------------------------------ ClipperBase::ClipperBase() //constructor { m_CurrentLM = m_MinimaList.begin(); //begin() == end() here m_UseFullRange = false; } //------------------------------------------------------------------------------ ClipperBase::~ClipperBase() //destructor { Clear(); } //------------------------------------------------------------------------------ void RangeTest(const IntPoint& Pt, bool& useFullRange) { if (useFullRange) { if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) throw "Coordinate outside allowed range"; } else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) { useFullRange = true; RangeTest(Pt, useFullRange); } } //------------------------------------------------------------------------------ TEdge* FindNextLocMin(TEdge* E) { for (;;) { while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next; if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break; while (IsHorizontal(*E->Prev)) E = E->Prev; TEdge* E2 = E; while (IsHorizontal(*E)) E = E->Next; if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz. if (E2->Prev->Bot.X < E->Bot.X) E = E2; break; } return E; } //------------------------------------------------------------------------------ TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) { TEdge *Result = E; TEdge *Horz = 0; if (E->OutIdx == Skip) { //if edges still remain in the current bound beyond the skip edge then //create another LocMin and call ProcessBound once more if (NextIsForward) { while (E->Top.Y == E->Next->Bot.Y) E = E->Next; //don't include top horizontals when parsing a bound a second time, //they will be contained in the opposite bound ... while (E != Result && IsHorizontal(*E)) E = E->Prev; } else { while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev; while (E != Result && IsHorizontal(*E)) E = E->Next; } if (E == Result) { if (NextIsForward) Result = E->Next; else Result = E->Prev; } else { //there are more edges in the bound beyond result starting with E if (NextIsForward) E = Result->Next; else E = Result->Prev; MinimaList::value_type locMin; locMin.Y = E->Bot.Y; locMin.LeftBound = 0; locMin.RightBound = E; E->WindDelta = 0; Result = ProcessBound(E, NextIsForward); m_MinimaList.push_back(locMin); } return Result; } TEdge *EStart; if (IsHorizontal(*E)) { //We need to be careful with open paths because this may not be a //true local minima (ie E may be following a skip edge). //Also, consecutive horz. edges may start heading left before going right. if (NextIsForward) EStart = E->Prev; else EStart = E->Next; if (EStart->OutIdx != Skip) { if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge { if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) ReverseHorizontal(*E); } else if (EStart->Bot.X != E->Bot.X) ReverseHorizontal(*E); } } EStart = E; if (NextIsForward) { while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) Result = Result->Next; if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) { //nb: at the top of a bound, horizontals are added to the bound //only when the preceding edge attaches to the horizontal's left vertex //unless a Skip edge is encountered when that becomes the top divide Horz = Result; while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; if (Horz->Prev->Top.X == Result->Next->Top.X) { if (!NextIsForward) Result = Horz->Prev; } else if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; } while (E != Result) { E->NextInLML = E->Next; if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); E = E->Next; } if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); Result = Result->Next; //move to the edge just beyond current bound } else { while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) Result = Result->Prev; if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) { Horz = Result; while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; if (Horz->Next->Top.X == Result->Prev->Top.X) { if (!NextIsForward) Result = Horz->Next; } else if (Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; } while (E != Result) { E->NextInLML = E->Prev; if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) ReverseHorizontal(*E); E = E->Prev; } if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) ReverseHorizontal(*E); Result = Result->Prev; //move to the edge just beyond current bound } return Result; } //------------------------------------------------------------------------------ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) { #ifdef use_lines if (!Closed && PolyTyp == ptClip) throw clipperException("AddPath: Open paths must be subject."); #else if (!Closed) throw clipperException("AddPath: Open paths have been disabled."); #endif int highI = (int)pg.size() -1; if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; while (highI > 0 && (pg[highI] == pg[highI -1])) --highI; if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; //create a new edge array ... TEdge *edges = new TEdge [highI +1]; bool IsFlat = true; //1. Basic (first) edge initialization ... try { edges[1].Curr = pg[1]; RangeTest(pg[0], m_UseFullRange); RangeTest(pg[highI], m_UseFullRange); InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]); InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); for (int i = highI - 1; i >= 1; --i) { RangeTest(pg[i], m_UseFullRange); InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); } } catch(...) { delete [] edges; throw; //range test fails } TEdge *eStart = &edges[0]; //2. Remove duplicate vertices, and (when closed) collinear edges ... TEdge *E = eStart, *eLoopStop = eStart; for (;;) { //nb: allows matching start and end points when not Closed ... if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) { if (E == E->Next) break; if (E == eStart) eStart = E->Next; E = RemoveEdge(E); eLoopStop = E; continue; } if (E->Prev == E->Next) break; //only two vertices else if (Closed && SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) && (!m_PreserveCollinear || !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr))) { //Collinear edges are allowed for open paths but in closed paths //the default is to merge adjacent collinear edges into a single edge. //However, if the PreserveCollinear property is enabled, only overlapping //collinear edges (ie spikes) will be removed from closed paths. if (E == eStart) eStart = E->Next; E = RemoveEdge(E); E = E->Prev; eLoopStop = E; continue; } E = E->Next; if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break; } if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) { delete [] edges; return false; } if (!Closed) { m_HasOpenPaths = true; eStart->Prev->OutIdx = Skip; } //3. Do second stage of edge initialization ... E = eStart; do { InitEdge2(*E, PolyTyp); E = E->Next; if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false; } while (E != eStart); //4. Finally, add edge bounds to LocalMinima list ... //Totally flat paths must be handled differently when adding them //to LocalMinima list to avoid endless loops etc ... if (IsFlat) { if (Closed) { delete [] edges; return false; } E->Prev->OutIdx = Skip; if (E->Prev->Bot.X < E->Prev->Top.X) ReverseHorizontal(*E->Prev); MinimaList::value_type locMin; locMin.Y = E->Bot.Y; locMin.LeftBound = 0; locMin.RightBound = E; locMin.RightBound->Side = esRight; locMin.RightBound->WindDelta = 0; while (E->Next->OutIdx != Skip) { E->NextInLML = E->Next; if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); E = E->Next; } m_MinimaList.push_back(locMin); m_edges.push_back(edges); return true; } m_edges.push_back(edges); bool leftBoundIsForward; TEdge* EMin = 0; //workaround to avoid an endless loop in the while loop below when //open paths have matching start and end points ... if (E->Prev->Bot == E->Prev->Top) E = E->Next; for (;;) { E = FindNextLocMin(E); if (E == EMin) break; else if (!EMin) EMin = E; //E and E.Prev now share a local minima (left aligned if horizontal). //Compare their slopes to find which starts which bound ... MinimaList::value_type locMin; locMin.Y = E->Bot.Y; if (E->Dx < E->Prev->Dx) { locMin.LeftBound = E->Prev; locMin.RightBound = E; leftBoundIsForward = false; //Q.nextInLML = Q.prev } else { locMin.LeftBound = E; locMin.RightBound = E->Prev; leftBoundIsForward = true; //Q.nextInLML = Q.next } locMin.LeftBound->Side = esLeft; locMin.RightBound->Side = esRight; if (!Closed) locMin.LeftBound->WindDelta = 0; else if (locMin.LeftBound->Next == locMin.RightBound) locMin.LeftBound->WindDelta = -1; else locMin.LeftBound->WindDelta = 1; locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta; E = ProcessBound(locMin.LeftBound, leftBoundIsForward); if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); if (locMin.LeftBound->OutIdx == Skip) locMin.LeftBound = 0; else if (locMin.RightBound->OutIdx == Skip) locMin.RightBound = 0; m_MinimaList.push_back(locMin); if (!leftBoundIsForward) E = E2; } return true; } //------------------------------------------------------------------------------ bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) { bool result = false; for (Paths::size_type i = 0; i < ppg.size(); ++i) if (AddPath(ppg[i], PolyTyp, Closed)) result = true; return result; } //------------------------------------------------------------------------------ void ClipperBase::Clear() { DisposeLocalMinimaList(); for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) { //for each edge array in turn, find the first used edge and //check for and remove any hiddenPts in each edge in the array. TEdge* edges = m_edges[i]; delete [] edges; } m_edges.clear(); m_UseFullRange = false; m_HasOpenPaths = false; } //------------------------------------------------------------------------------ void ClipperBase::Reset() { m_CurrentLM = m_MinimaList.begin(); if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter()); //reset all edges ... for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) { TEdge* e = lm->LeftBound; if (e) { e->Curr = e->Bot; e->Side = esLeft; e->OutIdx = Unassigned; } e = lm->RightBound; if (e) { e->Curr = e->Bot; e->Side = esRight; e->OutIdx = Unassigned; } } } //------------------------------------------------------------------------------ void ClipperBase::DisposeLocalMinimaList() { m_MinimaList.clear(); m_CurrentLM = m_MinimaList.begin(); } //------------------------------------------------------------------------------ void ClipperBase::PopLocalMinima() { if (m_CurrentLM == m_MinimaList.end()) return; ++m_CurrentLM; } //------------------------------------------------------------------------------ IntRect ClipperBase::GetBounds() { IntRect result; MinimaList::iterator lm = m_MinimaList.begin(); if (lm == m_MinimaList.end()) { result.left = result.top = result.right = result.bottom = 0; return result; } result.left = lm->LeftBound->Bot.X; result.top = lm->LeftBound->Bot.Y; result.right = lm->LeftBound->Bot.X; result.bottom = lm->LeftBound->Bot.Y; while (lm != m_MinimaList.end()) { result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y); TEdge* e = lm->LeftBound; for (;;) { TEdge* bottomE = e; while (e->NextInLML) { if (e->Bot.X < result.left) result.left = e->Bot.X; if (e->Bot.X > result.right) result.right = e->Bot.X; e = e->NextInLML; } result.left = std::min(result.left, e->Bot.X); result.right = std::max(result.right, e->Bot.X); result.left = std::min(result.left, e->Top.X); result.right = std::max(result.right, e->Top.X); result.top = std::min(result.top, e->Top.Y); if (bottomE == lm->LeftBound) e = lm->RightBound; else break; } ++lm; } return result; } //------------------------------------------------------------------------------ // TClipper methods ... //------------------------------------------------------------------------------ Clipper::Clipper(int initOptions) : ClipperBase() //constructor { m_ActiveEdges = 0; m_SortedEdges = 0; m_ExecuteLocked = false; m_UseFullRange = false; m_ReverseOutput = ((initOptions & ioReverseSolution) != 0); m_StrictSimple = ((initOptions & ioStrictlySimple) != 0); m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0); m_HasOpenPaths = false; #ifdef use_xyz m_ZFill = 0; #endif } //------------------------------------------------------------------------------ Clipper::~Clipper() //destructor { Clear(); } //------------------------------------------------------------------------------ #ifdef use_xyz void Clipper::ZFillFunction(ZFillCallback zFillFunc) { m_ZFill = zFillFunc; } //------------------------------------------------------------------------------ #endif void Clipper::Reset() { ClipperBase::Reset(); m_Scanbeam = ScanbeamList(); m_ActiveEdges = 0; m_SortedEdges = 0; for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) InsertScanbeam(lm->Y); } //------------------------------------------------------------------------------ bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType, PolyFillType clipFillType) { if( m_ExecuteLocked ) return false; if (m_HasOpenPaths) throw clipperException("Error: PolyTree struct is need for open path clipping."); m_ExecuteLocked = true; solution.resize(0); m_SubjFillType = subjFillType; m_ClipFillType = clipFillType; m_ClipType = clipType; m_UsingPolyTree = false; bool succeeded = ExecuteInternal(); if (succeeded) BuildResult(solution); DisposeAllOutRecs(); m_ExecuteLocked = false; return succeeded; } //------------------------------------------------------------------------------ bool Clipper::Execute(ClipType clipType, PolyTree& polytree, PolyFillType subjFillType, PolyFillType clipFillType) { if( m_ExecuteLocked ) return false; m_ExecuteLocked = true; m_SubjFillType = subjFillType; m_ClipFillType = clipFillType; m_ClipType = clipType; m_UsingPolyTree = true; bool succeeded = ExecuteInternal(); if (succeeded) BuildResult2(polytree); DisposeAllOutRecs(); m_ExecuteLocked = false; return succeeded; } //------------------------------------------------------------------------------ void Clipper::FixHoleLinkage(OutRec &outrec) { //skip OutRecs that (a) contain outermost polygons or //(b) already have the correct owner/child linkage ... if (!outrec.FirstLeft || (outrec.IsHole != outrec.FirstLeft->IsHole && outrec.FirstLeft->Pts)) return; OutRec* orfl = outrec.FirstLeft; while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts)) orfl = orfl->FirstLeft; outrec.FirstLeft = orfl; } //------------------------------------------------------------------------------ bool Clipper::ExecuteInternal() { bool succeeded = true; try { Reset(); if (m_CurrentLM == m_MinimaList.end()) return true; cInt botY = PopScanbeam(); do { InsertLocalMinimaIntoAEL(botY); ClearGhostJoins(); ProcessHorizontals(false); if (m_Scanbeam.empty()) break; cInt topY = PopScanbeam(); succeeded = ProcessIntersections(topY); if (!succeeded) break; ProcessEdgesAtTopOfScanbeam(topY); botY = topY; } while (!m_Scanbeam.empty() || m_CurrentLM != m_MinimaList.end()); } catch(...) { succeeded = false; } if (succeeded) { //fix orientations ... for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec *outRec = m_PolyOuts[i]; if (!outRec->Pts || outRec->IsOpen) continue; if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) ReversePolyPtLinks(outRec->Pts); } if (!m_Joins.empty()) JoinCommonEdges(); //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec *outRec = m_PolyOuts[i]; if (outRec->Pts && !outRec->IsOpen) FixupOutPolygon(*outRec); } if (m_StrictSimple) DoSimplePolygons(); } ClearJoins(); ClearGhostJoins(); return succeeded; } //------------------------------------------------------------------------------ void Clipper::InsertScanbeam(const cInt Y) { //if (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) return;// avoid duplicates. m_Scanbeam.push(Y); } //------------------------------------------------------------------------------ cInt Clipper::PopScanbeam() { const cInt Y = m_Scanbeam.top(); m_Scanbeam.pop(); while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates. return Y; } //------------------------------------------------------------------------------ void Clipper::DisposeAllOutRecs(){ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) DisposeOutRec(i); m_PolyOuts.clear(); } //------------------------------------------------------------------------------ void Clipper::DisposeOutRec(PolyOutList::size_type index) { OutRec *outRec = m_PolyOuts[index]; if (outRec->Pts) DisposeOutPts(outRec->Pts); delete outRec; m_PolyOuts[index] = 0; } //------------------------------------------------------------------------------ void Clipper::SetWindingCount(TEdge &edge) { TEdge *e = edge.PrevInAEL; //find the edge of the same polytype that immediately preceeds 'edge' in AEL while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL; if (!e) { edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); edge.WindCnt2 = 0; e = m_ActiveEdges; //ie get ready to calc WindCnt2 } else if (edge.WindDelta == 0 && m_ClipType != ctUnion) { edge.WindCnt = 1; edge.WindCnt2 = e->WindCnt2; e = e->NextInAEL; //ie get ready to calc WindCnt2 } else if (IsEvenOddFillType(edge)) { //EvenOdd filling ... if (edge.WindDelta == 0) { //are we inside a subj polygon ... bool Inside = true; TEdge *e2 = e->PrevInAEL; while (e2) { if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0) Inside = !Inside; e2 = e2->PrevInAEL; } edge.WindCnt = (Inside ? 0 : 1); } else { edge.WindCnt = edge.WindDelta; } edge.WindCnt2 = e->WindCnt2; e = e->NextInAEL; //ie get ready to calc WindCnt2 } else { //nonZero, Positive or Negative filling ... if (e->WindCnt * e->WindDelta < 0) { //prev edge is 'decreasing' WindCount (WC) toward zero //so we're outside the previous polygon ... if (Abs(e->WindCnt) > 1) { //outside prev poly but still inside another. //when reversing direction of prev poly use the same WC if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; //otherwise continue to 'decrease' WC ... else edge.WindCnt = e->WindCnt + edge.WindDelta; } else //now outside all polys of same polytype so set own WC ... edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); } else { //prev edge is 'increasing' WindCount (WC) away from zero //so we're inside the previous polygon ... if (edge.WindDelta == 0) edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1); //if wind direction is reversing prev then use same WC else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; //otherwise add to WC ... else edge.WindCnt = e->WindCnt + edge.WindDelta; } edge.WindCnt2 = e->WindCnt2; e = e->NextInAEL; //ie get ready to calc WindCnt2 } //update WindCnt2 ... if (IsEvenOddAltFillType(edge)) { //EvenOdd filling ... while (e != &edge) { if (e->WindDelta != 0) edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); e = e->NextInAEL; } } else { //nonZero, Positive or Negative filling ... while ( e != &edge ) { edge.WindCnt2 += e->WindDelta; e = e->NextInAEL; } } } //------------------------------------------------------------------------------ bool Clipper::IsEvenOddFillType(const TEdge& edge) const { if (edge.PolyTyp == ptSubject) return m_SubjFillType == pftEvenOdd; else return m_ClipFillType == pftEvenOdd; } //------------------------------------------------------------------------------ bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const { if (edge.PolyTyp == ptSubject) return m_ClipFillType == pftEvenOdd; else return m_SubjFillType == pftEvenOdd; } //------------------------------------------------------------------------------ bool Clipper::IsContributing(const TEdge& edge) const { PolyFillType pft, pft2; if (edge.PolyTyp == ptSubject) { pft = m_SubjFillType; pft2 = m_ClipFillType; } else { pft = m_ClipFillType; pft2 = m_SubjFillType; } switch(pft) { case pftEvenOdd: //return false if a subj line has been flagged as inside a subj polygon if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; break; case pftNonZero: if (Abs(edge.WindCnt) != 1) return false; break; case pftPositive: if (edge.WindCnt != 1) return false; break; default: //pftNegative if (edge.WindCnt != -1) return false; } switch(m_ClipType) { case ctIntersection: switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 != 0); case pftPositive: return (edge.WindCnt2 > 0); default: return (edge.WindCnt2 < 0); } break; case ctUnion: switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 == 0); case pftPositive: return (edge.WindCnt2 <= 0); default: return (edge.WindCnt2 >= 0); } break; case ctDifference: if (edge.PolyTyp == ptSubject) switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 == 0); case pftPositive: return (edge.WindCnt2 <= 0); default: return (edge.WindCnt2 >= 0); } else switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 != 0); case pftPositive: return (edge.WindCnt2 > 0); default: return (edge.WindCnt2 < 0); } break; case ctXor: if (edge.WindDelta == 0) //XOr always contributing unless open switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 == 0); case pftPositive: return (edge.WindCnt2 <= 0); default: return (edge.WindCnt2 >= 0); } else return true; break; default: return true; } } //------------------------------------------------------------------------------ OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) { OutPt* result; TEdge *e, *prevE; if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) { result = AddOutPt(e1, Pt); e2->OutIdx = e1->OutIdx; e1->Side = esLeft; e2->Side = esRight; e = e1; if (e->PrevInAEL == e2) prevE = e2->PrevInAEL; else prevE = e->PrevInAEL; } else { result = AddOutPt(e2, Pt); e1->OutIdx = e2->OutIdx; e1->Side = esRight; e2->Side = esLeft; e = e2; if (e->PrevInAEL == e1) prevE = e1->PrevInAEL; else prevE = e->PrevInAEL; } if (prevE && prevE->OutIdx >= 0 && (TopX(*prevE, Pt.Y) == TopX(*e, Pt.Y)) && SlopesEqual(*e, *prevE, m_UseFullRange) && (e->WindDelta != 0) && (prevE->WindDelta != 0)) { OutPt* outPt = AddOutPt(prevE, Pt); AddJoin(result, outPt, e->Top); } return result; } //------------------------------------------------------------------------------ void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) { AddOutPt( e1, Pt ); if (e2->WindDelta == 0) AddOutPt(e2, Pt); if( e1->OutIdx == e2->OutIdx ) { e1->OutIdx = Unassigned; e2->OutIdx = Unassigned; } else if (e1->OutIdx < e2->OutIdx) AppendPolygon(e1, e2); else AppendPolygon(e2, e1); } //------------------------------------------------------------------------------ void Clipper::AddEdgeToSEL(TEdge *edge) { //SEL pointers in PEdge are reused to build a list of horizontal edges. //However, we don't need to worry about order with horizontal edge processing. if( !m_SortedEdges ) { m_SortedEdges = edge; edge->PrevInSEL = 0; edge->NextInSEL = 0; } else { edge->NextInSEL = m_SortedEdges; edge->PrevInSEL = 0; m_SortedEdges->PrevInSEL = edge; m_SortedEdges = edge; } } //------------------------------------------------------------------------------ void Clipper::CopyAELToSEL() { TEdge* e = m_ActiveEdges; m_SortedEdges = e; while ( e ) { e->PrevInSEL = e->PrevInAEL; e->NextInSEL = e->NextInAEL; e = e->NextInAEL; } } //------------------------------------------------------------------------------ void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt) { Join* j = new Join; j->OutPt1 = op1; j->OutPt2 = op2; j->OffPt = OffPt; m_Joins.push_back(j); } //------------------------------------------------------------------------------ void Clipper::ClearJoins() { for (JoinList::size_type i = 0; i < m_Joins.size(); i++) delete m_Joins[i]; m_Joins.resize(0); } //------------------------------------------------------------------------------ void Clipper::ClearGhostJoins() { for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++) delete m_GhostJoins[i]; m_GhostJoins.resize(0); } //------------------------------------------------------------------------------ void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) { Join* j = new Join; j->OutPt1 = op; j->OutPt2 = 0; j->OffPt = OffPt; m_GhostJoins.push_back(j); } //------------------------------------------------------------------------------ void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) { while (m_CurrentLM != m_MinimaList.end() && (m_CurrentLM->Y == botY)) { TEdge* lb = m_CurrentLM->LeftBound; TEdge* rb = m_CurrentLM->RightBound; PopLocalMinima(); OutPt *Op1 = 0; if (!lb) { //nb: don't insert LB into either AEL or SEL InsertEdgeIntoAEL(rb, 0); SetWindingCount(*rb); if (IsContributing(*rb)) Op1 = AddOutPt(rb, rb->Bot); } else if (!rb) { InsertEdgeIntoAEL(lb, 0); SetWindingCount(*lb); if (IsContributing(*lb)) Op1 = AddOutPt(lb, lb->Bot); InsertScanbeam(lb->Top.Y); } else { InsertEdgeIntoAEL(lb, 0); InsertEdgeIntoAEL(rb, lb); SetWindingCount( *lb ); rb->WindCnt = lb->WindCnt; rb->WindCnt2 = lb->WindCnt2; if (IsContributing(*lb)) Op1 = AddLocalMinPoly(lb, rb, lb->Bot); InsertScanbeam(lb->Top.Y); } if (rb) { if(IsHorizontal(*rb)) AddEdgeToSEL(rb); else InsertScanbeam( rb->Top.Y ); } if (!lb || !rb) continue; //if any output polygons share an edge, they'll need joining later ... if (Op1 && IsHorizontal(*rb) && m_GhostJoins.size() > 0 && (rb->WindDelta != 0)) { for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) { Join* jr = m_GhostJoins[i]; //if the horizontal Rb and a 'ghost' horizontal overlap, then convert //the 'ghost' join to a real join ready for later ... if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) AddJoin(jr->OutPt1, Op1, jr->OffPt); } } if (lb->OutIdx >= 0 && lb->PrevInAEL && lb->PrevInAEL->Curr.X == lb->Bot.X && lb->PrevInAEL->OutIdx >= 0 && SlopesEqual(*lb->PrevInAEL, *lb, m_UseFullRange) && (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0)) { OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot); AddJoin(Op1, Op2, lb->Top); } if(lb->NextInAEL != rb) { if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 && SlopesEqual(*rb->PrevInAEL, *rb, m_UseFullRange) && (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0)) { OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot); AddJoin(Op1, Op2, rb->Top); } TEdge* e = lb->NextInAEL; if (e) { while( e != rb ) { //nb: For calculating winding counts etc, IntersectEdges() assumes //that param1 will be to the Right of param2 ABOVE the intersection ... IntersectEdges(rb , e , lb->Curr); //order important here e = e->NextInAEL; } } } } } //------------------------------------------------------------------------------ void Clipper::DeleteFromAEL(TEdge *e) { TEdge* AelPrev = e->PrevInAEL; TEdge* AelNext = e->NextInAEL; if( !AelPrev && !AelNext && (e != m_ActiveEdges) ) return; //already deleted if( AelPrev ) AelPrev->NextInAEL = AelNext; else m_ActiveEdges = AelNext; if( AelNext ) AelNext->PrevInAEL = AelPrev; e->NextInAEL = 0; e->PrevInAEL = 0; } //------------------------------------------------------------------------------ void Clipper::DeleteFromSEL(TEdge *e) { TEdge* SelPrev = e->PrevInSEL; TEdge* SelNext = e->NextInSEL; if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted if( SelPrev ) SelPrev->NextInSEL = SelNext; else m_SortedEdges = SelNext; if( SelNext ) SelNext->PrevInSEL = SelPrev; e->NextInSEL = 0; e->PrevInSEL = 0; } //------------------------------------------------------------------------------ #ifdef use_xyz void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2) { if (pt.Z != 0 || !m_ZFill) return; else if (pt == e1.Bot) pt.Z = e1.Bot.Z; else if (pt == e1.Top) pt.Z = e1.Top.Z; else if (pt == e2.Bot) pt.Z = e2.Bot.Z; else if (pt == e2.Top) pt.Z = e2.Top.Z; else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); } //------------------------------------------------------------------------------ #endif void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) { bool e1Contributing = ( e1->OutIdx >= 0 ); bool e2Contributing = ( e2->OutIdx >= 0 ); #ifdef use_xyz SetZ(Pt, *e1, *e2); #endif #ifdef use_lines //if either edge is on an OPEN path ... if (e1->WindDelta == 0 || e2->WindDelta == 0) { //ignore subject-subject open path intersections UNLESS they //are both open paths, AND they are both 'contributing maximas' ... if (e1->WindDelta == 0 && e2->WindDelta == 0) return; //if intersecting a subj line with a subj poly ... else if (e1->PolyTyp == e2->PolyTyp && e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion) { if (e1->WindDelta == 0) { if (e2Contributing) { AddOutPt(e1, Pt); if (e1Contributing) e1->OutIdx = Unassigned; } } else { if (e1Contributing) { AddOutPt(e2, Pt); if (e2Contributing) e2->OutIdx = Unassigned; } } } else if (e1->PolyTyp != e2->PolyTyp) { //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ... if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && (m_ClipType != ctUnion || e2->WindCnt2 == 0)) { AddOutPt(e1, Pt); if (e1Contributing) e1->OutIdx = Unassigned; } else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && (m_ClipType != ctUnion || e1->WindCnt2 == 0)) { AddOutPt(e2, Pt); if (e2Contributing) e2->OutIdx = Unassigned; } } return; } #endif //update winding counts... //assumes that e1 will be to the Right of e2 ABOVE the intersection if ( e1->PolyTyp == e2->PolyTyp ) { if ( IsEvenOddFillType( *e1) ) { int oldE1WindCnt = e1->WindCnt; e1->WindCnt = e2->WindCnt; e2->WindCnt = oldE1WindCnt; } else { if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt; else e1->WindCnt += e2->WindDelta; if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt; else e2->WindCnt -= e1->WindDelta; } } else { if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta; else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0; if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta; else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0; } PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; if (e1->PolyTyp == ptSubject) { e1FillType = m_SubjFillType; e1FillType2 = m_ClipFillType; } else { e1FillType = m_ClipFillType; e1FillType2 = m_SubjFillType; } if (e2->PolyTyp == ptSubject) { e2FillType = m_SubjFillType; e2FillType2 = m_ClipFillType; } else { e2FillType = m_ClipFillType; e2FillType2 = m_SubjFillType; } cInt e1Wc, e2Wc; switch (e1FillType) { case pftPositive: e1Wc = e1->WindCnt; break; case pftNegative: e1Wc = -e1->WindCnt; break; default: e1Wc = Abs(e1->WindCnt); } switch(e2FillType) { case pftPositive: e2Wc = e2->WindCnt; break; case pftNegative: e2Wc = -e2->WindCnt; break; default: e2Wc = Abs(e2->WindCnt); } if ( e1Contributing && e2Contributing ) { if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) ) { AddLocalMaxPoly(e1, e2, Pt); } else { AddOutPt(e1, Pt); AddOutPt(e2, Pt); SwapSides( *e1 , *e2 ); SwapPolyIndexes( *e1 , *e2 ); } } else if ( e1Contributing ) { if (e2Wc == 0 || e2Wc == 1) { AddOutPt(e1, Pt); SwapSides(*e1, *e2); SwapPolyIndexes(*e1, *e2); } } else if ( e2Contributing ) { if (e1Wc == 0 || e1Wc == 1) { AddOutPt(e2, Pt); SwapSides(*e1, *e2); SwapPolyIndexes(*e1, *e2); } } else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) { //neither edge is currently contributing ... cInt e1Wc2, e2Wc2; switch (e1FillType2) { case pftPositive: e1Wc2 = e1->WindCnt2; break; case pftNegative : e1Wc2 = -e1->WindCnt2; break; default: e1Wc2 = Abs(e1->WindCnt2); } switch (e2FillType2) { case pftPositive: e2Wc2 = e2->WindCnt2; break; case pftNegative: e2Wc2 = -e2->WindCnt2; break; default: e2Wc2 = Abs(e2->WindCnt2); } if (e1->PolyTyp != e2->PolyTyp) { AddLocalMinPoly(e1, e2, Pt); } else if (e1Wc == 1 && e2Wc == 1) switch( m_ClipType ) { case ctIntersection: if (e1Wc2 > 0 && e2Wc2 > 0) AddLocalMinPoly(e1, e2, Pt); break; case ctUnion: if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) AddLocalMinPoly(e1, e2, Pt); break; case ctDifference: if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) AddLocalMinPoly(e1, e2, Pt); break; case ctXor: AddLocalMinPoly(e1, e2, Pt); } else SwapSides( *e1, *e2 ); } } //------------------------------------------------------------------------------ void Clipper::SetHoleState(TEdge *e, OutRec *outrec) { bool IsHole = false; TEdge *e2 = e->PrevInAEL; while (e2) { if (e2->OutIdx >= 0 && e2->WindDelta != 0) { IsHole = !IsHole; if (! outrec->FirstLeft) outrec->FirstLeft = m_PolyOuts[e2->OutIdx]; } e2 = e2->PrevInAEL; } if (IsHole) outrec->IsHole = true; } //------------------------------------------------------------------------------ OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) { //work out which polygon fragment has the correct hole state ... if (!outRec1->BottomPt) outRec1->BottomPt = GetBottomPt(outRec1->Pts); if (!outRec2->BottomPt) outRec2->BottomPt = GetBottomPt(outRec2->Pts); OutPt *OutPt1 = outRec1->BottomPt; OutPt *OutPt2 = outRec2->BottomPt; if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1; else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2; else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1; else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2; else if (OutPt1->Next == OutPt1) return outRec2; else if (OutPt2->Next == OutPt2) return outRec1; else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1; else return outRec2; } //------------------------------------------------------------------------------ bool Param1RightOfParam2(OutRec* outRec1, OutRec* outRec2) { do { outRec1 = outRec1->FirstLeft; if (outRec1 == outRec2) return true; } while (outRec1); return false; } //------------------------------------------------------------------------------ OutRec* Clipper::GetOutRec(int Idx) { OutRec* outrec = m_PolyOuts[Idx]; while (outrec != m_PolyOuts[outrec->Idx]) outrec = m_PolyOuts[outrec->Idx]; return outrec; } //------------------------------------------------------------------------------ void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) { //get the start and ends of both output polygons ... OutRec *outRec1 = m_PolyOuts[e1->OutIdx]; OutRec *outRec2 = m_PolyOuts[e2->OutIdx]; OutRec *holeStateRec; if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2; else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1; else holeStateRec = GetLowermostRec(outRec1, outRec2); //get the start and ends of both output polygons and //join e2 poly onto e1 poly and delete pointers to e2 ... OutPt* p1_lft = outRec1->Pts; OutPt* p1_rt = p1_lft->Prev; OutPt* p2_lft = outRec2->Pts; OutPt* p2_rt = p2_lft->Prev; EdgeSide Side; //join e2 poly onto e1 poly and delete pointers to e2 ... if( e1->Side == esLeft ) { if( e2->Side == esLeft ) { //z y x a b c ReversePolyPtLinks(p2_lft); p2_lft->Next = p1_lft; p1_lft->Prev = p2_lft; p1_rt->Next = p2_rt; p2_rt->Prev = p1_rt; outRec1->Pts = p2_rt; } else { //x y z a b c p2_rt->Next = p1_lft; p1_lft->Prev = p2_rt; p2_lft->Prev = p1_rt; p1_rt->Next = p2_lft; outRec1->Pts = p2_lft; } Side = esLeft; } else { if( e2->Side == esRight ) { //a b c z y x ReversePolyPtLinks(p2_lft); p1_rt->Next = p2_rt; p2_rt->Prev = p1_rt; p2_lft->Next = p1_lft; p1_lft->Prev = p2_lft; } else { //a b c x y z p1_rt->Next = p2_lft; p2_lft->Prev = p1_rt; p1_lft->Prev = p2_rt; p2_rt->Next = p1_lft; } Side = esRight; } outRec1->BottomPt = 0; if (holeStateRec == outRec2) { if (outRec2->FirstLeft != outRec1) outRec1->FirstLeft = outRec2->FirstLeft; outRec1->IsHole = outRec2->IsHole; } outRec2->Pts = 0; outRec2->BottomPt = 0; outRec2->FirstLeft = outRec1; int OKIdx = e1->OutIdx; int ObsoleteIdx = e2->OutIdx; e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly e2->OutIdx = Unassigned; TEdge* e = m_ActiveEdges; while( e ) { if( e->OutIdx == ObsoleteIdx ) { e->OutIdx = OKIdx; e->Side = Side; break; } e = e->NextInAEL; } outRec2->Idx = outRec1->Idx; } //------------------------------------------------------------------------------ OutRec* Clipper::CreateOutRec() { OutRec* result = new OutRec; result->IsHole = false; result->IsOpen = false; result->FirstLeft = 0; result->Pts = 0; result->BottomPt = 0; result->PolyNd = 0; m_PolyOuts.push_back(result); result->Idx = (int)m_PolyOuts.size()-1; return result; } //------------------------------------------------------------------------------ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) { bool ToFront = (e->Side == esLeft); if( e->OutIdx < 0 ) { OutRec *outRec = CreateOutRec(); outRec->IsOpen = (e->WindDelta == 0); OutPt* newOp = new OutPt; outRec->Pts = newOp; newOp->Idx = outRec->Idx; newOp->Pt = pt; newOp->Next = newOp; newOp->Prev = newOp; if (!outRec->IsOpen) SetHoleState(e, outRec); e->OutIdx = outRec->Idx; return newOp; } else { OutRec *outRec = m_PolyOuts[e->OutIdx]; //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' OutPt* op = outRec->Pts; if (ToFront && (pt == op->Pt)) return op; else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev; OutPt* newOp = new OutPt; newOp->Idx = outRec->Idx; newOp->Pt = pt; newOp->Next = op; newOp->Prev = op->Prev; newOp->Prev->Next = newOp; op->Prev = newOp; if (ToFront) outRec->Pts = newOp; return newOp; } } //------------------------------------------------------------------------------ void Clipper::ProcessHorizontals(bool IsTopOfScanbeam) { TEdge* horzEdge = m_SortedEdges; while(horzEdge) { DeleteFromSEL(horzEdge); ProcessHorizontal(horzEdge, IsTopOfScanbeam); horzEdge = m_SortedEdges; } } //------------------------------------------------------------------------------ inline bool IsMinima(TEdge *e) { return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e); } //------------------------------------------------------------------------------ inline bool IsMaxima(TEdge *e, const cInt Y) { return e && e->Top.Y == Y && !e->NextInLML; } //------------------------------------------------------------------------------ inline bool IsIntermediate(TEdge *e, const cInt Y) { return e->Top.Y == Y && e->NextInLML; } //------------------------------------------------------------------------------ TEdge *GetMaximaPair(TEdge *e) { TEdge* result = 0; if ((e->Next->Top == e->Top) && !e->Next->NextInLML) result = e->Next; else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML) result = e->Prev; if (result && (result->OutIdx == Skip || //result is false if both NextInAEL & PrevInAEL are nil & not horizontal ... (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) return 0; return result; } //------------------------------------------------------------------------------ void Clipper::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2) { //check that one or other edge hasn't already been removed from AEL ... if (Edge1->NextInAEL == Edge1->PrevInAEL || Edge2->NextInAEL == Edge2->PrevInAEL) return; if( Edge1->NextInAEL == Edge2 ) { TEdge* Next = Edge2->NextInAEL; if( Next ) Next->PrevInAEL = Edge1; TEdge* Prev = Edge1->PrevInAEL; if( Prev ) Prev->NextInAEL = Edge2; Edge2->PrevInAEL = Prev; Edge2->NextInAEL = Edge1; Edge1->PrevInAEL = Edge2; Edge1->NextInAEL = Next; } else if( Edge2->NextInAEL == Edge1 ) { TEdge* Next = Edge1->NextInAEL; if( Next ) Next->PrevInAEL = Edge2; TEdge* Prev = Edge2->PrevInAEL; if( Prev ) Prev->NextInAEL = Edge1; Edge1->PrevInAEL = Prev; Edge1->NextInAEL = Edge2; Edge2->PrevInAEL = Edge1; Edge2->NextInAEL = Next; } else { TEdge* Next = Edge1->NextInAEL; TEdge* Prev = Edge1->PrevInAEL; Edge1->NextInAEL = Edge2->NextInAEL; if( Edge1->NextInAEL ) Edge1->NextInAEL->PrevInAEL = Edge1; Edge1->PrevInAEL = Edge2->PrevInAEL; if( Edge1->PrevInAEL ) Edge1->PrevInAEL->NextInAEL = Edge1; Edge2->NextInAEL = Next; if( Edge2->NextInAEL ) Edge2->NextInAEL->PrevInAEL = Edge2; Edge2->PrevInAEL = Prev; if( Edge2->PrevInAEL ) Edge2->PrevInAEL->NextInAEL = Edge2; } if( !Edge1->PrevInAEL ) m_ActiveEdges = Edge1; else if( !Edge2->PrevInAEL ) m_ActiveEdges = Edge2; } //------------------------------------------------------------------------------ void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2) { if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return; if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return; if( Edge1->NextInSEL == Edge2 ) { TEdge* Next = Edge2->NextInSEL; if( Next ) Next->PrevInSEL = Edge1; TEdge* Prev = Edge1->PrevInSEL; if( Prev ) Prev->NextInSEL = Edge2; Edge2->PrevInSEL = Prev; Edge2->NextInSEL = Edge1; Edge1->PrevInSEL = Edge2; Edge1->NextInSEL = Next; } else if( Edge2->NextInSEL == Edge1 ) { TEdge* Next = Edge1->NextInSEL; if( Next ) Next->PrevInSEL = Edge2; TEdge* Prev = Edge2->PrevInSEL; if( Prev ) Prev->NextInSEL = Edge1; Edge1->PrevInSEL = Prev; Edge1->NextInSEL = Edge2; Edge2->PrevInSEL = Edge1; Edge2->NextInSEL = Next; } else { TEdge* Next = Edge1->NextInSEL; TEdge* Prev = Edge1->PrevInSEL; Edge1->NextInSEL = Edge2->NextInSEL; if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1; Edge1->PrevInSEL = Edge2->PrevInSEL; if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1; Edge2->NextInSEL = Next; if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2; Edge2->PrevInSEL = Prev; if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2; } if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1; else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2; } //------------------------------------------------------------------------------ TEdge* GetNextInAEL(TEdge *e, Direction dir) { return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL; } //------------------------------------------------------------------------------ void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right) { if (HorzEdge.Bot.X < HorzEdge.Top.X) { Left = HorzEdge.Bot.X; Right = HorzEdge.Top.X; Dir = dLeftToRight; } else { Left = HorzEdge.Top.X; Right = HorzEdge.Bot.X; Dir = dRightToLeft; } } //------------------------------------------------------------------------ /******************************************************************************* * Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or * * Bottom of a scanbeam) are processed as if layered. The order in which HEs * * are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] * * (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), * * and with other non-horizontal edges [*]. Once these intersections are * * processed, intermediate HEs then 'promote' the Edge above (NextInLML) into * * the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. * *******************************************************************************/ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) { Direction dir; cInt horzLeft, horzRight; GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); TEdge* eLastHorz = horzEdge, *eMaxPair = 0; while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML)) eLastHorz = eLastHorz->NextInLML; if (!eLastHorz->NextInLML) eMaxPair = GetMaximaPair(eLastHorz); for (;;) { bool IsLastHorz = (horzEdge == eLastHorz); TEdge* e = GetNextInAEL(horzEdge, dir); while(e) { //Break if we've got to the end of an intermediate horizontal edge ... //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML && e->Dx < horzEdge->NextInLML->Dx) break; TEdge* eNext = GetNextInAEL(e, dir); //saves eNext for later if ((dir == dLeftToRight && e->Curr.X <= horzRight) || (dir == dRightToLeft && e->Curr.X >= horzLeft)) { //so far we're still in range of the horizontal Edge but make sure //we're at the last of consec. horizontals when matching with eMaxPair if(e == eMaxPair && IsLastHorz) { if (horzEdge->OutIdx >= 0) { OutPt* op1 = AddOutPt(horzEdge, horzEdge->Top); TEdge* eNextHorz = m_SortedEdges; while (eNextHorz) { if (eNextHorz->OutIdx >= 0 && HorzSegmentsOverlap(horzEdge->Bot.X, horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) { OutPt* op2 = AddOutPt(eNextHorz, eNextHorz->Bot); AddJoin(op2, op1, eNextHorz->Top); } eNextHorz = eNextHorz->NextInSEL; } AddGhostJoin(op1, horzEdge->Bot); AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top); } DeleteFromAEL(horzEdge); DeleteFromAEL(eMaxPair); return; } else if(dir == dLeftToRight) { IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); IntersectEdges(horzEdge, e, Pt); } else { IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); IntersectEdges( e, horzEdge, Pt); } SwapPositionsInAEL( horzEdge, e ); } else if( (dir == dLeftToRight && e->Curr.X >= horzRight) || (dir == dRightToLeft && e->Curr.X <= horzLeft) ) break; e = eNext; } //end while if (horzEdge->NextInLML && IsHorizontal(*horzEdge->NextInLML)) { UpdateEdgeIntoAEL(horzEdge); if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot); GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); } else break; } //end for (;;) if(horzEdge->NextInLML) { if(horzEdge->OutIdx >= 0) { OutPt* op1 = AddOutPt( horzEdge, horzEdge->Top); if (isTopOfScanbeam) AddGhostJoin(op1, horzEdge->Bot); UpdateEdgeIntoAEL(horzEdge); if (horzEdge->WindDelta == 0) return; //nb: HorzEdge is no longer horizontal here TEdge* ePrev = horzEdge->PrevInAEL; TEdge* eNext = horzEdge->NextInAEL; if (ePrev && ePrev->Curr.X == horzEdge->Bot.X && ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 && (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && SlopesEqual(*horzEdge, *ePrev, m_UseFullRange))) { OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot); AddJoin(op1, op2, horzEdge->Top); } else if (eNext && eNext->Curr.X == horzEdge->Bot.X && eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 && eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && SlopesEqual(*horzEdge, *eNext, m_UseFullRange)) { OutPt* op2 = AddOutPt(eNext, horzEdge->Bot); AddJoin(op1, op2, horzEdge->Top); } } else UpdateEdgeIntoAEL(horzEdge); } else { if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top); DeleteFromAEL(horzEdge); } } //------------------------------------------------------------------------------ void Clipper::UpdateEdgeIntoAEL(TEdge *&e) { if( !e->NextInLML ) throw clipperException("UpdateEdgeIntoAEL: invalid call"); e->NextInLML->OutIdx = e->OutIdx; TEdge* AelPrev = e->PrevInAEL; TEdge* AelNext = e->NextInAEL; if (AelPrev) AelPrev->NextInAEL = e->NextInLML; else m_ActiveEdges = e->NextInLML; if (AelNext) AelNext->PrevInAEL = e->NextInLML; e->NextInLML->Side = e->Side; e->NextInLML->WindDelta = e->WindDelta; e->NextInLML->WindCnt = e->WindCnt; e->NextInLML->WindCnt2 = e->WindCnt2; e = e->NextInLML; e->Curr = e->Bot; e->PrevInAEL = AelPrev; e->NextInAEL = AelNext; if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y); } //------------------------------------------------------------------------------ bool Clipper::ProcessIntersections(const cInt topY) { if( !m_ActiveEdges ) return true; try { BuildIntersectList(topY); size_t IlSize = m_IntersectList.size(); if (IlSize == 0) return true; if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList(); else return false; } catch(...) { m_SortedEdges = 0; DisposeIntersectNodes(); throw clipperException("ProcessIntersections error"); } m_SortedEdges = 0; return true; } //------------------------------------------------------------------------------ void Clipper::DisposeIntersectNodes() { for (size_t i = 0; i < m_IntersectList.size(); ++i ) delete m_IntersectList[i]; m_IntersectList.clear(); } //------------------------------------------------------------------------------ void Clipper::BuildIntersectList(const cInt topY) { if ( !m_ActiveEdges ) return; //prepare for sorting ... TEdge* e = m_ActiveEdges; m_SortedEdges = e; while( e ) { e->PrevInSEL = e->PrevInAEL; e->NextInSEL = e->NextInAEL; e->Curr.X = TopX( *e, topY ); e = e->NextInAEL; } //bubblesort ... bool isModified; do { isModified = false; e = m_SortedEdges; while( e->NextInSEL ) { TEdge *eNext = e->NextInSEL; IntPoint Pt; if(e->Curr.X > eNext->Curr.X) { IntersectPoint(*e, *eNext, Pt); IntersectNode * newNode = new IntersectNode; newNode->Edge1 = e; newNode->Edge2 = eNext; newNode->Pt = Pt; m_IntersectList.push_back(newNode); SwapPositionsInSEL(e, eNext); isModified = true; } else e = eNext; } if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0; else break; } while ( isModified ); m_SortedEdges = 0; //important } //------------------------------------------------------------------------------ void Clipper::ProcessIntersectList() { for (size_t i = 0; i < m_IntersectList.size(); ++i) { IntersectNode* iNode = m_IntersectList[i]; { IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt); SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 ); } delete iNode; } m_IntersectList.clear(); } //------------------------------------------------------------------------------ bool IntersectListSort(IntersectNode* node1, IntersectNode* node2) { return node2->Pt.Y < node1->Pt.Y; } //------------------------------------------------------------------------------ inline bool EdgesAdjacent(const IntersectNode &inode) { return (inode.Edge1->NextInSEL == inode.Edge2) || (inode.Edge1->PrevInSEL == inode.Edge2); } //------------------------------------------------------------------------------ bool Clipper::FixupIntersectionOrder() { //pre-condition: intersections are sorted Bottom-most first. //Now it's crucial that intersections are made only between adjacent edges, //so to ensure this the order of intersections may need adjusting ... CopyAELToSEL(); std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort); size_t cnt = m_IntersectList.size(); for (size_t i = 0; i < cnt; ++i) { if (!EdgesAdjacent(*m_IntersectList[i])) { size_t j = i + 1; while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++; if (j == cnt) return false; std::swap(m_IntersectList[i], m_IntersectList[j]); } SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2); } return true; } //------------------------------------------------------------------------------ void Clipper::DoMaxima(TEdge *e) { TEdge* eMaxPair = GetMaximaPair(e); if (!eMaxPair) { if (e->OutIdx >= 0) AddOutPt(e, e->Top); DeleteFromAEL(e); return; } TEdge* eNext = e->NextInAEL; while(eNext && eNext != eMaxPair) { IntersectEdges(e, eNext, e->Top); SwapPositionsInAEL(e, eNext); eNext = e->NextInAEL; } if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned) { DeleteFromAEL(e); DeleteFromAEL(eMaxPair); } else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) { if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); DeleteFromAEL(e); DeleteFromAEL(eMaxPair); } #ifdef use_lines else if (e->WindDelta == 0) { if (e->OutIdx >= 0) { AddOutPt(e, e->Top); e->OutIdx = Unassigned; } DeleteFromAEL(e); if (eMaxPair->OutIdx >= 0) { AddOutPt(eMaxPair, e->Top); eMaxPair->OutIdx = Unassigned; } DeleteFromAEL(eMaxPair); } #endif else throw clipperException("DoMaxima error"); } //------------------------------------------------------------------------------ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) { TEdge* e = m_ActiveEdges; while( e ) { //1. process maxima, treating them as if they're 'bent' horizontal edges, // but exclude maxima with horizontal edges. nb: e can't be a horizontal. bool IsMaximaEdge = IsMaxima(e, topY); if(IsMaximaEdge) { TEdge* eMaxPair = GetMaximaPair(e); IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair)); } if(IsMaximaEdge) { TEdge* ePrev = e->PrevInAEL; DoMaxima(e); if( !ePrev ) e = m_ActiveEdges; else e = ePrev->NextInAEL; } else { //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML)) { UpdateEdgeIntoAEL(e); if (e->OutIdx >= 0) AddOutPt(e, e->Bot); AddEdgeToSEL(e); } else { e->Curr.X = TopX( *e, topY ); e->Curr.Y = topY; } if (m_StrictSimple) { TEdge* ePrev = e->PrevInAEL; if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) { IntPoint pt = e->Curr; #ifdef use_xyz SetZ(pt, *ePrev, *e); #endif OutPt* op = AddOutPt(ePrev, pt); OutPt* op2 = AddOutPt(e, pt); AddJoin(op, op2, pt); //StrictlySimple (type-3) join } } e = e->NextInAEL; } } //3. Process horizontals at the Top of the scanbeam ... ProcessHorizontals(true); //4. Promote intermediate vertices ... e = m_ActiveEdges; while(e) { if(IsIntermediate(e, topY)) { OutPt* op = 0; if( e->OutIdx >= 0 ) op = AddOutPt(e, e->Top); UpdateEdgeIntoAEL(e); //if output polygons share an edge, they'll need joining later ... TEdge* ePrev = e->PrevInAEL; TEdge* eNext = e->NextInAEL; if (ePrev && ePrev->Curr.X == e->Bot.X && ePrev->Curr.Y == e->Bot.Y && op && ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && SlopesEqual(*e, *ePrev, m_UseFullRange) && (e->WindDelta != 0) && (ePrev->WindDelta != 0)) { OutPt* op2 = AddOutPt(ePrev, e->Bot); AddJoin(op, op2, e->Top); } else if (eNext && eNext->Curr.X == e->Bot.X && eNext->Curr.Y == e->Bot.Y && op && eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && SlopesEqual(*e, *eNext, m_UseFullRange) && (e->WindDelta != 0) && (eNext->WindDelta != 0)) { OutPt* op2 = AddOutPt(eNext, e->Bot); AddJoin(op, op2, e->Top); } } e = e->NextInAEL; } } //------------------------------------------------------------------------------ void Clipper::FixupOutPolygon(OutRec &outrec) { //FixupOutPolygon() - removes duplicate points and simplifies consecutive //parallel edges by removing the middle vertex. OutPt *lastOK = 0; outrec.BottomPt = 0; OutPt *pp = outrec.Pts; for (;;) { if (pp->Prev == pp || pp->Prev == pp->Next ) { DisposeOutPts(pp); outrec.Pts = 0; return; } //test for duplicate points and collinear edges ... if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) || (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) && (!m_PreserveCollinear || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt)))) { lastOK = 0; OutPt *tmp = pp; pp->Prev->Next = pp->Next; pp->Next->Prev = pp->Prev; pp = pp->Prev; delete tmp; } else if (pp == lastOK) break; else { if (!lastOK) lastOK = pp; pp = pp->Next; } } outrec.Pts = pp; } //------------------------------------------------------------------------------ int PointCount(OutPt *Pts) { if (!Pts) return 0; int result = 0; OutPt* p = Pts; do { result++; p = p->Next; } while (p != Pts); return result; } //------------------------------------------------------------------------------ void Clipper::BuildResult(Paths &polys) { polys.reserve(m_PolyOuts.size()); for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { if (!m_PolyOuts[i]->Pts) continue; Path pg; OutPt* p = m_PolyOuts[i]->Pts->Prev; int cnt = PointCount(p); if (cnt < 2) continue; pg.reserve(cnt); for (int i = 0; i < cnt; ++i) { pg.push_back(p->Pt); p = p->Prev; } polys.push_back(pg); } } //------------------------------------------------------------------------------ void Clipper::BuildResult2(PolyTree& polytree) { polytree.Clear(); polytree.AllNodes.reserve(m_PolyOuts.size()); //add each output polygon/contour to polytree ... for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) { OutRec* outRec = m_PolyOuts[i]; int cnt = PointCount(outRec->Pts); if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue; FixHoleLinkage(*outRec); PolyNode* pn = new PolyNode(); //nb: polytree takes ownership of all the PolyNodes polytree.AllNodes.push_back(pn); outRec->PolyNd = pn; pn->Parent = 0; pn->Index = 0; pn->Contour.reserve(cnt); OutPt *op = outRec->Pts->Prev; for (int j = 0; j < cnt; j++) { pn->Contour.push_back(op->Pt); op = op->Prev; } } //fixup PolyNode links etc ... polytree.Childs.reserve(m_PolyOuts.size()); for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) { OutRec* outRec = m_PolyOuts[i]; if (!outRec->PolyNd) continue; if (outRec->IsOpen) { outRec->PolyNd->m_IsOpen = true; polytree.AddChild(*outRec->PolyNd); } else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd) outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd); else polytree.AddChild(*outRec->PolyNd); } } //------------------------------------------------------------------------------ void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) { //just swap the contents (because fIntersectNodes is a single-linked-list) IntersectNode inode = int1; //gets a copy of Int1 int1.Edge1 = int2.Edge1; int1.Edge2 = int2.Edge2; int1.Pt = int2.Pt; int2.Edge1 = inode.Edge1; int2.Edge2 = inode.Edge2; int2.Pt = inode.Pt; } //------------------------------------------------------------------------------ inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) { if (e2.Curr.X == e1.Curr.X) { if (e2.Top.Y > e1.Top.Y) return e2.Top.X < TopX(e1, e2.Top.Y); else return e1.Top.X > TopX(e2, e1.Top.Y); } else return e2.Curr.X < e1.Curr.X; } //------------------------------------------------------------------------------ bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2, cInt& Left, cInt& Right) { if (a1 < a2) { if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);} else {Left = std::max(a1,b2); Right = std::min(a2,b1);} } else { if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);} else {Left = std::max(a2,b2); Right = std::min(a1,b1);} } return Left < Right; } //------------------------------------------------------------------------------ inline void UpdateOutPtIdxs(OutRec& outrec) { OutPt* op = outrec.Pts; do { op->Idx = outrec.Idx; op = op->Prev; } while(op != outrec.Pts); } //------------------------------------------------------------------------------ void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge) { if(!m_ActiveEdges) { edge->PrevInAEL = 0; edge->NextInAEL = 0; m_ActiveEdges = edge; } else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge)) { edge->PrevInAEL = 0; edge->NextInAEL = m_ActiveEdges; m_ActiveEdges->PrevInAEL = edge; m_ActiveEdges = edge; } else { if(!startEdge) startEdge = m_ActiveEdges; while(startEdge->NextInAEL && !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge)) startEdge = startEdge->NextInAEL; edge->NextInAEL = startEdge->NextInAEL; if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge; edge->PrevInAEL = startEdge; startEdge->NextInAEL = edge; } } //---------------------------------------------------------------------- OutPt* DupOutPt(OutPt* outPt, bool InsertAfter) { OutPt* result = new OutPt; result->Pt = outPt->Pt; result->Idx = outPt->Idx; if (InsertAfter) { result->Next = outPt->Next; result->Prev = outPt; outPt->Next->Prev = result; outPt->Next = result; } else { result->Prev = outPt->Prev; result->Next = outPt; outPt->Prev->Next = result; outPt->Prev = result; } return result; } //------------------------------------------------------------------------------ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b, const IntPoint Pt, bool DiscardLeft) { Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight); Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight); if (Dir1 == Dir2) return false; //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) //So, to facilitate this while inserting Op1b and Op2b ... //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) if (Dir1 == dLeftToRight) { while (op1->Next->Pt.X <= Pt.X && op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) op1 = op1->Next; if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; op1b = DupOutPt(op1, !DiscardLeft); if (op1b->Pt != Pt) { op1 = op1b; op1->Pt = Pt; op1b = DupOutPt(op1, !DiscardLeft); } } else { while (op1->Next->Pt.X >= Pt.X && op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) op1 = op1->Next; if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; op1b = DupOutPt(op1, DiscardLeft); if (op1b->Pt != Pt) { op1 = op1b; op1->Pt = Pt; op1b = DupOutPt(op1, DiscardLeft); } } if (Dir2 == dLeftToRight) { while (op2->Next->Pt.X <= Pt.X && op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) op2 = op2->Next; if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; op2b = DupOutPt(op2, !DiscardLeft); if (op2b->Pt != Pt) { op2 = op2b; op2->Pt = Pt; op2b = DupOutPt(op2, !DiscardLeft); }; } else { while (op2->Next->Pt.X >= Pt.X && op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) op2 = op2->Next; if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; op2b = DupOutPt(op2, DiscardLeft); if (op2b->Pt != Pt) { op2 = op2b; op2->Pt = Pt; op2b = DupOutPt(op2, DiscardLeft); }; }; if ((Dir1 == dLeftToRight) == DiscardLeft) { op1->Prev = op2; op2->Next = op1; op1b->Next = op2b; op2b->Prev = op1b; } else { op1->Next = op2; op2->Prev = op1; op1b->Prev = op2b; op2b->Next = op1b; } return true; } //------------------------------------------------------------------------------ bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) { OutPt *op1 = j->OutPt1, *op1b; OutPt *op2 = j->OutPt2, *op2b; //There are 3 kinds of joins for output polygons ... //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are a vertices anywhere //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same //location at the Bottom of the overlapping segment (& Join.OffPt is above). //3. StrictSimple joins where edges touch but are not collinear and where //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y); if (isHorizontal && (j->OffPt == j->OutPt1->Pt) && (j->OffPt == j->OutPt2->Pt)) { //Strictly Simple join ... if (outRec1 != outRec2) return false; op1b = j->OutPt1->Next; while (op1b != op1 && (op1b->Pt == j->OffPt)) op1b = op1b->Next; bool reverse1 = (op1b->Pt.Y > j->OffPt.Y); op2b = j->OutPt2->Next; while (op2b != op2 && (op2b->Pt == j->OffPt)) op2b = op2b->Next; bool reverse2 = (op2b->Pt.Y > j->OffPt.Y); if (reverse1 == reverse2) return false; if (reverse1) { op1b = DupOutPt(op1, false); op2b = DupOutPt(op2, true); op1->Prev = op2; op2->Next = op1; op1b->Next = op2b; op2b->Prev = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } else { op1b = DupOutPt(op1, true); op2b = DupOutPt(op2, false); op1->Next = op2; op2->Prev = op1; op1b->Prev = op2b; op2b->Next = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } } else if (isHorizontal) { //treat horizontal joins differently to non-horizontal joins since with //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt //may be anywhere along the horizontal edge. op1b = op1; while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2) op1 = op1->Prev; while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2) op1b = op1b->Next; if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon' op2b = op2; while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b) op2 = op2->Prev; while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1) op2b = op2b->Next; if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon' cInt Left, Right; //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right)) return false; //DiscardLeftSide: when overlapping edges are joined, a spike will created //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up //on the discard Side as either may still be needed for other joins ... IntPoint Pt; bool DiscardLeftSide; if (op1->Pt.X >= Left && op1->Pt.X <= Right) { Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X); } else if (op2->Pt.X >= Left&& op2->Pt.X <= Right) { Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X); } else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right) { Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X; } else { Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X); } j->OutPt1 = op1; j->OutPt2 = op2; return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); } else { //nb: For non-horizontal joins ... // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y // 2. Jr.OutPt1.Pt > Jr.OffPt.Y //make sure the polygons are correctly oriented ... op1b = op1->Next; while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next; bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) || !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)); if (Reverse1) { op1b = op1->Prev; while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev; if ((op1b->Pt.Y > op1->Pt.Y) || !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false; }; op2b = op2->Next; while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next; bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) || !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)); if (Reverse2) { op2b = op2->Prev; while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev; if ((op2b->Pt.Y > op2->Pt.Y) || !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false; } if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; if (Reverse1) { op1b = DupOutPt(op1, false); op2b = DupOutPt(op2, true); op1->Prev = op2; op2->Next = op1; op1b->Next = op2b; op2b->Prev = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } else { op1b = DupOutPt(op1, true); op2b = DupOutPt(op2, false); op1->Next = op2; op2->Prev = op1; op1b->Prev = op2b; op2b->Next = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } } } //---------------------------------------------------------------------- static OutRec* ParseFirstLeft(OutRec* FirstLeft) { while (FirstLeft && !FirstLeft->Pts) FirstLeft = FirstLeft->FirstLeft; return FirstLeft; } //------------------------------------------------------------------------------ void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) { //tests if NewOutRec contains the polygon before reassigning FirstLeft for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec* outRec = m_PolyOuts[i]; if (!outRec->Pts || !outRec->FirstLeft) continue; OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); if (firstLeft == OldOutRec) { if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) outRec->FirstLeft = NewOutRec; } } } //---------------------------------------------------------------------- void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) { //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec* outRec = m_PolyOuts[i]; if (outRec->FirstLeft == OldOutRec) outRec->FirstLeft = NewOutRec; } } //---------------------------------------------------------------------- void Clipper::JoinCommonEdges() { for (JoinList::size_type i = 0; i < m_Joins.size(); i++) { Join* join = m_Joins[i]; OutRec *outRec1 = GetOutRec(join->OutPt1->Idx); OutRec *outRec2 = GetOutRec(join->OutPt2->Idx); if (!outRec1->Pts || !outRec2->Pts) continue; //get the polygon fragment with the correct hole state (FirstLeft) //before calling JoinPoints() ... OutRec *holeStateRec; if (outRec1 == outRec2) holeStateRec = outRec1; else if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2; else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1; else holeStateRec = GetLowermostRec(outRec1, outRec2); if (!JoinPoints(join, outRec1, outRec2)) continue; if (outRec1 == outRec2) { //instead of joining two polygons, we've just created a new one by //splitting one polygon into two. outRec1->Pts = join->OutPt1; outRec1->BottomPt = 0; outRec2 = CreateOutRec(); outRec2->Pts = join->OutPt2; //update all OutRec2.Pts Idx's ... UpdateOutPtIdxs(*outRec2); //We now need to check every OutRec.FirstLeft pointer. If it points //to OutRec1 it may need to point to OutRec2 instead ... if (m_UsingPolyTree) for (PolyOutList::size_type j = 0; j < m_PolyOuts.size() - 1; j++) { OutRec* oRec = m_PolyOuts[j]; if (!oRec->Pts || ParseFirstLeft(oRec->FirstLeft) != outRec1 || oRec->IsHole == outRec1->IsHole) continue; if (Poly2ContainsPoly1(oRec->Pts, join->OutPt2)) oRec->FirstLeft = outRec2; } if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts)) { //outRec2 is contained by outRec1 ... outRec2->IsHole = !outRec1->IsHole; outRec2->FirstLeft = outRec1; //fixup FirstLeft pointers that may need reassigning to OutRec1 if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0)) ReversePolyPtLinks(outRec2->Pts); } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts)) { //outRec1 is contained by outRec2 ... outRec2->IsHole = outRec1->IsHole; outRec1->IsHole = !outRec2->IsHole; outRec2->FirstLeft = outRec1->FirstLeft; outRec1->FirstLeft = outRec2; //fixup FirstLeft pointers that may need reassigning to OutRec1 if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0)) ReversePolyPtLinks(outRec1->Pts); } else { //the 2 polygons are completely separate ... outRec2->IsHole = outRec1->IsHole; outRec2->FirstLeft = outRec1->FirstLeft; //fixup FirstLeft pointers that may need reassigning to OutRec2 if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); } } else { //joined 2 polygons together ... outRec2->Pts = 0; outRec2->BottomPt = 0; outRec2->Idx = outRec1->Idx; outRec1->IsHole = holeStateRec->IsHole; if (holeStateRec == outRec2) outRec1->FirstLeft = outRec2->FirstLeft; outRec2->FirstLeft = outRec1; //fixup FirstLeft pointers that may need reassigning to OutRec1 if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); } } } //------------------------------------------------------------------------------ // ClipperOffset support functions ... //------------------------------------------------------------------------------ DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) { if(pt2.X == pt1.X && pt2.Y == pt1.Y) return DoublePoint(0, 0); double Dx = (double)(pt2.X - pt1.X); double dy = (double)(pt2.Y - pt1.Y); double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy ); Dx *= f; dy *= f; return DoublePoint(dy, -Dx); } //------------------------------------------------------------------------------ // ClipperOffset class //------------------------------------------------------------------------------ ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) { this->MiterLimit = miterLimit; this->ArcTolerance = arcTolerance; m_lowest.X = -1; } //------------------------------------------------------------------------------ ClipperOffset::~ClipperOffset() { Clear(); } //------------------------------------------------------------------------------ void ClipperOffset::Clear() { for (int i = 0; i < m_polyNodes.ChildCount(); ++i) delete m_polyNodes.Childs[i]; m_polyNodes.Childs.clear(); m_lowest.X = -1; } //------------------------------------------------------------------------------ void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType) { int highI = (int)path.size() - 1; if (highI < 0) return; PolyNode* newNode = new PolyNode(); newNode->m_jointype = joinType; newNode->m_endtype = endType; //strip duplicate points from path and also get index to the lowest point ... if (endType == etClosedLine || endType == etClosedPolygon) while (highI > 0 && path[0] == path[highI]) highI--; newNode->Contour.reserve(highI + 1); newNode->Contour.push_back(path[0]); int j = 0, k = 0; for (int i = 1; i <= highI; i++) if (newNode->Contour[j] != path[i]) { j++; newNode->Contour.push_back(path[i]); if (path[i].Y > newNode->Contour[k].Y || (path[i].Y == newNode->Contour[k].Y && path[i].X < newNode->Contour[k].X)) k = j; } if (endType == etClosedPolygon && j < 2) { delete newNode; return; } m_polyNodes.AddChild(*newNode); //if this path's lowest pt is lower than all the others then update m_lowest if (endType != etClosedPolygon) return; if (m_lowest.X < 0) m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); else { IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y]; if (newNode->Contour[k].Y > ip.Y || (newNode->Contour[k].Y == ip.Y && newNode->Contour[k].X < ip.X)) m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); } } //------------------------------------------------------------------------------ void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType) { for (Paths::size_type i = 0; i < paths.size(); ++i) AddPath(paths[i], joinType, endType); } //------------------------------------------------------------------------------ void ClipperOffset::FixOrientations() { //fixup orientations of all closed paths if the orientation of the //closed path with the lowermost vertex is wrong ... if (m_lowest.X >= 0 && !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) { for (int i = 0; i < m_polyNodes.ChildCount(); ++i) { PolyNode& node = *m_polyNodes.Childs[i]; if (node.m_endtype == etClosedPolygon || (node.m_endtype == etClosedLine && Orientation(node.Contour))) ReversePath(node.Contour); } } else { for (int i = 0; i < m_polyNodes.ChildCount(); ++i) { PolyNode& node = *m_polyNodes.Childs[i]; if (node.m_endtype == etClosedLine && !Orientation(node.Contour)) ReversePath(node.Contour); } } } //------------------------------------------------------------------------------ void ClipperOffset::Execute(Paths& solution, double delta) { solution.clear(); FixOrientations(); DoOffset(delta); //now clean up 'corners' ... Clipper clpr; clpr.AddPaths(m_destPolys, ptSubject, true); if (delta > 0) { clpr.Execute(ctUnion, solution, pftPositive, pftPositive); } else { IntRect r = clpr.GetBounds(); Path outer(4); outer[0] = IntPoint(r.left - 10, r.bottom + 10); outer[1] = IntPoint(r.right + 10, r.bottom + 10); outer[2] = IntPoint(r.right + 10, r.top - 10); outer[3] = IntPoint(r.left - 10, r.top - 10); clpr.AddPath(outer, ptSubject, true); clpr.ReverseSolution(true); clpr.Execute(ctUnion, solution, pftNegative, pftNegative); if (solution.size() > 0) solution.erase(solution.begin()); } } //------------------------------------------------------------------------------ void ClipperOffset::Execute(PolyTree& solution, double delta) { solution.Clear(); FixOrientations(); DoOffset(delta); //now clean up 'corners' ... Clipper clpr; clpr.AddPaths(m_destPolys, ptSubject, true); if (delta > 0) { clpr.Execute(ctUnion, solution, pftPositive, pftPositive); } else { IntRect r = clpr.GetBounds(); Path outer(4); outer[0] = IntPoint(r.left - 10, r.bottom + 10); outer[1] = IntPoint(r.right + 10, r.bottom + 10); outer[2] = IntPoint(r.right + 10, r.top - 10); outer[3] = IntPoint(r.left - 10, r.top - 10); clpr.AddPath(outer, ptSubject, true); clpr.ReverseSolution(true); clpr.Execute(ctUnion, solution, pftNegative, pftNegative); //remove the outer PolyNode rectangle ... if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) { PolyNode* outerNode = solution.Childs[0]; solution.Childs.reserve(outerNode->ChildCount()); solution.Childs[0] = outerNode->Childs[0]; solution.Childs[0]->Parent = outerNode->Parent; for (int i = 1; i < outerNode->ChildCount(); ++i) solution.AddChild(*outerNode->Childs[i]); } else solution.Clear(); } } //------------------------------------------------------------------------------ void ClipperOffset::DoOffset(double delta) { m_destPolys.clear(); m_delta = delta; //if Zero offset, just copy any CLOSED polygons to m_p and return ... if (NEAR_ZERO(delta)) { m_destPolys.reserve(m_polyNodes.ChildCount()); for (int i = 0; i < m_polyNodes.ChildCount(); i++) { PolyNode& node = *m_polyNodes.Childs[i]; if (node.m_endtype == etClosedPolygon) m_destPolys.push_back(node.Contour); } return; } //see offset_triginometry3.svg in the documentation folder ... if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit); else m_miterLim = 0.5; double y; if (ArcTolerance <= 0.0) y = def_arc_tolerance; else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance) y = std::fabs(delta) * def_arc_tolerance; else y = ArcTolerance; //see offset_triginometry2.svg in the documentation folder ... double steps = pi / std::acos(1 - y / std::fabs(delta)); if (steps > std::fabs(delta) * pi) steps = std::fabs(delta) * pi; //ie excessive precision check m_sin = std::sin(two_pi / steps); m_cos = std::cos(two_pi / steps); m_StepsPerRad = steps / two_pi; if (delta < 0.0) m_sin = -m_sin; m_destPolys.reserve(m_polyNodes.ChildCount() * 2); for (int i = 0; i < m_polyNodes.ChildCount(); i++) { PolyNode& node = *m_polyNodes.Childs[i]; m_srcPoly = node.Contour; int len = (int)m_srcPoly.size(); if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon))) continue; m_destPoly.clear(); if (len == 1) { if (node.m_jointype == jtRound) { double X = 1.0, Y = 0.0; for (cInt j = 1; j <= steps; j++) { m_destPoly.push_back(IntPoint( Round(m_srcPoly[0].X + X * delta), Round(m_srcPoly[0].Y + Y * delta))); double X2 = X; X = X * m_cos - m_sin * Y; Y = X2 * m_sin + Y * m_cos; } } else { double X = -1.0, Y = -1.0; for (int j = 0; j < 4; ++j) { m_destPoly.push_back(IntPoint( Round(m_srcPoly[0].X + X * delta), Round(m_srcPoly[0].Y + Y * delta))); if (X < 0) X = 1; else if (Y < 0) Y = 1; else X = -1; } } m_destPolys.push_back(m_destPoly); continue; } //build m_normals ... m_normals.clear(); m_normals.reserve(len); for (int j = 0; j < len - 1; ++j) m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon) m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); else m_normals.push_back(DoublePoint(m_normals[len - 2])); if (node.m_endtype == etClosedPolygon) { int k = len - 1; for (int j = 0; j < len; ++j) OffsetPoint(j, k, node.m_jointype); m_destPolys.push_back(m_destPoly); } else if (node.m_endtype == etClosedLine) { int k = len - 1; for (int j = 0; j < len; ++j) OffsetPoint(j, k, node.m_jointype); m_destPolys.push_back(m_destPoly); m_destPoly.clear(); //re-build m_normals ... DoublePoint n = m_normals[len -1]; for (int j = len - 1; j > 0; j--) m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); m_normals[0] = DoublePoint(-n.X, -n.Y); k = 0; for (int j = len - 1; j >= 0; j--) OffsetPoint(j, k, node.m_jointype); m_destPolys.push_back(m_destPoly); } else { int k = 0; for (int j = 1; j < len - 1; ++j) OffsetPoint(j, k, node.m_jointype); IntPoint pt1; if (node.m_endtype == etOpenButt) { int j = len - 1; pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); m_destPoly.push_back(pt1); pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); m_destPoly.push_back(pt1); } else { int j = len - 1; k = len - 2; m_sinA = 0; m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y); if (node.m_endtype == etOpenSquare) DoSquare(j, k); else DoRound(j, k); } //re-build m_normals ... for (int j = len - 1; j > 0; j--) m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y); k = len - 1; for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype); if (node.m_endtype == etOpenButt) { pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); m_destPoly.push_back(pt1); pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); m_destPoly.push_back(pt1); } else { k = 1; m_sinA = 0; if (node.m_endtype == etOpenSquare) DoSquare(0, 1); else DoRound(0, 1); } m_destPolys.push_back(m_destPoly); } } } //------------------------------------------------------------------------------ void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype) { //cross product ... m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); if (std::fabs(m_sinA * m_delta) < 1.0) { //dot product ... double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y ); if (cosA > 0) // angle => 0 degrees { m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); return; } //else angle => 180 degrees } else if (m_sinA > 1.0) m_sinA = 1.0; else if (m_sinA < -1.0) m_sinA = -1.0; if (m_sinA * m_delta < 0) { m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); m_destPoly.push_back(m_srcPoly[j]); m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); } else switch (jointype) { case jtMiter: { double r = 1 + (m_normals[j].X * m_normals[k].X + m_normals[j].Y * m_normals[k].Y); if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); break; } case jtSquare: DoSquare(j, k); break; case jtRound: DoRound(j, k); break; } k = j; } //------------------------------------------------------------------------------ void ClipperOffset::DoSquare(int j, int k) { double dx = std::tan(std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); } //------------------------------------------------------------------------------ void ClipperOffset::DoMiter(int j, int k, double r) { double q = m_delta / r; m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); } //------------------------------------------------------------------------------ void ClipperOffset::DoRound(int j, int k) { double a = std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); double X = m_normals[k].X, Y = m_normals[k].Y, X2; for (int i = 0; i < steps; ++i) { m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + X * m_delta), Round(m_srcPoly[j].Y + Y * m_delta))); X2 = X; X = X * m_cos - m_sin * Y; Y = X2 * m_sin + Y * m_cos; } m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + m_normals[j].X * m_delta), Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); } //------------------------------------------------------------------------------ // Miscellaneous public functions //------------------------------------------------------------------------------ void Clipper::DoSimplePolygons() { PolyOutList::size_type i = 0; while (i < m_PolyOuts.size()) { OutRec* outrec = m_PolyOuts[i++]; OutPt* op = outrec->Pts; if (!op || outrec->IsOpen) continue; do //for each Pt in Polygon until duplicate found do ... { OutPt* op2 = op->Next; while (op2 != outrec->Pts) { if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op) { //split the polygon into two ... OutPt* op3 = op->Prev; OutPt* op4 = op2->Prev; op->Prev = op4; op4->Next = op; op2->Prev = op3; op3->Next = op2; outrec->Pts = op; OutRec* outrec2 = CreateOutRec(); outrec2->Pts = op2; UpdateOutPtIdxs(*outrec2); if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts)) { //OutRec2 is contained by OutRec1 ... outrec2->IsHole = !outrec->IsHole; outrec2->FirstLeft = outrec; if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); } else if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) { //OutRec1 is contained by OutRec2 ... outrec2->IsHole = outrec->IsHole; outrec->IsHole = !outrec2->IsHole; outrec2->FirstLeft = outrec->FirstLeft; outrec->FirstLeft = outrec2; if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); } else { //the 2 polygons are separate ... outrec2->IsHole = outrec->IsHole; outrec2->FirstLeft = outrec->FirstLeft; if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); } op2 = op; //ie get ready for the Next iteration } op2 = op2->Next; } op = op->Next; } while (op != outrec->Pts); } } //------------------------------------------------------------------------------ void ReversePath(Path& p) { std::reverse(p.begin(), p.end()); } //------------------------------------------------------------------------------ void ReversePaths(Paths& p) { for (Paths::size_type i = 0; i < p.size(); ++i) ReversePath(p[i]); } //------------------------------------------------------------------------------ void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) { Clipper c; c.StrictlySimple(true); c.AddPath(in_poly, ptSubject, true); c.Execute(ctUnion, out_polys, fillType, fillType); } //------------------------------------------------------------------------------ void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) { Clipper c; c.StrictlySimple(true); c.AddPaths(in_polys, ptSubject, true); c.Execute(ctUnion, out_polys, fillType, fillType); } //------------------------------------------------------------------------------ void SimplifyPolygons(Paths &polys, PolyFillType fillType) { SimplifyPolygons(polys, polys, fillType); } //------------------------------------------------------------------------------ inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) { double Dx = ((double)pt1.X - pt2.X); double dy = ((double)pt1.Y - pt2.Y); return (Dx*Dx + dy*dy); } //------------------------------------------------------------------------------ double DistanceFromLineSqrd( const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2) { //The equation of a line in general form (Ax + By + C = 0) //given 2 points (x,y) & (x,y) is ... //(y - y)x + (x - x)y + (y - y)x - (x - x)y = 0 //A = (y - y); B = (x - x); C = (y - y)x - (x - x)y //perpendicular distance of point (x,y) = (Ax + By + C)/Sqrt(A + B) //see http://en.wikipedia.org/wiki/Perpendicular_distance double A = double(ln1.Y - ln2.Y); double B = double(ln2.X - ln1.X); double C = A * ln1.X + B * ln1.Y; C = A * pt.X + B * pt.Y - C; return (C * C) / (A * A + B * B); } //--------------------------------------------------------------------------- bool SlopesNearCollinear(const IntPoint& pt1, const IntPoint& pt2, const IntPoint& pt3, double distSqrd) { //this function is more accurate when the point that's geometrically //between the other 2 points is the one that's tested for distance. //ie makes it more likely to pick up 'spikes' ... if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) { if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; else return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; } else { if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; else return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; } } //------------------------------------------------------------------------------ bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) { double Dx = (double)pt1.X - pt2.X; double dy = (double)pt1.Y - pt2.Y; return ((Dx * Dx) + (dy * dy) <= distSqrd); } //------------------------------------------------------------------------------ OutPt* ExcludeOp(OutPt* op) { OutPt* result = op->Prev; result->Next = op->Next; op->Next->Prev = result; result->Idx = 0; return result; } //------------------------------------------------------------------------------ void CleanPolygon(const Path& in_poly, Path& out_poly, double distance) { //distance = proximity in units/pixels below which vertices //will be stripped. Default ~= sqrt(2). size_t size = in_poly.size(); if (size == 0) { out_poly.clear(); return; } OutPt* outPts = new OutPt[size]; for (size_t i = 0; i < size; ++i) { outPts[i].Pt = in_poly[i]; outPts[i].Next = &outPts[(i + 1) % size]; outPts[i].Next->Prev = &outPts[i]; outPts[i].Idx = 0; } double distSqrd = distance * distance; OutPt* op = &outPts[0]; while (op->Idx == 0 && op->Next != op->Prev) { if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) { op = ExcludeOp(op); size--; } else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) { ExcludeOp(op->Next); op = ExcludeOp(op); size -= 2; } else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) { op = ExcludeOp(op); size--; } else { op->Idx = 1; op = op->Next; } } if (size < 3) size = 0; out_poly.resize(size); for (size_t i = 0; i < size; ++i) { out_poly[i] = op->Pt; op = op->Next; } delete [] outPts; } //------------------------------------------------------------------------------ void CleanPolygon(Path& poly, double distance) { CleanPolygon(poly, poly, distance); } //------------------------------------------------------------------------------ void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance) { for (Paths::size_type i = 0; i < in_polys.size(); ++i) CleanPolygon(in_polys[i], out_polys[i], distance); } //------------------------------------------------------------------------------ void CleanPolygons(Paths& polys, double distance) { CleanPolygons(polys, polys, distance); } //------------------------------------------------------------------------------ void Minkowski(const Path& poly, const Path& path, Paths& solution, bool isSum, bool isClosed) { int delta = (isClosed ? 1 : 0); size_t polyCnt = poly.size(); size_t pathCnt = path.size(); Paths pp; pp.reserve(pathCnt); if (isSum) for (size_t i = 0; i < pathCnt; ++i) { Path p; p.reserve(polyCnt); for (size_t j = 0; j < poly.size(); ++j) p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y)); pp.push_back(p); } else for (size_t i = 0; i < pathCnt; ++i) { Path p; p.reserve(polyCnt); for (size_t j = 0; j < poly.size(); ++j) p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y)); pp.push_back(p); } solution.clear(); solution.reserve((pathCnt + delta) * (polyCnt + 1)); for (size_t i = 0; i < pathCnt - 1 + delta; ++i) for (size_t j = 0; j < polyCnt; ++j) { Path quad; quad.reserve(4); quad.push_back(pp[i % pathCnt][j % polyCnt]); quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]); quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); if (!Orientation(quad)) ReversePath(quad); solution.push_back(quad); } } //------------------------------------------------------------------------------ void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) { Minkowski(pattern, path, solution, true, pathIsClosed); Clipper c; c.AddPaths(solution, ptSubject, true); c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ void TranslatePath(const Path& input, Path& output, IntPoint delta) { //precondition: input != output output.resize(input.size()); for (size_t i = 0; i < input.size(); ++i) output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y); } //------------------------------------------------------------------------------ void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed) { Clipper c; for (size_t i = 0; i < paths.size(); ++i) { Paths tmp; Minkowski(pattern, paths[i], tmp, true, pathIsClosed); c.AddPaths(tmp, ptSubject, true); if (pathIsClosed) { Path tmp2; TranslatePath(paths[i], tmp2, pattern[0]); c.AddPath(tmp2, ptClip, true); } } c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution) { Minkowski(poly1, poly2, solution, false, true); Clipper c; c.AddPaths(solution, ptSubject, true); c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ enum NodeType {ntAny, ntOpen, ntClosed}; void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths) { bool match = true; if (nodetype == ntClosed) match = !polynode.IsOpen(); else if (nodetype == ntOpen) return; if (!polynode.Contour.empty() && match) paths.push_back(polynode.Contour); for (int i = 0; i < polynode.ChildCount(); ++i) AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); } //------------------------------------------------------------------------------ void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); AddPolyNodeToPaths(polytree, ntAny, paths); } //------------------------------------------------------------------------------ void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); AddPolyNodeToPaths(polytree, ntClosed, paths); } //------------------------------------------------------------------------------ void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); //Open paths are top level only, so ... for (int i = 0; i < polytree.ChildCount(); ++i) if (polytree.Childs[i]->IsOpen()) paths.push_back(polytree.Childs[i]->Contour); } //------------------------------------------------------------------------------ std::ostream& operator <<(std::ostream &s, const IntPoint &p) { s << "(" << p.X << "," << p.Y << ")"; return s; } //------------------------------------------------------------------------------ std::ostream& operator <<(std::ostream &s, const Path &p) { if (p.empty()) return s; Path::size_type last = p.size() -1; for (Path::size_type i = 0; i < last; i++) s << "(" << p[i].X << "," << p[i].Y << "), "; s << "(" << p[last].X << "," << p[last].Y << ")\n"; return s; } //------------------------------------------------------------------------------ std::ostream& operator <<(std::ostream &s, const Paths &p) { for (Paths::size_type i = 0; i < p.size(); i++) s << p[i]; s << "\n"; return s; } //------------------------------------------------------------------------------ } //ClipperLib namespace openscad-2019.05/src/ext/polyclipping/clipper.hpp0000644000076500000240000003455213402025764022362 0ustar kintelstaff00000000000000/******************************************************************************* * * * Author : Angus Johnson * * Version : 6.2.1 * * Date : 31 October 2014 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2010-2014 * * * * License: * * Use, modification & distribution is subject to Boost Software License Ver 1. * * http://www.boost.org/LICENSE_1_0.txt * * * * Attributions: * * The code in this library is an extension of Bala Vatti's clipping algorithm: * * "A generic solution to polygon clipping" * * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * * http://portal.acm.org/citation.cfm?id=129906 * * * * Computer graphics and geometric modeling: implementation and algorithms * * By Max K. Agoston * * Springer; 1 edition (January 4, 2005) * * http://books.google.com/books?q=vatti+clipping+agoston * * * * See also: * * "Polygon Offsetting by Computing Winding Numbers" * * Paper no. DETC2005-85513 pp. 565-575 * * ASME 2005 International Design Engineering Technical Conferences * * and Computers and Information in Engineering Conference (IDETC/CIE2005) * * September 24-28, 2005 , Long Beach, California, USA * * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * * * *******************************************************************************/ #ifndef clipper_hpp #define clipper_hpp #define CLIPPER_VERSION "6.2.0" //use_int32: When enabled 32bit ints are used instead of 64bit ints. This //improve performance but coordinate values are limited to the range +/- 46340 //#define use_int32 //use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance. //#define use_xyz //use_lines: Enables line clipping. Adds a very minor cost to performance. //#define use_lines //use_deprecated: Enables temporary support for the obsolete functions //#define use_deprecated #include #include #include #include #include #include #include #include namespace ClipperLib { enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; enum PolyType { ptSubject, ptClip }; //By far the most widely used winding rules for polygon filling are //EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) //Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) //see http://glprogramming.com/red/chapter11.html enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; #ifdef use_int32 typedef int cInt; static cInt const loRange = 0x7FFF; static cInt const hiRange = 0x7FFF; #else typedef signed long long cInt; static cInt const loRange = 0x3FFFFFFF; static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; typedef signed long long long64; //used by Int128 class typedef unsigned long long ulong64; #endif struct IntPoint { cInt X; cInt Y; #ifdef use_xyz cInt Z; IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {}; #else IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {}; #endif friend inline bool operator== (const IntPoint& a, const IntPoint& b) { return a.X == b.X && a.Y == b.Y; } friend inline bool operator!= (const IntPoint& a, const IntPoint& b) { return a.X != b.X || a.Y != b.Y; } }; //------------------------------------------------------------------------------ typedef std::vector< IntPoint > Path; typedef std::vector< Path > Paths; inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;} inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;} std::ostream& operator <<(std::ostream &s, const IntPoint &p); std::ostream& operator <<(std::ostream &s, const Path &p); std::ostream& operator <<(std::ostream &s, const Paths &p); struct DoublePoint { double X; double Y; DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {} }; //------------------------------------------------------------------------------ #ifdef use_xyz typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt); #endif enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4}; enum JoinType {jtSquare, jtRound, jtMiter}; enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound}; class PolyNode; typedef std::vector< PolyNode* > PolyNodes; class PolyNode { public: PolyNode(); virtual ~PolyNode(){}; Path Contour; PolyNodes Childs; PolyNode* Parent; PolyNode* GetNext() const; bool IsHole() const; bool IsOpen() const; int ChildCount() const; private: unsigned Index; //node index in Parent.Childs bool m_IsOpen; JoinType m_jointype; EndType m_endtype; PolyNode* GetNextSiblingUp() const; void AddChild(PolyNode& child); friend class Clipper; //to access Index friend class ClipperOffset; }; class PolyTree: public PolyNode { public: ~PolyTree() override{Clear();}; PolyNode* GetFirst() const; void Clear(); int Total() const; private: PolyNodes AllNodes; friend class Clipper; //to access AllNodes }; bool Orientation(const Path &poly); double Area(const Path &poly); int PointInPolygon(const IntPoint &pt, const Path &path); void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd); void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd); void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd); void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415); void CleanPolygon(Path& poly, double distance = 1.415); void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415); void CleanPolygons(Paths& polys, double distance = 1.415); void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed); void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed); void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution); void PolyTreeToPaths(const PolyTree& polytree, Paths& paths); void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths); void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths); void ReversePath(Path& p); void ReversePaths(Paths& p); struct IntRect { cInt left; cInt top; cInt right; cInt bottom; }; //enums that are used internally ... enum EdgeSide { esLeft = 1, esRight = 2}; //forward declarations (for stuff used internally) ... struct TEdge; struct IntersectNode; struct LocalMinimum; struct Scanbeam; struct OutPt; struct OutRec; struct Join; typedef std::vector < OutRec* > PolyOutList; typedef std::vector < TEdge* > EdgeList; typedef std::vector < Join* > JoinList; typedef std::vector < IntersectNode* > IntersectList; //------------------------------------------------------------------------------ //ClipperBase is the ancestor to the Clipper class. It should not be //instantiated directly. This class simply abstracts the conversion of sets of //polygon coordinates into edge objects that are stored in a LocalMinima list. class ClipperBase { public: ClipperBase(); virtual ~ClipperBase(); bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed); bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed); virtual void Clear(); IntRect GetBounds(); bool PreserveCollinear() {return m_PreserveCollinear;}; void PreserveCollinear(bool value) {m_PreserveCollinear = value;}; protected: void DisposeLocalMinimaList(); TEdge* AddBoundsToLML(TEdge *e, bool IsClosed); void PopLocalMinima(); virtual void Reset(); TEdge* ProcessBound(TEdge* E, bool IsClockwise); void DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed); TEdge* DescendToMin(TEdge *&E); void AscendToMax(TEdge *&E, bool Appending, bool IsClosed); typedef std::vector MinimaList; MinimaList::iterator m_CurrentLM; MinimaList m_MinimaList; bool m_UseFullRange; EdgeList m_edges; bool m_PreserveCollinear; bool m_HasOpenPaths; }; //------------------------------------------------------------------------------ class Clipper : public virtual ClipperBase { public: Clipper(int initOptions = 0); ~Clipper() override; bool Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType = pftEvenOdd, PolyFillType clipFillType = pftEvenOdd); bool Execute(ClipType clipType, PolyTree &polytree, PolyFillType subjFillType = pftEvenOdd, PolyFillType clipFillType = pftEvenOdd); bool ReverseSolution() {return m_ReverseOutput;}; void ReverseSolution(bool value) {m_ReverseOutput = value;}; bool StrictlySimple() {return m_StrictSimple;}; void StrictlySimple(bool value) {m_StrictSimple = value;}; //set the callback function for z value filling on intersections (otherwise Z is 0) #ifdef use_xyz void ZFillFunction(ZFillCallback zFillFunc); #endif protected: void Reset() override; virtual bool ExecuteInternal(); private: PolyOutList m_PolyOuts; JoinList m_Joins; JoinList m_GhostJoins; IntersectList m_IntersectList; ClipType m_ClipType; typedef std::priority_queue ScanbeamList; ScanbeamList m_Scanbeam; TEdge *m_ActiveEdges; TEdge *m_SortedEdges; bool m_ExecuteLocked; PolyFillType m_ClipFillType; PolyFillType m_SubjFillType; bool m_ReverseOutput; bool m_UsingPolyTree; bool m_StrictSimple; #ifdef use_xyz ZFillCallback m_ZFill; //custom callback #endif void SetWindingCount(TEdge& edge); bool IsEvenOddFillType(const TEdge& edge) const; bool IsEvenOddAltFillType(const TEdge& edge) const; void InsertScanbeam(const cInt Y); cInt PopScanbeam(); void InsertLocalMinimaIntoAEL(const cInt botY); void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge); void AddEdgeToSEL(TEdge *edge); void CopyAELToSEL(); void DeleteFromSEL(TEdge *e); void DeleteFromAEL(TEdge *e); void UpdateEdgeIntoAEL(TEdge *&e); void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); bool IsContributing(const TEdge& edge) const; bool IsTopHorz(const cInt XPos); void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); void DoMaxima(TEdge *e); void ProcessHorizontals(bool IsTopOfScanbeam); void ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam); void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); OutRec* GetOutRec(int idx); void AppendPolygon(TEdge *e1, TEdge *e2); void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt); OutRec* CreateOutRec(); OutPt* AddOutPt(TEdge *e, const IntPoint &pt); void DisposeAllOutRecs(); void DisposeOutRec(PolyOutList::size_type index); bool ProcessIntersections(const cInt topY); void BuildIntersectList(const cInt topY); void ProcessIntersectList(); void ProcessEdgesAtTopOfScanbeam(const cInt topY); void BuildResult(Paths& polys); void BuildResult2(PolyTree& polytree); void SetHoleState(TEdge *e, OutRec *outrec); void DisposeIntersectNodes(); bool FixupIntersectionOrder(); void FixupOutPolygon(OutRec &outrec); bool IsHole(TEdge *e); bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl); void FixHoleLinkage(OutRec &outrec); void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt); void ClearJoins(); void ClearGhostJoins(); void AddGhostJoin(OutPt *op, const IntPoint offPt); bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2); void JoinCommonEdges(); void DoSimplePolygons(); void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec); #ifdef use_xyz void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2); #endif }; //------------------------------------------------------------------------------ class ClipperOffset { public: ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25); ~ClipperOffset(); void AddPath(const Path& path, JoinType joinType, EndType endType); void AddPaths(const Paths& paths, JoinType joinType, EndType endType); void Execute(Paths& solution, double delta); void Execute(PolyTree& solution, double delta); void Clear(); double MiterLimit; double ArcTolerance; private: Paths m_destPolys; Path m_srcPoly; Path m_destPoly; std::vector m_normals; double m_delta, m_sinA, m_sin, m_cos; double m_miterLim, m_StepsPerRad; IntPoint m_lowest; PolyNode m_polyNodes; void FixOrientations(); void DoOffset(double delta); void OffsetPoint(int j, int& k, JoinType jointype); void DoSquare(int j, int k); void DoMiter(int j, int k, double r); void DoRound(int j, int k); }; //------------------------------------------------------------------------------ class clipperException : public std::exception { public: clipperException(const char* description): m_descr(description) {} ~clipperException() throw() override {} const char* what() const throw() override {return m_descr.c_str();} private: std::string m_descr; }; //------------------------------------------------------------------------------ } //ClipperLib namespace #endif //clipper_hpp openscad-2019.05/src/fbo.cc0000644000076500000240000002002013402025764015740 0ustar kintelstaff00000000000000#include "fbo.h" #include "system-gl.h" #include #include using namespace std; fbo_t *fbo_new() { auto fbo = new fbo_t; fbo->fbo_id = 0; fbo->old_fbo_id = 0; fbo->renderbuf_id = 0; fbo->depthbuf_id = 0; return fbo; } bool use_ext() { // do we need to use the EXT or ARB version? if (!glewIsSupported("GL_ARB_framebuffer_object") && glewIsSupported("GL_EXT_framebuffer_object")) { return true; } else { return false; } } bool check_fbo_status() { /* This code is based on user V-man code from http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample See also: http://www.songho.ca/opengl/gl_fbo.html */ GLenum status; auto result = false; if (use_ext()) { status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); } else { status = glCheckFramebufferStatus(GL_FRAMEBUFFER); } if (report_glerror("checking framebuffer status")) return false; if (status == GL_FRAMEBUFFER_COMPLETE) { result = true; } else if (status == GL_FRAMEBUFFER_UNSUPPORTED) { cerr << "GL_FRAMEBUFFER_UNSUPPORTED\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\n"; } else if (status == GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT) { cerr << "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT\n"; } else { cerr << "Unknown Code: glCheckFramebufferStatusEXT returned:" << status <<"\n"; } return result; } bool fbo_ext_init(fbo_t *fbo, size_t width, size_t height) { // Generate and bind FBO glGenFramebuffersEXT(1, &fbo->fbo_id); if (report_glerror("glGenFramebuffersEXT")) return false; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->fbo_id); if (report_glerror("glBindFramebufferEXT")) return false; // Generate depth and render buffers glGenRenderbuffersEXT(1, &fbo->depthbuf_id); glGenRenderbuffersEXT(1, &fbo->renderbuf_id); // Create buffers with correct size if (!fbo_resize(fbo, width, height)) return false; // Attach render and depth buffers glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, fbo->renderbuf_id); if (report_glerror("specifying color render buffer EXT")) return false; if (!check_fbo_status()) { cerr << "Problem with OpenGL EXT framebuffer after specifying color render buffer.\n"; return false; } if (glewIsSupported("GL_EXT_packed_depth_stencil")) { glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->depthbuf_id); if (report_glerror("specifying depth render buffer EXT")) return false; glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->depthbuf_id); if (report_glerror("specifying stencil render buffer EXT")) return false; if (!check_fbo_status()) { cerr << "Problem with OpenGL EXT framebuffer after specifying depth render buffer.\n"; return false; } } else { cerr << "Warning: Cannot create stencil buffer (GL_EXT_packed_depth_stencil not supported)\n"; glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->depthbuf_id); if (report_glerror("specifying depth render buffer EXT")) return false; if (!check_fbo_status()) { cerr << "Problem with OpenGL EXT framebuffer after specifying depth stencil render buffer.\n"; return false; } } return true; } bool fbo_arb_init(fbo_t *fbo, size_t width, size_t height) { // Generate and bind FBO glGenFramebuffers(1, &fbo->fbo_id); if (report_glerror("glGenFramebuffers")) return false; glBindFramebuffer(GL_FRAMEBUFFER, fbo->fbo_id); if (report_glerror("glBindFramebuffer")) return false; // Generate depth and render buffers glGenRenderbuffers(1, &fbo->depthbuf_id); glGenRenderbuffers(1, &fbo->renderbuf_id); // Create buffers with correct size if (!fbo_resize(fbo, width, height)) return false; // Attach render and depth buffers glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fbo->renderbuf_id); if (report_glerror("specifying color render buffer")) return false; if (!check_fbo_status()) { cerr << "Problem with OpenGL framebuffer after specifying color render buffer.\n"; return false; } //glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, // to prevent Mesa's software renderer from crashing, do this in two stages. // ie. instead of using GL_DEPTH_STENCIL_ATTACHMENT, do DEPTH then STENCIL. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->depthbuf_id); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->depthbuf_id); if (report_glerror("specifying depth stencil render buffer")) return false; if (!check_fbo_status()) { cerr << "Problem with OpenGL framebuffer after specifying depth render buffer.\n"; return false; } return true; } bool fbo_init(fbo_t *fbo, size_t width, size_t height) { /* Some OpenGL drivers include the framebuffer functions but not with core or ARB names, only with the EXT name. This has been worked-around by deciding at runtime, using GLEW, which version needs to be used. See also: http://www.opengl.org/wiki/Framebuffer_Object http://stackoverflow.com/questions/6912988/glgenframebuffers-or-glgenframebuffersex http://www.devmaster.net/forums/showthread.php?t=10967 */ auto result = false; if (glewIsSupported("GL_ARB_framebuffer_object")) { result = fbo_arb_init(fbo, width, height); } else if (use_ext()) { result = fbo_ext_init(fbo, width, height); } else { cerr << "Framebuffer Object extension not found by GLEW\n"; } return result; } bool fbo_resize(fbo_t *fbo, size_t width, size_t height) { if (use_ext()) { glBindRenderbufferEXT(GL_RENDERBUFFER, fbo->depthbuf_id); if (glewIsSupported("GL_EXT_packed_depth_stencil")) { glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); if (report_glerror("creating EXT depth stencil render buffer")) return false; } else { glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); if (report_glerror("creating EXT depth render buffer")) return false; } glBindRenderbufferEXT(GL_RENDERBUFFER, fbo->renderbuf_id); glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA8, width, height); if (report_glerror("creating EXT color render buffer")) return false; } else { glBindRenderbuffer(GL_RENDERBUFFER, fbo->renderbuf_id); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height); if (report_glerror("creating color render buffer")) return false; glBindRenderbuffer(GL_RENDERBUFFER, fbo->depthbuf_id); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); if (report_glerror("creating depth stencil render buffer")) return false; } return true; } void fbo_delete(fbo_t *fbo) { delete fbo; } GLuint fbo_bind(fbo_t *fbo) { glGetIntegerv(GL_FRAMEBUFFER_BINDING, reinterpret_cast(&fbo->old_fbo_id)); if (use_ext()) { glBindFramebufferEXT(GL_FRAMEBUFFER, fbo->fbo_id); } else { glBindFramebuffer(GL_FRAMEBUFFER, fbo->fbo_id); } return fbo->old_fbo_id; } void fbo_unbind(fbo_t *fbo) { if (use_ext()) { glBindFramebufferEXT(GL_FRAMEBUFFER, fbo->old_fbo_id); } else { glBindFramebuffer(GL_FRAMEBUFFER, fbo->old_fbo_id); } } openscad-2019.05/src/fbo.h0000644000076500000240000000065613402025764015617 0ustar kintelstaff00000000000000#pragma once #include "system-gl.h" #include // size_t struct fbo_t { GLuint fbo_id; GLuint old_fbo_id; GLuint renderbuf_id; GLuint depthbuf_id; }; fbo_t *fbo_new(); bool fbo_init(fbo_t *fbo, size_t width, size_t height); bool fbo_resize(fbo_t *fbo, size_t width, size_t height); void fbo_delete(fbo_t *fbo); GLuint fbo_bind(fbo_t *fbo); void fbo_unbind(fbo_t *fbo); bool REPORTGLERROR(const char * task); openscad-2019.05/src/feature.cc0000644000076500000240000000431613434601060016631 0ustar kintelstaff00000000000000#include #include #include #include #include #include "feature.h" #include "printutils.h" /** * Feature registration map/list for later lookup. This must be initialized * before the static feature instances as those register with this map. */ Feature::map_t Feature::feature_map; Feature::list_t Feature::feature_list; /* * List of features, the names given here are used in both command line * argument to enable the option and for saving the option value in GUI * context. */ const Feature Feature::ExperimentalInputDriverDBus("input-driver-dbus", "Enable DBus input drivers (requires restart)"); Feature::Feature(const std::string &name, const std::string &description) : enabled(false), name(name), description(description) { feature_map[name] = this; feature_list.push_back(this); } Feature::~Feature() { } const std::string &Feature::get_name() const { return name; } const std::string &Feature::get_description() const { return description; } bool Feature::is_enabled() const { return enabled; } void Feature::enable(bool status) { enabled = status; } void Feature::enable_feature(const std::string &feature_name, bool status) { auto it = feature_map.find(feature_name); if (it != feature_map.end()) { it->second->enable(status); } else { PRINTB("WARNING: Ignoring request to enable unknown feature '%s'.", feature_name); } } Feature::iterator Feature::begin() { return feature_list.begin(); } Feature::iterator Feature::end() { return feature_list.end(); } void Feature::dump_features() { for (map_t::iterator it = feature_map.begin(); it != feature_map.end(); it++) { std::cout << "Feature('" << it->first << "') = " << (it->second->is_enabled() ? "enabled" : "disabled") << std::endl; } } ExperimentalFeatureException::ExperimentalFeatureException(const std::string &what_arg) : EvaluationException(what_arg) { } ExperimentalFeatureException::~ExperimentalFeatureException() throw() { } void ExperimentalFeatureException::check(const Feature &feature) { if (!feature.is_enabled()) { throw ExperimentalFeatureException(STR("ERROR: Experimental feature not enabled: '" << feature.get_name() << "'. Please check preferences.")); } } openscad-2019.05/src/feature.h0000644000076500000240000000214413434601060016470 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include #include "exceptions.h" class Feature { public: typedef std::vector list_t; typedef list_t::iterator iterator; static const Feature ExperimentalInputDriverDBus; const std::string& get_name() const; const std::string& get_description() const; bool is_enabled() const; void enable(bool status); static iterator begin(); static iterator end(); static void dump_features(); static void enable_feature(const std::string &feature_name, bool status = true); private: bool enabled; const std::string name; const std::string description; typedef std::map map_t; static map_t feature_map; static list_t feature_list; Feature(const std::string &name, const std::string &description); virtual ~Feature(); }; class ExperimentalFeatureException : public EvaluationException { public: static void check(const Feature &feature); ~ExperimentalFeatureException() throw(); private: ExperimentalFeatureException(const std::string &what_arg); }; openscad-2019.05/src/fileutils.cc0000644000076500000240000000215013402025764017176 0ustar kintelstaff00000000000000#include "fileutils.h" #include "printutils.h" #include namespace fs = boost::filesystem; /*! Returns the absolute path to the given filename, unless it's empty. If the file isn't found in the given path, the fallback path will be used to be backwards compatible with <= 2013.01 (see issue #217). */ std::string lookup_file(const std::string &filename, const std::string &path, const std::string &fallbackpath) { std::string resultfile; if (!filename.empty() && !fs::path(filename).is_absolute()) { fs::path absfile; if (!path.empty()) absfile = fs::absolute(fs::path(path) / filename); fs::path absfile_fallback; if (!fallbackpath.empty()) absfile_fallback = fs::absolute(fs::path(fallbackpath) / filename); if (!fs::exists(absfile) && fs::exists(absfile_fallback)) { resultfile = absfile_fallback.string(); PRINT_DEPRECATION("Imported file (%s) found in document root instead of relative to the importing module. This behavior is deprecated", filename); } else { resultfile = absfile.string(); } } else { resultfile = filename; } return resultfile; } openscad-2019.05/src/fileutils.h0000644000076500000240000000025213402025764017041 0ustar kintelstaff00000000000000#pragma once #include std::string lookup_file(const std::string &filename, const std::string &path, const std::string &fallbackpath); openscad-2019.05/src/findversion.h0000644000076500000240000000610613402025764017373 0ustar kintelstaff00000000000000/* * Find Windows version using bisection method and VerifyVersionInfo. * * Author: M1xA, www.m1xa.com * Date: 2013.07.07 * Licence: MIT * Version: 1.0 * * API: * * BOOL GetVersionExEx(OSVERSIONINFOEX * osVer); * Returns: 0 if fails. * * Supported OS: Windows 2000 .. Windows 8.1. */ #ifndef __FIND_VERSION__ #define __FIND_VERSION__ #include #define FV_EQUAL 0 #define FV_LESS -1 #define FV_GREAT 1 #define FV_MIN_VALUE 0 #define FV_MINOR_VERSION_MAX_VALUE 16 int testValue(OSVERSIONINFOEX * value, DWORD verPart, DWORDLONG eq, DWORDLONG gt) { if (VerifyVersionInfo(value, verPart, eq) == FALSE) { if (VerifyVersionInfo(value, verPart, gt) == TRUE) return FV_GREAT; return FV_LESS; } else return FV_EQUAL; } DWORDLONG gtFor(DWORD target) { return VerSetConditionMask(0, target, VER_GREATER); } DWORDLONG eqFor(DWORD target) { return VerSetConditionMask(0, target, VER_EQUAL); } #define findPartTemplate(T)\ BOOL findPart##T(T * part, DWORD partType, OSVERSIONINFOEX * ret, T a, T b) \ { \ int funx = FV_EQUAL; \ \ DWORDLONG const eq = eqFor(partType); \ DWORDLONG const gt = gtFor(partType); \ \ T * p = part; \ \ *p = (a + b) / 2; \ \ while ((funx = testValue(ret, partType, eq, gt)) != FV_EQUAL) \ { \ switch (funx) \ { \ case FV_GREAT: a = *p; break; \ case FV_LESS: b = *p; break; \ } \ \ *p = (a + b) / 2; \ \ if (*p == a) \ { \ if (testValue(ret, partType, eq, gt) == FV_EQUAL) \ return TRUE; \ \ *p = b; \ \ if (testValue(ret, partType, eq, gt) == FV_EQUAL) \ return TRUE; \ \ a = 0; \ b = 0; \ *p = 0; \ } \ \ if (a == b) \ { \ *p = 0; \ return FALSE; \ } \ } \ \ return TRUE; \ } findPartTemplate(DWORD) findPartTemplate(WORD) findPartTemplate(BYTE) BOOL GetVersionExEx(OSVERSIONINFOEX * osVer) { BOOL ret = TRUE; ZeroMemory(osVer, sizeof(OSVERSIONINFOEX)); osVer->dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); ret &= findPartDWORD(&osVer->dwPlatformId, VER_PLATFORMID, osVer, FV_MIN_VALUE, MAXDWORD); ret &= findPartDWORD(&osVer->dwMajorVersion, VER_MAJORVERSION, osVer, FV_MIN_VALUE, MAXDWORD); ret &= findPartDWORD(&osVer->dwMinorVersion, VER_MINORVERSION, osVer, FV_MIN_VALUE, FV_MINOR_VERSION_MAX_VALUE); ret &= findPartDWORD(&osVer->dwBuildNumber, VER_BUILDNUMBER, osVer, FV_MIN_VALUE, MAXDWORD); ret &= findPartWORD(&osVer->wServicePackMajor, VER_SERVICEPACKMAJOR, osVer, FV_MIN_VALUE, MAXWORD); ret &= findPartWORD(&osVer->wServicePackMinor, VER_SERVICEPACKMINOR, osVer, FV_MIN_VALUE, MAXWORD); ret &= findPartWORD(&osVer->wSuiteMask, VER_SUITENAME, osVer, FV_MIN_VALUE, MAXWORD); ret &= findPartBYTE(&osVer->wProductType, VER_PRODUCT_TYPE, osVer, FV_MIN_VALUE, MAXBYTE); return ret; } #endif openscad-2019.05/src/func.cc0000644000076500000240000010343613441031431016131 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "function.h" #include "expression.h" #include "evalcontext.h" #include "builtin.h" #include "printutils.h" #include "stackcheck.h" #include "exceptions.h" #include "memory.h" #include "UserModule.h" #include "degree_trig.h" #include #include #include #include #include /* Random numbers Newer versions of boost/C++ include a non-deterministic random_device and auto/bind()s for random function objects, but we are supporting older systems. */ #include"boost-utils.h" #include #include /*Unicode support for string lengths and array accesses*/ #include // hash double #include "linalg.h" #if defined __WIN32__ || defined _MSC_VER #include int process_id = _getpid(); #else #include #include int process_id = getpid(); #endif boost::mt19937 deterministic_rng; boost::mt19937 lessdeterministic_rng( std::time(nullptr) + process_id ); static void print_argCnt_warning(const char *name, const Context *ctx, const EvalContext *evalctx){ PRINTB("WARNING: %s() number of parameters does not match, %s", name % evalctx->loc.toRelativeString(ctx->documentPath())); } static void print_argConvert_warning(const char *name, const Context *ctx, const EvalContext *evalctx){ PRINTB("WARNING: %s() parameter could not be converted, %s", name % evalctx->loc.toRelativeString(ctx->documentPath())); } ValuePtr builtin_abs(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(std::fabs(v->toDouble())); }else{ print_argConvert_warning("abs", ctx, evalctx); } }else{ print_argCnt_warning("abs", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_sign(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER) { double x = v->toDouble(); return ValuePtr((x<0) ? -1.0 : ((x>0) ? 1.0 : 0.0)); }else{ print_argConvert_warning("sign", ctx, evalctx); } }else{ print_argCnt_warning("sign", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_rands(const Context *ctx, const EvalContext *evalctx) { size_t n = evalctx->numArgs(); if (n == 3 || n == 4) { ValuePtr v0 = evalctx->getArgValue(0); if (v0->type() != Value::ValueType::NUMBER) goto quit; double min = v0->toDouble(); if (std::isinf(min) || std::isnan(min)){ PRINTB("WARNING: rands() range min cannot be infinite, %s", evalctx->loc.toRelativeString(ctx->documentPath())); min = -std::numeric_limits::max()/2; PRINTB("WARNING: resetting to %f",min); } ValuePtr v1 = evalctx->getArgValue(1); if (v1->type() != Value::ValueType::NUMBER) goto quit; double max = v1->toDouble(); if (std::isinf(max) || std::isnan(max)) { PRINTB("WARNING: rands() range max cannot be infinite, %s", evalctx->loc.toRelativeString(ctx->documentPath())); max = std::numeric_limits::max()/2; PRINTB("WARNING: resetting to %f",max); } if (max < min) { double tmp = min; min = max; max = tmp; } ValuePtr v2 = evalctx->getArgValue(2); if (v2->type() != Value::ValueType::NUMBER) goto quit; double numresultsd = std::abs( v2->toDouble() ); if (std::isinf(numresultsd) || std::isnan(numresultsd)) { PRINTB("WARNING: rands() cannot create an infinite number of results, %s", evalctx->loc.toRelativeString(ctx->documentPath())); PRINT("WARNING: resetting number of results to 1"); numresultsd = 1; } size_t numresults = boost_numeric_cast( numresultsd ); bool deterministic = false; if (n > 3) { ValuePtr v3 = evalctx->getArgValue(3); if (v3->type() != Value::ValueType::NUMBER) goto quit; uint32_t seed = static_cast(hash_floating_point( v3->toDouble() )); deterministic_rng.seed( seed ); deterministic = true; } Value::VectorType vec; if (min==max) { // Boost doesn't allow min == max for (size_t i=0; i < numresults; i++) vec.push_back(ValuePtr(min)); } else { boost::uniform_real<> distributor( min, max ); for (size_t i=0; i < numresults; i++) { if ( deterministic ) { vec.push_back(ValuePtr(distributor(deterministic_rng))); } else { vec.push_back(ValuePtr(distributor(lessdeterministic_rng))); } } } return ValuePtr(vec); }else{ print_argCnt_warning("rands", ctx, evalctx); } quit: return ValuePtr::undefined; } ValuePtr builtin_min(const Context *ctx, const EvalContext *evalctx) { // preserve special handling of the first argument // as a template for vector processing size_t n = evalctx->numArgs(); if (n >= 1) { ValuePtr v0 = evalctx->getArgValue(0); if (n == 1 && v0->type() == Value::ValueType::VECTOR && !v0->toVector().empty()) { ValuePtr min = v0->toVector()[0]; for (size_t i = 1; i < v0->toVector().size(); i++) { if (v0->toVector()[i] < min) min = v0->toVector()[i]; } return min; } if (v0->type() == Value::ValueType::NUMBER) { double val = v0->toDouble(); for (size_t i = 1; i < n; ++i) { ValuePtr v = evalctx->getArgValue(i); // 4/20/14 semantic change per discussion: // break on any non-number if (v->type() != Value::ValueType::NUMBER) goto quit; double x = v->toDouble(); if (x < val) val = x; } return ValuePtr(val); } }else{ print_argCnt_warning("min", ctx, evalctx); return ValuePtr::undefined; } quit: print_argConvert_warning("min", ctx, evalctx); return ValuePtr::undefined; } ValuePtr builtin_max(const Context *ctx, const EvalContext *evalctx) { // preserve special handling of the first argument // as a template for vector processing size_t n = evalctx->numArgs(); if (n >= 1) { ValuePtr v0 = evalctx->getArgValue(0); if (n == 1 && v0->type() == Value::ValueType::VECTOR && !v0->toVector().empty()) { ValuePtr max = v0->toVector()[0]; for (size_t i = 1; i < v0->toVector().size(); i++) { if (v0->toVector()[i] > max) max = v0->toVector()[i]; } return max; } if (v0->type() == Value::ValueType::NUMBER) { double val = v0->toDouble(); for (size_t i = 1; i < n; ++i) { ValuePtr v = evalctx->getArgValue(i); // 4/20/14 semantic change per discussion: // break on any non-number if (v->type() != Value::ValueType::NUMBER) goto quit; double x = v->toDouble(); if (x > val) val = x; } return ValuePtr(val); } }else{ print_argCnt_warning("max", ctx, evalctx); return ValuePtr::undefined; } quit: print_argConvert_warning("max", ctx, evalctx); return ValuePtr::undefined; } ValuePtr builtin_sin(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(sin_degrees(v->toDouble())); }else{ print_argConvert_warning("sin", ctx, evalctx); } }else{ print_argCnt_warning("sin", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_cos(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(cos_degrees(v->toDouble())); }else{ print_argConvert_warning("cos", ctx, evalctx); } }else{ print_argCnt_warning("cos", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_asin(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(asin_degrees(v->toDouble())); }else{ print_argConvert_warning("asin", ctx, evalctx); } }else{ print_argCnt_warning("asin", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_acos(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(acos_degrees(v->toDouble())); }else{ print_argConvert_warning("acos", ctx, evalctx); } }else{ print_argCnt_warning("acos", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_tan(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(tan_degrees(v->toDouble())); }else{ print_argConvert_warning("tan", ctx, evalctx); } }else{ print_argCnt_warning("tan", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_atan(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(atan_degrees(v->toDouble())); }else{ print_argConvert_warning("atan", ctx, evalctx); } }else{ print_argCnt_warning("atan", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_atan2(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 2) { ValuePtr v0 = evalctx->getArgValue(0), v1 = evalctx->getArgValue(1); if (v0->type() == Value::ValueType::NUMBER && v1->type() == Value::ValueType::NUMBER){ return ValuePtr(atan2_degrees(v0->toDouble(), v1->toDouble())); }else{ print_argConvert_warning("atan2", ctx, evalctx); } }else{ print_argCnt_warning("atan2", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_pow(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 2) { ValuePtr v0 = evalctx->getArgValue(0), v1 = evalctx->getArgValue(1); if (v0->type() == Value::ValueType::NUMBER && v1->type() == Value::ValueType::NUMBER){ return ValuePtr(pow(v0->toDouble(), v1->toDouble())); }else{ print_argConvert_warning("pow", ctx, evalctx); } }else{ print_argCnt_warning("pow", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_round(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(round(v->toDouble())); }else{ print_argConvert_warning("round", ctx, evalctx); } }else{ print_argCnt_warning("round", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_ceil(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(ceil(v->toDouble())); }else{ print_argConvert_warning("ceil", ctx, evalctx); } }else{ print_argCnt_warning("ceil", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_floor(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(floor(v->toDouble())); }else{ print_argConvert_warning("floor", ctx, evalctx); } }else{ print_argCnt_warning("floor", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_sqrt(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(sqrt(v->toDouble())); }else{ print_argConvert_warning("sqrt", ctx, evalctx); } }else{ print_argCnt_warning("sqrt", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_exp(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(exp(v->toDouble())); }else{ print_argConvert_warning("exp", ctx, evalctx); } }else{ print_argCnt_warning("exp", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_length(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::VECTOR) return ValuePtr(int(v->toVector().size())); if (v->type() == Value::ValueType::STRING) { //Unicode glyph count for the length -- rather than the string (num. of bytes) length. std::string text = v->toString(); return ValuePtr(int( g_utf8_strlen( text.c_str(), text.size() ) )); } print_argConvert_warning("len", ctx, evalctx); }else{ print_argCnt_warning("len", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_log(const Context *ctx, const EvalContext *evalctx) { size_t n = evalctx->numArgs(); if (n == 1 || n == 2) { ValuePtr v0 = evalctx->getArgValue(0); if (v0->type() == Value::ValueType::NUMBER) { double x = 10.0, y = v0->toDouble(); if (n > 1) { ValuePtr v1 = evalctx->getArgValue(1); if (v1->type() != Value::ValueType::NUMBER) goto quit; x = y; y = v1->toDouble(); } return ValuePtr(log(y) / log(x)); } }else{ print_argCnt_warning("log", ctx, evalctx); return ValuePtr::undefined; } quit: print_argConvert_warning("log", ctx, evalctx); return ValuePtr::undefined; } ValuePtr builtin_ln(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(log(v->toDouble())); }else{ print_argConvert_warning("ln", ctx, evalctx); } }else{ print_argCnt_warning("ln", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_str(const Context *, const EvalContext *evalctx) { std::ostringstream stream; for (size_t i = 0; i < evalctx->numArgs(); i++) { stream << evalctx->getArgValue(i)->toString(); } return ValuePtr(stream.str()); } ValuePtr builtin_chr(const Context *, const EvalContext *evalctx) { std::ostringstream stream; for (size_t i = 0; i < evalctx->numArgs(); i++) { ValuePtr v = evalctx->getArgValue(i); stream << v->chrString(); } return ValuePtr(stream.str()); } ValuePtr builtin_ord(const Context *ctx, const EvalContext *evalctx) { const size_t numArgs = evalctx->numArgs(); if (numArgs == 0) { return ValuePtr::undefined; } else if (numArgs > 1) { PRINTB("WARNING: ord() called with %d arguments, only 1 argument expected, %s", numArgs % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } const ValuePtr& arg = evalctx->getArgValue(0); const std::string arg_str = arg->toString(); const char *ptr = arg_str.c_str(); if (arg->type() != Value::ValueType::STRING) { PRINTB("WARNING: ord() argument %s is not of type string, %s", arg_str % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } if (!g_utf8_validate(ptr, -1, NULL)) { PRINTB("WARNING: ord() argument '%s' is not valid utf8 string, %s", arg_str % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } if (g_utf8_strlen(ptr, -1) == 0) { return ValuePtr::undefined; } const gunichar ch = g_utf8_get_char(ptr); return ValuePtr((double)ch); } ValuePtr builtin_concat(const Context *, const EvalContext *evalctx) { Value::VectorType result; for (size_t i = 0; i < evalctx->numArgs(); i++) { ValuePtr val = evalctx->getArgValue(i); if (val->type() == Value::ValueType::VECTOR) { for(const auto &v : val->toVector()) { result.push_back(v); } } else { result.push_back(val); } } return ValuePtr(result); } ValuePtr builtin_lookup(const Context *ctx, const EvalContext *evalctx) { double p, low_p, low_v, high_p, high_v; if (evalctx->numArgs() != 2){ // Needs two args print_argCnt_warning("lookup", ctx, evalctx); return ValuePtr::undefined; } if(!evalctx->getArgValue(0)->getDouble(p) || !std::isfinite(p)){ // First arg must be a number PRINTB("WARNING: lookup(%s, ...) first argument is not a number, %s", evalctx->getArgValue(0)->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } ValuePtr v1 = evalctx->getArgValue(1); const Value::VectorType &vec = v1->toVector(); if (vec.empty()) return ValuePtr::undefined; // Second must be a vector if (vec[0]->toVector().size() < 2) return ValuePtr::undefined; // ..of vectors if (!vec[0]->getVec2(low_p, low_v) || !vec[0]->getVec2(high_p, high_v)) return ValuePtr::undefined; for (size_t i = 1; i < vec.size(); i++) { double this_p, this_v; if (vec[i]->getVec2(this_p, this_v)) { if (this_p <= p && (this_p > low_p || low_p > p)) { low_p = this_p; low_v = this_v; } if (this_p >= p && (this_p < high_p || high_p < p)) { high_p = this_p; high_v = this_v; } } } if (p <= low_p) return ValuePtr(high_v); if (p >= high_p) return ValuePtr(low_v); double f = (p-low_p) / (high_p-low_p); return ValuePtr(high_v * f + low_v * (1-f)); } /* Pattern: "search" "(" ( match_value | list_of_match_values ) "," vector_of_vectors ("," num_returns_per_match ("," index_col_num )? )? ")"; match_value : ( Value::ValueType::NUMBER | Value::ValueType::STRING ); list_of_values : "[" match_value ("," match_value)* "]"; vector_of_vectors : "[" ("[" Value ("," Value)* "]")+ "]"; num_returns_per_match : int; index_col_num : int; The search string and searched strings can be unicode strings. Examples: Index values return as list: search("a","abcdabcd"); - returns [0] search("Л","Л"); //A unicode string - returns [0] search("🂡aЛ","a🂡Л🂡a🂡Л🂡a",0); - returns [[1,3,5,7],[0,4,8],[2,6]] search("a","abcdabcd",0); //Search up to all matches - returns [[0,4]] search("a","abcdabcd",1); - returns [0] search("e","abcdabcd",1); - returns [] search("a",[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9] ]); - returns [0,4] Search on different column; return Index values: search(3,[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",3] ], 0, 1); - returns [0,8] Search on list of values: Return all matches per search vector element: search("abc",[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9] ], 0); - returns [[0,4],[1,5],[2,6]] Return first match per search vector element; special case return vector: search("abc",[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9] ], 1); - returns [0,1,2] Return first two matches per search vector element; vector of vectors: search("abce",[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9] ], 2); - returns [[0,4],[1,5],[2,6],[8]] */ static Value::VectorType search(const str_utf8_wrapper &find, const str_utf8_wrapper &table, unsigned int num_returns_per_match, const Location &, const Context *) { Value::VectorType returnvec; //Unicode glyph count for the length size_t findThisSize = find.get_utf8_strlen(); size_t searchTableSize = table.get_utf8_strlen(); for (size_t i = 0; i < findThisSize; i++) { unsigned int matchCount = 0; Value::VectorType resultvec; const gchar *ptr_ft = g_utf8_offset_to_pointer(find.c_str(), i); for (size_t j = 0; j < searchTableSize; j++) { const gchar *ptr_st = g_utf8_offset_to_pointer(table.c_str(), j); if (ptr_ft && ptr_st && (g_utf8_get_char(ptr_ft) == g_utf8_get_char(ptr_st)) ) { matchCount++; if (num_returns_per_match == 1) { returnvec.push_back(ValuePtr(double(j))); break; } else { resultvec.push_back(ValuePtr(double(j))); } if (num_returns_per_match > 1 && matchCount >= num_returns_per_match) { break; } } } if (matchCount == 0) { gchar utf8_of_cp[6] = ""; //A buffer for a single unicode character to be copied into if (ptr_ft) g_utf8_strncpy(utf8_of_cp, ptr_ft, 1); } if (num_returns_per_match == 0 || num_returns_per_match > 1) { returnvec.push_back(ValuePtr(resultvec)); } } return returnvec; } static Value::VectorType search(const str_utf8_wrapper &find, const Value::VectorType &table, unsigned int num_returns_per_match, unsigned int index_col_num, const Location &loc, const Context *ctx) { Value::VectorType returnvec; //Unicode glyph count for the length unsigned int findThisSize = find.get_utf8_strlen(); unsigned int searchTableSize = table.size(); for (size_t i = 0; i < findThisSize; i++) { unsigned int matchCount = 0; Value::VectorType resultvec; const gchar *ptr_ft = g_utf8_offset_to_pointer(find.c_str(), i); for (size_t j = 0; j < searchTableSize; j++) { const Value::VectorType &entryVec = table[j]->toVector(); if (entryVec.size() <= index_col_num) { PRINTB("WARNING: Invalid entry in search vector at index %d, required number of values in the entry: %d. Invalid entry: %s, %s", j % (index_col_num + 1) % table[j]->toEchoString() % loc.toRelativeString(ctx->documentPath())); return Value::VectorType(); } const gchar *ptr_st = g_utf8_offset_to_pointer(entryVec[index_col_num]->toString().c_str(), 0); if (ptr_ft && ptr_st && (g_utf8_get_char(ptr_ft) == g_utf8_get_char(ptr_st)) ) { matchCount++; if (num_returns_per_match == 1) { returnvec.push_back(ValuePtr(double(j))); break; } else { resultvec.push_back(ValuePtr(double(j))); } if (num_returns_per_match > 1 && matchCount >= num_returns_per_match) { break; } } } if (matchCount == 0) { gchar utf8_of_cp[6] = ""; //A buffer for a single unicode character to be copied into if (ptr_ft) g_utf8_strncpy(utf8_of_cp, ptr_ft, 1); PRINTB(" WARNING: search term not found: \"%s\", %s", utf8_of_cp % loc.toRelativeString(ctx->documentPath())); } if (num_returns_per_match == 0 || num_returns_per_match > 1) { returnvec.push_back(ValuePtr(resultvec)); } } return returnvec; } ValuePtr builtin_search(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() < 2){ print_argCnt_warning("search", ctx, evalctx); return ValuePtr::undefined; } ValuePtr findThis = evalctx->getArgValue(0); ValuePtr searchTable = evalctx->getArgValue(1); unsigned int num_returns_per_match = (evalctx->numArgs() > 2) ? (unsigned int)evalctx->getArgValue(2)->toDouble() : 1; unsigned int index_col_num = (evalctx->numArgs() > 3) ? (unsigned int)evalctx->getArgValue(3)->toDouble() : 0; Value::VectorType returnvec; if (findThis->type() == Value::ValueType::NUMBER) { unsigned int matchCount = 0; for (size_t j = 0; j < searchTable->toVector().size(); j++) { const ValuePtr &search_element = searchTable->toVector()[j]; if ((index_col_num == 0 && findThis == search_element) || (index_col_num < search_element->toVector().size() && findThis == search_element->toVector()[index_col_num])) { returnvec.push_back(ValuePtr(double(j))); matchCount++; if (num_returns_per_match != 0 && matchCount >= num_returns_per_match) break; } } } else if (findThis->type() == Value::ValueType::STRING) { if (searchTable->type() == Value::ValueType::STRING) { returnvec = search(findThis->toString(), searchTable->toString(), num_returns_per_match, evalctx->loc, ctx); } else { returnvec = search(findThis->toString(), searchTable->toVector(), num_returns_per_match, index_col_num, evalctx->loc, ctx); } } else if (findThis->type() == Value::ValueType::VECTOR) { for (size_t i = 0; i < findThis->toVector().size(); i++) { unsigned int matchCount = 0; Value::VectorType resultvec; const ValuePtr &find_value = findThis->toVector()[i]; for (size_t j = 0; j < searchTable->toVector().size(); j++) { const ValuePtr &search_element = searchTable->toVector()[j]; if ((index_col_num == 0 && find_value == search_element) || (index_col_num < search_element->toVector().size() && find_value == search_element->toVector()[index_col_num])) { ValuePtr resultValue((double(j))); matchCount++; if (num_returns_per_match == 1) { returnvec.push_back(resultValue); break; } else { resultvec.push_back(resultValue); } if (num_returns_per_match > 1 && matchCount >= num_returns_per_match) break; } } if (num_returns_per_match == 1 && matchCount == 0) { returnvec.push_back(ValuePtr(resultvec)); } if (num_returns_per_match == 0 || num_returns_per_match > 1) { returnvec.push_back(ValuePtr(resultvec)); } } } else { return ValuePtr::undefined; } return ValuePtr(returnvec); } #define QUOTE(x__) # x__ #define QUOTED(x__) QUOTE(x__) ValuePtr builtin_version(const Context *, const EvalContext *evalctx) { (void)evalctx; // unusued parameter Value::VectorType val; val.push_back(double(OPENSCAD_YEAR)); val.push_back(double(OPENSCAD_MONTH)); #ifdef OPENSCAD_DAY val.push_back(double(OPENSCAD_DAY)); #endif return ValuePtr(val); } ValuePtr builtin_version_num(const Context *ctx, const EvalContext *evalctx) { ValuePtr val = (evalctx->numArgs() == 0) ? builtin_version(ctx, evalctx) : evalctx->getArgValue(0); double y, m, d; if (!val->getVec3(y, m, d, 0)) { return ValuePtr::undefined; } return ValuePtr(y * 10000 + m * 100 + d); } ValuePtr builtin_parent_module(const Context *ctx, const EvalContext *evalctx) { int n; double d; int s = UserModule::stack_size(); if (evalctx->numArgs() == 0) d=1; // parent module else if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() != Value::ValueType::NUMBER) return ValuePtr::undefined; v->getDouble(d); } else { print_argCnt_warning("parent_module", ctx, evalctx); return ValuePtr::undefined; } n=trunc(d); if (n < 0) { PRINTB("WARNING: Negative parent module index (%d) not allowed, %s", n % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } if (n >= s) { PRINTB("WARNING: Parent module index (%d) greater than the number of modules on the stack, %s", n % evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } return ValuePtr(UserModule::stack_element(s - 1 - n)); } ValuePtr builtin_norm(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr val = evalctx->getArgValue(0); if (val->type() == Value::ValueType::VECTOR) { double sum = 0; const Value::VectorType &v = val->toVector(); size_t n = v.size(); for (size_t i = 0; i < n; i++) if (v[i]->type() == Value::ValueType::NUMBER) { // sum += pow(v[i].toDouble(),2); double x = v[i]->toDouble(); sum += x*x; } else { PRINTB("WARNING: Incorrect arguments to norm(), %s", evalctx->loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } return ValuePtr(sqrt(sum)); } }else{ print_argCnt_warning("norm", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_cross(const Context *ctx, const EvalContext *evalctx) { auto loc = evalctx->loc; if (evalctx->numArgs() != 2) { PRINTB("WARNING: Invalid number of parameters for cross(), %s", loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } ValuePtr arg0 = evalctx->getArgValue(0); ValuePtr arg1 = evalctx->getArgValue(1); if ((arg0->type() != Value::ValueType::VECTOR) || (arg1->type() != Value::ValueType::VECTOR)) { PRINTB("WARNING: Invalid type of parameters for cross(), %s", loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } const Value::VectorType &v0 = arg0->toVector(); const Value::VectorType &v1 = arg1->toVector(); if ((v0.size() == 2) && (v1.size() == 2)) { return ValuePtr(v0[0]->toDouble() * v1[1]->toDouble() - v0[1]->toDouble() * v1[0]->toDouble()); } if ((v0.size() != 3) || (v1.size() != 3)) { PRINTB("WARNING: Invalid vector size of parameter for cross(), %s", loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } for (unsigned int a = 0;a < 3;a++) { if ((v0[a]->type() != Value::ValueType::NUMBER) || (v1[a]->type() != Value::ValueType::NUMBER)) { PRINTB("WARNING: Invalid value in parameter vector for cross(), %s", loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } double d0 = v0[a]->toDouble(); double d1 = v1[a]->toDouble(); if (std::isnan(d0) || std::isnan(d1)) { PRINTB("WARNING: Invalid value (NaN) in parameter vector for cross(), %s", loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } if (std::isinf(d0) || std::isinf(d1)) { PRINTB("WARNING: Invalid value (INF) in parameter vector for cross(), %s", loc.toRelativeString(ctx->documentPath())); return ValuePtr::undefined; } } double x = v0[1]->toDouble() * v1[2]->toDouble() - v0[2]->toDouble() * v1[1]->toDouble(); double y = v0[2]->toDouble() * v1[0]->toDouble() - v0[0]->toDouble() * v1[2]->toDouble(); double z = v0[0]->toDouble() * v1[1]->toDouble() - v0[1]->toDouble() * v1[0]->toDouble(); Value::VectorType result; result.push_back(ValuePtr(x)); result.push_back(ValuePtr(y)); result.push_back(ValuePtr(z)); return ValuePtr(result); } ValuePtr builtin_is_undef(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { const auto &arg =evalctx->getArgs()[0]; ValuePtr v; if(auto lookup = dynamic_pointer_cast (arg.expr)){ v = lookup->evaluateSilently(evalctx); }else{ v = evalctx->getArgValue(0); } return ValuePtr(v == ValuePtr::undefined); }else{ print_argCnt_warning("is_undef", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_is_list(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::VECTOR){ return ValuePtr(true); }else{ return ValuePtr(false); } }else{ print_argCnt_warning("is_list", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_is_num(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::NUMBER){ return ValuePtr(!std::isnan(v->toDouble())); }else{ return ValuePtr(false); } }else{ print_argCnt_warning("is_num", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_is_bool(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::BOOL){ return ValuePtr(true); }else{ return ValuePtr(false); } }else{ print_argCnt_warning("is_bool", ctx, evalctx); } return ValuePtr::undefined; } ValuePtr builtin_is_string(const Context *ctx, const EvalContext *evalctx) { if (evalctx->numArgs() == 1) { ValuePtr v = evalctx->getArgValue(0); if (v->type() == Value::ValueType::STRING){ return ValuePtr(true); }else{ return ValuePtr(false); } }else{ print_argCnt_warning("is_string", ctx, evalctx); } return ValuePtr::undefined; } void register_builtin_functions() { Builtins::init("abs", new BuiltinFunction(&builtin_abs)); Builtins::init("sign", new BuiltinFunction(&builtin_sign)); Builtins::init("rands", new BuiltinFunction(&builtin_rands)); Builtins::init("min", new BuiltinFunction(&builtin_min)); Builtins::init("max", new BuiltinFunction(&builtin_max)); Builtins::init("sin", new BuiltinFunction(&builtin_sin)); Builtins::init("cos", new BuiltinFunction(&builtin_cos)); Builtins::init("asin", new BuiltinFunction(&builtin_asin)); Builtins::init("acos", new BuiltinFunction(&builtin_acos)); Builtins::init("tan", new BuiltinFunction(&builtin_tan)); Builtins::init("atan", new BuiltinFunction(&builtin_atan)); Builtins::init("atan2", new BuiltinFunction(&builtin_atan2)); Builtins::init("round", new BuiltinFunction(&builtin_round)); Builtins::init("ceil", new BuiltinFunction(&builtin_ceil)); Builtins::init("floor", new BuiltinFunction(&builtin_floor)); Builtins::init("pow", new BuiltinFunction(&builtin_pow)); Builtins::init("sqrt", new BuiltinFunction(&builtin_sqrt)); Builtins::init("exp", new BuiltinFunction(&builtin_exp)); Builtins::init("len", new BuiltinFunction(&builtin_length)); Builtins::init("log", new BuiltinFunction(&builtin_log)); Builtins::init("ln", new BuiltinFunction(&builtin_ln)); Builtins::init("str", new BuiltinFunction(&builtin_str)); Builtins::init("chr", new BuiltinFunction(&builtin_chr)); Builtins::init("ord", new BuiltinFunction(&builtin_ord)); Builtins::init("concat", new BuiltinFunction(&builtin_concat)); Builtins::init("lookup", new BuiltinFunction(&builtin_lookup)); Builtins::init("search", new BuiltinFunction(&builtin_search)); Builtins::init("version", new BuiltinFunction(&builtin_version)); Builtins::init("version_num", new BuiltinFunction(&builtin_version_num)); Builtins::init("norm", new BuiltinFunction(&builtin_norm)); Builtins::init("cross", new BuiltinFunction(&builtin_cross)); Builtins::init("parent_module", new BuiltinFunction(&builtin_parent_module)); Builtins::init("is_undef", new BuiltinFunction(&builtin_is_undef)); Builtins::init("is_list", new BuiltinFunction(&builtin_is_list)); Builtins::init("is_num", new BuiltinFunction(&builtin_is_num)); Builtins::init("is_bool", new BuiltinFunction(&builtin_is_bool)); Builtins::init("is_string", new BuiltinFunction(&builtin_is_string)); } openscad-2019.05/src/function.cc0000644000076500000240000001063713423455221017032 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "function.h" #include "evalcontext.h" #include "expression.h" #include "printutils.h" AbstractFunction::~AbstractFunction() { } UserFunction::UserFunction(const char *name, AssignmentList &definition_arguments, shared_ptr expr, const Location &loc) : ASTNode(loc), name(name), definition_arguments(definition_arguments), expr(expr) { } UserFunction::~UserFunction() { } ValuePtr UserFunction::evaluate(const Context *ctx, const EvalContext *evalctx) const { if (!expr) return ValuePtr::undefined; Context c(ctx); c.setVariables(evalctx, definition_arguments); ValuePtr result = expr->evaluate(&c); return result; } void UserFunction::print(std::ostream &stream, const std::string &indent) const { stream << indent << "function " << name << "("; for (size_t i=0; i < definition_arguments.size(); i++) { const Assignment &arg = definition_arguments[i]; if (i > 0) stream << ", "; stream << arg.name; if (arg.expr) stream << " = " << *arg.expr; } stream << ") = " << *expr << ";\n"; } class FunctionTailRecursion : public UserFunction { private: bool invert; shared_ptr op; shared_ptr call; shared_ptr endexpr; public: FunctionTailRecursion(const char *name, AssignmentList &definition_arguments, shared_ptr expr, shared_ptr call, shared_ptr endexpr, bool invert, const Location &loc) : UserFunction(name, definition_arguments, expr, loc), invert(invert), op(expr), call(call), endexpr(endexpr) { } ~FunctionTailRecursion() { } ValuePtr evaluate(const Context *ctx, const EvalContext *evalctx) const override { if (!expr) return ValuePtr::undefined; Context c(ctx); c.setVariables(evalctx, definition_arguments); EvalContext ec(&c, call->arguments, loc); Context tmp(&c); unsigned int counter = 0; while (invert ^ this->op->cond->evaluate(&c)) { tmp.setVariables(&ec, definition_arguments); c.apply_variables(tmp); if (counter++ == 1000000){ std::string locs = loc.toRelativeString(ctx->documentPath()); PRINTB("ERROR: Recursion detected calling function '%s' %s", this->name % locs); throw RecursionException::create("function", this->name,loc); } } ValuePtr result = endexpr->evaluate(&c); return result; } }; UserFunction *UserFunction::create(const char *name, AssignmentList &definition_arguments, shared_ptr expr, const Location &loc) { if (shared_ptr ternary = dynamic_pointer_cast(expr)) { shared_ptr ifcall = dynamic_pointer_cast(ternary->ifexpr); shared_ptr elsecall = dynamic_pointer_cast(ternary->elseexpr); if (ifcall && !elsecall) { if (name == ifcall->name) { return new FunctionTailRecursion(name, definition_arguments, ternary, ifcall, ternary->elseexpr, false, loc); } } else if (elsecall && !ifcall) { if (name == elsecall->name) { return new FunctionTailRecursion(name, definition_arguments, ternary, elsecall, ternary->ifexpr, true, loc); } } } return new UserFunction(name, definition_arguments, expr, loc); } BuiltinFunction::~BuiltinFunction() { } ValuePtr BuiltinFunction::evaluate(const Context *ctx, const EvalContext *evalctx) const { return eval_func(ctx, evalctx); } openscad-2019.05/src/function.h0000644000076500000240000000314213414440264016666 0ustar kintelstaff00000000000000#pragma once #include "AST.h" #include "value.h" #include "Assignment.h" #include "feature.h" #include #include class AbstractFunction { private: const Feature *feature; public: AbstractFunction(const Feature& feature) : feature(&feature) {} AbstractFunction() : feature(nullptr) {} virtual ~AbstractFunction(); virtual bool is_experimental() const { return feature != nullptr; } virtual bool is_enabled() const { return (feature == nullptr) || feature->is_enabled(); } virtual ValuePtr evaluate(const class Context *ctx, const class EvalContext *evalctx) const = 0; }; class BuiltinFunction : public AbstractFunction { public: typedef ValuePtr (*eval_func_t)(const Context *ctx, const EvalContext *evalctx); eval_func_t eval_func; BuiltinFunction(eval_func_t f) : eval_func(f) { } BuiltinFunction(eval_func_t f, const Feature& feature) : AbstractFunction(feature), eval_func(f) { } ~BuiltinFunction(); ValuePtr evaluate(const Context *ctx, const EvalContext *evalctx) const override; }; class UserFunction : public AbstractFunction, public ASTNode { public: std::string name; AssignmentList definition_arguments; shared_ptr expr; UserFunction(const char *name, AssignmentList &definition_arguments, shared_ptr expr, const Location &loc); ~UserFunction(); ValuePtr evaluate(const Context *ctx, const EvalContext *evalctx) const override; void print(std::ostream &stream, const std::string &indent) const override; static UserFunction *create(const char *name, AssignmentList &definition_arguments, shared_ptr expr, const Location &loc); }; openscad-2019.05/src/grid.h0000644000076500000240000001052213402025764015767 0ustar kintelstaff00000000000000#pragma once #include "linalg.h" #include "hash.h" #include #include #include // int64_t #include #include //const double GRID_COARSE = 0.001; //const double GRID_FINE = 0.000001; /* Using decimals that are exactly convertible to binary floating point (and then converted exactly to a GMPQ Rational that uses a small amount of bytes aka "limbs" in CGAL's engine) provides at least a 5% speedup for ctest -R CGAL. We choose 1/1024 and 1/(1024*1024) In python: print '%.64f' % float(fractions.Fraction(1,1024)) */ const double GRID_COARSE = 0.0009765625; const double GRID_FINE = 0.00000095367431640625; template class Grid2d { public: double res; std::unordered_map, T, boost::hash>> db; Grid2d(double resolution) { res = resolution; } /*! Aligns x,y to the grid or to existing point if one close enough exists. Returns the value stored if a point already existing or an uninitialized new value if not. */ T &align(double &x, double &y) { int64_t ix = (int64_t)std::round(x / res); int64_t iy = (int64_t)std::round(y / res); if (db.find(std::make_pair(ix, iy)) == db.end()) { int dist = 10; for (int64_t jx = ix - 1; jx <= ix + 1; jx++) { for (int64_t jy = iy - 1; jy <= iy + 1; jy++) { if (db.find(std::make_pair(jx, jy)) == db.end()) continue; int d = abs(int(ix-jx)) + abs(int(iy-jy)); if (d < dist) { dist = d; ix = jx; iy = jy; } } } } x = ix * res, y = iy * res; return db[std::make_pair(ix, iy)]; } bool has(double x, double y) const { int64_t ix = (int64_t)std::round(x / res); int64_t iy = (int64_t)std::round(y / res); if (db.find(std::make_pair(ix, iy)) != db.end()) return true; for (int64_t jx = ix - 1; jx <= ix + 1; jx++) for (int64_t jy = iy - 1; jy <= iy + 1; jy++) { if (db.find(std::make_pair(jx, jy)) != db.end()) return true; } return false; } bool eq(double x1, double y1, double x2, double y2) { align(x1, y1); align(x2, y2); if (fabs(x1 - x2) < res && fabs(y1 - y2) < res) return true; return false; } T &data(double x, double y) { return align(x, y); } T &operator()(double x, double y) { return align(x, y); } }; template class Grid3d { public: double res; typedef Vector3l Key; typedef std::unordered_map GridContainer; GridContainer db; Grid3d(double resolution) { res = resolution; } inline void createGridVertex(const Vector3d &v, Vector3l &i) { i[0] = int64_t(v[0] / this->res); i[1] = int64_t(v[1] / this->res); i[2] = int64_t(v[2] / this->res); } // Aligns vertex to the grid. Returns index of the vertex. // Will automatically increase the index as new unique vertices are added. T align(Vector3d &v) { Vector3l key; createGridVertex(v, key); typename GridContainer::iterator iter = db.find(key); if (iter == db.end()) { float dist = 10.0f; // > max possible distance for (int64_t jx = key[0] - 1; jx <= key[0] + 1; jx++) { for (int64_t jy = key[1] - 1; jy <= key[1] + 1; jy++) { for (int64_t jz = key[2] - 1; jz <= key[2] + 1; jz++) { Vector3l k(jx, jy, jz); typename GridContainer::iterator tmpiter = db.find(k); if (tmpiter == db.end()) continue; float d = sqrt((key-k).squaredNorm()); if (d < dist) { dist = d; iter = tmpiter; } } } } } T data; if (iter == db.end()) { // Not found: insert using key data = db.size(); db[key] = data; } else { // If found return existing data key = iter->first; data = iter->second; } // Align vertex v[0] = key[0] * this->res; v[1] = key[1] * this->res; v[2] = key[2] * this->res; return data; } bool has(const Vector3d &v, T *data = nullptr) { Vector3l key = createGridVertex(v); typename GridContainer::iterator pos = db.find(key); if (pos != db.end()) { if (data) *data = pos->second; return true; } for (int64_t jx = key[0] - 1; jx <= key[0] + 1; jx++) for (int64_t jy = key[1] - 1; jy <= key[1] + 1; jy++) for (int64_t jz = key[2] - 1; jz <= key[2] + 1; jz++) { pos = db.find(Vector3l(jx, jy, jz)); if (pos != db.end()) { if (data) *data = pos->second; return true; } } return false; } T data(Vector3d v) { return align(v); } }; openscad-2019.05/src/handle_dep.cc0000644000076500000240000000237613414457534017302 0ustar kintelstaff00000000000000#include "handle_dep.h" #include "printutils.h" #include #include #include // for system() #include #include #include namespace fs = boost::filesystem; std::unordered_set dependencies; const char *make_command = nullptr; void handle_dep(const std::string &filename) { fs::path filepath(filename); std::string dep = boost::regex_replace(filepath.generic_string(), boost::regex("\\ "), "\\\\ "); if (dependencies.find(dep) != dependencies.end()) { return; // included and used files are very likely to be added many times by the parser } dependencies.insert(dep); if (make_command && !fs::exists(filepath)) { system(STR(make_command << " '" << boost::regex_replace(filename, boost::regex("'"), "'\\''") << "'").c_str()); // FIXME: Handle error } } bool write_deps(const std::string &filename, const std::string &output_file) { FILE *fp = fopen(filename.c_str(), "wt"); if (!fp) { fprintf(stderr, "Can't open dependencies file `%s' for writing!\n", filename.c_str()); return false; } fprintf(fp, "%s:", output_file.c_str()); for(const auto &str : dependencies) { fprintf(fp, " \\\n\t%s", str.c_str()); } fprintf(fp, "\n"); fclose(fp); return true; } openscad-2019.05/src/handle_dep.h0000644000076500000240000000027613402025764017132 0ustar kintelstaff00000000000000#pragma once #include extern const char *make_command; void handle_dep(const std::string &filename); bool write_deps(const std::string &filename, const std::string &output_file); openscad-2019.05/src/hash.cc0000644000076500000240000000151413402025764016124 0ustar kintelstaff00000000000000#include "hash.h" #include namespace std { std::size_t hash::operator()(const Vector3f &s) const { return Eigen::hash_value(s); } std::size_t hash::operator()(const Vector3d &s) const { return Eigen::hash_value(s); } std::size_t hash::operator()(const Vector3l &s) const { return Eigen::hash_value(s); } } namespace Eigen { size_t hash_value(Vector3f const &v) { size_t seed = 0; for (int i=0;i<3;i++) boost::hash_combine(seed, v[i]); return seed; } size_t hash_value(Vector3d const &v) { size_t seed = 0; for (int i=0;i<3;i++) boost::hash_combine(seed, v[i]); return seed; } size_t hash_value(Eigen::Matrix const &v) { size_t seed = 0; for (int i=0;i<3;i++) boost::hash_combine(seed, v[i]); return seed; } } openscad-2019.05/src/hash.h0000644000076500000240000000076713402025764015777 0ustar kintelstaff00000000000000#pragma once #include "linalg.h" typedef Eigen::Matrix Vector3l; namespace std { template<> struct hash { std::size_t operator()(const Vector3f &s) const; }; template<> struct hash { std::size_t operator()(const Vector3d &s) const; }; template<> struct hash { std::size_t operator()(const Vector3l &s) const; }; } namespace Eigen { size_t hash_value(Vector3f const &v); size_t hash_value(Vector3d const &v); size_t hash_value(Vector3l const &v); } openscad-2019.05/src/highlighter.cc0000644000076500000240000003546013432700636017507 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* Syntax Highlighter for OpenSCAD based on Syntax Highlight code by Christopher Olah Speed Note: setFormat() is very slow. normally this doesn't matter because we only highlight a block or two at once. But when OpenSCAD first starts, QT automagically calls 'highlightBlock' on every single textblock in the file even if it's not visible in the window. On a large file (50,000 lines) this can take several seconds. Also, QT 4.5 and lower do not have rehighlightBlock(), so they will be slow on large files as well, as they re-highlight everything after each compile. The vast majority of OpenSCAD files, however, are not 50,000 lines and most machines have Qt > 4.5 See Also: Giles Bathgate's Rapcad lexer-based highlighter: rapcad.org Test suite: 1. action: open example001, remove first {, hit f5 expected result: error highlight appears on last }, cursor moves there action: replace first {, hit f5 expected result: error highlight disappears 1a. action: open example001, remove first {, hit f5 expected result: error highlight appears on last }, cursor moves there action: replace first { with the letter 'P', hit f5 expected result: error highlight on last } disappears, appears on elsewhere action: replace first {, hit f5 expected result: error highlight disappears 2. action: type a=b into any file expected result: '=' is highlighted with its appropriate format 2a. action: type a=b=c=d=e=f= into any file expected result: each '=' is highlighted with its appropriate format 3. action: open example001, put '===' after first ; hit f5 expected result: error highlight appears in === action: remove '===' expected result: error highlight disappears 3a. action: open example001, put '=' after first ; hit f5 expected result: error highlight appears action: remove '=' expected result: error highlight disappears 3b. action: open example001, put '=' after first { expected result: error highlight appears action: remove '=' expected result: error highlight disappears 3c. action: open example001, replace first { with '=' expected result: error highlight appears action: remove '=', replace with { expected result: error highlight disappears 4. action: open example001, remove last ';' but not trailing whitespace/\n expected result: error highlight appears somewhere near end action: replace last ';' expected result: error highlight disappears 5. action: open file, type in a multi-line comment expected result: multiline comment should be highlighted appropriately 6. action: open example001, remove first ')' expected result: highlight should appear appropriately 7. action: create a large file (50,000 lines). eg at a bash prompt: for i in {1..2000}; do cat examples/example001.scad >> test5k.scad ; done action: open file in openscad expected result: it should load in a reasonable amount of time action: scroll to bottom, put '=' after last ; expected result: there should be a highlight, and a report of syntax error and it should be almost instantaneous. 8. action: open any file, and hold down 'f5' key to repeatedly reparse expected result: no crashing! 9. action: for i in examples/ex* ; do ./openscad $i ; done expected result: make sure the colors look harmonious 10. action: type random string of [][][][]()()[][90,3904,00,000] expected result: all should be highlighted correctly 11. action: type a single slash (/) or slash-star-star (/x**, remove x) into a blank document. expected result: don't crash esp. on mac 12. action: start openscad, open example 001. open edit/prefs/editor/ syntax-highlighter, 'for light background'. make your OS use a light (white) background for the openscad text editor. expected result: text is clearly visible, colors have good contrast 13. repeat test 12, but with 'for dark background' and dark background expected result: text is clearly visible, colors have good contrast 14. repeat test 12, but turn the syntax highlighter off. expected result: text is clearly visible, single color has good contrast 14. repeat test 13, but turn the syntax highlighter off. expected result: text is clearly visible, single color has good contrast */ #include "highlighter.h" #include "Preferences.h" #include #include #include //#include "printutils.h" void format_colors_for_light_background(QMap &formats) { //PRINT("format for light"); formats["operator"].setForeground(Qt::blue); formats["math"].setForeground(QColor("Green")); formats["keyword"].setForeground(QColor("Green")); formats["keyword"].setToolTip("Keyword"); formats["transform"].setForeground(QColor("Indigo")); formats["csgop"].setForeground(QColor("DarkGreen")); formats["prim3d"].setForeground(QColor("DarkBlue")); formats["prim2d"].setForeground(QColor("MidnightBlue")); formats["import"].setForeground(Qt::darkYellow); formats["special"].setForeground(Qt::darkGreen); formats["extrude"].setForeground(Qt::darkGreen); formats["bracket"].setForeground(QColor("Green")); formats["curlies"].setForeground(QColor(32,32,20)); formats["bool"].setForeground(QColor("DarkRed")); formats["_$quote"].setForeground(Qt::darkMagenta); formats["_$comment"].setForeground(Qt::darkCyan); formats["_$number"].setForeground(QColor("DarkRed")); } void format_colors_for_dark_background(QMap &formats) { //PRINT("format for dark"); formats["operator"].setForeground(QColor("SkyBlue")); formats["math"].setForeground(Qt::green); formats["keyword"].setForeground(QColor("LightGreen")); formats["keyword"].setToolTip("Keyword"); formats["transform"].setForeground(QColor("Thistle")); formats["csgop"].setForeground(QColor("LightGreen")); formats["prim3d"].setForeground(QColor("LightBlue")); formats["prim2d"].setForeground(QColor("LightBlue")); formats["import"].setForeground(QColor("LightYellow")); formats["special"].setForeground(QColor("LightGreen")); formats["extrude"].setForeground(QColor("PaleGreen")); formats["bracket"].setForeground(QColor("LimeGreen")); formats["curlies"].setForeground(QColor("Lavender")); formats["bool"].setForeground(QColor("Red")); formats["_$quote"].setForeground(Qt::magenta); formats["_$comment"].setForeground(Qt::cyan); formats["_$number"].setForeground(Qt::red); } void Highlighter::assignFormatsToTokens(const QString &s) { //PRINTB("assign fmts %s",s.toStdString()); if (s=="For Light Background") { format_colors_for_light_background(this->typeformats); } else if (s=="For Dark Background") { format_colors_for_dark_background(this->typeformats); } else return; // Put each token into single QHash, and map it to it's appropriate // qtextchar format (color, bold, etc). For example, '(' is type // 'bracket' so it should get the 'bracket' format from // typeformats[] which is, maybe, Green. QList::iterator ki; QList toktypes = tokentypes.keys(); for ( ki=toktypes.begin(); ki!=toktypes.end(); ++ki ) { QString toktype = *ki; QStringList::iterator it; for ( it = tokentypes[toktype].begin(); it < tokentypes[toktype].end(); ++it) { QString token = *it; //PRINTB("set format for %s: type %s", token.toStdString()%toktype.toStdString() ); tokenFormats[ token ] = typeformats [ toktype ]; } } } Highlighter::Highlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) { tokentypes["operator"] << "=" << "!" << "&&" << "||" << "+" << "-" << "*" << "/" << "%" << "!" << "#" << ";"; tokentypes["math"] << "abs" << "sign" << "acos" << "asin" << "atan" << "atan2" << "sin" << "cos" << "floor" << "round" << "ceil" << "ln" << "log" << "lookup" << "min" << "max" << "pow" << "sqrt" << "exp" << "rands" << "chr" << "ord" << "is_undef" << "is_list" << "is_num" << "is_bool" << "is_string"; tokentypes["keyword"] << "module" << "function" << "for" << "intersection_for" << "if" << "assign" << "echo"<< "search" << "str" << "let" << "each" << "assert"; tokentypes["transform"] << "scale" << "translate" << "rotate" << "multmatrix" << "color" << "projection" << "hull" << "resize" << "mirror" << "minkowski"; tokentypes["csgop"] << "union" << "intersection" << "difference" << "render"; tokentypes["prim3d"] << "cube" << "cylinder" << "sphere" << "polyhedron"; tokentypes["prim2d"] << "square" << "polygon" << "circle"; tokentypes["import"] << "include" << "use" << "import_stl" << "import" << "import_dxf" << "dxf_dim" << "dxf_cross" << "surface"; tokentypes["special"] << "$children" << "child" << "children" << "$fn" << "$fa" << "$fs" << "$t" << "$preview" << "$vpt" << "$vpr" << "$vpd"; tokentypes["extrude"] << "linear_extrude" << "rotate_extrude"; tokentypes["bracket"] << "[" << "]" << "(" << ")"; tokentypes["curlies"] << "{" << "}"; tokentypes["bool"] << "true" << "false"; tokentypes["_$comment"] << "_$comment"; // bit of a kludge here tokentypes["_$quote"] << "_$quote"; tokentypes["_$number"] << "_$number"; errorFormat.setBackground(Qt::red); errorState = false; errorPos = -1; lastErrorBlock = parent->begin(); } void Highlighter::highlightError(int error_pos) { errorState = true; errorPos = error_pos; QTextBlock err_block = document()->findBlock( errorPos ); //PRINTB( "error pos: %i doc len: %i ", error_pos % document()->characterCount() ); while (err_block.text().remove(QRegExp("\\s+")).size()==0) { //PRINT("special case - errors at end of file w whitespace"; err_block = err_block.previous(); errorPos = err_block.position()+err_block.length() - 2; } if ( errorPos == lastDocumentPos()-1 ) { errorPos--; } int block_last_pos = err_block.position() + err_block.length() - 1; if ( errorPos == block_last_pos ) { //PRINT( "special case - errors at ends of certain blocks"); errorPos--; } err_block = document()->findBlock(errorPos); portable_rehighlightBlock( err_block ); errorState = false; lastErrorBlock = err_block; } void Highlighter::unhighlightLastError() { portable_rehighlightBlock( lastErrorBlock ); } void Highlighter::portable_rehighlightBlock( const QTextBlock &block ) { #if (QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)) rehighlightBlock( block ); #else rehighlight(); // slow on very large files #endif } int Highlighter::lastDocumentPos() { #if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) return document()->characterCount(); #else QTextBlock lastblock = document()->lastBlock(); return lastblock.position() + lastblock.length(); #endif } void Highlighter::highlightBlock(const QString &text) { int block_first_pos = currentBlock().position(); //int block_last_pos = block_first_pos + currentBlock().length() - 1; //std::cout << "block[" << block_first_pos << ":" << block_last_pos << "]" // << ", err:" << errorPos << "," << errorState // << ", text:'" << text.toStdString() << "'\n"; // If desired, skip all highlighting .. except for error highlighting. if (Preferences::inst()->getValue("editor/syntaxhighlight").toString()==QString("Off")) { if (errorState) setFormat( errorPos - block_first_pos, 1, errorFormat); return; } // bit of a kludge (for historical convenience) QTextCharFormat "eFormat = tokenFormats["_$quote"]; QTextCharFormat &commentFormat = tokenFormats["_$comment"]; QTextCharFormat &numberFormat = tokenFormats["_$number"]; // Split the block into chunks (tokens), based on whitespace, // and then highlight each token as appropriate QString newtext = text; QStringList splitHelpers; QStringList::iterator sh, token; // splitHelpers - so "{[a+b]}" is treated as " { [ a + b ] } " splitHelpers << tokentypes["operator"] << tokentypes["bracket"] << tokentypes["curlies"] << ":" << ","; for ( sh = splitHelpers.begin(); sh!=splitHelpers.end(); ++sh ) { newtext = newtext.replace( *sh, " " + *sh + " "); } //PRINTB("\nnewtext: %s", newtext.toStdString() ); QStringList tokens = newtext.split(QRegExp("\\s")); int tokindex = 0; // tokindex helps w duplicate tokens in a single block bool numtest; for ( token = tokens.begin(); token!=tokens.end(); ++token ){ if ( tokenFormats.contains( *token ) ) { tokindex = text.indexOf( *token, tokindex ); setFormat( tokindex, token->size(), tokenFormats[ *token ]); std::string tokprint = (*token).toStdString(); //PRINTB("found tok '%s' at %i", tokprint % tokindex ); tokindex += token->size(); } else { (*token).toDouble( &numtest ); if ( numtest ) { tokindex = text.indexOf( *token, tokindex ); setFormat( tokindex, token->size(), numberFormat ); std::string tokprint = (*token).toStdString(); //PRINTB("found num '%s' at %i", tokprint % tokindex ); tokindex += token->size(); } } } // Quoting and Comments. state_e state = static_cast(previousBlockState()); int quote_esc_state = 0; for (int n = 0; n < text.size(); ++n){ if (state == state_e::NORMAL){ if (text[n] == '"'){ state = state_e::QUOTE; setFormat(n,1,quoteFormat); } else if (text[n] == '/'){ if ( n+1 < text.size() && text[n+1] == '/'){ setFormat(n,text.size(),commentFormat); break; } else if ( n+1 < text.size() && text[n+1] == '*'){ setFormat(n++,2,commentFormat); state = state_e::COMMENT; } } } else if (state == state_e::QUOTE){ setFormat(n,1,quoteFormat); if (quote_esc_state > 0) quote_esc_state = 0; else if (text[n] == '\\') quote_esc_state = 1; else if (text[n] == '"') state = state_e::NORMAL; } else if (state == state_e::COMMENT){ setFormat(n,1,commentFormat); if (text[n] == '*' && n+1 < text.size() && text[n+1] == '/'){ setFormat(++n,1,commentFormat); state = state_e::NORMAL; } } } setCurrentBlockState(static_cast(state)); // Highlight an error. Do it last to 'overwrite' other formatting. if (errorState) { setFormat( errorPos - block_first_pos, 1, errorFormat); } } openscad-2019.05/src/highlighter.h0000644000076500000240000000137213402025764017343 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include class Highlighter : public QSyntaxHighlighter { Q_OBJECT public: enum class state_e {NORMAL=-1,QUOTE,COMMENT}; QHash tokenFormats; QTextCharFormat errorFormat; Highlighter(QTextDocument *parent); void highlightBlock(const QString &text) override; void assignFormatsToTokens(const QString &); void portable_rehighlightBlock( const QTextBlock &text ); void highlightError(int error_pos); void unhighlightLastError(); private: QTextBlock lastErrorBlock; int errorPos; bool errorState; QMap tokentypes; QMap typeformats; int lastDocumentPos(); }; openscad-2019.05/src/imageutils-lodepng.cc0000644000076500000240000000137113402025764020773 0ustar kintelstaff00000000000000#include "imageutils.h" #include "ext/lodepng/lodepng.h" #include #include #include #include #include bool write_png(std::ostream &output, unsigned char *pixels, int width, int height) { std::vector dataout; lodepng::State state; state.encoder.auto_convert = false; // some png renderers have different interpretations of alpha, so don't use it state.info_png.color.colortype = LCT_RGB; state.info_png.color.bitdepth = 8; unsigned err = lodepng::encode(dataout, pixels, width, height, state); if ( err ) return false; output.write( reinterpret_cast(&dataout[0]), dataout.size()); if ( output.bad() ) std::cerr << "Error writing to ostream\n"; return output.good(); } openscad-2019.05/src/imageutils-macosx.cc0000644000076500000240000000672013402025764020640 0ustar kintelstaff00000000000000#include #include #include "imageutils.h" #include CGDataConsumerCallbacks dc_callbacks; size_t write_bytes_to_ostream (void *info,const void *buffer,size_t count) { assert( info && buffer ); std::ostream *output = (std::ostream *)info; size_t startpos = output->tellp(); size_t endpos = startpos; try { output->write( (const char *)buffer, count ); endpos = output->tellp(); } catch (const std::ios_base::failure& e) { std::cerr << "Error writing to ostream:" << e.what() << "\n"; } return (endpos-startpos); } CGDataConsumerRef CGDataConsumerCreateWithOstream(std::ostream &output) { dc_callbacks.putBytes = write_bytes_to_ostream; dc_callbacks.releaseConsumer = nullptr; // ostream closed by caller of write_png CGDataConsumerRef dc = CGDataConsumerCreate ( (void *)(&output), &dc_callbacks ); return dc; } bool write_png(std::ostream &output, unsigned char *pixels, int width, int height) { size_t rowBytes = width * 4; // CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big; // BGRA int bitsPerComponent = 8; CGContextRef contextRef = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, rowBytes, colorSpace, bitmapInfo); if (!contextRef) { std::cerr << "Unable to create CGContextRef."; return false; } CGImageRef imageRef = CGBitmapContextCreateImage(contextRef); if (!imageRef) { std::cerr << "Unable to create CGImageRef."; return false; } CGDataConsumerRef dataconsumer = CGDataConsumerCreateWithOstream(output); /* CFStringRef fname = CFStringCreateWithCString(kCFAllocatorDefault, filename, kCFStringEncodingUTF8); CFURLRef fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, fname, kCFURLPOSIXPathStyle, false); if (!fileURL) { std::cerr << "Unable to create file URL ref."; return false; } CGDataConsumerRef dataconsumer = CGDataConsumerCreateWithURL(fileURL); */ CFIndex fileImageIndex = 1; CFMutableDictionaryRef fileDict = nullptr; CFStringRef fileUTType = kUTTypePNG; // Create an image destination opaque reference for authoring an image file CGImageDestinationRef imageDest = CGImageDestinationCreateWithDataConsumer(dataconsumer, fileUTType, fileImageIndex, fileDict); if (!imageDest) { std::cerr << "Unable to create CGImageDestinationRef."; return false; } CFIndex capacity = 1; CFMutableDictionaryRef imageProps = CFDictionaryCreateMutable(kCFAllocatorDefault, capacity, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CGImageDestinationAddImage(imageDest, imageRef, imageProps); CGImageDestinationFinalize(imageDest); CFRelease(imageDest); CFRelease(dataconsumer); //CFRelease(fileURL); //CFRelease(fname); CFRelease(imageProps); CGColorSpaceRelease(colorSpace); CGImageRelease(imageRef); return true; } openscad-2019.05/src/imageutils.cc0000644000076500000240000000136713402025764017352 0ustar kintelstaff00000000000000#include "imageutils.h" #include #include #include void flip_image(const unsigned char *src, unsigned char *dst, size_t pixelsize, size_t width, size_t height) { assert(src && dst); auto rowBytes = pixelsize * width; for (auto i = 0ul;i < height;i++) { memmove(dst + (height - i - 1) * rowBytes, src + i * rowBytes, rowBytes); } } bool write_png(const char *filename, unsigned char *pixels, int width, int height) { assert(filename && pixels); std::ofstream fstream(filename, std::ios::binary); if (fstream.is_open()) { write_png(fstream, pixels, width, height); fstream.close(); return true; } else { std::cerr << "Can't open file " << filename << " for export."; return false; } } openscad-2019.05/src/imageutils.h0000644000076500000240000000051513402025764017206 0ustar kintelstaff00000000000000#pragma once #include #include bool write_png(const char *filename, unsigned char *pixels, int width, int height); bool write_png(std::ostream &output, unsigned char *pixels, int width, int height); void flip_image(const unsigned char *src, unsigned char *dst, size_t pixelsize, size_t width, size_t height); openscad-2019.05/src/import.cc0000644000076500000240000001766413450037261016526 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "import.h" #include "importnode.h" #include "module.h" #include "ModuleInstantiation.h" #include "polyset.h" #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #endif #include "Polygon2d.h" #include "evalcontext.h" #include "builtin.h" #include "dxfdata.h" #include "printutils.h" #include "fileutils.h" #include "feature.h" #include "handle_dep.h" #include #include #include #include namespace fs = boost::filesystem; #include using namespace boost::assign; // bring 'operator+=()' into scope #include #include extern PolySet * import_amf(std::string, const Location &loc); extern Geometry * import_3mf(const std::string &, const Location &loc); class ImportModule : public AbstractModule { public: ImportType type; ImportModule(ImportType type = ImportType::UNKNOWN) : type(type) { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *ImportModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { AssignmentList args{ Assignment("file"), Assignment("layer"), Assignment("convexity"), Assignment("origin"), Assignment("scale") }; AssignmentList optargs{ Assignment("width"), Assignment("height"), Assignment("filename"), Assignment("layername"), Assignment("center"), Assignment("dpi") }; Context c(ctx); c.setDocumentPath(evalctx->documentPath()); c.setVariables(evalctx, args, optargs); #if 0 && DEBUG c.dump(this, inst); #endif auto v = c.lookup_variable("file", true); if (v->isUndefined()) { v = c.lookup_variable("filename", true); if (!v->isUndefined()) { printDeprecation("filename= is deprecated. Please use file="); } } const std::string filename = lookup_file(v->isUndefined() ? "" : v->toString(), inst->path(), ctx->documentPath()); if (!filename.empty()) handle_dep(filename); ImportType actualtype = this->type; if (actualtype == ImportType::UNKNOWN) { std::string extraw = fs::path(filename).extension().generic_string(); std::string ext = boost::algorithm::to_lower_copy(extraw); if (ext == ".stl") actualtype = ImportType::STL; else if (ext == ".off") actualtype = ImportType::OFF; else if (ext == ".dxf") actualtype = ImportType::DXF; else if (ext == ".nef3") actualtype = ImportType::NEF3; else if (ext == ".3mf") actualtype = ImportType::_3MF; else if (ext == ".amf") actualtype = ImportType::AMF; else if (ext == ".svg") actualtype = ImportType::SVG; } auto node = new ImportNode(inst, actualtype); node->fn = c.lookup_variable("$fn")->toDouble(); node->fs = c.lookup_variable("$fs")->toDouble(); node->fa = c.lookup_variable("$fa")->toDouble(); node->filename = filename; auto layerval = c.lookup_variable("layer", true); if (layerval->isUndefined()) { layerval = c.lookup_variable("layername", true); if (!layerval->isUndefined()) { printDeprecation("layername= is deprecated. Please use layer="); } } node->layername = layerval->isUndefined() ? "" : layerval->toString(); node->convexity = (int)c.lookup_variable("convexity", true)->toDouble(); if (node->convexity <= 0) node->convexity = 1; const auto origin = c.lookup_variable("origin", true); node->origin_x = node->origin_y = 0; bool originOk = origin->getVec2(node->origin_x, node->origin_y); originOk &= std::isfinite(node->origin_x) && std::isfinite(node->origin_y); if(origin!=ValuePtr::undefined && !originOk){ PRINTB("WARNING: linear_extrude(..., origin=%s) could not be converted, %s", origin->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } const auto center = c.lookup_variable("center", true); node->center = center->type() == Value::ValueType::BOOL ? center->toBool() : false; node->scale = c.lookup_variable("scale", true)->toDouble(); if (node->scale <= 0) node->scale = 1; node->dpi = ImportNode::SVG_DEFAULT_DPI; const auto dpi = c.lookup_variable("dpi", true); if (dpi->type() == Value::ValueType::NUMBER) { double val = dpi->toDouble(); if (val < 0.001) { PRINTB("WARNING: Invalid dpi value giving, using default of %f dpi. Value must be positive and >= 0.001, file %s, import() at line %d", node->dpi % inst->location().toRelativeString(ctx->documentPath()) % inst->location().firstLine()); } else { node->dpi = val; } } auto width = c.lookup_variable("width", true); auto height = c.lookup_variable("height", true); node->width = (width->type() == Value::ValueType::NUMBER) ? width->toDouble() : -1; node->height = (height->type() == Value::ValueType::NUMBER) ? height->toDouble() : -1; return node; } /*! Will return an empty geometry if the import failed, but not nullptr */ const Geometry *ImportNode::createGeometry() const { Geometry *g = nullptr; auto loc = this->modinst->location(); switch (this->type) { case ImportType::STL: { g = import_stl(this->filename, loc); break; } case ImportType::AMF: { g = import_amf(this->filename, loc); break; } case ImportType::_3MF: { g = import_3mf(this->filename, loc); break; } case ImportType::OFF: { g = import_off(this->filename, loc); break; } case ImportType::SVG: { g = import_svg(this->filename, this->dpi, this->center, loc); break; } case ImportType::DXF: { DxfData dd(this->fn, this->fs, this->fa, this->filename, this->layername, this->origin_x, this->origin_y, this->scale); g = dd.toPolygon2d(); break; } #ifdef ENABLE_CGAL case ImportType::NEF3: { g = import_nef3(this->filename, loc); break; } #endif default: PRINTB("ERROR: Unsupported file format while trying to import file '%s', import() at Line %d", this->filename % loc.firstLine()); g = new PolySet(3); } if (g) g->setConvexity(this->convexity); return g; } std::string ImportNode::toString() const { std::ostringstream stream; fs::path path((std::string)this->filename); stream << this->name(); stream << "(file = " << this->filename << ", layer = " << QuotedString(this->layername) << ", origin = [" << std::dec << this->origin_x << ", " << this->origin_y << "]"; if (this->type == ImportType::SVG) { stream << ", center = " << (this->center ? "true" : "false") << ", dpi = " << this->dpi; } stream << ", scale = " << this->scale << ", convexity = " << this->convexity << ", $fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ", timestamp = " << (fs::exists(path) ? fs::last_write_time(path) : 0) << ")"; return stream.str(); } std::string ImportNode::name() const { return "import"; } void register_builtin_import() { Builtins::init("import_stl", new ImportModule(ImportType::STL)); Builtins::init("import_off", new ImportModule(ImportType::OFF)); Builtins::init("import_dxf", new ImportModule(ImportType::DXF)); Builtins::init("import", new ImportModule()); } openscad-2019.05/src/import.h0000644000076500000240000000065613434601060016355 0ustar kintelstaff00000000000000#pragma once #include #include "AST.h" class PolySet *import_stl(const std::string &filename, const Location &loc); PolySet *import_off(const std::string &filename, const Location &loc); class Polygon2d *import_svg(const std::string &filename, const double dpi, const bool center, const Location &loc); #ifdef ENABLE_CGAL class CGAL_Nef_polyhedron *import_nef3(const std::string &filename, const Location &loc); #endif openscad-2019.05/src/import_3mf.cc0000644000076500000240000001632413417146624017272 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2016 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "importnode.h" #include "polyset.h" #include "Geometry.h" #include "printutils.h" #include "version_helper.h" #include "AST.h" #ifdef ENABLE_LIB3MF #include #undef BOOL using namespace NMR; /* * Provided here for reference in LibraryInfo.cc which can't include * both Qt and lib3mf headers due to some conflicting definitions of * windows types when compiling with MinGW. */ const std::string get_lib3mf_version() { DWORD major, minor, micro; NMR::lib3mf_getinterfaceversion(&major, &minor, µ); const OpenSCAD::library_version_number header_version{NMR_APIVERSION_INTERFACE_MAJOR, NMR_APIVERSION_INTERFACE_MINOR, NMR_APIVERSION_INTERFACE_MICRO}; const OpenSCAD::library_version_number runtime_version{major, minor, micro}; return OpenSCAD::get_version_string(header_version, runtime_version); } #ifdef ENABLE_CGAL #include "cgalutils.h" #endif typedef std::list> polysets_t; static Geometry * import_3mf_error(PLib3MFModel *model = nullptr, PLib3MFModelResourceIterator *object_it = nullptr, PolySet *mesh = nullptr, PolySet *mesh2 = nullptr) { if (model) { lib3mf_release(model); } if (object_it) { lib3mf_release(object_it); } if (mesh) { delete mesh; } if (mesh2) { delete mesh2; } return new PolySet(3); } Geometry * import_3mf(const std::string &filename, const Location &loc) { DWORD interfaceVersionMajor, interfaceVersionMinor, interfaceVersionMicro; HRESULT result = lib3mf_getinterfaceversion(&interfaceVersionMajor, &interfaceVersionMinor, &interfaceVersionMicro); if (result != LIB3MF_OK) { PRINT("ERROR: Error reading 3MF library version"); return new PolySet(3); } if ((interfaceVersionMajor != NMR_APIVERSION_INTERFACE_MAJOR)) { PRINTB("ERROR: Invalid 3MF library major version %d.%d.%d, expected %d.%d.%d", interfaceVersionMajor % interfaceVersionMinor % interfaceVersionMicro % NMR_APIVERSION_INTERFACE_MAJOR % NMR_APIVERSION_INTERFACE_MINOR % NMR_APIVERSION_INTERFACE_MICRO); return new PolySet(3); } PLib3MFModel *model; result = lib3mf_createmodel(&model); if (result != LIB3MF_OK) { PRINTB("ERROR: Could not create model: %08lx", result); return import_3mf_error(); } PLib3MFModelReader *reader; result = lib3mf_model_queryreader(model, "3mf", &reader); if (result != LIB3MF_OK) { PRINTB("ERROR: Could not create 3MF reader: %08lx", result); return import_3mf_error(model); } result = lib3mf_reader_readfromfileutf8(reader, filename.c_str()); lib3mf_release(reader); if (result != LIB3MF_OK) { PRINTB("WARNING: Could not read file '%s', import() at line %d", filename.c_str() % loc.firstLine()); return import_3mf_error(model); } PLib3MFModelResourceIterator *object_it; result = lib3mf_model_getmeshobjects(model, &object_it); if (result != LIB3MF_OK) { return import_3mf_error(model); } PolySet *first_mesh = 0; polysets_t meshes; unsigned int mesh_idx = 0; while (true) { int has_next; result = lib3mf_resourceiterator_movenext(object_it, &has_next); if (result != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh); } if (!has_next) { break; } PLib3MFModelResource *object; result = lib3mf_resourceiterator_getcurrent(object_it, &object); if (result != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh); } DWORD vertex_count; result = lib3mf_meshobject_getvertexcount(object, &vertex_count); if (result != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh); } DWORD triangle_count; result = lib3mf_meshobject_gettrianglecount(object, &triangle_count); if (result != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh); } PRINTDB("%s: mesh %d, vertex count: %lu, triangle count: %lu", filename.c_str() % mesh_idx % vertex_count % triangle_count); PolySet *p = new PolySet(3); for (DWORD idx = 0;idx < triangle_count;idx++) { MODELMESHTRIANGLE triangle; if (lib3mf_meshobject_gettriangle(object, idx, &triangle) != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh, p); } MODELMESHVERTEX vertex1, vertex2, vertex3; if (lib3mf_meshobject_getvertex(object, triangle.m_nIndices[0], &vertex1) != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh, p); } if (lib3mf_meshobject_getvertex(object, triangle.m_nIndices[1], &vertex2) != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh, p); } if (lib3mf_meshobject_getvertex(object, triangle.m_nIndices[2], &vertex3) != LIB3MF_OK) { return import_3mf_error(model, object_it, first_mesh, p); } p->append_poly(); p->append_vertex(vertex1.m_fPosition[0], vertex1.m_fPosition[1], vertex1.m_fPosition[2]); p->append_vertex(vertex2.m_fPosition[0], vertex2.m_fPosition[1], vertex2.m_fPosition[2]); p->append_vertex(vertex3.m_fPosition[0], vertex3.m_fPosition[1], vertex3.m_fPosition[2]); } if (first_mesh) { meshes.push_back(std::shared_ptr(p)); } else { first_mesh = p; } mesh_idx++; } lib3mf_release(object_it); lib3mf_release(model); if (first_mesh == 0) { return new PolySet(3); } else if (meshes.empty()) { return first_mesh; } else { PolySet *p = new PolySet(3); #ifdef ENABLE_CGAL Geometry::Geometries children; children.push_back(std::make_pair((const AbstractNode*)NULL, shared_ptr(first_mesh))); for (polysets_t::iterator it = meshes.begin();it != meshes.end();it++) { children.push_back(std::make_pair((const AbstractNode*)NULL, shared_ptr(*it))); } CGAL_Nef_polyhedron *N = CGALUtils::applyOperator(children, OpenSCADOperator::UNION); CGALUtils::createPolySetFromNefPolyhedron3(*N->p3, *p); delete N; #endif return p; } } #else // ENABLE_LIB3MF const std::string get_lib3mf_version() { const std::string lib3mf_version = "(not enabled)"; return lib3mf_version; } Geometry * import_3mf(const std::string &, const Location &loc) { PRINTB("WARNING: Import from 3MF format was not enabled when building the application, import() at line %d", loc.firstLine()); return new PolySet(3); } #endif // ENABLE_LIB3MF openscad-2019.05/src/import_amf.cc0000644000076500000240000002610713452415427017347 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "importnode.h" #include "polyset.h" #include "printutils.h" #include "AST.h" #ifdef ENABLE_CGAL #include "cgalutils.h" #endif #include #include #include #include #include #include static const std::string text_node("#text"); static const std::string object("/amf/object"); static const std::string coordinates("/amf/object/mesh/vertices/vertex/coordinates"); static const std::string coordinates_x = coordinates + "/x"; static const std::string coordinates_y = coordinates + "/y"; static const std::string coordinates_z = coordinates + "/z"; static const std::string triangle("/amf/object/mesh/volume/triangle"); static const std::string triangle_v1 = triangle + "/v1"; static const std::string triangle_v2 = triangle + "/v2"; static const std::string triangle_v3 = triangle + "/v3"; class AmfImporter { private: std::string xpath; // element nesting stack typedef void (*cb_func)(AmfImporter *, const xmlChar *); PolySet *polySet; std::vector polySets; double x, y, z; int idx_v1, idx_v2, idx_v3; std::vector vertex_list; std::map funcs; std::map start_funcs; std::map end_funcs; static void set_x(AmfImporter *importer, const xmlChar *value); static void set_y(AmfImporter *importer, const xmlChar *value); static void set_z(AmfImporter *importer, const xmlChar *value); static void set_v1(AmfImporter *importer, const xmlChar *value); static void set_v2(AmfImporter *importer, const xmlChar *value); static void set_v3(AmfImporter *importer, const xmlChar *value); static void start_object(AmfImporter *importer, const xmlChar *value); static void end_object(AmfImporter *importer, const xmlChar *value); static void end_triangle(AmfImporter *importer, const xmlChar *vlue); static void end_vertex(AmfImporter *importer, const xmlChar *value); int streamFile(const char *filename); void processNode(xmlTextReaderPtr reader); protected: const Location &loc; public: AmfImporter(const Location &loc); virtual ~AmfImporter(); PolySet *read(const std::string filename); virtual xmlTextReaderPtr createXmlReader(const char *filename); }; AmfImporter::AmfImporter(const Location &loc) : polySet(nullptr), x(0), y(0), z(0), idx_v1(0), idx_v2(0), idx_v3(0), loc(loc) { } AmfImporter::~AmfImporter() { } void AmfImporter::set_x(AmfImporter *importer, const xmlChar *value) { importer->x = boost::lexical_cast(std::string((const char *)value)); } void AmfImporter::set_y(AmfImporter *importer, const xmlChar *value) { importer->y = boost::lexical_cast(std::string((const char *)value)); } void AmfImporter::set_z(AmfImporter *importer, const xmlChar *value) { importer->z = boost::lexical_cast(std::string((const char *)value)); } void AmfImporter::set_v1(AmfImporter *importer, const xmlChar *value) { importer->idx_v1 = boost::lexical_cast(std::string((const char *)value)); } void AmfImporter::set_v2(AmfImporter *importer, const xmlChar *value) { importer->idx_v2 = boost::lexical_cast(std::string((const char *)value)); } void AmfImporter::set_v3(AmfImporter *importer, const xmlChar *value) { importer->idx_v3 = boost::lexical_cast(std::string((const char *)value)); } void AmfImporter::start_object(AmfImporter *importer, const xmlChar *) { importer->polySet = new PolySet(3); } void AmfImporter::end_object(AmfImporter *importer, const xmlChar *) { PRINTDB("AMF: add object %d", importer->polySets.size()); importer->polySets.push_back(importer->polySet); importer->vertex_list.clear(); importer->polySet = nullptr; } void AmfImporter::end_vertex(AmfImporter *importer, const xmlChar *) { PRINTDB("AMF: add vertex %d - (%.2f, %.2f, %.2f)", importer->vertex_list.size() % importer->x % importer->y % importer->z); importer->vertex_list.push_back(Eigen::Vector3d(importer->x, importer->y, importer->z)); } void AmfImporter::end_triangle(AmfImporter *importer, const xmlChar *) { int idx_v1 = importer->idx_v1; int idx_v2 = importer->idx_v2; int idx_v3 = importer->idx_v3; PRINTDB("AMF: add triangle %d - (%.2f, %.2f, %.2f)", importer->vertex_list.size() % idx_v1 % idx_v2 % idx_v3); std::vector &v = importer->vertex_list; importer->polySet->append_poly(); importer->polySet->append_vertex(v[idx_v1].x(), v[idx_v1].y(), v[idx_v1].z()); importer->polySet->append_vertex(v[idx_v2].x(), v[idx_v2].y(), v[idx_v2].z()); importer->polySet->append_vertex(v[idx_v3].x(), v[idx_v3].y(), v[idx_v3].z()); } void AmfImporter::processNode(xmlTextReaderPtr reader) { const char *name = reinterpret_cast (xmlTextReaderName(reader)); if (name == nullptr) name = reinterpret_cast (xmlStrdup(BAD_CAST "--")); xmlChar *value = xmlTextReaderValue(reader); int node_type = xmlTextReaderNodeType(reader); switch (node_type) { case XML_READER_TYPE_ELEMENT: { xpath += '/'; xpath += name; cb_func startFunc = start_funcs[xpath]; if (startFunc) { PRINTDB("AMF: start %s", xpath); startFunc(this, nullptr); } } break; case XML_READER_TYPE_END_ELEMENT: { cb_func endFunc = end_funcs[xpath]; if (endFunc) { PRINTDB("AMF: end %s", xpath); endFunc(this, value); } size_t pos = xpath.find_last_of('/'); if(pos != std::string::npos) xpath.erase(pos); } break; case XML_READER_TYPE_TEXT: { cb_func textFunc = funcs[xpath]; if (textFunc) { PRINTDB("AMF: text %s - '%s'", xpath % value); textFunc(this, value); } } break; } xmlFree(value); xmlFree((void *) (name)); } xmlTextReaderPtr AmfImporter::createXmlReader(const char *filename) { return xmlReaderForFile(filename, nullptr, XML_PARSE_NOENT | XML_PARSE_NOERROR | XML_PARSE_NOWARNING); } int AmfImporter::streamFile(const char *filename) { int ret; xmlTextReaderPtr reader = createXmlReader(filename); if (reader == nullptr) { PRINTB("WARNING: Can't open import file '%s', import() at line %d", filename % this->loc.firstLine()); return 1; } try { xmlTextReaderSetParserProp(reader, XML_PARSER_SUBST_ENTITIES, 1); ret = xmlTextReaderRead(reader); while (ret == 1) { processNode(reader); ret = xmlTextReaderRead(reader); } xmlFreeTextReader(reader); } catch (boost::bad_lexical_cast &) { ret = -1; } if (ret != 0) { PRINTB("WARNING: Failed to parse file '%s', import() at line %d", filename % this->loc.firstLine()); } return ret; } PolySet * AmfImporter::read(const std::string filename) { funcs[coordinates_x] = set_x; funcs[coordinates_y] = set_y; funcs[coordinates_z] = set_z; funcs[triangle_v1] = set_v1; funcs[triangle_v2] = set_v2; funcs[triangle_v3] = set_v3; start_funcs[object] = start_object; end_funcs[coordinates] = end_vertex; end_funcs[triangle] = end_triangle; end_funcs[object] = end_object; streamFile(filename.c_str()); vertex_list.clear(); PolySet *p = nullptr; #ifdef ENABLE_CGAL if (polySets.size() == 1) { p = polySets[0]; } if (polySets.size() > 1) { Geometry::Geometries children; for (std::vector::iterator it = polySets.begin();it != polySets.end();it++) { children.push_back(std::make_pair((const AbstractNode*)nullptr, shared_ptr(*it))); } CGAL_Nef_polyhedron *N = CGALUtils::applyOperator(children, OpenSCADOperator::UNION); PolySet *result = new PolySet(3); if (CGALUtils::createPolySetFromNefPolyhedron3(*N->p3, *result)) { delete result; p = new PolySet(3); PRINTB("ERROR: Error importing multi-object AMF file '%s', import() at line %d", filename % this->loc.firstLine()); } else { p = result; } delete N; } #endif if (!p) { p = new PolySet(3); } polySets.clear(); return p; } #ifdef ENABLE_LIBZIP #include class AmfImporterZIP : public AmfImporter { private: struct zip *archive; struct zip_file *zipfile; static int read_callback(void *context, char *buffer, int len); static int close_callback(void *context); public: AmfImporterZIP(const Location &loc); ~AmfImporterZIP(); xmlTextReaderPtr createXmlReader(const char *filename) override; }; AmfImporterZIP::AmfImporterZIP(const Location &loc) : AmfImporter(loc), archive(nullptr), zipfile(nullptr) { } AmfImporterZIP::~AmfImporterZIP() { } int AmfImporterZIP::read_callback(void *context, char *buffer, int len) { AmfImporterZIP *importer = (AmfImporterZIP *)context; return zip_fread(importer->zipfile, buffer, len); } int AmfImporterZIP::close_callback(void *context) { AmfImporterZIP *importer = (AmfImporterZIP *)context; return zip_fclose(importer->zipfile); } xmlTextReaderPtr AmfImporterZIP::createXmlReader(const char *filepath) { archive = zip_open(filepath, 0, nullptr); if (archive) { // Separate the filename without using filesystem::path because that gives wide result on Windows TM const char *last_slash = strrchr(filepath,'/'); const char *last_bslash = strrchr(filepath,'\\'); if(last_bslash > last_slash) last_slash = last_bslash; const char *filename = last_slash ? last_slash + 1 : filepath; zipfile = zip_fopen(archive, filename, ZIP_FL_NODIR); if (zipfile == nullptr) { PRINTB("WARNING: Can't read file '%s' from zipped AMF '%s', import() at line %d", filename % filepath % this->loc.firstLine()); } if ((zipfile == nullptr) && (zip_get_num_files(archive) == 1)) { PRINTB("WARNING: Trying to read single entry '%s'", zip_get_name(archive, 0, 0)); zipfile = zip_fopen_index(archive, 0, 0); } if (zipfile) { return xmlReaderForIO(read_callback, close_callback, this, filename, nullptr, XML_PARSE_NOENT | XML_PARSE_NOERROR | XML_PARSE_NOWARNING); } else { zip_close(archive); zipfile = nullptr; return nullptr; } } else { return AmfImporter::createXmlReader(filepath); } } PolySet *import_amf(const std::string filename, const Location &loc) { AmfImporterZIP importer(loc); return importer.read(filename); } #else PolySet *import_amf(const std::string filename, const Location &loc) { AmfImporter importer(loc); return importer.read(filename); } #endif openscad-2019.05/src/import_nef.cc0000644000076500000240000000205413445047371017350 0ustar kintelstaff00000000000000#include "import.h" #include "printutils.h" #include "AST.h" #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") CGAL_Nef_polyhedron *import_nef3(const std::string &filename, const Location &loc) { CGAL_Nef_polyhedron *N = new CGAL_Nef_polyhedron; // Open file and position at the end std::ifstream f(filename.c_str(), std::ios::in | std::ios::binary); if (!f.good()) { PRINTB("WARNING: Can't open import file '%s', import() at line %d", filename % loc.firstLine()); return N; } std::string msg=""; CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try{ N->p3.reset(new CGAL_Nef_polyhedron3); f >> *(N->p3); } catch (const CGAL::Failure_exception &e) { PRINTB("WARNING: Failure trying to import '%s', import() at line %d", filename % loc.firstLine()); PRINT(e.what()); N = new CGAL_Nef_polyhedron; } CGAL::set_error_behaviour(old_behaviour); return N; } #endif openscad-2019.05/src/import_off.cc0000644000076500000240000000124613417146624017354 0ustar kintelstaff00000000000000#include "import.h" #include "polyset.h" #include "printutils.h" #include "AST.h" #ifdef ENABLE_CGAL #include "cgalutils.h" #endif PolySet *import_off(const std::string &filename, const Location &loc) { PolySet *p = new PolySet(3); #ifdef ENABLE_CGAL CGAL_Polyhedron poly; std::ifstream file(filename.c_str(), std::ios::in | std::ios::binary); if (!file.good()) { PRINTB("WARNING: Can't open import file '%s', import() at line %d", filename % loc.firstLine()); } else { file >> poly; file.close(); CGALUtils::createPolySetFromPolyhedron(poly, *p); } #else PRINTB("WARNING: OFF import requires CGAL, import() at line %d", loc.firstLine()); #endif return p; } openscad-2019.05/src/import_stl.cc0000644000076500000240000000707613417146624017413 0ustar kintelstaff00000000000000#include "import.h" #include "polyset.h" #include "printutils.h" #include "AST.h" #include #include #include #include #define STL_FACET_NUMBYTES 4*3*4+2 // as there is no 'float32_t' standard, we assume the systems 'float' // is a 'binary32' aka 'single' standard IEEE 32-bit floating point type union stl_facet { uint8_t data8[ STL_FACET_NUMBYTES ]; uint32_t data32[4*3]; struct facet_data { float i, j, k; float x1, y1, z1; float x2, y2, z2; float x3, y3, z3; uint16_t attribute_byte_count; } data; }; #ifdef BOOST_BIG_ENDIAN static void uint32_byte_swap(uint32_t &x) { # if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 x = __builtin_bswap32( x ); # elif defined(__clang__) x = __builtin_bswap32( x ); # elif defined(_MSC_VER) x = _byteswap_ulong( x ); # else uint32_t b1 = ( 0x000000FF & x ) << 24; uint32_t b2 = ( 0x0000FF00 & x ) << 8; uint32_t b3 = ( 0x00FF0000 & x ) >> 8; uint32_t b4 = ( 0xFF000000 & x ) >> 24; x = b1 | b2 | b3 | b4; # endif } #endif static void read_stl_facet(std::ifstream &f, stl_facet &facet) { f.read( (char*)facet.data8, STL_FACET_NUMBYTES ); #ifdef BOOST_BIG_ENDIAN for ( int i = 0; i < 12; i++ ) { uint32_byte_swap( facet.data32[ i ] ); } // we ignore attribute byte count #endif } PolySet *import_stl(const std::string &filename, const Location &loc) { PolySet *p = new PolySet(3); // Open file and position at the end std::ifstream f(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate); if (!f.good()) { PRINTB("WARNING: Can't open import file '%s', import() at line %d", filename % loc.firstLine()); return p; } boost::regex ex_sfe("solid|facet|endloop"); boost::regex ex_outer("outer loop"); boost::regex ex_vertex("vertex"); boost::regex ex_vertices("\\s*vertex\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)"); bool binary = false; std::streampos file_size = f.tellg(); f.seekg(80); if (f.good() && !f.eof()) { uint32_t facenum = 0; f.read((char *)&facenum, sizeof(uint32_t)); #ifdef BOOST_BIG_ENDIAN uint32_byte_swap( facenum ); #endif if (file_size == static_cast(80 + 4 + 50*facenum)) { binary = true; } } f.seekg(0); char data[5]; f.read(data, 5); if (!binary && !f.eof() && f.good() && !memcmp(data, "solid", 5)) { int i = 0; double vdata[3][3]; std::string line; std::getline(f, line); while (!f.eof()) { std::getline(f, line); boost::trim(line); if (boost::regex_search(line, ex_sfe)) { continue; } if (boost::regex_search(line, ex_outer)) { i = 0; continue; } boost::smatch results; if (boost::regex_search(line, results, ex_vertices)) { try { for (int v=0;v<3;v++) { vdata[i][v] = boost::lexical_cast(results[v+1]); } } catch (const boost::bad_lexical_cast &blc) { PRINTB("WARNING: Can't parse vertex line '%s', import() at line %d", line % loc.firstLine()); i = 10; continue; } if (++i == 3) { p->append_poly(); p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]); p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]); p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]); } } } } else if (binary && !f.eof() && f.good()) { f.ignore(80-5+4); while (1) { stl_facet facet; read_stl_facet( f, facet ); if (f.eof()) break; p->append_poly(); p->append_vertex(facet.data.x1, facet.data.y1, facet.data.z1); p->append_vertex(facet.data.x2, facet.data.y2, facet.data.z2); p->append_vertex(facet.data.x3, facet.data.y3, facet.data.z3); } } return p; } openscad-2019.05/src/import_svg.cc0000644000076500000240000001236613437640540017404 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "import.h" #include "Polygon2d.h" #include "printutils.h" #include "libsvg/libsvg.h" #include "clipper-utils.h" #include "AST.h" namespace { constexpr double INCH_TO_MM = 25.4; double to_mm(const libsvg::length_t& length, const double viewbox, const bool viewbox_valid, const double dpi) { switch (length.unit) { case libsvg::unit_t::NONE: return INCH_TO_MM * length.number / dpi; case libsvg::unit_t::PX: return INCH_TO_MM * length.number / 96.0; case libsvg::unit_t::PT: return INCH_TO_MM * length.number / 72.0; case libsvg::unit_t::PC: return INCH_TO_MM * length.number / 6.0; case libsvg::unit_t::IN: return INCH_TO_MM * length.number; case libsvg::unit_t::CM: return 10 * length.number; case libsvg::unit_t::MM: return length.number; case libsvg::unit_t::UNDEFINED: // If no width/height given, but viewbox is set, then rely on // the DPI value (e.g. Adobe Illustrator does that in older // versions) return viewbox_valid ? INCH_TO_MM * viewbox / dpi : 0.0; default: return viewbox_valid ? viewbox : 0.0; } } double calc_alignment(const libsvg::align_t alignment, double page_mm, double scale, double viewbox) { switch (alignment) { case libsvg::align_t::MID: return page_mm / 2.0 - scale * viewbox / 2.0; case libsvg::align_t::MAX: return page_mm - scale * viewbox; default: return 0.0; } } } Polygon2d *import_svg(const std::string &filename, const double dpi, const bool center, const Location &loc) { try { const auto shapes = libsvg::libsvg_read_file(filename.c_str()); double width_mm = 0.0; double height_mm = 0.0; Eigen::AlignedBox bbox{2}; Eigen::Vector2d scale{1.0, 1.0}; Eigen::Vector2d align{0.0, 0.0}; Eigen::Vector2d viewbox{0.0, 0.0}; for (const auto& shape_ptr : *shapes) { const auto page = dynamic_cast(shape_ptr.get()); if (page) { const auto w = page->get_width(); const auto h = page->get_height(); const auto alignment = page->get_alignment(); const bool viewbox_valid = page->get_viewbox().is_valid; width_mm = to_mm(w, page->get_viewbox().width, viewbox_valid, dpi); height_mm = to_mm(h, page->get_viewbox().height, viewbox_valid, dpi); if (viewbox_valid) { viewbox << page->get_viewbox().x, page->get_viewbox().y; scale << width_mm / page->get_viewbox().width, height_mm / page->get_viewbox().height; if (alignment.x != libsvg::align_t::NONE) { double scaling; if (alignment.meet) { // preserve aspect ratio and fit into viewport, so // select the smaller of the 2 scale factors scaling = scale.x() < scale.y() ? scale.x() : scale.y(); } else { // preserve aspect ratio and fill viewport, so select // the bigger of the 2 scale factors scaling = scale.x() > scale.y() ? scale.x() : scale.y(); } scale = Eigen::Vector2d{scaling, scaling}; align << calc_alignment(alignment.x, width_mm, scale.x(), page->get_viewbox().width), calc_alignment(alignment.y, height_mm, scale.y(), page->get_viewbox().height); } } } const auto& s = *shape_ptr; for (const auto& p : s.get_path_list()) { for (const auto& v : p) { bbox.extend(Eigen::Vector2d{scale.x() * v.x(), scale.y() * v.y()}); } } } double cx = center ? bbox.center().x() : -align.x(); double cy = center ? bbox.center().y() : height_mm - align.y(); std::vector polygons; for (const auto& shape_ptr : *shapes) { Polygon2d *poly = new Polygon2d(); const auto& s = *shape_ptr; for (const auto& p : s.get_path_list()) { Outline2d outline; for (const auto& v : p) { double x = scale.x() * (-viewbox.x() + v.x()) - cx; double y = scale.y() * (-viewbox.y() - v.y()) + cy; outline.vertices.push_back(Vector2d(x, y)); outline.positive = true; } poly->addOutline(outline); } polygons.push_back(poly); } return ClipperUtils::apply(polygons, ClipperLib::ctUnion); } catch (const std::exception& e) { PRINTB("ERROR: %s, import() at line %d", e.what() % loc.firstLine()); return new Polygon2d(); } } openscad-2019.05/src/importnode.h0000644000076500000240000000121513434601060017213 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "value.h" enum class ImportType { UNKNOWN, AMF, _3MF, STL, OFF, SVG, DXF, NEF3, }; class ImportNode : public LeafNode { public: constexpr static double SVG_DEFAULT_DPI = 72.0; VISITABLE(); ImportNode(const ModuleInstantiation *mi, ImportType type) : LeafNode(mi), type(type) { } std::string toString() const override; std::string name() const override; ImportType type; Filename filename; std::string layername; int convexity; bool center; double dpi; double fn, fs, fa; double origin_x, origin_y, scale; double width, height; const class Geometry *createGeometry() const override; }; openscad-2019.05/src/input/AxisConfigWidget.cc0000644000076500000240000004652213437640540021551 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2014 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "AxisConfigWidget.h" #include "settings.h" #include "QSettingsCached.h" #include "input/InputDriverManager.h" #include "SettingsWriter.h" #include "WheelIgnorer.h" AxisConfigWidget::AxisConfigWidget(QWidget *parent) : QWidget(parent) { setupUi(this); } AxisConfigWidget::~AxisConfigWidget() { } void AxisConfigWidget::AxesChanged(int nr, double val) const{ QProgressBar* progressBar = this->findChild(QString("progressBarAxis%1").arg(nr)); if(progressBar==nullptr) return; int value = val * 100; progressBar->setValue(value); //set where the bar is //QProgressBar generates the shown string from the format string. //By setting a format string without a place holder, //we can set arbitrary text, like a custom formated double. //(Note: QProgressBar internally works on int, so has no formating for double values) //(Note: The text of a QProgressBar can not be set directly) QString s = QString::number(val, 'f', 2 ); progressBar->setFormat(s); QDoubleSpinBox* deadzone = this->findChild(QString("doubleSpinBoxDeadzone%1").arg(nr)); if(deadzone){ bool active = deadzone->value() < std::abs(val); QString style; if(this->darkModeDetected){ style = active ? ProgressbarStyleDarkActive : ProgressbarStyleDark; }else{ style = active ? ProgressbarStyleLightActive : ProgressbarStyleLight; } progressBar->setStyleSheet(style); } } void AxisConfigWidget::init() { connect(this->pushButtonAxisTrim, SIGNAL(clicked()), this, SLOT(on_AxisTrim())); connect(this->pushButtonAxisTrimReset, SIGNAL(clicked()), this, SLOT(on_AxisTrimReset())); connect(this->pushButtonUpdate, SIGNAL(clicked()), this, SLOT(updateStates())); initComboBox(this->comboBoxTranslationX, Settings::Settings::inputTranslationX); initComboBox(this->comboBoxTranslationY, Settings::Settings::inputTranslationY); initComboBox(this->comboBoxTranslationZ, Settings::Settings::inputTranslationZ); initComboBox(this->comboBoxTranslationXVPRel, Settings::Settings::inputTranslationXVPRel); initComboBox(this->comboBoxTranslationYVPRel, Settings::Settings::inputTranslationYVPRel); initComboBox(this->comboBoxTranslationZVPRel, Settings::Settings::inputTranslationZVPRel); initComboBox(this->comboBoxRotationX, Settings::Settings::inputRotateX); initComboBox(this->comboBoxRotationY, Settings::Settings::inputRotateY); initComboBox(this->comboBoxRotationZ, Settings::Settings::inputRotateZ); initComboBox(this->comboBoxRotationXVPRel, Settings::Settings::inputRotateXVPRel); initComboBox(this->comboBoxRotationYVPRel, Settings::Settings::inputRotateYVPRel); initComboBox(this->comboBoxRotationZVPRel, Settings::Settings::inputRotateZVPRel); initComboBox(this->comboBoxZoom, Settings::Settings::inputZoom); initComboBox(this->comboBoxZoom2, Settings::Settings::inputZoom2); #ifdef ENABLE_HIDAPI this->checkBoxHIDAPI->setEnabled(true); this->checkBoxHIDAPI->setToolTip(HidApiInputDriverDescription); #else this->checkBoxHIDAPI->setToolTip(HidApiInputDriverDescription + "\n\r" + NotEnabledDuringBuild); #endif #ifdef ENABLE_SPNAV this->checkBoxSpaceNav->setEnabled(true); this->checkBoxSpaceNav->setToolTip(SpaceNavInputDriverDescription); #else this->checkBoxSpaceNav->setToolTip(SpaceNavInputDriverDescription + "\n\r" + NotEnabledDuringBuild); #endif #ifdef ENABLE_JOYSTICK this->checkBoxJoystick->setEnabled(true); this->checkBoxJoystick->setToolTip(JoystickInputDriverDescription); #else this->checkBoxJoystick->setToolTip(JoystickInputDriverDescription + "\n\r" + NotEnabledDuringBuild); #endif #ifdef ENABLE_QGAMEPAD this->checkBoxQGamepad->setEnabled(true); this->checkBoxQGamepad->setToolTip(QGamepadInputDriverDescription ); #else this->checkBoxQGamepad->setToolTip(QGamepadInputDriverDescription + "\n\r" + NotEnabledDuringBuild); #endif #ifdef ENABLE_DBUS this->checkBoxDBus->setEnabled(true); this->checkBoxDBus->setToolTip(DBusInputDriverDescription); #else this->checkBoxDBus->setToolTip(DBusInputDriverDescription + "\n\r" + NotEnabledDuringBuild); #endif initCheckBox(this->checkBoxHIDAPI, Settings::Settings::inputEnableDriverHIDAPI); initCheckBox(this->checkBoxSpaceNav, Settings::Settings::inputEnableDriverSPNAV); initCheckBox(this->checkBoxJoystick, Settings::Settings::inputEnableDriverJOYSTICK); initCheckBox(this->checkBoxQGamepad, Settings::Settings::inputEnableDriverQGAMEPAD); initCheckBox(this->checkBoxDBus, Settings::Settings::inputEnableDriverDBUS); auto *wheelIgnorer = new WheelIgnorer(this); auto comboBoxes = this->findChildren(); for (auto comboBox : comboBoxes) { comboBox->installEventFilter(wheelIgnorer); } for (int i = 0; i < InputEventMapper::getMaxAxis(); i++ ){ std::string s = std::to_string(i); auto spin = this->findChild(QString("doubleSpinBoxTrim%1").arg(i)); auto ent = Settings::Settings::inst()->getSettingEntryByName("axisTrim" +s); if(spin && ent){ initDoubleSpinBox(spin,*ent); } spin = this->findChild(QString("doubleSpinBoxDeadzone%1").arg(i)); ent = Settings::Settings::inst()->getSettingEntryByName("axisDeadzone" +s); if(spin && ent){ initDoubleSpinBox(spin,*ent); } } initDoubleSpinBox(this->doubleSpinBoxTranslationGain, Settings::Settings::inputTranslationGain); initDoubleSpinBox(this->doubleSpinBoxTranslationVPRelGain, Settings::Settings::inputTranslationVPRelGain); initDoubleSpinBox(this->doubleSpinBoxRotateGain, Settings::Settings::inputRotateGain); initDoubleSpinBox(this->doubleSpinBoxZoomGain, Settings::Settings::inputZoomGain); //use a custom style for the axis indicators, //to prevent getting operating system specific //(potentially animated) ProgressBars int textLightness = this->progressBarAxis0->palette().text().color().lightness(); this->darkModeDetected = textLightness>165; QString style = (this->darkModeDetected) ? ProgressbarStyleDark : ProgressbarStyleLight; auto progressbars = this->findChildren(); for (auto progressbar : progressbars) { progressbar->setStyleSheet(style); progressbar->setAlignment(Qt::AlignCenter); } initialized = true; } void AxisConfigWidget::on_comboBoxTranslationX_activated(int val) { applyComboBox(comboBoxTranslationX, val, Settings::Settings::inputTranslationX); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxTranslationY_activated(int val) { applyComboBox(comboBoxTranslationY, val, Settings::Settings::inputTranslationY); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxTranslationZ_activated(int val) { applyComboBox(comboBoxTranslationZ, val, Settings::Settings::inputTranslationZ); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxTranslationXVPRel_activated(int val) { applyComboBox(comboBoxTranslationXVPRel, val, Settings::Settings::inputTranslationXVPRel); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxTranslationYVPRel_activated(int val) { applyComboBox(comboBoxTranslationYVPRel, val, Settings::Settings::inputTranslationYVPRel); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxTranslationZVPRel_activated(int val) { applyComboBox(comboBoxTranslationZVPRel, val, Settings::Settings::inputTranslationZVPRel); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxRotationX_activated(int val) { applyComboBox(comboBoxRotationX, val, Settings::Settings::inputRotateX); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxRotationY_activated(int val) { applyComboBox(comboBoxRotationY, val, Settings::Settings::inputRotateY); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxRotationZ_activated(int val) { applyComboBox(comboBoxRotationZ, val, Settings::Settings::inputRotateZ); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxRotationXVPRel_activated(int val) { applyComboBox(comboBoxRotationXVPRel, val, Settings::Settings::inputRotateXVPRel); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxRotationYVPRel_activated(int val) { applyComboBox(comboBoxRotationYVPRel, val, Settings::Settings::inputRotateYVPRel); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxRotationZVPRel_activated(int val) { applyComboBox(comboBoxRotationZVPRel, val, Settings::Settings::inputRotateZVPRel); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxZoom_activated(int val) { applyComboBox(comboBoxZoom, val, Settings::Settings::inputZoom); emit inputMappingChanged(); } void AxisConfigWidget::on_comboBoxZoom2_activated(int val) { applyComboBox(comboBoxZoom2, val, Settings::Settings::inputZoom2); emit inputMappingChanged(); } void AxisConfigWidget::on_doubleSpinBoxTrim0_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim0, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim1_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim1, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim2_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim2, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim3_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim3, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim4_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim4, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim5_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim5, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim6_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim6, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim7_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim7, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTrim8_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisTrim8, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone0_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone0, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone1_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone1, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone2_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone2, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone3_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone3, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone4_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone4, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone5_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone5, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone6_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone6, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone7_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone7, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxDeadzone8_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::axisDeadzone8, Value(val)); emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxRotateGain_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::inputRotateGain, Value(val)); emit inputGainChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTranslationGain_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::inputTranslationGain, Value(val)); emit inputGainChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxTranslationVPRelGain_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::inputTranslationVPRelGain, Value(val)); emit inputGainChanged(); writeSettings(); } void AxisConfigWidget::on_doubleSpinBoxZoomGain_valueChanged(double val) { Settings::Settings::inst()->set(Settings::Settings::inputZoomGain, Value(val)); emit inputGainChanged(); writeSettings(); } void AxisConfigWidget::on_AxisTrim() { InputEventMapper::instance()->onAxisAutoTrim(); for (int i = 0; i < InputEventMapper::getMaxAxis(); i++ ){ std::string s = std::to_string(i); auto spin = this->findChild(QString("doubleSpinBoxTrim%1").arg(i)); auto ent = Settings::Settings::inst()->getSettingEntryByName("axisTrim" +s); if(spin && ent){ spin->setValue((double)Settings::Settings::inst()->get(*ent).toDouble()); } } emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_AxisTrimReset() { InputEventMapper::instance()->onAxisTrimReset(); for (int i = 0; i < InputEventMapper::getMaxAxis(); i++ ){ std::string s = std::to_string(i); auto ent = Settings::Settings::inst()->getSettingEntryByName("axisTrim" +s); if(ent){ Settings::Settings::inst()->set(*ent, 0.00); } auto spin = this->findChild(QString("doubleSpinBoxTrim%1").arg(i)); if(spin){ spin->setValue(0.00); } } emit inputCalibrationChanged(); writeSettings(); } void AxisConfigWidget::on_checkBoxHIDAPI_toggled(bool val) { if(initialized){ Settings::Settings::inst()->set(Settings::Settings::inputEnableDriverHIDAPI, Value(val)); writeSettings(); QFont font; font.setItalic(true); checkBoxHIDAPI->setFont(font); } } void AxisConfigWidget::on_checkBoxSpaceNav_toggled(bool val) { if(initialized){ Settings::Settings::inst()->set(Settings::Settings::inputEnableDriverSPNAV, Value(val)); writeSettings(); QFont font; font.setItalic(true); checkBoxSpaceNav->setFont(font); } } void AxisConfigWidget::on_checkBoxJoystick_toggled(bool val) { if(initialized){ Settings::Settings::inst()->set(Settings::Settings::inputEnableDriverJOYSTICK, Value(val)); writeSettings(); QFont font; font.setItalic(true); checkBoxJoystick->setFont(font); } } void AxisConfigWidget::on_checkBoxQGamepad_toggled(bool val) { if(initialized){ Settings::Settings::inst()->set(Settings::Settings::inputEnableDriverQGAMEPAD, Value(val)); writeSettings(); QFont font; font.setItalic(true); checkBoxQGamepad->setFont(font); } } void AxisConfigWidget::on_checkBoxDBus_toggled(bool val) { if(initialized){ Settings::Settings::inst()->set(Settings::Settings::inputEnableDriverDBUS, Value(val)); writeSettings(); QFont font; font.setItalic(true); checkBoxDBus->setFont(font); } } void AxisConfigWidget::applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry) { QString s = comboBox->itemData(val).toString(); Settings::Settings::inst()->set(entry, Value(s.toStdString())); writeSettings(); } void AxisConfigWidget::initSpinBox(QSpinBox *spinBox, const Settings::SettingsEntry& entry) { RangeType range = entry.range().toRange(); spinBox->setMinimum(range.begin_value()); spinBox->setMaximum(range.end_value()); } void AxisConfigWidget::initDoubleSpinBox(QDoubleSpinBox *spinBox, const Settings::SettingsEntry& entry) { Settings::Settings *s = Settings::Settings::inst(); RangeType range = entry.range().toRange(); spinBox->setMinimum(range.begin_value()); spinBox->setSingleStep(range.step_value()); spinBox->setMaximum(range.end_value()); spinBox->setValue((double)s->get(entry).toDouble()); } void AxisConfigWidget::initCheckBox(QCheckBox *checkBox, const Settings::SettingsEntry& entry) { Settings::Settings *s = Settings::Settings::inst(); const Value &value = s->get(entry); bool state = value.toBool(); checkBox->setChecked(state); } void AxisConfigWidget::updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry) { Settings::Settings *s = Settings::Settings::inst(); const Value &value = s->get(entry); QString text = QString::fromStdString(value.toString()); int idx = comboBox->findData(text); if (idx >= 0) { comboBox->setCurrentIndex(idx); } else { const Value &defaultValue = entry.defaultValue(); QString defaultText = QString::fromStdString(defaultValue.toString()); int defIdx = comboBox->findData(defaultText); if (defIdx >= 0) { comboBox->setCurrentIndex(defIdx); } else { comboBox->setCurrentIndex(0); } } } void AxisConfigWidget::writeSettings() { SettingsWriter settingsWriter; Settings::Settings::inst()->visit(settingsWriter); } void AxisConfigWidget::initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry) { comboBox->clear(); // Range is a vector of 2D vectors: [[name, value], ...] for(const auto &v : entry.range().toVector()) { QString val = QString::fromStdString(v[0]->toString()); QString qtext = QString::fromStdString(gettext(v[1]->toString().c_str())); comboBox->addItem(qtext, val); } updateComboBox(comboBox, entry); } void AxisConfigWidget::updateStates(){ if(!initialized) return; int cnt = InputDriverManager::instance()->getAxisCount(); for (int i=0;ifindChild(QString("progressBarAxis%1").arg(i)); if( cnt <= i){ progressbar->setEnabled(false); progressbar->setMinimum(0); }else{ progressbar->setEnabled(true); progressbar->setMinimum(-100); } } auto manager = InputDriverManager::instance(); std::string infos = manager->listDriverInfos(); label_driverInfo->setText(QString::fromStdString(infos)); } openscad-2019.05/src/input/AxisConfigWidget.h0000644000076500000240000001234313437640540021405 0ustar kintelstaff00000000000000#pragma once #include "qtgettext.h" #include "settings.h" #include "ui_AxisConfigWidget.h" class AxisConfigWidget : public QWidget, public Ui::Axis { Q_OBJECT public: AxisConfigWidget(QWidget *parent = 0); virtual ~AxisConfigWidget(); void updateButtonState(int,bool) const; void AxesChanged(int nr, double val) const; void init(); public slots: // Input Driver void on_AxisTrim(); void on_AxisTrimReset(); void on_comboBoxTranslationX_activated(int val); void on_comboBoxTranslationY_activated(int val); void on_comboBoxTranslationZ_activated(int val); void on_comboBoxTranslationXVPRel_activated(int val); void on_comboBoxTranslationYVPRel_activated(int val); void on_comboBoxTranslationZVPRel_activated(int val); void on_comboBoxRotationX_activated(int val); void on_comboBoxRotationY_activated(int val); void on_comboBoxRotationZ_activated(int val); void on_comboBoxRotationXVPRel_activated(int val); void on_comboBoxRotationYVPRel_activated(int val); void on_comboBoxRotationZVPRel_activated(int val); void on_comboBoxZoom_activated(int val); void on_comboBoxZoom2_activated(int val); void on_doubleSpinBoxRotateGain_valueChanged(double val); void on_doubleSpinBoxTranslationGain_valueChanged(double val); void on_doubleSpinBoxTranslationVPRelGain_valueChanged(double val); void on_doubleSpinBoxZoomGain_valueChanged(double val); void on_doubleSpinBoxDeadzone0_valueChanged(double); void on_doubleSpinBoxDeadzone1_valueChanged(double); void on_doubleSpinBoxDeadzone2_valueChanged(double); void on_doubleSpinBoxDeadzone3_valueChanged(double); void on_doubleSpinBoxDeadzone4_valueChanged(double); void on_doubleSpinBoxDeadzone5_valueChanged(double); void on_doubleSpinBoxDeadzone6_valueChanged(double); void on_doubleSpinBoxDeadzone7_valueChanged(double); void on_doubleSpinBoxDeadzone8_valueChanged(double); void on_doubleSpinBoxTrim0_valueChanged(double); void on_doubleSpinBoxTrim1_valueChanged(double); void on_doubleSpinBoxTrim2_valueChanged(double); void on_doubleSpinBoxTrim3_valueChanged(double); void on_doubleSpinBoxTrim4_valueChanged(double); void on_doubleSpinBoxTrim5_valueChanged(double); void on_doubleSpinBoxTrim6_valueChanged(double); void on_doubleSpinBoxTrim7_valueChanged(double); void on_doubleSpinBoxTrim8_valueChanged(double); void on_checkBoxHIDAPI_toggled(bool); void on_checkBoxSpaceNav_toggled(bool); void on_checkBoxJoystick_toggled(bool); void on_checkBoxQGamepad_toggled(bool); void on_checkBoxDBus_toggled(bool); void updateStates(); signals: void inputMappingChanged() const; void inputCalibrationChanged() const; void inputGainChanged() const; private: /** Initialize combobox list values from the settings range values */ void initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry); /** Initialize spinbox min/max values from the settings range values */ void initSpinBox(QSpinBox *spinBox, const Settings::SettingsEntry& entry); /** Initialize double spinbox min/max/step values from the settings range values */ void initDoubleSpinBox(QDoubleSpinBox *spinBox, const Settings::SettingsEntry& entry); /** Initialize checkbox from the settings */ void initCheckBox(QCheckBox *checkBox, const Settings::SettingsEntry& entry); /** Update combobox from current settings */ void updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry); /** Set value from combobox to settings */ void applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry); void writeSettings(); bool initialized = false; QString NotEnabledDuringBuild =_("This driver was not enabled during build time and is thus not available."); QString DBusInputDriverDescription = _("The DBUS driver is not for actual devices but for remote control, Linux only."); QString HidApiInputDriverDescription = _("The HIDAPI driver communicates directly with the 3D mice, Windows and macOS."); QString SpaceNavInputDriverDescription = _("The SpaceNav driver enables 3D-input-devices using the spacenavd daemon, Linux only."); QString JoystickInputDriverDescription = _("The Joystick driver uses the Linux joystick device (fixed to /dev/input/js0), Linux only."); QString QGamepadInputDriverDescription = _("The QGAMEPAD driver is for multiplattform Gamepad Support."); bool darkModeDetected=false; QString ProgressbarStyleLight = "QProgressBar::chunk {" "background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #66d9ff,stop: 1 #ccf2ff );" "border-radius: 5px;" "border: 1px solid #007399;" "}"; QString ProgressbarStyleLightActive = "QProgressBar::chunk {" "background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #66ff66,stop: 1 #ccffcc );" "border-radius: 5px;" "border: 1px solid #007399;" "}"; QString ProgressbarStyleDark = "QProgressBar::chunk {" "background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #001a33,stop: 1 #0069cc );" "border-radius: 5px;" "border: 1px solid #000d1a;" "}"; QString ProgressbarStyleDarkActive = "QProgressBar::chunk {" "background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #00331a,stop: 1 #00cc69 );" "border-radius: 5px;" "border: 1px solid #000d1a;" "}"; }; openscad-2019.05/src/input/AxisConfigWidget.ui0000644000076500000240000011530013437640540021570 0ustar kintelstaff00000000000000 Axis 0 0 633 457 0 0 Preferences true true 0 0 599 610 8 Trim QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 8 Trim -100 0 0.00 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 Reset Trim QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 -100 0 0.00 -100 0 0.00 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 -100 0 0.00 8 DeadZone QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 -100 0 0.00 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 Auto Trim Axes -100 0 0.00 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 QAbstractSpinBox::CorrectToNearestValue 0.010000000000000 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 QAbstractSpinBox::CorrectToNearestValue 0.050000000000000 -100 0 0.00 -100 0 0.00 -100 0 0.00 8 Trim 8 DeadZone 8 DeadZone 8 DeadZone 8 Trim 8 DeadZone 8 Trim 8 DeadZone 8 Trim 8 DeadZone 8 Trim 8 DeadZone 8 Trim 0 0 Axis 2 Qt::AlignCenter 0 0 Axis 0 Qt::AlignCenter 0 0 Axis 3 Qt::AlignCenter 0 0 Axis 6 Qt::AlignCenter 0 0 Axis 8 Qt::AlignCenter 0 0 Axis 7 Qt::AlignCenter 0 0 Axis 5 Qt::AlignCenter 0 0 Axis 1 Qt::AlignCenter 0 0 Axis 4 Qt::AlignCenter 8 DeadZone 8 Trim Rotation 1 0 Zoom 1 0 1 0 1 0 1 0 QAbstractSpinBox::CorrectToNearestValue 0.100000000000000 9.990000000000000 0.100000000000000 1.000000000000000 X Qt::AlignCenter Gain Qt::AlignCenter QAbstractSpinBox::CorrectToNearestValue 0.100000000000000 9.990000000000000 0.100000000000000 1.000000000000000 1 0 Y Qt::AlignCenter 0.100000000000000 9.990000000000000 0.100000000000000 1.000000000000000 QAbstractSpinBox::CorrectToNearestValue 0.100000000000000 9.990000000000000 0.100000000000000 1.000000000000000 Z Qt::AlignCenter 1 0 1 0 1 0 Translation 1 0 ViewPort rel.<br/>Translation 1 0 Qt::Horizontal 1 0 ViewPort rel.<br />Rotation 1 0 1 0 QAbstractSpinBox::CorrectToNearestValue 0.100000000000000 9.990000000000000 0.100000000000000 1.000000000000000 75 true Axis Setup: <b>Driver selection:</b> <i>(changes requires restarting OpenSCAD)</i> false SpaceNav false HIDAPI false QGamepad false Joystick false DBus 75 true Axes Mapping: 75 true Status: TextLabel Update Qt::Vertical 20 40 openscad-2019.05/src/input/ButtonConfigWidget.cc0000644000076500000240000001653513437640540022121 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2014 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "ButtonConfigWidget.h" #include "settings.h" #include "QSettingsCached.h" #include "input/InputDriverManager.h" #include "SettingsWriter.h" #include "WheelIgnorer.h" ButtonConfigWidget::ButtonConfigWidget(QWidget *parent) : QWidget(parent) { setupUi(this); } ButtonConfigWidget::~ButtonConfigWidget() { } void ButtonConfigWidget::updateButtonState(int nr, bool pressed) const{ QString style = pressed ? ButtonConfigWidget::ActiveStyleString : ButtonConfigWidget::EmptyString; std::string number = std::to_string(nr); auto label = this->findChild(QString("labelInputButton%1").arg(nr)); if(label==nullptr) return; label->setStyleSheet(style); } void ButtonConfigWidget::init() { for (int i = 0; i < InputEventMapper::getMaxButtons(); i++ ){ std::string s = std::to_string(i); auto box = this->findChild(QString("comboBoxButton%1").arg(i)); auto ent = Settings::Settings::inst()->getSettingEntryByName("button" +s); if(box && ent){ initComboBox(box,*ent); } } auto wheelIgnorer = new WheelIgnorer(this); auto comboBoxes = this->findChildren(); for (auto comboBox : comboBoxes) { comboBox->installEventFilter(wheelIgnorer); } initialized = true; } void ButtonConfigWidget::on_comboBoxButton0_activated(int val) { applyComboBox(comboBoxButton0, val, Settings::Settings::inputButton0); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton1_activated(int val) { applyComboBox(comboBoxButton1, val, Settings::Settings::inputButton1); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton2_activated(int val) { applyComboBox(comboBoxButton2, val, Settings::Settings::inputButton2); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton3_activated(int val) { applyComboBox(comboBoxButton3, val, Settings::Settings::inputButton3); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton4_activated(int val) { applyComboBox(comboBoxButton4, val, Settings::Settings::inputButton4); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton5_activated(int val) { applyComboBox(comboBoxButton5, val, Settings::Settings::inputButton5); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton6_activated(int val) { applyComboBox(comboBoxButton6, val, Settings::Settings::inputButton6); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton7_activated(int val) { applyComboBox(comboBoxButton7, val, Settings::Settings::inputButton7); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton8_activated(int val) { applyComboBox(comboBoxButton8, val, Settings::Settings::inputButton8); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton9_activated(int val) { applyComboBox(comboBoxButton9, val, Settings::Settings::inputButton9); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton10_activated(int val) { applyComboBox(comboBoxButton10, val, Settings::Settings::inputButton10); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton11_activated(int val) { applyComboBox(comboBoxButton11, val, Settings::Settings::inputButton11); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton12_activated(int val) { applyComboBox(comboBoxButton12, val, Settings::Settings::inputButton12); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton13_activated(int val) { applyComboBox(comboBoxButton13, val, Settings::Settings::inputButton13); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton14_activated(int val) { applyComboBox(comboBoxButton14, val, Settings::Settings::inputButton14); emit inputMappingChanged(); } void ButtonConfigWidget::on_comboBoxButton15_activated(int val) { applyComboBox(comboBoxButton15, val, Settings::Settings::inputButton15); emit inputMappingChanged(); } void ButtonConfigWidget::applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry) { QString s = comboBox->itemData(val).toString(); Settings::Settings::inst()->set(entry, Value(s.toStdString())); writeSettings(); } void ButtonConfigWidget::updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry) { Settings::Settings *s = Settings::Settings::inst(); const Value &value = s->get(entry); QString text = QString::fromStdString(value.toString()); int idx = comboBox->findData(text); if (idx >= 0) { comboBox->setCurrentIndex(idx); } else { comboBox->addItem(QIcon::fromTheme("emblem-unreadable"), text + " " + _("(not supported)"), text); int defIdx = comboBox->findData(text); if (defIdx >= 0) { comboBox->setCurrentIndex(defIdx); } else { comboBox->setCurrentIndex(0); } } } void ButtonConfigWidget::writeSettings() { SettingsWriter settingsWriter; Settings::Settings::inst()->visit(settingsWriter); } void ButtonConfigWidget::initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry) { comboBox->clear(); // Create an empty icon, so that all comboboxes have the same alignment QPixmap map = QPixmap(16, 16); map.fill(Qt::transparent); const QIcon emptyIcon = QIcon(map); for (const auto &v : entry.range().toVector()) { const auto icon = emptyIcon; const auto desc = QString::fromStdString(gettext(v[1]->toString().c_str())); const auto actionName = QString::fromStdString(v[0]->toString()); comboBox->addItem(icon, desc, actionName); } for (const auto &action : InputDriverManager::instance()->getActions()) { const auto icon = action.icon; const auto effectiveIcon = icon.isNull() ? emptyIcon : icon; const auto desc = QString(action.description).remove(QChar('&')); comboBox->addItem(effectiveIcon, desc, action.name); } updateComboBox(comboBox, entry); } void ButtonConfigWidget::updateStates(){ if(!initialized) return; int cnt = InputDriverManager::instance()->getButtonCount(); for (int i=0;ifindChild(QString("labelInputButton%1").arg(i)); QString style =(cnt <= i) ? ButtonConfigWidget::DisabledStyleString : ButtonConfigWidget::EmptyString; label->setStyleSheet(style); } } openscad-2019.05/src/input/ButtonConfigWidget.h0000644000076500000240000000353013435353202021744 0ustar kintelstaff00000000000000#pragma once #include "qtgettext.h" #include "ui_ButtonConfigWidget.h" #include "settings.h" class ButtonConfigWidget: public QWidget, public Ui::Button { Q_OBJECT public: ButtonConfigWidget(QWidget *parent = 0); virtual ~ButtonConfigWidget(); void updateButtonState(int,bool) const; void init(); void updateStates(); public slots: void on_comboBoxButton0_activated(int val); void on_comboBoxButton1_activated(int val); void on_comboBoxButton2_activated(int val); void on_comboBoxButton3_activated(int val); void on_comboBoxButton4_activated(int val); void on_comboBoxButton5_activated(int val); void on_comboBoxButton6_activated(int val); void on_comboBoxButton7_activated(int val); void on_comboBoxButton8_activated(int val); void on_comboBoxButton9_activated(int val); void on_comboBoxButton10_activated(int val); void on_comboBoxButton11_activated(int val); void on_comboBoxButton12_activated(int val); void on_comboBoxButton13_activated(int val); void on_comboBoxButton14_activated(int val); void on_comboBoxButton15_activated(int val); signals: void inputMappingChanged() const; private: /** Initialize combobox list values from the settings range values */ void initComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry); /** Update combobox from current settings */ void updateComboBox(QComboBox *comboBox, const Settings::SettingsEntry& entry); /** Set value from combobox to settings */ void applyComboBox(QComboBox *comboBox, int val, Settings::SettingsEntry& entry); void writeSettings(); const QString EmptyString= QString(""); const QString ActiveStyleString= QString("font-weight: bold; color: red"); const QString DisabledStyleString= QString("color: gray"); bool initialized = false; }; openscad-2019.05/src/input/ButtonConfigWidget.ui0000644000076500000240000001627613402025764022150 0ustar kintelstaff00000000000000 Button 0 0 410 231 0 0 Preferences true true 0 0 376 534 Button 2 Button 3 Button 5 Button 6 Button 4 Button 9 Button 8 Button 7 Button 0 Button 1 Qt::Vertical 20 40 Button 12 Button 10 Button 11 Button 13 Button 14 Button 15 Qt::Horizontal 40 20 openscad-2019.05/src/input/DBusInputDriver.cc0000644000076500000240000001032513437640540021374 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "DBusInputDriver.h" #include "InputDriverManager.h" #include "openscad_adaptor.h" #include "openscad_interface.h" void DBusInputDriver::run() { } DBusInputDriver::DBusInputDriver() : is_open(false) { name = "DBusInputDriver"; } DBusInputDriver::~DBusInputDriver() { } bool DBusInputDriver::openOnce() const { return true; } bool DBusInputDriver::isOpen() const { return is_open; } bool DBusInputDriver::open() { if (is_open) { return true; } QDBusConnection connection = QDBusConnection::sessionBus(); if (!connection.isConnected()) { return false; } new OpenSCADAdaptor(this); connection.registerObject("/org/openscad/OpenSCAD/Application", this); connection.registerService("org.openscad.OpenSCAD"); new org::openscad::OpenSCAD(QString(), QString(), connection, this); name = "DBusInputDriver (" + connection.baseService().toStdString() + ")"; is_open = true; return true; } void DBusInputDriver::close() { } void DBusInputDriver::zoom(double zoom) const { InputDriverManager::instance()->sendEvent(new InputEventZoom(zoom, true, false)); } void DBusInputDriver::zoomTo(double zoom) const { InputDriverManager::instance()->sendEvent(new InputEventZoom(zoom, false, false)); } void DBusInputDriver::rotate(double x, double y, double z) const { InputDriverManager::instance()->sendEvent(new InputEventRotate(x, y, z, true, false)); } void DBusInputDriver::rotateTo(double x, double y, double z) const { InputDriverManager::instance()->sendEvent(new InputEventRotate(x, y, z, false, false)); } void DBusInputDriver::rotateByVector(double x, double y, double z) const { InputDriverManager::instance()->sendEvent(new InputEventRotate2(x, y, z, false)); } void DBusInputDriver::translate(double x, double y, double z) const { InputDriverManager::instance()->sendEvent(new InputEventTranslate(x, y, z, true, false, false)); } void DBusInputDriver::translateTo(double x, double y, double z) const { InputDriverManager::instance()->sendEvent(new InputEventTranslate(x, y, z, false, false, false)); } void DBusInputDriver::action(QString name) const { InputDriverManager::instance()->sendEvent(new InputEventAction(name.toStdString(), false)); } const QStringList DBusInputDriver::getActions() const { QStringList ret; for (const auto &action : InputDriverManager::instance()->getActions()) { ret << action.name; } return ret; } void DBusInputDriver::buttonPress(uint idx) const { InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(idx, true, false)); InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(idx, false, false)); } const QList DBusInputDriver::getRotation() const { return InputDriverManager::instance()->getRotation(); } const QList DBusInputDriver::getTranslation() const { return InputDriverManager::instance()->getTranslation(); } const std::string & DBusInputDriver::get_name() const { return this->name; } std::string DBusInputDriver::get_info() const { return STR(get_name() << " " << (isOpen() ? "open" : "not open")); } openscad-2019.05/src/input/DBusInputDriver.h0000644000076500000240000000423113437640540021235 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include "InputDriver.h" class DBusInputDriver : public InputDriver { Q_OBJECT bool is_open; std::string name; public: DBusInputDriver(); ~DBusInputDriver(); void run() override; bool open() override; void close() override; bool isOpen() const override; bool openOnce() const override; const std::string & get_name() const override; std::string get_info() const override; public slots: void zoom(double zoom) const; void zoomTo(double zoom) const; void rotate(double x, double y, double z) const; void rotateTo(double x, double y, double z) const; void rotateByVector(double x, double y, double z) const; void translate(double x, double y, double z) const; void translateTo(double x, double y, double z) const; void action(QString action) const; void buttonPress(uint idx) const; const QList getRotation() const; const QList getTranslation() const; const QStringList getActions() const; }; openscad-2019.05/src/input/HidApiInputDriver.cc0000644000076500000240000002627513437640540021710 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * Initial implementation by Jochen Kunz and Gert Menke provided as * Public Domain. */ #include #include #include #include #include #include #include "settings.h" #include "PlatformUtils.h" #include "input/HidApiInputDriver.h" #include "input/InputDriverManager.h" static constexpr int BUFLEN = 64; static constexpr int MAX_LOG_SIZE = 20 * 1024; namespace ch = std::chrono; static std::ofstream logstream; static ch::system_clock::time_point logtime; // http://www.linux-usb.org/usb.ids // http://www.3dconnexion.eu/nc/service/faq/show_faq/7ece50ed-0b39-b57e-d3b2-4afd9420604e.html static const struct device_id device_ids[] = { { 0x046d, 0xc603, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Spacemouse Plus XT"}, { 0x046d, 0xc605, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion CADman"}, { 0x046d, 0xc606, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Spacemouse Classic"}, { 0x046d, 0xc621, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Spaceball 5000"}, { 0x046d, 0xc623, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Traveller 3D Mouse"}, { 0x046d, 0xc625, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Pilot 3D Mouse"}, { 0x046d, 0xc626, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Navigator 3D Mouse"}, { 0x046d, 0xc627, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Explorer 3D Mouse"}, { 0x046d, 0xc628, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Navigator for Notebooks"}, { 0x046d, 0xc629, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion SpacePilot Pro 3D Mouse"}, { 0x046d, 0xc62b, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Mouse Pro"}, { 0x256f, 0xc62e, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Mouse Wireless (cabled)"}, { 0x256f, 0xc62f, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Mouse Wireless"}, { 0x256f, 0xc631, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Mouse Pro Wireless (cabled)"}, { 0x256f, 0xc632, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Mouse Pro Wireless"}, { 0x256f, 0xc635, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Space Mouse Compact"}, // This is reported to be used with a 3Dconnexion Space Mouse Wireless 256f:c62e { 0x256f, 0xc652, &HidApiInputDriver::hidapi_decode_axis, &HidApiInputDriver::hidapi_decode_button, "3Dconnexion Universal Receiver"}, { -1, -1, nullptr, nullptr, nullptr}, }; #define HIDAPI_LOG(f) hidapi_log(boost::format(f)) #define HIDAPI_LOGP(f,a) hidapi_log(boost::format(f) % a) static void hidapi_log(boost::format format) { if (logstream) { const ch::system_clock::duration time = ch::system_clock::now() - logtime; logstream << ch::duration_cast(time).count() << ": " << format.str() << std::endl; if (logstream.tellp() > MAX_LOG_SIZE) { logstream.close(); } } } static void hidapi_log_input(unsigned char *buf, int len) { if (logstream) { std::ostringstream s; s << (boost::format("R: %1$2d/%1$02x:") % len).str(); for (int idx = 0;idx < len;idx++) { s << (boost::format(" %1$02x") % (int)buf[idx]).str(); } HIDAPI_LOG(s.str()); } } static std::string to_string(const wchar_t *wstr) { if (wstr) { std::wstring_convert> conv; return conv.to_bytes(wstr); } return ""; } static const device_id * match_device(const struct hid_device_info *info) { for (int idx = 0;device_ids[idx].name != nullptr;idx++) { if ((device_ids[idx].vendor_id == info->vendor_id) && (device_ids[idx].product_id == info->product_id)) { return &device_ids[idx]; } } return nullptr; } HidApiInputDriver::HidApiInputDriver() : buttons(0), hid_dev(0), dev(0) { name = "HidApiInputDriver"; } HidApiInputDriver::~HidApiInputDriver() { } void HidApiInputDriver::run() { hidapi_input(hid_dev); } void HidApiInputDriver::hidapi_decode_axis(const unsigned char *buf, unsigned int len) { if ((buf[0] == 1 || buf[0] == 2) && len == 7) { // Values are in the range -10..10 at min. speed and -2595..2595 // at max. speed. const int16_t x_value = buf[1] | buf[2] << 8; const int16_t y_value = buf[3] | buf[4] << 8; const int16_t z_value = buf[5] | buf[6] << 8; if (x_value == 0 && y_value == 0 && z_value == 0) { return; } const double x = x_value / 350.0; const double y = y_value / 350.0; const double z = z_value / 350.0; if (buf[0] == 1) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(0, x)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(1, y)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(2, z)); } else { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(3, x)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(4, y)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(5, z)); } } else if (buf[0] == 1 && len == 13) { // Same as above, but all 6 axis is a single 13 byte HID message. for (int a = 0;a < 6;a++) { const int16_t i = buf[2 * a + 1] | (buf[2 * a + 2] << 8); double val = (double)i / 350.0; if (fabs(val) > 0.01) { InputEvent *event = new InputEventAxisChanged(a, val); InputDriverManager::instance()->sendEvent(event); } } } } void HidApiInputDriver::hidapi_decode_button(const unsigned char *buf, unsigned int len) { if (buf[0] == 3 && len >= 3) { // Handle button events, on Linux the packet has a length of 3 but // on Windows the length is 13. const uint16_t current = buf[1] | buf[2] << 8; const std::bitset<16> bits_curr{current}; const std::bitset<16> bits_last{buttons}; for (int i = 0;i < 16;i++) { if (bits_curr.test(i) != bits_last.test(i)) { InputEvent *event = new InputEventButtonChanged(i, bits_curr.test(i)); InputDriverManager::instance()->sendEvent(event); } } buttons = current; } } void HidApiInputDriver::hidapi_input(hid_device* hid_dev) { unsigned char buf[BUFLEN]; unsigned int len; while ((len = hid_read(hid_dev, buf, BUFLEN)) > 0) { hidapi_log_input(buf, len); (this->*(dev->axis_decoder))(buf, len); (this->*(dev->button_decoder))(buf, len); } hid_close(hid_dev); } std::pair HidApiInputDriver::enumerate() const { hid_device *ret_hid_dev = nullptr; const struct device_id *ret_dev = nullptr; HIDAPI_LOG("Enumerating HID devices..."); struct hid_device_info *info = hid_enumerate(0, 0); for (;info != nullptr;info = info->next) { HIDAPI_LOGP("D: %04x:%04x | path = %s, serial = %s, manufacturer = %s, product = %s", info->vendor_id % info->product_id % info->path % to_string(info->serial_number) % to_string(info->manufacturer_string) % to_string(info->product_string)); const device_id *dev = match_device(info); if (!dev) { continue; } hid_device *hid_dev; HIDAPI_LOGP("P: %04x:%04x | %s", info->vendor_id % info->product_id % info->path); hid_dev = hid_open_path(info->path); if (!hid_dev) { HIDAPI_LOGP("O: %04x:%04x | %s", info->vendor_id % info->product_id % to_string(info->serial_number)); hid_dev = hid_open(info->vendor_id, info->product_id, info->serial_number); if (!hid_dev) { continue; } } HIDAPI_LOGP("R: %04x:%04x | %s", info->vendor_id % info->product_id % to_string(info->serial_number)); unsigned char buf[BUFLEN]; const int len = hid_read_timeout(hid_dev, buf, BUFLEN, 100); HIDAPI_LOGP("?: %d", len); if (len < 0) { HIDAPI_LOGP("E: %s", to_string(hid_error(hid_dev))); hid_close(hid_dev); continue; } ret_dev = dev; ret_hid_dev = hid_dev; break; } hid_free_enumeration(info); HIDAPI_LOGP("Done enumerating (status = %s).", (ret_hid_dev != nullptr ? "ok" : "failed")); return {ret_hid_dev, ret_dev}; } bool HidApiInputDriver::open() { const auto *s = Settings::Settings::inst(); if (s->get(Settings::Settings::inputEnableDriverHIDAPILog).toBool()) { logtime = ch::system_clock::now(); logstream.open(PlatformUtils::backupPath() + "/hidapi.log"); } HIDAPI_LOG("HidApiInputDriver::open()"); if (hid_init() < 0) { HIDAPI_LOG("hid_init() failed"); PRINTD("Can't hid_init().\n"); return false; } std::tie(this->hid_dev, this->dev) = enumerate(); if (this->dev) { name = STR(std::setfill('0') << std::setw(4) << std::hex << "HidApiInputDriver (" << dev->vendor_id << ":" << dev->product_id << " - " << dev->name << ")"); start(); HIDAPI_LOGP("HidApiInputDriver::open(): %s", name); return true; } HIDAPI_LOG("HidApiInputDriver::open(): No matching device found."); return false; } void HidApiInputDriver::close() { this->dev = nullptr; this->hid_dev = nullptr; this->name = "HidApiInputDriver"; HIDAPI_LOG("HidApiInputDriver::close()"); logstream.close(); } const std::string & HidApiInputDriver::get_name() const { return name; } std::string HidApiInputDriver::get_info() const { std::ostringstream stream; stream << get_name() << " "; if(isOpen()){ stream << "open" << " "; if(dev){ stream << "Vendor ID: " << dev->vendor_id << " "; stream << "Product ID: " << dev->product_id << " "; } }else{ stream << "not open"; } return stream.str(); } openscad-2019.05/src/input/HidApiInputDriver.h0000644000076500000240000000441113437640540021536 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include "input/InputDriver.h" class HidApiInputDriver : public InputDriver { Q_OBJECT std::string name; unsigned int buttons; hid_device* hid_dev; const struct device_id *dev; public: HidApiInputDriver(); ~HidApiInputDriver(); void run() override; bool open() override; void close() override; const std::string & get_name() const override; std::string get_info() const override; void hidapi_decode_axis(const unsigned char *buf, unsigned int len); void hidapi_decode_button(const unsigned char *buf, unsigned int len); int getButtonCount() const override{ return 16; } int getAxisCount() const override{ return 6; } private: std::pair enumerate() const; void hidapi_input(hid_device* hid_dev); }; struct device_id { int vendor_id; int product_id; void (HidApiInputDriver::*axis_decoder)(const unsigned char *buf, unsigned int len); void (HidApiInputDriver::*button_decoder)(const unsigned char *buf, unsigned int len); const char *name; }; openscad-2019.05/src/input/InputDriver.cc0000644000076500000240000000307413402025764020616 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "InputDriver.h" const QEvent::Type InputEvent::eventType = static_cast(QEvent::registerEventType()); InputEvent::InputEvent(const bool activeOnly) : QEvent(eventType), activeOnly(activeOnly) { } InputEvent::~InputEvent() { } InputDriver::InputDriver() { } InputDriver::~InputDriver() { } bool InputDriver::isOpen() const { return isRunning(); } bool InputDriver::openOnce() const { return false; } openscad-2019.05/src/input/InputDriver.h0000644000076500000240000000363713437640540020470 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include "InputDriverEvent.h" class InputDriver : public QThread { public: InputDriver(); virtual ~InputDriver(); virtual const std::string & get_name() const = 0; virtual std::string get_info() const = 0; virtual bool open() = 0; virtual void close() = 0; /* * Return if the driver is currently opened. The default implementation * simply returns the {@link #isRunning()} status of the thread. */ virtual bool isOpen() const; /* * Drivers that are not connected to a device and can be opened on * application start. No attempt to re-open is made. */ virtual bool openOnce() const; virtual int getButtonCount() const {return 0;} virtual int getAxisCount() const {return 0;} }; openscad-2019.05/src/input/InputDriverEvent.h0000644000076500000240000001267013402025764021464 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include class InputEventHandler { public: virtual ~InputEventHandler(void) { }; virtual void onAxisChanged(class InputEventAxisChanged *event) = 0; virtual void onButtonChanged(class InputEventButtonChanged *event) = 0; virtual void onTranslateEvent(class InputEventTranslate *event) = 0; virtual void onRotateEvent(class InputEventRotate *event) = 0; virtual void onRotate2Event(class InputEventRotate2 *event) = 0; virtual void onActionEvent(class InputEventAction *event) = 0; virtual void onZoomEvent(class InputEventZoom *event) = 0; }; class InputEvent : public QEvent { public: const bool activeOnly; InputEvent(const bool activeOnly = true); virtual ~InputEvent(void); virtual void deliver(InputEventHandler *receiver) = 0; static const QEvent::Type eventType; }; class GenericInputEvent : public InputEvent { public: GenericInputEvent(const bool activeOnly = true) : InputEvent(activeOnly) { } ~GenericInputEvent() { } }; /** * Generic event for use by input drivers to report the change of * one axis. The value is assumed to be an absolute value in the * range -1.0 to 1.0. */ class InputEventAxisChanged : public GenericInputEvent { public: const unsigned int axis; const double value; InputEventAxisChanged(const unsigned int axis, const double value, const bool activeOnly = true) : GenericInputEvent(activeOnly), axis(axis), value(value) { } void deliver(InputEventHandler *receiver) { receiver->onAxisChanged(this); } }; /** * Generic event for use by input drivers to report button press * and button release events. */ class InputEventButtonChanged : public GenericInputEvent { public: const unsigned int button; const bool down; InputEventButtonChanged(const unsigned int button, const bool down, const bool activeOnly = true) : GenericInputEvent(activeOnly), button(button), down(down) { } void deliver(InputEventHandler *receiver) { receiver->onButtonChanged(this); } }; /** * Event to trigger view translation. In general this should be used * only by the event mapper to ensure the action can be configured by * the user. In special cases it is still possible to create this event * type in the driver itself (e.g. the DBus driver uses this to report * calls to the translate method). */ class InputEventTranslate : public InputEvent { public: const double x; const double y; const double z; const bool relative; const bool viewPortRelative; InputEventTranslate(const double x, const double y, const double z, const bool relative = true, const bool viewPortRelative=false, const bool activeOnly = true) : InputEvent(activeOnly), x(x), y(y), z(z), relative(relative), viewPortRelative(viewPortRelative) { } void deliver(InputEventHandler *receiver) { receiver->onTranslateEvent(this); } }; class InputEventRotate : public InputEvent { public: const double x; const double y; const double z; const bool relative; InputEventRotate(const double x, const double y, const double z, const bool relative = true, const bool activeOnly = true) : InputEvent(activeOnly), x(x), y(y), z(z), relative(relative) { } void deliver(InputEventHandler *receiver) { receiver->onRotateEvent(this); } }; class InputEventRotate2 : public InputEvent { public: const double x; const double y; const double z; InputEventRotate2(const double x, const double y, const double z, const bool activeOnly = true) : InputEvent(activeOnly), x(x), y(y), z(z) { } void deliver(InputEventHandler *receiver) { receiver->onRotate2Event(this); } }; class InputEventZoom : public InputEvent { public: const double zoom; const bool relative; InputEventZoom(const double zoom, const bool relative = true, const bool activeOnly = true) : InputEvent(activeOnly), zoom(zoom), relative(relative) { } void deliver(InputEventHandler *receiver) { receiver->onZoomEvent(this); } }; class InputEventAction : public InputEvent { public: const std::string action; InputEventAction(const std::string action, const bool activeOnly = true) : InputEvent(activeOnly), action(action) { } void deliver(InputEventHandler *receiver) { receiver->onActionEvent(this); } }; openscad-2019.05/src/input/InputDriverManager.cc0000644000076500000240000001306613441031431022102 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "InputDriverManager.h" #include "printutils.h" InputDriverManager * InputDriverManager::self = 0; /** * This can be called from non-GUI context, so no Qt initialization is done * at this point. */ InputDriverManager::InputDriverManager(void) : currentWindow(nullptr), timer(nullptr) { } InputDriverManager::~InputDriverManager(void) { } InputDriverManager * InputDriverManager::instance() { if (!self) { self = new InputDriverManager(); } return self; } void InputDriverManager::registerDriver(InputDriver *driver) { this->drivers.push_back(driver); } void InputDriverManager::unregisterDriver(InputDriver *driver) { this->drivers.remove(driver); } void InputDriverManager::registerActions(const QList &actions, const QString parent) { for (const auto action : actions) { const auto description = parent + action->text(); if (!action->objectName().isEmpty()) { this->actions.push_back({action->objectName(), description, action->icon()}); } if (action->menu()) { registerActions(action->menu()->actions(), description + QString::fromUtf8(u8" \u2192 ")); } } } void InputDriverManager::init() { timer = new QTimer(this); connect(QApplication::instance(), SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(onFocusChanged(QWidget *, QWidget *))); doOpen(true); connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout())); timer->start(10 * 1000); } void InputDriverManager::onTimeout() { for (auto driver : drivers) { if (driver->openOnce()) { continue; } if (driver->isOpen()) { return; } } doOpen(false); } void InputDriverManager::doOpen(bool firstOpen) { for (auto driver : drivers) { if (driver->openOnce()) { continue; } if (driver->open()) { break; } } if (firstOpen) { for (auto driver : drivers) { if (driver->openOnce()) { driver->open(); } } } } std::string InputDriverManager::listDrivers() const { std::ostringstream stream; const char *sep = ""; for (auto driver : drivers) { stream << sep << driver->get_name(); if (driver->isOpen()) { stream << "*"; } sep = ", "; } return stream.str(); } std::string InputDriverManager::listDriverInfos() const { std::ostringstream stream; const char *sep = ""; for (auto driver : drivers) { stream << sep << driver->get_info(); sep = "\n"; } return stream.str(); } void InputDriverManager::closeDrivers() { if (timer != nullptr) { timer->stop(); } InputEventMapper::instance()->stop(); for (auto driver : drivers) { driver->close(); } } void InputDriverManager::sendEvent(InputEvent *event) { event->deliver(&mapper); } void InputDriverManager::postEvent(InputEvent *event) { QWidget *window = event->activeOnly ? QApplication::activeWindow() : currentWindow; if (window) { QCoreApplication::postEvent(window, event); } } const std::list & InputDriverManager::getActions() const { return actions; } QList InputDriverManager::getTranslation() const { const MainWindow *window = currentWindow; if (window) { return window->getTranslation(); } return QList({0.0, 0.0, 0.0}); } QList InputDriverManager::getRotation() const { const MainWindow *window = currentWindow; if (window) { return window->getRotation(); } return QList({0.0, 0.0, 0.0}); } void InputDriverManager::onFocusChanged(QWidget *, QWidget *current) { if (current) { currentWindow = dynamic_cast(current->window()); } } void InputDriverManager::onInputMappingUpdated() { mapper.onInputMappingUpdated(); } void InputDriverManager::onInputCalibrationUpdated() { mapper.onInputCalibrationUpdated(); } void InputDriverManager::onInputGainUpdated() { mapper.onInputGainUpdated(); } int InputDriverManager::getButtonCount(){ int max=0; for (auto driver : drivers) { if(driver->isOpen()){ max = std::max(max, driver->getButtonCount()); } } return max; } int InputDriverManager::getAxisCount(){ int max=0; for (auto driver : drivers) { if(driver->isOpen()){ max = std::max(max, driver->getAxisCount()); } } return max; } openscad-2019.05/src/input/InputDriverManager.h0000644000076500000240000000512513437640540021755 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include #include "InputDriver.h" #include "InputEventMapper.h" #include "MainWindow.h" struct ActionStruct { QString name; QString description; QIcon icon; }; class InputDriverManager : public QObject { Q_OBJECT private: using drivers_t = std::list; drivers_t drivers; std::list actions; InputEventMapper mapper; MainWindow *currentWindow; QTimer *timer; static InputDriverManager *self; void postEvent(InputEvent *event); public: InputDriverManager(void); virtual ~InputDriverManager(void); void sendEvent(InputEvent *event); void init(); std::string listDrivers() const; std::string listDriverInfos() const; void registerDriver(InputDriver *driver); void unregisterDriver(InputDriver *driver); void closeDrivers(); void registerActions(const QList &actions, const QString parent = QString("")); static InputDriverManager * instance(); const std::list & getActions() const; QList getTranslation() const; QList getRotation() const; int getButtonCount(); int getAxisCount(); public slots: void onInputMappingUpdated(); void onInputCalibrationUpdated(); void onInputGainUpdated(); private slots: void onTimeout(); void doOpen(bool firstOpen); void onFocusChanged(QWidget *, QWidget *); friend class InputEventMapper; }; openscad-2019.05/src/input/InputEventMapper.cc0000644000076500000240000002426113441031431021601 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "InputEventMapper.h" #include "InputDriverManager.h" #include "settings.h" #include "Preferences.h" #include "AxisConfigWidget.h" #include "ButtonConfigWidget.h" #include // C alternative tokens #include #include InputEventMapper * InputEventMapper::self = nullptr; InputEventMapper::InputEventMapper() { stopRequest=false; for (int a = 0;a < max_axis;a++) { axisRawValue[a] = 0.0; axisTrimValue[a] = 0.0; axisDeadzone[a] = 0.1; } for (int a = 0;a < max_buttons;a++) { button_state[a]=false; button_state_last[a]=false; } translationGain=1.00; translationVPRelGain=1.00; rotateGain=1.00; rotateVPRelGain=1.00; zoomGain=1.00; timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(onTimer())); timer->start(30); onInputMappingUpdated(); onInputCalibrationUpdated(); onInputGainUpdated(); self=this; } InputEventMapper::~InputEventMapper() { } InputEventMapper * InputEventMapper::instance() { if (!self) { self = new InputEventMapper(); } return self; } int InputEventMapper::getMaxButtons(){ return max_buttons; } int InputEventMapper::getMaxAxis(){ return max_axis; } double InputEventMapper::scale(double val) { double x = 4 * val; double xx = x < 0 ? -exp(-x) + 1 : exp(x) - 1; return xx / 5.0; } double InputEventMapper::getAxisValue(int config) { int idx = abs(config) - 1; bool neg = config < 0; double trimmedVal = axisRawValue[idx] + axisTrimValue[idx]; double val = neg ? -trimmedVal : trimmedVal; if(val < axisDeadzone[idx] and -val < axisDeadzone[idx]){ val=0; } return scale(val); } void InputEventMapper::onTimer() { const double threshold = 0.01; double tx = getAxisValue(translate[0])*translationGain; double ty = getAxisValue(translate[1])*translationGain; double tz = getAxisValue(translate[2])*translationGain; if ((fabs(tx) > threshold) || (fabs(ty) > threshold) || (fabs(tz) > threshold)) { InputEvent *inputEvent = new InputEventTranslate(tx, ty, tz); InputDriverManager::instance()->postEvent(inputEvent); } double txVPRel = getAxisValue(translate[3])*translationVPRelGain; double tyVPRel = getAxisValue(translate[4])*translationVPRelGain; double tzVPRel = getAxisValue(translate[5])*translationVPRelGain; if ((fabs(txVPRel) > threshold) || (fabs(tyVPRel) > threshold) || (fabs(tzVPRel) > threshold)) { InputEvent *inputEvent = new InputEventTranslate(txVPRel, tyVPRel, tzVPRel, true, true, false); InputDriverManager::instance()->postEvent(inputEvent); } double rx = getAxisValue(rotate[0])*rotateGain; double ry = getAxisValue(rotate[1])*rotateGain; double rz = getAxisValue(rotate[2])*rotateGain; if ((fabs(rx) > threshold) || (fabs(ry) > threshold) || (fabs(rz) > threshold)) { InputEvent *inputEvent = new InputEventRotate(rx, ry, rz); InputDriverManager::instance()->postEvent(inputEvent); } double rxVPRel = getAxisValue(rotate[3])*rotateVPRelGain; double ryVPRel = getAxisValue(rotate[4])*rotateVPRelGain; double rzVPRel = getAxisValue(rotate[5])*rotateVPRelGain; if ((fabs(rxVPRel) > threshold) || (fabs(ryVPRel) > threshold) || (fabs(rzVPRel) > threshold)) { InputEvent *inputEvent = new InputEventRotate2(rxVPRel, ryVPRel, rzVPRel); InputDriverManager::instance()->postEvent(inputEvent); } double z = (getAxisValue(zoom)+getAxisValue(zoom2))*zoomGain; if (fabs(z) > threshold) { InputEvent *inputEvent = new InputEventZoom(z); InputDriverManager::instance()->postEvent(inputEvent); } //update the UI on time, NOT on event as a joystick can fire a high rate of events for (int i = 0; i < max_buttons; i++ ){ if(button_state[i] != button_state_last[i]){ button_state_last[i] = button_state[i]; Preferences::inst()->ButtonConfig->updateButtonState(i,button_state[i]); } } for (int i = 0; i < max_axis; i++ ){ Preferences::inst()->AxisConfig->AxesChanged(i,axisRawValue[i] + axisTrimValue[i]); } } void InputEventMapper::onAxisChanged(InputEventAxisChanged *event) { axisRawValue[event->axis] = event->value; } void InputEventMapper::onButtonChanged(InputEventButtonChanged *event) { int button = event->button; if (button < max_buttons) { if (event->down) { this->button_state[button]=true; }else{ this->button_state[button]=false; } if (!event->down) { return; } std::string action = actions[event->button].toStdString(); if (!action.empty()) { InputEvent *inputEvent = new InputEventAction(action, false); InputDriverManager::instance()->postEvent(inputEvent); } } } void InputEventMapper::onTranslateEvent(InputEventTranslate *event) { InputDriverManager::instance()->postEvent(event); } void InputEventMapper::onRotateEvent(InputEventRotate *event) { InputDriverManager::instance()->postEvent(event); } void InputEventMapper::onRotate2Event(InputEventRotate2 *event) { InputDriverManager::instance()->postEvent(event); } void InputEventMapper::onActionEvent(InputEventAction *event) { InputDriverManager::instance()->postEvent(event); } void InputEventMapper::onZoomEvent(InputEventZoom *event) { InputDriverManager::instance()->postEvent(event); } int InputEventMapper::parseSettingValue(const std::string val) { if (val.length() != 2) { return 0; } return atoi(val.c_str()); } void InputEventMapper::onInputMappingUpdated() { Settings::Settings *s = Settings::Settings::inst(); for (int i = 0; i < max_buttons; i++ ){ std::string is = std::to_string(i); Settings::SettingsEntry* ent =s->getSettingEntryByName("button" +is); actions[i] =QString::fromStdString(s->get(*ent).toString()); } translate[0] = parseSettingValue(s->get(Settings::Settings::inputTranslationX).toString()); translate[1] = parseSettingValue(s->get(Settings::Settings::inputTranslationY).toString()); translate[2] = parseSettingValue(s->get(Settings::Settings::inputTranslationZ).toString()); translate[3] = parseSettingValue(s->get(Settings::Settings::inputTranslationXVPRel).toString()); translate[4] = parseSettingValue(s->get(Settings::Settings::inputTranslationYVPRel).toString()); translate[5] = parseSettingValue(s->get(Settings::Settings::inputTranslationZVPRel).toString()); rotate[0] = parseSettingValue(s->get(Settings::Settings::inputRotateX).toString()); rotate[1] = parseSettingValue(s->get(Settings::Settings::inputRotateY).toString()); rotate[2] = parseSettingValue(s->get(Settings::Settings::inputRotateZ).toString()); rotate[3] = parseSettingValue(s->get(Settings::Settings::inputRotateXVPRel).toString()); rotate[4] = parseSettingValue(s->get(Settings::Settings::inputRotateYVPRel).toString()); rotate[5] = parseSettingValue(s->get(Settings::Settings::inputRotateZVPRel).toString()); zoom = parseSettingValue(s->get(Settings::Settings::inputZoom).toString()); zoom2 = parseSettingValue(s->get(Settings::Settings::inputZoom2).toString()); } void InputEventMapper::onInputGainUpdated() { Settings::Settings *s = Settings::Settings::inst(); translationGain = s->get(Settings::Settings::inputTranslationGain).toDouble(); translationVPRelGain = s->get(Settings::Settings::inputTranslationVPRelGain).toDouble(); rotateGain = s->get(Settings::Settings::inputRotateGain).toDouble(); rotateVPRelGain = s->get(Settings::Settings::inputRotateVPRelGain).toDouble(); zoomGain = s->get(Settings::Settings::inputZoomGain).toDouble(); } void InputEventMapper::onInputCalibrationUpdated() { for (int a = 0;a < max_axis;a++) { std::string s = std::to_string(a); Settings::Settings *setting = Settings::Settings::inst(); Settings::SettingsEntry* ent; ent = Settings::Settings::inst()->getSettingEntryByName("axisTrim" + s ); if(ent != nullptr){ axisTrimValue[a] = setting->get(*ent).toDouble(); } ent = Settings::Settings::inst()->getSettingEntryByName("axisDeadzone" + s ); if(ent != nullptr){ axisDeadzone[a] = setting->get(*ent).toDouble(); } } } void InputEventMapper::onAxisAutoTrim() { Settings::Settings *s = Settings::Settings::inst(); for (int i = 0; i < max_axis; i++ ){ std::string is = std::to_string(i); axisTrimValue[i] = -axisRawValue[i]; Settings::SettingsEntry* ent =s->getSettingEntryByName("axisTrim" +is); s->set(*ent, axisTrimValue[i]); } } void InputEventMapper::onAxisTrimReset() { Settings::Settings *s = Settings::Settings::inst(); for (int i = 0; i < max_axis; i++ ){ std::string is = std::to_string(i); axisTrimValue[i] = 0.00; Settings::SettingsEntry* ent =s->getSettingEntryByName("axisTrim" +is); s->set(*ent, axisTrimValue[i]); } } void InputEventMapper::stop(){ stopRequest=true; timer->stop(); } openscad-2019.05/src/input/InputEventMapper.h0000644000076500000240000000547313402025764021460 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include #include "input/InputDriver.h" class InputEventMapper : public QObject, public InputEventHandler { Q_OBJECT private: const static int max_axis = 9; const static int max_buttons = 16; QTimer *timer; double axisRawValue[max_axis]; double axisTrimValue[max_axis]; double axisDeadzone[max_axis]; QString actions[max_buttons]; int translate[6]; int rotate[6]; int zoom; int zoom2; volatile bool stopRequest; double scale(double val); double getAxisValue(int config); int parseSettingValue(const std::string val); bool button_state[max_buttons]; bool button_state_last[max_buttons]; static InputEventMapper *self; double translationGain; double translationVPRelGain; double rotateGain; double rotateVPRelGain; double zoomGain; public: InputEventMapper(); virtual ~InputEventMapper(); void stop(); void onAxisChanged(class InputEventAxisChanged *event) override; void onButtonChanged(class InputEventButtonChanged *event) override; void onTranslateEvent(class InputEventTranslate *event) override; void onRotateEvent(class InputEventRotate *event) override; void onRotate2Event(class InputEventRotate2 *event) override; void onActionEvent(class InputEventAction *event) override; void onZoomEvent(class InputEventZoom *event) override; void onInputMappingUpdated(); void onInputCalibrationUpdated(); void onInputGainUpdated(); void onAxisAutoTrim(); void onAxisTrimReset(); static InputEventMapper * instance(); static int getMaxButtons(); static int getMaxAxis(); private slots: void onTimer(); }; openscad-2019.05/src/input/JoystickInputDriver.cc0000644000076500000240000000577213437640540022350 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "InputDriverManager.h" #include "JoystickInputDriver.h" #include #include void JoystickInputDriver::run() { struct js_event js; while (!stopRequest) { ssize_t len = read(fd, &js, sizeof(struct js_event)); if (len < 0) { break; } if (len != sizeof(struct js_event)) { continue; } switch (js.type & ~JS_EVENT_INIT) { case JS_EVENT_BUTTON: InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(js.number, js.value != 0)); break; case JS_EVENT_AXIS: InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(js.number, js.value / 32767.0)); break; } } ::close(fd); } JoystickInputDriver::JoystickInputDriver() : fd(-1), version(0), axes(0), buttons(0), stopRequest(false) { } JoystickInputDriver::~JoystickInputDriver() { } bool JoystickInputDriver::open() { stopRequest = false; auto path = boost::format("/dev/input/js%d") % this->nr; this->fd = ::open(path.str().c_str(), O_RDONLY); if (fd < 0) { return false; } version = 0; ioctl(fd, JSIOCGVERSION, &version); if (version < 0x010000) { return false; } ioctl(fd, JSIOCGAXES, &axes); ioctl(fd, JSIOCGBUTTONS, &buttons); ioctl(fd, JSIOCGNAME(sizeof(name)), name); start(); return true; } void JoystickInputDriver::close() { stopRequest=true; } const std::string & JoystickInputDriver::get_name() const { static std::string name = "JoystickInputDriver"; return name; } std::string JoystickInputDriver::get_info() const { return STR( get_name() << " " << (isOpen() ? "open" : "not open") << " " << "Name: " << name << " " << "Axis: " << (int) axes << " " << "Buttons: " << (int) buttons << " " ); } void JoystickInputDriver::setJoystickNr(std::string jnr) { this->nr=jnr; } openscad-2019.05/src/input/JoystickInputDriver.h0000644000076500000240000000344713437640540022207 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2015 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include "InputDriver.h" class JoystickInputDriver : public InputDriver { public: JoystickInputDriver(); ~JoystickInputDriver(); void run() override; bool open() override; void close() override; const std::string & get_name() const override; std::string get_info() const override; void setJoystickNr(std::string jnr); int getButtonCount() const override{ return buttons; } int getAxisCount() const override{ return axes; } private: int fd; int version; std::string nr{"0"}; unsigned char axes; unsigned char buttons; char name[1024]; volatile bool stopRequest; }; openscad-2019.05/src/input/QGamepadInputDriver.cc0000644000076500000240000001407613445047371022227 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2017 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "InputDriverManager.h" #include "QGamepadInputDriver.h" void QGamepadInputDriver::run() { } QGamepadInputDriver::QGamepadInputDriver() : gamepad(nullptr) { } QGamepadInputDriver::~QGamepadInputDriver() { } bool QGamepadInputDriver::open() { if (gamepad) { return false; } auto gamepads = QGamepadManager::instance()->connectedGamepads(); if (gamepads.isEmpty()) { return false; } this->gamepad.reset(new QGamepad(*gamepads.begin(), this)); connect(this->gamepad.get(), &QGamepad::axisLeftXChanged, this, [](double value){ InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(0, value)); }); connect(this->gamepad.get(), &QGamepad::axisLeftYChanged, this, [](double value){ InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(1, value)); }); connect(this->gamepad.get(), &QGamepad::axisRightXChanged, this, [](double value){ InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(2, value)); }); connect(this->gamepad.get(), &QGamepad::axisRightYChanged, this, [](double value){ InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(3, value)); }); connect(this->gamepad.get(), &QGamepad::buttonL2Changed, this, [](double value){ InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(4, value)); }); connect(this->gamepad.get(), &QGamepad::buttonR2Changed, this, [](double value){ InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(5, value)); }); connect(this->gamepad.get(), &QGamepad::buttonAChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(0, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonBChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(1, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonXChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(2, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonYChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(3, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonL1Changed, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(4, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonR1Changed, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(5, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonSelectChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(6, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonStartChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(7, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonL3Changed, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(8, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonR3Changed, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(9, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonCenterChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(10, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonUpChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(11, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonDownChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(12, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonLeftChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(13, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonRightChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(14, pressed)); }); connect(this->gamepad.get(), &QGamepad::buttonGuideChanged, this, [](bool pressed){ InputDriverManager::instance()->sendEvent(new InputEventButtonChanged(15, pressed)); }); return true; } void QGamepadInputDriver::close() { gamepad.reset(); } const std::string & QGamepadInputDriver::get_name() const { static std::string name = "QGamepadInputDriver"; return name; } bool QGamepadInputDriver::isOpen() const { return this->gamepad ? this->gamepad->isConnected() : false; } std::string QGamepadInputDriver::get_info() const { const auto status = isOpen() ? std::string{"connected: "} + this->gamepad->name().toUtf8().constData() : std::string{"not connected"}; return get_name() + " " + status; } openscad-2019.05/src/input/QGamepadInputDriver.h0000644000076500000240000000330613437640540022061 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2017 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include "InputDriver.h" #include #include class QGamepadInputDriver : public InputDriver { public: QGamepadInputDriver(); ~QGamepadInputDriver(); void run() override; bool open() override; void close() override; bool isOpen() const; const std::string & get_name() const override; std::string get_info() const override; int getButtonCount() const override{ return 16; } int getAxisCount() const override{ return 6; } private: std::unique_ptr gamepad; }; openscad-2019.05/src/input/SpaceNavInputDriver.cc0000644000076500000240000001366713437640540022253 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * Initial implementation by Jochen Kunz and Gert Menke provided as * Public Domain. */ #include "input/SpaceNavInputDriver.h" #include "input/InputDriverManager.h" #include #include SpaceNavInputDriver::SpaceNavInputDriver() { } SpaceNavInputDriver::~SpaceNavInputDriver() { } void SpaceNavInputDriver::run() { while (spnav_input()) { QThread::msleep(20); spnav_remove_events(SPNAV_EVENT_MOTION); } } /* * Handle events from the spacenavd daemon. The method blocks until at least * one event is available and then processes all events until the queue is * empty. */ bool SpaceNavInputDriver::spnav_input(void) { spnav_event ev; // The low level driver seems to inhibit events in the dead zone, so if we // enter that case, make sure to zero out our axis values. bool have_event = false; for (int a = 0;a < 3;a++) { if (spnav_poll_event(&ev) != 0) { have_event = true; break; } QThread::msleep(20); } if (!have_event) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(0, 0)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(1, 0)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(2, 0)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(3, 0)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(4, 0)); InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(5, 0)); if (spnav_wait_event(&ev) == 0) { return false; } } do { if (ev.type == SPNAV_EVENT_MOTION) { #ifdef DEBUG if ((ev.motion.x != 0) || (ev.motion.y != 0) || (ev.motion.z != 0)) { PRINTDB("Translate Event: x = %d, y = %d, z = %d", ev.motion.x % ev.motion.y % ev.motion.z); } if ((ev.motion.rx != 0) || (ev.motion.ry != 0) || (ev.motion.rz != 0)) { PRINTDB("Rotate Event: rx = %d, ry = %d, rz = %d", ev.motion.rx % ev.motion.ry % ev.motion.rz); } #endif if (this->dominantAxisOnly) { // dominant axis only int m=ev.motion.x; if (abs(m) < abs(ev.motion.y)) m=ev.motion.y; if (abs(m) < abs(ev.motion.z)) m=ev.motion.z; if (abs(m) < abs(ev.motion.rx)) m=ev.motion.rx; if (abs(m) < abs(ev.motion.ry)) m=ev.motion.ry; if (abs(m) < abs(ev.motion.rz)) m=ev.motion.rz; if (ev.motion.x == m) { ev.motion.y=0; ev.motion.z=0; ev.motion.rx=0; ev.motion.ry=0; ev.motion.rz=0; } if (ev.motion.y == m) { ev.motion.x=0; ev.motion.z=0; ev.motion.rx=0; ev.motion.ry=0; ev.motion.rz=0; } if (ev.motion.z == m) { ev.motion.x=0; ev.motion.y=0; ev.motion.rx=0; ev.motion.ry=0; ev.motion.rz=0; } if (ev.motion.rx== m) { ev.motion.x=0; ev.motion.y=0; ev.motion.z=0; ev.motion.ry=0; ev.motion.rz=0; } if (ev.motion.ry== m) { ev.motion.x=0; ev.motion.y=0; ev.motion.z=0; ev.motion.rx=0; ev.motion.rz=0; } if (ev.motion.rz== m) { ev.motion.x=0; ev.motion.y=0; ev.motion.z=0; ev.motion.rx=0; ev.motion.ry=0; } } if (ev.motion.x != 0) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(0, ev.motion.x / 500.0)); } if (ev.motion.y != 0) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(1, ev.motion.y / 500.0)); } if (ev.motion.z != 0) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(2, ev.motion.z / 500.0)); } if (ev.motion.rx != 0) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(3, ev.motion.rx / 500.0)); } if (ev.motion.ry != 0) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(4, ev.motion.ry / 500.0)); } if (ev.motion.rz != 0) { InputDriverManager::instance()->sendEvent(new InputEventAxisChanged(5, ev.motion.rz / 500.0)); } } else if (ev.type == SPNAV_EVENT_BUTTON) { PRINTDB("Button Event: num = %d, %s", ev.button.bnum % (ev.button.press ? "pressed" : "released")); InputEvent *event = new InputEventButtonChanged(ev.button.bnum, ev.button.press); InputDriverManager::instance()->sendEvent(event); } } while (spnav_poll_event(&ev)); return true; } bool SpaceNavInputDriver::open() { if (spnav_open() < 0) { return false; } start(); return true; } void SpaceNavInputDriver::close() { } void SpaceNavInputDriver::setDominantAxisOnly(bool var){ this->dominantAxisOnly = var; } const std::string & SpaceNavInputDriver::get_name() const { static std::string name = "SpaceNavInputDriver"; return name; } std::string SpaceNavInputDriver::get_info() const { return STR(get_name() << " " << (isOpen() ? "open" : "not open") << " "); } openscad-2019.05/src/input/SpaceNavInputDriver.h0000644000076500000240000000332013437640540022076 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include "input/InputDriver.h" class SpaceNavInputDriver : public InputDriver { Q_OBJECT public: SpaceNavInputDriver(); ~SpaceNavInputDriver(); void run() override; bool open() override; void close() override; void setDominantAxisOnly(bool var); const std::string & get_name() const override; std::string get_info() const override; int getButtonCount() const override{ return 16; }; int getAxisCount() const override{ return 6; }; private: bool spnav_input(); bool dominantAxisOnly{true}; }; openscad-2019.05/src/input/WheelIgnorer.cc0000644000076500000240000000042613402025764020733 0ustar kintelstaff00000000000000#include "WheelIgnorer.h" WheelIgnorer::WheelIgnorer(QWidget *parent) : QObject(parent) { } bool WheelIgnorer::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::Wheel){ return true; } return QObject::eventFilter(obj, event); } openscad-2019.05/src/input/WheelIgnorer.h0000644000076500000240000000161513402025764020576 0ustar kintelstaff00000000000000//This event filter ignores Mouse Wheel events. //A lot of elements in OpenSCAD are in Scroll Areas. //This causes a conflict, as some elements within the Scroll Areas are //also reacting to the mousewheel. //Especially in the settings, where the user might spend a considerable //amount of time to get it just right, it is annoying when simply //scrowling down unintentionally changes various settings. //for reference: //https://stackoverflow.com/questions/3241830/qt-how-to-disable-mouse-scrolling-of-qcombobox //https://stackoverflow.com/questions/5821802/qspinbox-inside-a-qscrollarea-how-to-prevent-spin-box-from-stealing-focus-when //http://doc.qt.io/archives/qt-4.8/qobject.html#installEventFilter #include #include class WheelIgnorer : public QObject { Q_OBJECT public: WheelIgnorer(QWidget *parent); protected: bool eventFilter(QObject *obj, QEvent *event); }; openscad-2019.05/src/launchingscreen.cc0000644000076500000240000001027213417146620020353 0ustar kintelstaff00000000000000#include #include #include "version.h" #include "launchingscreen.h" #include "ui_launchingscreen.h" #include "QSettingsCached.h" #include "UIUtils.h" LaunchingScreen *LaunchingScreen::inst = nullptr; LaunchingScreen *LaunchingScreen::getDialog() { return LaunchingScreen::inst; } // Called (possibly multiple times) by EventFilter on MacOS, e.g. // when the user opens files from Finder. void LaunchingScreen::openFile(const QString &filename) { QVariant v(filename); this->checkOpen(v); this->done(QDialog::Accepted); } LaunchingScreen::LaunchingScreen(QWidget *parent) : QDialog(parent) { LaunchingScreen::inst = this; setupUi(this); this->setStyleSheet("QDialog {background-image:url(':/icons/background.png')} QPushButton {color:white;}"); this->versionNumberLabel->setText("OpenSCAD " + QString::fromStdString(openscad_displayversionnumber)); QStringList recentFiles = UIUtils::recentFiles(); for (const auto& recentFile : recentFiles) { QFileInfo fileInfo(recentFile); auto item = new QListWidgetItem(fileInfo.fileName()); item->setData(Qt::ToolTipRole, fileInfo.canonicalPath()); item->setData(Qt::UserRole, fileInfo.canonicalFilePath()); this->recentList->addItem(item); } for (const auto &category : UIUtils::exampleCategories()) { auto examples = UIUtils::exampleFiles(category); auto categoryItem = new QTreeWidgetItem(QStringList(gettext(category.toStdString().c_str()))); for (const auto &example : examples) { auto exampleItem = new QTreeWidgetItem(QStringList(example.fileName())); exampleItem->setData(0, Qt::UserRole, example.canonicalFilePath()); categoryItem->addChild(exampleItem); } this->treeWidget->addTopLevelItem(categoryItem); } connect(this->pushButtonNew, SIGNAL(clicked()), this, SLOT(accept())); connect(this->pushButtonOpen, SIGNAL(clicked()), this, SLOT(openUserFile())); connect(this->pushButtonHelp, SIGNAL(clicked()), this, SLOT(openUserManualURL())); connect(this->recentList->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(enableRecentButton(const QModelIndex &, const QModelIndex &))); connect(this->recentList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(openRecent())); connect(this->treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(enableExampleButton(QTreeWidgetItem *, QTreeWidgetItem *))); connect(this->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *,int)), this, SLOT(openExample())); connect(this->openRecentButton, SIGNAL(clicked()), this, SLOT(openRecent())); connect(this->openExampleButton, SIGNAL(clicked()), this, SLOT(openExample())); connect(this->checkBox, SIGNAL(toggled(bool)), this, SLOT(checkboxState(bool))); } LaunchingScreen::~LaunchingScreen() { LaunchingScreen::inst = nullptr; } QStringList LaunchingScreen::selectedFiles() const { return this->files; } void LaunchingScreen::enableRecentButton(const QModelIndex &, const QModelIndex &) { this->openRecentButton->setEnabled(true); this->openRecentButton->setDefault(true); } void LaunchingScreen::openRecent() { QListWidgetItem *item = this->recentList->currentItem(); if (item == nullptr) { return; } checkOpen(item->data(Qt::UserRole)); } void LaunchingScreen::enableExampleButton(QTreeWidgetItem *current, QTreeWidgetItem *) { const bool enable = current->childCount() == 0; this->openExampleButton->setEnabled(enable); this->openExampleButton->setDefault(true); } void LaunchingScreen::openExample() { QTreeWidgetItem *item = this->treeWidget->currentItem(); if (item == nullptr) { return; } checkOpen(item->data(0, Qt::UserRole)); } void LaunchingScreen::checkOpen(const QVariant &data) { const QString path = data.toString(); if (path.isEmpty()) { return; } this->files.append(path); accept(); } void LaunchingScreen::openUserFile() { QFileInfo fileInfo = UIUtils::openFile(this); if (fileInfo.exists()) { this->files.append(fileInfo.canonicalFilePath()); accept(); } } void LaunchingScreen::checkboxState(bool state) const { QSettingsCached settings; settings.setValue("launcher/showOnStartup", !state); } void LaunchingScreen::openUserManualURL() const { UIUtils::openUserManualURL(); } openscad-2019.05/src/launchingscreen.h0000644000076500000240000000152413402025764020214 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "qtgettext.h" #include "ui_launchingscreen.h" class LaunchingScreen : public QDialog, public Ui::LaunchingScreen { Q_OBJECT public: static LaunchingScreen *getDialog(); explicit LaunchingScreen(QWidget *parent = nullptr); ~LaunchingScreen(); QStringList selectedFiles() const; public slots: void openFile(const QString &filename); private slots: void checkboxState(bool state) const; void enableRecentButton(const QModelIndex ¤t, const QModelIndex &previous); void enableExampleButton(QTreeWidgetItem *current, QTreeWidgetItem *previous); void openUserFile(); void openRecent(); void openExample(); void openUserManualURL() const; private: void checkOpen(const QVariant &data); QStringList files; static LaunchingScreen *inst; }; openscad-2019.05/src/launchingscreen.ui0000644000076500000240000002711513402025764020406 0ustar kintelstaff00000000000000 LaunchingScreen 0 0 620 418 600 0 Welcome to OpenSCAD :/icons/prefs3DView.png:/icons/prefs3DView.png true false 10 20 10 20 QPushButton { margin: 0; padding: 4px; color: white; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #82dd97, stop: 1 #2a833f); border-radius: 2px; } QPushButton:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #92eda7, stop: 1 #3a934f); } QPushButton:disabled { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dfdfdf, stop: 1 #aeaeae); } QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2a833f, stop: 1 #82dd97); } New true true QPushButton { margin: 0; padding: 4px; color: white; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #82dd97, stop: 1 #2a833f); border-radius: 2px; } QPushButton:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #92eda7, stop: 1 #3a934f); } QPushButton:disabled { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dfdfdf, stop: 1 #aeaeae); } QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2a833f, stop: 1 #82dd97); } Open true QPushButton { margin: 0; padding: 4px; color: white; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #82dd97, stop: 1 #2a833f); border-radius: 2px; } QPushButton:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #92eda7, stop: 1 #3a934f); } QPushButton:disabled { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dfdfdf, stop: 1 #aeaeae); } QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2a833f, stop: 1 #82dd97); } Help true Recents QListWidget { background-color:transparent; } false QPushButton { margin: 0; padding: 4px; color: white; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #82dd97, stop: 1 #2a833f); border-radius: 2px; } QPushButton:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #92eda7, stop: 1 #3a934f); } QPushButton:disabled { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dfdfdf, stop: 1 #aeaeae); } QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2a833f, stop: 1 #82dd97); } Open Recent true 10 20 10 20 Examples QTreeWidget { background-color:transparent; } false Examples false QPushButton { margin: 0; padding: 4px; color: white; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #82dd97, stop: 1 #2a833f); border-radius: 2px; } QPushButton:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #92eda7, stop: 1 #3a934f); } QPushButton:disabled { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dfdfdf, stop: 1 #aeaeae); } QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2a833f, stop: 1 #82dd97); } Open Example true 10 10 0 0 0 96 96 96 96 :/icons/openscad.png true 0 Qt::Horizontal QSizePolicy::Fixed 20 2 0 0 <html><head/><body> <p style="font-family: 'Open Sans', 'Droid Sans', 'sans-serif'; font-weight: bold; padding-bottom: 0; margin-bottom: 0; font-size: 22pt;"><span style="color: green;">Open</span>SCAD</p> <p style="font-family: 'Open Sans', 'Droid Sans', 'sans-serif'; font-weight: normal; font-size: 14pt; padding-top: 0; margin-top: 0; margin-left: 2em;">The Programmers Solid 3D CAD Modeller</p> </body></html> true false Don't show again false Qt::Horizontal 2 2 Version Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter openscad-2019.05/src/legacyeditor.cc0000755000076500000240000001736513402025764017672 0ustar kintelstaff00000000000000#include "legacyeditor.h" #include "Preferences.h" #include "highlighter.h" #include "QSettingsCached.h" LegacyEditor::LegacyEditor(QWidget *parent) : EditorInterface(parent) { QVBoxLayout *legacyeditorLayout = new QVBoxLayout(this); legacyeditorLayout->setContentsMargins(0, 0, 0, 0); this->textedit = new QTextEdit(this); legacyeditorLayout->addWidget(this->textedit); this->textedit->setAcceptRichText(false); // This needed to avoid the editor accepting filename drops as we want // to handle these ourselves in MainWindow this->textedit->setAcceptDrops(false); this->textedit->setWordWrapMode(QTextOption::WrapAnywhere); this->textedit->setTabStopWidth(30); this->highlighter = new Highlighter(this->textedit->document()); connect(this->textedit, SIGNAL(textChanged()), this, SIGNAL(contentsChanged())); connect(this->textedit->document(), SIGNAL(modificationChanged(bool)), this, SIGNAL(modificationChanged(bool))); } void LegacyEditor::indentSelection() { QTextCursor cursor = this->textedit->textCursor(); int p1 = cursor.selectionStart(); QString txt = cursor.selectedText(); txt.replace(QString(QChar(8233)), QString(QChar(8233)) + QString("\t")); if (txt.endsWith(QString(QChar(8233)) + QString("\t"))) txt.chop(1); txt = QString("\t") + txt; cursor.insertText(txt); int p2 = cursor.position(); cursor.setPosition(p1, QTextCursor::MoveAnchor); cursor.setPosition(p2, QTextCursor::KeepAnchor); this->textedit->setTextCursor(cursor); } void LegacyEditor::unindentSelection() { QTextCursor cursor = this->textedit->textCursor(); int p1 = cursor.selectionStart(); QString txt = cursor.selectedText(); txt.replace(QString(QChar(8233)) + QString("\t"), QString(QChar(8233))); if (txt.startsWith(QString("\t"))) txt.remove(0, 1); cursor.insertText(txt); int p2 = cursor.position(); cursor.setPosition(p1, QTextCursor::MoveAnchor); cursor.setPosition(p2, QTextCursor::KeepAnchor); this->textedit->setTextCursor(cursor); } void LegacyEditor::commentSelection() { QTextCursor cursor = this->textedit->textCursor(); int p1 = cursor.selectionStart(); QString txt = cursor.selectedText(); txt.replace(QString(QChar(8233)), QString(QChar(8233)) + QString("//")); if (txt.endsWith(QString(QChar(8233)) + QString("//"))) txt.chop(2); txt = QString("//") + txt; cursor.insertText(txt); int p2 = cursor.position(); cursor.setPosition(p1, QTextCursor::MoveAnchor); cursor.setPosition(p2, QTextCursor::KeepAnchor); this->textedit->setTextCursor(cursor); } void LegacyEditor::uncommentSelection() { QTextCursor cursor = this->textedit->textCursor(); int p1 = cursor.selectionStart(); QString txt = cursor.selectedText(); txt.replace(QString(QChar(8233)) + QString("//"), QString(QChar(8233))); if (txt.startsWith(QString("//"))) txt.remove(0, 2); cursor.insertText(txt); int p2 = cursor.position(); cursor.setPosition(p1, QTextCursor::MoveAnchor); cursor.setPosition(p2, QTextCursor::KeepAnchor); this->textedit->setTextCursor(cursor); } void LegacyEditor::zoomIn() { // See also QT's implementation in QLegacyEditor.cpp QSettingsCached settings; QFont tmp_font = this->textedit->font() ; if (font().pointSize() >= 1) tmp_font.setPointSize(1 + font().pointSize()); else tmp_font.setPointSize(1); settings.setValue("editor/fontsize", tmp_font.pointSize()); this->textedit->setFont(tmp_font); } void LegacyEditor::zoomOut() { QSettingsCached settings; QFont tmp_font = this->textedit->font(); if (font().pointSize() >= 2) tmp_font.setPointSize(-1 + font().pointSize()); else tmp_font.setPointSize(1); settings.setValue("editor/fontsize", tmp_font.pointSize()); this->textedit->setFont(tmp_font); } void LegacyEditor::setPlainText(const QString &text) { int y = this->textedit->verticalScrollBar()->sliderPosition(); // Save current cursor position QTextCursor cursor = this->textedit->textCursor(); int n = cursor.position(); this->textedit->setPlainText(text); // Restore cursor position if (n < text.length()) { cursor.setPosition(n); this->textedit->setTextCursor(cursor); this->textedit->verticalScrollBar()->setSliderPosition(y); } } void LegacyEditor::highlightError(int error_pos) { highlighter->highlightError(error_pos); QTextCursor cursor = this->textedit->textCursor(); cursor.setPosition(error_pos); this->textedit->setTextCursor(cursor); } void LegacyEditor::unhighlightLastError() { highlighter->unhighlightLastError(); } void LegacyEditor::setHighlightScheme(const QString &name) { highlighter->assignFormatsToTokens(name); highlighter->rehighlight(); // slow on large files } QSize LegacyEditor::sizeHint() const { if (initialSizeHint.width() <= 0) { return this->textedit->sizeHint(); } else { return initialSizeHint; } } void LegacyEditor::setInitialSizeHint(const QSize &size) { initialSizeHint = size; } QString LegacyEditor::toPlainText() { return this->textedit->toPlainText(); } void LegacyEditor::insert(const QString &text) { this->textedit->insertPlainText(text); } void LegacyEditor::setText(const QString &text) { this->textedit->selectAll(); this->textedit->insertPlainText(text); } bool LegacyEditor::canUndo() { return (this->textedit->document()->availableUndoSteps() != 0); } void LegacyEditor::undo() { this->textedit->undo(); } void LegacyEditor::redo() { this->textedit->redo(); } void LegacyEditor::cut() { this->textedit->cut(); } void LegacyEditor::copy() { this->textedit->copy(); } void LegacyEditor::paste() { this->textedit->paste(); } LegacyEditor::~LegacyEditor() { delete highlighter; } void LegacyEditor::replaceSelectedText(const QString &newText) { QTextCursor cursor = this->textedit->textCursor(); if (cursor.selectedText() != newText) { cursor.insertText(newText); } } void LegacyEditor::replaceAll(const QString &findText, const QString &replaceText) { QTextCursor cursor(this->textedit->textCursor()); cursor.setPosition(0); this->textedit->setTextCursor(cursor); this->textedit->find(findText); while (this->textedit->textCursor().hasSelection()){ this->textedit->textCursor().insertText(replaceText); this->textedit->find(findText); } } bool LegacyEditor::findString(const QString & exp, bool findBackwards) const { return this->textedit->find(exp, findBackwards ? QTextDocument::FindBackward : QTextDocument::FindFlags(nullptr)); } int LegacyEditor::updateFindIndicators(const QString & /*findText*/, bool /*visibility*/)//incomplete-place-holder { int findwordcount = 0; // blank see scintillaeditor.cpp return findwordcount; } bool LegacyEditor::find(const QString &newText, bool /*findNext*/, bool findBackwards) { bool success = this->findString(newText, findBackwards); if (!success) { // Implement wrap-around search behavior QTextCursor old_cursor = this->textedit->textCursor(); QTextCursor tmp_cursor = old_cursor; tmp_cursor.movePosition(findBackwards ? QTextCursor::End : QTextCursor::Start); this->textedit->setTextCursor(tmp_cursor); bool success = this->findString(newText, findBackwards); if (!success) { this->textedit->setTextCursor(old_cursor); } return success; } return true; } void LegacyEditor::initFont(const QString& family, uint size) { QFont font; if (!family.isEmpty()) font.setFamily(family); else font.setFixedPitch(true); if (size > 0) font.setPointSize(size); font.setStyleHint(QFont::TypeWriter); this->textedit->setFont(font); } QString LegacyEditor::selectedText() { return textedit->textCursor().selectedText(); } void LegacyEditor::setContentModified(bool y) { this->textedit->document()->setModified(y); } bool LegacyEditor::isContentModified() { return textedit->document()->isModified(); } QStringList LegacyEditor::colorSchemes() { QStringList colorSchemes; colorSchemes << "For Light Background" << "For Dark Background" << "Off"; return colorSchemes; } openscad-2019.05/src/legacyeditor.h0000644000076500000240000000301513402025764017514 0ustar kintelstaff00000000000000#pragma once #include "editor.h" class LegacyEditor : public EditorInterface { Q_OBJECT public: LegacyEditor(class QWidget *parent); ~LegacyEditor(); QSize sizeHint() const override; void setInitialSizeHint(const QSize&) override; QString toPlainText() override; QString selectedText() override; int updateFindIndicators(const QString &findText, bool visibility = true) override; bool find(const QString &, bool findNext = false, bool findBackwards = false) override; void replaceSelectedText(const QString &newText) override; void replaceAll(const QString &findText, const QString &replaceText) override; bool findString(const QString & exp, bool findBackwards) const; QStringList colorSchemes() override; bool canUndo() override; public slots: void zoomIn() override; void zoomOut() override; void setContentModified(bool) override; bool isContentModified() override; void indentSelection() override; void unindentSelection() override; void commentSelection() override; void uncommentSelection() override; void setPlainText(const QString&) override; void highlightError(int) override; void unhighlightLastError() override; void setHighlightScheme(const QString&) override; void insert(const QString&) override; void setText(const QString&) override; void undo() override; void redo() override; void cut() override; void copy() override; void paste() override; void initFont(const QString&, uint) override; private: class QTextEdit *textedit; class Highlighter *highlighter; QSize initialSizeHint; }; openscad-2019.05/src/lexer.l0000644000076500000240000002310713441031431016157 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ %option prefix="lexer" %{ #include #include "handle_dep.h" #include "printutils.h" #include "parsersettings.h" #include "Assignment.h" #include "parser.hxx" #include "FileModule.h" #include #include #include namespace fs = boost::filesystem; //isatty for visual c++ and mingw-cross-env #if defined __WIN32__ && ! defined _MSC_VER #include "unistd.h" #endif #if defined __WIN32__ || defined _MSC_VER extern "C" int __cdecl _isatty(int _FileHandle); #define isatty _isatty #define strdup _strdup #define fileno _fileno #endif std::string stringcontents; int lexerget_lineno(void); #ifdef __GNUC__ static void yyunput(int, char*) __attribute__((unused)); #endif extern const char *parser_input_buffer; extern FileModule *rootmodule; #define YY_INPUT(buf,result,max_size) { \ if (yyin && yyin != stdin) { \ int c = fgetc(yyin); \ if (c >= 0) { \ result = 1; \ buf[0] = c; \ } else { \ result = YY_NULL; \ } \ } else { \ if (*parser_input_buffer) { \ result = 1; \ buf[0] = *(parser_input_buffer++); \ parser_error_pos++; \ } else { \ result = YY_NULL; \ } \ } \ } /* Handle locations. Note: Since flex doesn't handle column numbers, we deal with those manually. The yycolumn is manually reset for each encountered newline. */ extern YYLTYPE parserlloc; int yycolumn = 1; #define YY_USER_ACTION { \ parserlloc.first_line = yylineno; \ parserlloc.first_column = yycolumn; \ yycolumn = yycolumn + yyleng; \ parserlloc.last_column = yycolumn; \ parserlloc.last_line = yylineno; \ } extern void parsererror(char const *s); void to_utf8(const char *, char *); void includefile(); std::shared_ptr sourcefile(); std::shared_ptr parser_sourcefile; std::vector> filename_stack; std::vector lineno_stack; std::vector openfiles; std::vector openfilenames; std::string filename; std::string filepath; %} %option yylineno %option noyywrap %x cond_comment cond_lcomment cond_string %x cond_include %x cond_use D [0-9] E [Ee][+-]?{D}+ H [0-9a-fA-F] U [\x80-\xbf] U2 [\xc2-\xdf] U3 [\xe0-\xef] U4 [\xf0-\xf4] UNICODE {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} %% include[ \t\r\n]*"<" { BEGIN(cond_include); filepath = filename = ""; } { [^\t\r\n>]*"/" { filepath = yytext; } [^\t\r\n>/]+ { filename = yytext; } ">" { BEGIN(INITIAL); includefile(); } <> { parsererror("Unterminated include statement"); return TOK_ERROR; } } use[ \t\r\n]*"<" { BEGIN(cond_use); } { [^\t\r\n>]+ { filename = yytext; } ">" { BEGIN(INITIAL); fs::path fullpath = find_valid_path(sourcefile()->parent_path(), fs::path(filename), &openfilenames); if (fullpath.empty()) { PRINTB("WARNING: Can't open library '%s'.", filename); parserlval.text = strdup(filename.c_str()); } else { auto used_path = fullpath.generic_string(); handle_dep(used_path); parserlval.text = strdup(used_path.c_str()); } return TOK_USE; } <> { parsererror("Unterminated use statement"); return TOK_ERROR; } } \" { BEGIN(cond_string); stringcontents.clear(); } { \\n { stringcontents += '\n'; } \\t { stringcontents += '\t'; } \\r { stringcontents += '\r'; } \\\\ { stringcontents += '\\'; } \\\" { stringcontents += '"'; } {UNICODE} { parser_error_pos -= strlen(lexertext) - 1; stringcontents += lexertext; } \\x[0-7]{H} { unsigned long i = strtoul(lexertext + 2, NULL, 16); stringcontents += (i == 0 ? ' ' : (unsigned char)(i & 0xff)); } \\u{H}{4}|\\U{H}{6} { char buf[8]; to_utf8(lexertext + 2, buf); stringcontents += buf; } [^\\\n\"] { stringcontents += lexertext; } [\n\r] { yycolumn = 1; } \" { BEGIN(INITIAL); parserlval.text = strdup(stringcontents.c_str()); return TOK_STRING; } <> { parsererror("Unterminated string"); return TOK_ERROR; } } [\t ] /* whitespace */ [\n\r] \/\/ BEGIN(cond_lcomment); { \n { BEGIN(INITIAL); yycolumn = 1; } {UNICODE} { parser_error_pos -= strlen(lexertext) - 1; } [^\n] } "/*" BEGIN(cond_comment); { "*/" { BEGIN(INITIAL); } {UNICODE} { parser_error_pos -= strlen(lexertext) - 1; } .|\n <> { parsererror("Unterminated comment"); return TOK_ERROR; } } <> { if (!filename_stack.empty()) filename_stack.pop_back(); if (!lineno_stack.empty()) { yylineno = lineno_stack.back(); lineno_stack.pop_back(); } if (yyin && yyin != stdin) { assert(!openfiles.empty()); fclose(openfiles.back()); openfiles.pop_back(); openfilenames.pop_back(); } yypop_buffer_state(); if (!YY_CURRENT_BUFFER) yyterminate(); } "\x03" return TOK_EOT; "module" return TOK_MODULE; "function" return TOK_FUNCTION; "if" return TOK_IF; "else" return TOK_ELSE; "let" return TOK_LET; "assert" return TOK_ASSERT; "echo" return TOK_ECHO; "for" return TOK_FOR; "each" return TOK_EACH; "true" return TOK_TRUE; "false" return TOK_FALSE; "undef" return TOK_UNDEF; %{/* U+00A0 (UTF-8 encoded: C2A0) is no-break space. We support it since Qt's QTextEdit automatically converts these to spaces and we want to be able to process the same files on the cmd-line as in the editor. */%} [\xc2\xa0]+ {UNICODE}+ { parser_error_pos -= strlen(yytext); return TOK_ERROR; } {D}+{E}? | {D}*\.{D}+{E}? | {D}+\.{D}*{E}? { try { parserlval.number = boost::lexical_cast(yytext); return TOK_NUMBER; } catch (boost::bad_lexical_cast&) {} } "$"?[a-zA-Z0-9_]+ { parserlval.text = strdup(yytext); return TOK_ID; } "<=" return LE; ">=" return GE; "==" return EQ; "!=" return NE; "&&" return AND; "||" return OR; . { return yytext[0]; } %% /*! * Convert unicode codepoint given in hex notation * into UTF8 encoding. The output buffer must be 8 * characters long. */ void to_utf8(const char *str, char *out) { memset(out, 0, 8); const gunichar c = strtoul(str, NULL, 16); if (g_unichar_validate(c) && (c != 0)) { g_unichar_to_utf8(c, out); } else { out[0] = ' '; } } void lexer_set_parser_sourcefile(const fs::path& path) { parser_sourcefile = std::make_shared(path); } // Filename of the source file currently being lexed. std::shared_ptr sourcefile() { if (!filename_stack.empty()) return filename_stack.back(); return parser_sourcefile; } /* Rules for include 1) include 2) include Globals used: filepath, sourcefile, filename */ void includefile() { fs::path localpath = fs::path(filepath) / filename; fs::path fullpath = find_valid_path(sourcefile()->parent_path(), localpath, &openfilenames); if (!fullpath.empty()) { rootmodule->registerInclude(localpath.generic_string(), fullpath.generic_string()); } else { rootmodule->registerInclude(localpath.generic_string(), localpath.generic_string()); PRINTB("WARNING: Can't open include file '%s'.", localpath.generic_string()); return; }; std::string fullname = fullpath.generic_string(); filepath.clear(); filename_stack.push_back(std::make_shared(fullpath)); handle_dep(fullname); yyin = fopen(fullname.c_str(), "r"); if (!yyin) { PRINTB("WARNING: Can't open include file '%s'.", localpath.generic_string()); filename_stack.pop_back(); return; } lineno_stack.push_back(yylineno); yylineno = 1; openfiles.push_back(yyin); openfilenames.push_back(fullname); filename.clear(); yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE)); } /*! In case of an error, this will make sure we clean up our custom data structures and close all files. */ void lexerdestroy() { for (auto f : openfiles) fclose(f); openfiles.clear(); openfilenames.clear(); filename_stack.clear(); lineno_stack.clear(); } openscad-2019.05/src/libsvg/LICENSE0000644000076500000240000000313113423115164017157 0ustar kintelstaff00000000000000============================================================================== This is libsvg, a library for extracting geometry information from SVG files. The code is currently part of OpenSCAD, but all the code in the libsvg folder is subject to a separate license "The MIT License" as given below. ------------------------------------------------------------------------------ The MIT License Copyright (c) 2016-2018, Torsten Paul , Marius Kintel 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. ============================================================================== openscad-2019.05/src/libsvg/circle.cc0000644000076500000240000000346013423115164017727 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "circle.h" namespace libsvg { const std::string circle::name("circle"); circle::circle() : r(0) { } circle::~circle() { } void circle::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->x = parse_double(attrs["cx"]); this->y = parse_double(attrs["cy"]); this->r = parse_double(attrs["r"]); path_t path; draw_ellipse(path, get_x(), get_y(), get_radius(), get_radius()); path_list.push_back(path); } const std::string circle::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y << ": r = " << this->r; return s.str(); } }openscad-2019.05/src/libsvg/circle.h0000644000076500000240000000314513423115164017571 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class circle : public shape { protected: double r; public: circle(); ~circle(); double get_radius() const { return r; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return circle::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/data.cc0000644000076500000240000000306013423115164017373 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "data.h" namespace libsvg { const std::string data::name("data"); data::data() { } data::~data() { } void data::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->text = attrs["text"]; } const std::string data::dump() const { std::stringstream s; s << get_name() << ": text = '" << this->text << "'"; return s.str(); } }openscad-2019.05/src/libsvg/data.h0000644000076500000240000000316213423115164017240 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class data : public shape { private: std::string text; public: data(); ~data(); const std::string& get_text() const { return text; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return data::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/ellipse.cc0000644000076500000240000000366413423115164020131 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "ellipse.h" namespace libsvg { const std::string ellipse::name("ellipse"); ellipse::ellipse() : rx(0), ry(0) { } ellipse::~ellipse() { } void ellipse::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->x = parse_double(attrs["cx"]); this->y = parse_double(attrs["cy"]); this->rx = parse_double(attrs["rx"]); this->ry = parse_double(attrs["ry"]); path_t path; draw_ellipse(path, get_x(), get_y(), get_radius_x(), get_radius_y()); path_list.push_back(path); } const std::string ellipse::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y << ": rx = " << this->rx << ": ry = " << this->ry; return s.str(); } }openscad-2019.05/src/libsvg/ellipse.h0000644000076500000240000000325713423115164017771 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class ellipse : public shape { protected: double rx; double ry; public: ellipse(); ~ellipse(); double get_radius_x() const { return rx; } double get_radius_y() const { return ry; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return ellipse::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/group.cc0000644000076500000240000000311413423115164017616 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "group.h" namespace libsvg { const std::string group::name("g"); group::group() { } group::~group() { } void group::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); } const std::string group::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y; return s.str(); } }openscad-2019.05/src/libsvg/group.h0000644000076500000240000000314313423115164017462 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class group : public shape { protected: public: group(); ~group(); bool is_container() const override { return true; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return group::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/libsvg.cc0000644000076500000240000001250713423115164017756 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include "libsvg.h" #include "shape.h" #include "circle.h" #include "ellipse.h" #include "line.h" #include "polygon.h" #include "polyline.h" #include "rect.h" namespace fs = boost::filesystem; namespace libsvg { #define SVG_DEBUG 0 static bool in_defs = false; static shapes_list_t stack; static shapes_list_t *shape_list; #if SVG_DEBUG static std::string dump_stack() { bool first = true; std::stringstream s; s << "["; for (const auto &shape : stack) { s << (first ? "" : "|") << shape->get_name(); first = false; } return s.str() + "]"; } #endif attr_map_t read_attributes(xmlTextReaderPtr reader) { attr_map_t attrs; int attr_count = xmlTextReaderAttributeCount(reader); for (int idx = 0;idx < attr_count;idx++) { xmlTextReaderMoveToAttributeNo(reader, idx); const char *name = reinterpret_cast (xmlTextReaderName(reader)); const char *value = reinterpret_cast (xmlTextReaderValue(reader)); attrs[name] = value; } return attrs; } void processNode(xmlTextReaderPtr reader) { const char *name = reinterpret_cast (xmlTextReaderName(reader)); if (name == nullptr) name = reinterpret_cast (xmlStrdup(BAD_CAST "--")); bool isEmpty; xmlChar *value = xmlTextReaderValue(reader); int node_type = xmlTextReaderNodeType(reader); switch (node_type) { case XML_READER_TYPE_ELEMENT: isEmpty = xmlTextReaderIsEmptyElement(reader); { #if SVG_DEBUG printf("XML_READER_TYPE_ELEMENT (%s %s): %d %d %s\n", dump_stack().c_str(), name, xmlTextReaderDepth(reader), xmlTextReaderNodeType(reader), value); #endif if (std::string("defs") == name) { in_defs = true; } auto s = shared_ptr(shape::create_from_name(name)); if (!in_defs && s) { attr_map_t attrs = read_attributes(reader); s->set_attrs(attrs); shape_list->push_back(s); if (!stack.empty()) { stack.back()->add_child(s.get()); } if (s->is_container()) { stack.push_back(s); } s->apply_transform(); } } if (!isEmpty) { break; } /* fall through */ case XML_READER_TYPE_END_ELEMENT: { if (std::string("defs") == name) { in_defs = false; } if (in_defs) { return; } if (std::string("g") == name) { stack.pop_back(); } else if (std::string("tspan") == name) { stack.pop_back(); } else if (std::string("text") == name) { stack.pop_back(); } #if SVG_DEBUG printf("XML_READER_TYPE_END_ELEMENT (%s %s): %d %d %s\n", dump_stack().c_str(), name, xmlTextReaderDepth(reader), xmlTextReaderNodeType(reader), value); #endif } break; case XML_READER_TYPE_TEXT: { attr_map_t attrs; attrs["text"] = reinterpret_cast(value); auto s = shared_ptr(shape::create_from_name("data")); s->set_attrs(attrs); shape_list->push_back(s); if (!stack.empty()) { stack.back()->add_child(s.get()); } } break; } xmlFree(value); xmlFree((void *) (name)); } int streamFile(const char *filename) { xmlTextReaderPtr reader; in_defs = false; reader = xmlNewTextReaderFilename(filename); xmlTextReaderSetParserProp(reader, XML_PARSER_SUBST_ENTITIES, 1); if (reader != nullptr) { int ret = xmlTextReaderRead(reader); while (ret == 1) { processNode(reader); ret = xmlTextReaderRead(reader); } xmlFreeTextReader(reader); if (ret != 0) { throw SvgException((boost::format("Error parsing file '%1%'") % filename).str()); } } else { throw SvgException((boost::format("Can't open file '%1%'") % filename).str()); } return 0; } void dump(int idx, shape *s) { for (int a = 0;a < idx;a++) { std::cout << " "; } std::cout << "=> " << s->dump() << std::endl; for (const auto& c : s->get_children()) { dump(idx + 1, c); } } shapes_list_t * libsvg_read_file(const char *filename) { shape_list = new shapes_list_t(); streamFile(filename); //#ifdef DEBUG // if (!shape_list->empty()) { // dump(0, shape_list->front().get()); // } //#endif return shape_list; } void libsvg_free(shapes_list_t *shapes) { delete shapes; } } openscad-2019.05/src/libsvg/libsvg.h0000644000076500000240000000344613423115164017622 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" #include "rect.h" #include "path.h" #include "svgpage.h" #include "memory.h" namespace libsvg { class SvgException: public std::exception { public: SvgException(const std::string& message) : message(message) { } virtual ~SvgException() {} const char* what() const throw() override { return message.c_str(); } private: std::string message; }; using shapes_list_t = std::vector>; shapes_list_t * libsvg_read_file(const char *filename); void libsvg_free(shapes_list_t *shapes); } openscad-2019.05/src/libsvg/line.cc0000644000076500000240000000366113423115164017420 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "line.h" namespace libsvg { const std::string line::name("line"); line::line() : x2(0), y2(0) { } line::~line() { } void line::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->x = parse_double(attrs["x1"]); this->y = parse_double(attrs["y1"]); this->x2 = parse_double(attrs["x2"]); this->y2 = parse_double(attrs["y2"]); path_t path; path.push_back(Eigen::Vector3d(x, y, 0)); path.push_back(Eigen::Vector3d(x2, y2, 0)); offset_path(path_list, path, get_stroke_width(), get_stroke_linecap()); } const std::string line::dump() const { std::stringstream s; s << get_name() << ": x1 = " << this->x << ": y1 = " << this->y << ": x2 = " << this->x2 << ": y2 = " << this->y2; return s.str(); } }openscad-2019.05/src/libsvg/line.h0000644000076500000240000000322113423115164017252 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class line : public shape { private: double x2; double y2; public: line(); ~line(); double get_x2() const { return x2; } double get_y2() const { return y2; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return line::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/path.cc0000644000076500000240000003123613423115164017424 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include "path.h" #include "degree_trig.h" namespace libsvg { using tokenizer = boost::tokenizer >; const std::string path::name("path"); /* PATHSEG_CLOSEPATH z PATHSEG_MOVETO_ABS M PATHSEG_MOVETO_REL m PATHSEG_LINETO_ABS L PATHSEG_LINETO_REL l PATHSEG_CURVETO_CUBIC_ABS C PATHSEG_CURVETO_CUBIC_REL c PATHSEG_CURVETO_QUADRATIC_ABS Q PATHSEG_CURVETO_QUADRATIC_REL q PATHSEG_ARC_ABS A PATHSEG_ARC_REL a PATHSEG_LINETO_HORIZONTAL_ABS H PATHSEG_LINETO_HORIZONTAL_REL h PATHSEG_LINETO_VERTICAL_ABS V PATHSEG_LINETO_VERTICAL_REL v PATHSEG_CURVETO_CUBIC_SMOOTH_ABS S PATHSEG_CURVETO_CUBIC_SMOOTH_REL s PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS T PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL t */ path::path() { } path::~path() { } static double vector_angle(double ux, double uy, double vx, double vy) { double angle = atan2_degrees(vy, vx) - atan2_degrees(uy, ux); if (angle < 0) { angle += 360; } return angle; } void path::arc_to(path_t& path, double x1, double y1, double rx, double ry, double x2, double y2, double angle, bool large, bool sweep) { // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes // (F.6.5.1)) double cos_rad = cos_degrees(angle); double sin_rad = sin_degrees(angle); double dx = (x1 - x2) / 2; double dy = (y1 - y2) / 2; double x1_ = cos_rad * dx + sin_rad * dy; double y1_ = -sin_rad * dx + cos_rad * dy; double d = (x1_ * x1_) / (rx * rx) + (y1_ * y1_) / (ry * ry); if (d > 1) { rx = std::fabs(std::sqrt(d) * rx); ry = std::fabs(std::sqrt(d) * ry); } // F.6.5.2 double t1 = rx * rx * ry * ry - rx * rx * y1_ * y1_ - ry * ry * x1_ * x1_; double t2 = rx * rx * y1_ * y1_ + ry * ry * x1_ * x1_; if (t1 < 0) { t1 = 0; } double t3 = std::sqrt(t1 / t2); if (large == sweep) { t3 = -t3; } double cx_ = t3 * rx * y1_ / ry; double cy_ = t3 * -ry * x1_ / rx; // F.6.5.3 double cx = cos_rad * cx_ - sin_rad * cy_ + (x1 + x2) / 2.0; double cy = sin_rad * cx_ + cos_rad * cy_ + (y1 + y2) / 2.0; // F.6.5.4 double ux = (x1_ - cx_) / rx; double uy = (y1_ - cy_) / ry; double vx = (-x1_ - cx_) / rx; double vy = (-y1_ - cy_) / ry; double theta = vector_angle(1, 0, ux, uy); double delta = vector_angle(ux, uy, vx, vy); if (!sweep) { delta -= 360; } int steps = std::fabs(delta) * 10.0 / 180 + 4; for (int a = 0;a <= steps;a++) { double phi = theta + delta * a / steps; double xx = cos_rad * cos_degrees(phi) * rx - sin_rad * sin_degrees(phi) * ry; double yy = sin_rad * cos_degrees(phi) * rx + cos_rad * sin_degrees(phi) * ry; path.push_back(Eigen::Vector3d(xx + cx, yy + cy, 0)); } } void path::curve_to(path_t& path, double x, double y, double cx1, double cy1, double x2, double y2) { unsigned long fn = 20; for (unsigned long idx = 1;idx <= fn;idx++) { const double a = idx * (1.0 / (double)fn); const double xx = x * t(a, 2) + cx1 * 2 * t(a, 1) * a + x2 * a * a; const double yy = y * t(a, 2) + cy1 * 2 * t(a, 1) * a + y2 * a * a; path.push_back(Eigen::Vector3d(xx, yy, 0)); } } void path::curve_to(path_t& path, double x, double y, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { unsigned long fn = 20; for (unsigned long idx = 1;idx <= fn;idx++) { const double a = idx * (1.0 / (double)fn); const double xx = x * t(a, 3) + cx1 * 3 * t(a, 2) * a + cx2 * 3 * t(a, 1) * a * a + x2 * a * a * a; const double yy = y * t(a, 3) + cy1 * 3 * t(a, 2) * a + cy2 * 3 * t(a, 1) * a * a + y2 * a * a * a; path.push_back(Eigen::Vector3d(xx, yy, 0)); } } /** * Workaround for parsing ",1-23.16.88" where the number split * happens implicitly at the dot. */ static std::vector split_dots(const std::string& str) { std::vector result; const size_t n = std::count(str.begin(), str.end(), '.'); if (n < 2) { result.push_back(str); return result; } boost::char_separator sep("", "."); tokenizer tokens(str, sep); std::string text; bool dot_seen = false; for (const auto& token : tokens) { text += token; if (token == ".") { dot_seen = true; continue; } else if (dot_seen == true) { result.push_back(text); text.clear(); } } return result; } void path::set_attrs(attr_map_t& attrs) { std::string commands = "-zmlcqahvstZMLCQAHVST"; shape::set_attrs(attrs); this->data = attrs["d"]; boost::char_separator sep(" ,", commands.c_str()); tokenizer tokens(this->data, sep); std::vector path_tokens; for (const auto& token : tokens) { const std::vector parts = split_dots(token); path_tokens.insert(path_tokens.end(), parts.begin(), parts.end()); } double x = 0; double y = 0; double xx = 0; double yy = 0; double rx = 0; double ry = 0; double cx1 = 0; double cy1 = 0; double cx2 = 0; double cy2 = 0; double angle = 0; bool large = false; bool sweep = false; bool last_cmd_cubic_bezier = false; bool last_cmd_quadratic_bezier = false; char cmd = ' '; int point = 0; bool negate = false; bool path_closed = false; std::string exp; path_list.push_back(path_t()); for (const auto& v : path_tokens) { double p = 0; if ((v.length() == 1) && (commands.find(v) != std::string::npos)) { if (v[0] == '-') { negate = true; continue; } point = -1; cmd = v[0]; } else { if (*v.rbegin() == 'e') { exp = negate ? std::string("-") + v : v; negate = false; continue; } if (exp.empty()) { p = parse_double(v); p = negate ? -p : p; } else { p = parse_double(exp + (negate ? "-" : "") + v); exp = ""; } negate = false; } switch (cmd) { case 'a': case 'A': //(rx ry x-axis-rotation large-arc-flag sweep-flag x y) switch (point) { case 0: rx = std::fabs(p); break; case 1: ry = std::fabs(p); break; case 2: angle = p; break; case 3: large = p > 0.5; break; case 4: sweep = p > 0.5; break; case 5: xx = cmd == 'a' ? x + p : p; break; case 6: yy = cmd == 'a' ? y + p : p; arc_to(path_list.back(), x, y, rx, ry, xx, yy, angle, large, sweep); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = false; break; } break; case 'l': case 'L': switch (point) { case 0: xx = cmd == 'l' ? x + p : p; break; case 1: yy = cmd == 'l' ? y + p : p; path_list.back().push_back(Eigen::Vector3d(xx, yy, 0)); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = false; break; } break; case 'c': case 'C': switch (point) { case 0: cx1 = p; break; case 1: cy1 = p; break; case 2: cx2 = p; break; case 3: cy2 = p; break; case 4: xx = cmd == 'c' ? x + p : p; break; case 5: yy = cmd == 'c' ? y + p : p; cx1 = cmd == 'c' ? x + cx1 : cx1; cy1 = cmd == 'c' ? y + cy1 : cy1; cx2 = cmd == 'c' ? x + cx2 : cx2; cy2 = cmd == 'c' ? y + cy2 : cy2; curve_to(path_list.back(), x, y, cx1, cy1, cx2, cy2, xx, yy); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = true; last_cmd_quadratic_bezier = false; break; } break; case 's': case 'S': switch (point) { case 0: if (last_cmd_cubic_bezier) { Eigen::Vector2d old_control_point(cx2, cy2); Eigen::Vector2d current_point(x, y); Eigen::Vector2d new_control_point = current_point + (current_point - old_control_point); cx1 = new_control_point.x(); cy1 = new_control_point.y(); } else { cx1 = x; cy1 = y; } cx2 = p; break; case 1: cy2 = p; break; case 2: xx = cmd == 's' ? x + p : p; break; case 3: yy = cmd == 's' ? y + p : p; cx2 = cmd == 's' ? x + cx2 : cx2; cy2 = cmd == 's' ? y + cy2 : cy2; curve_to(path_list.back(), x, y, cx1, cy1, cx2, cy2, xx, yy); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = true; last_cmd_quadratic_bezier = false; break; } break; case 'q': case 'Q': switch (point) { case 0: cx1 = p; break; case 1: cy1 = p; break; case 2: xx = cmd == 'q' ? x + p : p; break; case 3: yy = cmd == 'q' ? y + p : p; cx1 = cmd == 'q' ? x + cx1 : cx1; cy1 = cmd == 'q' ? y + cy1 : cy1; curve_to(path_list.back(), x, y, cx1, cy1, xx, yy); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = true; break; } break; case 't': case 'T': switch (point) { case 0: if (last_cmd_quadratic_bezier) { Eigen::Vector2d old_control_point(cx1, cy1); Eigen::Vector2d current_point(x, y); Eigen::Vector2d new_control_point = current_point + (current_point - old_control_point); cx1 = new_control_point.x(); cy1 = new_control_point.y(); } else { cx1 = x; cy1 = y; } xx = cmd == 't' ? x + p : p; break; case 1: yy = cmd == 't' ? y + p : p; curve_to(path_list.back(), x, y, cx1, cy1, xx, yy); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = true; break; } break; case 'm': case 'M': switch (point) { case 0: xx = cmd == 'm' ? x + p : p; break; case 1: yy = cmd == 'm' ? y + p : p; cmd = cmd == 'm' ? 'l' : 'L'; path_t path = path_list.back(); if (!path_list.back().empty()) { if (is_open_path(path)) { path_list.pop_back(); offset_path(path_list, path, get_stroke_width(), get_stroke_linecap()); } path_list.push_back(path_t()); } path_list.back().push_back(Eigen::Vector3d(xx, yy, 0)); x = xx; y = yy; point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = false; } break; case 'v': case 'V': switch (point) { case 0: y = cmd == 'v' ? y + p : p; path_list.back().push_back(Eigen::Vector3d(x, y, 0)); point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = false; break; } break; case 'h': case 'H': switch (point) { case 0: x = cmd == 'h' ? x + p : p; path_list.back().push_back(Eigen::Vector3d(x, y, 0)); point = -1; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = false; break; } break; case 'z': case 'Z': if (!path_list.back().empty()) { Eigen::Vector3d p = path_list.back()[0]; path_list.back().push_back(p); x = p.x(); y = p.y(); } path_list.push_back(path_t()); path_closed = true; last_cmd_cubic_bezier = false; last_cmd_quadratic_bezier = false; break; } point++; } while (!path_list.empty() && path_list.back().empty()) { path_list.pop_back(); } if (!path_closed && !path_list.empty()) { path_t path = path_list.back(); if (is_open_path(path)) { path_list.pop_back(); offset_path(path_list, path, get_stroke_width(), get_stroke_linecap()); } } } bool path::is_open_path(path_t& path) const { const Eigen::Vector3d p1 = path[0]; const Eigen::Vector3d p2 = path.back(); double distance = pow(pow(p1.x() - p2.x(), 2) + pow(p1.y() - p2.y(), 2) + pow(p1.z() - p2.z(), 2), 0.5); return distance > 0.1; } const std::string path::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ", y = " << this->y; for (const auto& p : path_list) { s << "["; for (const auto& v : p) { s << " (" << v.x() << ", " << v.y() << ")"; } s << "]"; } return s.str(); } } openscad-2019.05/src/libsvg/path.h0000644000076500000240000000411313423115164017260 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 #include #include "shape.h" namespace libsvg { class path : public shape { protected: std::string data; private: inline double t(double t, int exp) const { return std::pow(1.0 - t, exp); } bool is_open_path(path_t& path) const; void arc_to(path_t& path, double x, double y, double rx, double ry, double x2, double y2, double angle, bool large, bool sweep); void curve_to(path_t& path, double x, double y, double cx1, double cy1, double x2, double y2); void curve_to(path_t& path, double x, double y, double cx1, double cy1, double cx2, double cy2, double x2, double y2); public: path(); ~path(); void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return path::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/polygon.cc0000644000076500000240000000364513423115164020162 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "polygon.h" namespace libsvg { const std::string polygon::name("polygon"); polygon::polygon() { } polygon::~polygon() { } void polygon::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->points = attrs["points"]; using tokenizer = boost::tokenizer >; boost::char_separator sep(" ,"); tokenizer tokens(this->points, sep); double x = 0.0; path_t path; bool first = true; for (const auto& v : tokens) { double p = parse_double(v); if (first) { x = p; } else { path.push_back(Eigen::Vector3d(x, p, 0)); } first = !first; } if (!path.empty()) { path.push_back(path[0]); } path_list.push_back(path); } }openscad-2019.05/src/libsvg/polygon.h0000644000076500000240000000302313423115164020012 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class polygon : public shape { private: std::string points; public: polygon(); ~polygon(); void set_attrs(attr_map_t& attrs) override; const std::string& get_name() const override { return polygon::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/polyline.cc0000644000076500000240000000365013423115164020322 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "polyline.h" namespace libsvg { const std::string polyline::name("polyline"); polyline::polyline() { } polyline::~polyline() { } void polyline::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->points = attrs["points"]; using tokenizer = boost::tokenizer >; boost::char_separator sep(" ,"); tokenizer tokens(this->points, sep); double x = 0.0; path_t path; bool first = true; for (const auto& v : tokens) { double p = parse_double(v); if (first) { x = p; } else { path.push_back(Eigen::Vector3d(x, p, 0)); } first = !first; } offset_path(path_list, path, get_stroke_width(), get_stroke_linecap()); } }openscad-2019.05/src/libsvg/polyline.h0000644000076500000240000000303313423115164020157 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class polyline : public shape { private: std::string points; public: polyline(); ~polyline(); void set_attrs(attr_map_t& attrs) override; const std::string& get_name() const override { return polyline::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/rect.cc0000644000076500000240000001331313423115164017421 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "rect.h" namespace libsvg { const std::string rect::name("rect"); rect::rect() : width(0), height(0), rx(0), ry(0) { } rect::~rect() { } /** * Let rx and ry be length values. * * If neither ‘rx’ nor ‘ry’ are properly specified, then set both rx and * ry to 0. (This will result in square corners.) * Otherwise, if a properly specified value is provided for ‘rx’, but not * for ‘ry’, then set both rx and ry to the value of ‘rx’. * Otherwise, if a properly specified value is provided for ‘ry’, but not * for ‘rx’, then set both rx and ry to the value of ‘ry’. * Otherwise, both ‘rx’ and ‘ry’ were specified properly. Set rx to the * value of ‘rx’ and ry to the value of ‘ry’. * If rx is greater than half of ‘width’, then set rx to half of ‘width’. * If ry is greater than half of ‘height’, then set ry to half of ‘height’. * The effective values of ‘rx’ and ‘ry’ are rx and ry, respectively. * * * Mathematically, a ‘rect’ element can be mapped to an equivalent * ‘path’ element as follows: (Note: all coordinate and length values * are first converted into user space coordinates according to Units.) * * 1) perform an absolute moveto operation to location (x+rx,y), where x is * the value of the ‘rect’ element's ‘x’ attribute converted to user space, * rx is the effective value of the ‘rx’ attribute converted to user space * and y is the value of the ‘y’ attribute converted to user space * * 2) perform an absolute horizontal lineto operation to location (x+width-rx,y), * where width is the ‘rect’ element's ‘width’ attribute converted to user * space * * 3) perform an absolute elliptical arc operation to coordinate (x+width,y+ry), * where the effective values for the ‘rx’ and ‘ry’ attributes on the ‘rect’ * element converted to user space are used as the rx and ry attributes on * the elliptical arc command, respectively, the x-axis-rotation is set to * zero, the large-arc-flag is set to zero, and the sweep-flag is set to * one * * 4) perform a absolute vertical lineto to location (x+width,y+height-ry), * where height is the ‘rect’ element's ‘height’ attribute converted to user * space * * 5) perform an absolute elliptical arc operation to coordinate (x+width-rx,y+height) * * 6) perform an absolute horizontal lineto to location (x+rx,y+height) * * 7) perform an absolute elliptical arc operation to coordinate (x,y+height-ry) * * 8) perform an absolute absolute vertical lineto to location (x,y+ry) * * 9) perform an absolute elliptical arc operation to coordinate (x+rx,y) */ void rect::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->x = parse_double(attrs["x"]); this->y = parse_double(attrs["y"]); this->width = parse_double(attrs["width"]); this->height = parse_double(attrs["height"]); this->rx = parse_double(attrs["rx"]); this->ry = parse_double(attrs["ry"]); bool has_rx = !(std::fabs(rx) < 1e-8); bool has_ry = !(std::fabs(ry) < 1e-8); if (has_rx || has_ry) { if (!has_rx) { this->rx = this->ry; } else if (!has_ry) { this->ry = this->rx; } if (this->rx > (this->width / 2)) { this->rx = this->width / 2; } if (this->ry > (this->height / 2)) { this->ry = this->height / 2; } std::string path = boost::str(boost::format("" "M %1%,%2% " "H %3% " "A %4%,%5% 0 0,1 %6%,%7% " "V %8% " "A %9%,%10% 0 0,1 %11%,%12% " "H %13% " "A %14%,%15% 0 0,1 %16%,%17% " "V %18% " "A %19%,%20% 0 0,1 %21%,%22% " "z") % (x + rx) % y % (x + width - rx) % rx % ry % (x + width) % (y + ry) % (y + height - ry) % rx % ry % (x + width - rx) % (y + height) % (x + rx) % rx % ry % x % (y + height - ry) % (y + ry) % rx % ry % (x + rx) % y ); attrs["d"] = path; path::set_attrs(attrs); } else { path_t path; path.push_back(Eigen::Vector3d(get_x(), get_y(), 0)); path.push_back(Eigen::Vector3d(get_x() + get_width(), get_y(), 0)); path.push_back(Eigen::Vector3d(get_x() + get_width(), get_y() + get_height(), 0)); path.push_back(Eigen::Vector3d(get_x(), get_y() + get_height(), 0)); path.push_back(Eigen::Vector3d(get_x(), get_y(), 0)); path_list.push_back(path); } } const std::string rect::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y << ": width = " << this->width << ": height = " << this->height; return s.str(); } } openscad-2019.05/src/libsvg/rect.h0000644000076500000240000000343213423115164017264 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "path.h" namespace libsvg { class rect : public path { protected: double width; double height; double rx; double ry; public: rect(); ~rect(); double get_width() const { return width; } double get_height() const { return height; } double get_rx() const { return rx; } double get_ry() const { return ry; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return rect::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/shape.cc0000644000076500000240000001625313423115164017572 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include #include #include #include #include #include "shape.h" #include "circle.h" #include "ellipse.h" #include "line.h" #include "text.h" #include "tspan.h" #include "data.h" #include "polygon.h" #include "polyline.h" #include "rect.h" #include "svgpage.h" #include "path.h" #include "group.h" #include "transformation.h" #include "degree_trig.h" namespace libsvg { shape::shape() : parent(nullptr), x(0), y(0) { } shape::~shape() { } shape * shape::create_from_name(const char *name) { if (circle::name == name) { return new circle(); } else if (ellipse::name == name) { return new ellipse(); } else if (line::name == name) { return new line(); } else if (text::name == name) { return new text(); } else if (tspan::name == name) { return new tspan(); } else if (data::name == name) { return new data(); } else if (polygon::name == name) { return new polygon(); } else if (polyline::name == name) { return new polyline(); } else if (rect::name == name) { return new rect(); } else if (svgpage::name == name) { return new svgpage(); } else if (path::name == name) { return new path(); } else if (group::name == name) { return new group(); } else { return nullptr; } } void shape::set_attrs(attr_map_t& attrs) { this->id = attrs["id"]; this->transform = attrs["transform"]; this->stroke_width = attrs["stroke-width"]; this->stroke_linecap = attrs["stroke-linecap"]; this->style = attrs["style"]; } const std::string shape::get_style(std::string name) const { std::vector styles; boost::split(styles, this->style, boost::is_any_of(";")); for (const auto& style : styles) { std::vector values; boost::split(values, style, boost::is_any_of(":")); if (values.size() != 2) { continue; } if (name == values[0]) { return values[1]; } } return std::string(); } double shape::get_stroke_width() const { double stroke_width; if (this->stroke_width.empty()) { stroke_width = parse_double(get_style("stroke-width")); } else { stroke_width = parse_double(this->stroke_width); } return stroke_width < 0.01 ? 1 : stroke_width; } ClipperLib::EndType shape::get_stroke_linecap() const { std::string cap; if (this->stroke_linecap.empty()) { cap = get_style("stroke-linecap"); } else { cap = this->stroke_linecap; } if (cap == "butt") { return ClipperLib::etOpenButt; } else if (cap == "round") { return ClipperLib::etOpenRound; } else if (cap == "square") { return ClipperLib::etOpenSquare; } return ClipperLib::etOpenSquare; } void shape::collect_transform_matrices(std::vector& matrices, shape *s) { std::string transform_arg(s->transform); boost::replace_all(transform_arg, "matrix", "m"); boost::replace_all(transform_arg, "translate", "t"); boost::replace_all(transform_arg, "scale", "s"); boost::replace_all(transform_arg, "rotate", "r"); boost::replace_all(transform_arg, "skewX", "x"); boost::replace_all(transform_arg, "skewY", "y"); std::string commands = "mtsrxy"; using tokenizer = boost::tokenizer >; boost::char_separator sep(" ,()", commands.c_str()); tokenizer tokens(transform_arg, sep); transformation *t = nullptr; std::vector transformations; for (const auto& v : tokens) { if ((v.length() == 1) && (commands.find(v) != std::string::npos)) { if (t != nullptr) { transformations.push_back(t); t = nullptr; } switch (v[0]) { case 'm': t = new matrix(); break; case 't': t = new translate(); break; case 's': t = new scale(); break; case 'r': t = new rotate(); break; case 'x': t = new skew_x(); break; case 'y': t = new skew_y(); break; default: std::cout << "unknown transform op " << v << std::endl; t = nullptr; } } else { if (t) { t->add_arg(v); } } } if (t != nullptr) { transformations.push_back(t); } for (std::vector::reverse_iterator it = transformations.rbegin();it != transformations.rend();it++) { transformation *t = *it; std::vector m = t->get_matrices(); matrices.insert(matrices.begin(), m.rbegin(), m.rend()); delete t; } } void shape::apply_transform() { std::vector matrices; for (shape *s = this;s->get_parent() != nullptr;s = s->get_parent()) { collect_transform_matrices(matrices, s); } path_list_t result_list; for (const auto& p : path_list) { result_list.push_back(path_t()); for (const auto &v : p) { Eigen::Vector3d result(v.x(), v.y(), 1); for (std::vector::reverse_iterator it3 = matrices.rbegin();it3 != matrices.rend();it3++) { result = *it3 * result; } result_list.back().push_back(result); } } path_list = result_list; } void shape::offset_path(path_list_t& path_list, path_t& path, double stroke_width, ClipperLib::EndType stroke_linecap) { ClipperLib::Path line; ClipperLib::Paths result; for (const auto& v : path) { line << ClipperLib::IntPoint(v.x() * 10000, v.y() * 10000); } ClipperLib::ClipperOffset co; co.AddPath(line, ClipperLib::jtMiter, stroke_linecap); co.Execute(result, stroke_width * 5000.0); for (const auto& p : result) { path_list.push_back(path_t()); for (const auto &point : p) { path_list.back().push_back(Eigen::Vector3d(point.X / 10000.0, point.Y / 10000.0, 0)); } path_list.back().push_back(Eigen::Vector3d(p[0].X / 10000.0, p[0].Y / 10000.0, 0)); } } void shape::draw_ellipse(path_t& path, double x, double y, double rx, double ry) { unsigned long fn = 40; for (unsigned long idx = 1;idx <= fn;idx++) { const double a = idx * 360.0 / fn; const double xx = rx * sin_degrees(a) + x; const double yy = ry * cos_degrees(a) + y; path.push_back(Eigen::Vector3d(xx, yy, 0)); } } std::ostream & operator<<(std::ostream &os, const shape& s) { return os << s.dump() << " | id = '" << s.id << "', transform = '" << s.transform << "'"; } } openscad-2019.05/src/libsvg/shape.h0000644000076500000240000000631113423115164017426 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 #include #include #include #include #include #include "util.h" #include "ext/polyclipping/clipper.hpp" namespace libsvg { using path_t = std::vector; using path_list_t = std::vector; using attr_map_t = std::map; class shape { private: shape *parent; std::vector children; protected: std::string id; double x; double y; path_list_t path_list; std::string transform; std::string stroke_width; std::string stroke_linecap; std::string style; double get_stroke_width() const; ClipperLib::EndType get_stroke_linecap() const; const std::string get_style(std::string name) const; void draw_ellipse(path_t& path, double x, double y, double rx, double ry); void offset_path(path_list_t& path_list, path_t& path, double stroke_width, ClipperLib::EndType stroke_linecap); void collect_transform_matrices(std::vector& matrices, shape *s); public: shape(); virtual ~shape(); virtual shape * get_parent() const { return parent; } virtual void set_parent(shape *s) { parent = s; } virtual void add_child(shape *s) { children.push_back(s); s->set_parent(this); } virtual const std::vector& get_children() const { return children; } virtual const std::string& get_id() const { return id; } virtual double get_x() const { return x; } virtual double get_y() const { return y; } virtual const path_list_t& get_path_list() const { return path_list; } virtual bool is_container() const { return false; } virtual void apply_transform(); virtual const std::string& get_name() const = 0; virtual void set_attrs(attr_map_t& attrs); virtual const std::string dump() const { return ""; } static shape * create_from_name(const char *name); private: friend std::ostream & operator<<(std::ostream &os, const shape& s); }; } openscad-2019.05/src/libsvg/svgpage.cc0000644000076500000240000000437513437640540020136 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "svgpage.h" namespace libsvg { const std::string svgpage::name("svg"); svgpage::svgpage() : width({0.0, unit_t::UNDEFINED}), height({0.0, unit_t::UNDEFINED}) { } svgpage::~svgpage() { } void svgpage::set_attrs(attr_map_t& attrs) { this->x = 0; this->y = 0; this->width = parse_length(attrs["width"]); this->height = parse_length(attrs["height"]); this->viewbox = parse_viewbox(attrs["viewBox"]); this->alignment = parse_alignment(attrs["preserveAspectRatio"]); } const std::string svgpage::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y << ": width = " << this->width << ": height = " << this->height << ": viewbox = " << this->viewbox.x << "," << this->viewbox.y << "," << this->viewbox.width << "," << this->viewbox.height << (this->viewbox.is_valid ? " (valid)" : " (invalid)") << ": alignment = " << this->alignment.x << "," << this->alignment.y << (this->alignment.meet ? " meet" : " slice"); return s.str(); } }openscad-2019.05/src/libsvg/svgpage.h0000644000076500000240000000366513437640540020001 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class svgpage : public shape { protected: length_t width; length_t height; viewbox_t viewbox; alignment_t alignment; public: svgpage(); ~svgpage() override; const length_t& get_width() const { return width; } const length_t& get_height() const { return height; } const viewbox_t& get_viewbox() const { return viewbox; } const alignment_t& get_alignment() const { return alignment; } bool is_container() const override { return true; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return svgpage::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/text.cc0000644000076500000240000000344513423115164017455 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "text.h" namespace libsvg { const std::string text::name("text"); text::text() : dx(0), dy(0), rotate(0), text_length(0), font_size(0) { } text::~text() { } void text::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->x = parse_double(attrs["x"]); this->y = parse_double(attrs["y"]); this->dx = parse_double(attrs["dx"]); this->dy = parse_double(attrs["dy"]); } const std::string text::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y << ": dx = " << this->dx << ": dy = " << this->dy; return s.str(); } }openscad-2019.05/src/libsvg/text.h0000644000076500000240000000401613423115164017312 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class text : public shape { private: double dx; double dy; double rotate; double text_length; std::string font_family; int font_size; public: text(); ~text(); bool is_container() const override { return true; } double get_dx() const { return dx; } double get_dy() const { return dy; } double get_rotate() const { return rotate; } double get_text_length() const { return text_length; } const std::string& get_font_family() const { return font_family; } int get_font_size() const { return font_size; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return text::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/transformation.cc0000644000076500000240000001423513423115164021536 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "util.h" #include "transformation.h" #include "degree_trig.h" namespace libsvg { transformation::transformation(const std::string op, const std::string name) : op(op), name(name) { } transformation::~transformation() { } void transformation::add_arg(const std::string arg) { double d = parse_double(arg); args.push_back(d); } const std::string transformation::get_args() const { std::ostringstream str; for (unsigned int a = 0;a < args.size();a++) { str << ((a == 0) ? "(" : ", ") << args[a]; } str << ")"; return str.str(); } matrix::matrix() : transformation("m", "matrix") { } matrix::~matrix() { } /** * matrix( ), which specifies a transformation in * the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) * is equivalent to applying the transformation matrix [a b c d e f]. */ std::vector matrix::get_matrices() { if (args.size() != 6) { std::cout << "invalid arguments for matrix" << std::endl; return std::vector(); } Eigen::Matrix3d m; m << args[0], args[2], args[4], args[1], args[3], args[5], 0, 0, 1; std::vector result; result.push_back(m); return result; } translate::translate() : transformation("t", "translate") { } translate::~translate() { } /** * translate( []), which specifies a translation by tx and ty. * If is not provided, it is assumed to be zero. */ std::vector translate::get_matrices() { if ((args.size() < 1) || (args.size() > 2)) { std::cout << "invalid arguments for " << get_name() << std::endl; return std::vector(); } double tx = args[0]; double ty = args.size() > 1 ? args[1] : 0; Eigen::Matrix3d m; m << 1, 0, tx, 0, 1, ty, 0, 0, 1; std::vector result; result.push_back(m); return result; } scale::scale() : transformation("s", "scale") { } scale::~scale() { } /** * scale( []), which specifies a scale operation by sx and sy. * If is not provided, it is assumed to be equal to . */ std::vector scale::get_matrices() { if ((args.size() < 1) || (args.size() > 2)) { std::cout << "invalid arguments for " << get_name() << std::endl; return std::vector(); } double sx = args[0]; double sy = args.size() > 1 ? args[1] : args[0]; Eigen::Matrix3d m; m << sx, 0, 0, 0, sy, 0, 0, 0, 1; std::vector result; result.push_back(m); return result; } rotate::rotate() : transformation("r", "rotate") { } rotate::~rotate() { } /** * rotate( [ ]), which specifies a rotation by * degrees about a given point. * If optional parameters and are not supplied, the rotate is * about the origin of the current user coordinate system. The operation * corresponds to the matrix [cos(a) sin(a) -sin(a) cos(a) 0 0]. * If optional parameters and are supplied, the rotate is * about the point (cx, cy). The operation represents the equivalent of * the following specification: translate(, ) rotate() * translate(-, -). */ std::vector rotate::get_matrices() { if ((args.size() != 1) && (args.size() != 3)) { std::cout << "invalid arguments for " << get_name() << std::endl; return std::vector(); } bool has_center = args.size() == 3; double angle = args[0]; double cx = has_center ? args[1] : 0; double cy = has_center ? args[2] : 0; std::vector result; if (has_center) { Eigen::Matrix3d t; t << 1, 0, -cx, 0, 1, -cy, 0, 0, 1; result.push_back(t); } result.push_back(rotate_degrees(angle)); if (has_center) { Eigen::Matrix3d t; t << 1, 0, cx, 0, 1, cy, 0, 0, 1; result.push_back(t); } return result; } skew_x::skew_x() : transformation("x", "skew_x") { } skew_x::~skew_x() { } /** * skewX(), which specifies a skew transformation along the x-axis. */ std::vector skew_x::get_matrices() { if (args.size() != 1) { std::cout << "invalid arguments for " << get_name() << std::endl; return std::vector(); } double angle = args[0]; Eigen::Matrix3d m; m << 1, tan_degrees(angle), 0, 0, 1, 0, 0, 0, 1; std::vector result; result.push_back(m); return result; } skew_y::skew_y() : transformation("y", "skew_y") { } skew_y::~skew_y() { } /** * skewY(), which specifies a skew transformation along the y-axis. */ std::vector skew_y::get_matrices() { if (args.size() != 1) { std::cout << "invalid arguments for " << get_name() << std::endl; return std::vector(); } double angle = args[0]; Eigen::Matrix3d m; m << 1, 0, 0, tan_degrees(angle), 1, 0, 0, 0, 1; std::vector result; result.push_back(m); return result; } } openscad-2019.05/src/libsvg/transformation.h0000644000076500000240000000523713423115164021402 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 #include #include #include namespace libsvg { class transformation { private: const std::string op; const std::string name; protected: std::vector args; public: transformation(const std::string op, const std::string name); virtual ~transformation(); const std::string& get_op() const { return op; } const std::string& get_name() const { return name; } const std::string get_args() const; void add_arg(const std::string arg); virtual std::vector get_matrices() = 0; }; class matrix : public transformation { public: matrix(); ~matrix(); std::vector get_matrices() override; }; class translate : public transformation { public: translate(); ~translate(); std::vector get_matrices() override; }; class scale : public transformation { public: scale(); ~scale(); std::vector get_matrices() override; }; class rotate : public transformation { public: rotate(); ~rotate(); std::vector get_matrices() override; }; class skew_x : public transformation { public: skew_x(); ~skew_x(); std::vector get_matrices() override; }; class skew_y : public transformation { public: skew_y(); ~skew_y(); std::vector get_matrices() override; }; } openscad-2019.05/src/libsvg/tspan.cc0000644000076500000240000000345613423115164017620 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "tspan.h" namespace libsvg { const std::string tspan::name("tspan"); tspan::tspan() : dx(0), dy(0), rotate(0), text_length(0), font_size(0) { } tspan::~tspan() { } void tspan::set_attrs(attr_map_t& attrs) { shape::set_attrs(attrs); this->x = parse_double(attrs["x"]); this->y = parse_double(attrs["y"]); this->dx = parse_double(attrs["dx"]); this->dy = parse_double(attrs["dy"]); } const std::string tspan::dump() const { std::stringstream s; s << get_name() << ": x = " << this->x << ": y = " << this->y << ": dx = " << this->dx << ": dy = " << this->dy; return s.str(); } }openscad-2019.05/src/libsvg/tspan.h0000644000076500000240000000402213423115164017450 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 "shape.h" namespace libsvg { class tspan : public shape { private: double dx; double dy; double rotate; double text_length; std::string font_family; int font_size; public: tspan(); ~tspan(); bool is_container() const override { return true; } double get_dx() const { return dx; } double get_dy() const { return dy; } double get_rotate() const { return rotate; } double get_text_length() const { return text_length; } const std::string& get_font_family() const { return font_family; } int get_font_size() const { return font_size; } void set_attrs(attr_map_t& attrs) override; const std::string dump() const override; const std::string& get_name() const override { return tspan::name; }; static const std::string name; }; } openscad-2019.05/src/libsvg/util.cc0000644000076500000240000001666413437640540017463 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 fusion headers for Ubuntu trusty, everything later seems happy without #include #include #include "util.h" BOOST_FUSION_ADAPT_STRUCT(libsvg::length_struct, (double, number) (std::string, unit)) namespace libsvg { namespace qi = boost::spirit::qi; double parse_double(const std::string& number) { std::string::const_iterator iter = number.begin(), end = number.end(); qi::real_parser > double_parser; double d = 0.0; const bool result = boost::spirit::qi::parse(iter, end, double_parser, d); return result && iter == end ? d : 0; } static unit_t get_unit(const std::string& value) { if (value == "em") { return unit_t::EM; } else if (value == "ex") { return unit_t::EX; } else if (value == "px") { return unit_t::PX; } else if (value == "in") { return unit_t::IN; } else if (value == "cm") { return unit_t::CM; } else if (value == "mm") { return unit_t::MM; } else if (value == "pt") { return unit_t::PT; } else if (value == "pc") { return unit_t::PC; } else if (value == "%") { return unit_t::PERCENT; } else { return unit_t::NONE; } } const length_t parse_length(const std::string& value) { std::string::const_iterator it = value.begin(), end = value.end(); qi::rule length; qi::rule number; qi::rule()> unit; length = number >> -unit; number = qi::double_; unit = qi::string("em") | qi::string("ex") | qi::string("px") | qi::string("in") | qi::string("cm") | qi::string("mm") | qi::string("pt") | qi::string("pc") | qi::string("%"); libsvg::length_struct parsed; qi::phrase_parse(it, end, length, qi::space, parsed); length_t result{0.0, unit_t::UNDEFINED}; if ((it != value.begin()) && (it == end)) { result.number = parsed.number; result.unit = get_unit(parsed.unit); } return result; } const viewbox_t parse_viewbox(const std::string& value) { std::string::const_iterator it = value.begin(), end = value.end(); qi::rule(), qi::space_type> viewbox; qi::rule number; qi::rule sep; viewbox = number >> -sep >> number >> -sep >> number >> -sep >> number; number = qi::double_; sep = qi::char_(','); std::vector parsed; qi::phrase_parse(it, end, viewbox, qi::space, parsed); viewbox_t result{0.0, 0.0, 0.0, 0.0, false}; if ((it != value.begin()) && (it == end) && (parsed.size() == 4) && (parsed[2] >= 0.0) && (parsed[3] >= 0.0)) { result.x = parsed[0]; result.y = parsed[1]; result.width = parsed[2]; result.height = parsed[3]; result.is_valid = true; } return result; } const alignment_t parse_alignment(const std::string& value) { std::string::const_iterator it = value.begin(), end = value.end(); qi::rule(), qi::space_type> alignment; qi::rule()> defer; qi::rule()> align; qi::rule()> meet_or_slice; alignment = -qi::as_string[defer] >> qi::as_string[align] >> -qi::as_string[meet_or_slice]; defer = qi::string("defer"); align = qi::string("none") | qi::string("xMinYMin") | qi::string("xMidYMin") | qi::string("xMaxYMin") | qi::string("xMinYMid") | qi::string("xMidYMid") | qi::string("xMaxYMid") | qi::string("xMinYMax") | qi::string("xMidYMax") | qi::string("xMaxYMax"); meet_or_slice = qi::string("meet") | qi::string("slice"); std::vector parsed; qi::phrase_parse(it, end, alignment, qi::space, parsed); alignment_t result{align_t::MID, align_t::MID, false, true}; if ((it != value.begin()) && (it == end) && parsed.size() > 0) { unsigned int idx = 0; if (parsed[0] == "defer") { idx++; result.defer = true; } if (parsed.size() > idx) { if (parsed[idx] == "none") { result.x = align_t::NONE; result.y = align_t::NONE; } else if (parsed[idx] == "xMinYMin") { result.x = align_t::MIN; result.y = align_t::MIN; } else if (parsed[idx] == "xMidYMin") { result.x = align_t::MID; result.y = align_t::MIN; } else if (parsed[idx] == "xMaxYMin") { result.x = align_t::MAX; result.y = align_t::MIN; } else if (parsed[idx] == "xMinYMid") { result.x = align_t::MIN; result.y = align_t::MID; } else if (parsed[idx] == "xMidYMid") { result.x = align_t::MID; result.y = align_t::MID; } else if (parsed[idx] == "xMaxYMid") { result.x = align_t::MAX; result.y = align_t::MID; } else if (parsed[idx] == "xMinYMax") { result.x = align_t::MIN; result.y = align_t::MAX; } else if (parsed[idx] == "xMidYMax") { result.x = align_t::MID; result.y = align_t::MAX; } else if (parsed[idx] == "xMaxYMax") { result.x = align_t::MAX; result.y = align_t::MAX; } } idx++; if (parsed.size() > idx) { result.meet = parsed[idx] == "meet"; } } return result; } std::ostream &operator<<(std::ostream &stream, const unit_t &unit) { switch (unit) { case unit_t::EM: stream << "em"; break; case unit_t::EX: stream << "ex"; break; case unit_t::PX: stream << "px"; break; case unit_t::IN: stream << "in"; break; case unit_t::CM: stream << "cm"; break; case unit_t::MM: stream << "mm"; break; case unit_t::PT: stream << "pt"; break; case unit_t::PC: stream << "pc"; break; case unit_t::PERCENT: stream << "%"; break; case unit_t::NONE: break; case unit_t::UNDEFINED: stream << " (invalid)"; break; } return stream; } std::ostream &operator<<(std::ostream &stream, const length_t &length) { stream << length.number << length.unit; return stream; } std::ostream &operator<<(std::ostream &stream, const align_t &align) { switch (align) { case align_t::MIN: stream << "min"; break; case align_t::MID: stream << "mid"; break; case align_t::MAX: stream << "max"; break; case align_t::NONE: stream << "none"; break; case align_t::UNDEFINED: stream << "undefined"; break; } return stream; } } openscad-2019.05/src/libsvg/util.h0000644000076500000240000000445413437640540017317 0ustar kintelstaff00000000000000/* * The MIT License * * Copyright (c) 2016-2018, Torsten Paul , * Marius Kintel * * 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 libsvg { // https://oreillymedia.github.io/Using_SVG/guide/units.html // // Points (pt) // // 1pt ≅ 1.3333px or user units (1px = 0.75pt) // 1pt = 1/72in // // Picas (pc) // // 1pc = 16px or user units // 1pc = 1/6in // enum class unit_t { UNDEFINED, NONE, PERCENT, EM, EX, PX, IN, CM, MM, PT, PC }; enum class align_t { UNDEFINED, NONE, MIN, MID, MAX }; struct length_struct { double number; std::string unit; }; struct length_t { double number; unit_t unit; }; struct viewbox_t { double x; double y; double width; double height; bool is_valid; }; struct alignment_t { align_t x; align_t y; bool defer; bool meet; }; double parse_double(const std::string& number); const length_t parse_length(const std::string& value); const viewbox_t parse_viewbox(const std::string& value); const alignment_t parse_alignment(const std::string& value); std::ostream &operator<<(std::ostream &stream, const unit_t &unit); std::ostream &operator<<(std::ostream &stream, const length_t &length); std::ostream &operator<<(std::ostream &stream, const align_t &align); } openscad-2019.05/src/linalg.cc0000644000076500000240000000652713402025764016460 0ustar kintelstaff00000000000000#include "linalg.h" #include // FIXME: We can achieve better pruning by either: // o Recalculate the box based on the transformed object // o Store boxes are oriented bounding boxes and implement oriented // bbox intersection // FIXME: This function can be generalized, but we don't need it atm. /*! Transforms the given bounding box by transforming each of its 8 vertices. Returns a new bounding box. */ BoundingBox operator*(const Transform3d &m, const BoundingBox &box) { if (box.isEmpty()) return box; BoundingBox newbox; Vector3d boxvec[2] = { box.min(), box.max() }; for (int k=0;k<2;k++) { for (int j=0;j<2;j++) { for (int i=0;i<2;i++) { newbox.extend(m * Vector3d(boxvec[i][0], boxvec[j][1], boxvec[k][2])); } } } return newbox; } bool matrix_contains_infinity( const Transform3d &m ) { for (int i=0;i 0 ? _PyHASH_INF : -_PyHASH_INF; else return _PyHASH_NAN; } m = frexp(v, &e); sign = 1; if (m < 0) { sign = -1; m = -m; } /* process 28 bits at a time; this should work well both for binary and hexadecimal floating point. */ x = 0; while (m) { x = ((x << 28) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - 28); m *= 268435456.0; // 2**28 e -= 28; y = (Py_uhash_t)m; /* pull out integer part */ m -= y; x += y; if (x >= _PyHASH_MODULUS) x -= _PyHASH_MODULUS; } /* adjust for the exponent; first reduce it modulo _PyHASH_BITS */ e = e >= 0 ? e % _PyHASH_BITS : _PyHASH_BITS-1-((-1-e) % _PyHASH_BITS); x = ((x << e) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - e); x = x * sign; return (Py_hash_t)x; } openscad-2019.05/src/linalg.h0000644000076500000240000000357613441031431016312 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include using Eigen::Vector2d; using Eigen::Vector3d; using Eigen::Vector3f; using Eigen::Vector3i; #ifdef _MSC_VER #include // https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html #if !EIGEN_HAS_CXX11_CONTAINERS #warning "Eigen has detected no support for CXX11 containers and has redefined std::vector" #endif typedef std::vector > VectorOfVector2d; #else typedef std::vector VectorOfVector2d; #endif typedef Eigen::AlignedBox BoundingBox; using Eigen::Matrix3f; using Eigen::Matrix3d; using Eigen::Matrix4d; #define Transform3d Eigen::Affine3d #define Transform2d Eigen::Affine2d bool matrix_contains_infinity( const Transform3d &m ); bool matrix_contains_nan( const Transform3d &m ); int32_t hash_floating_point( double v ); template bool is_finite(const Eigen::MatrixBase& x) { return ( (x - x).array() == (x - x).array()).all(); } template bool is_nan(const Eigen::MatrixBase& x) { return !((x.array() == x.array())).all(); } BoundingBox operator*(const Transform3d &m, const BoundingBox &box); // Vector4f is fixed-size vectorizable // Use Eigen::DontAlign so we can store Color4f in STL containers // https://eigen.tuxfamily.org/dox/group__DenseMatrixManipulation__Alignement.html class Color4f : public Eigen::Matrix { public: Color4f() { } Color4f(int r, int g, int b, int a = 255) { setRgb(r,g,b,a); } Color4f(float r, float g, float b, float a = 1.0f) : Eigen::Matrix(r, g, b, a) { } void setRgb(int r, int g, int b, int a = 255) { *this << r/255.0f, g/255.0f, b/255.0f, a/255.0f; } bool isValid() const { return this->minCoeff() >= 0.0f; } }; openscad-2019.05/src/linearextrude.cc0000644000076500000240000001501713432700636020060 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "linearextrudenode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "printutils.h" #include "fileutils.h" #include "builtin.h" #include "calc.h" #include "polyset.h" #include "handle_dep.h" #include #include #include using namespace boost::assign; // bring 'operator+=()' into scope #include namespace fs = boost::filesystem; class LinearExtrudeModule : public AbstractModule { public: LinearExtrudeModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *LinearExtrudeModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new LinearExtrudeNode(inst); AssignmentList args{Assignment("file"), Assignment("layer"), Assignment("height"), Assignment("origin"), Assignment("scale"), Assignment("center"), Assignment("twist"), Assignment("slices")}; AssignmentList optargs{Assignment("convexity")}; Context c(ctx); c.setVariables(evalctx, args, optargs); inst->scope.apply(*evalctx); node->fn = c.lookup_variable("$fn")->toDouble(); node->fs = c.lookup_variable("$fs")->toDouble(); node->fa = c.lookup_variable("$fa")->toDouble(); auto file = c.lookup_variable("file"); auto layer = c.lookup_variable("layer", true); auto height = c.lookup_variable("height", true); auto convexity = c.lookup_variable("convexity", true); auto origin = c.lookup_variable("origin", true); auto scale = c.lookup_variable("scale", true); auto center = c.lookup_variable("center", true); auto twist = c.lookup_variable("twist", true); auto slices = c.lookup_variable("slices", true); if (!file->isUndefined() && file->type() == Value::ValueType::STRING) { printDeprecation("Support for reading files in linear_extrude will be removed in future releases. Use a child import() instead."); auto filename = lookup_file(file->toString(), inst->path(), c.documentPath()); node->filename = filename; handle_dep(filename); } // if height not given, and first argument is a number, // then assume it should be the height. if (c.lookup_variable("height")->isUndefined() && evalctx->numArgs() > 0 && evalctx->getArgName(0) == "") { auto val = evalctx->getArgValue(0); if (val->type() == Value::ValueType::NUMBER) height = val; } node->layername = layer->isUndefined() ? "" : layer->toString(); node->height = 100; height->getFiniteDouble(node->height); node->convexity = static_cast(convexity->toDouble()); bool originOk = origin->getVec2(node->origin_x, node->origin_y); originOk &= std::isfinite(node->origin_x) && std::isfinite(node->origin_y); if(origin!=ValuePtr::undefined && !originOk){ PRINTB("WARNING: linear_extrude(..., origin=%s) could not be converted, %s", origin->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } node->scale_x = node->scale_y = 1; bool scaleOK = scale->getFiniteDouble(node->scale_x); scaleOK &= scale->getFiniteDouble(node->scale_y); scaleOK |= scale->getVec2(node->scale_x, node->scale_y, true); if((origin!=ValuePtr::undefined) && (!scaleOK || !std::isfinite(node->scale_x) || !std::isfinite(node->scale_y))){ PRINTB("WARNING: linear_extrude(..., scale=%s) could not be converted, %s", scale->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } if (center->type() == Value::ValueType::BOOL) node->center = center->toBool(); if (node->height <= 0) node->height = 0; if (node->convexity <= 0) node->convexity = 1; if (node->scale_x < 0) node->scale_x = 0; if (node->scale_y < 0) node->scale_y = 0; double slicesVal = 0; slices->getFiniteDouble(slicesVal); node->slices = static_cast(slicesVal); node->twist = 0.0; twist->getFiniteDouble(node->twist); if (node->twist != 0.0) { if (node->slices == 0) { node->slices = static_cast(fmax(2, fabs(Calc::get_fragments_from_r(node->height, node->fn, node->fs, node->fa) * node->twist / 360))); } node->has_twist = true; } node->slices = std::max(node->slices, 1); if (node->filename.empty()) { auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } return node; } std::string LinearExtrudeNode::toString() const { std::ostringstream stream; stream << this->name() << "("; if (!this->filename.empty()) { // Ignore deprecated parameters if empty fs::path path((std::string)this->filename); stream << "file = " << this->filename << ", " "layer = " << QuotedString(this->layername) << ", " "origin = [" << this->origin_x << ", " << this->origin_y << "], " << "timestamp = " << (fs::exists(path) ? fs::last_write_time(path) : 0) << ", " ; } stream << "height = " << std::dec << this->height << ", " "center = " << (this->center?"true":"false") << ", " "convexity = " << this->convexity; if (this->has_twist) { stream << ", twist = " << this->twist; } if (this->slices > 1) { stream << ", slices = " << this->slices; } stream << ", scale = [" << this->scale_x << ", " << this->scale_y << "]"; stream << ", $fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ")"; return stream.str(); } void register_builtin_dxf_linear_extrude() { Builtins::init("dxf_linear_extrude", new LinearExtrudeModule()); Builtins::init("linear_extrude", new LinearExtrudeModule()); } openscad-2019.05/src/linearextrudenode.h0000644000076500000240000000116713402025764020570 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "value.h" class LinearExtrudeNode : public AbstractPolyNode { public: VISITABLE(); LinearExtrudeNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) { convexity = slices = 0; fn = fs = fa = height = twist = 0; origin_x = origin_y = 0; scale_x = scale_y = 1; center = has_twist = false; } std::string toString() const override; std::string name() const override { return "linear_extrude"; } int convexity, slices; double fn, fs, fa, height, twist; double origin_x, origin_y, scale_x, scale_y; bool center, has_twist; Filename filename; std::string layername; }; openscad-2019.05/src/localscope.cc0000644000076500000240000000424013440766524017334 0ustar kintelstaff00000000000000#include "localscope.h" #include "modcontext.h" #include "module.h" #include "ModuleInstantiation.h" #include "UserModule.h" #include "expression.h" #include "function.h" #include "annotation.h" #include "UserModule.h" LocalScope::LocalScope() { } LocalScope::~LocalScope() { for (auto &v : children) delete v; for (auto &f : functions) delete f.second; for (auto &m : modules) delete m.second; } void LocalScope::addChild(ModuleInstantiation *modinst) { assert(modinst); this->children.push_back(modinst); } void LocalScope::addModule(const std::string &name, class UserModule *module) { assert(module); this->modules[name] = module; this->astModules.push_back({name, module}); } void LocalScope::addFunction(class UserFunction *func) { assert(func); this->functions[func->name] = func; this->astFunctions.push_back({func->name, func}); } void LocalScope::addAssignment(const Assignment &ass) { this->assignments.push_back(ass); } void LocalScope::print(std::ostream &stream, const std::string &indent, const bool inlined) const { for (const auto &f : this->astFunctions) { f.second->print(stream, indent); } for (const auto &m : this->astModules) { m.second->print(stream, indent); } for (const auto &ass : this->assignments) { ass.print(stream, indent); } for (const auto &inst : this->children) { inst->print(stream, indent, inlined); } } std::vector LocalScope::instantiateChildren(const Context *evalctx) const { std::vector childnodes; for(const auto &modinst : this->children) { AbstractNode *node = modinst->evaluate(evalctx); if (node) childnodes.push_back(node); } return childnodes; } /*! When instantiating a module which can take a scope as parameter (i.e. non-leaf nodes), use this method to apply the local scope definitions to the evaluation context. This will enable variables defined in local blocks. NB! for loops are special as the local block may depend on variables evaluated by the for loop parameters. The for loop code will handle this specially. */ void LocalScope::apply(Context &ctx) const { for(const auto &ass : this->assignments) { ctx.set_variable(ass.name, ass.expr->evaluate(&ctx)); } } openscad-2019.05/src/localscope.h0000644000076500000240000000227113440766524017200 0ustar kintelstaff00000000000000#pragma once #include "Assignment.h" #include class LocalScope { public: LocalScope(); ~LocalScope(); size_t numElements() const { return assignments.size() + children.size(); } void print(std::ostream &stream, const std::string &indent, const bool inlined = false) const; std::vector instantiateChildren(const class Context *evalctx) const; void addChild(class ModuleInstantiation *astnode); void addModule(const std::string &name, class UserModule *module); void addFunction(class UserFunction *function); void addAssignment(const class Assignment &ass); void apply(Context &ctx) const; bool hasChildren() const {return !(children.empty());}; AssignmentList assignments; std::vector children; // Modules and functions are stored twice; once for lookup and once for AST serialization typedef std::unordered_map FunctionContainer; FunctionContainer functions; std::vector> astFunctions; typedef std::unordered_map ModuleContainer; ModuleContainer modules; std::vector> astModules; }; openscad-2019.05/src/mainwin.cc0000755000076500000240000030565513463462332016666 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "comment.h" #include "openscad.h" #include "GeometryCache.h" #include "ModuleCache.h" #include "MainWindow.h" #include "OpenSCADApp.h" #include "parsersettings.h" #include "rendersettings.h" #include "Preferences.h" #include "printutils.h" #include "node.h" #include "polyset.h" #include "csgnode.h" #include "highlighter.h" #include "builtin.h" #include "memory.h" #include "expression.h" #include "modcontext.h" #include "progress.h" #include "dxfdim.h" #include "legacyeditor.h" #include "settings.h" #ifdef USE_SCINTILLA_EDITOR #include "scintillaeditor.h" #endif #include "AboutDialog.h" #include "FontListDialog.h" #include "LibraryInfoDialog.h" #ifdef ENABLE_OPENCSG #include "CSGTreeEvaluator.h" #include "OpenCSGRenderer.h" #include #endif #include "ProgressWidget.h" #include "ThrownTogetherRenderer.h" #include "CSGTreeNormalizer.h" #include "QGLView.h" #ifdef Q_OS_MAC #include "CocoaUtils.h" #endif #include "PlatformUtils.h" #ifdef OPENSCAD_UPDATER #include "AutoUpdater.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "QWordSearchField.h" #include //Include QSettings for direct operations on settings arrays #include "QSettingsCached.h" #include #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) #include #define QT_HTML_ESCAPE(qstring) Qt::escape(qstring) #undef ENABLE_3D_PRINTING #else #define QT_HTML_ESCAPE(qstring) (qstring).toHtmlEscaped() #define ENABLE_3D_PRINTING #include "OctoPrint.h" #include "PrintService.h" #endif #if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0)) // Set dummy for Qt versions that do not have QSaveFile #define QT_FILE_SAVE_CLASS QFile #define QT_FILE_SAVE_COMMIT true #else #include #define QT_FILE_SAVE_CLASS QSaveFile #define QT_FILE_SAVE_COMMIT if (saveOk) { saveOk = file.commit(); } else { file.cancelWriting(); } #endif #include #include #include #include #ifdef ENABLE_CGAL #include "CGALCache.h" #include "GeometryEvaluator.h" #include "CGALRenderer.h" #include "CGAL_Nef_polyhedron.h" #include "cgal.h" #include "cgalworker.h" #include "cgalutils.h" #endif // ENABLE_CGAL #include "FontCache.h" #include "PrintInitDialog.h" #include "input/InputDriverManager.h" #include #include // Global application state unsigned int GuiLocker::gui_locked = 0; static char copyrighttext[] = "Copyright (C) 2009-2019 The OpenSCAD Developers\n\n" "This program is free software; you can redistribute it and/or modify " "it under the terms of the GNU General Public License as published by " "the Free Software Foundation; either version 2 of the License, or " "(at your option) any later version.\n"; bool MainWindow::mdiMode = false; bool MainWindow::undockMode = false; bool MainWindow::reorderMode = false; const int MainWindow::tabStopWidth = 15; QElapsedTimer *MainWindow::progressThrottle = new QElapsedTimer(); namespace { QAction *findAction(const QList &actions, const std::string &name) { for (const auto action : actions) { if (action->objectName().toStdString() == name) { return action; } if (action->menu()) { auto foundAction = findAction(action->menu()->actions(), name); if (foundAction) return foundAction; } } return nullptr; } void fileExportedMessage(const char *format, const QString &filename) { PRINTB("%s export finished: %s", format % filename.toUtf8().constData()); } } // namespace MainWindow::MainWindow(const QString &filename) : root_inst("group"), library_info_dialog(nullptr), font_list_dialog(nullptr), procevents(false), tempFile(nullptr), progresswidget(nullptr), contentschanged(false), includes_mtime(0), deps_mtime(0), last_parser_error_pos(-1) { setupUi(this); editorDockTitleWidget = new QWidget(); consoleDockTitleWidget = new QWidget(); parameterDockTitleWidget = new QWidget(); this->editorDock->setConfigKey("view/hideEditor"); this->editorDock->setAction(this->viewActionHideEditor); this->consoleDock->setConfigKey("view/hideConsole"); this->consoleDock->setAction(this->viewActionHideConsole); this->parameterDock->setConfigKey("view/hideCustomizer"); this->parameterDock->setAction(this->viewActionHideParameters); this->versionLabel = nullptr; // must be initialized before calling updateStatusBar() updateStatusBar(nullptr); QSettingsCached settings; editortype = settings.value(Preferences::PREF_EDITOR_TYPE).toString(); useScintilla = (editortype != Preferences::EDITOR_TYPE_SIMPLE); #ifdef USE_SCINTILLA_EDITOR if (useScintilla) { editor = new ScintillaEditor(editorDockContents); } else #endif editor = new LegacyEditor(editorDockContents); Preferences::create(editor->colorSchemes()); connect(Preferences::inst()->ButtonConfig, SIGNAL(inputMappingChanged()), InputDriverManager::instance(), SLOT(onInputMappingUpdated()), Qt::UniqueConnection); connect(Preferences::inst()->AxisConfig, SIGNAL(inputMappingChanged()), InputDriverManager::instance(), SLOT(onInputMappingUpdated()), Qt::UniqueConnection); connect(Preferences::inst()->AxisConfig, SIGNAL(inputCalibrationChanged()), InputDriverManager::instance(), SLOT(onInputCalibrationUpdated()), Qt::UniqueConnection); connect(Preferences::inst()->AxisConfig, SIGNAL(inputGainChanged()), InputDriverManager::instance(), SLOT(onInputGainUpdated()), Qt::UniqueConnection); #ifdef USE_SCINTILLA_EDITOR if (useScintilla) { connect(editor, SIGNAL(previewRequest()), this, SLOT(actionRenderPreview())); connect(Preferences::inst(), SIGNAL(editorConfigChanged()), editor, SLOT(applySettings())); Preferences::inst()->fireEditorConfigChanged(); } #endif editorDockContents->layout()->addWidget(editor); setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); this->setAttribute(Qt::WA_DeleteOnClose); scadApp->windowManager.add(this); #ifdef ENABLE_CGAL this->cgalworker = new CGALWorker(); connect(this->cgalworker, SIGNAL(done(shared_ptr)), this, SLOT(actionRenderDone(shared_ptr))); #endif root_module = nullptr; parsed_module = nullptr; absolute_root_node = nullptr; #ifdef ENABLE_CGAL this->cgalRenderer = nullptr; #endif #ifdef ENABLE_OPENCSG this->opencsgRenderer = nullptr; #endif this->thrownTogetherRenderer = nullptr; root_node = nullptr; this->anim_step = 0; this->anim_numsteps = 0; this->anim_tval = 0.0; this->anim_dumping = false; this->anim_dump_start_step = 0; const QString importStatement = "import(\"%1\");\n"; const QString surfaceStatement = "surface(\"%1\");\n"; knownFileExtensions["stl"] = importStatement; knownFileExtensions["3mf"] = importStatement; knownFileExtensions["off"] = importStatement; knownFileExtensions["dxf"] = importStatement; knownFileExtensions["svg"] = importStatement; knownFileExtensions["amf"] = importStatement; knownFileExtensions["dat"] = surfaceStatement; knownFileExtensions["png"] = surfaceStatement; knownFileExtensions["scad"] = ""; knownFileExtensions["csg"] = ""; editActionZoomTextIn->setShortcuts(QList() << editActionZoomTextIn->shortcuts() << QKeySequence("CTRL+=")); connect(this, SIGNAL(highlightError(int)), editor, SLOT(highlightError(int))); connect(this, SIGNAL(unhighlightLastError()), editor, SLOT(unhighlightLastError())); this->qglview->statusLabel = new QLabel(this); this->qglview->statusLabel->setMinimumWidth(100); statusBar()->addWidget(this->qglview->statusLabel); auto s = Settings::Settings::inst(); this->qglview->setMouseCentricZoom(s->get(Settings::Settings::mouseCentricZoom).toBool()); animate_timer = new QTimer(this); connect(animate_timer, SIGNAL(timeout()), this, SLOT(updateTVal())); autoReloadTimer = new QTimer(this); autoReloadTimer->setSingleShot(false); autoReloadTimer->setInterval(200); connect(autoReloadTimer, SIGNAL(timeout()), this, SLOT(checkAutoReload())); waitAfterReloadTimer = new QTimer(this); waitAfterReloadTimer->setSingleShot(true); waitAfterReloadTimer->setInterval(200); connect(waitAfterReloadTimer, SIGNAL(timeout()), this, SLOT(waitAfterReload())); connect(this->parameterWidget, SIGNAL(previewRequested(bool)), this, SLOT(actionRenderPreview(bool))); connect(Preferences::inst(), SIGNAL(ExperimentalChanged()), this, SLOT(changeParameterWidget())); connect(this->e_tval, SIGNAL(textChanged(QString)), this, SLOT(updatedAnimTval())); connect(this->e_fps, SIGNAL(textChanged(QString)), this, SLOT(updatedAnimFps())); connect(this->e_fsteps, SIGNAL(textChanged(QString)), this, SLOT(updatedAnimSteps())); connect(this->e_dump, SIGNAL(toggled(bool)), this, SLOT(updatedAnimDump(bool))); progressThrottle->start(); animate_panel->hide(); this->hideFind(); frameCompileResult->hide(); this->labelCompileResultMessage->setOpenExternalLinks(false); connect(this->labelCompileResultMessage, SIGNAL(linkActivated(QString)), SLOT(showConsole())); // File menu connect(this->fileActionNew, SIGNAL(triggered()), this, SLOT(actionNew())); connect(this->fileActionOpen, SIGNAL(triggered()), this, SLOT(actionOpen())); connect(this->fileActionSave, SIGNAL(triggered()), this, SLOT(actionSave())); connect(this->fileActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); connect(this->fileActionReload, SIGNAL(triggered()), this, SLOT(actionReload())); connect(this->fileActionQuit, SIGNAL(triggered()), this, SLOT(quit())); connect(this->fileShowLibraryFolder, SIGNAL(triggered()), this, SLOT(actionShowLibraryFolder())); #ifndef __APPLE__ auto shortcuts = this->fileActionSave->shortcuts(); shortcuts.push_back(QKeySequence(Qt::Key_F2)); this->fileActionSave->setShortcuts(shortcuts); shortcuts = this->fileActionReload->shortcuts(); shortcuts.push_back(QKeySequence(Qt::Key_F3)); this->fileActionReload->setShortcuts(shortcuts); #endif // Open Recent for (int i = 0;iactionRecentFile[i] = new QAction(this); this->actionRecentFile[i]->setVisible(false); this->menuOpenRecent->addAction(this->actionRecentFile[i]); connect(this->actionRecentFile[i], SIGNAL(triggered()), this, SLOT(actionOpenRecent())); } this->menuOpenRecent->addSeparator(); this->menuOpenRecent->addAction(this->fileActionClearRecent); connect(this->fileActionClearRecent, SIGNAL(triggered()), this, SLOT(clearRecentFiles())); show_examples(); // Edit menu connect(this->editActionUndo, SIGNAL(triggered()), editor, SLOT(undo())); connect(editor, SIGNAL(contentsChanged()), this, SLOT(updateActionUndoState())); connect(this->editActionRedo, SIGNAL(triggered()), editor, SLOT(redo())); connect(this->editActionRedo_2, SIGNAL(triggered()), editor, SLOT(redo())); connect(this->editActionCut, SIGNAL(triggered()), editor, SLOT(cut())); connect(this->editActionCopy, SIGNAL(triggered()), editor, SLOT(copy())); connect(this->editActionPaste, SIGNAL(triggered()), editor, SLOT(paste())); connect(this->editActionCopyViewport, SIGNAL(triggered()), this, SLOT(actionCopyViewport())); connect(this->editActionIndent, SIGNAL(triggered()), editor, SLOT(indentSelection())); connect(this->editActionUnindent, SIGNAL(triggered()), editor, SLOT(unindentSelection())); connect(this->editActionComment, SIGNAL(triggered()), editor, SLOT(commentSelection())); connect(this->editActionUncomment, SIGNAL(triggered()), editor, SLOT(uncommentSelection())); connect(this->editActionConvertTabsToSpaces, SIGNAL(triggered()), this, SLOT(convertTabsToSpaces())); connect(this->editActionCopyVPT, SIGNAL(triggered()), this, SLOT(copyViewportTranslation())); connect(this->editActionCopyVPR, SIGNAL(triggered()), this, SLOT(copyViewportRotation())); connect(this->editActionCopyVPD, SIGNAL(triggered()), this, SLOT(copyViewportDistance())); connect(this->editActionZoomTextIn, SIGNAL(triggered()), editor, SLOT(zoomIn())); connect(this->editActionZoomTextOut, SIGNAL(triggered()), editor, SLOT(zoomOut())); connect(this->editActionPreferences, SIGNAL(triggered()), this, SLOT(preferences())); // Edit->Find connect(this->editActionFind, SIGNAL(triggered()), this, SLOT(showFind())); connect(this->editActionFindAndReplace, SIGNAL(triggered()), this, SLOT(showFindAndReplace())); #ifdef Q_OS_WIN this->editActionFindAndReplace->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_F)); #endif connect(this->editActionFindNext, SIGNAL(triggered()), this, SLOT(findNext())); connect(this->editActionFindPrevious, SIGNAL(triggered()), this, SLOT(findPrev())); connect(this->editActionUseSelectionForFind, SIGNAL(triggered()), this, SLOT(useSelectionForFind())); // Design menu connect(this->designActionAutoReload, SIGNAL(toggled(bool)), this, SLOT(autoReloadSet(bool))); connect(this->designActionReloadAndPreview, SIGNAL(triggered()), this, SLOT(actionReloadRenderPreview())); connect(this->designActionPreview, SIGNAL(triggered()), this, SLOT(actionRenderPreview())); #ifdef ENABLE_CGAL connect(this->designActionRender, SIGNAL(triggered()), this, SLOT(actionRender())); #else this->designActionRender->setVisible(false); #endif connect(this->designAction3DPrint, SIGNAL(triggered()), this, SLOT(action3DPrint())); connect(this->designCheckValidity, SIGNAL(triggered()), this, SLOT(actionCheckValidity())); connect(this->designActionDisplayAST, SIGNAL(triggered()), this, SLOT(actionDisplayAST())); connect(this->designActionDisplayCSGTree, SIGNAL(triggered()), this, SLOT(actionDisplayCSGTree())); connect(this->designActionDisplayCSGProducts, SIGNAL(triggered()), this, SLOT(actionDisplayCSGProducts())); connect(this->fileActionExportSTL, SIGNAL(triggered()), this, SLOT(actionExportSTL())); connect(this->fileActionExport3MF, SIGNAL(triggered()), this, SLOT(actionExport3MF())); connect(this->fileActionExportOFF, SIGNAL(triggered()), this, SLOT(actionExportOFF())); connect(this->fileActionExportAMF, SIGNAL(triggered()), this, SLOT(actionExportAMF())); connect(this->fileActionExportDXF, SIGNAL(triggered()), this, SLOT(actionExportDXF())); connect(this->fileActionExportSVG, SIGNAL(triggered()), this, SLOT(actionExportSVG())); connect(this->fileActionExportCSG, SIGNAL(triggered()), this, SLOT(actionExportCSG())); connect(this->fileActionExportImage, SIGNAL(triggered()), this, SLOT(actionExportImage())); connect(this->designActionFlushCaches, SIGNAL(triggered()), this, SLOT(actionFlushCaches())); #ifndef ENABLE_LIB3MF this->fileActionExport3MF->setVisible(false); #endif #ifndef ENABLE_3D_PRINTING this->designAction3DPrint->setVisible(false); this->designAction3DPrint->setEnabled(false); #endif // View menu #ifndef ENABLE_OPENCSG this->viewActionPreview->setVisible(false); #else connect(this->viewActionPreview, SIGNAL(triggered()), this, SLOT(viewModePreview())); if (!this->qglview->hasOpenCSGSupport()) { this->viewActionPreview->setEnabled(false); } #endif #ifdef ENABLE_CGAL connect(this->viewActionSurfaces, SIGNAL(triggered()), this, SLOT(viewModeSurface())); connect(this->viewActionWireframe, SIGNAL(triggered()), this, SLOT(viewModeWireframe())); #else this->viewActionSurfaces->setVisible(false); this->viewActionWireframe->setVisible(false); #endif connect(this->viewActionThrownTogether, SIGNAL(triggered()), this, SLOT(viewModeThrownTogether())); connect(this->viewActionShowEdges, SIGNAL(triggered()), this, SLOT(viewModeShowEdges())); connect(this->viewActionShowAxes, SIGNAL(triggered()), this, SLOT(viewModeShowAxes())); connect(this->viewActionShowCrosshairs, SIGNAL(triggered()), this, SLOT(viewModeShowCrosshairs())); connect(this->viewActionShowScaleProportional, SIGNAL(triggered()), this, SLOT(viewModeShowScaleProportional())); connect(this->viewActionAnimate, SIGNAL(triggered()), this, SLOT(viewModeAnimate())); connect(this->viewActionTop, SIGNAL(triggered()), this, SLOT(viewAngleTop())); connect(this->viewActionBottom, SIGNAL(triggered()), this, SLOT(viewAngleBottom())); connect(this->viewActionLeft, SIGNAL(triggered()), this, SLOT(viewAngleLeft())); connect(this->viewActionRight, SIGNAL(triggered()), this, SLOT(viewAngleRight())); connect(this->viewActionFront, SIGNAL(triggered()), this, SLOT(viewAngleFront())); connect(this->viewActionBack, SIGNAL(triggered()), this, SLOT(viewAngleBack())); connect(this->viewActionDiagonal, SIGNAL(triggered()), this, SLOT(viewAngleDiagonal())); connect(this->viewActionCenter, SIGNAL(triggered()), this, SLOT(viewCenter())); connect(this->viewActionResetView, SIGNAL(triggered()), this, SLOT(viewResetView())); connect(this->viewActionViewAll, SIGNAL(triggered()), this, SLOT(viewAll())); connect(this->viewActionPerspective, SIGNAL(triggered()), this, SLOT(viewPerspective())); connect(this->viewActionOrthogonal, SIGNAL(triggered()), this, SLOT(viewOrthogonal())); connect(this->viewActionZoomIn, SIGNAL(triggered()), qglview, SLOT(ZoomIn())); connect(this->viewActionZoomOut, SIGNAL(triggered()), qglview, SLOT(ZoomOut())); connect(this->viewActionHideToolBars, SIGNAL(triggered()), this, SLOT(hideToolbars())); connect(this->viewActionHideEditor, SIGNAL(triggered()), this, SLOT(hideEditor())); connect(this->viewActionHideConsole, SIGNAL(triggered()), this, SLOT(hideConsole())); connect(this->viewActionHideParameters, SIGNAL(triggered()), this, SLOT(hideParameters())); // Help menu connect(this->helpActionAbout, SIGNAL(triggered()), this, SLOT(helpAbout())); connect(this->helpActionHomepage, SIGNAL(triggered()), this, SLOT(helpHomepage())); connect(this->helpActionManual, SIGNAL(triggered()), this, SLOT(helpManual())); connect(this->helpActionCheatSheet, SIGNAL(triggered()), this, SLOT(helpCheatSheet())); connect(this->helpActionLibraryInfo, SIGNAL(triggered()), this, SLOT(helpLibrary())); connect(this->helpActionFontInfo, SIGNAL(triggered()), this, SLOT(helpFontInfo())); #ifdef OPENSCAD_UPDATER this->menuBar()->addMenu(AutoUpdater::updater()->updateMenu); #endif setCurrentOutput(); std::string helptitle = "OpenSCAD " + openscad_versionnumber + "\nhttps://www.openscad.org/\n"; PRINT(helptitle); PRINT(copyrighttext); if (!filename.isEmpty()) { openFile(filename); } else { setFileName(""); } updateRecentFileActions(); connect(editor, SIGNAL(contentsChanged()), this, SLOT(animateUpdateDocChanged())); connect(editor, SIGNAL(contentsChanged()), this, SLOT(setContentsChanged())); connect(editor, SIGNAL(modificationChanged(bool)), this, SLOT(setWindowModified(bool))); connect(this->qglview, SIGNAL(doAnimateUpdate()), this, SLOT(animateUpdate())); connect(Preferences::inst(), SIGNAL(requestRedraw()), this->qglview, SLOT(updateGL())); connect(Preferences::inst(), SIGNAL(updateMouseCentricZoom(bool)), this->qglview, SLOT(setMouseCentricZoom(bool))); connect(Preferences::inst(), SIGNAL(updateMdiMode(bool)), this, SLOT(updateMdiMode(bool))); connect(Preferences::inst(), SIGNAL(updateReorderMode(bool)), this, SLOT(updateReorderMode(bool))); connect(Preferences::inst(), SIGNAL(updateUndockMode(bool)), this, SLOT(updateUndockMode(bool))); connect(Preferences::inst(), SIGNAL(fontChanged(const QString&,uint)), editor, SLOT(initFont(const QString&,uint))); connect(Preferences::inst(), SIGNAL(openCSGSettingsChanged()), this, SLOT(openCSGSettingsChanged())); connect(Preferences::inst(), SIGNAL(syntaxHighlightChanged(const QString&)), editor, SLOT(setHighlightScheme(const QString&))); connect(Preferences::inst(), SIGNAL(colorSchemeChanged(const QString&)), this, SLOT(setColorScheme(const QString&))); Preferences::inst()->apply(); QString cs = Preferences::inst()->getValue("3dview/colorscheme").toString(); this->setColorScheme(cs); //find and replace panel connect(this->findTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectFindType(int))); connect(this->findInputField, SIGNAL(textChanged(QString)), this, SLOT(findString(QString))); connect(this->findInputField, SIGNAL(returnPressed()), this->findNextButton, SLOT(animateClick())); find_panel->installEventFilter(this); if (QApplication::clipboard()->supportsFindBuffer()) { connect(this->findInputField, SIGNAL(textChanged(QString)), this, SLOT(updateFindBuffer(QString))); connect(QApplication::clipboard(), SIGNAL(findBufferChanged()), this, SLOT(findBufferChanged())); // With Qt 4.8.6, there seems to be a bug that often gives an incorrect findbuffer content when // the app receives focus for the first time this->findInputField->setText(QApplication::clipboard()->text(QClipboard::FindBuffer)); } connect(this->findPrevButton, SIGNAL(clicked()), this, SLOT(findPrev())); connect(this->findNextButton, SIGNAL(clicked()), this, SLOT(findNext())); connect(this->cancelButton, SIGNAL(clicked()), this, SLOT(hideFind())); connect(this->replaceButton, SIGNAL(clicked()), this, SLOT(replace())); connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(this->replaceInputField, SIGNAL(returnPressed()), this->replaceButton, SLOT(animateClick())); addKeyboardShortCut(this->viewerToolBar->actions()); addKeyboardShortCut(this->editortoolbar->actions()); InputDriverManager::instance()->registerActions(this->menuBar()->actions(),""); Preferences* instance = Preferences::inst(); instance->ButtonConfig->init(); initActionIcon(fileActionNew, ":/images/blackNew.png", ":/images/Document-New-128.png"); initActionIcon(fileActionOpen, ":/images/Open-32.png", ":/images/Open-128.png"); initActionIcon(fileActionSave, ":/images/Save-32.png", ":/images/Save-128.png"); initActionIcon(editActionZoomTextIn, ":/images/zoom-text-in.png", ":/images/zoom-text-in-white.png"); initActionIcon(editActionZoomTextOut, ":/images/zoom-text-out.png", ":/images/zoom-text-out-white.png"); initActionIcon(designActionRender, ":/images/render-32.png", ":/images/render-32-white.png"); initActionIcon(designAction3DPrint, ":/images/3dprint-32.png", ":/images/3dprint-32-white.png"); initActionIcon(viewActionShowAxes, ":/images/blackaxes.png", ":/images/axes.png"); initActionIcon(viewActionShowEdges, ":/images/Rotation-32.png", ":/images/grid.png"); initActionIcon(viewActionZoomIn, ":/images/zoomin.png", ":/images/Zoom-In-32.png"); initActionIcon(viewActionZoomOut, ":/images/zoomout.png", ":/images/Zoom-Out-32.png"); initActionIcon(viewActionTop, ":/images/blackUp.png", ":/images/up.png"); initActionIcon(viewActionBottom, ":/images/blackbottom.png", ":/images/bottom.png"); initActionIcon(viewActionLeft, ":/images/blackleft.png", ":/images/left.png"); initActionIcon(viewActionRight, ":/images/rightright.png", ":/images/right.png"); initActionIcon(viewActionFront, ":/images/blackfront.png", ":/images/front.png"); initActionIcon(viewActionBack, ":/images/blackback.png", ":/images/back.png"); initActionIcon(viewActionSurfaces, ":/images/surface.png", ":/images/surfaceWhite.png"); initActionIcon(viewActionWireframe, ":/images/wireframe1.png", ":/images/wireframeWhite.png"); initActionIcon(viewActionShowCrosshairs, ":/images/cross.png", ":/images/crosswhite.png"); initActionIcon(viewActionPerspective, ":/images/perspective1.png", ":/images/perspective1white.png"); initActionIcon(viewActionOrthogonal, ":/images/orthogonal.png", ":/images/orthogonalwhite.png"); initActionIcon(designActionPreview, ":/images/preview-32.png", ":/images/preview-32-white.png"); initActionIcon(viewActionAnimate, ":/images/animate.png", ":/images/animate.png"); initActionIcon(fileActionExportSTL, ":/images/STL.png", ":/images/STL-white.png"); initActionIcon(fileActionExportAMF, ":/images/AMF.png", ":/images/AMF-white.png"); initActionIcon(fileActionExport3MF, ":/images/3MF.png", ":/images/3MF-white.png"); initActionIcon(fileActionExportOFF, ":/images/OFF.png", ":/images/OFF-white.png"); initActionIcon(fileActionExportDXF, ":/images/DXF.png", ":/images/DXF-white.png"); initActionIcon(fileActionExportSVG, ":/images/SVG.png", ":/images/SVG-white.png"); initActionIcon(fileActionExportCSG, ":/images/CSG.png", ":/images/CSG-white.png"); initActionIcon(fileActionExportImage, ":/images/PNG.png", ":/images/PNG-white.png"); initActionIcon(viewActionViewAll, ":/images/zoom-all.png", ":/images/zoom-all-white.png"); initActionIcon(editActionUndo, ":/images/Command-Undo-32.png", ":/images/Command-Undo-32-white.png"); initActionIcon(editActionRedo, ":/images/Command-Redo-32.png", ":/images/Command-Redo-32-white.png"); initActionIcon(editActionUnindent, ":/images/Decrease-Indent-32.png", ":/images/Decrease-Indent-32-white.png"); initActionIcon(editActionIndent, ":/images/Increase-Indent-32.png", ":/images/Increase-Indent-32-white.png"); initActionIcon(viewActionResetView, ":/images/Command-Reset-32.png", ":/images/Command-Reset-32-white.png"); initActionIcon(viewActionShowScaleProportional, ":/images/scalemarkers.png", ":/images/scalemarkers-white.png"); // fetch window states to be restored after restoreState() call bool hideConsole = settings.value("view/hideConsole").toBool(); bool hideEditor = settings.value("view/hideEditor").toBool(); bool hideCustomizer = settings.value("view/hideCustomizer").toBool(); bool hideToolbar = settings.value("view/hideToolbar").toBool(); // make sure it looks nice.. auto windowState = settings.value("window/state", QByteArray()).toByteArray(); restoreState(windowState); resize(settings.value("window/size", QSize(800, 600)).toSize()); move(settings.value("window/position", QPoint(0, 0)).toPoint()); updateWindowSettings(hideConsole, hideEditor, hideCustomizer, hideToolbar); if (windowState.size() == 0) { /* * This triggers only in case the configuration file has no * window state information (or no configuration file at all). * When this happens, the editor would default to a very ugly * width due to the dock widget layout. This overwrites the * value reported via sizeHint() to a width a bit smaller than * half the main window size (either the one loaded from the * configuration or the default value of 800). * The height is only a dummy value which will be essentially * ignored by the layouting as the editor is set to expand to * fill the available space. */ editor->setInitialSizeHint(QSize((5 * this->width() / 11), 100)); } else { #ifdef Q_OS_WIN // Try moving the main window into the display range, this // can occur when closing OpenSCAD on a second monitor which // is not available at the time the application is started // again. // On Windows that causes the main window to open in a not // easily reachable place. auto desktop = QApplication::desktop(); auto desktopRect = desktop->frameGeometry().adjusted(250, 150, -250, -150).normalized(); auto windowRect = frameGeometry(); if (!desktopRect.intersects(windowRect)) { windowRect.moveCenter(desktopRect.center()); windowRect = windowRect.intersected(desktopRect); move(windowRect.topLeft()); resize(windowRect.size()); } #endif } connect(this->editorDock, SIGNAL(topLevelChanged(bool)), this, SLOT(editorTopLevelChanged(bool))); connect(this->consoleDock, SIGNAL(topLevelChanged(bool)), this, SLOT(consoleTopLevelChanged(bool))); connect(this->parameterDock, SIGNAL(topLevelChanged(bool)), this, SLOT(parameterTopLevelChanged(bool))); // display this window and check for OpenGL 2.0 (OpenCSG) support viewModeThrownTogether(); show(); #ifdef ENABLE_OPENCSG viewModePreview(); #else viewModeThrownTogether(); #endif loadViewSettings(); loadDesignSettings(); setAcceptDrops(true); clearCurrentOutput(); this->console->setMaximumBlockCount(5000); } void MainWindow::initActionIcon(QAction *action, const char *darkResource, const char *lightResource) { int defaultcolor = viewerToolBar->palette().background().color().lightness(); const char *resource = (defaultcolor > 165) ? darkResource : lightResource; action->setIcon(QIcon(resource)); } void MainWindow::addKeyboardShortCut(const QList &actions) { for (auto &action : actions) { // prevent adding shortcut twice if action is added to multiple toolbars if (action->toolTip().contains(" ")) { continue; } const QString shortCut(action->shortcut().toString(QKeySequence::NativeText)); if (shortCut.isEmpty()) { continue; } const QString toolTip("%1  %2"); action->setToolTip(toolTip.arg(action->toolTip(), shortCut)); } } void MainWindow::updateActionUndoState() { editActionUndo->setEnabled(editor->canUndo()); } /** * Update window settings that get overwritten by the restoreState() * Qt call. So the values are loaded before the call and restored here * regardless of the (potential outdated) serialized state. */ void MainWindow::updateWindowSettings(bool console, bool editor, bool customizer, bool toolbar) { viewActionHideConsole->setChecked(console); hideConsole(); viewActionHideEditor->setChecked(editor); hideEditor(); viewActionHideToolBars->setChecked(toolbar); hideToolbars(); viewActionHideParameters->setChecked(customizer); hideParameters(); } void MainWindow::onAxisChanged(InputEventAxisChanged *) { } void MainWindow::onButtonChanged(InputEventButtonChanged *) { } void MainWindow::onTranslateEvent(InputEventTranslate *event) { double zoomFactor = 0.001 * qglview->cam.zoomValue(); if(event->viewPortRelative){ qglview->translate(event->x, event->y, event->z, event->relative, true); }else{ qglview->translate(zoomFactor * event->x, event->y, zoomFactor * event->z, event->relative, false); } } void MainWindow::onRotateEvent(InputEventRotate *event) { qglview->rotate(event->x, event->y, event->z, event->relative); } void MainWindow::onRotate2Event(InputEventRotate2 *event) { qglview->rotate2(event->x, event->y, event->z); } void MainWindow::onActionEvent(InputEventAction *event) { QAction *action = findAction(this->menuBar()->actions(), event->action); if (action) { action->trigger(); }else if("viewActionTogglePerspective" == event->action){ viewTogglePerspective(); } } void MainWindow::onZoomEvent(InputEventZoom *event) { qglview->zoom(event->zoom, event->relative); } void MainWindow::loadViewSettings(){ QSettingsCached settings; if (settings.value("view/showEdges").toBool()) { viewActionShowEdges->setChecked(true); viewModeShowEdges(); } if (settings.value("view/showAxes", true).toBool()) { viewActionShowAxes->setChecked(true); viewModeShowAxes(); } if (settings.value("view/showCrosshairs").toBool()) { viewActionShowCrosshairs->setChecked(true); viewModeShowCrosshairs(); } if (settings.value("view/showScaleProportional", true).toBool()) { viewActionShowScaleProportional->setChecked(true); viewModeShowScaleProportional(); } if (settings.value("view/orthogonalProjection").toBool()) { viewOrthogonal(); } else { viewPerspective(); } updateMdiMode(settings.value("advanced/mdi").toBool()); updateUndockMode(settings.value("advanced/undockableWindows").toBool()); updateReorderMode(settings.value("advanced/reorderWindows").toBool()); } void MainWindow::loadDesignSettings() { QSettingsCached settings; if (settings.value("design/autoReload", true).toBool()) { designActionAutoReload->setChecked(true); } auto polySetCacheSizeMB = Preferences::inst()->getValue("advanced/polysetCacheSizeMB").toUInt(); GeometryCache::instance()->setMaxSizeMB(polySetCacheSizeMB); #ifdef ENABLE_CGAL auto cgalCacheSizeMB = Preferences::inst()->getValue("advanced/cgalCacheSizeMB").toUInt(); CGALCache::instance()->setMaxSizeMB(cgalCacheSizeMB); #endif } void MainWindow::updateMdiMode(bool mdi) { MainWindow::mdiMode = mdi; } void MainWindow::updateUndockMode(bool undockMode) { MainWindow::undockMode = undockMode; if (undockMode) { editorDock->setFeatures(editorDock->features() | QDockWidget::DockWidgetFloatable); consoleDock->setFeatures(consoleDock->features() | QDockWidget::DockWidgetFloatable); parameterDock->setFeatures(parameterDock->features() | QDockWidget::DockWidgetFloatable); } else { if (editorDock->isFloating()) { editorDock->setFloating(false); } editorDock->setFeatures(editorDock->features() & ~QDockWidget::DockWidgetFloatable); if (consoleDock->isFloating()) { consoleDock->setFloating(false); } consoleDock->setFeatures(consoleDock->features() & ~QDockWidget::DockWidgetFloatable); if (parameterDock->isFloating()) { parameterDock->setFloating(false); } parameterDock->setFeatures(parameterDock->features() & ~QDockWidget::DockWidgetFloatable); } } void MainWindow::updateReorderMode(bool reorderMode) { MainWindow::reorderMode = reorderMode; editorDock->setTitleBarWidget(reorderMode ? nullptr : editorDockTitleWidget); consoleDock->setTitleBarWidget(reorderMode ? nullptr : consoleDockTitleWidget); parameterDock->setTitleBarWidget(reorderMode ? nullptr : parameterDockTitleWidget); } MainWindow::~MainWindow() { // If root_module is not null then it will be the same as parsed_module, // so no need to delete it. delete parsed_module; delete root_node; #ifdef ENABLE_CGAL this->root_geom.reset(); delete this->cgalRenderer; #endif #ifdef ENABLE_OPENCSG delete this->opencsgRenderer; #endif delete this->thrownTogetherRenderer; scadApp->windowManager.remove(this); if (scadApp->windowManager.getWindows().size() == 0) { // Quit application even in case some other windows like // Preferences are still open. this->quit(); } } void MainWindow::showProgress() { updateStatusBar(qobject_cast(sender())); } void MainWindow::report_func(const class AbstractNode*, void *vp, int mark) { // limit to progress bar update calls to 5 per second static const qint64 MIN_TIMEOUT = 200; if (progressThrottle->hasExpired(MIN_TIMEOUT)) { progressThrottle->start(); auto thisp = static_cast(vp); auto v = static_cast((mark*1000.0) / progress_report_count); auto permille = v < 1000 ? v : 999; if (permille > thisp->progresswidget->value()) { QMetaObject::invokeMethod(thisp->progresswidget, "setValue", Qt::QueuedConnection, Q_ARG(int, permille)); QApplication::processEvents(); } // FIXME: Check if cancel was requested by e.g. Application quit if (thisp->progresswidget->wasCanceled()) throw ProgressCancelException(); } } bool MainWindow::network_progress_func(const double permille) { QMetaObject::invokeMethod(this->progresswidget, "setValue", Qt::QueuedConnection, Q_ARG(int, (int)permille)); return (progresswidget && progresswidget->wasCanceled()); } /*! Open the given file. In MDI mode a new window is created if the current one is not empty. Otherwise the current window content is overwritten. Any check whether to replace the content have to be made before. */ void MainWindow::openFile(const QString &new_filename) { if (MainWindow::mdiMode) { if (!editor->toPlainText().isEmpty()) { new MainWindow(new_filename); return; } } setCurrentOutput(); editor->setPlainText(""); this->last_compiled_doc = ""; const QFileInfo fileInfo(new_filename); const auto suffix = fileInfo.suffix().toLower(); const auto knownFileType = knownFileExtensions.contains(suffix); const auto cmd = knownFileExtensions[suffix]; if (knownFileType && cmd.isEmpty()) { setFileName(new_filename); updateRecentFiles(); } else { setFileName(""); editor->setPlainText(cmd.arg(new_filename)); } fileChangedOnDisk(); // force cached autoReloadId to update refreshDocument(); clearExportPaths(); hideCurrentOutput(); // Initial parse for customizer, hide any errors to avoid duplication try { parseTopLevelDocument(true); } catch (const HardWarningException&) { exceptionCleanup(); } this->last_compiled_doc = ""; // undo the damage so F4 works clearCurrentOutput(); } void MainWindow::setFileName(const QString &filename) { if (filename.isEmpty()) { this->fileName.clear(); setWindowFilePath(_("Untitled.scad")); this->top_ctx.setDocumentPath(currentdir); } else { QFileInfo fileinfo(filename); this->fileName = fileinfo.absoluteFilePath(); setWindowFilePath(this->fileName); this->parameterWidget->readFile(this->fileName); QDir::setCurrent(fileinfo.dir().absolutePath()); this->top_ctx.setDocumentPath(fileinfo.dir().absolutePath().toLocal8Bit().constData()); } editorTopLevelChanged(editorDock->isFloating()); changedTopLevelConsole(consoleDock->isFloating()); parameterTopLevelChanged(parameterDock->isFloating()); } void MainWindow::updateRecentFiles() { // Check that the canonical file path exists - only update recent files // if it does. Should prevent empty list items on initial open etc. QFileInfo fileinfo(this->fileName); auto infoFileName = fileinfo.absoluteFilePath(); QSettingsCached settings; // already set up properly via main.cpp auto files = settings.value("recentFileList").toStringList(); files.removeAll(infoFileName); files.prepend(infoFileName); while (files.size() > UIUtils::maxRecentFiles) files.removeLast(); settings.setValue("recentFileList", files); for (auto &widget : QApplication::topLevelWidgets()) { auto mainWin = qobject_cast(widget); if (mainWin) { mainWin->updateRecentFileActions(); } } } void MainWindow::updatedAnimTval() { bool t_ok; double t = this->e_tval->text().toDouble(&t_ok); // Clamp t to 0-1 if (t_ok) { this->anim_tval = t < 0 ? 0.0 : ((t > 1.0) ? 1.0 : t); } else { this->anim_tval = 0.0; } emit actionRenderPreview(true); } void MainWindow::updatedAnimFps() { bool fps_ok; double fps = this->e_fps->text().toDouble(&fps_ok); animate_timer->stop(); if (fps_ok && fps > 0 && this->anim_numsteps > 0) { this->anim_step = int(this->anim_tval * this->anim_numsteps) % this->anim_numsteps; animate_timer->setSingleShot(false); animate_timer->setInterval(int(1000 / fps)); animate_timer->start(); } } void MainWindow::updatedAnimSteps() { bool steps_ok; int numsteps = this->e_fsteps->text().toInt(&steps_ok); if (steps_ok) { this->anim_numsteps = numsteps; updatedAnimFps(); // Make sure we start } else { this->anim_numsteps = 0; } anim_dumping=false; } void MainWindow::updatedAnimDump(bool checked) { if (!checked) this->anim_dumping = false; } // Only called from animate_timer void MainWindow::updateTVal() { if (this->anim_numsteps == 0) return; if (viewActionHideParameters->isVisible()) { if (this->parameterWidget->childHasFocus()) return; } if (this->anim_numsteps > 1) { this->anim_step = (this->anim_step + 1) % this->anim_numsteps; this->anim_tval = 1.0 * this->anim_step / this->anim_numsteps; } else if (this->anim_numsteps > 0) { this->anim_step = 0; this->anim_tval = 0.0; } const QString txt = QString::number(this->anim_tval, 'f', 5); this->e_tval->setText(txt); } void MainWindow::refreshDocument() { setCurrentOutput(); if (!this->fileName.isEmpty()) { QFile file(this->fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { PRINTB("Failed to open file %s: %s", this->fileName.toLocal8Bit().constData() % file.errorString().toLocal8Bit().constData()); } else { QTextStream reader(&file); reader.setCodec("UTF-8"); auto text = reader.readAll(); PRINTB("Loaded design '%s'.", this->fileName.toLocal8Bit().constData()); if (editor->toPlainText() != text) { editor->setPlainText(text); setContentsChanged(); } } } setCurrentOutput(); } /*! compiles the design. Calls compileDone() if anything was compiled */ void MainWindow::compile(bool reload, bool forcedone, bool rebuildParameterWidget) { OpenSCAD::hardwarnings = Preferences::inst()->getValue("advanced/enableHardwarnings").toBool(); OpenSCAD::parameterCheck = Preferences::inst()->getValue("advanced/enableParameterCheck").toBool(); OpenSCAD::rangeCheck = Preferences::inst()->getValue("advanced/enableParameterRangeCheck").toBool(); try{ bool shouldcompiletoplevel = false; bool didcompile = false; compileErrors = 0; compileWarnings = 0; this->renderingTime.start(); // Reload checks the timestamp of the toplevel file and refreshes if necessary, if (reload) { // Refresh files if it has changed on disk if (fileChangedOnDisk() && checkEditorModified()) { shouldcompiletoplevel = true; refreshDocument(); if (Preferences::inst()->getValue("advanced/autoReloadRaise").toBool()) { // reloading the 'same' document brings the 'old' one to front. this->raise(); } } // If the file hasn't changed, we might still need to compile it // if we haven't yet compiled the current text. else { auto current_doc = editor->toPlainText(); if (current_doc.size() && last_compiled_doc.size() == 0) { shouldcompiletoplevel = true; } } } else { shouldcompiletoplevel = true; } if (this->parsed_module) { auto mtime = this->parsed_module->includesChanged(); if (mtime > this->includes_mtime) { this->includes_mtime = mtime; shouldcompiletoplevel = true; } } // Parsing and dependency handling must run to completion even with stop on errors to prevent auto // reload picking up where it left off, thwarting the stop, so we turn off exceptions in PRINT. no_exceptions_for_warnings(); if (shouldcompiletoplevel) { if (editor->isContentModified()) saveBackup(); parseTopLevelDocument(rebuildParameterWidget); didcompile = true; } if (didcompile && parser_error_pos != last_parser_error_pos) { if(last_parser_error_pos >= 0) emit unhighlightLastError(); if (parser_error_pos >= 0) emit highlightError( parser_error_pos ); last_parser_error_pos = parser_error_pos; } if (this->root_module) { auto mtime = this->root_module->handleDependencies(); if (mtime > this->deps_mtime) { this->deps_mtime = mtime; PRINTB("Used file cache size: %d files", ModuleCache::instance()->size()); didcompile = true; } } // Had any errors in the parse that would have caused exceptions via PRINT. if(would_have_thrown()) throw HardWarningException(""); // If we're auto-reloading, listen for a cascade of changes by starting a timer // if something changed _and_ there are any external dependencies if (reload && didcompile && this->root_module) { if (this->root_module->hasIncludes() || this->root_module->usesLibraries()) { this->waitAfterReloadTimer->start(); this->procevents = false; return; } } compileDone(didcompile | forcedone); }catch(const HardWarningException&){ exceptionCleanup(); } } void MainWindow::waitAfterReload() { no_exceptions_for_warnings(); auto mtime = this->root_module->handleDependencies(); auto stop = would_have_thrown(); if (mtime > this->deps_mtime) this->deps_mtime = mtime; else if(!stop) { compile(true, true); // In case file itself or top-level includes changed during dependency updates return; } this->waitAfterReloadTimer->start(); } void MainWindow::on_toolButtonCompileResultClose_clicked() { frameCompileResult->hide(); } void MainWindow::updateCompileResult() { if ((compileErrors == 0) && (compileWarnings == 0)) { frameCompileResult->hide(); return; } auto s = Settings::Settings::inst(); if (!s->get(Settings::Settings::showWarningsIn3dView).toBool()) { return; } QString msg; if (compileErrors > 0) { if (fileName.isEmpty()) { msg = QString(_("Compile error.")); } else { QFileInfo fileInfo(fileName); msg = QString(_("Error while compiling '%1'.")).arg(fileInfo.fileName()); } toolButtonCompileResultIcon->setIcon(QIcon(QString::fromUtf8(":/icons/information-icons-error.png"))); } else { const char *fmt = ngettext("Compilation generated %1 warning.", "Compilation generated %1 warnings.", compileWarnings); msg = QString(fmt).arg(compileWarnings); toolButtonCompileResultIcon->setIcon(QIcon(QString::fromUtf8(":/icons/information-icons-warning.png"))); } QFontMetrics fm(labelCompileResultMessage->font()); int sizeIcon = std::max(12, std::min(32, fm.height())); int sizeClose = std::max(10, std::min(32, fm.height()) - 4); toolButtonCompileResultIcon->setIconSize(QSize(sizeIcon, sizeIcon)); toolButtonCompileResultClose->setIconSize(QSize(sizeClose, sizeClose)); msg += _(" For details see console window."); labelCompileResultMessage->setText(msg); frameCompileResult->show(); } void MainWindow::compileDone(bool didchange) { OpenSCAD::hardwarnings = Preferences::inst()->getValue("advanced/enableHardwarnings").toBool(); try{ const char *callslot; if (didchange) { updateTemporalVariables(); instantiateRoot(); updateCompileResult(); callslot = afterCompileSlot; } else { callslot = "compileEnded"; } this->procevents = false; QMetaObject::invokeMethod(this, callslot); }catch(const HardWarningException&){ exceptionCleanup(); } } void MainWindow::compileEnded() { clearCurrentOutput(); GuiLocker::unlock(); if (designActionAutoReload->isChecked()) autoReloadTimer->start(); } void MainWindow::instantiateRoot() { // Go on and instantiate root_node, then call the continuation slot // Invalidate renderers before we kill the CSG tree this->qglview->setRenderer(nullptr); #ifdef ENABLE_OPENCSG delete this->opencsgRenderer; this->opencsgRenderer = nullptr; #endif delete this->thrownTogetherRenderer; this->thrownTogetherRenderer = nullptr; // Remove previous CSG tree delete this->absolute_root_node; this->absolute_root_node = nullptr; this->csgRoot.reset(); this->normalizedRoot.reset(); this->root_products.reset(); this->root_node = nullptr; this->tree.setRoot(nullptr); boost::filesystem::path doc(fileName.toStdString()); this->tree.setDocumentPath(doc.remove_filename().string()); if (this->root_module) { // Evaluate CSG tree PRINT("Compiling design (CSG Tree generation)..."); this->processEvents(); AbstractNode::resetIndexCounter(); // split these two lines - gcc 4.7 bug auto mi = ModuleInstantiation( "group" ); this->root_inst = mi; FileContext filectx(&top_ctx); this->absolute_root_node = this->root_module->instantiateWithFileContext(&filectx, &this->root_inst, nullptr); this->updateCamera(filectx); if (this->absolute_root_node) { // Do we have an explicit root node (! modifier)? if (!(this->root_node = find_root_tag(this->absolute_root_node))) { this->root_node = this->absolute_root_node; } // FIXME: Consider giving away ownership of root_node to the Tree, or use reference counted pointers this->tree.setRoot(this->root_node); } } if (!this->root_node) { if (parser_error_pos < 0) { PRINT("ERROR: Compilation failed! (no top level object found)"); } else { PRINT("ERROR: Compilation failed!"); } PRINT(" "); this->processEvents(); } } /*! Generates CSG tree for OpenCSG evaluation. Assumes that the design has been parsed and evaluated (this->root_node is set) */ void MainWindow::compileCSG() { OpenSCAD::hardwarnings = Preferences::inst()->getValue("advanced/enableHardwarnings").toBool(); try{ assert(this->root_node); PRINT("Compiling design (CSG Products generation)..."); this->processEvents(); // Main CSG evaluation this->progresswidget = new ProgressWidget(this); connect(this->progresswidget, SIGNAL(requestShow()), this, SLOT(showProgress())); #ifdef ENABLE_CGAL GeometryEvaluator geomevaluator(this->tree); #else // FIXME: Will we support this? #endif #ifdef ENABLE_OPENCSG CSGTreeEvaluator csgrenderer(this->tree, &geomevaluator); #endif progress_report_prep(this->root_node, report_func, this); try { #ifdef ENABLE_OPENCSG this->processEvents(); this->csgRoot = csgrenderer.buildCSGTree(*root_node); #endif GeometryCache::instance()->print(); #ifdef ENABLE_CGAL CGALCache::instance()->print(); #endif this->processEvents(); } catch (const ProgressCancelException &) { PRINT("CSG generation cancelled."); }catch(const HardWarningException &){ PRINT("CSG generation cancelled due to hardwarning being enabled."); } progress_report_fin(); updateStatusBar(nullptr); PRINT("Compiling design (CSG Products normalization)..."); this->processEvents(); size_t normalizelimit = 2 * Preferences::inst()->getValue("advanced/openCSGLimit").toUInt(); CSGTreeNormalizer normalizer(normalizelimit); if (this->csgRoot) { this->normalizedRoot = normalizer.normalize(this->csgRoot); if (this->normalizedRoot) { this->root_products.reset(new CSGProducts()); this->root_products->import(this->normalizedRoot); } else { this->root_products.reset(); PRINT("WARNING: CSG normalization resulted in an empty tree"); this->processEvents(); } } const std::vector > &highlight_terms = csgrenderer.getHighlightNodes(); if (highlight_terms.size() > 0) { PRINTB("Compiling highlights (%d CSG Trees)...", highlight_terms.size()); this->processEvents(); this->highlights_products.reset(new CSGProducts()); for (unsigned int i = 0; i < highlight_terms.size(); i++) { auto nterm = normalizer.normalize(highlight_terms[i]); this->highlights_products->import(nterm); } } else { this->highlights_products.reset(); } const auto &background_terms = csgrenderer.getBackgroundNodes(); if (background_terms.size() > 0) { PRINTB("Compiling background (%d CSG Trees)...", background_terms.size()); this->processEvents(); this->background_products.reset(new CSGProducts()); for (unsigned int i = 0; i < background_terms.size(); i++) { auto nterm = normalizer.normalize(background_terms[i]); this->background_products->import(nterm); } } else { this->background_products.reset(); } if (this->root_products && (this->root_products->size() > Preferences::inst()->getValue("advanced/openCSGLimit").toUInt())) { PRINTB("UI-WARNING: Normalized tree has %d elements!", this->root_products->size()); PRINT("UI-WARNING: OpenCSG rendering has been disabled."); } #ifdef ENABLE_OPENCSG else { PRINTB("Normalized CSG tree has %d elements", (this->root_products ? this->root_products->size() : 0)); this->opencsgRenderer = new OpenCSGRenderer(this->root_products, this->highlights_products, this->background_products, this->qglview->shaderinfo); } #endif this->thrownTogetherRenderer = new ThrownTogetherRenderer(this->root_products, this->highlights_products, this->background_products); PRINT("Compile and preview finished."); int s = this->renderingTime.elapsed() / 1000; PRINTB("Total rendering time: %d hours, %d minutes, %d seconds\n", (s / (60*60)) % ((s / 60) % 60) % (s % 60)); this->processEvents(); }catch(const HardWarningException&){ exceptionCleanup(); } } void MainWindow::actionNew() { if (MainWindow::mdiMode) { new MainWindow(QString()); } else { if (!maybeSave()) return; setFileName(""); editor->setPlainText(""); clearExportPaths(); } } void MainWindow::actionOpen() { auto fileInfo = UIUtils::openFile(this); if (!fileInfo.exists()) { return; } if (!MainWindow::mdiMode && !maybeSave()) { return; } openFile(fileInfo.filePath()); } void MainWindow::actionOpenRecent() { if (!MainWindow::mdiMode && !maybeSave()) { return; } auto action = qobject_cast(sender()); openFile(action->data().toString()); } void MainWindow::clearRecentFiles() { QSettingsCached settings; // already set up properly via main.cpp QStringList files; settings.setValue("recentFileList", files); updateRecentFileActions(); } void MainWindow::updateRecentFileActions() { auto files = UIUtils::recentFiles(); for (int i = 0; i < files.size(); ++i) { this->actionRecentFile[i]->setText(QFileInfo(files[i]).fileName()); this->actionRecentFile[i]->setData(files[i]); this->actionRecentFile[i]->setVisible(true); } for (int i = files.size(); i < UIUtils::maxRecentFiles; ++i) { this->actionRecentFile[i]->setVisible(false); } } void MainWindow::show_examples() { bool found_example = false; for (const auto &cat : UIUtils::exampleCategories()) { auto examples = UIUtils::exampleFiles(cat); auto menu = this->menuExamples->addMenu(gettext(cat.toStdString().c_str())); for (const auto &ex : examples) { auto openAct = new QAction(ex.fileName(), this); connect(openAct, SIGNAL(triggered()), this, SLOT(actionOpenExample())); menu->addAction(openAct); openAct->setData(ex.canonicalFilePath()); found_example = true; } } if (!found_example) { delete this->menuExamples; this->menuExamples = nullptr; } } void MainWindow::actionOpenExample() { if (!MainWindow::mdiMode && !maybeSave()) { return; } const auto action = qobject_cast(sender()); if (action) { const auto &path = action->data().toString(); openFile(path); } } void MainWindow::writeBackup(QFile *file) { // see MainWindow::saveBackup() file->resize(0); QTextStream writer(file); writer.setCodec("UTF-8"); writer << this->editor->toPlainText(); this->parameterWidget->writeBackupFile(file->fileName()); PRINTB("Saved backup file: %s", file->fileName().toUtf8().constData()); } void MainWindow::saveBackup() { auto path = PlatformUtils::backupPath(); if ((!fs::exists(path)) && (!PlatformUtils::createBackupPath())) { PRINTB("UI-WARNING: Cannot create backup path: %s", path); return; } auto backupPath = QString::fromLocal8Bit(path.c_str()); if (!backupPath.endsWith("/")) backupPath.append("/"); QString basename = "unsaved"; if (!this->fileName.isEmpty()) { auto fileInfo = QFileInfo(this->fileName); basename = fileInfo.baseName(); } if (!this->tempFile) { this->tempFile = new QTemporaryFile(backupPath.append(basename + "-backup-XXXXXXXX.scad")); } if ((!this->tempFile->isOpen()) && (! this->tempFile->open())) { PRINT("UI-WARNING: Failed to create backup file"); return; } return writeBackup(this->tempFile); } void MainWindow::saveError(const QIODevice &file, const std::string &msg) { const std::string messageFormat = msg + " %s (%s)"; const char *fileName = this->fileName.toLocal8Bit().constData(); PRINTB(messageFormat.c_str(), fileName % file.errorString().toLocal8Bit().constData()); const std::string dialogFormatStr = msg + "\n\"%1\"\n(%2)"; const QString dialogFormat(dialogFormatStr.c_str()); QMessageBox::warning(this, windowTitle(), dialogFormat.arg(this->fileName).arg(file.errorString())); } /*! Save current document. Should _always_ write to disk, since this is called by SaveAs - i.e. don't try to be smart and check for document modification here. */ void MainWindow::actionSave() { if (this->fileName.isEmpty()) { actionSaveAs(); return; } setCurrentOutput(); // If available (>= Qt 5.1), use QSaveFile to ensure the file is not // destroyed if the device is full. Unfortunately this is not working // as advertised (at least in Qt 5.3) as it does not detect the device // full properly and happily commits a 0 byte file. // Checking the QTextStream status flag after flush() seems to catch // this condition. QT_FILE_SAVE_CLASS file(this->fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { saveError(file, _("Failed to open file for writing")); } else { QTextStream writer(&file); writer.setCodec("UTF-8"); writer << this->editor->toPlainText(); writer.flush(); bool saveOk = writer.status() == QTextStream::Ok; QT_FILE_SAVE_COMMIT; if (saveOk) { PRINTB(_("Saved design '%s'."), this->fileName.toLocal8Bit().constData()); this->editor->setContentModified(false); } else { saveError(file, _("Error saving design")); } } updateRecentFiles(); } void MainWindow::actionSaveAs() { auto new_filename = QFileDialog::getSaveFileName(this, _("Save File"), this->fileName.isEmpty()?_("Untitled.scad"):this->fileName, _("OpenSCAD Designs (*.scad)")); if (!new_filename.isEmpty()) { if (QFileInfo(new_filename).suffix().isEmpty()) { new_filename.append(".scad"); // Manual overwrite check since Qt doesn't do it, when using the // defaultSuffix property QFileInfo info(new_filename); if (info.exists()) { if (QMessageBox::warning(this, windowTitle(), QString(_("%1 already exists.\nDo you want to replace it?")).arg(info.fileName()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) != QMessageBox::Yes) { return; } } } this->parameterWidget->writeFileIfNotEmpty(new_filename); setFileName(new_filename); clearExportPaths(); actionSave(); } } void MainWindow::actionShowLibraryFolder() { auto path = PlatformUtils::userLibraryPath(); if (!fs::exists(path)) { PRINTB("UI-WARNING: Library path %s doesn't exist. Creating", path); if (!PlatformUtils::createUserLibraryPath()) { PRINTB("UI-ERROR: Cannot create library path: %s",path); } } auto url = QString::fromStdString(path); //PRINTB("Opening file browser for %s", url.toStdString() ); QDesktopServices::openUrl(QUrl::fromLocalFile(url)); } void MainWindow::actionReload() { if (checkEditorModified()) { fileChangedOnDisk(); // force cached autoReloadId to update refreshDocument(); } } void MainWindow::copyViewportTranslation() { const auto vpt = qglview->cam.getVpt(); const QString txt = QString("[ %1, %2, %3 ]") .arg(vpt.x(), 0, 'f', 2) .arg(vpt.y(), 0, 'f', 2) .arg(vpt.z(), 0, 'f', 2); QApplication::clipboard()->setText(txt); } void MainWindow::copyViewportRotation() { const auto vpr = qglview->cam.getVpr(); const QString txt = QString("[ %1, %2, %3 ]") .arg(vpr.x(), 0, 'f', 2) .arg(vpr.y(), 0, 'f', 2) .arg(vpr.z(), 0, 'f', 2); QApplication::clipboard()->setText(txt); } void MainWindow::copyViewportDistance() { const QString txt = QString::number(qglview->cam.zoomValue(), 'f', 2); QApplication::clipboard()->setText(txt); } QList MainWindow::getTranslation() const { QList ret; ret.append(qglview->cam.object_trans.x()); ret.append(qglview->cam.object_trans.y()); ret.append(qglview->cam.object_trans.z()); return ret; } QList MainWindow::getRotation() const { QList ret; ret.append(qglview->cam.object_rot.x()); ret.append(qglview->cam.object_rot.y()); ret.append(qglview->cam.object_rot.z()); return ret; } void MainWindow::hideFind() { find_panel->hide(); this->findInputField->setFindCount(editor->updateFindIndicators(this->findInputField->text(), false)); this->processEvents(); } void MainWindow::showFind() { this->findInputField->setFindCount(editor->updateFindIndicators(this->findInputField->text())); this->processEvents(); findTypeComboBox->setCurrentIndex(0); replaceInputField->hide(); replaceButton->hide(); replaceAllButton->hide(); //replaceLabel->setVisible(false); find_panel->show(); if (!editor->selectedText().isEmpty()) { findInputField->setText(editor->selectedText()); } findInputField->setFocus(); findInputField->selectAll(); } void MainWindow::findString(QString textToFind) { this->findInputField->setFindCount(editor->updateFindIndicators(textToFind)); this->processEvents(); editor->find(textToFind); } void MainWindow::showFindAndReplace() { this->findInputField->setFindCount(editor->updateFindIndicators(this->findInputField->text())); this->processEvents(); findTypeComboBox->setCurrentIndex(1); replaceInputField->show(); replaceButton->show(); replaceAllButton->show(); //replaceLabel->setVisible(true); find_panel->show(); if (!editor->selectedText().isEmpty()) { findInputField->setText(editor->selectedText()); } findInputField->setFocus(); findInputField->selectAll(); } void MainWindow::selectFindType(int type) { if (type == 0) showFind(); if (type == 1) showFindAndReplace(); } void MainWindow::replace() { this->editor->replaceSelectedText(this->replaceInputField->text()); this->editor->find(this->findInputField->text()); } void MainWindow::replaceAll() { this->editor->replaceAll(this->findInputField->text(), this->replaceInputField->text()); } void MainWindow::convertTabsToSpaces() { const auto text = this->editor->toPlainText(); QString converted; int cnt = 4; for (int idx = 0;idx < text.length();idx++) { auto c = text.at(idx); if (c == '\t') { for (; cnt > 0; cnt--) { converted.append(' '); } } else { converted.append(c); } if (cnt <= 0 || c == '\n') { cnt = 5; } cnt--; } this->editor->setText(converted); } void MainWindow::findNext() { editor->find(this->findInputField->text(), true); } void MainWindow::findPrev() { editor->find(this->findInputField->text(), true, true); } void MainWindow::useSelectionForFind() { findInputField->setText(editor->selectedText()); } void MainWindow::updateFindBuffer(QString s) { QApplication::clipboard()->setText(s, QClipboard::FindBuffer); } void MainWindow::findBufferChanged() { auto t = QApplication::clipboard()->text(QClipboard::FindBuffer); // The convention seems to be to not update the search field if the findbuffer is empty if (!t.isEmpty()) { findInputField->setText(t); } } bool MainWindow::event(QEvent* event) { if (event->type() == InputEvent::eventType) { InputEvent *inputEvent = dynamic_cast(event); if (inputEvent) { inputEvent->deliver(this); } event->accept(); return true; } return QMainWindow::event(event); } bool MainWindow::eventFilter(QObject* obj, QEvent *event) { if (obj == find_panel) { if (event->type() == QEvent::KeyPress) { auto keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Escape) { this->hideFind(); return true; } } return false; } return QMainWindow::eventFilter(obj, event); } void MainWindow::updateTemporalVariables() { this->top_ctx.set_variable("$t", ValuePtr(this->anim_tval)); auto camVpt = qglview->cam.getVpt(); Value::VectorType vpt; vpt.push_back(ValuePtr(camVpt.x())); vpt.push_back(ValuePtr(camVpt.y())); vpt.push_back(ValuePtr(camVpt.z())); this->top_ctx.set_variable("$vpt", ValuePtr(vpt)); auto camVpr = qglview->cam.getVpr(); Value::VectorType vpr; vpr.push_back(ValuePtr(camVpr.x())); vpr.push_back(ValuePtr(camVpr.y())); vpr.push_back(ValuePtr(camVpr.z())); top_ctx.set_variable("$vpr", ValuePtr(vpr)); top_ctx.set_variable("$vpd", ValuePtr(qglview->cam.zoomValue())); } /*! * Update the viewport camera by evaluating the special variables. If they * are assigned on top-level, the values are used to change the camera * rotation, translation and distance. */ void MainWindow::updateCamera(const FileContext &ctx) { double x, y, z; const auto vpr = ctx.lookup_variable("$vpr"); if (vpr->getVec3(x, y, z, 0.0)){ qglview->cam.setVpr(x, y, z); }else{ PRINTB("UI-WARNING: Unable to convert $vpr=%s to a vec3 or vec2 of numbers", vpr->toEchoString()); } const auto vpt = ctx.lookup_variable("$vpt"); if (vpt->getVec3(x, y, z, 0.0)){ qglview->cam.setVpt(x, y, z); }else{ PRINTB("UI-WARNING: Unable to convert $vpt=%s to a vec3 or vec2 of numbers", vpt->toEchoString()); } const auto vpd = ctx.lookup_variable("$vpd"); if (vpd->type() == Value::ValueType::NUMBER){ qglview->cam.setVpd(vpd->toDouble()); }else{ PRINTB("UI-WARNING: Unable to convert $vpd=%s to a number", vpd->toEchoString()); } } /*! Returns true if the current document is a file on disk and that file has new content. Returns false if a file on disk has disappeared or if we haven't yet saved. */ bool MainWindow::fileChangedOnDisk() { if (!this->fileName.isEmpty()) { struct stat st; memset(&st, 0, sizeof(struct stat)); bool valid = (stat(this->fileName.toLocal8Bit(), &st) == 0); // If file isn't there, just return and use current editor text if (!valid) return false; auto newid = str(boost::format("%x.%x") % st.st_mtime % st.st_size); if (newid != this->autoReloadId) { this->autoReloadId = newid; return true; } } return false; } /*! Returns true if anything was compiled. */ void MainWindow::parseTopLevelDocument(bool rebuildParameterWidget) { this->parameterWidget->setEnabled(false); resetSuppressedMessages(); this->last_compiled_doc = editor->toPlainText(); auto fulltext = std::string(this->last_compiled_doc.toUtf8().constData()) + "\n\x03\n" + commandline_commands; auto fnameba = this->fileName.toLocal8Bit(); const char* fname = this->fileName.isEmpty() ? "" : fnameba; delete this->parsed_module; this->root_module = parse(this->parsed_module, fulltext, fname, fname, false) ? this->parsed_module : nullptr; if (this->root_module!=nullptr) { //add parameters as annotation in AST CommentParser::collectParameters(fulltext,this->root_module); this->parameterWidget->setParameters(this->root_module,rebuildParameterWidget); this->parameterWidget->applyParameters(this->root_module); this->parameterWidget->setEnabled(true); } } void MainWindow::changeParameterWidget() { viewActionHideParameters->setVisible(true); } void MainWindow::checkAutoReload() { if (!this->fileName.isEmpty()) { actionReloadRenderPreview(); } } void MainWindow::autoReloadSet(bool on) { QSettingsCached settings; settings.setValue("design/autoReload",designActionAutoReload->isChecked()); if (on) { autoReloadTimer->start(200); } else { autoReloadTimer->stop(); } } bool MainWindow::checkEditorModified() { if (editor->isContentModified()) { auto ret = QMessageBox::warning(this, _("Application"), _("The document has been modified.\n" "Do you really want to reload the file?"), QMessageBox::Yes | QMessageBox::No); if (ret != QMessageBox::Yes) { designActionAutoReload->setChecked(false); return false; } } return true; } void MainWindow::actionReloadRenderPreview() { if (GuiLocker::isLocked()) return; GuiLocker::lock(); autoReloadTimer->stop(); setCurrentOutput(); // PRINT("Parsing design (AST generation)..."); // this->processEvents(); this->afterCompileSlot = "csgReloadRender"; this->procevents = true; this->top_ctx.set_variable("$preview", ValuePtr(true)); compile(true); } void MainWindow::csgReloadRender() { if (this->root_node) compileCSG(); // Go to non-CGAL view mode if (viewActionThrownTogether->isChecked()) { viewModeThrownTogether(); } else { #ifdef ENABLE_OPENCSG viewModePreview(); #else viewModeThrownTogether(); #endif } compileEnded(); } void MainWindow::actionRenderPreview(bool rebuildParameterWidget) { static bool preview_requested; preview_requested=true; if (GuiLocker::isLocked()) return; GuiLocker::lock(); autoReloadTimer->stop(); preview_requested=false; setCurrentOutput(); PRINT("Parsing design (AST generation)..."); this->processEvents(); this->afterCompileSlot = "csgRender"; this->procevents = !viewActionAnimate->isChecked(); this->top_ctx.set_variable("$preview", ValuePtr(true)); compile(false,false,rebuildParameterWidget); if (preview_requested) { // if the action was called when the gui was locked, we must request it one more time // however, it's not possible to call it directly NOR make the loop // it must be called from the mainloop QTimer::singleShot(0, this, SLOT(actionRenderPreview())); } } void MainWindow::csgRender() { if (this->root_node) compileCSG(); // Go to non-CGAL view mode if (viewActionThrownTogether->isChecked()) { viewModeThrownTogether(); } else { #ifdef ENABLE_OPENCSG viewModePreview(); #else viewModeThrownTogether(); #endif } if (e_dump->isChecked() && animate_timer->isActive()) { if (anim_dumping && anim_dump_start_step == anim_step) { anim_dumping=false; e_dump->setChecked(false); } else { if (!anim_dumping) { anim_dumping = true; anim_dump_start_step = anim_step; } // Force reading from front buffer. Some configurations will read from the back buffer here. glReadBuffer(GL_FRONT); QImage img = this->qglview->grabFrameBuffer(); QString filename = QString("frame%1.png").arg(this->anim_step, 5, 10, QChar('0')); img.save(filename, "PNG"); } } compileEnded(); } void MainWindow::action3DPrint() { #ifdef ENABLE_3D_PRINTING if (GuiLocker::isLocked()) return; GuiLocker lock; setCurrentOutput(); //Make sure we can export: const unsigned int dim = 3; if (!canExport(dim)) return; const auto printService = PrintService::inst(); auto printInitDialog = new PrintInitDialog(); auto printInitResult = printInitDialog->exec(); printInitDialog->deleteLater(); if (printInitResult == QDialog::Rejected) { return; } const auto selectedService = printInitDialog->getResult(); Preferences::Preferences::inst()->updateGUI(); switch (selectedService) { case print_service_t::PRINT_SERVICE: PRINTB("Sending design to print service %s...", printService->getDisplayName().toStdString()); sendToPrintService(); break; case print_service_t::OCTOPRINT: PRINT("Sending design to OctoPrint..."); sendToOctoPrint(); break; default: break; } #endif } void MainWindow::sendToOctoPrint() { #ifdef ENABLE_3D_PRINTING OctoPrint octoPrint; if (octoPrint.url().trimmed().isEmpty()) { PRINT("ERROR: OctoPrint connection not configured. Please check preferences."); return; } Settings::Settings *s = Settings::Settings::inst(); const QString fileFormat = QString::fromStdString(s->get(Settings::Settings::octoPrintFileFormat).toString()); FileFormat exportFileFormat{FileFormat::STL}; if (fileFormat == "OFF") { exportFileFormat = FileFormat::OFF; } else if (fileFormat == "AMF") { exportFileFormat = FileFormat::AMF; } else if (fileFormat == "3MF") { exportFileFormat = FileFormat::_3MF; } else { exportFileFormat = FileFormat::STL; } QTemporaryFile exportFile{QDir::temp().filePath("OpenSCAD.XXXXXX." + fileFormat.toLower())}; if (!exportFile.open()) { PRINT("Could not open temporary file."); return; } const QString exportFileName = exportFile.fileName(); exportFile.close(); QString userFileName; if (this->fileName.isEmpty()) { userFileName = exportFileName; } else { QFileInfo fileInfo{this->fileName}; userFileName = fileInfo.baseName() + "." + fileFormat.toLower(); } exportFileByName(this->root_geom, exportFileFormat, exportFileName.toLocal8Bit().constData(), exportFileName.toUtf8()); try { this->progresswidget = new ProgressWidget(this); connect(this->progresswidget, SIGNAL(requestShow()), this, SLOT(showProgress())); const QString fileUrl = octoPrint.upload(exportFileName, userFileName, [this](double v) -> bool { return network_progress_func(v); }); const std::string action = s->get(Settings::Settings::octoPrintAction).toString(); if (action == "upload") { return; } const QString slicer = QString::fromStdString(s->get(Settings::Settings::octoPrintSlicerEngine).toString()); const QString profile = QString::fromStdString(s->get(Settings::Settings::octoPrintSlicerProfile).toString()); octoPrint.slice(fileUrl, slicer, profile, action != "slice", action == "print"); } catch (const NetworkException& e) { PRINTB("ERROR: %s", e.getErrorMessage().toStdString()); } updateStatusBar(nullptr); #endif } void MainWindow::sendToPrintService() { #ifdef ENABLE_3D_PRINTING //Keeps track of how many times we've exported and tries to create slightly unique filenames. //Not mission critical, since non-unique file names are fine for the API, just harder to //differentiate between in customer support later. static unsigned int printCounter = 0; QTemporaryFile exportFile; if (!exportFile.open()) { PRINT("ERROR: Could not open temporary file."); return; } const QString exportFilename = exportFile.fileName(); //Render the stl to a temporary file: exportFileByName(this->root_geom, FileFormat::STL, exportFilename.toLocal8Bit().constData(), exportFilename.toUtf8()); //Create a name that the order process will use to refer to the file. Base it off of the project name QString userFacingName = "unsaved.stl"; if (!this->fileName.isEmpty()) { const QString baseName = QFileInfo(this->fileName).baseName(); userFacingName = QString{"%1_%2.stl"}.arg(baseName).arg(printCounter++); } QFile file(exportFilename); if (!file.open(QIODevice::ReadOnly)) { PRINT("ERROR: Unable to open exported STL file."); return; } const QString fileContentBase64 = file.readAll().toBase64(); if (fileContentBase64.length() > PrintService::inst()->getFileSizeLimit()) { const auto msg = QString{_("Exported design exceeds the service upload limit of (%1 MB).")}.arg(PrintService::inst()->getFileSizeLimitMB()); QMessageBox::warning(this, _("Upload Error"), msg, QMessageBox::Ok); PRINTB("ERROR: %s", msg.toStdString()); return; } //Upload the file to the 3D Printing server and get the corresponding url to see it. //The result is put in partUrl. try { this->progresswidget = new ProgressWidget(this); connect(this->progresswidget, SIGNAL(requestShow()), this, SLOT(showProgress())); const QString partUrl = PrintService::inst()->upload(userFacingName, fileContentBase64, [this](double v) -> bool { return network_progress_func(v); }); QDesktopServices::openUrl(QUrl{partUrl}); } catch (const NetworkException& e) { PRINTB("ERROR: %s", e.getErrorMessage().toStdString()); } updateStatusBar(nullptr); #endif } #ifdef ENABLE_CGAL void MainWindow::actionRender() { if (GuiLocker::isLocked()) return; GuiLocker::lock(); autoReloadTimer->stop(); setCurrentOutput(); PRINT("Parsing design (AST generation)..."); this->processEvents(); this->afterCompileSlot = "cgalRender"; this->procevents = true; this->top_ctx.set_variable("$preview", ValuePtr(false)); compile(false); } void MainWindow::cgalRender() { if (!this->root_module || !this->root_node) { compileEnded(); return; } this->qglview->setRenderer(nullptr); delete this->cgalRenderer; this->cgalRenderer = nullptr; this->root_geom.reset(); PRINT("Rendering Polygon Mesh using CGAL..."); this->progresswidget = new ProgressWidget(this); connect(this->progresswidget, SIGNAL(requestShow()), this, SLOT(showProgress())); progress_report_prep(this->root_node, report_func, this); this->cgalworker->start(this->tree); } void MainWindow::actionRenderDone(shared_ptr root_geom) { progress_report_fin(); unsigned int s = this->renderingTime.elapsed() / 1000; if (root_geom) { GeometryCache::instance()->print(); #ifdef ENABLE_CGAL CGALCache::instance()->print(); #endif PRINTB("Total rendering time: %d hours, %d minutes, %d seconds", (s / (60*60)) % ((s / 60) % 60) % (s % 60)); if (root_geom && !root_geom->isEmpty()) { if (const CGAL_Nef_polyhedron *N = dynamic_cast(root_geom.get())) { if (N->getDimension() == 3) { bool simple = N->p3->is_simple(); PRINT(" Top level object is a 3D object:"); PRINTB(" Simple: %6s", (simple ? "yes" : "no")); PRINTB(" Vertices: %6d", N->p3->number_of_vertices()); PRINTB(" Halfedges: %6d", N->p3->number_of_halfedges()); PRINTB(" Edges: %6d", N->p3->number_of_edges()); PRINTB(" Halffacets: %6d", N->p3->number_of_halffacets()); PRINTB(" Facets: %6d", N->p3->number_of_facets()); PRINTB(" Volumes: %6d", N->p3->number_of_volumes()); if (!simple) { PRINT("UI-WARNING: Object may not be a valid 2-manifold and may need repair!"); } } } else if (const PolySet *ps = dynamic_cast(root_geom.get())) { assert(ps->getDimension() == 3); PRINT(" Top level object is a 3D object:"); PRINTB(" Facets: %6d", ps->numPolygons()); } else if (const Polygon2d *poly = dynamic_cast(root_geom.get())) { PRINT(" Top level object is a 2D object:"); PRINTB(" Contours: %6d", poly->outlines().size()); } else { assert(false && "Unknown geometry type"); } } PRINT("Rendering finished.\n"); this->root_geom = root_geom; this->cgalRenderer = new CGALRenderer(root_geom); // Go to CGAL view mode if (viewActionWireframe->isChecked()) viewModeWireframe(); else viewModeSurface(); } else { PRINT("UI-WARNING: No top level geometry to render"); PRINT(" "); } updateStatusBar(nullptr); if (Preferences::inst()->getValue("advanced/enableSoundNotification").toBool() && Preferences::inst()->getValue("advanced/timeThresholdOnRenderCompleteSound").toUInt() <= s) { QSound::play(":sounds/complete.wav"); } this->contentschanged = false; compileEnded(); } #endif /* ENABLE_CGAL */ /** * Switch version label and progress widget. When switching to the progress * widget, the new instance is passed by the caller. * In case of resetting back to the version label, nullptr will be passed and * multiple calls can happen. So this method must guard against adding the * version label multiple times. * * @param progressWidget a pointer to the progress widget to show or nullptr in * case the display should switch back to the version label. */ void MainWindow::updateStatusBar(ProgressWidget *progressWidget) { auto sb = this->statusBar(); if (progressWidget == nullptr) { if (this->progresswidget != nullptr) { sb->removeWidget(this->progresswidget); delete this->progresswidget; this->progresswidget = nullptr; } if (versionLabel == nullptr) { versionLabel = new QLabel("OpenSCAD " + QString::fromStdString(openscad_displayversionnumber)); sb->addPermanentWidget(this->versionLabel); } } else { if (this->versionLabel != nullptr) { sb->removeWidget(this->versionLabel); delete this->versionLabel; this->versionLabel = nullptr; } sb->addPermanentWidget(progressWidget); } } void MainWindow::exceptionCleanup(){ PRINT("Execution aborted"); PRINT(" "); GuiLocker::unlock(); if (designActionAutoReload->isChecked()) autoReloadTimer->start(); } void MainWindow::actionDisplayAST() { setCurrentOutput(); auto e = new QTextEdit(this); e->setWindowFlags(Qt::Window); e->setTabStopWidth(tabStopWidth); e->setWindowTitle("AST Dump"); e->setReadOnly(true); if (root_module) { e->setPlainText(QString::fromUtf8(root_module->dump("").c_str())); } else { e->setPlainText("No AST to dump. Please try compiling first..."); } e->show(); e->resize(600, 400); clearCurrentOutput(); } void MainWindow::actionDisplayCSGTree() { setCurrentOutput(); auto e = new QTextEdit(this); e->setWindowFlags(Qt::Window); e->setTabStopWidth(tabStopWidth); e->setWindowTitle("CSG Tree Dump"); e->setReadOnly(true); if (this->root_node) { e->setPlainText(QString::fromUtf8(this->tree.getString(*this->root_node, " ").c_str())); } else { e->setPlainText("No CSG to dump. Please try compiling first..."); } e->show(); e->resize(600, 400); clearCurrentOutput(); } void MainWindow::actionDisplayCSGProducts() { setCurrentOutput(); auto e = new QTextEdit(this); e->setWindowFlags(Qt::Window); e->setTabStopWidth(tabStopWidth); e->setWindowTitle("CSG Products Dump"); e->setReadOnly(true); e->setPlainText(QString("\nCSG before normalization:\n%1\n\n\nCSG after normalization:\n%2\n\n\nCSG rendering chain:\n%3\n\n\nHighlights CSG rendering chain:\n%4\n\n\nBackground CSG rendering chain:\n%5\n") .arg(this->csgRoot ? QString::fromUtf8(this->csgRoot->dump().c_str()) : "N/A", this->normalizedRoot ? QString::fromUtf8(this->normalizedRoot->dump().c_str()) : "N/A", this->root_products ? QString::fromUtf8(this->root_products->dump().c_str()) : "N/A", this->highlights_products ? QString::fromUtf8(this->highlights_products->dump().c_str()) : "N/A", this->background_products ? QString::fromUtf8(this->background_products->dump().c_str()) : "N/A")); e->show(); e->resize(600, 400); clearCurrentOutput(); } void MainWindow::actionCheckValidity() { if (GuiLocker::isLocked()) return; GuiLocker lock; #ifdef ENABLE_CGAL setCurrentOutput(); if (!this->root_geom) { PRINT("Nothing to validate! Try building first (press F6)."); clearCurrentOutput(); return; } if (this->root_geom->getDimension() != 3) { PRINT("Current top level object is not a 3D object."); clearCurrentOutput(); return; } bool valid = false; shared_ptr N; if (auto ps = dynamic_cast(this->root_geom.get())) { N.reset(CGALUtils::createNefPolyhedronFromGeometry(*ps)); } if (N || (N = dynamic_pointer_cast(this->root_geom))) { valid = N->p3 ? N->p3->is_valid() : false; } PRINTB(" Valid: %6s", (valid ? "yes" : "no")); clearCurrentOutput(); #endif /* ENABLE_CGAL */ } //Returns if we can export (true) or not(false) (bool) //Separated into it's own function for re-use. bool MainWindow::canExport(unsigned int dim) { if (!this->root_geom) { PRINT("ERROR: Nothing to export! Try rendering first (press F6)."); clearCurrentOutput(); return false; } // editor has changed since last render if (this->contentschanged) { auto ret = QMessageBox::warning(this, "Application", "The document has been modified since the last render (F6).\n" "Do you really want to export the previous content?", QMessageBox::Yes | QMessageBox::No); if (ret != QMessageBox::Yes) { return false; } } if (this->root_geom->getDimension() != dim) { PRINTB("UI-ERROR: Current top level object is not a %dD object.", dim); clearCurrentOutput(); return false; } if (this->root_geom->isEmpty()) { PRINT("UI-ERROR: Current top level object is empty."); clearCurrentOutput(); return false; } auto N = dynamic_cast(this->root_geom.get()); if (N && !N->p3->is_simple()) { PRINT("UI-WARNING: Object may not be a valid 2-manifold and may need repair! See https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/STL_Import_and_Export"); } return true; } #ifdef ENABLE_CGAL void MainWindow::actionExport(FileFormat format, const char *type_name, const char *suffix, unsigned int dim) #else void MainWindow::actionExport(FileFormat, QString, QString, unsigned int, QString) #endif { //Setting filename skips the file selection dialog and uses the path provided instead. if (GuiLocker::isLocked()) return; GuiLocker lock; #ifdef ENABLE_CGAL setCurrentOutput(); //Return if something is wrong and we can't export. if (! canExport(dim)) return; auto title = QString(_("Export %1 File")).arg(type_name); auto filter = QString(_("%1 Files (*%2)")).arg(type_name, suffix); auto exportFilename = QFileDialog::getSaveFileName(this, title, exportPath(suffix), filter); if (exportFilename.isEmpty()) { clearCurrentOutput(); return; } this->export_paths[suffix] = exportFilename; exportFileByName(this->root_geom, format, exportFilename.toLocal8Bit().constData(), exportFilename.toUtf8()); fileExportedMessage(type_name, exportFilename); clearCurrentOutput(); #endif /* ENABLE_CGAL */ } void MainWindow::actionExportSTL() { actionExport(FileFormat::STL, "STL", ".stl", 3); } void MainWindow::actionExport3MF() { actionExport(FileFormat::_3MF, "3MF", ".3mf", 3); } void MainWindow::actionExportOFF() { actionExport(FileFormat::OFF, "OFF", ".off", 3); } void MainWindow::actionExportAMF() { actionExport(FileFormat::AMF, "AMF", ".amf", 3); } void MainWindow::actionExportDXF() { actionExport(FileFormat::DXF, "DXF", ".dxf", 2); } void MainWindow::actionExportSVG() { actionExport(FileFormat::SVG, "SVG", ".svg", 2); } void MainWindow::actionExportCSG() { setCurrentOutput(); if (!this->root_node) { PRINT("ERROR: Nothing to export. Please try compiling first."); clearCurrentOutput(); return; } const auto suffix = ".csg"; auto csg_filename = QFileDialog::getSaveFileName(this, _("Export CSG File"), exportPath(suffix), _("CSG Files (*.csg)")); if (csg_filename.isEmpty()) { clearCurrentOutput(); return; } std::ofstream fstream(csg_filename.toLocal8Bit()); if (!fstream.is_open()) { PRINTB("Can't open file \"%s\" for export", csg_filename.toLocal8Bit().constData()); } else { fstream << this->tree.getString(*this->root_node, "\t") << "\n"; fstream.close(); fileExportedMessage("CSG", csg_filename); this->export_paths[suffix] = csg_filename; } clearCurrentOutput(); } void MainWindow::actionExportImage() { // Grab first to make sure dialog box isn't part of the grabbed image qglview->grabFrame(); const auto suffix = ".png"; auto img_filename = QFileDialog::getSaveFileName(this, _("Export Image"), exportPath(suffix), _("PNG Files (*.png)")); if (!img_filename.isEmpty()) { qglview->save(img_filename.toLocal8Bit().constData()); this->export_paths[suffix] = img_filename; setCurrentOutput(); fileExportedMessage("PNG", img_filename); clearCurrentOutput(); } } void MainWindow::actionCopyViewport() { const auto &image = qglview->grabFrame(); auto clipboard = QApplication::clipboard(); clipboard->setImage(image); } void MainWindow::actionFlushCaches() { GeometryCache::instance()->clear(); #ifdef ENABLE_CGAL CGALCache::instance()->clear(); #endif dxf_dim_cache.clear(); dxf_cross_cache.clear(); ModuleCache::instance()->clear(); } void MainWindow::viewModeActionsUncheck() { viewActionPreview->setChecked(false); #ifdef ENABLE_CGAL viewActionSurfaces->setChecked(false); viewActionWireframe->setChecked(false); #endif viewActionThrownTogether->setChecked(false); } #ifdef ENABLE_OPENCSG /*! Go to the OpenCSG view mode. Falls back to thrown together mode if OpenCSG is not available */ void MainWindow::viewModePreview() { if (this->qglview->hasOpenCSGSupport()) { viewModeActionsUncheck(); viewActionPreview->setChecked(true); this->qglview->setRenderer(this->opencsgRenderer ? (Renderer *)this->opencsgRenderer : (Renderer *)this->thrownTogetherRenderer); this->qglview->updateColorScheme(); this->qglview->updateGL(); } else { viewModeThrownTogether(); } } #endif /* ENABLE_OPENCSG */ #ifdef ENABLE_CGAL void MainWindow::viewModeSurface() { viewModeActionsUncheck(); viewActionSurfaces->setChecked(true); this->qglview->setShowFaces(true); this->qglview->setRenderer(this->cgalRenderer); this->qglview->updateColorScheme(); this->qglview->updateGL(); } void MainWindow::viewModeWireframe() { viewModeActionsUncheck(); viewActionWireframe->setChecked(true); this->qglview->setShowFaces(false); this->qglview->setRenderer(this->cgalRenderer); this->qglview->updateColorScheme(); this->qglview->updateGL(); } #endif /* ENABLE_CGAL */ void MainWindow::viewModeThrownTogether() { viewModeActionsUncheck(); viewActionThrownTogether->setChecked(true); this->qglview->setRenderer(this->thrownTogetherRenderer); this->qglview->updateColorScheme(); this->qglview->updateGL(); } void MainWindow::viewModeShowEdges() { QSettingsCached settings; settings.setValue("view/showEdges",viewActionShowEdges->isChecked()); this->qglview->setShowEdges(viewActionShowEdges->isChecked()); this->qglview->updateGL(); } void MainWindow::viewModeShowAxes() { bool showaxes = viewActionShowAxes->isChecked(); QSettingsCached settings; settings.setValue("view/showAxes", showaxes); this->viewActionShowScaleProportional->setEnabled(showaxes); this->qglview->setShowAxes(showaxes); this->qglview->updateGL(); } void MainWindow::viewModeShowCrosshairs() { QSettingsCached settings; settings.setValue("view/showCrosshairs",viewActionShowCrosshairs->isChecked()); this->qglview->setShowCrosshairs(viewActionShowCrosshairs->isChecked()); this->qglview->updateGL(); } void MainWindow::viewModeShowScaleProportional() { QSettingsCached settings; settings.setValue("view/showScaleProportional",viewActionShowScaleProportional->isChecked()); this->qglview->setShowScaleProportional(viewActionShowScaleProportional->isChecked()); this->qglview->updateGL(); } void MainWindow::viewModeAnimate() { if (viewActionAnimate->isChecked()) { animate_panel->show(); actionRenderPreview(); updatedAnimFps(); } else { animate_panel->hide(); animate_timer->stop(); } } bool MainWindow::isEmpty() { return this->editor->toPlainText().isEmpty(); } void MainWindow::animateUpdateDocChanged() { auto current_doc = editor->toPlainText(); if (current_doc != last_compiled_doc) { animateUpdate(); } } void MainWindow::animateUpdate() { if (animate_panel->isVisible()) { bool fps_ok; double fps = this->e_fps->text().toDouble(&fps_ok); if (fps_ok && fps <= 0 && !animate_timer->isActive()) { animate_timer->stop(); animate_timer->setSingleShot(true); animate_timer->setInterval(50); animate_timer->start(); } } } void MainWindow::viewAngleTop() { qglview->cam.object_rot << 90,0,0; this->qglview->updateGL(); } void MainWindow::viewAngleBottom() { qglview->cam.object_rot << 270,0,0; this->qglview->updateGL(); } void MainWindow::viewAngleLeft() { qglview->cam.object_rot << 0,0,90; this->qglview->updateGL(); } void MainWindow::viewAngleRight() { qglview->cam.object_rot << 0,0,270; this->qglview->updateGL(); } void MainWindow::viewAngleFront() { qglview->cam.object_rot << 0,0,0; this->qglview->updateGL(); } void MainWindow::viewAngleBack() { qglview->cam.object_rot << 0,0,180; this->qglview->updateGL(); } void MainWindow::viewAngleDiagonal() { qglview->cam.object_rot << 35,0,-25; this->qglview->updateGL(); } void MainWindow::viewCenter() { qglview->cam.object_trans << 0,0,0; this->qglview->updateGL(); } void MainWindow::viewPerspective() { QSettingsCached settings; settings.setValue("view/orthogonalProjection",false); viewActionPerspective->setChecked(true); viewActionOrthogonal->setChecked(false); this->qglview->setOrthoMode(false); this->qglview->updateGL(); } void MainWindow::viewOrthogonal() { QSettingsCached settings; settings.setValue("view/orthogonalProjection",true); viewActionPerspective->setChecked(false); viewActionOrthogonal->setChecked(true); this->qglview->setOrthoMode(true); this->qglview->updateGL(); } void MainWindow::viewTogglePerspective() { QSettingsCached settings; if (settings.value("view/orthogonalProjection").toBool()) { viewPerspective(); } else { viewOrthogonal(); } } void MainWindow::viewResetView() { this->qglview->resetView(); this->qglview->updateGL(); } void MainWindow::viewAll() { this->qglview->viewAll(); this->qglview->updateGL(); } void MainWindow::on_editorDock_visibilityChanged(bool) { editorTopLevelChanged(editorDock->isFloating()); } void MainWindow::on_consoleDock_visibilityChanged(bool) { changedTopLevelConsole(consoleDock->isFloating()); } void MainWindow::on_parameterDock_visibilityChanged(bool) { parameterTopLevelChanged(parameterDock->isFloating()); } void MainWindow::editorTopLevelChanged(bool topLevel) { setDockWidgetTitle(editorDock, QString(_("Editor")), topLevel); } void MainWindow::changedTopLevelConsole(bool topLevel) { setDockWidgetTitle(consoleDock, QString(_("Console")), topLevel); } void MainWindow::consoleTopLevelChanged(bool topLevel) { setDockWidgetTitle(consoleDock, QString(_("Console")), topLevel); Qt::WindowFlags flags = (consoleDock->windowFlags() & ~Qt::WindowType_Mask) | Qt::Window; if(topLevel) { consoleDock->setWindowFlags(flags); consoleDock->show(); } } void MainWindow::parameterTopLevelChanged(bool topLevel) { setDockWidgetTitle(parameterDock, QString(_("Customizer")), topLevel); } void MainWindow::setDockWidgetTitle(QDockWidget *dockWidget, QString prefix, bool topLevel) { QString title(prefix); if (topLevel) { const QFileInfo fileInfo(windowFilePath()); title += " (" + fileInfo.fileName() + ")"; } dockWidget->setWindowTitle(title); } void MainWindow::hideToolbars() { QSettingsCached settings; bool shouldHide = viewActionHideToolBars->isChecked(); settings.setValue("view/hideToolbar", shouldHide); if (shouldHide) { viewerToolBar->hide(); editortoolbar->hide(); } else { viewerToolBar->show(); editortoolbar->show(); } } void MainWindow::hideEditor() { if (viewActionHideEditor->isChecked()) { editorDock->close(); } else { editorDock->show(); } } void MainWindow::showConsole() { viewActionHideConsole->setChecked(false); consoleDock->show(); frameCompileResult->hide(); } void MainWindow::hideConsole() { if (viewActionHideConsole->isChecked()) { consoleDock->hide(); } else { consoleDock->show(); } } void MainWindow::hideParameters() { if (viewActionHideParameters->isChecked()) { parameterDock->hide(); } else { parameterDock->show(); } } void MainWindow::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } } void MainWindow::dropEvent(QDropEvent *event) { setCurrentOutput(); const QList urls = event->mimeData()->urls(); for (int i = 0; i < urls.size(); i++) { if (urls[i].scheme() != "file") continue; handleFileDrop(urls[i].toLocalFile()); } clearCurrentOutput(); } void MainWindow::handleFileDrop(const QString &filename) { const QFileInfo fileInfo(filename); const auto suffix = fileInfo.suffix().toLower(); const auto cmd = knownFileExtensions[suffix]; if (cmd.isEmpty()) { if (!MainWindow::mdiMode && !maybeSave()) { return; } openFile(filename); } else { editor->insert(cmd.arg(filename)); } } void MainWindow::helpAbout() { qApp->setWindowIcon(QApplication::windowIcon()); auto dialog = new AboutDialog(this); dialog->exec(); } void MainWindow::helpHomepage() { UIUtils::openHomepageURL(); } void MainWindow::helpManual() { UIUtils::openUserManualURL(); } void MainWindow::helpCheatSheet() { UIUtils::openCheatSheetURL(); } void MainWindow::helpLibrary() { if (!this->library_info_dialog) { QString rendererInfo(qglview->getRendererInfo().c_str()); auto dialog = new LibraryInfoDialog(rendererInfo); this->library_info_dialog = dialog; } this->library_info_dialog->show(); } void MainWindow::helpFontInfo() { if (!this->font_list_dialog) { auto dialog = new FontListDialog(); this->font_list_dialog = dialog; } this->font_list_dialog->update_font_list(); this->font_list_dialog->show(); } /*! FIXME: In MDI mode, should this be called on both reload functions? */ bool MainWindow::maybeSave() { if (editor->isContentModified()) { QMessageBox box(this); box.setText(_("The document has been modified.")); box.setInformativeText(_("Do you want to save your changes?")); box.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); box.setDefaultButton(QMessageBox::Save); box.setIcon(QMessageBox::Warning); box.setWindowModality(Qt::ApplicationModal); #ifdef Q_OS_MAC // Cmd-D is the standard shortcut for this button on Mac box.button(QMessageBox::Discard)->setShortcut(QKeySequence("Ctrl+D")); box.button(QMessageBox::Discard)->setShortcutEnabled(true); #endif auto ret = (QMessageBox::StandardButton) box.exec(); if (ret == QMessageBox::Save) { actionSave(); // Returns false on failed save return !editor->isContentModified(); } else if (ret == QMessageBox::Cancel) { return false; } } return true; } void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { QSettingsCached settings; settings.setValue("window/size", size()); settings.setValue("window/position", pos()); settings.setValue("window/state", saveState()); if (this->tempFile) { delete this->tempFile; this->tempFile = nullptr; } this->editorDock->disableSettingsUpdate(); this->consoleDock->disableSettingsUpdate(); this->parameterDock->disableSettingsUpdate(); event->accept(); } else { event->ignore(); } } void MainWindow::preferences() { Preferences::inst()->show(); Preferences::inst()->activateWindow(); Preferences::inst()->raise(); } void MainWindow::setColorScheme(const QString &scheme) { RenderSettings::inst()->colorscheme = scheme.toStdString(); this->qglview->setColorScheme(scheme.toStdString()); this->qglview->updateGL(); } void MainWindow::setFont(const QString &family, uint size) { QFont font; if (!family.isEmpty()) font.setFamily(family); else font.setFixedPitch(true); if (size > 0) font.setPointSize(size); font.setStyleHint(QFont::TypeWriter); editor->setFont(font); } void MainWindow::quit() { QCloseEvent ev; QApplication::sendEvent(QApplication::instance(), &ev); if (ev.isAccepted()) QApplication::instance()->quit(); // FIXME: Cancel any CGAL calculations #ifdef Q_OS_MAC CocoaUtils::endApplication(); #endif } void MainWindow::consoleOutput(const std::string &msg, void *userdata) { // Invoke the method in the main thread in case the output // originates in a worker thread. auto thisp = static_cast(userdata); QMetaObject::invokeMethod(thisp, "consoleOutput", Q_ARG(QString, QString::fromStdString(msg))); } void MainWindow::consoleOutput(const QString &msg) { auto c = this->console->textCursor(); c.movePosition(QTextCursor::End); this->console->setTextCursor(c); if (msg.startsWith("WARNING:") || msg.startsWith("DEPRECATED:")) { this->compileWarnings++; this->console->appendHtml("" + QT_HTML_ESCAPE(QString(msg)) + ""); } else if (msg.startsWith("UI-WARNING:") || msg.startsWith("FONT-WARNING:") || msg.startsWith("EXPORT-WARNING:")) { this->console->appendHtml("" + QT_HTML_ESCAPE(QString(msg)) + ""); } else if (msg.startsWith("ERROR:")) { this->compileErrors++; this->console->appendHtml("" + QT_HTML_ESCAPE(QString(msg)) + ""); } else if (msg.startsWith("EXPORT-ERROR:") || msg.startsWith("UI-ERROR:") || msg.startsWith("PARSER-ERROR:")) { this->console->appendHtml("" + QT_HTML_ESCAPE(QString(msg)) + ""); } else if (msg.startsWith("TRACE:")) { this->console->appendHtml("" + QT_HTML_ESCAPE(QString(msg)) + ""); } else { QString qmsg = msg; if(qmsg.contains('\t') && !qmsg.contains("
", Qt::CaseInsensitive))
			this->console->appendPlainText(qmsg);
		else {
			qmsg.replace("\n","
"); this->console->appendHtml(qmsg); } } this->processEvents(); } void MainWindow::setCurrentOutput() { set_output_handler(&MainWindow::consoleOutput, this); } void MainWindow::hideCurrentOutput() { set_output_handler(&MainWindow::noOutput, this); } void MainWindow::clearCurrentOutput() { set_output_handler(nullptr, nullptr); } void MainWindow::openCSGSettingsChanged() { #ifdef ENABLE_OPENCSG OpenCSG::setOption(OpenCSG::AlgorithmSetting, Preferences::inst()->getValue("advanced/forceGoldfeather").toBool() ? OpenCSG::Goldfeather : OpenCSG::Automatic); #endif } void MainWindow::setContentsChanged() { this->contentschanged = true; this->parameterWidget->setEnabled(false); } void MainWindow::processEvents() { if (this->procevents) QApplication::processEvents(); } void MainWindow::clearExportPaths() { export_paths.clear(); } QString MainWindow::exportPath(const char *suffix) { QString path; auto path_it = this->export_paths.find(suffix); if(path_it != export_paths.end()) path = path_it->second; else if(this->fileName.isEmpty()) path = QString(PlatformUtils::userDocumentsPath().c_str()) + QString(_("/Untitled")) + suffix; else { auto info = QFileInfo(this->fileName); path = info.absolutePath() + QString(_("/")) + info.completeBaseName() + suffix; } return path; } openscad-2019.05/src/memory.h0000644000076500000240000000022013402025764016344 0ustar kintelstaff00000000000000#pragma once #include using std::shared_ptr; using std::make_shared; using std::dynamic_pointer_cast; using std::static_pointer_cast; openscad-2019.05/src/modcontext.cc0000644000076500000240000001706113441031431017360 0ustar kintelstaff00000000000000#include "modcontext.h" #include "UserModule.h" #include "ModuleInstantiation.h" #include "expression.h" #include "function.h" #include "printutils.h" #include "builtin.h" #include "ModuleCache.h" #include #ifdef DEBUG #include #endif ModuleContext::ModuleContext(const Context *parent, const EvalContext *evalctx) : Context(parent), functions_p(nullptr), modules_p(nullptr), evalctx(evalctx) { } ModuleContext::~ModuleContext() { } // Experimental code. See issue #399 #if 0 void ModuleContext::evaluateAssignments(const AssignmentList &assignments) { // First, assign all simple variables std::list undefined_vars; for (const auto &ass : assignments) { ValuePtr tmpval = ass.second->evaluate(this); if (tmpval->isUndefined()) undefined_vars.push_back(ass.first); else this->set_variable(ass.first, tmpval); } // Variables which couldn't be evaluated in the first pass is attempted again, // to allow for initialization out of order std::unordered_map tmpass; for(const auto &ass : assignments) { tmpass[ass.first] = ass.second; } bool changed = true; while (changed) { changed = false; std::list::iterator iter = undefined_vars.begin(); while (iter != undefined_vars.end()) { std::list::iterator curr = iter++; std::unordered_map::iterator found = tmpass.find(*curr); if (found != tmpass.end()) { const Expression *expr = found->second; ValuePtr tmpval = expr->evaluate(this); // FIXME: it's not enough to check for undefined; // we need to check for any undefined variable in the subexpression // For now, ignore this and revisit the validity and order of variable // assignments later if (!tmpval->isUndefined()) { changed = true; this->set_variable(*curr, tmpval); undefined_vars.erase(curr); } } }+- } } #endif void ModuleContext::initializeModule(const UserModule &module) { this->setVariables(evalctx, module.definition_arguments, {}, true); // FIXME: Don't access module members directly this->functions_p = &module.scope.functions; this->modules_p = &module.scope.modules; for (const auto &ass : module.scope.assignments) { if (ass.expr->isLiteral() && this->variables.find(ass.name) != this->variables.end()) { std::string loc = ass.location().toRelativeString(this->documentPath()); PRINTB("WARNING: Module %s: Parameter %s is overwritten with a literal, %s", module.name % ass.name % loc); } this->set_variable(ass.name, ass.expr->evaluate(this)); } // Experimental code. See issue #399 // evaluateAssignments(module.scope.assignments); } const UserFunction *ModuleContext::findLocalFunction(const std::string &name) const { if (this->functions_p && this->functions_p->find(name) != this->functions_p->end()) { auto f = this->functions_p->find(name)->second; if (!f->is_enabled()) { PRINTB("WARNING: Experimental builtin function '%s' is not enabled.", name); return nullptr; } return f; } return nullptr; } const UserModule *ModuleContext::findLocalModule(const std::string &name) const { if (this->modules_p && this->modules_p->find(name) != this->modules_p->end()) { auto m = this->modules_p->find(name)->second; if (!m->is_enabled()) { PRINTB("WARNING: Experimental builtin module '%s' is not enabled.", name); return nullptr; } auto replacement = Builtins::instance()->isDeprecated(name); if (!replacement.empty()) { PRINT_DEPRECATION("The %s() module will be removed in future releases. Use %s instead.", name % replacement); } return m; } return nullptr; } ValuePtr ModuleContext::evaluate_function(const std::string &name, const EvalContext *evalctx) const { const auto foundf = findLocalFunction(name); if (foundf) return foundf->evaluate(this, evalctx); return Context::evaluate_function(name, evalctx); } AbstractNode *ModuleContext::instantiate_module(const ModuleInstantiation &inst, EvalContext *evalctx) const { const auto foundm = this->findLocalModule(inst.name()); if (foundm) return foundm->instantiate(this, &inst, evalctx); return Context::instantiate_module(inst, evalctx); } #ifdef DEBUG std::string ModuleContext::dump(const AbstractModule *mod, const ModuleInstantiation *inst) { std::ostringstream s; if (inst) { s << boost::format("ModuleContext %p (%p) for %s inst (%p) ") % this % this->parent % inst->name() % inst; } else { s << boost::format("ModuleContext: %p (%p)") % this % this->parent; } s << boost::format(" document path: %s") % this->document_path; if (mod) { const UserModule *m = dynamic_cast(mod); if (m) { s << " module args:"; for(const auto &arg : m->definition_arguments) { s << boost::format(" %s = %s") % arg.name % variables[arg.name]; } } } typedef std::pair ValueMapType; s << " vars:"; for(const auto &v : constants) { s << boost::format(" %s = %s") % v.first % v.second; } for(const auto &v : variables) { s << boost::format(" %s = %s") % v.first % v.second; } for(const auto &v : config_variables) { s << boost::format(" %s = %s") % v.first % v.second; } return s.str(); } #endif FileContext::FileContext(const Context *parent) : ModuleContext(parent), usedlibs_p(nullptr) { } ValuePtr FileContext::sub_evaluate_function(const std::string &name, const EvalContext *evalctx, FileModule *usedmod) const { FileContext ctx(this->parent); ctx.initializeModule(*usedmod); // FIXME: Set document path #ifdef DEBUG PRINTDB("New lib Context for %s func:", name); PRINTDB("%s",ctx.dump(nullptr, nullptr)); #endif return usedmod->scope.functions[name]->evaluate(&ctx, evalctx); } ValuePtr FileContext::evaluate_function(const std::string &name, const EvalContext *evalctx) const { const auto foundf = findLocalFunction(name); if (foundf) return foundf->evaluate(this, evalctx); for (const auto &m : *this->usedlibs_p) { // usedmod is nullptr if the library wasn't be compiled (error or file-not-found) auto usedmod = ModuleCache::instance()->lookup(m); if (usedmod && usedmod->scope.functions.find(name) != usedmod->scope.functions.end()) return sub_evaluate_function(name, evalctx, usedmod); } return ModuleContext::evaluate_function(name, evalctx); } AbstractNode *FileContext::instantiate_module(const ModuleInstantiation &inst, EvalContext *evalctx) const { const auto foundm = this->findLocalModule(inst.name()); if (foundm) return foundm->instantiate(this, &inst, evalctx); for (const auto &m : *this->usedlibs_p) { auto usedmod = ModuleCache::instance()->lookup(m); // usedmod is nullptr if the library wasn't be compiled (error or file-not-found) if (usedmod && usedmod->scope.modules.find(inst.name()) != usedmod->scope.modules.end()) { FileContext ctx(this->parent); ctx.initializeModule(*usedmod); // FIXME: Set document path #ifdef DEBUG PRINTD("New file Context:"); PRINTDB("%s",ctx.dump(nullptr, &inst)); #endif return usedmod->scope.modules[inst.name()]->instantiate(&ctx, &inst, evalctx); } } return ModuleContext::instantiate_module(inst, evalctx); } void FileContext::initializeModule(const class FileModule &module) { if (!module.modulePath().empty()) this->document_path = module.modulePath(); // FIXME: Don't access module members directly this->usedlibs_p = &module.usedlibs; this->functions_p = &module.scope.functions; this->modules_p = &module.scope.modules; for (const auto &ass : module.scope.assignments) { this->set_variable(ass.name, ass.expr->evaluate(this)); } } openscad-2019.05/src/modcontext.h0000644000076500000240000000365013414440264017231 0ustar kintelstaff00000000000000#pragma once #include "context.h" #include "FileModule.h" /*! This holds the context for a UserModule definition; keeps track of global variables, submodules and functions defined inside a module. NB! every .scad file defines a FileModule holding the contents of the file. */ class ModuleContext : public Context { public: ModuleContext(const Context *parent = nullptr, const EvalContext *evalctx = nullptr); ~ModuleContext(); void initializeModule(const class UserModule &m); ValuePtr evaluate_function(const std::string &name, const EvalContext *evalctx) const override; AbstractNode *instantiate_module(const ModuleInstantiation &inst, EvalContext *evalctx) const override; const UserModule *findLocalModule(const std::string &name) const; const UserFunction *findLocalFunction(const std::string &name) const; const LocalScope::FunctionContainer *functions_p; const LocalScope::ModuleContainer *modules_p; // FIXME: Points to the eval context for the call to this module. Not sure where it belongs const class EvalContext *evalctx; #ifdef DEBUG virtual std::string dump(const class AbstractModule *mod, const ModuleInstantiation *inst); #endif private: // Experimental code. See issue #399 // void evaluateAssignments(const AssignmentList &assignments); }; class FileContext : public ModuleContext { public: FileContext(const Context *parent); ~FileContext() {} void initializeModule(const FileModule &module); ValuePtr evaluate_function(const std::string &name, const EvalContext *evalctx) const override; AbstractNode *instantiate_module(const ModuleInstantiation &inst, EvalContext *evalctx) const override; private: const FileModule::ModuleContainer *usedlibs_p; // This sub_* method is needed to minimize stack usage only. ValuePtr sub_evaluate_function(const std::string &name, const EvalContext *evalctx, FileModule *usedmod) const; }; openscad-2019.05/src/module.cc0000644000076500000240000000235013414444002016456 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "module.h" #include "context.h" #include "value.h" AbstractModule::~AbstractModule() { } openscad-2019.05/src/module.h0000644000076500000240000000111113402025764016321 0ustar kintelstaff00000000000000#pragma once #include #include "AST.h" #include "feature.h" class AbstractModule { private: const Feature *feature; public: AbstractModule() : feature(nullptr) {} AbstractModule(const Feature& feature) : feature(&feature) {} virtual ~AbstractModule(); virtual bool is_experimental() const { return feature != nullptr; } virtual bool is_enabled() const { return (feature == nullptr) || feature->is_enabled(); } virtual class AbstractNode *instantiate(const class Context *ctx, const class ModuleInstantiation *inst, class EvalContext *evalctx = nullptr) const = 0; }; openscad-2019.05/src/node.cc0000644000076500000240000000612513402025764016131 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "node.h" #include "module.h" #include "ModuleInstantiation.h" #include "progress.h" #include "printutils.h" #include #include #include size_t AbstractNode::idx_counter; AbstractNode::AbstractNode(const ModuleInstantiation *mi) : modinst(mi), progress_mark(0), idx(idx_counter++) { } AbstractNode::~AbstractNode() { std::for_each(this->children.begin(), this->children.end(), std::default_delete()); } std::string AbstractNode::toString() const { return this->name() + "()"; } std::string GroupNode::name() const { return "group"; } std::string RootNode::name() const { return "root"; } std::string AbstractIntersectionNode::toString() const { return this->name() + "()"; } std::string AbstractIntersectionNode::name() const { // We write intersection here since the module will have to be evaluated // before we get here and it will not longer retain the intersection_for parameters return "intersection"; } void AbstractNode::progress_prepare() { std::for_each(this->children.begin(), this->children.end(), std::mem_fun(&AbstractNode::progress_prepare)); this->progress_mark = ++progress_report_count; } void AbstractNode::progress_report() const { progress_update(this, this->progress_mark); } std::ostream &operator<<(std::ostream &stream, const AbstractNode &node) { stream << node.toString(); return stream; } // Do we have an explicit root node (! modifier)? AbstractNode *find_root_tag(AbstractNode *n) { std::vector rootTags; std::function find_root_tags = [&](AbstractNode *n) { for (auto v : n->children) { if (v->modinst->tag_root) rootTags.push_back(v); find_root_tags(v); } }; find_root_tags(n); if (rootTags.size() == 0) return nullptr; if (rootTags.size() > 1) { for (const auto& rootTag : rootTags) { PRINTB("WARNING: Root Modifier (!) Added At Line%d \n", rootTag->modinst->location().firstLine()); } } return rootTags.front(); } openscad-2019.05/src/node.h0000644000076500000240000000615213402025764015773 0ustar kintelstaff00000000000000#pragma once #include #include #include "BaseVisitable.h" extern int progress_report_count; extern void (*progress_report_f)(const class AbstractNode*, void*, int); extern void *progress_report_vp; void progress_report_prep(class AbstractNode *root, void (*f)(const class AbstractNode *node, void *vp, int mark), void *vp); void progress_report_fin(); /*! The node tree is the result of evaluation of a module instantiation tree. Both the module tree and the node tree are regenerated from scratch for each compile. */ class AbstractNode : public BaseVisitable { // FIXME: the idx_counter/idx is mostly (only?) for debugging. // We can hash on pointer value or smth. else. // -> remove and // use smth. else to display node identifier in CSG tree output? static size_t idx_counter; // Node instantiation index public: VISITABLE(); AbstractNode(const class ModuleInstantiation *mi); ~AbstractNode(); virtual std::string toString() const; /*! The 'OpenSCAD name' of this node, defaults to classname, but can be overloaded to provide specialization for e.g. CSG nodes, primitive nodes etc. Used for human-readable output. */ virtual std::string name() const = 0; const std::vector &getChildren() const { return this->children; } size_t index() const { return this->idx; } static void resetIndexCounter() { idx_counter = 1; } // FIXME: Make protected std::vector children; const ModuleInstantiation *modinst; // progress_mark is a running number used for progress indication // FIXME: Make all progress handling external, put it in the traverser class? int progress_mark; void progress_prepare(); void progress_report() const; int idx; // Node index (unique per tree) }; class AbstractIntersectionNode : public AbstractNode { public: VISITABLE(); AbstractIntersectionNode(const ModuleInstantiation *mi) : AbstractNode(mi) { }; ~AbstractIntersectionNode() { }; std::string toString() const override; std::string name() const override; }; class AbstractPolyNode : public AbstractNode { public: VISITABLE(); AbstractPolyNode(const ModuleInstantiation *mi) : AbstractNode(mi) { }; ~AbstractPolyNode() { }; enum class render_mode_e { RENDER_CGAL, RENDER_OPENCSG }; }; /*! Logically groups objects together. Used as a way of passing objects around without having to perform unions on them. */ class GroupNode : public AbstractNode { public: VISITABLE(); GroupNode(const class ModuleInstantiation *mi) : AbstractNode(mi) { } ~GroupNode() { } std::string name() const override; }; /*! Only instantiated once, for the top-level file. */ class RootNode : public GroupNode { public: VISITABLE(); RootNode(const class ModuleInstantiation *mi) : GroupNode(mi) { } ~RootNode() { } std::string name() const override; }; class LeafNode : public AbstractPolyNode { public: VISITABLE(); LeafNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) { }; ~LeafNode() { }; virtual const class Geometry *createGeometry() const = 0; }; std::ostream &operator<<(std::ostream &stream, const AbstractNode &node); AbstractNode *find_root_tag(AbstractNode *n); openscad-2019.05/src/nodecache.h0000644000076500000240000000346113452415427016763 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "node.h" #include "printutils.h" /*! Caches string values per node based on the node.index(). The node index guaranteed to be unique per node tree since the index is reset every time a new tree is generated. */ class NodeCache { public: NodeCache() { } virtual ~NodeCache() { } bool contains(const AbstractNode &node) const { auto result = this->cache.find(node.index()); return result != this->cache.end() && result->second.second >= 0L && (long)this->rootString.size() >= result->second.second; } std::string operator[](const AbstractNode &node) const { // throws std::out_of_range on miss auto indexpair = this->cache.at(node.index()); return rootString.substr(indexpair.first, indexpair.second - indexpair.first); } void insertStart(const size_t nodeidx, const long startindex) { assert(this->cache.count(nodeidx) == 0 && "start index inserted twice"); this->cache.emplace(nodeidx, std::make_pair(startindex, -1L)); } void insertEnd(const size_t nodeidx, const long endindex) { // throws std::out_of_range on miss auto indexpair = this->cache.at(nodeidx); assert(indexpair.second == -1L && "end index inserted twice"); this->cache[nodeidx] = std::make_pair(indexpair.first, endindex); #ifdef DEBUG PRINTDB("NodeCache insert {%i,[%d:%d]}", nodeidx % indexpair.first % endindex ); #endif } void setRootString(const std::string &rootString) { this->rootString = rootString; } void clear() { this->cache.clear(); this->rootString = ""; } private: std::unordered_map> cache; std::string rootString; }; openscad-2019.05/src/nodedumper.cc0000644000076500000240000001304513441031431017334 0ustar kintelstaff00000000000000#include "nodedumper.h" #include "state.h" #include "module.h" #include "ModuleInstantiation.h" #include #include #include void GroupNodeChecker::incChildCount(int groupNodeIndex) { auto search = this->groupChildCounts.find(groupNodeIndex); // if no entry then given node wasn't a group node if (search != this->groupChildCounts.end()) { ++(search->second); } } int GroupNodeChecker::getChildCount(int groupNodeIndex) const { auto search = this->groupChildCounts.find(groupNodeIndex); if (search != this->groupChildCounts.end()) { return search->second; } else { return -1; } } Response GroupNodeChecker::visit(State &state, const GroupNode &node) { if (state.isPrefix()) { // create entry for group node, which children may increment this->groupChildCounts.emplace(node.index(),0); } else if (state.isPostfix()) { if ((this->getChildCount(node.index()) > 0) && state.parent()) { this->incChildCount(state.parent()->index()); } } return Response::ContinueTraversal; } Response GroupNodeChecker::visit(State &state, const AbstractNode &) { if (state.isPostfix() && state.parent()) { this->incChildCount(state.parent()->index()); } return Response::ContinueTraversal; } /*! \class NodeDumper A visitor responsible for creating a text dump of a node tree. Also contains a cache for fast retrieval of the text representation of any node or subtree. */ void NodeDumper::initCache() { this->dumpstream.str(""); this->dumpstream.clear(); this->cache.clear(); } void NodeDumper::finalizeCache() { this->cache.setRootString(this->dumpstream.str()); } bool NodeDumper::isCached(const AbstractNode &node) const { return this->cache.contains(node); } Response NodeDumper::visit(State &state, const GroupNode &node) { if (!this->idString) { return NodeDumper::visit(state, (const AbstractNode &)node); } if (state.isPrefix()) { // For handling root modifier '!' // Check if we are processing the root of the current Tree and init cache if (this->root == &node) { this->initCache(); } if (node.modinst->isBackground()) this->dumpstream << "%"; if (node.modinst->isHighlight()) this->dumpstream << "#"; // If IDPREFIX is set, we will output "/*id*/" in front of each node // which is useful for debugging. #ifdef IDPREFIX if (this->idString) this->dumpstream << "\n"; this->dumpstream << "/*" << node.index() << "*/"; #endif // insert start index this->cache.insertStart(node.index(), this->dumpstream.tellp()); if(this->groupChecker.getChildCount(node.index()) > 1) { this->dumpstream << node << "{"; } this->currindent++; } else if (state.isPostfix()) { this->currindent--; if (this->groupChecker.getChildCount(node.index()) > 1) { this->dumpstream << "}"; } // insert end index this->cache.insertEnd(node.index(), this->dumpstream.tellp()); // For handling root modifier '!' // Check if we are processing the root of the current Tree and finalize cache if (this->root == &node) { this->finalizeCache(); } } return Response::ContinueTraversal; } /*! Called for each node in the tree. */ Response NodeDumper::visit(State &state, const AbstractNode &node) { if (state.isPrefix()) { // For handling root modifier '!' // Check if we are processing the root of the current Tree and init cache if (this->root == &node) { this->initCache(); } if (node.modinst->isBackground()) this->dumpstream << "%"; if (node.modinst->isHighlight()) this->dumpstream << "#"; // If IDPREFIX is set, we will output "/*id*/" in front of each node // which is useful for debugging. #ifdef IDPREFIX if (this->idString) this->dumpstream << "\n"; this->dumpstream << "/*" << node.index() << "*/"; #endif // insert start index this->cache.insertStart(node.index(), this->dumpstream.tellp()); if (this->idString) { static const boost::regex re("[^\\s\\\"]+|\\\"(?:[^\\\"\\\\]|\\\\.)*\\\""); const auto name = STR(node); boost::sregex_token_iterator it(name.begin(), name.end(), re, 0); std::copy(it, boost::sregex_token_iterator(), std::ostream_iterator(this->dumpstream)); if (node.getChildren().size() > 0) { this->dumpstream << "{"; } } else { for(int i = 0; i < this->currindent; ++i) { this->dumpstream << this->indent; } this->dumpstream << node; if (node.getChildren().size() > 0) { this->dumpstream << " {\n"; } } this->currindent++; } else if (state.isPostfix()) { this->currindent--; if (this->idString) { if (node.getChildren().size() > 0) { this->dumpstream << "}"; } else { this->dumpstream << ";"; } } else { if (node.getChildren().size() > 0) { for(int i = 0; i < this->currindent; ++i) { this->dumpstream << this->indent; } this->dumpstream << "}\n"; } else { this->dumpstream << ";\n"; } } // insert end index this->cache.insertEnd(node.index(), this->dumpstream.tellp()); // For handling root modifier '!' // Check if we are processing the root of the current Tree and finalize cache if (this->root == &node) { this->finalizeCache(); } } return Response::ContinueTraversal; } /*! Handle root nodes specially: Only list children */ Response NodeDumper::visit(State &state, const RootNode &node) { if (isCached(node)) return Response::PruneTraversal; if (state.isPrefix()) { this->initCache(); this->cache.insertStart(node.index(), this->dumpstream.tellp()); } else if (state.isPostfix()) { this->cache.insertEnd(node.index(), this->dumpstream.tellp()); this->finalizeCache(); } return Response::ContinueTraversal; } openscad-2019.05/src/nodedumper.h0000644000076500000240000000350513433421332017202 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "NodeVisitor.h" #include "node.h" #include "nodecache.h" // GroupNodeChecker does a quick first pass to count children of group nodes // If a GroupNode has 0 children, don't include in node id strings // If a GroupNode has 1 child, we replace it with its child // This makes id strings much more compact for deeply nested trees, recursive scad scripts, // and increases likelihood of node cache hits. class GroupNodeChecker : public NodeVisitor { public: GroupNodeChecker(){} Response visit(State &state, const AbstractNode &node) override; Response visit(State &state, const GroupNode &node) override; void incChildCount(int groupNodeIndex); int getChildCount(int groupNodeIndex) const; void reset() { groupChildCounts.clear(); } private: // stores for each group node std::unordered_map groupChildCounts; }; class NodeDumper : public NodeVisitor { public: NodeDumper(NodeCache &cache, const AbstractNode *root_node, const std::string& indent, bool idString) : cache(cache), indent(indent), idString(idString), currindent(0), root(root_node) { if (idString) { groupChecker.traverse(*root); } } ~NodeDumper() {} Response visit(State &state, const AbstractNode &node) override; Response visit(State &state, const GroupNode &node) override; Response visit(State &state, const RootNode &node) override; private: void initCache(); void finalizeCache(); bool isCached(const AbstractNode &node) const; NodeCache &cache; // Output Formatting options std::string indent; bool idString; int currindent; const AbstractNode *root; GroupNodeChecker groupChecker; std::ostringstream dumpstream; }; openscad-2019.05/src/offset.cc0000644000076500000240000000716613414440603016474 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "offsetnode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "printutils.h" #include "fileutils.h" #include "builtin.h" #include "calc.h" #include "polyset.h" #include #include using namespace boost::assign; // bring 'operator+=()' into scope #include namespace fs = boost::filesystem; class OffsetModule : public AbstractModule { public: OffsetModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *OffsetModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new OffsetNode(inst); AssignmentList args{Assignment("r")}; AssignmentList optargs{Assignment("delta"),Assignment("chamfer")}; Context c(ctx); c.setVariables(evalctx, args, optargs); inst->scope.apply(*evalctx); node->fn = c.lookup_variable("$fn")->toDouble(); node->fs = c.lookup_variable("$fs")->toDouble(); node->fa = c.lookup_variable("$fa")->toDouble(); // default with no argument at all is (r = 1, chamfer = false) // radius takes precedence if both r and delta are given. node->delta = 1; node->chamfer = false; node->join_type = ClipperLib::jtRound; const auto r = c.lookup_variable("r", true); const auto delta = c.lookup_variable("delta", true); const auto chamfer = c.lookup_variable("chamfer", true); if (r->isDefinedAs(Value::ValueType::NUMBER)) { r->getDouble(node->delta); } else if (delta->isDefinedAs(Value::ValueType::NUMBER)) { delta->getDouble(node->delta); node->join_type = ClipperLib::jtMiter; if (chamfer->isDefinedAs(Value::ValueType::BOOL) && chamfer->toBool()) { node->chamfer = true; node->join_type = ClipperLib::jtSquare; } } auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string OffsetNode::toString() const { std::ostringstream stream; bool isRadius = this->join_type == ClipperLib::jtRound; auto var = isRadius ? "(r = " : "(delta = "; stream << this->name() << var << std::dec << this->delta; if (!isRadius) { stream << ", chamfer = " << (this->chamfer ? "true" : "false"); } stream << ", $fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ")"; return stream.str(); } void register_builtin_offset() { Builtins::init("offset", new OffsetModule()); } openscad-2019.05/src/offsetnode.h0000644000076500000240000000112713402025764017177 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "value.h" #include "clipper-utils.h" class OffsetNode : public AbstractPolyNode { public: VISITABLE(); OffsetNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi), chamfer(false), fn(0), fs(0), fa(0), delta(1), miter_limit(1000000.0), join_type(ClipperLib::jtRound) { } std::string toString() const override; std::string name() const override { return "offset"; } bool chamfer; double fn, fs, fa, delta; double miter_limit; // currently fixed high value to disable chamfers with jtMiter ClipperLib::JoinType join_type; }; openscad-2019.05/src/openscad.cc0000644000076500000240000010144613463464440017007 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "openscad.h" #include "comment.h" #include "node.h" #include "FileModule.h" #include "ModuleInstantiation.h" #include "builtincontext.h" #include "value.h" #include "export.h" #include "builtin.h" #include "printutils.h" #include "handle_dep.h" #include "feature.h" #include "parsersettings.h" #include "rendersettings.h" #include "PlatformUtils.h" #include "LibraryInfo.h" #include "nodedumper.h" #include "stackcheck.h" #include "CocoaUtils.h" #include "FontCache.h" #include "OffscreenView.h" #include "GeometryEvaluator.h" #include"parameter/parameterset.h" #include #include #include #ifdef ENABLE_CGAL #include "CGAL_Nef_polyhedron.h" #include "cgalutils.h" #endif #include "csgnode.h" #include "CSGTreeEvaluator.h" #include "Camera.h" #include #include #include #include #include #include #ifdef __APPLE__ #include "AppleEvents.h" #ifdef OPENSCAD_UPDATER #include "SparkleAutoUpdater.h" #endif #endif #ifdef _MSC_VER #define snprintf _snprintf #endif namespace po = boost::program_options; namespace fs = boost::filesystem; using std::string; using std::vector; using boost::lexical_cast; using boost::bad_lexical_cast; using boost::is_any_of; std::string commandline_commands; std::string currentdir; static bool arg_info = false; static std::string arg_colorscheme; class Echostream : public std::ofstream { public: Echostream(const char * filename) : std::ofstream(filename) { set_output_handler( &Echostream::output, this ); } static void output(const std::string &msg, void *userdata) { auto thisp = static_cast(userdata); *thisp << msg << "\n"; } ~Echostream() { this->close(); } }; static void help(const char *arg0, const po::options_description &desc, bool failure = false) { const fs::path progpath(arg0); PRINTB("Usage: %s [options] file.scad\n%s", progpath.filename().string() % STR(desc)); exit(failure ? 1 : 0); } #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) static void version() { PRINTB("OpenSCAD version %s", TOSTRING(OPENSCAD_VERSION)); exit(0); } static int info() { std::cout << LibraryInfo::info() << "\n\n"; try { OffscreenView glview(512,512); std::cout << glview.getRendererInfo() << "\n"; } catch (int error) { PRINTB("Can't create OpenGL OffscreenView. Code: %i. Exiting.\n", error); return 1; } return 0; } /** * Initialize gettext. This must be called after the application path was * determined so we can lookup the resource path for the language translation * files. */ void localization_init() { fs::path po_dir(PlatformUtils::resourcePath("locale")); std::string locale_path(po_dir.string()); if (fs::is_directory(locale_path)) { setlocale(LC_ALL, ""); bindtextdomain("openscad", locale_path.c_str()); bind_textdomain_codeset("openscad", "UTF-8"); textdomain("openscad"); } else { PRINT("Could not initialize localization."); } } Camera get_camera(const po::variables_map &vm) { Camera camera; if (vm.count("camera")) { vector strs; vector cam_parameters; boost::split(strs, vm["camera"].as(), is_any_of(",")); if (strs.size() == 6 || strs.size() == 7) { try { for (const auto &s : strs) cam_parameters.push_back(lexical_cast(s)); camera.setup(cam_parameters); } catch (bad_lexical_cast &) { PRINT("Camera setup requires numbers as parameters"); } } else { PRINT("Camera setup requires either 7 numbers for Gimbal Camera"); PRINT("or 6 numbers for Vector Camera"); exit(1); } } else { camera.viewall = true; camera.autocenter = true; } if (vm.count("viewall")) { camera.viewall = true; } if (vm.count("autocenter")) { camera.autocenter = true; } if (vm.count("projection")) { auto proj = vm["projection"].as(); if (proj == "o" || proj == "ortho" || proj == "orthogonal") { camera.projection = Camera::ProjectionType::ORTHOGONAL; } else if (proj=="p" || proj=="perspective") { camera.projection = Camera::ProjectionType::PERSPECTIVE; } else { PRINT("projection needs to be 'o' or 'p' for ortho or perspective\n"); exit(1); } } auto w = RenderSettings::inst()->img_width; auto h = RenderSettings::inst()->img_height; if (vm.count("imgsize")) { vector strs; boost::split(strs, vm["imgsize"].as(), is_any_of(",")); if ( strs.size() != 2 ) { PRINT("Need 2 numbers for imgsize"); exit(1); } else { try { w = lexical_cast(strs[0]); h = lexical_cast(strs[1]); } catch (bad_lexical_cast &) { PRINT("Need 2 numbers for imgsize"); } } } camera.pixel_width = w; camera.pixel_height = h; return camera; } #ifndef OPENSCAD_NOGUI #include "QSettingsCached.h" #define OPENSCAD_QTGUI 1 #endif static bool checkAndExport(shared_ptr root_geom, unsigned nd, FileFormat format, const char *filename) { if (root_geom->getDimension() != nd) { PRINTB("Current top level object is not a %dD object.", nd); return false; } if (root_geom->isEmpty()) { PRINT("Current top level object is empty."); return false; } exportFileByName(root_geom, format, filename, filename); return true; } void set_render_color_scheme(const std::string color_scheme, const bool exit_if_not_found) { if (color_scheme.empty()) { return; } if (ColorMap::inst()->findColorScheme(color_scheme)) { RenderSettings::inst()->colorscheme = color_scheme; return; } if (exit_if_not_found) { PRINTB("Unknown color scheme '%s'. Valid schemes:", color_scheme); PRINT(boost::join(ColorMap::inst()->colorSchemeNames(), "\n")); exit(1); } else { PRINTB("Unknown color scheme '%s', using default '%s'.", arg_colorscheme % ColorMap::inst()->defaultColorSchemeName()); } } int cmdline(const char *deps_output_file, const std::string &filename, const char *output_file, const fs::path &original_path, const std::string ¶meterFile, const std::string &setName, const ViewOptions& viewOptions, Camera camera) { Tree tree; boost::filesystem::path doc(filename); tree.setDocumentPath(doc.remove_filename().string()); #ifdef ENABLE_CGAL GeometryEvaluator geomevaluator(tree); #endif const char *stl_output_file = nullptr; const char *off_output_file = nullptr; const char *amf_output_file = nullptr; const char *_3mf_output_file = nullptr; const char *dxf_output_file = nullptr; const char *svg_output_file = nullptr; const char *csg_output_file = nullptr; const char *png_output_file = nullptr; const char *ast_output_file = nullptr; const char *term_output_file = nullptr; const char *echo_output_file = nullptr; const char *nefdbg_output_file = nullptr; const char *nef3_output_file = nullptr; auto suffix = fs::path(output_file).extension().generic_string(); boost::algorithm::to_lower(suffix); if (suffix == ".stl") stl_output_file = output_file; else if (suffix == ".off") off_output_file = output_file; else if (suffix == ".amf") amf_output_file = output_file; else if (suffix == ".3mf") _3mf_output_file = output_file; else if (suffix == ".dxf") dxf_output_file = output_file; else if (suffix == ".svg") svg_output_file = output_file; else if (suffix == ".csg") csg_output_file = output_file; else if (suffix == ".png") png_output_file = output_file; else if (suffix == ".ast") ast_output_file = output_file; else if (suffix == ".term") term_output_file = output_file; else if (suffix == ".echo") echo_output_file = output_file; else if (suffix == ".nefdbg") nefdbg_output_file = output_file; else if (suffix == ".nef3") nef3_output_file = output_file; else { PRINTB("Unknown suffix for output file %s\n", output_file); return 1; } set_render_color_scheme(arg_colorscheme, true); // Top context - this context only holds builtins BuiltinContext top_ctx; const bool preview = png_output_file ? (viewOptions.renderer == RenderType::OPENCSG || viewOptions.renderer == RenderType::THROWNTOGETHER) : false; top_ctx.set_variable("$preview", ValuePtr(preview)); #ifdef DEBUG PRINTDB("BuiltinContext:\n%s", top_ctx.dump(nullptr, nullptr)); #endif shared_ptr echostream; if (echo_output_file) { echostream.reset(new Echostream(echo_output_file)); } FileModule *root_module; ModuleInstantiation root_inst("group"); AbstractNode *root_node; AbstractNode *absolute_root_node; shared_ptr root_geom; handle_dep(filename); std::ifstream ifs(filename.c_str()); if (!ifs.is_open()) { PRINTB("Can't open input file '%s'!\n", filename.c_str()); return 1; } std::string text((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); text += "\n\x03\n" + commandline_commands; if (!parse(root_module, text, filename, filename, false)) { delete root_module; // parse failed root_module = nullptr; } if (!root_module) { PRINTB("Can't parse file '%s'!\n", filename.c_str()); return 1; } // add parameter to AST CommentParser::collectParameters(text.c_str(), root_module); if (!parameterFile.empty() && !setName.empty()) { ParameterSet param; param.readParameterSet(parameterFile); param.applyParameterSet(root_module, setName); } root_module->handleDependencies(); auto fpath = fs::absolute(fs::path(filename)); auto fparent = fpath.parent_path(); fs::current_path(fparent); top_ctx.setDocumentPath(fparent.string()); AbstractNode::resetIndexCounter(); absolute_root_node = root_module->instantiate(&top_ctx, &root_inst, nullptr); // Do we have an explicit root node (! modifier)? if (!(root_node = find_root_tag(absolute_root_node))) { root_node = absolute_root_node; } tree.setRoot(root_node); if (deps_output_file) { fs::current_path(original_path); std::string deps_out(deps_output_file); std::string geom_out(output_file); int result = write_deps(deps_out, geom_out); if (!result) { PRINT("error writing deps"); return 1; } } if (csg_output_file) { fs::current_path(original_path); std::ofstream fstream(csg_output_file); if (!fstream.is_open()) { PRINTB("Can't open file \"%s\" for export", csg_output_file); } else { fs::current_path(fparent); // Force exported filenames to be relative to document path fstream << tree.getString(*root_node, "\t") << "\n"; fstream.close(); } } else if (ast_output_file) { fs::current_path(original_path); std::ofstream fstream(ast_output_file); if (!fstream.is_open()) { PRINTB("Can't open file \"%s\" for export", ast_output_file); } else { fs::current_path(fparent); // Force exported filenames to be relative to document path fstream << root_module->dump(""); fstream.close(); } } else if (term_output_file) { CSGTreeEvaluator csgRenderer(tree); auto root_raw_term = csgRenderer.buildCSGTree(*root_node); fs::current_path(original_path); std::ofstream fstream(term_output_file); if (!fstream.is_open()) { PRINTB("Can't open file \"%s\" for export", term_output_file); } else { if (!root_raw_term) fstream << "No top-level CSG object\n"; else { fstream << root_raw_term->dump() << "\n"; } fstream.close(); } } else { #ifdef ENABLE_CGAL if ((echo_output_file || png_output_file) && (viewOptions.renderer == RenderType::OPENCSG || viewOptions.renderer == RenderType::THROWNTOGETHER)) { // echo or OpenCSG png -> don't necessarily need geometry evaluation } else { // Force creation of CGAL objects (for testing) root_geom = geomevaluator.evaluateGeometry(*tree.root(), true); if (!root_geom) root_geom.reset(new CGAL_Nef_polyhedron()); if (viewOptions.renderer == RenderType::CGAL && root_geom->getDimension() == 3) { auto N = dynamic_cast(root_geom.get()); if (!N) { N = CGALUtils::createNefPolyhedronFromGeometry(*root_geom); root_geom.reset(N); PRINT("Converted to Nef polyhedron"); } } } fs::current_path(original_path); if (stl_output_file) { if (!checkAndExport(root_geom, 3, FileFormat::STL, stl_output_file)) { return 1; } } if (off_output_file) { if (!checkAndExport(root_geom, 3, FileFormat::OFF, off_output_file)) { return 1; } } if (amf_output_file) { if (!checkAndExport(root_geom, 3, FileFormat::AMF, amf_output_file)) { return 1; } } if (_3mf_output_file) { if (!checkAndExport(root_geom, 3, FileFormat::_3MF, _3mf_output_file)) return 1; } if (dxf_output_file) { if (!checkAndExport(root_geom, 2, FileFormat::DXF, dxf_output_file)) { return 1; } } if (svg_output_file) { if (!checkAndExport(root_geom, 2, FileFormat::SVG, svg_output_file)) { return 1; } } if (png_output_file) { auto success = true; std::ofstream fstream(png_output_file,std::ios::out|std::ios::binary); if (!fstream.is_open()) { PRINTB("Can't open file \"%s\" for export", png_output_file); success = false; } else { if (viewOptions.renderer == RenderType::CGAL || viewOptions.renderer == RenderType::GEOMETRY) { success = export_png(root_geom, viewOptions, camera, fstream); } else { success = export_preview_png(tree, viewOptions, camera, fstream); } fstream.close(); } return success ? 0 : 1; } if (nefdbg_output_file) { if (!checkAndExport(root_geom, 3, FileFormat::NEFDBG, nefdbg_output_file)) { return 1; } } if (nef3_output_file) { if (!checkAndExport(root_geom, 3, FileFormat::NEF3, nef3_output_file)) { return 1; } } #else PRINT("OpenSCAD has been compiled without CGAL support!\n"); return 1; #endif } delete root_node; return 0; } #ifdef OPENSCAD_QTGUI #include #if defined(__MINGW64__) || defined(__MINGW32__) || defined(_MSCVER) #if QT_VERSION < 0x050000 Q_IMPORT_PLUGIN(qtaccessiblewidgets) #endif // QT_VERSION #endif // MINGW64/MINGW32/MSCVER #include "MainWindow.h" #include "OpenSCADApp.h" #include "launchingscreen.h" #include "QSettingsCached.h" #include "input/InputDriverManager.h" #ifdef ENABLE_HIDAPI #include "input/HidApiInputDriver.h" #endif #ifdef ENABLE_SPNAV #include "input/SpaceNavInputDriver.h" #endif #ifdef ENABLE_JOYSTICK #include "input/JoystickInputDriver.h" #endif #ifdef ENABLE_DBUS #include "input/DBusInputDriver.h" #endif #ifdef ENABLE_QGAMEPAD #include "input/QGamepadInputDriver.h" #endif #include #include #include #include #include #include #include #include #include "settings.h" Q_DECLARE_METATYPE(shared_ptr); // Only if "fileName" is not absolute, prepend the "absoluteBase". static QString assemblePath(const fs::path& absoluteBaseDir, const string& fileName) { if (fileName.empty()) return ""; auto qsDir = QString::fromLocal8Bit(absoluteBaseDir.generic_string().c_str()); auto qsFile = QString::fromLocal8Bit(fileName.c_str()); // if qsfile is absolute, dir is ignored. (see documentation of QFileInfo) QFileInfo info(qsDir, qsFile); return info.absoluteFilePath(); } bool QtUseGUI() { #ifdef Q_OS_X11 // see : // On X11, the window system is initialized if GUIenabled is true. If GUIenabled // is false, the application does not connect to the X server. On Windows and // Macintosh, currently the window system is always initialized, regardless of the // value of GUIenabled. This may change in future versions of Qt. bool useGUI = getenv("DISPLAY") != 0; #else bool useGUI = true; #endif return useGUI; } void dialogThreadFunc(FontCacheInitializer *initializer) { initializer->run(); } void dialogInitHandler(FontCacheInitializer *initializer, void *) { QFutureWatcher futureWatcher; QObject::connect(&futureWatcher, SIGNAL(finished()), scadApp, SLOT(hideFontCacheDialog())); auto future = QtConcurrent::run(boost::bind(dialogThreadFunc, initializer)); futureWatcher.setFuture(future); // We don't always get the started() signal, so we start manually QMetaObject::invokeMethod(scadApp, "showFontCacheDialog"); // Block, in case we're in a separate thread, or the dialog was closed by the user futureWatcher.waitForFinished(); // We don't always receive the finished signal. We still need the signal to break // out of the exec() though. QMetaObject::invokeMethod(scadApp, "hideFontCacheDialog"); } #ifdef Q_OS_WIN void registerDefaultIcon(QString applicationFilePath) { // Not using cached instance here, so this needs to be in a // separate scope to ensure the QSettings instance is released // directly after use. QSettings reg_setting(QLatin1String("HKEY_CURRENT_USER"), QSettings::NativeFormat); auto appPath = QDir::toNativeSeparators(applicationFilePath + QLatin1String(",1")); reg_setting.setValue(QLatin1String("Software/Classes/OpenSCAD_File/DefaultIcon/Default"),QVariant(appPath)); } #else void registerDefaultIcon(QString) { } #endif int gui(vector &inputFiles, const fs::path &original_path, int argc, char ** argv) { OpenSCADApp app(argc, argv); // remove ugly frames in the QStatusBar when using additional widgets app.setStyleSheet("QStatusBar::item { border: 0px solid black; }"); // set up groups for QSettings QCoreApplication::setOrganizationName("OpenSCAD"); QCoreApplication::setOrganizationDomain("openscad.org"); QCoreApplication::setApplicationName("OpenSCAD"); QCoreApplication::setApplicationVersion(TOSTRING(OPENSCAD_VERSION)); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) QGuiApplication::setApplicationDisplayName("OpenSCAD"); QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #else QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); #endif #ifdef OPENSCAD_SNAPSHOT app.setWindowIcon(QIcon(":/icons/openscad-nightly.png")); #else app.setWindowIcon(QIcon(":/icons/openscad.png")); #endif // Other global settings qRegisterMetaType>(); FontCache::registerProgressHandler(dialogInitHandler); parser_init(); QSettingsCached settings; if (settings.value("advanced/localization", true).toBool()) { localization_init(); } #ifdef Q_OS_MAC installAppleEventHandlers(); #endif registerDefaultIcon(app.applicationFilePath()); #ifdef OPENSCAD_UPDATER AutoUpdater *updater = new SparkleAutoUpdater; AutoUpdater::setUpdater(updater); if (updater->automaticallyChecksForUpdates()) updater->checkForUpdates(); updater->init(); #endif #ifndef USE_QOPENGLWIDGET // This workaround appears to only be needed when QGLWidget is used QOpenGLWidget // available in Qt 5.4 is much better. QGLFormat fmt; #if 0 /*** disabled by clifford wolf: adds rendering artefacts with OpenCSG ***/ // turn on anti-aliasing fmt.setSampleBuffers(true); fmt.setSamples(4); #endif // The default SwapInterval causes very bad interactive behavior as // waiting for the buffer swap seems to block mouse events. So the // effect is that we can process mouse events at the frequency of // the screen retrace interval causing them to queue up. // (see https://bugreports.qt-project.org/browse/QTBUG-39370 fmt.setSwapInterval(0); QGLFormat::setDefaultFormat(fmt); #endif set_render_color_scheme(arg_colorscheme, false); auto noInputFiles = false; if (!inputFiles.size()) { noInputFiles = true; inputFiles.push_back(""); } auto showOnStartup = settings.value("launcher/showOnStartup"); if (noInputFiles && (showOnStartup.isNull() || showOnStartup.toBool())) { auto launcher = new LaunchingScreen(); auto dialogResult = launcher->exec(); if (dialogResult == QDialog::Accepted) { auto files = launcher->selectedFiles(); // If nothing is selected in the launching screen, leave // the "" dummy in inputFiles to open an empty MainWindow. if (!files.empty()) { inputFiles.clear(); for (const auto &f : files) { inputFiles.push_back(f.toStdString()); } } delete launcher; } else { return 0; } } auto isMdi = settings.value("advanced/mdi", true).toBool(); if (isMdi) { for(const auto &infile : inputFiles) { new MainWindow(assemblePath(original_path, infile)); } } else { new MainWindow(assemblePath(original_path, inputFiles[0])); } app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(releaseQSettingsCached())); app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); auto *s = Settings::Settings::inst(); #ifdef ENABLE_HIDAPI if(s->get(Settings::Settings::inputEnableDriverHIDAPI).toBool()){ auto hidApi = new HidApiInputDriver(); InputDriverManager::instance()->registerDriver(hidApi); } #endif #ifdef ENABLE_SPNAV if(s->get(Settings::Settings::inputEnableDriverSPNAV).toBool()){ auto spaceNavDriver = new SpaceNavInputDriver(); bool spaceNavDominantAxisOnly = s->get(Settings::Settings::inputEnableDriverHIDAPI).toBool(); spaceNavDriver->setDominantAxisOnly(spaceNavDominantAxisOnly); InputDriverManager::instance()->registerDriver(spaceNavDriver); } #endif #ifdef ENABLE_JOYSTICK if(s->get(Settings::Settings::inputEnableDriverJOYSTICK).toBool()){ std::string nr = s->get(Settings::Settings::joystickNr).toString(); auto joyDriver = new JoystickInputDriver(); joyDriver->setJoystickNr(nr); InputDriverManager::instance()->registerDriver(joyDriver); } #endif #ifdef ENABLE_QGAMEPAD if(s->get(Settings::Settings::inputEnableDriverQGAMEPAD).toBool()){ auto qGamepadDriver = new QGamepadInputDriver(); InputDriverManager::instance()->registerDriver(qGamepadDriver); } #endif #ifdef ENABLE_DBUS if (Feature::ExperimentalInputDriverDBus.is_enabled()) { if(s->get(Settings::Settings::inputEnableDriverDBUS).toBool()){ auto dBusDriver =new DBusInputDriver(); InputDriverManager::instance()->registerDriver(dBusDriver); } } #endif InputDriverManager::instance()->init(); int rc = app.exec(); for (auto &mainw : scadApp->windowManager.getWindows()) delete mainw; return rc; } #else // OPENSCAD_QTGUI bool QtUseGUI() { return false; } int gui(const vector &inputFiles, const fs::path &original_path, int argc, char ** argv) { PRINT("Error: compiled without QT, but trying to run GUI\n"); return 1; } #endif // OPENSCAD_QTGUI #if defined(Q_OS_MACX) std::pair customSyntax(const string& s) { if (s.find("-psn_") == 0) return {"psn", s.substr(5)}; #else std::pair customSyntax(const string&) { #endif return {}; } /*! This makes boost::program_option parse comma-separated values */ struct CommaSeparatedVector { std::vector values; friend std::istream &operator>>(std::istream &in, CommaSeparatedVector &value) { std::string token; in >> token; boost::split(value.values, token, boost::is_any_of(",")); return in; } }; template std::string join(const Seq &seq, const std::string &sep, const ToString &toString) { return boost::algorithm::join(boost::adaptors::transform(seq, toString), sep); } bool flagConvert(std::string str){ if(str =="1" || boost::iequals(str, "on") || boost::iequals(str, "true")) { return true; } if(str =="0" || boost::iequals(str, "off") || boost::iequals(str, "false")) { return false; } throw std::runtime_error(""); return false; } int main(int argc, char **argv) { int rc = 0; StackCheck::inst(); #ifdef OPENSCAD_QTGUI { // Need a dummy app instance to get the application path but it needs to be destroyed before the GUI is launched. QCoreApplication app(argc, argv); PlatformUtils::registerApplicationPath(app.applicationDirPath().toLocal8Bit().constData()); } #else PlatformUtils::registerApplicationPath(fs::absolute(boost::filesystem::path(argv[0]).parent_path()).generic_string()); #endif #ifdef Q_OS_MAC bool isGuiLaunched = getenv("GUI_LAUNCHED") != nullptr; if (isGuiLaunched) set_output_handler(CocoaUtils::nslog, nullptr); #else PlatformUtils::ensureStdIO(); #endif #ifdef ENABLE_CGAL // Causes CGAL errors to abort directly instead of throwing exceptions // (which we don't catch). This gives us stack traces without rerunning in gdb. CGAL::set_error_behaviour(CGAL::ABORT); #endif Builtins::instance()->initialize(); auto original_path = fs::current_path(); const char *output_file = nullptr; const char *deps_output_file = nullptr; ViewOptions viewOptions{}; po::options_description desc("Allowed options"); desc.add_options() ("o,o", po::value(), "output specified file instead of running the GUI, the file extension specifies the type: stl, off, amf, 3mf, csg, dxf, svg, png, echo, ast, term, nef3, nefdbg\n") ("D,D", po::value>(), "var=val -pre-define variables") ("p,p", po::value(), "customizer parameter file") ("P,P", po::value(), "customizer parameter set") #ifdef ENABLE_EXPERIMENTAL ("enable", po::value>(), ("enable experimental features: " + join(boost::make_iterator_range(Feature::begin(), Feature::end()), " | ", [](const Feature *feature) { return feature->get_name(); }) + "\n").c_str()) #endif ("help,h", "print this help message and exit") ("version,v", "print the version") ("info", "print information about the build process\n") ("camera", po::value(), "camera parameters when exporting png: =translate_x,y,z,rot_x,y,z,dist or =eye_x,y,z,center_x,y,z") ("autocenter", "adjust camera to look at object's center") ("viewall", "adjust camera to fit object") ("imgsize", po::value(), "=width,height of exported png") ("render", po::value()->implicit_value(""), "for full geometry evaluation when exporting png") ("preview", po::value()->implicit_value(""), "[=throwntogether] -for ThrownTogether preview png") ("view", po::value(), ("=view options: " + boost::join(viewOptions.names(), " | ")).c_str()) ("projection", po::value(), "=(o)rtho or (p)erspective when exporting png") ("csglimit", po::value(), "=n -stop rendering at n CSG elements when exporting png") ("colorscheme", po::value(), ("=colorscheme: " + join(ColorMap::inst()->colorSchemeNames(), " | ", [](const std::string& colorScheme) { return (colorScheme == ColorMap::inst()->defaultColorSchemeName() ? "*" : "") + colorScheme; }) + "\n").c_str()) ("d,d", po::value(), "deps_file -generate a dependency file for make") ("m,m", po::value(), "make_cmd -runs make_cmd file if file is missing") ("quiet,q", "quiet mode (don't print anything *except* errors)") ("hardwarnings", "Stop on the first warning") ("check-parameters", po::value(), "=true/false, configure the parameter check for user modules and functions") ("check-parameter-ranges", po::value(), "=true/false, configure the parameter range check for builtin modules") ("debug", po::value(), "special debug info") ("s,s", po::value(), "stl_file deprecated, use -o") ("x,x", po::value(), "dxf_file deprecated, use -o") ; po::options_description hidden("Hidden options"); hidden.add_options() #ifdef Q_OS_MACX ("psn", po::value(), "process serial number") #endif ("input-file", po::value< vector>(), "input file"); po::positional_options_description p; p.add("input-file", -1); po::options_description all_options; all_options.add(desc).add(hidden); po::variables_map vm; try { po::store(po::command_line_parser(argc, argv).options(all_options).positional(p).extra_parser(customSyntax).run(), vm); } catch(const std::exception &e) { // Catches e.g. unknown options PRINTB("%s\n", e.what()); help(argv[0], desc, true); } OpenSCAD::debug = ""; if (vm.count("debug")) { OpenSCAD::debug = vm["debug"].as(); PRINTB("Debug on. --debug=%s",OpenSCAD::debug); } if (vm.count("quiet")) { OpenSCAD::quiet = true; } if (vm.count("hardwarnings")) { OpenSCAD::hardwarnings = true; } std::map flags; flags.insert(std::make_pair("check-parameters",&OpenSCAD::parameterCheck)); flags.insert(std::make_pair("check-parameter-ranges",&OpenSCAD::rangeCheck)); for(auto flag : flags) { std::string name = flag.first; if(vm.count(name)){ std::string opt = vm[name].as(); try { (*(flag.second) = flagConvert(opt)); } catch ( const std::runtime_error &e ) { PRINTB("Could not parse '--%s %s' as flag", name % opt); } } } if (vm.count("help")) help(argv[0], desc); if (vm.count("version")) version(); if (vm.count("info")) arg_info = true; if (vm.count("preview")) { if (vm["preview"].as() == "throwntogether") viewOptions.renderer = RenderType::THROWNTOGETHER; } else if (vm.count("render")) { if (vm["render"].as() == "cgal") viewOptions.renderer = RenderType::CGAL; else viewOptions.renderer = RenderType::GEOMETRY; } viewOptions.previewer = (viewOptions.renderer == RenderType::THROWNTOGETHER) ? Previewer::THROWNTOGETHER : Previewer::OPENCSG; if (vm.count("view")) { const auto &viewOptionValues = vm["view"].as(); for (const auto &option : viewOptionValues.values) { try { viewOptions[option] = true; } catch (const std::out_of_range &e) { PRINTB("Unknown --view option '%s' ignored. Use -h to list available options.", option); } } } if (vm.count("csglimit")) { RenderSettings::inst()->openCSGTermLimit = vm["csglimit"].as(); } if (vm.count("o")) { // FIXME: Allow for multiple output files? if (output_file) help(argv[0], desc, true); output_file = vm["o"].as().c_str(); } if (vm.count("s")) { printDeprecation("The -s option is deprecated. Use -o instead.\n"); if (output_file) help(argv[0], desc, true); output_file = vm["s"].as().c_str(); } if (vm.count("x")) { printDeprecation("The -x option is deprecated. Use -o instead.\n"); if (output_file) help(argv[0], desc, true); output_file = vm["x"].as().c_str(); } if (vm.count("d")) { if (deps_output_file) help(argv[0], desc, true); deps_output_file = vm["d"].as().c_str(); } if (vm.count("m")) { if (make_command) help(argv[0], desc, true); make_command = vm["m"].as().c_str(); } if (vm.count("D")) { for(const auto &cmd : vm["D"].as>()) { commandline_commands += cmd; commandline_commands += ";\n"; } } if (vm.count("enable")) { for(const auto &feature : vm["enable"].as>()) { Feature::enable_feature(feature); } } string parameterFile; if (vm.count("p")) { if (!parameterFile.empty()) { help(argv[0], desc, true); } parameterFile = vm["p"].as().c_str(); } string parameterSet; if (vm.count("P")) { if (!parameterSet.empty()) { help(argv[0], desc, true); } parameterSet = vm["P"].as().c_str(); } vector inputFiles; if (vm.count("input-file")) { inputFiles = vm["input-file"].as>(); } if (vm.count("colorscheme")) { arg_colorscheme = vm["colorscheme"].as(); } currentdir = fs::current_path().generic_string(); Camera camera = get_camera(vm); auto cmdlinemode = false; if (output_file) { // cmd-line mode cmdlinemode = true; if (!inputFiles.size()) help(argv[0], desc, true); } if (arg_info || cmdlinemode) { if (inputFiles.size() > 1) help(argv[0], desc, true); try { parser_init(); localization_init(); if (arg_info) { rc = info(); } else { rc = cmdline(deps_output_file, inputFiles[0], output_file, original_path, parameterFile, parameterSet, viewOptions, camera); } } catch (const HardWarningException &) { rc = 1; } } else if (QtUseGUI()) { rc = gui(inputFiles, original_path, argc, argv); } else { PRINT("Requested GUI mode but can't open display!\n"); help(argv[0], desc, true); } Builtins::instance(true); return rc; } openscad-2019.05/src/openscad.h0000644000076500000240000000320613417146620016640 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include extern bool parse(class FileModule *&module, const std::string& text, const std::string &filename, const std::string &mainFile, int debug); #include extern std::string commandline_commands; // The CWD when application started. We shouldn't change CWD, but until we stop // doing this, use currentdir to get the original CWD. extern std::string currentdir; // Custom argument parser std::pair customSyntax(const std::string& s); openscad-2019.05/src/parameter/ParameterEntryWidget.ui0000644000076500000240000004053013402025764023320 0ustar kintelstaff00000000000000 ParameterEntryWidget 0 0 308 54 0 0 0 0 Form 4 0 4 0 0 true 0 0 0 0 0 0 0 0 0 0 0 0 0 Qt::Horizontal 0 0 0 0 0 0 0 0 0 Qt::StrongFocus 0 0 0 0 0 0 0 true 0 0 true true 0 0 0 0 0 4 0 0 0 Qt::StrongFocus Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::CorrectToNearestValue 0 1000.000000000000000 0 0 Qt::StrongFocus Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::CorrectToNearestValue 0 1000.000000000000000 0 0 Qt::StrongFocus Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::CorrectToNearestValue 0 1000.000000000000000 Qt::Horizontal 40 5 0 0 Qt::StrongFocus Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::CorrectToNearestValue 0 1000.000000000000000 0 0 0 0 0 0 0 75 true 0 Parameter Qt::PlainText false 0 0 0 Description Qt::PlainText true 0 0 0 Description Qt::PlainText 0 0 0 1 0 0 0 0 0 0 0 0 0 Qt::RightToLeft 0 0 0 0 0 0 0 0 0 Qt::StrongFocus Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::CorrectToNearestValue 0 1000.000000000000000 doubleSpinBox1 doubleSpinBox2 doubleSpinBox3 doubleSpinBox4 slider comboBox lineEdit openscad-2019.05/src/parameter/ParameterWidget.cc0000644000076500000240000004431613434420302022244 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2014 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "ParameterWidget.h" #include "parameterspinbox.h" #include "parametercombobox.h" #include "parameterslider.h" #include "parametercheckbox.h" #include "parametertext.h" #include "parametervector.h" #include "modcontext.h" #include "comment.h" #include #include #include #include namespace pt = boost::property_tree; #include #include #include ParameterWidget::ParameterWidget(QWidget *parent) : QWidget(parent) { setupUi(this); this->setEnabled(false); descriptionLoD = DescLoD::ShowDetails; autoPreviewTimer.setInterval(500); autoPreviewTimer.setSingleShot(true); connect(&autoPreviewTimer, SIGNAL(timeout()), this, SLOT(onPreviewTimerElapsed())); connect(checkBoxAutoPreview, SIGNAL(toggled(bool)), this, SLOT(onValueChanged())); connect(comboBoxDetails,SIGNAL(currentIndexChanged(int)), this,SLOT(onDescriptionLoDChanged())); connect(comboBoxPreset, SIGNAL(currentIndexChanged(int)), this, SLOT(onSetChanged(int))); connect(comboBoxPreset->lineEdit(), SIGNAL(editingFinished()), this, SLOT(onSetNameChanged())); connect(reset, SIGNAL(clicked()), this, SLOT(resetParameter())); comboBoxPreset->setInsertPolicy(QComboBox::InsertAtCurrent); this->extractor = new ParameterExtractor(); this->setMgr = new ParameterSet(); this->valueChanged=false; } //resets all parameters to the currently selected parameter set void ParameterWidget::resetParameter() { if(this->valueChanged){ QMessageBox msgBox; msgBox.setWindowTitle(_("changes on current preset not saved")); msgBox.setText( QString(_("The changes on the current preset %1 are not saved yet. Do you really want to reset this preset and lose your changes?")) .arg(comboBoxPreset->itemData(this->comboBoxPreset->currentIndex()).toString())); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); if (msgBox.exec() == QMessageBox::Cancel) { return; } } this->valueChanged=false; int currPreset = this->comboBoxPreset->currentIndex(); removeChangeIndicator(); defaultParameter(); if(comboBoxPreset->currentIndex() != 0){ //0 is "design default values" const std::string v = comboBoxPreset->itemData(currPreset).toString().toUtf8().constData(); applyParameterSet(v); } emit previewRequested(); } ParameterWidget::~ParameterWidget() { } //deletes the currently selected/active parameter set void ParameterWidget::onSetDelete() { if (this->setMgr->isEmpty()) return; std::string setName=comboBoxPreset->itemData(this->comboBoxPreset->currentIndex()).toString().toStdString(); boost::optional sets = this->setMgr->parameterSets(); if (sets.is_initialized()) { sets.get().erase(pt::ptree::key_type(setName)); } writeParameterSets(); this->comboBoxPreset->clear(); setComboBoxPresetForSet(); } //adds a new parameter set void ParameterWidget::onSetAdd() { updateParameterSet("",true); } void ParameterWidget::onSetSaveButton() { updateParameterSet(comboBoxPreset->itemData(this->comboBoxPreset->currentIndex()).toString().toStdString()); } void ParameterWidget::setFile(QString scadFile){ this->unreadableFileExists = false; // we can not know it, but we do not want to report a problem when there is none boost::filesystem::path p = scadFile.toStdString(); this->jsonFile = p.replace_extension(".json").string(); } void ParameterWidget::readFile(QString scadFile) { setFile(scadFile); bool exists = boost::filesystem::exists(this->jsonFile); bool writeable = false; bool readable = false; if(exists){ readable = this->setMgr->readParameterSet(this->jsonFile); //check whether file is writeable or not if (std::fstream(this->jsonFile, std::ios::app)) writeable = true; } if(writeable || !exists){ connect(this->addButton, SIGNAL(clicked()), this, SLOT(onSetAdd())); this->addButton->setToolTip(_("add new preset")); connect(this->deleteButton, SIGNAL(clicked()), this, SLOT(onSetDelete())); this->deleteButton->setToolTip(_("remove current preset")); connect(this->presetSaveButton, SIGNAL(clicked()), this, SLOT(onSetSaveButton())); this->presetSaveButton->setToolTip(_("save current preset")); }else{ this->addButton->setToolTip(_("JSON file read only")); this->deleteButton->setToolTip(_("JSON file read only")); this->presetSaveButton->setToolTip(_("JSON file read only")); } this->addButton->setEnabled(writeable || !exists); this->deleteButton->setEnabled(writeable || !exists); this->presetSaveButton->setEnabled(writeable || !exists); this->unreadableFileExists = (!readable) && exists; disconnect(comboBoxPreset, SIGNAL(currentIndexChanged(int)), this, SLOT(onSetChanged(int))); this->comboBoxPreset->clear(); setComboBoxPresetForSet(); connect(comboBoxPreset, SIGNAL(currentIndexChanged(int)), this, SLOT(onSetChanged(int))); } //Write the json file if the parameter sets are not empty. //This prevents creating unneccesary json filess. //This methode also updates the UI state (change indicator, file name, ...) void ParameterWidget::writeFileIfNotEmpty(QString scadFile) { setFile(scadFile); if (!this->setMgr->isEmpty()){ writeParameterSets(); } } //Write the json file without side effects (e.g. change indicator, file name) //This is e.g. useful when saving hidden back up files. void ParameterWidget::writeBackupFile(QString scadFile) { if (!this->setMgr->isEmpty()){ boost::filesystem::path p = scadFile.toStdString(); auto jsonFile = p.replace_extension(".json").string(); this->setMgr->writeParameterSet(jsonFile); } } void ParameterWidget::setParameters(const FileModule* module,bool rebuildParameterWidget) { this->extractor->setParameters(module,this->entries,ParameterPos,rebuildParameterWidget); if(rebuildParameterWidget){ connectWidget(); }else{ updateWidget(); } } void ParameterWidget::applyParameters(FileModule *fileModule) { this->extractor->applyParameters(fileModule,entries); } void ParameterWidget::setComboBoxPresetForSet() { this->comboBoxPreset->addItem(_("design default values"), QVariant(QString::fromStdString(_("design default values")))); if (this->setMgr->isEmpty()) return; for (const auto &name : this->setMgr->getParameterNames()) { const QString n = QString::fromStdString(name); this->comboBoxPreset->addItem(n, QVariant(n)); } } //set selection void ParameterWidget::onSetChanged(int idx) { if(this->lastComboboxIndex == idx) return; //nothing todo //if necessary, confirm the change if(this->valueChanged){ QMessageBox msgBox; msgBox.setWindowTitle(_("changes on current preset not saved")); msgBox.setText( QString(_("The current preset %1 contains changes, but is not saved yet. Do you really want to change the preset and lose your changes?")) .arg(comboBoxPreset->itemData(lastComboboxIndex).toString())); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); if (msgBox.exec() == QMessageBox::Cancel) { //be careful to not cause a recursion comboBoxPreset->setCurrentIndex(lastComboboxIndex); return; } } this->valueChanged=false; removeChangeIndicator(); this->lastComboboxIndex = idx; defaultParameter(); if(idx!=0){ //0 is "design default values" //apply the change const std::string v = comboBoxPreset->itemData(idx).toString().toUtf8().constData(); applyParameterSet(v); } emit previewRequested(false); } //if the set name is changed to "" asks if the user want to delete the current preset //if the set name is changed and no values are changed, rename the current preset //if the set name is changed and some values are changed, create a new set void ParameterWidget::onSetNameChanged(){ this->comboBoxPreset->lineEdit()->blockSignals(true); //prevent double firing int idx = comboBoxPreset->currentIndex(); QString newName = this->comboBoxPreset->currentText(); QString oldName = comboBoxPreset->itemData(idx).toString().toUtf8().constData(); if(oldName == newName){ //nothing to do }else if(oldName ==""){ //ignore }else if(newName =="" && idx!=0){ QMessageBox msgBox; msgBox.setWindowTitle(_("Do you want to delete the current preset?")); msgBox.setText( QString(_("Do you want to delete the current preset '%1'?")) .arg(oldName)); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); if (msgBox.exec() == QMessageBox::Cancel) { comboBoxPreset->lineEdit()->setText(oldName); }else{ onSetDelete(); } }else{ if(!this->valueChanged){ boost::optional sets = this->setMgr->parameterSets(); if (sets.is_initialized()) { sets.get().erase(pt::ptree::key_type(oldName.toStdString())); } } if (this->setMgr->isEmpty()) { pt::ptree setRoot; this->setMgr->addChild(ParameterSet::parameterSetsKey, setRoot); } updateParameterSet(newName.toStdString(),true); this->comboBoxPreset->clear(); setComboBoxPresetForSet(); this->comboBoxPreset->setCurrentIndex(this->comboBoxPreset->findData(newName)); } this->comboBoxPreset->lineEdit()->blockSignals(false); } void ParameterWidget::onDescriptionLoDChanged() { descriptionLoD =static_cast(comboBoxDetails->currentIndex()); emit previewRequested(); } void ParameterWidget::onValueChanged() { if(!this->valueChanged){ this->labelChangeIndicator->setText("*"); } this->valueChanged=true; autoPreviewTimer.stop(); if (checkBoxAutoPreview->isChecked()) { autoPreviewTimer.start(); } } void ParameterWidget::onPreviewTimerElapsed() { emit previewRequested(false); } void ParameterWidget::cleanScrollArea() { auto layout = this->scrollAreaWidgetContents->layout(); layout->setAlignment(Qt::AlignTop); QLayoutItem *child; while ((child = layout->takeAt(0)) != nullptr) { QWidget *w = child->widget(); layout->removeWidget(w); delete w; } } void ParameterWidget::connectWidget() { this->setEnabled(true); rebuildGroupMap(); std::vector global; if (groupMap.find("Global") != groupMap.end()) { global = groupMap["Global"].parameterVector; groupMap["Global"].parameterVector.clear(); } for (group_map::iterator it = groupMap.begin(); it != groupMap.end(); ) { std::vector gr; gr = it->second.parameterVector; if (gr.empty() || it->first == "Hidden") { it = groupMap.erase(it); } else { it->second.parameterVector.insert(it->second.parameterVector.end(), global.begin(), global.end()); it++; } } cleanScrollArea(); for (const auto &groupName : groupPos) { if(groupMap.find(groupName)!=groupMap.end()){ QVBoxLayout* anyLayout = new QVBoxLayout(); anyLayout->setSpacing(0); anyLayout->setContentsMargins(0,0,0,0); std::vector gr; gr = groupMap[groupName].parameterVector; for(unsigned int i=0;i < gr.size();i++) { ParameterVirtualWidget * entry = CreateParameterWidget(gr[i]); if(entry){ anyLayout->addWidget(entry); } } GroupWidget *groupWidget = new GroupWidget(groupMap[groupName].show, QString::fromStdString(groupName)); groupWidget->setContentLayout(*anyLayout); this->scrollAreaWidgetContents->layout()->addWidget(groupWidget); } } } void ParameterWidget::updateWidget() { QList parameterWidgets = this->findChildren(); foreach(ParameterVirtualWidget* widget, parameterWidgets) widget->setValue(); } void ParameterWidget::rebuildGroupMap(){ for (entry_map_t::iterator it = entries.begin(); it != entries.end();) { if (!(*it).second->set) { it = entries.erase(it); } else { it++; } } for (auto &elem : groupMap) { elem.second.parameterVector.clear(); elem.second.inList=false; } groupPos.clear(); for (unsigned int it=0; itgroupName; if (groupMap.find(groupName) == groupMap.end()) { groupPos.push_back(groupName); groupInst enter; enter.parameterVector.push_back(ParameterPos[it]); enter.show = false; enter.inList=true; groupMap[groupName] = enter; }else { if(groupMap[groupName].inList == false){ groupMap[groupName].inList=true; groupPos.push_back(groupName); } groupMap[groupName].parameterVector.push_back(ParameterPos[it]); } } } ParameterVirtualWidget* ParameterWidget::CreateParameterWidget(std::string parameterName) { ParameterVirtualWidget *entry = nullptr; switch(entries[parameterName]->target) { case ParameterObject::COMBOBOX:{ entry = new ParameterComboBox(this, entries[parameterName], this->descriptionLoD); break; } case ParameterObject::SLIDER:{ entry = new ParameterSlider(this, entries[parameterName], this->descriptionLoD); break; } case ParameterObject::CHECKBOX:{ entry = new ParameterCheckBox(this, entries[parameterName], this->descriptionLoD); break; } case ParameterObject::TEXT:{ entry = new ParameterText(this, entries[parameterName], this->descriptionLoD); break; } case ParameterObject::NUMBER:{ entry = new ParameterSpinBox(this, entries[parameterName], this->descriptionLoD); break; } case ParameterObject::VECTOR:{ entry = new ParameterVector(this, entries[parameterName], this->descriptionLoD); break; } case ParameterObject::UNDEFINED:{ break; } } if (entry) { connect(entry, SIGNAL(changed()), this, SLOT(onValueChanged())); } return entry; } //reset all parameters to the default value of the design file void ParameterWidget::defaultParameter(){ for (const auto &entry : entries) { entry.second->value=entry.second->defaultValue; } } void ParameterWidget::applyParameterSet(std::string setName) { boost::optional set = this->setMgr->getParameterSet(setName); if (!set.is_initialized()) { return; } for (pt::ptree::value_type &v : set.get()) { entry_map_t::iterator entry = entries.find(v.first); if (entry != entries.end()) { if (entry->second->dvt == Value::ValueType::STRING) { entry->second->value=ValuePtr(v.second.data()); } else if (entry->second->dvt == Value::ValueType::BOOL) { entry->second->value = ValuePtr(v.second.get_value()); } else { shared_ptr params = CommentParser::parser(v.second.data().c_str()); if (!params) continue; ModuleContext ctx; ValuePtr newValue = params->evaluate(&ctx); if (entry->second->dvt == newValue->type()) { entry->second->value = newValue; } } } } } void ParameterWidget::updateParameterSet(std::string setName, bool newSet) { if (this->setMgr->isEmpty()) { pt::ptree setRoot; this->setMgr->addChild(ParameterSet::parameterSetsKey, setRoot); } if (newSet && setName == "") { QInputDialog *setDialog = new QInputDialog(); bool ok = true; const QString result = setDialog->getText(this, _("Create new set of parameter"), _("Enter name of the parameter set"), QLineEdit::Normal, "", &ok); if (ok) { setName = result.trimmed().toStdString(); } } //check for duplicates if(newSet && this->setMgr->setNameExists(setName)){ QMessageBox msgBox; msgBox.setWindowTitle(QString(_("Set Name %1 already exists")).arg(QString::fromStdString(setName))); msgBox.setText(QString(_("The set name %1 already exists. Do you want overwrite it?")).arg(QString::fromStdString(setName))); msgBox.setStandardButtons(QMessageBox::Yes); msgBox.addButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); if (msgBox.exec() == QMessageBox::Yes) { //delete the preexisting preset to avoid side efects boost::optional sets = this->setMgr->parameterSets(); if (sets.is_initialized()) { sets.get().erase(pt::ptree::key_type(setName)); } this->comboBoxPreset->removeItem(this->comboBoxPreset->findData(QString::fromStdString(setName))); }else{ setName = ""; } } if (!setName.empty()) { this->valueChanged=false; pt::ptree iroot; for (const auto &entry : entries) { const auto &VariableName = entry.first; const auto &VariableValue = entry.second->value->toString(); iroot.put(VariableName, VariableValue); } this->setMgr->addParameterSet(setName, iroot); const QString s(QString::fromStdString(setName)); const int idx = this->comboBoxPreset->findData(s); if (idx == -1) { this->comboBoxPreset->addItem(s, QVariant(s)); this->comboBoxPreset->setCurrentIndex(this->comboBoxPreset->findData(s)); }else{ removeChangeIndicator(); } writeParameterSets(); } } void ParameterWidget::writeParameterSets() { if(this->unreadableFileExists){ QMessageBox msgBox; msgBox.setWindowTitle(_("Saving presets")); msgBox.setText(QString(_("%1 was found, but was unreadable. Do you want to overwrite %1?")).arg(QString::fromStdString(this->jsonFile))); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); if (msgBox.exec() == QMessageBox::Cancel) { return; } } this->setMgr->writeParameterSet(this->jsonFile); this->valueChanged=false; } void ParameterWidget::removeChangeIndicator() { this->labelChangeIndicator->setText(""); } bool ParameterWidget::childHasFocus(){ if(this->hasFocus()) return true; auto children = this->findChildren(); for (auto child : children) { if(child->hasFocus()) return true; } return false; } openscad-2019.05/src/parameter/ParameterWidget.h0000644000076500000240000000570213402025764022112 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2014 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include #include "parameterextractor.h" #include "ui_ParameterWidget.h" #include "groupwidget.h" #include "parameterset.h" class ParameterWidget : public QWidget, public Ui::ParameterWidget { Q_OBJECT private: struct groupInst { std::vector parameterVector; bool show; bool inList; }; std::vector groupPos; typedef std::map group_map; group_map groupMap; QTimer autoPreviewTimer; DescLoD descriptionLoD; //configuration if and how much of the description is shown std::string jsonFile; bool valueChanged; int lastComboboxIndex = 0; void connectWidget(); void updateWidget(); void cleanScrollArea(); void rebuildGroupMap(); ParameterVirtualWidget* CreateParameterWidget(std::string parameterName); void setComboBoxPresetForSet(); void removeChangeIndicator(); void setFile(QString File); bool unreadableFileExists=false; entry_map_t entries; std::vector ParameterPos; ParameterExtractor *extractor; ParameterSet *setMgr; public: ParameterWidget(QWidget *parent = nullptr); ~ParameterWidget(); void readFile(QString scadFile); void writeFileIfNotEmpty(QString scadFile); void writeBackupFile(QString scadFile); void setParameters(const FileModule* module,bool); void applyParameters(FileModule *fileModule); bool childHasFocus(); protected slots: void onValueChanged(); void onPreviewTimerElapsed(); void onDescriptionLoDChanged(); void onSetChanged(int idx); void onSetNameChanged(); void onSetAdd(); void onSetSaveButton(); void onSetDelete(); void resetParameter(); void defaultParameter(); signals: void previewRequested(bool rebuildParameterUI=true); protected: void applyParameterSet(std::string setName); void updateParameterSet(std::string setName, bool newSet=false); void writeParameterSets(); }; openscad-2019.05/src/parameter/ParameterWidget.ui0000644000076500000240000001432713402025764022303 0ustar kintelstaff00000000000000 ParameterWidget 0 0 419 590 Form 0 4 4 0 4 false 0 0 11 save preset false 0 0 40 0 40 16777215 delete current preset - 1 0 preset selection true false 0 0 40 0 40 16777215 add new preset + Automatic Preview true Show Details Inline Details Hide Details Description Only reset all parameters to the currently selected preset Reset Qt::NoFocus Qt::ScrollBarAlwaysOff true 0 0 413 522 0 0 0 0 0 openscad-2019.05/src/parameter/groupwidget.cpp0000644000076500000240000000261313423115164021714 0ustar kintelstaff00000000000000#include "groupwidget.h" GroupWidget::GroupWidget(bool &show, const QString & title, QWidget *parent) : QWidget(parent) { this->toggleButton.setText(title); this->toggleButton.setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Maximum); this->toggleButton.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->toggleButton.setCheckable(true); this->show = &show; this->toggleButton.setChecked(show); // don't waste space this->mainLayout.setVerticalSpacing(0); this->mainLayout.setContentsMargins(0, 0, 0, 0); this->contentArea.setContentsMargins(0, 0, 0, 0); this->mainLayout.addWidget(&toggleButton, 0, 0); this->mainLayout.addWidget(&contentArea, 1, 0); setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Maximum); setLayout(&mainLayout); QObject::connect(&toggleButton, SIGNAL(toggled(bool)),this, SLOT(onclicked(bool))); } void GroupWidget::onclicked(const bool /*checked*/) { this->toggleButton.setArrowType(this->toggleButton.isChecked() ? Qt::DownArrow : Qt::RightArrow); if (this->toggleButton.isChecked()) { *(this->show) = true; //update the show flag in the group map contentArea.show(); } else { *(this->show) = false; //update the show flag in the group map contentArea.hide(); } } void GroupWidget::setContentLayout(QLayout & contentLayout) { delete this->contentArea.layout(); this->contentArea.setLayout(&contentLayout); onclicked(this->toggleButton.isChecked()); } openscad-2019.05/src/parameter/groupwidget.h0000644000076500000240000000076113402025764021366 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include class GroupWidget : public QWidget { Q_OBJECT private: QGridLayout mainLayout; QToolButton toggleButton; QWidget contentArea; bool *show; //pointer to the show flag in the group map public: explicit GroupWidget(bool &show,const QString & title = "", QWidget *parent = nullptr); void setContentLayout(QLayout & contentLayout); private slots: void onclicked(bool); }; openscad-2019.05/src/parameter/ignoreWheelWhenNotFocused.cpp0000644000076500000240000000103013402025764024433 0ustar kintelstaff00000000000000#include "ignoreWheelWhenNotFocused.h" IgnoreWheelWhenNotFocused::IgnoreWheelWhenNotFocused(QWidget *parent) : QObject(parent) { } //https://stackoverflow.com/questions/5821802/qspinbox-inside-a-qscrollarea-how-to-prevent-spin-box-from-stealing-focus-when bool IgnoreWheelWhenNotFocused::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::Wheel){ if(!((QWidget*)obj)->hasFocus()){ return true; }else{ return QObject::eventFilter(obj, event); } }else{ return QObject::eventFilter(obj, event); } } openscad-2019.05/src/parameter/ignoreWheelWhenNotFocused.h0000644000076500000240000000155113402025764024110 0ustar kintelstaff00000000000000//This event filter ignores Mouse Wheel events when the object is not focused. //A lot of elements in OpenSCAD are in Scroll Areas. //This causes a conflict, as some elements within the Scroll Areas are //also reacting to the mousewheel. //Especially in the settings, where the user might spend a considerable //amount of time to get it just right, it is annoying when simply //scrowling down unintentionally changes various settings. //for reference: //https://stackoverflow.com/questions/5821802/qspinbox-inside-a-qscrollarea-how-to-prevent-spin-box-from-stealing-focus-when //http://doc.qt.io/archives/qt-4.8/qobject.html#installEventFilter #include #include class IgnoreWheelWhenNotFocused : public QObject { Q_OBJECT public: IgnoreWheelWhenNotFocused(QWidget *parent); protected: bool eventFilter(QObject *obj, QEvent *event); }; openscad-2019.05/src/parameter/parametercheckbox.cpp0000644000076500000240000000165713402025764023055 0ustar kintelstaff00000000000000#include "parametercheckbox.h" ParameterCheckBox::ParameterCheckBox(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD) : ParameterVirtualWidget(parent, parameterobject, descriptionLoD) { setValue(); connect(checkBox, SIGNAL(clicked()), this, SLOT(onChanged())); if (descriptionLoD == DescLoD::ShowDetails){ //large checkbox, when we have the space checkBox->setStyleSheet("QCheckBox::indicator {\nwidth: 20px;\nheight: 20px;\n}"); } } void ParameterCheckBox::onChanged() { if(!this->suppressUpdate){ object->value = ValuePtr(checkBox->isChecked()); emit changed(); } } void ParameterCheckBox::setValue() { this->suppressUpdate=true; this->stackedWidgetRight->setCurrentWidget(this->pageCheckBox); this->pageCheckBox->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Expanding); this->stackedWidgetBelow->hide(); this->checkBox->setChecked(object->value->toBool()); this->suppressUpdate=false; } openscad-2019.05/src/parameter/parametercheckbox.h0000644000076500000240000000051313402025764022510 0ustar kintelstaff00000000000000#pragma once #include "parametervirtualwidget.h" class ParameterCheckBox : public ParameterVirtualWidget { Q_OBJECT public: ParameterCheckBox(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD); void setValue() override; protected slots: void onChanged(); private: bool volatile suppressUpdate; }; openscad-2019.05/src/parameter/parametercombobox.cpp0000644000076500000240000000335413423115164023070 0ustar kintelstaff00000000000000#include "parametercombobox.h" #include "ignoreWheelWhenNotFocused.h" ParameterComboBox::ParameterComboBox(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD) : ParameterVirtualWidget(parent, parameterobject, descriptionLoD) { setValue(); connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onChanged(int))); IgnoreWheelWhenNotFocused *ignoreWheelWhenNotFocused = new IgnoreWheelWhenNotFocused(this); comboBox->installEventFilter(ignoreWheelWhenNotFocused); } void ParameterComboBox::onChanged(int idx) { if(!this->suppressUpdate){ if (object->dvt == Value::ValueType::STRING) { const std::string v = comboBox->itemData(idx).toString().toStdString(); object->value = ValuePtr(v); } else { const double v = comboBox->itemData(idx).toDouble(); object->value = ValuePtr(v); } emit changed(); } } void ParameterComboBox::setValue() { this->suppressUpdate=true; this->stackedWidgetBelow->setCurrentWidget(this->pageComboBox); this->pageComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); this->stackedWidgetRight->hide(); comboBox->clear(); const Value::VectorType& vec = object->values->toVector(); for (const auto &textData : vec) { QString text, data; if (textData->toVector().size() > 1) { text = QString::fromStdString(textData->toVector()[1]->toString()); data = QString::fromStdString(textData->toVector()[0]->toString()); } else { text = QString::fromStdString(textData->toString()); data = text; } comboBox->addItem(text, QVariant(data)); } QString defaultData = QString::fromStdString(object->value->toString()); int idx = comboBox->findData(QVariant(defaultData)); if (idx >= 0) { comboBox->setCurrentIndex(idx); } this->suppressUpdate=false; } openscad-2019.05/src/parameter/parametercombobox.h0000644000076500000240000000052313402025764022533 0ustar kintelstaff00000000000000#pragma once #include "parametervirtualwidget.h" class ParameterComboBox : public ParameterVirtualWidget { Q_OBJECT public: ParameterComboBox(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD); void setValue() override; protected slots: void onChanged(int idx); private: bool volatile suppressUpdate; }; openscad-2019.05/src/parameter/parameterextractor.cpp0000644000076500000240000000363513434420302023270 0ustar kintelstaff00000000000000#include "parameterextractor.h" #include "modcontext.h" ParameterExtractor::ParameterExtractor() { } ParameterExtractor::~ParameterExtractor() { } void ParameterExtractor::applyParameters(FileModule *fileModule, entry_map_t& entries) { if (!fileModule) return; for (auto &assignment : fileModule->scope.assignments) { auto entry = entries.find(assignment.name); if (entry != entries.end()) { if (entry->second->groupName != "Hidden") { entry->second->applyParameter(assignment); entry->second->set = false; } } } } void ParameterExtractor::setParameters(const FileModule* module,entry_map_t& entries,std::vector& ParameterPos, bool &rebuildParameterWidget) { if (!module) return; ModuleContext ctx; ParameterPos.clear(); for (auto &assignment : module->scope.assignments) { const Annotation *param = assignment.annotation("Parameter"); if (!param) continue; const ValuePtr defaultValue = assignment.expr->evaluate(&ctx); if (defaultValue->type() == Value::ValueType::UNDEFINED) continue; ParameterObject *entryObject = new ParameterObject(&ctx, assignment, defaultValue); //check whether object exist or not previously if (entries.find(assignment.name) == entries.end()) { //if object doesn't exist, add new entry entries[assignment.name] = entryObject; rebuildParameterWidget = true; } else { //if entry object already exists, we check if its modified //or not if (*entryObject == *entries[assignment.name]) { delete entryObject; //if entry is not modified, then we don't add new entry entryObject = entries[assignment.name]; } else { delete entries[assignment.name]; //if entry is modified, then we add new entry entries[assignment.name] = entryObject; } } entryObject->set = true; ParameterPos.push_back(assignment.name); } } openscad-2019.05/src/parameter/parameterextractor.h0000644000076500000240000000070013402025764022733 0ustar kintelstaff00000000000000#pragma once #include "FileModule.h" #include "parametervirtualwidget.h" #include #include #include typedef std::map entry_map_t; class ParameterExtractor { public: ParameterExtractor(); virtual ~ParameterExtractor(); void setParameters(const FileModule* module,entry_map_t& entries,std::vector&,bool&); void applyParameters(FileModule *fileModule,entry_map_t&); }; openscad-2019.05/src/parameter/parameterobject.cpp0000644000076500000240000000545113402025764022531 0ustar kintelstaff00000000000000#include "parameterobject.h" #include "module.h" #include "modcontext.h" #include "annotation.h" ParameterObject::ParameterObject(Context *ctx, const Assignment &assignment, const ValuePtr defaultValue) { this->set = false; this->name = assignment.name; const Annotation *param = assignment.annotation("Parameter"); const ValuePtr values = param->evaluate(ctx); setValue(defaultValue, values); const Annotation *desc = assignment.annotation("Description"); if (desc) { const ValuePtr v = desc->evaluate(ctx); if (v->type() == Value::ValueType::STRING) { description=QString::fromStdString(v->toString()); } } const Annotation *group = assignment.annotation("Group"); if (group) { const ValuePtr v = group->evaluate(ctx); if (v->type() == Value::ValueType::STRING) { groupName=v->toString(); } } else { groupName="Parameters"; } } void ParameterObject::applyParameter(Assignment &assignment) { ModuleContext ctx; const ValuePtr defaultValue = assignment.expr->evaluate(&ctx); if (defaultValue->type() == dvt) { assignment.expr = shared_ptr(new Literal(value)); } } void ParameterObject::setValue(const class ValuePtr defaultValue, const class ValuePtr values) { this->values = values; this->value = defaultValue; this->defaultValue = defaultValue; this->vt = values->type(); this->dvt = defaultValue->type(); bool makerBotMax = (vt == Value::ValueType::VECTOR && values->toVector().size() == 1 && values->toVector()[0]->type() == Value::ValueType::NUMBER); // [max] format from makerbot customizer if (dvt == Value::ValueType::BOOL) { this->target = CHECKBOX; } else if ((dvt == Value::ValueType::VECTOR) && (defaultValue->toVector().size() <= 4)) { this->target = checkVectorWidget(); } else if ((vt == Value::ValueType::RANGE || makerBotMax) && (dvt == Value::ValueType::NUMBER)) { this->target = SLIDER; } else if ((makerBotMax) && (dvt == Value::ValueType::STRING)){ this->target = TEXT; } else if ((vt == Value::ValueType::VECTOR) && ((dvt == Value::ValueType::NUMBER) || (dvt == Value::ValueType::STRING))) { this->target = COMBOBOX; } else if (dvt == Value::ValueType::NUMBER) { this->target = NUMBER; } else { this->target = TEXT; } } bool ParameterObject::operator == (const ParameterObject &second) { return (this->defaultValue == second.defaultValue && this->values==second.values && this->description == second.description && this->groupName == second.groupName); } ParameterObject::parameter_type_t ParameterObject::checkVectorWidget() { Value::VectorType vec = defaultValue->toVector(); if(vec.size()==0) return TEXT; for (unsigned int i = 0;i < vec.size();i++) { if (vec[i]->type() != Value::ValueType::NUMBER) { return TEXT; } } return VECTOR; } openscad-2019.05/src/parameter/parameterobject.h0000644000076500000240000000136413402025764022175 0ustar kintelstaff00000000000000#pragma once #include "value.h" #include "Assignment.h" #include "expression.h" #include class ParameterObject { public: typedef enum { UNDEFINED, COMBOBOX, SLIDER, CHECKBOX, TEXT, NUMBER, VECTOR } parameter_type_t; ValuePtr value; ValuePtr values; ValuePtr defaultValue; Value::ValueType dvt; parameter_type_t target; QString description; std::string name; bool set; std::string groupName; private: Value::ValueType vt; parameter_type_t checkVectorWidget(); void setValue(const ValuePtr defaultValue, const ValuePtr values); public: ParameterObject(Context *context, const Assignment &assignment, const ValuePtr defaultValue); void applyParameter(Assignment &assignment); bool operator==(const ParameterObject &second); }; openscad-2019.05/src/parameter/parameterset.cpp0000644000076500000240000000742413433421332022053 0ustar kintelstaff00000000000000#include "parameterset.h" #include "comment.h" #include "modcontext.h" #include "expression.h" #include "printutils.h" #include std::string ParameterSet::parameterSetsKey("parameterSets"); std::string ParameterSet::fileFormatVersionKey("fileFormatVersion"); std::string ParameterSet::fileFormatVersionValue("1"); bool ParameterSet::isEmpty() const { const boost::optional sets{root.get_child_optional(ParameterSet::parameterSetsKey)}; const bool hasEntries = sets.is_initialized() && !sets.get().empty(); return !hasEntries; } boost::optional ParameterSet::parameterSets() { return root.get_child_optional(ParameterSet::parameterSetsKey); } std::vector ParameterSet::getParameterNames() { std::vector names; boost::optional sets = parameterSets(); if (sets.is_initialized()) { for (const auto &v : sets.get()) { names.push_back(v.first); } } return names; } bool ParameterSet::setNameExists(const std::string &setName){ boost::optional sets = parameterSets(); if (sets.is_initialized()) { for (const auto &v : sets.get()) { if(v.first == setName) return true; } } return false; } boost::optional ParameterSet::getParameterSet(const std::string &setName) { boost::optional sets = parameterSets(); if (!sets.is_initialized()) { return sets; } pt::ptree::assoc_iterator set = sets.get().find(pt::ptree::key_type(setName)); if(set!=sets.get().not_found()) { return set->second; } return sets; } void ParameterSet::addParameterSet(const std::string setName, const pt::ptree & set) { boost::optional sets = parameterSets(); if (sets.is_initialized()) { sets.get().erase(pt::ptree::key_type(setName)); sets.get().push_back(pt::ptree::value_type(setName,set)); } else { pt::ptree child; child.push_back(pt::ptree::value_type(setName,set)); root.push_back(pt::ptree::value_type(ParameterSet::parameterSetsKey,child)); } } /*! Returns true if the file was succesfully read */ bool ParameterSet::readParameterSet(const std::string &filename) { try { pt::read_json(filename, this->root); return true; } catch (const pt::json_parser_error &e) { PRINTB("ERROR: Cannot open Parameter Set '%s': %s", filename % e.what()); } return false; } void ParameterSet::writeParameterSet(const std::string &filename) { // Always force default version for now root.put(fileFormatVersionKey, fileFormatVersionValue); try { pt::write_json(filename, this->root); } catch (const pt::json_parser_error &e) { PRINTB("ERROR: Cannot write Parameter Set '%s': %s", filename % e.what()); } } void ParameterSet::applyParameterSet(FileModule *fileModule, const std::string &setName) { if (fileModule == nullptr || this->root.empty()) return; try { ModuleContext ctx; boost::optional set = getParameterSet(setName); for (auto &assignment : fileModule->scope.assignments) { for (auto &v : set.get()) { if (v.first == assignment.name) { const ValuePtr defaultValue = assignment.expr->evaluate(&ctx); if (defaultValue->type() == Value::ValueType::STRING) { assignment.expr = shared_ptr(new Literal(ValuePtr(v.second.data()))); } else if (defaultValue->type() == Value::ValueType::BOOL) { assignment.expr = shared_ptr(new Literal(ValuePtr(v.second.get_value()))); } else { shared_ptr params = CommentParser::parser(v.second.data().c_str()); if (!params) continue; ModuleContext ctx; if (defaultValue->type() == params->evaluate(&ctx)->type()) { assignment.expr = params; } } } } } } catch (std::exception const& e) { PRINTB("ERROR: Cannot apply parameter Set: %s", e.what()); } } openscad-2019.05/src/parameter/parameterset.h0000644000076500000240000000165313433421332021516 0ustar kintelstaff00000000000000#pragma once #include #include namespace pt = boost::property_tree; class ParameterSet { public: static std::string parameterSetsKey; static std::string fileFormatVersionKey; static std::string fileFormatVersionValue; private: pt::ptree root; public: ParameterSet() {} ~ParameterSet() {} boost::optional parameterSets(); std::vector getParameterNames(); bool setNameExists(const std::string &setName); boost::optional getParameterSet(const std::string &setName); void addParameterSet(const std::string setName, const pt::ptree & set); bool readParameterSet(const std::string &filename); void writeParameterSet(const std::string &filename); void applyParameterSet(class FileModule *fileModule, const std::string &setName); bool isEmpty() const; void addChild(const std::string name, const pt::ptree & tree){root.add_child(name,tree);}; }; openscad-2019.05/src/parameter/parameterslider.cpp0000644000076500000240000000612113402025764022540 0ustar kintelstaff00000000000000#include "parameterslider.h" #include "ignoreWheelWhenNotFocused.h" ParameterSlider::ParameterSlider(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD) : ParameterVirtualWidget(parent, parameterobject, descriptionLoD) { this->pressed = true; this->suppressUpdate=false; setValue(); connect(slider, SIGNAL(sliderPressed()), this, SLOT(onPressed())); connect(slider, SIGNAL(sliderReleased()), this, SLOT(onReleased())); connect(slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int))); connect(doubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(onSpinBoxChanged(double))); connect(doubleSpinBox, SIGNAL(editingFinished()), this, SLOT(onEditingFinished())); IgnoreWheelWhenNotFocused *ignoreWheelWhenNotFocused = new IgnoreWheelWhenNotFocused(this); slider->installEventFilter(ignoreWheelWhenNotFocused); doubleSpinBox->installEventFilter(ignoreWheelWhenNotFocused); } void ParameterSlider::onSliderChanged(int) { double v = slider->value()*step; if (!this->suppressUpdate) { this->doubleSpinBox->setValue(v); if (this->pressed) { object->value = ValuePtr(v); emit changed(); } } } void ParameterSlider::onSpinBoxChanged(double v) { if (!this->suppressUpdate) { this->suppressUpdate=true; if(v>0){ this->slider->setValue((int)((v+step/2.0)/step)); }else{ this->slider->setValue((int)((v-step/2.0)/step)); } this->suppressUpdate=false; } } void ParameterSlider::onEditingFinished() { this->onSliderChanged(0); } void ParameterSlider::onPressed() { this->pressed = false; } void ParameterSlider::onReleased(){ this->pressed = true; onSliderChanged(0); } void ParameterSlider::setValue() { this->suppressUpdate=true; if (object->values->toRange().step_value() > 0) { setPrecision(object->values->toRange().step_value()); step = object->values->toRange().step_value(); } else { decimalPrecision = 1; step = 1; } int minSlider = 0; int maxSlider = 0; double min=0; double max=0; if(object->values->type() == Value::ValueType::RANGE ){ // [min:max] and [min:step:max] format minSlider = object->values->toRange().begin_value()/step; maxSlider = object->values->toRange().end_value()/step; min = object->values->toRange().begin_value(); max = object->values->toRange().end_value(); }else{ // [max] format from makerbot customizer step = 1; maxSlider = std::stoi(object->values->toVector()[0]->toString()); max = maxSlider; decimalPrecision = 0; } int current=object->value->toDouble()/step; this->stackedWidgetBelow->setCurrentWidget(this->pageSlider); this->pageSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); this->slider->setRange(minSlider,maxSlider); this->slider->setValue(current); this->stackedWidgetRight->setCurrentWidget(this->pageSpin); this->pageSpin->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Expanding); this->doubleSpinBox->setMinimum(min); this->doubleSpinBox->setMaximum(max); this->doubleSpinBox->setSingleStep(step); this->doubleSpinBox->setDecimals(decimalPrecision); this->doubleSpinBox->setValue(object->value->toDouble()); this->suppressUpdate=false; } openscad-2019.05/src/parameter/parameterslider.h0000644000076500000240000000071713402025764022212 0ustar kintelstaff00000000000000#pragma once #include "parametervirtualwidget.h" class ParameterSlider : public ParameterVirtualWidget { Q_OBJECT public: ParameterSlider(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD); void setValue() override; private: double step; bool pressed; bool volatile suppressUpdate; protected slots: void onSliderChanged(int); void onSpinBoxChanged(double); void onReleased(); void onPressed(); void onEditingFinished(); }; openscad-2019.05/src/parameter/parameterspinbox.cpp0000644000076500000240000000300613423115164022734 0ustar kintelstaff00000000000000#include "parameterspinbox.h" #include "ignoreWheelWhenNotFocused.h" ParameterSpinBox::ParameterSpinBox(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD) : ParameterVirtualWidget(parent, parameterobject, descriptionLoD) { setValue(); connect(doubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(onChanged(double))); connect(doubleSpinBox, SIGNAL(editingFinished()), this, SLOT(onEditingFinished())); IgnoreWheelWhenNotFocused *ignoreWheelWhenNotFocused = new IgnoreWheelWhenNotFocused(this); doubleSpinBox->installEventFilter(ignoreWheelWhenNotFocused); } void ParameterSpinBox::onChanged(double) { if(!this->suppressUpdate){ object->value = ValuePtr(doubleSpinBox->value()); } } void ParameterSpinBox::onEditingFinished() { emit changed(); } void ParameterSpinBox::setValue() { this->suppressUpdate=true; if (object->values->toDouble() > 0) { setPrecision(object->values->toDouble()); this->doubleSpinBox->setSingleStep(object->values->toDouble()); } else { setPrecision(object->defaultValue->toDouble()); this->doubleSpinBox->setSingleStep(1/pow(10,decimalPrecision)); } this->doubleSpinBox->setDecimals(decimalPrecision); this->stackedWidgetRight->setCurrentWidget(this->pageSpin); this->pageSpin->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Expanding); this->stackedWidgetBelow->hide(); this->doubleSpinBox->setRange(object->value->toDouble()-1000, object->value->toDouble()+1000); this->doubleSpinBox->setValue(object->value->toDouble()); this->suppressUpdate=false; } openscad-2019.05/src/parameter/parameterspinbox.h0000644000076500000240000000055113402025764022406 0ustar kintelstaff00000000000000#pragma once #include "parametervirtualwidget.h" class ParameterSpinBox :public ParameterVirtualWidget { Q_OBJECT public: ParameterSpinBox(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD); void setValue() override; protected slots: void onChanged(double); void onEditingFinished(); private: bool volatile suppressUpdate; }; openscad-2019.05/src/parameter/parametertext.cpp0000644000076500000240000000311713423115164022241 0ustar kintelstaff00000000000000#include "parametertext.h" #include "modcontext.h" #include "comment.h" ParameterText::ParameterText(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD) : ParameterVirtualWidget(parent, parameterobject, descriptionLoD) { setValue(); double max=32767; if(object->values->toVector().size() == 1){ // [max] format from makerbot customizer max = std::stoi(object->values->toVector()[0]->toString(),nullptr,0); } this->lineEdit->setMaxLength(max); connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(onChanged(QString))); connect(lineEdit, SIGNAL(editingFinished()), this, SLOT(onEditingFinished())); } void ParameterText::onChanged(QString) { if(!this->suppressUpdate){ if (object->dvt == Value::ValueType::STRING) { object->value = ValuePtr(lineEdit->text().toStdString()); }else{ ModuleContext ctx; shared_ptr params = CommentParser::parser(lineEdit->text().toStdString().c_str()); if (!params) return; ValuePtr newValue = params->evaluate(&ctx); if (object->dvt == newValue->type()) { object->value = newValue; } } } } void ParameterText::onEditingFinished() { emit changed(); } void ParameterText::setValue() { this->suppressUpdate=true; this->stackedWidgetBelow->setCurrentWidget(this->pageText); this->pageText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); this->stackedWidgetRight->hide(); this->lineEdit->setText(QString::fromStdString(object->value->toString())); if (object->values->toDouble() > 0) { this->lineEdit->setMaxLength(object->values->toDouble()); } this->suppressUpdate=false; } openscad-2019.05/src/parameter/parametertext.h0000644000076500000240000000054513402025764021713 0ustar kintelstaff00000000000000#pragma once #include "parametervirtualwidget.h" class ParameterText : public ParameterVirtualWidget { Q_OBJECT public: ParameterText(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD); void setValue() override; protected slots: void onChanged(QString); void onEditingFinished(); private: bool volatile suppressUpdate; }; openscad-2019.05/src/parameter/parametervector.cpp0000644000076500000240000000527713423115164022570 0ustar kintelstaff00000000000000#include "parametervector.h" #include "ignoreWheelWhenNotFocused.h" ParameterVector::ParameterVector(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD) : ParameterVirtualWidget(parent, parameterobject, descriptionLoD) { setValue(); connect(doubleSpinBox1,SIGNAL(valueChanged(double)),this,SLOT(onChanged(double))); connect(doubleSpinBox2,SIGNAL(valueChanged(double)),this,SLOT(onChanged(double))); connect(doubleSpinBox3,SIGNAL(valueChanged(double)),this,SLOT(onChanged(double))); connect(doubleSpinBox4,SIGNAL(valueChanged(double)),this,SLOT(onChanged(double))); IgnoreWheelWhenNotFocused *ignoreWheelWhenNotFocused = new IgnoreWheelWhenNotFocused(this); this->doubleSpinBox1->installEventFilter(ignoreWheelWhenNotFocused); this->doubleSpinBox2->installEventFilter(ignoreWheelWhenNotFocused); this->doubleSpinBox3->installEventFilter(ignoreWheelWhenNotFocused); this->doubleSpinBox4->installEventFilter(ignoreWheelWhenNotFocused); } void ParameterVector::onChanged(double) { if(!this->suppressUpdate){ if (object->target == ParameterObject::NUMBER) { object->value = ValuePtr(doubleSpinBox1->value()); } else { Value::VectorType vt; vt.push_back(this->doubleSpinBox1->value()); if (!this->doubleSpinBox2->isReadOnly()) { vt.push_back(this->doubleSpinBox2->value()); } if (!this->doubleSpinBox3->isReadOnly()) { vt.push_back(this->doubleSpinBox3->value()); } if (!this->doubleSpinBox4->isReadOnly()) { vt.push_back(this->doubleSpinBox4->value()); } object->value = ValuePtr(vt); } emit changed(); } } void ParameterVector::setValue() { this->suppressUpdate=true; this->stackedWidgetBelow->setCurrentWidget(this->pageVector); this->pageVector->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); this->stackedWidgetRight->hide(); Value::VectorType vec = object->value->toVector(); double minV = object->values->toRange().begin_value(); double step = object->values->toRange().step_value(); double maxV = object->values->toRange().end_value(); if(step==0){ step=1; setPrecision(vec.at(0)->toDouble()); }else{ setPrecision(step); } QDoubleSpinBox* boxes[4] = {this->doubleSpinBox1,this->doubleSpinBox2,this->doubleSpinBox3,this->doubleSpinBox4}; for(unsigned int i = 0; i < vec.size(); i++) { boxes[i]->setDecimals(decimalPrecision); boxes[i]->setValue(vec.at(i)->toDouble()); if(minV==0 && maxV ==0){ boxes[i]->setRange(vec.at(i)->toDouble()-1000,vec.at(i)->toDouble()+1000); }else{ boxes[i]->setMinimum(minV); boxes[i]->setMaximum(maxV); boxes[i]->setSingleStep(step); } } for(unsigned int i = vec.size(); i < 4; i++) { boxes[i]->hide(); boxes[i]->setReadOnly(true); } this->suppressUpdate=false; } openscad-2019.05/src/parameter/parametervector.h0000644000076500000240000000051513402025764022226 0ustar kintelstaff00000000000000#pragma once #include "parametervirtualwidget.h" class ParameterVector : public ParameterVirtualWidget { Q_OBJECT public: ParameterVector(QWidget *parent, ParameterObject *parameterobject, DescLoD descriptionLoD); void setValue() override; protected slots: void onChanged(double); private: bool volatile suppressUpdate; }; openscad-2019.05/src/parameter/parametervirtualwidget.cpp0000644000076500000240000000472213402025764024155 0ustar kintelstaff00000000000000#include "parametervirtualwidget.h" ParameterVirtualWidget::ParameterVirtualWidget(QWidget *parent,ParameterObject *parameterobject, DescLoD descriptionLoD) : QWidget(parent), object(parameterobject), decimalPrecision(0) { setupUi(this); QSizePolicy policy; policy.setHorizontalPolicy(QSizePolicy::Ignored); policy.setVerticalPolicy(QSizePolicy::Maximum); policy.setHorizontalStretch(0); policy.setVerticalStretch(0); this->setSizePolicy(policy); setName(QString::fromStdString(object->name)); if (descriptionLoD == DescLoD::ShowDetails || descriptionLoD == DescLoD::DescOnly) { setDescription(object->description); this->labelInline->hide(); }else if(descriptionLoD == DescLoD::Inline){ addInline(object->description); }else{ this->setToolTip(object->description); } if (descriptionLoD == DescLoD::DescOnly && object->description !=""){ labelParameter->hide(); }else{ labelParameter->show(); } } ParameterVirtualWidget::~ParameterVirtualWidget(){ } void ParameterVirtualWidget::setName(QString name) { this->labelDescription->hide(); name.replace(QRegExp("([_]+)"), " "); this->labelParameter->setText(name); this->labelInline->setText(""); } void ParameterVirtualWidget::addInline(QString addTxt) { if(addTxt!=""){ this->labelInline->show(); this->labelInline->setText(" - "+ addTxt); } } //calculate the required decimal precision. //the result is stored in the member variable "decimalPrecision" void ParameterVirtualWidget::setPrecision(double number){ this->decimalPrecision = 0; long double diff, rn; //rn stands for real number unsigned long long intNumber, multi = 1; number = std::abs(number); while(1) { rn = (number * multi); intNumber = rn; //the fractional part will be truncated here diff = rn - intNumber; if (diff <= 0.0 || decimalPrecision > 6) { break; } multi = multi * 10; this->decimalPrecision++; } } void ParameterVirtualWidget::setDescription(const QString& description) { if(!description.isEmpty()){ this->labelDescription->show(); this->labelDescription->setText(description); } } void ParameterVirtualWidget::resizeEvent(QResizeEvent *){ //bodge code to adjust the label height, when the label has to use multiple lines static int prevLabelWidth(0); QLabel* label = this->labelDescription; int currLabelWidth=label->width(); if(currLabelWidth!=prevLabelWidth){ prevLabelWidth=currLabelWidth; label->setMinimumHeight(0); label->setMinimumHeight(label->heightForWidth(currLabelWidth)); } } openscad-2019.05/src/parameter/parametervirtualwidget.h0000644000076500000240000000136513402025764023622 0ustar kintelstaff00000000000000#pragma once #include "value.h" #include "qtgettext.h" #include "ui_ParameterEntryWidget.h" #include "parameterobject.h" enum class DescLoD {ShowDetails,Inline,HideDetails,DescOnly}; class ParameterVirtualWidget : public QWidget, public Ui::ParameterEntryWidget { Q_OBJECT protected: ParameterObject *object; public: ParameterVirtualWidget(QWidget *parent,ParameterObject *parameterobject, DescLoD descriptionLoD); ~ParameterVirtualWidget(); virtual void setValue() = 0; void resizeEvent(QResizeEvent * event) override; signals: void changed(); protected: int decimalPrecision; virtual void setPrecision(double number); private: void setName(QString name); void setDescription(const QString& description); void addInline(QString txt); }; openscad-2019.05/src/parser.y0000644000076500000240000004717313452415427016377 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ %expect 2 /* Expect 2 shift/reduce conflict for ifelse_statement - "dangling else problem" */ %{ #include #include #ifdef _MSC_VER #define strdup _strdup #else #include #endif #include "FileModule.h" #include "UserModule.h" #include "ModuleInstantiation.h" #include "Assignment.h" #include "expression.h" #include "value.h" #include "function.h" #include "printutils.h" #include "memory.h" #include #include #include "boost-utils.h" namespace fs = boost::filesystem; #define YYMAXDEPTH 20000 #define LOC(loc) Location(loc.first_line, loc.first_column, loc.last_line, loc.last_column, sourcefile()) int parser_error_pos = -1; int parserlex(void); void yyerror(char const *s); int lexerget_lineno(void); std::shared_ptr sourcefile(void); void lexer_set_parser_sourcefile(const fs::path& path); int lexerlex_destroy(void); int lexerlex(void); std::stack scope_stack; FileModule *rootmodule; extern void lexerdestroy(); extern FILE *lexerin; const char *parser_input_buffer; static fs::path mainFilePath; static std::string main_file_folder; bool fileEnded=false; %} %union { char *text; double number; class Value *value; class Expression *expr; class Vector *vec; class ModuleInstantiation *inst; class IfElseModuleInstantiation *ifelse; class Assignment *arg; AssignmentList *args; } %token TOK_ERROR %token TOK_EOT %token TOK_MODULE %token TOK_FUNCTION %token TOK_IF %token TOK_ELSE %token TOK_FOR %token TOK_LET %token TOK_ASSERT %token TOK_ECHO %token TOK_EACH %token TOK_ID %token TOK_STRING %token TOK_USE %token TOK_NUMBER %token TOK_TRUE %token TOK_FALSE %token TOK_UNDEF %token LE GE EQ NE AND OR %right LET %right LOW_PRIO_RIGHT %left LOW_PRIO_LEFT %right '?' ':' %left OR %left AND %left '<' LE GE '>' %left EQ NE %left '!' '+' '-' %left '*' '/' '%' %left UNARY %left '[' ']' %left '.' %right HIGH_PRIO_RIGHT %left HIGH_PRIO_LEFT %type expr %type vector_expr %type list_comprehension_elements %type list_comprehension_elements_p %type list_comprehension_elements_or_expr %type expr_or_empty %type module_instantiation %type if_statement %type ifelse_statement %type single_module_instantiation %type arguments_call %type arguments_decl %type argument_call %type argument_decl %type module_id %debug %% input: /* empty */ | input TOK_USE { rootmodule->registerUse(std::string($2)); free($2); } | input statement ; statement: ';' | '{' inner_input '}' | module_instantiation { if ($1) scope_stack.top()->addChild($1); } | assignment | TOK_MODULE TOK_ID '(' arguments_decl optional_commas ')' { UserModule *newmodule = new UserModule($2, LOC(@$)); newmodule->definition_arguments = *$4; scope_stack.top()->addModule($2, newmodule); scope_stack.push(&newmodule->scope); free($2); delete $4; } statement { scope_stack.pop(); } | TOK_FUNCTION TOK_ID '(' arguments_decl optional_commas ')' '=' expr { UserFunction *func = UserFunction::create($2, *$4, shared_ptr($8), LOC(@$)); scope_stack.top()->addFunction(func); free($2); delete $4; } ';' | TOK_EOT { fileEnded=true; } ; inner_input: /* empty */ | statement inner_input ; assignment: TOK_ID '=' expr ';' { bool found = false; for (auto &assignment : scope_stack.top()->assignments) { if (assignment.name == $1) { auto mainFile = mainFilePath.string(); auto prevFile = assignment.location().fileName(); auto currFile = LOC(@$).fileName(); const auto uncPathCurr = boostfs_uncomplete(currFile, mainFilePath.parent_path()); const auto uncPathPrev = boostfs_uncomplete(prevFile, mainFilePath.parent_path()); if(fileEnded){ //assigments via commandline }else if(prevFile==mainFile && currFile == mainFile){ //both assigments in the mainFile PRINTB("WARNING: %s was assigned on line %i but was overwritten on line %i", assignment.name% assignment.location().firstLine()% LOC(@$).firstLine()); }else if(uncPathCurr == uncPathPrev){ //assigment overwritten within the same file //the line number being equal happens, when a file is included multiple times if(assignment.location().firstLine() != LOC(@$).firstLine()){ PRINTB("WARNING: %s was assigned on line %i of %s but was overwritten on line %i", assignment.name% assignment.location().firstLine()% uncPathPrev% LOC(@$).firstLine()); } }else if(prevFile==mainFile && currFile != mainFile){ //assigment from the mainFile overwritten by an include PRINTB("WARNING: %s was assigned on line %i of %s but was overwritten on line %i of %s", assignment.name% assignment.location().firstLine()% uncPathPrev% LOC(@$).firstLine()% uncPathCurr); } assignment.expr = shared_ptr($3); assignment.setLocation(LOC(@$)); found = true; break; } } if (!found) { scope_stack.top()->addAssignment(Assignment($1, shared_ptr($3), LOC(@$))); } free($1); } ; module_instantiation: '!' module_instantiation { $$ = $2; if ($$) $$->tag_root = true; } | '#' module_instantiation { $$ = $2; if ($$) $$->tag_highlight = true; } | '%' module_instantiation { $$ = $2; if ($$) $$->tag_background = true; } | '*' module_instantiation { delete $2; $$ = NULL; } | single_module_instantiation { $$ = $1; scope_stack.push(&$1->scope); } child_statement { scope_stack.pop(); $$ = $2; } | ifelse_statement { $$ = $1; } ; ifelse_statement: if_statement { $$ = $1; } | if_statement TOK_ELSE { scope_stack.push(&$1->else_scope); } child_statement { scope_stack.pop(); $$ = $1; } ; if_statement: TOK_IF '(' expr ')' { $$ = new IfElseModuleInstantiation(shared_ptr($3), main_file_folder, LOC(@$)); scope_stack.push(&$$->scope); } child_statement { scope_stack.pop(); $$ = $5; } ; child_statements: /* empty */ | child_statements child_statement | child_statements assignment ; child_statement: ';' | '{' child_statements '}' | module_instantiation { if ($1) scope_stack.top()->addChild($1); } ; // "for", "let" and "each" are valid module identifiers module_id: TOK_ID { $$ = $1; } | TOK_FOR { $$ = strdup("for"); } | TOK_LET { $$ = strdup("let"); } | TOK_ASSERT { $$ = strdup("assert"); } | TOK_ECHO { $$ = strdup("echo"); } | TOK_EACH { $$ = strdup("each"); } ; single_module_instantiation: module_id '(' arguments_call ')' { $$ = new ModuleInstantiation($1, *$3, main_file_folder, LOC(@$)); free($1); delete $3; } ; expr: TOK_TRUE { $$ = new Literal(ValuePtr(true), LOC(@$)); } | TOK_FALSE { $$ = new Literal(ValuePtr(false), LOC(@$)); } | TOK_UNDEF { $$ = new Literal(ValuePtr::undefined, LOC(@$)); } | TOK_ID { $$ = new Lookup($1, LOC(@$)); free($1); } | expr '.' TOK_ID { $$ = new MemberLookup($1, $3, LOC(@$)); free($3); } | TOK_STRING { $$ = new Literal(ValuePtr(std::string($1)), LOC(@$)); free($1); } | TOK_NUMBER { $$ = new Literal(ValuePtr($1), LOC(@$)); } | '[' expr ':' expr ']' { $$ = new Range($2, $4, LOC(@$)); } | '[' expr ':' expr ':' expr ']' { $$ = new Range($2, $4, $6, LOC(@$)); } | '[' optional_commas ']' { $$ = new Literal(ValuePtr(Value::VectorType()), LOC(@$)); } | '[' vector_expr optional_commas ']' { $$ = $2; } | expr '*' expr { $$ = new BinaryOp($1, BinaryOp::Op::Multiply, $3, LOC(@$)); } | expr '/' expr { $$ = new BinaryOp($1, BinaryOp::Op::Divide, $3, LOC(@$)); } | expr '%' expr { $$ = new BinaryOp($1, BinaryOp::Op::Modulo, $3, LOC(@$)); } | expr '+' expr { $$ = new BinaryOp($1, BinaryOp::Op::Plus, $3, LOC(@$)); } | expr '-' expr { $$ = new BinaryOp($1, BinaryOp::Op::Minus, $3, LOC(@$)); } | expr '<' expr { $$ = new BinaryOp($1, BinaryOp::Op::Less, $3, LOC(@$)); } | expr LE expr { $$ = new BinaryOp($1, BinaryOp::Op::LessEqual, $3, LOC(@$)); } | expr EQ expr { $$ = new BinaryOp($1, BinaryOp::Op::Equal, $3, LOC(@$)); } | expr NE expr { $$ = new BinaryOp($1, BinaryOp::Op::NotEqual, $3, LOC(@$)); } | expr GE expr { $$ = new BinaryOp($1, BinaryOp::Op::GreaterEqual, $3, LOC(@$)); } | expr '>' expr { $$ = new BinaryOp($1, BinaryOp::Op::Greater, $3, LOC(@$)); } | expr AND expr { $$ = new BinaryOp($1, BinaryOp::Op::LogicalAnd, $3, LOC(@$)); } | expr OR expr { $$ = new BinaryOp($1, BinaryOp::Op::LogicalOr, $3, LOC(@$)); } | '+' expr %prec UNARY { $$ = $2; } | '-' expr %prec UNARY { $$ = new UnaryOp(UnaryOp::Op::Negate, $2, LOC(@$)); } | '!' expr { $$ = new UnaryOp(UnaryOp::Op::Not, $2, LOC(@$)); } | '(' expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = new TernaryOp($1, $3, $5, LOC(@$)); } | expr '[' expr ']' { $$ = new ArrayLookup($1, $3, LOC(@$)); } | TOK_ID '(' arguments_call ')' { $$ = new FunctionCall($1, *$3, LOC(@$)); free($1); delete $3; } | TOK_LET '(' arguments_call ')' expr %prec LET { $$ = FunctionCall::create("let", *$3, $5, LOC(@$)); delete $3; } | TOK_ASSERT '(' arguments_call ')' expr_or_empty %prec LOW_PRIO_LEFT { $$ = FunctionCall::create("assert", *$3, $5, LOC(@$)); delete $3; } | TOK_ECHO '(' arguments_call ')' expr_or_empty %prec LOW_PRIO_LEFT { $$ = FunctionCall::create("echo", *$3, $5, LOC(@$)); delete $3; } ; expr_or_empty: %prec LOW_PRIO_LEFT { $$ = NULL; } | expr %prec HIGH_PRIO_LEFT { $$ = $1; } ; list_comprehension_elements: /* The last set element may not be a "let" (as that would instead be parsed as an expression) */ TOK_LET '(' arguments_call ')' list_comprehension_elements_p { $$ = new LcLet(*$3, $5, LOC(@$)); delete $3; } | TOK_EACH list_comprehension_elements_or_expr { $$ = new LcEach($2, LOC(@$)); } | TOK_FOR '(' arguments_call ')' list_comprehension_elements_or_expr { $$ = $5; /* transform for(i=...,j=...) -> for(i=...) for(j=...) */ for (int i = $3->size()-1; i >= 0; i--) { AssignmentList arglist; arglist.push_back((*$3)[i]); Expression *e = new LcFor(arglist, $$, LOC(@$)); $$ = e; } delete $3; } | TOK_FOR '(' arguments_call ';' expr ';' arguments_call ')' list_comprehension_elements_or_expr { $$ = new LcForC(*$3, *$7, $5, $9, LOC(@$)); delete $3; delete $7; } | TOK_IF '(' expr ')' list_comprehension_elements_or_expr { $$ = new LcIf($3, $5, 0, LOC(@$)); } | TOK_IF '(' expr ')' list_comprehension_elements_or_expr TOK_ELSE list_comprehension_elements_or_expr { $$ = new LcIf($3, $5, $7, LOC(@$)); } ; // list_comprehension_elements with optional parenthesis list_comprehension_elements_p: list_comprehension_elements | '(' list_comprehension_elements ')' { $$ = $2; } ; list_comprehension_elements_or_expr: list_comprehension_elements_p | expr ; optional_commas: ',' optional_commas | /* empty */ ; vector_expr: expr { $$ = new Vector(LOC(@$)); $$->push_back($1); } | list_comprehension_elements { $$ = new Vector(LOC(@$)); $$->push_back($1); } | vector_expr ',' optional_commas list_comprehension_elements_or_expr { $$ = $1; $$->push_back($4); } ; arguments_decl: /* empty */ { $$ = new AssignmentList(); } | argument_decl { $$ = new AssignmentList(); $$->push_back(*$1); delete $1; } | arguments_decl ',' optional_commas argument_decl { $$ = $1; $$->push_back(*$4); delete $4; } ; argument_decl: TOK_ID { $$ = new Assignment($1, LOC(@$)); free($1); } | TOK_ID '=' expr { $$ = new Assignment($1, shared_ptr($3), LOC(@$)); free($1); } ; arguments_call: /* empty */ { $$ = new AssignmentList(); } | argument_call { $$ = new AssignmentList(); $$->push_back(*$1); delete $1; } | arguments_call ',' optional_commas argument_call { $$ = $1; $$->push_back(*$4); delete $4; } ; argument_call: expr { $$ = new Assignment("", shared_ptr($1), LOC(@$)); } | TOK_ID '=' expr { $$ = new Assignment($1, shared_ptr($3), LOC(@$)); free($1); } ; %% int parserlex(void) { return lexerlex(); } void yyerror (char const *s) { // FIXME: We leak memory on parser errors... PRINTB("ERROR: Parser error in file %s, line %d: %s\n", (*sourcefile()) % lexerget_lineno() % s); } bool parse(FileModule *&module, const std::string& text, const std::string &filename, const std::string &mainFile, int debug) { fs::path parser_sourcefile = fs::path(fs::absolute(fs::path(filename)).generic_string()); main_file_folder = parser_sourcefile.parent_path().string(); lexer_set_parser_sourcefile(parser_sourcefile); mainFilePath = fs::absolute(fs::path(mainFile)); lexerin = NULL; parser_error_pos = -1; parser_input_buffer = text.c_str(); fileEnded=false; rootmodule = new FileModule(main_file_folder, parser_sourcefile.filename().string()); scope_stack.push(&rootmodule->scope); // PRINTB_NOCACHE("New module: %s %p", "root" % rootmodule); parserdebug = debug; int parserretval = -1; try{ parserretval = parserparse(); }catch (const HardWarningException &e) { yyerror("stop on first warning"); } lexerdestroy(); lexerlex_destroy(); module = rootmodule; if (parserretval != 0) return false; parser_error_pos = -1; parser_input_buffer = nullptr; scope_stack.pop(); return true; } openscad-2019.05/src/parsersettings.cc0000644000076500000240000000666013437640540020270 0ustar kintelstaff00000000000000#include "parsersettings.h" #include #include "boosty.h" #include #include "PlatformUtils.h" namespace fs = boost::filesystem; std::vector librarypath; static void add_librarydir(const std::string &libdir) { librarypath.push_back(libdir); } /*! Searces for the given file in library paths and returns the full path if found. Returns an empty path if file cannot be found or filename is a directory. */ fs::path search_libs(const fs::path &localpath) { for(const auto &dir : librarypath) { fs::path usepath = fs::path(dir) / localpath; if (fs::exists(usepath) && !fs::is_directory(usepath)) { return usepath.string(); } } return fs::path(); } // files must be 'ordinary' - they must exist and be non-directories // FIXME: We cannot print any output here since these function is called periodically // from "Automatic reload and compile" static bool check_valid(const fs::path &p, const std::vector *openfilenames) { if (p.empty()) { //PRINTB("WARNING: File path is blank: %s",p); return false; } if (!p.has_parent_path()) { //PRINTB("WARNING: No parent path: %s",p); return false; } if (!fs::exists(p)) { //PRINTB("WARNING: File not found: %s",p); return false; } if (fs::is_directory(p)) { //PRINTB("WARNING: %s invalid - points to a directory",p); return false; } std::string fullname = p.generic_string(); // Detect circular includes if (openfilenames) { for(const auto &s : *openfilenames) { if (s == fullname) { // PRINTB("WARNING: circular include file %s", fullname); return false; } } } return true; } /*! Check if the given filename is valid. If the given filename is absolute, do a simple check. If not, search the applicable paths for a valid file. Returns the absolute path to a valid file, or an empty path if no valid files could be found. */ fs::path _find_valid_path(const fs::path &sourcepath, const fs::path &localpath, const std::vector *openfilenames) { if (localpath.is_absolute()) { if (check_valid(localpath, openfilenames)) return boosty::canonical(localpath); } else { fs::path fpath = sourcepath / localpath; if (fs::exists(fpath)) fpath = boosty::canonical(fpath); if (check_valid(fpath, openfilenames)) return fpath; fpath = search_libs(localpath); if (!fpath.empty() && check_valid(fpath, openfilenames)) return fpath; } return fs::path(); } fs::path find_valid_path(const fs::path &sourcepath, const fs::path &localpath, const std::vector *openfilenames) { return fs::path(_find_valid_path(sourcepath, localpath, openfilenames).generic_string()); } void parser_init() { // Add paths from OPENSCADPATH before adding built-in paths const char *openscadpaths = getenv("OPENSCADPATH"); if (openscadpaths) { std::string paths(openscadpaths); std::string sep = PlatformUtils::pathSeparatorChar(); typedef boost::split_iterator string_split_iterator; for (string_split_iterator it = boost::make_split_iterator(paths, boost::first_finder(sep, boost::is_iequal())); it != string_split_iterator(); ++it) { add_librarydir(fs::absolute(fs::path(boost::copy_range(*it))).generic_string()); } } add_librarydir(PlatformUtils::userLibraryPath()); add_librarydir(fs::absolute(PlatformUtils::resourcePath("libraries")).string()); } openscad-2019.05/src/parsersettings.h0000644000076500000240000000065213402025764020122 0ustar kintelstaff00000000000000#pragma once #include #include namespace fs = boost::filesystem; extern int parser_error_pos; /** * Initialize library path. */ void parser_init(); fs::path search_libs(const fs::path &localpath); fs::path find_valid_path(const fs::path &sourcepath, const fs::path &localpath, const std::vector *openfilenames = nullptr); openscad-2019.05/src/polyset-gl.cc0000644000076500000240000002146613427162620017310 0ustar kintelstaff00000000000000#include "polyset.h" #include "polyset-utils.h" #include "linalg.h" #include "printutils.h" #include "grid.h" #include // all GL functions grouped together here #ifdef ENABLE_OPENCSG static void draw_triangle(GLint *shaderinfo, const Vector3d &p0, const Vector3d &p1, const Vector3d &p2, double e0f, double e1f, double e2f, double z, bool mirror) { glVertexAttrib3d(shaderinfo[3], e0f, e1f, e2f); glVertexAttrib3d(shaderinfo[4], p1[0], p1[1], p1[2] + z); glVertexAttrib3d(shaderinfo[5], p2[0], p2[1], p2[2] + z); glVertexAttrib3d(shaderinfo[6], 0.0, 1.0, 0.0); glVertex3d(p0[0], p0[1], p0[2] + z); if (!mirror) { glVertexAttrib3d(shaderinfo[3], e0f, e1f, e2f); glVertexAttrib3d(shaderinfo[4], p0[0], p0[1], p0[2] + z); glVertexAttrib3d(shaderinfo[5], p2[0], p2[1], p2[2] + z); glVertexAttrib3d(shaderinfo[6], 0.0, 0.0, 1.0); glVertex3d(p1[0], p1[1], p1[2] + z); } glVertexAttrib3d(shaderinfo[3], e0f, e1f, e2f); glVertexAttrib3d(shaderinfo[4], p0[0], p0[1], p0[2] + z); glVertexAttrib3d(shaderinfo[5], p1[0], p1[1], p1[2] + z); glVertexAttrib3d(shaderinfo[6], 1.0, 0.0, 0.0); glVertex3d(p2[0], p2[1], p2[2] + z); if (mirror) { glVertexAttrib3d(shaderinfo[3], e0f, e1f, e2f); glVertexAttrib3d(shaderinfo[4], p0[0], p0[1], p0[2] + z); glVertexAttrib3d(shaderinfo[5], p2[0], p2[1], p2[2] + z); glVertexAttrib3d(shaderinfo[6], 0.0, 0.0, 1.0); glVertex3d(p1[0], p1[1], p1[2] + z); } } #endif #ifndef NULLGL static void draw_tri(const Vector3d &p0, const Vector3d &p1, const Vector3d &p2, double z, bool mirror) { glVertex3d(p0[0], p0[1], p0[2] + z); if (!mirror) glVertex3d(p1[0], p1[1], p1[2] + z); glVertex3d(p2[0], p2[1], p2[2] + z); if (mirror) glVertex3d(p1[0], p1[1], p1[2] + z); } static void gl_draw_triangle(GLint *shaderinfo, const Vector3d &p0, const Vector3d &p1, const Vector3d &p2, bool e0, bool e1, bool e2, double z, bool mirrored) { double ax = p1[0] - p0[0], bx = p1[0] - p2[0]; double ay = p1[1] - p0[1], by = p1[1] - p2[1]; double az = p1[2] - p0[2], bz = p1[2] - p2[2]; double nx = ay*bz - az*by; double ny = az*bx - ax*bz; double nz = ax*by - ay*bx; double nl = sqrt(nx*nx + ny*ny + nz*nz); glNormal3d(nx / nl, ny / nl, nz / nl); #ifdef ENABLE_OPENCSG if (shaderinfo) { double e0f = e0 ? 2.0 : -1.0; double e1f = e1 ? 2.0 : -1.0; double e2f = e2 ? 2.0 : -1.0; draw_triangle(shaderinfo, p0, p1, p2, e0f, e1f, e2f, z, mirrored); } else #endif { draw_tri(p0, p1, p2, z, mirrored); } } void PolySet::render_surface(Renderer::csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo) const { PRINTD("Polyset render"); bool mirrored = m.matrix().determinant() < 0; #ifdef ENABLE_OPENCSG if (shaderinfo) { glUniform1f(shaderinfo[7], shaderinfo[9]); glUniform1f(shaderinfo[8], shaderinfo[10]); } #endif /* ENABLE_OPENCSG */ if (this->dim == 2) { // Render 2D objects 1mm thick, but differences slightly larger double zbase = 1 + ((csgmode & CSGMODE_DIFFERENCE_FLAG) ? 0.1 : 0); glBegin(GL_TRIANGLES); // Render top+bottom for (double z = -zbase/2; z < zbase; z += zbase) { for (size_t i = 0; i < polygons.size(); i++) { const Polygon *poly = &polygons[i]; if (poly->size() == 3) { if (z < 0) { gl_draw_triangle(shaderinfo, poly->at(0), poly->at(2), poly->at(1), true, true, true, z, mirrored); } else { gl_draw_triangle(shaderinfo, poly->at(0), poly->at(1), poly->at(2), true, true, true, z, mirrored); } } else if (poly->size() == 4) { if (z < 0) { gl_draw_triangle(shaderinfo, poly->at(0), poly->at(3), poly->at(1), true, false, true, z, mirrored); gl_draw_triangle(shaderinfo, poly->at(2), poly->at(1), poly->at(3), true, false, true, z, mirrored); } else { gl_draw_triangle(shaderinfo, poly->at(0), poly->at(1), poly->at(3), true, false, true, z, mirrored); gl_draw_triangle(shaderinfo, poly->at(2), poly->at(3), poly->at(1), true, false, true, z, mirrored); } } else { Vector3d center = Vector3d::Zero(); for (size_t j = 0; j < poly->size(); j++) { center[0] += poly->at(j)[0]; center[1] += poly->at(j)[1]; } center[0] /= poly->size(); center[1] /= poly->size(); for (size_t j = 1; j <= poly->size(); j++) { if (z < 0) { gl_draw_triangle(shaderinfo, center, poly->at(j % poly->size()), poly->at(j - 1), false, true, false, z, mirrored); } else { gl_draw_triangle(shaderinfo, center, poly->at(j - 1), poly->at(j % poly->size()), false, true, false, z, mirrored); } } } } } // Render sides if (polygon.outlines().size() > 0) { for (const Outline2d &o : polygon.outlines()) { for (size_t j = 1; j <= o.vertices.size(); j++) { Vector3d p1(o.vertices[j-1][0], o.vertices[j-1][1], -zbase/2); Vector3d p2(o.vertices[j-1][0], o.vertices[j-1][1], zbase/2); Vector3d p3(o.vertices[j % o.vertices.size()][0], o.vertices[j % o.vertices.size()][1], -zbase/2); Vector3d p4(o.vertices[j % o.vertices.size()][0], o.vertices[j % o.vertices.size()][1], zbase/2); gl_draw_triangle(shaderinfo, p2, p1, p3, true, true, false, 0, mirrored); gl_draw_triangle(shaderinfo, p2, p3, p4, false, true, true, 0, mirrored); } } } else { // If we don't have borders, use the polygons as borders. // FIXME: When is this used? const Polygons *borders_p = &polygons; for (size_t i = 0; i < borders_p->size(); i++) { const Polygon *poly = &borders_p->at(i); for (size_t j = 1; j <= poly->size(); j++) { Vector3d p1 = poly->at(j - 1), p2 = poly->at(j - 1); Vector3d p3 = poly->at(j % poly->size()), p4 = poly->at(j % poly->size()); p1[2] -= zbase/2, p2[2] += zbase/2; p3[2] -= zbase/2, p4[2] += zbase/2; gl_draw_triangle(shaderinfo, p2, p1, p3, true, true, false, 0, mirrored); gl_draw_triangle(shaderinfo, p2, p3, p4, false, true, true, 0, mirrored); } } } glEnd(); } else if (this->dim == 3) { for (size_t i = 0; i < polygons.size(); i++) { const Polygon *poly = &polygons[i]; glBegin(GL_TRIANGLES); if (poly->size() == 3) { gl_draw_triangle(shaderinfo, poly->at(0), poly->at(1), poly->at(2), true, true, true, 0, mirrored); } else if (poly->size() == 4) { gl_draw_triangle(shaderinfo, poly->at(0), poly->at(1), poly->at(3), true, false, true, 0, mirrored); gl_draw_triangle(shaderinfo, poly->at(2), poly->at(3), poly->at(1), true, false, true, 0, mirrored); } else { Vector3d center = Vector3d::Zero(); for (size_t j = 0; j < poly->size(); j++) { center[0] += poly->at(j)[0]; center[1] += poly->at(j)[1]; center[2] += poly->at(j)[2]; } center[0] /= poly->size(); center[1] /= poly->size(); center[2] /= poly->size(); for (size_t j = 1; j <= poly->size(); j++) { gl_draw_triangle(shaderinfo, center, poly->at(j - 1), poly->at(j % poly->size()), false, true, false, 0, mirrored); } } glEnd(); } } else { assert(false && "Cannot render object with no dimension"); } } /*! This is used in throwntogether and CGAL mode csgmode is set to CSGMODE_NONE in CGAL mode. In this mode a pure 2D rendering is performed. For some reason, this is not used to render edges in Preview mode */ void PolySet::render_edges(Renderer::csgmode_e csgmode) const { glDisable(GL_LIGHTING); if (this->dim == 2) { if (csgmode == Renderer::CSGMODE_NONE) { // Render only outlines for (const Outline2d &o : polygon.outlines()) { glBegin(GL_LINE_LOOP); for (const Vector2d &v : o.vertices) { glVertex3d(v[0], v[1], 0); } glEnd(); } } else { // Render 2D objects 1mm thick, but differences slightly larger double zbase = 1 + ((csgmode & CSGMODE_DIFFERENCE_FLAG) ? 0.1 : 0); for (const Outline2d &o : polygon.outlines()) { // Render top+bottom outlines for (double z = -zbase/2; z < zbase; z += zbase) { glBegin(GL_LINE_LOOP); for (const Vector2d &v : o.vertices) { glVertex3d(v[0], v[1], z); } glEnd(); } // Render sides glBegin(GL_LINES); for (const Vector2d &v : o.vertices) { glVertex3d(v[0], v[1], -zbase/2); glVertex3d(v[0], v[1], +zbase/2); } glEnd(); } } } else if (dim == 3) { for (size_t i = 0; i < polygons.size(); i++) { const Polygon *poly = &polygons[i]; glBegin(GL_LINE_LOOP); for (size_t j = 0; j < poly->size(); j++) { const Vector3d &p = poly->at(j); glVertex3d(p[0], p[1], p[2]); } glEnd(); } } else { assert(false && "Cannot render object with no dimension"); } glEnable(GL_LIGHTING); } #else //NULLGL static void gl_draw_triangle(GLint *shaderinfo, const Vector3d &p0, const Vector3d &p1, const Vector3d &p2, bool e0, bool e1, bool e2, double z, bool mirrored) {} void PolySet::render_surface(Renderer::csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo) const {} void PolySet::render_edges(Renderer::csgmode_e csgmode) const {} #endif //NULLGL openscad-2019.05/src/polyset-utils-old.cc0000644000076500000240000002177113437640540020624 0ustar kintelstaff00000000000000#include "polyset-utils.h" #include "polyset.h" #include "Polygon2d.h" #include "printutils.h" #include "cgal.h" #pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #include #include #include #pragma pop_macro("NDEBUG") typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Triangulation_vertex_base_2 Vb; typedef CGAL::Delaunay_mesh_face_base_2 Fb; typedef CGAL::Triangulation_data_structure_2 Tds; typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; //typedef CGAL::Delaunay_mesh_criteria_2 Criteria; typedef CDT::Vertex_handle Vertex_handle; typedef CDT::Point CDTPoint; template class DummyCriteria { public: typedef double Quality; class Is_bad { public: CGAL::Mesh_2::Face_badness operator()(const Quality) const { return CGAL::Mesh_2::NOT_BAD; } CGAL::Mesh_2::Face_badness operator()(const typename T::Face_handle&, Quality&q) const { q = 1; return CGAL::Mesh_2::NOT_BAD; } }; Is_bad is_bad_object() const { return Is_bad(); } }; namespace PolysetUtils { // Project all polygons (also back-facing) into a Polygon2d instance. // It's important to select all faces, since filtering by normal vector here // will trigger floating point incertainties and cause problems later. Polygon2d *project(const PolySet &ps) { Polygon2d *poly = new Polygon2d; for(const auto &p : ps.polygons) { Outline2d outline; for(const auto &v : p) { outline.vertices.push_back(Vector2d(v[0], v[1])); } poly->addOutline(outline); } return poly; } /* Tessellation of 3d PolySet faces This code is for tessellating the faces of a 3d PolySet, assuming that the faces are near-planar polygons. We do the tessellation by projecting each polygon of the Polyset onto a 2-d plane, then running a 2d tessellation algorithm on the projected 2d polygon. Then we project each of the newly generated 2d 'tiles' (the polygons used for tessellation, typically triangles) back up into 3d space. (in reality as of writing, we dont need to do a back-projection from 2d->3d because the algorithm we are using doesn't create any new points, and we can just use a 'map' to associate 3d points with 2d points). The code assumes the input polygons are simple, non-intersecting, without holes, without duplicate input points, and with proper orientation. The purpose of this code is originally to fix github issue 349. Our CGAL kernel does not accept polygons for Nef_Polyhedron_3 if each of the points is not exactly coplanar. "Near-planar" or "Almost planar" polygons often occur due to rounding issues on, for example, polyhedron() input. By tessellating the 3d polygon into individual smaller tiles that are perfectly coplanar (triangles, for example), we can get CGAL to accept the polyhedron() input. */ typedef enum { XYPLANE, YZPLANE, XZPLANE, NONE } projection_t; // this is how we make 3d points appear as though they were 2d points to //the tessellation algorithm. Vector2d get_projected_point( Vector3d v, projection_t projection ) { Vector2d v2(0,0); if (projection==XYPLANE) { v2.x() = v.x(); v2.y() = v.y(); } else if (projection==XZPLANE) { v2.x() = v.x(); v2.y() = v.z(); } else if (projection==YZPLANE) { v2.x() = v.y(); v2.y() = v.z(); } return v2; } CGAL_Point_3 cgp( Vector3d v ) { return CGAL_Point_3( v.x(), v.y(), v.z() ); } /* Find a 'good' 2d projection for a given 3d polygon. the XY, YZ, or XZ plane. This is needed because near-planar polygons in 3d can have 'bad' projections into 2d. For example if the square 0,0,0 0,1,0 0,1,1 0,0,1 is projected onto the XY plane you will not get a polygon, you wil get a skinny line thing. It's better to project that square onto the yz plane.*/ projection_t find_good_projection( PolySet::Polygon pgon ) { // step 1 - find 3 non-collinear points in the input if (pgon.size()<3) return NONE; Vector3d v1,v2,v3; v1 = v2 = v3 = pgon[0]; for (size_t i=0;i pl( cgp(v1), cgp(v2), cgp(v3) ); NT3 qxy = pl.a()*pl.a()+pl.b()*pl.b(); NT3 qyz = pl.b()*pl.b()+pl.c()*pl.c(); NT3 qxz = pl.c()*pl.c()+pl.a()*pl.a(); NT3 min = std::min(qxy,std::min(qyz,qxz)); if (min==qxy) return XYPLANE; else if (min==qyz) return YZPLANE; return XZPLANE; } /* triangulate the given 3d polygon using CGAL's 2d Constrained Delaunay algorithm. Project the polygon's points into 2d using the given projection before performing the triangulation. This code assumes input polygon is simple, no holes, no self-intersections, no duplicate points, and is properly oriented. output is a sequence of 3d triangles. */ bool triangulate_polygon( const PolySet::Polygon &pgon, std::vector &triangles, projection_t projection ) { bool err = false; CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); try { CDT cdt; std::vector vhandles; std::map vertmap; CGAL::Orientation original_orientation; std::vector orienpgon; for (size_t i = 0; i < pgon.size(); i++) { Vector3d v3 = pgon.at(i); Vector2d v2 = get_projected_point( v3, projection ); CDTPoint cdtpoint = CDTPoint(v2.x(),v2.y()); vertmap[ cdtpoint ] = v3; Vertex_handle vh = cdt.insert( cdtpoint ); vhandles.push_back(vh); orienpgon.push_back( cdtpoint ); } original_orientation = CGAL::orientation_2( orienpgon.begin(),orienpgon.end() ); for (size_t i = 0; i < vhandles.size(); i++ ) { int vindex1 = (i+0); int vindex2 = (i+1)%vhandles.size(); cdt.insert_constraint( vhandles[vindex1], vhandles[vindex2] ); } std::list list_of_seeds; CGAL::refine_Delaunay_mesh_2_without_edge_refinement(cdt, list_of_seeds.begin(), list_of_seeds.end(), DummyCriteria()); CDT::Finite_faces_iterator fit; for( fit=cdt.finite_faces_begin(); fit!=cdt.finite_faces_end(); fit++ ) { if(fit->is_in_domain()) { CDTPoint p1 = cdt.triangle( fit )[0]; CDTPoint p2 = cdt.triangle( fit )[1]; CDTPoint p3 = cdt.triangle( fit )[2]; Vector3d v1 = vertmap[p1]; Vector3d v2 = vertmap[p2]; Vector3d v3 = vertmap[p3]; PolySet::Polygon pgon; if (CGAL::orientation(p1,p2,p3)==original_orientation) { pgon.push_back(v1); pgon.push_back(v2); pgon.push_back(v3); } else { pgon.push_back(v3); pgon.push_back(v2); pgon.push_back(v1); } triangles.push_back( pgon ); } } } catch (const CGAL::Failure_exception &e) { // Using failure exception to catch precondition errors for malformed polygons // in e.g. CGAL::orientation_2(). PRINTB("CGAL error in triangulate_polygon(): %s", e.what()); err = true; } CGAL::set_error_behaviour(old_behaviour); return err; } /* Given a 3d PolySet with 'near planar' polygonal faces, Tessellate the faces. As of writing, our only tessellation method is Triangulation using CGAL's Constrained Delaunay algorithm. This code assumes the input polyset has simple polygon faces with no holes, no self intersections, no duplicate points, and proper orientation. */ void tessellate_faces(const PolySet &inps, PolySet &outps) { int degeneratePolygons = 0; for (size_t i = 0; i < inps.polygons.size(); i++) { const PolySet::Polygon pgon = inps.polygons[i]; if (pgon.size() < 3) { degeneratePolygons++; continue; } std::vector triangles; if (pgon.size() == 3) { triangles.push_back(pgon); } else { projection_t goodproj = find_good_projection( pgon ); if (goodproj==NONE) { degeneratePolygons++; continue; } bool err = triangulate_polygon(pgon, triangles, goodproj); if (err) continue; } for (size_t j=0;j 0) PRINT("WARNING: PolySet has degenerate polygons"); } } openscad-2019.05/src/polyset-utils.cc0000644000076500000240000000663213402025764020044 0ustar kintelstaff00000000000000#include "polyset-utils.h" #include "polyset.h" #include "Polygon2d.h" #include "printutils.h" #include "GeometryUtils.h" #include "Reindexer.h" #include "grid.h" #ifdef ENABLE_CGAL #include "cgalutils.h" #endif namespace PolysetUtils { // Project all polygons (also back-facing) into a Polygon2d instance. // It's important to select all faces, since filtering by normal vector here // will trigger floating point incertainties and cause problems later. Polygon2d *project(const PolySet &ps) { auto poly = new Polygon2d; for (const auto &p : ps.polygons) { Outline2d outline; for (const auto &v : p) { outline.vertices.emplace_back(v[0], v[1]); } poly->addOutline(outline); } return poly; } /* Tessellation of 3d PolySet faces This code is for tessellating the faces of a 3d PolySet, assuming that the faces are near-planar polygons. The purpose of this code is originally to fix github issue 349. Our CGAL kernel does not accept polygons for Nef_Polyhedron_3 if each of the points is not exactly coplanar. "Near-planar" or "Almost planar" polygons often occur due to rounding issues on, for example, polyhedron() input. By tessellating the 3d polygon into individual smaller tiles that are perfectly coplanar (triangles, for example), we can get CGAL to accept the polyhedron() input. */ /* Given a 3D PolySet with near planar polygonal faces, tessellate the faces. As of writing, our only tessellation method is triangulation using CGAL's Constrained Delaunay algorithm. This code assumes the input polyset has simple polygon faces with no holes. The tessellation will be robust wrt. degenerate and self-intersecting */ void tessellate_faces(const PolySet &inps, PolySet &outps) { int degeneratePolygons = 0; // Build Indexed PolyMesh Reindexer allVertices; std::vector> polygons; for (const auto &pgon : inps.polygons) { if (pgon.size() < 3) { degeneratePolygons++; continue; } polygons.push_back({}); auto &faces = polygons.back(); faces.push_back(IndexedFace()); auto &currface = faces.back(); for (const auto &v : pgon) { // Create vertex indices and remove consecutive duplicate vertices auto idx = allVertices.lookup(v.cast()); if (currface.empty() || idx != currface.back()) currface.push_back(idx); } if (currface.front() == currface.back()) currface.pop_back(); if (currface.size() < 3) { faces.pop_back(); // Cull empty triangles if (faces.empty()) polygons.pop_back(); // All faces were culled } } // Tessellate indexed mesh const auto *verts = allVertices.getArray(); std::vector allTriangles; for (const auto &faces : polygons) { std::vector triangles; auto err = false; if (faces[0].size() == 3) { triangles.emplace_back(faces[0][0], faces[0][1], faces[0][2]); } else { err = GeometryUtils::tessellatePolygonWithHoles(verts, faces, triangles, nullptr); } if (!err) { for (const auto &t : triangles) { outps.append_poly(); outps.append_vertex(verts[t[0]]); outps.append_vertex(verts[t[1]]); outps.append_vertex(verts[t[2]]); } } } if (degeneratePolygons > 0) PRINT("WARNING: PolySet has degenerate polygons"); } bool is_approximately_convex(const PolySet &ps) { #ifdef ENABLE_CGAL return CGALUtils::is_approximately_convex(ps); #else return false; #endif } } openscad-2019.05/src/polyset-utils.h0000644000076500000240000000034413402025764017700 0ustar kintelstaff00000000000000#pragma once class Polygon2d; class PolySet; namespace PolysetUtils { Polygon2d *project(const PolySet &ps); void tessellate_faces(const PolySet &inps, PolySet &outps); bool is_approximately_convex(const PolySet &ps); }; openscad-2019.05/src/polyset.cc0000644000076500000240000001406513414440556016710 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "polyset.h" #include "polyset-utils.h" #include "linalg.h" #include "printutils.h" #include "grid.h" #include /*! /class PolySet The PolySet class fulfils multiple tasks, partially for historical reasons. FIXME: It's a bit messy and is a prime target for refactoring. 1) Store 2D and 3D polygon meshes from all origins 2) Store 2D outlines, used for rendering edges (2D only) 3) Rendering of polygons and edges PolySet must only contain convex polygons */ PolySet::PolySet(unsigned int dim, boost::tribool convex) : dim(dim), convex(convex), dirty(false) { } PolySet::PolySet(const Polygon2d &origin) : polygon(origin), dim(2), convex(unknown), dirty(false) { } PolySet::~PolySet() { } std::string PolySet::dump() const { std::ostringstream out; out << "PolySet:" << "\n dimensions:" << this->dim << "\n convexity:" << this->convexity << "\n num polygons: " << polygons.size() << "\n num outlines: " << polygon.outlines().size() << "\n polygons data:"; for (size_t i = 0; i < polygons.size(); i++) { out << "\n polygon begin:"; const Polygon *poly = &polygons[i]; for (size_t j = 0; j < poly->size(); j++) { Vector3d v = poly->at(j); out << "\n vertex:" << v.transpose(); } } out << "\n outlines data:"; out << polygon.dump(); out << "\nPolySet end"; return out.str(); } void PolySet::append_poly() { polygons.push_back(Polygon()); } void PolySet::append_poly(const Polygon &poly) { polygons.push_back(poly); this->dirty = true; } void PolySet::append_vertex(double x, double y, double z) { append_vertex(Vector3d(x, y, z)); } void PolySet::append_vertex(const Vector3d &v) { polygons.back().push_back(v); this->dirty = true; } void PolySet::append_vertex(const Vector3f &v) { append_vertex((const Vector3d &)v.cast()); } void PolySet::insert_vertex(double x, double y, double z) { insert_vertex(Vector3d(x, y, z)); } void PolySet::insert_vertex(const Vector3d &v) { polygons.back().insert(polygons.back().begin(), v); this->dirty = true; } void PolySet::insert_vertex(const Vector3f &v) { insert_vertex((const Vector3d &)v.cast()); } BoundingBox PolySet::getBoundingBox() const { if (this->dirty) { this->bbox.setNull(); for(const auto &poly : polygons) { for(const auto &p : poly) { this->bbox.extend(p); } } this->dirty = false; } return this->bbox; } size_t PolySet::memsize() const { size_t mem = 0; for(const auto &p : this->polygons) mem += p.size() * sizeof(Vector3d); mem += this->polygon.memsize() - sizeof(this->polygon); mem += sizeof(PolySet); return mem; } void PolySet::append(const PolySet &ps) { this->polygons.insert(this->polygons.end(), ps.polygons.begin(), ps.polygons.end()); if (!dirty && !this->bbox.isNull()) { this->bbox.extend(ps.getBoundingBox()); } } void PolySet::transform(const Transform3d &mat) { // If mirroring transform, flip faces to avoid the object to end up being inside-out bool mirrored = mat.matrix().determinant() < 0; for(auto &p : this->polygons){ for(auto &v : p) { v = mat * v; } if (mirrored) std::reverse(p.begin(), p.end()); } this->dirty = true; } bool PolySet::is_convex() const { if (convex || this->isEmpty()) return true; if (!convex) return false; return PolysetUtils::is_approximately_convex(*this); } void PolySet::resize(const Vector3d &newsize, const Eigen::Matrix &autosize) { BoundingBox bbox = this->getBoundingBox(); // Find largest dimension int maxdim = 0; for (int i=1;i<3;i++) if (newsize[i] > newsize[maxdim]) maxdim = i; // Default scale (scale with 1 if the new size is 0) Vector3d scale(1,1,1); for (int i=0;i<3;i++) if (newsize[i] > 0) scale[i] = newsize[i] / bbox.sizes()[i]; // Autoscale where applicable double autoscale = scale[maxdim]; Vector3d newscale; for (int i=0;i<3;i++) newscale[i] = !autosize[i] || (newsize[i] > 0) ? scale[i] : autoscale; Transform3d t; t.matrix() << newscale[0], 0, 0, 0, 0, newscale[1], 0, 0, 0, 0, newscale[2], 0, 0, 0, 0, 1; this->transform(t); } /*! Quantizes vertices by gridding them as well as merges close vertices belonging to neighboring grids. May reduce the number of polygons if polygons collapse into < 3 vertices. */ void PolySet::quantizeVertices() { Grid3d grid(GRID_FINE); std::vector indices; // Vertex indices in one polygon for (std::vector::iterator iter = this->polygons.begin(); iter != this->polygons.end();) { Polygon &p = *iter; indices.resize(p.size()); // Quantize all vertices. Build index list for (unsigned int i=0;ipolygons.erase(iter); } else { iter++; } } } openscad-2019.05/src/polyset.h0000644000076500000240000000324213402025764016542 0ustar kintelstaff00000000000000#pragma once #include "Geometry.h" #include "system-gl.h" #include "linalg.h" #include "GeometryUtils.h" #include "renderer.h" #include "Polygon2d.h" #include #include #include BOOST_TRIBOOL_THIRD_STATE(unknown) class PolySet : public Geometry { public: Polygons polygons; PolySet(unsigned int dim, boost::tribool convex = unknown); PolySet(const Polygon2d &origin); ~PolySet(); size_t memsize() const override; BoundingBox getBoundingBox() const override; std::string dump() const override; unsigned int getDimension() const override { return this->dim; } bool isEmpty() const override { return polygons.size() == 0; } Geometry *copy() const override { return new PolySet(*this); } void quantizeVertices(); size_t numPolygons() const { return polygons.size(); } void append_poly(); void append_poly(const Polygon &poly); void append_vertex(double x, double y, double z = 0.0); void append_vertex(const Vector3d &v); void append_vertex(const Vector3f &v); void insert_vertex(double x, double y, double z = 0.0); void insert_vertex(const Vector3d &v); void insert_vertex(const Vector3f &v); void append(const PolySet &ps); void render_surface(Renderer::csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo = nullptr) const; void render_edges(Renderer::csgmode_e csgmode) const; void transform(const Transform3d &mat); void resize(const Vector3d &newsize, const Eigen::Matrix &autosize); bool is_convex() const; boost::tribool convexValue() const { return this->convex; } private: Polygon2d polygon; unsigned int dim; mutable boost::tribool convex; mutable BoundingBox bbox; mutable bool dirty; }; openscad-2019.05/src/primitives.cc0000644000076500000240000005414713454430442017406 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "module.h" #include "node.h" #include "polyset.h" #include "evalcontext.h" #include "Polygon2d.h" #include "builtin.h" #include "printutils.h" #include "context.h" #include "calc.h" #include "degree_trig.h" #include #include #include #include #include "ModuleInstantiation.h" using namespace boost::assign; // bring 'operator+=()' into scope #define F_MINIMUM 0.01 enum class primitive_type_e { CUBE, SPHERE, CYLINDER, POLYHEDRON, SQUARE, CIRCLE, POLYGON }; class PrimitiveModule : public AbstractModule { public: primitive_type_e type; PrimitiveModule(primitive_type_e type) : type(type) { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; private: Value lookup_radius(const Context &ctx, const Location &loc, const std::string &radius_var, const std::string &diameter_var) const; }; class PrimitiveNode : public LeafNode { public: VISITABLE(); PrimitiveNode(const ModuleInstantiation *mi, primitive_type_e type, const std::string &docPath) : LeafNode(mi), document_path(docPath), type(type) { } std::string toString() const override; std::string name() const override { switch (this->type) { case primitive_type_e::CUBE: return "cube"; break; case primitive_type_e::SPHERE: return "sphere"; break; case primitive_type_e::CYLINDER: return "cylinder"; break; case primitive_type_e::POLYHEDRON: return "polyhedron"; break; case primitive_type_e::SQUARE: return "square"; break; case primitive_type_e::CIRCLE: return "circle"; break; case primitive_type_e::POLYGON: return "polygon"; break; default: assert(false && "PrimitiveNode::name(): Unknown primitive type"); return "unknown"; } } const std::string document_path; bool center; double x, y, z, h, r1, r2; double fn, fs, fa; primitive_type_e type; int convexity; ValuePtr points, paths, faces; const Geometry *createGeometry() const override; }; /** * Return a radius value by looking up both a diameter and radius variable. * The diameter has higher priority, so if found an additionally set radius * value is ignored. * * @param ctx data context with variable values. * @param radius_var name of the variable to lookup for the radius value. * @param diameter_var name of the variable to lookup for the diameter value. * @return radius value of type Value::ValueType::NUMBER or Value::ValueType::UNDEFINED if both * variables are invalid or not set. */ Value PrimitiveModule::lookup_radius(const Context &ctx, const Location &loc, const std::string &diameter_var, const std::string &radius_var) const { auto d = ctx.lookup_variable(diameter_var, true); auto r = ctx.lookup_variable(radius_var, true); const auto r_defined = (r->type() == Value::ValueType::NUMBER); if (d->type() == Value::ValueType::NUMBER) { if (r_defined) { std::string locStr = loc.toRelativeString(ctx.documentPath()); PRINTB("WARNING: Ignoring radius variable '%s' as diameter '%s' is defined too, %s", radius_var % diameter_var % locStr); } return {d->toDouble() / 2.0}; } else if (r_defined) { return *r; } else { return Value::undefined; } } AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new PrimitiveNode(inst, this->type, ctx->documentPath()); node->center = false; node->x = node->y = node->z = node->h = node->r1 = node->r2 = 1; AssignmentList args; AssignmentList optargs; if(inst->scope.hasChildren()){ PRINTB("WARNING: module %s() does not support child modules, %s", node->name() % inst->location().toRelativeString(ctx->documentPath())); } switch (this->type) { case primitive_type_e::CUBE: args += Assignment("size"), Assignment("center"); break; case primitive_type_e::SPHERE: args += Assignment("r"); optargs += Assignment("d"); break; case primitive_type_e::CYLINDER: args += Assignment("h"), Assignment("r1"), Assignment("r2"), Assignment("center"); optargs += Assignment("r"), Assignment("d"), Assignment("d1"), Assignment("d2"); break; case primitive_type_e::POLYHEDRON: args += Assignment("points"), Assignment("faces"), Assignment("convexity"); break; case primitive_type_e::SQUARE: args += Assignment("size"), Assignment("center"); break; case primitive_type_e::CIRCLE: args += Assignment("r"); optargs += Assignment("d"); break; case primitive_type_e::POLYGON: args += Assignment("points"), Assignment("paths"), Assignment("convexity"); break; default: assert(false && "PrimitiveModule::instantiate(): Unknown node type"); } Context c(ctx); c.setVariables(evalctx, args, optargs); node->fn = c.lookup_variable("$fn")->toDouble(); node->fs = c.lookup_variable("$fs")->toDouble(); node->fa = c.lookup_variable("$fa")->toDouble(); if (node->fs < F_MINIMUM) { PRINTB("WARNING: $fs too small - clamping to %f, %s", F_MINIMUM % inst->location().toRelativeString(ctx->documentPath())); node->fs = F_MINIMUM; } if (node->fa < F_MINIMUM) { PRINTB("WARNING: $fa too small - clamping to %f, %s", F_MINIMUM % inst->location().toRelativeString(ctx->documentPath())); node->fa = F_MINIMUM; } switch (this->type) { case primitive_type_e::CUBE: { auto size = c.lookup_variable("size"); auto center = c.lookup_variable("center"); if(size != ValuePtr::undefined){ bool converted=false; converted |= size->getDouble(node->x); converted |= size->getDouble(node->y); converted |= size->getDouble(node->z); converted |= size->getVec3(node->x, node->y, node->z); if(!converted){ PRINTB("WARNING: Unable to convert cube(size=%s, ...) parameter to a number or a vec3 of numbers, %s", size->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); }else if(OpenSCAD::rangeCheck){ bool ok = (node->x > 0) && (node->y > 0) && (node->z > 0); ok &= std::isfinite(node->x) && std::isfinite(node->y) && std::isfinite(node->z); if(!ok){ PRINTB("WARNING: cube(size=%s, ...), %s", size->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } } if (center->type() == Value::ValueType::BOOL) { node->center = center->toBool(); } break; } case primitive_type_e::SPHERE: { const auto r = lookup_radius(c, inst->location(), "d", "r"); if (r.type() == Value::ValueType::NUMBER) { node->r1 = r.toDouble(); if (OpenSCAD::rangeCheck && (node->r1 <= 0 || !std::isfinite(node->r1))){ PRINTB("WARNING: sphere(r=%s), %s", r.toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } break; } case primitive_type_e::CYLINDER: { const auto h = c.lookup_variable("h"); if (h->type() == Value::ValueType::NUMBER) { node->h = h->toDouble(); } const auto r = lookup_radius(c, inst->location(), "d", "r"); const auto r1 = lookup_radius(c, inst->location(), "d1", "r1"); const auto r2 = lookup_radius(c, inst->location(), "d2", "r2"); if(r.type() == Value::ValueType::NUMBER && (r1.type() == Value::ValueType::NUMBER || r2.type() == Value::ValueType::NUMBER) ){ PRINTB("WARNING: Cylinder parameters ambiguous, %s", inst->location().toRelativeString(ctx->documentPath())); } if (r.type() == Value::ValueType::NUMBER) { node->r1 = r.toDouble(); node->r2 = r.toDouble(); } if (r1.type() == Value::ValueType::NUMBER) { node->r1 = r1.toDouble(); } if (r2.type() == Value::ValueType::NUMBER) { node->r2 = r2.toDouble(); } if(OpenSCAD::rangeCheck){ if (node->h <= 0 || !std::isfinite(node->h)){ PRINTB("WARNING: cylinder(h=%s, ...), %s", h->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } if (node->r1 < 0 || node->r2 < 0 || (node->r1 == 0 && node->r2 == 0) || !std::isfinite(node->r1) || !std::isfinite(node->r2)){ PRINTB("WARNING: cylinder(r1=%s, r2=%s, ...), %s", (r1.type() == Value::ValueType::NUMBER ? r1.toEchoString() : r.toEchoString()) % (r2.type() == Value::ValueType::NUMBER ? r2.toEchoString() : r.toEchoString()) % inst->location().toRelativeString(ctx->documentPath())); } } auto center = c.lookup_variable("center"); if (center->type() == Value::ValueType::BOOL) { node->center = center->toBool(); } break; } case primitive_type_e::POLYHEDRON: { node->points = c.lookup_variable("points"); node->faces = c.lookup_variable("faces"); if (node->faces->type() == Value::ValueType::UNDEFINED) { // backwards compatible node->faces = c.lookup_variable("triangles", true); if (node->faces->type() != Value::ValueType::UNDEFINED) { printDeprecation("polyhedron(triangles=[]) will be removed in future releases. Use polyhedron(faces=[]) instead."); } } break; } case primitive_type_e::SQUARE: { auto size = c.lookup_variable("size"); auto center = c.lookup_variable("center"); if(size != ValuePtr::undefined){ bool converted=false; converted |= size->getDouble(node->x); converted |= size->getDouble(node->y); converted |= size->getVec2(node->x, node->y); if(!converted){ PRINTB("WARNING: Unable to convert square(size=%s, ...) parameter to a number or a vec2 of numbers, %s", size->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); }else if(OpenSCAD::rangeCheck){ bool ok = true; ok &= (node->x > 0) && (node->y > 0); ok &= std::isfinite(node->x) && std::isfinite(node->y); if(!ok){ PRINTB("WARNING: square(size=%s, ...), %s", size->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } } if (center->type() == Value::ValueType::BOOL) { node->center = center->toBool(); } break; } case primitive_type_e::CIRCLE: { const auto r = lookup_radius(c, inst->location(), "d", "r"); if (r.type() == Value::ValueType::NUMBER) { node->r1 = r.toDouble(); if (OpenSCAD::rangeCheck && ((node->r1 <= 0) || !std::isfinite(node->r1))){ PRINTB("WARNING: circle(r=%s), %s", r.toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } break; } case primitive_type_e::POLYGON: { node->points = c.lookup_variable("points"); node->paths = c.lookup_variable("paths"); break; } } node->convexity = (int)c.lookup_variable("convexity", true)->toDouble(); if (node->convexity < 1) node->convexity = 1; return node; } struct point2d { double x, y; }; static void generate_circle(point2d *circle, double r, int fragments) { for (int i=0; itype) { case primitive_type_e::CUBE: { auto p = new PolySet(3,true); g = p; if (this->x > 0 && this->y > 0 && this->z > 0 && !std::isinf(this->x) && !std::isinf(this->y) && !std::isinf(this->z)) { double x1, x2, y1, y2, z1, z2; if (this->center) { x1 = -this->x/2; x2 = +this->x/2; y1 = -this->y/2; y2 = +this->y/2; z1 = -this->z/2; z2 = +this->z/2; } else { x1 = y1 = z1 = 0; x2 = this->x; y2 = this->y; z2 = this->z; } p->append_poly(); // top p->append_vertex(x1, y1, z2); p->append_vertex(x2, y1, z2); p->append_vertex(x2, y2, z2); p->append_vertex(x1, y2, z2); p->append_poly(); // bottom p->append_vertex(x1, y2, z1); p->append_vertex(x2, y2, z1); p->append_vertex(x2, y1, z1); p->append_vertex(x1, y1, z1); p->append_poly(); // side1 p->append_vertex(x1, y1, z1); p->append_vertex(x2, y1, z1); p->append_vertex(x2, y1, z2); p->append_vertex(x1, y1, z2); p->append_poly(); // side2 p->append_vertex(x2, y1, z1); p->append_vertex(x2, y2, z1); p->append_vertex(x2, y2, z2); p->append_vertex(x2, y1, z2); p->append_poly(); // side3 p->append_vertex(x2, y2, z1); p->append_vertex(x1, y2, z1); p->append_vertex(x1, y2, z2); p->append_vertex(x2, y2, z2); p->append_poly(); // side4 p->append_vertex(x1, y2, z1); p->append_vertex(x1, y1, z1); p->append_vertex(x1, y1, z2); p->append_vertex(x1, y2, z2); } } break; case primitive_type_e::SPHERE: { auto p = new PolySet(3,true); g = p; if (this->r1 > 0 && !std::isinf(this->r1)) { struct ring_s { std::vector points; double z; }; auto fragments = Calc::get_fragments_from_r(r1, fn, fs, fa); int rings = (fragments+1)/2; // Uncomment the following three lines to enable experimental sphere tesselation // if (rings % 2 == 0) rings++; // To ensure that the middle ring is at phi == 0 degrees auto ring = std::vector(rings); // double offset = 0.5 * ((fragments / 2) % 2); for (int i = 0; i < rings; i++) { // double phi = (180.0 * (i + offset)) / (fragments/2); double phi = (180.0 * (i + 0.5)) / rings; double r = r1 * sin_degrees(phi); ring[i].z = r1 * cos_degrees(phi); ring[i].points.resize(fragments); generate_circle(ring[i].points.data(), r, fragments); } p->append_poly(); for (int i = 0; i < fragments; i++) p->append_vertex(ring[0].points[i].x, ring[0].points[i].y, ring[0].z); for (int i = 0; i < rings-1; i++) { auto r1 = &ring[i]; auto r2 = &ring[i+1]; int r1i = 0, r2i = 0; while (r1i < fragments || r2i < fragments) { if (r1i >= fragments) goto sphere_next_r2; if (r2i >= fragments) goto sphere_next_r1; if ((double)r1i / fragments < (double)r2i / fragments) { sphere_next_r1: p->append_poly(); int r1j = (r1i+1) % fragments; p->insert_vertex(r1->points[r1i].x, r1->points[r1i].y, r1->z); p->insert_vertex(r1->points[r1j].x, r1->points[r1j].y, r1->z); p->insert_vertex(r2->points[r2i % fragments].x, r2->points[r2i % fragments].y, r2->z); r1i++; } else { sphere_next_r2: p->append_poly(); int r2j = (r2i+1) % fragments; p->append_vertex(r2->points[r2i].x, r2->points[r2i].y, r2->z); p->append_vertex(r2->points[r2j].x, r2->points[r2j].y, r2->z); p->append_vertex(r1->points[r1i % fragments].x, r1->points[r1i % fragments].y, r1->z); r2i++; } } } p->append_poly(); for (int i = 0; i < fragments; i++) { p->insert_vertex(ring[rings-1].points[i].x, ring[rings-1].points[i].y, ring[rings-1].z); } } } break; case primitive_type_e::CYLINDER: { auto p = new PolySet(3,true); g = p; if (this->h > 0 && !std::isinf(this->h) && this->r1 >=0 && this->r2 >= 0 && (this->r1 > 0 || this->r2 > 0) && !std::isinf(this->r1) && !std::isinf(this->r2)) { auto fragments = Calc::get_fragments_from_r(std::fmax(this->r1, this->r2), this->fn, this->fs, this->fa); double z1, z2; if (this->center) { z1 = -this->h/2; z2 = +this->h/2; } else { z1 = 0; z2 = this->h; } auto circle1 = std::vector(fragments); auto circle2 = std::vector(fragments); generate_circle(circle1.data(), r1, fragments); generate_circle(circle2.data(), r2, fragments); for (int i=0; iappend_poly(); p->insert_vertex(circle1[i].x, circle1[i].y, z1); p->insert_vertex(circle2[i].x, circle2[i].y, z2); p->insert_vertex(circle2[j].x, circle2[j].y, z2); p->insert_vertex(circle1[j].x, circle1[j].y, z1); } else { if (r1 > 0) { p->append_poly(); p->insert_vertex(circle1[i].x, circle1[i].y, z1); p->insert_vertex(circle2[i].x, circle2[i].y, z2); p->insert_vertex(circle1[j].x, circle1[j].y, z1); } if (r2 > 0) { p->append_poly(); p->insert_vertex(circle2[i].x, circle2[i].y, z2); p->insert_vertex(circle2[j].x, circle2[j].y, z2); p->insert_vertex(circle1[j].x, circle1[j].y, z1); } } } if (this->r1 > 0) { p->append_poly(); for (int i=0; iinsert_vertex(circle1[i].x, circle1[i].y, z1); } if (this->r2 > 0) { p->append_poly(); for (int i=0; iappend_vertex(circle2[i].x, circle2[i].y, z2); } } } break; case primitive_type_e::POLYHEDRON: { auto p = new PolySet(3); g = p; p->setConvexity(this->convexity); for (size_t i=0; ifaces->toVector().size(); i++) { p->append_poly(); const auto &vec = this->faces->toVector()[i]->toVector(); for (size_t j=0; jtoDouble(); if (pt < this->points->toVector().size()) { double px, py, pz; if (!this->points->toVector()[pt]->getVec3(px, py, pz, 0.0) || !std::isfinite(px) || !std::isfinite(py) || !std::isfinite(pz)) { PRINTB("ERROR: Unable to convert point at index %d to a vec3 of numbers, %s", j % this->modinst->location().toRelativeString(this->document_path)); return p; } p->insert_vertex(px, py, pz); } } } } break; case primitive_type_e::SQUARE: { auto p = new Polygon2d(); g = p; if (this->x > 0 && this->y > 0 && !std::isinf(this->x) && !std::isinf(this->y)) { Vector2d v1(0, 0); Vector2d v2(this->x, this->y); if (this->center) { v1 -= Vector2d(this->x/2, this->y/2); v2 -= Vector2d(this->x/2, this->y/2); } Outline2d o; o.vertices = {v1, {v2[0], v1[1]}, v2, {v1[0], v2[1]}}; p->addOutline(o); } p->setSanitized(true); } break; case primitive_type_e::CIRCLE: { auto p = new Polygon2d(); g = p; if (this->r1 > 0 && !std::isinf(this->r1)) { auto fragments = Calc::get_fragments_from_r(this->r1, this->fn, this->fs, this->fa); Outline2d o; o.vertices.resize(fragments); for (int i=0; i < fragments; i++) { double phi = (360.0 * i) / fragments; o.vertices[i] = {this->r1 * cos_degrees(phi), this->r1 * sin_degrees(phi)}; } p->addOutline(o); } p->setSanitized(true); } break; case primitive_type_e::POLYGON: { auto p = new Polygon2d(); g = p; Outline2d outline; double x,y; const auto &vec = this->points->toVector(); for (unsigned int i=0;imodinst->location().toRelativeString(this->document_path)); return p; } outline.vertices.emplace_back(x, y); } if (this->paths->toVector().size() == 0 && outline.vertices.size() > 2) { p->addOutline(outline); } else { for (const auto &polygon : this->paths->toVector()) { Outline2d curroutline; for (const auto &index : polygon->toVector()) { unsigned int idx = (unsigned int)index->toDouble(); if (idx < outline.vertices.size()) { curroutline.vertices.push_back(outline.vertices[idx]); } // FIXME: Warning on out of bounds? } p->addOutline(curroutline); } } if (p->outlines().size() > 0) { p->setConvexity(convexity); } } } return g; } std::string PrimitiveNode::toString() const { std::ostringstream stream; stream << this->name(); switch (this->type) { case primitive_type_e::CUBE: stream << "(size = [" << this->x << ", " << this->y << ", " << this->z << "], " << "center = " << (center ? "true" : "false") << ")"; break; case primitive_type_e::SPHERE: stream << "($fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ", r = " << this->r1 << ")"; break; case primitive_type_e::CYLINDER: stream << "($fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ", h = " << this->h << ", r1 = " << this->r1 << ", r2 = " << this->r2 << ", center = " << (center ? "true" : "false") << ")"; break; case primitive_type_e::POLYHEDRON: stream << "(points = "; this->points->toStream(stream); stream << ", faces = "; this->faces->toStream(stream); stream << ", convexity = " << this->convexity << ")"; break; case primitive_type_e::SQUARE: stream << "(size = [" << this->x << ", " << this->y << "], " << "center = " << (center ? "true" : "false") << ")"; break; case primitive_type_e::CIRCLE: stream << "($fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ", r = " << this->r1 << ")"; break; case primitive_type_e::POLYGON: stream << "(points = "; this->points->toStream(stream); stream << ", paths = "; this->paths->toStream(stream); stream << ", convexity = " << this->convexity << ")"; break; default: assert(false); } return stream.str(); } void register_builtin_primitives() { Builtins::init("cube", new PrimitiveModule(primitive_type_e::CUBE)); Builtins::init("sphere", new PrimitiveModule(primitive_type_e::SPHERE)); Builtins::init("cylinder", new PrimitiveModule(primitive_type_e::CYLINDER)); Builtins::init("polyhedron", new PrimitiveModule(primitive_type_e::POLYHEDRON)); Builtins::init("square", new PrimitiveModule(primitive_type_e::SQUARE)); Builtins::init("circle", new PrimitiveModule(primitive_type_e::CIRCLE)); Builtins::init("polygon", new PrimitiveModule(primitive_type_e::POLYGON)); } openscad-2019.05/src/printutils.cc0000644000076500000240000000724713441031431017416 0ustar kintelstaff00000000000000#include "printutils.h" #include #include #include #include #include #include #include "exceptions.h" namespace fs = boost::filesystem; std::list print_messages_stack; OutputHandlerFunc *outputhandler = nullptr; void *outputhandler_data = nullptr; std::string OpenSCAD::debug(""); bool OpenSCAD::quiet = false; bool OpenSCAD::hardwarnings = false; bool OpenSCAD::parameterCheck = true; bool OpenSCAD::rangeCheck = false; boost::circular_buffer lastmessages(5); namespace { bool no_throw; bool deferred; } void set_output_handler(OutputHandlerFunc *newhandler, void *userdata) { outputhandler = newhandler; outputhandler_data = userdata; } void no_exceptions_for_warnings() { no_throw = true; deferred = false; } bool would_have_thrown() { const auto would_throw = deferred; no_throw = false; deferred = false; return would_throw; } void print_messages_push() { print_messages_stack.push_back(std::string()); } void print_messages_pop() { std::string msg = print_messages_stack.back(); print_messages_stack.pop_back(); if (print_messages_stack.size() > 0 && !msg.empty()) { if (!print_messages_stack.back().empty()) { print_messages_stack.back() += "\n"; } print_messages_stack.back() += msg; } } void PRINT(const std::string &msg) { if (msg.empty()) return; if (print_messages_stack.size() > 0) { if (!print_messages_stack.back().empty()) { print_messages_stack.back() += "\n"; } print_messages_stack.back() += msg; } PRINT_NOCACHE(msg); } void PRINT_NOCACHE(const std::string &msg) { if (msg.empty()) return; if (boost::starts_with(msg, "WARNING") || boost::starts_with(msg, "ERROR") || boost::starts_with(msg, "TRACE")) { size_t i; for (i=0;i std::set printedDeprecations; void printDeprecation(const std::string &str) { if (printedDeprecations.find(str) == printedDeprecations.end()) { printedDeprecations.insert(str); std::string msg = "DEPRECATED: " + str; PRINT(msg); } } void resetSuppressedMessages() { printedDeprecations.clear(); lastmessages.clear(); } openscad-2019.05/src/printutils.h0000644000076500000240000000666313441031431017261 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include #undef snprintf #include inline char * _( const char * msgid ) { return gettext( msgid ); } inline const char * _( const char * msgid, const char *msgctxt) { /* The separator between msgctxt and msgid in a .mo file. */ const char* GETTEXT_CONTEXT_GLUE = "\004"; std::string str = msgctxt; str += GETTEXT_CONTEXT_GLUE; str += msgid; auto translation = dcgettext(NULL,str.c_str(), LC_MESSAGES); if(translation==str){ return gettext(msgid); }else{ return translation; } } typedef void (OutputHandlerFunc)(const std::string &msg, void *userdata); extern OutputHandlerFunc *outputhandler; extern void *outputhandler_data; namespace OpenSCAD { extern std::string debug; extern bool quiet; extern bool hardwarnings; extern bool parameterCheck; extern bool rangeCheck; } void set_output_handler(OutputHandlerFunc *newhandler, void *userdata); void no_exceptions_for_warnings(); bool would_have_thrown(); extern std::list print_messages_stack; void print_messages_push(); void print_messages_pop(); void printDeprecation(const std::string &str); void resetSuppressedMessages(); #define PRINT_DEPRECATION(_fmt, _arg) do { printDeprecation(str(boost::format(_fmt) % _arg)); } while (0) /* PRINT statements come out in same window as ECHO. usage: PRINTB("Var1: %s Var2: %i", var1 % var2 ); */ void PRINT(const std::string &msg); #define PRINTB(_fmt, _arg) do { PRINT(str(boost::format(_fmt) % _arg)); } while (0) void PRINT_NOCACHE(const std::string &msg); #define PRINTB_NOCACHE(_fmt, _arg) do { PRINT_NOCACHE(str(boost::format(_fmt) % _arg)); } while (0) void PRINT_CONTEXT(const class Context *ctx, const class Module *mod, const class ModuleInstantiation *inst); /*PRINTD: debugging/verbose output. Usage in code: CGAL_Point_3 p0(0,0,0),p1(1,0,0),p2(0,1,0); PRINTD(" Created 3 points: "); PRINTDB("point0, point1, point2: %s %s %s", p0 % p1 % p2 ); Usage on command line: openscad x.scad --debug=all # prints all debug messages openscad x.scad --debug= # prints only debug msgs from srcfile.*.cc (example: openscad --debug=export # prints only debug msgs from export.cc ) For a debug with heavy computation cost, you can guard so that the computation only occurs when debugging is turned on. For example: if (OpenSCAD::debug!="") PRINTDB("PolySet dump: %s",ps->dump()); */ void PRINTDEBUG(const std::string &filename,const std::string &msg); #define PRINTD(_arg) do { PRINTDEBUG(std::string(__FILE__),_arg); } while (0) #define PRINTDB(_fmt, _arg) do { try { PRINTDEBUG(std::string(__FILE__),str(boost::format(_fmt) % _arg)); } catch(const boost::io::format_error &e) { PRINTDEBUG(std::string(__FILE__),"bad PRINTDB usage"); } } while (0) std::string two_digit_exp_format( std::string doublestr ); std::string two_digit_exp_format( double x ); // extremely simple logging, eventually replace with something like boost.log // usage: logstream out(5); openscad_loglevel=6; out << "hi"; static int openscad_loglevel = 0; class logstream { public: std::ostream *out; int loglevel; logstream( int level = 0 ) { loglevel = level; out = &(std::cout); } template logstream & operator<<( T const &t ) { if (out && loglevel <= openscad_loglevel) { (*out) << t ; out->flush(); } return *this; } }; #define STR(s) static_cast(std::ostringstream() << s).str() openscad-2019.05/src/progress.cc0000644000076500000240000000126413402025764017047 0ustar kintelstaff00000000000000#include "progress.h" #include "node.h" int progress_report_count; void (*progress_report_f)(const class AbstractNode*, void*, int); void *progress_report_userdata; void progress_report_prep(AbstractNode *root, void (*f)(const class AbstractNode *node, void *userdata, int mark), void *userdata) { progress_report_count = 0; progress_report_f = f; progress_report_userdata = userdata; root->progress_prepare(); } void progress_report_fin() { progress_report_count = 0; progress_report_f = nullptr; progress_report_userdata = nullptr; } void progress_update(const AbstractNode *node, int mark) { if (progress_report_f) progress_report_f(node, progress_report_userdata, mark); } openscad-2019.05/src/progress.h0000644000076500000240000000076413402025764016715 0ustar kintelstaff00000000000000#pragma once // Reset to 0 in _prep() and increased for each Node instance in progress_prepare() extern int progress_report_count; extern void (*progress_report_f)(const class AbstractNode*, void*, int); extern void *progress_report_userdata; void progress_report_prep(AbstractNode *root, void (*f)(const class AbstractNode *node, void *userdata, int mark), void *userdata); void progress_report_fin(); void progress_update(const AbstractNode *node, int mark); class ProgressCancelException { }; openscad-2019.05/src/projection.cc0000644000076500000240000000521613414443772017366 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "projectionnode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "printutils.h" #include "builtin.h" #include "polyset.h" #include #include using namespace boost::assign; // bring 'operator+=()' into scope class ProjectionModule : public AbstractModule { public: ProjectionModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *ProjectionModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new ProjectionNode(inst); AssignmentList args{Assignment("cut")}; AssignmentList optargs{Assignment("convexity")}; Context c(ctx); c.setVariables(evalctx, args, optargs); inst->scope.apply(*evalctx); auto convexity = c.lookup_variable("convexity", true); auto cut = c.lookup_variable("cut", true); node->convexity = static_cast(convexity->toDouble()); if (cut->type() == Value::ValueType::BOOL) { node->cut_mode = cut->toBool(); } auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string ProjectionNode::toString() const { return STR("projection(cut = " << (this->cut_mode ? "true" : "false") << ", convexity = " << this->convexity << ")"); } void register_builtin_projection() { Builtins::init("projection", new ProjectionModule()); } openscad-2019.05/src/projectionnode.h0000644000076500000240000000055313402025764020067 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include class ProjectionNode : public AbstractPolyNode { public: VISITABLE(); ProjectionNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi), convexity(1), cut_mode(false) { } std::string toString() const override; std::string name() const override { return "projection"; } int convexity; bool cut_mode; }; openscad-2019.05/src/qtgettext.h0000644000076500000240000000110013414440252017057 0ustar kintelstaff00000000000000#ifndef __openscad_qtgettext_h__ #define __openscad_qtgettext_h__ // see doc/translation.txt // MinGW defines sprintf to libintl_sprintf which breaks usage of the // Qt sprintf in QString. This is skipped if sprintf and _GL_STDIO_H // is already defined, so the workaround defines sprintf as itself. #ifdef __MINGW32__ #define _GL_STDIO_H #undef sprintf #define sprintf sprintf #endif #include #include "printutils.h" inline QString q_(const char *msgid, const char *msgctxt) { return QString::fromUtf8(msgctxt ? _(msgid, msgctxt): _(msgid) ); } #endif openscad-2019.05/src/render-opencsg.cc.org0000644000076500000240000000547713402025764020716 0ustar kintelstaff00000000000000#include "render-opencsg.h" #include "polyset.h" #include "csgterm.h" #ifdef ENABLE_OPENCSG # include #endif class OpenCSGPrim : public OpenCSG::Primitive { public: OpenCSGPrim(OpenCSG::Operation operation, unsigned int convexity) : OpenCSG::Primitive(operation, convexity) { } PolySet *p; double *m; int csgmode; virtual void render() { glPushMatrix(); glMultMatrixd(m); p->render_surface(PolySet::COLORMODE_NONE, PolySet::csgmode_e(csgmode), m); glPopMatrix(); } }; void renderCSGChainviaOpenCSG(CSGChain *chain, GLint *shaderinfo, bool highlight, bool background) { std::vector primitives; int j = 0; for (int i = 0;; i++) { bool last = i == chain->polysets.size(); if (last || chain->types[i] == CSGTerm::TYPE_UNION) { if (j+1 != i) { OpenCSG::render(primitives); glDepthFunc(GL_EQUAL); } if (shaderinfo) glUseProgram(shaderinfo[0]); for (; j < i; j++) { double *m = chain->matrices[j]; glPushMatrix(); glMultMatrixd(m); int csgmode = chain->types[j] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL; if (highlight) { chain->polysets[j]->render_surface(PolySet::COLORMODE_HIGHLIGHT, PolySet::csgmode_e(csgmode + 20), m, shaderinfo); } else if (background) { chain->polysets[j]->render_surface(PolySet::COLORMODE_BACKGROUND, PolySet::csgmode_e(csgmode + 10), m, shaderinfo); } else if (m[16] >= 0 || m[17] >= 0 || m[18] >= 0 || m[19] >= 0) { // User-defined color from source glColor4d(m[16], m[17], m[18], m[19]); if (shaderinfo) { glUniform4f(shaderinfo[1], m[16], m[17], m[18], m[19]); glUniform4f(shaderinfo[2], (m[16]+1)/2, (m[17]+1)/2, (m[18]+1)/2, 1.0); } chain->polysets[j]->render_surface(PolySet::COLORMODE_NONE, PolySet::csgmode_e(csgmode), m, shaderinfo); } else if (chain->types[j] == CSGTerm::TYPE_DIFFERENCE) { chain->polysets[j]->render_surface(PolySet::COLORMODE_CUTOUT, PolySet::csgmode_e(csgmode), m, shaderinfo); } else { chain->polysets[j]->render_surface(PolySet::COLORMODE_MATERIAL, PolySet::csgmode_e(csgmode), m, shaderinfo); } glPopMatrix(); } if (shaderinfo) glUseProgram(0); for (unsigned int k = 0; k < primitives.size(); k++) { delete primitives[k]; } glDepthFunc(GL_LEQUAL); primitives.clear(); } if (last) break; OpenCSGPrim *prim = new OpenCSGPrim(chain->types[i] == CSGTerm::TYPE_DIFFERENCE ? OpenCSG::Subtraction : OpenCSG::Intersection, chain->polysets[i]->convexity); prim->p = chain->polysets[i]; prim->m = chain->matrices[i]; prim->csgmode = chain->types[i] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL; if (highlight) prim->csgmode += 20; else if (background) prim->csgmode += 10; primitives.push_back(prim); } } openscad-2019.05/src/render.cc0000644000076500000240000000457213414441003016456 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "rendernode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "builtin.h" #include "polyset.h" #include #include using namespace boost::assign; // bring 'operator+=()' into scope class RenderModule : public AbstractModule { public: RenderModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *RenderModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new RenderNode(inst); AssignmentList args{Assignment("convexity")}; Context c(ctx); c.setVariables(evalctx, args); inst->scope.apply(*evalctx); auto v = c.lookup_variable("convexity"); if (v->type() == Value::ValueType::NUMBER) { node->convexity = static_cast(v->toDouble()); } auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string RenderNode::toString() const { return STR(this->name() << "(convexity = " << convexity << ")"); } void register_builtin_render() { Builtins::init("render", new RenderModule()); } openscad-2019.05/src/renderer.cc0000644000076500000240000001036113402025764017007 0ustar kintelstaff00000000000000#include "renderer.h" #include "rendersettings.h" #include "Geometry.h" #include "polyset.h" #include "Polygon2d.h" #include "colormap.h" #include "printutils.h" bool Renderer::getColor(Renderer::ColorMode colormode, Color4f &col) const { if (colormode==ColorMode::NONE) return false; if (colormap.count(colormode) > 0) { col = colormap.at(colormode); return true; } return false; } Renderer::csgmode_e Renderer::get_csgmode(const bool highlight_mode, const bool background_mode, const OpenSCADOperator type) { int csgmode = highlight_mode ? CSGMODE_HIGHLIGHT : (background_mode ? CSGMODE_BACKGROUND : CSGMODE_NORMAL); if (type == OpenSCADOperator::DIFFERENCE) csgmode |= CSGMODE_DIFFERENCE_FLAG; return csgmode_e(csgmode); } Renderer::Renderer() : colorscheme(nullptr) { PRINTD("Renderer() start"); // Setup default colors // The main colors, MATERIAL and CUTOUT, come from this object's // colorscheme. Colorschemes don't currently hold information // for Highlight/Background colors // but it wouldn't be too hard to make them do so. // MATERIAL is set by this object's colorscheme // CUTOUT is set by this object's colorscheme colormap[ColorMode::HIGHLIGHT] = {255, 81, 81, 128}; colormap[ColorMode::BACKGROUND] = {180, 180, 180, 128}; // MATERIAL_EDGES is set by this object's colorscheme // CUTOUT_EDGES is set by this object's colorscheme colormap[ColorMode::HIGHLIGHT_EDGES] = {255, 171, 86, 128}; colormap[ColorMode::BACKGROUND_EDGES] = {150, 150, 150, 128}; setColorScheme(ColorMap::inst()->defaultColorScheme()); PRINTD("Renderer() end"); } void Renderer::setColor(const float color[4], GLint *shaderinfo) const { PRINTD("setColor a"); Color4f col; getColor(ColorMode::MATERIAL,col); float c[4] = {color[0], color[1], color[2], color[3]}; if (c[0] < 0) c[0] = col[0]; if (c[1] < 0) c[1] = col[1]; if (c[2] < 0) c[2] = col[2]; if (c[3] < 0) c[3] = col[3]; glColor4fv(c); #ifdef ENABLE_OPENCSG if (shaderinfo) { glUniform4f(shaderinfo[1], c[0], c[1], c[2], c[3]); glUniform4f(shaderinfo[2], (c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0); } #endif } // returns the color which has been set, which may differ from the color input parameter Color4f Renderer::setColor(ColorMode colormode, const float color[4], GLint *shaderinfo) const { PRINTD("setColor b"); Color4f basecol; if (getColor(colormode, basecol)) { if (colormode == ColorMode::BACKGROUND) { basecol = {color[0] >= 0 ? color[0] : basecol[0], color[1] >= 0 ? color[1] : basecol[1], color[2] >= 0 ? color[2] : basecol[2], color[3] >= 0 ? color[3] : basecol[3]}; } else if (colormode != ColorMode::HIGHLIGHT) { basecol = {color[0] >= 0 ? color[0] : basecol[0], color[1] >= 0 ? color[1] : basecol[1], color[2] >= 0 ? color[2] : basecol[2], color[3] >= 0 ? color[3] : basecol[3]}; } setColor(basecol.data(), shaderinfo); } return basecol; } void Renderer::setColor(ColorMode colormode, GLint *shaderinfo) const { PRINTD("setColor c"); float c[4] = {-1,-1,-1,-1}; setColor(colormode, c, shaderinfo); } /* fill this->colormap with matching entries from the colorscheme. note this does not change Highlight or Background colors as they are not represented in the colorscheme (yet). Also edgecolors are currently the same for CGAL & OpenCSG */ void Renderer::setColorScheme(const ColorScheme &cs) { PRINTD("setColorScheme"); colormap[ColorMode::MATERIAL] = ColorMap::getColor(cs, RenderColor::OPENCSG_FACE_FRONT_COLOR); colormap[ColorMode::CUTOUT] = ColorMap::getColor(cs, RenderColor::OPENCSG_FACE_BACK_COLOR); colormap[ColorMode::MATERIAL_EDGES] = ColorMap::getColor(cs, RenderColor::CGAL_EDGE_FRONT_COLOR); colormap[ColorMode::CUTOUT_EDGES] = ColorMap::getColor(cs, RenderColor::CGAL_EDGE_BACK_COLOR); colormap[ColorMode::EMPTY_SPACE] = ColorMap::getColor(cs, RenderColor::BACKGROUND_COLOR); this->colorscheme = &cs; } void Renderer::render_surface(shared_ptr geom, csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo) { auto ps = dynamic_pointer_cast(geom); if (ps) ps->render_surface(csgmode, m, shaderinfo); } void Renderer::render_edges(shared_ptr geom, csgmode_e csgmode) { auto ps = dynamic_pointer_cast(geom); if (ps) ps->render_edges(csgmode); } openscad-2019.05/src/renderer.h0000644000076500000240000000341013402025764016646 0ustar kintelstaff00000000000000#pragma once #include "system-gl.h" #include "linalg.h" #include "memory.h" #include "colormap.h" #include "enums.h" #ifdef _MSC_VER // NULL #include #endif class Renderer { public: Renderer(); virtual ~Renderer() {} virtual void draw(bool showfaces, bool showedges) const = 0; virtual BoundingBox getBoundingBox() const = 0; #define CSGMODE_DIFFERENCE_FLAG 0x10 enum csgmode_e { CSGMODE_NONE = 0x00, CSGMODE_NORMAL = 0x01, CSGMODE_DIFFERENCE = CSGMODE_NORMAL | CSGMODE_DIFFERENCE_FLAG, CSGMODE_BACKGROUND = 0x02, CSGMODE_BACKGROUND_DIFFERENCE = CSGMODE_BACKGROUND | CSGMODE_DIFFERENCE_FLAG, CSGMODE_HIGHLIGHT = 0x03, CSGMODE_HIGHLIGHT_DIFFERENCE = CSGMODE_HIGHLIGHT | CSGMODE_DIFFERENCE_FLAG }; enum class ColorMode { NONE, MATERIAL, CUTOUT, HIGHLIGHT, BACKGROUND, MATERIAL_EDGES, CUTOUT_EDGES, HIGHLIGHT_EDGES, BACKGROUND_EDGES, EMPTY_SPACE }; virtual bool getColor(ColorMode colormode, Color4f &col) const; virtual void setColor(const float color[4], GLint *shaderinfo = nullptr) const; virtual void setColor(ColorMode colormode, GLint *shaderinfo = nullptr) const; virtual Color4f setColor(ColorMode colormode, const float color[4], GLint *shaderinfo = nullptr) const; virtual void setColorScheme(const ColorScheme &cs); static csgmode_e get_csgmode(const bool highlight_mode, const bool background_mode, const OpenSCADOperator type=OpenSCADOperator::UNION); static void render_surface(shared_ptr geom, csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo = nullptr); static void render_edges(shared_ptr geom, csgmode_e csgmode); protected: std::map colormap; const ColorScheme *colorscheme; }; openscad-2019.05/src/rendernode.h0000644000076500000240000000046613402025764017175 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include class RenderNode : public AbstractNode { public: VISITABLE(); RenderNode(const ModuleInstantiation *mi) : AbstractNode(mi), convexity(1) { } std::string toString() const override; std::string name() const override { return "render"; } int convexity; }; openscad-2019.05/src/rendersettings.cc0000644000076500000240000000060413402025764020240 0ustar kintelstaff00000000000000#include "rendersettings.h" #include "printutils.h" RenderSettings *RenderSettings::inst(bool erase) { static auto instance = new RenderSettings; if (erase) { delete instance; instance = nullptr; } return instance; } RenderSettings::RenderSettings() { openCSGTermLimit = 100000; far_gl_clip_limit = 100000.0; img_width = 512; img_height = 512; colorscheme = "Cornfield"; } openscad-2019.05/src/rendersettings.h0000644000076500000240000000050113402025764020076 0ustar kintelstaff00000000000000#pragma once #include #include "linalg.h" class RenderSettings { public: static RenderSettings *inst(bool erase = false); unsigned int openCSGTermLimit; unsigned int img_width; unsigned int img_height; double far_gl_clip_limit; std::string colorscheme; private: RenderSettings(); ~RenderSettings() {} }; openscad-2019.05/src/rotateextrude.cc0000644000076500000240000001135313432700636020103 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "rotateextrudenode.h" #include "module.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "printutils.h" #include "fileutils.h" #include "builtin.h" #include "polyset.h" #include "handle_dep.h" #include #include using namespace boost::assign; // bring 'operator+=()' into scope #include namespace fs = boost::filesystem; class RotateExtrudeModule : public AbstractModule { public: RotateExtrudeModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *RotateExtrudeModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new RotateExtrudeNode(inst); AssignmentList args{Assignment("file"), Assignment("layer"), Assignment("origin"), Assignment("scale")}; AssignmentList optargs{Assignment("convexity"), Assignment("angle")}; Context c(ctx); c.setVariables(evalctx, args, optargs); inst->scope.apply(*evalctx); node->fn = c.lookup_variable("$fn")->toDouble(); node->fs = c.lookup_variable("$fs")->toDouble(); node->fa = c.lookup_variable("$fa")->toDouble(); auto file = c.lookup_variable("file"); auto layer = c.lookup_variable("layer", true); auto convexity = c.lookup_variable("convexity", true); auto origin = c.lookup_variable("origin", true); auto scale = c.lookup_variable("scale", true); auto angle = c.lookup_variable("angle", true); if (!file->isUndefined()) { printDeprecation("Support for reading files in rotate_extrude will be removed in future releases. Use a child import() instead."); auto filename = lookup_file(file->toString(), inst->path(), c.documentPath()); node->filename = filename; handle_dep(filename); } node->layername = layer->isUndefined() ? "" : layer->toString(); node->convexity = static_cast(convexity->toDouble()); bool originOk = origin->getVec2(node->origin_x, node->origin_y); originOk &= std::isfinite(node->origin_x) && std::isfinite(node->origin_y); if(origin!=ValuePtr::undefined && !originOk){ PRINTB("WARNING: rotate_extrude(..., origin=%s) could not be converted, %s", origin->toEchoString() % evalctx->loc.toRelativeString(ctx->documentPath())); } node->scale = scale->toDouble(); node->angle = 360; angle->getFiniteDouble(node->angle); if (node->convexity <= 0) node->convexity = 2; if (node->scale <= 0) node->scale = 1; if ((node->angle <= -360) || (node->angle > 360)) node->angle = 360; if (node->filename.empty()) { auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); } return node; } std::string RotateExtrudeNode::toString() const { std::ostringstream stream; stream << this->name() << "("; if (!this->filename.empty()) { // Ignore deprecated parameters if empty fs::path path((std::string)this->filename); stream << "file = " << this->filename << ", " "layer = " << QuotedString(this->layername) << ", " "origin = [" << std::dec << this->origin_x << ", " << this->origin_y << "], " "scale = " << this->scale << ", " << "timestamp = " << (fs::exists(path) ? fs::last_write_time(path) : 0) << ", " ; } stream << "angle = " << this->angle << ", " "convexity = " << this->convexity << ", " "$fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ")"; return stream.str(); } void register_builtin_dxf_rotate_extrude() { Builtins::init("dxf_rotate_extrude", new RotateExtrudeModule()); Builtins::init("rotate_extrude", new RotateExtrudeModule()); } openscad-2019.05/src/rotateextrudenode.h0000644000076500000240000000101713402025764020606 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "value.h" class RotateExtrudeNode : public AbstractPolyNode { public: VISITABLE(); RotateExtrudeNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) { convexity = 0; fn = fs = fa = 0; origin_x = origin_y = scale = 0; angle = 360; } std::string toString() const override; std::string name() const override { return "rotate_extrude"; } int convexity; double fn, fs, fa; double origin_x, origin_y, scale, angle; Filename filename; std::string layername; }; openscad-2019.05/src/scadlexer.cpp0000644000076500000240000000320213432700636017345 0ustar kintelstaff00000000000000#include #include "scadlexer.h" ScadLexer::ScadLexer(QObject *parent) : QsciLexerCPP(parent) { // -> Style: Keyword (lexer.l) keywordSet[0] = "if else let for each module function true false undef " "include use assert"; // -> Style: KeywordSet2 (func.cc) keywordSet[1] = "abs sign rands min max sin cos asin acos tan atan atan2 " "round ceil floor pow sqrt exp len log ln str chr ord concat " "is_undef is_list is_num is_bool is_string " "lookup search version version_num norm cross parent_module " "dxf_dim dxf_cross"; // -> used in comments only like /*! \cube */ keywordSet[2] = "struct union enum fn var def typedef file namespace package " "interface param see return class brief"; // -> Style: GlobalClass keywordSet[3] = "cube sphere cylinder polyhedron square circle polygon text " "minkowski hull resize child children echo union difference " "intersection linear_extrude rotate_extrude import group " "projection render surface scale rotate mirror translate " "multmatrix color offset intersection_for "; setFoldComments(true); setFoldAtElse(true); } ScadLexer::~ScadLexer() { } const char *ScadLexer::language() const { return "SCAD"; } void ScadLexer::setKeywords(int set, const std::string& keywords) { if ((set < 1) || (set > 4)) { return; } std::string trimmedKeywords(keywords); boost::algorithm::trim(trimmedKeywords); if (trimmedKeywords.empty()) { return; } keywordSet[set - 1] = trimmedKeywords; } const char *ScadLexer::keywords(int set) const { if ((set < 1) || (set > 4)) { return nullptr; } return keywordSet[set - 1].c_str(); } openscad-2019.05/src/scadlexer.h0000644000076500000240000000071413402025764017016 0ustar kintelstaff00000000000000#pragma once #include #include #include class ScadLexer : public QsciLexerCPP { public: ScadLexer(QObject *parent); ~ScadLexer(); const char *language() const override; const char *keywords(int set) const override; void setKeywords(int set, const std::string& keywords); private: std::string keywordSet[4]; ScadLexer(const ScadLexer &); ScadLexer &operator=(const ScadLexer &); }; openscad-2019.05/src/scintillaeditor.cpp0000755000076500000240000006232713452415427020607 0ustar kintelstaff00000000000000#include #include #include #include #include "scintillaeditor.h" #include #include "Preferences.h" #include "PlatformUtils.h" #include "settings.h" #include // C alternative tokens (xor) #include namespace fs=boost::filesystem; class SettingsConverter { public: QsciScintilla::WrapMode toWrapMode(Value val); QsciScintilla::WrapVisualFlag toLineWrapVisualization(Value val); QsciScintilla::WrapIndentMode toLineWrapIndentationStyle(Value val); QsciScintilla::WhitespaceVisibility toShowWhitespaces(Value val); }; QsciScintilla::WrapMode SettingsConverter::toWrapMode(Value val) { auto strVal = val.toString(); if (strVal == "Char") { return QsciScintilla::WrapCharacter; } else if (strVal == "Word") { return QsciScintilla::WrapWord; } else { return QsciScintilla::WrapNone; } } QsciScintilla::WrapVisualFlag SettingsConverter::toLineWrapVisualization(Value val) { auto strVal = val.toString(); if (strVal == "Text") { return QsciScintilla::WrapFlagByText; } else if (strVal == "Border") { return QsciScintilla::WrapFlagByBorder; #if QSCINTILLA_VERSION >= 0x020700 } else if (strVal == "Margin") { return QsciScintilla::WrapFlagInMargin; #endif } else { return QsciScintilla::WrapFlagNone; } } QsciScintilla::WrapIndentMode SettingsConverter::toLineWrapIndentationStyle(Value val) { auto strVal = val.toString(); if (strVal == "Same") { return QsciScintilla::WrapIndentSame; } else if (strVal == "Indented") { return QsciScintilla::WrapIndentIndented; } else { return QsciScintilla::WrapIndentFixed; } } QsciScintilla::WhitespaceVisibility SettingsConverter::toShowWhitespaces(Value val) { auto strVal = val.toString(); if (strVal == "Always") { return QsciScintilla::WsVisible; } else if (strVal == "AfterIndentation") { return QsciScintilla::WsVisibleAfterIndent; } else { return QsciScintilla::WsInvisible; } } EditorColorScheme::EditorColorScheme(fs::path path) : path(path) { try { boost::property_tree::read_json(path.generic_string(), pt); _name = QString::fromStdString(pt.get("name")); _index = pt.get("index"); } catch (const std::exception & e) { PRINTB("Error reading color scheme file '%s': %s", path.generic_string() % e.what()); _name = ""; _index = 0; } } EditorColorScheme::~EditorColorScheme() { } bool EditorColorScheme::valid() const { return !_name.isEmpty(); } const QString & EditorColorScheme::name() const { return _name; } int EditorColorScheme::index() const { return _index; } const boost::property_tree::ptree & EditorColorScheme::propertyTree() const { return pt; } ScintillaEditor::ScintillaEditor(QWidget *parent) : EditorInterface(parent) { scintillaLayout = new QVBoxLayout(this); qsci = new QsciScintilla(this); // Force EOL mode to Unix, since QTextStream will manage local EOL modes. qsci->setEolMode(QsciScintilla::EolUnix); // // Remapping some scintilla key binding which conflict with OpenSCAD global // key bindings, as well as some minor scintilla bugs // QsciCommand *c; #ifdef Q_OS_MAC // Alt-Backspace should delete left word (Alt-Delete already deletes right word) c = qsci->standardCommands()->find(QsciCommand::DeleteWordLeft); c->setKey(Qt::Key_Backspace | Qt::ALT); #endif // Cmd/Ctrl-T is handled by the menu c = qsci->standardCommands()->boundTo(Qt::Key_T | Qt::CTRL); c->setKey(0); // Cmd/Ctrl-D is handled by the menu c = qsci->standardCommands()->boundTo(Qt::Key_D | Qt::CTRL); c->setKey(0); // Ctrl-Shift-Z should redo on all platforms c = qsci->standardCommands()->find(QsciCommand::Redo); c->setKey(Qt::Key_Z | Qt::CTRL | Qt::SHIFT); c->setAlternateKey(Qt::Key_Y | Qt::CTRL); scintillaLayout->setContentsMargins(0, 0, 0, 0); scintillaLayout->addWidget(qsci); qsci->indicatorDefine(QsciScintilla::RoundBoxIndicator, errorIndicatorNumber); qsci->indicatorDefine(QsciScintilla::RoundBoxIndicator , findIndicatorNumber); qsci->markerDefine(QsciScintilla::Circle, markerNumber); qsci->setUtf8(true); qsci->setFolding(QsciScintilla::BoxedTreeFoldStyle, 4); this->lexer = new ScadLexer(this); qsci->setLexer(this->lexer); initMargin(); connect(qsci, SIGNAL(textChanged()), this, SIGNAL(contentsChanged())); connect(qsci, SIGNAL(modificationChanged(bool)), this, SIGNAL(modificationChanged(bool))); qsci->installEventFilter(this); } /** * Apply the settings that are changeable in the preferences. This is also * called in the event handler from the preferences. */ void ScintillaEditor::applySettings() { SettingsConverter conv; auto s = Settings::Settings::inst(); qsci->setIndentationWidth(s->get(Settings::Settings::indentationWidth).toDouble()); qsci->setTabWidth(s->get(Settings::Settings::tabWidth).toDouble()); qsci->setWrapMode(conv.toWrapMode(s->get(Settings::Settings::lineWrap))); qsci->setWrapIndentMode(conv.toLineWrapIndentationStyle(s->get(Settings::Settings::lineWrapIndentationStyle))); qsci->setWrapVisualFlags(conv.toLineWrapVisualization(s->get(Settings::Settings::lineWrapVisualizationEnd)), conv.toLineWrapVisualization(s->get(Settings::Settings::lineWrapVisualizationBegin)), s->get(Settings::Settings::lineWrapIndentation).toDouble()); qsci->setWhitespaceVisibility(conv.toShowWhitespaces(s->get(Settings::Settings::showWhitespace))); qsci->setWhitespaceSize(s->get(Settings::Settings::showWhitespaceSize).toDouble()); qsci->setAutoIndent(s->get(Settings::Settings::autoIndent).toBool()); qsci->setBackspaceUnindents(s->get(Settings::Settings::backspaceUnindents).toBool()); auto indentStyle = s->get(Settings::Settings::indentStyle).toString(); qsci->setIndentationsUseTabs(indentStyle == "Tabs"); auto tabKeyFunction = s->get(Settings::Settings::tabKeyFunction).toString(); qsci->setTabIndents(tabKeyFunction == "Indent"); qsci->setBraceMatching(s->get(Settings::Settings::enableBraceMatching).toBool() ? QsciScintilla::SloppyBraceMatch : QsciScintilla::NoBraceMatch); qsci->setCaretLineVisible(s->get(Settings::Settings::highlightCurrentLine).toBool()); auto value = s->get(Settings::Settings::enableLineNumbers).toBool(); qsci->setMarginLineNumbers(1,value); if (!value) qsci->setMarginWidth(1,20); else qsci->setMarginWidth(1,QString(trunc(log10(qsci->lines())+4), '0')); } void ScintillaEditor::setPlainText(const QString &text) { qsci->setText(text); setContentModified(false); } QString ScintillaEditor::toPlainText() { return qsci->text(); } void ScintillaEditor::setContentModified(bool modified) { // FIXME: Due to an issue with QScintilla, we need to do this on the document itself. #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) qsci->SCN_SAVEPOINTLEFT(); #endif qsci->setModified(modified); } bool ScintillaEditor::isContentModified() { return qsci->isModified(); } void ScintillaEditor::highlightError(int error_pos) { int line, index; qsci->lineIndexFromPosition(error_pos, &line, &index); qsci->fillIndicatorRange(line, index, line, index + 1, errorIndicatorNumber); qsci->markerAdd(line, markerNumber); } void ScintillaEditor::unhighlightLastError() { auto totalLength = qsci->text().length(); int line, index; qsci->lineIndexFromPosition(totalLength, &line, &index); qsci->clearIndicatorRange(0, 0, line, index, errorIndicatorNumber); qsci->markerDeleteAll(markerNumber); } QColor ScintillaEditor::readColor(const boost::property_tree::ptree &pt, const std::string name, const QColor defaultColor) { try { const auto val = pt.get(name); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) if ((val.length() == 9) && (val.at(0) == '#')) { const auto rgb = std::string("#") + val.substr(3); QColor qcol(rgb.c_str()); auto alpha = std::strtoul(val.substr(1, 2).c_str(), 0, 16); qcol.setAlpha(alpha); return qcol; } #endif return QColor(val.c_str()); } catch (const std::exception &e) { return defaultColor; } } std::string ScintillaEditor::readString(const boost::property_tree::ptree &pt, const std::string name, const std::string defaultValue) { try { const auto val = pt.get(name); return val; } catch (const std::exception &e) { return defaultValue; } } int ScintillaEditor::readInt(const boost::property_tree::ptree &pt, const std::string name, const int defaultValue) { try { const auto val = pt.get(name); return val; } catch (const std::exception &e) { return defaultValue; } } void ScintillaEditor::setColormap(const EditorColorScheme *colorScheme) { const auto & pt = colorScheme->propertyTree(); try { auto font = this->lexer->font(this->lexer->defaultStyle()); const QColor textColor(pt.get("text").c_str()); const QColor paperColor(pt.get("paper").c_str()); auto *newLexer = new ScadLexer(this); // Keywords must be set before the lexer is attached to QScintilla // as they seem to be read and cached at attach time. boost::optional keywords = pt.get_child_optional("keywords"); if (keywords.is_initialized()) { newLexer->setKeywords(1, readString(keywords.get(), "keyword-set1", "")); newLexer->setKeywords(2, readString(keywords.get(), "keyword-set2", "")); newLexer->setKeywords(3, readString(keywords.get(), "keyword-set-doc", "")); newLexer->setKeywords(4, readString(keywords.get(), "keyword-set3", "")); } qsci->setLexer(newLexer); delete this->lexer; this->lexer = newLexer; // All other properties must be set after attaching to QSCintilla so // the editor gets the change events and updates itself to match newLexer->setFont(font); newLexer->setColor(textColor); newLexer->setPaper(paperColor); // Somehow, the margin font got lost when we deleted the old lexer qsci->setMarginsFont(font); const auto& colors = pt.get_child("colors"); newLexer->setColor(readColor(colors, "keyword1", textColor), QsciLexerCPP::Keyword); newLexer->setColor(readColor(colors, "keyword2", textColor), QsciLexerCPP::KeywordSet2); newLexer->setColor(readColor(colors, "keyword3", textColor), QsciLexerCPP::GlobalClass); newLexer->setColor(readColor(colors, "number", textColor), QsciLexerCPP::Number); //newLexer->setColor(readColor(colors, "string", textColor), QsciLexerCPP::SingleQuotedString); //currently, we do not support SingleQuotedStrings newLexer->setColor(readColor(colors, "string", textColor), QsciLexerCPP::DoubleQuotedString); newLexer->setColor(readColor(colors, "operator", textColor), QsciLexerCPP::Operator); newLexer->setColor(readColor(colors, "comment", textColor), QsciLexerCPP::Comment); newLexer->setColor(readColor(colors, "commentline", textColor), QsciLexerCPP::CommentLine); newLexer->setColor(readColor(colors, "commentdoc", textColor), QsciLexerCPP::CommentDoc); newLexer->setColor(readColor(colors, "commentdoc", textColor), QsciLexerCPP::CommentLineDoc); newLexer->setColor(readColor(colors, "commentdockeyword", textColor), QsciLexerCPP::CommentDocKeyword); const auto& caret = pt.get_child("caret"); qsci->setCaretWidth(readInt(caret, "width", 1)); qsci->setCaretForegroundColor(readColor(caret, "foreground", textColor)); qsci->setCaretLineBackgroundColor(readColor(caret, "line-background", paperColor)); qsci->setMarkerBackgroundColor(readColor(colors, "error-marker", QColor(255, 0, 0, 100)), markerNumber); qsci->setIndicatorForegroundColor(readColor(colors, "error-indicator", QColor(255, 0, 0, 100)), errorIndicatorNumber);//red qsci->setIndicatorOutlineColor(readColor(colors, "error-indicator-outline", QColor(255, 0, 0, 100)), errorIndicatorNumber);//red qsci->setIndicatorForegroundColor(readColor(colors, "find-indicator", QColor(255, 255, 0, 100)), findIndicatorNumber);//yellow qsci->setIndicatorOutlineColor(readColor(colors, "find-indicator-outline", QColor(255, 255, 0, 100)), findIndicatorNumber);//yellow qsci->setWhitespaceForegroundColor(readColor(colors, "whitespace-foreground", textColor)); qsci->setMarginsBackgroundColor(readColor(colors, "margin-background", paperColor)); qsci->setMarginsForegroundColor(readColor(colors, "margin-foreground", textColor)); qsci->setFoldMarginColors(readColor(colors, "margin-background", paperColor), readColor(colors, "margin-background", paperColor)); qsci->setMatchedBraceBackgroundColor(readColor(colors, "matched-brace-background", paperColor)); qsci->setMatchedBraceForegroundColor(readColor(colors, "matched-brace-foreground", textColor)); qsci->setUnmatchedBraceBackgroundColor(readColor(colors, "unmatched-brace-background", paperColor)); qsci->setUnmatchedBraceForegroundColor(readColor(colors, "unmatched-brace-foreground", textColor)); qsci->setSelectionForegroundColor(readColor(colors, "selection-foreground", paperColor)); qsci->setSelectionBackgroundColor(readColor(colors, "selection-background", textColor)); qsci->setEdgeColor(readColor(colors, "edge", textColor)); } catch (const std::exception &e) { noColor(); } } void ScintillaEditor::noColor() { this->lexer->setPaper(Qt::white); this->lexer->setColor(Qt::black); qsci->setCaretWidth(2); qsci->setCaretForegroundColor(Qt::black); qsci->setMarkerBackgroundColor(QColor(255, 0, 0, 100), markerNumber); qsci->setIndicatorForegroundColor(QColor(255, 0, 0, 128), errorIndicatorNumber);//red qsci->setIndicatorOutlineColor(QColor(0, 0, 0, 255), errorIndicatorNumber); // only alpha part is used qsci->setIndicatorForegroundColor(QColor(255, 255, 0, 128), findIndicatorNumber);//yellow qsci->setIndicatorOutlineColor(QColor(0, 0, 0, 255), findIndicatorNumber); // only alpha part is used qsci->setCaretLineBackgroundColor(Qt::white); qsci->setWhitespaceForegroundColor(Qt::black); qsci->setSelectionForegroundColor(Qt::black); qsci->setSelectionBackgroundColor(QColor("LightSkyBlue")); qsci->setMatchedBraceBackgroundColor(QColor("LightBlue")); qsci->setMatchedBraceForegroundColor(Qt::black); qsci->setUnmatchedBraceBackgroundColor(QColor("pink")); qsci->setUnmatchedBraceForegroundColor(Qt::black); qsci->setMarginsBackgroundColor(QColor("whiteSmoke")); qsci->setMarginsForegroundColor(QColor("gray")); qsci->setFoldMarginColors(QColor("whiteSmoke"), QColor("whiteSmoke")); qsci->setEdgeColor(Qt::black); } void ScintillaEditor::enumerateColorSchemesInPath(ScintillaEditor::colorscheme_set_t &result_set, const fs::path path) { const auto color_schemes = path / "color-schemes" / "editor"; if (fs::exists(color_schemes) && fs::is_directory(color_schemes)) { for (const auto& dirEntry : boost::make_iterator_range(fs::directory_iterator{color_schemes}, {})) { if (!fs::is_regular_file(dirEntry.status())) continue; const auto &path = dirEntry.path(); if (!(path.extension() == ".json")) continue; auto colorScheme = std::make_shared(path); if (colorScheme->valid()) { result_set.emplace(colorScheme->index(), colorScheme); } } } } ScintillaEditor::colorscheme_set_t ScintillaEditor::enumerateColorSchemes() { colorscheme_set_t result_set; enumerateColorSchemesInPath(result_set, PlatformUtils::resourceBasePath()); enumerateColorSchemesInPath(result_set, PlatformUtils::userConfigPath()); return result_set; } QStringList ScintillaEditor::colorSchemes() { QStringList colorSchemes; for (const auto &colorSchemeEntry : enumerateColorSchemes()) { colorSchemes << colorSchemeEntry.second.get()->name(); } colorSchemes << "Off"; return colorSchemes; } bool ScintillaEditor::canUndo() { return qsci->isUndoAvailable(); } void ScintillaEditor::setHighlightScheme(const QString &name) { for (const auto &colorSchemeEntry : enumerateColorSchemes()) { const auto colorScheme = colorSchemeEntry.second.get(); if (colorScheme->name() == name) { setColormap(colorScheme); return; } } noColor(); } void ScintillaEditor::insert(const QString &text) { qsci->insert(text); } void ScintillaEditor::setText(const QString &text) { qsci->selectAll(true); qsci->replaceSelectedText(text); } void ScintillaEditor::undo() { qsci->undo(); } void ScintillaEditor::redo() { qsci->redo(); } void ScintillaEditor::cut() { qsci->cut(); } void ScintillaEditor::copy() { qsci->copy(); } void ScintillaEditor::paste() { qsci->paste(); } void ScintillaEditor::zoomIn() { qsci->zoomIn(); } void ScintillaEditor::zoomOut() { qsci->zoomOut(); } void ScintillaEditor::initFont(const QString& fontName, uint size) { this->currentFont = QFont(fontName, size); this->currentFont.setFixedPitch(true); this->lexer->setFont(this->currentFont); qsci->setMarginsFont(this->currentFont); onTextChanged(); // Update margin width } void ScintillaEditor::initMargin() { qsci->setMarginLineNumbers(1, true); connect(qsci, SIGNAL(textChanged()), this, SLOT(onTextChanged())); } void ScintillaEditor::onTextChanged() { auto s = Settings::Settings::inst(); QFontMetrics fontmetrics(this->currentFont); auto enableLineNumbers = s->get(Settings::Settings::enableLineNumbers).toBool(); if (!enableLineNumbers) qsci->setMarginWidth(1, 20); else qsci->setMarginWidth(1, QString(trunc(log10(qsci->lines()) + 4), '0')); } int ScintillaEditor::updateFindIndicators(const QString &findText, bool visibility) { int findwordcount{0}; auto txt = qsci->text(); qsci->SendScintilla(qsci->SCI_INDICATORCLEARRANGE, 0, txt.length()); auto pos = txt.indexOf(findText); auto len = findText.length(); if (visibility && len>0) { while (pos!=-1){ findwordcount++; qsci->SendScintilla(qsci->SCI_SETINDICATORCURRENT, findIndicatorNumber); qsci->SendScintilla(qsci->SCI_INDICATORFILLRANGE, pos, len); pos = txt.indexOf(findText,pos+len); }; } //qsci->findFirst(findText, false, false, false, true, true, savelineFrom, saveindexFrom); return findwordcount; } bool ScintillaEditor::find(const QString &expr, bool findNext, bool findBackwards) { int startline = -1, startindex = -1; // If findNext, start from the end of the current selection if (qsci->hasSelectedText()) { int lineFrom, indexFrom, lineTo, indexTo; qsci->getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo); startline = !(findBackwards xor findNext) ? std::min(lineFrom, lineTo) : std::max(lineFrom, lineTo); startindex = !(findBackwards xor findNext) ? std::min(indexFrom, indexTo) : std::max(indexFrom, indexTo); } return qsci->findFirst(expr, false, false, false, true, !findBackwards, startline, startindex); } void ScintillaEditor::replaceSelectedText(const QString &newText) { if ((qsci->selectedText() != newText)&&(qsci->hasSelectedText())) qsci->replaceSelectedText(newText); } void ScintillaEditor::replaceAll(const QString &findText, const QString &replaceText) { // We need to issue a Select All first due to a bug in QScintilla: // It doesn't update the find range when just doing findFirst() + findNext() causing the search // to end prematurely if the replaced string is larger than the selected string. #if QSCINTILLA_VERSION >= 0x020903 // QScintilla bug seams to be fixed in 2.9.3 if (qsci->findFirst(findText, false /*re*/, false /*cs*/, false /*wo*/, false /*wrap*/, true /*forward*/, 0, 0)) { #elif QSCINTILLA_VERSION >= 0x020700 qsci->selectAll(); if (qsci->findFirstInSelection(findText, false /*re*/, false /*cs*/, false /*wo*/, false /*wrap*/, true /*forward*/)) { #else // findFirstInSelection() was introduced in QScintilla 2.7 if (qsci->findFirst(findText, false /*re*/, false /*cs*/, false /*wo*/, false /*wrap*/, true /*forward*/, 0, 0)) { #endif qsci->replace(replaceText); while (qsci->findNext()) { qsci->replace(replaceText); } } } void ScintillaEditor::getRange(int *lineFrom, int *lineTo) { int indexFrom, indexTo; if (qsci->hasSelectedText()) { qsci->getSelection(lineFrom, &indexFrom, lineTo, &indexTo); if (indexTo == 0) { *lineTo = *lineTo - 1; } } else { qsci->getCursorPosition(lineFrom, &indexFrom); *lineTo = *lineFrom; } } void ScintillaEditor::indentSelection() { int lineFrom, lineTo; getRange(&lineFrom, &lineTo); for (int line = lineFrom; line <= lineTo; line++) { qsci->indent(line); } } void ScintillaEditor::unindentSelection() { int lineFrom, lineTo; getRange(&lineFrom, &lineTo); for (int line = lineFrom; line <= lineTo; line++) { qsci->unindent(line); } } void ScintillaEditor::commentSelection() { auto hasSelection = qsci->hasSelectedText(); int lineFrom, lineTo; getRange(&lineFrom, &lineTo); for (int line = lineFrom; line <= lineTo; line++) { qsci->insertAt("//", line, 0); } if (hasSelection) { qsci->setSelection(lineFrom, 0, lineTo, std::max(0, qsci->lineLength(lineTo) - 1)); } } void ScintillaEditor::uncommentSelection() { auto hasSelection = qsci->hasSelectedText(); int lineFrom, lineTo; getRange(&lineFrom, &lineTo); for (int line = lineFrom; line <= lineTo; line++) { QString lineText = qsci->text(line); if (lineText.startsWith("//")) { qsci->setSelection(line, 0, line, 2); qsci->removeSelectedText(); } } if (hasSelection) { qsci->setSelection(lineFrom, 0, lineTo, std::max(0, qsci->lineLength(lineTo) - 1)); } } QString ScintillaEditor::selectedText() { return qsci->selectedText(); } bool ScintillaEditor::eventFilter(QObject* obj, QEvent *e) { static bool wasChanged=false; static bool previewAfterUndo=false; if (obj != qsci) return EditorInterface::eventFilter(obj, e); if (e->type()==QEvent::KeyPress || e->type()==QEvent::KeyRelease) { auto *ke = static_cast(e); #ifdef Q_OS_MAC int navigateOnNumberModifiers = Qt::AltModifier | Qt::ShiftModifier | Qt :: KeypadModifier; #else int navigateOnNumberModifiers = Qt::AltModifier; #endif if (ke->modifiers() == navigateOnNumberModifiers) { switch (ke->key()) { case Qt::Key_Left: case Qt::Key_Right: if (e->type()==QEvent::KeyPress) { navigateOnNumber(ke->key()); } return true; case Qt::Key_Up: case Qt::Key_Down: if (e->type()==QEvent::KeyPress) { if (!wasChanged) qsci->beginUndoAction(); if (modifyNumber(ke->key())) { wasChanged=true; previewAfterUndo=true; } if (!wasChanged) qsci->endUndoAction(); } return true; } } if (previewAfterUndo && e->type()==QEvent::KeyPress) { int k=ke->key() | ke->modifiers(); if (wasChanged) qsci->endUndoAction(); wasChanged=false; auto *cmd=qsci->standardCommands()->boundTo(k); if ( cmd && ( cmd->command()==QsciCommand::Undo || cmd->command()==QsciCommand::Redo ) ) QTimer::singleShot(0,this,SIGNAL(previewRequest())); else if ( cmd || !ke->text().isEmpty() ) { // any insert or command (but not undo/redo) cancels the preview after undo previewAfterUndo=false; } } } return false; } void ScintillaEditor::navigateOnNumber(int key) { int line, index; qsci->getCursorPosition(&line, &index); auto text=qsci->text(line); auto left=text.left(index); auto dotOnLeft=left.contains(QRegExp("\\.\\d*$")); auto dotJustLeft=index>1 && text[index-2]=='.'; auto dotJustRight=text[index]=='.'; auto numOnLeft=left.contains(QRegExp("\\d\\.?$")) || left.endsWith("-."); auto numOnRight=text.indexOf(QRegExp("\\.?\\d"),index)==index; switch (key) { case Qt::Key_Left: if (numOnLeft) qsci->setCursorPosition(line, index-(dotJustLeft?2:1)); break; case Qt::Key_Right: if (numOnRight) qsci->setCursorPosition(line, index+(dotJustRight?2:1)); else if (numOnLeft) { // add trailing zero if (!dotOnLeft) { qsci->insert(".0"); index++; } else { qsci->insert("0"); } qsci->setCursorPosition(line, index+1); } break; } } bool ScintillaEditor::modifyNumber(int key) { int line, index; qsci->getCursorPosition(&line, &index); auto text=qsci->text(line); int lineFrom, indexFrom, lineTo, indexTo; qsci->getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo); auto hadSelection=qsci->hasSelectedText(); auto begin=QRegExp("[-+]?\\d*\\.?\\d*$").indexIn(text.left(index)); auto end=text.indexOf(QRegExp("[^0-9.]"),index); if (end<0) end=text.length(); auto nr=text.mid(begin,end-begin); if ( !(nr.contains(QRegExp("^[-+]?\\d*\\.?\\d*$")) && nr.contains(QRegExp("\\d"))) ) return false; auto sign=nr[0]=='+'||nr[0]=='-'; if (nr.endsWith('.')) nr=nr.left(nr.length()-1); auto curpos=index-begin; auto dotpos=nr.indexOf('.'); auto decimals=dotpos<0?0:nr.length()-dotpos-1; auto number=(dotpos<0)?nr.toLongLong():(nr.left(dotpos)+nr.mid(dotpos+1)).toLongLong(); auto tail=nr.length()-curpos; auto exponent=tail-((dotpos>=curpos)?1:0); long long int step=1; for (int i=exponent; i>0; i--) step*=10; switch (key) { case Qt::Key_Up: number+=step; break; case Qt::Key_Down: number-=step; break; } auto negative=number<0; if (negative) number=-number; auto newnr=QString::number(number); if (decimals) { if (newnr.length()<=decimals) newnr.prepend(QString(decimals-newnr.length()+1,'0')); newnr=newnr.left(newnr.length()-decimals)+"."+newnr.right(decimals); } if (tail>newnr.length()) { newnr.prepend(QString(tail-newnr.length(),'0')); } if (negative) newnr.prepend('-'); else if (sign) newnr.prepend('+'); qsci->setSelection(line, begin, line, end); qsci->replaceSelectedText(newnr); qsci->selectAll(false); if (hadSelection) { qsci->setSelection(lineFrom, indexFrom, lineTo, indexTo); } qsci->setCursorPosition(line, begin+newnr.length()-tail); emit previewRequest(); return true; } openscad-2019.05/src/scintillaeditor.h0000644000076500000240000000645513402025764020245 0ustar kintelstaff00000000000000#pragma once #include #include #include #include #include #include #include #include "editor.h" #include "scadlexer.h" #include "parsersettings.h" #include "memory.h" #include #include class EditorColorScheme { private: const fs::path path; boost::property_tree::ptree pt; QString _name; int _index; public: EditorColorScheme(const fs::path path); virtual ~EditorColorScheme(); const QString & name() const; int index() const; bool valid() const; const boost::property_tree::ptree & propertyTree() const; }; class ScintillaEditor : public EditorInterface { Q_OBJECT; using colorscheme_set_t = std::multimap, std::less>; public: ScintillaEditor(QWidget *parent); ~ScintillaEditor() {} QsciScintilla *qsci; QString toPlainText() override; void initMargin(); void initLexer(); QString selectedText() override; int updateFindIndicators(const QString &findText, bool visibility = true) override; bool find(const QString &, bool findNext = false, bool findBackwards = false) override; void replaceSelectedText(const QString&) override; void replaceAll(const QString &findText, const QString &replaceText) override; QStringList colorSchemes() override; bool canUndo() override; private: void getRange(int *lineFrom, int *lineTo); void setColormap(const EditorColorScheme *colorScheme); int readInt(const boost::property_tree::ptree &pt, const std::string name, const int defaultValue); std::string readString(const boost::property_tree::ptree &pt, const std::string name, const std::string defaultValue); QColor readColor(const boost::property_tree::ptree &pt, const std::string name, const QColor defaultColor); void enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path path); colorscheme_set_t enumerateColorSchemes(); bool eventFilter(QObject* obj, QEvent *event) override; void navigateOnNumber(int key); bool modifyNumber(int key); void noColor(); signals: void previewRequest(void); public slots: void zoomIn() override; void zoomOut() override; void setPlainText(const QString&) override; void setContentModified(bool) override; bool isContentModified() override; void highlightError(int) override; void unhighlightLastError() override; void setHighlightScheme(const QString&) override; void indentSelection() override; void unindentSelection() override; void commentSelection() override; void uncommentSelection() override; void insert(const QString&) override; void setText(const QString&) override; void undo() override; void redo() override; void cut() override; void copy() override; void paste() override; void initFont(const QString&, uint) override; private slots: void onTextChanged(); void applySettings(); private: QVBoxLayout *scintillaLayout; static const int errorIndicatorNumber = 8; // first 8 are used by lexers static const int findIndicatorNumber = 9; static const int markerNumber = 2; ScadLexer *lexer; QFont currentFont; }; openscad-2019.05/src/settings.cc0000644000076500000240000003201713434420302017033 0ustar kintelstaff00000000000000#include "settings.h" #include "printutils.h" #include "input/InputEventMapper.h" #include using namespace boost::assign; // bring 'operator+=()' into scope namespace Settings { static std::list entries; SettingsEntry::SettingsEntry(const std::string category, const std::string name, const Value range, const Value def) : _category(category), _name(name), _value(def), _range(range), _default(def) { entries.push_back(this); } SettingsEntry::~SettingsEntry() { } const std::string & SettingsEntry::category() const { return _category; } const std::string & SettingsEntry::name() const { return _name; } const Value & SettingsEntry::defaultValue() const { return _default; } const Value & SettingsEntry::range() const { return _range; } bool SettingsEntry::is_default() const { return _value == _default; } static Value value(std::string s1, std::string s2) { Value::VectorType v; v += ValuePtr(s1), ValuePtr(s2); return v; } static Value values(std::string s1, std::string s1disp, std::string s2, std::string s2disp) { Value::VectorType v; v += ValuePtr(value(s1, s1disp)), ValuePtr(value(s2, s2disp)); return v; } static Value values(std::string s1, std::string s1disp, std::string s2, std::string s2disp, std::string s3, std::string s3disp) { Value::VectorType v; v += ValuePtr(value(s1, s1disp)), ValuePtr(value(s2, s2disp)), ValuePtr(value(s3, s3disp)); return v; } static Value values(std::string s1, std::string s1disp, std::string s2, std::string s2disp, std::string s3, std::string s3disp, std::string s4, std::string s4disp) { Value::VectorType v; v += ValuePtr(value(s1, s1disp)), ValuePtr(value(s2, s2disp)), ValuePtr(value(s3, s3disp)), ValuePtr(value(s4, s4disp)); return v; } static Value axisValues() { Value::VectorType v; v += ValuePtr(value("None", _("None"))); for (int i = 0; i < InputEventMapper::getMaxAxis(); i++ ){ auto userData = (boost::format("+%d") % (i+1)).str(); auto text = (boost::format(_("Axis %d")) % i).str(); v += ValuePtr(value(userData, text)); userData = (boost::format("-%d") % (i+1)).str(); text = (boost::format(_("Axis %d (inverted)")) % i).str(); v += ValuePtr(value(userData, text)); } return v; } static Value buttonValues() { Value::VectorType v; v += ValuePtr(value("None", _("None"))); v += ValuePtr(value("viewActionTogglePerspective", _("Toggle Perspective"))); return v; } Settings *Settings::inst(bool erase) { static Settings *instance = new Settings; if (erase) { delete instance; instance = nullptr; } return instance; } Settings::Settings() { } Settings::~Settings() { } void Settings::visit(SettingsVisitor& visitor) { for (SettingsEntry* entry : entries) { visitor.handle(*entry); } } SettingsEntry* Settings::getSettingEntryByName(const std::string &name) { for (auto entry : entries) { if (entry->name() == name){ return (entry); } } return nullptr; } const Value &Settings::defaultValue(const SettingsEntry& entry) const { return entry._default; } const Value &Settings::get(const SettingsEntry& entry) const { return entry._value; } void Settings::set(SettingsEntry& entry, const Value &val) { entry._value = val; } SettingsVisitor::SettingsVisitor() { } SettingsVisitor::~SettingsVisitor() { } /* * Supported settings entry types are: bool / int / double and string selection * * String selection is used to handle comboboxes and has two values * per config selection. The first value is used internally for both * finding the combobox selection and for storing the value in the * external settings file. The second value is the display value that * can be translated. */ SettingsEntry Settings::showWarningsIn3dView("3dview", "showWarningsIn3dView", Value(true), Value(true)); SettingsEntry Settings::mouseCentricZoom("3dview", "mouseCentricZoom", Value(true), Value(true)); SettingsEntry Settings::indentationWidth("editor", "indentationWidth", Value(RangeType(1, 16)), Value(4)); SettingsEntry Settings::tabWidth("editor", "tabWidth", Value(RangeType(1, 16)), Value(4)); SettingsEntry Settings::lineWrap("editor", "lineWrap", values("None", _("None"), "Char", _("Wrap at character boundaries"), "Word", _("Wrap at word boundaries")), Value("Word")); SettingsEntry Settings::lineWrapIndentationStyle("editor", "lineWrapIndentationStyle", values("Fixed", _("Fixed"), "Same", _("Same"), "Indented", _("Indented")), Value("Fixed")); SettingsEntry Settings::lineWrapIndentation("editor", "lineWrapIndentation", Value(RangeType(0, 999)), Value(4)); SettingsEntry Settings::lineWrapVisualizationBegin("editor", "lineWrapVisualizationBegin", values("None", _("None"), "Text", _("Text"), "Border", _("Border"), "Margin", _("Margin")), Value("None")); SettingsEntry Settings::lineWrapVisualizationEnd("editor", "lineWrapVisualizationEnd", values("None", _("None"), "Text", _("Text"), "Border", _("Border"), "Margin", _("Margin")), Value("Border")); SettingsEntry Settings::showWhitespace("editor", "showWhitespaces", values("Never", _("Never"), "Always", _("Always"), "AfterIndentation", _("After indentation")), Value("Never")); SettingsEntry Settings::showWhitespaceSize("editor", "showWhitespacesSize", Value(RangeType(1, 16)), Value(2)); SettingsEntry Settings::autoIndent("editor", "autoIndent", Value(true), Value(true)); SettingsEntry Settings::backspaceUnindents("editor", "backspaceUnindents", Value(true), Value(false)); SettingsEntry Settings::indentStyle("editor", "indentStyle", values("Spaces", _("Spaces"), "Tabs", _("Tabs")), Value("Spaces")); SettingsEntry Settings::tabKeyFunction("editor", "tabKeyFunction", values("Indent", _("Indent"), "InsertTab", _("Insert Tab")), Value("Indent")); SettingsEntry Settings::highlightCurrentLine("editor", "highlightCurrentLine", Value(true), Value(true)); SettingsEntry Settings::enableBraceMatching("editor", "enableBraceMatching", Value(true), Value(true)); SettingsEntry Settings::enableLineNumbers("editor", "enableLineNumbers", Value(true), Value(true)); SettingsEntry Settings::octoPrintUrl("printing", "octoPrintUrl", Value(""), Value("")); SettingsEntry Settings::octoPrintApiKey("printing", "octoPrintApiKey", Value(""), Value("")); SettingsEntry Settings::octoPrintFileFormat("printing", "octoPrintFileFormat", values("STL", "STL", "OFF", "OFF", "AMF", "AMF", "3MF", "3MF"), Value("STL")); SettingsEntry Settings::octoPrintAction("printing", "octoPrintAction", values("upload", _("Upload only"), "slice", _("Upload & Slice"), "select", _("Upload, Slice & Select for printing"), "print", _("Upload, Slice & Start printing")), Value("upload")); SettingsEntry Settings::octoPrintSlicerEngine("printing", "octoPrintSlicerEngine", Value(""), Value("")); SettingsEntry Settings::octoPrintSlicerEngineDesc("printing", "octoPrintSlicerEngineDesc", Value(""), Value("")); SettingsEntry Settings::octoPrintSlicerProfile("printing", "octoPrintSlicerProfile", Value(""), Value("")); SettingsEntry Settings::octoPrintSlicerProfileDesc("printing", "octoPrintSlicerProfileDesc", Value(""), Value("")); SettingsEntry Settings::inputEnableDriverHIDAPI("input", "enableDriverHIDAPI", Value(true), Value(false)); SettingsEntry Settings::inputEnableDriverHIDAPILog("input", "enableDriverHIDAPILog", Value(true), Value(false)); SettingsEntry Settings::inputEnableDriverSPNAV("input", "enableDriverSPNAV", Value(true), Value(false)); SettingsEntry Settings::inputEnableDriverJOYSTICK("input", "enableDriverJOYSTICK", Value(true), Value(false)); SettingsEntry Settings::inputEnableDriverQGAMEPAD("input", "enableDriverQGAMEPAD", Value(true), Value(false)); SettingsEntry Settings::inputEnableDriverDBUS("input", "enableDriverDBUS", Value(true), Value(false)); SettingsEntry Settings::inputTranslationX("input", "translationX", axisValues(), Value("+1")); SettingsEntry Settings::inputTranslationY("input", "translationY", axisValues(), Value("-2")); SettingsEntry Settings::inputTranslationZ("input", "translationZ", axisValues(), Value("-3")); SettingsEntry Settings::inputTranslationXVPRel("input", "translationXVPRel", axisValues(), Value("")); SettingsEntry Settings::inputTranslationYVPRel("input", "translationYVPRel", axisValues(), Value("")); SettingsEntry Settings::inputTranslationZVPRel("input", "translationZVPRel", axisValues(), Value("")); SettingsEntry Settings::inputRotateX("input", "rotateX", axisValues(), Value("+4")); SettingsEntry Settings::inputRotateY("input", "rotateY", axisValues(), Value("-5")); SettingsEntry Settings::inputRotateZ("input", "rotateZ", axisValues(), Value("-6")); SettingsEntry Settings::inputRotateXVPRel("input", "rotateXVPRel", axisValues(), Value("")); SettingsEntry Settings::inputRotateYVPRel("input", "rotateYVPRel", axisValues(), Value("")); SettingsEntry Settings::inputRotateZVPRel("input", "rotateZVPRel", axisValues(), Value("")); SettingsEntry Settings::inputZoom("input", "zoom", axisValues(), Value("None")); SettingsEntry Settings::inputZoom2("input", "zoom2", axisValues(), Value("None")); SettingsEntry Settings::inputTranslationGain("input", "translationGain", Value(RangeType(0.01, 0.01, 9.99)), Value(1.00)); SettingsEntry Settings::inputTranslationVPRelGain("input", "translationVPRelGain", Value(RangeType(0.01, 0.01, 9.99)), Value(1.00)); SettingsEntry Settings::inputRotateGain("input", "rotateGain", Value(RangeType(0.01, 0.01, 9.99)), Value(1.00)); SettingsEntry Settings::inputRotateVPRelGain("input", "rotateVPRelGain", Value(RangeType(0.01, 0.01, 9.99)), Value(1.00)); SettingsEntry Settings::inputZoomGain("input", "zoomGain", Value(RangeType(0.1, 0.1, 99.9)), Value(1.00)); SettingsEntry Settings::inputButton0("input", "button0", buttonValues(), Value("None")); SettingsEntry Settings::inputButton1("input", "button1", buttonValues(), Value("viewActionResetView")); SettingsEntry Settings::inputButton2("input", "button2", buttonValues(), Value("None")); SettingsEntry Settings::inputButton3("input", "button3", buttonValues(), Value("None")); SettingsEntry Settings::inputButton4("input", "button4", buttonValues(), Value("None")); SettingsEntry Settings::inputButton5("input", "button5", buttonValues(), Value("None")); SettingsEntry Settings::inputButton6("input", "button6", buttonValues(), Value("None")); SettingsEntry Settings::inputButton7("input", "button7", buttonValues(), Value("None")); SettingsEntry Settings::inputButton8("input", "button8", buttonValues(), Value("None")); SettingsEntry Settings::inputButton9("input", "button9", buttonValues(), Value("None")); SettingsEntry Settings::inputButton10("input", "button10", buttonValues(), Value("None")); SettingsEntry Settings::inputButton11("input", "button11", buttonValues(), Value("None")); SettingsEntry Settings::inputButton12("input", "button12", buttonValues(), Value("None")); SettingsEntry Settings::inputButton13("input", "button13", buttonValues(), Value("None")); SettingsEntry Settings::inputButton14("input", "button14", buttonValues(), Value("None")); SettingsEntry Settings::inputButton15("input", "button15", buttonValues(), Value("None")); SettingsEntry Settings::axisTrim0("input", "axisTrim0", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim1("input", "axisTrim1", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim2("input", "axisTrim2", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim3("input", "axisTrim3", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim4("input", "axisTrim4", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim5("input", "axisTrim5", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim6("input", "axisTrim6", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim7("input", "axisTrim7", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim8("input", "axisTrim8", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisTrim9("input", "axisTrim9", Value(RangeType(-1.0, 0.01, 1.0)), Value(0.00)); SettingsEntry Settings::axisDeadzone0("input", "axisDeadzone0", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone1("input", "axisDeadzone1", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone2("input", "axisDeadzone2", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone3("input", "axisDeadzone3", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone4("input", "axisDeadzone4", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone5("input", "axisDeadzone5", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone6("input", "axisDeadzone6", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone7("input", "axisDeadzone7", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone8("input", "axisDeadzone8", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::axisDeadzone9("input", "axisDeadzone9", Value(RangeType(0.0, 0.01, 1.0)), Value(0.10)); SettingsEntry Settings::joystickNr("input", "joystickNr", Value(RangeType(0, 9)), Value(0)); } openscad-2019.05/src/settings.h0000644000076500000240000001145513434420302016700 0ustar kintelstaff00000000000000#pragma once #include #include #include #include "value.h" namespace Settings { class SettingsEntry { private: std::string _category; std::string _name; Value _value; Value _range; Value _default; public: const std::string & category() const; const std::string & name() const; virtual const Value & defaultValue() const; virtual const Value & range() const; virtual bool is_default() const; protected: SettingsEntry(const std::string category, const std::string name, const Value range, const Value def); virtual ~SettingsEntry(); friend class Settings; }; class Settings { public: static SettingsEntry showWarningsIn3dView; static SettingsEntry mouseCentricZoom; static SettingsEntry indentationWidth; static SettingsEntry tabWidth; static SettingsEntry lineWrap; static SettingsEntry lineWrapIndentationStyle; static SettingsEntry lineWrapIndentation; static SettingsEntry lineWrapVisualizationBegin; static SettingsEntry lineWrapVisualizationEnd; static SettingsEntry showWhitespace; static SettingsEntry showWhitespaceSize; static SettingsEntry autoIndent; static SettingsEntry backspaceUnindents; static SettingsEntry indentStyle; static SettingsEntry tabKeyFunction; static SettingsEntry highlightCurrentLine; static SettingsEntry enableBraceMatching; static SettingsEntry enableLineNumbers; static SettingsEntry octoPrintUrl; static SettingsEntry octoPrintApiKey; static SettingsEntry octoPrintFileFormat; static SettingsEntry octoPrintAction; static SettingsEntry octoPrintSlicerEngine; static SettingsEntry octoPrintSlicerEngineDesc; static SettingsEntry octoPrintSlicerProfile; static SettingsEntry octoPrintSlicerProfileDesc; static SettingsEntry inputEnableDriverHIDAPI; static SettingsEntry inputEnableDriverHIDAPILog; static SettingsEntry inputEnableDriverSPNAV; static SettingsEntry inputEnableDriverJOYSTICK; static SettingsEntry inputEnableDriverQGAMEPAD; static SettingsEntry inputEnableDriverDBUS; static SettingsEntry inputTranslationX; static SettingsEntry inputTranslationY; static SettingsEntry inputTranslationZ; static SettingsEntry inputTranslationXVPRel; static SettingsEntry inputTranslationYVPRel; static SettingsEntry inputTranslationZVPRel; static SettingsEntry inputRotateX; static SettingsEntry inputRotateY; static SettingsEntry inputRotateZ; static SettingsEntry inputRotateXVPRel; static SettingsEntry inputRotateYVPRel; static SettingsEntry inputRotateZVPRel; static SettingsEntry inputZoom; static SettingsEntry inputZoom2; static SettingsEntry inputTranslationGain; static SettingsEntry inputTranslationVPRelGain; static SettingsEntry inputRotateGain; static SettingsEntry inputRotateVPRelGain; static SettingsEntry inputZoomGain; static SettingsEntry inputButton0; static SettingsEntry inputButton1; static SettingsEntry inputButton2; static SettingsEntry inputButton3; static SettingsEntry inputButton4; static SettingsEntry inputButton5; static SettingsEntry inputButton6; static SettingsEntry inputButton7; static SettingsEntry inputButton8; static SettingsEntry inputButton9; static SettingsEntry inputButton10; static SettingsEntry inputButton11; static SettingsEntry inputButton12; static SettingsEntry inputButton13; static SettingsEntry inputButton14; static SettingsEntry inputButton15; static SettingsEntry axisTrim0; static SettingsEntry axisTrim1; static SettingsEntry axisTrim2; static SettingsEntry axisTrim3; static SettingsEntry axisTrim4; static SettingsEntry axisTrim5; static SettingsEntry axisTrim6; static SettingsEntry axisTrim7; static SettingsEntry axisTrim8; static SettingsEntry axisTrim9; static SettingsEntry axisDeadzone0; static SettingsEntry axisDeadzone1; static SettingsEntry axisDeadzone2; static SettingsEntry axisDeadzone3; static SettingsEntry axisDeadzone4; static SettingsEntry axisDeadzone5; static SettingsEntry axisDeadzone6; static SettingsEntry axisDeadzone7; static SettingsEntry axisDeadzone8; static SettingsEntry axisDeadzone9; static SettingsEntry joystickNr; static Settings *inst(bool erase = false); void visit(class SettingsVisitor& visitor); SettingsEntry* getSettingEntryByName(const std::string &name); const Value &defaultValue(const SettingsEntry& entry) const; const Value &get(const SettingsEntry& entry) const; void set(SettingsEntry& entry, const Value &val); private: Settings(); virtual ~Settings(); }; class SettingsVisitor { public: SettingsVisitor(); virtual ~SettingsVisitor(); virtual void handle(SettingsEntry& entry) const = 0; }; } openscad-2019.05/src/stackcheck.h0000644000076500000240000000072513437640540017154 0ustar kintelstaff00000000000000#pragma once #include #include "PlatformUtils.h" class StackCheck { public: static StackCheck &inst() { static StackCheck instance; return instance; } ~StackCheck() {} inline bool check() { return size() >= limit; } private: StackCheck() : limit(PlatformUtils::stackLimit()) { unsigned char c; ptr = &c; } inline unsigned long size() { unsigned char c; return std::labs(ptr - &c); } unsigned long limit; unsigned char * ptr; }; openscad-2019.05/src/state.h0000644000076500000240000000346313402025764016170 0ustar kintelstaff00000000000000#pragma once #include #include "linalg.h" #define FLAG(var, flag, on) on ? (var |= flag) : (var &= ~flag) class State { public: State(const class AbstractNode *parent) : flags(NONE), parentnode(parent), numchildren(0) { this->matrix_ = Transform3d::Identity(); this->color_.fill(-1.0f); } virtual ~State() {} void setPrefix(bool on) { FLAG(this->flags, PREFIX, on); } void setPostfix(bool on) { FLAG(this->flags, POSTFIX, on); } void setHighlight(bool on) { FLAG(this->flags, HIGHLIGHT, on); } void setBackground(bool on) { FLAG(this->flags, BACKGROUND, on); } void setNumChildren(unsigned int numc) { this->numchildren = numc; } void setParent(const AbstractNode *parent) { this->parentnode = parent; } void setMatrix(const Transform3d &m) { this->matrix_ = m; } void setColor(const Color4f &c) { this->color_ = c; } void setPreferNef(bool on) { FLAG(this->flags, PREFERNEF, on); } bool preferNef() const { return this->flags & PREFERNEF; } bool isPrefix() const { return this->flags & PREFIX; } bool isPostfix() const { return this->flags & POSTFIX; } bool isHighlight() const { return this->flags & HIGHLIGHT; } bool isBackground() const { return this->flags & BACKGROUND; } unsigned int numChildren() const { return this->numchildren; } const AbstractNode *parent() const { return this->parentnode; } const Transform3d &matrix() const { return this->matrix_; } const Color4f &color() const { return this->color_; } private: enum StateFlags { NONE = 0x00, PREFIX = 0x01, POSTFIX = 0x02, PREFERNEF = 0x04, HIGHLIGHT = 0x08, BACKGROUND = 0x10 }; unsigned int flags; const AbstractNode * parentnode; unsigned int numchildren; // Transformation matrix and color. FIXME: Generalize such state variables? Transform3d matrix_; Color4f color_; }; openscad-2019.05/src/surface.cc0000644000076500000240000002311713452415427016640 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "module.h" #include "ModuleInstantiation.h" #include "node.h" #include "polyset.h" #include "evalcontext.h" #include "builtin.h" #include "printutils.h" #include "fileutils.h" #include "handle_dep.h" #include "ext/lodepng/lodepng.h" #include #include #include #include #include #include #include #include #include #include using namespace boost::assign; // bring 'operator+=()' into scope #include namespace fs = boost::filesystem; class SurfaceModule : public AbstractModule { public: SurfaceModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; typedef std::unordered_map, double, boost::hash>> img_data_t; class SurfaceNode : public LeafNode { public: VISITABLE(); SurfaceNode(const ModuleInstantiation *mi) : LeafNode(mi), center(false), invert(false), convexity(1) { } std::string toString() const override; std::string name() const override { return "surface"; } Filename filename; bool center; bool invert; int convexity; const Geometry *createGeometry() const override; private: void convert_image(img_data_t &data, std::vector &img, unsigned int width, unsigned int height) const; bool is_png(std::vector &img) const; img_data_t read_dat(std::string filename) const; img_data_t read_png_or_dat(std::string filename) const; }; AbstractNode *SurfaceModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new SurfaceNode(inst); AssignmentList args{Assignment("file"), Assignment("center"), Assignment("convexity")}; AssignmentList optargs{Assignment("center"),Assignment("invert")}; Context c(ctx); c.setVariables(evalctx, args, optargs); auto fileval = c.lookup_variable("file"); auto filename = lookup_file(fileval->isUndefined() ? "" : fileval->toString(), inst->path(), c.documentPath()); node->filename = filename; handle_dep(fs::path(filename).generic_string()); auto center = c.lookup_variable("center", true); if (center->type() == Value::ValueType::BOOL) { node->center = center->toBool(); } auto convexity = c.lookup_variable("convexity", true); if (convexity->type() == Value::ValueType::NUMBER) { node->convexity = static_cast(convexity->toDouble()); } auto invert = c.lookup_variable("invert", true); if (invert->type() == Value::ValueType::BOOL) { node->invert = invert->toBool(); } return node; } void SurfaceNode::convert_image(img_data_t &data, std::vector &img, unsigned int width, unsigned int height) const { for (unsigned int y = 0;y < height;y++) { for (unsigned int x = 0;x < width;x++) { long idx = 4 * (y * width + x); double pixel = 0.2126 * img[idx] + 0.7152 * img[idx + 1] + 0.0722 * img[idx + 2]; double z = 100.0/255 * (invert ? 1 - pixel : pixel); data[std::make_pair(height - 1 - y, x)] = z; } } } bool SurfaceNode::is_png(std::vector &png) const { return (png.size() >= 8 && std::memcmp(png.data(), std::array({{0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}}).data(), 8) == 0); } img_data_t SurfaceNode::read_png_or_dat(std::string filename) const { img_data_t data; std::vector png; int ret_val = 0; try{ ret_val = lodepng::load_file(png, filename); }catch(std::bad_alloc &ba){ PRINTB("WARNING: bad_alloc caught for '%s'.", ba.what()); return data; } if(ret_val == 78){ PRINTB("WARNING: The file '%s' couldn't be opened.", filename); return data; } if (!is_png(png)) { png.clear(); return read_dat(filename); } unsigned int width, height; std::vector img; auto error = lodepng::decode(img, width, height, png); if (error) { PRINTB("ERROR: Can't read PNG image '%s'", filename); data.clear(); return data; } convert_image(data, img, width, height); return data; } img_data_t SurfaceNode::read_dat(std::string filename) const { img_data_t data; std::ifstream stream(filename.c_str()); if (!stream.good()) { PRINTB("WARNING: Can't open DAT file '%s'.", filename); return data; } int lines = 0, columns = 0; double min_val = 0; typedef boost::tokenizer> tokenizer; boost::char_separator sep(" \t"); while (!stream.eof()) { std::string line; while (!stream.eof() && (line.size() == 0 || line[0] == '#')) { std::getline(stream, line); boost::trim(line); } if (line.size() == 0 && stream.eof()) break; int col = 0; tokenizer tokens(line, sep); try { for(const auto &token : tokens) { auto v = boost::lexical_cast(token); data[std::make_pair(lines, col++)] = v; if (col > columns) columns = col; min_val = std::min(v-1, min_val); } } catch (const boost::bad_lexical_cast &blc) { if (!stream.eof()) { PRINTB("WARNING: Illegal value in '%s': %s", filename % blc.what()); } break; } lines++; } return data; } const Geometry *SurfaceNode::createGeometry() const { auto data = read_png_or_dat(filename); auto p = new PolySet(3); p->setConvexity(convexity); int lines = 0; int columns = 0; double min_val = 0; for (const auto &entry : data) { lines = std::max(lines, entry.first.first + 1); columns = std::max(columns, entry.first.second + 1); min_val = std::min(entry.second - 1, min_val); } double ox = center ? -(columns-1)/2.0 : 0; double oy = center ? -(lines-1)/2.0 : 0; for (int i = 1; i < lines; i++) for (int j = 1; j < columns; j++) { double v1 = data[std::make_pair(i-1, j-1)]; double v2 = data[std::make_pair(i-1, j)]; double v3 = data[std::make_pair(i, j-1)]; double v4 = data[std::make_pair(i, j)]; double vx = (v1 + v2 + v3 + v4) / 4; p->append_poly(); p->append_vertex(ox + j-1, oy + i-1, v1); p->append_vertex(ox + j, oy + i-1, v2); p->append_vertex(ox + j-0.5, oy + i-0.5, vx); p->append_poly(); p->append_vertex(ox + j, oy + i-1, v2); p->append_vertex(ox + j, oy + i, v4); p->append_vertex(ox + j-0.5, oy + i-0.5, vx); p->append_poly(); p->append_vertex(ox + j, oy + i, v4); p->append_vertex(ox + j-1, oy + i, v3); p->append_vertex(ox + j-0.5, oy + i-0.5, vx); p->append_poly(); p->append_vertex(ox + j-1, oy + i, v3); p->append_vertex(ox + j-1, oy + i-1, v1); p->append_vertex(ox + j-0.5, oy + i-0.5, vx); } for (int i = 1; i < lines; i++) { p->append_poly(); p->append_vertex(ox + 0, oy + i-1, min_val); p->append_vertex(ox + 0, oy + i-1, data[std::make_pair(i-1, 0)]); p->append_vertex(ox + 0, oy + i, data[std::make_pair(i, 0)]); p->append_vertex(ox + 0, oy + i, min_val); p->append_poly(); p->insert_vertex(ox + columns-1, oy + i-1, min_val); p->insert_vertex(ox + columns-1, oy + i-1, data[std::make_pair(i-1, columns-1)]); p->insert_vertex(ox + columns-1, oy + i, data[std::make_pair(i, columns-1)]); p->insert_vertex(ox + columns-1, oy + i, min_val); } for (int i = 1; i < columns; i++) { p->append_poly(); p->insert_vertex(ox + i-1, oy + 0, min_val); p->insert_vertex(ox + i-1, oy + 0, data[std::make_pair(0, i-1)]); p->insert_vertex(ox + i, oy + 0, data[std::make_pair(0, i)]); p->insert_vertex(ox + i, oy + 0, min_val); p->append_poly(); p->append_vertex(ox + i-1, oy + lines-1, min_val); p->append_vertex(ox + i-1, oy + lines-1, data[std::make_pair(lines-1, i-1)]); p->append_vertex(ox + i, oy + lines-1, data[std::make_pair(lines-1, i)]); p->append_vertex(ox + i, oy + lines-1, min_val); } if (columns > 1 && lines > 1) { p->append_poly(); for (int i = 0; i < columns-1; i++) p->insert_vertex(ox + i, oy + 0, min_val); for (int i = 0; i < lines-1; i++) p->insert_vertex(ox + columns-1, oy + i, min_val); for (int i = columns-1; i > 0; i--) p->insert_vertex(ox + i, oy + lines-1, min_val); for (int i = lines-1; i > 0; i--) p->insert_vertex(ox + 0, oy + i, min_val); } return p; } std::string SurfaceNode::toString() const { std::ostringstream stream; fs::path path{static_cast(this->filename)}; // gcc-4.6 stream << this->name() << "(file = " << this->filename << ", center = " << (this->center ? "true" : "false") << ", invert = " << (this->invert ? "true" : "false") << ", " "timestamp = " << (fs::exists(path) ? fs::last_write_time(path) : 0) << ")"; return stream.str(); } void register_builtin_surface() { Builtins::init("surface", new SurfaceModule()); } openscad-2019.05/src/svg.cc0000644000076500000240000003406113414457600016004 0ustar kintelstaff00000000000000#ifdef ENABLE_CGAL #include "svg.h" #include "cgalutils.h" #include #include #include namespace OpenSCAD { // SVG code // currently for debugging, not necessarily pretty or useful for users. (yet) int svg_px_width = SVG_PXW; int svg_px_height = SVG_PXH; std::string svg_header(int widthpx, int heightpx) { std::ostringstream out; out << "\n"; out << "\n"; out << "\n"; return out.str(); } std::string svg_label(std::string s) { std::ostringstream out; out << " " << s << ""; return out.str(); } std::string svg_styleblock(std::string strokewidth) { std::ostringstream out; // halfedge: f1/f0 = face mark, b1/b0 = body or hole, m1/m0 = halfedge mark out << "\ "; auto tmp = out.str(); boost::replace_all(tmp, "__STROKEW__", strokewidth); return tmp; } std::string svg_border() { std::ostringstream out; out << " \n"; out << " \n"; out << " "; return out.str(); } std::string svg_axes() { std::ostringstream out; out << " \n"; out << " \n"; out << " "; return out.str(); } CGAL_Nef_polyhedron2::Explorer::Point project_svg_3to2( CGAL_Point_3 p, CGAL_Iso_cuboid_3 bbox ) { CGAL_Kernel3::FT screenw(svg_px_width); CGAL_Kernel3::FT screenh(svg_px_height); CGAL_Kernel3::FT screenxc = screenw / 2; CGAL_Kernel3::FT screenyc = screenh / 2; CGAL_Kernel3::FT bboxx = ( bbox.xmax() - bbox.xmin() ); CGAL_Kernel3::FT bboxy = ( bbox.ymax() - bbox.ymin() ); CGAL_Kernel3::FT bboxz = ( bbox.zmax() - bbox.zmin() ); CGAL_Kernel3::FT largest_dim = CGAL::max( CGAL::max( bboxx, bboxy ), bboxz ); CGAL_Kernel3::FT bboxxc = bboxx / 2 + bbox.xmin(); CGAL_Kernel3::FT bboxyc = bboxy / 2 + bbox.ymin(); CGAL_Kernel3::FT bboxzc = bboxz / 2 + bbox.zmin(); CGAL_Kernel3::FT xinbox = ( p.x() - bboxxc ) / largest_dim; CGAL_Kernel3::FT yinbox = ( p.y() - bboxyc ) / largest_dim; CGAL_Kernel3::FT zinbox = ( p.z() - bboxzc ) / largest_dim; // do simple fake parallel projection CGAL_Kernel3::FT tx = screenxc + xinbox * screenw / 1.618 + yinbox * screenh / 3.2; CGAL_Kernel3::FT ty = screenyc - zinbox * screenh / 1.618 - yinbox * screenh / 3.2; return {CGAL::to_double(tx), CGAL::to_double(ty)}; } CGAL_Point_2e project_svg_2to2(const CGAL_Point_2e &p, const CGAL_Iso_rectangle_2e &bbox) { double screenw = svg_px_width; double screenh = svg_px_height; double borderw = screenw * 0.1618; double borderh = screenh * 0.1618; double vizw = screenw - borderw*2; double vizh = screenh - borderh*2; double bboxw = CGAL::to_double( bbox.xmax() - bbox.xmin() ); double bboxh = CGAL::to_double( bbox.ymax() - bbox.ymin() ); double xinbox = CGAL::to_double( p.x() ) - CGAL::to_double( bbox.xmin() ); double yinbox = CGAL::to_double( p.y() ) - CGAL::to_double( bbox.ymin() ); double tx = borderw + ( xinbox / ( bboxw==0?1:bboxw ) ) * ( vizw ); double ty = screenh - borderh - ( yinbox / ( bboxh==0?1:bboxh ) ) * ( vizh ); return {tx, ty}; } std::string dump_cgal_nef_polyhedron2_face_svg( CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c1, CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c2, CGAL_Nef_polyhedron2::Explorer explorer, bool facemark, bool body ) { std::ostringstream style; style << "halfedge_f" << facemark << "_b" << body << "_m"; auto styleclass = style.str(); std::ostringstream out; CGAL_For_all(c1, c2) { if (explorer.is_standard( explorer.target(c1))) { auto source = explorer.point( explorer.source( c1 ) ); auto target = explorer.point( explorer.target( c1 ) ); out << " \n"; auto he_mark = boost::lexical_cast(c1->mark()); out << " \n"; } else { out << " \n"; } } return out.str(); } static CGAL_Iso_rectangle_2e bounding_box(const CGAL_Nef_polyhedron2 &N) { auto explorer = N.explorer(); std::vector points; // can be optimized by rewriting bounding_box to accept vertices for (auto vi = explorer.vertices_begin(); vi != explorer.vertices_end(); ++vi) { if (explorer.is_standard(vi)) points.push_back(explorer.point(vi)); } if (points.size() > 0) return CGAL::bounding_box(points.begin(), points.end()); return {0,0,0,0}; } std::string dump_svg(const CGAL_Nef_polyhedron2 &N) { std::ostringstream out; auto explorer = N.explorer(); auto bbox = bounding_box(N); std::string linewidth = "0.05"; out << "\n"; out << svg_header() << "\n" << svg_styleblock( linewidth ) << "\n"; for (auto i = explorer.faces_begin(); i!= explorer.faces_end(); ++i) { out << " \n"; out << " \n"; auto c1(explorer.face_cycle(i)); auto c2(c1); out << dump_cgal_nef_polyhedron2_face_svg(c1, c2, explorer, i->mark(), true); out << " \n"; for (auto j = explorer.holes_begin( i ); j!= explorer.holes_end( i ); ++j) { out << " \n"; CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c3(j), c4(c3); out << dump_cgal_nef_polyhedron2_face_svg(c3, c4, explorer, j->mark(), false); out << " \n"; } out << " \n"; } out << ""; auto tmp = out.str(); boost::replace_all(tmp, "'", "\""); return tmp; } std::string point_dump( CGAL_Point_3 p ) { std::ostringstream out; out << CGAL::to_double(p.x()) << "," << CGAL::to_double(p.y()) << "," << CGAL::to_double(p.z()); return out.str(); } std::string point_dump( CGAL::Sphere_point p ) { std::ostringstream out; out << CGAL::to_double(p.x()) << "," << CGAL::to_double(p.y()) << "," << CGAL::to_double(p.z()); return out.str(); } std::string vert_dump( CGAL_Nef_polyhedron3::Vertex_const_handle vch ) { return point_dump( vch->point() ); } std::string vert_dump( CGAL_Nef_polyhedron3::Nef_polyhedron_S2::SVertex_const_handle vch ) { return point_dump( vch->point() ); } /* Dump the 'sphere map' of every vertex in a CGAL Nef Polyhedron3 see http://doc.cgal.org/latest/Nef_3/index.html */ std::string sphere_map_dump( const CGAL_Nef_polyhedron3& N) { std::ostringstream out; typedef CGAL_Nef_polyhedron3::Vertex_const_iterator Vertex_const_iterator; typedef CGAL_Nef_polyhedron3::Nef_polyhedron_S2 Nef_polyhedron_S2; typedef Nef_polyhedron_S2::SVertex_const_handle SVertex_const_handle; typedef Nef_polyhedron_S2::SHalfedge_const_handle SHalfedge_const_handle; typedef Nef_polyhedron_S2::SHalfloop_const_handle SHalfloop_const_handle; typedef Nef_polyhedron_S2::SFace_const_iterator SFace_const_iterator; typedef Nef_polyhedron_S2::SFace_cycle_const_iterator SFace_cycle_const_iterator; Vertex_const_iterator v; out << "\n"; int counter = 0; for (v = N.vertices_begin(); v!= N.vertices_end(); v++ ) { counter++; out << "\n"; Nef_polyhedron_S2 S(N.get_sphere_map(v)); out << " vertex sphere map info\n"; out << " number of svertices: " << S.number_of_svertices() << std::endl; out << " number of shalfedges: " << S.number_of_shalfedges() << std::endl; out << " number of shalfloops: " << S.number_of_shalfloops() << std::endl; out << " number of sfaces: " << S.number_of_sfaces() << std::endl; out << " number of sface cycles: " << S.number_of_sface_cycles() << std::endl; out << " connected_components: " << S.number_of_connected_components() << "\n"; out << " integrity check...(asserts if not OK)\n"; S.check_integrity_and_topological_planarity(); // S.print_statistics( out ); int i=0; SFace_const_iterator sf; for(sf = S.sfaces_begin(); sf != S.sfaces_end(); sf++) { SFace_cycle_const_iterator it; out << " the sface cycles of sface " << i++ << " start with an\n"; for(it = sf->sface_cycles_begin(); it != sf->sface_cycles_end(); it++) { if (it.is_svertex()) out << " svertex at position " << vert_dump( SVertex_const_handle(it) ) << "\n"; else if (it.is_shalfedge()) out << " shalfedge from " << vert_dump( SHalfedge_const_handle(it)->source() ) << " to " << vert_dump( SHalfedge_const_handle(it)->target() ) << std::endl; else if (it.is_shalfloop()) out << " shalfloop lying in the plane " << SHalfloop_const_handle(it)->circle() << std::endl; else out << " unknown bug\n"; } } out << "\n vertex sphere map end -->\n"; } out << "\n"; return out.str(); } // This uses the Shell Explorer pattern from the CGAL Manual to dump the 3d Nef Polyhedron information // http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html#Subsection_29.7.2 class NefPoly3_dumper_svg { public: std::ostringstream out; CGAL_Iso_cuboid_3 bbox; NefPoly3_dumper_svg(const CGAL_Nef_polyhedron3& N) { bbox = CGALUtils::boundingBox(N); } void visit(CGAL_Nef_polyhedron3::Vertex_const_handle vch) { auto p = vch->point(); out << " \n"; } void visit(CGAL_Nef_polyhedron3::Halfedge_const_handle ) { out << " \n"; } void visit(CGAL_Nef_polyhedron3::SHalfedge_const_handle ) { out << " \n"; } void visit(CGAL_Nef_polyhedron3::SHalfloop_const_handle ) { out << " \n"; } void visit(CGAL_Nef_polyhedron3::SFace_const_handle ) { out << " \n"; } void visit( CGAL_Nef_polyhedron3::Halffacet_const_handle hfacet ) { int contour_count = 0; out << " \n"; std::string color = "gold"; if (!(*hfacet).mark()) color = "green"; CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator i; CGAL_forall_facet_cycles_of( i, hfacet ) { CGAL_Nef_polyhedron3::SHalfloop_const_handle shl_handle; out << " \n"; if ( contour_count == 0 ) { out << " \n"; } else { out << " \n" ; } CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(i), c2(c1); CGAL_For_all( c1, c2 ) { // don't know why we use source()->source(), except thats what CGAL does internally auto source = c1->source()->source()->point(); auto target = c1->source()->target()->point(); auto tp1 = project_svg_3to2 ( source, bbox ); auto tp2 = project_svg_3to2 ( target, bbox ); out << " \n"; out << " \n"; else out << " />\n"; } contour_count++; out << " \n"; } out << " \n"; } }; std::string dump_svg( const CGAL_Nef_polyhedron3 &N ) { std::ostringstream out; std::string linewidth = "0.05"; out << "\n"; out << svg_header() << "\n" << svg_border() << "\n"; out << svg_styleblock( linewidth ) << "\n" << svg_axes() << "\n"; out << "\n\n"; out << "\n"; out << sphere_map_dump( N ); CGAL_Nef_polyhedron3::Volume_const_iterator c; CGAL_forall_volumes(c,N) { out << " \n"; out << " \n"; CGAL_Nef_polyhedron3::Shell_entry_const_iterator it; CGAL_forall_shells_of(it,c) { out << " \n"; NefPoly3_dumper_svg dumper_svg(N); N.visit_shell_objects(CGAL_Nef_polyhedron3::SFace_const_handle(it), dumper_svg); out << dumper_svg.out.str(); out << " \n"; } out << " \n"; } out << "\n"; out << ""; auto tmp = out.str(); boost::replace_all( tmp, "'", "\"" ); return tmp; } } // namespace #endif // ENABLE_CGAL openscad-2019.05/src/svg.h0000644000076500000240000000111213402025764015634 0ustar kintelstaff00000000000000#pragma once #include "cgal.h" #include #include namespace OpenSCAD { // currently for debugging, not necessarily pretty or useful for users. (yet) #define SVG_PXW 480 #define SVG_PXH 480 extern int svg_cursor_py; extern int svg_px_width; extern int svg_px_height; std::string svg_header(int widthpx = SVG_PXW, int heightpx = SVG_PXH); std::string svg_label(std::string s); std::string svg_border(); std::string svg_axes(); std::string dump_svg(const CGAL_Nef_polyhedron2 &N); std::string dump_svg(const CGAL_Nef_polyhedron3 &N); } // namespace openscad-2019.05/src/system-gl.cc0000644000076500000240000000502113414443540017121 0ustar kintelstaff00000000000000 /* OpenGL helper functions */ #include #include #include #include #include #include "system-gl.h" #include #include #include "printutils.h" double gl_version() { std::string tmp((const char*)glGetString( GL_VERSION )); std::vector strs; boost::split(strs, tmp, boost::is_any_of(".")); std::stringstream out; if (strs.size() >= 2) { out << strs[0] << "." << strs[1]; } else { out << "0.0"; } double d; out >> d; return d; } std::string glew_extensions_dump() { std::string tmp; if ( gl_version() >= 3.0 ) { GLint numexts = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numexts); for ( int i=0;i extensions; boost::split(extensions, tmp, boost::is_any_of(" ")); std::sort(extensions.begin(), extensions.end()); std::ostringstream out; out << "GL Extensions:"; for (unsigned int i=0;i #ifdef __APPLE__ #include #else #include #include #endif #else // NULLGL #define GLint int #define GLuint unsigned int inline void glColor4fv( float *c ) {} #endif // NULLGL #include std::string glew_dump(); std::string glew_extensions_dump(); bool report_glerror(const char * function); openscad-2019.05/src/text.cc0000644000076500000240000000746513414456407016205 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "calc.h" #include "module.h" #include "evalcontext.h" #include "printutils.h" #include "builtin.h" #include "textnode.h" #include "FreetypeRenderer.h" #include "Polygon2d.h" #include using namespace boost::assign; // bring 'operator+=()' into scope class TextModule : public AbstractModule { public: TextModule() : AbstractModule() { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *TextModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new TextNode(inst); AssignmentList args{Assignment("text"), Assignment("size"), Assignment("font")}; AssignmentList optargs{ Assignment("direction"), Assignment("language"), Assignment("script"), Assignment("halign"), Assignment("valign"), Assignment("spacing") }; Context c(ctx); c.setVariables(evalctx, args, optargs); auto fn = c.lookup_variable("$fn")->toDouble(); auto fa = c.lookup_variable("$fa")->toDouble(); auto fs = c.lookup_variable("$fs")->toDouble(); node->params.set_fn(fn); node->params.set_fa(fa); node->params.set_fs(fs); auto size = c.lookup_variable_with_default("size", 10.0); auto segments = Calc::get_fragments_from_r(size, fn, fs, fa); // The curved segments of most fonts are relatively short, so // by using a fraction of the number of full circle segments // the resolution will be better matching the detail level of // other objects. auto text_segments = std::max(floor(segments / 8) + 1, 2.0); node->params.set_size(size); node->params.set_segments(text_segments); node->params.set_text(c.lookup_variable_with_default("text", "")); node->params.set_spacing(c.lookup_variable_with_default("spacing", 1.0)); node->params.set_font(c.lookup_variable_with_default("font", "")); node->params.set_direction(c.lookup_variable_with_default("direction", "")); node->params.set_language(c.lookup_variable_with_default("language", "en")); node->params.set_script(c.lookup_variable_with_default("script", "")); node->params.set_halign(c.lookup_variable_with_default("halign", "left")); node->params.set_valign(c.lookup_variable_with_default("valign", "baseline")); FreetypeRenderer renderer; renderer.detect_properties(node->params); return node; } std::vector TextNode::createGeometryList() const { FreetypeRenderer renderer; return renderer.render(this->get_params()); } FreetypeRenderer::Params TextNode::get_params() const { return params; } std::string TextNode::toString() const { return STR(name() << "(" << this->params << ")"); } void register_builtin_text() { Builtins::init("text", new TextModule()); } openscad-2019.05/src/textnode.h0000644000076500000240000000102613402025764016673 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "value.h" #include "FreetypeRenderer.h" class TextModule; class TextNode : public AbstractPolyNode { public: VISITABLE(); TextNode(const ModuleInstantiation *mi) : AbstractPolyNode(mi) {} std::string toString() const override; std::string name() const override { return "text"; } virtual std::vector createGeometryList() const; virtual FreetypeRenderer::Params get_params() const; private: FreetypeRenderer::Params params; friend class TextModule; }; openscad-2019.05/src/transform.cc0000644000076500000240000002143113423115164017211 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "transformnode.h" #include "ModuleInstantiation.h" #include "evalcontext.h" #include "polyset.h" #include "builtin.h" #include "value.h" #include "printutils.h" #include "degree_trig.h" #include #include #include #include using namespace boost::assign; // bring 'operator+=()' into scope enum class transform_type_e { SCALE, ROTATE, MIRROR, TRANSLATE, MULTMATRIX }; class TransformModule : public AbstractModule { public: transform_type_e type; TransformModule(transform_type_e type) : type(type) { } AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const override; }; AbstractNode *TransformModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const { auto node = new TransformNode(inst); AssignmentList args; switch (this->type) { case transform_type_e::SCALE: args += Assignment("v"); break; case transform_type_e::ROTATE: args += Assignment("a"), Assignment("v"); break; case transform_type_e::MIRROR: args += Assignment("v"); break; case transform_type_e::TRANSLATE: args += Assignment("v"); break; case transform_type_e::MULTMATRIX: args += Assignment("m"); break; default: assert(false); } Context c(ctx); c.setVariables(evalctx, args); inst->scope.apply(*evalctx); if (this->type == transform_type_e::SCALE) { Vector3d scalevec(1, 1, 1); auto v = c.lookup_variable("v"); if (!v->getVec3(scalevec[0], scalevec[1], scalevec[2], 1.0)) { double num; if (v->getDouble(num)){ scalevec.setConstant(num); }else{ PRINTB("WARNING: Unable to convert scale(%s) parameter to a number, a vec3 or vec2 of numbers or a number, %s", v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } if(OpenSCAD::rangeCheck){ if(scalevec[0]==0 || scalevec[1]==0 || scalevec[2]==0 || !std::isfinite(scalevec[0])|| !std::isfinite(scalevec[1])|| !std::isfinite(scalevec[2])){ PRINTB("WARNING: scale(%s), %s", v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } node->matrix.scale(scalevec); } else if (this->type == transform_type_e::ROTATE) { auto val_a = c.lookup_variable("a"); auto val_v = c.lookup_variable("v"); if (val_a->type() == Value::ValueType::VECTOR) { double sx = 0, sy = 0, sz = 0; double cx = 1, cy = 1, cz = 1; double a = 0.0; bool ok = true; if (val_a->toVector().size() > 0) { ok &= val_a->toVector()[0]->getDouble(a); ok &= !std::isinf(a) && !std::isnan(a); sx = sin_degrees(a); cx = cos_degrees(a); } if (val_a->toVector().size() > 1) { ok &= val_a->toVector()[1]->getDouble(a); ok &= !std::isinf(a) && !std::isnan(a); sy = sin_degrees(a); cy = cos_degrees(a); } if (val_a->toVector().size() > 2) { ok &= val_a->toVector()[2]->getDouble(a); ok &= !std::isinf(a) && !std::isnan(a); sz = sin_degrees(a); cz = cos_degrees(a); } if (val_a->toVector().size() > 3) { ok &= false; } bool v_supplied = (val_v != ValuePtr::undefined); if(ok){ if(v_supplied){ PRINTB("WARNING: When parameter a is supplied as vector, v is ignored rotate(a=%s, v=%s), %s", val_a->toEchoString() % val_v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } }else{ if(v_supplied){ PRINTB("WARNING: Problem converting rotate(a=%s, v=%s) parameter, %s", val_a->toString() % val_v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); }else{ PRINTB("WARNING: Problem converting rotate(a=%s) parameter, %s", val_a->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } Matrix3d M; M << cy * cz, cz * sx * sy - cx * sz, cx * cz * sy + sx * sz, cy * sz, cx * cz + sx * sy * sz, -cz * sx + cx * sy * sz, -sy, cy * sx, cx * cy; node->matrix.rotate(M); } else { double a = 0.0; bool aConverted = val_a->getDouble(a); aConverted &= !std::isinf(a) && !std::isnan(a); Vector3d v(0, 0, 1); bool vConverted = val_v->getVec3(v[0], v[1], v[2], 0.0); node->matrix.rotate(angle_axis_degrees(aConverted ? a : 0, v)); if(val_v != ValuePtr::undefined && ! vConverted){ if(aConverted){ PRINTB("WARNING: Problem converting rotate(..., v=%s) parameter, %s", val_v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); }else{ PRINTB("WARNING: Problem converting rotate(a=%s, v=%s) parameter, %s", val_a->toEchoString() % val_v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } }else if(!aConverted){ PRINTB("WARNING: Problem converting rotate(a=%s) parameter, %s", val_a->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } } else if (this->type == transform_type_e::MIRROR) { auto val_v = c.lookup_variable("v"); double x = 1.0, y = 0.0, z = 0.0; if (val_v->getVec3(x, y, z, 0.0)) { if (x != 0.0 || y != 0.0 || z != 0.0) { double sn = 1.0 / sqrt(x*x + y*y + z*z); x *= sn, y *= sn, z *= sn; } }else{ PRINTB("WARNING: Unable to convert mirror(%s) parameter to a vec3 or vec2 of numbers, %s", val_v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } if (x != 0.0 || y != 0.0 || z != 0.0) { Matrix4d m; m << 1-2*x*x, -2*y*x, -2*z*x, 0, -2*x*y, 1-2*y*y, -2*z*y, 0, -2*x*z, -2*y*z, 1-2*z*z, 0, 0, 0, 0, 1; node->matrix = m; } } else if (this->type == transform_type_e::TRANSLATE) { auto v = c.lookup_variable("v"); Vector3d translatevec(0,0,0); bool ok = v->getVec3(translatevec[0], translatevec[1], translatevec[2], 0.0); ok &= std::isfinite(translatevec[0]) && std::isfinite(translatevec[1]) && std::isfinite(translatevec[2]) ; if (ok) { node->matrix.translate(translatevec); }else{ PRINTB("WARNING: Unable to convert translate(%s) parameter to a vec3 or vec2 of numbers, %s", v->toEchoString() % inst->location().toRelativeString(ctx->documentPath())); } } else if (this->type == transform_type_e::MULTMATRIX) { auto v = c.lookup_variable("m"); if (v->type() == Value::ValueType::VECTOR) { Matrix4d rawmatrix{Matrix4d::Identity()}; for (int i = 0; i < 16; i++) { size_t x = i / 4, y = i % 4; if (y < v->toVector().size() && v->toVector()[y]->type() == Value::ValueType::VECTOR && x < v->toVector()[y]->toVector().size()) v->toVector()[y]->toVector()[x]->getDouble(rawmatrix(y, x)); } double w = rawmatrix(3,3); if (w != 1.0) node->matrix = rawmatrix / w; else node->matrix = rawmatrix; } } auto instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); return node; } std::string TransformNode::toString() const { std::ostringstream stream; stream << "multmatrix(["; for (int j=0;j<4;j++) { stream << "["; for (int i=0;i<4;i++) { Value v(this->matrix(j, i)); stream << v; if (i != 3) stream << ", "; } stream << "]"; if (j != 3) stream << ", "; } stream << "])"; return stream.str(); } TransformNode::TransformNode(const ModuleInstantiation *mi) : AbstractNode(mi), matrix(Transform3d::Identity()) { } std::string TransformNode::name() const { return "transform"; } void register_builtin_transform() { Builtins::init("scale", new TransformModule(transform_type_e::SCALE)); Builtins::init("rotate", new TransformModule(transform_type_e::ROTATE)); Builtins::init("mirror", new TransformModule(transform_type_e::MIRROR)); Builtins::init("translate", new TransformModule(transform_type_e::TRANSLATE)); Builtins::init("multmatrix", new TransformModule(transform_type_e::MULTMATRIX)); } openscad-2019.05/src/transformnode.h0000644000076500000240000000045413441031431017715 0ustar kintelstaff00000000000000#pragma once #include "node.h" #include "linalg.h" class TransformNode : public AbstractNode { public: VISITABLE(); EIGEN_MAKE_ALIGNED_OPERATOR_NEW TransformNode(const ModuleInstantiation *mi); std::string toString() const override; std::string name() const override; Transform3d matrix; }; openscad-2019.05/src/value.cc0000644000076500000240000007073713445047371016337 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2011 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "value.h" #include "printutils.h" #include "double-conversion/double-conversion.h" #include "double-conversion/utils.h" #include "double-conversion/ieee.h" #include #include #include #include #include #include #include #include "boost-utils.h" #include namespace fs=boost::filesystem; /*Unicode support for string lengths and array accesses*/ #include const Value Value::undefined; const ValuePtr ValuePtr::undefined; /* Define values for double-conversion library. */ #define DC_BUFFER_SIZE 128 #define DC_FLAGS (double_conversion::DoubleToStringConverter::UNIQUE_ZERO | double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN) #define DC_INF "inf" #define DC_NAN "nan" #define DC_EXP 'e' #define DC_DECIMAL_LOW_EXP -6 #define DC_DECIMAL_HIGH_EXP 21 #define DC_MAX_LEADING_ZEROES 5 #define DC_MAX_TRAILING_ZEROES 0 /* WARNING: using values > 8 will significantly slow double to string * conversion, defeating the purpose of using double-conversion library */ #define DC_PRECISION_REQUESTED 6 inline void trimTrailingZeroes(char *buffer, const int pos) { char *decimal = strchr(buffer, '.'); if (decimal) { char *ptr = decimal; while (*(++ptr) != '\0') { char *zero = strchr(ptr, '0'); if (zero) { ptr = zero; char ch; while ((ch = *(++ptr))) { if (ch == DC_EXP) { // found exponent character after all zeroes, // move chunk from exponent to end of string to replace decimal memmove((zero-1 == decimal) ? decimal : zero, ptr, &buffer[pos]-ptr+1); return; } else if (ch != '0') { // found non-zero digit, start over looking for zeroes break; } } if (ch == '\0') { // reached end of string with all zeroes if (zero-1 == decimal) { // first zero was immediately after decimal *decimal = '\0'; // replace decimal with terminator return; } else { // replace zero with terminator *zero = '\0'; return; } } } else { // no zeroes after decimal return; } } } } inline bool HandleSpecialValues(const double &value, double_conversion::StringBuilder &builder) { double_conversion::Double double_inspect(value); if (double_inspect.IsInfinite()) { if (value < 0) { builder.AddCharacter('-'); } builder.AddString(DC_INF); return true; } if (double_inspect.IsNan()) { builder.AddString(DC_NAN); return true; } return false; } inline char* DoubleConvert(const double &value, char *buffer, double_conversion::StringBuilder &builder, const double_conversion::DoubleToStringConverter &dc) { builder.Reset(); if (double_conversion::Double(value).IsSpecial()) { HandleSpecialValues(value, builder); builder.Finalize(); return buffer; } dc.ToPrecision(value, DC_PRECISION_REQUESTED, &builder); int pos = builder.position(); // get position before Finalize destroys it builder.Finalize(); trimTrailingZeroes(buffer, pos); return buffer; } void utf8_split(const std::string& str, std::function f) { const char *ptr = str.c_str(); while (*ptr) { auto next = g_utf8_next_char(ptr); const size_t length = next - ptr; f(ValuePtr(std::string{ptr, length})); ptr = next; } } static uint32_t convert_to_uint32(const double d) { auto ret = std::numeric_limits::max(); if (std::isfinite(d)) { try { ret = boost::numeric_cast(d); } catch (boost::bad_numeric_cast &) { // ignore, leaving the default max() value } } return ret; } std::ostream &operator<<(std::ostream &stream, const Filename &filename) { fs::path fnpath{static_cast(filename)}; // gcc-4.6 auto fpath = boostfs_uncomplete(fnpath, fs::current_path()); stream << QuotedString(fpath.generic_string()); return stream; } // FIXME: This could probably be done more elegantly using boost::regex std::ostream &operator<<(std::ostream &stream, const QuotedString &s) { stream << '"'; for (char c : s) { switch (c) { case '\t': stream << "\\t"; break; case '\n': stream << "\\n"; break; case '\r': stream << "\\r"; break; case '"': case '\\': stream << '\\'; stream << c; break; default: stream << c; } } stream << '"'; return stream; } Value::Value() : value(boost::blank()) { // std::cout << "creating undef\n"; } Value::Value(bool v) : value(v) { // std::cout << "creating bool\n"; } Value::Value(int v) : value(double(v)) { // std::cout << "creating int\n"; } Value::Value(double v) : value(v) { // std::cout << "creating double " << v << "\n"; } Value::Value(const std::string &v) : value(str_utf8_wrapper(v)) { // std::cout << "creating string\n"; } Value::Value(const char *v) : value(str_utf8_wrapper(v)) { // std::cout << "creating string from char *\n"; } Value::Value(char v) : value(str_utf8_wrapper(1, v)) { // std::cout << "creating string from char\n"; } Value::Value(const VectorType &v) : value(v) { // std::cout << "creating vector\n"; } Value::Value(const RangeType &v) : value(v) { // std::cout << "creating range\n"; } Value::ValueType Value::type() const { return static_cast(this->value.which()); } bool Value::isDefined() const { return this->type() != ValueType::UNDEFINED; } bool Value::isDefinedAs(const ValueType type) const { return this->type() == type; } bool Value::isUndefined() const { return !isDefined(); } bool Value::toBool() const { switch (this->type()) { case ValueType::BOOL: return boost::get(this->value); break; case ValueType::NUMBER: return boost::get(this->value)!= 0; break; case ValueType::STRING: return !boost::get(this->value).empty(); break; case ValueType::VECTOR: return !boost::get(this->value).empty(); break; case ValueType::RANGE: return true; break; default: return false; break; } } double Value::toDouble() const { double d = 0; getDouble(d); return d; } bool Value::getDouble(double &v) const { const double *d = boost::get(&this->value); if (d) { v = *d; return true; } return false; } bool Value::getFiniteDouble(double &v) const { double result; if (!getDouble(result)) { return false; } bool valid = std::isfinite(result); if (valid) { v = result; } return valid; } class tostring_visitor : public boost::static_visitor { public: template std::string operator()(const T &op1) const { // std::cout << "[generic tostring_visitor]\n"; return boost::lexical_cast(op1); } std::string operator()(const double &op1) const { char buffer[DC_BUFFER_SIZE]; double_conversion::StringBuilder builder(buffer, DC_BUFFER_SIZE); double_conversion::DoubleToStringConverter dc(DC_FLAGS, DC_INF, DC_NAN, DC_EXP, DC_DECIMAL_LOW_EXP, DC_DECIMAL_HIGH_EXP, DC_MAX_LEADING_ZEROES, DC_MAX_TRAILING_ZEROES); return DoubleConvert(op1, buffer, builder, dc); } std::string operator()(const boost::blank &) const { return "undef"; } std::string operator()(const bool &v) const { return v ? "true" : "false"; } std::string operator()(const Value::VectorType &v) const { // Create a single stream and pass reference to it for list elements for optimization. std::ostringstream stream; stream << '['; for (size_t i = 0; i < v.size(); i++) { if (i > 0) stream << ", "; v[i]->toStream(stream); } stream << ']'; return stream.str(); } std::string operator()(const RangeType &v) const { return (boost::format("[%1% : %2% : %3%]") % v.begin_val % v.step_val % v.end_val).str(); } }; // Optimization to avoid multiple stream instantiations and copies to str for long vectors. // Functions identically to "class tostring_visitor", except outputting to stream and not returning strings class tostream_visitor : public boost::static_visitor<> { public: std::ostringstream &stream; mutable char buffer[DC_BUFFER_SIZE]; mutable double_conversion::StringBuilder builder; double_conversion::DoubleToStringConverter dc; tostream_visitor(std::ostringstream& stream) : stream(stream), builder(buffer, DC_BUFFER_SIZE), dc(DC_FLAGS, DC_INF, DC_NAN, DC_EXP, DC_DECIMAL_LOW_EXP, DC_DECIMAL_HIGH_EXP, DC_MAX_LEADING_ZEROES, DC_MAX_TRAILING_ZEROES) {}; template void operator()(const T &op1) const { // std::cout << "[generic tostream_visitor]\n"; stream << boost::lexical_cast(op1); } void operator()(const double &op1) const { stream << DoubleConvert(op1, buffer, builder, dc); } void operator()(const boost::blank &) const { stream << "undef"; } void operator()(const bool &v) const { stream << (v ? "true" : "false"); } void operator()(const Value::VectorType &v) const { stream << '['; for (size_t i = 0; i < v.size(); i++) { if (i > 0) stream << ", "; v[i]->toStream(this); } stream << ']'; } void operator()(const str_utf8_wrapper &v) const { stream << '"' << v << '"'; } void operator()(const RangeType &v) const { stream << "["; this->operator()(v.begin_val); stream << " : "; this->operator()(v.step_val); stream << " : "; this->operator()(v.end_val); stream << "]"; } }; std::string Value::toString() const { return boost::apply_visitor(tostring_visitor(), this->value); } // helper called by tostring_visitor methods to avoid extra instantiations std::string Value::toString(const tostring_visitor *visitor) const { return boost::apply_visitor(*visitor, this->value); } void Value::toStream(std::ostringstream &stream) const { boost::apply_visitor(tostream_visitor(stream), this->value); } // helper called by tostream_visitor methods to avoid extra instantiations void Value::toStream(const tostream_visitor *visitor) const { boost::apply_visitor(*visitor, this->value); } std::string Value::toEchoString() const { if (type() == Value::ValueType::STRING) { return std::string("\"") + toString() + '"'; } else { return toString(); } } // helper called by tostring_visitor methods to avoid extra instantiations std::string Value::toEchoString(const tostring_visitor *visitor) const { if (type() == Value::ValueType::STRING) { return std::string("\"") + toString(visitor) + '"'; } else { return toString(visitor); } } class chr_visitor : public boost::static_visitor { public: template std::string operator()(const S &) const { return ""; } std::string operator()(const double &v) const { char buf[8]; memset(buf, 0, 8); if (v > 0) { const gunichar c = v; if (g_unichar_validate(c) && (c != 0)) { g_unichar_to_utf8(c, buf); } } return std::string(buf); } std::string operator()(const Value::VectorType &v) const { std::ostringstream stream; for (size_t i = 0; i < v.size(); i++) { stream << v[i]->chrString(); } return stream.str(); } std::string operator()(const RangeType &v) const { const uint32_t steps = v.numValues(); if (steps >= 10000) { PRINTB("WARNING: Bad range parameter in for statement: too many elements (%lu).", steps); return ""; } std::ostringstream stream; RangeType range = v; for (RangeType::iterator it = range.begin();it != range.end();it++) { const Value value(*it); stream << value.chrString(); } return stream.str(); } }; std::string Value::chrString() const { return boost::apply_visitor(chr_visitor(), this->value); } const Value::VectorType &Value::toVector() const { static VectorType empty; const VectorType *v = boost::get(&this->value); if (v) return *v; else return empty; } bool Value::getVec2(double &x, double &y, bool ignoreInfinite) const { if (this->type() != ValueType::VECTOR) return false; const VectorType &v = toVector(); if (v.size() != 2) return false; double rx, ry; bool valid = ignoreInfinite ? v[0]->getFiniteDouble(rx) && v[1]->getFiniteDouble(ry) : v[0]->getDouble(rx) && v[1]->getDouble(ry); if (valid) { x = rx; y = ry; } return valid; } bool Value::getVec3(double &x, double &y, double &z) const { if (this->type() != ValueType::VECTOR) return false; const VectorType &v = toVector(); if (v.size() != 3) return false; return (v[0]->getDouble(x) && v[1]->getDouble(y) && v[2]->getDouble(z)); } bool Value::getVec3(double &x, double &y, double &z, double defaultval) const { if (this->type() != ValueType::VECTOR) return false; const VectorType &v = toVector(); if (v.size() == 2) { getVec2(x, y); z = defaultval; return true; } else { if (v.size() != 3) return false; } return (v[0]->getDouble(x) && v[1]->getDouble(y) && v[2]->getDouble(z)); } RangeType Value::toRange() const { const RangeType *val = boost::get(&this->value); if (val) { return *val; } else return RangeType(0,0,0); } Value &Value::operator=(const Value &v) { if (this != &v) { this->value = v.value; } return *this; } class equals_visitor : public boost::static_visitor { public: template bool operator()(const T &, const U &) const { return false; } template bool operator()(const T &op1, const T &op2) const { return op1 == op2; } }; bool Value::operator==(const Value &v) const { return boost::apply_visitor(equals_visitor(), this->value, v.value); } bool Value::operator!=(const Value &v) const { return !(*this == v); } #define DEFINE_VISITOR(name,op) \ class name : public boost::static_visitor \ { \ public: \ template bool operator()(const T &, const U &) const { \ return false; \ } \ \ bool operator()(const bool &op1, const bool &op2) const { \ return op1 op op2; \ } \ \ bool operator()(const bool &op1, const double &op2) const { \ return op1 op op2; \ } \ \ bool operator()(const double &op1, const bool &op2) const { \ return op1 op op2; \ } \ \ bool operator()(const double &op1, const double &op2) const { \ return op1 op op2; \ } \ \ bool operator()(const str_utf8_wrapper &op1, const str_utf8_wrapper &op2) const { \ return op1 op op2; \ } \ } DEFINE_VISITOR(less_visitor, <); DEFINE_VISITOR(greater_visitor, >); DEFINE_VISITOR(lessequal_visitor, <=); DEFINE_VISITOR(greaterequal_visitor, >=); bool Value::operator<(const Value &v) const { return boost::apply_visitor(less_visitor(), this->value, v.value); } bool Value::operator>=(const Value &v) const { return boost::apply_visitor(greaterequal_visitor(), this->value, v.value); } bool Value::operator>(const Value &v) const { return boost::apply_visitor(greater_visitor(), this->value, v.value); } bool Value::operator<=(const Value &v) const { return boost::apply_visitor(lessequal_visitor(), this->value, v.value); } class plus_visitor : public boost::static_visitor { public: template Value operator()(const T &, const U &) const { return Value::undefined; } Value operator()(const double &op1, const double &op2) const { return {op1 + op2}; } Value operator()(const Value::VectorType &op1, const Value::VectorType &op2) const { Value::VectorType sum; for (size_t i = 0; i < op1.size() && i < op2.size(); i++) { sum.push_back(ValuePtr(*op1[i] + *op2[i])); } return {sum}; } }; Value Value::operator+(const Value &v) const { return boost::apply_visitor(plus_visitor(), this->value, v.value); } class minus_visitor : public boost::static_visitor { public: template Value operator()(const T &, const U &) const { return Value::undefined; } Value operator()(const double &op1, const double &op2) const { return {op1 - op2}; } Value operator()(const Value::VectorType &op1, const Value::VectorType &op2) const { Value::VectorType sum; for (size_t i = 0; i < op1.size() && i < op2.size(); i++) { sum.push_back(ValuePtr(*op1[i] - *op2[i])); } return {sum}; } }; Value Value::operator-(const Value &v) const { return boost::apply_visitor(minus_visitor(), this->value, v.value); } Value Value::multvecnum(const Value &vecval, const Value &numval) { // Vector * Number VectorType dstv; for(const auto &val : vecval.toVector()) { dstv.push_back(ValuePtr(*val * numval)); } return {dstv}; } Value Value::multmatvec(const VectorType &matrixvec, const VectorType &vectorvec) { // Matrix * Vector VectorType dstv; for (size_t i=0;itype() != ValueType::VECTOR || matrixvec[i]->toVector().size() != vectorvec.size()) { return Value(); } double r_e = 0.0; for (size_t j=0;jtoVector().size();j++) { if (matrixvec[i]->toVector()[j]->type() != ValueType::NUMBER || vectorvec[j]->type() != ValueType::NUMBER) { return Value(); } r_e += matrixvec[i]->toVector()[j]->toDouble() * vectorvec[j]->toDouble(); } dstv.push_back(ValuePtr(r_e)); } return {dstv}; } Value Value::multvecmat(const VectorType &vectorvec, const VectorType &matrixvec) { assert(vectorvec.size() == matrixvec.size()); // Vector * Matrix VectorType dstv; for (size_t i=0;itoVector().size();i++) { double r_e = 0.0; for (size_t j=0;jtype() != ValueType::VECTOR || matrixvec[j]->toVector()[i]->type() != ValueType::NUMBER || vectorvec[j]->type() != ValueType::NUMBER) { return Value::undefined; } r_e += vectorvec[j]->toDouble() * matrixvec[j]->toVector()[i]->toDouble(); } dstv.push_back(ValuePtr(r_e)); } return {dstv}; } Value Value::operator*(const Value &v) const { if (this->type() == ValueType::NUMBER && v.type() == ValueType::NUMBER) { return {this->toDouble() * v.toDouble()}; } else if (this->type() == ValueType::VECTOR && v.type() == ValueType::NUMBER) { return multvecnum(*this, v); } else if (this->type() == ValueType::NUMBER && v.type() == ValueType::VECTOR) { return multvecnum(v, *this); } else if (this->type() == ValueType::VECTOR && v.type() == ValueType::VECTOR) { const auto &vec1 = this->toVector(); const auto &vec2 = v.toVector(); if (vec1.size() == 0 || vec2.size() == 0) return Value::undefined; if (vec1[0]->type() == ValueType::NUMBER && vec2[0]->type() == ValueType::NUMBER && vec1.size() == vec2.size()) { // Vector dot product. auto r = 0.0; for (size_t i=0;itype() != ValueType::NUMBER || vec2[i]->type() != ValueType::NUMBER) { return Value::undefined; } r += (vec1[i]->toDouble() * vec2[i]->toDouble()); } return Value(r); } else if (vec1[0]->type() == ValueType::VECTOR && vec2[0]->type() == ValueType::NUMBER && vec1[0]->toVector().size() == vec2.size()) { return multmatvec(vec1, vec2); } else if (vec1[0]->type() == ValueType::NUMBER && vec2[0]->type() == ValueType::VECTOR && vec1.size() == vec2.size()) { return multvecmat(vec1, vec2); } else if (vec1[0]->type() == ValueType::VECTOR && vec2[0]->type() == ValueType::VECTOR && vec1[0]->toVector().size() == vec2.size()) { // Matrix * Matrix VectorType dstv; for (const auto &srcrow : vec1) { const auto &srcrowvec = srcrow->toVector(); if (srcrowvec.size() != vec2.size()) return Value::undefined; dstv.push_back(ValuePtr(multvecmat(srcrowvec, vec2))); } return {dstv}; } } return Value::undefined; } Value Value::operator/(const Value &v) const { if (this->type() == ValueType::NUMBER && v.type() == ValueType::NUMBER) { return {this->toDouble() / v.toDouble()}; } else if (this->type() == ValueType::VECTOR && v.type() == ValueType::NUMBER) { const auto &vec = this->toVector(); VectorType dstv; for (const auto &vecval : vec) { dstv.push_back(ValuePtr(*vecval / v)); } return {dstv}; } else if (this->type() == ValueType::NUMBER && v.type() == ValueType::VECTOR) { const auto &vec = v.toVector(); VectorType dstv; for (const auto &vecval : vec) { dstv.push_back(ValuePtr(*this / *vecval)); } return {dstv}; } return Value::undefined; } Value Value::operator%(const Value &v) const { if (this->type() == ValueType::NUMBER && v.type() == ValueType::NUMBER) { return {fmod(boost::get(this->value), boost::get(v.value))}; } return Value::undefined; } Value Value::operator-() const { if (this->type() == ValueType::NUMBER) { return {-this->toDouble()}; } else if (this->type() == ValueType::VECTOR) { const auto &vec = this->toVector(); VectorType dstv; for (const auto &vecval : vec) { dstv.push_back(ValuePtr(-*vecval)); } return {dstv}; } return Value::undefined; } /*! Append a value to this vector. This must be of valtype ValueType::VECTOR. */ /* void Value::append(Value *val) { assert(this->type() == ValueType::VECTOR); this->vec.push_back(val); } */ /* * bracket operation [] detecting multi-byte unicode. * If the string is multi-byte unicode then the index will offset to the character (2 or 4 byte) and not to the byte. * A 'normal' string with byte chars are a subset of unicode and still work. */ class bracket_visitor : public boost::static_visitor { public: Value operator()(const str_utf8_wrapper &str, const double &idx) const { Value v; const auto i = convert_to_uint32(idx); if (i < str.size()) { // Ensure character (not byte) index is inside the character/glyph array if (i < str.get_utf8_strlen()) { gchar utf8_of_cp[6] = ""; //A buffer for a single unicode character to be copied into auto ptr = g_utf8_offset_to_pointer(str.c_str(), i); if (ptr) { g_utf8_strncpy(utf8_of_cp, ptr, 1); } v = std::string(utf8_of_cp); } } return v; } Value operator()(const Value::VectorType &vec, const double &idx) const { const auto i = convert_to_uint32(idx); if (i < vec.size()) return *vec[i]; return Value::undefined; } Value operator()(const RangeType &range, const double &idx) const { const auto i = convert_to_uint32(idx); switch(i) { case 0: return {range.begin_val}; case 1: return {range.step_val}; case 2: return {range.end_val}; } return Value::undefined; } template Value operator()(const T &, const U &) const { // std::cout << "generic bracket_visitor\n"; return Value::undefined; } }; Value Value::operator[](const Value &v) const { return boost::apply_visitor(bracket_visitor(), this->value, v.value); } void RangeType::normalize() { if ((step_val>0) && (end_val < begin_val)) { std::swap(begin_val,end_val); printDeprecation("Using ranges of the form [begin:end] with begin value greater than the end value is deprecated."); } } uint32_t RangeType::numValues() const { if (std::isnan(begin_val) || std::isnan(end_val) || std::isnan(step_val)) { return 0; } if (std::isinf(begin_val) || (std::isinf(end_val))) { return std::numeric_limits::max(); } if ((begin_val == end_val) || std::isinf(step_val)) { return 1; } if (step_val == 0) { return std::numeric_limits::max(); } double numvals; if (step_val < 0) { if (begin_val < end_val) { return 0; } numvals = (begin_val - end_val) / (-step_val) + 1; } else { if (begin_val > end_val) { return 0; } numvals = (end_val - begin_val) / step_val + 1; } return numvals; } RangeType::iterator::iterator(RangeType &range, type_t type) : range(range), val(range.begin_val), type(type) { update_type(); } void RangeType::iterator::update_type() { if (range.step_val == 0) { type = type_t::RANGE_TYPE_END; } else if (range.step_val < 0) { if (val < range.end_val) { type = type_t::RANGE_TYPE_END; } } else { if (val > range.end_val) { type = type_t::RANGE_TYPE_END; } } if (std::isnan(range.begin_val) || std::isnan(range.end_val) || std::isnan(range.step_val)) type = type_t::RANGE_TYPE_END; } RangeType::iterator::reference RangeType::iterator::operator*() { return val; } RangeType::iterator::pointer RangeType::iterator::operator->() { return &(operator*()); } RangeType::iterator::self_type RangeType::iterator::operator++() { val += range.step_val; update_type(); return *this; } RangeType::iterator::self_type RangeType::iterator::operator++(int) { self_type tmp(*this); operator++(); return tmp; } bool RangeType::iterator::operator==(const self_type &other) const { if (type == type_t::RANGE_TYPE_RUNNING) { return (type == other.type) && (val == other.val) && (range == other.range); } else { return (type == other.type) && (range == other.range); } } bool RangeType::iterator::operator!=(const self_type &other) const { return !(*this == other); } ValuePtr::ValuePtr() { this->reset(new Value()); } ValuePtr::ValuePtr(const Value &v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(bool v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(int v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(double v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(const std::string &v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(const char *v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(const char v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(const Value::VectorType &v) { this->reset(new Value(v)); } ValuePtr::ValuePtr(const RangeType &v) { this->reset(new Value(v)); } bool ValuePtr::operator==(const ValuePtr &v) const { return **this == *v; } bool ValuePtr::operator!=(const ValuePtr &v) const { return **this != *v; } bool ValuePtr::operator<(const ValuePtr &v) const { return **this < *v; } bool ValuePtr::operator<=(const ValuePtr &v) const { return **this <= *v; } bool ValuePtr::operator>=(const ValuePtr &v) const { return **this >= *v; } bool ValuePtr::operator>(const ValuePtr &v) const { return **this > *v; } ValuePtr ValuePtr::operator-() const { return ValuePtr(-**this); } ValuePtr ValuePtr::operator!() const { return ValuePtr(!**this); } ValuePtr ValuePtr::operator[](const ValuePtr &v) const { return ValuePtr((**this)[*v]); } ValuePtr ValuePtr::operator+(const ValuePtr &v) const { return ValuePtr(**this + *v); } ValuePtr ValuePtr::operator-(const ValuePtr &v) const { return ValuePtr(**this - *v); } ValuePtr ValuePtr::operator*(const ValuePtr &v) const { return ValuePtr(**this * *v); } ValuePtr ValuePtr::operator/(const ValuePtr &v) const { return ValuePtr(**this / *v); } ValuePtr ValuePtr::operator%(const ValuePtr &v) const { return ValuePtr(**this % *v); } ValuePtr::operator bool() const { return **this; } const Value &ValuePtr::operator*() const { return *this->get(); } openscad-2019.05/src/value.h0000644000076500000240000001477113427162620016170 0ustar kintelstaff00000000000000#pragma once #include #include #include #include // Workaround for https://bugreports.qt-project.org/browse/QTBUG-22829 #ifndef Q_MOC_RUN #include #include #include #endif #include #include "memory.h" class tostring_visitor; class tostream_visitor; class QuotedString : public std::string { public: QuotedString() : std::string() {} QuotedString(const std::string &s) : std::string(s) {} }; std::ostream &operator<<(std::ostream &stream, const QuotedString &s); class Filename : public QuotedString { public: Filename() : QuotedString() {} Filename(const std::string &f) : QuotedString(f) {} }; std::ostream &operator<<(std::ostream &stream, const Filename &filename); class RangeType { private: double begin_val; double step_val; double end_val; /// inverse begin/end if begin is upper than end void normalize(); public: enum class type_t { RANGE_TYPE_BEGIN, RANGE_TYPE_RUNNING, RANGE_TYPE_END }; class iterator { public: typedef iterator self_type; typedef double value_type; typedef double& reference; typedef double* pointer; typedef std::forward_iterator_tag iterator_category; typedef double difference_type; iterator(RangeType &range, type_t type); self_type operator++(); self_type operator++(int junk); reference operator*(); pointer operator->(); bool operator==(const self_type& other) const; bool operator!=(const self_type& other) const; private: RangeType ⦥ double val; type_t type; void update_type(); }; RangeType(double begin, double end) : begin_val(begin), step_val(1.0), end_val(end) { normalize(); } RangeType(double begin, double step, double end) : begin_val(begin), step_val(step), end_val(end) {} bool operator==(const RangeType &other) const { return this == &other || (this->begin_val == other.begin_val && this->step_val == other.step_val && this->end_val == other.end_val); } double begin_value() { return begin_val; } double step_value() { return step_val; } double end_value() { return end_val; } iterator begin() { return iterator(*this, type_t::RANGE_TYPE_BEGIN); } iterator end() { return iterator(*this, type_t::RANGE_TYPE_END); } /// return number of values, max uint32_t value if step is 0 or range is infinite uint32_t numValues() const; friend class chr_visitor; friend class tostring_visitor; friend class tostream_visitor; friend class bracket_visitor; }; class ValuePtr : public shared_ptr { public: static const ValuePtr undefined; ValuePtr(); explicit ValuePtr(const Value &v); ValuePtr(bool v); ValuePtr(int v); ValuePtr(double v); ValuePtr(const std::string &v); ValuePtr(const char *v); ValuePtr(const char v); ValuePtr(const class std::vector &v); ValuePtr(const class RangeType &v); operator bool() const; bool operator==(const ValuePtr &v) const; bool operator!=(const ValuePtr &v) const; bool operator<(const ValuePtr &v) const; bool operator<=(const ValuePtr &v) const; bool operator>=(const ValuePtr &v) const; bool operator>(const ValuePtr &v) const; ValuePtr operator-() const; ValuePtr operator!() const; ValuePtr operator[](const ValuePtr &v) const; ValuePtr operator+(const ValuePtr &v) const; ValuePtr operator-(const ValuePtr &v) const; ValuePtr operator*(const ValuePtr &v) const; ValuePtr operator/(const ValuePtr &v) const; ValuePtr operator%(const ValuePtr &v) const; const Value &operator*() const; private: }; class str_utf8_wrapper : public std::string { public: str_utf8_wrapper() : std::string(), cached_len(-1) { } str_utf8_wrapper( const std::string& s ) : std::string( s ), cached_len(-1) { } str_utf8_wrapper( size_t n, char c ) : std::string(n, c), cached_len(-1) { } ~str_utf8_wrapper() {} glong get_utf8_strlen() const { if (cached_len < 0) { cached_len = g_utf8_strlen(this->c_str(), this->size()); } return cached_len; }; private: mutable glong cached_len; }; class Value { public: typedef std::vector VectorType; enum class ValueType { UNDEFINED, BOOL, NUMBER, STRING, VECTOR, RANGE }; static const Value undefined; Value(); Value(bool v); Value(int v); Value(double v); Value(const std::string &v); Value(const char *v); Value(const char v); Value(const VectorType &v); Value(const RangeType &v); ~Value() {} ValueType type() const; bool isDefined() const; bool isDefinedAs(const ValueType type) const; bool isUndefined() const; double toDouble() const; bool getDouble(double &v) const; bool getFiniteDouble(double &v) const; bool toBool() const; std::string toString() const; std::string toString(const tostring_visitor *visitor) const; std::string toEchoString() const; std::string toEchoString(const tostring_visitor *visitor) const; void toStream(std::ostringstream &stream) const; void toStream(const tostream_visitor *visitor) const; std::string chrString() const; const VectorType &toVector() const; bool getVec2(double &x, double &y, bool ignoreInfinite = false) const; bool getVec3(double &x, double &y, double &z) const; bool getVec3(double &x, double &y, double &z, double defaultval) const; RangeType toRange() const; operator bool() const { return this->toBool(); } Value &operator=(const Value &v); bool operator==(const Value &v) const; bool operator!=(const Value &v) const; bool operator<(const Value &v) const; bool operator<=(const Value &v) const; bool operator>=(const Value &v) const; bool operator>(const Value &v) const; Value operator-() const; Value operator[](const Value &v) const; Value operator+(const Value &v) const; Value operator-(const Value &v) const; Value operator*(const Value &v) const; Value operator/(const Value &v) const; Value operator%(const Value &v) const; friend std::ostream &operator<<(std::ostream &stream, const Value &value) { if (value.type() == Value::ValueType::STRING) stream << QuotedString(value.toString()); else stream << value.toString(); return stream; } typedef boost::variant< boost::blank, bool, double, str_utf8_wrapper, VectorType, RangeType > Variant; private: static Value multvecnum(const Value &vecval, const Value &numval); static Value multmatvec(const VectorType &matrixvec, const VectorType &vectorvec); static Value multvecmat(const VectorType &vectorvec, const VectorType &matrixvec); Variant value; }; void utf8_split(const std::string& str, std::function f); openscad-2019.05/src/version.cc0000644000076500000240000000323613417146620016672 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "version.h" #define QUOTE(x__) # x__ #define QUOTED(x__) QUOTE(x__) std::string openscad_shortversionnumber = QUOTED(OPENSCAD_SHORTVERSION); std::string openscad_versionnumber = QUOTED(OPENSCAD_VERSION); std::string openscad_displayversionnumber = #ifdef OPENSCAD_COMMIT QUOTED(OPENSCAD_VERSION) " (git " QUOTED(OPENSCAD_COMMIT) ")"; #else QUOTED(OPENSCAD_SHORTVERSION); #endif std::string openscad_detailedversionnumber = #ifdef OPENSCAD_COMMIT openscad_displayversionnumber; #else openscad_versionnumber; #endif openscad-2019.05/src/version.h0000644000076500000240000000317113417146620016532 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.org) * Copyright (C) 2009-2019 Clifford Wolf and * Marius Kintel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #pragma once #include // Version number without any patch level indicator extern std::string openscad_shortversionnumber; // The full version number, e.g. 2014.03, 2015.03-1, 2014.12.23 extern std::string openscad_versionnumber; // Version used for display, typically without patchlevel indicator, // but may include git commit id for snapshot builds extern std::string openscad_displayversionnumber; // Version used for detailed display extern std::string openscad_detailedversionnumber; openscad-2019.05/src/version_check.cc0000644000076500000240000000003413402025764020017 0ustar kintelstaff00000000000000#include "version_check.h" openscad-2019.05/src/version_check.h0000644000076500000240000000704013441031431017654 0ustar kintelstaff00000000000000// version_check.h by don bright 2012. Copyright assigned to Marius Kintel and // Clifford Wolf 2012. Released under the GPL 2, or later, as described in // the file named 'COPYING' in OpenSCAD's project root. /* This file will check versions of libraries at compile time. If they are too old, the user will be warned. If the user wishes to force compilation, they can run qmake CONFIG+=skip-version-check Otherwise they will be guided to README.md and an -build-dependencies script. The extensive #else #endif is to ensure only a single error is printed at a time, to avoid confusion. */ #pragma once #ifndef OPENSCAD_SKIP_VERSION_CHECK #include // Needed by gmp.h under OS X 10.10 #include // set minimum numbers here. #define GMPMAJOR 5 #define GMPMINOR 0 #define GMPPATCH 0 #define SYS_GMP_VER (__GNU_MP_VERSION * 10000 + __GNU_MP_VERSION_MINOR * 100 + __GNU_MP_VERSION_PATCHLEVEL * 1) #if SYS_GMP_VER < GMPMAJOR * 10000 + GMPMINOR * 100 + GMPPATCH * 1 #error GNU GMP library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #include #if MPFR_VERSION < MPFR_VERSION_NUM( 3,0,0 ) #error GNU MPFR library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #include #if !EIGEN_VERSION_AT_LEAST( 3,0,0 ) #error eigen library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #include // boost 1.3.5 = 103500 #if BOOST_VERSION < 103500 #error boost library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #ifdef ENABLE_CGAL #pragma push_macro("NDEBUG") #undef NDEBUG #include #pragma pop_macro("NDEBUG") #if CGAL_VERSION_NR < 1030601000 #error CGAL library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #if CGAL_VERSION_NR < 1040021000 #warning "=======================" #warning "." #warning "." #warning "." #warning "." #warning CGAL library version is old, risking buggy behavior. Please see README.md. Continuing anyway. #warning "." #warning "." #warning "." #warning "." #warning "=======================" #ifdef __clang__ #error For Clang to work, CGAL must be >= 4.0.2 #endif #endif // CGAL_VERSION_NR < 10400010000 #endif //ENABLE_CGAL #ifdef ENABLE_OPENCSG #include // kludge - GLEW doesn't have compiler-accessible version numbering #ifndef GLEW_ARB_occlusion_query2 #error GLEW library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #include // 1.3.2 -> 0x0132 #if OPENCSG_VERSION < 0x0132 #error OPENCSG library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #else #endif // ENABLE_OPENCSG #ifndef OPENSCAD_NOGUI #include #if QT_VERSION < 0x040400 #error QT library missing or version too old. See README.md. To force compile, run qmake CONFIG+=skip-version-check #endif // QT #endif #ifdef ENABLE_OPENCSG #endif // OpenCSG #endif // GLEW #endif // ENABLE_OPENCSG #ifdef ENABLE_CGAL #endif // CGAL error #endif // ENABLE_CGAL #endif // Boost #endif // Eigen #endif // MPFR #endif // GMP // see github issue #552 #define GCC_VERSION (__GNUC__ * 10000 \ + __GNUC_MINOR__ * 100 \ + __GNUC_PATCHLEVEL__) #if GCC_VERSION == 40802 #warning "gcc 4.8.2 contains a bug causing a crash in CGAL." #endif #endif // OPENSCAD_SKIP_VERSION_CHECK openscad-2019.05/src/version_helper.h0000644000076500000240000000150013441031431020051 0ustar kintelstaff00000000000000#pragma once #include namespace OpenSCAD { struct library_version_number { const unsigned int major; const unsigned int minor; const unsigned int micro; }; const auto get_version_string = [](const library_version_number& header_version, const library_version_number& runtime_version) { std::ostringstream version_stream; version_stream << header_version.major << '.' << header_version.minor << '.' << header_version.micro; const bool match = (header_version.major == runtime_version.major && header_version.minor == runtime_version.minor && header_version.micro == runtime_version.micro); if (!match) { version_stream << " (runtime: " << runtime_version.major << '.' << runtime_version.minor << '.' << runtime_version.micro << ')'; } const std::string version = version_stream.str(); return version; }; }openscad-2019.05/test-code/exportdxf.cc0000644000076500000240000001141313402025764020323 0ustar kintelstaff00000000000000/* * OpenSCAD (www.openscad.at) * Copyright (C) 2009 Clifford Wolf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * As a special exception, you have permission to link this program * with the CGAL library and distribute executables, as long as you * follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from CGAL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "myqhash.h" #include "openscad.h" #include "node.h" #include "module.h" #include "context.h" #include "value.h" #include "export.h" #include "builtin.h" #include "Tree.h" #include "CGALRenderer.h" #include "PolySetCGALRenderer.h" #include #include #include #include #include #include #include QString commandline_commands; const char *make_command = NULL; QSet dependencies; QString currentdir; QString examplesdir; QString librarydir; using std::string; void handle_dep(QString filename) { if (filename.startsWith("/")) dependencies.insert(filename); else dependencies.insert(QDir::currentPath() + QString("/") + filename); if (!QFile(filename).exists() && make_command) { char buffer[4096]; snprintf(buffer, 4096, "%s '%s'", make_command, filename.replace("'", "'\\''").toUtf8().data()); system(buffer); // FIXME: Handle error } } // FIXME: enforce some maximum cache size (old version had 100K vertices as limit) QHash cache; void cgalTree(Tree &tree) { assert(tree.root()); CGALRenderer renderer(cache, tree); Traverser render(renderer, *tree.root(), Traverser::PRE_AND_POSTFIX); render.execute(); } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } const char *filename = argv[1]; int rc = 0; initialize_builtin_functions(); initialize_builtin_modules(); QApplication app(argc, argv, false); QDir original_path = QDir::current(); currentdir = QDir::currentPath(); QDir libdir(QApplication::instance()->applicationDirPath()); #ifdef Q_WS_MAC libdir.cd("../Resources"); // Libraries can be bundled if (!libdir.exists("libraries")) libdir.cd("../../.."); #elif defined(Q_OS_UNIX) if (libdir.cd("../share/openscad/libraries")) { librarydir = libdir.path(); } else if (libdir.cd("../../share/openscad/libraries")) { librarydir = libdir.path(); } else if (libdir.cd("../../libraries")) { librarydir = libdir.path(); } else #endif if (libdir.cd("libraries")) { librarydir = libdir.path(); } Context root_ctx; root_ctx.functions_p = &builtin_functions; root_ctx.modules_p = &builtin_modules; root_ctx.set_variable("$fn", Value(0.0)); root_ctx.set_variable("$fs", Value(1.0)); root_ctx.set_variable("$fa", Value(12.0)); root_ctx.set_variable("$t", Value(0.0)); Value zero3; zero3.type = Value::VECTOR; zero3.vec.append(new Value(0.0)); zero3.vec.append(new Value(0.0)); zero3.vec.append(new Value(0.0)); root_ctx.set_variable("$vpt", zero3); root_ctx.set_variable("$vpr", zero3); AbstractModule *root_module; ModuleInstantiation root_inst; AbstractNode *root_node; QFileInfo fileInfo(filename); handle_dep(filename); FILE *fp = fopen(filename, "rt"); if (!fp) { fprintf(stderr, "Can't open input file `%s'!\n", filename); exit(1); } else { QString text; char buffer[513]; int ret; while ((ret = fread(buffer, 1, 512, fp)) > 0) { buffer[ret] = 0; text += buffer; } fclose(fp); if(!parse(root_module, (text+commandline_commands).toAscii().data(), fileInfo.absolutePath().toLocal8Bit(), false)) { delete root_module; // parse failed root_module = NULL; } if (!root_module) { exit(1); } } QDir::setCurrent(fileInfo.absolutePath()); AbstractNode::resetIndexCounter(); root_node = root_module->evaluate(&root_ctx, &root_inst); Tree tree; tree.setRoot(root_node); cgalTree(tree); CGAL_Nef_polyhedron N = cache[tree.getString(*root_node)]; QDir::setCurrent(original_path.absolutePath()); QTextStream outstream(stdout); export_dxf(&N, outstream, NULL); PolySetRenderer::setRenderer(NULL); destroy_builtin_functions(); destroy_builtin_modules(); return rc; } openscad-2019.05/test-code/exportdxf.pro0000644000076500000240000000557313402025764020550 0ustar kintelstaff00000000000000DEFINES += OPENSCAD_VERSION=test TEMPLATE = app OBJECTS_DIR = cgal-objects MOC_DIR = cgal-objects UI_DIR = cgal-objects RCC_DIR = cgal-objects INCLUDEPATH += ../src macx { macx { DEPLOYDIR = $$(MACOSX_DEPLOY_DIR) !isEmpty(DEPLOYDIR) { INCLUDEPATH += $$DEPLOYDIR/include LIBS += -L$$DEPLOYDIR/lib } } CONFIG -= app_bundle LIBS += -framework Carbon } CONFIG += qt QT += opengl CONFIG += cgal include(../cgal.pri) include(../eigen2.pri) LEXSOURCES += ../src/lexer.l YACCSOURCES += ../src/parser.y HEADERS += ../src/builtin.h \ ../src/cgal.h \ ../src/context.h \ ../src/csgterm.h \ ../src/dxfdata.h \ ../src/dxfdim.h \ ../src/dxftess.h \ ../src/export.h \ ../src/expression.h \ ../src/function.h \ ../src/grid.h \ ../src/module.h \ ../src/node.h \ ../src/dxflinextrudenode.h \ ../src/dxfrotextrudenode.h \ ../src/projectionnode.h \ ../src/importnode.h \ ../src/csgnode.h \ ../src/transformnode.h \ ../src/rendernode.h \ ../src/openscad.h \ ../src/polyset.h \ ../src/printutils.h \ ../src/value.h \ ../src/progress.h \ ../src/traverser.h \ ../src/csgnode.h \ ../src/visitor.h \ ../src/nodedumper.h \ ../src/CGALRenderer.h \ ../src/nodecache.h \ ../src/importnode.h \ ../src/state.h \ ../src/PolySetRenderer.h \ ../src/PolySetCGALRenderer.h \ ../src/myqhash.h \ ../src/Tree.h SOURCES += exportdxf.cc \ ../src/export.cc \ ../src/value.cc \ ../src/expr.cc \ ../src/func.cc \ ../src/module.cc \ ../src/node.cc \ ../src/context.cc \ ../src/csgterm.cc \ ../src/polyset.cc \ ../src/csgops.cc \ ../src/transform.cc \ ../src/primitives.cc \ ../src/projection.cc \ ../src/cgaladv.cc \ ../src/cgaladv_minkowski2.cc \ ../src/cgaladv_minkowski3.cc \ ../src/surface.cc \ ../src/control.cc \ ../src/render.cc \ ../src/import.cc \ ../src/dxfdata.cc \ ../src/nef2dxf.cc \ ../src/dxftess.cc \ ../src/dxftess-glu.cc \ ../src/dxftess-cgal.cc \ ../src/dxfdim.cc \ ../src/dxflinextrude.cc \ ../src/dxfrotextrude.cc \ ../src/printutils.cc \ ../src/progress.cc \ ../src/nodedumper.cc \ ../src/CGALRenderer.cc \ ../src/traverser.cc \ ../src/PolySetRenderer.cc \ ../src/PolySetCGALRenderer.cc \ ../src/qhash.cc \ ../src/Tree.cc openscad-2019.05/test-code/nef_polyhedron_2-bug.cc0000644000076500000240000001002013437640540022303 0ustar kintelstaff00000000000000#pragma push_macro("NDEBUG") #undef NDEBUG #include #include #include #include #include #include #include #pragma pop_macro("NDEBUG") typedef CGAL::Lazy_exact_nt FT; typedef CGAL::Simple_cartesian Kernel; typedef CGAL::Bounded_kernel Extended_kernel; // typedef CGAL::Exact_predicates_inexact_constructions_kernel MyKernel; // typedef CGAL::Bounded_kernel > MyKernel; typedef CGAL::Extended_cartesian MyKernel; typedef CGAL::Nef_polyhedron_2 Nef_polyhedron; typedef Nef_polyhedron::Point Point; typedef Nef_polyhedron::Explorer Explorer; typedef Explorer::Vertex_const_iterator Vertex_const_iterator; typedef Explorer::Face_const_iterator Face_const_iterator; typedef Explorer::Hole_const_iterator Hole_const_iterator; typedef Explorer::Halfedge_around_face_const_circulator Halfedge_around_face_const_circulator; typedef Explorer::Vertex_const_handle Vertex_const_handle; typedef Explorer::Vertex_handle Vertex_handle; typedef Explorer::Halfedge_const_handle Halfedge_const_handle; void print(const Nef_polyhedron &RST) { // CGAL::set_pretty_mode(std::cout); // std::cout << RST << std::endl; Explorer explorer = RST.explorer(); explorer.print_statistics(); CGAL::Object_index VI(explorer.vertices_begin(), explorer.vertices_end(), 'v'); for (Vertex_const_iterator vit = explorer.vertices_begin(); vit!=explorer.vertices_end(); ++vit) { std::cout << VI(vit, true); if (explorer.is_standard(vit)) std::cout << " [ " << to_double(explorer.point(vit).x()) << ", " << to_double(explorer.point(vit).y()) << " ]"; std::cout << "\n"; } for (Face_const_iterator fit = explorer.faces_begin(); fit != explorer.faces_end(); fit++) { std::cout << "explorer.mark(explorer.faces_begin()) " << ((explorer.mark(fit))? "is part of polygon" : "is not part of polygon") << std::endl; if (fit->halfedge() == Halfedge_const_handle()) std::cout << "X\n"; else { Halfedge_around_face_const_circulator hafc = explorer.face_cycle(fit), done(hafc); do { Vertex_const_handle vh = explorer.target(hafc); std::cout << VI(vh, true) << " "; if (explorer.is_standard(vh)) std::cout << "[" << to_double(explorer.point(vh).x()) << ", " << to_double(explorer.point(vh).y()) << "], " ; hafc++; } while(hafc != done); std::cout << std::endl; } if (fit->fc_begin() == fit->fc_end()) { std::cout << "Y\n"; } else { for (Hole_const_iterator hit = explorer.holes_begin(fit); hit != explorer.holes_end(fit); hit++){ std::cout << "Hole: "; Halfedge_around_face_const_circulator hafc(hit), done(hit); do{ Vertex_const_handle vh = explorer.target(hafc); std::cout << VI(vh, true) << " "; if (explorer.is_standard(vh)) std::cout << "[" << to_double(explorer.point(vh).x()) << ", " << to_double(explorer.point(vh).y()) << "], " ; hafc++; }while(hafc != done); std::cout << std::endl; } } } } int main() { Point tris[15] = { Point(45,100), Point(45,50), Point(60,80), Point(140,0), Point(45,50), Point(0,0), Point(0,140), Point(0,0), Point(50,140), Point(45,100), Point(50,140), Point(0,0), Point(45,100), Point(0,0), Point(45,50), }; std::list > polylines; polylines.push_back(std::make_pair(tris+0, tris+3)); polylines.push_back(std::make_pair(tris+3, tris+6)); polylines.push_back(std::make_pair(tris+6, tris+9)); polylines.push_back(std::make_pair(tris+9, tris+12)); polylines.push_back(std::make_pair(tris+12, tris+15)); Nef_polyhedron RST(polylines.begin(), polylines.end(), Nef_polyhedron::POLYGONS); print(RST); Nef_polyhedron N; for (std::list >::const_iterator iter = polylines.begin(); iter != polylines.end(); iter++) { N += Nef_polyhedron(iter->first, iter->second, Nef_polyhedron::INCLUDED); } print(N); return 0; } openscad-2019.05/testdata/amf/amf_broken.amf0000644000076500000240000000401113417146624021247 0ustar kintelstaff00000000000000 OpenSCAD 2018.12.31 0 a 0 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 2 3 0 2 3 2 4 5 3 4 1 6 4 2 1 4 7 6 0 0 6 1 3 5 0 0 5 7 5 4 7 7 4 6 openscad-2019.05/testdata/amf/cube-with-hole.amf0000644000076500000240000013515513402025764021771 0ustar kintelstaff00000000000000 -5.000000 -5.000000 0.000000 -5.000000 5.000000 10.000000 -5.000000 5.000000 0.000000 -5.000000 5.000000 10.000000 -5.000000 -5.000000 0.000000 -5.000000 -5.000000 10.000000 5.000000 5.000000 10.000000 3.000000 0.000000 10.000000 5.000000 -5.000000 10.000000 2.942360 0.585271 10.000000 2.771640 1.148050 10.000000 2.494410 1.666710 10.000000 2.121320 2.121320 10.000000 1.666710 2.494410 10.000000 1.148050 2.771640 10.000000 0.585271 2.942360 10.000000 0.000000 3.000000 10.000000 -5.000000 5.000000 10.000000 -0.585271 2.942360 10.000000 -2.942360 0.585271 10.000000 -3.000000 0.000000 10.000000 -2.771640 1.148050 10.000000 -2.494410 1.666710 10.000000 -2.121320 2.121320 10.000000 -1.666710 2.494410 10.000000 -1.148050 2.771640 10.000000 2.942360 -0.585271 10.000000 2.771640 -1.148050 10.000000 2.494410 -1.666710 10.000000 2.121320 -2.121320 10.000000 1.666710 -2.494410 10.000000 1.148050 -2.771640 10.000000 0.585271 -2.942360 10.000000 0.000000 -3.000000 10.000000 -5.000000 -5.000000 10.000000 -0.585271 -2.942360 10.000000 -1.148050 -2.771640 10.000000 -5.000000 5.000000 10.000000 -5.000000 -5.000000 10.000000 -2.942360 -0.585271 10.000000 -1.666710 -2.494410 10.000000 -2.121320 -2.121320 10.000000 -2.494410 -1.666710 10.000000 -2.771640 -1.148050 10.000000 5.000000 5.000000 0.000000 5.000000 -5.000000 0.000000 -5.000000 5.000000 10.000000 -5.000000 5.000000 0.000000 3.000000 0.000000 0.000000 2.942360 -0.585271 0.000000 2.771640 -1.148050 0.000000 2.494410 -1.666710 0.000000 2.121320 -2.121320 0.000000 1.666710 -2.494410 0.000000 1.148050 -2.771640 0.000000 0.585271 -2.942360 0.000000 0.000000 -3.000000 0.000000 -5.000000 -5.000000 0.000000 -0.585271 -2.942360 0.000000 -2.942360 -0.585271 0.000000 -3.000000 0.000000 0.000000 -2.771640 -1.148050 0.000000 -2.494410 -1.666710 0.000000 -2.121320 -2.121320 0.000000 -1.666710 -2.494410 0.000000 -1.148050 -2.771640 0.000000 2.942360 0.585271 0.000000 2.771640 1.148050 0.000000 2.494410 1.666710 0.000000 2.121320 2.121320 0.000000 1.666710 2.494410 0.000000 1.148050 2.771640 0.000000 0.585271 2.942360 0.000000 0.000000 3.000000 0.000000 -5.000000 5.000000 0.000000 -0.585271 2.942360 0.000000 -1.148050 2.771640 0.000000 -5.000000 -5.000000 0.000000 -5.000000 5.000000 0.000000 -2.942360 0.585271 0.000000 -1.666710 2.494410 0.000000 -2.121320 2.121320 0.000000 -2.494410 1.666710 0.000000 -2.771640 1.148050 0.000000 -5.000000 -5.000000 0.000000 5.000000 -5.000000 10.000000 -5.000000 -5.000000 10.000000 -5.000000 -5.000000 0.000000 5.000000 -5.000000 0.000000 2.942360 -0.585271 10.000000 -0.585271 -2.942360 0.000000 -1.148050 -2.771640 10.000000 -0.585271 -2.942360 10.000000 -0.585271 -2.942360 0.000000 -1.148050 -2.771640 0.000000 -1.148050 2.771640 0.000000 -0.585271 2.942360 10.000000 -1.148050 2.771640 10.000000 -1.148050 2.771640 0.000000 -0.585271 2.942360 0.000000 -2.771640 1.148050 10.000000 -2.494410 1.666710 10.000000 -2.494410 1.666710 0.000000 -2.771640 1.148050 0.000000 -3.000000 0.000000 10.000000 -2.942360 0.585271 10.000000 -2.942360 0.585271 0.000000 -3.000000 0.000000 0.000000 -2.494410 1.666710 10.000000 -2.121320 2.121320 10.000000 -2.121320 2.121320 0.000000 -2.494410 1.666710 0.000000 -1.148050 2.771640 10.000000 -1.666710 2.494410 10.000000 -1.666710 2.494410 0.000000 -1.148050 2.771640 0.000000 -0.585271 2.942360 10.000000 -0.585271 2.942360 0.000000 -1.666710 2.494410 10.000000 -2.121320 2.121320 10.000000 -2.121320 2.121320 0.000000 -1.666710 2.494410 0.000000 0.000000 -3.000000 10.000000 0.585271 -2.942360 10.000000 0.585271 -2.942360 0.000000 0.000000 -3.000000 0.000000 1.148050 -2.771640 10.000000 1.666710 -2.494410 10.000000 1.666710 -2.494410 0.000000 1.148050 -2.771640 0.000000 1.666710 -2.494410 10.000000 2.121320 -2.121320 10.000000 2.121320 -2.121320 0.000000 1.666710 -2.494410 0.000000 2.771640 -1.148050 10.000000 2.771640 -1.148050 0.000000 2.771640 -1.148050 10.000000 2.494410 -1.666710 10.000000 -0.585271 -2.942360 10.000000 0.000000 -3.000000 10.000000 0.000000 -3.000000 0.000000 -0.585271 -2.942360 0.000000 -1.666710 -2.494410 0.000000 -2.121320 -2.121320 10.000000 -1.666710 -2.494410 10.000000 -1.666710 -2.494410 0.000000 -2.121320 -2.121320 0.000000 -2.494410 -1.666710 10.000000 -2.771640 -1.148050 0.000000 -2.771640 -1.148050 10.000000 -2.771640 -1.148050 0.000000 -2.494410 -1.666710 0.000000 -2.942360 -0.585271 10.000000 -3.000000 0.000000 10.000000 -3.000000 0.000000 0.000000 -2.942360 -0.585271 0.000000 -2.121320 -2.121320 10.000000 -2.494410 -1.666710 10.000000 -2.494410 -1.666710 0.000000 -2.121320 -2.121320 0.000000 -2.942360 0.585271 10.000000 -2.771640 1.148050 0.000000 -2.771640 1.148050 10.000000 -2.771640 1.148050 0.000000 -2.942360 0.585271 0.000000 0.585271 -2.942360 10.000000 1.148050 -2.771640 10.000000 1.148050 -2.771640 0.000000 0.585271 -2.942360 0.000000 2.494410 -1.666710 0.000000 2.494410 -1.666710 10.000000 2.121320 -2.121320 10.000000 2.771640 -1.148050 0.000000 2.942360 -0.585271 0.000000 2.942360 -0.585271 10.000000 2.771640 -1.148050 10.000000 -1.148050 -2.771640 0.000000 -1.666710 -2.494410 10.000000 -1.148050 -2.771640 10.000000 -1.148050 -2.771640 0.000000 -1.666710 -2.494410 0.000000 -2.771640 -1.148050 10.000000 -2.942360 -0.585271 0.000000 -2.942360 -0.585271 10.000000 -2.942360 -0.585271 0.000000 -2.771640 -1.148050 0.000000 0 1 2 3 4 5 6 7 8 6 9 7 6 10 9 6 11 10 6 12 11 6 13 12 6 14 13 6 15 14 6 16 15 17 16 6 16 17 18 19 17 20 21 17 19 22 17 21 23 17 22 24 17 23 25 17 24 18 17 25 26 8 7 27 8 26 28 8 27 29 8 28 30 8 29 31 8 30 32 8 31 33 8 32 34 33 35 34 35 36 34 20 37 20 38 39 33 38 8 40 38 36 41 38 40 42 38 41 43 38 42 39 38 43 8 44 6 44 8 45 44 46 6 46 44 47 45 48 44 45 49 48 45 50 49 45 51 50 45 52 51 45 53 52 45 54 53 45 55 54 45 56 55 57 56 45 56 57 58 59 57 60 61 57 59 62 57 61 63 57 62 64 57 63 65 57 64 58 57 65 66 44 48 67 44 66 68 44 67 69 44 68 70 44 69 71 44 70 72 44 71 73 44 72 74 73 75 74 75 76 74 60 77 60 78 79 73 78 44 80 78 76 81 78 80 82 78 81 83 78 82 79 78 83 84 85 86 85 87 88 71 13 14 13 71 70 49 7 48 7 49 89 90 91 92 91 93 94 73 15 16 15 73 72 95 96 97 96 98 99 100 82 101 102 100 103 67 11 68 11 67 10 68 12 69 12 68 11 70 12 13 12 70 69 72 14 15 14 72 71 104 79 105 106 104 107 108 81 109 110 108 111 80 112 113 112 114 115 99 16 116 16 117 73 110 118 119 118 120 121 48 9 66 9 48 7 55 122 123 122 124 125 53 126 127 126 128 129 52 130 131 130 132 133 51 134 135 136 51 137 125 138 139 138 140 141 142 143 144 143 145 146 147 148 149 150 147 151 152 107 153 154 152 155 156 151 157 158 156 159 66 10 67 10 66 9 160 161 162 163 160 164 129 165 166 165 167 168 132 137 169 170 132 171 172 89 173 174 172 175 176 177 178 177 179 180 181 182 183 184 181 185 0 0 0 0 0 0 Material 1 1.000.790.14 Material 2 0.800.190.19 Material 3 0.870.850.24 Material 4 0.270.310.83 openscad-2019.05/testdata/amf/multi-volume-binary.amf0000644000076500000240000004403113402025764023066 0ustar kintelstaff00000000000000PKq3IA8G4$multi-volume-binary.amf}ے]{BLO9d/8dT?Ҷx K^Aqx?z?>w߽?>ӋWo?߼y=埞={/ó?;Ï{q+^O?xÿ>`w޽Yx_/ܲ7O7Or7okU7YݖU1y.Ē 9MKMnKtv ƲX !wrz[ZjVx%ÄzN[bz_C6ݬ,i k*9j79-75rYa[s`&Ւv:NaSYa6pNw)TnVT%Vzh,Ja*-{YpTyBD~9/:UEͩ1M_5LSc..ɩ.9ScϔmqoE{PoKbE ”`B=USu_uKuۺYYuv:J*Z/E:SDL5DU'UN(4Q`]0\'bu*Ƭ)'0gjW0bÖj [qy󌫞eD8+3ݩywo߿~>w 7Or`~_+<+)xD% T,PɈJAT@"*r܇d?B PR9򷄊Bn6g*w !)2x *WCeP /PePܣ lh4A٣vȐGQ{=EN9Z/VF *CT!;*CT!BQ%x` %Ub$ٛK-M%l8pn%FI=$= Cg.I6 \Wt>;%xKJ8չВ0cNY&prIi$SחZ_E F E$Qd'^9)}Eia!e\.i;ђ\J]sYחb?,0É3'0Ζ8rd7pmx&Ǥ$zRP-zEIAiI<奨ǡrJKtkJK*v]Liix4 n@{+﯍|})!/'<xGd(!{\"|<%YJKzhIz -(-II?C8Ai)nI6O'4AZ5H:H_ R׆ǩJKuђ%BiIzhInJaTǩ.N=0dpOi"uZincl⛷?߼p㳣{?v^G6헵`5]Ot8˺q뗐rŒe9Gj^! ɁĸF,chKPF$:muŌ>aUO!`SSi7'RRJ0LsA( ly@InFtrM8@xZliKnF[Jj klTZ5dZJjOsQw0j1i)~t<31"ii-Gt-95h'.Դ%rM o*dsZFts벹@v7ej*5'yb>y_H_HQ_Hק@*ҧ W,ҧW,ҧXOf_DyD[?I4t iiiyġc?MaHn'e$lYל!'?̓{_֕?E:Mho4y>lÃA0ĥs1,&bWaڡ[mذU ح=aB Yempnœ=ytx[Ix Hx1 iEZx+ KjYҋOan4&/)f\kp0-tX1.]7h]j\7Ѽggzqh%Ƙ֧%m̈́ђq-ҾѲ~4iJ(lѼ_2$l>0EL5ќ)a<mH,q-q~S-K93`Fm;bYgyӒJSߔh\r +ѱ.XI )+6dW BwFkݰD3ZRTK݆1{rnwr1?^~sY.3qdSJj)4^:=q0Sj*|E'_ BMF-E,h'{=ݩDu _G橷l8vDON;{19C =:uA6?vU'ʖ=m$mVL'3"}N;UmB2'WFRF엨_+:%<)<](3F tNG37q{p6u/ b_4>+btJwED:`w.Ѻ6[VTSGf>b4\3ꑋ&:w-F'X9f`Kl^ %o!t`jUٹs3;ͦ Fvq<~5dnG:/iUr܁F\/.)dڻ֝?;2\$p8Tw)o+i00S|"GPVݸF&pH40;ҰS7BO},~|6ҪyiyK.٨hbaMF0UI2և}qc/ kgRS21W|"HKwQt圗qm@4~yF;kc&cZqK8},F-u8Ş=v+ojꨥy34OZ"-Ӈt-6}AnL6'K )fPj3Xb bǿ]IT|B aSq&_T @9qu7]F#~Az:Dt<[d~4PZ'jt\#зu<<׍˔eڬPN*n~h>"rO ?dL33V\9wP3Z݃Fvϧ/F٫GJ.ns:uvx\vi _Fьvn6X+=uBg : ?D;GЎ;;O7`LIdjjAՙ:L-[߉3^@/NNąv⬌wJ:qVL-5tcXwbXh7oD[-3|=bdp3nх0|:naTcie(N`?O2jϩK&Wp8y8Duo\Pw.߉{N;bavo;LnyN|{2 5ͥ?[<{/N~w720cD:r`Lxv2jז~[!G_͆aK霉S'v^7FF+`^F"a'17NY*Z|KdeWgl?L3R=9R=,ivt qTWh`N!G3ye1/95#hC:Z#|!sJmc˳ o}L+twPg<::ͩFGtt4vD؀tL{ Β;x4')ii^f;GAfȝӲok44Zlh45hiaX- j<|+LV"Jh_X6 vFSX?03^X葒  csqH`ѫ8hkn~8[b9q[=:xfɴg?zCxFpF{s٢E2RQCe72[j?Y%Fi&gCǎɒS4:R}ӎZn^z؛ޓ7Sm= U=h[|+G84#T)Q%N$z՗ۨ#n>BXe|C#hi뛉K[ߌZ2OMڱlѴ& Z 4,ObOML%K&J YVyW?&г#1 `nS.]q6m8noӺ?RmmN׍OMcX0㧇eZj,6ZcvN kMՔM6M!ye.[J)qgo +6kG/^w'ѱ[?Q4;`+M8D*KjM*x칙ZÑ9DF KJz1ƿ;'ILf6g$i&N0zs c>!+{fs>Lݓ4~f}oiTnkDw8L}CǧE1O8%WEzvB%gxBf4-)К%5IC]Ӵgk&9im5Kvԭ Jv˴`kL s XUp8Ś%ޕHXv<}g5`H`F3 5^lJڍ7~LѶq4~OSix&: 3ډ Pgne<(&ąp+[B5ꮇ {y7S Ks4MK>ihO:ȑֺ4;uFv{#KKe:Kh?éjHkIOin]e25ciLMYw:Q4ξ۴_wtyt?QOg~3 6-9 7pd$A hHGy6r䛟S5Ҝ?iMԁVת8ztowOro7t40̏ږ7Ҩ;ZMMQ]XGG'wFm\V|h'x2(GE@uCA\뎺QAM1j(h0%WIoѫ:GW2,9YT>Axϒפ O s^6|L`-[:z Y Bn7hF2KDc MϹCg@`ħ'3"9÷~?0Q*GѫۙhF!׎tuEᱣw8L<]]Qt7S\ t|[ƻy 87dg)Ɋ K{zDٗ?!{| fLд4u/gYWhvϡ 3\wj^}1=jtNu`v]j<)utI3~L 5C4^G7 LLG^%XkJ/ƀ^O4#ȦhcѶ6J3mxi(IMt;өWh&7҇v?e$S<"w/v1|vC~e[u3=B?oKS0M4[oAw5`i4iߚh fnFMAXhIz-41+, n̸=61IozD箪iȦp?ߎvO6zVo=ѳn2iEown 3e9%vtKO>Ѻy+-~CvQԎEONe*0CCT ^/`cf'LPRLz~{:ݿÉGO^i%djox-ܢ;y^'<2%=vj;)Z퟈y[|} u<@q-3Mԓ"uwN|ryB>y]a87~KlMv5S'Kt&!6keΣ'8?6N7q:;.ĉ33ׇԏhW ba (0Ւ"xvka]bѼMOyF3"E_2,C";Lc=/^ƕMLiJ %~Jg]^Ҷ{ykar'( )hFñuugfLьnֲQ6zRjkp$>GK捄IG?B @uZ7^}%5=;|cOn4<5 4bwmVNh G D7S^*TckJtwv?x5%zQ ;bnt҈cь 4ʁofyVdF浥i#Q%zv3d)z {)F;-噮9dΧ;e HYdZbE9 *R.'̐9SI1 +3ڐMSbd)}G-oOKɆSR + 4~`B^űUV>|oWo^sa{+jt/w~G ~J@T<*QIJD~n*ܗ 5'nB jj: $$r^#C9@2N !!E< D*&eX6HH2 AQ-C!({e22[Bp *C!*55%_Z-CT!BeP *CʐeHgLiL2$ *CR!aZ(C%(CDn Z -CV!k"k"+ʐ2dP!Cex$B2dh *CPe(2h *CPW%& &b T*P5Q5QeP*T(C>C>CU& ^MQ *aSaʰAeeؠeؠeؤHT *æ(--Eh8›­B:nV-[f],ӂzVxx/iG^,G$n`=t~9%LB?-$I'z fӂ& =N(J !% X촰2Zz| dEH"LI5<(m]" r-b])X7d |fiR.`?.`d4z3NJE0Z8ᢤ8p>x?-Qyp8+qO az%0+aHn`Zd]R܎Kطh%&|I = 'xν8qRR@ C)pr0'a8) 2֍uCubq8p:I2F!ee QRb̌é'f\wJz(g8qRU놔q8KpIy-R(Fv,ek܆Ɔ)a6ޯME7_㼍YlCn#-&R)nKs7aݐ)nqǽ^-{8퓴_8O~2]_,زY]%{=-SZf%ec>KnZںb2KSZuۨm 8qJ 놔 8q.K5(-,\ǹN |w8\ǹ/<8>M FKC 8>qO K"(-I76\#> V Вp. CX% +/ /i\@ F ^&H2)p. \@rVG?$sTZ_e)p2rV\?8;sDZ=0`?x/%[Rwހ̃DpwA 8pWu{}ptA RteJK/\#pl9Hc#)2y)p2%8VZb*CR 6 BQcPZJ1Xe5ҡ(cE 8Vp2HʀkCw?~U%ݨD7o#*U^_ hI)~p\4h#i6I70L6AF:HXb#n9HHZQF8(a3zETgWhIxl]T!|E3W"zPu^BK"Pz/3KNQՏ?*bL$=y{TZDGx)8w!;DwR!Cy((-_R_&CZsmc/)Oqenݸ"ƱE;(,9[F b]It^9֓⽸l7sTZ|_@%(uH<$}aZ7 ghhJZγ,R,-CdeK &")%W$uD, b2ľTqo}Aœ=j"ጸ>*JpF\>_JK:_x/:/a"~/|uiw YˌVWItӒth*ɺ!^K1nhVQ" Io>_-bjk(, wChi1=B+X_[i~=j`=dw%Y_&bwgŘ9u @<j e-wC]}7Q+I}<0ZI%-qRK,e"-E@KpS M` ~sKjIdH-iua^{u10],Ŵ$ d9d] [aA%\F c2$ㄖ!q6_ ^ it,1m] X:"-_d]\}oßvWb߆I(7&a kE}$Ŗ#֥` N;ǡ4!JR= &?9#$7,?i]}uigjIa .:F˵ zxZ7"Eh3Mɺ,$y. gڴu9]v*SYc/E]rYcR] ~òu[)>_6͡h"5f@r/`^sbz9BJs"MI6oF2U_i 2ĵxBf.D<;8f| \x>lzo#󍸗3gý`GHV}~ui RǽKR/L⋲u`ͷ!sI.`Z^a8xFEiIzHѓ>Dm8HM̙Ұ f5^3(-M zѓ:s\Ӯ0 ziN~%m YVi I_@ jȺ<]8FټTq8^ªђ꾘 qψH c~RZ qǵX~a|6JKpǵ*-2w3%Ria{d(ݕ$@tCO yE -}=ZnBb$j9DIM8FfE2Cm6 .y8ǡͻas -ͷ!6l1=;cGuiymԓ٬L.Iq*ԟ04Z-{_R?'6au{yI7E(w_ƾ_%|lbp|C{+/zZd] =$,{j8q}Wj9$ ňȺH_FY@E/[9$RhIQm4>:눒TCi;EY"2L*I} G%$,Jyy"$+n0ZR>|Z6Rc6 8Tϖp}T5I\ې76s5IuZ  %A.%!&\p_@8-Qln06KVf!>߄{4 )YH$6 χMՄsل#1X|I3EKK!$r&_N?J!%w`2LX7g$$Yq#Zd $G/<9YחZ8'uIؘ,I.[q`nHqu$ K'ً)c!a$ܳ0Y?-sX:)Kw%7 C &S06K"~חZ>RwJtRZub='<=a$͠IxNX78vX7*R.ʐВtɐВD2'Ycf<'+KWf~8-)~gQݐQRE֥_xVXQ kt-sz͘n0Z3CR_[zf{,4Zmqc&泑{d~uCBKHHK#gcq ZyL)t-| R+kTZXA2Rm&=8w:X*CGiy"%uk}]D籍F3'r8nXJ}RjzHm>)J (q]d( fCی{)[!u]R#^,;Âh"-ZHǂ^=GiQTCsUpmwfSKi2z{+ƶ Sׅudϲ4?NKO?|Gϗ4 {O"-l7p/Yz RB_d]ʋޤ{Dg" Gϗ"gY7"!I7$v]*-.BK\@R?^]dn?~GlTJF ߕoM B엖i@mOoTpbp37%5s3ܰ[]J .3ZRP7=<$(cZHM7RZ 1Ej-ѿ"5rKR/"C"-.He-"":/D ]Eu -~ZdxJ6d]ph!%y2\a+a$;h=F.BH ..H.(-L"'N"-|hI<7=\j]Dgs|xU~ӯ>ϯy+ޟ㯾?~ZOqN4WzqyKExë_}xÿ÷﫷_;wo޽KɅ{.Go/_ev˃Dl?ƆlKȆ'F#Ȇi?Fl?qxl-0߼zחPKq3IA8G4$multi-volume-binary.amfPKEGopenscad-2019.05/testdata/amf/sphere20face.amf0000644000076500000240000001366713402025764021427 0ustar kintelstaff00000000000000 Sphere20 -2.62866 4.25325 0 -0.525731 0.850651 0 2.62866 4.25325 0 0.525731 0.850651 0 -2.62866 -4.25325 0 -0.525731 -0.850651 0 2.62866 -4.25325 0 0.525731 -0.850651 0 0 -2.62866 4.25325 0 -0.525731 0.850651 0 2.62866 4.25325 0 0.525731 0.850651 0 -2.62866 -4.25325 0 -0.525731 -0.850651 0 2.62866 -4.25325 0 0.525731 -0.850651 4.25325 0 -2.62866 0.850651 0 -0.525731 4.25325 0 2.62866 0.850651 0 0.525731 -4.25325 0 -2.62866 -0.850651 0 -0.525731 -4.25325 0 2.62866 -0.850651 0 0.525731 0 11 5 0 5 1 0 1 7 0 7 10 0 10 11 1 5 9 5 11 4 11 10 2 10 7 6 7 1 8 3 9 4 3 4 2 3 2 6 3 6 8 3 8 9 4 9 5 2 4 11 6 2 10 8 6 7 9 8 1 openscad-2019.05/testdata/amf/split_pyramid.amf0000644000076500000240000000101413402025764022017 0ustar kintelstaff00000000000000PKYD[ split_pyramid.amf͖n0O(d==A55X ;T`%ހ=ߏsltVmyZEL|Jt*T,>,~}L.PPw 2Ð<ŠIu. &EJÚfxbH!M\wͲ PQi5^u xEfzKا^5TkCug]?M?ӒkF]g '~ZAGk[# { r{Mb@VY[ p9ҞGXM r^+Xކ6thꆂ -࠷vzlCQg7wD8gO⹍Gnܢ8`yo 󯐑Ȩ4pPKYD[  split_pyramid.amfPK?openscad-2019.05/testdata/amf/tetra_multicolor.amf0000644000076500000240000000202513402025764022532 0ustar kintelstaff00000000000000 Color Tetrahedron 111 000 10.250 0.2510 0.40.40.5 Hard side 210100 013010 312001 032 openscad-2019.05/testdata/dxf/arc.dxf0000644000076500000240000002643213402025764017753 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ARC 5 43 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 100.0 100 AcDbArc 50 0.0 51 90.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0000000000000061 20 100.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 46 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 46 100 AcDbDictionary 281 1 3 DIMASSOC 350 48 3 HIDETEXT 350 47 0 DICTIONARYVAR 5 47 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 48 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/circle-advanced.dxf0000644000076500000240000003374513402025764022217 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 CIRCLE 5 43 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 87.3402112431611215 0 CIRCLE 5 44 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 10.0 0 CIRCLE 5 45 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 20.0 0 CIRCLE 5 46 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 50.0 30 0.0 40 10.0 0 CIRCLE 5 47 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 0.0 30 0.0 40 10.0 0 CIRCLE 5 48 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 -50.0 30 0.0 40 10.0 0 CIRCLE 5 49 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 0.0 30 0.0 40 10.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 20.0 30 0.0 11 -40.0 21 20.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 20.0 30 0.0 11 -40.0 21 40.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 40.0 30 0.0 11 -20.0 21 40.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 40.0 30 0.0 11 -20.0 21 20.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 20.0 30 0.0 11 40.0 21 20.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 20.0 30 0.0 11 40.0 21 40.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 40.0 30 0.0 11 20.0 21 40.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 40.0 30 0.0 11 20.0 21 20.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 -20.0 30 0.0 11 40.0 21 -20.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 -20.0 30 0.0 11 40.0 21 -40.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 -40.0 30 0.0 11 20.0 21 -40.0 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 -40.0 30 0.0 11 20.0 21 -20.0 31 0.0 0 LINE 5 56 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 -20.0 30 0.0 11 -40.0 21 -20.0 31 0.0 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 -20.0 30 0.0 11 -40.0 21 -40.0 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 -40.0 30 0.0 11 -20.0 21 -40.0 31 0.0 0 LINE 5 59 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 -40.0 30 0.0 11 -20.0 21 -20.0 31 0.0 0 CIRCLE 5 5A 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 70.7106781186547551 0 CIRCLE 5 5B 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 80.6225774829854913 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 5C 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 5C 100 AcDbDictionary 281 1 3 DIMASSOC 350 5E 3 HIDETEXT 350 5D 0 DICTIONARYVAR 5 5D 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 5E 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/circle-double.dxf0000644000076500000240000002716013402025764021716 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -30.0 20 30.0 30 0.0 11 30.0 21 30.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 30.0 30 0.0 11 30.0 21 -30.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 -30.0 30 0.0 11 -30.0 21 -30.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -30.0 20 -30.0 30 0.0 11 -30.0 21 30.0 31 0.0 0 CIRCLE 5 47 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 20.0 0 CIRCLE 5 48 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 20.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 49 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 49 100 AcDbDictionary 281 1 3 DIMASSOC 350 4B 3 HIDETEXT 350 4A 0 DICTIONARYVAR 5 4A 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4B 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/circle-small.dxf0000644000076500000240000002614313402025764021554 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 CIRCLE 5 43 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 8.0 0 CIRCLE 5 44 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 16.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 45 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 45 100 AcDbDictionary 281 1 3 DIMASSOC 350 47 3 HIDETEXT 350 46 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 47 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/circle.dxf0000644000076500000240000002576313402025764020455 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 CIRCLE 5 43 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 100.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 44 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 44 100 AcDbDictionary 281 1 3 DIMASSOC 350 46 3 HIDETEXT 350 45 0 DICTIONARYVAR 5 45 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/ellipse-arc-rot.dxf0000644000076500000240000003062413402025764022206 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ELLIPSE 5 43 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 40.0 21 40.0 31 0.0 40 0.4999999999999999 41 2.0344439357957027 42 4.2487413713838835 0 ELLIPSE 5 44 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 50.0 30 0.0 11 -10.0 21 10.0 31 0.0 40 3.4999999999999996 41 4.1016630159954808 42 2.1815222911841041 0 ELLIPSE 5 45 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 -50.0 30 0.0 11 -40.0 21 0.0 31 0.0 40 1.0 41 5.3558900891779739 42 3.6052402625905993 0 ELLIPSE 5 46 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 -50.0 30 0.0 11 40.0 21 -40.0 31 0.0 40 0.125 41 5.0711596506552619 42 1.3258176636680326 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -15.5922593382003001 20 72.9384937745331001 30 0.0 11 -72.9384937745331712 21 15.5922593382002859 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -73.9999999999999858 20 -17.9999999999999858 30 0.0 11 -14.2229123600033631 21 -32.1114561800016887 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 64.5521375021799741 20 -54.850712500726658 30 0.0 11 59.363291775690449 21 -68.7265835513808838 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 49.9999999999999929 20 14.2229123600033631 30 0.0 11 14.2229123600033702 21 50.0000000000000071 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4B 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4B 100 AcDbDictionary 281 1 3 DIMASSOC 350 4D 3 HIDETEXT 350 4C 0 DICTIONARYVAR 5 4C 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4D 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/ellipse-arc.dxf0000644000076500000240000002627313402025764021411 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ELLIPSE 5 43 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 40 0.5 41 0.0 42 1.5707963267948966 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0000000000000142 20 50.0 30 0.0 11 100.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 45 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 45 100 AcDbDictionary 281 1 3 DIMASSOC 350 47 3 HIDETEXT 350 46 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 47 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/ellipse-reverse.dxf0000644000076500000240000002704713402025764022317 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ELLIPSE 5 43 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 40 0.5 41 1.5707963267948966 42 0.0 0 ELLIPSE 5 44 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 10.0 30 0.0 11 100.0 21 0.0 31 0.0 40 0.5 41 0.0 42 1.5707963267948966 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0000000000000142 20 50.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 110.0 20 10.0 30 0.0 11 10.0000000000000036 21 60.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 47 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 47 100 AcDbDictionary 281 1 3 DIMASSOC 350 49 3 HIDETEXT 350 48 0 DICTIONARYVAR 5 48 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 49 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/ellipse-rot.dxf0000644000076500000240000002723313402025764021445 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ELLIPSE 5 43 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 40.0 21 40.0 31 0.0 40 0.4999999999999999 41 0.0 42 6.2831853071795862 0 ELLIPSE 5 44 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 50.0 30 0.0 11 -40.0 21 40.0 31 0.0 40 0.25 41 0.0 42 6.2831853071795862 0 ELLIPSE 5 45 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 -50.0 30 0.0 11 -20.0 21 -20.0 31 0.0 40 1.9999999999999998 41 0.0 42 6.2831853071795862 0 ELLIPSE 5 46 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 -50.0 30 0.0 11 40.0 21 -40.0 31 0.0 40 0.8749999999999999 41 0.0 42 6.2831853071795862 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 47 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 47 100 AcDbDictionary 281 1 3 DIMASSOC 350 49 3 HIDETEXT 350 48 0 DICTIONARYVAR 5 48 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 49 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/ellipse.dxf0000644000076500000240000002605413402025764020643 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ELLIPSE 5 43 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 40 0.5 41 0.0 42 6.2831853071795862 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 44 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 44 100 AcDbDictionary 281 1 3 DIMASSOC 350 46 3 HIDETEXT 350 45 0 DICTIONARYVAR 5 45 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/lwpolyline-closed.dxf0000644000076500000240000002610313402025764022646 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LWPOLYLINE 5 43 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbPolyline 90 3 70 1 10 50.0 20 50.0 10 0.0 20 0.0 10 0.0 20 50.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 44 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 44 100 AcDbDictionary 281 1 3 DIMASSOC 350 46 3 HIDETEXT 350 45 0 DICTIONARYVAR 5 45 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/lwpolyline.dxf0000644000076500000240000002622513402025764021404 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LWPOLYLINE 5 43 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbPolyline 90 3 70 0 10 0.0 20 0.0 10 0.0 20 50.0 10 50.0 20 50.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 0.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 45 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 45 100 AcDbDictionary 281 1 3 DIMASSOC 350 47 3 HIDETEXT 350 46 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 47 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/lwpolyline2.dxf0000644000076500000240000003200713402025764021461 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 0.0 21 50.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 50.0 30 0.0 11 50.0 21 50.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 50.0 21 100.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 100.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 70.0 21 80.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 80.0 30 0.0 11 70.0 21 50.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 50.0 30 0.0 11 60.0 21 40.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 40.0 30 0.0 11 50.0 21 40.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 40.0 30 0.0 11 50.0 21 0.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 0.0 30 0.0 11 20.0 21 0.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 0.0 30 0.0 11 20.0 21 10.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 10.0 30 0.0 11 40.0 21 10.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 10.0 30 0.0 11 40.0 21 40.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 40.0 30 0.0 11 10.0 21 40.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 40.0 30 0.0 11 10.0 21 0.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 54 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 54 100 AcDbDictionary 281 1 3 DIMASSOC 350 56 3 HIDETEXT 350 55 0 DICTIONARYVAR 5 55 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 56 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/multiple-layers.dxf0000644000076500000240000003256013402025764022335 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 Layer with a pretty long name including \ "special" /'\\ characters 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 3 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 LAYER 5 43 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 noname 70 0 62 7 420 0 6 CONTINUOUS 370 0 390 F 0 LAYER 5 44 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 Layer with a pretty long name including \ "special" /'\\ characters 70 0 62 7 420 0 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 40.0 30 0.0 11 40.0 21 40.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 40.0 30 0.0 11 40.0 21 -40.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 -40.0 30 0.0 11 -40.0 21 -40.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 -40.0 30 0.0 11 -40.0 21 40.0 31 0.0 0 CIRCLE 5 49 100 AcDbEntity 100 AcDbCircle 8 noname 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 40 70.7106781186547551 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 Layer with a pretty long name including \ "special" /'\\ characters 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 50.0000000000000142 21 86.6025403784438623 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 Layer with a pretty long name including \ "special" /'\\ characters 62 256 370 -1 6 ByLayer 10 50.0000000000000142 20 86.6025403784438623 30 0.0 11 -49.9999999999999858 21 86.6025403784438907 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 Layer with a pretty long name including \ "special" /'\\ characters 62 256 370 -1 6 ByLayer 10 -49.9999999999999858 20 86.6025403784438907 30 0.0 11 -100.0000000000000142 21 0.0000000000000122 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 Layer with a pretty long name including \ "special" /'\\ characters 62 256 370 -1 6 ByLayer 10 -100.0000000000000142 20 0.0000000000000122 30 0.0 11 -50.0000000000000497 21 -86.6025403784438481 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 Layer with a pretty long name including \ "special" /'\\ characters 62 256 370 -1 6 ByLayer 10 -50.0000000000000497 20 -86.6025403784438481 30 0.0 11 49.9999999999998579 21 -86.6025403784439618 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 Layer with a pretty long name including \ "special" /'\\ characters 62 256 370 -1 6 ByLayer 10 49.9999999999998579 20 -86.6025403784439618 30 0.0 11 100.0000000000000142 21 -0.0000000000002021 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 50 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 50 100 AcDbDictionary 281 1 3 DIMASSOC 350 52 3 HIDETEXT 350 51 0 DICTIONARYVAR 5 51 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 52 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/nothing-decimal-comma-separated.dxf0000644000076500000240000000113613402025764025302 0ustar kintelstaff00000000000000999 This tests should not crash but produce no visible result, see former issue 593. 0 SECTION 2 HEADER 9 $EXTMIN 10 -6,63671875 20 -0,0244140625 30 0,5 9 $EXTMAX 10 7,1357421875 20 0,921875 30 0,5 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 0 VPORT 2 *ACTIVE 41 1.000000 0 ENDTAB 0 TABLE 2 LAYER 0 LAYER 2 0 62 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 8 0 62 0 10 0,1 20 0,1 30 0 11 2,5 21 0 31 0 0 LINE 8 0 62 0 10 2,5 20 0 30 0 11 2,5 21 2,5 31 0 0 LINE 8 0 62 0 10 2,5 20 2,5 30 0 11 0 21 2,5 31 0 0 LINE 8 0 62 0 10 0 20 2,5 30 0 11 0,1 21 0,1 31 0 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/null-polygons.dxf0000644000076500000240000003044413402025764022026 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 nuts_access 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 2 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 16777215 6 CONTINUOUS 370 0 390 F 0 LAYER 5 43 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 nuts_access 70 0 62 7 420 16777215 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ARC 5 44 100 AcDbEntity 8 nuts_access 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 0.0 100 AcDbArc 50 0.0 51 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 nuts_access 62 256 370 -1 6 ByLayer 10 42.3600000000014418 20 0.0 30 0.0 11 52.3600000000014418 21 0.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 nuts_access 62 256 370 -1 6 ByLayer 10 52.3600000000014418 20 0.0 30 0.0 11 52.3600000000014418 21 10.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 nuts_access 62 256 370 -1 6 ByLayer 10 42.3600000000014418 20 0.0 30 0.0 11 42.3600000000014418 21 10.0 31 0.0 0 ARC 5 48 100 AcDbEntity 8 nuts_access 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 47.3600000000014418 20 10.0 30 0.0 40 0.0 100 AcDbArc 50 0.0 51 180.0 0 CIRCLE 5 49 100 AcDbEntity 100 AcDbCircle 8 nuts_access 62 256 370 -1 6 ByLayer 10 47.3600000000014418 20 10.0 30 0.0 40 0.0 0 CIRCLE 5 4A 100 AcDbEntity 100 AcDbCircle 8 nuts_access 62 256 370 -1 6 ByLayer 10 47.3600000000014418 20 10.0 30 0.0 40 0.0 0 ARC 5 4B 100 AcDbEntity 8 nuts_access 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 47.3600000000014418 20 10.0 30 0.0 40 5.0 100 AcDbArc 50 0.0 51 180.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4C 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4C 100 AcDbDictionary 281 1 3 DIMASSOC 350 4E 3 HIDETEXT 350 4D 0 DICTIONARYVAR 5 4D 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4E 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/open-polyline.dxf0000644000076500000240000002661213402025764022000 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 200.0 21 100.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 200.0 20 100.0 30 0.0 11 200.0 21 0.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 200.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 47 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 47 100 AcDbDictionary 281 1 3 DIMASSOC 350 49 3 HIDETEXT 350 48 0 DICTIONARYVAR 5 48 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 49 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-concave-hole.dxf0000644000076500000240000003321613402025764023234 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 30.0 21 0.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 0.0 30 0.0 11 30.0 21 20.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 20.0 30 0.0 11 80.0 21 20.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 80.0 20 20.0 30 0.0 11 80.0 21 80.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 80.0 20 80.0 30 0.0 11 20.0 21 80.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 80.0 30 0.0 11 20.0 21 70.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 70.0 30 0.0 11 70.0 21 70.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 70.0 30 0.0 11 70.0 21 30.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 30.0 30 0.0 11 20.0 21 30.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 30.0 30 0.0 11 20.0 21 0.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 60.0 30 0.0 11 60.0 21 40.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 40.0 30 0.0 11 5.0 21 40.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 40.0 30 0.0 11 5.0 21 95.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 95.0 30 0.0 11 50.0 21 95.0 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 95.0 30 0.0 11 50.0 21 85.0 31 0.0 0 LINE 5 56 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 85.0 30 0.0 11 13.0 21 85.0 31 0.0 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 13.0 20 85.0 30 0.0 11 13.0 21 60.0 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 13.0 20 60.0 30 0.0 11 60.0 21 60.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 59 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 59 100 AcDbDictionary 281 1 3 DIMASSOC 350 5B 3 HIDETEXT 350 5A 0 DICTIONARYVAR 5 5A 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 5B 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-concave-simple.dxf0000644000076500000240000002766613402025764023612 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -43.3012701892219454 20 -24.9999999999999929 30 0.0 11 -49.9999999999999361 21 86.602540378443905 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -49.9999999999999361 20 86.602540378443905 30 0.0 11 43.3012701892219312 21 25.0000000000000071 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 43.3012701892219312 20 25.0000000000000071 30 0.0 11 45.9807621135331388 21 -19.6410161513775883 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 45.9807621135331388 20 -19.6410161513775883 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 -5.9807621135331921 21 -49.6410161513775421 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -5.9807621135331921 20 -49.6410161513775421 30 0.0 11 -43.3012701892219454 21 -24.9999999999999929 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 49 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 49 100 AcDbDictionary 281 1 3 DIMASSOC 350 4B 3 HIDETEXT 350 4A 0 DICTIONARYVAR 5 4A 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4B 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-concave.dxf0000644000076500000240000003763613402025764022321 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 70.0 30 0.0 11 20.0 21 40.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 40.0 30 0.0 11 70.0 21 30.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 30.0 30 0.0 11 30.0 21 10.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 10.0 30 0.0 11 100.0 21 10.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 10.0 30 0.0 11 60.0 21 -10.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 -10.0 30 0.0 11 100.0 21 -20.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 -20.0 30 0.0 11 80.0 21 -30.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 80.0 20 -30.0 30 0.0 11 100.0 21 -70.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 -70.0 30 0.0 11 40.0 21 -40.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 -40.0 30 0.0 11 10.0 21 -80.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 -80.0 30 0.0 11 10.0 21 -20.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 -20.0 30 0.0 11 -80.0 21 -50.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -80.0 20 -50.0 30 0.0 11 -50.0 21 -10.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 -10.0 30 0.0 11 10.0 21 0.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 0.0 30 0.0 11 30.0 21 -20.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 -20.0 30 0.0 11 30.0 21 -30.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 -30.0 30 0.0 11 50.0 21 -30.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 -30.0 30 0.0 11 70.0 21 -40.0 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 -40.0 30 0.0 11 70.0 21 -30.0 31 0.0 0 LINE 5 56 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 -30.0 30 0.0 11 50.0 21 0.0 31 0.0 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 0.0 30 0.0 11 30.0 21 0.0 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 0.0 30 0.0 11 10.0 21 10.0 31 0.0 0 LINE 5 59 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 10.0 30 0.0 11 10.0 21 20.0 31 0.0 0 LINE 5 5A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 20.0 30 0.0 11 10.0 21 30.0 31 0.0 0 LINE 5 5B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 30.0 30 0.0 11 10.0 21 50.0 31 0.0 0 LINE 5 5C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 50.0 30 0.0 11 -50.0 21 0.0 31 0.0 0 LINE 5 5D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 0.0 30 0.0 11 -70.0 21 30.0 31 0.0 0 LINE 5 5E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -70.0 20 30.0 30 0.0 11 -10.0 21 80.0 31 0.0 0 LINE 5 5F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 80.0 30 0.0 11 -10.0 21 100.0 31 0.0 0 LINE 5 60 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 100.0 30 0.0 11 -120.0 21 30.0 31 0.0 0 LINE 5 61 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -120.0 20 30.0 30 0.0 11 -80.0 21 -10.0 31 0.0 0 LINE 5 62 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -80.0 20 -10.0 30 0.0 11 -100.0 21 -30.0 31 0.0 0 LINE 5 63 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -100.0 20 -30.0 30 0.0 11 -70.0 21 -70.0 31 0.0 0 LINE 5 64 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -70.0 20 -70.0 30 0.0 11 -140.0 21 -30.0 31 0.0 0 LINE 5 65 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -140.0 20 -30.0 30 0.0 11 -130.0 21 60.0 31 0.0 0 LINE 5 66 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -130.0 20 60.0 30 0.0 11 -30.0 21 120.0 31 0.0 0 LINE 5 67 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -30.0 20 120.0 30 0.0 11 70.0 21 110.0 31 0.0 0 LINE 5 68 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 70.0 20 110.0 30 0.0 11 60.0 21 70.0 31 0.0 0 LINE 5 69 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 70.0 30 0.0 11 20.0 21 70.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 6A 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 6A 100 AcDbDictionary 281 1 3 DIMASSOC 350 6C 3 HIDETEXT 350 6B 0 DICTIONARYVAR 5 6B 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 6C 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-holes-touch.dxf0000644000076500000240000002723113402025764023123 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 48.0 30 0.0 11 30.0 21 88.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 30.0 20 88.0 30 0.0 11 -20.0 21 88.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 48.0 30 0.0 11 30.0 21 48.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -20.0 20 88.0 30 0.0 11 -20.0 21 48.0 31 0.0 0 CIRCLE 5 47 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 63.0 30 0.0 40 7.5 0 CIRCLE 5 48 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 78.0 30 0.0 40 7.5 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 49 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 49 100 AcDbDictionary 281 1 3 DIMASSOC 350 4B 3 HIDETEXT 350 4A 0 DICTIONARYVAR 5 4A 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4B 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-intersect.dxf0000644000076500000240000002762013402025764022673 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 -50.0 30 0.0 11 50.0 21 -50.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 -50.0 30 0.0 11 50.0 21 50.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 -50.0 21 50.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 50.0 30 0.0 11 -50.0 21 -50.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4B 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4B 100 AcDbDictionary 281 1 3 DIMASSOC 350 4D 3 HIDETEXT 350 4C 0 DICTIONARYVAR 5 4C 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4D 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-many-holes.dxf0000644000076500000240000003734413402025764022753 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 -50.0 21 100.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 100.0 30 0.0 11 -50.0 21 130.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.0 20 130.0 30 0.0 11 50.0 21 130.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 130.0 30 0.0 11 50.0 21 0.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 110.0 30 0.0 11 -40.0 21 120.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -40.0 20 120.0 30 0.0 11 40.0 21 120.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 120.0 30 0.0 11 40.0 21 10.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 10.0 30 0.0 11 10.0 21 10.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 10.0 30 0.0 11 10.0 21 110.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 110.0 30 0.0 11 -40.0 21 110.0 31 0.0 0 CIRCLE 5 4F 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 25.0880000000000152 20 95.0272000000000503 30 0.0 40 2.7648000000000081 0 CIRCLE 5 50 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 25.1904000000000146 20 82.0224000000000473 30 0.0 40 3.2831937621773046 0 CIRCLE 5 51 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 24.4736000000000118 20 71.7824000000000382 30 0.0 40 2.1381747730248835 0 CIRCLE 5 52 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 29.3888000000000176 20 105.472000000000051 30 0.0 40 7.1070321456990699 0 CIRCLE 5 53 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 33.2800000000000153 20 87.6544000000000523 30 0.0 40 3.9526930566387226 0 CIRCLE 5 54 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 18.0224000000000082 20 88.3712000000000444 30 0.0 40 4.5160605841817496 0 CIRCLE 5 55 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 35.1232000000000184 20 79.462400000000045 30 0.0 40 2.1110300803162443 0 CIRCLE 5 56 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 16.3840000000000074 20 101.0688000000000528 30 0.0 40 4.2183331684446239 0 CIRCLE 5 57 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 17.6128000000000107 20 111.5136000000000678 30 0.0 40 4.5067634861394721 0 CIRCLE 5 58 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 29.7984000000000151 20 116.2240000000000606 30 0.0 40 2.1698170982827127 0 CIRCLE 5 59 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 23.6544000000000132 20 115.7120000000000601 30 0.0 40 1.2457497662050818 0 CIRCLE 5 5A 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 33.9968000000000217 20 95.4368000000000478 30 0.0 40 2.461862969379089 0 CIRCLE 5 5B 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 26.3168000000000148 20 89.8048000000000428 30 0.0 40 1.02910726360278 0 CIRCLE 5 5C 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 14.7456000000000085 20 76.3904000000000423 30 0.0 40 2.9322897537589938 0 CIRCLE 5 5D 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 18.4320000000000093 20 81.3056000000000409 30 0.0 40 0.8749059835205244 0 CIRCLE 5 5E 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 20.07040000000001 20 76.8000000000000398 30 0.0 40 1.455377449323713 0 CIRCLE 5 5F 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 17.4080000000000084 20 69.7344000000000364 30 0.0 40 3.3900432091641579 0 CIRCLE 5 60 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 30.4128000000000149 20 73.1136000000000337 30 0.0 40 3.0720000000000027 0 CIRCLE 5 61 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 37.0688000000000173 20 69.7344000000000364 30 0.0 40 2.335079270603043 0 CIRCLE 5 62 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 25.2928000000000139 20 76.2880000000000393 30 0.0 40 1.3113598438262539 0 CIRCLE 5 63 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 29.491200000000017 20 61.8496000000000308 30 0.0 40 6.6874334688279422 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 64 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 64 100 AcDbDictionary 281 1 3 DIMASSOC 350 66 3 HIDETEXT 350 65 0 DICTIONARYVAR 5 65 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 66 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-mesh.dxf0000644000076500000240000003046513402025764021630 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 140.0 30 0.0 11 0.0 21 140.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 140.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 0.0 21 140.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 140.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 140.0 30 0.0 11 45.0 21 100.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 45.0 20 100.0 30 0.0 11 60.0 21 80.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 45.0 21 100.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 45.0 20 50.0 30 0.0 11 140.0 21 0.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 80.0 30 0.0 11 45.0 21 50.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 45.0 20 50.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 45.0 20 100.0 30 0.0 11 45.0 21 50.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4E 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4E 100 AcDbDictionary 281 1 3 DIMASSOC 350 50 3 HIDETEXT 350 4F 0 DICTIONARYVAR 5 4F 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 50 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-overlap.dxf0000644000076500000240000002760713402025764022350 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 100.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 0.0 21 50.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 50.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 50.0 21 0.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 100.0 21 50.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 50.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 100.0 21 100.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4B 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4B 100 AcDbDictionary 281 1 3 DIMASSOC 350 4D 3 HIDETEXT 350 4C 0 DICTIONARYVAR 5 4C 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4D 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-riser.dxf0000644000076500000240000003762413402025764022024 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 CIRCLE 5 43 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 -5.0 20 55.0 30 0.0 40 1.5 0 CIRCLE 5 44 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 55.0 30 0.0 40 1.5 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 156.0 30 0.0 11 0.0 21 156.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 156.0 30 0.0 11 0.0 21 151.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 151.0 30 0.0 11 -10.0 21 151.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.4976541697914116 20 188.9977563603677595 30 0.0 11 1.5023458302085879 21 188.9977563603677595 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.4976541697914103 20 189.9977563603677595 30 0.0 11 -1.4976541697914116 21 188.9977563603677595 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.5023458302085879 20 188.9977563603677595 30 0.0 11 1.502345830208587 21 189.9977563603677595 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -4.0 20 200.0 30 0.0 11 -4.0 21 205.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -4.0 20 205.0 30 0.0 11 -10.0 21 205.0 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 4.0 20 205.0 30 0.0 11 4.0 21 200.0 31 0.0 0 LINE 5 4E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 4.0 20 200.0 30 0.0 11 1.4031552236521563 21 200.0 31 0.0 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -4.0000000000000009 20 200.0 30 0.0 11 -1.4148563846039739 21 200.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 2.752345830208589 20 196.9977563603677595 30 0.0 11 2.7498297991646306 21 193.9977563603677595 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.502345830208587 20 193.9977563603677595 30 0.0 11 2.7498297991646306 21 193.9977563603677595 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 2.752345830208589 20 196.9977563603677595 30 0.0 11 1.4031552236520406 21 196.9990366371471282 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.4031552236521068 20 196.9990366371471282 30 0.0 11 1.4031552236521563 21 200.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -2.747654169791411 20 196.9977563603677595 30 0.0 11 -2.7523458302085904 21 193.9977563603677595 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -2.7523458302085904 20 193.9977563603677595 30 0.0 11 -1.4976541697914103 21 193.9977563603677595 31 0.0 0 LINE 5 56 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.4141381897576664 20 196.9990366371471282 30 0.0 11 -2.747654169791411 21 196.9977563603677595 31 0.0 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.4148563846039739 20 200.0 30 0.0 11 -1.4145485302998744 21 196.9990362431889821 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.4976541697914103 20 189.9977563603677595 30 0.0 11 -1.4976541697914103 21 193.9977563603677595 31 0.0 0 LINE 5 59 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.502345830208587 20 189.9977563603677595 30 0.0 11 1.502345830208587 21 193.9977563603677595 31 0.0 0 LINE 5 5A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 -40.0 30 0.0 11 10.0 21 -40.0 31 0.0 0 LINE 5 5B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 151.0 30 0.0 11 -10.0 21 -40.0 31 0.0 0 CIRCLE 5 5C 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 -5.0 20 5.0 30 0.0 40 1.5 0 CIRCLE 5 5D 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 5.0 30 0.0 40 1.5 0 CIRCLE 5 5E 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 -5.0 20 140.0 30 0.0 40 1.5 0 CIRCLE 5 5F 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 70.0 30 0.0 40 1.5 0 CIRCLE 5 60 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 -5.0 20 70.0 30 0.0 40 1.5 0 CIRCLE 5 61 100 AcDbEntity 100 AcDbCircle 8 0 62 256 370 -1 6 ByLayer 10 5.0 20 140.0 30 0.0 40 1.5 0 LINE 5 62 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 205.0 30 0.0 11 4.0 21 205.0 31 0.0 0 LINE 5 63 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 -40.0 30 0.0 11 10.0 21 205.0 31 0.0 0 LINE 5 64 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 205.0 30 0.0 11 -10.0 21 156.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 65 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 65 100 AcDbDictionary 281 1 3 DIMASSOC 350 67 3 HIDETEXT 350 66 0 DICTIONARYVAR 5 66 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 67 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon-self-intersect.dxf0000644000076500000240000002660413402025764023623 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 0.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 47 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 47 100 AcDbDictionary 281 1 3 DIMASSOC 350 49 3 HIDETEXT 350 48 0 DICTIONARYVAR 5 48 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 49 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygon8.dxf0000644000076500000240000003140013402025764020754 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -49.2403876506104083 20 -8.6824088833465005 30 0.0 11 -74.1459880408624628 21 17.388860153681172 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -123.386375691472864 20 8.7064512703346502 30 0.0 11 -77.0481384643073568 21 -23.7399317434764328 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -77.0481384643073568 20 -23.7399317434764328 30 0.0 11 -93.2713299712129214 21 -46.9090503570592148 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -93.2713299712129214 20 -46.9090503570592148 30 0.0 11 0.0 21 -100.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -49.2403876506104083 20 -8.6824088833465005 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -138.4438985516028424 20 36.5142020840316022 30 0.0 11 -100.0 21 100.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -100.0 20 100.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.6794416688387912 20 57.0665768391163368 30 0.0 11 -123.386375691472864 21 8.7064512703346502 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -50.6794416688387912 20 57.0665768391163368 30 0.0 11 -74.1459880408624628 21 17.388860153681172 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -130.0 20 -100.0 30 0.0 11 -138.4438985516028424 21 36.5142020840316022 31 0.0 0 LINE 5 4D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 -100.0 30 0.0 11 -130.0 21 -100.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4E 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4E 100 AcDbDictionary 281 1 3 DIMASSOC 350 50 3 HIDETEXT 350 4F 0 DICTIONARYVAR 5 4F 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 50 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/polygons.dxf0000644000076500000240000003021213402025764021047 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 50.0 21 0.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 0.0 30 0.0 11 50.0 21 50.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 50.0 20 50.0 30 0.0 11 100.0 21 50.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 50.0 30 0.0 11 100.0 21 100.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 100.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 40.0 30 0.0 11 100.0 21 40.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 40.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 60.0 21 0.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 0.0 30 0.0 11 60.0 21 40.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4D 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4D 100 AcDbDictionary 281 1 3 DIMASSOC 350 4F 3 HIDETEXT 350 4E 0 DICTIONARYVAR 5 4E 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4F 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/transform-insert.dxf0000644000076500000240000004145113402025764022521 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 BLOCK_RECORD 5 43 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 testblock 340 0 0 BLOCK_RECORD 5 44 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 testblock2 340 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 45 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 testblock 70 0 10 0.0 20 0.0 30 0.0 3 testblock 1 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.0 20 0.0 30 0.0 11 -1.0 21 2.0 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.0 20 2.0 30 0.0 11 -3.0 21 2.0 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -3.0 20 2.0 30 0.0 11 -3.0 21 4.0 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -3.0 20 4.0 30 0.0 11 3.0 21 4.0 31 0.0 0 LINE 5 4A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 3.0 20 4.0 30 0.0 11 3.0 21 2.0 31 0.0 0 LINE 5 4B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 3.0 20 2.0 30 0.0 11 1.0 21 2.0 31 0.0 0 LINE 5 4C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.0 20 2.0 30 0.0 11 1.0 21 0.0 31 0.0 0 ENDBLK 5 4D 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 4E 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 testblock2 70 0 10 0.0 20 0.0 30 0.0 3 testblock2 1 0 LINE 5 4F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.0000000000000004 20 6.0 30 0.0 11 -1.0 21 8.0 31 0.0 0 LINE 5 50 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.0 20 8.0 30 0.0 11 -3.0 21 8.0 31 0.0 0 LINE 5 51 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -3.0 20 8.0 30 0.0 11 -3.0 21 10.0 31 0.0 0 LINE 5 52 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -3.0 20 10.0 30 0.0 11 3.0 21 10.0 31 0.0 0 LINE 5 53 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 3.0 20 10.0 30 0.0 11 3.0 21 8.0 31 0.0 0 LINE 5 54 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 3.0 20 8.0 30 0.0 11 1.0 21 8.0 31 0.0 0 LINE 5 55 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.0 20 8.0 30 0.0 11 0.9999999999999998 21 6.0 31 0.0 0 ENDBLK 5 56 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 57 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 10.0 30 0.0 11 10.0 21 -10.0 31 0.0 0 LINE 5 58 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 -10.0 30 0.0 11 -10.0 21 10.0 31 0.0 0 LINE 5 59 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -10.0 20 10.0 30 0.0 11 -1.0 21 10.0 31 0.0 0 LINE 5 5A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.0 20 10.0 30 0.0 11 10.0 21 10.0 31 0.0 0 LINE 5 5B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 -10.0 30 0.0 11 1.0 21 -10.0 31 0.0 0 LINE 5 5C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -1.0 20 -10.0 30 0.0 11 -10.0 21 -10.0 31 0.0 0 LINE 5 5D 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 10.0 30 0.0 11 40.0 21 -10.0 31 0.0 0 LINE 5 5E 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 -10.0 30 0.0 11 20.0 21 10.0 31 0.0 0 LINE 5 5F 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 20.0 20 10.0 30 0.0 11 29.0 21 10.0 31 0.0 0 LINE 5 60 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 31.0 20 10.0 30 0.0 11 40.0 21 10.0 31 0.0 0 LINE 5 61 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 40.0 20 -10.0 30 0.0 11 31.0 21 -10.0 31 0.0 0 LINE 5 62 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 29.0 20 -10.0 30 0.0 11 20.0 21 -10.0 31 0.0 0 INSERT 5 63 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 testblock2 10 29.9999999999999964 20 -4.0 30 0.0 41 1.0 42 -1.0 43 1.0 50 360.0 44 1.0 45 1.0 0 INSERT 5 64 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 testblock2 10 30.0 20 4.0 30 0.0 44 1.0 45 1.0 0 INSERT 5 65 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 testblock 10 0.0 20 -10.0 30 0.0 41 1.0 42 -1.0 43 1.0 50 360.0 44 1.0 45 1.0 0 INSERT 5 66 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 testblock 10 0.0 20 10.0 30 0.0 44 1.0 45 1.0 0 LINE 5 67 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 7.0710678118654755 30 0.0 11 67.0710678118654755 21 -0.0000000000000017 31 0.0 0 LINE 5 68 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 60.0 20 -7.0710678118654755 30 0.0 11 52.9289321881345245 21 0.0000000000000009 31 0.0 0 LINE 5 69 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 52.9289321881345245 20 0.0000000000000009 30 0.0 11 56.1109127034739927 21 3.1819805153394651 31 0.0 0 LINE 5 6A 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 56.8180194846605389 20 3.8890872965260113 30 0.0 11 60.0 21 7.0710678118654755 31 0.0 0 LINE 5 6B 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 67.0710678118654755 20 -0.0000000000000017 30 0.0 11 63.8890872965260073 21 -3.1819805153394651 31 0.0 0 LINE 5 6C 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 63.1819805153394611 20 -3.8890872965260117 30 0.0 11 60.0 21 -7.0710678118654755 31 0.0 0 INSERT 5 6D 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 testblock2 10 58.5857864376269077 20 1.4142135623730963 30 0.0 41 0.5 42 0.5 43 1.0 50 45.0 44 1.0 45 1.0 0 INSERT 5 6E 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 testblock2 10 61.4142135623730923 20 -1.4142135623730949 30 0.0 41 0.5 42 0.5 43 1.0 50 -135.0 44 1.0 45 1.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 6F 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 6F 100 AcDbDictionary 281 1 3 DIMASSOC 350 71 3 HIDETEXT 350 70 0 DICTIONARYVAR 5 70 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 71 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/dxf/triangle-with-duplicate-vertex.dxf0000644000076500000240000002657413402025764025256 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 100.0 21 0.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 100.0 20 0.0 30 0.0 11 0.0 21 100.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 100.0 30 0.0 11 0.0 21 0.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 47 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 47 100 AcDbDictionary 281 1 3 DIMASSOC 350 49 3 HIDETEXT 350 48 0 DICTIONARYVAR 5 48 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 49 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/image/black-white-gradient.png0000644000076500000240000002141713402025764023475 0ustar kintelstaff00000000000000PNG  IHDR3B IDATxu]ٲ$mZ%kK"oa=p_^CrX}CWsfNwז$?$p~~;(uZ?Imu?9p{?@?@0 # + 䡢@;2 sT* ` 0/;8o xFDsE]I!d Hupf ĺ:g]^\sOC<'_ƕ7|ޝ|k"|XCP ̻D0'A\}9򺘾O=i7|r{b΁a8Iq F\u9k A .YL}C|vs>+3st G,Y} gjN訙r9 4&$dKb4 G52{ꨧШXosI(Xn)CBU$&4CUYFS+#zvu&\uN`5s$ȣgR VteUbO?x v6UgH<cj\5fBŀ[&}uP$eTb,⪈'x Z,+'E 87'IA b# =5/~*eH@-z;ASR<{4z8x`(g2M7E3{;ϔU&>XngLY2VjCt c͂~Y?f'X%rM^e(ZjQP\=hq^䰗Zg FyќABoFЩib,`0mc-sˆtP|SCwHD3ZLU5r,Bj}0Ɯj`Lpλ?.l+ϷGQj*=>sBbC>W.f 2=#`Dd0 ϳ~4$ :fuF}/aiv.yŤD/|PC X/Н檺5?:A-O8C$ɦU"Sӯ4Sg0!5ʧP16Æ$τ(!$AcZi_PL1Zb瞈|)2XT8qL8H}I 3}Ll|}thdi(AxA-t) s" 1uB<, B@BϞ} 'p€j:#TKhƧ sO`O(Q%ƕ׺iC\%w qA(ז/$5΃(}ثSOuJБb$@[%yO<յ\2:#dSi0wJ &3j CR˗{VGf$`b\&u, 8:}xJVX.N|׮!Q|Uw BE]q<?CZ q`LL+WuaRqioA`1&NU,)Exzy0K=Pb."ܔޓ֯#+3MN%g ~3G$Sf4<@:%_KHy({JIBI)ܬwc~:ż2%SO3m >Xņq_Pҫ.BLd6aM أjk>5esxʯuЮyΒ*[$h) EpRgX!yJ]a htRFP(dh`,@-d,fyXM)bKR5Lxjd:m,b7Z^eF#XЩ=[+Cw4 VHvH[VB1ˬLfMOJ\x{f8ZV!%Q \,b̘R,a# p6+m- XaK@4-&9*npEӻщ%*e%|Cׁrb(\mkɅ/ 73.i-P[)Hȣdx2p"#Ζ&޺9gMS?miFAUڧt@2EgN\b'BdI6NC L'&!}|~%`fy/5fQeR˂5N$Li 4ߜt]03K[D9#,Jnc (?a_\zr&ii`h[<<8*\׊n3S:#1^k9.}S4D UhOMoBS{H"/AU:4 cnCQsS"Z|>ϳ:)J ҉I_MVFΏpfׯfQ5_ )UȣFaXM׌e <GUC J".wC0A ̀k%bR K*Ix<>A}"Q!*<52=a֎. h2Iey~=Vi52Y$5os_NR ?ڟP〈.&_fJȟ q$՟YKU/ӄUZ#ZT$m H)+Hmcn> ,tSCIߥ׶U%V P*֘ {ƸgA]3+6rtxG™$t  VP;coneXLJ /%0k?Nߖ+ ~ZG{\'7.h2:mx-3jk9!9VAj!ąȈGGĆi76E+<$ Z$!߂HF_ B aXrh'7uoS!qSK1*ظiei~1u%-S]UvPsG][hRI(RovUGT[g"<%"Gʐi99-S [6%1r;c>OV)_+ *}ڿ`ɢ{AO'[n%%J/4b\ :Κw WR ҡ,0;|8ϽUUhi;p:Ygl1`wXQc{q⌄q;o!@4qW` nc^rl2ƴeu EU GXM~>_ƤDlҫy]6 j>lI8HM78`q.|1i:ȁ0)˜=Kr".+9rӚ(Ό$.M`EX oravj&/^'Gk[ m/ C¾[<1݉qm}3폥m3!=M_miD87d0KC'GoӗBF[Xo_ ]$P_H.囁V-N-JBKYf_e 3eȑ+/F V{K7)Ϙ"7F#0UCF5˿~EqfJTۛ /0]-~w"#׊ix `y EM}]ͻ{fkaݭT]fY\Wk{]$ӛJkt+ )3]栛A,6Ǜ82I9e~=%bDqu޿էR~o CˊrJ/{3pp+:8ak/ٺ//0pB[ ,5aHx8ݿ Yӎj ʹƥML]׮(e%ܿhWr-:4mPw0v/:,Xy ^PWhmɈwf{!q $ ;ɏ9Dm㕉.<鋢Yoirc/0'o|C^.k4)C./۬bG"8bMX 5IEtG蘅Bo)KPʉ/|jqʮU/|D't p\d5/GO3jR|F0K0mxٞ&36moLuJ`Ǚ Ue-lӔQߛ۶- _86IԾqNgϔPgWߒ 2e =}QF8]k?mbi"]ns.}۹j(WZEN- \7ta@|uH`kEX 3է ;'^^s.=G /_@ҕH^cT.(B+ P4m|.b;jY_jqF8r/eH !.~tƻAHS,爚&/X覘}[c:y8X=bM2.fC/?Wco!}*cSӾ \_G2M5/y൷O&zgvۣR~l6>VZA<}2tEKU Dmn ,joev{W,PkK/ 2ӽ-0-mk"r xrϓnIENDB`openscad-2019.05/testdata/image/smiley.png0000644000076500000240000002560013402025764021010 0ustar kintelstaff00000000000000PNG  IHDR3B IDATx}Ww#GfDf/xhe[ܙ={{wF+>TMiHGG5Q_"25?P& 4!.a`j2bPfU깶ISah5xkIADC 0(3LjljD+:4ndP A$Hci۵Jy94|F$8ɥZk ) "ĤS_Mهo#`cLb@0wSDB xdyZia?P<,\j@,^ F J,8H.J!!RB(A{O<(0ɪe8_)J*%(PZj5NvN)<8ɻuBڝQKr1r n5_sų<  A6 82*DHAj*VZ+QPkGim DkVP~NE4jDvR %\H!O$D:!GJI)r.T7^4lgI~? Jsg"S8QQ#E%TRIU64 JI* xY&JH.VJ gqIʅ*#Γp'' .@"04B*P5TQUHJC耋a1ӰQ"5יJJiF[-EbΕE"AB"AJmu4doLڨUךB5,E&Yv(CawIǓb$qsB>0k-c1,<ϜZrArѫZ Dt0uf\Bn$HrQږ&rkSeW\vTVPfiI!Dp1^]FM _Ym!2%;\}\@i{\c܋Kj\v|Oe~=WI*z0) *K(߀63,ׯY$̕*0lXW7u(:yrU8 *^ B5 ׮y5϶h ֩P8LL4hTm+[ (Ҹd+Щj@v$aTpݪYo<´tssR 8Lnk5* Bl%!R٢s΅&mɟ&S E8[ +q6?Axd^m"ZQ9G(ެIU|3^wj&y-eﰽ8tv08Y/ZnV(4x -q8tp^+b8{7IӒnBkPO62Wy m (V5tz:['RV"F  "MŖ^$kho?]f[r6SQ:HzÕ㷪ջF4i{9ޯJF'YZT@ f`rӀhwEN]ewxY8,d㳪s <t콃:Tеx6\?GǗMF뿾8;-4> !@|?uGR;>ibsV47h-r.ˆQW2۳풡[i^4=_+eyO7PR 8 a$[H*n3R< U&a~7nndfDK^4ro2kTڝMVDYE$U$nhAPSvk7iNM~S"s  Cw/{b/{~>)(e'cg5i"՝Yp](]"ZnWNkTgh1hZ!8+n c&=~W"ۑP-4 XqB) *b^"=tTj?U$DB()Ai]2DdȜ09sd6J-b4sq8 GWU:D8:TxQs[<\!n ht[Ȳ0tk{4%!0+CDbs0LyW@]z\IRj;!J/S<`R]SD(- OW-u %TZk,J8uf{s$UnǾ)" n%&$tJvs2۳q c*7,KѰlu.vo]:D7 .Dd?zl^kF.IUe4ib>rIzY?x:AQh"`B_ԈPXQpEыX&qvBa;F-m0J#eI?*Ad򩉌STZ!=aU1kh5&N|!u,H]r#[.܇=1h7۽"ng-ZjD1A*9)z< E^{zT9'ͳ<-O*(jsnC.ɡQ!fhUm4*!ehY\)y SK0sT(!h¨Fm%B pӯ #$Pf\3(!Z3۱L!I$Ay|X?H)%5 %i%͵&FC`gxR <$)h?H<%2pvSLZچ8&PHR2iF\`pӖY${ν] gIed#+k`dvK$NRu0A&lɈhkH4O(;C&u(,^t ߮Dg`ə$>UYĩFU-$ifY jw`1ʹ.V˗/+NkHUVٶPbkgЊL8垺Aw NQ}2O$ކx=0ʃH ̶=gY:U-Lh1z:gEʙaOU.\&!WWow{&t\5[f!ja=+h1|s5  2ZX.Oz;pQoVaݓ^!pK 2jW'fZ'ޭ[^t3x8yt`Ec7_?O 2YcN,#_Z*: VPw:FHKxtkzHJPo}XUYiԮ[O04zuPVJ]#|z3\@/W(+;Ĩ4ZJZ՚oEVb:_7~$G'yRky/O;o<,8j((U;3d5[ëv2bV|-Ƌ=&''$IUr(ɛzZ:{}e|@]u@ZgW۬ 4LMn n>_p 6z2<:=u ߱#}Eq]4ZU;8t,$ݱ7hFsH(/Dk:۵Z+u767ej!`6_ M=.]Wz։Yk7 Na|3O:ޞD}Fn'44O_oڝzRlˤHv';Hb2 ǣ&*d"͇"Dj 0:"W `xRY83)lWT" W[vQmPʈLR Gz9g:˳;8?zHLj6.HfƶiV' rIDYZ26 (idl߫ zeaR\dYVbl- n[7 'uNY7OQi,ȯhwZd4.J{k< hN̜Z>= fݸ8*mGG oF8}&@k@ %6YF2).zg=ITZ[a nzYc"Nd7MkX̊ Z3E4h֪lq '_WgD'xUZ22io$$=9Ģ;l}sM G01d QmxyiOgf' @ʜF__s7p*yC t/dyj7Œ5OO$y&om2;'z+{%1J/Շ w|5˼t!b7NF<*Vj_BGlZ?4 oL7q=7/O:2ǫ2'Jj_bT.Өܻջf̪'h8/(ROGlxBg;nv{G:vr,hլ}5r4V0JSQ\8K4\8=:9Ǫd0OIY0qtT4'2YqvoFoۭy8¬j3>_L'j$Ϥ,1-h{G͚ЮN((p ;IDATbֺe1ŸtʊXej^/BJs-"(Ms.ʋ RB *v>ԫp.2MNvz>_o;pvըV,!_C:0X& $x.2ɑS4=Vm5jzĬΖnk{{:-]uR|KBMΓl:$bR3rK8ڥ]ZFZwJ@G.Mq"\Lוg]C$vUSdYfYI9R+$x^+kGa hxӓ !~Z,-+e)"S+%T$29 0eؖcچcI0_g[=|XI|>]&˯u:gHZ+PRq'JȨ .:[ 8H ;Ƚ[9mr>J(,1-}W#(""hzZ,o&vi7Ft\G8E<6۶OݗKM*nS \fDD8b?wo}7v66MERkö,Y]lKy.hLbԴ ?M&:]^OnRqz>:af쥨lA(%69@r0Fwq}@ֺafj[&3yYo黫2&'nyr*(亼 Wc%,֟ |9[l?Ndi5H,e0z=E}vq6@fqs2L&z:k5:[߼ܰgg뀜dYI6tdym)~3 K KV;͒,su&(N.äACn>~i.@-W"`1N.zGJ:~潥[ˋK">@R䈋|{R" U?c]yʶtFk*#h%<^/&Qf]*r3|]E]$>LØ'yg'FկFecѨ.Iu8am|?I6 rH~G(:lj*Vŷ/NlӲl2Ƕz^̓bԿ:;<\\d1$VnK}v-BAE0|y)q?C Zۧ޴Y٬Vp%Y o2 #/WmԪU3F,DdI^-*JrQtrď\#zFQu]f߂Gb>_Mes!Ս{?Az%~ezǟ}'u31˴7j_lʼnCò+Fn5jk2 F&Kn떵"Zs7Ȝg^Lt lƼ"jߨ*5s,vLYH5DWd3uγg Ǯ7"̧?!z7Uu=˵L˱,۰(DFM%Tm uy)w<֋|l궟}=}6`1$snj R 2 Ӱ*d$3$LIA#$sto_}ysJb6&H?PJL4 nfnr33sJ*$BFZ l7Ȝ㳿|^d Zd2GEr`  D Djg?BwР~._|yہy׃t\4bM'wNL"|y`C p6"N{l w@(Y9=W筇6f>i)z6GUR }y˂?b<M&:H3)u9_#n5*O֫l8M0ʸGp}^JdQ0_MǓj L*4l' $Um?ٳbKAYfd$Y.B i-c߹ W./{GOM tXo<9<ϵjk1A%T ņ 1,kNz#)%x N4˒417r*7٩ *" E>`Zn<;5A/openscad for f in [gb]*.scad; do echo $f; $scad -o ,.stl $f; done ``` And here's the output: ``` bad-include-synerr.scad ERROR: Parser error in file "/res/doug/src/openscad/testdata/manual/issue214/syntax-error-in-line-2.scad", line 2: syntax error Can't parse file 'bad-include-synerr.scad'! bad-includeX.scad WARNING: Can't open import file '"cube.stl"'. Current top level object is empty. bad-synerr.scad ERROR: Parser error in file "/res/doug/src/openscad/testdata/manual/issue214/bad-synerr.scad", line 3: syntax error Can't parse file 'bad-synerr.scad'! bad-useX2.scad DEPRECATED: Imported file (cube2.stl) found in document root instead of relative to the importing module. This behavior is deprecated good-include2.scad good-includeX2.scad good-use2.scad good-useX.scad ``` I'm testing a bunch of combinations of `include` and `use` to make sure that pathname interpretation still works as before. Note that `include` and `use` use different algorithms for looking up relative pathnames in an `import` statement, as reflected in these tests. The behaviour of `include` looks like a bug. But, the behaviour is unchanged from before this pull request. I have two test cases for syntax errors: * `bad-include-synerr.scad` tests a syntax error in an included file: the reported filename is the name of the included file, and the line number is correct. * `bad-synerr.scad` tests a syntax error in the root script, after including a file that doesn't have a syntax error. The improvement is that the reported line number is correct. These tests should also be run in the GUI, since different code is involved. Use a similar shell script: ``` scad=/openscad for f in [gb]*.scad; do echo $f; $scad $f; done ``` This script will open each window one at a time; verify the results then close the window, and the next window will pop up. openscad-2019.05/testdata/manual/issue214/X/cube.stl0000644000076500000240000000273713402025764022431 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal -0 0 1 outer loop vertex -5 5 5 vertex 5 -5 5 vertex 5 5 5 endloop endfacet facet normal 0 0 1 outer loop vertex 5 -5 5 vertex -5 5 5 vertex -5 -5 5 endloop endfacet facet normal 0 0 -1 outer loop vertex -5 -5 -5 vertex 5 5 -5 vertex 5 -5 -5 endloop endfacet facet normal -0 0 -1 outer loop vertex 5 5 -5 vertex -5 -5 -5 vertex -5 5 -5 endloop endfacet facet normal 0 -1 0 outer loop vertex -5 -5 -5 vertex 5 -5 5 vertex -5 -5 5 endloop endfacet facet normal 0 -1 -0 outer loop vertex 5 -5 5 vertex -5 -5 -5 vertex 5 -5 -5 endloop endfacet facet normal 1 -0 0 outer loop vertex 5 -5 5 vertex 5 5 -5 vertex 5 5 5 endloop endfacet facet normal 1 0 0 outer loop vertex 5 5 -5 vertex 5 -5 5 vertex 5 -5 -5 endloop endfacet facet normal 0 1 -0 outer loop vertex 5 5 -5 vertex -5 5 5 vertex 5 5 5 endloop endfacet facet normal 0 1 0 outer loop vertex -5 5 5 vertex 5 5 -5 vertex -5 5 -5 endloop endfacet facet normal -1 0 0 outer loop vertex -5 -5 -5 vertex -5 5 5 vertex -5 5 -5 endloop endfacet facet normal -1 -0 0 outer loop vertex -5 5 5 vertex -5 -5 -5 vertex -5 -5 5 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/manual/issue214/X/import.scad0000644000076500000240000000003713402025764023124 0ustar kintelstaff00000000000000module m() import("cube.stl"); openscad-2019.05/testdata/manual/issue214/X/import2.scad0000644000076500000240000000004013402025764023200 0ustar kintelstaff00000000000000module m() import("cube2.stl"); openscad-2019.05/testdata/manual/issue214/bad-include-synerr.scad0000644000076500000240000000023413402025764025071 0ustar kintelstaff00000000000000// https://github.com/openscad/openscad/issues/214 // Line numbers in error messages are incorrect after an include. include openscad-2019.05/testdata/manual/issue214/bad-includeX.scad0000644000076500000240000000003513402025764023700 0ustar kintelstaff00000000000000include m(); openscad-2019.05/testdata/manual/issue214/bad-synerr.scad0000644000076500000240000000004013402025764023443 0ustar kintelstaff00000000000000include m(); :-( openscad-2019.05/testdata/manual/issue214/bad-useX2.scad0000644000076500000240000000003213402025764023130 0ustar kintelstaff00000000000000use m(); openscad-2019.05/testdata/manual/issue214/cube2.stl0000644000076500000240000000273713402025764022304 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal -0 0 1 outer loop vertex -5 5 5 vertex 5 -5 5 vertex 5 5 5 endloop endfacet facet normal 0 0 1 outer loop vertex 5 -5 5 vertex -5 5 5 vertex -5 -5 5 endloop endfacet facet normal 0 0 -1 outer loop vertex -5 -5 -5 vertex 5 5 -5 vertex 5 -5 -5 endloop endfacet facet normal -0 0 -1 outer loop vertex 5 5 -5 vertex -5 -5 -5 vertex -5 5 -5 endloop endfacet facet normal 0 -1 0 outer loop vertex -5 -5 -5 vertex 5 -5 5 vertex -5 -5 5 endloop endfacet facet normal 0 -1 -0 outer loop vertex 5 -5 5 vertex -5 -5 -5 vertex 5 -5 -5 endloop endfacet facet normal 1 -0 0 outer loop vertex 5 -5 5 vertex 5 5 -5 vertex 5 5 5 endloop endfacet facet normal 1 0 0 outer loop vertex 5 5 -5 vertex 5 -5 5 vertex 5 -5 -5 endloop endfacet facet normal 0 1 -0 outer loop vertex 5 5 -5 vertex -5 5 5 vertex 5 5 5 endloop endfacet facet normal 0 1 0 outer loop vertex -5 5 5 vertex 5 5 -5 vertex -5 5 -5 endloop endfacet facet normal -1 0 0 outer loop vertex -5 -5 -5 vertex -5 5 5 vertex -5 5 -5 endloop endfacet facet normal -1 -0 0 outer loop vertex -5 5 5 vertex -5 -5 -5 vertex -5 -5 5 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/manual/issue214/good-include2.scad0000644000076500000240000000003413402025764024033 0ustar kintelstaff00000000000000include m(); openscad-2019.05/testdata/manual/issue214/good-includeX2.scad0000644000076500000240000000003613402025764024165 0ustar kintelstaff00000000000000include m(); openscad-2019.05/testdata/manual/issue214/good-use2.scad0000644000076500000240000000003013402025764023200 0ustar kintelstaff00000000000000use m(); openscad-2019.05/testdata/manual/issue214/good-useX.scad0000644000076500000240000000003113402025764023247 0ustar kintelstaff00000000000000use m(); openscad-2019.05/testdata/manual/issue214/import2.scad0000644000076500000240000000004013402025764022771 0ustar kintelstaff00000000000000module m() import("cube2.stl"); openscad-2019.05/testdata/manual/issue214/syntax-error-in-line-2.scad0000644000076500000240000000003613402025764025547 0ustar kintelstaff00000000000000// syntax error in line 2 :-( openscad-2019.05/testdata/modulecache-tests/README.txt0000644000076500000240000001320513452431322023017 0ustar kintelstaff00000000000000Some work is needed to include these into the automated test suite. For now, run them manually according to these instructions: Compile OpenSCAD in debug mode and always run OpenSCAD from the cmd-line using the argument --debug=FileModule,ModuleCache. This will give console output related to module caching, e.g.: FileModule: /path/to/used.scad: 0x103612f70 Test1: Basic cache ------ o Turn off Design->Automatic Reload and Compile o Open use.scad o Compile twice (F5) - check that module reference is the same and that ModuleCache only says "Compiling library: /path/to/used.scad" once. o touch used.scad o Compile (F5) - check that ModuleCache says "Recompiling cached library: /path/to/used.scad". Test2: MCAD ------ o Open use-mcad.scad o Compile (F5) o Check that you get a rounded box Test3: Overload USEd module ------ o Open moduleoverload.scad o Compile (F5) o Verify that you get a sphere rather than a cylinder Test4: Recursive USE ------ o Open recursivemain.scad o Compile (F5) o Verify that OpenSCAD won't hang or crash Test5: Circular USE ------ o Open circularmain.scad o Compile (F5) o Verify that OpenSCAD won't hang or crash Test6: Dependency tracking of common file USEd by multiple modules ------ o Open multiplemain.scad o Compile (F5) - verify that you get a sphere and a cube of approximately the same size o Edit multipleB.scad: - cube(1.5*F(), center=true); + cube(2.5*F(), center=true); o Reload and Compile (F4) - verify that the cube got larger o Edit multiplecommon.scad: - function F() = 20; + function F() = 10; o Reload and Compile (F4) - verify that the sphere and the cube both got smaller Test7: Dependency tracking of file included from module ------ o Open includefrommodule.scad o Compile (F5) - Verify that you get a circular disc o Edit radius.scad: Change RADIUS o Compile (F5) - Verify that the disc changed size Test8: Circular include ------ o Open circularincludemain.scad o Compile (F5) o Verify that OpenSCAD won't hang or crash Test9: Missing include file appears ------ o rm missing.scad o Open includemissing.scad o Compile (F5) o Verify that you get: WARNING: Can't open include file 'missing.scad'. o echo "module missing() { sphere(10); }" > missing.scad o Reload and Compile (F4) - verify that the sphere appeared o rm missing.scad o Reload and Compile (F4) - verify that the sphere is still there o echo "module missing() { sphere(20); }" > missing.scad o Reload and Compile (F4) - verify that the sphere increased in size Test10: Missing include file in subpath appears ------ o rm subdir/missingsub.scad o Open includemissingsub.scad o Compile (F5) o Verify that you get: WARNING: Can't open include file 'subdir/missingsub.scad'. o echo "module missingsub() { sphere(10); }" > subdir/missingsub.scad o Reload and Compile (F4) - verify that the sphere appeared o rm subdir/missingsub.scad o Reload and Compile (F4) - verify that the sphere is still there o echo "module missingsub() { sphere(20); }" > subdir/missingsub.scad o Reload and Compile (F4) - verify that the sphere increased in size Test11: Missing library file appears ------- o rm missing.scad o Open usemissing.scad o Compile (F5) o Verify that you get: WARNING: Can't open library file 'missing.scad'. o echo "module missing() { sphere(10); }" > missing.scad o Reload and Compile (F4) - verify that the sphere appeared o rm missing.scad o Reload and Compile (F4) - verify that the sphere is still there o echo "module missing() { sphere(20); }" > missing.scad o Reload and Compile (F4) - verify that the sphere increased in size Test12: Automatic reload of cascading changes ------- o ./cascade.sh o Open cascadetest.scad o Turn on Automatic Reload and Compile o Verify that the 4 objects render correctly o rm cascadetest.scad o Verify that no rerendering was triggered (the 4 objects are still there) o rm cascade*.scad o Verify that no rerendering was triggered (the 4 objects are still there) o ./cascade2.sh o Verify that everything reloads at once without flickering Test 13: Correct handling of compile errors in auto-reloaded modules -------- o Turn on Automatic Reload and Compile o Open mainusingerror.scad o Verify that you get: - ERROR: Parser error in file ".../error.scad", line 3: syntax error - Execution aborted o Verify that the above doesn't repeat Test 14: Dependency tracking of underlying dependencies -------- o Turn on Automatic Reload and Compile o Open mainsubsub.scad o Verify that you see a red cylinder o edit subdir/subsub.scad: Change color o Verify that color changes Test 15: Dependency tracking with two open files -------- o Turn on Automatic Reload and Compile o Open these 3 files: main-use-include.scad used.scad included.scad o Verify that you see 1) A green cube and sphere 2) A green sphere 3) a green cube o In an external editor, edit used.scad: Change color o Verify that color of the sphere changed also in main-use-include o In an external editor, edit included.scad: Change color o Verify that color of the cube changed also in main-use-include Test 16: Correct auto-reload of errors in includes from main -------- o Turn on Automatic Reload and Compile o Open mainincludingerror.scad o Verify that you get: - ERROR: Parser error in file ".../error.scad", line 3: syntax error - Execution aborted o edit error.scad: fix the syntax error (add semicolon) o Verify that you now see a cube Test 17: Correct auto-reload of errors in includes from sub modules -------- o Turn on Automatic Reload and Compile o Open mainuseincludingerror.scad o Verify that you get: - ERROR: Parser error in file ".../error.scad", line 3: syntax error - Execution aborted o edit error.scad: fix the syntax error (add semicolon) o Verify that you now see a cube openscad-2019.05/testdata/modulecache-tests/cascade.sh0000755000076500000240000000104013452431322023235 0ustar kintelstaff00000000000000#!/bin/bash rm -f cascade*.scad echo "include include use use A(); translate([11,0,0]) B(); translate([22,0,0]) C(); translate([33,0,0]) D();" > cascadetest.scad sleep 0.05 echo "module A() { sphere(5); }" > cascade-A.scad sleep 0.05 echo "module B() { cube([8,8,8], center=true); }" > cascade-B.scad sleep 0.05 echo "module C() { cylinder(h=8, r=5, center=true); }" > cascade-C.scad sleep 0.05 echo "module D() { cylinder(h=10, r1=5, r2=0, center=true); }" > cascade-D.scad openscad-2019.05/testdata/modulecache-tests/cascade2.sh0000755000076500000240000000104113452431322023320 0ustar kintelstaff00000000000000#!/bin/bash rm -f cascade-*.scad echo "include include use use A(); translate([11,0,0]) B(); translate([22,0,0]) C(); translate([33,0,0]) D();" > cascadetest.scad sleep 0.1 echo "module A() { sphere(6); }" > cascade-A.scad sleep 0.1 echo "module B() { cube([10,10,10], center=true); }" > cascade-B.scad sleep 0.1 echo "module C() { cylinder(h=10, r=6, center=true); }" > cascade-C.scad sleep 0.1 echo "module D() { cylinder(h=12, r1=6, r2=0, center=true); }" > cascade-D.scad openscad-2019.05/testdata/modulecache-tests/circularfirst.scad0000644000076500000240000000003213452431322025023 0ustar kintelstaff00000000000000use openscad-2019.05/testdata/modulecache-tests/circularincludefirst.scad0000644000076500000240000000004513452431322026373 0ustar kintelstaff00000000000000include openscad-2019.05/testdata/modulecache-tests/circularincludemain.scad0000644000076500000240000000004413452431322026167 0ustar kintelstaff00000000000000include openscad-2019.05/testdata/modulecache-tests/circularincludesecond.scad0000644000076500000240000000004413452431322026516 0ustar kintelstaff00000000000000include openscad-2019.05/testdata/modulecache-tests/circularmain.scad0000644000076500000240000000003113452431322024617 0ustar kintelstaff00000000000000use openscad-2019.05/testdata/modulecache-tests/circularsecond.scad0000644000076500000240000000003113452431322025146 0ustar kintelstaff00000000000000use openscad-2019.05/testdata/modulecache-tests/error.scad0000644000076500000240000000012213452431322023300 0ustar kintelstaff00000000000000//error.scad a=10 // syntax error b=2; module errmod() { cube(a); } errmod(); openscad-2019.05/testdata/modulecache-tests/included.scad0000644000076500000240000000014113452431322023737 0ustar kintelstaff00000000000000module included(s) { translate([-25,0,0]) cube(s, center=true); } color("Green") included(20); openscad-2019.05/testdata/modulecache-tests/includefrommodule.scad0000644000076500000240000000005213452431322025666 0ustar kintelstaff00000000000000use mymodule(); openscad-2019.05/testdata/modulecache-tests/includemissing.scad0000644000076500000240000000004213452431322025165 0ustar kintelstaff00000000000000include missing(); openscad-2019.05/testdata/modulecache-tests/includemissingsub.scad0000644000076500000240000000005713452431322025705 0ustar kintelstaff00000000000000include missingsub(); openscad-2019.05/testdata/modulecache-tests/main-use-include.scad0000644000076500000240000000010713452431322025311 0ustar kintelstaff00000000000000include use translate([25,0,0]) used(10); openscad-2019.05/testdata/modulecache-tests/mainincludingerror.scad0000644000076500000240000000010013452431322026036 0ustar kintelstaff00000000000000//mainincludingerror.scad include echo(version()); openscad-2019.05/testdata/modulecache-tests/mainsubsub.scad0000644000076500000240000000003513452431322024322 0ustar kintelstaff00000000000000use sub(); openscad-2019.05/testdata/modulecache-tests/mainuseincludingerror.scad0000644000076500000240000000004713452431322026565 0ustar kintelstaff00000000000000use errmod(); openscad-2019.05/testdata/modulecache-tests/mainusingerror.scad0000644000076500000240000000007013452431322025215 0ustar kintelstaff00000000000000//mainusingerror.scad echo(version()); use openscad-2019.05/testdata/modulecache-tests/moduleoverload.scad0000644000076500000240000000011113452431322025166 0ustar kintelstaff00000000000000use module mymodule() { sphere(5); } mymodule(); openscad-2019.05/testdata/modulecache-tests/modulewithinclude.scad0000644000076500000240000000010313452431322025673 0ustar kintelstaff00000000000000include module mymodule() { cylinder(r=RADIUS); } openscad-2019.05/testdata/modulecache-tests/multipleA.scad0000644000076500000240000000007313452431322024110 0ustar kintelstaff00000000000000use module A() { sphere(r=F()); } openscad-2019.05/testdata/modulecache-tests/multipleB.scad0000644000076500000240000000011013452431322024101 0ustar kintelstaff00000000000000use module B() { cube(1.5*F(), center=true); } openscad-2019.05/testdata/modulecache-tests/multiplecommon.scad0000644000076500000240000000002313452431322025213 0ustar kintelstaff00000000000000function F() = 20; openscad-2019.05/testdata/modulecache-tests/multiplemain.scad0000644000076500000240000000011113452431322024645 0ustar kintelstaff00000000000000use use A(); translate([40,0,0]) B(); openscad-2019.05/testdata/modulecache-tests/mymodule-lib.scad0000644000076500000240000000006413452431322024553 0ustar kintelstaff00000000000000module mymodule() { cylinder(r=5, center=true); } openscad-2019.05/testdata/modulecache-tests/radius.scad0000644000076500000240000000001413452431322023436 0ustar kintelstaff00000000000000RADIUS = 5; openscad-2019.05/testdata/modulecache-tests/recursive.scad0000644000076500000240000000002513452431322024160 0ustar kintelstaff00000000000000use openscad-2019.05/testdata/modulecache-tests/recursivemain.scad0000644000076500000240000000002513452431322025025 0ustar kintelstaff00000000000000use openscad-2019.05/testdata/modulecache-tests/simpleinclude.scad0000644000076500000240000000003213452431322025004 0ustar kintelstaff00000000000000include openscad-2019.05/testdata/modulecache-tests/simpleleaf.scad0000644000076500000240000000002613452431322024273 0ustar kintelstaff00000000000000cylinder(h=25, r=12); openscad-2019.05/testdata/modulecache-tests/subdir/sub.scad0000644000076500000240000000006213452431322024233 0ustar kintelstaff00000000000000use module sub() { subsub(); } openscad-2019.05/testdata/modulecache-tests/subdir/subsub.scad0000644000076500000240000000007613452431322024752 0ustar kintelstaff00000000000000module subsub() { color("red") cylinder(r = 10, h = 5); } openscad-2019.05/testdata/modulecache-tests/use-mcad.scad0000644000076500000240000000007213452431322023651 0ustar kintelstaff00000000000000use roundedBox([10,10,10], 2, $fn=16); openscad-2019.05/testdata/modulecache-tests/use.scad0000644000076500000240000000003413452431322022745 0ustar kintelstaff00000000000000use used(s()); openscad-2019.05/testdata/modulecache-tests/used.scad0000644000076500000240000000011613452431322023112 0ustar kintelstaff00000000000000function s() = 20; module used(r) { color("Green") sphere(r); } used(10); openscad-2019.05/testdata/modulecache-tests/usemissing.scad0000644000076500000240000000003613452431322024341 0ustar kintelstaff00000000000000use missing(); openscad-2019.05/testdata/modulecache-tests/usenonexistingfile.scad0000644000076500000240000000002213452431322026070 0ustar kintelstaff00000000000000use openscad-2019.05/testdata/nef3/broken.nef30000644000076500000240000001021213417146624020604 0ustar kintelstaff00000000000000Selective Nef Complex standard vertices 8 halfedges 24 facets 12 volumes 2 shalfedges 48 shalfloops 0 sfaces 16 0 { 0 2, 0 5, 0 1, -2 | -1 -1 -1 1 } 1 1 { 3 5, 6 11, 2 3, -2 | -1 -1 1 1 } 1 2 { 6 8, 12 17, 4 5, -2 | -1 1 -1 1 } 1 3 { 9 11, 18 23, 6 7, -2 | -1 1 1 1 } 1 4 { 12 14, 24 29, 8 9, -2 | 1 -1 -1 1 } 1 5 { 15 17, 30 35, 10 11, -2 | 1 -1 1 1 } 1 6 { 18 20, 36 41, 12 13, -2 | 1 1 -1 1 } 1 7 { 21 23, 42 47, 14 15, -2 | 1 1 1 1 } 1 0 { 3, 0, 0 0 | 0 0 1 1 } 1 1 { 6, 0, 0 1 | 0 1 0 1 } 1 2 { 12, 0, 0 3 | 1 a 0 1 } 1 3 { 0, 1, 0 6 | 0 0 -1 1 } 1 4 { 9, 1, 0 7 | 0 1 0 1 } 1 5 { 15, 1, 0 9 | 1 0 0 1 } 1 6 { 1, 2, 0 12 | 0 -1 0 1 } 1 7 { 10, 2, 0 13 | 0 0 1 1 } 1 8 { 18, 2, 0 15 | 1 0 0 1 } 1 9 { 4, 3, 0 18 | 0 -1 0 1 } 1 10 { 7, 3, 0 19 | 0 0 -1 1 } 1 11 { 21, 3, 0 21 | 1 0 0 1 } 1 12 { 2, 4, 0 24 | -1 0 0 1 } 1 13 { 16, 4, 0 25 | 0 0 1 1 } 1 14 { 19, 4, 0 27 | 0 1 0 1 } 1 15 { 5, 5, 0 30 | -1 0 0 1 } 1 16 { 13, 5, 0 31 | 0 0 -1 1 } 1 17 { 22, 5, 0 33 | 0 1 0 1 } 1 18 { 8, 6, 0 36 | -1 0 0 1 } 1 19 { 14, 6, 0 37 | 0 -1 0 1 } 1 20 { 23, 6, 0 39 | 0 0 1 1 } 1 21 { 11, 7, 0 42 | -1 0 0 1 } 1 22 { 17, 7, 0 43 | 0 -1 0 1 } 1 23 { 20, 7, 0 45 | 0 0 -1 1 } 1 0 { 11, 1 , , 0 | -1 0 0 -1 } 1 1 { 10, 2 , , 0 | 0 -1 0 -1 } 1 2 { 9, 5 , , 0 | 0 0 -1 -1 } 1 3 { 8, 10 , , 0 | 0 0 1 -1 } 1 4 { 7, 17 , , 0 | 0 1 0 -1 } 1 5 { 6, 28 , , 0 | 1 0 0 -1 } 1 6 { 5, 29 , , 1 | -1 0 0 1 } 1 7 { 4, 16 , , 1 | 0 -1 0 1 } 1 8 { 3, 11 , , 1 | 0 0 -1 1 } 1 9 { 2, 4 , , 1 | 0 0 1 1 } 1 10 { 1, 3 , , 1 | 0 1 0 1 } 1 11 { 0, 0 , , 1 | 1 0 0 1 } 1 0 { 0 } 0 1 { 1 } 1 0 { 1, 3, 4, 0, 0, 7, 12, 11 | -1 0 0 0 } 1 1 { 0, 5, 2, 1, 1, 13, 6, 0 | 1 0 0 0 } 1 2 { 3, 1, 5, 0, 1, 9, 24, 1 | 0 1 0 0 } 1 3 { 2, 4, 0, 2, 0, 25, 8, 10 | 0 -1 0 0 } 1 4 { 5, 0, 3, 1, 0, 15, 26, 9 | 0 0 -1 0 } 1 5 { 4, 2, 1, 2, 1, 27, 14, 2 | 0 0 1 0 } 1 6 { 7, 9, 10, 3, 3, 1, 18, 0 | 1 0 0 0 } 1 7 { 6, 11, 8, 4, 2, 19, 0, 11 | -1 0 0 0 } 1 8 { 9, 7, 11, 3, 2, 3, 30, 10 | 0 -1 0 0 } 1 9 { 8, 10, 6, 5, 3, 31, 2, 1 | 0 1 0 0 } 1 10 { 11, 6, 9, 4, 3, 21, 32, 3 | 0 0 -1 0 } 1 11 { 10, 8, 7, 5, 2, 33, 20, 8 | 0 0 1 0 } 1 12 { 13, 15, 16, 6, 4, 0, 19, 11 | -1 0 0 0 } 1 13 { 12, 17, 14, 7, 5, 18, 1, 0 | 1 0 0 0 } 1 14 { 15, 13, 17, 6, 5, 5, 36, 2 | 0 0 1 0 } 1 15 { 14, 16, 12, 8, 4, 37, 4, 9 | 0 0 -1 0 } 1 16 { 17, 12, 15, 7, 4, 23, 38, 7 | 0 1 0 0 } 1 17 { 16, 14, 13, 8, 5, 39, 22, 4 | 0 -1 0 0 } 1 18 { 19, 21, 22, 9, 7, 6, 13, 0 | 1 0 0 0 } 1 19 { 18, 23, 20, 10, 6, 12, 7, 11 | -1 0 0 0 } 1 20 { 21, 19, 23, 9, 6, 11, 42, 8 | 0 0 1 0 } 1 21 { 20, 22, 18, 11, 7, 43, 10, 3 | 0 0 -1 0 } 1 22 { 23, 18, 21, 10, 7, 17, 44, 4 | 0 -1 0 0 } 1 23 { 22, 20, 19, 11, 6, 45, 16, 7 | 0 1 0 0 } 1 24 { 25, 27, 28, 12, 8, 2, 31, 1 | 0 1 0 0 } 1 25 { 24, 29, 26, 13, 9, 30, 3, 10 | 0 -1 0 0 } 1 26 { 27, 25, 29, 12, 9, 4, 37, 9 | 0 0 -1 0 } 1 27 { 26, 28, 24, 14, 8, 36, 5, 2 | 0 0 1 0 } 1 28 { 29, 24, 27, 13, 8, 35, 40, 5 | -1 0 0 0 } 1 29 { 28, 26, 25, 14, 9, 41, 34, 6 | 1 0 0 0 } 1 30 { 31, 33, 34, 15, 11, 8, 25, 10 | 0 -1 0 0 } 1 31 { 30, 35, 32, 16, 10, 24, 9, 1 | 0 1 0 0 } 1 32 { 33, 31, 35, 15, 10, 10, 43, 3 | 0 0 -1 0 } 1 33 { 32, 34, 30, 17, 11, 42, 11, 8 | 0 0 1 0 } 1 34 { 35, 30, 33, 16, 11, 29, 46, 6 | 1 0 0 0 } 1 35 { 34, 32, 31, 17, 10, 47, 28, 5 | -1 0 0 0 } 1 36 { 37, 39, 40, 18, 12, 14, 27, 2 | 0 0 1 0 } 1 37 { 36, 41, 38, 19, 13, 26, 15, 9 | 0 0 -1 0 } 1 38 { 39, 37, 41, 18, 13, 16, 45, 7 | 0 1 0 0 } 1 39 { 38, 40, 36, 20, 12, 44, 17, 4 | 0 -1 0 0 } 1 40 { 41, 36, 39, 19, 12, 28, 47, 5 | -1 0 0 0 } 1 41 { 40, 38, 37, 20, 13, 46, 29, 6 | 1 0 0 0 } 1 42 { 43, 45, 46, 21, 15, 20, 33, 8 | 0 0 1 0 } 1 43 { 42, 47, 44, 22, 14, 32, 21, 3 | 0 0 -1 0 } 1 44 { 45, 43, 47, 21, 14, 22, 39, 4 | 0 -1 0 0 } 1 45 { 44, 46, 42, 23, 15, 38, 23, 7 | 0 1 0 0 } 1 46 { 47, 42, 45, 22, 15, 34, 41, 6 | 1 0 0 0 } 1 47 { 46, 44, 43, 23, 14, 40, 35, 5 | -1 0 0 0 } 1 0 { 0, 0 , , , 0 } 0 1 { 0, 2 , , , 1 } 1 2 { 1, 8 , , , 0 } 0 3 { 1, 6 , , , 1 } 1 4 { 2, 12 , , , 0 } 0 5 { 2, 14 , , , 1 } 1 6 { 3, 20 , , , 0 } 0 7 { 3, 18 , , , 1 } 1 8 { 4, 24 , , , 1 } 1 9 { 4, 26 , , , 0 } 0 10 { 5, 32 , , , 1 } 1 11 { 5, 30 , , , 0 } 0 12 { 6, 36 , , , 1 } 1 13 { 6, 38 , , , 0 } 0 14 { 7, 44 , , , 1 } 1 15 { 7, 42 , , , 0 } 0 /* end Selective Nef complex */ openscad-2019.05/testdata/nef3/cube.nef30000644000076500000240000001021213417146624020242 0ustar kintelstaff00000000000000Selective Nef Complex standard vertices 8 halfedges 24 facets 12 volumes 2 shalfedges 48 shalfloops 0 sfaces 16 0 { 0 2, 0 5, 0 1, -2 | -1 -1 -1 1 } 1 1 { 3 5, 6 11, 2 3, -2 | -1 -1 1 1 } 1 2 { 6 8, 12 17, 4 5, -2 | -1 1 -1 1 } 1 3 { 9 11, 18 23, 6 7, -2 | -1 1 1 1 } 1 4 { 12 14, 24 29, 8 9, -2 | 1 -1 -1 1 } 1 5 { 15 17, 30 35, 10 11, -2 | 1 -1 1 1 } 1 6 { 18 20, 36 41, 12 13, -2 | 1 1 -1 1 } 1 7 { 21 23, 42 47, 14 15, -2 | 1 1 1 1 } 1 0 { 3, 0, 0 0 | 0 0 1 1 } 1 1 { 6, 0, 0 1 | 0 1 0 1 } 1 2 { 12, 0, 0 3 | 1 0 0 1 } 1 3 { 0, 1, 0 6 | 0 0 -1 1 } 1 4 { 9, 1, 0 7 | 0 1 0 1 } 1 5 { 15, 1, 0 9 | 1 0 0 1 } 1 6 { 1, 2, 0 12 | 0 -1 0 1 } 1 7 { 10, 2, 0 13 | 0 0 1 1 } 1 8 { 18, 2, 0 15 | 1 0 0 1 } 1 9 { 4, 3, 0 18 | 0 -1 0 1 } 1 10 { 7, 3, 0 19 | 0 0 -1 1 } 1 11 { 21, 3, 0 21 | 1 0 0 1 } 1 12 { 2, 4, 0 24 | -1 0 0 1 } 1 13 { 16, 4, 0 25 | 0 0 1 1 } 1 14 { 19, 4, 0 27 | 0 1 0 1 } 1 15 { 5, 5, 0 30 | -1 0 0 1 } 1 16 { 13, 5, 0 31 | 0 0 -1 1 } 1 17 { 22, 5, 0 33 | 0 1 0 1 } 1 18 { 8, 6, 0 36 | -1 0 0 1 } 1 19 { 14, 6, 0 37 | 0 -1 0 1 } 1 20 { 23, 6, 0 39 | 0 0 1 1 } 1 21 { 11, 7, 0 42 | -1 0 0 1 } 1 22 { 17, 7, 0 43 | 0 -1 0 1 } 1 23 { 20, 7, 0 45 | 0 0 -1 1 } 1 0 { 11, 1 , , 0 | -1 0 0 -1 } 1 1 { 10, 2 , , 0 | 0 -1 0 -1 } 1 2 { 9, 5 , , 0 | 0 0 -1 -1 } 1 3 { 8, 10 , , 0 | 0 0 1 -1 } 1 4 { 7, 17 , , 0 | 0 1 0 -1 } 1 5 { 6, 28 , , 0 | 1 0 0 -1 } 1 6 { 5, 29 , , 1 | -1 0 0 1 } 1 7 { 4, 16 , , 1 | 0 -1 0 1 } 1 8 { 3, 11 , , 1 | 0 0 -1 1 } 1 9 { 2, 4 , , 1 | 0 0 1 1 } 1 10 { 1, 3 , , 1 | 0 1 0 1 } 1 11 { 0, 0 , , 1 | 1 0 0 1 } 1 0 { 0 } 0 1 { 1 } 1 0 { 1, 3, 4, 0, 0, 7, 12, 11 | -1 0 0 0 } 1 1 { 0, 5, 2, 1, 1, 13, 6, 0 | 1 0 0 0 } 1 2 { 3, 1, 5, 0, 1, 9, 24, 1 | 0 1 0 0 } 1 3 { 2, 4, 0, 2, 0, 25, 8, 10 | 0 -1 0 0 } 1 4 { 5, 0, 3, 1, 0, 15, 26, 9 | 0 0 -1 0 } 1 5 { 4, 2, 1, 2, 1, 27, 14, 2 | 0 0 1 0 } 1 6 { 7, 9, 10, 3, 3, 1, 18, 0 | 1 0 0 0 } 1 7 { 6, 11, 8, 4, 2, 19, 0, 11 | -1 0 0 0 } 1 8 { 9, 7, 11, 3, 2, 3, 30, 10 | 0 -1 0 0 } 1 9 { 8, 10, 6, 5, 3, 31, 2, 1 | 0 1 0 0 } 1 10 { 11, 6, 9, 4, 3, 21, 32, 3 | 0 0 -1 0 } 1 11 { 10, 8, 7, 5, 2, 33, 20, 8 | 0 0 1 0 } 1 12 { 13, 15, 16, 6, 4, 0, 19, 11 | -1 0 0 0 } 1 13 { 12, 17, 14, 7, 5, 18, 1, 0 | 1 0 0 0 } 1 14 { 15, 13, 17, 6, 5, 5, 36, 2 | 0 0 1 0 } 1 15 { 14, 16, 12, 8, 4, 37, 4, 9 | 0 0 -1 0 } 1 16 { 17, 12, 15, 7, 4, 23, 38, 7 | 0 1 0 0 } 1 17 { 16, 14, 13, 8, 5, 39, 22, 4 | 0 -1 0 0 } 1 18 { 19, 21, 22, 9, 7, 6, 13, 0 | 1 0 0 0 } 1 19 { 18, 23, 20, 10, 6, 12, 7, 11 | -1 0 0 0 } 1 20 { 21, 19, 23, 9, 6, 11, 42, 8 | 0 0 1 0 } 1 21 { 20, 22, 18, 11, 7, 43, 10, 3 | 0 0 -1 0 } 1 22 { 23, 18, 21, 10, 7, 17, 44, 4 | 0 -1 0 0 } 1 23 { 22, 20, 19, 11, 6, 45, 16, 7 | 0 1 0 0 } 1 24 { 25, 27, 28, 12, 8, 2, 31, 1 | 0 1 0 0 } 1 25 { 24, 29, 26, 13, 9, 30, 3, 10 | 0 -1 0 0 } 1 26 { 27, 25, 29, 12, 9, 4, 37, 9 | 0 0 -1 0 } 1 27 { 26, 28, 24, 14, 8, 36, 5, 2 | 0 0 1 0 } 1 28 { 29, 24, 27, 13, 8, 35, 40, 5 | -1 0 0 0 } 1 29 { 28, 26, 25, 14, 9, 41, 34, 6 | 1 0 0 0 } 1 30 { 31, 33, 34, 15, 11, 8, 25, 10 | 0 -1 0 0 } 1 31 { 30, 35, 32, 16, 10, 24, 9, 1 | 0 1 0 0 } 1 32 { 33, 31, 35, 15, 10, 10, 43, 3 | 0 0 -1 0 } 1 33 { 32, 34, 30, 17, 11, 42, 11, 8 | 0 0 1 0 } 1 34 { 35, 30, 33, 16, 11, 29, 46, 6 | 1 0 0 0 } 1 35 { 34, 32, 31, 17, 10, 47, 28, 5 | -1 0 0 0 } 1 36 { 37, 39, 40, 18, 12, 14, 27, 2 | 0 0 1 0 } 1 37 { 36, 41, 38, 19, 13, 26, 15, 9 | 0 0 -1 0 } 1 38 { 39, 37, 41, 18, 13, 16, 45, 7 | 0 1 0 0 } 1 39 { 38, 40, 36, 20, 12, 44, 17, 4 | 0 -1 0 0 } 1 40 { 41, 36, 39, 19, 12, 28, 47, 5 | -1 0 0 0 } 1 41 { 40, 38, 37, 20, 13, 46, 29, 6 | 1 0 0 0 } 1 42 { 43, 45, 46, 21, 15, 20, 33, 8 | 0 0 1 0 } 1 43 { 42, 47, 44, 22, 14, 32, 21, 3 | 0 0 -1 0 } 1 44 { 45, 43, 47, 21, 14, 22, 39, 4 | 0 -1 0 0 } 1 45 { 44, 46, 42, 23, 15, 38, 23, 7 | 0 1 0 0 } 1 46 { 47, 42, 45, 22, 15, 34, 41, 6 | 1 0 0 0 } 1 47 { 46, 44, 43, 23, 14, 40, 35, 5 | -1 0 0 0 } 1 0 { 0, 0 , , , 0 } 0 1 { 0, 2 , , , 1 } 1 2 { 1, 8 , , , 0 } 0 3 { 1, 6 , , , 1 } 1 4 { 2, 12 , , , 0 } 0 5 { 2, 14 , , , 1 } 1 6 { 3, 20 , , , 0 } 0 7 { 3, 18 , , , 1 } 1 8 { 4, 24 , , , 1 } 1 9 { 4, 26 , , , 0 } 0 10 { 5, 32 , , , 1 } 1 11 { 5, 30 , , , 0 } 0 12 { 6, 36 , , , 1 } 1 13 { 6, 38 , , , 0 } 0 14 { 7, 44 , , , 1 } 1 15 { 7, 42 , , , 0 } 0 /* end Selective Nef complex */ openscad-2019.05/testdata/python/gen_issue2342-template.py0000755000076500000240000000101213433421332023703 0ustar kintelstaff00000000000000#! ${PYTHON_EXECUTABLE} # # This python script generates a large output .scad file (3.1MB) for stress testing the parser. # See Issue #2342 / Pull Request #2343 from __future__ import print_function xcount = 100 ycount = 100 zcount = 10 totalcount = xcount*ycount*zcount for x in range(1, xcount): for y in range(1, ycount): for z in range(1, zcount): print("translate([{}, {}, {}])".format(x,y,z)) print(" cube(0.5);") print("echo(\"{} elements processed\");".format(totalcount)) openscad-2019.05/testdata/python/gen_svg_viewbox_tests-template.py0000755000076500000240000000226013437640540026042 0ustar kintelstaff00000000000000#! ${PYTHON_EXECUTABLE} from __future__ import print_function import sys params = [ [ 300, 400, "none" ], [ 600, 200, "none" ], [ 300, 400, "xMinYMin", "meet" ], [ 300, 400, "xMidYMin", "meet" ], [ 300, 400, "xMaxYMin", "meet" ], [ 600, 200, "xMinYMin", "meet" ], [ 600, 200, "xMinYMid", "meet" ], [ 600, 200, "xMinYMax", "meet" ], [ 600, 200, "xMinYMin", "slice" ], [ 600, 200, "xMidYMin", "slice" ], [ 600, 200, "xMaxYMin", "slice" ], [ 600, 600, "xMinYMin", "slice" ], [ 600, 600, "xMinYMid", "slice" ], [ 600, 600, "xMinYMax", "slice" ] ] with open(sys.argv[1] + "/viewbox-tests.svg.in") as f: svg = f.read() for p in params: width, height = p[0:2] aspectParam = ' '.join(str(x) for x in p[2:]) aspectFile = '_'.join(str(x) for x in p[2:][::-1]) svg_viewBox = "viewBox=\"0 0 {} {}\"".format(width, height) svg_preserveAspectRatio = "preserveAspectRatio=\"{}\"".format(aspectParam) out = svg.replace('__VIEWBOX__', svg_viewBox).replace('__PRESERVE_ASPECT_RATIO__', svg_preserveAspectRatio) outfile = sys.argv[1] + "/viewbox_{}x{}_{}.svg".format(width, height, aspectFile) print(outfile) with open(outfile, "w") as f: f.write(out) openscad-2019.05/testdata/scad/2D/features/circle-tests.scad0000644000076500000240000000076713402025764024157 0ustar kintelstaff00000000000000circle(); circle(1/0); translate([0,3,0]) circle(1); translate([5,1,0]) circle(r=3); translate([0,-1,0]) circle(r=0); translate([0,-3,0]) circle(1, $fn=4); translate([3,-3,0]) circle(1, $fn=8); translate([6,-3,0]) circle(1, $fn=12); translate([0,-6,0]) circle(1, $fa=20, $fs=0.3); translate([3,-6,0]) circle(1, $fa=30, $fs=0.3); translate([6,-6,0]) circle(1, $fa=40, $fs=0.3); translate([0,-9,0]) circle(1, $fn=0.1); translate([3,-9,0]) circle(d=2, $fn=8); translate([6,-9,0]) circle(r=10, d=2, $fn=8); openscad-2019.05/testdata/scad/2D/features/control-hull-dimension.scad0000644000076500000240000000004313402025764026146 0ustar kintelstaff00000000000000hull() { circle(1); echo(1); } openscad-2019.05/testdata/scad/2D/features/difference-2d-tests.scad0000644000076500000240000000111313402025764025275 0ustar kintelstaff00000000000000difference() { square(10, center=true); circle(r=4); } translate([12,0]) difference() { square(10, center=true); translate([2,2]) circle(r=2); translate([-2,-2]) circle(r=2); } // Subtracting something from nothing translate([12,12]) difference() { square([0,10], center=true); # circle(r=4); } // Non-geometry (echo) statement as first child should be ignored translate([0,12]) difference() { echo("difference-2d-tests"); square(10, center=true); circle(r=4); } // Subtract 3D from 2D translate([24,0]) difference() { square(10, center=true); sphere(r=4); } openscad-2019.05/testdata/scad/2D/features/highlight-modifier-2d.scad0000644000076500000240000000026513402025764025615 0ustar kintelstaff00000000000000difference() { square(10, center=true); #circle(3); } #if (true) square([11,12]); #translate([0,-12]) difference() { square(10, center = true); square(5, center = true); } openscad-2019.05/testdata/scad/2D/features/hull2-tests.scad0000644000076500000240000000135613402025764023737 0ustar kintelstaff00000000000000module convex2dSimple() { hull() { translate([15,10]) circle(10); circle(10); } } module concave2dSimple() { hull() { translate([15,10]) square(2); translate([15,0]) square(2); square(2); } } module convex2dHole() { hull() { translate([15,10,0]) circle(10); difference() { circle(10); circle(5); } } } module hull2dForLoop() { hull() { for(x = [0,10]) for(y=[0,10]) translate([x,y]) circle(3); } } module hull2null() { hull() { square(0); circle(0); } } convex2dHole(); translate([40,0,0]) convex2dSimple(); translate([0,-20,0]) concave2dSimple(); translate([30,-25,0]) hull2dForLoop(); hull2null();openscad-2019.05/testdata/scad/2D/features/intersection2-tests.scad0000644000076500000240000000165213402025764025500 0ustar kintelstaff00000000000000translate([0,-20]) intersection() { circle(r=5); square(8,center=true); } // Intersecting something with nothing translate([-10,0]) intersection() { circle(r=5); square(0,center=true); } // Non-geometry (echo) statement as first child should be ignored translate([0,20]) intersection() { echo("difference-tests"); circle(r=5); square(8,center=true); } // intersection with 1 operand translate([20,-20]) intersection() { translate([10,0]) circle(r=15); } // intersection with 2 operands translate([20,0]) intersection() { translate([10,0]) circle(r=15); rotate(120) translate([10,0]) circle(r=15); } // intersection with 3 operands translate([20,20]) intersection() { translate([10,0]) circle(r=15); rotate(120) translate([10,0]) circle(r=15); rotate(240) translate([10,0]) circle(r=15); } // intersection_for translate([0,0]) intersection_for (a = [0:60:359.99]) { translate([cos(a),sin(a)]*10) circle(r=15); } openscad-2019.05/testdata/scad/2D/features/minkowski2-crack.scad0000644000076500000240000000053313402025764024723 0ustar kintelstaff00000000000000/* The inner minkowski creates a polygon with a tiny crack in it, due to our coincident vertex collapse not being topology-aware. The difference and outer minkowski was added to visualize this. */ $fn = 64; minkowski() { difference() { square(40,center=true); minkowski() { circle(2); circle(4); } } square(1); } openscad-2019.05/testdata/scad/2D/features/minkowski2-hole-tests.scad0000644000076500000240000000147713402025764025737 0ustar kintelstaff00000000000000// HolePoly & Poly minkowski() { difference() { square([20,20], center=true); square([10,10], center=true); } circle(r=1, $fn=16); } // Poly & HolePoly translate([25,0]) minkowski() { circle(r=1, $fn=16); difference() { square([20,20], center=true); square([10,10], center=true); } } // IslandHolePoly translate([0,25]) minkowski() { union() { difference() { square([20,20], center=true); square([10,10], center=true); } square([2,2], center=true); } circle(r=1, $fn=16); } // HolePoly & HolePoly translate([25,25]) minkowski() { difference() { square([18,18], center=true); square([12,12], center=true); } difference() { circle(2, $fn=16); circle(1, $fn=16); } } openscad-2019.05/testdata/scad/2D/features/minkowski2-tests.scad0000644000076500000240000000251613402025764025005 0ustar kintelstaff00000000000000module roundedBox2dSimple() { minkowski() { square([10,10]); circle(r=5); } } module roundedBox2dCut() { minkowski() { difference() { square([10,10]); square([5,5]); } circle(r=5); } } module roundedBox2dHole() { minkowski() { difference() { square([10,10], center=true); square([8,8], center=true); } circle(r=2); } } translate([-20,5,0]) roundedBox2dHole(); translate([0,0,0]) roundedBox2dCut(); translate([25,0,0]) roundedBox2dSimple(); // One child translate([0,-20,0]) minkowski() { square(10); } // >2 children translate([-20,-20,0]) minkowski() { square(10); square(2, center=true); circle(1); } module invert() render() difference() { square(1e6,center=true); child(); } module erode(d=.3) invert() minkowski() { circle(d); invert() child(); } // This particular combination created a hairline crack inside the resulting polygon translate([-5,-45]) scale(4) erode() minkowski() { circle(r=.4); circle(r=4); } // This is an even harder example translate([30,-30]) scale(4) erode() minkowski() { difference() { circle(r=.4); circle(r=.399); } circle(r=4); } // Minkowski with an empty polygon should yield an empty result translate([30,-45]) minkowski() { circle(r=1); circle(r=0); } openscad-2019.05/testdata/scad/2D/features/nullspace-2d.scad0000644000076500000240000000010613402025764024032 0ustar kintelstaff00000000000000translate() square(0); translate() { square(0); circle(0); } openscad-2019.05/testdata/scad/2D/features/offset-tests.scad0000644000076500000240000000260713402025764024177 0ustar kintelstaff00000000000000module m(x, y) { translate(60 * [x, y]) children(); } module shape1(w = 20) { difference() { square([ w, w], center = true); square([10, 10], center = true); } } module shape2() { polygon(points=[ [-15, 80],[15, 80],[0,-15],[-8, 60],[8, 60],[0, 5] ], paths=[ [0,1,2],[3,4,5] ]); } m(-1, 0) shape1(); m(-1, 2) shape2(); m(0, 0) offset() shape1(); m(0, 1) offset(5) shape1(); m(0, 2) offset(5) shape2(); m(1, 0) offset(r = 1) shape1(30); m(1, 1) offset(r = 5) shape1(30); m(1, 2) offset(r = 5) shape2(); m(2, 0) offset(r = -5) shape1(40); m(2, 1) offset(r = -10.01) shape1(50); m(2, 2) offset(r = -1) shape2(); m(3, 0) offset(delta = 4) shape1(); m(3, 1) offset(delta = 1) shape1(); m(3, 2) offset(delta = 5) shape2(); m(4, 0) offset(delta = -2) shape1(30); m(4, 1) offset(delta = -5) shape1(40); m(4, 2) offset(delta = -1) shape2(); m(5, 0) offset(delta = 4, chamfer = true) shape1(); m(5, 1) offset(delta = 1, chamfer = true) shape1(); m(5, 2) offset(delta = 5, chamfer = true) shape2(); m(6, 0) offset(delta = -2, chamfer = true) shape1(30); m(6, 1) offset(delta = -5, chamfer = true) shape1(40); m(6, 2) offset(delta = -1, chamfer = true) shape2(); // Bug with fragment calculateion with delta < 1 due to abs() instead of std::abs() m(-2, 1) scale([30, 30]) offset(r = 0.8) square(1); // Malformed offsets offset(); offset() square(0); openscad-2019.05/testdata/scad/2D/features/polygon-tests.scad0000644000076500000240000000233013402025764024371 0ustar kintelstaff00000000000000polygon(); polygon([]); polygon([[],[]]); polygon([[[]]]); translate([2,0,0]) polygon([[0,0], [1,0], [1,1]]); translate([0,2,0]) polygon([[0,0]]); translate([2,2,0]) polygon([[0,0],[1,1]]); translate([2,2,0]) polygon([[0,0],[1,1],[2,2]]); translate([0,-2,0]) polygon(points=[[0,0], [1,0], [1,1], [0,1]]); translate([0,-4,0]) polygon(points=[[0,0], [1,0], [1,1], [0,1]], paths=[]); translate([2,-2,0]) polygon([[0,0], [1,0], [0.8,0.5], [1,1], [0,1]]); points = [[0,0], [0.5,-0.2], [1,0], [1.2,0.5], [1,1], [0.5,1.2], [0,1], [-0.2,0.5]]; translate([-2,0,0]) polygon(points); translate([-2,-2,0]) polygon(points=points, paths=[[0,1,2,3], [4,5,6,7]]); translate([2,-4,0]) polygon([[0,0], [1,0], [1,1], [0,0]]); // With hole translate([-2,-4,0]) polygon(points=[[0,0], [1,0], [1,1], [0,1], [0.2,0.2], [0.8,0.2], [0.8,0.8], [0.2,0.8]], paths=[[0,1,2,3],[4,5,6,7]] ); // Mesh translate([0,0,0]) polygon(points = [[0,1], [0,0], [1,0], [1,1], [0.8,0.8], [0.8,0.2], [0.2,0.2], [0.2,0.8]], paths = [[7,6,5,4,3,2,1,0],[7,0,3,4] ]); // More malformed polygons polyhedron(points = undef, paths = [[1, 2, 3]]); polyhedron(points = [[0,0,0],[1,1,1]], paths = undef); polyhedron(points=[0], paths = [[0]]); // FIXME: convexity openscad-2019.05/testdata/scad/2D/features/polygons-touch.scad0000644000076500000240000000035013402025764024534 0ustar kintelstaff00000000000000// Somehow the 2D union/tessellation algorithm doesn't support touching polygons // Changing translate([-10,-10,0]) to translate([-9.99,-9.99,0]) works // Fixed after 2014.03 square([10,10]); translate([-10,-10,0]) square([10,10]); openscad-2019.05/testdata/scad/2D/features/projection-cut-tests.scad0000644000076500000240000000132313402025764025650 0ustar kintelstaff00000000000000// 2D child projection(cut=true) { square(); } projection(cut=true) translate([20,0,0]) cube(10, center=true); // Boundary case: clipping the top of a cube translate([0,20,0]) projection(cut=true) translate([0,0,-4.999999]) cube(10, center=true); // Empty cut projection(cut=true) translate([0,0,5]) cube(5, center=true); // holes translate([0,-10,0]) projection(cut=true) { union() { difference() { cube(5,center=true); cube(4,center=true); } translate([2.1,2.1]) difference() { cube(5,center=true); cube(4,center=true); } } } // Verify hole winding order translate([-15,0,0]) minkowski() { projection(cut=true) difference() { cube(10,center=true); cube([5,5,20],center=true); } square(1); } openscad-2019.05/testdata/scad/2D/features/projection-tests.scad0000644000076500000240000000070013402025764025055 0ustar kintelstaff00000000000000// Empty projection(); // No children projection() { } // 2D child projection() { square(); } // Simple projection(cut=false) cube(10); // Two children translate([-12,0]) projection(cut=false) { cube(10); difference() { sphere(10); cylinder(h=30, r=5, center=true); } } // Holes translate([6,-12]) projection(cut=false) { cube(10); difference() { sphere(10); cylinder(h=30, r=5, center=true); } } openscad-2019.05/testdata/scad/2D/features/render-2d-tests.scad0000644000076500000240000000023413402025764024465 0ustar kintelstaff00000000000000render() { difference() { square(10, center=true); circle(r=3); } } translate([12,0,0]) render() { square(10, center=true); circle(r=3); } openscad-2019.05/testdata/scad/2D/features/resize-2d-tests.scad0000644000076500000240000000271413402025764024514 0ustar kintelstaff00000000000000// red = reference // gold = basic resize // green = auto resize // pink = errors, wrong syntax, trying to resize in 3rd dimension, etc $fn=10; // two simple holes module shape(){ difference() { square([5,5]); translate([1,1]) square(); translate([3,3]) circle(); } } // holes that have problems (duplicate vertex) module shape2(){ difference() { square([5,5]); translate([1,1]) square(); translate([2,2]) square(); } } // one square split into two by another module shape3(){ difference() { square([5,5]); translate([0,2.5]) square([5,1]); } } color("red") { translate([-16,0]) scale([3,3]) shape(); translate([-16,16]) scale([3,3]) shape2(); translate([-16,32]) scale([3,3]) shape3(); } translate([0,0]) resize([15,15]) shape(); translate([0,16]) resize([15,15,0]) shape2(); translate([0,32]) resize([15,15]) shape3(); color("green"){ translate([16,0]) resize([15,0],auto=false) scale([1,3]) shape(); translate([16,16]) resize([0,15],auto=true) scale() shape2(); translate([16,32]) resize([0,15],auto=[true,false]) shape3(); } color("pink"){ translate([32,0]) resize([0,0],auto=[false,true]) shape(); translate([32,16]) resize([0,0,15],auto=true) shape2(); translate([32,32]) resize([0,0,15]) shape3(); } color("blue"){ translate([-16,-16]) resize([10,8],auto=[false,true]) scale([0.5,100,20]) shape(); translate([0,-16]) resize([8,10,15],auto=true) scale([1000,0.5]) shape2(); translate([16,-16]) resize([10,8,15]) scale([200,200]) shape3(); } openscad-2019.05/testdata/scad/2D/features/scale2D-tests.scad0000644000076500000240000000052113402025764024157 0ustar kintelstaff00000000000000module obj2D() square([2,3], center=true); // 3 variants of 3D scale of 2D object scale([2,4/3,2]) obj2D(); translate([5,0,0]) scale([2,4/3]) obj2D(); translate([10,0,0]) scale(2) obj2D(); // Scale by zero; 2D object translate([-5,0,0]) linear_extrude() scale([0,0]) obj2D(); translate([-5,0,0]) linear_extrude() scale([0,1]) obj2D(); openscad-2019.05/testdata/scad/2D/features/square-tests.scad0000644000076500000240000000047313402025764024210 0ustar kintelstaff00000000000000square(); square(1/0); translate([2,0,0]) square([1,1], true); translate([4,0,0]) square(size=[1,1], center=true); translate([6,0,0]) square([0,0], true); translate([0,2,0]) square([1,0], true); translate([2,2,0]) square([0,1], true); translate([4,2,0]) square([1,2], true); translate([6,2,0]) square([2,1], true); openscad-2019.05/testdata/scad/2D/features/text-empty-tests.scad0000644000076500000240000000002213402025764025016 0ustar kintelstaff00000000000000text(); text(""); openscad-2019.05/testdata/scad/2D/features/text-font-alignment-tests.scad0000644000076500000240000000121313402025764026605 0ustar kintelstaff00000000000000use <../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> t = "OpenSCAD"; valign = [ [10, "top"], [40, "center"], [70, "baseline"], [100, "bottom"] ]; halign = [ [10, "left"], [40, "center"], [70, "right"] ]; for (a = valign) { translate([10, a[0], 0]) { color("red") square([135, 0.5]); color("blue") square([0.5, 20]); text(text = t, font = "Liberation Sans:style=Regular", size = 20, valign = a[1]); } } for (a = halign) { translate([160 + 2.23 * a[0], a[0], 0]) { color("red") square([135, 0.5]); color("blue") square([0.5, 20]); text(text = t, font = "Liberation Sans:style=Regular", size = 20, halign = a[1]); } } openscad-2019.05/testdata/scad/2D/features/text-font-composition.scad0000644000076500000240000000047713402025764026045 0ustar kintelstaff00000000000000use <../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> // Validate correct behavior with overlapping combining chars. // The U+030A (COMBINING RING ABOVE) should be unioned to the // letter and not generate a hole where the A and the ring // overlap. text(text = "A\u030a", font = "Liberation Sans", size = 40); openscad-2019.05/testdata/scad/2D/features/text-font-direction-tests.scad0000644000076500000240000000056313402025764026616 0ustar kintelstaff00000000000000use <../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> t = "OpenSCAD"; dir = [ [90, 10, "ltl"], [90, 60, "rtl"], [10, 160, "ttb"], [60, 140, "btt"] ]; for (a = dir) { translate([a[0], a[1], 0]) { color("red") square([135, 0.5]); color("blue") square([0.5, 20]); text(text = t, font = "Liberation Sans:style=Regular", size = 20, direction = a[2]); } } openscad-2019.05/testdata/scad/2D/features/text-font-simple-tests.scad0000644000076500000240000000021713402025764026123 0ustar kintelstaff00000000000000use <../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> text(text = "T-X-U", font = "Liberation Sans:style=Regular", size = 40, $fn = 2); openscad-2019.05/testdata/scad/2D/features/text-font-spacing-tests.scad0000644000076500000240000000072513414440264026261 0ustar kintelstaff00000000000000use <../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> t = "abcXYZ"; translate([0,-25,0]) text(text = t, font = "Liberation Sans:style=Regular", size = 20, spacing = 0.5); translate([0,0,0]) text(text = t, font = "Liberation Sans:style=Regular", size = 20); translate([0,25,0]) text(text = t, font = "Liberation Sans:style=Regular", size = 20, spacing = 1); translate([0,50,0]) text(text = t, font = "Liberation Sans:style=Regular", size = 20, spacing = 2); openscad-2019.05/testdata/scad/2D/features/text-font-symbol.scad0000644000076500000240000000203213402025764024774 0ustar kintelstaff00000000000000use <../../../ttf/marvosym-3.10/marvosym.ttf> use <../../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> use <../../../ttf/amiri-0.106/amiri-regular.ttf> // FIXME: Needs a freely distributable font that is encoded like Webdings // FIXME: with Microsoft/System charmap and charcodes at 0xf000. Using // FIXME: Amiri as placeholder for now... o = 180; t = [ "0123", "ABCD", "abcd" ]; f = [ "MarVoSym", /* "Webdings" */ "Amiri", "Liberation Sans:style=Regular" ]; // Validate that windows symbol fonts are handled correctly. // When following the suggested encoding, the charmap is defined // to use the charcodes at the 0xf000 private use area of Unicode. // This is true for Webdings and Wingdings, other fonts ignore // that, e.g. the MarVoSym has the charcodes in the normal places. // Liberation Sans is just added as cross check that normal // Unicode encoding also works. for (a = [0 : len(f) - 1]) { for (b = [0 : len(t) - 1]) { translate([o * a - o, 10 + 60 * b]) { text(t[b], font = f[a], size = 40, halign = "center"); } } } openscad-2019.05/testdata/scad/2D/features/text-font-tests.scad0000644000076500000240000000147213402025764024640 0ustar kintelstaff00000000000000use <../../../ttf/amiri-0.106/amiri-regular.ttf> use <../../../ttf/liberation-2.00.1/LiberationSans-Regular.ttf> t1="OpenSCAD"; t2="الخط الأميري"; t3="типографика"; rotate([45, 0, -45]) { translate([0, 80, 0]) text(text = t1, font = "Liberation Sans:style=Regular", size = 20); translate([0, 40, 0]) text(text = t2, font = "Amiri:style=Regular", size = 20, direction = "rtl", language = "ar", script = "arabic"); text(text = t2, font = "Amiri:style=Regular", direction = "rtl", size = 20, language = "ar", script = "arabic"); translate([0, -40, 0]) text(text = t3, font="Liberation Sans:style=Regular", size=20, language="ru"); translate([0, -80, 0]) text("positional", 30, "Liberation Sans:style=Regular"); translate([0, -100, 0]) text("parameters", 12, "Amiri:style=Regular"); } openscad-2019.05/testdata/scad/2D/features/text-search-test.scad0000644000076500000240000000211213402025764024744 0ustar kintelstaff00000000000000// fonts test use thisFont=8bit_polyfont(); thisText="OpenSCAD Rocks!"; // Find one letter matches from 2nd column (index 1) theseIndicies=search(thisText,thisFont[2],1,1); // Letter spacing, x direction. x_shift=thisFont[0][0]; y_shift=thisFont[0][1]; echo(theseIndicies); // Simple polygon usage. for(i=[0:len(theseIndicies)-1]) translate([i*x_shift-len(theseIndicies)*x_shift/2,0]) { polygon(points=thisFont[2][theseIndicies[i]][6][0],paths=thisFont[2][theseIndicies[i]][6][1]); } theseIndicies2=search("ABC",thisFont[2],1,1); // outline_2d() example for(i=[0:len(theseIndicies2)-1]) translate([i*x_shift-len(theseIndicies2)*x_shift,-y_shift]) { outline_2d(outline=true,points=thisFont[2][theseIndicies2[i]][6][0],paths=thisFont[2][theseIndicies2[i]][6][1],width=0.25); } theseIndicies3=search("123",thisFont[2],1,1); // bold_2d() outline_2d(false) example for(i=[0:len(theseIndicies3)-1]) translate([i*x_shift,-2*y_shift]) { bold_2d(bold=true,width=0.25,resolution=8) outline_2d(false,thisFont[2][theseIndicies3[i]][6][0],thisFont[2][theseIndicies3[i]][6][1]); }openscad-2019.05/testdata/scad/2D/issues/issue899.scad0000644000076500000240000000006113402025764022640 0ustar kintelstaff00000000000000text(text = "AA", size = 20, direction = "ttb"); openscad-2019.05/testdata/scad/2D/issues/polyset-reduce-crash.scad0000644000076500000240000000255213432700636025310 0ustar kintelstaff00000000000000/* This testcase causes a crash in PolySet::PolyReducer::add_edges(). It appears to be because we collapse two close vertices into the same vertex. This is handled by just abort()'ing. */ N=20; rotate (a = [0, 0, 36]) { union() { translate ([1, 0]) { polygon (points = [[(N - 1)*cos(180/N), -(N - 1)*sin(180/N)], [(N - 3)*cos(270/N), -(N - 3)*sin(270/N)], [(N - 1)*cos(270/N), -(N - 1)*sin(270/N)]]); polygon (points = [[(N - 1)*cos(180/N), -(N - 1)*sin(180/N)], [(N - 3)*cos(180/N), -(N - 3)*sin(180/N)], [(N - 3)*cos(270/N), -(N - 3)*sin(270/N)]]); polygon (points = [[N - 1, 0], [N - 3, 0], [(N - 3)*cos(180/N), -(N - 3)*sin(180/N)]]); polygon (points = [[N - 1, 0], [(N - 3)*cos(180/N), -(N - 3)*sin(180/N)], [(N - 1)*cos(180/N), -(N - 1)*sin(180/N)]]); polygon (points = [[N - 1, 0], [N - 3, 0], [(N - 3)*cos(180/N), (N - 3)*sin(180/N)]]); polygon (points = [[N - 1, 0], [(N - 3)*cos(180/N), (N - 3)*sin(180/N)], [(N - 1)*cos(180/N), (N - 1)*sin(180/N)]]); polygon (points = [[(N - 1)*cos(180/N), (N - 1)*sin(180/N)], [(N - 3)*cos(180/N), (N - 3)*sin(180/N)], [(N - 3)*cos(270/N), (N - 3)*sin(270/N)]]); polygon (points = [[(N - 1)*cos(180/N), (N - 1)*sin(180/N)], [(N - 3)*cos(270/N), (N - 3)*sin(270/N)], [(N - 1)*cos(270/N), (N - 1)*sin(270/N)]]); } circle (r = 20); } } openscad-2019.05/testdata/scad/3D/deprecated/import_stl-test.scad0000644000076500000240000000003213402025764025173 0ustar kintelstaff00000000000000import_stl("import.stl"); openscad-2019.05/testdata/scad/3D/deprecated/rotate_extrude_dxf-tests.scad0000644000076500000240000000023413402025764027065 0ustar kintelstaff00000000000000// These are tests which are not yet possible to express with the // non-deprecated functionality rotate_extrude(file = "../../../dxf/open-polyline.dxf"); openscad-2019.05/testdata/scad/3D/features/2d-3d.scad0000644000076500000240000000024413402025764022356 0ustar kintelstaff00000000000000// Test a mix of toplevel 2D and 3D objects cube(); translate([2,0,0]) square(); // Test mixing of empty 2D and 3D objects union() { cube(0); circle(0); } openscad-2019.05/testdata/scad/3D/features/assign-tests.scad0000644000076500000240000000016013402025764024166 0ustar kintelstaff00000000000000for(i=[0:5]) { translate([i*i/2,0,0]) { cube(i); translate([0,-5,0]) assign(f=1.0*i/2) cube(f); } } openscad-2019.05/testdata/scad/3D/features/background-modifier.scad0000644000076500000240000000060013402025764025454 0ustar kintelstaff00000000000000difference() { sphere(r=10); %cylinder(h=30, r=6, center=true); } %if (true) cube([25,6,3], center=true); %translate([0,-9,0]) difference() { color("green") cube([10,4,10], center=true); color("red") translate([0,-2,0]) sphere(3); } // Test modifiers work with minkowski children translate([25,0,0]) minkowski() { %cube(10, center=true); cube(5, center=true); } openscad-2019.05/testdata/scad/3D/features/background-modifier2.scad0000644000076500000240000000206513402025764025545 0ustar kintelstaff00000000000000color("Blue") { translate([-30,-10,-10]) cube([70,50,2]); translate([40,-10,-10]) cube([2,50,30]); translate([-30,40,-10]) cube([70,2,30]); } translate([-20,0,0]) difference() { intersection() { sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } %translate([-20,20,0]) difference() { intersection() { sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } difference() { intersection() { sphere(10); cube(15, center=true); } %cylinder(h=20, r=5, center=true); } translate([20,0,0]) difference() { %intersection() { sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } translate([0,20,0]) difference() { intersection() { %sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } translate([20,20,0]) difference() { intersection() { sphere(10); %cube(15, center=true); } cylinder(h=20, r=5, center=true); } openscad-2019.05/testdata/scad/3D/features/child-background.scad0000644000076500000240000000017013402025764024743 0ustar kintelstaff00000000000000module transparent() { %child(); } difference() { sphere(r=10); transparent() cylinder(h=30, r=6, center=true); } openscad-2019.05/testdata/scad/3D/features/child-child-test.scad0000644000076500000240000000042013402025764024662 0ustar kintelstaff00000000000000module up() { translate([0,0,1]) child(0); } module red() { color("Red") child(0); } up() cylinder(r=5); translate([5,0,0]) up() up() cylinder(r=5); translate([10,0,0]) up() up() up() red() cylinder(r=5); translate([15,0,0]) red() up() up() up() up() cylinder(r=5); openscad-2019.05/testdata/scad/3D/features/child-tests.scad0000644000076500000240000000123713402025764023773 0ustar kintelstaff00000000000000$fn=16; module parent(range=[0:2]) { for (i=range) { translate([2.5*i,0,0]) child(i); } } // Normal parent() { sphere(); cylinder(h=2, center=true); cube(2, center=true); } // No children parent(); // Too few children translate([0,3,0]) parent() { sphere(); } // No parameter to child module parent2() { child(); } translate([2.5,3,0]) parent2() { cylinder(h=2, center=true); sphere(); } // Negative parameter to child module parent3() { child(-1); } translate([5,3,0]) parent3() { cube(); sphere(); } // Leaking variables to child list is not allowed translate([0,6,0]) parent(range=[0:1], testvar=10) { sphere(); cube(testvar, center=true);} openscad-2019.05/testdata/scad/3D/features/color-tests.scad0000644000076500000240000000075113402025764024026 0ustar kintelstaff00000000000000// Empty color(); // No children color() { } module object() cube([10,10,10]); translate([12,12,0]) object(); color([1,0,0]) translate([24,12,0]) object(); translate([0,12,0]) color("Purple") object(); color([0,0,1,0.5]) object(); translate([12,0,0]) color([0,0,1],0.5) object(); translate([24,0,0]) color(c="Green",alpha=0.2) object(); translate([-12,12,0]) color() object(); translate([-12,0,0]) color(alpha=0.5) object(); translate([24,-12,0]) color([1,0,0]) color([0,0,1]) object(); openscad-2019.05/testdata/scad/3D/features/cube-tests.scad0000644000076500000240000000022513402025764023622 0ustar kintelstaff00000000000000cube(); cube([1,1,0]); cube([1,0,1]); cube([0,1,1]); cube([0,0,0]); translate([2,0,0]) cube([2,3,1]); translate([6,0,0]) cube([2,4,2], center=true); openscad-2019.05/testdata/scad/3D/features/cylinder-diameter-tests.scad0000644000076500000240000000112213402025764026302 0ustar kintelstaff00000000000000cylinder(); translate([-11,-11,0]) cylinder(h=3, r=5); translate([-11, 0,0]) cylinder(h=5, d=10); translate([-11, 11,0]) cylinder(h=7, r=1, d=10); translate([ 11,-11,0]) cylinder(h=5, r1=5); translate([ 11, 0,0]) cylinder(h=7, d1=10); translate([ 11, 11,0]) cylinder(h=9, r1=1, d1=10); translate([ 22,-11,0]) cylinder(h=5, r2=5); translate([ 22, 0,0]) cylinder(h=7, d2=10); translate([ 22, 11,0]) cylinder(h=9, r2=1, d2=10); translate([ 33,-11,0]) cylinder(h=5, r1=5, r2=5); translate([ 33, 0,0]) cylinder(h=7, d1=10, d2=10); translate([ 33, 11,0]) cylinder(h=9, r1=1, d1=10, r2=1, d2=10); openscad-2019.05/testdata/scad/3D/features/cylinder-tests.scad0000644000076500000240000000140013402025764024511 0ustar kintelstaff00000000000000cylinder(); translate([1,0,0]) cylinder(r=0); translate([2,0,0]) cylinder(r1=0, r2=0); translate([0,-11,0]) cylinder(r=5); translate([0,11,0]) cylinder(r=5, h=10, center=true); translate([11,-11,0]) cylinder(h=5, r1=5); translate([11,0,0]) cylinder(h=5, r1=5, r2=0); translate([11,11,0]) cylinder(h=8, r1=5, r2=5); translate([22,-11,0]) cylinder(h=5, r=5, r1=0, center=true); translate([22,0,0]) cylinder(h=5, r=5, r2=0); translate([22,11,0]) cylinder(h=15, r=5, r2=5); // This tests for hexagonal cylinder orientation, since people // tend to "abuse" this for captured nut slots translate([-10,0,0]) cylinder(h=2, r=3, $fn=6); // Test that we clamp number of sections to a minimum of 3 translate([-10, -10, 0]) cylinder(r=3.5356, h=7.0711, $fn=0.1, center=true); openscad-2019.05/testdata/scad/3D/features/difference-tests.scad0000644000076500000240000000211113402025764024772 0ustar kintelstaff00000000000000// Empty difference(); // No children difference() { } // Basic difference() { cube([10,10,10], center=true); cylinder(r=4, h=20, center=true); } // Two negative objects translate([0,12,0]) difference() { cube([10,10,10], center=true); cylinder(r=4, h=11, center=true); rotate([0,90,0]) cylinder(r=4, h=11, center=true); } // Not intersecting translate([12,12,0]) difference() { cube([10,10,10], center=true); translate([0,0,7.01]) cylinder(r=4, h=4, center=true); } // Barely intersecting translate([24,0,0]) difference() { cube([10,10,10], center=true); translate([0,0,6.99]) cylinder(r=4, h=4, center=true); } // Subtracting something from nothing translate([24,12,0]) difference() { cube([0,10,10], center=true); # cylinder(r=4, h=20, center=true); } // Non-geometry (echo) statement as first child should be ignored translate([24,-12,0]) difference() { echo("difference-tests"); cube([10,10,10], center=true); cylinder(r=4, h=20, center=true); } // Subtracting 2D from 3D translate([12,0,0]) difference() { cube([10,10,10], center=true); circle(r=6); } openscad-2019.05/testdata/scad/3D/features/disable-modifier.scad0000644000076500000240000000015613402025764024746 0ustar kintelstaff00000000000000difference() { *sphere(r=10); cylinder(h=30, r=6, center=true); } *if (true) cube([25,6,3], center=true); openscad-2019.05/testdata/scad/3D/features/for-nested-tests.scad0000644000076500000240000000011613402025764024751 0ustar kintelstaff00000000000000for(x=[0:3], y=[0:0.5:1], z=[0,2,3]) { translate(10*[x,y,z]) sphere(r=3); } openscad-2019.05/testdata/scad/3D/features/for-tests.scad0000644000076500000240000000356613402025764023505 0ustar kintelstaff00000000000000// Empty for(); // No children for(i=2) { } // Modifier and no children %for(i=2) { } #for(i=2) { } // Null translate([-10,0,0]) for() cylinder(r=4); // Scalar translate([10,0,0]) for(i=3) cylinder(r=i); // Range for(r=[1:5]) translate([r*10-30,10,0]) cylinder(r=r); // Reverse for(r=[5:1]) translate([r*10-30,20,0]) cylinder(r=r); // Step for(r=[1:2:6]) translate([r*10-30,30,0]) difference() {cylinder(r=r, center=true); cylinder(r=r/2, h=2, center=true);} // Fractional step for(r=[1.5:0.2:2.5]) translate([r*10-30,30,0]) cube([1, 4*r, 2], center=true); // Negative range, negative step for(r=[5:-1:1]) translate([r*10-30,50,0]) cylinder(r=r); // Negative range, positive step (using backward compatible auto swap of begin and end) for(r=[5:1]) translate([r*10-30,40,0]) cylinder(r=r); // Zero step for(r=[1:0:5]) translate([r*10+60,40,0]) cylinder(r=r); // Negative step for(r=[1:-1:5]) translate([r*10-30,50,0]) cylinder(r=r); // Illegal step value for(r=[1:true:5]) translate([r*10-60,50,0]) cylinder(r=r); // Vector for(r=[1,2,5]) translate([r*10-30,0,0]) cylinder(r=r); // String for(c="") echo("never shown"); for(c="a\u2191b\U01f600") echo(c); nan = 0/0; inf = 1/0; ninf = -1/0; echo(nan); echo(inf); echo(ninf); // validate step values for(i=[0:nan:0]) { echo("NAN", i); } for(i=[0:inf:0]) { echo("INF", i); } for(i=[0:ninf:0]) { echo("-INF", i); } for(i=[0:nan:1]) { echo("NAN", i); } for(i=[0:inf:1]) { echo("INF", i); } for(i=[0:ninf:1]) { echo("-INF", i); } for(i=[1:nan:0]) { echo("NAN", i); } for(i=[1:inf:0]) { echo("INF", i); } for(i=[1:ninf:0]) { echo("-INF", i); } // validate begin / end values for(i = [0:inf]) {} for(i = [0:ninf]) {} for(i = [inf:0]) {} for(i = [ninf:0]) {} for(i = [0:2:inf]) {} for(i = [0:2:ninf]) {} for(i = [inf:2:0]) {} for(i = [ninf:2:0]) {} for(i = [inf:2:inf]) {} for(i = [ninf:2:ninf]) {} for(i = [inf:2:ninf]) {} for(i = [ninf:2:inf]) {} openscad-2019.05/testdata/scad/3D/features/highlight-and-background-modifier.scad0000644000076500000240000000145413402025764030171 0ustar kintelstaff00000000000000difference() { sphere(r=10); %#cylinder(h=30, r=6, center=true); %#if (true) cube([25,6,3], center=true); } %#translate([0,-9,0]) difference() { color("green") cube([10,4,10], center=true); color("red") translate([0,-2,0]) sphere(3); } %translate([13,0,0]){ difference() { sphere(r=10); cylinder(h=30, r=6, center=true); if (true) cube([25,6,3], center=true); } #translate([0,-9,0]) difference() { color("green") cube([10,4,10], center=true); color("red") translate([0,-2,0]) sphere(3); } } #translate([26,0,0]){ difference() { sphere(r=10); cylinder(h=30, r=6, center=true); if (true) cube([25,6,3], center=true); } %translate([0,-9,0]) difference() { color("green") cube([10,4,10], center=true); color("red") translate([0,-2,0]) sphere(3); } } openscad-2019.05/testdata/scad/3D/features/highlight-modifier.scad0000644000076500000240000000036213402025764025311 0ustar kintelstaff00000000000000difference() { sphere(r=10); #cylinder(h=30, r=6, center=true); } #if (true) cube([25,6,3], center=true); #translate([0,-9,0]) difference() { color("green") cube([10,4,10], center=true); color("red") translate([0,-2,0]) sphere(3); } openscad-2019.05/testdata/scad/3D/features/highlight-modifier2.scad0000644000076500000240000000206613402025764025376 0ustar kintelstaff00000000000000color("Blue") { translate([-30,-10,-10]) cube([70,50,2]); translate([40,-10,-10]) cube([2,50,30]); translate([-30,40,-10]) cube([70,2,30]); } translate([-20,0,0]) difference() { intersection() { sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } difference() { intersection() { sphere(10); cube(15, center=true); } #cylinder(h=20, r=5, center=true); } translate([0,20,0]) difference() { intersection() { #sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } translate([20,20,0]) difference() { intersection() { sphere(10); #cube(15, center=true); } cylinder(h=20, r=5, center=true); } translate([20,0,0]) difference() { #intersection() { sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } translate([-20,20,0]) #difference() { intersection() { sphere(10); cube(15, center=true); } cylinder(h=20, r=5, center=true); } openscad-2019.05/testdata/scad/3D/features/hull3-tests.scad0000644000076500000240000000130713402025764023735 0ustar kintelstaff00000000000000// Empty hull(); // No children hull() { } // Hull of hull (forces internal cache to be initialized; this has caused a crash earlier) translate([25,0,0]) hull() hull3test(); module hull3test() { hull() { cylinder(r=10, h=1); translate([0,0,10]) cube([5,5,5], center=true); } } hull3test(); translate([50,0,0]) hull() { translate([0,0,10]) cylinder(r=3); difference() { cylinder(r=10, h=4, center=true); cylinder(r=5, h=5, center=true); } } // Don't Crash (issue 188) translate([-5,-5,-5]) { hull() { intersection() { cube([1,1,1]); translate([-1,-1,-1]) cube([1,1,1]); } } } module hull3null() { hull() { cube(0); sphere(0); } } hull3null(); openscad-2019.05/testdata/scad/3D/features/ifelse-tests.scad0000644000076500000240000000164113402025764024156 0ustar kintelstaff00000000000000if (true) { cube(2, true); translate([-3,0,0]) cube(2, true); } else { cylinder(r=1,h=2); translate([-3,0,0]) cylinder(r=1,h=2); } translate([3,0,0]) if (false) cylinder(r=1,h=2); else cube(2, true); translate([0,3,0]) if (false) cylinder(r=1,h=2); else if (true) cube(2, true); else sphere(); translate([3,3,0]) if (false) cylinder(r=1,h=2); else if (false) sphere(); else cube(2, true); translate([6,0,0]) if (0) cylinder(r=1,h=2); else cube(2, true); translate([6,3,0]) if (1) cube(2, true); else cylinder(r=1,h=2); translate([9,0,0]) if ("") cylinder(r=1,h=2); else cube(2, true); translate([9,3,0]) if ("hello") cube(2, true); else cylinder(r=1,h=2); translate([12,0,0]) if ([]) cylinder(r=1,h=2); else cube(2, true); translate([12,3,0]) if ([1,2,3]) cube(2, true); else cylinder(r=1,h=2); translate([15,0,0]) if (ILLEGAL) cylinder(r=1,h=2); else cube(2, true); openscad-2019.05/testdata/scad/3D/features/import-empty-tests.scad0000644000076500000240000000016713402025764025357 0ustar kintelstaff00000000000000// Testing that empty imports don't cause problems when mixed with real objects difference() { import(); cube(); } openscad-2019.05/testdata/scad/3D/features/import.3mf0000644000076500000240000000263713402025764022642 0ustar kintelstaff00000000000000PK G_ 3D/3dmodel.modelVے0|֯H]k#N`1lqق` L7%L*gj:-H/)_lyǥ˓`:kJqiRuy^Rj}9ljm* QIYVMHiybf?퇢>/c`K^\eS%? ]~~Ċ>?/ ZhĦ𿹉[$WŰV1>ևL;7{9_#L7U!ש#0'v)^Dnd3>t}3簓ѾpAhjT\#'Ł&kk8mP|e Hq {ຎ$\LwuF 8쭃Xa#x( jPsE !g%l7`= ZB}㥱X,!)$'ktFXi',Z}T #{z=6Q>= (u2ѥͻ_v%{Ȼ#gHɟj ǡ L' FY# w|<m$0`)u k}qyM{VJln LO-<٤ _`:&^{8]Zw\PK  xQ[Content_Types].xmlRMJ0^SlMUo t$$GV(ւK8CLZƷ#ɪ׏I-ZDQdp:>i1*h{PeyGdW3tz$^f^loz)E[(څ| F._)i:mhKBp͡swg(M}{ƐvF0s894ZH}PK >ͥN _rels/.relse 0)DĴ/^/6?$ۻ~̜ŝBPu$,ӕf8G?6JSGĨG2*Γewg+}S(~PgUOOL3S3.i \eE]G3V_1XN7}{p5^PK G_ 3D/3dmodel.modelPK  xQ[Content_Types].xmlPK >ͥN _rels/.relsPKopenscad-2019.05/testdata/scad/3D/features/import.stl0000644000076500000240000002240613402025764022753 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal 0.540558 -0.392737 0.744013 outer loop vertex 0.095492 -0.293893 0.951057 vertex 0.809017 0.000000 0.587785 vertex 0.309017 0.000000 0.951057 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex -0.250000 -0.181636 0.951057 vertex 0.095492 -0.293893 0.951057 vertex 0.309017 0.000000 0.951057 endloop endfacet facet normal 0.000000 -0.000000 1.000000 outer loop vertex -0.250000 0.181636 0.951057 vertex -0.250000 -0.181636 0.951057 vertex 0.095492 0.293893 0.951057 endloop endfacet facet normal 0.000000 -0.000000 1.000000 outer loop vertex 0.095492 0.293893 0.951057 vertex -0.250000 -0.181636 0.951057 vertex 0.309017 0.000000 0.951057 endloop endfacet facet normal 0.540559 0.392738 0.744011 outer loop vertex 0.095492 0.293893 0.951057 vertex 0.309017 0.000000 0.951057 vertex 0.250000 0.769421 0.587785 endloop endfacet facet normal 0.540558 0.392738 0.744012 outer loop vertex 0.250000 0.769421 0.587785 vertex 0.309017 0.000000 0.951057 vertex 0.809017 0.000000 0.587785 endloop endfacet facet normal 0.540558 -0.392738 0.744012 outer loop vertex 0.095492 -0.293893 0.951057 vertex 0.250000 -0.769421 0.587785 vertex 0.809017 0.000000 0.587785 endloop endfacet facet normal -0.206474 -0.635464 0.744012 outer loop vertex -0.250000 -0.181636 0.951057 vertex 0.250000 -0.769421 0.587785 vertex 0.095492 -0.293893 0.951057 endloop endfacet facet normal 0.782436 -0.568473 0.254229 outer loop vertex 0.250000 -0.769421 0.587785 vertex 1.000000 0.000000 0.000000 vertex 0.809017 0.000000 0.587785 endloop endfacet facet normal 0.782436 0.568473 0.254229 outer loop vertex 0.250000 0.769421 0.587785 vertex 0.809017 0.000000 0.587785 vertex 0.309017 0.951057 0.000000 endloop endfacet facet normal 0.782436 0.568473 0.254229 outer loop vertex 0.309017 0.951057 0.000000 vertex 0.809017 0.000000 0.587785 vertex 1.000000 0.000000 0.000000 endloop endfacet facet normal -0.206475 -0.635464 0.744012 outer loop vertex -0.654508 -0.475528 0.587785 vertex 0.250000 -0.769421 0.587785 vertex -0.250000 -0.181636 0.951057 endloop endfacet facet normal -0.668166 0.000000 0.744012 outer loop vertex -0.654508 -0.475528 0.587785 vertex -0.250000 -0.181636 0.951057 vertex -0.250000 0.181636 0.951057 endloop endfacet facet normal -0.668166 0.000000 0.744012 outer loop vertex -0.654508 0.475528 0.587785 vertex -0.654508 -0.475528 0.587785 vertex -0.250000 0.181636 0.951057 endloop endfacet facet normal -0.206475 0.635464 0.744012 outer loop vertex -0.654508 0.475528 0.587785 vertex -0.250000 0.181636 0.951057 vertex 0.095492 0.293893 0.951057 endloop endfacet facet normal -0.206475 0.635464 0.744012 outer loop vertex -0.654508 0.475528 0.587785 vertex 0.095492 0.293893 0.951057 vertex 0.250000 0.769421 0.587785 endloop endfacet facet normal -0.298864 0.919808 0.254229 outer loop vertex -0.809017 0.587785 0.000000 vertex -0.654508 0.475528 0.587785 vertex 0.250000 0.769421 0.587785 endloop endfacet facet normal -0.298864 0.919808 0.254229 outer loop vertex -0.809017 0.587785 0.000000 vertex 0.250000 0.769421 0.587785 vertex 0.309017 0.951057 0.000000 endloop endfacet facet normal 0.782436 -0.568473 0.254229 outer loop vertex 0.250000 -0.769421 0.587785 vertex 0.309017 -0.951057 0.000000 vertex 1.000000 0.000000 0.000000 endloop endfacet facet normal -0.298864 -0.919808 0.254229 outer loop vertex -0.654508 -0.475528 0.587785 vertex 0.309017 -0.951057 0.000000 vertex 0.250000 -0.769421 0.587785 endloop endfacet facet normal 0.782436 -0.568473 -0.254229 outer loop vertex 0.309017 -0.951057 0.000000 vertex 0.809017 0.000000 -0.587785 vertex 1.000000 0.000000 0.000000 endloop endfacet facet normal 0.782436 0.568473 -0.254229 outer loop vertex 0.250000 0.769421 -0.587785 vertex 0.309017 0.951057 0.000000 vertex 1.000000 0.000000 0.000000 endloop endfacet facet normal 0.782436 0.568473 -0.254229 outer loop vertex 0.250000 0.769421 -0.587785 vertex 1.000000 0.000000 0.000000 vertex 0.809017 0.000000 -0.587785 endloop endfacet facet normal -0.298864 0.919808 -0.254229 outer loop vertex -0.809017 0.587785 0.000000 vertex 0.309017 0.951057 0.000000 vertex -0.654508 0.475528 -0.587785 endloop endfacet facet normal -0.298864 0.919808 -0.254229 outer loop vertex -0.654508 0.475528 -0.587785 vertex 0.309017 0.951057 0.000000 vertex 0.250000 0.769421 -0.587785 endloop endfacet facet normal -0.298864 -0.919808 0.254229 outer loop vertex -0.809017 -0.587785 0.000000 vertex 0.309017 -0.951057 0.000000 vertex -0.654508 -0.475528 0.587785 endloop endfacet facet normal -0.967144 0.000000 0.254230 outer loop vertex -0.654508 -0.475528 0.587785 vertex -0.654508 0.475528 0.587785 vertex -0.809017 -0.587785 0.000000 endloop endfacet facet normal -0.967144 0.000000 0.254230 outer loop vertex -0.809017 -0.587785 0.000000 vertex -0.654508 0.475528 0.587785 vertex -0.809017 0.587785 0.000000 endloop endfacet facet normal -0.967144 0.000000 -0.254230 outer loop vertex -0.809017 0.587785 0.000000 vertex -0.654508 0.475528 -0.587785 vertex -0.809017 -0.587785 0.000000 endloop endfacet facet normal -0.967144 0.000000 -0.254230 outer loop vertex -0.809017 -0.587785 0.000000 vertex -0.654508 0.475528 -0.587785 vertex -0.654508 -0.475528 -0.587785 endloop endfacet facet normal 0.782436 -0.568473 -0.254229 outer loop vertex 0.250000 -0.769421 -0.587785 vertex 0.809017 0.000000 -0.587785 vertex 0.309017 -0.951057 0.000000 endloop endfacet facet normal -0.298864 -0.919808 -0.254229 outer loop vertex -0.809017 -0.587785 0.000000 vertex 0.250000 -0.769421 -0.587785 vertex 0.309017 -0.951057 0.000000 endloop endfacet facet normal 0.540558 -0.392738 -0.744012 outer loop vertex 0.250000 -0.769421 -0.587785 vertex 0.309017 0.000000 -0.951057 vertex 0.809017 0.000000 -0.587785 endloop endfacet facet normal 0.540558 0.392738 -0.744012 outer loop vertex 0.095492 0.293893 -0.951057 vertex 0.250000 0.769421 -0.587785 vertex 0.809017 0.000000 -0.587785 endloop endfacet facet normal 0.540558 0.392737 -0.744013 outer loop vertex 0.095492 0.293893 -0.951057 vertex 0.809017 0.000000 -0.587785 vertex 0.309017 0.000000 -0.951057 endloop endfacet facet normal -0.206475 0.635464 -0.744012 outer loop vertex -0.654508 0.475528 -0.587785 vertex 0.250000 0.769421 -0.587785 vertex -0.250000 0.181636 -0.951057 endloop endfacet facet normal -0.206474 0.635464 -0.744012 outer loop vertex -0.250000 0.181636 -0.951057 vertex 0.250000 0.769421 -0.587785 vertex 0.095492 0.293893 -0.951057 endloop endfacet facet normal -0.668166 0.000000 -0.744012 outer loop vertex -0.654508 0.475528 -0.587785 vertex -0.250000 0.181636 -0.951057 vertex -0.654508 -0.475528 -0.587785 endloop endfacet facet normal -0.668166 0.000000 -0.744012 outer loop vertex -0.654508 -0.475528 -0.587785 vertex -0.250000 0.181636 -0.951057 vertex -0.250000 -0.181636 -0.951057 endloop endfacet facet normal -0.298864 -0.919808 -0.254229 outer loop vertex -0.809017 -0.587785 0.000000 vertex -0.654508 -0.475528 -0.587785 vertex 0.250000 -0.769421 -0.587785 endloop endfacet facet normal -0.206475 -0.635464 -0.744012 outer loop vertex -0.654508 -0.475528 -0.587785 vertex 0.095492 -0.293893 -0.951057 vertex 0.250000 -0.769421 -0.587785 endloop endfacet facet normal -0.206475 -0.635464 -0.744012 outer loop vertex -0.654508 -0.475528 -0.587785 vertex -0.250000 -0.181636 -0.951057 vertex 0.095492 -0.293893 -0.951057 endloop endfacet facet normal 0.540559 -0.392738 -0.744011 outer loop vertex 0.095492 -0.293893 -0.951057 vertex 0.309017 0.000000 -0.951057 vertex 0.250000 -0.769421 -0.587785 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -0.250000 0.181636 -0.951057 vertex 0.095492 0.293893 -0.951057 vertex -0.250000 -0.181636 -0.951057 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex -0.250000 -0.181636 -0.951057 vertex 0.095492 0.293893 -0.951057 vertex 0.309017 0.000000 -0.951057 endloop endfacet facet normal -0.000000 0.000000 -1.000000 outer loop vertex -0.250000 -0.181636 -0.951057 vertex 0.309017 0.000000 -0.951057 vertex 0.095492 -0.293893 -0.951057 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/scad/3D/features/import_bin.stl0000644000076500000240000000452013402025764023600 0ustar kintelstaff00000000000000VCG .b ?ɾw>?O=%yyxs?O?y?z7>yxs??9yxs?O=%yyxs?z7>yxs??9>yxs?9yxs?O=%y>yxs??O=%y>yxs?9yxs?z7>yxs?b ?>w>?O=%y>yxs?z7>yxs?>D?y?a ?>w>?>D?y?z7>yxs?O?y?b ?ɾw>?O=%yyxs?>Dy?O?y?nS"w>?9yxs?>Dy?O=%yyxs?MH?rJ*>>Dy??O?y?MH?q?X*>>D?y?O?y?z7>yxs?MH?o?M*>z7>yxs?O?y??8nSŭ"w>?֍'hxy?>Dy?9yxs? +w>?֍'hxy?9yxs?9>yxs? +w>?֍'hx>y?֍'hxy?9>yxs?nSͭ"?w>?֍'hx>y?9>yxs?O=%y>yxs?3nS"?w>?֍'hx>y?O=%y>yxs?>D?y?xk?Y*>Oy?֍'hx>y?>D?y?xk?[*>Oy?>D?y?z7>yxs?MH?oX*>>Dy?z7>yxs?xk\*>֍'hxy?z7>yxs>Dy?MH?oM*z7>yxsO?y?MH?o?X*>D?yz7>yxs??MH?r?J*>D?y?O?yxk?Y*Oy?z7>yxs?֍'hx>yxk?\*֍'hx>yz7>yxs?>D?yxkY*>Oyz7>yxs֍'hxy?wf*>֍'hxy?֍'hx>y?Oywg*>Oy֍'hx>y?Oy?wg*Oy?֍'hx>yOywg*Oy֍'hx>y֍'hxyMH?qX*>DyO?yz7>yxsxk[*Oy>Dyz7>yxsa ?ɾw>>Dyz7>yxsO?yb ?>w>O=%y>yxs>D?yO?yb ?>w>O=%y>yxsO?yz7>yxs8nSŭ"?w>֍'hx>y>D?y9>yxsnS"?w>9>yxs>D?yO=%y>yxs +w>֍'hx>y9>yxs֍'hxy +w>֍'hxy9>yxs9yxsxkY*Oy֍'hxy>Dy3nS"w>֍'hxyO=%yyxs>DynSͭ"w>֍'hxy9yxsO=%yyxsb ?ɾw>O=%yyxsz7>yxs>Dy9>yxsO=%y>yxs9yxs9yxsO=%y>yxsz7>yxs9yxsz7>yxsO=%yyxsopenscad-2019.05/testdata/scad/3D/features/import_bin_solid.stl0000644000076500000240000000452013402025764024772 0ustar kintelstaff00000000000000solid TL-400-0101-001CLR - OpenBeam 1515 Extrusion, Clear Anodized .b ?ɾw>?O=%yyxs?O?y?z7>yxs??9yxs?O=%yyxs?z7>yxs??9>yxs?9yxs?O=%y>yxs??O=%y>yxs?9yxs?z7>yxs?b ?>w>?O=%y>yxs?z7>yxs?>D?y?a ?>w>?>D?y?z7>yxs?O?y?b ?ɾw>?O=%yyxs?>Dy?O?y?nS"w>?9yxs?>Dy?O=%yyxs?MH?rJ*>>Dy??O?y?MH?q?X*>>D?y?O?y?z7>yxs?MH?o?M*>z7>yxs?O?y??8nSŭ"w>?֍'hxy?>Dy?9yxs? +w>?֍'hxy?9yxs?9>yxs? +w>?֍'hx>y?֍'hxy?9>yxs?nSͭ"?w>?֍'hx>y?9>yxs?O=%y>yxs?3nS"?w>?֍'hx>y?O=%y>yxs?>D?y?xk?Y*>Oy?֍'hx>y?>D?y?xk?[*>Oy?>D?y?z7>yxs?MH?oX*>>Dy?z7>yxs?xk\*>֍'hxy?z7>yxs>Dy?MH?oM*z7>yxsO?y?MH?o?X*>D?yz7>yxs??MH?r?J*>D?y?O?yxk?Y*Oy?z7>yxs?֍'hx>yxk?\*֍'hx>yz7>yxs?>D?yxkY*>Oyz7>yxs֍'hxy?wf*>֍'hxy?֍'hx>y?Oywg*>Oy֍'hx>y?Oy?wg*Oy?֍'hx>yOywg*Oy֍'hx>y֍'hxyMH?qX*>DyO?yz7>yxsxk[*Oy>Dyz7>yxsa ?ɾw>>Dyz7>yxsO?yb ?>w>O=%y>yxs>D?yO?yb ?>w>O=%y>yxsO?yz7>yxs8nSŭ"?w>֍'hx>y>D?y9>yxsnS"?w>9>yxs>D?yO=%y>yxs +w>֍'hx>y9>yxs֍'hxy +w>֍'hxy9>yxs9yxsxkY*Oy֍'hxy>Dy3nS"w>֍'hxyO=%yyxs>DynSͭ"w>֍'hxy9yxsO=%yyxsb ?ɾw>O=%yyxsz7>yxs>Dy9>yxsO=%y>yxs9yxs9yxsO=%y>yxsz7>yxs9yxsz7>yxsO=%yyxsopenscad-2019.05/testdata/scad/3D/features/intersection-tests.scad0000644000076500000240000000321213402025764025411 0ustar kintelstaff00000000000000// Empty intersection(); // No children intersection() { } intersection() { sphere(r=5); translate([0,0,3]) cube([4,4,6], center=true); } translate([0,12,0]) intersection() { cube([10,10,10], center=true); cylinder(r=4, h=12, center=true); } translate([12,0,0]) intersection() { cube([10,10,10], center=true); cylinder(r=4, h=12, center=true); rotate([0,90,0]) cylinder(r=4, h=12, center=true); } translate([12,12,0]) intersection() { cube([10,10,10], center=true); translate([0,0,7.01]) cylinder(r=4, h=4, center=true); } translate([24,0,0]) intersection() { cube([10,10,10], center=true); translate([0,0,6.99]) cylinder(r=4, h=4, center=true); } translate([-12,0,0]) intersection() { cube([10,10,10], center=true); translate([0,-10,-10]) cube([10,10,10], center=true); } translate([-12,12,0]) intersection() { cube([10,10,10], center=true); translate([0,-9.99,-9.99]) cube([10,10,10], center=true); } // Intersecting something with nothing translate([0,-12,0]) intersection() { cylinder(r=4, h=5, center=true); cube(0); } // Intersecting something with nothing (issue 996) translate([0,-12,0]) intersection() { cube(4, center=true); linear_extrude(); } translate([0,-16,0]) intersection() { cube(4, center=true); render(); } translate([0,-20,0]) intersection() { cube(4, center=true); minkowski(); } // Intersecting 2D with 3D translate([12,-12,0]) intersection() { cube([5,5,5], center=true); circle(r=2); } // Non-geometry (echo) statement as first child should be ignored translate([24,-12,0]) intersection() { echo("difference-tests"); cube([5,5,5], center=true); cylinder(r=2, h=20, center=true); } openscad-2019.05/testdata/scad/3D/features/intersection_for-tests.scad0000644000076500000240000000040713402025764026262 0ustar kintelstaff00000000000000// Empty intersection_for(); // No children intersection_for(i=1) { } intersection_for(i = [[0, 0, 0], [10, 20, 300], [200, 40, 57], [20, 88, 57]]) rotate(i) cube([100, 20, 20], center = true); openscad-2019.05/testdata/scad/3D/features/linear_extrude-parameter-tests.scad0000644000076500000240000000175213402025764027702 0ustar kintelstaff00000000000000// test cases for linear extrude with various (invalid) parameters oz = 30; params = [ [0, undef], [1, 1/0], [2, -1/0], [3, 0/0], [4, ""], [5, true], [6, [1:3]], [7, 3] ]; for (a = params) translate([-100, 0, oz * a[0]]) color("red") linear_extrude(height = 10, convexity = a[1]) square(20); for (a = params) translate([-50, 0, oz * a[0]]) color("yellow") linear_extrude(height = 10, convexity = undef, scale = 1, twist = a[1]) square(20); for (a = params) translate([0, 0, oz * a[0]]) color("gray") linear_extrude(height = 10, convexity = undef, scale = 1, twist = 0, slices = a[1]) square(20); for (a = params) translate([50, 0, oz * a[0]]) color("purple") linear_extrude(height = 10, convexity = undef, scale = 1, twist = 30, slices = a[1]) square(20); for (a = params) translate([100, 0, oz * a[0]]) color("blue") linear_extrude(height = 10, convexity = 2, scale = a[1]) square(20); for (a = params) translate([(a[0] + 5) * 30, 0, 0]) color("green") linear_extrude(height = a[1]) square(20);openscad-2019.05/testdata/scad/3D/features/linear_extrude-scale-zero-tests.scad0000644000076500000240000000277613402025764027775 0ustar kintelstaff00000000000000// test cases for linear extrude with scale // by TakeItAndRun 2013 // syntax: linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) a=3; b=20; c=0; x=1; y=1; module linear_extrudes_of_different_shapes(a=a,b=b,c=c,x=x,y=y) { translate(00*[4,0,0]) // linear_extrude of shape with hole linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) difference() { square(2,true); square(1,true); } translate(01*[4,0,0]) // linear_extrude of disjoint polygons shapes linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) { translate([1,0,0]) square(1,true); translate([-1,0,0]) square(1,true); } translate(02*[4,0,0]) // linear_extrude with a coplanar face linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) { translate([.5,0,0])square(); translate([-.5,0,0])square(); } translate(03*[4,0,0]) // linear_extrude with internal hole and one coplanar edge linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) difference() { square(2,true); translate([-0.5,0,0]) square(1,true); } } // Test varying parameters translate(00*[0,3,0]) linear_extrudes_of_different_shapes(c=0,x=0,y=y); translate(01*[0,3,0]) linear_extrudes_of_different_shapes(c=0,x=x,y=0); translate(02*[0,3,0]) linear_extrudes_of_different_shapes(c=0,x=0,y=0); translate(03*[0,3,0]) linear_extrudes_of_different_shapes(c=180,x=0,y=y); translate(04*[0,3,0]) linear_extrudes_of_different_shapes(c=180,x=x,y=0); translate(05*[0,3,0]) linear_extrudes_of_different_shapes(c=180,x=0,y=0); openscad-2019.05/testdata/scad/3D/features/linear_extrude-tests.scad0000644000076500000240000000222513402025764025720 0ustar kintelstaff00000000000000// Empty rotate_extrude(); // No children rotate_extrude() { } // 3D child rotate_extrude() { cube(); } linear_extrude(height=10) square([10,10]); translate([19,5,0]) linear_extrude(height=10, center=true) difference() {circle(5); circle(3);} translate([31.5,2.5,0]) linear_extrude(height=10, twist=-45) polygon(points = [[-5,-2.5], [5,-2.5], [0,2.5]]); translate([0,20,0]) linear_extrude(height=20, twist=30, slices=2) { difference() { square([10,10]); translate([1,1]) square([8,8]); } } translate([19,20,0]) linear_extrude(height=20, twist=45, slices=10) square([10,10]); translate([0,-15,0]) linear_extrude(5) square([10,10]); // scale given as a scalar translate([-25,-10,0]) linear_extrude(height=10, scale=2) square(5, center=true); // scale given as a 3-dim vector translate([-15,20,0]) linear_extrude(height=20, scale=[4,5,6]) square(10); // scale is negative translate([-10,5,0]) linear_extrude(height=15, scale=-2) square(10, center=true); // scale given as undefined translate([-15,-15,0]) linear_extrude(height=10, scale=var_undef) square(10); // height is negative translate([0,-25,0]) linear_extrude(-1) square(10, center=true); openscad-2019.05/testdata/scad/3D/features/minkowski3-erosion.scad0000644000076500000240000000060313402025764025316 0ustar kintelstaff00000000000000module erode(r) { difference() { children(); minkowski(convexity=3) { difference() { cube(25, center=true); children(); } sphere(r); } } } module object() { translate([-5,0,0]) cube([10,5,5]); translate([0,-5,0]) cube([5,10,5]); cube([5,5,10]); } erode(1,$fn=12) object(); openscad-2019.05/testdata/scad/3D/features/minkowski3-tests.scad0000644000076500000240000000131713402025764025005 0ustar kintelstaff00000000000000module roundedBox3dSimple() { minkowski() { cube([10,10,5]); cylinder(r=5, h=5); } } module roundedBox3dCut() { minkowski() { difference() { cube([10,10,5]); cube([5,5,5]); } cylinder(r=5, h=5); } } module roundedBox3dHole() { minkowski() { difference() { cube([10,10,5], center=true); cube([8,8,10], center=true); } cylinder(r=2); } } translate([-20,30,0]) roundedBox3dHole(); translate([0,25,0]) roundedBox3dCut(); translate([25,25,0]) roundedBox3dSimple(); // One child translate([0,0,0]) minkowski() { cube([10,10,5]); } // Empty minkowski(); // No children minkowski() { } openscad-2019.05/testdata/scad/3D/features/mirror-tests.scad0000644000076500000240000000004013402025764024211 0ustar kintelstaff00000000000000render() mirror([1,0,0]) cube();openscad-2019.05/testdata/scad/3D/features/module-recursion.scad0000644000076500000240000000043513402025764025043 0ustar kintelstaff00000000000000module tree(currentScale, levels) { h = currentScale; w = currentScale/5; childScale = currentScale * 0.7; if (levels > 0) { cylinder(r=w, h=h); translate([0,0,h]) for (i = [1:2]) { rotate([40, 0, i * 180]) tree(childScale, levels-1); } } } tree(1, 4); openscad-2019.05/testdata/scad/3D/features/modulevariables.scad0000644000076500000240000000023613402025764024724 0ustar kintelstaff00000000000000module mymodule(modparam) { inner_variable = 23; inner_variable2 = modparam * 2; cylinder(r1=inner_variable, r2=inner_variable2, h=10); } mymodule(5); openscad-2019.05/testdata/scad/3D/features/nullspace-difference.scad0000644000076500000240000000010513402025764025617 0ustar kintelstaff00000000000000difference() { cube(1, center=true); cube(2, center=true); } openscad-2019.05/testdata/scad/3D/features/nullspace-intersection.scad0000644000076500000240000000012413402025764026234 0ustar kintelstaff00000000000000intersection() { translate([-2,0,0]) cube(1); translate([2,0,0]) cube(1); } openscad-2019.05/testdata/scad/3D/features/nullspace-minkowski-intersection.scad0000644000076500000240000000027313402025764030252 0ustar kintelstaff00000000000000intersection() { minkowski() { intersection() { translate([-2,0,0]) cube(1); translate([2,0,0]) cube(1); } cube(); } cube(); } openscad-2019.05/testdata/scad/3D/features/nullspace-minkowski.scad0000644000076500000240000000020013402025764025534 0ustar kintelstaff00000000000000minkowski() { intersection() { translate([-2,0,0]) cube(1); translate([2,0,0]) cube(1); } cube(); } openscad-2019.05/testdata/scad/3D/features/polyhedron-concave-test.scad0000644000076500000240000000060013402025764026315 0ustar kintelstaff00000000000000polyhedron(points = [[0, 0, 0], [2, 4, 0], [8, 4, 0], [10, 0, 0], [10, 10, 0], [0, 10, 0], [0, 0, 5], [2, 4, 5], [8, 4, 5], [10, 0, 5], [10, 10, 5], [0, 10, 5]], faces = [[0, 1, 2, 3, 4, 5], [0, 6, 7], [0, 7, 1], [1, 7, 8], [1, 8, 2], [2, 8, 9], [2, 9, 3], [3, 9, 10], [3, 10, 4], [4, 10, 11], [4, 11, 5], [5, 11, 6], [5, 6, 0], [11, 10, 9, 8, 7, 6]], convexity = 2); openscad-2019.05/testdata/scad/3D/features/polyhedron-nonplanar-tests.scad0000644000076500000240000002122213402025764027055 0ustar kintelstaff00000000000000// Used to cause issue #349 // Very slightly non-planar polyhedron polyhedron(faces=[[3,2,1,0],[7,6,5,4],[0,1,6,7],[1,2,5,6],[2,3,4,5],[3,0,7,4]], points=[ [0.0174497,-0.0174524,0.999695], [1.0173,-0.0174524,0.982243], [1.0176,0.982395,0.999693], [0.0177543,0.982395,1.01715], [0.000304586,0.999848,0.0174497], [1.00015,0.999848,-0.00000265809], [0.999848,-0.0000000000000271051,-0.0174524], [0,0,0]]); // Really non-planar polyhedron translate([2,0,0]) polyhedron(faces=[[3,2,1,0],[7,6,5,4],[0,1,6,7],[1,2,5,6],[2,3,4,5],[3,0,7,4]], points=[ [0,0,1], [1,0.2,1], [1,1,1], [0,1,1], [0,1,0], [1,1,0], [1,0,0], [0,0,0]]); // Real-world example: truncated icosidodecahedron translate([4.5,0.5,0.5]) scale(0.02) polyhedron(points = [ [-10., -13.090169943749475, -34.270509831248425], [-10., -13.090169943749475, 34.270509831248425], [-10., 13.090169943749475, -34.270509831248425], [-10., 13.090169943749475, 34.270509831248425], [-5., -5., -37.3606797749979], [-5., -5., 37.3606797749979], [-5., 5., -37.3606797749979], [-5., 5., 37.3606797749979], [-5., -37.3606797749979, -5.], [-5., -37.3606797749979, 5.], [-5., -21.18033988749895, -31.18033988749895], [-5., -21.18033988749895, 31.18033988749895], [-5., 37.3606797749979, -5.], [-5., 37.3606797749979, 5.], [-5., 21.18033988749895, -31.18033988749895], [-5., 21.18033988749895, 31.18033988749895], [5., -5., -37.3606797749979], [5., -5., 37.3606797749979], [5., 5., -37.3606797749979], [5., 5., 37.3606797749979], [5., -37.3606797749979, -5.], [5., -37.3606797749979, 5.], [5., -21.18033988749895, -31.18033988749895], [5., -21.18033988749895, 31.18033988749895], [5., 37.3606797749979, -5.], [5., 37.3606797749979, 5.], [5., 21.18033988749895, -31.18033988749895], [5., 21.18033988749895, 31.18033988749895], [10., -13.090169943749475, -34.270509831248425], [10., -13.090169943749475, 34.270509831248425], [10., 13.090169943749475, -34.270509831248425], [10., 13.090169943749475, 34.270509831248425], [-34.270509831248425, -10., -13.090169943749475], [-34.270509831248425, -10., 13.090169943749475], [-34.270509831248425, 10., -13.090169943749475], [-34.270509831248425, 10., 13.090169943749475], [-29.270509831248425, -18.090169943749473, -16.18033988749895], [-29.270509831248425, -18.090169943749473, 16.18033988749895], [-29.270509831248425, 18.090169943749473, -16.18033988749895], [-29.270509831248425, 18.090169943749473, 16.18033988749895], [-18.090169943749473, -16.18033988749895, -29.270509831248425], [-18.090169943749473, -16.18033988749895, 29.270509831248425], [-18.090169943749473, 16.18033988749895, -29.270509831248425], [-18.090169943749473, 16.18033988749895, 29.270509831248425], [-13.090169943749475, -34.270509831248425, -10.], [-13.090169943749475, -34.270509831248425, 10.], [-13.090169943749475, -24.270509831248425, -26.18033988749895], [-13.090169943749475, -24.270509831248425, 26.18033988749895], [-13.090169943749475, 24.270509831248425, -26.18033988749895], [-13.090169943749475, 24.270509831248425, 26.18033988749895], [-13.090169943749475, 34.270509831248425, -10.], [-13.090169943749475, 34.270509831248425, 10.], [-26.18033988749895, -13.090169943749475, -24.270509831248425], [-26.18033988749895, -13.090169943749475, 24.270509831248425], [-26.18033988749895, 13.090169943749475, -24.270509831248425], [-26.18033988749895, 13.090169943749475, 24.270509831248425], [-37.3606797749979, -5., -5.], [-37.3606797749979, -5., 5.], [-37.3606797749979, 5., -5.], [-37.3606797749979, 5., 5.], [-16.18033988749895, -29.270509831248425, -18.090169943749473], [-16.18033988749895, -29.270509831248425, 18.090169943749473], [-16.18033988749895, 29.270509831248425, -18.090169943749473], [-16.18033988749895, 29.270509831248425, 18.090169943749473], [-31.18033988749895, -5., -21.18033988749895], [-31.18033988749895, -5., 21.18033988749895], [-31.18033988749895, 5., -21.18033988749895], [-31.18033988749895, 5., 21.18033988749895], [-21.18033988749895, -31.18033988749895, -5.], [-21.18033988749895, -31.18033988749895, 5.], [-21.18033988749895, 31.18033988749895, -5.], [-21.18033988749895, 31.18033988749895, 5.], [-24.270509831248425, -26.18033988749895, -13.090169943749475], [-24.270509831248425, -26.18033988749895, 13.090169943749475], [-24.270509831248425, 26.18033988749895, -13.090169943749475], [-24.270509831248425, 26.18033988749895, 13.090169943749475], [16.18033988749895, -29.270509831248425, -18.090169943749473], [16.18033988749895, -29.270509831248425, 18.090169943749473], [16.18033988749895, 29.270509831248425, -18.090169943749473], [16.18033988749895, 29.270509831248425, 18.090169943749473], [24.270509831248425, -26.18033988749895, -13.090169943749475], [24.270509831248425, -26.18033988749895, 13.090169943749475], [24.270509831248425, 26.18033988749895, -13.090169943749475], [24.270509831248425, 26.18033988749895, 13.090169943749475], [37.3606797749979, -5., -5.], [37.3606797749979, -5., 5.], [37.3606797749979, 5., -5.], [37.3606797749979, 5., 5.], [21.18033988749895, -31.18033988749895, -5.], [21.18033988749895, -31.18033988749895, 5.], [21.18033988749895, 31.18033988749895, -5.], [21.18033988749895, 31.18033988749895, 5.], [13.090169943749475, -34.270509831248425, -10.], [13.090169943749475, -34.270509831248425, 10.], [13.090169943749475, -24.270509831248425, -26.18033988749895], [13.090169943749475, -24.270509831248425, 26.18033988749895], [13.090169943749475, 24.270509831248425, -26.18033988749895], [13.090169943749475, 24.270509831248425, 26.18033988749895], [13.090169943749475, 34.270509831248425, -10.], [13.090169943749475, 34.270509831248425, 10.], [26.18033988749895, -13.090169943749475, -24.270509831248425], [26.18033988749895, -13.090169943749475, 24.270509831248425], [26.18033988749895, 13.090169943749475, -24.270509831248425], [26.18033988749895, 13.090169943749475, 24.270509831248425], [31.18033988749895, -5., -21.18033988749895], [31.18033988749895, -5., 21.18033988749895], [31.18033988749895, 5., -21.18033988749895], [31.18033988749895, 5., 21.18033988749895], [18.090169943749473, -16.18033988749895, -29.270509831248425], [18.090169943749473, -16.18033988749895, 29.270509831248425], [18.090169943749473, 16.18033988749895, -29.270509831248425], [18.090169943749473, 16.18033988749895, 29.270509831248425], [29.270509831248425, -18.090169943749473, -16.18033988749895], [29.270509831248425, -18.090169943749473, 16.18033988749895], [29.270509831248425, 18.090169943749473, -16.18033988749895], [29.270509831248425, 18.090169943749473, 16.18033988749895], [34.270509831248425, -10., -13.090169943749475], [34.270509831248425, -10., 13.090169943749475], [34.270509831248425, 10., -13.090169943749475], [34.270509831248425, 10., 13.090169943749475]],faces = [[41, 53, 65, 67, 55, 43, 3, 7, 5, 1], [100, 104, 106, 102, 110, 30, 18, 16, 28, 108], [11, 1, 5, 17, 29, 23], [18, 30, 26, 14, 2, 6], [33, 37, 73, 69, 68, 72, 36, 32, 56, 57], [91, 90, 82, 114, 118, 86, 87, 119, 115, 83], [81, 113, 117, 85, 84, 116, 112, 80, 88, 89], [59, 58, 34, 38, 74, 70, 71, 75, 39, 35], [0, 10, 22, 28, 16, 4], [15, 27, 31, 19, 7, 3], [64, 52, 40, 0, 4, 6, 2, 42, 54, 66], [19, 31, 111, 103, 107, 105, 101, 109, 29, 17], [96, 110, 102, 114, 82, 78], [53, 41, 47, 61, 73, 37], [43, 49, 15, 3], [94, 108, 28, 22], [23, 29, 109, 95], [2, 14, 48, 42], [36, 72, 60, 46, 40, 52], [79, 83, 115, 103, 111, 97], [69, 45, 9, 8, 44, 68], [24, 98, 90, 91, 99, 25], [77, 95, 109, 101, 113, 81], [42, 48, 62, 74, 38, 54], [40, 46, 10, 0], [97, 111, 31, 27], [44, 8, 20, 92, 76, 94, 22, 10, 46, 60], [63, 51, 13, 25, 99, 79, 97, 27, 15, 49], [26, 30, 110, 96], [1, 11, 47, 41], [55, 39, 75, 63, 49, 43], [80, 112, 100, 108, 94, 76], [48, 14, 26, 96, 78, 98, 24, 12, 50, 62], [61, 47, 11, 23, 95, 77, 93, 21, 9, 45], [71, 70, 50, 12, 13, 51], [93, 89, 88, 92, 20, 21], [102, 106, 118, 114], [65, 53, 37, 33], [74, 62, 50, 70], [77, 81, 89, 93], [101, 105, 117, 113], [66, 54, 38, 34], [73, 61, 45, 69], [78, 82, 90, 98], [32, 36, 52, 64], [115, 119, 107, 103], [92, 88, 80, 76], [71, 51, 63, 75], [56, 32, 64, 66, 34, 58], [107, 119, 87, 85, 117, 105], [35, 39, 55, 67], [112, 116, 104, 100], [99, 91, 83, 79], [68, 44, 60, 72], [57, 59, 35, 67, 65, 33], [116, 84, 86, 118, 106, 104], [4, 16, 18, 6], [7, 19, 17, 5], [12, 24, 25, 13], [9, 21, 20, 8], [56, 58, 59, 57], [85, 87, 86, 84]] ); translate([6,0,0]) polyhedron(points = [[0.5, 0.326352, 1.08481], [0.5, 0.828269, 0.157883], [1.36603, 0.992404, 0.186824], [0.788675, 0.335865, 0.0710586], [0.5, -0.484808, -0.0736482], [0.211325, 0.335865, 0.0710586], [-0.366025, 0.992404, 0.186824]], faces = [[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 6], [0, 6, 1], [6, 5, 4, 3, 2, 1]]); openscad-2019.05/testdata/scad/3D/features/polyhedron-tests.scad0000644000076500000240000000167513402025764025101 0ustar kintelstaff00000000000000module polyhedrons() { polyhedron(points = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], triangles = [[0,4,2],[0,2,5],[0,3,4],[0,5,3],[1,2,4],[1,5,2],[1,4,3], [1,3,5]]); // One face flipped translate([2,0,0]) polyhedron(points = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], triangles = [[0,4,2],[0,2,5],[0,3,4],[0,5,3],[1,2,4],[1,5,2],[1,3,4], [1,3,5]]); // All faces flipped translate([4,0,0]) polyhedron(points = [[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], triangles = [[0,2,4],[0,5,2],[0,4,3],[0,3,5],[1,4,2],[1,2,5],[1,3,4], [1,5,3]]); } polyhedrons(); translate([0,2,0]) difference() { polyhedrons(); translate([3,0,2]) cube([8,3,3], center=true); } // dont crash (issue #703) polyhedron(points = undef, triangles = [[1, 2, 3]]); polyhedron(points = [[0,0,0],[1,1,1]], triangles = undef); // More malformed polyhedrons polyhedron(); polyhedron(points=[0], faces = [[0]]); openscad-2019.05/testdata/scad/3D/features/primitive-inf-tests.scad0000644000076500000240000000053313402025764025470 0ustar kintelstaff00000000000000cube(1/0); cube([0,0,1/0]); cylinder(h=10, r=1/0); cylinder(h=10, r1=1, r2=1/0); cylinder(h=1/0); sphere(1/0); polygon([[0,0,0],[1,0,0],[1,1/0,0]]); polyhedron(points = [[1/0,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]], triangles = [[0,4,2],[0,2,5],[0,3,4],[0,5,3],[1,2,4],[1,5,2],[1,4,3], [1,3,5]]); cylinder($fn=1/0); sphere($fn=1/0); openscad-2019.05/testdata/scad/3D/features/projection-extrude-tests.scad0000644000076500000240000000033213402025764026535 0ustar kintelstaff00000000000000// Linear extrude translate([22,0,0]) linear_extrude(height=20) projection(cut=true) translate([0,0,9]) sphere(r=10); translate([44,0,0]) linear_extrude(height=20) projection(cut=true) translate([0,0,7]) sphere(r=10); openscad-2019.05/testdata/scad/3D/features/render-tests.scad0000644000076500000240000000177213402025764024173 0ustar kintelstaff00000000000000module edgeprofile() { difference() { cube([20, 20, 150], center = true); translate([-10, -10, 0]) cylinder(h = 80, r = 10, center = true); } } module rendered_edgeprofile() { render(convexity = 2) edgeprofile(); } module mycube() { difference() { cube(100, center = true); translate([ -50, -50, 0 ]) rotate(180, [0, 0, 1]) edgeprofile(); translate([ 50, -50, 0 ]) rotate(270, [0, 0, 1]) edgeprofile(); } } module rendered_mycube() { difference() { cube(100, center = true); translate([ -50, -50, 0 ]) rotate(180, [0, 0, 1]) rendered_edgeprofile(); translate([ 50, -50, 0 ]) rotate(270, [0, 0, 1]) rendered_edgeprofile(); } } // Empty render(); // No children render() { } mycube(); translate([110,0,0]) rendered_mycube(); // This may trigger a convexity issue translate([-110,0,0]) { difference() { render(convexity=2) difference() { cube(100, center = true); cylinder(r=30,h=110,center=true); } translate([-55, -55, 45]) cube(10); } } openscad-2019.05/testdata/scad/3D/features/resize-tests.scad0000644000076500000240000000737113402025764024216 0ustar kintelstaff00000000000000// bottom row (red) = reference // middle row (gold) = should match reference // top row (blue) = should be 'spherical' versions of gold row, // and should be inscribed in gold row in 'top' view // back row (green) = should be all cubes auto-scaled up // back top (purple) = uses 'auto' feature // lime green = 'auto' feature where we 'shrink' // pink = recursive resize, negative, <1, wrong syntax, etc $fn=8; color("red") { translate([0, 0,-10]) cube(); translate([0,10,-10]) cube([5,1,1]); translate([0,20,-10]) cube([1,6,1]); translate([0,30,-10]) cube([1,1,7]); translate([0,40,-10]) cube([5,6,1]); translate([0,60,-10]) cube([1,6,7]); translate([0,50,-10]) cube([5,1,7]); translate([0,70,-10]) cube([8,9,1]); translate([0,80,-10]) cube([9,1,1]); translate([0,90,-10]) cube([5,6,7]); } translate([0, 0,0]) cube(); translate([0,10,0]) resize([5,0,0]) cube(); translate([0,20,0]) resize([0,6,0]) cube(); translate([0,30,0]) resize([0,0,7]) cube(); translate([0,40,0]) resize([5,6,0]) cube(); translate([0,60,0]) resize([0,6,7]) cube(); translate([0,50,0]) resize([5,0,7]) cube(); translate([0,70,0]) resize([8,9]) cube(); translate([0,80,0]) resize([9]) cube(); translate([0,90,0]) resize([5,6,7]) cube(); color("blue"){ translate([0, 0,10]) cube(); translate([2.5,10.5,10]) resize([5,0,0]) sphere(0.5); translate([0.5,23,10]) resize([0,6,0]) sphere(0.5); translate([0.5,30.5,10]) resize([0,0,7]) sphere(0.5); translate([2.5,43,10]) resize([5,6,0]) sphere(0.5); translate([2.5,50.5,10]) resize([5,0,7]) sphere(0.5); translate([0.5,63,10]) resize([0,6,7]) sphere(0.5); translate([4,74.5,10]) resize([8,9]) sphere(0.5); translate([4.5,80.5,10]) resize([9]) sphere(0.5); translate([2.5,93,10]) resize([5,6,7]) sphere(0.5); } color("green"){ translate([10, 0, 0]) cube(); translate([10,10,0]) resize([5,0,0],auto=true) cube(); translate([10,20,0]) resize([0,6,0],auto=true) cube(); translate([10,30,0]) resize([0,0,7],auto=true) cube(); translate([10,40,0]) resize([5,6,0],true) cube(); translate([10,50,0]) resize([5,0,7],true) cube(); translate([10,60,0]) resize([0,6,7],auto=true) cube(); translate([10,70,0]) resize([8,9],auto=true) cube(); translate([10,80,0]) resize([9],true) cube(); translate([10,90,0]) resize([5,6,7],auto=true) cube(); } color("purple"){ translate([10, 0, 10]) cube(); translate([10,10,10]) resize([5,0,0],auto=[true,true,false]) cube(); translate([10,20,10]) resize([6,0,0],auto=[true,true,true]) cube(); translate([13.5,33.5,10]) resize([7,0,0],auto=[true,false,false]) sphere(); translate([10,40,10]) resize([6,0,0],auto=[true,false,true]) cube(); translate([10,50,10]) resize([7,0,7],auto=[false,true,true]) cube(); translate([13.5,63.5,10]) resize([7,0,0],auto=[false,true,false]) sphere(); translate([10,70,10]) resize([8,0,0],auto=[false,false,false]) cube(); translate([10,80,10]) resize([9,0,0],auto=[false,false,true]) cube(); translate([10,90,10]) resize([0,0,7],auto=[true,true,false]) cube(); } color("pink"){ translate([10 , 0,-10]) resize([4,4,4]) resize([5000,100,1000]) cube(); translate([20,0,-10]) resize([-5,0,0]) cube(); translate([30,0,-10]) resize([-5,0,0],auto=3) cube(); translate([40,0,-10]) resize(-5,0,0,auto=3) cube(); translate([50,0,-10]) resize(5,0,0) cube(); translate([60,0,-10]) resize([0.5,0,7]) cube([0.5,1,1000]); translate([70,0,-10]) resize([0,0,0.5]) cube([6,6,10000000000]); } color("lime"){ translate([20,0,0]) resize([5,0,0],auto=[true,true,false]) cube(9); translate([30,0,0]) resize([6,0,0],auto=[true,true,true]) cube(9); translate([40,0,0]) resize([6,0,0],auto=[true,false,true]) cube(9); translate([50,0,0]) resize([5,0,20],auto=[false,true,true]) cube(9); translate([60,0,0]) resize([0,0,7],auto=[false,false,true]) cube(9); translate([70,0,0]) resize([6,0,0],auto=[true,true,false]) cube(9); } openscad-2019.05/testdata/scad/3D/features/root-modifier.scad0000644000076500000240000000010613402025764024321 0ustar kintelstaff00000000000000difference() { sphere(r=10); !cylinder(h=30, r=6, center=true); } openscad-2019.05/testdata/scad/3D/features/rotate-parameters.scad0000644000076500000240000000163213402127613025202 0ustar kintelstaff00000000000000s=[1,2,3]; //Fine translate([0,0,0]) rotate(0) cube(s); translate([4,0,0]) rotate(45) cube(s); translate([8,0,0]) rotate(30,[0,1,0]) cube(s); translate([12,0,0]) rotate([45]) cube(s); translate([16,0,0]) rotate([15,30]) cube(s); translate([20,0,0]) rotate([15,30,45]) cube(s); //Edges cases translate([-12,0,0]) { rotate(undef) rotate() //same as undef rotate([]) cube(s); } //when deg_a is an array, the 'v' argument is ignored translate([24,0,0]) rotate([45,30,15],v=[0,0,0]) cube(s); //Problems with the parameters //We mainly care that this calls create a warning color("red") translate([-6,0,0]) { rotate([45,45,45,45]) cube(s); rotate() cube(s); rotate("45") cube(s); rotate(45,[0,1,0,0]) cube(s); rotate(v=[1,0,0]) cube(s); rotate("a","v") sphere(); rotate(v="v",a="a") sphere(); rotate(["a"],["v"]) sphere(); } openscad-2019.05/testdata/scad/3D/features/rotate_extrude-angle.scad0000644000076500000240000000231413402025764025667 0ustar kintelstaff00000000000000$fa=15; $fs=4; module face(x) { translate([x,0]) difference() { square(10,center=true); square(5,center=true); } } module face2() { translate([5,0]) square(5); } // test negative partial angles and geometries on -X side rotate_extrude(angle=45) face(10); rotate_extrude(angle=45) face(-10); rotate_extrude(angle=-45) face(21); rotate_extrude(angle=-45) face(-21); // test small angles, angle < $fa, render a single segment rotate([0,0,90]) { rotate_extrude(angle=5) face(10); rotate_extrude(angle=5) face(-10); rotate_extrude(angle=-5) face(21); rotate_extrude(angle=-5) face(-21); } // show nothing rotate_extrude(angle=0) face(5); // 0 angle // various angles treated as full circle translate([-40,40]) rotate_extrude() face2(); // unspecified translate([0,40]) rotate_extrude(angle=0/0) face2(); // NaN translate([40,40]) rotate_extrude(angle=1/0) face2(); // Infinity translate([-40,0]) rotate_extrude(angle=-1/0) face2(); // -Infinity translate([40,0]) rotate_extrude(angle=360) face2(); // 360 translate([-40,-40]) rotate_extrude(angle=-360) face2(); // -360 translate([0,-40]) rotate_extrude(angle=1000) face2(); // > 360 translate([40,-40]) rotate_extrude(angle=-1000) face2(); // < -360 openscad-2019.05/testdata/scad/3D/features/rotate_extrude-tests.scad0000644000076500000240000000163213402025764025745 0ustar kintelstaff00000000000000// Empty rotate_extrude(); // No children rotate_extrude() { } // 3D child rotate_extrude() { cube(); } // Normal rotate_extrude() translate([20,0,0]) circle(r=10); // Sweep of polygon with hole translate([50,-20,0]) { difference() { rotate_extrude(convexity=4) translate([20,0,0]) difference() { circle(r=10); circle(r=8); } translate([-50,0,0]) cube([100,100,100], center=true); } } // Alternative, difference between two solid sweeps translate([50,50,0]) { difference() { difference() { rotate_extrude(convexity=2) translate([20,0,0]) circle(r=10); rotate_extrude(convexity=2) translate([20,0,0]) circle(r=8); } translate([-50,0,0]) cube([100,100,100], center=true); } } // Minimal $fn translate([0,-60,0]) rotate_extrude($fn=1) translate([20,0,0]) circle(r=10,$fn=1); // Object in negative X translate([0,60,0]) rotate_extrude() translate([-20,0]) square(10); openscad-2019.05/testdata/scad/3D/features/scale-mirror2D-3D-tests.scad0000644000076500000240000000047613402025764025745 0ustar kintelstaff00000000000000module obj2D() polygon([[-0.5,-0.5], [1,-0.5], [1,1], [-0.5, 0.5]]) square([2,3], center=true); linear_extrude(1) scale([1, -1]) obj2D(); translate([3,0,0]) linear_extrude(1) scale([-1, -0.5]) obj2D(); translate([0,3,0]) linear_extrude(1) mirror() obj2D(); translate([2,3,0]) linear_extrude(1) mirror([0,1]) obj2D(); openscad-2019.05/testdata/scad/3D/features/scale3D-tests.scad0000644000076500000240000000055413402025764024167 0ustar kintelstaff00000000000000module obj3D() cylinder(r=1, center=true, $fn=8); // 3 variants of 3D scale of 3D object translate([0,0,0]) scale([1,2,3]) obj3D(); translate([5,0,0]) scale([2,1]) obj3D(); translate([10,0,0]) scale(2) obj3D(); // Scale by zero; 3D object linear_extrude() scale([0,0,0]) obj3D(); linear_extrude() scale([0,1,0]) obj3D(); linear_extrude() scale([1,1,0]) obj3D(); openscad-2019.05/testdata/scad/3D/features/sphere-tests.scad0000644000076500000240000000076513402025764024203 0ustar kintelstaff00000000000000sphere(); translate([2,0,0]) sphere(r=0); translate([0,11,0]) sphere(5); translate([0,-11,0]) sphere(r=5); translate([11,-11,0]) sphere(5, $fn=5); translate([11,0,0]) sphere(5, $fn=10); translate([11,11,0]) sphere(5, $fn=15); translate([22,-11, 0]) sphere(5, $fa=20, $fs=0.3); translate([22, 0, 0]) sphere(5, $fa=30, $fs=0.3); translate([22, 11, 0]) sphere(5, $fa=40, $fs=0.3); translate([11, 22, 0]) sphere(5, $fn=0.1); translate([33, 0, 0]) sphere(d=10); translate([33, 11, 0]) sphere(r=1, d=10); openscad-2019.05/testdata/scad/3D/features/surface-png-image-tests.scad0000644000076500000240000000006413402025764026177 0ustar kintelstaff00000000000000surface("../../../image/black-white-gradient.png"); openscad-2019.05/testdata/scad/3D/features/surface-png-image2-tests.scad0000644000076500000240000000010713402025764026257 0ustar kintelstaff00000000000000scale([1, 1, .2]) surface("../../../image/smiley.png", invert=false); openscad-2019.05/testdata/scad/3D/features/surface-png-image3-tests.scad0000644000076500000240000000010613402025764026257 0ustar kintelstaff00000000000000scale([1, 1, .2]) surface("../../../image/smiley.png", invert=true); openscad-2019.05/testdata/scad/3D/features/surface-simple.dat0000644000076500000240000000002513402025764024317 0ustar kintelstaff000000000000000 1 2 3 # Comment openscad-2019.05/testdata/scad/3D/features/surface-simple.scad0000644000076500000240000000022213402025764024460 0ustar kintelstaff00000000000000surface("surface-simple.dat", center=true); // Surface without a trailing newline translate([2,0,0]) surface("surface-simple2.dat", center=true); openscad-2019.05/testdata/scad/3D/features/surface-simple2.dat0000644000076500000240000000005413402025764024403 0ustar kintelstaff00000000000000# Surface without a trailing newline 0 1 2 3openscad-2019.05/testdata/scad/3D/features/surface-tests.scad0000644000076500000240000000014213402025764024332 0ustar kintelstaff00000000000000surface(); surface("notfound.dat"); surface("notfound.png"); surface("surface.dat", center=true); openscad-2019.05/testdata/scad/3D/features/surface.dat0000644000076500000240000011523013402025764023035 0ustar kintelstaff00000000000000# Created by Octave 3.1.54, Sat Jul 25 03:55:47 2009 CEST # name: d # type: matrix # rows: 46 # columns: 46 4.546487134128409 3.049135365122645 1.430224191212503 -0.2457055078678564 -1.91183970371809 -3.501754883740146 -4.952066146974032 -6.204954160076457 -7.210470231681788 -7.928527609104572 -8.330499610668049 -8.400360881165891 -8.135326272203333 -7.545961877274642 -6.655763794958727 -5.500221413615028 -4.125402561462865 -2.586116927645778 -0.9437309728873401 0.7362785576448079 2.386934985545012 3.942431847980459 5.340756393700049 6.526161835734216 7.451389799872247 8.079554366909637 8.385612597846531 8.357362916838071 7.995931549519037 7.315727623941807 6.343868724111537 5.119099797486346 3.690248516188934 2.114278671803671 0.4540192087657636 -1.224340567385163 -2.853889748744539 -4.369663351791345 -5.71123226627233 -6.825112373132667 -7.666896787563758 -8.203026221366581 -8.412126885869672 -8.285862597434599 -7.829267114791266 -7.060543458962299 5.035828673073257 3.377315902755755 1.584160205132016 -0.2721509607637287 -2.117612326675841 -3.878651171635513 -5.48506043417364 -6.872797646310392 -7.986538104655897 -8.781880491747168 -9.227117016458916 -9.304497503575988 -9.01093703726527 -8.358138946934957 -7.372128232423011 -6.09221402938029 -4.569422478079272 -2.864462472223704 -1.045305386934624 0.815524725479631 2.643842440626112 4.366758500792109 5.915585679634834 7.228577125140624 8.25338801176127 8.949162363424968 9.288161852373825 9.256871638758197 8.856539164652959 8.103124422478512 7.026663680467649 5.670072031436031 4.087432503458046 2.34183994020634 0.5028856086418853 -1.356117185191807 -3.161055866327164 -4.839973225360668 -6.325936125317769 -7.559703914604285 -8.492090164840738 -9.085923578545179 -9.317529891462899 -9.17767569077386 -8.67193652212408 -7.820474610215396 5.324407614299007 3.570853513082628 1.674940750779526 -0.2877466136759709 -2.238962428681152 -4.100917877109334 -5.799382670971877 -7.266644378753076 -8.444207906375773 -9.285127512010241 -9.755878384655105 -9.837693172558298 -9.52731017830761 -8.837103392413644 -7.794589181356518 -6.441329296887258 -4.831273940141129 -3.028610937368119 -1.105206773856724 0.8622584960466719 2.795348240726728 4.616996272280487 6.254579232232685 7.64281185566189 8.726349688693348 9.461995497225455 9.820421404336635 9.787338100188716 9.364064511717672 8.567475221178798 7.429327729803009 5.99499638643935 4.321663455453438 2.476039440296261 0.5317035462487614 -1.4338296903001 -3.342200661807952 -5.117328639853587 -6.688444873692612 -7.992913917025852 -8.978730705585699 -9.60659383493706 -9.851472383449366 -9.703603816152382 -9.168883186197988 -8.268628117693945 5.400719226082497 3.622032462322777 1.698946694274643 -0.2918707171379004 -2.271052164109463 -4.159693928017514 -5.882501821688773 -7.370792931037254 -8.565233786107424 -9.418205799283712 -9.895703668109622 -9.97869105938673 -9.663859527706666 -8.963760412729174 -7.906304456877885 -6.53364909211736 -4.900517756176106 -3.07201824177415 -1.121047054386814 0.8746167413903643 2.835412327701047 4.683168972167305 6.344222448307544 7.752351795785409 8.851419341126077 9.59760872960501 9.961171745040346 9.927614277296112 9.498274156714555 8.690267819042166 7.535807927150502 6.080919153820417 4.383603323277566 2.511527061495859 0.5393241413542663 -1.454379930367366 -3.39010246382654 -5.190672310139893 -6.784306431561657 -8.107471664674037 -9.107417587122166 -9.744279510489891 -9.992667759626542 -9.842679878873495 -9.300295411722241 -8.387137515284946 5.261721205277139 3.528812407274513 1.655220994405354 -0.2843588561588514 -2.212602216474262 -4.052636108688901 -5.731104188082895 -7.181091229043116 -8.344790823945194 -9.175809942206806 -9.641018474015334 -9.721870023257994 -9.41514129380829 -8.733060592170913 -7.702820323490013 -6.365492916166737 -4.774393393750382 -2.992953873194801 -1.092194726527053 0.852106777267553 2.762437472830941 4.562638503728103 6.180941535720031 7.552829933771732 8.623610836697077 9.350595588940964 9.704801602564489 9.672107801566185 9.253817584620604 8.466606862686255 7.341859243059576 5.924414863988718 4.270782759862838 2.446888024335571 0.5254435848797225 -1.416948632172156 -3.302851578699326 -5.057080255534608 -6.609699101121306 -7.898810101657983 -8.873020469578222 -9.493491511811653 -9.735487005914017 -9.589359355196404 -9.06093420796045 -8.171278207284479 4.91295496433882 3.294909737359715 1.545506856841021 -0.2655105049310103 -2.06594280073829 -3.784012476539642 -5.351225516043248 -6.705102080990831 -7.7916673851425 -8.567603498676819 -9.001976297355174 -9.077468708436898 -8.791071087722237 -8.154201204569132 -7.19224905145976 -5.943564625123038 -4.457929033185433 -2.794569878503285 -1.019800041540425 0.7956260049135155 2.579332953294609 4.260210036383667 5.771245989192293 7.052200576631698 8.052006181586624 8.730803709656549 9.061531645466804 9.031004909888981 8.640440507537887 7.905409008638012 6.855213799524476 5.531722849102 3.987699565046725 2.284699283246702 0.4906152508091408 -1.32302806345222 -3.083926423880241 -4.721878369680736 -6.171583925630922 -7.375247906025503 -8.284884026347463 -8.864227965002353 -9.090183107381513 -8.953741335000977 -8.460342150758638 -7.629655823119084 4.368324712698232 2.929649413905326 1.374178238023352 -0.2360770877384193 -1.836920764996389 -3.364532208092634 -4.75801036944758 -5.961801672142627 -6.927914755722455 -7.61783374029087 -8.004053733098379 -8.071177361819418 -7.816528619197737 -7.250259547011087 -6.394945506202153 -5.284685168478457 -3.96374110987594 -2.484775201531057 -0.9067491470627086 0.7074261344866228 2.29339856846624 3.787940438758798 5.131469077295334 6.270422237007184 7.159393449591173 7.762942238112459 8.057007016981043 8.029864351438505 7.682596333906389 7.029047444376102 6.095272614680437 4.918498500582482 3.545639372485864 2.031426791520294 0.4362276349147517 -1.176362540898928 -2.742054854433646 -4.198430093976552 -5.487427174584921 -6.55765785032041 -7.366455401449627 -7.881575621917326 -8.082482294089306 -7.961165902943748 -7.522462950159604 -6.783863138057164 3.649543139808145 2.44759321336187 1.148065469325888 -0.1972320220420281 -1.534666495092764 -2.810918657904327 -3.975108364192017 -4.980823044179203 -5.787968027290999 -6.36436499014402 -6.687034804755113 -6.743113643859221 -6.530365821108268 -6.05727292083076 -5.342695664029783 -4.415121990955059 -3.311531336824084 -2.075920378435365 -0.7575490255040018 0.5910234164900096 1.916033619950813 3.164657609377909 4.287116686573691 5.238661950254811 5.981358293533024 6.485596756915665 6.731274944084161 6.708598440998452 6.418471288276723 5.872459939948812 5.092332145434113 4.109189138064303 2.962225727056051 1.697167724153914 0.3644489998122177 -0.9827991560666609 -2.290866210995255 -3.50760365933783 -4.584504018666033 -5.478634670009056 -6.15434944589027 -6.584709730536586 -6.752558417479561 -6.651203909247942 -6.284686890242273 -5.667619237398981 2.785265798733263 1.867959195228706 0.8761829532964909 -0.1505239380284582 -1.171229914949966 -2.145242651192145 -3.033731332635951 -3.801274719340386 -4.417273278600766 -4.857169091755243 -5.103424900904859 -5.146223264043962 -4.983857945492241 -4.622801938126964 -4.077449405583663 -3.369541832375409 -2.527301259514483 -1.584305160797028 -0.5781478148826403 0.4510584599601819 1.462282457401677 2.415209867765704 3.271850482337386 3.99805274309953 4.564865257579304 4.949690999504721 5.137188180933072 5.119881880922376 4.898462047040874 4.481755989334729 3.886376463332679 3.136059371907682 2.260717489732352 1.295247935347975 0.2781409331724952 -0.750054670284097 -1.748347960970855 -2.676940135684732 -3.498811154761955 -4.181195614235898 -4.696888999096009 -5.025332241452506 -5.153431345695215 -5.076079404778086 -4.796360196487312 -4.325425242952448 1.809948699677379 1.213855538667884 0.5693697878743604 -0.09781493961144824 -0.7611000941278394 -1.394042589681589 -1.971409006340514 -2.470181567057512 -2.870475783804629 -3.156333189361605 -3.316357551044089 -3.344169202537879 -3.238659381062657 -3.004034430245145 -2.649648106472589 -2.189628674143088 -1.642315656348354 -1.029528695961759 -0.37569767533284 0.2931112260290228 0.950234707775073 1.569475330361154 2.126145924291543 2.598053789661878 2.966385449071229 3.216456681596708 3.338297936342937 3.327051786975494 3.183166581980383 2.912378570424738 2.5254832158083 2.037904815000729 1.469081580199606 0.8416906987509336 0.180744265251656 -0.4874078717316904 -1.136128594973583 -1.739555456394979 -2.273631731254591 -2.717065483848913 -3.052178409798129 -3.26561061425464 -3.348853228751029 -3.298587632934588 -3.116817757488257 -2.810790193738072 0.7624746575887673 0.5113592923230357 0.2398576457599462 -0.0412063682250215 -0.3206276143430717 -0.5872664492762099 -0.8304928241031526 -1.04061007080476 -1.209241477818354 -1.32966424309348 -1.397077490994629 -1.408793668062789 -1.364345687290786 -1.265505549408286 -1.116213698804572 -0.9224219304455371 -0.6918561105903662 -0.4337081708841666 -0.1582696550500929 0.1234785724820486 0.4003040989885004 0.6611707643009137 0.895678637685649 1.094478630263245 1.249645213679287 1.354992385909446 1.406320287639134 1.401582637400947 1.340968310359362 1.226893808453956 1.063906922092792 0.8585054241002257 0.6188780240193119 0.3545779101032878 0.07614189384674533 -0.2053296594378249 -0.4786153671558212 -0.7328201905434427 -0.9578097854819362 -1.144614526816829 -1.285787099007545 -1.375699397096658 -1.410766901494015 -1.389591581461206 -1.31301763018535 -1.184097809460741 -0.3153968429699904 -0.2115232353191719 -0.09921686377634671 0.01704497102832257 0.132627276626609 0.2429221512353662 0.3435324862595468 0.4304472651360086 0.5002014699063924 0.5500142205486248 0.5778996398878249 0.5827460242524682 0.5643601635915864 0.5234750441497907 0.46172062661877 0.3815588647481526 0.286185555018652 0.1794029303213007 0.0654680769307238 -0.05107678209061699 -0.1655853709921119 -0.2734925936870061 -0.3704965297273865 -0.452729938296945 -0.5169144328985401 -0.5604911802782915 -0.5817229130325473 -0.5797631889770021 -0.5546901361254837 -0.5075033379725885 -0.4400839832541203 -0.3551198688886271 -0.2559982459960941 -0.1466707808848774 -0.03149601458619469 0.08493439842261759 0.1979787449923144 0.3031303037572243 0.3961970138943235 0.4734685993594334 0.5318644858846474 0.5690566137530826 0.5835622501931699 0.5748031012552267 0.5431283665663152 0.4898008178430777 -1.380694466691827 -0.9259729990693727 -0.4343359100507957 0.07461678107528391 0.5805947366067604 1.063426212162366 1.503862240474527 1.884344026970699 2.189702963502988 2.407765352887697 2.529837735795723 2.5510534715422 2.470566755693045 2.291586339618643 2.021247607702515 1.670328112082959 1.25281790565982 0.7853618028335425 0.2865958032807762 -0.2235958665434362 -0.7248734747661234 -1.197252665020412 -1.6219011696696 -1.981889592889172 -2.262866332254524 -2.453629731840534 -2.546574656894428 -2.537995686558978 -2.428234837308953 -2.22166792783356 -1.926530128954008 -1.55458765335044 -1.120668673792816 -0.6420721706855765 -0.1378782763090046 0.3718123898439437 0.8666800693356641 1.32699594943008 1.734408688598593 2.072676026595801 2.328312312120061 2.491126133174475 2.554626616502324 2.516282198220691 2.377621549283654 2.144172632195354 -2.390948159060002 -1.603507141423449 -0.7521393542177419 0.1292138555276426 1.00541571661104 1.84153482584592 2.604237752873515 3.263117938841503 3.791907909952001 4.169526478750082 4.380919184542068 4.417658467236295 4.278279647569251 3.968339319245766 3.500193825082827 2.89250664861418 2.169504359897848 1.360010778619294 0.4962978593593797 -0.3872008893947277 -1.255263160571735 -2.073282050748716 -2.808645728182195 -3.432037563627176 -3.918604891831163 -4.248949808870655 -4.409902505366961 -4.395046305226375 -4.20497347826705 -3.847261628290367 -3.336171597929878 -2.692078933858195 -1.940661578039921 -1.111876169216943 -0.2387637662554357 0.6438673946040369 1.500829594281713 2.29795845417703 3.003474962131552 3.58925240135922 4.031937673885623 4.3138823148693 4.423846081201991 4.357445064530748 4.117326463849724 3.713063050030014 -3.30588229339968 -2.217114514208372 -1.039957375845013 0.1786595813180147 1.390153944766803 2.546227257322191 3.600790524212898 4.511801635854819 5.2429414540886 5.765061741606376 6.057347210190657 6.108145360569123 5.915431030789019 5.486887133033441 4.839598360157432 3.99937007289772 2.999699521573657 1.880440416423686 0.6862140859437864 -0.535369434668916 -1.735609465377321 -2.86665622373352 -3.883418444706294 -4.745361027124189 -5.418121040243312 -5.874877665357591 -6.097421457202605 -6.076880297075037 -5.814073096207792 -5.31947714836337 -4.612810433194559 -3.722245522619361 -2.683286429282323 -1.537353173609781 -0.3301304983038976 0.8902534381823263 2.075145779445412 3.177308606983185 4.152802166937654 4.962736609421381 5.57482240410846 5.964657621913146 6.116700762897727 6.02489034683103 5.69288656527711 5.133925361308007 -4.089021333016357 -2.742332527821242 -1.286315578672616 0.2209827133941487 1.719471122029165 3.149409643133779 4.453791140303494 5.580614039459991 6.484955467509192 7.130762185529173 7.492287917633426 7.555119773743378 7.316752846033308 6.786690071700684 5.986063380848329 4.946791233116909 3.710306129423557 2.325902828898148 0.8487731223953848 -0.6621944900388012 -2.146762497830699 -3.545745859334898 -4.803371522675512 -5.869501921322429 -6.701633800650617 -7.266592688575257 -7.541855457065665 -7.516448248184021 -7.191383967171353 -6.579621901111978 -5.705551073052852 -4.604017928618686 -3.31893711818922 -1.901540758369277 -0.4083359691720135 1.101147886537466 2.566732450883808 3.929989492206033 5.136570254273005 6.138372169686898 6.895456557448895 7.377640852136887 7.565701887542177 7.452142263644087 7.041489244289306 6.35011426946898 -4.709143995738668 -3.158222397480602 -1.481392438582083 0.254495962038536 1.980238411761126 3.627035005010469 5.129233158380877 6.426944971957868 7.468434770900569 8.212181643536248 8.628534749081897 8.700895403097618 8.426378814655045 7.815929093848203 6.89388294466016 5.696999437374171 4.272994540441402 2.678638835395257 0.9774942529155544 -0.7626199407663925 -2.472330883996379 -4.083477796772693 -5.531829335951035 -6.759644296201945 -7.717973569654379 -8.368611592358691 -8.685619479556678 -8.656359127161986 -8.281997053088212 -7.577457891860837 -6.57082939653611 -5.302242668622715 -3.822272257705642 -2.189919913751454 -0.4702623735279068 1.268143043529455 2.955991599298102 4.525994098173628 5.915559494955271 7.069290202300532 7.941190617715322 8.496500823077938 8.713082352883248 8.582300785000461 8.109369967835956 7.313144160650595 -5.141527947914094 -3.448203906499507 -1.617410856769451 0.2778632597848961 2.162059845019839 3.960061927008222 5.600188836664843 7.017053889821449 8.154171147984922 8.966207334453294 9.420789129000436 9.499793789993564 9.200071650912507 8.533571687614522 7.52686515037404 6.220086251984656 4.665332143345871 2.924585964458808 1.067245772233472 -0.8326421410420161 -2.699335239708387 -4.458414360612515 -6.039750570299125 -7.380300984282985 -8.426622087910019 -9.137000360635794 -9.48311526245501 -9.451168284460866 -9.042433051851468 -8.273204548512339 -7.1741494874307 -5.789083725623066 -4.173225464184948 -2.390993872864271 -0.513440901049977 1.384581339232713 3.227404690819291 4.941561602047335 6.458714046201143 7.718377942983702 8.670334467929564 9.276632118461686 9.513099720536216 9.37031005707512 8.853955701361743 7.984622072107995 -5.368935405835869 -3.600716407202944 -1.68894820813253 0.2901530262118541 2.257686775031992 4.135213676674213 5.847882658448798 7.327415012691896 8.514826453374175 9.362778633449111 9.837466375364958 9.919965376815327 9.606986662953039 8.911007707438348 7.859774994939016 6.495197856345744 4.871677676002062 3.053939080184086 1.11444957050123 -0.8694695267085139 -2.818725617658153 -4.655608013234817 -6.306886008944467 -7.706728362007201 -8.799327775264402 -9.541125758006334 -9.902549165539984 -9.869189187144494 -9.442375779884992 -8.639124647421326 -7.491458877599298 -6.045132282992935 -4.357805340781697 -2.496746451483471 -0.5361501601036421 1.445820746239842 3.370151341981964 5.160124638846803 6.744380050075756 8.059758311830187 9.05381944373006 9.686933365387848 9.933859822653556 9.784754636897503 9.245562161347152 8.337778298482458 -5.382300351782382 -3.609679707468892 -1.693152524221641 0.2908753071145678 2.263306857866227 4.145507506472566 5.862439852701268 7.345655222001519 8.536022498156086 9.386085494285842 9.861954881263999 9.944659248324436 9.630901433341164 8.933189970277535 7.879340413410047 6.511366418956426 4.883804793183958 3.061541282044484 1.117223781242091 -0.8716339061148982 -2.825742300234944 -4.667197265990103 -6.322585804942894 -7.725912799925885 -8.82123203210352 -9.564876580168589 -9.927199682695818 -9.893756660964112 -9.465880782714354 -8.660630108971949 -7.510107442983564 -6.060180492757929 -4.368653270291459 -2.502961628021068 -0.5374848041936438 1.449419842645591 3.378540694267371 5.172969790010383 6.761168904475835 8.079821550822126 9.076357209288462 9.711047147921935 9.958588281749131 9.809111926925592 9.26857723401821 8.358533615477349 -5.181089967534271 -3.474736468801078 -1.629856192221796 0.2800013074327352 2.178696038555143 3.990533033893282 5.64328007002529 7.071047338165455 8.216914262913187 9.035198745970977 9.493278367245317 9.572890937789841 9.270862555648927 8.599234139312866 7.58478139429494 6.267947350248265 4.701230024998847 2.947089494241964 1.075457805428347 -0.8390489922843309 -2.720105554446849 -4.492720091943021 -6.086224056971523 -7.437089475039214 -8.491461604830073 -9.207305956793 -9.556084075592718 -9.52389127826568 -9.112010990051067 -8.336863578276587 -7.229351724130582 -5.83362843028209 -4.2053367799973 -2.409391623001631 -0.5173916252718265 1.395235143833869 3.252238290674027 4.979584959896401 6.508411290756739 7.777767801934123 8.737049255013993 9.348012125649753 9.586299252193967 9.442410878869843 8.922083381055785 8.046060574101277 -4.773325876155424 -3.201266452287175 -1.501582637146705 0.2579645392187804 2.007227483459789 3.676468602107865 5.199140519357471 6.514539110936956 7.570223585980346 8.324107135872664 8.746134802496814 8.819481674569811 8.541223643761541 7.922453979666336 6.987841076151081 5.774645000337366 4.331232051306271 2.715146548382711 0.9908167207155332 -0.773013842903595 -2.506026783992408 -4.139132345428268 -5.607223762039341 -6.851772861875711 -7.823163399728696 -8.482669100254197 -8.803997552362862 -8.774338404679673 -8.394874073827912 -7.680732605209696 -6.660384565575114 -5.374508011369955 -3.874366782992262 -2.219766777248058 -0.4766716749741102 1.285426822756593 2.996279409462914 4.587679791420381 5.996183857354676 7.165638994948616 8.049422718295403 8.612301359286031 8.831834722770459 8.699270706324162 8.219894218952904 7.412816488448197 -4.175264345195113 -2.800172044501049 -1.3134457208466 0.2256435388803507 1.755737102771503 3.215834968923976 4.547727643019533 5.698316767172359 6.621731983896433 7.281159642506184 7.650310443197156 7.714467508468514 7.471073098587216 6.929830580599756 6.112317585708757 5.05112577720909 3.78856152372123 2.374959277779841 0.8666749000507603 -0.676161070992536 -2.192040633885014 -3.620530454088728 -4.904681150332459 -5.993297686728825 -6.842980357299839 -7.419854995298554 -7.700923429341156 -7.674980347925095 -7.343060019838303 -6.718395061126436 -5.825888892449073 -4.701122918285288 -3.388938008620714 -1.941646834964742 -0.4169483292196312 1.12437259065492 2.620868323502963 4.012878306921188 5.244907495612248 6.267838773715967 7.040891099220648 7.533245315416116 7.725272813416223 7.609318062853523 7.190003813716571 6.484046801895833 -3.410748200600429 -2.287443613754537 -1.072945868473995 0.1843268427061244 1.434251024344538 2.626996143683169 3.715011216738866 4.654920515979006 5.409252823698197 5.947935291220925 6.249492348477882 6.301901867214561 6.103074445306729 5.660936704629639 4.993115281657762 4.126234109092623 3.094853003682659 1.940089875389279 0.7079814860717643 -0.5523518909306521 -1.790664741088856 -2.957589438789203 -4.00660437877821 -4.895888645756584 -5.589989282298683 -6.061234686386791 -6.290837790860787 -6.269645044499783 -5.998501335223617 -5.488216307077675 -4.759133413836612 -3.840318889699831 -2.768402970257767 -1.586119560592286 -0.3406025693357043 0.9184931715267248 2.140971488113207 3.278096027694826 4.284533223282468 5.120159599884286 5.751661370836673 6.153862553350843 6.310728655499175 6.216005920808633 5.873470645796447 5.296778630944794 -2.510256288486159 -1.683522024573375 -0.7896710502018139 0.1356616169901937 1.05558588361779 1.933427272159427 2.734189016642643 3.425947273264703 3.981123823303499 4.377585529669897 4.59952671523833 4.638099285316098 4.491765473256983 4.166359146364736 3.674853228013503 3.036842508131333 2.277762460760673 1.427875211974583 0.5210630844078612 -0.4065221840245499 -1.317900695834841 -2.176738665778339 -2.948796934213331 -3.60329597434807 -4.114142974843539 -4.460972077860914 -4.629956301545421 -4.614358778159311 -4.414801331739156 -4.03923968793379 -3.502646304328436 -2.826413465809092 -2.037500441671404 -1.16735870462873 -0.2506780598459248 0.6759963281225712 1.575720875718599 2.412626404474485 3.153348131966858 3.768355820403181 4.233131054014477 4.529144710919736 4.644595660743251 4.574881238442103 4.322780738036853 3.898344610929531 -1.509688379721747 -1.012483724933438 -0.4749145391091887 0.08158799070985261 0.6348378648050846 1.162778756577268 1.644363328685269 2.060392323967141 2.394279979236409 2.632715247320912 2.766192466508119 2.789390321280759 2.701383986374111 2.505681996640854 2.210086372838312 1.826381579681559 1.369864716423261 0.8587356697792575 0.3133715418782656 -0.2444857204963248 -0.7925961087140347 -1.309108191258972 -1.773430261348203 -2.167051263300292 -2.474278769910309 -2.682864590002175 -2.784493065159446 -2.775112588784801 -2.655097130869491 -2.429231328989921 -2.106519739906278 -1.699827856300014 -1.225369200180058 -0.7020589409250443 -0.150759807170451 0.4065496443459431 0.9476512444838604 1.450972979990634 1.896449001595198 2.26631958609706 2.545839160486248 2.723864161406895 2.793297293862669 2.75137047797148 2.59975520357519 2.344495893214314 -0.4489339593550001 -0.3010808942575579 -0.141224684021771 0.02426170870570256 0.1887808636693288 0.3457739213309235 0.4889820639017611 0.612696034656969 0.7119837479845479 0.7828869160746246 0.8225788533633334 0.829477167566125 0.8033068446646229 0.7451112128476809 0.657210348308904 0.5431085811302354 0.4073547887001401 0.2553610463269413 0.09318686487506814 -0.07270238281121608 -0.2356932159204538 -0.3892877042838959 -0.5273625203459285 -0.6444130569104365 -0.7357728784589211 -0.7977997572088324 -0.8280208772415469 -0.825231417869619 -0.7895425860355593 -0.7223771828419703 -0.6264128809614945 -0.5054754742772395 -0.3643863555536506 -0.2087703027217771 -0.04483123673317359 0.1208951091908324 0.2818017486179796 0.4314738416045685 0.5639444341208273 0.6739323416782621 0.757052693489469 0.8099917434291753 0.8306389786351164 0.8181712589957502 0.7730856331489335 0.69717952272126 0.6297180412781989 0.4223250815566671 0.1980953535573332 -0.03403181106229467 -0.2648022347684586 -0.4850158290061779 -0.6858933726973768 -0.8594265120808325 -0.9986970285048157 -1.09815264597303 -1.153828382867369 -1.163504623252803 -1.126795605960306 -1.045164803667328 -0.9218665788603957 -0.761816442672515 -0.5713950889660844 -0.3581940162040492 -0.1307128783625411 0.1019793694509399 0.3306060216189227 0.5460524549925905 0.7397295001538707 0.903915864495442 1.03206595579104 1.119070834301707 1.161461890080995 1.157549125507695 1.107488530157902 1.013275861992868 0.8786670827870677 0.7090286197848682 0.5111234231810415 0.2928413486382201 0.06288461363950699 -0.1695791324611385 -0.3952822936884582 -0.6052267972518273 -0.7910428183123687 -0.9453224584867627 -1.061915075378811 -1.13617248928231 -1.165134291437744 -1.14764586618743 -1.08440442185818 -0.9779311952654839 1.683265170795829 1.12889428909309 0.5295179545161437 -0.09096858991682827 -0.7078285037378014 -1.296469528796759 -1.833424404988772 -2.297286435859161 -2.669562906038411 -2.93541232744681 -3.084236122589167 -3.110101156393801 -3.011976271584753 -2.793773397668383 -2.464191594648746 -2.036370248956716 -1.527365247576704 -0.9574690136555669 -0.3494015116281765 0.2725955260675967 0.8837250403639841 1.459623226056689 1.977330839833961 2.416208512855347 2.758759577256071 2.991327603080867 3.104640837050949 3.094181838108516 2.960367573536122 2.708532795786939 2.348717362739231 1.895265980245349 1.366256323976739 0.7827783395423258 0.1680934529102542 -0.4532927892397816 -1.056607678330947 -1.617798953605395 -2.114493689859416 -2.526890235369443 -2.838547641258541 -3.037041110245732 -3.114457334104856 -3.067709972291675 -2.898662694601847 -2.614054882537336 2.669705829804243 1.790458043755305 0.8398303456189292 -0.1442787381593636 -1.122635883945128 -2.056237079720395 -2.907862591958544 -3.643560798946349 -4.234001734801155 -4.655646382654547 -4.891685100973239 -4.932707770921118 -4.777078948101876 -4.431003062566172 -3.908277067764701 -3.229740399552937 -2.422444173646198 -1.518572743000832 -0.5541606092254262 0.4323441592848651 1.401612730505363 2.315003425205354 3.136102238758166 3.832174552594589 4.375470160145175 4.744329580005311 4.924047551108387 4.907459285079375 4.695226103737553 4.295809074282484 3.725131693245221 3.005945066931102 2.166920896606633 1.241508428248773 0.2666009366630344 -0.7189350929595494 -1.675809449156724 -2.565874570938535 -3.353646370662466 -4.007718872631197 -4.502016270236361 -4.816832486081088 -4.939616791099661 -4.865474162519273 -4.597360432970828 -4.145964450769626 3.54971374212228 2.380641886330078 1.116661351079797 -0.1918369484093717 -1.492687314141955 -2.73402894710691 -3.866373473677969 -4.844577890900531 -5.62964427556248 -6.19027450832758 -6.50411803098649 -6.558662892681309 -6.351734561902528 -5.89158261819819 -5.196551867470355 -4.294350992454181 -3.22094789497706 -2.019135769216056 -0.736827072087785 0.5748565952123353 1.863622544126233 3.078091743206837 4.169847137965979 5.095363886047989 5.817744555343825 6.308190108172687 6.547148028033732 6.525091816737419 6.242900785825731 5.711825001195826 4.953036778474351 3.996786609606501 2.881197171203133 1.65074349372734 0.3544798823789649 -0.9559157232538983 -2.228201985567143 -3.41165686621379 -4.459099753710306 -5.328772405529383 -5.986003717453734 -6.404591951090286 -6.567849314495497 -6.46926725177881 -6.112775918687044 -5.51258749969712 4.288205769311382 2.875917049446775 1.34897459230178 -0.231747224902796 -1.803230011571154 -3.302823708099532 -4.670744246048903 -5.852456950294104 -6.800850664426962 -7.47811592389443 -7.857252300035656 -7.923144821967909 -7.673166562777629 -7.117283366806719 -6.277656542887673 -5.187759362894486 -3.891042588024042 -2.439202224064016 -0.890118564778289 0.6944513127535784 2.25133560791381 3.718466256886861 5.037353390496664 6.155417140715221 7.02808383407551 7.620563003372249 7.909234373801725 7.882589528780094 7.541690714195699 6.900128490017602 5.983479917557116 4.828288882746387 3.480609206727212 1.994168625333327 0.4282268338104019 -1.154787010228619 -2.691763140310978 -4.121427168338916 -5.386782901080704 -6.437384598532856 -7.23134808638331 -7.737020545868154 -7.93424241176944 -7.815151070663276 -7.384494318505103 -6.659441080987506 4.855740564693871 3.256538475283084 1.527508473464183 -0.2624184708600041 -2.041883618860373 -3.739945310513147 -5.288907184715668 -6.627017019575332 -7.700928598626055 -8.46782845613504 -8.897142714875848 -8.971755970131976 -8.688693626872098 -8.059240487467115 -7.108490862230847 -5.874348138457536 -4.406013691981442 -2.762025383586276 -1.007923839222646 0.7863604479231795 2.549295025514206 4.210597255203638 5.704036259636104 6.970073338524186 7.958235588743649 8.629128099704545 8.956004504118614 8.925833271260007 8.539817232971965 7.813345630556984 6.775380594289642 5.467302514677827 3.941260336876582 2.258092546810274 0.4849017327257366 -1.307620583246664 -3.048012193000405 -4.66688917517789 -6.099712013161457 -7.289358581934639 -8.188401426947269 -8.760998547062469 -8.984322302035931 -8.849469478495738 -8.361816232963735 -7.540803761460487 5.229692306937458 3.507331988711279 1.645145412121301 -0.2826279204933955 -2.199133769801996 -4.027967095476507 -5.696218084039577 -7.137378833047617 -8.293994811283408 -9.119955389607474 -9.582332126231357 -9.662691519780038 -9.357829894821458 -8.679901122296229 -7.655932083036974 -6.326745191317807 -4.74533093401977 -2.974735307140072 -1.085546370884799 0.8469198735379744 2.745622095213007 4.534865028263448 6.143317203231159 7.506854707664531 8.571117604153223 9.293677089490007 9.645726997162825 9.613232208310484 9.197488187621289 8.415069337243999 7.297168227677697 5.888352048419835 4.244785854760888 2.431993444268991 0.5222451297532001 -1.408323450046034 -3.282746618113592 -5.026297037822943 -6.569464856031814 -7.85072884157588 -8.819009042613789 -9.43570318311505 -9.676225613788761 -9.530987464336391 -9.005778921451114 -8.121538392346379 5.395152720151853 3.618299243775675 1.697195594753702 -0.2915698868206932 -2.26871139710953 -4.155406543328425 -5.876438743808457 -7.363195875747651 -8.556405624029034 -9.408498481379727 -9.885504194511661 -9.968406050920841 -9.653899015204164 -8.95452149039132 -7.898155451383183 -6.526914878599211 -4.895466806476436 -3.068851921318294 -1.119891594379443 0.8737152764050196 2.832489876287216 4.678342043240527 6.337683476291875 7.744361468860196 8.842296208410893 9.587716501611499 9.950904793681877 9.917381913524109 9.488484312582518 8.681310784741999 7.528040791374196 6.07465156776076 4.379085155812245 2.508938437703814 0.5387682614972115 -1.452880905113711 -3.386608294868589 -5.185322298967513 -6.777313866237354 -8.099115316710975 -9.098030597743653 -9.734236109340088 -9.982368345415507 -9.832535056744142 -9.290709623719028 -8.378492916525859 5.345525419802729 3.585016326194277 1.681583944833682 -0.2888878818624344 -2.247842660347122 -4.117183045441479 -5.822384335036501 -7.295465534789873 -8.477699545843972 -9.321954428933225 -9.794572406069209 -9.876711689935791 -9.565097646490701 -8.872153344291123 -7.825504285953553 -6.466877066541816 -4.850435865897734 -3.040623093715808 -1.109590274028466 0.86567840836979 2.806435224432541 4.635308324315644 6.279386308869567 7.673124977038238 8.760960366318479 9.49952391260276 9.859371417972785 9.826156897953913 9.401204510644819 8.601455766712713 7.458794124825067 6.018773898766608 4.338804150703687 2.485859973040466 0.5338124028368944 -1.439516583325327 -3.35545658596765 -5.137625123282998 -6.714972759646662 -8.02461562240514 -9.014342383437267 -9.644695760044115 -9.890545552295466 -9.742090504798149 -9.205249051818882 -8.301423367986789 5.082788889746999 3.408810120860735 1.598932849578142 -0.2746888286927486 -2.137359530194382 -3.914820452055196 -5.536209836422897 -6.936888005132817 -8.061014339694061 -8.863773470533452 -9.313161924357349 -9.391264001639069 -9.094966019022742 -8.436080442052933 -7.440874959449751 -6.149025273252079 -4.612033353781187 -2.891174218607906 -1.055053090966565 0.8231296739990461 2.668496856398217 4.407479490061577 5.970749825062005 7.295985206327845 8.330352681230107 9.032615282679755 9.374776016874794 9.343194015093491 8.939128352084104 8.178687850727879 7.092188874105124 5.722946707767992 4.125548715994828 2.363678115836767 0.5075751282179191 -1.368763278017028 -3.190533411739751 -4.885107046646795 -6.384926879450768 -7.630199826372963 -8.571280784705591 -9.170651826392648 -9.40441791942675 -9.263259547370208 -8.752804249065901 -7.893402266422392 4.617417606324923 3.096705413130865 1.452537347334307 -0.2495387987538081 -1.941666620400823 -3.5563863211758 -5.029324122151516 -6.301758641327084 -7.322961929822302 -8.052221835118193 -8.460465066103314 -8.531416253444307 -8.262246797201303 -7.663687634181376 -6.759601429351459 -5.586031246689127 -4.189763625962253 -2.626463351031946 -0.958454270580386 0.7477653570618542 2.424173939628084 4.00393835714458 5.42407838751986 6.627977529253878 7.567640122689131 8.205604785502139 8.516437879800469 8.48774747100499 8.120677355176557 7.429861459476516 6.442840433670812 5.198963691333348 3.747820672901074 2.147263871172282 0.4611024349828368 -1.24344170019649 -2.89841373869619 -4.437835167907522 -5.800334113373086 -6.931592041751236 -7.786509269328339 -8.331002944088237 -8.54336582146739 -8.41513166369451 -7.951412761973714 -7.170696125567001 3.967964454042534 2.661144832798496 1.248233764798917 -0.2144404443737696 -1.668565589735227 -3.056170290497144 -4.321935126079993 -5.415398046841001 -6.292966136751218 -6.919653525392167 -7.270476164205151 -7.331447861665553 -7.100137868602942 -6.585767784499835 -5.808843921420753 -4.800339782061639 -3.600461243939888 -2.257043677934734 -0.8236449030035197 0.6425899950486453 2.083206857808219 3.440772837086368 4.661166061336456 5.695733303881148 6.503229633525916 7.051462719809843 7.318576239632341 7.293921219883536 6.978480578397405 6.384829938119489 5.536636276704745 4.467714398803897 3.220678846510804 1.845244992047145 0.3962470427578658 -1.068548025696312 -2.490743456364277 -3.813640805422481 -4.984500330207981 -5.956643556328476 -6.691314201133876 -7.15922326440309 -7.341716688355996 -7.231519036070902 -6.833023540195608 -6.162116958625413 3.160321080613384 2.119492805710582 0.9941670410904191 -0.1707930261825025 -1.328944114470087 -2.434114394639413 -3.442244215186624 -4.313142621504115 -5.012089642410857 -5.511220465838168 -5.790636320954395 -5.839197779363776 -5.654968848964071 -5.245294155842311 -4.626506137210002 -3.823273918671509 -2.867619834034114 -1.797642795911458 -0.6559994123056947 0.5117965977428373 1.659188892506926 2.740434562000088 3.71242775344765 4.536418165608486 5.179555901001853 5.616201087656102 5.8289460598929 5.809309347024744 5.558073802826458 5.085255395625619 4.409703903252567 3.558351431882195 2.565138717949963 1.469662018096385 0.3155945313679901 -0.8510547134099066 -1.983775092422612 -3.037408618664727 -3.969950248377854 -4.74422248959062 -5.329357551403209 -5.702027945401628 -5.847376479006589 -5.759608564857086 -5.442223232722587 -4.907873634227967 2.22668567867006 1.493343288905311 0.7004660147291653 -0.1203366290059004 -0.9363418310866921 -1.715018039159572 -2.425321890063545 -3.038935810756489 -3.531396950591077 -3.883072437973098 -4.079942080996805 -4.114157308252927 -3.984354066603155 -3.695707201674252 -3.259724153093075 -2.693786189182488 -2.020455470643085 -1.266575568405079 -0.4622012951650975 0.3605994851525819 1.16902430193471 1.930843808868214 2.615686666272127 3.196250350568365 3.649389619738685 3.95703924108492 4.10693419504852 4.093098642835834 3.916084164252973 3.582947767959545 3.106970550803082 2.507128222398642 1.807334603467782 1.035488257270811 0.2223602619286077 -0.5996325353583019 -1.397719875710371 -2.140084535377989 -2.797130778047369 -3.342664243452604 -3.75493623385838 -4.017510766006725 -4.11991982190273 -4.058080675658289 -3.834458658889454 -3.457968875724721 1.204279345431145 0.8076588876886379 0.3788396188089894 -0.06508279017502479 -0.5064105536953812 -0.9275493265108165 -1.311709634729428 -1.643576219150494 -1.909918606318715 -2.100118565749699 -2.206593425271613 -2.225098368236168 -2.15489566096309 -1.998784063853906 -1.762987253646724 -1.456905705064642 -1.092741923553445 -0.6850139698967194 -0.249976670946797 0.1950264090267705 0.6322544015138652 1.044276406206742 1.414666405988919 1.728658120402314 1.973733690651419 2.140122727131086 2.221191824027839 2.213709012276733 2.117972607968906 1.937799319430418 1.680372087105609 1.355953722388659 0.9774777617194828 0.5600328473000009 0.1202611905445145 -0.3243049003718474 -0.755941978313681 -1.157442035093003 -1.512798530452724 -1.807844522315121 -2.030817458056102 -2.172828110359468 -2.228214962658407 -2.194769915935083 -2.073826318660405 -1.870205810398125 0.133862195013134 0.08977567533482943 0.04211008278445129 -0.007234305880492386 -0.05629028559915311 -0.1031021492652438 -0.1458036555977758 -0.1826924302916663 -0.2122978343091302 -0.2334395936172461 -0.2452748529890788 -0.2473317779817941 -0.2395283654869346 -0.2221757129355783 -0.1959656158254859 -0.1619429880176926 -0.1214642043182845 -0.07614302609516824 -0.02778626570485129 0.0216782454144859 0.07027851329880706 0.1160769986345782 0.1572478603369399 0.1921497460719863 0.2193912277947304 0.237886273594353 0.2468975443593155 0.2460657891609279 0.2354241674541947 0.2153969271149841 0.1867824910160091 0.1507216264264608 0.1086519662208858 0.06225069499319062 0.01336768499954474 -0.03604825241086339 -0.08402705975448951 -0.1286559733884243 -0.1681557793607642 -0.2009517450562382 -0.2257363988162215 -0.2415216547078018 -0.2476782043918371 -0.2439606056605409 -0.2305170674437688 -0.2078835411866856 -0.9418916186934663 -0.6316866098910525 -0.2962982493546524 0.05090258736032291 0.396074098549645 0.7254553853138876 1.025915055172518 1.285474729243588 1.493786582409802 1.64254587845149 1.725822053672573 1.740295149760155 1.685388170045718 1.563290082541485 1.378868552693453 1.139475884920871 0.8546559094405842 0.5357634998735836 0.1955118902661149 -0.1525341614328149 -0.4944991574648012 -0.8167500325709951 -1.106439661282354 -1.352019032270644 -1.54369767098508 -1.67383395497704 -1.737239761272558 -1.731387300463223 -1.656509891692994 -1.515592660960215 -1.314253533564164 -1.060519265151764 -0.7645054402998314 -0.4380131960795705 -0.09405874796218745 0.2536455256169031 0.5912377525143929 0.90525919597775 1.183190812008062 1.413952344138135 1.588344058292062 1.699413507151409 1.742732702290064 1.716574644099477 1.621982171813179 1.462726388797417 -1.980095185873649 -1.327965543382954 -0.6228941053151842 0.1070101550754859 0.8326482582733674 1.525091302987413 2.156733770155261 2.702394067873998 3.140318442004222 3.453048229699637 3.628115881200739 3.658542001700102 3.54311359778859 3.286432435674765 2.898731583287855 2.395467450151741 1.796703589112747 1.126310825801873 0.4110156041456203 -0.3206655126131722 -1.039562707302622 -1.717015817381742 -2.326016925178589 -2.842287078339433 -3.24524421504243 -3.518823705852006 -3.652118799799595 -3.639815442126497 -3.482404128877647 -3.186160352372156 -2.762894417128001 -2.229480600290467 -1.607184427452228 -0.9208148832552137 -0.1977353554622115 0.5332272569630683 1.242931781349151 1.903084537910887 2.487367319476658 2.972486615356378 3.339102250105779 3.572598415289946 3.663666355642739 3.608675479763801 3.409818100340678 3.075022033560224 -2.939358606544735 -1.971302681297775 -0.9246571389528138 0.1588515655978607 1.23602735951325 2.263926643114734 3.201570315688885 4.011577482915883 4.661655715163819 5.125888444753457 5.385768177727149 5.430934329229159 5.259586267329132 4.878555098534946 4.303031333133039 3.555959287479722 2.667122366513022 1.671955693384779 0.6101334229225803 -0.476012941724182 -1.543182172530108 -2.548829599910208 -3.45286323443881 -4.219242107950363 -4.817413113206347 -5.223529059864967 -5.421399386705929 -5.403135628214004 -5.169465902805643 -4.729705885045418 -4.101387419098447 -3.309559579428456 -2.385790043245842 -1.366906586834864 -0.2935288783299538 0.7915509002700281 1.845074042359564 2.82503990484805 3.692380341259188 4.412517225444294 4.956740972354244 5.303355098597096 5.438541192763665 5.356909811883925 5.06171534151083 4.564726253638137 openscad-2019.05/testdata/scad/3D/features/tessellation-text-test.scad0000644000076500000240000000045013402025764026211 0ustar kintelstaff00000000000000module letter(c) { text(c, size = 50, font = "Liberation Sans", halign = "center", valign = "center"); } linear_extrude(height = 10) { letter("C", $fn=8); translate([50,0]) letter("C", $fn=16); translate([0,50]) letter("C", $fn=24); translate([50,50]) letter("C", $fn=32); } openscad-2019.05/testdata/scad/3D/features/testcolornames.scad0000644000076500000240000002154313402025764024614 0ustar kintelstaff00000000000000/* color samples for SVG named colors, for OpenSCAD Please see http://en.wikipedia.org/wiki/Web_colors and http://www.w3.org/TR/SVG/types.html#ColorKeywords for more information. */ $fn=5; radius=0.8; //translate([0,0]) color("Red colors") sphere(radius); translate([1,0]) color("IndianRed") sphere(radius); translate([2,0]) color("LightCoral") sphere(radius); translate([3,0]) color("Salmon") sphere(radius); translate([4,0]) color("DarkSalmon") sphere(radius); translate([5,0]) color("LightSalmon") sphere(radius); translate([6,0]) color("Red") sphere(radius); translate([7,0]) color("Crimson") sphere(radius); translate([8,0]) color("FireBrick") sphere(radius); translate([9,0]) color("DarkRed") sphere(radius); //translate([10,0]) color("Pink colors") sphere(radius); translate([0,1]) color("Pink") sphere(radius); translate([1,1]) color("LightPink") sphere(radius); translate([2,1]) color("HotPink") sphere(radius); translate([3,1]) color("DeepPink") sphere(radius); translate([4,1]) color("MediumVioletRed") sphere(radius); translate([5,1]) color("PaleVioletRed") sphere(radius); //translate([6,1]) color("Orange colors") sphere(radius); translate([7,1]) color("LightSalmon") sphere(radius); translate([8,1]) color("Coral") sphere(radius); translate([9,1]) color("Tomato") sphere(radius); translate([10,1]) color("OrangeRed") sphere(radius); translate([0,2]) color("DarkOrange") sphere(radius); translate([1,2]) color("Orange") sphere(radius); //translate([2,2]) color("Yellow colors") sphere(radius); translate([3,2]) color("Gold") sphere(radius); translate([4,2]) color("Yellow") sphere(radius); translate([5,2]) color("LightYellow") sphere(radius); translate([6,2]) color("LemonChiffon") sphere(radius); translate([7,2]) color("LightGoldenrodYellow") sphere(radius); translate([8,2]) color("PapayaWhip") sphere(radius); translate([9,2]) color("Moccasin") sphere(radius); translate([10,2]) color("PeachPuff") sphere(radius); translate([0,3]) color("PaleGoldenrod") sphere(radius); translate([1,3]) color("Khaki") sphere(radius); translate([2,3]) color("DarkKhaki") sphere(radius); //translate([3,3]) color("Purple colors") sphere(radius); translate([4,3]) color("Lavender") sphere(radius); translate([5,3]) color("Thistle") sphere(radius); translate([6,3]) color("Plum") sphere(radius); translate([7,3]) color("Violet") sphere(radius); translate([8,3]) color("Orchid") sphere(radius); translate([9,3]) color("Fuchsia") sphere(radius); translate([10,3]) color("Magenta") sphere(radius); translate([0,4]) color("MediumOrchid") sphere(radius); translate([1,4]) color("MediumPurple") sphere(radius); translate([2,4]) color("BlueViolet") sphere(radius); translate([3,4]) color("DarkViolet") sphere(radius); translate([4,4]) color("DarkOrchid") sphere(radius); translate([5,4]) color("DarkMagenta") sphere(radius); translate([6,4]) color("Purple") sphere(radius); translate([7,4]) color("Indigo") sphere(radius); translate([8,4]) color("DarkSlateBlue") sphere(radius); translate([9,4]) color("SlateBlue") sphere(radius); translate([10,4]) color("MediumSlateBlue") sphere(radius); //translate([0,5]) color("Green colors") sphere(radius); translate([1,5]) color("GreenYellow") sphere(radius); translate([2,5]) color("Chartreuse") sphere(radius); translate([3,5]) color("LawnGreen") sphere(radius); translate([4,5]) color("Lime") sphere(radius); translate([5,5]) color("LimeGreen") sphere(radius); translate([6,5]) color("PaleGreen") sphere(radius); translate([7,5]) color("LightGreen") sphere(radius); translate([8,5]) color("MediumSpringGreen") sphere(radius); translate([9,5]) color("SpringGreen") sphere(radius); translate([10,5]) color("MediumSeaGreen") sphere(radius); translate([0,6]) color("SeaGreen") sphere(radius); translate([1,6]) color("ForestGreen") sphere(radius); translate([2,6]) color("Green") sphere(radius); translate([3,6]) color("DarkGreen") sphere(radius); translate([4,6]) color("YellowGreen") sphere(radius); translate([5,6]) color("OliveDrab") sphere(radius); translate([6,6]) color("Olive") sphere(radius); translate([7,6]) color("DarkOliveGreen") sphere(radius); translate([8,6]) color("MediumAquamarine") sphere(radius); translate([9,6]) color("DarkSeaGreen") sphere(radius); translate([10,6]) color("LightSeaGreen") sphere(radius); translate([0,7]) color("DarkCyan") sphere(radius); translate([1,7]) color("Teal") sphere(radius); //translate([2,7]) color("Blue/Cyan colors") sphere(radius); translate([3,7]) color("Aqua") sphere(radius); translate([4,7]) color("Cyan") sphere(radius); translate([5,7]) color("LightCyan") sphere(radius); translate([6,7]) color("PaleTurquoise") sphere(radius); translate([7,7]) color("Aquamarine") sphere(radius); translate([8,7]) color("Turquoise") sphere(radius); translate([9,7]) color("MediumTurquoise") sphere(radius); translate([10,7]) color("DarkTurquoise") sphere(radius); translate([0,8]) color("CadetBlue") sphere(radius); translate([1,8]) color("SteelBlue") sphere(radius); translate([2,8]) color("LightSteelBlue") sphere(radius); translate([3,8]) color("PowderBlue") sphere(radius); translate([4,8]) color("LightBlue") sphere(radius); translate([5,8]) color("SkyBlue") sphere(radius); translate([6,8]) color("LightSkyBlue") sphere(radius); translate([7,8]) color("DeepSkyBlue") sphere(radius); translate([8,8]) color("DodgerBlue") sphere(radius); translate([9,8]) color("CornflowerBlue") sphere(radius); translate([10,8]) color("RoyalBlue") sphere(radius); translate([0,9]) color("Blue") sphere(radius); translate([1,9]) color("MediumBlue") sphere(radius); translate([2,9]) color("DarkBlue") sphere(radius); translate([3,9]) color("Navy") sphere(radius); translate([4,9]) color("MidnightBlue") sphere(radius); //translate([5,9]) color("Brown colors") sphere(radius); translate([6,9]) color("Cornsilk") sphere(radius); translate([7,9]) color("BlanchedAlmond") sphere(radius); translate([8,9]) color("Bisque") sphere(radius); translate([9,9]) color("NavajoWhite") sphere(radius); translate([10,9]) color("Wheat") sphere(radius); translate([0,10]) color("BurlyWood") sphere(radius); translate([1,10]) color("Tan") sphere(radius); translate([2,10]) color("RosyBrown") sphere(radius); translate([3,10]) color("SandyBrown") sphere(radius); translate([4,10]) color("Goldenrod") sphere(radius); translate([5,10]) color("DarkGoldenrod") sphere(radius); translate([6,10]) color("Peru") sphere(radius); translate([7,10]) color("Chocolate") sphere(radius); translate([8,10]) color("SaddleBrown") sphere(radius); translate([9,10]) color("Sienna") sphere(radius); translate([10,10]) color("Brown") sphere(radius); translate([0,11]) color("Maroon") sphere(radius); //translate([1,11]) color("White colors") sphere(radius); translate([2,11]) color("White") sphere(radius); translate([3,11]) color("Snow") sphere(radius); translate([4,11]) color("Honeydew") sphere(radius); translate([5,11]) color("MintCream") sphere(radius); translate([6,11]) color("Azure") sphere(radius); translate([7,11]) color("AliceBlue") sphere(radius); translate([8,11]) color("GhostWhite") sphere(radius); translate([9,11]) color("WhiteSmoke") sphere(radius); translate([10,11]) color("Seashell") sphere(radius); translate([0,12]) color("Beige") sphere(radius); translate([1,12]) color("OldLace") sphere(radius); translate([2,12]) color("FloralWhite") sphere(radius); translate([3,12]) color("Ivory") sphere(radius); translate([4,12]) color("AntiqueWhite") sphere(radius); translate([5,12]) color("Linen") sphere(radius); translate([6,12]) color("LavenderBlush") sphere(radius); translate([7,12]) color("MistyRose") sphere(radius); //translate([8,12]) color("Gray colors") sphere(radius); translate([9,12]) color("Gainsboro") sphere(radius); translate([10,12]) color("LightGrey") sphere(radius); translate([0,13]) color("Silver") sphere(radius); translate([1,13]) color("DarkGray") sphere(radius); translate([2,13]) color("Gray") sphere(radius); translate([3,13]) color("DimGray") sphere(radius); translate([4,13]) color("LightSlateGray") sphere(radius); translate([5,13]) color("SlateGray") sphere(radius); translate([6,13]) color("DarkSlateGray") sphere(radius); translate([7,13]) color("Black") sphere(radius); // hex colors translate([0,14]) color("#ff0000") sphere(radius); translate([1,14]) color("#ff7f00") sphere(radius); translate([2,14]) color("#ffff00") sphere(radius); translate([3,14]) color("#00FF00") sphere(radius); translate([4,14]) color("#0000ff") sphere(radius); translate([5,14]) color("#4b00ff") sphere(radius); translate([6,14]) color("#9400d3") sphere(radius); translate([7,14]) color("#000000Ff") sphere(radius); translate([8,14]) color("#00000080") sphere(radius); translate([0,15]) color("#f00") sphere(radius); translate([1,15]) color("#f70") sphere(radius); translate([2,15]) color("#ff0") sphere(radius); translate([3,15]) color("#0F0") sphere(radius); translate([4,15]) color("#00f") sphere(radius); translate([5,15]) color("#40f") sphere(radius); translate([6,15]) color("#90d") sphere(radius); translate([7,15]) color("#000F") sphere(radius); translate([8,15]) color("#0008") sphere(radius); openscad-2019.05/testdata/scad/3D/features/transform-tests.scad0000644000076500000240000000116113402025764024717 0ustar kintelstaff00000000000000module mycyl() { cylinder(r1=10, r2=0, h=20); } translate([25,0,0]) scale([1,2,0.5]) mycyl(); translate([20,-30,0]) scale(0.5) mycyl(); translate([0,-20,0]) rotate([90,0,0]) mycyl(); translate([0,-40,0]) rotate([90,0,45]) mycyl(); rotate(v=[-1,0,0], a=45) mycyl(); multmatrix([[1,0,0,-25], [0,1,0,0], [0,0,1,0], [0,0,0,1]]) mycyl(); multmatrix([[1,0.4,0.1,-25], [0.4,0.8,0,-25], [0.2,0.2,0.5,0], [0,0,0,1]]) mycyl(); translate([-25,-40,0]) multmatrix([[1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,2]]) mycyl(); openscad-2019.05/testdata/scad/3D/features/union-coincident-test.scad0000644000076500000240000000032413402025764025766 0ustar kintelstaff00000000000000// Causes a CGAL assertion in CGALEvaluator::process() e=0.000; for (m = [ [ [ 0, 1, 0], [ 0, 0, 1], [ 1, 0, 0] ], [ [-1, 0, e], [ 0,-1, 0], [ 0, 0,-1] ] ] ) multmatrix (m) cube([1,5,1], center=true); openscad-2019.05/testdata/scad/3D/features/union-tests.scad0000644000076500000240000000102213402025764024030 0ustar kintelstaff00000000000000translate([-12,0,0]) union() { cube([10,10,10]); translate([4,4,8]) cube([2,2,10]); } union() { cube([10,10,10]); translate([0,0,10]) cube([2,2,10]); } translate([12,0,0]) union() { cube([10,10,10]); translate([0,0,11]) cube([2,2,10]); } translate([24,0,0]) union() { cube([10,10,10]); translate([4,4,10]) cube([2,2,10]); } translate([-12,12,0]) union() { cube([10,10,10]); translate([-2,10,10]) cube([2,2,10]); } translate([0,12,0]) union() { cube([10,10,10]); translate([0,10,10]) cube([2,2,10]); } openscad-2019.05/testdata/scad/3D/issues/adns2610_dev_circuit_inv.scad0000644000076500000240000000020613432700636025733 0ustar kintelstaff00000000000000// Causes CGAL error in CGAL_Nef_polyhedron3(): CGAL ERROR: assertion violation! import("../../../stl/adns2610_dev_circuit_inv.stl"); openscad-2019.05/testdata/scad/3D/issues/fn_bug.scad0000644000076500000240000000230213432700636022500 0ustar kintelstaff00000000000000fn_setting = 41; // does not work //fn_setting = 40; // works // basic box sizes box_width = 720; box_depth = 450; box_height = 90; box_bevel = 35; union () { translate ([(box_width / 2) - box_bevel, -((box_depth / 2) - box_bevel), 0]) cylinder (h = box_height- box_bevel, r = box_bevel, center = false, $fn = fn_setting); translate ([0, -((box_depth / 2) - box_bevel), box_height- box_bevel]) rotate ([0, 90, 0]) cylinder (h = box_width - (2 * box_bevel), r = box_bevel, center = true, $fn = fn_setting); translate ([(box_width / 2) - box_bevel, 0, box_height- box_bevel]) rotate ([90, 90, 0]) cylinder (h = box_depth - (2 * box_bevel), r = box_bevel, center = true, $fn = fn_setting); } /* Reported by Ian Shumsky: 1) Export STL from fn_bug.scad - fn_setting = 41 -> triggers bug - fn_setting = 40 -> works 2) Open fn_bug_import.scad and render using CGAL (F6) -> CGAL error in CGA_Nef_polyhedron3(): CGAL ERROR: assertion violation! Expr: pe_prev->is_border() || !internal::Plane_constructor::get_plane(pe_prev->facet(),pe_prev->facet()->plane()).is_degenerate() File: ../libraries/install/include/CGAL/Nef_3/polyhedron_3_to_nef_3.h Line: 252 */ openscad-2019.05/testdata/scad/3D/issues/gridbug.scad0000644000076500000240000000041113432700636022662 0ustar kintelstaff00000000000000// This crashes OpenSCAD including 2011.06 in PolyReducer due to two vertices of // a triangle evaluating to the same index linear_extrude(height=2) polygon(points=[[0, 0], [1, 0], [1.0014, 1], [1, 1], [0, 1]], paths=[[0,1,2,3,4]]); openscad-2019.05/testdata/scad/3D/issues/horn-torus.scad0000644000076500000240000000043613432700636023366 0ustar kintelstaff00000000000000// This model causes a CGAL assertion in CGAL_Nef_polyhedron3(CGAL_Polyhedron) constructor. // One cause of this error could be that the grid handling in PolySet degenerated the original // mesh into a non-manifold one. rotate_extrude($fn = 24) translate ([ 1, 0, 0 ]) circle (r = 1); openscad-2019.05/testdata/scad/3D/issues/issue1004.scad0000644000076500000240000000005213402025764022674 0ustar kintelstaff00000000000000%square(20); translate([1,1,0]) cube(10); openscad-2019.05/testdata/scad/3D/issues/issue1005.scad0000644000076500000240000000001513402025764022674 0ustar kintelstaff00000000000000%sphere(10); openscad-2019.05/testdata/scad/3D/issues/issue1061.scad0000644000076500000240000000207313402025764022704 0ustar kintelstaff00000000000000polyhedron(points = [[-5, -5, 0], [-5, 5, 0], [5, 5, 0], [5, -5, 0], [-1.87866, -4.21311, 3], [-4.21311, 5.51058, 3], [5.51058, 7.84504, 3], [7.84504, -1.87866, 3], [1.05099, -3.48892, 6], [-3.48892, 5.42115, 6], [5.42115, 9.96105, 6], [9.96105, 1.05099, 6], [3.39596, -3.09852, 9], [-3.09852, 4.50554, 9], [4.50554, 11, 9], [11, 3.39596, 9], [4.91038, -3.17979, 12], [-3.17979, 2.69807, 12], [2.69807, 10.7882, 12], [10.7882, 4.91038, 12], [5.53441, -3.70439, 15], [-3.70439, 0.122447, 15], [0.122447, 9.36124, 15], [9.36124, 5.53441, 15], [5.39234, -4.48455, 18], [-4.48455, -2.9202, 18], [-2.9202, 6.95668, 18], [6.95668, 5.39234, 18]], faces = [[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7], [4, 5, 9, 8], [5, 6, 10, 9], [6, 7, 11, 10], [7, 4, 8, 11], [8, 9, 13, 12], [9, 10, 14, 13], [10, 11, 15, 14], [11, 8, 12, 15], [12, 13, 17, 16], [13, 14, 18, 17], [14, 15, 19, 18], [15, 12, 16, 19], [16, 17, 21, 20], [17, 18, 22, 21], [18, 19, 23, 22], [19, 16, 20, 23], [20, 21, 25, 24], [21, 22, 26, 25], [22, 23, 27, 26], [23, 20, 24, 27], [3, 2, 1, 0], [24, 25, 26, 27]]); openscad-2019.05/testdata/scad/3D/issues/issue1069.scad0000644000076500000240000000032413402025764022711 0ustar kintelstaff00000000000000$fn = 5; module object() { cylinder(r = 1, h = 5); rotate(45, [1, 0, 0]) cylinder(r = 1, h = 5); } minkowski() { difference() { cube(20, center = true); object(); } cube(.5, center = true); } openscad-2019.05/testdata/scad/3D/issues/issue1089.scad0000644000076500000240000000052213402025764022713 0ustar kintelstaff00000000000000hull() polyhedron(points = [ [-0.249434174697078959, -9.946811825017595865, 7.668480694904857842], [-0.503165223042536525, 8.8964795095546467252, 0.896037100784631946], [-0.503165223042536525, -0.66656805007570774091, 3.819754148011998751], [-0.503165223042536525, -10.229615609706060653, 6.743471195239365557]], faces = [[0,1,2,3]]); openscad-2019.05/testdata/scad/3D/issues/issue1089b.scad0000644000076500000240000003625713402025764023073 0ustar kintelstaff00000000000000hull() { polyhedron(points = [[21.015921990298082278, -9.6968661252791008565, 17.385898562432661407], [21.015921990298082278, 9.4292289939816065214, 11.538464467977924244], [21.245998787904895266, 9.1447008983105675384, 10.607815001220002316], [21.245998787904895266, -0.41834666131978626158, 13.531532048447369121], [21.245998787904895266, -9.9813942209501398395, 16.455249095674737703], [16.150059612458484537, -10.033205852946363024, 17.385898562432661407], [16.150059612458484537, 9.0928892663143443542, 11.538464467977924244], [16.380136410065297525, 8.8083611706433053712, 10.607815001220002316], [16.380136410065297525, -0.75468638898704798468, 13.531532048447369121], [16.380136410065297525, -10.317733948617402007, 16.455249095674737703], [15.17688713689056712, -10.100473798479814747, 17.165875026644524581], [15.17688713689056712, 9.0256213207808926313, 11.318440932189787418], [15.406963934497380109, 8.7410932251098536483, 10.38779146543186549], [15.406963934497380109, -0.82195433452049937451, 13.311508512659232295], [15.406963934497380109, -10.38500189415085373, 16.235225559886600877], [14.152135476691794835, -10.17119106380654614, 16.934569274178546294], [14.152135476691794835, 8.954904055454161238, 11.087135179723812684], [14.367990727181227939, 8.6694249043464353122, 10.153374950800477805], [14.367990727181227939, -0.89362265528391870983, 13.077091998027846387], [14.367990727181227939, -10.456670214914272066, 16.000809045255213192], [13.110820024653460081, -10.233961476664669377, 16.729256504918232906], [13.110820024653460081, 8.8921336425960380012, 10.881822410463495743], [13.309600712109528331, 8.6055965081559246954, 9.9446016739871083701], [13.309600712109528331, -0.95745105147442877147, 12.868318721214476952], [13.309600712109528331, -10.520498611104782682, 15.792035768441845534], [12.078282570414469177, -10.294222837947037519, 16.532150473574372285], [12.078282570414469177, 8.8318722813136698591, 10.684716379119635121], [12.262745467026753943, 8.5445178276236166681, 9.7448223118344454718], [12.262745467026753943, -1.0185297320067365767, 12.668539359061812277], [12.262745467026753943, -10.58157729163709071, 15.592256406289180859], [11.031163105767490151, -10.348029755406946251, 16.356155976708063093], [11.031163105767490151, 8.7780653638537611272, 10.508721882253327706], [11.198443837973723447, 8.4898133798050405829, 9.5658921254443249893], [11.198443837973723447, -1.0732341798253119958, 12.489609172671691795], [11.198443837973723447, -10.636281739455666795, 15.413326219899060376], [9.9920867282612331195, -10.397762464907449598, 16.193487613614035325], [9.9920867282612331195, 8.7283326543532577801, 10.346053519159298162], [10.144967804693861169, 8.4393978978853763095, 9.4009905143952519069], [10.144967804693861169, -1.1236496617449773794, 12.324707561622618712], [10.144967804693861169, -10.686697221375331068, 15.248424608849987294], [8.9400347163076823165, -10.442561786292975157, 16.046955635953878527], [8.9400347163076823165, 8.6835333329677322212, 10.199521541499144917], [9.0756439452541037838, 8.3938624405481636614, 9.2520507445299653426], [9.0756439452541037838, -1.1691851190821893614, 12.175767791757333924], [9.0756439452541037838, -10.732232678712543716, 15.09948483898470073], [7.8956741722639147696, -10.481705796269976005, 15.918921348422623296], [7.8956741722639147696, 8.6443893229907313724, 10.071487253967887909], [8.0168163367886453585, 8.3541708868691326728, 9.1222255222471790859], [8.0168163367886453585, -1.2088766727612223484, 12.045942569474547668], [8.0168163367886453585, -10.771924232391574705, 14.969659616701914473], [6.839564786514664263, -10.51746028460065574, 15.801973686643666639], [6.839564786514664263, 8.6086348346600516379, 9.9545395921889312518], [6.9433634354009168277, 8.3178424250433771192, 9.0034004777589125013], [6.9433634354009168277, -1.2452051345869770138, 11.927117524986281083], [6.9433634354009168277, -10.808252694217330259, 14.850834572213647888], [5.7911812064893624097, -10.545968319665455226, 15.708728105504132344], [5.7911812064893624097, 8.5801267995952521517, 9.861294011049396957], [5.8804599030361934808, 8.2889226275126546284, 8.9088080822795312486], [5.8804599030361934808, -1.2741249321176979503, 11.83252512950689983], [5.8804599030361934808, -10.837172491748052749, 14.756242176734266636], [4.7318927519149163174, -10.572647626142034127, 15.621464026055862817], [4.7318927519149163174, 8.5534474931186732505, 9.77402993160112743], [4.8037743563616075448, 8.2618321038161273151, 8.8201989719106297372], [4.8037743563616075448, -1.3012154558142254857, 11.743916019137996543], [4.8037743563616075448, -10.864263015444580063, 14.667633066365365124], [3.6807521204854736219, -10.590485240237288878, 15.563119819284901624], [3.6807521204854736219, 8.5356098790234185003, 9.7156857248301662366], [3.7380754567641063524, 8.2437189311402967462, 8.7609534536348423472], [3.7380754567641063524, -1.3193286284900567207, 11.684670500862209153], [3.7380754567641063524, -10.882376188120410632, 14.608387548089577734], [2.6191654551378640292, -10.608065925320802947, 15.505615989444741842], [2.6191654551378640292, 8.518029193939904431, 9.6581818949900064553], [2.659056271348898548, 8.2258902040489321195, 8.7026383149438082398], [2.659056271348898548, -1.3371573555814209033, 11.626355362171176822], [2.659056271348898548, -10.900204915211775258, 14.550072409398543627], [1.5571301313920737908, -10.615277603175528043, 15.482027654049947074], [1.5571301313920737908, 8.5108175160851793351, 9.634593559595211687], [1.5798452641030620303, 8.2185212496694965978, 8.6785355512163384617], [1.5798452641030620303, -1.3445263099608570911, 11.602252598443705267], [1.5798452641030620303, -10.90757386959121078, 14.525969645671073849], [0.5035077216434232783, -10.622159719563320834, 15.459517265642222839], [0.5035077216434232783, 8.5039353996973865435, 9.6120831711874892278], [0.5113668014119475691, 8.2115727243029539295, 8.6558079488265811108], [0.5113668014119475691, -1.3514748353273995374, 11.579524996053947916], [0.5113668014119475691, -10.914522394957753448, 14.503242043281314722], [-0.55969246949480999653, -10.620097256783905593, 15.466263277424799227], [-0.55969246949480999653, 8.5059978624768017852, 9.6188291829700638402], [-0.56928712712562057341, 8.2136396155613287107, 8.6625684455111535698], [-0.56928712712562057341, -1.3494079440690252003, 11.586285492738520375], [-0.56928712712562057341, -10.912455503699378667, 14.510002539965888957], [-1.6125195715995086498, -10.616272236324949318, 15.478774355608731383], [-1.6125195715995086498, 8.5098228829357580594, 9.6313402611539977727], [-1.6367003391161654147, 8.2175366669705987022, 8.6753151263175354302], [-1.6367003391161654147, -1.3455108926597549868, 11.599032173544902236], [-1.6367003391161654147, -10.908558452290108676, 14.522749220772269041], [-2.6750035922459902693, -10.605089410934800398, 15.515351729318147989], [-2.6750035922459902693, 8.5210057083259069799, 9.6679176348634126015], [-2.7166291222015424012, 8.2288874074141755699, 8.7124417254191364179], [-2.7166291222015424012, -1.334160152216178119, 11.636158772646505], [-2.7166291222015424012, -10.897207711846531808, 14.559875819873871805], [-3.7267390106727740218, -10.590568334550255258, 15.562848030033741509], [-3.7267390106727740218, 8.5355267847104521195, 9.7154139355790061217], [-3.7829348904509538798, 8.2436170965810333655, 8.7606203678000085233], [-3.7829348904509538798, -1.3194304630493196573, 11.684337415027377105], [-3.7829348904509538798, -10.882478022679674012, 14.60805446225474391], [-4.7876230981018181865, -10.570275178726245002, 15.629223951898024936], [-4.7876230981018181865, 8.5558199405344623756, 9.7817898574432895487], [-4.8612365692795815875, 8.2642414847358942609, 8.828079701800975343], [-4.8612365692795815875, -1.2988060748944600942, 11.751796749028343925], [-4.8612365692795815875, -10.861853634524813117, 14.67551379625571073], [-5.8369967953404051642, -10.545075590745145888, 15.711648090230719177], [-5.8369967953404051642, 8.5810195285155614897, 9.8642139957759837898], [-5.9251502312697619246, 8.2897860538008281139, 8.9116322224150632536], [-5.9251502312697619246, -1.2732615058295262411, 11.835349269642431835], [-5.9251502312697619246, -10.836309065459879264, 14.759066316869798641], [-6.895398463720493254, -10.515689075464781155, 15.807767050683622756], [-6.895398463720493254, 8.6104060437959262231, 9.9603329562288873689], [-7.0009241527878049993, 8.3196667739247160966, 9.0093676540744773718], [-7.0009241527878049993, -1.2433807857056371482, 11.933084701301844177], [-7.0009241527878049993, -10.806428345335991281, 14.856801748529212759], [-7.9411432512251920457, -10.47984140089607763, 15.925019510913235976], [-7.9411432512251920457, 8.6462537183646297478, 10.077585416458500589], [-8.0611639241462889061, 8.355995453894500713, 9.1281934120797192378], [-8.0611639241462889061, -1.2070521057358516437, 12.05191045930708782], [-8.0611639241462889061, -10.770099665366206665, 14.975627506534454625], [-8.9961818731247724656, -10.441385424593725872, 16.050803341698156146], [-8.9961818731247724656, 8.6847096946669815054, 10.203369247243418982], [-9.1335113425972984658, 8.3951080877002439706, 9.2561250727790511661], [-9.1335113425972984658, -1.1679394719301097183, 12.179842120006419748], [-9.1335113425972984658, -10.730987031560463407, 15.103559167233786553], [-10.037034938423907704, -10.394932932465536624, 16.202742597210743725], [-10.037034938423907704, 8.7311621867951707543, 10.355308502756006561], [-10.188799857367065727, 8.4421771354154273581, 9.4100809907477991345], [-10.188799857367065727, -1.120870424214927441, 12.33379803797516594], [-10.188799857367065727, -10.68391798384528002, 15.257515085202534522], [-11.087832325460665217, -10.347438306258311513, 16.358090519704578725], [-11.087832325460665217, 8.7786568130023958645, 10.510656425249845114], [-11.25682453492664159, 8.4904901774226715361, 9.5681058307041340072], [-11.25682453492664159, -1.0725573822076825969, 12.491822877931500813], [-11.25682453492664159, -10.635604941838035842, 15.415539925158867618], [-12.130826484007744881, -10.28998208592428476, 16.546021348432333298], [-12.130826484007744881, 8.8361130333364226175, 10.698587253977599687], [-12.316465776491348549, 8.5488233456115647613, 9.7589050266192529648], [-12.316465776491348549, -1.0142242140187893717, 12.68262207384661977], [-12.316465776491348549, -10.577271773649142617, 15.606339121073986576], [-13.167274479509028851, -10.232609601207819594, 16.733678290296118973], [-13.167274479509028851, 8.8934855180528877838, 10.886244195841383586], [-13.36775592988668393, 8.6070496903803430655, 9.9493548188709652891], [-13.36775592988668393, -0.9559978692500109565, 12.873071866098332094], [-13.36775592988668393, -10.519045428880364312, 15.796788913325700676], [-14.205661711313787521, -10.165804085335658158, 16.952189286815759317], [-14.205661711313787521, 8.96029103392504922, 11.104755192361025706], [-14.423211305781006075, 8.6749218454890240082, 10.171354635130359867], [-14.423211305781006075, -0.88812571414133034686, 13.095071682357726672], [-14.423211305781006075, -10.45117327377168337, 16.018788729585093478], [-15.232758954180525279, -10.098059861404790283, 17.173770659047207232], [-15.232758954180525279, 9.0280352578559170951, 11.326336564592470069], [-15.464523864863501501, 8.7436243006743357142, 10.396070240569519783], [-15.464523864863501501, -0.81942325895601786367, 13.319787287796886588], [-15.464523864863501501, -10.382470818586371664, 16.24350433502425517], [-16.263941232543412951, -10.022378056180794914, 17.421314689835732281], [-16.263941232543412951, 9.1037170630799124638, 11.573880595380996894], [-16.512649129623643063, 8.8205321051208152028, 10.647624334125161738], [-16.512649129623643063, -0.74251545450953948535, 13.571341381352528543], [-16.512649129623643063, -10.305563014139892175, 16.495058428579895349], [-17.249434174697078959, -9.946811825017595865, 17.668480694904857842], [-17.249434174697078959, 9.1792832942431115129, 11.821046600450122455], [-17.503165223042536525, 8.8964795095546467252, 10.896037100784631946], [-17.503165223042536525, -0.66656805007570774091, 13.819754148011998751], [-17.503165223042536525, -10.229615609706060653, 16.743471195239365557]], faces = [[0, 1, 6, 5], [1, 2, 7, 6], [2, 3, 8, 7], [3, 4, 9, 8], [4, 0, 5, 9], [5, 6, 11, 10], [6, 7, 12, 11], [7, 8, 13, 12], [8, 9, 14, 13], [9, 5, 10, 14], [10, 11, 16, 15], [11, 12, 17, 16], [12, 13, 18, 17], [13, 14, 19, 18], [14, 10, 15, 19], [15, 16, 21, 20], [16, 17, 22, 21], [17, 18, 23, 22], [18, 19, 24, 23], [19, 15, 20, 24], [20, 21, 26, 25], [21, 22, 27, 26], [22, 23, 28, 27], [23, 24, 29, 28], [24, 20, 25, 29], [25, 26, 31, 30], [26, 27, 32, 31], [27, 28, 33, 32], [28, 29, 34, 33], [29, 25, 30, 34], [30, 31, 36, 35], [31, 32, 37, 36], [32, 33, 38, 37], [33, 34, 39, 38], [34, 30, 35, 39], [35, 36, 41, 40], [36, 37, 42, 41], [37, 38, 43, 42], [38, 39, 44, 43], [39, 35, 40, 44], [40, 41, 46, 45], [41, 42, 47, 46], [42, 43, 48, 47], [43, 44, 49, 48], [44, 40, 45, 49], [45, 46, 51, 50], [46, 47, 52, 51], [47, 48, 53, 52], [48, 49, 54, 53], [49, 45, 50, 54], [50, 51, 56, 55], [51, 52, 57, 56], [52, 53, 58, 57], [53, 54, 59, 58], [54, 50, 55, 59], [55, 56, 61, 60], [56, 57, 62, 61], [57, 58, 63, 62], [58, 59, 64, 63], [59, 55, 60, 64], [60, 61, 66, 65], [61, 62, 67, 66], [62, 63, 68, 67], [63, 64, 69, 68], [64, 60, 65, 69], [65, 66, 71, 70], [66, 67, 72, 71], [67, 68, 73, 72], [68, 69, 74, 73], [69, 65, 70, 74], [70, 71, 76, 75], [71, 72, 77, 76], [72, 73, 78, 77], [73, 74, 79, 78], [74, 70, 75, 79], [75, 76, 81, 80], [76, 77, 82, 81], [77, 78, 83, 82], [78, 79, 84, 83], [79, 75, 80, 84], [80, 81, 86, 85], [81, 82, 87, 86], [82, 83, 88, 87], [83, 84, 89, 88], [84, 80, 85, 89], [85, 86, 91, 90], [86, 87, 92, 91], [87, 88, 93, 92], [88, 89, 94, 93], [89, 85, 90, 94], [90, 91, 96, 95], [91, 92, 97, 96], [92, 93, 98, 97], [93, 94, 99, 98], [94, 90, 95, 99], [95, 96, 101, 100], [96, 97, 102, 101], [97, 98, 103, 102], [98, 99, 104, 103], [99, 95, 100, 104], [100, 101, 106, 105], [101, 102, 107, 106], [102, 103, 108, 107], [103, 104, 109, 108], [104, 100, 105, 109], [105, 106, 111, 110], [106, 107, 112, 111], [107, 108, 113, 112], [108, 109, 114, 113], [109, 105, 110, 114], [110, 111, 116, 115], [111, 112, 117, 116], [112, 113, 118, 117], [113, 114, 119, 118], [114, 110, 115, 119], [115, 116, 121, 120], [116, 117, 122, 121], [117, 118, 123, 122], [118, 119, 124, 123], [119, 115, 120, 124], [120, 121, 126, 125], [121, 122, 127, 126], [122, 123, 128, 127], [123, 124, 129, 128], [124, 120, 125, 129], [125, 126, 131, 130], [126, 127, 132, 131], [127, 128, 133, 132], [128, 129, 134, 133], [129, 125, 130, 134], [130, 131, 136, 135], [131, 132, 137, 136], [132, 133, 138, 137], [133, 134, 139, 138], [134, 130, 135, 139], [135, 136, 141, 140], [136, 137, 142, 141], [137, 138, 143, 142], [138, 139, 144, 143], [139, 135, 140, 144], [140, 141, 146, 145], [141, 142, 147, 146], [142, 143, 148, 147], [143, 144, 149, 148], [144, 140, 145, 149], [145, 146, 151, 150], [146, 147, 152, 151], [147, 148, 153, 152], [148, 149, 154, 153], [149, 145, 150, 154], [150, 151, 156, 155], [151, 152, 157, 156], [152, 153, 158, 157], [153, 154, 159, 158], [154, 150, 155, 159], [155, 156, 161, 160], [156, 157, 162, 161], [157, 158, 163, 162], [158, 159, 164, 163], [159, 155, 160, 164], [160, 161, 166, 165], [161, 162, 167, 166], [162, 163, 168, 167], [163, 164, 169, 168], [164, 160, 165, 169], [4, 3, 2, 1, 0], [165, 166, 167, 168, 169]], convexity = 5); }openscad-2019.05/testdata/scad/3D/issues/issue1105.scad0000644000076500000240000000054113402025764022701 0ustar kintelstaff00000000000000translate([-31.5, -30, 1]) { rotate(90) { translate([2, -51.5, 26]) { difference() { cube([4, 14, 4]); translate([-0.1,-1,2.1]) cube([2.1, 16, 2.1]); } } } } translate([3, -25, 1]) rotate_extrude($fn=12) polygon(points = [[0, 20], [0, 30], [7, 26]]); translate([0, -28, 20]) cube([6, 3, 10]); openscad-2019.05/testdata/scad/3D/issues/issue1105b.scad0000644000076500000240000000052013402025764023040 0ustar kintelstaff00000000000000translate([54.5, -10, 2]) rotate(90) translate([2,30,26]) { difference() { cube(size = [4, 21.5, 4]); translate([-0.1,-1.1,2]) cube(size = [2.1, 23.5, 2.1]); } } translate([-3,-8,12]) cube(size = [6, 3, 20]); translate([0, -5, 2]) rotate(90) rotate_extrude($fn = 10) polygon(points = [[0, 18], [0, 30], [7, 26]]); openscad-2019.05/testdata/scad/3D/issues/issue1105c.scad0000644000076500000240000000052013402025764023041 0ustar kintelstaff00000000000000translate([59.5, -40, 2]) rotate(90) translate([2,31.5,26]) cube(size = [4, 23, 4], center = false); translate([5,-35,2]) { difference() { rotate(90) { translate([-3,-3,1]) cube(size = [3, 6, 30]); rotate_extrude($fn = 14) { polygon(points = [[0, 18], [0, 30], [7, 26]]); } } cylinder(h = 30, r = 1); } } openscad-2019.05/testdata/scad/3D/issues/issue1105d.scad0000644000076500000240000000027613402025764023052 0ustar kintelstaff00000000000000difference() { rotate_extrude(convexity=2, $fn=8) translate([5,0,0]) difference() { circle(r=2); circle(r=1); } translate([-5,-5,5]) cube(10, center=true); } openscad-2019.05/testdata/scad/3D/issues/issue1137.scad0000644000076500000240000000053413432700636022711 0ustar kintelstaff00000000000000minkowski() { polyhedron(faces=[[3,2,0,1], [7,6,5,4],[4,5,2,3],[5,6,1,2],[6,7,0,1],[7,4,3,0]], points=[[0,1,1],[1,1,1],[1,0,1],[0,0,1],[0,0,0],[1,0,0],[1,1,0],[0,1,0]]); polyhedron(faces=[[3,2,1,0],[7,6,5,4],[4,5,2,3],[5,6,1,2],[6,7,0,1],[7,4,3,0]], points=[[0,1,1],[1,1,1],[1,0,1],[0,0,1],[0,0,0],[1,0,0],[1,1,0],[0,1,0]]); } openscad-2019.05/testdata/scad/3D/issues/issue1138.scad0000644000076500000240000000072213432700636022711 0ustar kintelstaff00000000000000minkowski() { polyhedron(faces=[[4,5,6,7],[3,2,5,4],[2,1,6,5],[1,0,7,6],[0,3,4,7], [0,8,3], [1,2,9], [0,1,9,8], [2,3,8,9]], points=[[0,10,10],[10,10,10],[10,0,10],[0,0,10],[0,0,0],[10,0,0],[10,10,0],[0,10,0], [4.9999999,5,9],[5.0000001,5,9]]); polyhedron(faces=[[0,1,2,3],[4,5,6,7],[3,2,5,4],[2,1,6,5],[1,0,7,6],[0,3,4,7]], points=[[0,1,1],[1,1,1],[1,0,1],[0,0,1],[0,0,0],[1,0,0],[1,1,0],[0,1,0]]); } openscad-2019.05/testdata/scad/3D/issues/issue1165.scad0000644000076500000240000000025313402025764022707 0ustar kintelstaff00000000000000translate([0,10,0]) difference() { cube(10, center=true); translate([6,5.5,0]) cube(11, center=true); translate([6,-5.500000000088,0]) cube(11, center=true); }openscad-2019.05/testdata/scad/3D/issues/issue1196.scad0000644000076500000240000000042313402025764022712 0ustar kintelstaff00000000000000minkowski() { cube(); linear_extrude() { import("notfound.dxf"); } linear_extrude() { import("notfound.dxf"); } } minkowski() { linear_extrude() { import("notfound.dxf"); } linear_extrude() { import("notfound.dxf"); } cube(); cube(); } openscad-2019.05/testdata/scad/3D/issues/issue1198.scad0000644000076500000240000000110013402025764022705 0ustar kintelstaff00000000000000polyhedron(points = [ [6.46538, 45.0434, -0.5185], [7.45793, 45.0119, -0.636215], [7.45793, 45.9778, -0.895034], [6.46538, 46.0094, -0.77732], [6.46538, 45.5264, -0.64791], [6.18882, 44.4605, -2.69418], [7.18137, 44.4289, -2.8119], [7.18137, 45.3948, -3.07072], [6.18882, 45.4264, -2.953], [6.18882, 44.9434, -2.82359]], faces = [[0, 1, 6, 5], [1, 2, 7, 6], [2, 3, 8, 7], [3, 4, 9, 8], [4, 0, 5, 9], [4, 3, 2, 1, 0], [5, 6, 7, 8, 9]]); openscad-2019.05/testdata/scad/3D/issues/issue1215.scad0000644000076500000240000000032213402025764022700 0ustar kintelstaff00000000000000difference() { rotate([90,0,90]) linear_extrude(height=10) polygon(points=[[-4,0],[0,0],[0,3],[-3.5,3],[-4,2]]); rotate([90,0,0]) linear_extrude(height=4) polygon(points=[[0,3],[0.5,3],[0,2]]); } openscad-2019.05/testdata/scad/3D/issues/issue1215b.scad0000644000076500000240000000033313402025764023044 0ustar kintelstaff00000000000000module dieShape(out) { rotate([-90,90,0]) cylinder(r=10,h=15+out, $fn=4); rotate([0,-90,0]) cylinder(r=10,h=15+out, $fn=4); rotate([0,0,0]) cylinder(r=10,h=15+out, $fn=4); } hull() dieShape(0); dieShape(.5); openscad-2019.05/testdata/scad/3D/issues/issue1215c.scad0000644000076500000240000000034013402025764023043 0ustar kintelstaff00000000000000difference(){ union(){ translate([0,0,-1.5]) cylinder(h=9, r=26, center=true); translate([0.0, 0.0, 6.0]) rotate([180, 0, 0]) cylinder(h=3, r1=25, r2=26); } cylinder(h=14, r=23.0, center=true); } openscad-2019.05/testdata/scad/3D/issues/issue1221.scad0000644000076500000240000000035013402025764022676 0ustar kintelstaff00000000000000$fn=4; difference(){ ! union(){ translate([0,0,-1.5]) cylinder(h=9, r=26, center=true); translate([0.0, 0.0, 6.0]) rotate([180, 0, 0]) cylinder(h=3, r1=25, r2=26); } cylinder(h=14, r=23.0, center=true); } openscad-2019.05/testdata/scad/3D/issues/issue1223-2.dat0000644000076500000240000000002413402025764022673 0ustar kintelstaff000000000000009 6 7 6 8 9 5 3 2 2 openscad-2019.05/testdata/scad/3D/issues/issue1223.dat0000644000076500000240000000002213402025764022532 0ustar kintelstaff000000000000009 6 7 6 8 9 5 3 2 openscad-2019.05/testdata/scad/3D/issues/issue1223.scad0000644000076500000240000000052713402025764022706 0ustar kintelstaff00000000000000// .dat file has values from 2-9 scale([1,1,0.2]) surface("issue1223.dat"); translate([1,-1,0]) cube([1,1,0.1]); translate([-1,1,0]) cube([1,1,0.1]); // .dat file has incomplete last line translate([4,0,0]) { scale([1,1,0.2]) surface("issue1223-2.dat"); translate([1,-1,0]) cube([1,1,0.1]); translate([-1,1,0]) cube([1,2,0.1]); } openscad-2019.05/testdata/scad/3D/issues/issue1223b.dat0000644000076500000240000000004013402025764022674 0ustar kintelstaff000000000000001 1 1 2 1 0 0 2 1 0 0 2 1 2 2 2 openscad-2019.05/testdata/scad/3D/issues/issue1223b.png0000644000076500000240000000026013402025764022714 0ustar kintelstaff00000000000000PNG  IHDR& ) pHYs  tIME)KiTXtCommentCreated with GIMPd.e&IDATM1 0 @l(v"|j$TIENDB`openscad-2019.05/testdata/scad/3D/issues/issue1223b.scad0000644000076500000240000000037413402025764023050 0ustar kintelstaff00000000000000scale([1,1,1]) surface("issue1223b.png"); translate([1,-1,0]) cube([2,1,0.1]); translate([-1,1,0]) cube([1,2,0.1]); translate([5,0,0]) { surface("issue1223b.dat"); translate([1,-1,0]) cube([2,1,0.1]); translate([-1,1,0]) cube([1,2,0.1]); }openscad-2019.05/testdata/scad/3D/issues/issue1225.scad0000644000076500000240000000022413402025764022702 0ustar kintelstaff00000000000000cylinder(h = 19.05, r = 25.4); translate([-20, -2.26, 19.05]) { translate([0, 4.375, 0]) sphere(1); translate([7.5, 1.875, 0]) sphere(1); } openscad-2019.05/testdata/scad/3D/issues/issue1246.scad0000644000076500000240000000032413402025764022706 0ustar kintelstaff00000000000000polyhedron(points = [[0,0,0], [1,0,0], [0/0, 0/0, 0/0], [0/0, 0/0, 0/0]], faces = [[0,1,3,2]]); polyhedron(points = [[0,0,0], [1,0,0], [0/0, 0/0, 0/0], [0/0, 0/0, 0/0]], faces = [[0,1,2]]); openscad-2019.05/testdata/scad/3D/issues/issue1258.scad0000644000076500000240000000042113402025764022707 0ustar kintelstaff00000000000000difference() { translate([-6, 4, 30]) cube(size = [17.5, 48, 60], center = true); translate([-10.5, 3, 30]) cube(size = [20.5, 55, 80], center = true); } translate([-0.25, -19, 33]) rotate([0, 90, 0]) rotate([0, 0, -45]) cube(size = [15, 15, 3], center = false); openscad-2019.05/testdata/scad/3D/issues/issue1325.scad0000644000076500000240000000016613402025764022710 0ustar kintelstaff00000000000000polyhedron(points = [ [0, -4, 1], [0, -5, 1], [0, -5, 2], [0, -4, 0] ], faces = [ [1, 2, 2, 1], [0, 0, 3, 3] ]); openscad-2019.05/testdata/scad/3D/issues/issue1671.scad0000644000076500000240000000013713402025764022712 0ustar kintelstaff00000000000000minkowski() { scale([0,0,1]) cube(1); scale([0,1,0]) cube(1); scale([1,0,0]) cube(1); } openscad-2019.05/testdata/scad/3D/issues/issue1672.scad0000644000076500000240000000004613402025764022712 0ustar kintelstaff00000000000000hull() { scale([0,0,1]) cube(1); } openscad-2019.05/testdata/scad/3D/issues/issue1803.scad0000644000076500000240000000033413402025764022706 0ustar kintelstaff00000000000000$fn=32; intersection(){ difference(){ cube(size=50, center=true); cylinder(d=30,h=80, center=true); } cylinder(d=65,h=80,center=true); rotate([90,0,0]) cylinder(d=65,h=80,center=true); } openscad-2019.05/testdata/scad/3D/issues/issue1833.scad0000644000076500000240000000007613402025764022714 0ustar kintelstaff00000000000000intersection() { #translate([2,0,0]) cube(1); #cube(1); } openscad-2019.05/testdata/scad/3D/issues/issue1867.scad0000644000076500000240000000055413402025764022724 0ustar kintelstaff00000000000000polyhedron(points = [ [78.1831, 62.349, 10], [97.4928, -22.2521, -5], [-97.4928, -22.2521, 5], [-78.1831, 62.349, -10], [78.1831, 62.349, 200], [97.4928, -22.2521, 200], [-97.4928, -22.2521, 200], [-78.1831, 62.349, 200] ], faces = [ [0, 1, 4], [1, 2, 5], [2, 3, 6], [3, 0, 7], [5, 4, 1], [6, 5, 2], [7, 6, 3], [4, 7, 0], [4, 5, 6], [4, 6, 7], [3, 2, 1, 0], ]); openscad-2019.05/testdata/scad/3D/issues/issue2259.scad0000644000076500000240000000013413402025764022712 0ustar kintelstaff00000000000000linear_extrude(height = 10, scale = [1,0], slices = 2) polygon([[20, 0],[0, 10],[0, -10]]); openscad-2019.05/testdata/scad/3D/issues/issue267-normalization-crash.scad0000644000076500000240000000425613432700636026623 0ustar kintelstaff00000000000000/* * Reported by Justin Charette * Causes a crash in CSGTermNormalizer::normalize() when CSG element count * exceeds limit setting in preferences (verified with default value of 2000). */ $fn=20; /* donut (r1, r2, t) {{{ r1 = radius of torus r2 = radius of torus cross section (circle) t = thickness of shell (t == 0 is */ module donut (r1, r2, t=0) { difference() { rotate_extrude( convexity=6 ) { translate([r1, 0, 0]) { circle( r = r2 ); } } // (t == 0 ? solid : hollow ) if (t > 0) { rotate_extrude( convexity=6 ) { translate([r1, 0, 0]) { circle( r = r2-t ); } } } } } //}}} /* half donut (r1, r2, t, round) {{{ r1 = radius of torus r2 = radius of torus cross section (circle) t = thickness of shell round = trim ends of semi-torus so they are round */ module half_donut (r1, r2, t=1, round=false) { difference() { donut( r1, r2, t ); difference() { translate( [0, -((r1+r2)/2+0.5), 0] ) scale( [2*(r1+r2)+1, r1+r2+1, 2*r2+1] ) square( 1, center=true ); if (round) { rotate( 90, [0, 1, 0] ) cylinder( 2*(r1+r2)+2, r2, r2, center=true ); } } } } //}}} /* donut flange (r1, r2, a1, a2, a_step, t, round) {{{ r1 = radius of torus r2 = radius of torus cross section (circle) a1 = starting angle of flange rotation a2 = stopping angle of flange rotation a_step = increment size of flange rotation t = thickness of shell (t == 0 is solid, t in (0, r2) is hollow) round = (true/false) to trim ends of semi-torus so they are round */ module donut_flange (r1, r2, a1, a2, a_step=1, t=0, round=false) { difference() { union() { for (a = [a1:a_step:a2]) { rotate( a, [1, 0, 0] ) half_donut( r1, r2, round ); } } // (t == 0 ? solid : hollow ) if (t > 0) { union() { for (a = [a1:a_step:a2]) { rotate( a, [1, 0, 0] ) half_donut( r1, r2-t, round ); } } } } } //}}} donut( 20, 5 ); donut_flange( 20, 5, 0, 50, 10, t=1, round=false ); // vim: set et sw=2 ts=2 sts=2 ai sta sr fdm=marker: openscad-2019.05/testdata/scad/3D/issues/issue495a.scad0000644000076500000240000000041713432700636023000 0ustar kintelstaff00000000000000// Hollow cube. // STL export is wrong (inner cube is positive instead of negative) // This is fixed by applying and using the patch to CGAL containing // convert_all_inner_shells_to_polyhedron() difference() { cube(20, center = true); cube(10, center = true); } openscad-2019.05/testdata/scad/3D/issues/issue517.scad0000644000076500000240000000061613414440264022631 0ustar kintelstaff00000000000000// // Test that rotating a cube 90 degrees is accurate. // Due to symmetry the result should be empty. // render() difference() { cube(10, true); rotate([90, 0, 0]) cube(10, true); } // // Check that rotating a cube 120 degrees around its diagonal is accurate. // render() translate([20, 0]) difference() { cube(10, true); rotate(120, [1, 1, 1]) cube(10, true); } openscad-2019.05/testdata/scad/3D/issues/issue835.scad0000644000076500000240000000035113402025764022631 0ustar kintelstaff00000000000000difference() { cube([20,20,3], center=true); linear_extrude(height=10, center=true, convexity=2) { translate([5,0]) circle(r=3); translate([-5,5]) circle(r=3); translate([-5,-5]) circle(r=3); } } openscad-2019.05/testdata/scad/3D/issues/issue904.scad0000644000076500000240000000043113402025764022625 0ustar kintelstaff00000000000000difference() { cylinder($fn=16, h = 4, r = 12.3, center = true); translate([4, 12.0, 0]) rotate(a=[0, 0, -90]) difference() { cube(size = [5.5, 5.5, 10], center=true); translate([2.75, 2.75, 0]) cylinder($fn = 8, h = 11, r1 = 5.5, r2 = 5.5, center = true); } } openscad-2019.05/testdata/scad/3D/issues/issue911.scad0000644000076500000240000000053513402025764022630 0ustar kintelstaff00000000000000// Doing a minkowski sum on an object with // an internal cavity causes rendering artifacts // in preview mode (similar to convexity issues) difference() { minkowski(convexity=2) { difference() { cube(19, center = true); cube(11, center = true); } cube(1, center=true); } translate([0, 0, 15]) cube(30, center=true); } openscad-2019.05/testdata/scad/3D/issues/issue913.scad0000644000076500000240000000043613402025764022632 0ustar kintelstaff00000000000000module erode(r) { difference() { children(); minkowski(convexity=2) { difference() { cube(14, center=true); children(); } cube(2*r, center=true); } } } erode(2) cube(10, center=true); openscad-2019.05/testdata/scad/3D/issues/issue964.scad0000644000076500000240000000027413402025764022640 0ustar kintelstaff00000000000000polyhedron(points=[ [0,0,0], [10,0,0], [10,10,0], [0,10,0], [0,-20,20], [10,-20,20], [10,-20,30], [0,-20,30] ], faces = [[0,1,2,3],[4,5,6,7], [1,2,5,4], [2,3,6,5], [3,0,6,5], [0,1,4,7] ]);openscad-2019.05/testdata/scad/3D/issues/issue964b.scad0000644000076500000240000000104713402025764023001 0ustar kintelstaff00000000000000polyhedron(points = [[8.4991, -4.98973, 62.7876], [-0.423767, 0.0568668, 64.4948], [-0.505246, -10.1774, 62.6914], [9.17023, -6.28686, 70.9731], [0.213931, -1.18909, 69.6324], [0.168244, -11.4782, 71.0926], [6.96718, -1.88303, 76.9407], [0.507199, -1.73168, 68.8016], [-2.19023, -6.7664, 77.4835], [3.05033, 5.76153, 77.3746], [-2.1412, 3.4281, 68.6796], [-6.17499, 1.01119, 77.9472]], faces = [[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0], [3, 6, 7, 4], [4, 7, 8, 5], [5, 8, 6, 3], [6, 9, 10, 7], [7, 10, 11, 8], [8, 11, 9, 6], [2, 1, 0], [9, 10, 11]]); openscad-2019.05/testdata/scad/3D/issues/issue990.scad0000644000076500000240000000016213402025764022633 0ustar kintelstaff00000000000000hull() { for (i = [0:1]) { cylinder(h=0); } } translate([-5, 0, 0]) cube(); translate([5, 0, 0]) cube(); openscad-2019.05/testdata/scad/3D/issues/issue999.scad0000644000076500000240000000045513402025764022651 0ustar kintelstaff00000000000000linear_extrude(height=1) difference() { square([1,1], center=true); translate([0, -0.5]) circle(r=0.25, $fn=60); // polygon cleanup doesn't touch our circle at this scale translate([-0.5, 0]) circle(r=0.25, $fn=600);// shows up much more coarse if polygon cleaning distance is too large } openscad-2019.05/testdata/scad/3D/issues/minkowski-thin-cylinder.scad0000644000076500000240000000011013402025764026014 0ustar kintelstaff00000000000000minkowski() { cube([10, 10, 10]); cylinder(r=2, h=0.0000001); } openscad-2019.05/testdata/scad/3D/issues/polygon-illegal-winding.scad0000644000076500000240000000106113432700636025774 0ustar kintelstaff00000000000000polyhedron (points = [ [0, -10, 60], [0, 10, 60], [0, 10, 0], [0, -10, 0], [60, -10, 60], [60, 10, 60], [10, -10, 50], [10, 10, 50], [10, 10, 30], [10, -10, 30], [30, -10, 50], [30, 10, 50] ], faces = [ [0,2,3], [0,1,2], [0,4,5], [0,5,1], [5,4,2], [2,4,3], [6,8,9], [6,7,8], [6,10,11], [6,11,7], [10,8,11], [10,9,8], [0,3,9], [9,0,6], [10,6, 0], [0,4,10], [3,9,10], [3,10,4], [1,7,11], [1,11,5], [1,7,8], [1,8,2], [2,8,11], [2,11,5] ] ); openscad-2019.05/testdata/scad/3D/issues/transform-nan-inf-tests.scad0000644000076500000240000000036313432700636025744 0ustar kintelstaff00000000000000// Test translation by NaN and Infinity // cube()s should not be rendered // NaN sphere(); rotate([0, 0, asin(1.1) ]) cube(); // Infinity (as of 2012-08 this is detected as NaN) translate([4,0,0]) { sphere(); rotate([0, 0, 1/0]) cube(); } openscad-2019.05/testdata/scad/3D/misc/camera-tests-offcenter.scad0000644000076500000240000000071613402025764025227 0ustar kintelstaff00000000000000// copy of example001 used for camera tests module example001() { function r_from_dia(d) = d / 2; module rotcy(rot, r, h) { rotate(90, rot) cylinder(r = r, h = h, center = true); } difference() { sphere(r = r_from_dia(size)); rotcy([0, 0, 0], cy_r, cy_h); rotcy([1, 0, 0], cy_r, cy_h); rotcy([0, 1, 0], cy_r, cy_h); } size = 50; hole = 25; cy_r = r_from_dia(hole); cy_h = r_from_dia(size * 2.5); } translate([100,0,0]) example001(); openscad-2019.05/testdata/scad/3D/misc/camera-tests.scad0000644000076500000240000000073013402025764023252 0ustar kintelstaff00000000000000// copy of example001 used for camera tests module example001() { function r_from_dia(d) = d / 2; module rotcy(rot, r, h) { rotate(90, rot) cylinder(r1 = r / 2, r2 = r, h = h, center = true); } difference() { sphere(r = r_from_dia(size)); rotcy([0, 0, 0], cy_r, cy_h); rotcy([1, 0, 0], cy_r, cy_h, $fn = 4); rotcy([0, 1, 0], cy_r, cy_h, $fn = 3); } size = 50; hole = 25; cy_r = r_from_dia(hole); cy_h = r_from_dia(size * 2.5); } example001(); openscad-2019.05/testdata/scad/3D/misc/view-options-tests.scad0000644000076500000240000000007613402025764024470 0ustar kintelstaff00000000000000difference() { cube(20, center = true); sphere(13); } openscad-2019.05/testdata/scad/3mf/3mf-export.scad0000644000076500000240000000004613402025764022152 0ustar kintelstaff00000000000000translate([1,1,9]) cube(8); cube(10); openscad-2019.05/testdata/scad/amf/amf_broken.scad0000644000076500000240000000004513417146624022333 0ustar kintelstaff00000000000000import("../../amf/amf_broken.amf"); openscad-2019.05/testdata/scad/amf/cube-with-hole.scad0000644000076500000240000000012113402025764023032 0ustar kintelstaff00000000000000// converted from STL by cura, unzipped import("../../amf/cube-with-hole.amf"); openscad-2019.05/testdata/scad/amf/multi-volume-binary.scad0000644000076500000240000000013613402025764024145 0ustar kintelstaff00000000000000// converted from STL and split by cura, zipped import("../../amf/multi-volume-binary.amf"); openscad-2019.05/testdata/scad/amf/sphere20face.scad0000644000076500000240000000014513402025764022473 0ustar kintelstaff00000000000000// example file from http://amf.wikispaces.com/AMF+test+files import("../../amf/sphere20face.amf"); openscad-2019.05/testdata/scad/amf/split_pyramid.scad0000644000076500000240000000014613402025764023105 0ustar kintelstaff00000000000000// example file from http://amf.wikispaces.com/AMF+test+files import("../../amf/split_pyramid.amf"); openscad-2019.05/testdata/scad/amf/tetra_multicolor.scad0000644000076500000240000000015113402025764023611 0ustar kintelstaff00000000000000// example file from http://amf.wikispaces.com/AMF+test+files import("../../amf/tetra_multicolor.amf"); openscad-2019.05/testdata/scad/bugs/issue1000.scad0000644000076500000240000000111513432700636022051 0ustar kintelstaff00000000000000// // CSG rendering issue: // This results in a blue sphere rather than a sphere consisting of red/blue half spheres // The reason is likely that OpenCSG doesn't track // which positive object is the source of what depth fragment and thus lets the last rendered object win. // // uncomment the render() calls to generate expected test results color([1,0,0]) translate([0,0,0]) /*render()*/ intersection() { sphere(10); translate([0,0,10]) cube([20,20,20],center=true); } color([0,0,1]) /*render()*/ difference() { sphere(10); translate([0,0,10]) cube([20,20,20],center=true); } openscad-2019.05/testdata/scad/bugs/issue13.scad0000644000076500000240000000011513402025764021712 0ustar kintelstaff00000000000000cube(size = [10,10,5]); translate([5, 5, 8.1-9+0.9]) cube(size = [5,10,10]); openscad-2019.05/testdata/scad/bugs/issue13b.scad0000644000076500000240000000020213402025764022051 0ustar kintelstaff00000000000000rotate([90,0,180]) translate ([0, 0, 8]) cube(10, center=true); rotate([90,0,270]) translate ([0, 0, 8]) cube(10, center=true); openscad-2019.05/testdata/scad/bugs/issue13c.scad0000644000076500000240000000071513402025764022063 0ustar kintelstaff00000000000000$fn=8; sphere(r = 3.75); rotate([90,0, 180]) { translate([0,0,-0.9375]) { intersection() { cylinder(h = 14.9375, r1 = 3.63281, r2 = 7.5, center = false); translate([0,0,8.775]) cube([7.5, 7.5, 17.75], center = true); } } } rotate([90,0, 225]) { translate([0,0,-0.9375]) { intersection() { cylinder(h = 14.9375, r1 = 3.63281, r2 = 7.5, center = false); translate([0,0,8.775]) cube([7.5, 7.5, 17.75], center = true); } } } openscad-2019.05/testdata/scad/bugs/issue1455.scad0000644000076500000240000000036013402025764022067 0ustar kintelstaff00000000000000module object() { difference() { cube(5); cube(3); translate ([0, 0, 2]) cube (2); } difference() { cube (5); cube (3); } } minkowski() { object(); cube(); } openscad-2019.05/testdata/scad/bugs/issue1455.scad.csg0000644000076500000240000000064613432700636022652 0ustar kintelstaff00000000000000minkowski(convexity = 0) { group() { difference() { cube(size = [5, 5, 5], center = false); cube(size = [3, 3, 3], center = false); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 2], [0, 0, 0, 1]]) { cube(size = [2, 2, 2], center = false); } } difference() { cube(size = [5, 5, 5], center = false); cube(size = [3, 3, 3], center = false); } } cube(size = [1, 1, 1], center = false); } openscad-2019.05/testdata/scad/bugs/issue1529.scad0000644000076500000240000000037213432700636022075 0ustar kintelstaff00000000000000module all_transparent() { %children(); } module first_transparent() { %children(0); } difference() { sphere(r=10); all_transparent() cylinder(h=30, r=6, center=true); first_transparent() rotate([90,0,0]) cylinder(h=30, r=6, center=true); }openscad-2019.05/testdata/scad/bugs/issue1580-back-to-back.scad0000644000076500000240000000030213432700636024277 0ustar kintelstaff00000000000000polyhedron([ [0,2,0], //0 [0,4,0], //1 [0,0,0], //2 [0,2,-4], //3 [2,2,0], //4 [-2,2,0] //5 ],[ [0,1,2], [2,1,0], [2,0,4], [0,1,4], [0,5,1], [0,2,5], [2,3,5], [4,3,2], [1,5,3], [4,1,3], ]); openscad-2019.05/testdata/scad/bugs/issue1580-back-to-back.stl0000644000076500000240000000243313432700636024176 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal 0 0 0 outer loop vertex 0 0 0 vertex 0 4 0 vertex 0 2 0 endloop endfacet facet normal 0 0 -0 outer loop vertex 0 2 0 vertex 0 4 0 vertex 0 0 0 endloop endfacet facet normal 0 0 1 outer loop vertex 2 2 0 vertex 0 2 0 vertex 0 0 0 endloop endfacet facet normal 0 0 1 outer loop vertex 2 2 0 vertex 0 4 0 vertex 0 2 0 endloop endfacet facet normal 0 0 1 outer loop vertex 0 4 0 vertex -2 2 0 vertex 0 2 0 endloop endfacet facet normal -0 0 1 outer loop vertex -2 2 0 vertex 0 0 0 vertex 0 2 0 endloop endfacet facet normal -0.666667 -0.666667 -0.333333 outer loop vertex -2 2 0 vertex 0 2 -4 vertex 0 0 0 endloop endfacet facet normal 0.666667 -0.666667 -0.333333 outer loop vertex 0 0 0 vertex 0 2 -4 vertex 2 2 0 endloop endfacet facet normal -0.666667 0.666667 -0.333333 outer loop vertex 0 2 -4 vertex -2 2 0 vertex 0 4 0 endloop endfacet facet normal 0.666667 0.666667 -0.333333 outer loop vertex 0 2 -4 vertex 0 4 0 vertex 2 2 0 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/scad/bugs/issue1580-back-to-back2.scad0000644000076500000240000000041713432700636024370 0ustar kintelstaff00000000000000polyhedron([ [0,1,0], //0 [0,4,0], //1 [0,0,0], //2 [0,2,0], //3 [2,0,0], //4 [2,4,0], //5 [-2,4,0], //6 [-2,0,0], //7 [0,2,-4] //8 ],[ [0,1,2], [2,1,3], [2,3,4], [3,1,5], [0,6,1], [0,2,7], [3,5,4], [7,6,0], [6,7,8], [2,8,7], [4,8,2], [1,6,8], [5,1,8], [4,5,8] ]); openscad-2019.05/testdata/scad/bugs/issue1580-back-to-back2.stl0000644000076500000240000000336213432700636024262 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal 0 0 0 outer loop vertex 0 0 0 vertex 0 4 0 vertex 0 1 0 endloop endfacet facet normal 0 0 -0 outer loop vertex 0 2 0 vertex 0 4 0 vertex 0 0 0 endloop endfacet facet normal 0 0 1 outer loop vertex 2 0 0 vertex 0 2 0 vertex 0 0 0 endloop endfacet facet normal 0 0 1 outer loop vertex 2 4 0 vertex 0 4 0 vertex 0 2 0 endloop endfacet facet normal 0 0 1 outer loop vertex 0 4 0 vertex -2 4 0 vertex 0 1 0 endloop endfacet facet normal 0 0 1 outer loop vertex -2 0 0 vertex 0 0 0 vertex 0 1 0 endloop endfacet facet normal 0 -0 1 outer loop vertex 2 0 0 vertex 2 4 0 vertex 0 2 0 endloop endfacet facet normal 0 0 1 outer loop vertex 0 1 0 vertex -2 4 0 vertex -2 0 0 endloop endfacet facet normal -0.894427 0 -0.447214 outer loop vertex 0 2 -4 vertex -2 0 0 vertex -2 4 0 endloop endfacet facet normal 0 -0.894427 -0.447214 outer loop vertex -2 0 0 vertex 0 2 -4 vertex 0 0 0 endloop endfacet facet normal 0 -0.894427 -0.447214 outer loop vertex 0 0 0 vertex 0 2 -4 vertex 2 0 0 endloop endfacet facet normal 0 0.894427 -0.447214 outer loop vertex 0 2 -4 vertex -2 4 0 vertex 0 4 0 endloop endfacet facet normal 0 0.894427 -0.447214 outer loop vertex 0 2 -4 vertex 0 4 0 vertex 2 4 0 endloop endfacet facet normal 0.894427 0 -0.447214 outer loop vertex 0 2 -4 vertex 2 4 0 vertex 2 0 0 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/scad/bugs/issue1580-import-back-to-back.scad0000644000076500000240000000004613402025764025613 0ustar kintelstaff00000000000000import("issue1580-back-to-back.stl"); openscad-2019.05/testdata/scad/bugs/issue1580-import-back-to-back2.scad0000644000076500000240000000004713402025764025676 0ustar kintelstaff00000000000000import("issue1580-back-to-back2.stl"); openscad-2019.05/testdata/scad/bugs/issue1580-import-zero-area-triangle.scad0000644000076500000240000000005413402025764027064 0ustar kintelstaff00000000000000import("issue1580-zero-area-triangle.stl"); openscad-2019.05/testdata/scad/bugs/issue1580-zero-area-triangle.scad0000644000076500000240000000105713402025764025560 0ustar kintelstaff00000000000000polyhedron([ [0, 10, 10], [10, 0, 10], [10, 10, 10], [0, 0, 10], [10, 0, 0], [0, 10, 0], [10, 10, 0], [0, 0, 0], [0, 0, 5]], [ [0,2,1], [0,1,3], [4,6,5], [4,5,7], [8,1,4], [8,3,1], [7,3,8], [8,4,7], [1,2,6], [1,6,4], [0,5,6], [0,6,2], [3,7,5], [3,5,0] ]); openscad-2019.05/testdata/scad/bugs/issue1580-zero-area-triangle.stl0000644000076500000240000000331013402025764025442 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal -0 0 1 outer loop vertex 0 10 10 vertex 10 0 10 vertex 10 10 10 endloop endfacet facet normal 0 0 1 outer loop vertex 0 10 10 vertex 0 0 10 vertex 10 0 10 endloop endfacet facet normal 0 0 -1 outer loop vertex 10 0 0 vertex 0 10 0 vertex 10 10 0 endloop endfacet facet normal 0 0 -1 outer loop vertex 10 0 0 vertex 0 0 0 vertex 0 10 0 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 0 5 vertex 10 0 0 vertex 10 0 10 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 0 5 vertex 10 0 10 vertex 0 0 10 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 0 0 vertex 0 0 5 vertex 0 0 10 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 0 5 vertex 0 0 0 vertex 10 0 0 endloop endfacet facet normal 1 -0 0 outer loop vertex 10 0 10 vertex 10 10 0 vertex 10 10 10 endloop endfacet facet normal 1 0 0 outer loop vertex 10 0 10 vertex 10 0 0 vertex 10 10 0 endloop endfacet facet normal 0 1 0 outer loop vertex 0 10 10 vertex 10 10 0 vertex 0 10 0 endloop endfacet facet normal -0 1 0 outer loop vertex 0 10 10 vertex 10 10 10 vertex 10 10 0 endloop endfacet facet normal -1 0 0 outer loop vertex 0 0 10 vertex 0 10 0 vertex 0 0 0 endloop endfacet facet normal -1 0 0 outer loop vertex 0 0 10 vertex 0 10 10 vertex 0 10 0 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/scad/bugs/issue1876.scad0000644000076500000240000000046213432700636022102 0ustar kintelstaff00000000000000polyhedron(points=[ [0,0,0], [0,40,0], [0,30,0], // 1 [0,20,0], // 2 [-10,0,0], [-10,40,0], [10,0,0], [10,40,0], [10,0,-20], [10,20,0] ], faces = [ [9,8,6], [7,8,9], [7,8,9], [1,8,7], [5,8,1], [4,8,5], [0,8,4], [0,6,8], [2,1,7], [3,2,7], [3,7,9], [3,9,6], [0,3,6], [0,5,1], [0,4,5], [0,2,3], [0,1,2], ]); openscad-2019.05/testdata/scad/bugs/issue584.scad0000644000076500000240000000007013402025764022007 0ustar kintelstaff00000000000000render() { cube(10); rotate([-100,0,0]) cube(10); } openscad-2019.05/testdata/scad/bugs/issue591.scad0000644000076500000240000000133713402025764022014 0ustar kintelstaff00000000000000// Creates the same "non-manifold" object (sharing one edge) using two techniques: // o linear_extrude of two 2D objects // o union of two linear_extrudes // // Subsequently cuts away the non-manifold part: // -> the first technique fails, the second one succeeds // module cutoff() { difference() { children(); translate([0,0,2.5]) cube(2, center=true); } } cutoff() { linear_extrude(height=3, scale=[0,1], convexity=2) { translate([1,0,0]) square(1,true); translate([-1,0,0]) square(1,true); } } translate([0,2,0]) cutoff() { linear_extrude(height=3, scale=[0,1]) translate([1,0,0]) square(1,true); linear_extrude(height=3, scale=[0,1]) translate([-1,0,0]) square(1,true); } openscad-2019.05/testdata/scad/bugs/issue666.scad0000644000076500000240000000071213402025764022013 0ustar kintelstaff00000000000000// >2 objects which don't all intersect should be empty intersection() { translate([0,0,0]) cube(5, center=true); translate([4,0,0]) cube(5, center=true); translate([8,00,]) cube(5, center=true); translate([12,0,0]) cube(5, center=true); } // Subtracting something from empty intersection should be empty translate([0,-12,0]) difference() { intersection() { cube(); translate([2,0,0]) cube(); } cylinder(r=4, h=10, center=true); } openscad-2019.05/testdata/scad/bugs/issue791.scad0000644000076500000240000000037713402025764022021 0ustar kintelstaff00000000000000difference() { linear_extrude(height = 2, twist = 0, convexity=2) { polygon(points = [[0, 0], [1, -1], [2, 0.2], [2, -0.2], [1, 1]]); } cube(center=true); } openscad-2019.05/testdata/scad/bugs/issue802.scad0000644000076500000240000001231213402025764022002 0ustar kintelstaff00000000000000 polyhedron( points = [ [153.898,59.513,-32.4658] , [163.267,30.683,-34.429] , [175.611,59.513,-24.8805] , [184.981,30.683,-26.8437] , [166.57,-1.77636e-15,-35.1211] , [188.284,-1.77636e-15,-27.5359] , [163.267,-30.683,-34.429] , [184.981,-30.683,-26.8437] , [153.898,-59.513,-32.4658] , [175.611,-59.513,-24.8805] , [181.898,59.513,-27.7158] , [191.267,30.683,-29.679] , [194.57,-1.77636e-15,-30.3711] , [191.267,-30.683,-29.679] , [181.898,-59.513,-27.7158] , [163.961,59.513,-33.9819] , [173.33,30.683,-35.9451] , [176.633,-1.77636e-15,-36.6372] , [173.33,-30.683,-35.9451] , [163.961,-59.513,-33.9819] , [148.845,69.513,-31.6884] , [148.845,-69.513,-31.6884] , [148.845,74.513,-31.6884] , [148.845,-74.513,-31.6884] , [162.25,59.513,-45.946] , [162.25,-59.513,-45.946] , [147.116,-74.513,-43.7824] , [147.116,74.513,-43.7824] , [80.3015,-54.0118,-33.5692] , [147.116,-69.513,-43.7824] , [80.3015,-59.0118,-33.5692] , [81.2307,-54.0118,-27.0692] , [81.2307,-59.0118,-27.0692] , [2.52448,-36,-22.6917] , [80.054,-54.0118,-33.5338] , [80.054,-59.0118,-33.5338] , [2.52448,-41,-22.6917] , [80.9832,-59.0118,-27.0338] , [80.9832,-54.0118,-27.0338] , [2.666,-36,-21.7018] , [2.666,-41,-21.7018] , [147.116,69.513,-43.7824] , [80.3015,59.0998,-33.5692] , [80.3015,64.0998,-33.5692] , [81.2307,59.0998,-27.0692] , [81.2307,64.0998,-27.0692] , [80.054,64.0998,-33.5338] , [80.054,59.0998,-33.5338] , [2.52448,47,-22.6917] , [2.52448,52,-22.6917] , [2.666,47,-21.7018] , [80.9832,59.0998,-27.0338] , [80.9832,64.0998,-27.0338] , [2.666,52,-21.7018] , ], faces = [ [2,1,0] , [3,1,2] , [3,4,1] , [5,4,3] , [5,6,4] , [7,6,5] , [7,8,6] , [9,8,7] , [10,3,2] , [11,3,10] , [11,5,3] , [12,5,11] , [12,7,5] , [13,7,12] , [13,9,7] , [14,9,13] , [15,11,10] , [16,11,15] , [16,12,11] , [17,12,16] , [17,13,12] , [18,13,17] , [18,14,13] , [19,14,18] , [20,0,1] , [20,1,4] , [20,4,21] , [21,4,6] , [21,6,8] , [0,20,22] , [23,21,8] , [16,15,24] , [17,16,24] , [25,17,24] , [18,17,25] , [19,18,25] , [26,25,24] , [26,23,25] , [23,19,25] , [27,26,24] , [24,15,22] , [24,22,27] , [23,27,22] , [23,26,27] , [0,15,10] , [10,2,0] , [22,15,0] , [14,19,8] , [8,9,14] , [8,19,23] , ]); polyhedron( points = [ [0,0,0], [148.845,-69.513,-31.6884] , [0,0,0], [148.845,-74.513,-31.6884] , [0,0,0], [0,0,0], [147.116,-74.513,-43.7824] , [0,0,0], [80.3015,-54.0118,-33.5692] , [147.116,-69.513,-43.7824] , [80.3015,-59.0118,-33.5692] , [81.2307,-54.0118,-27.0692] , [81.2307,-59.0118,-27.0692] , [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [147.116,69.513,-43.7824] , [80.3015,59.0998,-33.5692] , [80.3015,64.0998,-33.5692] , [81.2307,59.0998,-27.0692] , [81.2307,64.0998,-27.0692] , [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [148.845,69.513,-31.6884] , [148.845,74.513,-31.6884] , [147.116,74.513,-43.7824] , ], faces = [ [6,9,8] , [6,8,10] , [11,1,3] , [12,11,3] , [3,6,10] , [3,10,12] , [8,12,10] , [8,9,1] , [11,8,1] , [8,11,12] , [6,3,9] , [9,3,1] , [35,34,24] , [35,24,25] , [34,22,24] , [25,24,22] , [23,25,22] , [22,21,36] , [23,22,36] , [34,21,22] , [23,36,25] , [25,36,35] , [21,35,36] , [34,35,21] , ]); openscad-2019.05/testdata/scad/bugs/issue945.scad0000644000076500000240000000010613402025764022010 0ustar kintelstaff00000000000000rotate([0, 45, 0]) cube(50, true); rotate([0, 0, 45]) cube(50, true); openscad-2019.05/testdata/scad/bugs/issue945b.scad0000644000076500000240000000010613402025764022152 0ustar kintelstaff00000000000000rotate([0, 45, 0]) cube(50, true); rotate([0, 0, 45]) cube(50, true); openscad-2019.05/testdata/scad/bugs/issue945c.scad0000644000076500000240000000014313402025764022154 0ustar kintelstaff00000000000000translate([0,-1.5,0]) cube([3,3,17]); translate([0, 0, 17]) rotate([0, 90, 0]) cylinder(h=3, r=5); openscad-2019.05/testdata/scad/bugs/issue945d.scad0000644000076500000240000000007413402025764022160 0ustar kintelstaff00000000000000translate([-5,5,0]) cube(10); rotate([0, -90, 0]) cube(10); openscad-2019.05/testdata/scad/bugs/issue945e.scad0000644000076500000240000000015413402025764022160 0ustar kintelstaff00000000000000// issue945e.stl is exported from issue945c.scad with an older version of OpenSCAD import("issue945e.stl"); openscad-2019.05/testdata/scad/bugs/issue945e.stl0000644000076500000240000003672513402025764022065 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal -1 0 0 outer loop vertex 0 1.5 0 vertex 0 3.83653e-15 17 vertex 0 1.5 17 endloop endfacet facet normal -1 0 0 outer loop vertex 0 -1.5 0 vertex 0 3.83653e-15 17 vertex 0 1.5 0 endloop endfacet facet normal -1 -0 0 outer loop vertex 0 3.83653e-15 17 vertex 0 -1.5 0 vertex 0 -1.5 17 endloop endfacet facet normal 1 -0 0 outer loop vertex 3 0 12 vertex 3 1.5 0 vertex 3 1.5 12.2984 endloop endfacet facet normal 1 -0 0 outer loop vertex 3 -5.66485e-16 12 vertex 3 1.5 0 vertex 3 0 12 endloop endfacet facet normal 1 0 0 outer loop vertex 3 -1.5 0 vertex 3 -5.66485e-16 12 vertex 3 -1.5 12.2984 endloop endfacet facet normal 1 0 0 outer loop vertex 3 -5.66485e-16 12 vertex 3 -1.5 0 vertex 3 1.5 0 endloop endfacet facet normal 0 1 0 outer loop vertex 3 1.5 12.2984 vertex 3 1.5 0 vertex 1.04397e-15 1.5 12.2984 endloop endfacet facet normal 0 1 0 outer loop vertex 8.87675e-16 1.5 13.0023 vertex 1.37961e-16 1.5 16.3787 vertex 5.6264e-16 1.5 14.4661 endloop endfacet facet normal 0 1 0 outer loop vertex 1.37961e-16 1.5 16.3787 vertex 0 1.5 0 vertex 0 1.5 17 endloop endfacet facet normal 0 1 0 outer loop vertex 8.87675e-16 1.5 13.0023 vertex 0 1.5 0 vertex 1.37961e-16 1.5 16.3787 endloop endfacet facet normal 0 1 0 outer loop vertex 1.04397e-15 1.5 12.2984 vertex 0 1.5 0 vertex 8.87675e-16 1.5 13.0023 endloop endfacet facet normal 0 1 0 outer loop vertex 0 1.5 0 vertex 1.04397e-15 1.5 12.2984 vertex 3 1.5 0 endloop endfacet facet normal 0 0 -1 outer loop vertex 0 -1.5 0 vertex 3 1.5 0 vertex 3 -1.5 0 endloop endfacet facet normal -0 0 -1 outer loop vertex 3 1.5 0 vertex 0 -1.5 0 vertex 0 1.5 0 endloop endfacet facet normal 0 -1 0 outer loop vertex 6.95142e-16 -1.5 13.8694 vertex 1.04397e-15 -1.5 12.2984 vertex 9.72262e-16 -1.5 12.6213 endloop endfacet facet normal nan nan nan outer loop vertex 0 -1.5 17 vertex 1.04397e-15 -1.5 12.2984 vertex 6.95142e-16 -1.5 13.8694 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 -1.5 0 vertex 0.648187 -1.5 12.2984 vertex 1.04397e-15 -1.5 12.2984 endloop endfacet facet normal 0 -1 0 outer loop vertex 0 -1.5 0 vertex 1.04397e-15 -1.5 12.2984 vertex 0 -1.5 17 endloop endfacet facet normal 0 -1 0 outer loop vertex 3 -1.5 0 vertex 0.648187 -1.5 12.2984 vertex 0 -1.5 0 endloop endfacet facet normal 0 -1 0 outer loop vertex 0.648187 -1.5 12.2984 vertex 3 -1.5 0 vertex 3 -1.5 12.2984 endloop endfacet facet normal -1 1.12813e-22 -2.22045e-16 outer loop vertex -2.03945e-31 -5 17 vertex -4.24864e-16 -4.6194 18.9134 vertex 7.85046e-16 -3.53553 13.4645 endloop endfacet facet normal 0 0.195089 -0.980785 outer loop vertex 1.04397e-15 1.5 12.2984 vertex 3 1.91342 12.3806 vertex 3 1.5 12.2984 endloop endfacet facet normal 0 0.195089 -0.980785 outer loop vertex 3 1.91342 12.3806 vertex 1.04397e-15 1.5 12.2984 vertex 1.02571e-15 1.91342 12.3806 endloop endfacet facet normal -1 0 0 outer loop vertex 3 1.91342 12.3806 vertex 3 0 12 vertex 3 1.5 12.2984 endloop endfacet facet normal 1 0 0 outer loop vertex 3 1.91342 21.6194 vertex 3 6.12323e-16 22 vertex 3 3.53553 13.4645 endloop endfacet facet normal -1 0 -2.22045e-16 outer loop vertex 6.95142e-16 -1.5 13.8694 vertex 7.85046e-16 -3.53553 13.4645 vertex 0 -1.5 17 endloop endfacet facet normal -1 0 -2.22045e-16 outer loop vertex 0 -1.5 17 vertex -4.24864e-16 -4.6194 18.9134 vertex 0 3.83653e-15 17 endloop endfacet facet normal -1 -3.13547e-23 -2.22045e-16 outer loop vertex -4.24864e-16 -4.6194 18.9134 vertex 0 -1.5 17 vertex 7.85046e-16 -3.53553 13.4645 endloop endfacet facet normal -1 4.51806e-23 -2.22045e-16 outer loop vertex 5.6264e-16 1.5 14.4661 vertex 1.37961e-16 1.5 16.3787 vertex 4.24864e-16 4.6194 15.0866 endloop endfacet facet normal 1 0 0 outer loop vertex 3 3.53553 13.4645 vertex 3 0 12 vertex 3 1.91342 12.3806 endloop endfacet facet normal 1 0 0 outer loop vertex 3 3.53553 13.4645 vertex 3 -1.91342 12.3806 vertex 3 0 12 endloop endfacet facet normal 1 0 -0 outer loop vertex 3 -1.91342 12.3806 vertex 3 3.53553 13.4645 vertex 3 -3.53553 13.4645 endloop endfacet facet normal -1 -1.92759e-22 -2.22045e-16 outer loop vertex 4.24864e-16 -4.6194 15.0866 vertex -2.03945e-31 -5 17 vertex 7.85046e-16 -3.53553 13.4645 endloop endfacet facet normal -0 0.19509 0.980785 outer loop vertex -1.02571e-15 1.91342 21.6194 vertex 3 6.12323e-16 22 vertex 3 1.91342 21.6194 endloop endfacet facet normal 0 0.19509 0.980785 outer loop vertex 3 6.12323e-16 22 vertex -1.02571e-15 1.91342 21.6194 vertex -1.11022e-15 6.12323e-16 22 endloop endfacet facet normal 1 0 0 outer loop vertex 3 5 17 vertex 3 1.91342 21.6194 vertex 3 3.53553 13.4645 endloop endfacet facet normal 0 0.980785 0.19509 outer loop vertex 3 5 17 vertex -4.24864e-16 4.6194 18.9134 vertex 3 4.6194 18.9134 endloop endfacet facet normal 0 0.980785 0.19509 outer loop vertex -4.24864e-16 4.6194 18.9134 vertex 3 5 17 vertex 6.79816e-32 5 17 endloop endfacet facet normal -1 5.88254e-23 -2.22045e-16 outer loop vertex 1.02571e-15 1.91342 12.3806 vertex 4.24864e-16 4.6194 15.0866 vertex 7.85046e-16 3.53553 13.4645 endloop endfacet facet normal 1 0 0 outer loop vertex 3 3.53553 20.5355 vertex 3 1.91342 21.6194 vertex 3 4.6194 18.9134 endloop endfacet facet normal 0 -0.55557 0.831469 outer loop vertex 3 -1.91342 21.6194 vertex -7.85046e-16 -3.53553 20.5355 vertex 3 -3.53553 20.5355 endloop endfacet facet normal 0 -0.55557 0.831469 outer loop vertex -7.85046e-16 -3.53553 20.5355 vertex 3 -1.91342 21.6194 vertex -1.02571e-15 -1.91342 21.6194 endloop endfacet facet normal 1 0 -0 outer loop vertex 3 -3.53553 13.4645 vertex 3 -1.91342 21.6194 vertex 3 -5 17 endloop endfacet facet normal 0 0.980785 -0.19509 outer loop vertex 4.24864e-16 4.6194 15.0866 vertex 6.79816e-32 5 17 vertex 3 5 17 endloop endfacet facet normal -1 -1.06458e-22 -2.22044e-16 outer loop vertex -1.02571e-15 -1.91342 21.6194 vertex -1.11022e-15 6.12323e-16 22 vertex -7.85046e-16 -3.53553 20.5355 endloop endfacet facet normal 0 0.83147 -0.55557 outer loop vertex 7.85046e-16 3.53553 13.4645 vertex 4.24864e-16 4.6194 15.0866 vertex 3 3.53553 13.4645 endloop endfacet facet normal 0 0.83147 0.55557 outer loop vertex 3 4.6194 18.9134 vertex -7.85046e-16 3.53553 20.5355 vertex 3 3.53553 20.5355 endloop endfacet facet normal 0 0.83147 0.55557 outer loop vertex -7.85046e-16 3.53553 20.5355 vertex 3 4.6194 18.9134 vertex -4.24864e-16 4.6194 18.9134 endloop endfacet facet normal 1 0 -0 outer loop vertex 3 4.6194 15.0866 vertex 3 5 17 vertex 3 3.53553 13.4645 endloop endfacet facet normal 0 0.55557 -0.831469 outer loop vertex 1.02571e-15 1.91342 12.3806 vertex 3 3.53553 13.4645 vertex 3 1.91342 12.3806 endloop endfacet facet normal 0 0.55557 -0.831469 outer loop vertex 3 3.53553 13.4645 vertex 1.02571e-15 1.91342 12.3806 vertex 7.85046e-16 3.53553 13.4645 endloop endfacet facet normal 0 0.980785 -0.19509 outer loop vertex 3 4.6194 15.0866 vertex 4.24864e-16 4.6194 15.0866 vertex 3 5 17 endloop endfacet facet normal 0 0.83147 -0.55557 outer loop vertex 3 3.53553 13.4645 vertex 4.24864e-16 4.6194 15.0866 vertex 3 4.6194 15.0866 endloop endfacet facet normal -1 3.21265e-22 -2.22044e-16 outer loop vertex 6.79816e-32 5 17 vertex -7.85046e-16 3.53553 20.5355 vertex -4.24864e-16 4.6194 18.9134 endloop endfacet facet normal -1 1.6875e-23 -2.22045e-16 outer loop vertex 7.85046e-16 -3.53553 13.4645 vertex 6.95142e-16 -1.5 13.8694 vertex 9.72262e-16 -1.5 12.6213 endloop endfacet facet normal -1 4.24277e-23 -2.22045e-16 outer loop vertex 5.6264e-16 1.5 14.4661 vertex 4.24864e-16 4.6194 15.0866 vertex 8.87675e-16 1.5 13.0023 endloop endfacet facet normal -1 -2.41147e-22 -2.22045e-16 outer loop vertex 8.87675e-16 1.5 13.0023 vertex 1.02571e-15 1.91342 12.3806 vertex 1.04397e-15 1.5 12.2984 endloop endfacet facet normal -1 -1.00203e-23 -2.22045e-16 outer loop vertex 1.02571e-15 1.91342 12.3806 vertex 8.87675e-16 1.5 13.0023 vertex 4.24864e-16 4.6194 15.0866 endloop endfacet facet normal 0 -0.980785 -0.19509 outer loop vertex 4.24864e-16 -4.6194 15.0866 vertex 3 -5 17 vertex -2.03945e-31 -5 17 endloop endfacet facet normal 0 -0.980785 -0.19509 outer loop vertex 3 -5 17 vertex 4.24864e-16 -4.6194 15.0866 vertex 3 -4.6194 15.0866 endloop endfacet facet normal 0 -0.980785 0.19509 outer loop vertex 3 -4.6194 18.9134 vertex -4.24864e-16 -4.6194 18.9134 vertex -2.03945e-31 -5 17 endloop endfacet facet normal -1 4.67289e-23 -2.22045e-16 outer loop vertex -7.85046e-16 -3.53553 20.5355 vertex -1.11022e-15 6.12323e-16 22 vertex -4.24864e-16 -4.6194 18.9134 endloop endfacet facet normal 0 -0.83147 0.55557 outer loop vertex 3 -3.53553 20.5355 vertex -7.85046e-16 -3.53553 20.5355 vertex 3 -4.6194 18.9134 endloop endfacet facet normal 0 -0.83147 0.55557 outer loop vertex 3 -4.6194 18.9134 vertex -7.85046e-16 -3.53553 20.5355 vertex -4.24864e-16 -4.6194 18.9134 endloop endfacet facet normal 0 -0.19509 0.980785 outer loop vertex 3 6.12323e-16 22 vertex -1.02571e-15 -1.91342 21.6194 vertex 3 -1.91342 21.6194 endloop endfacet facet normal 0 -0.19509 0.980785 outer loop vertex -1.02571e-15 -1.91342 21.6194 vertex 3 6.12323e-16 22 vertex -1.11022e-15 6.12323e-16 22 endloop endfacet facet normal -1 -6.76881e-23 -2.22045e-16 outer loop vertex 4.24864e-16 4.6194 15.0866 vertex -7.85046e-16 3.53553 20.5355 vertex 6.79816e-32 5 17 endloop endfacet facet normal -0 0.55557 0.831469 outer loop vertex -7.85046e-16 3.53553 20.5355 vertex 3 1.91342 21.6194 vertex 3 3.53553 20.5355 endloop endfacet facet normal 0 0.55557 0.831469 outer loop vertex 3 1.91342 21.6194 vertex -7.85046e-16 3.53553 20.5355 vertex -1.02571e-15 1.91342 21.6194 endloop endfacet facet normal 1 0 0 outer loop vertex 3 3.53553 13.4645 vertex 3 6.12323e-16 22 vertex 3 -3.53553 13.4645 endloop endfacet facet normal 1 0 0 outer loop vertex 3 4.6194 18.9134 vertex 3 1.91342 21.6194 vertex 3 5 17 endloop endfacet facet normal -1 -8.65074e-23 -2.22045e-16 outer loop vertex 4.24864e-16 4.6194 15.0866 vertex -1.02571e-15 1.91342 21.6194 vertex -7.85046e-16 3.53553 20.5355 endloop endfacet facet normal -1 3.2132e-22 -2.22044e-16 outer loop vertex 1.02571e-15 -1.91342 12.3806 vertex 9.72262e-16 -1.5 12.6213 vertex 1.04397e-15 -1.5 12.2984 endloop endfacet facet normal -1 2.43309e-22 -2.22044e-16 outer loop vertex 9.72262e-16 -1.5 12.6213 vertex 1.02571e-15 -1.91342 12.3806 vertex 7.85046e-16 -3.53553 13.4645 endloop endfacet facet normal -0 -0.195089 -0.980785 outer loop vertex 0.648187 -1.5 12.2984 vertex 1.02571e-15 -1.91342 12.3806 vertex 1.04397e-15 -1.5 12.2984 endloop endfacet facet normal -1 1.03853e-22 -2.22044e-16 outer loop vertex 0 1.5 17 vertex 4.24864e-16 4.6194 15.0866 vertex 1.37961e-16 1.5 16.3787 endloop endfacet facet normal -1 3.74595e-23 -2.22045e-16 outer loop vertex 4.24864e-16 4.6194 15.0866 vertex 0 1.5 17 vertex -1.02571e-15 1.91342 21.6194 endloop endfacet facet normal -1 0 -2.22045e-16 outer loop vertex 0 3.83653e-15 17 vertex -1.02571e-15 1.91342 21.6194 vertex 0 1.5 17 endloop endfacet facet normal -1 -1.63512e-23 -2.22045e-16 outer loop vertex -1.02571e-15 1.91342 21.6194 vertex 0 3.83653e-15 17 vertex -4.24864e-16 -4.6194 18.9134 endloop endfacet facet normal -1 3.60686e-23 -2.22045e-16 outer loop vertex -4.24864e-16 -4.6194 18.9134 vertex -1.11022e-15 6.12323e-16 22 vertex -1.02571e-15 1.91342 21.6194 endloop endfacet facet normal 0 -0.980785 0.19509 outer loop vertex 3 -4.6194 18.9134 vertex -2.03945e-31 -5 17 vertex 3 -5 17 endloop endfacet facet normal 1 0 0 outer loop vertex 3 -1.91342 21.6194 vertex 3 -3.53553 20.5355 vertex 3 -4.6194 18.9134 endloop endfacet facet normal 1 0 0 outer loop vertex 3 -5 17 vertex 3 -1.91342 21.6194 vertex 3 -4.6194 18.9134 endloop endfacet facet normal 1 0 0 outer loop vertex 3 6.12323e-16 22 vertex 3 -1.91342 21.6194 vertex 3 -3.53553 13.4645 endloop endfacet facet normal -0 -0.55557 -0.831469 outer loop vertex 3 -3.53553 13.4645 vertex 7.85046e-16 -3.53553 13.4645 vertex 1.02571e-15 -1.91342 12.3806 endloop endfacet facet normal 0 -0.83147 -0.55557 outer loop vertex 7.85046e-16 -3.53553 13.4645 vertex 3 -4.6194 15.0866 vertex 4.24864e-16 -4.6194 15.0866 endloop endfacet facet normal 0 -0.83147 -0.55557 outer loop vertex 3 -4.6194 15.0866 vertex 7.85046e-16 -3.53553 13.4645 vertex 3 -3.53553 13.4645 endloop endfacet facet normal 1 0 0 outer loop vertex 3 -3.53553 13.4645 vertex 3 -5 17 vertex 3 -4.6194 15.0866 endloop endfacet facet normal 0 -0.55557 -0.831469 outer loop vertex 3 -3.53553 13.4645 vertex 1.02571e-15 -1.91342 12.3806 vertex 3 -1.91342 12.3806 endloop endfacet facet normal 0 -0.195089 -0.980785 outer loop vertex 3 -1.91342 12.3806 vertex 0.648187 -1.5 12.2984 vertex 3 -1.5 12.2984 endloop endfacet facet normal 0 -0.195089 -0.980785 outer loop vertex 0.648187 -1.5 12.2984 vertex 3 -1.91342 12.3806 vertex 1.02571e-15 -1.91342 12.3806 endloop endfacet facet normal 1 0 0 outer loop vertex 3 -1.5 12.2984 vertex 3 -5.66485e-16 12 vertex 3 0 12 endloop endfacet facet normal -1 -0 -0 outer loop vertex 3 -1.5 12.2984 vertex 3 0 12 vertex 3 -1.91342 12.3806 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/scad/bugs/issue945f.scad0000644000076500000240000000014213402025764022156 0ustar kintelstaff00000000000000// issue945f.stl is exported from issue1258.scad with OpenSCAD-2015.03-3 import("issue945f.stl"); openscad-2019.05/testdata/scad/bugs/issue945f.stl0000644000076500000240000000670713402025764022063 0ustar kintelstaff00000000000000solid OpenSCAD_Model facet normal -0 0 1 outer loop vertex -0.25 28 60 vertex 2.75 -20 60 vertex 2.75 28 60 endloop endfacet facet normal 0 0 1 outer loop vertex 2.75 -20 60 vertex -0.25 28 60 vertex -0.25 -20 60 endloop endfacet facet normal 1 0 0 outer loop vertex 2.75 -20 32 vertex 2.75 -29.6066 22.3934 vertex 2.75 -20 12.7868 endloop endfacet facet normal 1 0 0 outer loop vertex 2.75 -20 32 vertex 2.75 28 60 vertex 2.75 -20 60 endloop endfacet facet normal 1 0 0 outer loop vertex 2.75 28 60 vertex 2.75 -20 32 vertex 2.75 28 0 endloop endfacet facet normal 1 -0 0 outer loop vertex 2.75 -20 12.7868 vertex 2.75 28 0 vertex 2.75 -20 32 endloop endfacet facet normal 1 0 0 outer loop vertex 2.75 28 0 vertex 2.75 -20 12.7868 vertex 2.75 -20 0 endloop endfacet facet normal 0 1 -0 outer loop vertex 2.75 28 0 vertex -0.25 28 60 vertex 2.75 28 60 endloop endfacet facet normal 0 1 0 outer loop vertex -0.25 28 60 vertex 2.75 28 0 vertex -0.25 28 0 endloop endfacet facet normal 0 0 -1 outer loop vertex -0.25 -20 0 vertex 2.75 28 0 vertex 2.75 -20 0 endloop endfacet facet normal -0 0 -1 outer loop vertex 2.75 28 0 vertex -0.25 -20 0 vertex -0.25 28 0 endloop endfacet facet normal 0 -1 0 outer loop vertex -0.25 -20 60 vertex -0.25 -20 32 vertex 2.75 -20 60 endloop endfacet facet normal 0 -1 0 outer loop vertex -0.25 -20 0 vertex -0.25 -20 32 vertex -0.25 -20 60 endloop endfacet facet normal 0 -1 0 outer loop vertex -0.25 -20 0 vertex -0.249999 -20 12.7868 vertex -0.25 -20 32 endloop endfacet facet normal 0 -1 0 outer loop vertex -0.25 -20 0 vertex 2.75 -20 12.7868 vertex -0.249999 -20 12.7868 endloop endfacet facet normal 0 -1 -0 outer loop vertex 2.75 -20 12.7868 vertex -0.25 -20 0 vertex 2.75 -20 0 endloop endfacet facet normal 0 -1 -0 outer loop vertex 2.75 -20 60 vertex -0.25 -20 32 vertex 2.75 -20 32 endloop endfacet facet normal -1 0 0 outer loop vertex -0.25 -20 0 vertex -0.25 28 60 vertex -0.25 28 0 endloop endfacet facet normal -1 -0 0 outer loop vertex -0.25 28 60 vertex -0.25 -20 0 vertex -0.25 -20 60 endloop endfacet facet normal 0 -0.707107 0.707107 outer loop vertex -0.249999 -29.6066 22.3934 vertex 2.75 -20 32 vertex -0.25 -20 32 endloop endfacet facet normal 0 -0.707107 0.707107 outer loop vertex 2.75 -20 32 vertex -0.249999 -29.6066 22.3934 vertex 2.75 -29.6066 22.3934 endloop endfacet facet normal -1 -4.4983e-08 -4.4983e-08 outer loop vertex -0.249999 -29.6066 22.3934 vertex -0.25 -20 32 vertex -0.249999 -20 12.7868 endloop endfacet facet normal 0 -0.707107 -0.707107 outer loop vertex -0.249999 -20 12.7868 vertex 2.75 -29.6066 22.3934 vertex -0.249999 -29.6066 22.3934 endloop endfacet facet normal 0 -0.707107 -0.707107 outer loop vertex 2.75 -29.6066 22.3934 vertex -0.249999 -20 12.7868 vertex 2.75 -20 12.7868 endloop endfacet endsolid OpenSCAD_Model openscad-2019.05/testdata/scad/customizer/allexpressionscomment.scad0000644000076500000240000000311413402025764026322 0ustar kintelstaff00000000000000a = true;//parameter //description b = false;//parameter //description c = undef;//parameter //description d = a;//parameter //description e = $fn;//parameter //description f1 = [1,,];//parameter //description f2 = [1,2,3];//parameter //description g = f2.x + f2.y + f2.z;//parameter //description h1 = [2:5];//parameter //description h2 = [1:2:10];//parameter //description i = h2.begin - h2.step - h2.end;//parameter //description j = "test";//parameter //description k = 1.23e-2;//parameter //description l = a * b;//parameter //description m = a / b;//parameter //description n = a % b;//parameter //description o = c < d;//parameter //description p = c <= d;//parameter //description q = c == d;//parameter //description r = c != d;//parameter //description s = c >= d;//parameter //description t = c > d;//parameter //description u = e && g;//parameter //description v = e || g;//parameter //description w = +i;//parameter //description x = -i;//parameter //description y = !i;//parameter //description z = (j);//parameter //description aa = k ? l : m;//parameter //description bb = n[o];//parameter //description cc = let(a=1) a;//parameter //description dd = [for (a=[0,1]) let(b=a) if (true) b];//parameter //description ee = ["abc", for (a=[0,1]) let(b=a) if (true) b, true, for(c=[1:3]) c, 3];//parameter //description ff = [for (a=[0,1]) if (a == 0) "A" else ( "B" )];//parameter //description gg = [each [ "a", 0, false ]];//parameter //description hh = [for (a = [0 : 3]) if (a < 2) ( if (a < 1) ["+", a] ) else ["-", a] ];//parameter //description ii = [for (a=0,b=1;a < 5;a=a+1,b=b+2) [a,b*b] ]; openscad-2019.05/testdata/scad/customizer/allfunctionscomment.scad0000644000076500000240000000231313402025764025750 0ustar kintelstaff00000000000000a = abs();//parameter //description b = sign();//parameter //description c = rands();//parameter //description d = min();//parameter //description e = max();//parameter //description f = sin();//parameter //description g = cos();//parameter //description h = asin();//parameter //description i = acos();//parameter //description j = tan();//parameter //description k = atan();//parameter //description l = atan2();//parameter //description m = round();//parameter //description n = ceil();//parameter //description o = floor();//parameter //description p = pow();//parameter //description q = sqrt();//parameter //description r = exp();//parameter //description ra = len();//parameter //description s = log();//parameter //description t = ln();//parameter //description u = str();//parameter //description ua = chr();//parameter //description ub = concat();//parameter //description v = lookup();//parameter //description va = search();//parameter //description y = version();//parameter //description z = version_num();//parameter //description za = norm();//parameter //description zb = cross();//parameter //description zc = parent_module();//parameter //description w = dxf_dim();//parameter //description x = dxf_cross(); openscad-2019.05/testdata/scad/customizer/allmodulescomment.scad0000644000076500000240000000265113402025764025415 0ustar kintelstaff00000000000000minkowski();//parameter //description hull();//parameter //description resize();//parameter //description child();//parameter //description echo();//parameter //description assign();//parameter //description for();//parameter //description intersection_for();//parameter //description if(false) { cube(); } else { sphere(); }//parameter //description union();//parameter //description difference();//parameter //description intersection();//parameter //description dxf_linear_extrude();//parameter //description linear_extrude();//parameter //description dxf_rotate_extrude();//parameter //description rotate_extrude();//parameter //description import();//parameter //description import_stl();//parameter //description import_off();//parameter //description import_dxf();//parameter //description group();//parameter //description cube();//parameter //description sphere();//parameter //description cylinder();//parameter //description polyhedron();//parameter //description square();//parameter //description circle();//parameter //description polygon();//parameter //description projection();//parameter //description render();//parameter //description surface();//parameter //description scale();//parameter //description rotate();//parameter //description mirror();//parameter //description translate();//parameter //description multmatrix();//parameter //description color();//parameter //description offset();//parameter //description text(); openscad-2019.05/testdata/scad/customizer/description.scad0000644000076500000240000000131113402025764024204 0ustar kintelstaff00000000000000//alone Description at Top //normal description x=50; // normal starting width spaces description x2=45; // normal starting tab spaces description x3=3; // normal comment starting with space before // x4=3; // normal comment starting with tab before // x5=3; // double description x5=3; // x6=12; x7=12; // comment x8=12; // description sandwiched between two assignments x9=23; x8=12; // comment sandwiched between two assignments x19=23; x10=23; x11=23; x12=23; // normal comment starting with tab before // x13=3; // double description x13=7; // double description // normal comment starting with tab before // x14=3; openscad-2019.05/testdata/scad/customizer/group.scad0000644000076500000240000000206113402025764023020 0ustar kintelstaff00000000000000// combo box for number Numbers=2; // [0, 1, 2, 3] // combo box for string Strings="foo"; // [foo, bar, baz] //labeled combo box for numbers Labeled_values=10; // [10:L, 20:M, 30:L] //labeled combo box for string Labeled_value="S"; // [S:Small, M:Medium, L:Large] /*[ Global ]*/ // slider widget for number slider =34; // [10:100] //step slider for number stepSlider=2; //[0:5:100] /* [Hidden] */ //description Variable = true; //comment /*[Global] */ // spinbox with step size 23 Spinbox = 5; //23 /* [Textbox] */ //Text box for vector with more than 4 elements Vector=[12,34,44,43,23,23];//comment // Text box for string String="hello"; //comment /* [Special vector] */ //Text box for vector with less than or equal to 4 elements Vector2=[12,34,45,23]; //any thing // Norma; text String2="hello"; //comment with " /* [group after " in previous comment ] */ //Text box for vector with less than or equal to 4 elements Vector3=[12,34,45,23]; //any thing /* [ multiple ] [ group ] [ names ] */ Vector4=[]; //empty vector (see #2105 and #2183) echo(String); openscad-2019.05/testdata/scad/customizer/parameter.scad0000644000076500000240000000150713402025764023650 0ustar kintelstaff00000000000000x=1; x1=1; //12 x2=1; //12 x3=1; // 12 x4=1; // 12 x5=1; //[1:12] x6=1; //[1:2:12] x7=1; //[1:12 x8=1; //[1 12] x9=1; //[1:12] //[12:34] x10=1; // x11=1; // x12=1; //[12] x13=10; // [10:Small, 20:Medium, 30:Large] x13a=10; // [10:Small, 20: 34 Medium, 30:Large 12] x14=10; //[10:100, 20:101, 30:102] x15=10; //parameter x16=10; //[0, 1, 2, 3] x17="text"; // parameter x18="text"; //[foo, bar, baz] x19="text"; //[0:text, 1:foo, 2:bar, 3:hello] x20="text"; //[foo:10, bar:10, baz:30] x21="text"; //[foo:yes, bar:no, baz:mgiht] x22=[12,34]; //[23,4] x23=[12,34]; //[23,4,23,4,45] x24=[12,34,2,3,41,23]; //[23,4,2,3,4,6] x25=12; x26="text"; //[1:34] x27=12; //end parameter x28=-12; x29=!1; x30=["new","secon"]; x31=["new","second"]; //[new,second] x32=["new","second"]; //["new",second] openscad-2019.05/testdata/scad/customizer/setofparameter.json0000644000076500000240000000315313402025764024747 0ustar kintelstaff00000000000000{ "parameterSets": { "firstSet": { "Labeled_value": " \/*New *\/ ", "Labeled_values": "100", "Numbers": "1", "Spinbox": "35", "String": "hello", "Strings": "foo", "Variable": "false", "Vector": "[2, 34, 45, 12, 3, 56]", "Vector2": "[12,4, 45, 23]", "slider": "38", "stepSlider": "12", "stringVector": "[hello, new, 12]" }, "wrongSetValues": { "Labeled_value": "S new", "Labeled_values": "wrong type", "Numbers": "2", "Spinbox": "5", "String": "1234", "Strings": "fo", "Variable": "true", "Vector": "12, 34, 44, 43, 2, 23", "Vector2": "[12, 34, 45, 23]", "slider": "34", "stepSlider": "2" }, "thirdSet": { "Labeled_value": "S new", "non existing": "value", "nonparameter": "second", "stringVector": "[ \" hello\",\" new \"]" }, "Name.dot": { "Labeled_value": "S", "Labeled_values": "10", "Numbers": "2", "Spinbox": "5", "String": "withDotInSetName", "Strings": "foo", "Variable": "false", "Vector": "[12, 34, 44, 43, 23, 23]", "Vector2": "[12, 34, 45, 23]", "nonparameter": "newWithDot", "slider": "80", "stepSlider": "2", "stringVector": "[\"1\", \"2\"]" } }, "fileFormatVersion": "1" } openscad-2019.05/testdata/scad/customizer/setofparameter.scad0000644000076500000240000000151713402025764024712 0ustar kintelstaff00000000000000/* [Drop down box:] */ // combo box for number Numbers=2; // [0, 1, 2, 3] // combo box for string Strings="foo"; //labeled combo box for numbers Labeled_values=10; // [10:L, 20:M, 30:L] //labeled combo box for string Labeled_value="S"; // [S:Small, M:Medium, L:Large] /*[ Slider ]*/ // slider widget for number slider =34; // [10:100] //step slider for number stepSlider=2; //[0:5:100] /* [Checkbox] */ //description Variable = true; //comment /*[Spinbox] */ // spinbox with step size 23 Spinbox = 5; //23 /* [Textbox] */ //Text box for vector with more than 4 elements Vector=[12,34,44,43,23,23];//comment // Text box for string String="hello"; //comment /* [Special vector] */ //Text box for vector with less than or equal to 4 elements Vector2=[12,34,45,23]; //any thing nonparameter="new"; stringVector=["1","2"]; echo(String); openscad-2019.05/testdata/scad/dxf/arc.scad0000644000076500000240000000012613402025764021006 0ustar kintelstaff00000000000000import("../../dxf/arc.dxf"); translate([110,0]) import("../../dxf/arc.dxf", $fn=0.1); openscad-2019.05/testdata/scad/dxf/circle-advanced.scad0000644000076500000240000000005113402025764023242 0ustar kintelstaff00000000000000import("../../dxf/circle-advanced.dxf"); openscad-2019.05/testdata/scad/dxf/circle-double.scad0000644000076500000240000000004713402025764022754 0ustar kintelstaff00000000000000import("../../dxf/circle-double.dxf"); openscad-2019.05/testdata/scad/dxf/circle-small.scad0000644000076500000240000000004613402025764022611 0ustar kintelstaff00000000000000import("../../dxf/circle-small.dxf"); openscad-2019.05/testdata/scad/dxf/circle.scad0000644000076500000240000000013613402025764021503 0ustar kintelstaff00000000000000import("../../dxf/circle.dxf"); translate([210,0,0]) import("../../dxf/circle.dxf", $fn=0.1); openscad-2019.05/testdata/scad/dxf/ellipse-arc-rot.scad0000644000076500000240000000005113402025764023240 0ustar kintelstaff00000000000000import("../../dxf/ellipse-arc-rot.dxf"); openscad-2019.05/testdata/scad/dxf/ellipse-arc.scad0000644000076500000240000000004513402025764022441 0ustar kintelstaff00000000000000import("../../dxf/ellipse-arc.dxf"); openscad-2019.05/testdata/scad/dxf/ellipse-reverse.scad0000644000076500000240000000005113402025764023344 0ustar kintelstaff00000000000000import("../../dxf/ellipse-reverse.dxf"); openscad-2019.05/testdata/scad/dxf/ellipse-rot.scad0000644000076500000240000000004513402025764022500 0ustar kintelstaff00000000000000import("../../dxf/ellipse-rot.dxf"); openscad-2019.05/testdata/scad/dxf/ellipse.scad0000644000076500000240000000004113402025764021672 0ustar kintelstaff00000000000000import("../../dxf/ellipse.dxf"); openscad-2019.05/testdata/scad/dxf/lwpolyline-closed.scad0000644000076500000240000000005313402025764023705 0ustar kintelstaff00000000000000import("../../dxf/lwpolyline-closed.dxf"); openscad-2019.05/testdata/scad/dxf/lwpolyline.scad0000644000076500000240000000004413402025764022436 0ustar kintelstaff00000000000000import("../../dxf/lwpolyline.dxf"); openscad-2019.05/testdata/scad/dxf/lwpolyline2.scad0000644000076500000240000000004513402025764022521 0ustar kintelstaff00000000000000import("../../dxf/lwpolyline2.dxf"); openscad-2019.05/testdata/scad/dxf/multiple-layers.scad0000644000076500000240000000005113402025764023366 0ustar kintelstaff00000000000000import("../../dxf/multiple-layers.dxf"); openscad-2019.05/testdata/scad/dxf/nothing-decimal-comma-separated.scad0000644000076500000240000000021513402025764026342 0ustar kintelstaff00000000000000// This tests should not crash but produce no visible result, see former issue 593. import("../../dxf/nothing-decimal-comma-separated.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-concave-hole.scad0000644000076500000240000000005613402025764024273 0ustar kintelstaff00000000000000import("../../dxf/polygon-concave-hole.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-concave-simple.scad0000644000076500000240000000006013402025764024630 0ustar kintelstaff00000000000000import("../../dxf/polygon-concave-simple.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-concave.scad0000644000076500000240000000005113402025764023341 0ustar kintelstaff00000000000000import("../../dxf/polygon-concave.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-holes-touch.scad0000644000076500000240000000005513402025764024161 0ustar kintelstaff00000000000000import("../../dxf/polygon-holes-touch.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-intersect.scad0000644000076500000240000000005313402025764023725 0ustar kintelstaff00000000000000import("../../dxf/polygon-intersect.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-many-holes.scad0000644000076500000240000000005413402025764024002 0ustar kintelstaff00000000000000import("../../dxf/polygon-many-holes.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-mesh.scad0000644000076500000240000000004613402025764022663 0ustar kintelstaff00000000000000import("../../dxf/polygon-mesh.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-overlap.scad0000644000076500000240000000012413402025764023374 0ustar kintelstaff00000000000000// Polygon with one duplicate line segment import("../../dxf/polygon-overlap.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-riser.scad0000644000076500000240000000004713402025764023054 0ustar kintelstaff00000000000000import("../../dxf/polygon-riser.dxf"); openscad-2019.05/testdata/scad/dxf/polygon-self-intersect.scad0000644000076500000240000000006013402025764024652 0ustar kintelstaff00000000000000import("../../dxf/polygon-self-intersect.dxf"); openscad-2019.05/testdata/scad/dxf/polygon8.scad0000644000076500000240000000004213402025764022015 0ustar kintelstaff00000000000000import("../../dxf/polygon8.dxf"); openscad-2019.05/testdata/scad/dxf/polygons.scad0000644000076500000240000000004213402025764022110 0ustar kintelstaff00000000000000import("../../dxf/polygons.dxf"); openscad-2019.05/testdata/scad/dxf/transform-insert.scad0000644000076500000240000000005213402025764023554 0ustar kintelstaff00000000000000import("../../dxf/transform-insert.dxf"); openscad-2019.05/testdata/scad/dxf/triangle-with-duplicate-vertex.scad0000644000076500000240000000007013402025764026300 0ustar kintelstaff00000000000000import("../../dxf/triangle-with-duplicate-vertex.dxf"); openscad-2019.05/testdata/scad/functions/assert-expression-fail1-test.scad0000644000076500000240000000003413402025764027133 0ustar kintelstaff00000000000000v = assert(false); echo(v); openscad-2019.05/testdata/scad/functions/assert-expression-fail2-test.scad0000644000076500000240000000011713402025764027136 0ustar kintelstaff00000000000000a = 10; b = 20; v = assert(a < 20 && b < 20, "Test! &"); echo(v); openscad-2019.05/testdata/scad/functions/assert-expression-fail3-test.scad0000644000076500000240000000012413402025764027135 0ustar kintelstaff00000000000000function f(x) = sin(x); module m(angle) { v = assert(f(angle) > 0) 10; } m(270); openscad-2019.05/testdata/scad/functions/assert-expression-tests.scad0000644000076500000240000000072013402025764026326 0ustar kintelstaff00000000000000a = 3; b = 6; t0 = assert(true); echo(t0 = t0); t1 = assert("t1"); echo(t1 = t1); t2 = assert(a*b); echo(t2 = t2); t3 = assert(condition = a*b); echo(t3 = t3); t4 = assert(true) a*b; echo(t4 = t4); c = 2; t5 = assert(condition = 2) a*b*c; echo(t5 = t5); d = c + 9; t6 = assert(condition = d + 5 > 15, message = str("value: ", d + 5)) a*b*c*d; echo(t6 = t6); t7 = assert(true) [a,b]; echo(t7 = t7); t8 = assert(true) [for (i=[1:a]) [i,b]]; echo(t8 = t8); openscad-2019.05/testdata/scad/functions/cross-tests.scad0000644000076500000240000000102213402025764023755 0ustar kintelstaff00000000000000echo(cross([2, 3, 4], [5, 6, 7])); echo(cross([2, 1, -3], [0, 4, 5])); echo(cross([2, 1, -3], cross([2, 3, 4], [5, 6, 7]))); echo(cross([2, 0/0, -3], [0, 4, 5])); echo(cross([2, 1/0, -3], [0, 4, 5])); echo(cross([2, -1/0, -3], [0, 4, 5])); echo(cross(0)); echo(cross(0, 1)); echo(cross(0, "a")); echo(cross(0, 1, 3)); echo(cross([0], [1])); echo(cross([1, 2, 3], [1, 2])); echo(cross([1, 2, 3], [1, 2, "a"])); echo(cross([1, 2, 3], [1, 2, [0]])); echo(cross([1, 2, 3], [1, 2, [1:2]])); // 2D cross echo(cross([2, 3], [5, 6])); openscad-2019.05/testdata/scad/functions/echo-expression-tests.scad0000644000076500000240000000117513402025764025750 0ustar kintelstaff00000000000000a = 3; b = 6; c = 8; v = [2, 5, 7]; t0 = echo(); echo(t0 = t0); t1 = echo() undef; echo(t1 = t1); t2 = echo("t2"); echo(t2 = t2); t3 = echo(a*b); echo(t3 = t3); t4 = echo(c = a*b); echo(t4 = t4); t5 = echo() a*b; echo(t5 = t5); t6 = echo(c = 2) a*b*c; echo(t6 = t6); t7 = echo() [a,b]; echo(t7 = t7); t8 = echo() [for (i=[1:a]) [i,b]]; echo(t8 = t8); function f1(x) = [ for (a = x) echo(a = a) a ]; echo("f1(v) = ", f1(v)); function f2(x, i = 0) = echo(i) len(x) > i ? x[i] + f2(x, i + 1) : 0; echo("f2(v) = ", f2(v)); function f3(x, i = 0) = len(x) > i ? let(a = x[i] + f3(x, i + 1)) echo(a) a : 0; echo("f3(v) = ", f3(v)); openscad-2019.05/testdata/scad/functions/inf-tests.scad0000644000076500000240000000173713402025764023415 0ustar kintelstaff00000000000000echo("0/0",0/0); echo("-0/0",-0/0); echo("0/-0",0/-0); echo("1/0",1/0); echo("1/-0",1/-0); echo("-1/0",-1/0); echo("-1/-0",-1/-0); echo("sin(1/0)",sin(1/0)); echo("cos(1/0)",cos(1/0)); echo("tan(1/0)",tan(1/0)); echo("asin(1/0)",asin(1/0)); echo("acos(1/0)",acos(1/0)); echo("atan(1/0)",atan(1/0)); echo("atan(-1/0)",atan(-1/0)); echo("atan2(1/0, -1/0)",atan2(1/0, -1/0)); echo("ceil(-1/0)",ceil(-1/0)); echo("ceil(1/0)",ceil(1/0)); echo("floor(-1/0)",floor(-1/0)); echo("floor(1/0)",floor(1/0)); echo("exp(1/0)",exp(1/0)); echo("exp(-1/0)",exp(-1/0)); echo("ln(1/0)",ln(1/0)); echo("ln(-1/0)",ln(-1/0)); echo("log(1/0)",log(1/0)); echo("log(-1/0)",log(-1/0)); echo("max(-1/0, 1/0)",max(-1/0, 1/0)); echo("min(-1/0, 1/0)",min(-1/0, 1/0)); echo("pow(2, 1/0)",pow(2, 1/0)); echo("pow(2, -1/0)",pow(2, -1/0)); echo("round(1/0)",round(1/0)); echo("round(-1/0)",round(-1/0)); echo("sign(1/0)",sign(1/0)); echo("sign(-1/0)",sign(-1/0)); echo("sqrt(1/0)",sqrt(1/0)); echo("sqrt(-1/0)",sqrt(-1/0)); openscad-2019.05/testdata/scad/functions/len-tests.scad0000644000076500000240000000024113402025764023404 0ustar kintelstaff00000000000000a=[1,2,3,4]; b="abcd"; c=[]; d=""; e=[[1,2,3,4],[1,2,3]]; echo(len(a)); echo(len(b)); echo(len(c)); echo(len(d)); echo(len(e)); echo(len(e[1])); echo(len(e[2]));openscad-2019.05/testdata/scad/functions/let-test-single.scad0000644000076500000240000000003313402025764024505 0ustar kintelstaff00000000000000c = let(c=1) [c]; echo(c); openscad-2019.05/testdata/scad/functions/let-tests.scad0000644000076500000240000000103113423115164023405 0ustar kintelstaff00000000000000$a = 1; b = 1; echo(let() $a*b); echo(let($a=2,b=3) $a*b); echo(let(b=2,$a=3) $a*b); echo(let($a=2) $a*b); echo(let(b=3) $a*b); echo(let($a=2,b=3,$a=4) $a*b); echo(let($a=2,b=3,b=5) $a*b); echo(let($a=2,b=3,$a=4,b=5) $a*b); echo(let($a=2,b=$a*3) $a*b); echo(let($a=2*b,b=3) $a*b); echo(let($a=2*b,b=$a*3) $a*b); echo(let(b=$a*3,$a=2*b) $a*b); echo(let(b=$a,$a=b) [$a, b]); echo(let(b=2*$a,$a=b) [for (i=[1:b]) [i,$a]]); //functions and modules can have unnamend parameters //but this does not make sense for let let(42); let(1,2,3,4); openscad-2019.05/testdata/scad/functions/list-comprehensions.scad0000644000076500000240000000327013402025764025500 0ustar kintelstaff00000000000000y=0; z=1; echo([]); echo([let(x=2) 1]); echo([let(x=2) x]); echo([let(x=2) x]); echo([if(y) 1]); echo([if(z) 1]); echo([for(x=[y,z]) x]); echo([for(x=[y:z]) x]); echo([for(x=[0:-1:10]) x]); echo([for(x=[10:1:0]) x]); echo([for(x=[0:10]) x]); echo([for(x=[0:3],y=[10:13]) [x,y]]); echo([for(x=[0:3]) for(y=[10:13]) [x,y]]); echo([for(x=[0:3]) [ for(y=[10:13]) [x,y] ] ]); echo([for(x=[0:3]) if(x==1) [ for(y=[10:13]) if(y != 11) [x,y] ] ]); a = [for(x=[0:3]) [ for(y=[10:13]) [x,y] ] ]; echo(a); echo([ for (a = "") a ]); echo([ for (a = "a\u2191b\U01f600") a ]); echo([ for(i=a) for(j=i) j ]); echo([ for(i=a) for(j=i) for(k=j) k ]); echo([ for(i=a,j=i) j ]); echo([ for(i=a,j=i,k=j) k ]); echo([ for (a=[0:1]) a]); echo([ for (a=[0:1]) if (true) a]); echo([ for (a=[0:1]) if (true) if (true) a]); echo([ for (a=[0:1]) for (b=[a:2]) [b,a]]); echo([ for (a=[0:1]) if (true) for (b=[a:2]) [b,a]]); echo([ for (a=[0:1]) if (true) if (true) for (b=[a:2]) [b,a]]); echo([ -1, for (a = [0:1:3]) a, for (b = [3:-1:0]) b, -1 ]); echo([ for (a = [2:3]) a * 2, for (a = [5:9]) if ((a % 2) == 0) [ a, a + 1 ] , -1 ]); echo([ for (a = [0,1,2]) if (a == 1) "-" else "+" ]); echo([ for (a = [0,1,2]) if (a > 0) if (a == 1) "A" else "B" ]); echo([ for (a = [0,1,2]) if (a > 0) if (a == 1) "A" else "B" else "-" ]); echo([ for (a = [0 : 3]) if (a < 2) if (a < 1) ["+", a] else ["-", a] ]); echo([ for (a = [0 : 3]) if (a < 2) ( if (a < 1) ["+", a] ) else ["-", a] ]); echo([ for (a = [2 : 4]) each [ a, a*a ] ]); function f() = [ for (a = [0 : 4]) pow(2, a) ]; echo([ each ["a", "b"], each [-5 : -2 : -9], each f(), each "c", each 42, each true ]); echo([ for (i=2;i<=10;i=i+2) i ]); echo([ for (i=1,n=1;i<=4;i=i+1,n=(n+i)*i) [i,n] ]); openscad-2019.05/testdata/scad/functions/min-max-tests.scad0000644000076500000240000000120313402025764024173 0ustar kintelstaff00000000000000echo(min()); echo(max()); echo(min([])); echo(max([])); echo(min(undef)); echo(max(undef)); echo(min("a")); echo(max("b")); echo(min(0)); echo(max(0)); echo(min([0])); echo(max([0])); echo(min(0,1)); echo(max(0,1)); echo(min(0,1,2)); echo(max(0,1,2)); echo(min(0,2,1)); echo(max(0,2,1)); echo(min(1,0,2)); echo(max(1,0,2)); echo(min(2,1,0)); echo(max(2,1,0)); echo(min("a","b")); echo(max("a","b")); echo(min([0,1,2,3,4,5])); echo(max([0,1,2,3,4,5])); echo(min([5,4,3,2,1,0])); echo(max([5,4,3,2,1,0])); echo(min([5,4,3,0,1,2])); echo(max([2,4,3,5,1,0])); // TODO: What should these do? //echo(min([[1,2],[3,4]])); //echo(max([[1,2],[3,4]])); openscad-2019.05/testdata/scad/functions/norm-tests.scad0000644000076500000240000000071613402025764023610 0ustar kintelstaff00000000000000u=undef; echo(norm([])); echo(norm([1])); echo(norm([1,2])); echo(norm([1,2,3])); echo(norm([1,2,3,4])); echo(norm()); echo(norm([1,2,0/0])); echo(norm([1,2,1/0])); echo(norm([1,2,-1/0])); echo(norm("")); echo(norm("abcd")); echo(norm(true)); echo(norm([1:4])); echo(norm([1, 2, "a"])); echo(norm([1, 2, []])); echo(norm([1, 2, [1]])); echo(norm([1, 2, [1:3]])); echo(norm([[1,2,3,4],[1,2,3],[1,2],[1]])); echo(norm(u)); echo(norm(u, u)); echo(norm(a, a)); openscad-2019.05/testdata/scad/functions/rands.scad0000644000076500000240000004036713414440264022611 0ustar kintelstaff00000000000000// verify basic rands(), params are ( min, max, num_results, seed (optional) ); v1 = rands(0,0,0,0); v2 = rands(-10,0,20,0); v3 = rands(0,0,-20); v4 = rands(1,2,-20); v5 = rands(-1,-2,-20); v6 = rands(-2,-1,-20); v7 = rands(0,2,0,0); v8 = rands(0,-3,-10,0); v9 = rands(-40,-3,1000,0); va = rands(10,200,1000,-32); vb = rands("akhma","to","va"); vc = rands(0,0,-20); vd = rands(1,2,-20); ve = rands(-10,0,20); vf = rands(0,2,0); vg = rands(0,-3,0); vh = rands(1,0,"blah"); vi = rands(0,-3,-10); vj = rands(-40,-3,1000); vk = rands(10,200,1000); vq = rands(1, 5); vp = rands(1, 5); vo = rands(1); vn = rands(); vl = rands(v[0],v[1],v[2]); vm = rands(1,2,-20); sphere(); echo("i hope rands() did not crash"); v = rands(1,1,4); echo( v ); echo( rands(1,2,3,4.1) ); echo( rands(1,2,3,-4.1) ); echo( rands(1,2,3,-4.1e100) ); echo( rands(1,2,3,4.1e100) ); echo( rands(1,2,3,-4.1e-100) ); echo( rands(1,2,3,4.1e-100) ); // part 2 - verify seeded rands() behavior with bizarro infinite inputs echo("rands(1/0,1/0,1/0,1/0)", rands(1/0,1/0,1/0,1/0)); echo("rands(1/0,1/0,1/0,-1/0)", rands(1/0,1/0,1/0,-1/0)); echo("rands(1/0,1/0,1/0,1.1)", rands(1/0,1/0,1/0,1.1)); echo("rands(1/0,1/0,1/0,-1.1)", rands(1/0,1/0,1/0,-1.1)); echo("rands(1/0,1/0,-1/0,1/0)", rands(1/0,1/0,-1/0,1/0)); echo("rands(1/0,1/0,-1/0,-1/0)", rands(1/0,1/0,-1/0,-1/0)); echo("rands(1/0,1/0,-1/0,1.1)", rands(1/0,1/0,-1/0,1.1)); echo("rands(1/0,1/0,-1/0,-1.1)", rands(1/0,1/0,-1/0,-1.1)); echo("rands(1/0,1/0,1.1,1/0)", rands(1/0,1/0,1.1,1/0)); echo("rands(1/0,1/0,1.1,-1/0)", rands(1/0,1/0,1.1,-1/0)); echo("rands(1/0,1/0,1.1,1.1)", rands(1/0,1/0,1.1,1.1)); echo("rands(1/0,1/0,1.1,-1.1)", rands(1/0,1/0,1.1,-1.1)); echo("rands(1/0,1/0,-1.1,1/0)", rands(1/0,1/0,-1.1,1/0)); echo("rands(1/0,1/0,-1.1,-1/0)", rands(1/0,1/0,-1.1,-1/0)); echo("rands(1/0,1/0,-1.1,1.1)", rands(1/0,1/0,-1.1,1.1)); echo("rands(1/0,1/0,-1.1,-1.1)", rands(1/0,1/0,-1.1,-1.1)); echo("rands(1/0,-1/0,1/0,1/0)", rands(1/0,-1/0,1/0,1/0)); echo("rands(1/0,-1/0,1/0,-1/0)", rands(1/0,-1/0,1/0,-1/0)); echo("rands(1/0,-1/0,1/0,1.1)", rands(1/0,-1/0,1/0,1.1)); echo("rands(1/0,-1/0,1/0,-1.1)", rands(1/0,-1/0,1/0,-1.1)); echo("rands(1/0,-1/0,-1/0,1/0)", rands(1/0,-1/0,-1/0,1/0)); echo("rands(1/0,-1/0,-1/0,-1/0)", rands(1/0,-1/0,-1/0,-1/0)); echo("rands(1/0,-1/0,-1/0,1.1)", rands(1/0,-1/0,-1/0,1.1)); echo("rands(1/0,-1/0,-1/0,-1.1)", rands(1/0,-1/0,-1/0,-1.1)); echo("rands(1/0,-1/0,1.1,1/0)", rands(1/0,-1/0,1.1,1/0)); echo("rands(1/0,-1/0,1.1,-1/0)", rands(1/0,-1/0,1.1,-1/0)); echo("rands(1/0,-1/0,1.1,1.1)", rands(1/0,-1/0,1.1,1.1)); echo("rands(1/0,-1/0,1.1,-1.1)", rands(1/0,-1/0,1.1,-1.1)); echo("rands(1/0,-1/0,-1.1,1/0)", rands(1/0,-1/0,-1.1,1/0)); echo("rands(1/0,-1/0,-1.1,-1/0)", rands(1/0,-1/0,-1.1,-1/0)); echo("rands(1/0,-1/0,-1.1,1.1)", rands(1/0,-1/0,-1.1,1.1)); echo("rands(1/0,-1/0,-1.1,-1.1)", rands(1/0,-1/0,-1.1,-1.1)); echo("rands(1/0,1.1,1/0,1/0)", rands(1/0,1.1,1/0,1/0)); echo("rands(1/0,1.1,1/0,-1/0)", rands(1/0,1.1,1/0,-1/0)); echo("rands(1/0,1.1,1/0,1.1)", rands(1/0,1.1,1/0,1.1)); echo("rands(1/0,1.1,1/0,-1.1)", rands(1/0,1.1,1/0,-1.1)); echo("rands(1/0,1.1,-1/0,1/0)", rands(1/0,1.1,-1/0,1/0)); echo("rands(1/0,1.1,-1/0,-1/0)", rands(1/0,1.1,-1/0,-1/0)); echo("rands(1/0,1.1,-1/0,1.1)", rands(1/0,1.1,-1/0,1.1)); echo("rands(1/0,1.1,-1/0,-1.1)", rands(1/0,1.1,-1/0,-1.1)); echo("rands(1/0,1.1,1.1,1/0)", rands(1/0,1.1,1.1,1/0)); echo("rands(1/0,1.1,1.1,-1/0)", rands(1/0,1.1,1.1,-1/0)); echo("rands(1/0,1.1,1.1,1.1)", rands(1/0,1.1,1.1,1.1)); echo("rands(1/0,1.1,1.1,-1.1)", rands(1/0,1.1,1.1,-1.1)); echo("rands(1/0,1.1,-1.1,1/0)", rands(1/0,1.1,-1.1,1/0)); echo("rands(1/0,1.1,-1.1,-1/0)", rands(1/0,1.1,-1.1,-1/0)); echo("rands(1/0,1.1,-1.1,1.1)", rands(1/0,1.1,-1.1,1.1)); echo("rands(1/0,1.1,-1.1,-1.1)", rands(1/0,1.1,-1.1,-1.1)); echo("rands(1/0,-1.1,1/0,1/0)", rands(1/0,-1.1,1/0,1/0)); echo("rands(1/0,-1.1,1/0,-1/0)", rands(1/0,-1.1,1/0,-1/0)); echo("rands(1/0,-1.1,1/0,1.1)", rands(1/0,-1.1,1/0,1.1)); echo("rands(1/0,-1.1,1/0,-1.1)", rands(1/0,-1.1,1/0,-1.1)); echo("rands(1/0,-1.1,-1/0,1/0)", rands(1/0,-1.1,-1/0,1/0)); echo("rands(1/0,-1.1,-1/0,-1/0)", rands(1/0,-1.1,-1/0,-1/0)); echo("rands(1/0,-1.1,-1/0,1.1)", rands(1/0,-1.1,-1/0,1.1)); echo("rands(1/0,-1.1,-1/0,-1.1)", rands(1/0,-1.1,-1/0,-1.1)); echo("rands(1/0,-1.1,1.1,1/0)", rands(1/0,-1.1,1.1,1/0)); echo("rands(1/0,-1.1,1.1,-1/0)", rands(1/0,-1.1,1.1,-1/0)); echo("rands(1/0,-1.1,1.1,1.1)", rands(1/0,-1.1,1.1,1.1)); echo("rands(1/0,-1.1,1.1,-1.1)", rands(1/0,-1.1,1.1,-1.1)); echo("rands(1/0,-1.1,-1.1,1/0)", rands(1/0,-1.1,-1.1,1/0)); echo("rands(1/0,-1.1,-1.1,-1/0)", rands(1/0,-1.1,-1.1,-1/0)); echo("rands(1/0,-1.1,-1.1,1.1)", rands(1/0,-1.1,-1.1,1.1)); echo("rands(1/0,-1.1,-1.1,-1.1)", rands(1/0,-1.1,-1.1,-1.1)); echo("rands(-1/0,1/0,1/0,1/0)", rands(-1/0,1/0,1/0,1/0)); echo("rands(-1/0,1/0,1/0,-1/0)", rands(-1/0,1/0,1/0,-1/0)); echo("rands(-1/0,1/0,1/0,1.1)", rands(-1/0,1/0,1/0,1.1)); echo("rands(-1/0,1/0,1/0,-1.1)", rands(-1/0,1/0,1/0,-1.1)); echo("rands(-1/0,1/0,-1/0,1/0)", rands(-1/0,1/0,-1/0,1/0)); echo("rands(-1/0,1/0,-1/0,-1/0)", rands(-1/0,1/0,-1/0,-1/0)); echo("rands(-1/0,1/0,-1/0,1.1)", rands(-1/0,1/0,-1/0,1.1)); echo("rands(-1/0,1/0,-1/0,-1.1)", rands(-1/0,1/0,-1/0,-1.1)); echo("rands(-1/0,1/0,1.1,1/0)", rands(-1/0,1/0,1.1,1/0)); echo("rands(-1/0,1/0,1.1,-1/0)", rands(-1/0,1/0,1.1,-1/0)); echo("rands(-1/0,1/0,1.1,1.1)", rands(-1/0,1/0,1.1,1.1)); echo("rands(-1/0,1/0,1.1,-1.1)", rands(-1/0,1/0,1.1,-1.1)); echo("rands(-1/0,1/0,-1.1,1/0)", rands(-1/0,1/0,-1.1,1/0)); echo("rands(-1/0,1/0,-1.1,-1/0)", rands(-1/0,1/0,-1.1,-1/0)); echo("rands(-1/0,1/0,-1.1,1.1)", rands(-1/0,1/0,-1.1,1.1)); echo("rands(-1/0,1/0,-1.1,-1.1)", rands(-1/0,1/0,-1.1,-1.1)); echo("rands(-1/0,-1/0,1/0,1/0)", rands(-1/0,-1/0,1/0,1/0)); echo("rands(-1/0,-1/0,1/0,-1/0)", rands(-1/0,-1/0,1/0,-1/0)); echo("rands(-1/0,-1/0,1/0,1.1)", rands(-1/0,-1/0,1/0,1.1)); echo("rands(-1/0,-1/0,1/0,-1.1)", rands(-1/0,-1/0,1/0,-1.1)); echo("rands(-1/0,-1/0,-1/0,1/0)", rands(-1/0,-1/0,-1/0,1/0)); echo("rands(-1/0,-1/0,-1/0,-1/0)", rands(-1/0,-1/0,-1/0,-1/0)); echo("rands(-1/0,-1/0,-1/0,1.1)", rands(-1/0,-1/0,-1/0,1.1)); echo("rands(-1/0,-1/0,-1/0,-1.1)", rands(-1/0,-1/0,-1/0,-1.1)); echo("rands(-1/0,-1/0,1.1,1/0)", rands(-1/0,-1/0,1.1,1/0)); echo("rands(-1/0,-1/0,1.1,-1/0)", rands(-1/0,-1/0,1.1,-1/0)); echo("rands(-1/0,-1/0,1.1,1.1)", rands(-1/0,-1/0,1.1,1.1)); echo("rands(-1/0,-1/0,1.1,-1.1)", rands(-1/0,-1/0,1.1,-1.1)); echo("rands(-1/0,-1/0,-1.1,1/0)", rands(-1/0,-1/0,-1.1,1/0)); echo("rands(-1/0,-1/0,-1.1,-1/0)", rands(-1/0,-1/0,-1.1,-1/0)); echo("rands(-1/0,-1/0,-1.1,1.1)", rands(-1/0,-1/0,-1.1,1.1)); echo("rands(-1/0,-1/0,-1.1,-1.1)", rands(-1/0,-1/0,-1.1,-1.1)); echo("rands(-1/0,1.1,1/0,1/0)", rands(-1/0,1.1,1/0,1/0)); echo("rands(-1/0,1.1,1/0,-1/0)", rands(-1/0,1.1,1/0,-1/0)); echo("rands(-1/0,1.1,1/0,1.1)", rands(-1/0,1.1,1/0,1.1)); echo("rands(-1/0,1.1,1/0,-1.1)", rands(-1/0,1.1,1/0,-1.1)); echo("rands(-1/0,1.1,-1/0,1/0)", rands(-1/0,1.1,-1/0,1/0)); echo("rands(-1/0,1.1,-1/0,-1/0)", rands(-1/0,1.1,-1/0,-1/0)); echo("rands(-1/0,1.1,-1/0,1.1)", rands(-1/0,1.1,-1/0,1.1)); echo("rands(-1/0,1.1,-1/0,-1.1)", rands(-1/0,1.1,-1/0,-1.1)); echo("rands(-1/0,1.1,1.1,1/0)", rands(-1/0,1.1,1.1,1/0)); echo("rands(-1/0,1.1,1.1,-1/0)", rands(-1/0,1.1,1.1,-1/0)); echo("rands(-1/0,1.1,1.1,1.1)", rands(-1/0,1.1,1.1,1.1)); echo("rands(-1/0,1.1,1.1,-1.1)", rands(-1/0,1.1,1.1,-1.1)); echo("rands(-1/0,1.1,-1.1,1/0)", rands(-1/0,1.1,-1.1,1/0)); echo("rands(-1/0,1.1,-1.1,-1/0)", rands(-1/0,1.1,-1.1,-1/0)); echo("rands(-1/0,1.1,-1.1,1.1)", rands(-1/0,1.1,-1.1,1.1)); echo("rands(-1/0,1.1,-1.1,-1.1)", rands(-1/0,1.1,-1.1,-1.1)); echo("rands(-1/0,-1.1,1/0,1/0)", rands(-1/0,-1.1,1/0,1/0)); echo("rands(-1/0,-1.1,1/0,-1/0)", rands(-1/0,-1.1,1/0,-1/0)); echo("rands(-1/0,-1.1,1/0,1.1)", rands(-1/0,-1.1,1/0,1.1)); echo("rands(-1/0,-1.1,1/0,-1.1)", rands(-1/0,-1.1,1/0,-1.1)); echo("rands(-1/0,-1.1,-1/0,1/0)", rands(-1/0,-1.1,-1/0,1/0)); echo("rands(-1/0,-1.1,-1/0,-1/0)", rands(-1/0,-1.1,-1/0,-1/0)); echo("rands(-1/0,-1.1,-1/0,1.1)", rands(-1/0,-1.1,-1/0,1.1)); echo("rands(-1/0,-1.1,-1/0,-1.1)", rands(-1/0,-1.1,-1/0,-1.1)); echo("rands(-1/0,-1.1,1.1,1/0)", rands(-1/0,-1.1,1.1,1/0)); echo("rands(-1/0,-1.1,1.1,-1/0)", rands(-1/0,-1.1,1.1,-1/0)); echo("rands(-1/0,-1.1,1.1,1.1)", rands(-1/0,-1.1,1.1,1.1)); echo("rands(-1/0,-1.1,1.1,-1.1)", rands(-1/0,-1.1,1.1,-1.1)); echo("rands(-1/0,-1.1,-1.1,1/0)", rands(-1/0,-1.1,-1.1,1/0)); echo("rands(-1/0,-1.1,-1.1,-1/0)", rands(-1/0,-1.1,-1.1,-1/0)); echo("rands(-1/0,-1.1,-1.1,1.1)", rands(-1/0,-1.1,-1.1,1.1)); echo("rands(-1/0,-1.1,-1.1,-1.1)", rands(-1/0,-1.1,-1.1,-1.1)); echo("rands(1.1,1/0,1/0,1/0)", rands(1.1,1/0,1/0,1/0)); echo("rands(1.1,1/0,1/0,-1/0)", rands(1.1,1/0,1/0,-1/0)); echo("rands(1.1,1/0,1/0,1.1)", rands(1.1,1/0,1/0,1.1)); echo("rands(1.1,1/0,1/0,-1.1)", rands(1.1,1/0,1/0,-1.1)); echo("rands(1.1,1/0,-1/0,1/0)", rands(1.1,1/0,-1/0,1/0)); echo("rands(1.1,1/0,-1/0,-1/0)", rands(1.1,1/0,-1/0,-1/0)); echo("rands(1.1,1/0,-1/0,1.1)", rands(1.1,1/0,-1/0,1.1)); echo("rands(1.1,1/0,-1/0,-1.1)", rands(1.1,1/0,-1/0,-1.1)); echo("rands(1.1,1/0,1.1,1/0)", rands(1.1,1/0,1.1,1/0)); echo("rands(1.1,1/0,1.1,-1/0)", rands(1.1,1/0,1.1,-1/0)); echo("rands(1.1,1/0,1.1,1.1)", rands(1.1,1/0,1.1,1.1)); echo("rands(1.1,1/0,1.1,-1.1)", rands(1.1,1/0,1.1,-1.1)); echo("rands(1.1,1/0,-1.1,1/0)", rands(1.1,1/0,-1.1,1/0)); echo("rands(1.1,1/0,-1.1,-1/0)", rands(1.1,1/0,-1.1,-1/0)); echo("rands(1.1,1/0,-1.1,1.1)", rands(1.1,1/0,-1.1,1.1)); echo("rands(1.1,1/0,-1.1,-1.1)", rands(1.1,1/0,-1.1,-1.1)); echo("rands(1.1,-1/0,1/0,1/0)", rands(1.1,-1/0,1/0,1/0)); echo("rands(1.1,-1/0,1/0,-1/0)", rands(1.1,-1/0,1/0,-1/0)); echo("rands(1.1,-1/0,1/0,1.1)", rands(1.1,-1/0,1/0,1.1)); echo("rands(1.1,-1/0,1/0,-1.1)", rands(1.1,-1/0,1/0,-1.1)); echo("rands(1.1,-1/0,-1/0,1/0)", rands(1.1,-1/0,-1/0,1/0)); echo("rands(1.1,-1/0,-1/0,-1/0)", rands(1.1,-1/0,-1/0,-1/0)); echo("rands(1.1,-1/0,-1/0,1.1)", rands(1.1,-1/0,-1/0,1.1)); echo("rands(1.1,-1/0,-1/0,-1.1)", rands(1.1,-1/0,-1/0,-1.1)); echo("rands(1.1,-1/0,1.1,1/0)", rands(1.1,-1/0,1.1,1/0)); echo("rands(1.1,-1/0,1.1,-1/0)", rands(1.1,-1/0,1.1,-1/0)); echo("rands(1.1,-1/0,1.1,1.1)", rands(1.1,-1/0,1.1,1.1)); echo("rands(1.1,-1/0,1.1,-1.1)", rands(1.1,-1/0,1.1,-1.1)); echo("rands(1.1,-1/0,-1.1,1/0)", rands(1.1,-1/0,-1.1,1/0)); echo("rands(1.1,-1/0,-1.1,-1/0)", rands(1.1,-1/0,-1.1,-1/0)); echo("rands(1.1,-1/0,-1.1,1.1)", rands(1.1,-1/0,-1.1,1.1)); echo("rands(1.1,-1/0,-1.1,-1.1)", rands(1.1,-1/0,-1.1,-1.1)); echo("rands(1.1,1.1,1/0,1/0)", rands(1.1,1.1,1/0,1/0)); echo("rands(1.1,1.1,1/0,-1/0)", rands(1.1,1.1,1/0,-1/0)); echo("rands(1.1,1.1,1/0,1.1)", rands(1.1,1.1,1/0,1.1)); echo("rands(1.1,1.1,1/0,-1.1)", rands(1.1,1.1,1/0,-1.1)); echo("rands(1.1,1.1,-1/0,1/0)", rands(1.1,1.1,-1/0,1/0)); echo("rands(1.1,1.1,-1/0,-1/0)", rands(1.1,1.1,-1/0,-1/0)); echo("rands(1.1,1.1,-1/0,1.1)", rands(1.1,1.1,-1/0,1.1)); echo("rands(1.1,1.1,-1/0,-1.1)", rands(1.1,1.1,-1/0,-1.1)); echo("rands(1.1,1.1,1.1,1/0)", rands(1.1,1.1,1.1,1/0)); echo("rands(1.1,1.1,1.1,-1/0)", rands(1.1,1.1,1.1,-1/0)); echo("rands(1.1,1.1,1.1,1.1)", rands(1.1,1.1,1.1,1.1)); echo("rands(1.1,1.1,1.1,-1.1)", rands(1.1,1.1,1.1,-1.1)); echo("rands(1.1,1.1,-1.1,1/0)", rands(1.1,1.1,-1.1,1/0)); echo("rands(1.1,1.1,-1.1,-1/0)", rands(1.1,1.1,-1.1,-1/0)); echo("rands(1.1,1.1,-1.1,1.1)", rands(1.1,1.1,-1.1,1.1)); echo("rands(1.1,1.1,-1.1,-1.1)", rands(1.1,1.1,-1.1,-1.1)); echo("rands(1.1,-1.1,1/0,1/0)", rands(1.1,-1.1,1/0,1/0)); echo("rands(1.1,-1.1,1/0,-1/0)", rands(1.1,-1.1,1/0,-1/0)); echo("rands(1.1,-1.1,1/0,1.1)", rands(1.1,-1.1,1/0,1.1)); echo("rands(1.1,-1.1,1/0,-1.1)", rands(1.1,-1.1,1/0,-1.1)); echo("rands(1.1,-1.1,-1/0,1/0)", rands(1.1,-1.1,-1/0,1/0)); echo("rands(1.1,-1.1,-1/0,-1/0)", rands(1.1,-1.1,-1/0,-1/0)); echo("rands(1.1,-1.1,-1/0,1.1)", rands(1.1,-1.1,-1/0,1.1)); echo("rands(1.1,-1.1,-1/0,-1.1)", rands(1.1,-1.1,-1/0,-1.1)); echo("rands(1.1,-1.1,1.1,1/0)", rands(1.1,-1.1,1.1,1/0)); echo("rands(1.1,-1.1,1.1,-1/0)", rands(1.1,-1.1,1.1,-1/0)); echo("rands(1.1,-1.1,1.1,1.1)", rands(1.1,-1.1,1.1,1.1)); echo("rands(1.1,-1.1,1.1,-1.1)", rands(1.1,-1.1,1.1,-1.1)); echo("rands(1.1,-1.1,-1.1,1/0)", rands(1.1,-1.1,-1.1,1/0)); echo("rands(1.1,-1.1,-1.1,-1/0)", rands(1.1,-1.1,-1.1,-1/0)); echo("rands(1.1,-1.1,-1.1,1.1)", rands(1.1,-1.1,-1.1,1.1)); echo("rands(1.1,-1.1,-1.1,-1.1)", rands(1.1,-1.1,-1.1,-1.1)); echo("rands(-1.1,1/0,1/0,1/0)", rands(-1.1,1/0,1/0,1/0)); echo("rands(-1.1,1/0,1/0,-1/0)", rands(-1.1,1/0,1/0,-1/0)); echo("rands(-1.1,1/0,1/0,1.1)", rands(-1.1,1/0,1/0,1.1)); echo("rands(-1.1,1/0,1/0,-1.1)", rands(-1.1,1/0,1/0,-1.1)); echo("rands(-1.1,1/0,-1/0,1/0)", rands(-1.1,1/0,-1/0,1/0)); echo("rands(-1.1,1/0,-1/0,-1/0)", rands(-1.1,1/0,-1/0,-1/0)); echo("rands(-1.1,1/0,-1/0,1.1)", rands(-1.1,1/0,-1/0,1.1)); echo("rands(-1.1,1/0,-1/0,-1.1)", rands(-1.1,1/0,-1/0,-1.1)); echo("rands(-1.1,1/0,1.1,1/0)", rands(-1.1,1/0,1.1,1/0)); echo("rands(-1.1,1/0,1.1,-1/0)", rands(-1.1,1/0,1.1,-1/0)); echo("rands(-1.1,1/0,1.1,1.1)", rands(-1.1,1/0,1.1,1.1)); echo("rands(-1.1,1/0,1.1,-1.1)", rands(-1.1,1/0,1.1,-1.1)); echo("rands(-1.1,1/0,-1.1,1/0)", rands(-1.1,1/0,-1.1,1/0)); echo("rands(-1.1,1/0,-1.1,-1/0)", rands(-1.1,1/0,-1.1,-1/0)); echo("rands(-1.1,1/0,-1.1,1.1)", rands(-1.1,1/0,-1.1,1.1)); echo("rands(-1.1,1/0,-1.1,-1.1)", rands(-1.1,1/0,-1.1,-1.1)); echo("rands(-1.1,-1/0,1/0,1/0)", rands(-1.1,-1/0,1/0,1/0)); echo("rands(-1.1,-1/0,1/0,-1/0)", rands(-1.1,-1/0,1/0,-1/0)); echo("rands(-1.1,-1/0,1/0,1.1)", rands(-1.1,-1/0,1/0,1.1)); echo("rands(-1.1,-1/0,1/0,-1.1)", rands(-1.1,-1/0,1/0,-1.1)); echo("rands(-1.1,-1/0,-1/0,1/0)", rands(-1.1,-1/0,-1/0,1/0)); echo("rands(-1.1,-1/0,-1/0,-1/0)", rands(-1.1,-1/0,-1/0,-1/0)); echo("rands(-1.1,-1/0,-1/0,1.1)", rands(-1.1,-1/0,-1/0,1.1)); echo("rands(-1.1,-1/0,-1/0,-1.1)", rands(-1.1,-1/0,-1/0,-1.1)); echo("rands(-1.1,-1/0,1.1,1/0)", rands(-1.1,-1/0,1.1,1/0)); echo("rands(-1.1,-1/0,1.1,-1/0)", rands(-1.1,-1/0,1.1,-1/0)); echo("rands(-1.1,-1/0,1.1,1.1)", rands(-1.1,-1/0,1.1,1.1)); echo("rands(-1.1,-1/0,1.1,-1.1)", rands(-1.1,-1/0,1.1,-1.1)); echo("rands(-1.1,-1/0,-1.1,1/0)", rands(-1.1,-1/0,-1.1,1/0)); echo("rands(-1.1,-1/0,-1.1,-1/0)", rands(-1.1,-1/0,-1.1,-1/0)); echo("rands(-1.1,-1/0,-1.1,1.1)", rands(-1.1,-1/0,-1.1,1.1)); echo("rands(-1.1,-1/0,-1.1,-1.1)", rands(-1.1,-1/0,-1.1,-1.1)); echo("rands(-1.1,1.1,1/0,1/0)", rands(-1.1,1.1,1/0,1/0)); echo("rands(-1.1,1.1,1/0,-1/0)", rands(-1.1,1.1,1/0,-1/0)); echo("rands(-1.1,1.1,1/0,1.1)", rands(-1.1,1.1,1/0,1.1)); echo("rands(-1.1,1.1,1/0,-1.1)", rands(-1.1,1.1,1/0,-1.1)); echo("rands(-1.1,1.1,-1/0,1/0)", rands(-1.1,1.1,-1/0,1/0)); echo("rands(-1.1,1.1,-1/0,-1/0)", rands(-1.1,1.1,-1/0,-1/0)); echo("rands(-1.1,1.1,-1/0,1.1)", rands(-1.1,1.1,-1/0,1.1)); echo("rands(-1.1,1.1,-1/0,-1.1)", rands(-1.1,1.1,-1/0,-1.1)); echo("rands(-1.1,1.1,1.1,1/0)", rands(-1.1,1.1,1.1,1/0)); echo("rands(-1.1,1.1,1.1,-1/0)", rands(-1.1,1.1,1.1,-1/0)); echo("rands(-1.1,1.1,1.1,1.1)", rands(-1.1,1.1,1.1,1.1)); echo("rands(-1.1,1.1,1.1,-1.1)", rands(-1.1,1.1,1.1,-1.1)); echo("rands(-1.1,1.1,-1.1,1/0)", rands(-1.1,1.1,-1.1,1/0)); echo("rands(-1.1,1.1,-1.1,-1/0)", rands(-1.1,1.1,-1.1,-1/0)); echo("rands(-1.1,1.1,-1.1,1.1)", rands(-1.1,1.1,-1.1,1.1)); echo("rands(-1.1,1.1,-1.1,-1.1)", rands(-1.1,1.1,-1.1,-1.1)); echo("rands(-1.1,-1.1,1/0,1/0)", rands(-1.1,-1.1,1/0,1/0)); echo("rands(-1.1,-1.1,1/0,-1/0)", rands(-1.1,-1.1,1/0,-1/0)); echo("rands(-1.1,-1.1,1/0,1.1)", rands(-1.1,-1.1,1/0,1.1)); echo("rands(-1.1,-1.1,1/0,-1.1)", rands(-1.1,-1.1,1/0,-1.1)); echo("rands(-1.1,-1.1,-1/0,1/0)", rands(-1.1,-1.1,-1/0,1/0)); echo("rands(-1.1,-1.1,-1/0,-1/0)", rands(-1.1,-1.1,-1/0,-1/0)); echo("rands(-1.1,-1.1,-1/0,1.1)", rands(-1.1,-1.1,-1/0,1.1)); echo("rands(-1.1,-1.1,-1/0,-1.1)", rands(-1.1,-1.1,-1/0,-1.1)); echo("rands(-1.1,-1.1,1.1,1/0)", rands(-1.1,-1.1,1.1,1/0)); echo("rands(-1.1,-1.1,1.1,-1/0)", rands(-1.1,-1.1,1.1,-1/0)); echo("rands(-1.1,-1.1,1.1,1.1)", rands(-1.1,-1.1,1.1,1.1)); echo("rands(-1.1,-1.1,1.1,-1.1)", rands(-1.1,-1.1,1.1,-1.1)); echo("rands(-1.1,-1.1,-1.1,1/0)", rands(-1.1,-1.1,-1.1,1/0)); echo("rands(-1.1,-1.1,-1.1,-1/0)", rands(-1.1,-1.1,-1.1,-1/0)); echo("rands(-1.1,-1.1,-1.1,1.1)", rands(-1.1,-1.1,-1.1,1.1)); echo("rands(-1.1,-1.1,-1.1,-1.1)", rands(-1.1,-1.1,-1.1,-1.1)); // part 3 - verify seeded rands() behavior with bizarro not a number inputs nan = (1/0)/(1/0); echo("rands(0,10,nan,1)", rands(0,10,nan,1)); echo("rands(0,nan,10,1)", rands(0,nan,10,1)); echo("rands(nan,0,10,1)", rands(nan,0,10,1)); echo("rands(0,0,10,nan)", rands(0,0,10,nan)); openscad-2019.05/testdata/scad/functions/trig-tests.scad0000644000076500000240000001145413414440264023602 0ustar kintelstaff00000000000000// Tests for Trigonometry functions // See github issue #2195 for discussion/reasoning behind these module print_results(testname, results) { if (len(results) > 0) echo(str(testname, " FAILED at these angles: ", results)); else echo(str(testname, " PASSED")); } echo("***Test special angles***"); echo("sin( 0) == 0 ", sin( 0) == 0); echo("sin( 30) == 1/2 ", sin( 30) == 1/2); echo("sin( 45) == sqrt(2)/2 ", sin( 45) == sqrt(2)/2); echo("sin( 60) == sqrt(3)/2 ", sin( 60) == sqrt(3)/2); echo("sin( 90) == 1 ", sin( 90) == 1); echo("sin(120) == sqrt(3)/2 ", sin(120) == sqrt(3)/2); echo("sin(135) == sqrt(2)/2 ", sin(135) == sqrt(2)/2); echo("sin(150) == 1/2 ", sin(150) == 1/2); echo("sin(180) == 0 ", sin(180) == 0); echo("sin(210) == -1/2 ", sin(210) == -1/2); echo("sin(225) == -sqrt(2)/2 ", sin(225) == -sqrt(2)/2); echo("sin(240) == -sqrt(3)/2 ", sin(240) == -sqrt(3)/2); echo("sin(270) == -1 ", sin(270) == -1); echo("sin(300) == -sqrt(3)/2 ", sin(300) == -sqrt(3)/2); echo("sin(315) == -sqrt(2)/2 ", sin(315) == -sqrt(2)/2); echo("sin(330) == -1/2 ", sin(330) == -1/2); echo("sin(360) == 0 ", sin(360) == 0); echo(); echo("cos( 0) == 1 ", cos( 0) == 1); echo("cos( 30) == sqrt(3)/2 ", cos( 30) == sqrt(3)/2); echo("cos( 45) == sqrt(2)/2 ", cos( 45) == sqrt(2)/2); echo("cos( 60) == 1/2 ", cos( 60) == 1/2); echo("cos( 90) == 0 ", cos( 90) == 0); echo("cos(120) == -1/2 ", cos(120) == -1/2); echo("cos(135) == -sqrt(2)/2 ", cos(135) == -sqrt(2)/2); echo("cos(150) == -sqrt(3)/2 ", cos(150) == -sqrt(3)/2); echo("cos(180) == -1 ", cos(180) == -1); echo("cos(210) == -sqrt(3)/2 ", cos(210) == -sqrt(3)/2); echo("cos(225) == -sqrt(2)/2 ", cos(225) == -sqrt(2)/2); echo("cos(240) == -1/2 ", cos(240) == -1/2); echo("cos(270) == 0 ", cos(270) == 0); echo("cos(300) == 1/2 ", cos(300) == 1/2); echo("cos(315) == sqrt(2)/2 ", cos(315) == sqrt(2)/2); echo("cos(330) == sqrt(3)/2 ", cos(330) == sqrt(3)/2); echo("cos(360) == 1 ", cos(360) == 1); // (0 == -0), so do some special checks to differentiate between these values function isNeg0(x) = 1/x == -1/0; function isPos0(x) = 1/x == 1/0; echo(); echo("// Quick test of signed zero checks"); echo(" isNeg0(-0) ", isNeg0(-0)); echo("!isNeg0( 0) ", !isNeg0( 0)); echo("!isPos0(-0) ", !isPos0(-0)); echo(" isPos0( 0) ", isPos0( 0)); echo(); echo("isNeg0(tan(-180)) ", isNeg0(tan(-180))); echo("tan(-150)== sqrt(3)/3 ", tan(-150) == sqrt(3)/3); echo("tan(-135)== 1 ", tan(-135) == 1); echo("tan(-120)== sqrt(3) ", tan(-120) == sqrt(3)); echo("tan(-90) == -1/0 ", tan(-90) == -1/0); echo("tan(-60) == -sqrt(3) ", tan(-60) == -sqrt(3)); echo("tan(-45) == -1 ", tan(-45) == -1); echo("tan(-30) == -sqrt(3)/3 ", tan(-30) == -sqrt(3)/3); echo("isPos0(tan( 0)) ", isPos0(tan( 0))); echo("tan( 30) == sqrt(3)/3 ", tan( 30) == sqrt(3)/3); echo("tan( 45) == 1 ", tan( 45) == 1); echo("tan( 60) == sqrt(3) ", tan( 60) == sqrt(3)); echo("tan( 90) == 1/0 ", tan( 90) == 1/0); echo("tan(120) == -sqrt(3) ", tan(120) == -sqrt(3)); echo("tan(135) == -1 ", tan(135) == -1); echo("tan(150) == -sqrt(3)/3 ", tan(150) == -sqrt(3)/3); echo("isNeg0(tan(180)) ", isNeg0(tan(180))); echo(); echo("***Verify functions are Odd/Even***"); sin_fails = [for(a = [0:1:359]) if (sin(-a) != -sin(a)) a]; cos_fails = [for(a = [0:1:359]) if (cos(-a) != cos(a)) a]; tan_fails = [for(a = [0:1:359]) if (tan(-a) != -tan(a)) a]; print_results("sin() odd check", sin_fails); print_results("cos() even check", cos_fails); print_results("tan() odd check", tan_fails); echo(); echo("***Verify functions are Periodic over a few cycles***"); sin_aperiodic = [for(p = [-4:5], a=[0:1:359]) let(a1 = a+p*360, a2 = a+(p-1)*360) if (sin(a1) != sin(a2)) [a2,a1]]; cos_aperiodic = [for(p = [-4:5], a=[0:1:359]) let(a1 = a+p*360, a2 = a+(p-1)*360) if (cos(a1) != cos(a2)) [a2,a1]]; tan_aperiodic = [for(p = [-4:5], a=[0:1:359]) let(a1 = a+p*360, a2 = a+(p-1)*360) if (tan(a1) != tan(a2)) [a2,a1]]; print_results("sin() periodic check", sin_aperiodic); print_results("cos() periodic check", cos_aperiodic); print_results("tan() periodic check", tan_aperiodic); echo(); echo("***Verify Inverse Trigonometric functions***"); asin_fails = [for(a = [-90:1: 90]) if (asin(sin(a)) - a) [a, asin(sin(a))] ]; acos_fails = [for(a = [ 0:1:180]) if (acos(cos(a)) - a) [a, acos(cos(a))] ]; atan_fails = [for(a = [-90:1: 90]) if (atan(tan(a)) - a) [a, atan(tan(a))] ]; atan2_fails = [for(a = [-180:1:179]) if (atan2(sin(a),cos(a)) - a) [a, atan2(sin(a),cos(a))] ]; print_results("asin() inverse check", asin_fails); print_results("acos() inverse check", acos_fails); print_results("atan() inverse check", atan_fails); print_results("atan2() inverse check", atan2_fails); openscad-2019.05/testdata/scad/issues/issue1472.scad0000644000076500000240000000037213402025764022444 0ustar kintelstaff00000000000000// Test for module with NaN arg module infiniteLoop() infiniteLoop(); for (i=[0:sqrt(-1)]) infiniteLoop(); // Test list comprehension for with NaN arg function infiniteFunc() = infiniteFunc(); a = [for (i=[0:sqrt(-1)]) infiniteFunc()]; echo("OK"); openscad-2019.05/testdata/scad/issues/issue1516.scad0000644000076500000240000000002413402025764022435 0ustar kintelstaff00000000000000echo([1,2,3] * []); openscad-2019.05/testdata/scad/issues/issue1528.scad0000644000076500000240000000003113402025764022436 0ustar kintelstaff00000000000000echo(lookup(3, undef)); openscad-2019.05/testdata/scad/issues/issue1851-each-fail-on-scalar.scad0000644000076500000240000000043513402025764026131 0ustar kintelstaff00000000000000echo([each for(i=1) i]); echo([each for(i=[1,2]) i]); echo([each for(i=[1,2,[3,4]]) i]); echo([each for(i=[1,2,[3,4,[5,6]]]) i]); echo([each each for(i=[1,2,[3,4,[5,6]]]) i]); echo([each each for(i=[1,2,[3,4,[5,6,[7,8]]]]) i]); echo([each each each for(i=[1,2,[3,4,[5,6,[7,8]]]]) i]); openscad-2019.05/testdata/scad/issues/issue1890-comment.scad0000644000076500000240000000002613402025764024104 0ustar kintelstaff00000000000000/* comment sphere(); openscad-2019.05/testdata/scad/issues/issue1890-include.scad0000644000076500000240000000003613402025764024066 0ustar kintelstaff00000000000000include = d; t = c > d; u = e && g; v = e || g; w = +i; x = -i; y = !i; z = (j); aa = k ? l : m; bb = n[o]; cc = let(a=1) a; dd = [for (a=[0,1]) let(b=a) if (true) b]; ee = ["abc", for (a=[0,1]) let(b=a) if (true) b, true, for(c=[1:3]) c, 3]; ff = [for (a=[0,1]) if (a == 0) "A" else ( "B" )]; gg = [each [ "a", 0, false ]]; hh = [for (a = [0 : 3]) if (a < 2) ( if (a < 1) ["+", a] ) else ["-", a] ]; ii = [for (a=0,b=1;a < 5;a=a+1,b=b+2) [a,b*b] ]; openscad-2019.05/testdata/scad/misc/allfunctions.scad0000644000076500000240000000065313402025764023121 0ustar kintelstaff00000000000000a = abs(); b = sign(); c = rands(); d = min(); e = max(); f = sin(); g = cos(); h = asin(); i = acos(); j = tan(); k = atan(); l = atan2(); m = round(); n = ceil(); o = floor(); p = pow(); q = sqrt(); r = exp(); ra = len(); s = log(); t = ln(); u = str(); ua = chr(); ub = concat(); v = lookup(); va = search(); y = version(); z = version_num(); za = norm(); zb = cross(); zc = parent_module(); w = dxf_dim(); x = dxf_cross(); openscad-2019.05/testdata/scad/misc/allmodules.scad0000644000076500000240000000076313402025764022563 0ustar kintelstaff00000000000000minkowski(); hull(); resize(); child(); echo(); assign(); for(); intersection_for(); if(false) { cube(); } else { sphere(); } union(); difference(); intersection(); dxf_linear_extrude(); linear_extrude(); dxf_rotate_extrude(); rotate_extrude(); import(); import_stl(); import_off(); import_dxf(); group(); cube(); sphere(); cylinder(); polyhedron(); square(); circle(); polygon(); projection(); render(); surface(); scale(); rotate(); mirror(); translate(); multmatrix(); color(); offset(); text(); openscad-2019.05/testdata/scad/misc/assert-fail1-test.scad0000644000076500000240000000001613402025764023661 0ustar kintelstaff00000000000000assert(false);openscad-2019.05/testdata/scad/misc/assert-fail2-test.scad0000644000076500000240000000010213402025764023656 0ustar kintelstaff00000000000000a = 10; b = 20; assert(a < 20 && b < 20, "Test! &"); openscad-2019.05/testdata/scad/misc/assert-fail3-test.scad0000644000076500000240000000012613402025764023665 0ustar kintelstaff00000000000000function f(x) = sin(x); module m(angle) { assert(f(angle) > 0) cube(10); } m(270); openscad-2019.05/testdata/scad/misc/assert-fail4-test.scad0000644000076500000240000000001213445047371023665 0ustar kintelstaff00000000000000assert(); openscad-2019.05/testdata/scad/misc/assert-fail5-test.scad0000644000076500000240000000004413445047371023673 0ustar kintelstaff00000000000000assert(message = "assert-message"); openscad-2019.05/testdata/scad/misc/assert-tests.scad0000644000076500000240000000052013402025764023052 0ustar kintelstaff00000000000000a = 3; b = 6; assert(true); assert("t1"); assert(a*b); assert(condition = a*b); assert(true) cube(8, center = true); c = 2; translate([0, 20, 0]) assert(condition = 2) sphere(5); d = c + 9; assert(condition = d + 5 > 15, message = str("value: ", d + 5)) translate([15, 0, 0]) cylinder(8, 5, center = true); echo("assert-tests");openscad-2019.05/testdata/scad/misc/bad-stl-pcbvicebar.scad0000644000076500000240000000047513402025764024046 0ustar kintelstaff00000000000000/* CGAL::Polyhedron_incremental_builder_3:: lookup_halfedge(): input error: facet 81 shares a halfedge from vertex 61 to vertex 69 with facet 38. ERROR: CGAL NefPolyhedron->Polyhedron conversion failed. This has been fixed, but keep this test for future reference */ render() import("bad-stl-pcbvicebar.stl"); openscad-2019.05/testdata/scad/misc/bad-stl-pcbvicebar.stl0000644000076500000240000017770113402025764023745 0ustar kintelstaff00000000000000solid Default facet normal 7.071074e-01 7.071064e-01 0.000000e+00 outer loop vertex 4.510458e+01 5.389037e+01 7.500000e-01 vertex 5.402295e+01 4.497199e+01 6.400000e+00 vertex 5.402295e+01 4.497199e+01 7.500000e-01 endloop endfacet facet normal 7.071084e-01 7.071053e-01 -3.000001e-06 outer loop vertex 5.402295e+01 4.497199e+01 6.400000e+00 vertex 4.510458e+01 5.389037e+01 7.500000e-01 vertex 4.553769e+01 5.345728e+01 3.200000e+00 endloop endfacet facet normal 7.071068e-01 7.071068e-01 4.999999e-06 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 5.402295e+01 4.497199e+01 6.400000e+00 vertex 4.553769e+01 5.345728e+01 3.200000e+00 endloop endfacet facet normal -6.803259e-01 6.803259e-01 -2.726049e-01 outer loop vertex -5.389038e+01 -4.510457e+01 7.500000e-01 vertex 4.497198e+01 5.345728e+01 0.000000e+00 vertex -5.345728e+01 -4.497199e+01 0.000000e+00 endloop endfacet facet normal -6.803299e-01 6.803299e-01 -2.725849e-01 outer loop vertex 4.497198e+01 5.345728e+01 0.000000e+00 vertex -5.389038e+01 -4.510457e+01 7.500000e-01 vertex 4.510458e+01 5.389037e+01 7.500000e-01 endloop endfacet facet normal -7.071068e-01 -7.071068e-01 0.000000e+00 outer loop vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex -4.497198e+01 -5.402296e+01 7.500000e-01 vertex -4.497198e+01 -5.402296e+01 6.400000e+00 endloop endfacet facet normal -7.071058e-01 -7.071078e-01 2.999999e-06 outer loop vertex -4.497198e+01 -5.402296e+01 7.500000e-01 vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex -5.345728e+01 -4.553767e+01 3.200000e+00 endloop endfacet facet normal -7.071064e-01 -7.071074e-01 1.000000e-06 outer loop vertex -5.389038e+01 -4.510457e+01 7.500000e-01 vertex -4.497198e+01 -5.402296e+01 7.500000e-01 vertex -5.345728e+01 -4.553767e+01 3.200000e+00 endloop endfacet facet normal -6.859948e-01 6.859948e-01 -2.425329e-01 outer loop vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex 4.553769e+01 5.345728e+01 3.200000e+00 vertex -5.345728e+01 -4.553767e+01 3.200000e+00 endloop endfacet facet normal -6.859937e-01 6.859937e-01 -2.425389e-01 outer loop vertex 4.553769e+01 5.345728e+01 3.200000e+00 vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex 4.497198e+01 5.402296e+01 6.400000e+00 endloop endfacet facet normal -6.859943e-01 6.859943e-01 2.425361e-01 outer loop vertex -5.345728e+01 -4.553767e+01 3.200000e+00 vertex 4.510458e+01 5.389037e+01 7.500000e-01 vertex -5.389038e+01 -4.510457e+01 7.500000e-01 endloop endfacet facet normal -6.859940e-01 6.859949e-01 2.425350e-01 outer loop vertex 4.510458e+01 5.389037e+01 7.500000e-01 vertex -5.345728e+01 -4.553767e+01 3.200000e+00 vertex 4.553769e+01 5.345728e+01 3.200000e+00 endloop endfacet facet normal -6.239173e-01 -6.239183e-01 -4.705882e-01 outer loop vertex -5.389038e+01 -4.510457e+01 7.500000e-01 vertex -4.497198e+01 -5.345727e+01 0.000000e+00 vertex -4.497198e+01 -5.402296e+01 7.500000e-01 endloop endfacet facet normal -6.239170e-01 -6.239170e-01 -4.705901e-01 outer loop vertex -4.497198e+01 -5.345727e+01 0.000000e+00 vertex -5.389038e+01 -4.510457e+01 7.500000e-01 vertex -5.345728e+01 -4.497199e+01 0.000000e+00 endloop endfacet facet normal 6.239209e-01 6.239200e-01 -4.705810e-01 outer loop vertex 5.345728e+01 4.497199e+01 0.000000e+00 vertex 4.510458e+01 5.389037e+01 7.500000e-01 vertex 5.402295e+01 4.497199e+01 7.500000e-01 endloop endfacet facet normal 6.239149e-01 6.239149e-01 -4.705959e-01 outer loop vertex 4.510458e+01 5.389037e+01 7.500000e-01 vertex 5.345728e+01 4.497199e+01 0.000000e+00 vertex 4.497198e+01 5.345728e+01 0.000000e+00 endloop endfacet facet normal -3.719900e-01 -9.282081e-01 7.301001e-03 outer loop vertex 9.182861e+00 -1.800190e+00 6.124135e+00 vertex 9.675049e+00 -2.020439e+00 3.200000e+00 vertex 9.637863e+00 -1.983253e+00 6.033030e+00 endloop endfacet facet normal 6.087580e-01 -7.933560e-01 0.000000e+00 outer loop vertex 3.936981e+00 -2.522453e+00 6.400000e+00 vertex 3.538315e+00 -2.828358e+00 3.200000e+00 vertex 3.936981e+00 -2.522453e+00 3.200000e+00 endloop endfacet facet normal 6.087580e-01 -7.933560e-01 0.000000e+00 outer loop vertex 3.538315e+00 -2.828358e+00 3.200000e+00 vertex 3.936981e+00 -2.522453e+00 6.400000e+00 vertex 3.538315e+00 -2.828358e+00 6.400000e+00 endloop endfacet facet normal -6.049829e-01 -7.962229e-01 4.989999e-03 outer loop vertex 1.048811e+01 -2.465981e+00 5.842708e+00 vertex 1.094324e+01 -2.828354e+00 3.200000e+00 vertex 1.087686e+01 -2.761971e+00 5.744939e+00 endloop endfacet facet normal 9.238830e-01 -3.826750e-01 0.000000e+00 outer loop vertex 2.020447e+00 -4.806488e+00 6.400000e+00 vertex 1.828156e+00 -5.270733e+00 3.200000e+00 vertex 2.020447e+00 -4.806488e+00 3.200000e+00 endloop endfacet facet normal 9.238830e-01 -3.826750e-01 0.000000e+00 outer loop vertex 1.828156e+00 -5.270733e+00 3.200000e+00 vertex 2.020447e+00 -4.806488e+00 6.400000e+00 vertex 1.828156e+00 -5.270733e+00 6.400000e+00 endloop endfacet facet normal -2.164119e-01 -9.762986e-01 2.619999e-03 outer loop vertex 8.230331e+00 -1.557617e+00 6.294774e+00 vertex 8.240982e+00 -1.568283e+00 3.200000e+00 vertex 8.731583e+00 -1.677032e+00 3.200000e+00 endloop endfacet facet normal 7.071068e-01 -7.071068e-01 9.999997e-07 outer loop vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 5.883133e+00 -1.674429e+01 7.500000e-01 endloop endfacet facet normal 7.071058e-01 -7.071078e-01 0.000000e+00 outer loop vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 1.674429e+01 -5.883125e+00 4.461536e+00 endloop endfacet facet normal 7.071058e-01 -7.071078e-01 0.000000e+00 outer loop vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.674429e+01 -5.883125e+00 4.461536e+00 vertex 1.538666e+01 -7.240757e+00 4.461536e+00 endloop endfacet facet normal 7.071087e-01 -7.071047e-01 0.000000e+00 outer loop vertex 5.883133e+00 -1.674429e+01 7.500000e-01 vertex 7.240768e+00 -1.538664e+01 3.200000e+00 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 endloop endfacet facet normal 7.071068e-01 -7.071068e-01 1.999999e-06 outer loop vertex 7.240768e+00 -1.538664e+01 3.200000e+00 vertex 5.883133e+00 -1.674429e+01 7.500000e-01 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 endloop endfacet facet normal 7.071087e-01 -7.071047e-01 0.000000e+00 outer loop vertex 5.883133e+00 -1.674429e+01 4.461536e+00 vertex 7.240768e+00 -1.538664e+01 3.200000e+00 vertex 7.240768e+00 -1.538664e+01 4.461536e+00 endloop endfacet facet normal -4.474878e-01 -6.712317e-01 -5.909337e-01 outer loop vertex -2.262741e+00 -1.131371e+01 7.500000e-01 vertex 5.879913e+00 -1.608186e+01 0.000000e+00 vertex 5.883133e+00 -1.674429e+01 7.500000e-01 endloop endfacet facet normal 4.617540e-01 -8.870080e-01 0.000000e+00 outer loop vertex 4.806503e+00 -2.020435e+00 6.400000e+00 vertex 4.360779e+00 -2.252468e+00 3.200000e+00 vertex 4.806503e+00 -2.020435e+00 3.200000e+00 endloop endfacet facet normal 4.617540e-01 -8.870080e-01 0.000000e+00 outer loop vertex 4.360779e+00 -2.252468e+00 3.200000e+00 vertex 4.806503e+00 -2.020435e+00 6.400000e+00 vertex 4.360779e+00 -2.252468e+00 6.400000e+00 endloop endfacet facet normal 9.914465e-01 -1.305141e-01 0.000000e+00 outer loop vertex 1.568283e+00 -6.240559e+00 6.400000e+00 vertex 1.502701e+00 -6.738754e+00 3.200000e+00 vertex 1.568283e+00 -6.240559e+00 3.200000e+00 endloop endfacet facet normal 9.914465e-01 -1.305141e-01 0.000000e+00 outer loop vertex 1.502701e+00 -6.738754e+00 3.200000e+00 vertex 1.568283e+00 -6.240559e+00 6.400000e+00 vertex 1.502701e+00 -6.738754e+00 6.400000e+00 endloop endfacet facet normal 7.372802e-01 6.755843e-01 1.928001e-03 outer loop vertex 2.828369e+00 -1.094323e+01 3.200000e+00 vertex 3.091476e+00 -1.123734e+01 5.646421e+00 vertex 3.167847e+00 -1.131371e+01 3.200000e+00 endloop endfacet facet normal 3.826891e-01 -9.238772e-01 0.000000e+00 outer loop vertex 5.270737e+00 -1.828140e+00 6.400000e+00 vertex 4.806503e+00 -2.020435e+00 3.200000e+00 vertex 5.270737e+00 -1.828140e+00 3.200000e+00 endloop endfacet facet normal 3.826891e-01 -9.238772e-01 0.000000e+00 outer loop vertex 4.806503e+00 -2.020435e+00 3.200000e+00 vertex 5.270737e+00 -1.828140e+00 6.400000e+00 vertex 4.806503e+00 -2.020435e+00 6.400000e+00 endloop endfacet facet normal 7.071084e-01 7.071053e-01 0.000000e+00 outer loop vertex 3.167847e+00 -1.131371e+01 3.200000e+00 vertex 7.240768e+00 -1.538664e+01 4.461536e+00 vertex 7.240768e+00 -1.538664e+01 3.200000e+00 endloop endfacet facet normal 7.071078e-01 7.071058e-01 1.999999e-06 outer loop vertex 7.240768e+00 -1.538664e+01 4.461536e+00 vertex 3.167847e+00 -1.131371e+01 3.200000e+00 vertex 3.091476e+00 -1.123734e+01 5.646421e+00 endloop endfacet facet normal 6.755971e-01 -7.372711e-01 0.000000e+00 outer loop vertex 3.538315e+00 -2.828358e+00 6.400000e+00 vertex 3.167847e+00 -3.167835e+00 3.200000e+00 vertex 3.538315e+00 -2.828358e+00 3.200000e+00 endloop endfacet facet normal 6.755971e-01 -7.372711e-01 0.000000e+00 outer loop vertex 3.167847e+00 -3.167835e+00 3.200000e+00 vertex 3.538315e+00 -2.828358e+00 6.400000e+00 vertex 3.167847e+00 -3.167835e+00 6.400000e+00 endloop endfacet facet normal -7.071024e-01 -7.071114e-01 1.700001e-05 outer loop vertex 1.123735e+01 -3.091473e+00 5.646421e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.538666e+01 -7.240757e+00 4.461536e+00 endloop endfacet facet normal -7.071068e-01 -7.071068e-01 1.999999e-06 outer loop vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.123735e+01 -3.091473e+00 5.646421e+00 vertex 1.131371e+01 -3.167835e+00 3.200000e+00 endloop endfacet facet normal 4.361302e-02 -9.990485e-01 0.000000e+00 outer loop vertex 7.240768e+00 -1.480774e+00 6.400000e+00 vertex 6.738754e+00 -1.502689e+00 3.200000e+00 vertex 7.240768e+00 -1.480774e+00 3.200000e+00 endloop endfacet facet normal 4.361302e-02 -9.990485e-01 0.000000e+00 outer loop vertex 6.738754e+00 -1.502689e+00 3.200000e+00 vertex 7.240768e+00 -1.480774e+00 6.400000e+00 vertex 6.738754e+00 -1.502689e+00 6.400000e+00 endloop endfacet facet normal -4.361098e-02 -9.990486e-01 -0.000000e+00 outer loop vertex 7.556412e+00 -1.494553e+00 6.400000e+00 vertex 7.240768e+00 -1.480774e+00 3.200000e+00 vertex 7.556412e+00 -1.494553e+00 3.200000e+00 endloop endfacet facet normal -4.361098e-02 -9.990486e-01 0.000000e+00 outer loop vertex 7.240768e+00 -1.480774e+00 3.200000e+00 vertex 7.556412e+00 -1.494553e+00 6.400000e+00 vertex 7.240768e+00 -1.480774e+00 6.400000e+00 endloop endfacet facet normal -2.685899e-02 -9.994898e-01 1.728300e-02 outer loop vertex 7.556412e+00 -1.494553e+00 6.400000e+00 vertex 8.240982e+00 -1.568283e+00 3.200000e+00 vertex 7.740051e+00 -1.499954e+00 6.373008e+00 endloop endfacet facet normal -4.617348e-01 -8.870005e-01 5.581997e-03 outer loop vertex 9.637863e+00 -1.983253e+00 6.033030e+00 vertex 9.675049e+00 -2.020439e+00 3.200000e+00 vertex 1.012077e+01 -2.252464e+00 3.200000e+00 endloop endfacet facet normal -5.372788e-01 -8.433886e-01 5.220998e-03 outer loop vertex 1.007405e+01 -2.205746e+00 5.938982e+00 vertex 1.012077e+01 -2.252464e+00 3.200000e+00 vertex 1.054459e+01 -2.522453e+00 3.200000e+00 endloop endfacet facet normal -5.309839e-01 -8.473549e-01 6.761000e-03 outer loop vertex 1.007405e+01 -2.205746e+00 5.938982e+00 vertex 1.054459e+01 -2.522453e+00 3.200000e+00 vertex 1.048811e+01 -2.465981e+00 5.842708e+00 endloop endfacet facet normal -1.163310e-01 -9.932059e-01 3.023000e-03 outer loop vertex 7.740051e+00 -1.499954e+00 6.373008e+00 vertex 8.240982e+00 -1.568283e+00 3.200000e+00 vertex 8.230331e+00 -1.557617e+00 6.294774e+00 endloop endfacet facet normal 1.305310e-01 -9.914442e-01 0.000000e+00 outer loop vertex 6.738754e+00 -1.502689e+00 6.400000e+00 vertex 6.240570e+00 -1.568279e+00 3.200000e+00 vertex 6.738754e+00 -1.502689e+00 3.200000e+00 endloop endfacet facet normal 1.305310e-01 -9.914442e-01 0.000000e+00 outer loop vertex 6.240570e+00 -1.568279e+00 3.200000e+00 vertex 6.738754e+00 -1.502689e+00 6.400000e+00 vertex 6.240570e+00 -1.568279e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex 6.240570e+00 -1.568279e+00 6.400000e+00 vertex 6.738754e+00 -1.502689e+00 6.400000e+00 vertex 6.266602e+00 -1.564854e+00 6.400000e+00 endloop endfacet facet normal 3.006951e-01 -9.537203e-01 0.000000e+00 outer loop vertex 5.749985e+00 -1.677040e+00 6.400000e+00 vertex 5.270737e+00 -1.828140e+00 3.200000e+00 vertex 5.749985e+00 -1.677040e+00 3.200000e+00 endloop endfacet facet normal 3.006951e-01 -9.537203e-01 0.000000e+00 outer loop vertex 5.270737e+00 -1.828140e+00 3.200000e+00 vertex 5.749985e+00 -1.677040e+00 6.400000e+00 vertex 5.270737e+00 -1.828140e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 7.240768e+00 -1.538664e+01 3.200000e+00 vertex 2.828369e+00 -1.094323e+01 3.200000e+00 vertex 3.167847e+00 -1.131371e+01 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.828369e+00 -1.094323e+01 3.200000e+00 vertex 7.240768e+00 -1.538664e+01 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.828369e+00 -1.094323e+01 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 2.522461e+00 -1.054457e+01 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.522461e+00 -1.054457e+01 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.522461e+00 -1.054457e+01 3.200000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 2.252472e+00 -1.012077e+01 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.252472e+00 -1.012077e+01 3.200000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 2.020447e+00 -9.675056e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.020447e+00 -9.675056e+00 3.200000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 1.828140e+00 -9.210812e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.828140e+00 -9.210812e+00 3.200000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.828140e+00 -9.210812e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 1.677048e+00 -8.731567e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.677048e+00 -8.731567e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 1.568283e+00 -8.240990e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.568283e+00 -8.240990e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 1.502701e+00 -7.742790e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.502701e+00 -7.742790e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 1.480774e+00 -7.240776e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.480774e+00 -7.240776e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 1.502701e+00 -6.738754e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.502701e+00 -6.738754e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 1.568283e+00 -6.240559e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.568283e+00 -6.240559e+00 3.200000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 5.833633e+00 -8.647915e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.568283e+00 -6.240559e+00 3.200000e+00 vertex 5.833633e+00 -8.647915e+00 3.200000e+00 vertex 1.677048e+00 -5.749973e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.677048e+00 -5.749973e+00 3.200000e+00 vertex 5.833633e+00 -8.647915e+00 3.200000e+00 vertex 1.828156e+00 -5.270733e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 8.647919e+00 -8.647915e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 8.647919e+00 -8.647915e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 9.162964e+00 -7.755821e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 9.162964e+00 -7.755821e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 9.162964e+00 -6.725723e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 9.162964e+00 -6.725723e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 8.647919e+00 -5.833630e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 8.647919e+00 -5.833630e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 5.270737e+00 -1.828140e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 5.270737e+00 -1.828140e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 5.749985e+00 -1.677040e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 5.749985e+00 -1.677040e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 6.240570e+00 -1.568279e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.240570e+00 -1.568279e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 6.738754e+00 -1.502689e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.738754e+00 -1.502689e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 7.240768e+00 -1.480774e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 7.240768e+00 -1.480774e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 7.556412e+00 -1.494553e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 7.556412e+00 -1.494553e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 7.742798e+00 -1.502689e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 7.742798e+00 -1.502689e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 8.240982e+00 -1.568283e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 8.240982e+00 -1.568283e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 8.731583e+00 -1.677032e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 8.731583e+00 -1.677032e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 9.210815e+00 -1.828144e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 9.210815e+00 -1.828144e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 9.675049e+00 -2.020439e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 9.675049e+00 -2.020439e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.012077e+01 -2.252464e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.012077e+01 -2.252464e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.054459e+01 -2.522453e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.054459e+01 -2.522453e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.094324e+01 -2.828354e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.094324e+01 -2.828354e+00 3.200000e+00 vertex 1.538664e+01 -7.240772e+00 3.200000e+00 vertex 1.131371e+01 -3.167835e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 5.833633e+00 -8.647915e+00 3.200000e+00 vertex 2.020447e+00 -4.806488e+00 3.200000e+00 vertex 1.828156e+00 -5.270733e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.020447e+00 -4.806488e+00 3.200000e+00 vertex 5.833633e+00 -8.647915e+00 3.200000e+00 vertex 5.318588e+00 -7.755821e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.020447e+00 -4.806488e+00 3.200000e+00 vertex 5.318588e+00 -7.755821e+00 3.200000e+00 vertex 2.252472e+00 -4.360775e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.252472e+00 -4.360775e+00 3.200000e+00 vertex 5.318588e+00 -7.755821e+00 3.200000e+00 vertex 5.318588e+00 -6.725723e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.252472e+00 -4.360775e+00 3.200000e+00 vertex 5.318588e+00 -6.725723e+00 3.200000e+00 vertex 2.522461e+00 -3.936970e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.522461e+00 -3.936970e+00 3.200000e+00 vertex 5.318588e+00 -6.725723e+00 3.200000e+00 vertex 2.828354e+00 -3.538315e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.828354e+00 -3.538315e+00 3.200000e+00 vertex 5.318588e+00 -6.725723e+00 3.200000e+00 vertex 5.833633e+00 -5.833630e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.828354e+00 -3.538315e+00 3.200000e+00 vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 3.167847e+00 -3.167835e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 3.167847e+00 -3.167835e+00 3.200000e+00 vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 3.538315e+00 -2.828358e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 3.538315e+00 -2.828358e+00 3.200000e+00 vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 6.725723e+00 -5.318581e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 3.538315e+00 -2.828358e+00 3.200000e+00 vertex 6.725723e+00 -5.318581e+00 3.200000e+00 vertex 3.936981e+00 -2.522453e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 3.936981e+00 -2.522453e+00 3.200000e+00 vertex 6.725723e+00 -5.318581e+00 3.200000e+00 vertex 7.755829e+00 -5.318581e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 3.936981e+00 -2.522453e+00 3.200000e+00 vertex 7.755829e+00 -5.318581e+00 3.200000e+00 vertex 4.360779e+00 -2.252468e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.360779e+00 -2.252468e+00 3.200000e+00 vertex 7.755829e+00 -5.318581e+00 3.200000e+00 vertex 4.806503e+00 -2.020435e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.806503e+00 -2.020435e+00 3.200000e+00 vertex 7.755829e+00 -5.318581e+00 3.200000e+00 vertex 8.647919e+00 -5.833630e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.806503e+00 -2.020435e+00 3.200000e+00 vertex 8.647919e+00 -5.833630e+00 3.200000e+00 vertex 5.270737e+00 -1.828140e+00 3.200000e+00 endloop endfacet facet normal 8.870097e-01 -4.617508e-01 0.000000e+00 outer loop vertex 2.252472e+00 -4.360775e+00 6.400000e+00 vertex 2.020447e+00 -4.806488e+00 3.200000e+00 vertex 2.252472e+00 -4.360775e+00 3.200000e+00 endloop endfacet facet normal 8.870097e-01 -4.617508e-01 0.000000e+00 outer loop vertex 2.020447e+00 -4.806488e+00 3.200000e+00 vertex 2.252472e+00 -4.360775e+00 6.400000e+00 vertex 2.020447e+00 -4.806488e+00 6.400000e+00 endloop endfacet facet normal -6.743720e-01 -7.383890e-01 2.000000e-03 outer loop vertex 1.087686e+01 -2.761971e+00 5.744939e+00 vertex 1.131371e+01 -3.167835e+00 3.200000e+00 vertex 1.123735e+01 -3.091473e+00 5.646421e+00 endloop endfacet facet normal -3.007210e-01 -9.537032e-01 4.139001e-03 outer loop vertex 8.712494e+00 -1.657944e+00 6.211606e+00 vertex 8.731583e+00 -1.677032e+00 3.200000e+00 vertex 9.210815e+00 -1.828144e+00 3.200000e+00 endloop endfacet facet normal -4.530930e-01 -8.914319e-01 7.476000e-03 outer loop vertex 9.637863e+00 -1.983253e+00 6.033030e+00 vertex 1.012077e+01 -2.252464e+00 3.200000e+00 vertex 1.007405e+01 -2.205746e+00 5.938982e+00 endloop endfacet facet normal 8.433958e-01 -5.372928e-01 0.000000e+00 outer loop vertex 2.522461e+00 -3.936970e+00 6.400000e+00 vertex 2.252472e+00 -4.360775e+00 3.200000e+00 vertex 2.522461e+00 -3.936970e+00 3.200000e+00 endloop endfacet facet normal 8.433958e-01 -5.372928e-01 0.000000e+00 outer loop vertex 2.252472e+00 -4.360775e+00 3.200000e+00 vertex 2.522461e+00 -3.936970e+00 6.400000e+00 vertex 2.252472e+00 -4.360775e+00 6.400000e+00 endloop endfacet facet normal 1.399580e-01 -1.399580e-01 9.802160e-01 outer loop vertex 7.740051e+00 -1.499954e+00 6.373008e+00 vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 7.556412e+00 -1.494553e+00 6.400000e+00 endloop endfacet facet normal 1.399540e-01 -1.399540e-01 9.802172e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 7.740051e+00 -1.499954e+00 6.373008e+00 vertex 8.230331e+00 -1.557617e+00 6.294774e+00 endloop endfacet facet normal 1.399560e-01 -1.399560e-01 9.802166e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 8.230331e+00 -1.557617e+00 6.294774e+00 vertex 8.712494e+00 -1.657944e+00 6.211606e+00 endloop endfacet facet normal 1.399571e-01 -1.399561e-01 9.802165e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 8.712494e+00 -1.657944e+00 6.211606e+00 vertex 9.182861e+00 -1.800190e+00 6.124135e+00 endloop endfacet facet normal 1.399600e-01 -1.399580e-01 9.802158e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 9.182861e+00 -1.800190e+00 6.124135e+00 vertex 9.637863e+00 -1.983253e+00 6.033030e+00 endloop endfacet facet normal 1.399580e-01 -1.399570e-01 9.802161e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 9.637863e+00 -1.983253e+00 6.033030e+00 vertex 1.007405e+01 -2.205746e+00 5.938982e+00 endloop endfacet facet normal 1.399511e-01 -1.399551e-01 9.802175e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.007405e+01 -2.205746e+00 5.938982e+00 vertex 1.048811e+01 -2.465981e+00 5.842708e+00 endloop endfacet facet normal 1.399580e-01 -1.399560e-01 9.802164e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.048811e+01 -2.465981e+00 5.842708e+00 vertex 1.087686e+01 -2.761971e+00 5.744939e+00 endloop endfacet facet normal 1.399571e-01 -1.399561e-01 9.802165e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.087686e+01 -2.761971e+00 5.744939e+00 vertex 1.123735e+01 -3.091473e+00 5.646421e+00 endloop endfacet facet normal 1.399571e-01 -1.399561e-01 9.802165e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.123735e+01 -3.091473e+00 5.646421e+00 vertex 1.538666e+01 -7.240757e+00 4.461536e+00 endloop endfacet facet normal 1.399559e-01 -1.399569e-01 9.802165e-01 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.538666e+01 -7.240757e+00 4.461536e+00 vertex 1.674429e+01 -5.883125e+00 4.461536e+00 endloop endfacet facet normal 7.933591e-01 -6.087540e-01 0.000000e+00 outer loop vertex 2.828354e+00 -3.538315e+00 6.400000e+00 vertex 2.522461e+00 -3.936970e+00 3.200000e+00 vertex 2.828354e+00 -3.538315e+00 3.200000e+00 endloop endfacet facet normal 7.933591e-01 -6.087540e-01 0.000000e+00 outer loop vertex 2.522461e+00 -3.936970e+00 3.200000e+00 vertex 2.828354e+00 -3.538315e+00 6.400000e+00 vertex 2.522461e+00 -3.936970e+00 6.400000e+00 endloop endfacet facet normal 9.762942e-01 -2.164480e-01 0.000000e+00 outer loop vertex 1.677048e+00 -5.749973e+00 4.800000e+00 vertex 1.568283e+00 -6.240559e+00 3.200000e+00 vertex 1.677048e+00 -5.749973e+00 3.200000e+00 endloop endfacet facet normal 9.762942e-01 -2.164480e-01 0.000000e+00 outer loop vertex 1.568283e+00 -6.240559e+00 3.200000e+00 vertex 1.677048e+00 -5.749973e+00 4.800000e+00 vertex 1.568283e+00 -6.240559e+00 6.400000e+00 endloop endfacet facet normal 9.762942e-01 -2.164480e-01 0.000000e+00 outer loop vertex 1.568283e+00 -6.240559e+00 6.400000e+00 vertex 1.677048e+00 -5.749973e+00 4.800000e+00 vertex 1.677048e+00 -5.749973e+00 6.400000e+00 endloop endfacet facet normal 7.047610e-01 4.698410e-01 -5.315650e-01 outer loop vertex 1.131371e+01 2.262745e+00 7.500000e-01 vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 1.613863e+01 -5.823154e+00 0.000000e+00 endloop endfacet facet normal -5.547002e-01 -8.320503e-01 0.000000e+00 outer loop vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 5.883133e+00 -1.674429e+01 7.500000e-01 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 endloop endfacet facet normal -5.547002e-01 -8.320503e-01 0.000000e+00 outer loop vertex 5.883133e+00 -1.674429e+01 7.500000e-01 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 7.500000e-01 endloop endfacet facet normal 8.320499e-01 5.547009e-01 0.000000e+00 outer loop vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.674429e+01 -5.883125e+00 4.461536e+00 endloop endfacet facet normal 8.320499e-01 5.547009e-01 0.000000e+00 outer loop vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 1.131371e+01 2.262745e+00 7.500000e-01 endloop endfacet facet normal -6.755998e-01 -7.372668e-01 1.611000e-03 outer loop vertex 1.087686e+01 -2.761971e+00 5.744939e+00 vertex 1.094324e+01 -2.828354e+00 3.200000e+00 vertex 1.131371e+01 -3.167835e+00 3.200000e+00 endloop endfacet facet normal -2.883720e-01 -9.574971e-01 6.397001e-03 outer loop vertex 8.712494e+00 -1.657944e+00 6.211606e+00 vertex 9.210815e+00 -1.828144e+00 3.200000e+00 vertex 9.182861e+00 -1.800190e+00 6.124135e+00 endloop endfacet facet normal 1.399569e-01 -1.399559e-01 9.802165e-01 outer loop vertex 7.240768e+00 -1.538664e+01 4.461536e+00 vertex 3.091476e+00 -1.123734e+01 5.646421e+00 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 endloop endfacet facet normal 1.399569e-01 -1.399569e-01 9.802164e-01 outer loop vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.557617e+00 -8.230324e+00 6.294774e+00 vertex 1.494553e+00 -7.556412e+00 6.400000e+00 endloop endfacet facet normal 1.399540e-01 -1.399540e-01 9.802172e-01 outer loop vertex 1.557617e+00 -8.230324e+00 6.294774e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.657959e+00 -8.712479e+00 6.211606e+00 endloop endfacet facet normal 1.399580e-01 -1.399600e-01 9.802158e-01 outer loop vertex 1.657959e+00 -8.712479e+00 6.211606e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.800186e+00 -9.182854e+00 6.124135e+00 endloop endfacet facet normal 1.399560e-01 -1.399550e-01 9.802168e-01 outer loop vertex 1.800186e+00 -9.182854e+00 6.124135e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 2.008377e+00 -9.687119e+00 6.022411e+00 endloop endfacet facet normal 1.399570e-01 -1.399580e-01 9.802161e-01 outer loop vertex 2.008377e+00 -9.687119e+00 6.022411e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 2.205750e+00 -1.007405e+01 5.938982e+00 endloop endfacet facet normal 1.399570e-01 -1.399570e-01 9.802164e-01 outer loop vertex 2.205750e+00 -1.007405e+01 5.938982e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 endloop endfacet facet normal 1.399420e-01 -1.399650e-01 9.802173e-01 outer loop vertex 2.205750e+00 -1.007405e+01 5.938982e+00 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 vertex 2.465988e+00 -1.048810e+01 5.842708e+00 endloop endfacet facet normal 1.399620e-01 -1.399530e-01 9.802161e-01 outer loop vertex 2.465988e+00 -1.048810e+01 5.842708e+00 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 vertex 2.761978e+00 -1.087685e+01 5.744939e+00 endloop endfacet facet normal 1.399530e-01 -1.399580e-01 9.802168e-01 outer loop vertex 2.761978e+00 -1.087685e+01 5.744939e+00 vertex 5.883133e+00 -1.674429e+01 4.461536e+00 vertex 3.091476e+00 -1.123734e+01 5.646421e+00 endloop endfacet facet normal -1.305371e-01 -9.914305e-01 -5.082002e-03 outer loop vertex 7.556412e+00 -1.494553e+00 6.400000e+00 vertex 7.742798e+00 -1.502689e+00 3.200000e+00 vertex 8.240982e+00 -1.568283e+00 3.200000e+00 endloop endfacet facet normal 5.989327e-01 -5.989327e-01 -5.315628e-01 outer loop vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 5.879913e+00 -1.608186e+01 0.000000e+00 vertex 1.613863e+01 -5.823154e+00 0.000000e+00 endloop endfacet facet normal 5.989310e-01 -5.989310e-01 -5.315669e-01 outer loop vertex 5.879913e+00 -1.608186e+01 0.000000e+00 vertex 1.674429e+01 -5.883125e+00 7.500000e-01 vertex 5.883133e+00 -1.674429e+01 7.500000e-01 endloop endfacet facet normal 5.372940e-01 -8.433951e-01 0.000000e+00 outer loop vertex 4.360779e+00 -2.252468e+00 6.400000e+00 vertex 3.936981e+00 -2.522453e+00 3.200000e+00 vertex 4.360779e+00 -2.252468e+00 3.200000e+00 endloop endfacet facet normal 5.372940e-01 -8.433951e-01 0.000000e+00 outer loop vertex 3.936981e+00 -2.522453e+00 3.200000e+00 vertex 4.360779e+00 -2.252468e+00 6.400000e+00 vertex 3.936981e+00 -2.522453e+00 6.400000e+00 endloop endfacet facet normal 2.164409e-01 -9.762957e-01 0.000000e+00 outer loop vertex 6.240570e+00 -1.568279e+00 6.400000e+00 vertex 5.749985e+00 -1.677040e+00 3.200000e+00 vertex 6.240570e+00 -1.568279e+00 3.200000e+00 endloop endfacet facet normal 2.164409e-01 -9.762957e-01 0.000000e+00 outer loop vertex 5.749985e+00 -1.677040e+00 3.200000e+00 vertex 6.240570e+00 -1.568279e+00 6.400000e+00 vertex 5.749985e+00 -1.677040e+00 6.400000e+00 endloop endfacet facet normal -2.028969e-01 -9.791877e-01 4.919999e-03 outer loop vertex 8.230331e+00 -1.557617e+00 6.294774e+00 vertex 8.731583e+00 -1.677032e+00 3.200000e+00 vertex 8.712494e+00 -1.657944e+00 6.211606e+00 endloop endfacet facet normal -3.826839e-01 -9.238648e-01 5.173998e-03 outer loop vertex 9.182861e+00 -1.800190e+00 6.124135e+00 vertex 9.210815e+00 -1.828144e+00 3.200000e+00 vertex 9.675049e+00 -2.020439e+00 3.200000e+00 endloop endfacet facet normal 7.372668e-01 -6.756018e-01 0.000000e+00 outer loop vertex 3.167847e+00 -3.167835e+00 6.400000e+00 vertex 2.828354e+00 -3.538315e+00 3.200000e+00 vertex 3.167847e+00 -3.167835e+00 3.200000e+00 endloop endfacet facet normal 7.372668e-01 -6.756018e-01 0.000000e+00 outer loop vertex 2.828354e+00 -3.538315e+00 3.200000e+00 vertex 3.167847e+00 -3.167835e+00 6.400000e+00 vertex 2.828354e+00 -3.538315e+00 6.400000e+00 endloop endfacet facet normal 9.990475e-01 -4.363598e-02 0.000000e+00 outer loop vertex 1.502701e+00 -6.738754e+00 6.400000e+00 vertex 1.480774e+00 -7.240776e+00 3.200000e+00 vertex 1.502701e+00 -6.738754e+00 3.200000e+00 endloop endfacet facet normal 9.990475e-01 -4.363598e-02 0.000000e+00 outer loop vertex 1.480774e+00 -7.240776e+00 3.200000e+00 vertex 1.502701e+00 -6.738754e+00 6.400000e+00 vertex 1.480774e+00 -7.240776e+00 6.400000e+00 endloop endfacet facet normal -6.087627e-01 -7.933426e-01 3.943998e-03 outer loop vertex 1.048811e+01 -2.465981e+00 5.842708e+00 vertex 1.054459e+01 -2.522453e+00 3.200000e+00 vertex 1.094324e+01 -2.828354e+00 3.200000e+00 endloop endfacet facet normal 9.537147e-01 -3.007129e-01 0.000000e+00 outer loop vertex 1.828156e+00 -5.270733e+00 6.400000e+00 vertex 1.677048e+00 -5.749973e+00 3.200000e+00 vertex 1.828156e+00 -5.270733e+00 3.200000e+00 endloop endfacet facet normal 9.537147e-01 -3.007129e-01 0.000000e+00 outer loop vertex 1.677048e+00 -5.749973e+00 3.200000e+00 vertex 1.828156e+00 -5.270733e+00 6.400000e+00 vertex 1.677048e+00 -5.749973e+00 4.800000e+00 endloop endfacet facet normal 9.537147e-01 -3.007129e-01 0.000000e+00 outer loop vertex 1.677048e+00 -5.749973e+00 4.800000e+00 vertex 1.828156e+00 -5.270733e+00 6.400000e+00 vertex 1.677048e+00 -5.749973e+00 6.400000e+00 endloop endfacet facet normal 7.071068e-01 -7.071068e-01 0.000000e+00 outer loop vertex -2.262741e+00 -1.131371e+01 7.500000e-01 vertex -4.497198e+01 -5.402296e+01 6.400000e+00 vertex -4.497198e+01 -5.402296e+01 7.500000e-01 endloop endfacet facet normal 7.071068e-01 -7.071068e-01 0.000000e+00 outer loop vertex -4.497198e+01 -5.402296e+01 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 7.500000e-01 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 endloop endfacet facet normal 6.239179e-01 -6.239179e-01 -4.705879e-01 outer loop vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex -4.497198e+01 -5.402296e+01 7.500000e-01 vertex -4.497198e+01 -5.345727e+01 0.000000e+00 endloop endfacet facet normal 6.239198e-01 -6.239198e-01 -4.705828e-01 outer loop vertex -4.497198e+01 -5.402296e+01 7.500000e-01 vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex -2.262741e+00 -1.131371e+01 7.500000e-01 endloop endfacet facet normal 7.071068e-01 -7.071068e-01 0.000000e+00 outer loop vertex 5.402295e+01 4.497199e+01 6.400000e+00 vertex 1.131371e+01 2.262745e+00 7.500000e-01 vertex 5.402295e+01 4.497199e+01 7.500000e-01 endloop endfacet facet normal 7.071068e-01 -7.071068e-01 0.000000e+00 outer loop vertex 1.131371e+01 2.262745e+00 7.500000e-01 vertex 5.402295e+01 4.497199e+01 6.400000e+00 vertex 1.131371e+01 2.262745e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex -4.497198e+01 -5.402296e+01 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 2.522461e+00 -3.936970e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex -5.402295e+01 -4.497199e+01 6.400000e+00 vertex 2.522461e+00 -3.936970e+00 6.400000e+00 vertex 4.497198e+01 5.402296e+01 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.522461e+00 -3.936970e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 2.252472e+00 -4.360775e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.252472e+00 -4.360775e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 2.020447e+00 -4.806488e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.020447e+00 -4.806488e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.828156e+00 -5.270733e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.828156e+00 -5.270733e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.677048e+00 -5.749973e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.677048e+00 -5.749973e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.568283e+00 -6.240559e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.568283e+00 -6.240559e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.502701e+00 -6.738754e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.502701e+00 -6.738754e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.480774e+00 -7.240776e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 1.480774e+00 -7.240776e+00 6.400000e+00 vertex -2.262741e+00 -1.131371e+01 6.400000e+00 vertex 1.494553e+00 -7.556412e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 2.522461e+00 -3.936970e+00 6.400000e+00 vertex 2.828354e+00 -3.538315e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 2.828354e+00 -3.538315e+00 6.400000e+00 vertex 3.167847e+00 -3.167835e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 3.167847e+00 -3.167835e+00 6.400000e+00 vertex 3.538315e+00 -2.828358e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 3.538315e+00 -2.828358e+00 6.400000e+00 vertex 3.936981e+00 -2.522453e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 3.936981e+00 -2.522453e+00 6.400000e+00 vertex 4.360779e+00 -2.252468e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 4.360779e+00 -2.252468e+00 6.400000e+00 vertex 4.806503e+00 -2.020435e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 4.806503e+00 -2.020435e+00 6.400000e+00 vertex 5.270737e+00 -1.828140e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 5.270737e+00 -1.828140e+00 6.400000e+00 vertex 5.749985e+00 -1.677040e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 5.749985e+00 -1.677040e+00 6.400000e+00 vertex 6.240570e+00 -1.568279e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 6.240570e+00 -1.568279e+00 6.400000e+00 vertex 6.266602e+00 -1.564854e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 6.266602e+00 -1.564854e+00 6.400000e+00 vertex 6.738754e+00 -1.502689e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 6.738754e+00 -1.502689e+00 6.400000e+00 vertex 7.240768e+00 -1.480774e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 7.240768e+00 -1.480774e+00 6.400000e+00 vertex 7.556412e+00 -1.494553e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 7.556412e+00 -1.494553e+00 6.400000e+00 vertex 1.131371e+01 2.262745e+00 6.400000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.497198e+01 5.402296e+01 6.400000e+00 vertex 1.131371e+01 2.262745e+00 6.400000e+00 vertex 5.402295e+01 4.497199e+01 6.400000e+00 endloop endfacet facet normal -4.443181e-01 -6.642081e-01 -6.011730e-01 outer loop vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex 5.879913e+00 -1.608186e+01 0.000000e+00 vertex -2.262741e+00 -1.131371e+01 7.500000e-01 endloop endfacet facet normal 6.239206e-01 -6.239206e-01 -4.705807e-01 outer loop vertex 5.402295e+01 4.497199e+01 7.500000e-01 vertex 1.068071e+01 2.195427e+00 0.000000e+00 vertex 5.345728e+01 4.497199e+01 0.000000e+00 endloop endfacet facet normal 6.239198e-01 -6.239198e-01 -4.705828e-01 outer loop vertex 1.068071e+01 2.195427e+00 0.000000e+00 vertex 5.402295e+01 4.497199e+01 7.500000e-01 vertex 1.131371e+01 2.262745e+00 7.500000e-01 endloop endfacet facet normal 6.619063e-01 4.505322e-01 -5.990833e-01 outer loop vertex 1.068071e+01 2.195427e+00 0.000000e+00 vertex 1.131371e+01 2.262745e+00 7.500000e-01 vertex 1.613863e+01 -5.823154e+00 0.000000e+00 endloop endfacet facet normal -4.361398e-02 -9.990485e-01 -0.000000e+00 outer loop vertex 7.556412e+00 -1.494553e+00 6.400000e+00 vertex 7.556412e+00 -1.494553e+00 3.200000e+00 vertex 7.742798e+00 -1.502689e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex -5.345728e+01 -4.497199e+01 0.000000e+00 vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex -4.497198e+01 -5.345727e+01 0.000000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex -5.345728e+01 -4.497199e+01 0.000000e+00 vertex 4.497198e+01 5.345728e+01 0.000000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex 4.497198e+01 5.345728e+01 0.000000e+00 vertex 1.068071e+01 2.195427e+00 0.000000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex -2.194946e+00 -1.068023e+01 0.000000e+00 vertex 1.068071e+01 2.195427e+00 0.000000e+00 vertex 5.879913e+00 -1.608186e+01 0.000000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex 5.879913e+00 -1.608186e+01 0.000000e+00 vertex 1.068071e+01 2.195427e+00 0.000000e+00 vertex 1.613863e+01 -5.823154e+00 0.000000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 outer loop vertex 1.068071e+01 2.195427e+00 0.000000e+00 vertex 4.497198e+01 5.345728e+01 0.000000e+00 vertex 5.345728e+01 4.497199e+01 0.000000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.981964e+00 -8.206696e+00 3.950000e+00 vertex 6.274857e+00 -7.499592e+00 3.950000e+00 vertex 6.533676e+00 -7.947880e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.274857e+00 -7.499592e+00 3.950000e+00 vertex 6.981964e+00 -8.206696e+00 3.950000e+00 vertex 6.274857e+00 -6.981953e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.274857e+00 -6.981953e+00 3.950000e+00 vertex 6.981964e+00 -8.206696e+00 3.950000e+00 vertex 7.499588e+00 -8.206696e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.274857e+00 -6.981953e+00 3.950000e+00 vertex 7.499588e+00 -8.206696e+00 3.950000e+00 vertex 7.947876e+00 -7.947880e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.274857e+00 -6.981953e+00 3.950000e+00 vertex 7.947876e+00 -7.947880e+00 3.950000e+00 vertex 6.533676e+00 -6.533665e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.533676e+00 -6.533665e+00 3.950000e+00 vertex 7.947876e+00 -7.947880e+00 3.950000e+00 vertex 8.206696e+00 -7.499592e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.533676e+00 -6.533665e+00 3.950000e+00 vertex 8.206696e+00 -7.499592e+00 3.950000e+00 vertex 6.981964e+00 -6.274845e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.981964e+00 -6.274845e+00 3.950000e+00 vertex 8.206696e+00 -7.499592e+00 3.950000e+00 vertex 8.206696e+00 -6.981953e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 6.981964e+00 -6.274845e+00 3.950000e+00 vertex 8.206696e+00 -6.981953e+00 3.950000e+00 vertex 7.499588e+00 -6.274845e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 7.499588e+00 -6.274845e+00 3.950000e+00 vertex 8.206696e+00 -6.981953e+00 3.950000e+00 vertex 7.947876e+00 -6.533665e+00 3.950000e+00 endloop endfacet facet normal 6.171330e-01 0.000000e+00 7.868589e-01 outer loop vertex 9.162964e+00 -7.755821e+00 3.200000e+00 vertex 8.206696e+00 -6.981953e+00 3.950000e+00 vertex 8.206696e+00 -7.499592e+00 3.950000e+00 endloop endfacet facet normal 6.171330e-01 0.000000e+00 7.868589e-01 outer loop vertex 8.206696e+00 -6.981953e+00 3.950000e+00 vertex 9.162964e+00 -7.755821e+00 3.200000e+00 vertex 9.162964e+00 -6.725723e+00 3.200000e+00 endloop endfacet facet normal 5.344511e-01 -3.085661e-01 7.868602e-01 outer loop vertex 8.647919e+00 -8.647915e+00 3.200000e+00 vertex 8.206696e+00 -7.499592e+00 3.950000e+00 vertex 7.947876e+00 -7.947880e+00 3.950000e+00 endloop endfacet facet normal 5.344540e-01 -3.085640e-01 7.868591e-01 outer loop vertex 8.206696e+00 -7.499592e+00 3.950000e+00 vertex 8.647919e+00 -8.647915e+00 3.200000e+00 vertex 9.162964e+00 -7.755821e+00 3.200000e+00 endloop endfacet facet normal 3.085658e-01 -5.344507e-01 7.868606e-01 outer loop vertex 8.647919e+00 -8.647915e+00 3.200000e+00 vertex 7.499588e+00 -8.206696e+00 3.950000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 endloop endfacet facet normal 3.085631e-01 -5.344542e-01 7.868593e-01 outer loop vertex 7.499588e+00 -8.206696e+00 3.950000e+00 vertex 8.647919e+00 -8.647915e+00 3.200000e+00 vertex 7.947876e+00 -7.947880e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 -6.171330e-01 7.868589e-01 outer loop vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 6.981964e+00 -8.206696e+00 3.950000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 -6.171330e-01 7.868589e-01 outer loop vertex 6.981964e+00 -8.206696e+00 3.950000e+00 vertex 7.755829e+00 -9.162964e+00 3.200000e+00 vertex 7.499588e+00 -8.206696e+00 3.950000e+00 endloop endfacet facet normal -3.085659e-01 -5.344518e-01 7.868598e-01 outer loop vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 6.533676e+00 -7.947880e+00 3.950000e+00 vertex 5.833633e+00 -8.647915e+00 3.200000e+00 endloop endfacet facet normal -3.085620e-01 -5.344521e-01 7.868611e-01 outer loop vertex 6.533676e+00 -7.947880e+00 3.950000e+00 vertex 6.725723e+00 -9.162964e+00 3.200000e+00 vertex 6.981964e+00 -8.206696e+00 3.950000e+00 endloop endfacet facet normal -5.344530e-01 -3.085630e-01 7.868601e-01 outer loop vertex 6.533676e+00 -7.947880e+00 3.950000e+00 vertex 5.318588e+00 -7.755821e+00 3.200000e+00 vertex 5.833633e+00 -8.647915e+00 3.200000e+00 endloop endfacet facet normal -5.344528e-01 -3.085669e-01 7.868587e-01 outer loop vertex 5.318588e+00 -7.755821e+00 3.200000e+00 vertex 6.533676e+00 -7.947880e+00 3.950000e+00 vertex 6.274857e+00 -7.499592e+00 3.950000e+00 endloop endfacet facet normal -6.171330e-01 0.000000e+00 7.868589e-01 outer loop vertex 6.274857e+00 -7.499592e+00 3.950000e+00 vertex 5.318588e+00 -6.725723e+00 3.200000e+00 vertex 5.318588e+00 -7.755821e+00 3.200000e+00 endloop endfacet facet normal -6.171330e-01 0.000000e+00 7.868589e-01 outer loop vertex 5.318588e+00 -6.725723e+00 3.200000e+00 vertex 6.274857e+00 -7.499592e+00 3.950000e+00 vertex 6.274857e+00 -6.981953e+00 3.950000e+00 endloop endfacet facet normal -5.344540e-01 3.085640e-01 7.868591e-01 outer loop vertex 6.274857e+00 -6.981953e+00 3.950000e+00 vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 5.318588e+00 -6.725723e+00 3.200000e+00 endloop endfacet facet normal -5.344511e-01 3.085661e-01 7.868602e-01 outer loop vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 6.274857e+00 -6.981953e+00 3.950000e+00 vertex 6.533676e+00 -6.533665e+00 3.950000e+00 endloop endfacet facet normal -3.085659e-01 5.344518e-01 7.868598e-01 outer loop vertex 6.981964e+00 -6.274845e+00 3.950000e+00 vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 6.533676e+00 -6.533665e+00 3.950000e+00 endloop endfacet facet normal -3.085659e-01 5.344518e-01 7.868598e-01 outer loop vertex 5.833633e+00 -5.833630e+00 3.200000e+00 vertex 6.981964e+00 -6.274845e+00 3.950000e+00 vertex 6.725723e+00 -5.318581e+00 3.200000e+00 endloop endfacet facet normal 0.000000e+00 6.171340e-01 7.868581e-01 outer loop vertex 7.499588e+00 -6.274845e+00 3.950000e+00 vertex 6.725723e+00 -5.318581e+00 3.200000e+00 vertex 6.981964e+00 -6.274845e+00 3.950000e+00 endloop endfacet facet normal 0.000000e+00 6.171340e-01 7.868581e-01 outer loop vertex 6.725723e+00 -5.318581e+00 3.200000e+00 vertex 7.499588e+00 -6.274845e+00 3.950000e+00 vertex 7.755829e+00 -5.318581e+00 3.200000e+00 endloop endfacet facet normal 3.085659e-01 5.344518e-01 7.868598e-01 outer loop vertex 7.947876e+00 -6.533665e+00 3.950000e+00 vertex 7.755829e+00 -5.318581e+00 3.200000e+00 vertex 7.499588e+00 -6.274845e+00 3.950000e+00 endloop endfacet facet normal 3.085659e-01 5.344518e-01 7.868598e-01 outer loop vertex 7.755829e+00 -5.318581e+00 3.200000e+00 vertex 7.947876e+00 -6.533665e+00 3.950000e+00 vertex 8.647919e+00 -5.833630e+00 3.200000e+00 endloop endfacet facet normal 5.344528e-01 3.085669e-01 7.868587e-01 outer loop vertex 9.162964e+00 -6.725723e+00 3.200000e+00 vertex 7.947876e+00 -6.533665e+00 3.950000e+00 vertex 8.206696e+00 -6.981953e+00 3.950000e+00 endloop endfacet facet normal 5.344530e-01 3.085630e-01 7.868601e-01 outer loop vertex 7.947876e+00 -6.533665e+00 3.950000e+00 vertex 9.162964e+00 -6.725723e+00 3.200000e+00 vertex 8.647919e+00 -5.833630e+00 3.200000e+00 endloop endfacet facet normal 7.383561e-01 6.744090e-01 1.671000e-03 outer loop vertex 2.761978e+00 -1.087685e+01 5.744939e+00 vertex 3.091476e+00 -1.123734e+01 5.646421e+00 vertex 2.828369e+00 -1.094323e+01 3.200000e+00 endloop endfacet facet normal 7.961162e-01 6.051301e-01 4.081001e-03 outer loop vertex 2.465988e+00 -1.048810e+01 5.842708e+00 vertex 2.761978e+00 -1.087685e+01 5.744939e+00 vertex 2.522461e+00 -1.054457e+01 3.200000e+00 endloop endfacet facet normal 7.933351e-01 6.087661e-01 4.818000e-03 outer loop vertex 2.522461e+00 -1.054457e+01 3.200000e+00 vertex 2.761978e+00 -1.087685e+01 5.744939e+00 vertex 2.828369e+00 -1.094323e+01 3.200000e+00 endloop endfacet facet normal 8.433733e-01 5.372882e-01 6.541003e-03 outer loop vertex 2.252472e+00 -1.012077e+01 3.200000e+00 vertex 2.465988e+00 -1.048810e+01 5.842708e+00 vertex 2.522461e+00 -1.054457e+01 3.200000e+00 endloop endfacet facet normal 8.472042e-01 5.312401e-01 5.391001e-03 outer loop vertex 2.205750e+00 -1.007405e+01 5.938982e+00 vertex 2.465988e+00 -1.048810e+01 5.842708e+00 vertex 2.252472e+00 -1.012077e+01 3.200000e+00 endloop endfacet facet normal 8.869877e-01 4.617359e-01 7.254998e-03 outer loop vertex 2.020447e+00 -9.675056e+00 3.200000e+00 vertex 2.205750e+00 -1.007405e+01 5.938982e+00 vertex 2.252472e+00 -1.012077e+01 3.200000e+00 endloop endfacet facet normal 8.912891e-01 4.533991e-01 5.749000e-03 outer loop vertex 2.020447e+00 -9.675056e+00 3.200000e+00 vertex 2.008377e+00 -9.687119e+00 6.022411e+00 vertex 2.205750e+00 -1.007405e+01 5.938982e+00 endloop endfacet facet normal 9.238582e-01 3.826941e-01 5.586002e-03 outer loop vertex 1.828140e+00 -9.210812e+00 3.200000e+00 vertex 2.008377e+00 -9.687119e+00 6.022411e+00 vertex 2.020447e+00 -9.675056e+00 3.200000e+00 endloop endfacet facet normal 9.246783e-01 3.807141e-01 5.200001e-03 outer loop vertex 1.800186e+00 -9.182854e+00 6.124135e+00 vertex 2.008377e+00 -9.687119e+00 6.022411e+00 vertex 1.828140e+00 -9.210812e+00 3.200000e+00 endloop endfacet facet normal 9.575091e-01 2.883320e-01 6.397001e-03 outer loop vertex 1.657959e+00 -8.712479e+00 6.211606e+00 vertex 1.800186e+00 -9.182854e+00 6.124135e+00 vertex 1.828140e+00 -9.210812e+00 3.200000e+00 endloop endfacet facet normal 9.537161e-01 3.006800e-01 4.139001e-03 outer loop vertex 1.657959e+00 -8.712479e+00 6.211606e+00 vertex 1.828140e+00 -9.210812e+00 3.200000e+00 vertex 1.677048e+00 -8.731567e+00 3.200000e+00 endloop endfacet facet normal 9.762821e-01 2.164490e-01 4.816000e-03 outer loop vertex 1.568283e+00 -8.240990e+00 3.200000e+00 vertex 1.657959e+00 -8.712479e+00 6.211606e+00 vertex 1.677048e+00 -8.731567e+00 3.200000e+00 endloop endfacet facet normal 9.791123e-01 2.033030e-01 2.674001e-03 outer loop vertex 1.557617e+00 -8.230324e+00 6.294774e+00 vertex 1.657959e+00 -8.712479e+00 6.211606e+00 vertex 1.568283e+00 -8.240990e+00 3.200000e+00 endloop endfacet facet normal 9.956901e-01 9.269100e-02 3.112000e-03 outer loop vertex 1.494553e+00 -7.556412e+00 6.400000e+00 vertex 1.557617e+00 -8.230324e+00 6.294774e+00 vertex 1.568283e+00 -8.240990e+00 3.200000e+00 endloop endfacet facet normal 9.914339e-01 1.305110e-01 -5.076999e-03 outer loop vertex 1.494553e+00 -7.556412e+00 6.400000e+00 vertex 1.568283e+00 -8.240990e+00 3.200000e+00 vertex 1.502701e+00 -7.742790e+00 3.200000e+00 endloop endfacet facet normal 9.990485e-01 4.361198e-02 0.000000e+00 outer loop vertex 1.480774e+00 -7.240776e+00 6.400000e+00 vertex 1.494553e+00 -7.556412e+00 6.400000e+00 vertex 1.480774e+00 -7.240776e+00 3.200000e+00 endloop endfacet facet normal 9.990475e-01 4.363598e-02 1.999999e-06 outer loop vertex 1.480774e+00 -7.240776e+00 3.200000e+00 vertex 1.494553e+00 -7.556412e+00 6.400000e+00 vertex 1.502701e+00 -7.742790e+00 3.200000e+00 endloop endfacet endsolid Default openscad-2019.05/testdata/scad/misc/bad-stl-tardis.scad0000644000076500000240000000114113402025764023223 0ustar kintelstaff00000000000000/* sorry, this triangulation does not deal with intersecting constraints CGAL error: assertion violation! Expression : false File : ../libraries/install/include/CGAL/Constrained_triangulation_2.h Line : 636 Explanation: Refer to the bug-reporting instructions at http://www.cgal.org/bug_report.html 2013-12-29 21:15:18.937 OpenSCAD[35590:507] ERROR: CGAL NefPolyhedron Triangulation failed 2013-12-29 21:15:19.104 OpenSCAD[35590:507] ERROR: CGAL NefPolyhedron->Polyhedron conversion failed. This has been fixed, but keep this test for future reference */ render() import("bad-stl-tardis.stl"); openscad-2019.05/testdata/scad/misc/bad-stl-tardis.stl0000644000076500000240000054317413402025764023134 0ustar kintelstaff000000000000004?wBQxB%?wByBwByB%??wBQxB%?wBQxBB`?wByB?wByBwBQxB?wBOxB?wByBwBQxBB`?wBQxB??Q@yB@@V@yB%?V@yB@@?Q@yB@@Q@yB%?V@yB%?21$w&mA%?~&Aw&mA21$bw&mA%?~&A%?~&A?BA@@wBAq@BAq@?BA@@wBA@@wBAq@?ByB@wBmB@wByB@?ByB@BmB@wBmB@BOxBrBOxBByBwByBrBOxBwBOxBwByBByBrBOxB?wByB%?ByB@@wByB@@?wByB%?ByB%?ByB@@?pBA@@aBAq@pBAq@?pBA@@aBA@@aBAq@?V@yB@Q@mB@Q@yB@?V@yB@V@mB@Q@mB@vBmAwBAwBlAvBmAvBAwBABABmABABABmABmA?ByB%?wByB@@ByB@@?ByB%?wByB%?wByB@@BlBwBgBBgBBlBwBlBwBgB?wBA@@BAq@wBAq@?wBA@@BA@@BAq@?wByB@BmB@ByB@?wByB@wBmB@BmB@?wByB%?ByB@@wByB@@?wByB%?ByB%?ByB@@?ByB@wBmB@wByB@?ByB@BmB@wBmB@pBgBB8YBpB8YBpBgBBgBB8YB?YwBlA@@wBAq@wBlAq@?YwBlA@@wBA@@wBAq@?pByBByB%?ByB?pByBpByB%?ByB%??pByB@BmB@ByB@?pByB@pBmB@BmB@pBOxBkBOxBpByBaByBkBOxBaBOxBaByBpByBkBOxB?wBA@@BAq@wBAq@?wBA@@BA@@BAq@?aByBpByB%?pByB?aByBaByB%?pByB%??aByB@pBmB@pByB@?aByB@aBmB@pBmB@ BlBaBgB BgB BlBaBlBaBgB?BA@@pBAq@BAq@?BA@@pBA@@pBAq@?aByB%? ByB@@aByB@@?aByB%? ByB%? ByB@@? ByB@aBmB@aByB@? ByB@ BmB@aBmB@BpA>Bd;??pA|)Bd;?pA|)BpA>B?wBA%?BmA%?BA%??wBA%?wBlA%?BmA%??pABBd;?pARWBpARWBd;??pABBd;?pABBpARWB?pAjBd;?pA|%BpA|%Bd;??pAjBd;?pAjBpA|%B?pAmBb@@gBb@pAgBb@?pAmBb@@mBb@@gBb@wBOxBByBwByBwBOxBBOxBByBwBOxBByBwByBwBOxBBOxBByB?BgB@@wB8YB@@B8YB@@?BgB@@wBgB@@wB8YB@@?/AjBd;?pAjBpAjBd;??/AjBd;?/AjBpAjBBOxBpByBByBBOxBpBOxBpByB?/A|)Bd;?pA|)BpA|)Bd;??/A|)Bd;?/A|)BpA|)B4?/ABBd;?pABBpABBd;?4?/ABBd;?/ABBpABB?/ABBd;?/ARWB/ARWBd;??/ABBd;?/ABB/ARWBaBOxB ByBaByBaBOxB BOxB ByB?B/A>Bd;??/A|)Bd;?/A|)B/A>B@OxBQ@yB@yB@OxBQ@OxBQ@yB?/AjBd;?/A|%B/A|%Bd;??/AjBd;?/AjB/A|%B?Bd;?Bd;?BBd;?BBd;?/A>Bd;?/A>BBpARWBd;?/ARWB/ARWBd;?pARWBd;?pARWB/ARWB?wBlBwBgB%?wBgB?wBlBwBlB?wBgB%??wBgB%?wBlBB`?wBlB%??wBgB%?wBlB?wBlBB`??wBmBb@BgBb@wBgBb@?wBmBb@BmBb@BgBb@wBgBB8YBwB8YBwBgBBgBB8YB/ARWBd;?/ABB/ABBd;?/ARWBd;?/ARWB/ABB/A>Bd;?/A|)B/A|)Bd;?/A>Bd;?/A>B/A|)B?wBmBb@BgBb@wBgBb@?wBmBb@BmBb@BgBb@?BmBb@pBgBb@BgBb@?BmBb@pBmBb@pBgBb@kBlBaBgBaBlBaBgBpBlBpBgBaBgBkBlBpBlB?pBgB@@aB8YB@@pB8YB@@?pBgB@@aBgB@@aB8YB@@?aBmBb@ BgBb@aBgBb@?aBmBb@ BmBb@ BgBb@? BmBb@Bd;?Bd;?Bd;?B%?V@|)B@@V@>B@@V@>B%?V@|)B%?V@|)B@@vBBwB|%BwBBvBBvB|%BwB|%BB|%BBBB|%BB|%BBBBB?/ABBd;?pA>Bd;?/A>Bd;??/ABBd;?pABBd;?pA>Bd;??V@Bb@Q@|%Bb@V@|%Bb@?V@Bb@Q@Bb@Q@|%Bb@pBABmApBnApBABABmA?wBBBd;?BRWBd;?wBRWBd;??wBBBd;?BBBd;?BRWBd;?BBwB|%BB|%BBBwBBwB|%B?pBAq@aBmAq@pBnAq@?pBAq@aBAq@aBmAq@wB|)BB>BwB>BwB|)BB|)BB>B BBaBA BA BBaBBaBA B|)BB B>B B|)BBQ@V BV@jBQ@jBQ@V B@V BV@jBV@jB@AV@AV@jB@V B@AwBlABABmAwBlAwBABA?wBB@@BA@@wBA@@?wBB@@BB@@BA@@?wBB@@BA@@wBA@@?wBB@@BB@@BA@@?BB@@pBA@@BA@@?BB@@pBB@@pBA@@aBBpBAaBAaBBpBBpBA? (BB@@0-B%B@@ (B%B@@?Z 4BB@@ (BB@@3BB@@?H4B%B@@B`ABB@@5B%B@@?v5B%B@@B`ABB@@5B%B@@?HB/B@@aBA@@IB%B@@?aBB@@HBB@@HBB@@?3BB@@ (BB@@`2BB@@? (BB@@3B%B@@`2B%B@@? (BB@@B`ABB@@3B%B@@?̡6B%B@@B`ABB@@Q7B%B@@?B`ABB@@ BB@@/6BB@@?3B%B@@B`ABB@@> 4B%B@@?H4BB@@ (BB@@أ4BB@@?HBB@@aBA@@HB/B@@?/6B%B@@B`ABB@@̡6B%B@@?6^4BB@@ (BB@@> 4BB@@?HBB@@ BA@@aBA@@?HBB@@FBB@@ BA@@? BB@@B`ABB@@FBB@@?V5B%B@@B`ABB@@v5B%B@@?v5BB@@ (BB@@V5BB@@? BB@@5BB@@/6BB@@? (BB@@ BA@@B`ABB@@?B`ABB@@ BA@@FBB@@? BB@@ (BB@@v5BB@@? BB@@P!BB@@43$BB@@?43$BB@@ BA@@ (BB@@?P!BB@@th!B/B@@ BA@@? BB@@th!BB@@P!BB@@? BB@@L7!BB@@th!BB@@?L7!B5^B@@ BB@@ BA@@?L7!B5^B@@L7!B%B@@ BB@@? BB@@ !BB@@L7!BB@@? BB@@Bd;?/A>B/A>Bd;?pA>Bd;?pA>B/A>BpA|%Bd;?/A|%B/A|%Bd;?pA|%Bd;?pA|%B/A|%B?/AmBb@Bd;?BBBd;?rBBBd;??rB>Bd;?B>Bd;?BBBd;??/AB@@BB>BB|)BpB|)BpB>B?aBBB@@pB8YB@@aB8YB@@?aBBB@@pBBB@@pB8YB@@aB|)B B>BaB>BaB|)B B|)B B>BQ@jB@|%B@jBQ@jBQ@|%B@|%B?wBB%?wB|%B@@wBB@@?wBB%?wB|%B%?wB|%B@@?wB|%B@@BB@@wBB@@?wB|%B@@B|%B@@BB@@?B|)B@@wB>B@@B>B@@?B|)B@@wB|)B@@wB>B@@?B|%Bd;?rBjBd;?BjBd;??B|%Bd;?rB|%Bd;?rBjBd;?pB|)BaB>BpB>BpB|)BaB|)BaB>B? B|)Bd;?_B>Bd;? B>Bd;?? B|)Bd;?_B|)Bd;?_B>Bd;??Bd;?_BBBd;? BBBd;?? B>Bd;?_B>Bd;?_BBBd;??V@BBb@Q@8YBb@V@8YBb@?V@BBb@Q@BBb@Q@8YBb@?B|%Bd;?wBjBd;?BjBd;??B|%Bd;?wB|%Bd;?wBjBd;?B|)BwB>BB>BB|)BwB|)BwB>BB|%BwBBBBB|%BwB|%BwBBBd;?BBBd;?wBBBd;??wB>Bd;?B>Bd;?BBBd;?@|)BpA>BpA|)B@|)B@>BpA>B?wB|)B%?wB>B@@wB|)B@@?wB|)B%?wB>B%?wB>B@@?wB>B@@B|)B@@wB|)B@@?wB>B@@B>B@@B|)B@@?B>Bd;?rB|)Bd;?B|)Bd;??B>Bd;?rB>Bd;?rB|)Bd;?,1$Eh(G'BB_'ˡXB%?^'RWB11$G'BBG'BB%?_'ˡXB%?/A|%B/A|)B/A|)B/A|%B/A|%B/A|)B?B>Bd;?wB|)Bd;?B|)Bd;??B>Bd;?wB>Bd;?wB|)Bd;?wBBBB8YBwB8YBwBBBBBBB8YB BBBB@@aB|)B@@pB|)B@@?pB>B@@aB>B@@aB|)B@@aBBB B8YBaB8YBaBBB BBB B8YB?BBB@@wB8YB@@B8YB@@?BBB@@wBBB@@wB8YB@@pBBBaB8YBpB8YBpBBBaBBBaB8YB? BBBd;?_BRWBd;? BRWBd;?? BBBd;?_BBBd;?_BRWBd;?? B>B@@B@@B@@B/A>B/ABB/ABB/A>BvB|)BwB>BwB|)BvB|)BvB>BwB>BB>BB|)BB>BB>BB|)BB|)B?pA>B@@@|)B@@pA|)B@@?pA>B@@@>B@@@|)B@@BBBwB8YBB8YBBBBwBBBwB8YB?/ABBd;?/A>Bd;?/ABBd;??/ABBd;?/A>Bd;?/A>Bd;? Vi>B8YB@@rBRWBd;?BRWBd;?Vi>B8YB@@pB8YB@@rBRWBd;??e?>pB8YB@@rBBBd;?rBRWBd;??e?K"5>pB8YB@@pBBB@@rBBBd;??e>BBB@@BRWBd;?BBBd;??e>BBB@@B8YB@@BRWBd;??e?>pB|%B@@rBjBd;?rB|%Bd;??e?>pB|%B@@pBB@@rBjBd;?yVi?>pBB@@BjBd;?rBjBd;?Vi?>pBB@@BB@@BjBd;??e>BB@@B|%Bd;?BjBd;??e>BB@@B|%B@@B|%Bd;??e?>pB>B@@rB|)Bd;?rB>Bd;??e?>pB>B@@pB|)B@@rB|)Bd;??e>B|)B@@B>Bd;?B|)Bd;??e>B|)B@@B>B@@B>Bd;??e?> B|%B@@ BjBd;? B|%Bd;??e?> B|%B@@ BB@@ BjBd;?yVi?> BB@@_BjBd;? BjBd;?Vi?> BB@@aBB@@_BjBd;??e>aBB@@_B|%Bd;?_BjBd;??e>aBB@@aB|%B@@_B|%Bd;??e>aB|)B@@_B>Bd;?_B|)Bd;??e>aB|)B@@aB>B@@_B>Bd;??e?> B>B@@ B|)Bd;? B>Bd;??e?> B>B@@ B|)B@@ B|)Bd;??e>aBBB@@_BRWBd;?_BBBd;??e>aBBB@@aB8YB@@_BRWBd;? Vi>aB8YB@@ BRWBd;?_BRWBd;?Vi>aB8YB@@ B8YB@@ BRWBd;??e?> B8YB@@ BBBd;? BRWBd;??e?> B8YB@@ BBB@@ BBBd;??e?>pA|%B@@pAjBd;?pA|%Bd;??e?>pA|%B@@pAB@@pAjBd;? Vi?>pAB@@/AjBd;?pAjBd;?Vi?>pAB@@/AB@@/AjBd;?(Vi?>/AB@@/AB@@pA>B@@pA|)Bd;?pA>Bd;??e?>pA>B@@pA|)B@@pA|)Bd;??e>Bd;?B@@Bd;?sVi>/A8YB@@pARWBd;?/ARWBd;?Vi>/A8YB@@pA8YB@@pARWBd;??e?>pA8YB@@pABBd;?pARWBd;??e?>pA8YB@@pABB@@pABBd;??e>BBB@@BRWBd;?BBBd;??e>BBB@@B8YB@@BRWBd;? Vi>B8YB@@wBRWBd;?BRWBd;?Vi>B8YB@@wB8YB@@wBRWBd;??e?>wB8YB@@wBBBd;?wBRWBd;??e?>wB8YB@@wBBB@@wBBBd;??e?>wB|%B@@wBjBd;?wB|%Bd;??e?>wB|%B@@wBB@@wBjBd;?vVi?>wBB@@BjBd;?wBjBd;?Vi?>wBB@@BB@@BjBd;??e>BB@@B|%Bd;?BjBd;??e>BB@@B|%B@@B|%Bd;??e?>wB>B@@wB|)Bd;?wB>Bd;??e?>wB>B@@wB|)B@@wB|)Bd;??e>B|)B@@B>Bd;?B|)Bd;??e>B|)B@@B>B@@B>Bd;??/AyB/AyB%?/AyB?/AyB/AyB%?/AyB%?/AOxB/AyB/AyB/AOxB/AOxB/AyB?/AyB@/AmB@/AyB@?/AyB@/AmB@/AmB@?/AA@@/AAq@/AAq@?/AA@@/AA@@/AAq@/AmA/AA/AmA/AmA/AA/AA?/AAq@/AmAq@/AAq@?/AAq@/AmAq@/AmAq@/A|%Bd;?/AjB/AjBd;?/A|%Bd;?/A|%B/AjB/A|%Bd;?/A8YB@@/ARWBd;?/A8YB@@}5Vi>/A8YB@@/ARWBd;?/ARWBd;?/AA/AjB/AA/AA/AjB/AjB/A|%B/AjB/A|%B/A|%B/AjB/AjB?/AA@@/AB@@/AA@@?/AA@@/AB@@/AB@@Vi?>/AjBd;?/AB@@/AjBd;?.Vi?>/AjBd;?/AB@@/AB@@?wB|%B%?BB%?B|%B%??wB|%B%?wBB%?BB%?vB|%BwB|)BwB|%BvB|%BvB|)BwB|)BB|)BB|%BB|)BB|)BB|%BB|%B?B|%B@@wB|)B@@B|)B@@?B|%B@@wB|%B@@wB|)B@@@1$e'''|%B+'|)B%?+'|)B@1$e'''|%Be'''|%B%?+'|)B%?Q@|)BV@|%BV@|)BQ@|)BQ@|%BV@|%B?Q@|)B@@@|%B@@@|)B@@?Q@|)B@@Q@|%B@@@|%B@@wB|)BB|%BwB|%BwB|)BB|)BB|%B?e>B|%Bd;?B|)B@@B|)Bd;??e>B|%Bd;?B|%B@@B|)B@@B|)BwB|%BB|%BB|)BwB|)BwB|%B?wB|)B@@B|%B@@wB|%B@@?wB|)B@@B|)B@@B|%B@@?e?>wB|%B@@wB|)Bd;?wB|)B@@?e?>wB|%B@@wB|%Bd;?wB|)Bd;?B|%BpB|)BB|)BB|%BpB|%BpB|)B?e>B|)B@@B|%Bd;?B|%B@@?e>B|)B@@B|)Bd;?B|%Bd;?pB|%BaB|)BpB|)BpB|%BaB|%BaB|)B?pB|)B@@aB|%B@@pB|%B@@?pB|)B@@aB|)B@@aB|%B@@?e?>rB|)Bd;?pB|%B@@rB|%Bd;??e?>rB|)Bd;?pB|)B@@pB|%B@@ B|)BaB|%B B|%B B|)BaB|)BaB|%B?e>_B|%Bd;?aB|)B@@_B|)Bd;??e>_B|%Bd;?aB|%B@@aB|)B@@ B|)Bd;? B|%B@@ B|%Bd;??e?> B|)Bd;? B|)B@@ B|%B@@pA|%B@@pA|)Bd;?pA|)B@@?e?>pA|%B@@pA|%Bd;?pA|)Bd;?/A|)B/A>B/A|)B/A|)B/A>B/A>B?/A|)Bd;?/A>Bd;?/A|)Bd;??/A|)Bd;?/A>Bd;?/A>Bd;??/AjBd;?/A|%Bd;?/AjBd;??/AjBd;?/A|%Bd;?/A|%Bd;??/A|%Bd;?B@@wBBB%?wBBB@@?wB>B@@wB>B%?wBBB%?vB>BwBBBwB>BvB>BvBBBwBBBBBBB>BBBBBBBB>BB>B?B>B@@wBBB@@BBB@@?B>B@@wB>B@@wBBB@@V@BB@@V@>B%?V@>B@@V@BB@@V@BB%?V@>B%?Q@>B@BB@>BQ@>BQ@BB@BB?Q@>Bb@V@BBb@V@>Bb@?Q@>Bb@Q@BBb@V@BBb@wBBBB>BwB>BwBBBBBBB>B?e>BBB@@B>Bd;?B>B@@?e>BBB@@BBBd;?B>Bd;?wB>BBBBwBBBwB>BB>BBBB?wBBB@@B>B@@wB>B@@?wBBB@@BBB@@B>B@@?e?>wB>B@@wBBBd;?wBBB@@?e?>wB>B@@wB>Bd;?wBBBd;?pBBBB>BpB>BpBBBBBBB>B?e>B>Bd;?BBB@@BBBd;??e>B>Bd;?B>B@@BBB@@aBBBpB>BaB>BaBBBpBBBpB>B?aB>B@@pBBB@@aBBB@@?aB>B@@pB>B@@pBBB@@?e?>rBBBd;?pB>B@@rB>Bd;??e??e>rBBBd;?pBBB@@pB>B@@ BBBaB>B B>B BBBaBBBaB>B?e>_B>Bd;?aBBB@@_BBBd;??e>_B>Bd;?aB>B@@aBBB@@BBB? BBB@@B@@ B>B@@? BBB@@B@@?e?> B>B@@ BBBd;? BBB@@?e?> B>B@@ B>Bd;? BBBd;?/ABBB/A>B/ABBB?e>Bd;?Bd;?B@@BpA>BpABB/ABB/A>B?e?>pABBd;?pA>B@@pA>Bd;??e?>pABBd;?pABB@@pA>B@@?/ARWBd;?/ABBd;?/ARWBd;??/ARWBd;?/ABBd;?/ABBd;??wBmB@@wByBb@wBmBb@?wBmB@@wByB@@wByBb@?wByB@@ByBb@wByBb@?wByB@@ByB@@ByBb@wBBB|%BBBwBBwB|%BB|%B?@yBb@Q@yB@@Q@yBb@?@yBb@@yB@@Q@yB@@?ByB@@wByBb@ByBb@?ByB@@wByB@@wByBb@?wByB@@ByBb@wByBb@?wByB@@ByB@@ByBb@?ByB@@pByBb@ByBb@?ByB@@pByB@@pByBb@?pByB@@aByBb@pByBb@?pByB@@aByB@@aByBb@?aByB@@ ByBb@aByBb@?aByB@@ ByB@@ ByBb@? ByB@@B%?B|)B%?B>B%??wB>B%?wB|)B%?B|)B%?V@mBb@Q@mB@V@mB@V@mBb@Q@mBb@Q@mB@?Q@yB@V@yBb@V@yB@?Q@yB@Q@yBb@V@yBb@wBmBb@BmB@wBmB@wBmBb@BmBb@BmB@?ByBb@wByB@ByB@?ByBb@wByBb@wByB@BmBb@wBmB@BmB@BmBb@wBmBb@wBmB@?wByBb@ByB@wByB@?wByBb@ByBb@ByB@pBmBb@BmB@pBmB@pBmBb@BmBb@BmB@?ByBb@pByB@ByB@?ByBb@pByBb@pByB@aBmBb@pBmB@aBmB@aBmBb@pBmBb@pBmB@?pByBb@aByB@pByB@?pByBb@aByBb@aByB@ BmBb@aBmB@ BmB@ BmBb@aBmBb@aBmB@?aByBb@ ByB@aByB@?aByBb@ ByBb@ ByB@BFKA@@BF[Ad;?BFKAd;??e>BFKA@@BF[A@@BF[Ad;?V@A@@V@mA%?V@A%?V@A@@V@mA@@V@mA%?_R3BA@@wBAq@wBA@@_R3BA@@BAq@wBAq@V@v?@V@d;_@b@V@d;_@@@V@v?@V@v?b@V@d;_@b@wBF[ABFKABF[AwBF[AwBFKABFKA?wBFKA@@BF[A@@BFKA@@?wBFKA@@wBF[A@@BF[A@@pBA@@aBAq@aBA@@pBA@@pBAq@aBAq@?Q@РA@@Q@Ab@Q@РAb@?Q@РA@@Q@A@@Q@Ab@vBAwBlAwBAvBAvBmAwBlABmABABmABmABABA?e?>wBF[A@@wBFKAd;?wBF[Ad;??e?>wBF[A@@wBFKA@@wBFKAd;?Bv?wBd;_@wBv?Bv?Bd;_@wBd;_@wBA@@BAq@BA@@wBA@@wBAq@BAq@?Bd;_@@@wBd;_@b@wBd;_@@@?Bd;_@@@Bd;_@b@wBd;_@b@pBFKABF[ABFKApBFKApBF[ABF[A?wBd;_@@@wBv?b@wBv?@?wBd;_@@@wBd;_@b@wBv?b@pBd;_@BH@Bd;_@pBd;_@pBH@BH@?6wBlA@@wBAq@wBA@@?6wBlA@@wBlAq@wBAq@?e>BF[Ad;?BFKA@@BF[A@@?e>BF[Ad;?BFKAd;?BFKA@@?Bd;_@@@wBd;_@b@wBd;_@@@?Bd;_@@@Bd;_@b@wBd;_@b@aBFKApBF[ApBFKAaBFKAaBF[ApBF[AwBA@@BAq@BA@@wBA@@wBAq@BAq@?aBF[A@@pBFKA@@pBF[A@@?aBF[A@@aBFKA@@pBFKA@@?pBd;_@@@Bd;_@b@Bd;_@@@?pBd;_@@@pBd;_@b@Bd;_@b@qv[ Bv?o;aBd;_@aBv? o,6î Bv?o; Bd;_@aBd;_@BA@@pBAq@pBA@@BA@@BAq@pBAq@?e?>rBFKAd;?pBF[A@@pBFKA@@?e?>rBFKAd;?rBF[Ad;?pBF[A@@? Bd;_@@@aBd;_@b@aBd;_@@@? Bd;_@@@ Bd;_@b@aBd;_@b@5î_BF[Ad;?aBFKA@@aBF[A@@?e>_BF[Ad;?_BFKAd;?aBFKA@@?pAd;_@@@/Ad;_@b@/Ad;_@@@?pAd;_@@@pAd;_@b@/Ad;_@b@V@v?o;Q@d;_@o;Q@v?o;V@v?o;V@d;_@o;Q@d;_@o; BF[A@@ BFKAd;? BF[Ad;??e?> BF[A@@ BFKA@@ BFKAd;??Bd;_@@@wBH@@@wBd;_@@@?Bd;_@@@BI@@@wBH@@@/AQAd;?pAQA/AQA/AQAd;?pAQAd;?pAQA/AFKApAFKAd;?pAF[A@@pAFKA@@?e?>pAFKAd;?pAF[Ad;?pAF[A@@?/AИAd;?/AF[A/AИA?/AИAd;?/AF[Ad;?/AF[A?/Auh@d;?/AFKAd;?/AFKAd;??/Auh@d;?/Auh@d;?/AFKAd;??/AQAd;?/AРA/AQA?/AQAd;?/AРAd;?/AРABB|)BwB|)BwB>BB>B?wBd;_@@@BI@@@Bd;_@@@?wBd;_@@@wBH@@@BI@@@Bd;_@wBv?wBd;_@Bd;_@Bv?wBv??wBd;_@@@BH@@@Bd;_@@@?wBd;_@@@wBH@@@BH@@@?Bd;_@@@pBH@@@pBd;_@@@?Bd;_@@@BH@@@pBH@@@aBd;_@pBH@pBd;_@aBd;_@aBH@pBH@?aBd;_@b@pBv?b@pBd;_@b@?aBd;_@b@aBv?b@pBv?b@?43XB9@@@aBH@@@43XBH@@@?43XB9@@@aBd;_@@@aBH@@@?x"B9@@@hJBH@@@x"BH@@@?BH@@@ BH@@@B9@@@?hJBH@@@ Bd;_@@@hJB:@@@?hJBH@@@x"BE@@@ Bd;_@@@?x"BE@@@hJBH@@@x"B9@@@?43XBE@@@aBd;_@@@43XB9@@@?hJBE@@@aBd;_@@@43XBE@@@?hJBE@@@ Bd;_@@@aBd;_@@@?hJB:@@@ Bd;_@@@hJBE@@@?BE@@@ Bd;_@@@x"BE@@@? BH@@@BE@@@B9@@@? BH@@@ Bd;_@@@BE@@@? Bd;_@@@B%?BBB%??wBBB%?wB>B%?B>B%??wBH@@@BFKA@@BI@@@?wBH@@@wBFKA@@BFKA@@?wBРA@@BA@@BРA@@?wBРA@@wBA@@BA@@?Buh@d;?rBFKAd;?rBuh@d;??Buh@d;?BFKAd;?rBFKAd;?aBРApBApBРAaBРAaBApBA?1BA%Q@23BA%Q@1BA%Q@?:BuA%Q@9BaA%Q@:BaA%Q@?23BaA%Q@1BuA%Q@1BaA%Q@?9BA%Q@:BA%Q@:BA%Q@?_BQA%Q@/?BaA%Q@j?BXA%Q@?/?BA%Q@_BQA%Q@j?BXA%Q@?7BA%Q@:BA%Q@:8BA%Q@?9BaA%Q@:BuA%Q@:8BaA%Q@?7BaA%Q@:BuA%Q@Zd6BaA%Q@?Q.BA%Q@ BРA%Q@th1BA%Q@?v>BuA%Q@_BQA%Q@B`;BuA%Q@?4BA%Q@1BA%Q@5BA%Q@?Zd6BA%Q@:BA%Q@7BA%Q@?Zd6BA%Q@1BA%Q@:BA%Q@?_BQA%Q@>BA%Q@/?BaA%Q@?>BSA%Q@_BQA%Q@/?BA%Q@?>BSA%Q@_BРA%Q@_BQA%Q@?|4BaA%Q@1BuA%Q@23BaA%Q@?:8BA%Q@:BA%Q@9BA%Q@?:BuA%Q@7BaA%Q@:8BaA%Q@?1BA%Q@|4BA%Q@23BA%Q@?7BaA%Q@:BuA%Q@7BaA%Q@?|4BA%Q@1BA%Q@4BA%Q@?_BQA%Q@v>BuA%Q@>BA%Q@?v>BA%Q@_BРA%Q@>BSA%Q@?1BA%Q@Zd6BA%Q@5BA%Q@?7BA%Q@:BA%Q@7BA%Q@?5BaA%Q@Zd6BaA%Q@:BuA%Q@?5BaA%Q@:BuA%Q@4BaA%Q@? BQA%Q@:BuA%Q@_BQA%Q@? BQA%Q@1BuA%Q@:BuA%Q@?:BuA%Q@|4BaA%Q@4BaA%Q@?:BuA%Q@1BuA%Q@|4BaA%Q@?B`;BA%Q@_BРA%Q@v>BA%Q@?B`;BA%Q@ BРA%Q@_BРA%Q@?_BQA%Q@:BuA%Q@B`;BuA%Q@?1BA%Q@ BРA%Q@:BA%Q@?:BA%Q@ BРA%Q@B`;BA%Q@?th1BA%Q@ BРA%Q@1BA%Q@? BQA%Q@th1BuA%Q@1BuA%Q@?-BSA%Q@ BРA%Q@Q.BA%Q@? BQA%Q@Q.BuA%Q@th1BuA%Q@? BРA%Q@-BA%Q@ BQA%Q@? BРA%Q@-BaA%Q@-BA%Q@?-BA%Q@ BРA%Q@-BSA%Q@?6^-BXA%Q@ BРA%Q@-BA%Q@? BQA%Q@-BA%Q@Q.BuA%Q@?-BaA%Q@ BРA%Q@6^-BXA%Q@? BРA@@BBBBB>BwB>BwBBBBBB?wBA@@BA@@BA@@?wBA@@wBA@@BA@@?wBA@@BA@@BA@@?wBA@@wBA@@BA@@?BA@@pBA@@pBA@@?BA@@BA@@pBA@@aBApBApBAaBAaBApBA?aBA@@ BA@@ BA@@?aBA@@aBA@@ BA@@? BA@@BH@@@rBuh@d;?pBH@@@/Vi?ś>BH@@@Buh@d;?rBuh@d;??e?>pBH@@@rBFKAd;?pBFKA@@?e?>pBH@@@rBuh@d;?rBFKAd;??e>BFKA@@Buh@d;?BH@@@?e>BFKA@@BFKAd;?Buh@d;??e?>pBРA@@rBQAd;?pBA@@?e?>pBРA@@rBРAd;?rBQAd;?Vi>pBA@@BQAd;?BA@@%Vi>pBA@@rBQAd;?BQAd;??e>BA@@BРAd;?BРA@@?e>BA@@BQAd;?BРAd;??e?>pBF[A@@rBИAd;?pBИA@@?e?>pBF[A@@rBF[Ad;?rBИAd;??e>BИA@@BF[Ad;?BF[A@@?e>BИA@@BИAd;?BF[Ad;??e?> BРA@@ BQAd;? BA@@?e?> BРA@@ BРAd;? BQAd;?Vi> BA@@_BQAd;?aBA@@%Vi> BA@@ BQAd;?_BQAd;??e>aBA@@_BРAd;?aBРA@@?e>aBA@@_BQAd;?_BРAd;??e>aBИA@@_BF[Ad;?aBF[A@@?e>aBИA@@_BИAd;?_BF[Ad;??e?> BF[A@@ BИAd;? BИA@@?e?> BF[A@@ BF[Ad;? BИAd;??e>aBFKA@@_Buh@d;?aBH@@@?e>aBFKA@@_BFKAd;?_Buh@d;?o?ͳ>aBH@@@43XBq@>@43XBH@@@}`0Ki?>43XB;@+@_Buh@d;?43XBuh@d;?S:Wj?7>43XBF@j<@aBH@@@43XB(@5^:@ꥺ`h?>43XB@y&@aBH@@@43XBs=@)\@6@d?>aBH@@@43XBF@j<@43XBq@>@9%i?(u>43XBB`@7@_Buh@d;?43XB;@+@&9Xi?+>43XBB`@7@aBH@@@_Buh@d;?k9i?q>43XB(@5^:@aBH@@@43XB @b8@{;9i?<>aBH@@@43XB@y&@43XB @b8@ i?B>43XBs=@)\@aBH@@@43XBB`@7@o?ͳ>hJBH@@@x"Bq@>@x"BH@@@Ki?>x"Buh@d;?hJB;@+@hJBuh@d;?n./Ki?>x"Buh@d;?x"B;@+@hJB;@+@A%q9Yj?7>x"BF@j<@hJBq@>@x"B(@5^:@W]9o?ͳ>x"BF@j<@hJBH@@@hJBq@>@l9lh?>x"B@y&@hJB;@+@x"Bs=@)\@M%i?+u>x"B@y&@hJBB`@7@hJB;@+@GhJBH@@@x"BF@j<@x"Bq@>@>@9i?q>x"B(@5^:@hJBq@>@x"B @b8@R.%i?*u>x"BB`@7@hJB;@+@x"B;@+@9-Uh?>hJBt=@)\@x"B@y&@hJB@y&@?hJB@= '@hJB@y&@x"B@y&@ݭ-i?2R>hJB@d;/@hJB@= '@x"B@y&@$ 2 i? >x"B@y&@hJBt=@)\@hJBB`@7@a6 i?D>x"Bs=@)\@hJB;@+@x"BB`@7@9i?<>x"B@y&@x"B @b8@hJBq@>@?h?>hJB@:@hJBB`@5@x"B@y&@p.%g?>hJBq@>@hJB@:@x"B@y&@l9j?%>hJBB`@5@hJB@d;/@x"B@y&@Zo?ͳ>Bq@>@ BH@@@BH@@@Ki?> Buh@d;?B;@+@Buh@d;?#:ah?>Bs=@)\@ BH@@@B@y&@y:g?>B@:@ BH@@@Bq@>@]㹑%i?)u> Buh@d;?BB`@7@B;@+@!Xi?> Buh@d;? BH@@@BB`@7@: i?C>BB`@7@ BH@@@Bs=@)\@(9h?>BB`@5@ BH@@@B@:@ йTi?> BH@@@B@d;/@B@y&@e j?%>B@d;/@ BH@@@BB`@5@hJB;@B`5@hJBt=@ P@hJBuh@y6@?e?> BH@@@ BFKAd;? BFKA@@?e?> BH@@@ Buh@d;? BFKAd;??e?>pAРA@@pAQAd;?pAA@@?e?>pAРA@@pAРAd;?pAQAd;?Vi>pAA@@/AQAd;?/AA@@FVi>pAA@@pAQAd;?/AQAd;?Vi>/AA@@/AA@@/AQAd;?pAF[A@@pAИAd;?pAИA@@?e?>pAF[A@@pAF[Ad;?pAИAd;??e>/AH@@@pAuh@d;?pAH@@@E/Vi?ě>/AH@@@/Auh@d;?pAuh@d;??e?>pAH@@@pAFKAd;?pAFKA@@?e?>pAH@@@pAuh@d;?pAFKAd;??e>BFKA@@Buh@d;?BI@@@?e>BFKA@@BFKAd;?Buh@d;?ɦVi?ě>BI@@@wBuh@d;?wBH@@@%-Vi?>BI@@@Buh@d;?wBuh@d;??e?>wBH@@@wBFKAd;?wBFKA@@?e?>wBH@@@wBuh@d;?wBFKAd;??e?>wBРA@@wBQAd;?wBA@@?e?>wBРA@@wBРAd;?wBQAd;?Vi>wBA@@BQAd;?BA@@%Vi>wBA@@wBQAd;?BQAd;??e>BA@@BРAd;?BРA@@?e>BA@@BQAd;?BРAd;??e?>wBF[A@@wBИAd;?wBИA@@?e?>wBF[A@@wBF[Ad;?wBИAd;??e>BИA@@BF[Ad;?BF[A@@?e>BИA@@BИAd;?BF[Ad;?Q@v?o;V@o;V@v?o;Q@v?o;Q@o;V@o;?@yB@AyB%?pAyB?@yB@yB%?@AyB%??aBd;_@@@pBd;_@b@pBd;_@@@?aBd;_@@@aBd;_@b@pBd;_@b@/AA@@/AAq@/AA@@/AA@@/AAq@/AAq@/AmA/AA/AA/AmA/AmA/AA?/AAq@/AmAq@/AmAq@?/AAq@/AAq@/AmAq@/AРAd;?/AQA/AРA/AРAd;?/AQAd;?/AQA?/AРAd;?/AH@@@/Auh@d;?/Auh@d;?Vi?ě>/AH@@@/AH@@@/Auh@d;?/AA/AQA/AQA/AA/AA/AQA/AРA/AQA/AQA/AРA/AРA/AQA?/AA@@/AA@@/AA@@?/AA@@/AA@@/AA@@|VVi>/AQAd;?/AA@@/AA@@Vi>/AQAd;?/AQAd;?/AA@@?wBИA%?wBРA@@wBИA@@?wBИA%?wBРA%?wBРA@@vBИAwBРAwBИAvBИAvBРAwBРABРABИABРABРABИABИA?BРA@@wBИA@@wBРA@@?BРA@@BИA@@wBИA@@V@РA%?V@ИA@@V@РA@@V@РA%?V@ИA%?V@ИA@@@РAQ@ИAQ@РA@РA@ИAQ@ИA?V@РAb@Q@ИAb@Q@РAb@?V@РAb@V@ИAb@Q@ИAb@wBИABРABИAwBИAwBРABРA?e>BРAd;?BИA@@BРA@@?e>BРAd;?BИAd;?BИA@@BИAwBРAwBИABИABРAwBРA?wBИA@@BРA@@BИA@@?wBИA@@wBРA@@BРA@@?e?>wBРA@@wBИAd;?wBРAd;??e?>wBРA@@wBИA@@wBИAd;?BРApBИApBРABРABИApBИA?e>BИA@@BРAd;?BИAd;??e>BИA@@BРA@@BРAd;?pBРAaBИAaBРApBРApBИAaBИA?pBИA@@aBРA@@aBИA@@?pBИA@@pBРA@@aBРA@@?e?>rBИAd;?pBРA@@pBИA@@?e?>rBИAd;?rBРAd;?pBРA@@ BИAaBРAaBИA BИA BРAaBРA?e>_BРAd;?aBИA@@aBРA@@?e>_BРAd;?_BИAd;?aBИA@@ BИAd;? BРA@@ BИA@@?e?> BИAd;? BРAd;? BРA@@pAРA@@pAИAd;?pAРAd;??e?>pAРA@@pAИA@@pAИAd;?/AИA/AF[A/AF[A/AИA/AИA/AF[A?/AИAd;?/AF[Ad;?/AF[Ad;??/AИAd;?/AИAd;?/AF[Ad;??/AQAd;?/AРAd;?/AРAd;??/AQAd;?/AQAd;?/AРAd;??/AРAd;?B+'|)B11$+'|)B%?BC'>B%?BC'>B?wBA%?wBB@@wBA@@?wBA%?wBB%?wBB@@V@B%?V@A@@V@B@@V@B%?V@A%?V@A@@?wBРA%?BИA%?BРA%??wBРA%?wBИA%?BИA%??B%?G'BBBC'>B@1$BC'>B%?G'BB%?G'BB%1$l&A%?w&mAl&A%1$yl&A%?w&mA%?w&mA?wBv?}??wBd;_@@@wBv?@?wBv?}??wBd;_@%?wBd;_@@@V@v?}??V@d;_@o;V@v?o;V@v?}??V@d;_@%?V@d;_@o;?wBd;_@%?wBH@@@wBd;_@@@?wBd;_@%?wBH@%?wBH@@@V@@%?V@d;_@@@V@H@@@V@@%?V@d;_@%?V@d;_@@@?wBH@%?wBFKA@@wBH@@@?wBH@%?wBFKA%?wBFKA@@01$4&F[A%?1ɉ&ИA4&F[A01$v4&F[A%?1ɉ&ИA%?1ɉ&ИA?wBA%?wBA@@wBA@@?wBA%?wBA%?wBA@@41$!pkg&$A%?l&AYd&QA41$%kg&$A%?l&A%?l&AV@yBV@QxB%?V@yB%?V@yBV@QxBB`?V@QxB%?V@QxB%?V@QxB?5?V@yB%?V@SxB+@V@yB%?V@QxB?5?V@SxB+@V@yB@@V@yB%?V@mB+@V@mB@@V@oB+@V@mB@@V@rB+@V@oB+@V@mB@@V@yB@@V@rB+@V@~uB+@V@yB@@V@SxB+@V@rB+@V@yB@@V@~uB+@V@$A%?V@РA@@V@A@@V@$A%?V@РA%?V@РA@@?^wBE[A%?wBИA@@wBE[A@@?^wBE[A%?wBИA%?wBИA@@31$ڹ%@%?%#&FKA<+%uh@21$b4%@%?%#&FKA%?%#&FKAV@mBb@V@yB@@V@mB@@V@mBb@V@yBb@V@yB@@@1$1ɉ&ИA%?E&РA1ɉ&ИA@1$1ɉ&ИA%?E&РA%?E&РAV@mB@V@yBb@V@mBb@V@mB@V@yB@V@yBb@01$%#&FKA%?4&F[A%#&FKA01$%#&FKA%?4&F[A%?4&F[AV@}??Q@@V@@V@}??Q@}??Q@@PA}??/A@`fA@PA}??/A}??/A@L7A}?? B@DA@L7A}?? B}?? B@aB}?? Bo;aBo;aB}?? B}?? Bo;aB}??pB@aB@aB}??pB}??pB@B}??pBBB}??pB}??pBB}??wB@B@B}??wB}??wB@B}??wBBB}??wB}??wBB}??wB@B@B}??wB}??wB@/A}??/Ao;/Ao;/A}??/A}??/Ao;/A}??DA@/A@/A}??L7A}??DA@V@}??V@v?o;V@o;V@}??V@v?}??V@v?o;?wB}??wBv?@wB@?wB}??wBv?}??wBv?@?wBB%?BA%?BB%??wBB%?wBA%?BA%?wBABBBAwBAwBBBB?wB|)B%?B|%B%?B|)B%??wB|)B%?wB|%B%?B|%B%?wB|%BB|)BB|%BwB|%BwB|)BB|)BwBd;_@BH@Bd;_@wBd;_@wBH@BH@?wBH@%?Bd;_@%?BH@%??wBH@%?wBd;_@%?Bd;_@%?wBd;_@%?Bd;_@Bd;_@%?wBd;_@%?wBd;_@Bd;_@wBH@BFKABH@wBH@wBFKABFKA?wBFKA%?BH@%?BFKA%??wBFKA%?wBH@%?BH@%?wBABABAwBAwBABA?wBA%?BA%?BA%??wBA%?wBA%?BA%?wBE[ABИABF[AwBE[AwBИABИA?wBИA%?BF[A%?BИA%??wBИA%?wBE[A%?BF[A%??wBgB%?B8YB%?BgB%??wBgB%?wB8YB%?B8YB%?wB8YBBgBB8YBwB8YBwBgBBgB?wBgBBgB%?BgB?wBgBwBgB%?BgB%??wB8YB%?BBB%?B8YB%??wB8YB%?wBBB%?BBB%?wBBBB8YBBBBwBBBwB8YBB8YB?Bd;_@%?BH@BH@%??Bd;_@%?Bd;_@BH@?BH@%?BFKABFKA%??BH@%?BH@BFKA?BFKA%?BF[ABF[A%??BFKA%?BFKABF[A?BF[A%?BИABИA%??BF[A%?BF[ABИA?BИA%?BРABРA%??BИA%?BИABРA?BРA%?BABA%??BРA%?BРABA?BA%?BABA%??BA%?BABA?BA%?BmABmA%??BA%?BABmA?BmA%?BABA%??BmA%?BmABA?BA%?BBBB%??BA%?BABB?BB%?B|%BB|%B%??BB%?BBB|%B?B|%B%?B|)BB|)B%??B|%B%?B|%BB|)B?B|)B%?B>BB>B%??B|)B%?B|)BB>B?B>B%?BBBBBB%??B>B%?B>BBBB?BBB%?B8YBB8YB%??BBB%?BBBB8YB?B8YB%?BgBBgB%??B8YB%?B8YBBgB?Q@yB%?@yB@@@yB%??Q@yB%?Q@yB@@@yB@@?Q@yB@@mB@@yB@?Q@yB@Q@mB@@mB@V@lBQ@gBV@gBV@lBQ@lBQ@gB?Q@gBb@V@mBb@V@gBb@?Q@gBb@Q@mBb@V@mBb@Q@OxBV@yBQ@yBQ@OxBV@OxBV@yBQ@gBV@RWBV@gBQ@gBQ@RWBV@RWB?@ИA@@Q@РA@@Q@ИA@@?@ИA@@@РA@@Q@РA@@Q@RWBV@BBV@RWBQ@RWBQ@BBV@BB?Q@gB@@@8YB@@@gB@@?Q@gB@@Q@8YB@@@8YB@@?Q@|%B@@@B@@@|%B@@?Q@|%B@@Q@B@@@B@@@V BQ@jB@jB@V BQ@V BQ@jB?Q@B@@@A@@@B@@?Q@B@@Q@A@@@A@@@AV@mAV@A@A@mAV@mAQ@|%BV@jBV@|%BQ@|%BQ@jBV@jB?@8YB@@pABB@@pA8YB@@?@8YB@@@BB@@pABB@@Q@>BV@|)BV@>BQ@>BQ@|)BV@|)B?Q@|)Bb@V@>Bb@V@|)Bb@?Q@|)Bb@Q@>Bb@V@>Bb@@|%BpA|)BpA|%B@|%B@|)BpA|)B?Q@|%Bb@V@|)Bb@V@|%Bb@?Q@|%Bb@Q@|)Bb@V@|)Bb@Q@BBV@>BV@BBQ@BBQ@>BV@>B?Q@BB@@@>B@@@BB@@?Q@BB@@Q@>B@@@>B@@?Q@yBb@V@yB@@V@yBb@?Q@yBb@Q@yB@@V@yB@@V@A@@V@РAb@V@Ab@V@A@@V@РA@@V@РAb@Q@mB@@mBb@@mB@Q@mB@Q@mBb@@mBb@?@yBb@pAyB@pAyBb@?@yBb@@yB@pAyB@?@A@@pAAq@pAA@@?@A@@@Aq@pAAq@?Q@d;_@@@@d;_@b@@d;_@@@?Q@d;_@@@Q@d;_@b@@d;_@b@Q@v?o;@d;_@o;@v?o;Q@v?o;Q@d;_@o;@d;_@o;?@d;_@b@pAv?b@pAd;_@b@?@d;_@b@@v?b@pAv?b@%C@d;_@o;pAuh@pAd;_@o;-4%C@d;_@o;@uh@pAuh@Q@@@}??@@Q@@Q@}??@}??Q@FKAV@uh@V@FKAQ@FKAQ@uh@V@uh@?Q@d;_@b@V@H@b@V@d;_@b@?Q@d;_@b@Q@H@b@V@H@b@?Q@РAb@V@Ab@V@РAb@?Q@РAb@Q@Ab@V@Ab@Q@A@QAQ@QAQ@A@A@QA?Q@A@@@A@@@A@@?Q@A@@Q@A@@@A@@@mAV@AV@mA@mA@AV@AQ@QAV@РAV@QAQ@QAQ@РAV@РA?@FKA@@pAH@@@pAFKA@@?@FKA@@@H@@@pAH@@@Q@ИAV@F[AV@ИAQ@ИAQ@F[AV@F[A?Q@F[Ab@V@ИAb@V@F[Ab@?Q@F[Ab@Q@ИAb@V@ИAb@@Aq@pAA@@pAAq@@Aq@@A@@pAA@@Q@РAV@ИAV@РAQ@РAQ@ИAV@ИA?@РA@@pAИA@@pAРA@@?@РA@@@ИA@@pAИA@@@FKApAF[ApAFKA@FKA@F[ApAF[A?Q@F[A@@@FKA@@@F[A@@?Q@F[A@@Q@FKA@@@FKA@@?Q@Ab@V@mAb@V@Ab@?Q@Ab@Q@Ab@V@mAb@?Q@F[A@@Q@ИAb@Q@F[Ab@?Q@F[A@@Q@ИA@@Q@ИAb@V@ИA@@V@F[Ab@V@ИAb@V@ИA@@V@F[A@@V@F[Ab@?V@mAb@Q@Ab@V@Ab@?V@mAb@Q@Ab@Q@Ab@?Q@8YB@@Q@gBb@Q@8YBb@?Q@8YB@@Q@gB@@Q@gBb@V@A@@V@mAb@V@Ab@V@A@@V@mA@@V@mAb@V@gB@@V@8YBb@V@gBb@V@gB@@V@8YB@@V@8YBb@?Q@B@@Q@|%Bb@Q@Bb@?Q@B@@Q@|%B@@Q@|%Bb@V@|%B@@V@Bb@V@|%Bb@V@|%B@@V@B@@V@Bb@?Q@A@@Q@Bb@Q@Ab@?Q@A@@Q@B@@Q@Bb@V@B@@V@Ab@V@Bb@V@B@@V@A@@V@Ab@?~3Q@BB@@Q@8YBb@Q@BBb@?~3Q@BB@@Q@8YB@@Q@8YBb@V@8YB@@V@BBb@V@8YBb@V@8YB@@V@BB@@V@BBb@?Q@>B@@Q@BBb@Q@>Bb@?Q@>B@@Q@BB@@Q@BBb@V@BB@@V@>Bb@V@BBb@V@BB@@V@>B@@V@>Bb@V@A@@V@Ab@V@Ab@V@A@@V@A@@V@Ab@?Q@A@@Q@Ab@Q@Ab@?Q@A@@Q@A@@Q@Ab@V@FKA@@V@H@b@V@FKAb@V@FKA@@V@H@@@V@H@b@?Q@H@@@Q@FKAb@Q@H@b@?Q@H@@@Q@FKA@@Q@FKAb@V@РA@@V@ИAb@V@РAb@V@РA@@V@ИA@@V@ИAb@?Q@ИA@@Q@РAb@Q@ИAb@?Q@ИA@@Q@РA@@Q@РAb@?Q@FKA@@Q@F[Ab@Q@FKAb@?Q@FKA@@Q@F[A@@Q@F[Ab@V@F[A@@V@FKAb@V@F[Ab@V@F[A@@V@FKA@@V@FKAb@?Q@|)B@@Q@>Bb@Q@|)Bb@?Q@|)B@@Q@>B@@Q@>Bb@V@>B@@V@|)Bb@V@>Bb@V@>B@@V@|)B@@V@|)Bb@?Q@|%B@@Q@|)Bb@Q@|%Bb@?Q@|%B@@Q@|)B@@Q@|)Bb@V@|)B@@V@|%Bb@V@|)Bb@V@|)B@@V@|%B@@V@|%Bb@?Q@d;_@@@Q@H@b@Q@d;_@b@?Q@d;_@@@Q@H@@@Q@H@b@V@H@@@V@d;_@b@V@H@b@V@H@@@V@d;_@@@V@d;_@b@V@mA@@V@Ab@V@mAb@V@mA@@V@A@@V@Ab@Q@lB@gBQ@gBQ@lB@lB@gB?@gBb@Q@mBb@Q@gBb@?@gBb@@mBb@Q@mBb@pAOxB@yBpAyBpAOxB@OxB@yB@RWBpAgBpARWB@RWB@gBpAgB@BBpARWBpABB@BB@RWBpARWB@jBpA|%BpAjB@jB@|%BpA|%B@>BQ@|)BQ@>B@>B@|)BQ@|)B?@|)B@@Q@>B@@Q@|)B@@?@|)B@@@>B@@Q@>B@@?@|)B@@pA|%B@@pA|)B@@?@|)B@@@|%B@@pA|%B@@@>BpABBpA>B@>B@BBpABB?@yB@@pAyBb@pAyB@@?@yB@@@yBb@pAyBb@@gBb@pAgB@@pAgBb@@gBb@@gB@@pAgB@@@v?b@`fAv?@pAv?b@@v?b@@v?@`fAv?@?@v?@`fA@`fAv?@?@v?@@@`fA@@F[AQ@FKAQ@F[A@F[A@FKAQ@FKA@FKAQ@uh@Q@FKA@FKA@uh@Q@uh@?@H@@@pAd;_@@@pAH@@@?@H@@@@d;_@@@pAd;_@@@?@A@@pAРA@@pAA@@?@A@@@РA@@pAРA@@@РApAQApAРA@РA@QApAQA@ИAQ@F[AQ@ИA@ИA@F[AQ@F[A?@ИA@@pAF[A@@pAИA@@?@ИA@@@F[A@@pAF[A@@?@yB%?Q@yBQ@yB%??@yB%?@yBQ@yB@ИApAРApAИA@ИA@РApAРA@}??pAo;PA}??@}??@o;pAo;@o;pAv?o;pAo;@o;@v?o;pAv?o;?@yB%?pAyB@@@AyB%??@yB%?@yB@@pAyB@@?@yB@pAmB@pAyB@?@yB@@mB@pAmB@?@Aq@pAmAq@pAAq@?@Aq@@UAq@pAmAq@?@gB@@pA8YB@@pAgB@@?@gB@@@8YB@@pA8YB@@?@|%B@@pAB@@pA|%B@@?@|%B@@@B@@pAB@@pAApAjBpAApAApAV BpAjBpAjB@V B@jBpAjBpAV B@V B?@B@@pAA@@pAB@@?@B@@@A@@pAA@@?@BB@@Q@8YB@@Q@BB@@?@BB@@@8YB@@Q@8YB@@@|)BQ@|%BQ@|)B@|)B@|%BQ@|%B?@BB@@pA>B@@pABB@@?@BB@@@>B@@pA>B@@@mB@pAmBb@pAmB@@mB@@mBb@pAmBb@?@yB@Q@yBb@Q@yB@?@yB@@yBb@Q@yBb@?@F[A@@pAFKA@@pAF[A@@?@F[A@@@FKA@@pAFKA@@?@d;_@@@pAd;_@b@pAd;_@@@?@d;_@@@@d;_@b@pAd;_@b@@v?o;pAd;_@o;pAv?o;@v?o;@d;_@o;pAd;_@o;?@v?b@Q@d;_@b@Q@v?b@?@v?b@@d;_@b@Q@d;_@b@%C@uh@Q@d;_@o;Q@uh@9%C@uh@@d;_@o;Q@d;_@o;@@PA}??`fA@@@@}??PA}??pAA@QA@ApAApAQA@QApAQApAApAApAQApAApAA?@A@@pAA@@pAA@@?@A@@@A@@pAA@@?@H@@@Q@FKA@@Q@H@@@?@H@@@@FKA@@Q@FKA@@@Aq@@UA@@@A@@@Aq@@UAq@@UA@@?Q@mA@@@A@@Q@A@@?Q@mA@@@UA@@@A@@?Q@mA@@Q@Ab@Q@A@@?Q@mA@@Q@Ab@Q@Ab@?Q@Ab@Q@A@@Q@Ab@?Q@Ab@Q@mA@@Q@A@@@UA@@@Aq@@A@@@UA@@@UAq@@Aq@?@UA@@Q@A@@@A@@?@UA@@Q@mA@@Q@A@@?V@mA%?~&A%?w&mA%??V@mA%?V@A%?~&A%?V@Aw&mA~&AV@AV@mAw&mA BFKAd;? Buh@%Q@ BFKA%Q@ BFKAd;? Buh@d;? Buh@%Q@Buh@7@ Buh@d;?Buh@d;? Buh@d;?Buh@%Q@ Buh@%Q@ Buh@d;?Buh@ P@Buh@%Q@Buh@K7@ Buh@d;?Buh@y6@Buh@HJ@ Buh@d;?Buh@G@Buh@y&@ Buh@d;?Buh@7@Buh@ P@ Buh@d;?Buh@hM@Buh@y6@ Buh@d;?Buh@y&@ Buh@d;?Buh@D@Buh@G@Buh@>@ Buh@d;?Buh@K7@ Buh@d;?Buh@>@Buh@D@x"Buh@%Q@hJBuh@ P@hJBuh@%Q@x"Buh@%Q@x"Buh@ P@hJBuh@ P@hJBuh@7@x"Buh@d;?hJBuh@d;?x"Buh@j<@hJBuh@ P@x"Buh@>@hJBuh@y6@x"Buh@d;?hJBuh@y&@hJBuh@D@x"Buh@d;?hJBuh@>@hJBuh@D@x"Buh@7@x"Buh@d;?x"Buh@hM@hJBuh@ P@x"Buh@ P@x"Buh@D@x"Buh@>@hJBuh@ P@hJBuh@HJ@x"Buh@y&@hJBuh@G@hJBuh@y&@x"Buh@d;?hJBuh@7@x"Buh@G@x"Buh@D@hJBuh@ P@x"Buh@HJ@hJBuh@ P@x"Buh@hM@hJBuh@K7@x"Buh@d;?hJBuh@y6@x"Buh@,@hJBuh@ P@x"Buh@j<@x"Buh@HJ@x"Buh@G@hJBuh@ P@hJBuh@>@x"Buh@d;?hJBuh@K7@x"Buh@y&@hJBuh@ P@x"Buh@,@hJBuh@ P@x"Buh@y&@hJBuh@hM@x"Buh@y&@hJBuh@D@hJBuh@G@x"Buh@y&@x"Buh@7@hJBuh@D@43XBuh@ P@_Buh@%Q@43XBuh@%Q@43XBuh@j<@_Buh@%Q@43XBuh@>@43XBuh@HJ@_Buh@%Q@43XBuh@hM@43XBuh@hM@_Buh@%Q@43XBuh@ P@_Buh@d;?43XBuh@7@43XBuh@d;?_Buh@d;?_Buh@%Q@43XBuh@7@43XBuh@,@_Buh@%Q@43XBuh@j<@43XBuh@G@_Buh@%Q@43XBuh@HJ@_Buh@%Q@43XBuh@y&@43XBuh@7@43XBuh@D@43XBuh@>@_Buh@%Q@43XBuh@D@_Buh@%Q@43XBuh@G@43XBuh@y&@_Buh@%Q@43XBuh@,@?_Buh@d;?_BFKA%Q@_Buh@%Q@?_Buh@d;?_BFKAd;?_BFKA%Q@?V@ˡXB%?wp'gB%?_'ˡXB%??V@ˡXB%?V@gB%?wp'gB%?V@gB^'RWBwp'gBV@gBV@RWB^'RWB?V@A%?A'B%?~&A%??V@A%?V@B%?A'B%?V@jB~&AZC'jBV@jBV@A~&A?V@BB%?_'ˡXB%?G'BB%??V@BB%?V@ˡXB%?_'ˡXB%?V@RWBG'BB^'RWBV@RWBV@BBG'BB?V@|%B%?+'|)B%?e'''|%B%??V@|%B%?V@|)B%?+'|)B%?V@|)Be'''|%B+'|)BV@|)BV@|%Be'''|%B$CV@uh@d;_@o;<+%uh@ᓭ$CV@uh@V@d;_@o;d;_@o;V@d;_@o;d;_@%?d;_@o;V@d;_@o;V@d;_@%?d;_@%??V@d;_@%?%@%?d;_@%??V@d;_@%?V@@%?%@%??V@РA%?kg&$A%?E&РA%??V@РA%?V@$A%?kg&$A%?V@QAE&РAYd&QAV@QAV@РAE&РA?V@|)B%?BC'>B%?+'|)B%??V@|)B%?V@>B%?BC'>B%?V@>B+'|)BBC'>BV@>BV@|)B+'|)B?V@B%?e'''|%B%?A'B%??V@B%?V@|%B%?e'''|%B%?V@|%BZC'jBe'''|%BV@|%BV@jBZC'jB?V@>B%?G'BB%?BC'>B%??V@>B%?V@BB%?G'BB%?V@BBBC'>BG'BBV@BBV@>BBC'>B?V@A%?w&mA%?l&A%??V@A%?V@mA%?w&mA%?V@mAl&Aw&mAV@mAV@Al&A?V@F[A%?1ɉ&ИA%?4&F[A%??V@F[A%?V@ИA%?1ɉ&ИA%?V@ИA4&F[A1ɉ&ИAV@ИAV@F[A4&F[A?V@$A%?l&A%?kg&$A%??V@$A%?V@A%?l&A%?V@AYd&QAl&AV@AV@QAYd&QA?V@@%?%#&FKA%?%@%??V@@%?V@FKA%?%#&FKA%?V@FKA<+%uh@%#&FKAV@FKAV@uh@<+%uh@?V@ИA%?E&РA%?1ɉ&ИA%??V@ИA%?V@РA%?E&РA%?V@РA1ɉ&ИAE&РAV@РAV@ИA1ɉ&ИA?V@FKA%?4&F[A%?%#&FKA%??V@FKA%?V@F[A%?4&F[A%?V@F[A%#&FKA4&F[AV@F[AV@FKA%#&FKA?_BРAd;?_BQA%Q@_BРA%Q@?_BРAd;?_BQAd;?_BQA%Q@?_BQAd;? BQA%Q@_BQA%Q@?_BQAd;? BQAd;? BQA%Q@ BQAd;? BРA%Q@ BQA%Q@ BQAd;? BРAd;? BРA%Q@ BИAd;? BF[A%Q@ BИA%Q@ BИAd;? BF[Ad;? BF[A%Q@?_BF[Ad;?_BИA%Q@_BF[A%Q@?_BF[Ad;?_BИAd;?_BИA%Q@ BРAd;? BИA%Q@ BРA%Q@ BРAd;? BИAd;? BИA%Q@?_BИAd;?_BРA%Q@_BИA%Q@?_BИAd;?_BРAd;?_BРA%Q@ BF[Ad;? BFKA%Q@ BF[A%Q@ BF[Ad;? BFKAd;? BFKA%Q@V@lB%?V@lBB`?V@gB%?V@gBV@lB?V@lBV@gBV@gB%?V@lB?V@lB?V@gB%?V@lBB`??V@gB%?wp'gBwp'gB%??V@gB%?V@gBwp'gBAoB+@V@mB+@V@oB+@V@mB+@AoB+@AmB+@V@mB+@V@mB+@AoB+@ArB+@V@oB+@V@rB+@ArB+@AoB+@V@oB+@ArB+@kBoB+@AoB+@ArB+@kBrB+@kBoB+@AoB+@kBmB+@AmB+@AoB+@kBoB+@kBmB+@A~uB+@V@rB+@V@~uB+@A~uB+@ArB+@V@rB+@ASxB+@V@~uB+@V@SxB+@ASxB+@A~uB+@V@~uB+@ASxB+@kB~uB+@A~uB+@ASxB+@kBSxB+@kB~uB+@A~uB+@kBrB+@ArB+@A~uB+@kB~uB+@kBrB+@kB~uB+@rBrB+@kBrB+@kB~uB+@rB~uB+@rBrB+@kBSxB+@rB~uB+@kB~uB+@kBSxB+@rBSxB+@rB~uB+@rB~uB+@wBSxB+@wB~uB+@rB~uB+@rBSxB+@wBSxB+@rBrB+@wB~uB+@wBrB+@rBrB+@rB~uB+@wB~uB+@kBoB+@rBmB+@kBmB+@kBoB+@rBoB+@rBmB+@kBrB+@rBoB+@kBoB+@kBrB+@rBrB+@rBoB+@rBoB+@wBrB+@wBoB+@rBoB+@rBrB+@wBrB+@rBmB+@wBmB+@wBmB+@wBoB+@rBmB+@rBoB+@wBoB+@wBmB+@rBmB+@<;rBSxB+@wBQxB?5?wBSxB+@H*<;rBSxB+@rBQxB?5?wBQxB?5?<;kBSxB+@rBQxB?5?rBSxB+@b*<;kBSxB+@kBQxB?5?rBQxB?5?kBQxB?5?rBQxBB`?rBQxB?5?kBQxB?5?kBQxBB`?rBQxBB`?rBQxB?5?wBQxB%?wBQxB?5?wBQxBB`?rBQxB?5?rBQxBB`?wBQxBB`?wBQxB%?rBQxB?5?<;ASxB+@kBQxB?5?kBSxB+@b*<;ASxB+@AQxB?5?kBQxB?5?<;AQxB?5?V@SxB+@V@QxB?5?3*<;AQxB?5?ASxB+@V@SxB+@V@QxBB`?AQxB?5?V@QxB%?V@QxBB`?AQxBB`?AQxB?5?AQxB?5?V@QxB?5?V@QxB%?AQxB?5?kBQxBB`?kBQxB?5?AQxB?5?AQxBB`?kBQxBB`?AQxBB`?kBQxB?kBQxBB`?AQxBB`?AQxB?kBQxB?V@QxBB`?V@QxB?AQxB?AQxB?AQxBB`?V@QxBB`?w[;AQxB?/AOxBAOxB G[;/AOxBAQxB?V@QxB?2۳[;V@QxB?V@OxBQ@OxB[;/AOxBV@QxB?pAOxB[;V@QxB?Q@OxB@OxB[;@OxBpAOxBV@QxB?[;/AOxB/AOxBV@QxB?w`[;kBQxB?aBOxBkBOxB[;kBQxB?AQxB?aBOxB[;AOxBBBBB?BAB~ A9?BРA?BABBBA9H??BF[ABИAB~ A9??B}?SB9?B|)BB>B?BmAB~ A9?BA?BABAB~ A9??B|%BB|)BBA9H??B=A9?BA9H?B|)B?BmABA9H?B~ A9?vB~ AvB~ A9?vBA9H?vB|%BvB=A9?vB}?SB9?vB}?SBvBBBvB}?SB9?vB>BvB}?SB9?vBBBvBmAvBA9H?vBAvBAwBAvBAvB~ AvBA9H?vBFKAvB>BvB|)BvB}?SB9?vBBvBAvBA9H?vBИAvBA9H?vBРAvB|)BvB|%BvB}?SB9?vBAvBA9H?vBmAvBAvBAvBA9H?vBAvBA9H?vBAvBF[AvBA9H?vBИA?@A@A!?Q@A?pAA!?@A@A!??pAA!?pAA@A?Q@A@A!?@ApAV BpAV B!?@V BQ@V B@V B!?@V BQ@V BpAV B!?@V B!?pAV B!?Q@V B@V BpAV B!?@A!?@V B!?pAV B!?pAA!?@A!?pAA!?pAApAApAA!?pAV B!?pAApAV BpAApAV B!?pAmApAV B!?pAApAmApAApAV B!??@V B@V B!?@A?@A@A!?@A?@A@A!?@mA?@A@V B!?@A!??@A!?@A@mAq5~m[>-BA%Q@-BSA%Q@-BAHZ@J(? ?-BaAHZ@.BaA k@-BA%Q@r7.?H ?.BuA[@-BA%Q@.BaA k@? ?.BuA[@Q.BuA%Q@-BA%Q@1BA%Q@23BA%Q@,2BAW@ܾ-"?.BA[@&0BAx@.BA k@ ߾,t?.BA[@&0BAi@&0BAx@?23BaA%Q@1BaA%Q@,2BaAW@,2BAW@|4BA%Q@Nb3BA^@,2BAW@23BA%Q@|4BA%Q@O5? ?&0BaAx@81BuA/t@&0BuAi@O5? ?&0BaAx@81BaAJ @81BuA/t@?|4BaA%Q@,2BaAW@Nb3BaA^@?|4BaA%Q@23BaA%Q@,2BaAW@Nb3BA^@4BA%Q@V4BAd@Nb3BA^@|4BA%Q@4BA%Q@T_SQ;G%?81BA/t@p3BA?5@81BAJ @_EQ;G%?81BA/t@p3BA/}@p3BA?5@?4BaA%Q@Nb3BaA^@V4BaAd@?4BaA%Q@|4BaA%Q@Nb3BaA^@V4BAd@5BA%Q@X5BA+g@V4BAd@4BA%Q@5BA%Q@S3~#>bd?p3BXA@:4BaAĈ@p3BaA?5@LS3C#>rd?p3BXA@:4BXA㥋@:4BaAĈ@?5BaA%Q@V4BaAd@X5BaA+g@?5BaA%Q@4BaA%Q@V4BaAd@Zd6BAQh@5BA%Q@Zd6BA%Q@Zd6BAQh@X5BA+g@5BA%Q@g &p@'p(?:4BA@Zd6BA@:4BAĈ@.38?,6)?:4BA@Zd6BA@Zd6BA@?5BaA%Q@Zd6BaAQh@Zd6BaA%Q@?5BaA%Q@X5BaA+g@Zd6BaAQh@7BA%Q@Zd6BAQh@Zd6BA%Q@7BA%Q@n7BA+g@Zd6BAQh@e= >g?Zd6BXAz@p8BaAĈ@Zd6BaA@e= >g?Zd6BXAz@p8BXA㥋@p8BaAĈ@?Zd6BaAQh@7BaA%Q@Zd6BaA%Q@?Zd6BaAQh@n7BaA+g@7BaA%Q@7BA%Q@r8BAd@n7BA+g@7BA%Q@7BA%Q@r8BAd@H!>?R0'?p8BA@:9BA?5@p8BAĈ@>p>7 (?p8BA@:9BA/}@:9BA?5@?r8BaAd@7BaA%Q@n7BaA+g@?r8BaAd@7BaA%Q@7BaA%Q@7BA%Q@Zd9BA^@r8BAd@7BA%Q@:8BA%Q@Zd9BA^@_>EQ;?G%?:9BaA?5@r=;BuA/t@:9BuA/}@R_>SQ;?G%?:9BaA?5@r=;BaAJ @r=;BuA/t@?Zd9BaA^@7BaA%Q@r8BaAd@?Zd9BaA^@:8BaA%Q@7BaA%Q@:8BA%Q@~?:BAW@Zd9BA^@:8BA%Q@9BA%Q@~?:BAW@l>þHR?r=;BAJ @þ@R?r=;BAJ @L-_?-s?BuA%Q@>BaAHZ@>BA%Q@??Vg ?v>BuA%Q@=BuA[@>BaAHZ@?C? ?>BaAHZ@=BuA[@=BaA k@}7?Wn^>>BSA%Q@/?BA%Q@>BAHZ@1O:BuA%Q@~?:BaAW@~?:BuAW@O:BuA%Q@:BaA%Q@~?:BaAW@Q.BA%Q@th1BA%Q@.BA[@?th1BuA%Q@Q.BuA%Q@.BuA[@.BA[@,2BAW@&0BAi@.BA[@1BA%Q@,2BAW@th1BA%Q@1BA%Q@.BA[@?1BuA%Q@&0BuAi@,2BuAW@?&0BuAi@th1BuA%Q@.BuA[@?&0BuAi@1BuA%Q@th1BuA%Q@,2BAW@81BA/t@&0BAi@,2BAW@Nb3BA^@81BA/t@?Nb3BuA^@&0BuAi@81BuA/t@?Nb3BuA^@,2BuAW@&0BuAi@Nb3BA^@p3BA/}@81BA/t@Nb3BA^@V4BAd@p3BA/}@?V4BuAd@81BuA/t@p3BuA/}@?V4BuAd@Nb3BuA^@81BuA/t@V4BAd@:4BA@p3BA/}@V4BAd@X5BA+g@:4BA@?X5BuA+g@p3BuA/}@:4BuA@?X5BuA+g@V4BuAd@p3BuA/}@X5BA+g@Zd6BA@:4BA@X5BA+g@Zd6BAQh@Zd6BA@?Zd6BuAQh@:4BuA@Zd6BuA@?Zd6BuAQh@X5BuA+g@:4BuA@Zd6BAQh@p8BA@Zd6BA@Zd6BAQh@n7BA+g@p8BA@?n7BuA+g@Zd6BuA@p8BuA@?n7BuA+g@Zd6BuAQh@Zd6BuA@n7BA+g@:9BA/}@p8BA@n7BA+g@r8BAd@:9BA/}@?r8BuAd@p8BuA@:9BuA/}@?r8BuAd@n7BuA+g@p8BuA@r8BAd@r=;BA/t@:9BA/}@r8BAd@Zd9BA^@r=;BA/t@?Zd9BuA^@:9BuA/}@r=;BuA/t@?Zd9BuA^@r8BuAd@:9BuA/}@Zd9BA^@BA%Q@=BA[@?v>BuA%Q@B`;BuA%Q@=BuA[@?BN1BA%Q@,2BAW@,2BAW@?N1BA%Q@1BA%Q@,2BAW@>cNb3BA^@,2BAW@Nb3BA^@>ucNb3BA^@,2BAW@,2BAW@!>}rV4BAd@Nb3BA^@V4BAd@!>+1}rV4BAd@Nb3BA^@Nb3BA^@?>z{X5BA+g@V4BAd@X5BA+g@?>3l1z{X5BA+g@V4BAd@V4BAd@0_=eZd6BAQh@X5BA+g@Zd6BAQh@0_=0eZd6BAQh@X5BA+g@X5BA+g@%rcn7BA+g@Zd6BAQh@n7BA+g@%rbjD1cn7BA+g@Zd6BAQh@Zd6BAQh@%>4{r8BAd@n7BA+g@r8BAd@%>4{r8BAd@n7BA+g@n7BA+g@6_rrZd9BA^@r8BAd@Zd9BA^@6_Y rrZd9BA^@r8BAd@r8BAd@c~?:BAW@Zd9BA^@~?:BAW@꾋c~?:BAW@Zd9BA^@Zd9BA^@1O:BA%Q@~?:BAW@~?:BAW@O:BA%Q@:BA%Q@~?:BAW@?BN1BaA%Q@,2BuAW@,2BaAW@?N1BaA%Q@1BuA%Q@,2BuAW@>c,2BuAW@Nb3BaA^@,2BaAW@>uc,2BuAW@Nb3BuA^@Nb3BaA^@!>}rNb3BuA^@V4BaAd@Nb3BaA^@!>+1}rNb3BuA^@V4BuAd@V4BaAd@?>z{V4BuAd@X5BaA+g@V4BaAd@?>3l1z{V4BuAd@X5BuA+g@X5BaA+g@0_=eX5BuA+g@Zd6BaAQh@X5BaA+g@0_=0eX5BuA+g@Zd6BuAQh@Zd6BaAQh@%rcZd6BuAQh@n7BaA+g@Zd6BaAQh@%rbjD1cZd6BuAQh@n7BuA+g@n7BaA+g@%>4{n7BuA+g@r8BaAd@n7BaA+g@%>4{n7BuA+g@r8BuAd@r8BaAd@6_rrr8BuAd@Zd9BaA^@r8BaAd@6_Y rrr8BuAd@Zd9BuA^@Zd9BaA^@cZd9BuA^@~?:BaAW@Zd9BaA^@꾋cZd9BuA^@~?:BuAW@~?:BaAW@%6_?U>-BA%Q@-BaA%Q@-BaAHZ@XUF ?Q.BA%Q@-BAHZ@-BSA%Q@;f ?Q.BA%Q@.BA[@-BAHZ@C ?-BAHZ@.BA[@.BA k@3޾,-??.BaA k@&0BuAi@.BuA[@bdݾ-??.BaA k@&0BaAx@&0BuAi@O5 ?81BAJ @&0BAi@81BA/t@O5 ?81BAJ @&0BAx@&0BAi@_QQ;?G%?81BaAJ @p3BuA/}@81BuA/t@b_HQ;?G%?81BaAJ @p3BaA?5@p3BuA/}@p>?7 (?p3BaA?5@:4BuA@p3BuA/}@H!??R0'?p3BaA?5@:4BaAĈ@:4BuA@2y@?~j(?:4BaAĈ@Zd6BuA@:4BuA@D&??;)?:4BaAĈ@Zd6BaA@Zd6BuA@|4=??5)?Zd6BaA@p8BuA@Zd6BuA@&=@?o(?Zd6BaA@p8BaAĈ@p8BuA@'=&??A'?p8BaAĈ@:9BuA/}@p8BuA@>]>?'?p8BaAĈ@:9BaA?5@:9BuA/}@N>6;]?r=;BXA@:9BA?5@r=;BAJ @N>l;]?r=;BXA@:9BXA@:9BA?5@hP>5? ?r=;BaAJ @~5? ?r=;BaAJ @-?2?.?R?BAHZ@=BA k@>BSA%Q@q? ?=BA[@>BSA%Q@=BA k@ ? N ?=BA[@v>BA%Q@>BSA%Q@8?k?>/?BaA%Q@>BA%Q@>BaAHZ@PEpȀ?-BAHZ@6^-BXA%Q@-BA%Q@x@QmAxO?-BAHZ@-BXAף`@6^-BXA%Q@ Y B?.BA k@&0BXA~@.BXAp@ Y B?.BA k@&0BAx@&0BXA~@N2;]?81BAJ @p3BXA@81BXA@Nr;]?81BAJ @p3BA?5@p3BXA@'&?A'?:4BAĈ@p3BA/}@:4BA@]>'?:4BAĈ@p3BA?5@p3BA/}@d!׾g?:4BAĈ@Zd6BXAz@:4BXA㥋@d!׾g?:4BAĈ@Zd6BA@Zd6BXAz@3=y@j(?p8BAĈ@Zd6BA@p8BA@i'=W?;)?p8BAĈ@Zd6BA@Zd6BA@LS3>C#Ծrd?p8BAĈ@:9BXA@p8BXA㥋@S3>#Ծad?p8BAĈ@:9BA?5@:9BXA@mP>5 ?5 ?7nB?8nB?BAHZ@/?BA%Q@?Q?Cxn?j?BXA%Q@>BXAף`@>BAHZ@U/>(?-BXAף`@.BaA k@-BaAHZ@X/->(?-BXAף`@.BXAp@.BaA k@w־٤>uR?&0BXA~@81BaAJ @&0BaAx@l־>~R?&0BXA~@81BXA@81BaAJ @_>QQ;G%?r=;BAJ @:9BA/}@r=;BA/t@b_>HQ;G%?r=;BAJ @:9BA?5@:9BA/}@X/?-(?=BA k@>BXAף`@=BXAp@U/?(?=BA k@>BAHZ@>BXAף`@S3A#Ծod?:4BXA㥋@p3BA?5@:4BAĈ@AS3#Ծdd?:4BXA㥋@p3BXA@p3BA?5@e= ׾g?p8BXA㥋@Zd6BA@p8BAĈ@e= ׾g?p8BXA㥋@Zd6BXAz@Zd6BA@|>>ER?r=;BXA@>CR?r=;BXA@r>]?:9BXA@r=;BaAJ @:9BaA?5@N>2>]?:9BXA@r=;BXA@r=;BaAJ @PEp>Ȁ?6^-BXA%Q@-BaAHZ@-BaA%Q@x@QnAx>O?6^-BXA%Q@-BXAף`@-BaAHZ@ >U B?.BXAp@&0BaAx@.BaA k@ >] B?.BXAp@&0BXA~@&0BaAx@N6>]?81BXA@p3BaA?5@81BaAJ @Nl>]?81BXA@p3BXA@p3BaA?5@d!>g?:4BXA㥋@Zd6BaA@:4BaAĈ@d!>g?:4BXA㥋@Zd6BXAz@Zd6BaA@S3>A#>od?p8BXA㥋@:9BaA?5@p8BaAĈ@AS3>#>dd?p8BXA㥋@:9BXA@:9BaA?5@ ?Ef3nB?=BXAp@ F?>BaAHZ@j?BXA%Q@/?BaA%Q@?Q?Cx>n?>BaAHZ@>BXAף`@j?BXA%Q@R/1(?.BXAp@-BAHZ@.BA k@[/(?.BXAp@-BXAף`@-BAHZ@|־þ{R?81BXA@&0BAx@81BAJ @f־ܤþyR?81BXA@&0BXA~@&0BAx@R/?1>(?=BXAp@>BaAHZ@=BaA k@[/?>(?=BXAp@>BXAף`@>BaAHZ@ (B%B@@0-B%B@@z(B%BD@Uxu>L7!B%B@@L7!B5^B@@th!B%BjL@h ̢}?L7!B5^B@@th!B/B@@th!B%BjL@?0-BB@@ (BB@@z(BBD@z(B%BD@1B%B@@x)B%BP@z(B%BD@0-B%B@@1B%B@@K71)>?th!BB@@O"BB P@P!BB@@)2&|>?th!BB@@th!BBjL@O"BB P@o#2Ri>?O"BB P@th!BBjL@O"BB|_@?1BB@@z(BBD@x)BBP@?1BB@@0-BB@@z(BBD@x)B%BP@`2B%B@@Nb*B%B[@x)B%BP@1B%B@@`2B%B@@~9x$?O"BB P@#B%BGq@O"B%B|_@~8x$?O"BB P@#BBa@#B%BGq@?`2BB@@x)BBP@Nb*BB[@?`2BB@@1BB@@x)BBP@Nb*B%B[@3B%B@@+B%Be@Nb*B%B[@`2B%B@@3B%B@@ϱ%"?f0?#BBGq@%BBJ r@#BBa@* -"?*1?#BBGq@%BBף@%BBJ r@?3BB@@Nb*BB[@+BBe@?3BB@@`2BB@@Nb*BB[@+B%Be@> 4B%B@@&-B%BVn@+B%Be@3B%B@@> 4B%B@@퀾yH'p6?%BBJ r@A(B%B@%B%Bף@퀾yH'p6?%BBJ r@A(BB@A(B%B@?> 4BB@@+BBe@&-BBVn@?> 4BB@@3BB@@+BBe@&-B%BVn@6^4B%B@@.B%BB`u@&-B%BVn@> 4B%B@@6^4B%B@@./7*?9?A(BB@+BBˡ@A(BB@./7*?9?A(BB@+BB}?@+BBˡ@?6^4BB@@&-BBVn@.BBB`u@?6^4BB@@> 4BB@@&-BBVn@.B%BB`u@أ4B%B@@<0B%B~z@.B%BB`u@6^4B%B@@أ4B%B@@;eZ+.s;?+BBˡ@C.B%Bsh@+B%B}?@;eZ+.s;?+BBˡ@C.BBʉ@C.B%Bsh@?أ4BB@@.BBB`u@<0BB~z@?أ4BB@@6^4BB@@.BBB`u@<0B%B~z@H4B%B@@2B%B-}@<0B%B~z@أ4B%B@@H4B%B@@Lz>n?C.BBI@̡1BB@C.BBsh@z2>n?C.BBI@̡1BBٖ@̡1BB@?H4BB@@<0BB~z@2BB-}@?H4BB@@أ4BB@@<0BB~z@5B%BR~@H4B%B@@5B%B@@5B%BR~@2B%B-}@H4B%B@@ˊ,q:o?5BB@8BB@5BB̔@<&>1o?5BB@8BBٖ@8BB@?5BBR~@V5BB@@5BB@@?5BBR~@A7BB-}@V5BB@@V5B%B@@X9B%B~z@A7B%B-}@V5B%B@@v5B%B@@X9B%B~z@).=n,^%Άi??B%B}?@ABB~@?BB @f>.%i??B%B}?@AB%B@ABB~@?b=BBVn@5BB@@K;BBB`u@?b=BBVn@/6BB@@5BB@@/6B%B@@>B%Be@b=B%BVn@/6B%B@@̡6B%B@@>B%Be@>pH'g6?ABB@nDB%Bף@AB%B@>pH'f6?ABB@nDBBJ r@nDB%Bף@?>BBe@/6BB@@b=BBVn@?>BBe@̡6BB@@/6BB@@̡6B%B@@?B%B[@>B%Be@̡6B%B@@Q7B%B@@?B%B[@i>A"?0?nDBBף@nFBBa@nDBBJ r@>"?0?nDBBף@nFBBGq@nFBBa@??BB[@̡6BB@@>BBe@??BB[@Q7BB@@̡6BB@@Q7B%B@@x@B%BP@?B%B[@Q7B%B@@8B%B@@x@B%BP@}>Nmx$?nFBBa@nGB%B|_@nFB%BGq@}>Nmx$?nFBBa@nGBB P@nGB%B|_@?x@BBP@Q7BB@@?BB[@?x@BBP@8BB@@Q7BB@@8B%B@@MAB%BD@x@B%BP@8B%B@@Z?nGBB P@HBB@@HBB@@)2?&|>?nGBB P@HBBjL@HBB@@o#2?Ri>?HBBjL@nGBB P@nGBB|_@?MABBD@8BB@@x@BBP@?MABBD@ZHB/B@@IB%B@@HB%BjL@?B`ABB@@ZBBe@b=BBVn@yF9qb=BBVn@>BBe@>BBe@43$BB@@ (BB@@z(BBD@? (BB@@43$BB@@z(BBD@43$BB@@O"BB P@P!BB@@43$BB@@z(BBD@O"BB P@O"BB P@z(BBD@x)BBP@?O"BB P@43$BB@@P!BB@@?O"BB P@z(BBD@43$BB@@?z(BBD@O"BB P@x)BBP@x)BBP@#BBa@O"BB P@x)BBP@Nb*BB[@#BBa@?Nb*BB[@O"BB P@#BBa@?Nb*BB[@x)BBP@O"BB P@Nb*BB[@%BBJ r@#BBa@Nb*BB[@+BBe@%BBJ r@?+BBe@#BBa@%BBJ r@?+BBe@Nb*BB[@#BBa@+BBe@A(BB@%BBJ r@+BBe@&-BBVn@A(BB@?&-BBVn@%BBJ r@A(BB@?&-BBVn@+BBe@%BBJ r@&-BBVn@+BBˡ@A(BB@&-BBVn@.BBB`u@+BBˡ@?.BBB`u@A(BB@+BBˡ@?.BBB`u@&-BBVn@A(BB@.BBB`u@C.BBʉ@+BBˡ@.BBB`u@<0BB~z@C.BBʉ@?<0BB~z@+BBˡ@C.BBʉ@?<0BB~z@.BBB`u@+BBˡ@<0BB~z@̡1BBZ@C.BBʉ@<0BB~z@2BB-}@̡1BBZ@?2BB-}@C.BBʉ@̡1BBZ@?2BB-}@<0BB~z@C.BBʉ@2BB-}@5BB/@̡1BBZ@2BB-}@5BBR~@5BB/@?5BBR~@̡1BBZ@5BB/@?5BBR~@2BB-}@̡1BBZ@5BBR~@8BBZ@5BB/@5BBR~@A7BB-}@8BBZ@?A7BB-}@5BB/@8BBZ@?A7BB-}@5BBR~@5BB/@A7BB-}@;BBʉ@8BBZ@A7BB-}@X9BB~z@;BBʉ@?X9BB~z@8BBZ@;BBʉ@?X9BB~z@A7BB-}@8BBZ@X9BB~z@?BBˡ@;BBʉ@X9BB~z@K;BBB`u@?BBˡ@?K;BBB`u@;BBʉ@?BBˡ@?K;BBB`u@X9BB~z@;BBʉ@K;BBB`u@ABB@?BBˡ@K;BBB`u@b=BBVn@ABB@?b=BBVn@?BBˡ@ABB@?b=BBVn@K;BBB`u@?BBˡ@b=BBVn@nDBBJ r@ABB@b=BBVn@>BBe@nDBBJ r@?>BBe@ABB@nDBBJ r@?>BBe@b=BBVn@ABB@>BBe@nFBBa@nDBBJ r@>BBe@?BB[@nFBBa@??BB[@nDBBJ r@nFBBa@??BB[@>BBe@nDBBJ r@?BB[@nGBB P@nFBBa@?BB[@x@BBP@nGBB P@?x@BBP@nFBBa@nGBB P@?x@BBP@?BB[@nFBBa@nGBB P@FBB@@HBB@@nGBB P@MABBD@FBB@@MABBD@nGBB P@x@BBP@?FBB@@nGBB P@HBB@@?FBB@@MABBD@nGBB P@?nGBB P@MABBD@x@BBP@B`ABB@@FBB@@MABBD@?FBB@@B`ABB@@MABBD@z']d>BBe@?BB[@>BBe@z'澡S1/]d>BBe@?BB[@?BB[@py?.@19Rf (BB@@z(B%BD@z(BBD@py?9Rf (BB@@ (B%B@@z(B%BD@+^L?BB[@x@BBP@?BB[@+2^L?BB[@x@BBP@x@BBP@K?^x)BBP@z(B%BD@x)B%BP@K?5q2^x)BBP@z(BBD@z(B%BD@,?2^LNb*BB[@x)B%BP@Nb*B%B[@,?2^LNb*BB[@x)BBP@x)B%BP@y'>]d+BBe@Nb*B%B[@+B%Be@y'>R1]d+BBe@Nb*BB[@Nb*B%B[@y>q&-BBVn@+B%Be@&-B%BVn@y>92q&-BBVn@+BBe@+B%Be@GLw>(lx.BBB`u@&-B%BVn@.B%BB`u@GLw>DC(lx.BBB`u@&-BBVn@&-B%BVn@f%>|<0BB~z@.B%BB`u@<0B%B~z@f%><1|<0BB~z@.BBB`u@.B%BB`u@F=h~2BB-}@<0B%B~z@2B%B-}@F=1h~2BB-}@<0BB~z@<0B%B~z@)< 5BBR~@2B%B-}@5B%BR~@)<Z/ 5BBR~@2BB-}@2B%B-}@qmA7BB-}@5B%BR~@A7B%B-}@qm/A7BB-}@5BBR~@5B%BR~@Fýh~X9BB~z@A7B%B-}@X9B%B~z@Fýh~X9BB~z@A7BB-}@A7B%B-}@%à|K;BBB`u@X9B%B~z@K;B%BB`u@% Sà|K;BBB`u@X9BB~z@X9B%B~z@NMwlxb=BBVn@K;B%BB`u@b=B%BVn@NMw|7/1lxb=BBVn@K;BBB`u@K;B%BB`u@yq>BBe@b=B%BVn@>B%Be@y9q>BBe@b=BBVn@b=B%BVn@y']d?BB[@>B%Be@?B%B[@y'R1/]d?BB[@>BBe@>B%Be@+^Lx@BBP@?B%B[@x@B%BP@+12^Lx@BBP@?BB[@?B%B[@K^MABBD@x@B%BP@MAB%BD@K5q^MABBD@x@BBP@x@B%BP@K^x@BBP@MABBD@x@BBP@Kj6q^x@BBP@MABBD@MABBD@ry:fMAB%BD@B`ABB@@MABBD@ry;:fMAB%BD@B`AB%B@@B`ABB@@py?:Rfz(BBD@ (BB@@z(BBD@py?/@1:Rfz(BBD@ (BB@@ (BB@@ry<:fB`ABB@@MABBD@MABBD@ry:fB`ABB@@B`ABB@@MABBD@K?^z(BBD@x)BBP@z(BBD@K?j6q2^z(BBD@x)BBP@x)BBP@,?2^Lx)BBP@Nb*BB[@x)BBP@,?r2^Lx)BBP@Nb*BB[@Nb*BB[@z'>]dNb*BB[@+BBe@Nb*BB[@z'>S1]dNb*BB[@+BBe@+BBe@y>q+BBe@&-BBVn@+BBe@y>F92q+BBe@&-BBVn@&-BBVn@GLw>(lx&-BBVn@.BBB`u@&-BBVn@GLw>wEC(lx&-BBVn@.BBB`u@.BBB`u@f%>|.BBB`u@<0BB~z@.BBB`u@f%>1|.BBB`u@<0BB~z@<0BB~z@F=h~<0BB~z@2BB-}@<0BB~z@F=`1h~<0BB~z@2BB-}@2BB-}@*< 2BB-}@5BBR~@2BB-}@*p>th!BB@@L7!BB@@th!BBjL@j2@@?O"BB P@O"B%B|_@P!BB@@2ۏT?th!B/B@@O"B%B|_@th!B%BjL@h0}<?th!B/B@@P!BB@@O"B%B|_@H~|?x$?O"BB|_@#BBa@O"BB P@H~|?x$?O"BB|_@#BBGq@#BBa@i"F0?%B%Bף@#BBa@%BBJ r@"0?%B%Bף@#B%BGq@#BBa@^퀾H'?%6?%BBף@A(BB@%BBJ r@^퀾H'?%6?%BBף@A(BB@A(BB@{/7*`9?+B%B}?@A(BB@+BBˡ@|/7*`9?+B%B}?@A(B%B@A(BB@d+?r;?+BB}?@C.BBʉ@+BBˡ@d+?r;?+BB}?@C.BBsh@C.BBʉ@-zn,?^l??BB @;B%Bsh@?B%B}?@>魱l??BB @;BBI@;B%Bsh@7> *?9??BB}?@ABB@?BBˡ@7> *?9??BB}?@ABB@ABB@>H'?6?ABB@nDBBJ r@ABB@>H'?6?ABB@nDBBף@nDBBJ r@,б>"f0?nFB%BGq@nDBBJ r@nFBBa@*>,"*1?nFB%BGq@nDB%Bף@nDBBJ r@F}>?5x$?nFBBGq@nGBB P@nFBBa@F}>?5x$?nFBBGq@nGBB|_@nGBB P@2?܏T?nGB%B|_@HB/B@@HB%BjL@re0?c<?nGB%B|_@HBB@@HB/B@@[2??nGBB P@HBB@@nGB%B|_@g ? ??IBB@@HBB@@HBBjL@x?~u>IBB@@IBB@@HBBjL@w=t>th!BB-R@L7!BB@@ !BB@@Ҁwg= t>th!BB-R@th!BBjL@L7!BB@@EŒLC?O"B%B|_@#BB= w@O"BB}?e@FŒLC?O"B%B|_@#B%BGq@#BB= w@Fٞ8F>c?%B%Bף@A(BB~@%BB@]崪>c?%B%Bף@A(B%B@A(BB~@Rql?+B%B}?@C.BBI@+BB @R:l?+B%B}?@C.B%Bsh@C.BBI@-n,^ *9?AB%B@?BBˡ@ABB@m7> *9?AB%B@?B%B}?@?BBˡ@>>_c?ABB~@nDBBף@ABB@ٞ>8>Y>c?ABB~@nDBB@nDBBף@?ŒC?nFB%BGq@nGBB}?e@nFBB= w@?ŒC?nFB%BGq@nGB%B|_@nGBB}?e@vw?t>IBB@@HB%BjL@IB%B@@w?h t>IBB@@HBB-R@HB%BjL@FLb>?th!BB-R@O"BB|_@th!BBjL@FLb>?th!BB-R@O"BB}?e@O"BB|_@vپТ>vY?#BB= w@%BBף@#BBGq@ ھUѥ>IX?#BB= w@%BB@%BBף@GJfO+>fi?A(BB~@+BB}?@A(BB@HJfO+>fi?A(BB~@+BB @+BB}?@O=+t;??B%B}?@;BBʉ@?BBˡ@O=+t;??B%B}?@;B%Bsh@;BBʉ@>ѥHX?nDB%Bף@nFBB= w@nDBB@_>Ѣ_Y?nDB%Bף@nFB%BGq@nFBB= w@F?sMb?nGB%B|_@HBB-R@nGBB}?e@F?oMb?nGB%B|_@HB%BjL@HBB-R@,zn?̡1BBٖ@C.B%Bsh@̡1B%B@zzn?̡1BBٖ@C.BBI@C.B%Bsh@ת<ʴo?8BBٖ@5B%B̔@8B%B@Ω<o?8BBٖ@5BB@5B%B̔@f>$>i??BB @ABB@?BB}?@)f>$>i??BB @ABB~@ABB@>E>l?;BBI@?BB}?@;BBsh@>}>l?;BBI@?BB @?BB}?@w) t>th!B%BjL@ !BB@@L7!B%B@@}w0lt>th!B%BjL@th!BB-R@ !BB@@Ē>]C?O"BB}?e@#BBGq@O"BB|_@Ē>]C?O"BB}?e@#BB= w@#BBGq@(-->] c?%BB@A(BB@%BBף@>۪>c?%BB@A(BB~@A(BB@Rͪ>l?+BB @C.BBsh@+BB}?@R>l?+BB @C.BBI@C.BBsh@|$;>Lo?̡1BBٖ@5BB̔@̡1BB@u#>Wo?̡1BBٖ@5BB@5BB̔@z=2>n?8BBٖ@;BBsh@8BB@z=>n?8BBٖ@;BBI@;BBsh@->0 c?nDBB@AB%B@nDB%Bף@/?>۪c?nDBB@ABB~@AB%B@#?Ē>C?nFBB= w@nGBB|_@nFBBGq@$?Ē>C?nFBB= w@nGBB}?e@nGBB|_@xw?܋=t>HBBjL@IBB@@IBB@@w?=t>HBBjL@HBB-R@IBB@@FrMb?O"BB}?e@th!B%BjL@O"B%B|_@FtMb?O"BB}?e@th!BB-R@th!B%BjL@ؾX?%BB@#B%BGq@%B%Bף@Eھ LX?%BB@#BB= w@#B%BGq@,Jf+Ii?+BB @A(B%B@+B%B}?@+Jf+Ii?+BB @A(BB~@A(B%B@>O>X?nDBB@nFBBGq@nDBBף@\>u>bX?nDBB@nFBB= w@nFBBGq@F?Lb>?nGBB}?e@HBBjL@nGBB|_@F?Lb>?nGBB}?e@HBB-R@HBBjL@=T!XiBlB@@OjBB/]@XiBlB/]@=T!~1XiBlB@@OjBB@@OjBB/]@?XiBB+f@/jBRB+f@XiBr B+f@">vwOjBB@@~?kBd;B/]@OjBB/]@">vw>k1OjBB@@~?kBd;B@@~?kBd;B/]@?/jBRB+f@jBB+f@XiBr B+f@O>ag~?kBd;B@@lBףB/]@~?kBd;B/]@O>ag ~?kBd;B@@lBףB@@lBףB/]@?jBB+f@kBIB+f@XiBr B+f@?kQlBףB@@zlB33B/]@lBףB/]@?kQ5lBףB@@zlB33B@@zlB33B/]@?kBIB+f@plBB+f@XiBr B+f@3?~6zlB33B@@mBHB/]@zlB33B/]@3?~6zlB33B@@mBHB@@mBHB/]@?plBB+f@2mB)\B+f@XiBr B+f@aR?XamBHB@@&nBB/]@mBHB/]@aR?XamBHB@@&nBB@@&nBB/]@?2mB)\B+f@mBJ B+f@XiBr B+f@@h?Z׾&nBB@@\nBPB/]@&nBB/]@@h?Z׾±&nBB@@\nBPB@@\nBPB/]@?mBJ B+f@0mBB+f@XiBr B+f@v?\nBPB@@nB| B/]@\nBPB/]@v?41\nBPB@@nB| B@@nB| B/]@?0mBB+f@|nB B+f@XiBr B+f@? nB| B@@`nBr B/]@nB| B/]@? 0nB| B@@`nBr B@@`nBr B/]@?|nB B+f@&nBr B+f@XiBr B+f@h!?=`nBr B@@nBj B/]@`nBr B/]@h!?="X0`nBr B@@nBj B@@nBj B/]@?&nBr B+f@{nBI B+f@XiBr B+f@v?>nBj B@@\nBZ B/]@nBj B/]@v?>4nBj B@@\nBZ B@@\nBZ B/]@?{nBI B+f@0mB B+f@XiBr B+f@g?>\nBZ B@@&nBX9 B/]@\nBZ B/]@g?>O\nBZ B@@&nBX9 B@@&nBX9 B/]@?0mB B+f@mB# B+f@XiBr B+f@C?Ƭ>pH?&nBX9 B/]@2mB7 B+f@mB# B+f@?L>!I?&nBX9 B/]@mBB/]@2mB7 B+f@?mB# B+f@2mB7 B+f@XiBr B+f@5?5?mBB@@zlB9B/]@mBB/]@5?5?mBB@@zlB9B@@zlB9B/]@?2mB7 B+f@plB B+f@XiBr B+f@_`?R?zlB9B@@lBAB/]@zlB9B/]@E?P?|#;zlB9B@@lBB@@lBAB/]@!-?R?lBAB/]@lBB@@lBAB@@?plB B+f@kBB+f@XiBr B+f@O>ag?lBAB@@~?kBB/]@lBAB/]@O>ag? 0lBAB@@~?kBB@@~?kBB/]@?kBB+f@jBB+f@XiBr B+f@->[v?~?kBB@@OjBB/]@~?kBB/]@->[v?e0~?kBB@@OjBB@@OjBB/]@?jBB+f@/jB/B+f@XiBr B+f@=T!?OjBB@@XiBB/]@OjBB/]@=T!?~OjBB@@XiBB@@XiBB/]@?/jB/B+f@XiBAB+f@XiBr B+f@?XiBB@@NbhBB/]@XiBB/]@?l0XiBB@@NbhBB@@NbhBB/]@?XiBAB+f@hB/B+f@XiBr B+f@-[v?NbhBB@@rgBB/]@NbhBB/]@-[v?eNbhBB@@rgBB@@rgBB/]@?hB/B+f@:gBB+f@XiBr B+f@Oؾag?rgBB@@vfBAB/]@rgBB/]@Oؾag? rgBB@@vfBAB@@vfBAB/]@?:gBB+f@fBB+f@XiBr B+f@!-R?vfBAB@@fBB@@vfBAB/]@2{R?eB9B/]@fBB@@eB9B@@cR?99eB9B/]@vfBAB/]@fBB@@?fBB+f@AfB B+f@XiBr B+f@6O3?eB9B@@eBB/]@eB9B/]@6O3?eB9B@@eBB@@eBB/]@?AfB B+f@eB7 B+f@XiBr B+f@R`?eBB@@DdBX9 B/]@eBB/]@R`?1eBB@@DdBX9 B@@DdBX9 B/]@?eB7 B+f@/eB# B+f@XiBr B+f@g+s>DdBX9 B@@ dBZ B/]@DdBX9 B/]@g+s>DdBX9 B@@ dBZ B@@ dBZ B/]@?/eB# B+f@dB B+f@XiBr B+f@Yls">I? dBZ B/]@dBI B+f@dB B+f@!>geI? dBZ B/]@HcBj B/]@dBI B+f@?dB B+f@dBI B+f@XiBr B+f@h!=HcBj B@@cBr B/]@HcBj B/]@h!="XHcBj B@@cBr B@@cBr B/]@?dBI B+f@DdBr B+f@XiBr B+f@ cBr B@@HcB| B/]@cBr B/]@ ڰcBr B@@HcB| B@@HcB| B/]@?DdBr B+f@dB B+f@XiBr B+f@uw$HcB| B@@ dBPB/]@HcB| B/]@uw$0HcB| B@@ dBPB@@ dBPB/]@?dB B+f@dBB+f@XiBr B+f@qgھ dBPB@@DdBB/]@ dBPB/]@qgھ0 dBPB@@DdBB@@DdBB/]@?dBB+f@/eBJ B+f@XiBr B+f@aRXaDdBB@@eBHB/]@DdBB/]@aRXaDdBB@@eBHB@@eBHB/]@?/eBJ B+f@eB)\B+f@XiBr B+f@y5n5eBHB@@eB33B/]@eBHB/]@y5n5T01eBHB@@eB33B@@eB33B/]@?eB)\B+f@AfBB+f@XiBr B+f@QeB33B@@vfBףB/]@eB33B/]@Q0eB33B@@vfBףB@@vfBףB/]@?AfBB+f@fBIB+f@XiBr B+f@OؾagvfBףB@@rgBd;B/]@vfBףB/]@Oؾag 0vfBףB@@rgBd;B@@rgBd;B/]@?fBIB+f@:gBB+f@XiBr B+f@o"dkI?rgBd;B/]@hBRB+f@:gBB+f@!GeI?rgBd;B/]@MbhBB/]@hBRB+f@?:gBB+f@hBRB+f@XiBr B+f@ZpvgI?MbhBB/]@XiBB+f@hBRB+f@zR{aI?MbhBB/]@XiBlB/]@XiBB+f@?hBRB+f@XiBB+f@XiBr B+f@>|X=boI?XiBlB/]@/jBRB+f@XiBB+f@KP=`I?XiBlB/]@OjBB/]@/jBRB+f@G#>0aI?OjBB/]@jBB+f@/jBRB+f@T!>2I?OjBB/]@~?kBd;B/]@jBB+f@>$I?~?kBd;B/]@kBIB+f@jBB+f@>MAI?~?kBd;B/]@lBףB/]@kBIB+f@1>$*I?lBףB/]@plBB+f@kBIB+f@6>:֑H?lBףB/]@zlB33B/]@plBB+f@d$>%zH?zlB33B/]@2mB)\B+f@plBB+f@>wI?zlB33B/]@mBHB/]@2mB)\B+f@=?yjI?mBHB/]@mBJ B+f@2mB)\B+f@?[H?mBHB/]@&nBB/]@mBJ B+f@S?qH?&nBB/]@0mBB+f@mBJ B+f@?*H?&nBB/]@\nBPB/]@0mBB+f@h? $H?\nBPB/]@|nB B+f@0mBB+f@?& WI?\nBPB/]@nB| B/]@|nB B+f@p?YfI?nB| B/]@&nBr B+f@|nB B+f@?rRI?nB| B/]@`nBr B/]@&nBr B+f@?~X=I?`nBr B/]@{nBI B+f@&nBr B+f@?BP=`I?`nBr B/]@nBj B/]@{nBI B+f@>?-D#>bI?nBj B/]@0mB B+f@{nBI B+f@{?'>H?nBj B/]@\nBZ B/]@0mB B+f@]?ce>H?\nBZ B/]@mB# B+f@0mB B+f@.,?G>H?\nBZ B/]@&nBX9 B/]@mB# B+f@R?`?&nBX9 B@@mBB/]@&nBX9 B/]@R?`?ڱ&nBX9 B@@mBB@@mBB/]@>>5I?mBB/]@plB B+f@2mB7 B+f@>>5I?mBB/]@zlB9B/]@plB B+f@> ?AI?zlB9B/]@kBB+f@plB B+f@ >?}{H?zlB9B/]@lBAB/]@kBB+f@Vх>Mv?eyH?lBAB/]@jBB+f@kBB+f@>%?H?lBAB/]@~?kBB/]@jBB+f@ $>ig?DH?~?kBB/]@/jB/B+f@jBB+f@&>ˁ?WI?~?kBB/]@OjBB/]@/jB/B+f@W=ru?eI?OjBB/]@XiBAB+f@/jB/B+f@P=\?I?OjBB/]@XiBB/]@XiBAB+f@ZO?I?XiBB/]@hB/B+f@XiBAB+f@R?aI?XiBB/]@NbhBB/]@hB/B+f@F#}?aI?NbhBB/]@:gBB+f@hB/B+f@'2?SH?NbhBB/]@rgBB/]@:gBB+f@I?eB9B/]@eB7 B+f@AfB B+f@IT>I?eB9B/]@eBB/]@eB7 B+f@=zǶ> I?eBB/]@/eB# B+f@eB7 B+f@m >b|H?eBB/]@DdBX9 B/]@/eB# B+f@t҅>_zH?DdBX9 B/]@dB B+f@/eB# B+f@%y>I?DdBX9 B/]@ dBZ B/]@dB B+f@uw$> dBZ B@@HcBj B/]@ dBZ B/]@uw$> dBZ B@@HcBj B@@HcBj B/]@buW=eI?HcBj B/]@DdBr B+f@dBI B+f@pP=I?HcBj B/]@cBr B/]@DdBr B+f@9ZI?cBr B/]@dB B+f@DdBr B+f@ QxaI?cBr B/]@HcB| B/]@dB B+f@G#|aI?HcB| B/]@dBB+f@dB B+f@Ҫ!ЕI?HcB| B/]@ dBPB/]@dBB+f@%I? dBPB/]@/eBJ B+f@dBB+f@v͡H? dBPB/]@DdBB/]@/eBJ B+f@.z?H?DdBB/]@eB)\B+f@/eBJ B+f@LI?DdBB/]@eBHB/]@eB)\B+f@I?eBHB/]@AfBB+f@eB)\B+f@ྲzI?eBHB/]@eB33B/]@AfBB+f@Dk`I?eB33B/]@fBIB+f@AfBB+f@[O'I?eB33B/]@vfBףB/]@fBIB+f@ʗm;I?vfBףB/]@:gBB+f@fBIB+f@MDI?vfBףB/]@rgBd;B/]@:gBB+f@"uwrgBd;B@@MbhBB/]@rgBd;B/]@"uw\PrgBd;B@@MbhBB@@MbhBB/]@oMbhBB@@XiBlB/]@MbhBB/]@oCMbhBB@@XiBlB@@XiBlB/]@hJBuh@d;?hJB;@7@hJBuh@7@hJBuh@d;?hJB;@+@hJB;@7@hJB;@+@hJBB`@7@hJB;@7@hJBuh@y&@hJB;@7@hJB;@y&@hJBuh@y&@hJBuh@7@hJB;@7@hJB;@B`5@hJBuh@y&@hJB;@y&@hJB;@B`5@hJBuh@y6@hJBuh@y&@hJBt=@o3@hJB;@y&@hJBt=@y&@hJBt=@o3@hJB@3@hJB;@y&@hJB;@y&@hJBf;@/4@hJB;@B`5@hJB;@y&@hJB@3@hJBf;@/4@hJBB`@7@hJB;@y&@hJB;@7@hJB@d;/@hJBB`@5@hJBy@3@?43XBuh@y&@43XBuh@,@43XB;@y&@?43XB;@y&@43XBuh@j<@43XB;@j<@?43XB;@y&@43XBuh@,@43XBuh@j<@?43XBuh@7@43XB;@y&@43XB;@7@?43XBuh@7@43XBuh@y&@43XB;@y&@?43XBs=@)\@43XB;@y&@43XBs=@y&@?43XBs=@)\@43XBB`@7@43XB;@y&@?43XB;@y&@43XBB`@7@43XB;@7@?43XB;@j<@43XBs=@y&@43XB;@y&@?43XBs=@j<@43XBs=@y&@43XB1@j<@?43XB;@+@43XBuh@7@43XB;@7@?43XB;@+@43XBuh@d;?43XBuh@7@?43XBB`@7@43XB;@+@43XB;@7@?43XB @j<@43XB @b8@43XBR@j<@?43XB @b8@43XB@y&@43XBs=@j<@?43XBs=@j<@43XB@y&@43XBs=@y&@?43XB@y&@43XBs=@)\@43XBs=@y&@?43XB(@5^:@43XB @b8@43XB @j<@?43XBF@j<@43XB(@5^:@43XB @j<@?43XBs=@ P@43XB@U@43XB@ P@>=43XB@ P@hJB@U@hJB@ P@->=43XB@ P@43XB@U@hJB@U@hJB@ P@hJB@U@hJBt=@ P@?43XBs=@ P@43XB @Y@43XB@U@uc]>43XB@U@hJB @Y@hJB@U@v ~.uc]>43XB@U@43XB @Y@hJB @Y@hJB@U@hJB @Y@hJBt=@ P@?43XBs=@ P@43XB-@^@43XB @Y@i!>43XB @Y@hJB-@^@hJB @Y@0ܯi!>43XB @Y@43XB-@^@hJB-@^@hJB @Y@hJB-@^@hJBt=@ P@?43XBs=@ P@43XB+@!b@43XB-@^@Oi?43XB-@^@hJB+@!b@hJB-@^@Ӕ/Oi?43XB-@^@43XB+@!b@hJB+@!b@hJB-@^@hJB+@!b@hJBt=@ P@?43XBs=@ P@43XB@Ef@43XB+@!b@5 5?43XB+@!b@hJB@Ef@hJB+@!b@J5 5?43XB+@!b@43XB@Ef@hJB@Ef@hJB+@!b@hJB@Ef@hJBt=@ P@?43XBs=@ P@43XB@L7i@43XB@Ef@Oi$O?43XB@Ef@hJB@L7i@hJB@Ef@/Oi$O?43XB@Ef@43XB@L7i@hJB@L7i@hJB@Ef@hJB@L7i@hJBt=@ P@?43XBs=@ P@43XBO@Zdk@43XB@L7i@ ھ|g?43XB@L7i@hJBO@Zdk@hJB@L7i@J.9/ ھ|g?43XB@L7i@43XBO@Zdk@hJBO@Zdk@hJB@L7i@hJBO@Zdk@hJBt=@ P@?43XBs=@ P@43XBy@l@43XBO@Zdk@oLDw?43XBO@Zdk@hJBy@l@hJBO@Zdk@/oLDw?43XBO@Zdk@43XBy@l@hJBy@l@hJBO@Zdk@hJBy@l@hJBt=@ P@?43XBs=@ P@43XBs=@Vm@43XBy@l@>?43XBy@l@hJBt=@Vm@hJBy@l@Ϯ8L>?43XBy@l@43XBs=@Vm@hJBt=@Vm@hJBy@l@hJBt=@Vm@hJBt=@ P@?43XBs=@ P@43XB@l@43XBs=@Vm@m32,=sH?43XBs=@Vm@hJB@l@hJBt=@Vm@j,+=sH?43XBs=@Vm@43XB@l@hJB@l@hJBt=@Vm@hJB@l@hJBt=@ P@?43XBs=@ P@43XBf;@Zdk@43XB@l@M>0w?43XB@l@hJBf;@Zdk@hJB@l@|/M>0w?43XB@l@43XBf;@Zdk@hJBf;@Zdk@hJB@l@hJBf;@Zdk@hJBt=@ P@?43XBs=@ P@43XB7@L7i@43XBf;@Zdk@>|g?43XBf;@Zdk@hJB8@L7i@hJBf;@Zdk@3 >|g?43XBf;@Zdk@43XB7@L7i@hJB8@L7i@hJBf;@Zdk@hJB8@L7i@hJBt=@ P@?43XBs=@ P@43XB@Ef@43XB7@L7i@~]3Oi?$O?43XB7@L7i@hJB@Ef@hJB8@L7i@/i?FO?43XB7@L7i@43XB@Ef@hJB@Ef@hJB8@L7i@hJB@Ef@hJBt=@ P@?43XBs=@ P@43XBB`@!b@43XB@Ef@5??5?43XB@Ef@hJBC`@!b@hJB@Ef@35? 5?43XB@Ef@43XBB`@!b@hJBC`@!b@hJB@Ef@hJBC`@!b@hJBt=@ P@?43XBs=@ P@43XB@^@43XBB`@!b@3O?bi?43XBB`@!b@hJB@^@hJBC`@!b@ӔܯO?i?43XBB`@!b@43XB@^@hJB@^@hJBC`@!b@hJB@^@hJBt=@ P@?43XBs=@ P@43XB;@Y@43XB@^@i?w>43XB@^@hJB;@Y@hJB@^@S²,i?w>43XB@^@43XB;@Y@hJB;@Y@hJB@^@hJB;@Y@hJBt=@ P@?43XBs=@ P@43XBw@U@43XB;@Y@Bu?_>43XB;@Y@hJBw@U@hJB;@Y@jBu?_>43XB;@Y@43XBw@U@hJBw@U@hJB;@Y@hJBw@U@hJBt=@ P@?43XBuh@%Q@43XBs=@ P@43XBuh@ P@?43XBw@U@43XBuh@%Q@43XB9@%Q@?43XBuh@%Q@43XBw@U@43XBs=@ P@^i.t?:l=43XB9@%Q@hJBw@U@43XBw@U@t?:l=43XB9@%Q@hJB9@%Q@hJBw@U@hJBt=@ P@hJBuh@%Q@hJBuh@ P@hJBuh@%Q@hJBw@U@hJB9@%Q@hJBw@U@hJBuh@%Q@hJBt=@ P@?43XBuh@hM@43XBuh@ P@43XBs=@ P@hJBuh@ P@hJBuh@hM@hJBt=@ P@?43XBuh@HJ@43XBuh@hM@43XBs=@ P@hJBuh@hM@hJBuh@HJ@hJBt=@ P@?43XBuh@G@43XBuh@HJ@43XBs=@ P@hJBuh@HJ@hJBuh@G@hJBt=@ P@?43XBuh@D@43XBuh@G@43XBs=@ P@hJBuh@G@hJBuh@D@hJBt=@ P@?43XBuh@>@43XBuh@D@43XBs=@ P@hJBuh@D@hJBuh@>@hJBt=@ P@?43XBuh@>@43XB;@j<@43XBuh@j<@?43XBuh@>@43XBs=@ P@43XB;@j<@hJBuh@>@hJBuh@K7@hJBt=@ P@?43XB;@j<@43XBs=@ P@43XB@j<@hJBf;@/4@hJBt=@ P@hJB;@B`5@hJBt=@ P@hJBuh@K7@hJBuh@y6@?43XB1@j<@43XB@j<@43XBs=@ P@hJBf;@/4@hJB@3@hJBt=@ P@?43XBs=@j<@43XB1@j<@43XBs=@ P@hJB@3@hJBt=@o3@hJBt=@ P@?43XB@j<@43XBs=@j<@43XBs=@ P@hJBt=@o3@hJBy@3@hJBt=@ P@?43XBR@j<@43XB@j<@43XBs=@ P@hJBB`@5@hJBt=@ P@hJBy@3@?43XBs=@ P@43XB @j<@43XBR@j<@?43XB @j<@43XBq@>@43XBF@j<@?43XB @j<@43XBs=@ P@43XBq@>@?43XBs=@ P@43XBH@@@43XBq@>@?43XBH@@@43XBs=@ P@43XB9@@@hJBH@@@hJBt=@ P@hJBq@>@hJBt=@ P@hJBH@@@hJB:@@@?43XBE@@@43XBs=@ P@43XB-@7A@?43XBE@@@43XB9@@@43XBs=@ P@a*+.LڙhJBE@@@43XB-@7A@hJB-@7A@LڙhJBE@@@43XBE@@@43XB-@7A@hJBt=@ P@hJBE@@@hJB-@7A@hJBt=@ P@hJB:@@@hJBE@@@?43XBs=@ P@43XB @$F@43XB-@7A@i!Ͼ43XB-@7A@hJB @$F@hJB-@7A@0/i!Ͼ43XB-@7A@43XB @$F@hJB @$F@hJB-@7A@hJB @$F@hJBt=@ P@?43XBs=@ P@43XB@ K@43XB @$F@uc]43XB @$F@hJB@ K@hJB @$F@v ~uc]43XB @$F@43XB@ K@hJB@ K@hJB @$F@hJB@ K@hJBt=@ P@?43XBs=@ P@43XB@ P@43XB@ K@eH143XB@ K@hJB@ P@hJB@ K@ջ-eH143XB@ K@43XB@ P@hJB@ P@hJB@ K@hJB@ P@hJBt=@ P@Buh@d;?B;@7@Buh@7@Buh@d;?B;@+@B;@7@B;@+@BB`@7@B;@7@Buh@y&@B;@7@B;@y&@Buh@y&@Buh@7@B;@7@B;@B`5@Buh@y&@B;@y&@B;@B`5@Buh@y6@Buh@y&@Bs=@o3@B;@y&@Bs=@y&@Bs=@o3@B@3@B;@y&@B;@y&@Bf;@/4@B;@B`5@B;@y&@B@3@Bf;@/4@BB`@7@B;@y&@B;@7@B;@y&@Bs=@)\@Bs=@y&@B;@y&@BB`@7@Bs=@)\@Bs=@)\@B@y&@Bs=@y&@B@y&@Bs=@o3@Bs=@y&@B@y&@By@3@Bs=@o3@B@y&@B@d;/@By@3@B@d;/@BB`@5@By@3@?x"Buh@y&@x"Buh@,@x"B;@y&@?x"B;@y&@x"Buh@j<@x"B;@j<@?x"B;@y&@x"Buh@,@x"Buh@j<@?x"Buh@7@x"B;@y&@x"B;@7@?x"Buh@7@x"Buh@y&@x"B;@y&@?x"Bs=@)\@x"B;@y&@x"Bs=@y&@?x"Bs=@)\@x"BB`@7@x"B;@y&@?x"B;@y&@x"BB`@7@x"B;@7@?x"B;@j<@x"Bs=@y&@x"B;@y&@?x"Bs=@j<@x"Bs=@y&@x"B1@j<@?x"B;@+@x"Buh@7@x"B;@7@?x"B;@+@x"Buh@d;?x"Buh@7@?x"BB`@7@x"B;@+@x"B;@7@?x"B @j<@x"B @b8@x"BR@j<@?x"B @b8@x"B@y&@x"Bs=@j<@?x"Bs=@j<@x"B@y&@x"Bs=@y&@?x"B@y&@x"Bs=@)\@x"Bs=@y&@?x"B(@5^:@x"B @b8@x"B @j<@?x"BF@j<@x"B(@5^:@x"B @j<@?x"Bs=@ P@x"B@U@x"B@ P@>=x"B@ P@B@U@B@ P@->=x"B@ P@x"B@U@B@U@B@ P@B@U@Bs=@ P@?x"Bs=@ P@x"B @Y@x"B@U@uc]>x"B@U@B @Y@B@U@v ~.uc]>x"B@U@x"B @Y@B @Y@B@U@B @Y@Bs=@ P@?x"Bs=@ P@x"B-@^@x"B @Y@i!>x"B @Y@B-@^@B @Y@0ܯi!>x"B @Y@x"B-@^@B-@^@B @Y@B-@^@Bs=@ P@?x"Bs=@ P@x"B+@!b@x"B-@^@Oi?x"B-@^@B+@!b@B-@^@Ӕ/Oi?x"B-@^@x"B+@!b@B+@!b@B-@^@B+@!b@Bs=@ P@?x"Bs=@ P@x"B@Ef@x"B+@!b@5 5?x"B+@!b@B@Ef@B+@!b@J5 5?x"B+@!b@x"B@Ef@B@Ef@B+@!b@B@Ef@Bs=@ P@?x"Bs=@ P@x"B@L7i@x"B@Ef@Oi$O?x"B@Ef@B@L7i@B@Ef@/Oi$O?x"B@Ef@x"B@L7i@B@L7i@B@Ef@B@L7i@Bs=@ P@?x"Bs=@ P@x"BO@Zdk@x"B@L7i@ ھ|g?x"B@L7i@BO@Zdk@B@L7i@J.9/ ھ|g?x"B@L7i@x"BO@Zdk@BO@Zdk@B@L7i@BO@Zdk@Bs=@ P@?x"Bs=@ P@x"By@l@x"BO@Zdk@oLDw?x"BO@Zdk@By@l@BO@Zdk@/oLDw?x"BO@Zdk@x"By@l@By@l@BO@Zdk@By@l@Bs=@ P@?x"Bs=@ P@x"Bs=@Vm@x"By@l@L>?x"By@l@Bs=@Vm@By@l@L>?x"By@l@x"Bs=@Vm@Bs=@Vm@By@l@Bs=@Vm@Bs=@ P@?x"Bs=@ P@x"B@l@x"Bs=@Vm@+=sH?x"Bs=@Vm@B@l@Bs=@Vm@j,+=sH?x"Bs=@Vm@x"B@l@B@l@Bs=@Vm@B@l@Bs=@ P@?x"Bs=@ P@x"Bf;@Zdk@x"B@l@M>0w?x"B@l@Bf;@Zdk@B@l@|/M>0w?x"B@l@x"Bf;@Zdk@Bf;@Zdk@B@l@Bf;@Zdk@Bs=@ P@?x"Bs=@ P@x"B7@L7i@x"Bf;@Zdk@ >|g?x"Bf;@Zdk@B7@L7i@Bf;@Zdk@J.9 >|g?x"Bf;@Zdk@x"B7@L7i@B7@L7i@Bf;@Zdk@B7@L7i@Bs=@ P@?x"Bs=@ P@x"B@Ef@x"B7@L7i@i?FO?x"B7@L7i@B@Ef@B7@L7i@/i?FO?x"B7@L7i@x"B@Ef@B@Ef@B7@L7i@B@Ef@Bs=@ P@?x"Bs=@ P@x"BB`@!b@x"B@Ef@5? 5?x"B@Ef@BB`@!b@B@Ef@J-5? 5?x"B@Ef@x"BB`@!b@BB`@!b@B@Ef@BB`@!b@Bs=@ P@?x"Bs=@ P@x"B@^@x"BB`@!b@O?i?x"BB`@!b@B@^@BB`@!b@ӔܯO?i?x"BB`@!b@x"B@^@B@^@BB`@!b@B@^@Bs=@ P@?x"Bs=@ P@x"B;@Y@x"B@^@i?w>x"B@^@B;@Y@B@^@S²,i?w>x"B@^@x"B;@Y@B;@Y@B@^@B;@Y@Bs=@ P@?x"Bs=@ P@x"Bw@U@x"B;@Y@Bu?_>x"B;@Y@Bw@U@B;@Y@jBu?_>x"B;@Y@x"Bw@U@Bw@U@B;@Y@Bw@U@Bs=@ P@?x"Buh@%Q@x"Bs=@ P@x"Buh@ P@?x"Bw@U@x"Buh@%Q@x"B9@%Q@?x"Buh@%Q@x"Bw@U@x"Bs=@ P@^i.t?:l=x"B9@%Q@Bw@U@x"Bw@U@t?:l=x"B9@%Q@B9@%Q@Bw@U@Bs=@ P@Buh@%Q@Buh@ P@Buh@%Q@Bw@U@B9@%Q@Bw@U@Buh@%Q@Bs=@ P@?x"Buh@hM@x"Buh@ P@x"Bs=@ P@Buh@ P@Buh@hM@Bs=@ P@?x"Buh@HJ@x"Buh@hM@x"Bs=@ P@Buh@hM@Buh@HJ@Bs=@ P@?x"Buh@G@x"Buh@HJ@x"Bs=@ P@Buh@HJ@Buh@G@Bs=@ P@?x"Buh@D@x"Buh@G@x"Bs=@ P@Buh@G@Buh@D@Bs=@ P@?x"Buh@>@x"Buh@D@x"Bs=@ P@Buh@D@Buh@>@Bs=@ P@?x"Buh@>@x"B;@j<@x"Buh@j<@?x"Buh@>@x"Bs=@ P@x"B;@j<@Buh@>@Buh@K7@Bs=@ P@?x"B;@j<@x"Bs=@ P@x"B@j<@Bf;@/4@Bs=@ P@B;@B`5@Bs=@ P@Buh@K7@Buh@y6@?x"B1@j<@x"B@j<@x"Bs=@ P@Bf;@/4@B@3@Bs=@ P@?x"Bs=@j<@x"B1@j<@x"Bs=@ P@B@3@Bs=@o3@Bs=@ P@?x"B@j<@x"Bs=@j<@x"Bs=@ P@Bs=@o3@By@3@Bs=@ P@?x"BR@j<@x"B@j<@x"Bs=@ P@BB`@5@Bs=@ P@By@3@?x"Bs=@ P@x"B @j<@x"BR@j<@BB`@5@B@:@Bs=@ P@?x"B @j<@x"Bq@>@x"BF@j<@?x"B @j<@x"Bs=@ P@x"Bq@>@B@:@Bq@>@Bs=@ P@?x"Bs=@ P@x"BH@@@x"Bq@>@?x"BH@@@x"Bs=@ P@x"B9@@@BH@@@Bs=@ P@Bq@>@Bs=@ P@BH@@@B9@@@?x"BE@@@x"Bs=@ P@x"B-@7A@?x"BE@@@x"B9@@@x"Bs=@ P@a*+.LڙBE@@@x"B-@7A@B-@7A@LڙBE@@@x"BE@@@x"B-@7A@Bs=@ P@BE@@@B-@7A@Bs=@ P@B9@@@BE@@@?x"Bs=@ P@x"B @$F@x"B-@7A@i!Ͼx"B-@7A@B @$F@B-@7A@0/i!Ͼx"B-@7A@x"B @$F@B @$F@B-@7A@B @$F@Bs=@ P@?x"Bs=@ P@x"B@ K@x"B @$F@uc]x"B @$F@B@ K@B @$F@v ~uc]x"B @$F@x"B@ K@B@ K@B @$F@B@ K@Bs=@ P@?x"Bs=@ P@x"B@ P@x"B@ K@eH1x"B@ K@B@ P@B@ K@ջ-eH1x"B@ K@x"B@ P@B@ P@B@ K@B@ P@Bs=@ P@?5B%B@@B`ABB@@/6B%B@@?`2BB@@ (BB@@1BB@@?> 4B%B@@B`ABB@@6^4B%B@@?6^4B%B@@B`ABB@@أ4B%B@@?أ4B%B@@B`ABB@@H4B%B@@?أ4BB@@ (BB@@6^4BB@@?wBrB+@wB~uB+@wByB@@Buh@hM@ Buh@d;?Buh@HJ@hJBuh@hM@x"Buh@y&@hJBuh@HJ@?43XB1@j<@43XBs=@y&@43XB@j<@?43XB@j<@43XBs=@y&@43XB;@j<@?43XBR@j<@43XB @b8@43XB@j<@?43XB@j<@43XB @b8@43XBs=@j<@?x"B1@j<@x"Bs=@y&@x"B@j<@?x"B@j<@x"Bs=@y&@x"B;@j<@?x"BR@j<@x"B @b8@x"B@j<@?x"B@j<@x"B @b8@x"Bs=@j<@B;@B`5@Bs=@ P@Buh@y6@BB=A9?vB}?SB9?vB=A9?B}?SB9?vB}?SB9?BB=A9?BB=A9?vB=A9?vB~ A9?vB=A9?vBA9H?vB~ A9?BB=A9?B=A9?B}?SB9??B|)BB}?SB9?B=A9??BA9H?B~ A9?BA9H??B=A9?B~ A9?BA9H??BA9H?BA9H?B|%B?BmABABA9H?vB|%BvBBvBA9H?vB=A9?vB|%BvBA9H?vBAvBРAvBA9H?vBF[AvBFKAvBA9H?hJBt=@y&@hJB;@y&@hJBt=@)\@hJBt=@)\@hJB;@y&@hJBB`@7@hJBq@>@hJBt=@ P@hJB@:@?hJBy@3@hJB@y&@hJB@= '@hJBy@3@hJBt=@o3@hJB@y&@hJB@:@hJBt=@ P@hJBB`@5@hJB@y&@hJBt=@o3@hJBt=@y&@hJB@y&@hJBt=@y&@hJBt=@)\@hJB@= '@hJB@d;/@hJBy@3@V@yBV@QxB?V@QxBB`?V@yBV@OxBV@QxB?openscad-2019.05/testdata/scad/misc/bad-stl-wing.scad0000644000076500000240000000064013402025764022704 0ustar kintelstaff00000000000000/* sorry, this triangulation does not deal with intersecting constraints CGAL error: assertion violation! Expression : false File : ../libraries/install/include/CGAL/Constrained_triangulation_2.h Line : 636 Explanation: Refer to the bug-reporting instructions at http://www.cgal.org/bug_report.html This has been fixed, but keep this test for future reference */ render() import("bad-stl-wing.stl"); openscad-2019.05/testdata/scad/misc/bad-stl-wing.stl0000644000076500000240000066043513402025764022612 0ustar kintelstaff00000000000000solid vcg facet normal 1.092160e-01 -9.939129e-01 -1.445503e-02 outer loop vertex 3.685681e+01 3.257960e+00 4.250870e+01 vertex 2.148621e+01 1.568960e+00 4.250888e+01 vertex 2.614227e+01 2.413960e+00 1.958678e+01 endloop endfacet facet normal 1.136671e-01 -9.934267e-01 -1.353299e-02 outer loop vertex 2.614227e+01 2.413960e+00 1.958678e+01 vertex 2.148621e+01 1.568960e+00 4.250888e+01 vertex 1.685187e+01 1.350960e+00 1.958677e+01 endloop endfacet facet normal 8.666788e-02 -9.962047e-01 -8.047934e-03 outer loop vertex 6.945618e+00 3.039598e-01 4.250853e+01 vertex 1.685187e+01 1.350960e+00 1.958677e+01 vertex 2.148621e+01 1.568960e+00 4.250888e+01 endloop endfacet facet normal 1.026974e-01 -9.946200e-01 -1.357589e-02 outer loop vertex 4.269281e+01 3.257960e+00 8.666422e+01 vertex 3.041229e+01 1.989960e+00 8.666431e+01 vertex 3.363397e+01 2.623960e+00 6.458609e+01 endloop endfacet facet normal 1.091611e-01 -9.939440e-01 -1.261329e-02 outer loop vertex 2.594916e+01 1.779960e+00 6.458659e+01 vertex 3.363397e+01 2.623960e+00 6.458609e+01 vertex 3.041229e+01 1.989960e+00 8.666431e+01 endloop endfacet facet normal 8.151635e-02 -9.966474e-01 -6.999024e-03 outer loop vertex 1.879730e+01 1.039960e+00 8.666481e+01 vertex 2.594916e+01 1.779960e+00 6.458659e+01 vertex 3.041229e+01 1.989960e+00 8.666431e+01 endloop endfacet facet normal 8.676485e-02 -9.962065e-01 -6.677540e-03 outer loop vertex 1.287286e+01 6.719599e-01 6.458647e+01 vertex 2.014081e+01 1.304960e+00 6.458698e+01 vertex 1.879730e+01 1.039960e+00 8.666481e+01 endloop endfacet facet normal 9.170935e-02 -9.957116e-01 -1.215788e-02 outer loop vertex 4.560876e+01 3.257960e+00 1.087422e+02 vertex 3.933960e+01 2.410960e+00 1.308206e+02 vertex 4.101617e+01 2.834960e+00 1.087424e+02 endloop endfacet facet normal 1.028524e-01 -9.946325e-01 -1.129098e-02 outer loop vertex 3.487537e+01 2.199960e+00 1.087420e+02 vertex 4.101617e+01 2.834960e+00 1.087424e+02 vertex 3.933960e+01 2.410960e+00 1.308206e+02 endloop endfacet facet normal 7.287142e-02 -9.973277e-01 -5.203159e-03 outer loop vertex 3.064886e+01 1.775960e+00 1.308201e+02 vertex 3.487537e+01 2.199960e+00 1.087420e+02 vertex 3.933960e+01 2.410960e+00 1.308206e+02 endloop endfacet facet normal 8.151653e-02 -9.966580e-01 -5.268513e-03 outer loop vertex 2.472260e+01 1.407960e+00 1.087420e+02 vertex 3.053021e+01 1.882960e+00 1.087428e+02 vertex 3.064886e+01 1.775960e+00 1.308201e+02 endloop endfacet facet normal 6.028175e-02 -9.981813e-01 4.567821e-04 outer loop vertex 2.248547e+01 1.282960e+00 1.308202e+02 vertex 2.472260e+01 1.407960e+00 1.087420e+02 vertex 3.064886e+01 1.775960e+00 1.308201e+02 endloop endfacet facet normal 6.842094e-02 -9.976155e-01 -9.040259e-03 outer loop vertex 5.155548e+01 3.257960e+00 1.537425e+02 vertex 4.860602e+01 2.847960e+00 1.766641e+02 vertex 4.856647e+01 3.052960e+00 1.537425e+02 endloop endfacet facet normal 9.188580e-02 -9.957283e-01 -9.063869e-03 outer loop vertex 4.397180e+01 2.628960e+00 1.537430e+02 vertex 4.856647e+01 3.052960e+00 1.537425e+02 vertex 4.860602e+01 2.847960e+00 1.766641e+02 endloop endfacet facet normal 5.420692e-02 -9.985287e-01 -1.419149e-03 outer loop vertex 4.295087e+01 2.540960e+00 1.766642e+02 vertex 4.397180e+01 2.628960e+00 1.537430e+02 vertex 4.860602e+01 2.847960e+00 1.766641e+02 endloop endfacet facet normal 7.297023e-02 -9.973298e-01 -2.916934e-03 outer loop vertex 3.679987e+01 2.157960e+00 1.537421e+02 vertex 4.114618e+01 2.475960e+00 1.537422e+02 vertex 4.295087e+01 2.540960e+00 1.766642e+02 endloop endfacet facet normal 4.496589e-02 -9.989778e-01 4.625388e-03 outer loop vertex 3.764117e+01 2.301960e+00 1.766641e+02 vertex 3.679987e+01 2.157960e+00 1.537421e+02 vertex 4.295087e+01 2.540960e+00 1.766642e+02 endloop endfacet facet normal 3.414834e-02 -9.993972e-01 6.257115e-03 outer loop vertex 3.269507e+01 2.132960e+00 1.766645e+02 vertex 3.414410e+01 2.038961e+00 1.537427e+02 vertex 3.764117e+01 2.301960e+00 1.766641e+02 endloop endfacet facet normal 5.044039e-02 -9.987005e-01 7.284183e-03 outer loop vertex 3.269507e+01 2.132960e+00 1.766645e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 vertex 3.414410e+01 2.038961e+00 1.537427e+02 endloop endfacet facet normal 1.957005e-02 -9.997081e-01 1.417770e-02 outer loop vertex 2.814886e+01 2.043960e+00 1.766642e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 vertex 3.269507e+01 2.132960e+00 1.766645e+02 endloop endfacet facet normal 3.248219e-02 -9.993762e-01 1.385824e-02 outer loop vertex 2.814886e+01 2.043960e+00 1.766642e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 endloop endfacet facet normal 1.828463e-03 -2.666029e-02 9.996428e-01 outer loop vertex 5.458411e+01 3.257960e+00 1.766641e+02 vertex 5.455487e+01 3.259960e+00 1.766642e+02 vertex 4.860602e+01 2.847960e+00 1.766641e+02 endloop endfacet facet normal 1.888747e-05 -0.000000e+00 1.000000e+00 outer loop vertex 4.860602e+01 2.847960e+00 1.766641e+02 vertex 4.860602e+01 3.257960e+00 1.766641e+02 vertex 4.295087e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal 1.888747e-05 0.000000e+00 1.000000e+00 outer loop vertex 4.860602e+01 2.847960e+00 1.766641e+02 vertex 4.295087e+01 3.257960e+00 1.766642e+02 vertex 4.295087e+01 2.540960e+00 1.766642e+02 endloop endfacet facet normal 4.578527e-02 -0.000000e+00 9.989513e-01 outer loop vertex 4.295087e+01 2.540960e+00 1.766642e+02 vertex 4.295087e+01 3.257960e+00 1.766642e+02 vertex 4.293988e+01 3.259960e+00 1.766647e+02 endloop endfacet facet normal -2.011633e-05 0.000000e+00 1.000000e+00 outer loop vertex 4.295087e+01 2.540960e+00 1.766642e+02 vertex 3.764117e+01 3.257960e+00 1.766641e+02 vertex 3.764117e+01 2.301960e+00 1.766641e+02 endloop endfacet facet normal 8.329529e-05 -0.000000e+00 1.000000e+00 outer loop vertex 3.764117e+01 2.301960e+00 1.766641e+02 vertex 3.764117e+01 3.257960e+00 1.766641e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 endloop endfacet facet normal 8.329529e-05 0.000000e+00 1.000000e+00 outer loop vertex 3.764117e+01 2.301960e+00 1.766641e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 vertex 3.269507e+01 2.132960e+00 1.766645e+02 endloop endfacet facet normal -6.712761e-05 0.000000e+00 1.000000e+00 outer loop vertex 3.269507e+01 2.132960e+00 1.766645e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal -6.712761e-05 0.000000e+00 1.000000e+00 outer loop vertex 3.269507e+01 2.132960e+00 1.766645e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 vertex 2.814886e+01 2.043960e+00 1.766642e+02 endloop endfacet facet normal 6.028162e-02 -9.981789e-01 2.236341e-03 outer loop vertex 3.064886e+01 1.775960e+00 1.308201e+02 vertex 3.006342e+01 1.791960e+00 1.537427e+02 vertex 2.248547e+01 1.282960e+00 1.308202e+02 endloop endfacet facet normal 9.841997e-05 -1.625991e-03 9.999987e-01 outer loop vertex 3.006342e+01 1.791960e+00 1.537427e+02 vertex 3.414410e+01 2.038961e+00 1.537427e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 endloop endfacet facet normal 7.287197e-02 -9.973370e-01 -2.933987e-03 outer loop vertex 3.933960e+01 2.410960e+00 1.308206e+02 vertex 3.679987e+01 2.157960e+00 1.537421e+02 vertex 3.064886e+01 1.775960e+00 1.308201e+02 endloop endfacet facet normal 4.476350e-02 -9.989869e-01 4.632874e-03 outer loop vertex 3.679987e+01 2.157960e+00 1.537421e+02 vertex 3.764117e+01 2.301960e+00 1.766641e+02 vertex 3.414410e+01 2.038961e+00 1.537427e+02 endloop endfacet facet normal 3.394543e-02 -9.993635e-01 1.096912e-02 outer loop vertex 3.006342e+01 1.791960e+00 1.537427e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 vertex 2.248547e+01 1.282960e+00 1.308202e+02 endloop endfacet facet normal 4.573986e-02 -9.989190e-01 8.292508e-03 outer loop vertex 2.379041e+01 1.533960e+00 1.537427e+02 vertex 2.036926e+01 1.304197e+00 1.449357e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 endloop endfacet facet normal 8.674358e-02 -9.961984e-01 -8.014926e-03 outer loop vertex 1.685187e+01 1.350960e+00 1.958677e+01 vertex 6.945618e+00 3.039598e-01 4.250853e+01 vertex 9.582214e+00 7.179599e-01 1.958651e+01 endloop endfacet facet normal 9.180899e-02 -9.957352e-01 -9.083162e-03 outer loop vertex 4.852588e+01 3.257960e+00 1.308201e+02 vertex 4.397180e+01 2.628960e+00 1.537430e+02 vertex 3.933960e+01 2.410960e+00 1.308206e+02 endloop endfacet facet normal 5.406845e-02 -9.985362e-01 -1.425345e-03 outer loop vertex 4.397180e+01 2.628960e+00 1.537430e+02 vertex 4.295087e+01 2.540960e+00 1.766642e+02 vertex 4.114618e+01 2.475960e+00 1.537422e+02 endloop endfacet facet normal 4.476350e-02 -9.989869e-01 4.636270e-03 outer loop vertex 3.679987e+01 2.157960e+00 1.537421e+02 vertex 3.414410e+01 2.038961e+00 1.537427e+02 vertex 3.064886e+01 1.775960e+00 1.308201e+02 endloop endfacet facet normal 6.041849e-02 -9.981706e-01 2.239831e-03 outer loop vertex 3.006342e+01 1.791960e+00 1.537427e+02 vertex 3.064886e+01 1.775960e+00 1.308201e+02 vertex 3.414410e+01 2.038961e+00 1.537427e+02 endloop endfacet facet normal 1.091443e-01 -9.939213e-01 -1.442117e-02 outer loop vertex 2.614227e+01 2.413960e+00 1.958678e+01 vertex 3.382806e+01 3.257960e+00 1.958613e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 endloop endfacet facet normal 6.842024e-02 -9.976156e-01 -9.040348e-03 outer loop vertex 4.860602e+01 2.847960e+00 1.766641e+02 vertex 5.155548e+01 3.257960e+00 1.537425e+02 vertex 5.458411e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal 5.406845e-02 -9.985362e-01 -1.429843e-03 outer loop vertex 4.397180e+01 2.628960e+00 1.537430e+02 vertex 4.114618e+01 2.475960e+00 1.537422e+02 vertex 3.933960e+01 2.410960e+00 1.308206e+02 endloop endfacet facet normal 7.297023e-02 -9.973298e-01 -2.923019e-03 outer loop vertex 3.679987e+01 2.157960e+00 1.537421e+02 vertex 3.933960e+01 2.410960e+00 1.308206e+02 vertex 4.114618e+01 2.475960e+00 1.537422e+02 endloop endfacet facet normal 6.842094e-02 -9.976156e-01 -9.043043e-03 outer loop vertex 5.155548e+01 3.257960e+00 1.537425e+02 vertex 4.856647e+01 3.052960e+00 1.537425e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 endloop endfacet facet normal 9.188580e-02 -9.957283e-01 -9.067714e-03 outer loop vertex 4.397180e+01 2.628960e+00 1.537430e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 vertex 4.856647e+01 3.052960e+00 1.537425e+02 endloop endfacet facet normal 8.151729e-02 -9.966580e-01 -5.265322e-03 outer loop vertex 3.041229e+01 1.989960e+00 8.666431e+01 vertex 2.472260e+01 1.407960e+00 1.087420e+02 vertex 1.879730e+01 1.039960e+00 8.666481e+01 endloop endfacet facet normal 6.015948e-02 -9.981887e-01 4.443513e-04 outer loop vertex 2.472260e+01 1.407960e+00 1.087420e+02 vertex 2.248547e+01 1.282960e+00 1.308202e+02 vertex 2.064087e+01 1.161960e+00 1.087421e+02 endloop endfacet facet normal 8.666872e-02 -9.962149e-01 -6.662748e-03 outer loop vertex 2.148621e+01 1.568960e+00 4.250888e+01 vertex 1.287286e+01 6.719599e-01 6.458647e+01 vertex 6.945618e+00 3.039598e-01 4.250853e+01 endloop endfacet facet normal 1.027003e-01 -9.946482e-01 -1.130022e-02 outer loop vertex 4.269281e+01 3.257960e+00 8.666422e+01 vertex 3.487537e+01 2.199960e+00 1.087420e+02 vertex 3.041229e+01 1.989960e+00 8.666431e+01 endloop endfacet facet normal 7.275952e-02 -9.973358e-01 -5.224734e-03 outer loop vertex 3.487537e+01 2.199960e+00 1.087420e+02 vertex 3.064886e+01 1.775960e+00 1.308201e+02 vertex 3.053021e+01 1.882960e+00 1.087428e+02 endloop endfacet facet normal 1.092188e-01 -9.939381e-01 -1.257909e-02 outer loop vertex 3.685681e+01 3.257960e+00 4.250870e+01 vertex 2.594916e+01 1.779960e+00 6.458659e+01 vertex 2.148621e+01 1.568960e+00 4.250888e+01 endloop endfacet facet normal 8.150427e-02 -9.966484e-01 -7.002966e-03 outer loop vertex 2.594916e+01 1.779960e+00 6.458659e+01 vertex 1.879730e+01 1.039960e+00 8.666481e+01 vertex 2.014081e+01 1.304960e+00 6.458698e+01 endloop endfacet facet normal 1.027056e-01 -9.946193e-01 -1.356975e-02 outer loop vertex 3.363397e+01 2.623960e+00 6.458609e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 vertex 3.977380e+01 3.257960e+00 6.458659e+01 endloop endfacet facet normal 1.091611e-01 -9.939441e-01 -1.260800e-02 outer loop vertex 2.594916e+01 1.779960e+00 6.458659e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 vertex 3.363397e+01 2.623960e+00 6.458609e+01 endloop endfacet facet normal 9.180585e-02 -9.957030e-01 -1.213015e-02 outer loop vertex 3.933960e+01 2.410960e+00 1.308206e+02 vertex 4.560876e+01 3.257960e+00 1.087422e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 endloop endfacet facet normal 1.027056e-01 -9.946191e-01 -1.357929e-02 outer loop vertex 3.363397e+01 2.623960e+00 6.458609e+01 vertex 3.977380e+01 3.257960e+00 6.458659e+01 vertex 4.269281e+01 3.257960e+00 8.666422e+01 endloop endfacet facet normal 6.015948e-02 -9.981887e-01 4.924047e-04 outer loop vertex 2.472260e+01 1.407960e+00 1.087420e+02 vertex 2.064087e+01 1.161960e+00 1.087421e+02 vertex 1.879730e+01 1.039960e+00 8.666481e+01 endloop endfacet facet normal 9.170939e-02 -9.957121e-01 -1.211253e-02 outer loop vertex 4.560876e+01 3.257960e+00 1.087422e+02 vertex 4.101617e+01 2.834960e+00 1.087424e+02 vertex 4.269281e+01 3.257960e+00 8.666422e+01 endloop endfacet facet normal 1.028524e-01 -9.946331e-01 -1.124565e-02 outer loop vertex 3.487537e+01 2.199960e+00 1.087420e+02 vertex 4.269281e+01 3.257960e+00 8.666422e+01 vertex 4.101617e+01 2.834960e+00 1.087424e+02 endloop endfacet facet normal 8.150430e-02 -9.966487e-01 -6.950761e-03 outer loop vertex 2.594916e+01 1.779960e+00 6.458659e+01 vertex 2.014081e+01 1.304960e+00 6.458698e+01 vertex 2.148621e+01 1.568960e+00 4.250888e+01 endloop endfacet facet normal 8.676487e-02 -9.962068e-01 -6.624910e-03 outer loop vertex 1.287286e+01 6.719599e-01 6.458647e+01 vertex 2.148621e+01 1.568960e+00 4.250888e+01 vertex 2.014081e+01 1.304960e+00 6.458698e+01 endloop endfacet facet normal 7.275953e-02 -9.973359e-01 -5.222036e-03 outer loop vertex 3.487537e+01 2.199960e+00 1.087420e+02 vertex 3.053021e+01 1.882960e+00 1.087428e+02 vertex 3.041229e+01 1.989960e+00 8.666431e+01 endloop endfacet facet normal 8.151653e-02 -9.966581e-01 -5.265519e-03 outer loop vertex 2.472260e+01 1.407960e+00 1.087420e+02 vertex 3.041229e+01 1.989960e+00 8.666431e+01 vertex 3.053021e+01 1.882960e+00 1.087428e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 vertex 3.251392e+01 3.259960e+00 1.550713e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.251392e+01 3.259960e+00 1.550713e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 vertex 3.299811e+01 3.259960e+00 1.545004e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.764117e+01 3.259960e+00 1.766641e+02 vertex 3.778381e+01 3.259960e+00 1.598729e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.877087e+01 3.259960e+00 1.507313e+02 vertex 3.778381e+01 3.259960e+00 1.598729e+02 vertex 3.764117e+01 3.259960e+00 1.766641e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 4.295087e+01 3.259960e+00 1.766642e+02 vertex 4.317181e+01 3.259960e+00 1.563826e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 4.317181e+01 3.259960e+00 1.563826e+02 vertex 4.295087e+01 3.259960e+00 1.766642e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 4.860602e+01 3.259960e+00 1.766641e+02 vertex 5.454987e+01 3.259960e+00 1.765568e+02 endloop endfacet facet normal 8.223365e-08 1.000000e+00 1.096598e-07 outer loop vertex 5.153430e+01 3.259960e+00 1.537425e+02 vertex 4.856287e+01 3.259960e+00 1.537966e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.814886e+01 3.259960e+00 1.766642e+02 vertex 2.708417e+01 3.259960e+00 1.541643e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.708417e+01 3.259960e+00 1.541643e+02 vertex 2.814886e+01 3.259960e+00 1.766642e+02 vertex 2.834747e+01 3.259960e+00 1.507044e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.851282e+01 3.259960e+00 1.425051e+02 vertex 3.778381e+01 3.259960e+00 1.598729e+02 vertex 3.877087e+01 3.259960e+00 1.507313e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.877087e+01 3.259960e+00 1.507313e+02 vertex 3.764117e+01 3.259960e+00 1.766641e+02 vertex 3.912866e+01 3.259960e+00 1.500805e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.912866e+01 3.259960e+00 1.500805e+02 vertex 3.764117e+01 3.259960e+00 1.766641e+02 vertex 3.948987e+01 3.259960e+00 1.541778e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.764117e+01 3.259960e+00 1.766641e+02 vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 4.093958e+01 3.259960e+00 1.541818e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.859076e+01 3.259960e+00 1.766642e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 4.295087e+01 3.259960e+00 1.766642e+02 endloop endfacet facet normal 8.090471e-08 1.000000e+00 2.882330e-08 outer loop vertex 4.608637e+01 3.259960e+00 1.444647e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 4.572791e+01 3.259960e+00 1.537426e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 4.572791e+01 3.259960e+00 1.537426e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 4.593188e+01 3.259960e+00 1.554632e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.859076e+01 3.259960e+00 1.766642e+02 vertex 4.860602e+01 3.259960e+00 1.766641e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 5.454987e+01 3.259960e+00 1.765568e+02 vertex 5.153430e+01 3.259960e+00 1.537425e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.860602e+01 3.259960e+00 1.766641e+02 vertex 5.455487e+01 3.259960e+00 1.766642e+02 vertex 5.454987e+01 3.259960e+00 1.765568e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.834747e+01 3.259960e+00 1.507044e+02 vertex 2.814886e+01 3.259960e+00 1.766642e+02 vertex 2.870911e+01 3.259960e+00 1.605941e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 2.991687e+01 3.259960e+00 1.541666e+02 vertex 2.814886e+01 3.259960e+00 1.766642e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.299811e+01 3.259960e+00 1.545004e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 vertex 3.321429e+01 3.259960e+00 1.598950e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.321460e+01 3.259960e+00 1.598899e+02 vertex 3.339746e+01 3.259960e+00 1.469616e+02 vertex 3.321429e+01 3.259960e+00 1.598950e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.321429e+01 3.259960e+00 1.598950e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 vertex 3.341852e+01 3.259960e+00 1.646890e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.477759e+01 3.259960e+00 1.599006e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 endloop endfacet facet normal 1.158829e-01 9.931656e-01 -1.390347e-02 outer loop vertex 3.683447e+01 3.259960e+00 4.246537e+01 vertex 3.683960e+01 3.259960e+00 4.250810e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 endloop endfacet facet normal 9.840843e-02 9.950957e-01 -1.001149e-02 outer loop vertex 4.266730e+01 3.259960e+00 8.661221e+01 vertex 4.267267e+01 3.259960e+00 8.666501e+01 vertex 4.269281e+01 3.257960e+00 8.666422e+01 endloop endfacet facet normal 1.151261e-01 9.932343e-01 -1.521362e-02 outer loop vertex 3.684589e+01 3.259960e+00 4.256071e+01 vertex 3.975647e+01 3.259960e+00 6.458598e+01 vertex 3.977380e+01 3.257960e+00 6.458659e+01 endloop endfacet facet normal 1.116557e-01 9.936374e-01 -1.475227e-02 outer loop vertex 3.684589e+01 3.259960e+00 4.256071e+01 vertex 3.977380e+01 3.257960e+00 6.458659e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 endloop endfacet facet normal 9.391306e-02 9.955382e-01 -9.170676e-03 outer loop vertex 4.849786e+01 3.259960e+00 1.307503e+02 vertex 4.850476e+01 3.259960e+00 1.308210e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 endloop endfacet facet normal 1.042619e-01 9.944545e-01 -1.377277e-02 outer loop vertex 4.268250e+01 3.259960e+00 8.673431e+01 vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.560876e+01 3.257960e+00 1.087422e+02 endloop endfacet facet normal 1.016345e-01 9.947312e-01 -1.342339e-02 outer loop vertex 4.268250e+01 3.259960e+00 8.673431e+01 vertex 4.560876e+01 3.257960e+00 1.087422e+02 vertex 4.269281e+01 3.257960e+00 8.666422e+01 endloop endfacet facet normal 6.823284e-02 9.976644e-01 -3.179482e-03 outer loop vertex 5.454987e+01 3.259960e+00 1.765568e+02 vertex 5.455487e+01 3.259960e+00 1.766642e+02 vertex 5.458411e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal 9.399965e-02 9.954947e-01 -1.242420e-02 outer loop vertex 4.851886e+01 3.259960e+00 1.309281e+02 vertex 5.153430e+01 3.259960e+00 1.537425e+02 vertex 5.155548e+01 3.257960e+00 1.537425e+02 endloop endfacet facet normal 9.350042e-02 9.955425e-01 -1.235774e-02 outer loop vertex 4.851886e+01 3.259960e+00 1.309281e+02 vertex 5.155548e+01 3.257960e+00 1.537425e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 2.814886e+01 3.259960e+00 1.766642e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal -4.369983e-05 0.000000e+00 1.000000e+00 outer loop vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 2.814886e+01 3.259960e+00 1.766642e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal -6.703290e-05 5.310106e-02 9.985891e-01 outer loop vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 endloop endfacet facet normal -1.534907e-02 0.000000e+00 9.998822e-01 outer loop vertex 3.269507e+01 3.259960e+00 1.766645e+02 vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 endloop endfacet facet normal 2.163432e-05 0.000000e+00 1.000000e+00 outer loop vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 endloop endfacet facet normal 8.234665e-05 -1.504916e-01 9.886113e-01 outer loop vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.269507e+01 3.257960e+00 1.766645e+02 vertex 3.764117e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal 3.399394e-02 0.000000e+00 9.994220e-01 outer loop vertex 3.764117e+01 3.259960e+00 1.766641e+02 vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.764117e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal -1.151888e-04 0.000000e+00 1.000000e+00 outer loop vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 3.764117e+01 3.259960e+00 1.766641e+02 vertex 3.764117e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal -1.149238e-04 -7.020899e-04 9.999998e-01 outer loop vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 3.764117e+01 3.257960e+00 1.766641e+02 vertex 4.295087e+01 2.540960e+00 1.766642e+02 endloop endfacet facet normal 4.578527e-02 0.000000e+00 9.989513e-01 outer loop vertex 4.295087e+01 3.259960e+00 1.766642e+02 vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 4.295087e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal 0.000000e+00 0.000000e+00 1.000000e+00 outer loop vertex 4.859076e+01 3.259960e+00 1.766642e+02 vertex 4.295087e+01 3.259960e+00 1.766642e+02 vertex 4.295087e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal 1.886074e-05 -5.319012e-02 9.985844e-01 outer loop vertex 4.859076e+01 3.259960e+00 1.766642e+02 vertex 4.295087e+01 3.257960e+00 1.766642e+02 vertex 4.860602e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal 6.999828e-03 0.000000e+00 9.999755e-01 outer loop vertex 4.860602e+01 3.259960e+00 1.766641e+02 vertex 4.859076e+01 3.259960e+00 1.766642e+02 vertex 4.860602e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal -1.795498e-05 0.000000e+00 1.000000e+00 outer loop vertex 5.455487e+01 3.259960e+00 1.766642e+02 vertex 4.860602e+01 3.259960e+00 1.766641e+02 vertex 4.860602e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal -1.795498e-05 0.000000e+00 1.000000e+00 outer loop vertex 5.455487e+01 3.259960e+00 1.766642e+02 vertex 4.860602e+01 3.257960e+00 1.766641e+02 vertex 4.860602e+01 2.847960e+00 1.766641e+02 endloop endfacet facet normal 1.158811e-01 9.931666e-01 -1.384658e-02 outer loop vertex 3.683960e+01 3.259960e+00 4.250810e+01 vertex 3.684589e+01 3.259960e+00 4.256071e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 endloop endfacet facet normal 9.377595e-02 9.955169e-01 -1.233936e-02 outer loop vertex 4.850476e+01 3.259960e+00 1.308210e+02 vertex 4.851886e+01 3.259960e+00 1.309281e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 endloop endfacet facet normal 9.825090e-02 9.950641e-01 -1.393078e-02 outer loop vertex 4.267267e+01 3.259960e+00 8.666501e+01 vertex 4.268250e+01 3.259960e+00 8.673431e+01 vertex 4.269281e+01 3.257960e+00 8.666422e+01 endloop endfacet facet normal 1.195098e-01 9.927073e-01 -1.579385e-02 outer loop vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.683447e+01 3.259960e+00 4.246537e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 endloop endfacet facet normal 1.154606e-01 9.931949e-01 -1.525576e-02 outer loop vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.685681e+01 3.257960e+00 4.250870e+01 vertex 3.382806e+01 3.257960e+00 1.958613e+01 endloop endfacet facet normal 9.920278e-02 9.949808e-01 -1.311249e-02 outer loop vertex 5.153430e+01 3.259960e+00 1.537425e+02 vertex 5.454987e+01 3.259960e+00 1.765568e+02 vertex 5.458411e+01 3.257960e+00 1.766641e+02 endloop endfacet facet normal 9.400003e-02 9.954947e-01 -1.242020e-02 outer loop vertex 5.153430e+01 3.259960e+00 1.537425e+02 vertex 5.458411e+01 3.257960e+00 1.766641e+02 vertex 5.155548e+01 3.257960e+00 1.537425e+02 endloop endfacet facet normal 1.058098e-01 9.942881e-01 -1.398182e-02 outer loop vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.849786e+01 3.259960e+00 1.307503e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 endloop endfacet facet normal 1.042621e-01 9.944545e-01 -1.377597e-02 outer loop vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.852588e+01 3.257960e+00 1.308201e+02 vertex 4.560876e+01 3.257960e+00 1.087422e+02 endloop endfacet facet normal 1.066638e-01 9.941952e-01 -1.409591e-02 outer loop vertex 3.975647e+01 3.259960e+00 6.458598e+01 vertex 4.266730e+01 3.259960e+00 8.661221e+01 vertex 4.269281e+01 3.257960e+00 8.666422e+01 endloop endfacet facet normal 1.151273e-01 9.932342e-01 -1.522163e-02 outer loop vertex 3.975647e+01 3.259960e+00 6.458598e+01 vertex 4.269281e+01 3.257960e+00 8.666422e+01 vertex 3.977380e+01 3.257960e+00 6.458659e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.520667e+01 3.259960e+00 1.533127e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.584772e+01 3.259960e+00 1.507030e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.245081e+01 3.259960e+00 1.541675e+02 vertex 3.188422e+01 3.259960e+00 1.541674e+02 vertex 3.251392e+01 3.259960e+00 1.550713e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.188422e+01 3.259960e+00 1.541674e+02 vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 3.251392e+01 3.259960e+00 1.550713e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.359320e+01 3.259960e+00 4.179829e+01 vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.297119e+01 3.259960e+00 3.390515e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.683447e+01 3.259960e+00 4.246537e+01 vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.359320e+01 3.259960e+00 4.179829e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.397797e+01 3.259960e+00 6.221800e+01 vertex 3.631812e+01 3.259960e+00 5.924049e+01 vertex 3.683447e+01 3.259960e+00 4.246537e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.683960e+01 3.259960e+00 4.250810e+01 vertex 3.683447e+01 3.259960e+00 4.246537e+01 vertex 3.631812e+01 3.259960e+00 5.924049e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632147e+01 3.259960e+00 5.927840e+01 vertex 3.683960e+01 3.259960e+00 4.250810e+01 vertex 3.632147e+01 3.259960e+00 5.927233e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.684589e+01 3.259960e+00 4.256071e+01 vertex 3.683960e+01 3.259960e+00 4.250810e+01 vertex 3.632147e+01 3.259960e+00 5.927840e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632666e+01 3.259960e+00 5.932312e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 vertex 3.632587e+01 3.259960e+00 5.931717e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632666e+01 3.259960e+00 5.932312e+01 vertex 3.679596e+01 3.259960e+00 6.411270e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.694470e+01 3.259960e+00 5.932310e+01 vertex 3.684589e+01 3.259960e+00 4.256071e+01 vertex 3.632147e+01 3.259960e+00 5.927840e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.975647e+01 3.259960e+00 6.458598e+01 vertex 3.684589e+01 3.259960e+00 4.256071e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.753430e+01 3.259960e+00 1.599019e+02 vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.778381e+01 3.259960e+00 1.598729e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.667450e+01 3.259960e+00 1.568537e+02 vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.753430e+01 3.259960e+00 1.599019e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.952838e+01 3.259960e+00 1.007040e+02 vertex 4.266730e+01 3.259960e+00 8.661221e+01 vertex 3.865027e+01 3.259960e+00 9.114841e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.266730e+01 3.259960e+00 8.661221e+01 vertex 3.975647e+01 3.259960e+00 6.458598e+01 vertex 3.821881e+01 3.259960e+00 8.121172e+01 endloop endfacet facet normal -5.314709e-08 1.000000e+00 1.845781e-10 outer loop vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.283551e+01 3.259960e+00 6.416467e+01 vertex 2.292407e+01 3.259960e+00 8.966451e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.584772e+01 3.259960e+00 1.507030e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.672229e+01 3.259960e+00 1.605929e+02 endloop endfacet facet normal -6.132065e-08 1.000000e+00 -3.416651e-09 outer loop vertex 2.292407e+01 3.259960e+00 8.966451e+01 vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.737500e+01 3.259960e+00 7.956241e+01 endloop endfacet facet normal 7.403488e-08 1.000000e+00 -3.891625e-09 outer loop vertex 2.001910e+01 3.259960e+00 9.566451e+01 vertex 2.292407e+01 3.259960e+00 8.966451e+01 vertex 1.861230e+01 3.259960e+00 6.890134e+01 endloop endfacet facet normal 5.623536e-08 1.000000e+00 -1.953036e-10 outer loop vertex 2.283551e+01 3.259960e+00 6.416467e+01 vertex 1.861230e+01 3.259960e+00 6.890134e+01 vertex 2.292407e+01 3.259960e+00 8.966451e+01 endloop endfacet facet normal 6.530207e-08 1.000000e+00 -8.119709e-09 outer loop vertex 2.292407e+01 3.259960e+00 8.966451e+01 vertex 2.001910e+01 3.259960e+00 9.566451e+01 vertex 2.169769e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.867920e+01 3.259960e+00 8.666451e+01 vertex 2.001910e+01 3.259960e+00 9.566451e+01 vertex 1.861230e+01 3.259960e+00 6.890134e+01 endloop endfacet facet normal 2.321289e-07 1.000000e+00 -2.069430e-08 outer loop vertex 1.819000e+01 3.259960e+00 6.416435e+01 vertex 1.716290e+01 3.259960e+00 6.416431e+01 vertex 1.861230e+01 3.259960e+00 6.890134e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.217560e+01 3.259960e+00 1.091646e+02 vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.217249e+01 3.259960e+00 1.091640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.305798e+01 3.259960e+00 1.191645e+02 vertex 2.217560e+01 3.259960e+00 1.091646e+02 vertex 2.217249e+01 3.259960e+00 1.091640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.001910e+01 3.259960e+00 9.566451e+01 vertex 1.867920e+01 3.259960e+00 8.666451e+01 vertex 2.001367e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.867920e+01 3.259960e+00 8.666451e+01 vertex 1.701166e+01 3.259960e+00 6.416446e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.701166e+01 3.259960e+00 6.416446e+01 vertex 1.867920e+01 3.259960e+00 8.666451e+01 vertex 1.861230e+01 3.259960e+00 6.890134e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.867920e+01 3.259960e+00 8.666451e+01 vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.923956e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal 1.317498e-07 1.000000e+00 -8.491764e-10 outer loop vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.616907e+01 3.259960e+00 6.416461e+01 endloop endfacet facet normal -4.715696e-12 1.000000e+00 1.059684e-08 outer loop vertex 1.616907e+01 3.259960e+00 6.416461e+01 vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.664911e+01 3.259960e+00 6.416483e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.001367e+01 3.259960e+00 1.091644e+02 vertex 1.867920e+01 3.259960e+00 8.666451e+01 vertex 1.923956e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141229e+01 3.259960e+00 1.091250e+02 vertex 4.266730e+01 3.259960e+00 8.661221e+01 vertex 4.052136e+01 3.259960e+00 1.023950e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.267267e+01 3.259960e+00 8.666501e+01 vertex 4.266730e+01 3.259960e+00 8.661221e+01 vertex 4.141229e+01 3.259960e+00 1.091250e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141492e+01 3.259960e+00 1.091650e+02 vertex 4.141980e+01 3.259960e+00 1.091997e+02 vertex 4.141229e+01 3.259960e+00 1.091250e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.268250e+01 3.259960e+00 8.673431e+01 vertex 4.267267e+01 3.259960e+00 8.666501e+01 vertex 4.141229e+01 3.259960e+00 1.091250e+02 endloop endfacet facet normal 1.317496e-07 1.000000e+00 3.574173e-09 outer loop vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.763190e+01 3.259960e+00 1.047938e+02 endloop endfacet facet normal -5.388229e-07 1.000000e+00 5.271328e-09 outer loop vertex 1.592340e+01 3.259960e+00 9.195871e+01 vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.565149e+01 3.259960e+00 6.416454e+01 endloop endfacet facet normal 3.508296e-07 1.000000e+00 -2.092800e-08 outer loop vertex 1.565149e+01 3.259960e+00 6.416454e+01 vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.603497e+01 3.259960e+00 7.059312e+01 endloop endfacet facet normal -3.074495e-07 1.000000e+00 2.234524e-08 outer loop vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.592340e+01 3.259960e+00 9.195871e+01 vertex 1.670502e+01 3.259960e+00 1.027130e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.592340e+01 3.259960e+00 9.195871e+01 vertex 1.505811e+01 3.259960e+00 6.825552e+01 endloop endfacet facet normal 9.372641e-08 1.000000e+00 6.338048e-09 outer loop vertex 1.763190e+01 3.259960e+00 1.047938e+02 vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.733636e+01 3.259960e+00 1.091641e+02 endloop endfacet facet normal 1.153264e-09 1.000000e+00 1.054413e-08 outer loop vertex 1.733636e+01 3.259960e+00 1.091641e+02 vertex 1.631409e+01 3.259960e+00 8.666441e+01 vertex 1.733539e+01 3.259960e+00 1.091642e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.169769e+01 3.259960e+00 1.091644e+02 vertex 2.001910e+01 3.259960e+00 9.566451e+01 vertex 2.122607e+01 3.259960e+00 1.132555e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.122607e+01 3.259960e+00 1.132555e+02 vertex 2.001910e+01 3.259960e+00 9.566451e+01 vertex 2.051691e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.142206e+01 3.259960e+00 1.092165e+02 vertex 4.274689e+01 3.259960e+00 1.092161e+02 vertex 4.141229e+01 3.259960e+00 1.091250e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141229e+01 3.259960e+00 1.091250e+02 vertex 4.274689e+01 3.259960e+00 1.092161e+02 vertex 4.558978e+01 3.259960e+00 1.087429e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.991687e+01 3.259960e+00 1.541666e+02 vertex 2.870911e+01 3.259960e+00 1.605941e+02 vertex 2.814886e+01 3.259960e+00 1.766642e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.117950e+01 3.259960e+00 8.430692e+01 vertex 2.947070e+01 3.259960e+00 8.667551e+01 vertex 3.027557e+01 3.259960e+00 1.091724e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.592340e+01 3.259960e+00 9.195871e+01 vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.561078e+01 3.259960e+00 1.011122e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.429431e+01 3.259960e+00 6.416449e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.429431e+01 3.259960e+00 6.416449e+01 vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.460938e+01 3.259960e+00 6.416447e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.519098e+01 3.259960e+00 1.035705e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.361298e+01 3.259960e+00 7.718262e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.413947e+01 3.259960e+00 6.416406e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.413947e+01 3.259960e+00 6.416406e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.414160e+01 3.259960e+00 6.416479e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.561078e+01 3.259960e+00 1.011122e+02 vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.542181e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.542181e+01 3.259960e+00 1.091645e+02 vertex 1.478320e+01 3.259960e+00 8.666451e+01 vertex 1.519098e+01 3.259960e+00 1.035705e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.923956e+01 3.259960e+00 1.091645e+02 vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.861346e+01 3.259960e+00 1.176968e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.861346e+01 3.259960e+00 1.176968e+02 vertex 1.812372e+01 3.259960e+00 8.666451e+01 vertex 1.812646e+01 3.259960e+00 1.088228e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.295648e+01 3.259960e+00 8.666470e+01 vertex 1.361298e+01 3.259960e+00 7.718262e+01 vertex 1.325488e+01 3.259960e+00 6.416420e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.325488e+01 3.259960e+00 6.416420e+01 vertex 1.361298e+01 3.259960e+00 7.718262e+01 vertex 1.354980e+01 3.259960e+00 6.416415e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.913940e+01 3.259960e+00 1.091644e+02 vertex 2.737500e+01 3.259960e+00 7.956241e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.947070e+01 3.259960e+00 8.667551e+01 vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.913940e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.753900e+01 3.259960e+00 6.007571e+01 vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.928491e+01 3.259960e+00 6.416808e+01 endloop endfacet facet normal 2.940324e-07 1.000000e+00 -2.137010e-08 outer loop vertex 1.670502e+01 3.259960e+00 1.027130e+02 vertex 1.592340e+01 3.259960e+00 9.195871e+01 vertex 1.637360e+01 3.259960e+00 1.093096e+02 endloop endfacet facet normal -4.596761e-07 1.000000e+00 -1.814001e-09 outer loop vertex 1.637360e+01 3.259960e+00 1.093096e+02 vertex 1.592340e+01 3.259960e+00 9.195871e+01 vertex 1.587061e+01 3.259960e+00 1.053373e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.290930e+01 3.259960e+00 8.658751e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 vertex 1.277222e+01 3.259960e+00 6.416437e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.277222e+01 3.259960e+00 6.416437e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 vertex 1.293286e+01 3.259960e+00 6.416501e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.914148e+01 3.259960e+00 1.091722e+02 vertex 2.947070e+01 3.259960e+00 8.667551e+01 vertex 2.914111e+01 3.259960e+00 1.091692e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027557e+01 3.259960e+00 1.091724e+02 vertex 2.947070e+01 3.259960e+00 8.667551e+01 vertex 2.914148e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.947070e+01 3.259960e+00 8.667551e+01 vertex 2.992517e+01 3.259960e+00 6.763437e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.947070e+01 3.259960e+00 8.667551e+01 vertex 3.117950e+01 3.259960e+00 8.430692e+01 vertex 3.067480e+01 3.259960e+00 6.417702e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.245166e+01 3.259960e+00 1.541674e+02 vertex 3.245081e+01 3.259960e+00 1.541675e+02 vertex 3.251392e+01 3.259960e+00 1.550713e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.395190e+01 3.259960e+00 8.960912e+01 vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.265460e+01 3.259960e+00 1.115148e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.117950e+01 3.259960e+00 8.430692e+01 vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.185431e+01 3.259960e+00 6.682034e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221106e+01 3.259960e+00 4.447726e+01 vertex 3.297119e+01 3.259960e+00 3.390515e+01 vertex 3.381091e+01 3.259960e+00 1.958652e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.135870e+01 3.259960e+00 6.008723e+01 vertex 3.117950e+01 3.259960e+00 8.430692e+01 vertex 3.150531e+01 3.259960e+00 6.417757e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.067480e+01 3.259960e+00 6.417702e+01 vertex 3.117950e+01 3.259960e+00 8.430692e+01 vertex 3.135870e+01 3.259960e+00 6.008723e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.117950e+01 3.259960e+00 8.430692e+01 vertex 3.185516e+01 3.259960e+00 1.057114e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.145361e+01 3.259960e+00 1.132628e+02 vertex 3.185516e+01 3.259960e+00 1.057114e+02 vertex 3.117950e+01 3.259960e+00 8.430692e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.265460e+01 3.259960e+00 1.115148e+02 vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.197998e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.197998e+01 3.259960e+00 1.091722e+02 vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.185516e+01 3.259960e+00 1.057114e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.980066e+01 3.259960e+00 6.416951e+01 vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.992517e+01 3.259960e+00 6.763437e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.928491e+01 3.259960e+00 6.416808e+01 vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.980066e+01 3.259960e+00 6.416951e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.340887e+01 3.259960e+00 1.191035e+02 vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.274689e+01 3.259960e+00 1.092161e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.268250e+01 3.259960e+00 8.673431e+01 vertex 4.141229e+01 3.259960e+00 1.091250e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.287616e+01 3.259960e+00 1.541817e+02 vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 4.317181e+01 3.259960e+00 1.563826e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.093958e+01 3.259960e+00 1.541818e+02 vertex 4.293988e+01 3.259960e+00 1.766647e+02 vertex 4.287616e+01 3.259960e+00 1.541817e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 1.290930e+01 3.259960e+00 8.658751e+01 vertex 1.274768e+01 3.259960e+00 6.412642e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.316797e+01 3.259960e+00 1.227571e+02 vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.298950e+01 3.259960e+00 1.168036e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.395190e+01 3.259960e+00 8.960912e+01 vertex 3.265460e+01 3.259960e+00 1.115148e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.395190e+01 3.259960e+00 8.960912e+01 vertex 3.339368e+01 3.259960e+00 7.848862e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.397797e+01 3.259960e+00 6.221800e+01 vertex 3.451251e+01 3.259960e+00 7.379582e+01 vertex 3.631812e+01 3.259960e+00 5.924049e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.281769e+01 3.259960e+00 1.316991e+02 vertex 4.553461e+01 3.259960e+00 1.240155e+02 vertex 4.558978e+01 3.259960e+00 1.087429e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.849786e+01 3.259960e+00 1.307503e+02 vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.553461e+01 3.259960e+00 1.240155e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.342456e+01 3.259960e+00 1.334942e+02 vertex 3.424841e+01 3.259960e+00 1.263395e+02 vertex 3.476581e+01 3.259960e+00 1.095643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.424841e+01 3.259960e+00 1.263395e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.395190e+01 3.259960e+00 8.960912e+01 vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.500818e+01 3.259960e+00 9.071591e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632147e+01 3.259960e+00 5.927233e+01 vertex 3.683960e+01 3.259960e+00 4.250810e+01 vertex 3.631812e+01 3.259960e+00 5.924049e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.397797e+01 3.259960e+00 6.221800e+01 vertex 3.237628e+01 3.259960e+00 6.617604e+01 vertex 3.236847e+01 3.259960e+00 8.706161e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.185431e+01 3.259960e+00 6.682034e+01 vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.237628e+01 3.259960e+00 6.617604e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.477759e+01 3.259960e+00 1.599006e+02 vertex 3.341852e+01 3.259960e+00 1.646890e+02 vertex 3.269507e+01 3.259960e+00 1.766645e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.602386e+01 3.259960e+00 1.087210e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.424872e+01 3.259960e+00 1.263567e+02 vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.439667e+01 3.259960e+00 1.215594e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.602386e+01 3.259960e+00 1.087210e+02 vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.528546e+01 3.259960e+00 9.281812e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632587e+01 3.259960e+00 5.931717e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 vertex 3.650146e+01 3.259960e+00 5.930606e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.528357e+01 3.259960e+00 9.280011e+01 vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.528436e+01 3.259960e+00 9.280711e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.500818e+01 3.259960e+00 9.071591e+01 vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.528357e+01 3.259960e+00 9.280011e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.425342e+01 3.259960e+00 1.263752e+02 vertex 3.548639e+01 3.259960e+00 1.263756e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.548639e+01 3.259960e+00 1.263756e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.602386e+01 3.259960e+00 1.087210e+02 vertex 3.529059e+01 3.259960e+00 9.284961e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.602386e+01 3.259960e+00 1.087210e+02 vertex 3.724048e+01 3.259960e+00 1.096123e+02 vertex 3.611237e+01 3.259960e+00 9.284691e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.528699e+01 3.259960e+00 9.283090e+01 vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.513947e+01 3.259960e+00 9.762440e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.528546e+01 3.259960e+00 9.281812e+01 vertex 3.476678e+01 3.259960e+00 1.095864e+02 vertex 3.528699e+01 3.259960e+00 9.283090e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.753540e+01 3.259960e+00 1.599017e+02 vertex 3.753430e+01 3.259960e+00 1.599019e+02 vertex 3.778381e+01 3.259960e+00 1.598729e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.807861e+01 3.259960e+00 1.013817e+02 vertex 3.724048e+01 3.259960e+00 1.096123e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.724048e+01 3.259960e+00 1.096123e+02 vertex 3.807861e+01 3.259960e+00 1.013817e+02 vertex 3.740778e+01 3.259960e+00 9.485211e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.821881e+01 3.259960e+00 8.121172e+01 vertex 3.865027e+01 3.259960e+00 9.114841e+01 vertex 4.266730e+01 3.259960e+00 8.661221e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.701160e+01 3.259960e+00 8.980180e+01 vertex 3.724048e+01 3.259960e+00 1.096123e+02 vertex 3.714221e+01 3.259960e+00 9.284941e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.611237e+01 3.259960e+00 9.284691e+01 vertex 3.724048e+01 3.259960e+00 1.096123e+02 vertex 3.701160e+01 3.259960e+00 8.980180e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.724048e+01 3.259960e+00 1.096123e+02 vertex 3.602386e+01 3.259960e+00 1.087210e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.672046e+01 3.259960e+00 1.263758e+02 vertex 3.733740e+01 3.259960e+00 1.263750e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.734436e+01 3.259960e+00 1.263750e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.733740e+01 3.259960e+00 1.263750e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.734052e+01 3.259960e+00 1.263756e+02 vertex 3.734436e+01 3.259960e+00 1.263750e+02 vertex 3.733740e+01 3.259960e+00 1.263750e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.744336e+01 3.259960e+00 1.431384e+02 vertex 3.851282e+01 3.259960e+00 1.425051e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.015417e+01 3.259960e+00 1.316382e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.851282e+01 3.259960e+00 1.425051e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.807861e+01 3.259960e+00 1.013817e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.952838e+01 3.259960e+00 1.007040e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.952838e+01 3.259960e+00 1.007040e+02 vertex 4.052136e+01 3.259960e+00 1.023950e+02 vertex 4.266730e+01 3.259960e+00 8.661221e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.579980e+01 3.259960e+00 7.601591e+01 vertex 3.451251e+01 3.259960e+00 7.379582e+01 vertex 3.395190e+01 3.259960e+00 8.960912e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.451251e+01 3.259960e+00 7.379582e+01 vertex 3.339368e+01 3.259960e+00 7.848862e+01 vertex 3.395190e+01 3.259960e+00 8.960912e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.620117e+01 3.259960e+00 4.166418e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 vertex 2.087518e+01 3.259960e+00 2.019086e+01 endloop endfacet facet normal -2.164839e-07 1.000000e+00 -5.545041e-08 outer loop vertex 4.466748e+01 3.259960e+00 1.457045e+02 vertex 4.608637e+01 3.259960e+00 1.444647e+02 vertex 4.849786e+01 3.259960e+00 1.307503e+02 endloop endfacet facet normal -1.226966e-05 1.000000e+00 -2.174843e-06 outer loop vertex 4.850476e+01 3.259960e+00 1.308210e+02 vertex 4.849786e+01 3.259960e+00 1.307503e+02 vertex 4.608637e+01 3.259960e+00 1.444647e+02 endloop endfacet facet normal 1.853838e-07 1.000000e+00 3.285998e-08 outer loop vertex 4.608637e+01 3.259960e+00 1.444647e+02 vertex 4.572791e+01 3.259960e+00 1.537426e+02 vertex 4.850476e+01 3.259960e+00 1.308210e+02 endloop endfacet facet normal 8.766262e-06 1.000000e+00 1.072399e-06 outer loop vertex 4.851886e+01 3.259960e+00 1.309281e+02 vertex 4.850476e+01 3.259960e+00 1.308210e+02 vertex 4.572791e+01 3.259960e+00 1.537426e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.572791e+01 3.259960e+00 1.537426e+02 vertex 4.593188e+01 3.259960e+00 1.554632e+02 vertex 4.855481e+01 3.259960e+00 1.537967e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.572791e+01 3.259960e+00 1.537426e+02 vertex 4.855481e+01 3.259960e+00 1.537967e+02 vertex 4.851886e+01 3.259960e+00 1.309281e+02 endloop endfacet facet normal -2.959227e-05 1.000000e+00 4.651942e-08 outer loop vertex 4.856287e+01 3.259960e+00 1.537966e+02 vertex 4.851886e+01 3.259960e+00 1.309281e+02 vertex 4.855481e+01 3.259960e+00 1.537967e+02 endloop endfacet facet normal 8.004418e-08 1.000000e+00 -1.057966e-08 outer loop vertex 5.153430e+01 3.259960e+00 1.537425e+02 vertex 4.851886e+01 3.259960e+00 1.309281e+02 vertex 4.856287e+01 3.259960e+00 1.537966e+02 endloop endfacet facet normal -2.987790e-05 1.000000e+00 -2.508861e-05 outer loop vertex 4.856287e+01 3.259960e+00 1.537966e+02 vertex 4.855481e+01 3.259960e+00 1.537967e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 4.593188e+01 3.259960e+00 1.554632e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 4.855481e+01 3.259960e+00 1.537967e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.738110e+01 3.259960e+00 1.316664e+02 vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.559381e+01 3.259960e+00 1.316645e+02 endloop endfacet facet normal 4.830701e-12 1.000000e+00 -1.222671e-08 outer loop vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.292407e+01 3.259960e+00 8.966451e+01 vertex 2.217249e+01 3.259960e+00 1.091640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.012976e+01 3.259960e+00 4.166468e+01 vertex 2.788867e+01 3.259960e+00 1.749902e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.087518e+01 3.259960e+00 2.019086e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 vertex 2.788867e+01 3.259960e+00 1.749902e+01 endloop endfacet facet normal -5.106331e-08 1.000000e+00 -4.297525e-10 outer loop vertex 2.283551e+01 3.259960e+00 6.416467e+01 vertex 2.737500e+01 3.259960e+00 7.956241e+01 vertex 2.753900e+01 3.259960e+00 6.007571e+01 endloop endfacet facet normal -2.257388e-12 1.000000e+00 1.059681e-08 outer loop vertex 1.620117e+01 3.259960e+00 4.166418e+01 vertex 2.283551e+01 3.259960e+00 6.416467e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 endloop endfacet facet normal -1.667006e-07 1.000000e+00 2.532535e-08 outer loop vertex 2.416357e+01 3.259960e+00 1.316644e+02 vertex 2.559381e+01 3.259960e+00 1.316645e+02 vertex 2.217560e+01 3.259960e+00 1.091646e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.217560e+01 3.259960e+00 1.091646e+02 vertex 2.559381e+01 3.259960e+00 1.316645e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.598621e+01 3.259960e+00 4.466436e+01 vertex 1.620117e+01 3.259960e+00 4.166418e+01 vertex 1.512030e+01 3.259960e+00 2.019086e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.087518e+01 3.259960e+00 2.019086e+01 vertex 1.512030e+01 3.259960e+00 2.019086e+01 vertex 1.620117e+01 3.259960e+00 4.166418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.708417e+01 3.259960e+00 1.541643e+02 vertex 2.672229e+01 3.259960e+00 1.605929e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.738110e+01 3.259960e+00 1.316664e+02 vertex 2.559381e+01 3.259960e+00 1.316645e+02 vertex 2.708417e+01 3.259960e+00 1.541643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 vertex 2.753900e+01 3.259960e+00 6.007571e+01 endloop endfacet facet normal -4.501282e-08 1.000000e+00 6.530064e-09 outer loop vertex 2.283551e+01 3.259960e+00 6.416467e+01 vertex 2.753900e+01 3.259960e+00 6.007571e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.861230e+01 3.259960e+00 6.890134e+01 vertex 1.819098e+01 3.259960e+00 6.416423e+01 vertex 1.819000e+01 3.259960e+00 6.416435e+01 endloop endfacet facet normal 5.135551e-08 1.000000e+00 -4.546178e-09 outer loop vertex 2.283551e+01 3.259960e+00 6.416467e+01 vertex 1.620117e+01 3.259960e+00 4.166418e+01 vertex 1.861230e+01 3.259960e+00 6.890134e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.234430e+01 3.259960e+00 1.316644e+02 vertex 2.331659e+01 3.259960e+00 1.316646e+02 vertex 2.169769e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal -1.021692e-11 1.000000e+00 -1.222729e-08 outer loop vertex 2.169769e+01 3.259960e+00 1.091644e+02 vertex 2.217249e+01 3.259960e+00 1.091640e+02 vertex 2.292407e+01 3.259960e+00 8.966451e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.540930e+01 3.259960e+00 4.166448e+01 vertex 1.598621e+01 3.259960e+00 4.466436e+01 vertex 1.434497e+01 3.259960e+00 2.386200e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.512030e+01 3.259960e+00 2.019086e+01 vertex 1.434497e+01 3.259960e+00 2.386200e+01 vertex 1.598621e+01 3.259960e+00 4.466436e+01 endloop endfacet facet normal 2.814852e-07 1.000000e+00 -2.457621e-08 outer loop vertex 2.416357e+01 3.259960e+00 1.316644e+02 vertex 2.331659e+01 3.259960e+00 1.316646e+02 vertex 2.520667e+01 3.259960e+00 1.533127e+02 endloop endfacet facet normal -1.575835e-06 1.000000e+00 5.324932e-07 outer loop vertex 1.861230e+01 3.259960e+00 6.890134e+01 vertex 1.716290e+01 3.259960e+00 6.416431e+01 vertex 1.701166e+01 3.259960e+00 6.416446e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.620117e+01 3.259960e+00 4.166418e+01 vertex 1.598621e+01 3.259960e+00 4.466436e+01 vertex 1.819000e+01 3.259960e+00 6.416435e+01 endloop endfacet facet normal 9.139348e-05 1.000000e+00 -8.064500e-06 outer loop vertex 2.217560e+01 3.259960e+00 1.091646e+02 vertex 2.305798e+01 3.259960e+00 1.191645e+02 vertex 2.416357e+01 3.259960e+00 1.316644e+02 endloop endfacet facet normal 2.814896e-07 1.000000e+00 -5.823548e-09 outer loop vertex 2.331659e+01 3.259960e+00 1.316646e+02 vertex 2.416357e+01 3.259960e+00 1.316644e+02 vertex 2.305798e+01 3.259960e+00 1.191645e+02 endloop endfacet facet normal -1.666988e-07 1.000000e+00 2.223173e-09 outer loop vertex 2.559381e+01 3.259960e+00 1.316645e+02 vertex 2.416357e+01 3.259960e+00 1.316644e+02 vertex 2.584772e+01 3.259960e+00 1.507030e+02 endloop endfacet facet normal -3.748228e-08 1.000000e+00 -9.207243e-09 outer loop vertex 2.520667e+01 3.259960e+00 1.533127e+02 vertex 2.584772e+01 3.259960e+00 1.507030e+02 vertex 2.416357e+01 3.259960e+00 1.316644e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.819000e+01 3.259960e+00 6.416435e+01 vertex 1.819098e+01 3.259960e+00 6.416423e+01 vertex 1.620117e+01 3.259960e+00 4.166418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.861230e+01 3.259960e+00 6.890134e+01 vertex 1.620117e+01 3.259960e+00 4.166418e+01 vertex 1.819098e+01 3.259960e+00 6.416423e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.305798e+01 3.259960e+00 1.191645e+02 vertex 2.217249e+01 3.259960e+00 1.091640e+02 vertex 2.331659e+01 3.259960e+00 1.316646e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.169769e+01 3.259960e+00 1.091644e+02 vertex 2.331659e+01 3.259960e+00 1.316646e+02 vertex 2.217249e+01 3.259960e+00 1.091640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.708417e+01 3.259960e+00 1.541643e+02 vertex 2.559381e+01 3.259960e+00 1.316645e+02 vertex 2.584772e+01 3.259960e+00 1.507030e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.584772e+01 3.259960e+00 1.507030e+02 vertex 2.672229e+01 3.259960e+00 1.605929e+02 vertex 2.708417e+01 3.259960e+00 1.541643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.107831e+01 3.259960e+00 1.316643e+02 vertex 2.117847e+01 3.259960e+00 1.247413e+02 vertex 2.001367e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.001367e+01 3.259960e+00 1.091644e+02 vertex 2.051691e+01 3.259960e+00 1.091645e+02 vertex 2.001910e+01 3.259960e+00 9.566451e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.482367e+01 3.259960e+00 4.166459e+01 vertex 1.540930e+01 3.259960e+00 4.166448e+01 vertex 1.385358e+01 3.259960e+00 2.019111e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.434497e+01 3.259960e+00 2.386200e+01 vertex 1.385358e+01 3.259960e+00 2.019111e+01 vertex 1.540930e+01 3.259960e+00 4.166448e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.234430e+01 3.259960e+00 1.316644e+02 vertex 2.117847e+01 3.259960e+00 1.247413e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 endloop endfacet facet normal 6.575851e-07 1.000000e+00 -3.250102e-08 outer loop vertex 1.701166e+01 3.259960e+00 6.416446e+01 vertex 1.664911e+01 3.259960e+00 6.416483e+01 vertex 1.812372e+01 3.259960e+00 8.666451e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.598621e+01 3.259960e+00 4.466436e+01 vertex 1.540930e+01 3.259960e+00 4.166448e+01 vertex 1.701166e+01 3.259960e+00 6.416446e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.925891e+01 3.259960e+00 1.254678e+02 vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 1.923956e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.923956e+01 3.259960e+00 1.091645e+02 vertex 2.025787e+01 3.259960e+00 1.191644e+02 vertex 2.001367e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.449951e+01 3.259960e+00 5.066468e+01 vertex 1.482367e+01 3.259960e+00 4.166459e+01 vertex 1.369562e+01 3.259960e+00 1.916494e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.385358e+01 3.259960e+00 2.019111e+01 vertex 1.369562e+01 3.259960e+00 1.916494e+01 vertex 1.482367e+01 3.259960e+00 4.166459e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.107831e+01 3.259960e+00 1.316643e+02 vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 endloop endfacet facet normal -1.358291e-06 1.000000e+00 8.754686e-09 outer loop vertex 1.616907e+01 3.259960e+00 6.416461e+01 vertex 1.603497e+01 3.259960e+00 7.059312e+01 vertex 1.631409e+01 3.259960e+00 8.666441e+01 endloop endfacet facet normal -2.070658e-12 1.000000e+00 -1.059625e-08 outer loop vertex 1.540930e+01 3.259960e+00 4.166448e+01 vertex 1.482367e+01 3.259960e+00 4.166459e+01 vertex 1.616907e+01 3.259960e+00 6.416461e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.001367e+01 3.259960e+00 1.091644e+02 vertex 2.025787e+01 3.259960e+00 1.191644e+02 vertex 2.107831e+01 3.259960e+00 1.316643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 2.107831e+01 3.259960e+00 1.316643e+02 vertex 2.025787e+01 3.259960e+00 1.191644e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.117847e+01 3.259960e+00 1.247413e+02 vertex 2.107831e+01 3.259960e+00 1.316643e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 endloop endfacet facet normal 2.011161e-07 9.999999e-01 -4.519366e-04 outer loop vertex 1.616907e+01 3.259960e+00 6.416461e+01 vertex 1.664911e+01 3.259960e+00 6.416483e+01 vertex 1.701166e+01 3.259960e+00 6.416446e+01 endloop endfacet facet normal 2.829554e-07 1.000000e+00 -2.015092e-08 outer loop vertex 1.701166e+01 3.259960e+00 6.416446e+01 vertex 1.540930e+01 3.259960e+00 4.166448e+01 vertex 1.616907e+01 3.259960e+00 6.416461e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.923956e+01 3.259960e+00 1.091645e+02 vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 2.025787e+01 3.259960e+00 1.191644e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255811e+01 3.259960e+00 1.541643e+02 vertex 2.313147e+01 3.259960e+00 1.490728e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255292e+01 3.259960e+00 1.541640e+02 vertex 2.289960e+01 3.259960e+00 1.594247e+02 vertex 2.255811e+01 3.259960e+00 1.541643e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.851282e+01 3.259960e+00 1.425051e+02 vertex 3.877087e+01 3.259960e+00 1.507313e+02 vertex 4.015417e+01 3.259960e+00 1.316382e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.015686e+01 3.259960e+00 1.316640e+02 vertex 4.015417e+01 3.259960e+00 1.316382e+02 vertex 3.877087e+01 3.259960e+00 1.507313e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 4.015417e+01 3.259960e+00 1.316382e+02 vertex 4.141229e+01 3.259960e+00 1.091250e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141229e+01 3.259960e+00 1.091250e+02 vertex 4.141406e+01 3.259960e+00 1.091520e+02 vertex 4.141492e+01 3.259960e+00 1.091650e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.952838e+01 3.259960e+00 1.007040e+02 vertex 3.865027e+01 3.259960e+00 9.114841e+01 vertex 3.807861e+01 3.259960e+00 1.013817e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.865027e+01 3.259960e+00 9.114841e+01 vertex 3.740778e+01 3.259960e+00 9.485211e+01 vertex 3.807861e+01 3.259960e+00 1.013817e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.991687e+01 3.259960e+00 1.541666e+02 vertex 3.268811e+01 3.259960e+00 1.766644e+02 vertex 3.188422e+01 3.259960e+00 1.541674e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.950848e+01 3.259960e+00 1.316684e+02 vertex 2.991687e+01 3.259960e+00 1.541666e+02 vertex 3.073077e+01 3.259960e+00 1.316697e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.877087e+01 3.259960e+00 1.507313e+02 vertex 3.912866e+01 3.259960e+00 1.500805e+02 vertex 4.015686e+01 3.259960e+00 1.316640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.043640e+01 3.259960e+00 1.439527e+02 vertex 4.015686e+01 3.259960e+00 1.316640e+02 vertex 3.912866e+01 3.259960e+00 1.500805e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.015417e+01 3.259960e+00 1.316382e+02 vertex 4.015686e+01 3.259960e+00 1.316640e+02 vertex 4.141492e+01 3.259960e+00 1.091650e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141229e+01 3.259960e+00 1.091250e+02 vertex 4.141980e+01 3.259960e+00 1.091997e+02 vertex 4.142206e+01 3.259960e+00 1.092165e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.093958e+01 3.259960e+00 1.541818e+02 vertex 3.948987e+01 3.259960e+00 1.541778e+02 vertex 3.764117e+01 3.259960e+00 1.766641e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.186926e+01 3.259960e+00 1.290499e+02 vertex 4.043640e+01 3.259960e+00 1.439527e+02 vertex 4.093958e+01 3.259960e+00 1.541818e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.763190e+01 3.259960e+00 1.047938e+02 vertex 1.812646e+01 3.259960e+00 1.088228e+02 vertex 1.812372e+01 3.259960e+00 8.666451e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.369562e+01 3.259960e+00 1.916494e+01 vertex 1.324200e+01 3.259960e+00 1.916406e+01 vertex 1.326251e+01 3.259960e+00 1.916437e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.565149e+01 3.259960e+00 6.416454e+01 vertex 1.505811e+01 3.259960e+00 6.825552e+01 vertex 1.592340e+01 3.259960e+00 9.195871e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.482367e+01 3.259960e+00 4.166459e+01 vertex 1.449951e+01 3.259960e+00 5.066468e+01 vertex 1.565149e+01 3.259960e+00 6.416454e+01 endloop endfacet facet normal -2.025236e-07 1.000000e+00 1.978934e-08 outer loop vertex 1.670502e+01 3.259960e+00 1.027130e+02 vertex 1.733539e+01 3.259960e+00 1.091642e+02 vertex 1.631409e+01 3.259960e+00 8.666441e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.449951e+01 3.259960e+00 5.066468e+01 vertex 1.369562e+01 3.259960e+00 1.916494e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.369562e+01 3.259960e+00 1.916494e+01 vertex 1.326251e+01 3.259960e+00 1.916437e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.505811e+01 3.259960e+00 6.825552e+01 vertex 1.460938e+01 3.259960e+00 6.416447e+01 vertex 1.478320e+01 3.259960e+00 8.666451e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.565149e+01 3.259960e+00 6.416454e+01 vertex 1.449951e+01 3.259960e+00 5.066468e+01 vertex 1.505811e+01 3.259960e+00 6.825552e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141492e+01 3.259960e+00 1.091650e+02 vertex 4.141406e+01 3.259960e+00 1.091520e+02 vertex 4.015417e+01 3.259960e+00 1.316382e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 4.141229e+01 3.259960e+00 1.091250e+02 vertex 4.015417e+01 3.259960e+00 1.316382e+02 vertex 4.141406e+01 3.259960e+00 1.091520e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.169769e+01 3.259960e+00 1.091644e+02 vertex 2.122607e+01 3.259960e+00 1.132555e+02 vertex 2.234430e+01 3.259960e+00 1.316644e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.117847e+01 3.259960e+00 1.247413e+02 vertex 2.234430e+01 3.259960e+00 1.316644e+02 vertex 2.122607e+01 3.259960e+00 1.132555e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.331659e+01 3.259960e+00 1.316646e+02 vertex 2.234430e+01 3.259960e+00 1.316644e+02 vertex 2.313147e+01 3.259960e+00 1.490728e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255292e+01 3.259960e+00 1.541640e+02 vertex 2.313147e+01 3.259960e+00 1.490728e+02 vertex 2.234430e+01 3.259960e+00 1.316644e+02 endloop endfacet facet normal -1.576289e-06 1.000000e+00 8.289226e-08 outer loop vertex 1.701166e+01 3.259960e+00 6.416446e+01 vertex 1.716290e+01 3.259960e+00 6.416431e+01 vertex 1.598621e+01 3.259960e+00 4.466436e+01 endloop endfacet facet normal 2.321292e-07 1.000000e+00 -2.623413e-08 outer loop vertex 1.819000e+01 3.259960e+00 6.416435e+01 vertex 1.598621e+01 3.259960e+00 4.466436e+01 vertex 1.716290e+01 3.259960e+00 6.416431e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.912866e+01 3.259960e+00 1.500805e+02 vertex 3.948987e+01 3.259960e+00 1.541778e+02 vertex 4.043640e+01 3.259960e+00 1.439527e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.093958e+01 3.259960e+00 1.541818e+02 vertex 4.043640e+01 3.259960e+00 1.439527e+02 vertex 3.948987e+01 3.259960e+00 1.541778e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.015686e+01 3.259960e+00 1.316640e+02 vertex 4.043640e+01 3.259960e+00 1.439527e+02 vertex 4.186926e+01 3.259960e+00 1.290499e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.186926e+01 3.259960e+00 1.290499e+02 vertex 4.142206e+01 3.259960e+00 1.092165e+02 vertex 4.015686e+01 3.259960e+00 1.316640e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.991687e+01 3.259960e+00 1.541666e+02 vertex 3.188422e+01 3.259960e+00 1.541674e+02 vertex 3.073077e+01 3.259960e+00 1.316697e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221442e+01 3.259960e+00 1.316695e+02 vertex 3.073077e+01 3.259960e+00 1.316697e+02 vertex 3.188422e+01 3.259960e+00 1.541674e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.093359e+01 3.259960e+00 3.868018e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 3.067480e+01 3.259960e+00 6.417702e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.067480e+01 3.259960e+00 6.417702e+01 vertex 2.992517e+01 3.259960e+00 6.763437e+01 vertex 2.947070e+01 3.259960e+00 8.667551e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.950848e+01 3.259960e+00 1.316684e+02 vertex 3.073077e+01 3.259960e+00 1.316697e+02 vertex 3.027557e+01 3.259960e+00 1.091724e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027557e+01 3.259960e+00 1.091724e+02 vertex 3.145361e+01 3.259960e+00 1.132628e+02 vertex 3.117950e+01 3.259960e+00 8.430692e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.561078e+01 3.259960e+00 1.011122e+02 vertex 1.587061e+01 3.259960e+00 1.053373e+02 vertex 1.592340e+01 3.259960e+00 9.195871e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.314850e+01 3.259960e+00 3.523589e+01 vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.369562e+01 3.259960e+00 1.916494e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 vertex 1.350098e+01 3.259960e+00 4.166497e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.429431e+01 3.259960e+00 6.416449e+01 vertex 1.414160e+01 3.259960e+00 6.416479e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.449951e+01 3.259960e+00 5.066468e+01 vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.429431e+01 3.259960e+00 6.416449e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.519098e+01 3.259960e+00 1.035705e+02 vertex 1.542902e+01 3.259960e+00 1.094730e+02 vertex 1.542181e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.290912e+01 3.259960e+00 4.166435e+01 vertex 1.314850e+01 3.259960e+00 3.523589e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.413947e+01 3.259960e+00 6.416406e+01 vertex 1.354980e+01 3.259960e+00 6.416415e+01 vertex 1.361298e+01 3.259960e+00 7.718262e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.314850e+01 3.259960e+00 3.523589e+01 vertex 1.290912e+01 3.259960e+00 4.166435e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.413947e+01 3.259960e+00 6.416406e+01 vertex 1.414160e+01 3.259960e+00 6.416479e+01 vertex 1.429431e+01 3.259960e+00 6.416449e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.429431e+01 3.259960e+00 6.416449e+01 vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.413947e+01 3.259960e+00 6.416406e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.923956e+01 3.259960e+00 1.091645e+02 vertex 1.861346e+01 3.259960e+00 1.176968e+02 vertex 1.925891e+01 3.259960e+00 1.254678e+02 endloop endfacet facet normal -4.606468e-07 1.000000e+00 2.747891e-08 outer loop vertex 1.565149e+01 3.259960e+00 6.416454e+01 vertex 1.603497e+01 3.259960e+00 7.059312e+01 vertex 1.616907e+01 3.259960e+00 6.416461e+01 endloop endfacet facet normal -4.606452e-07 1.000000e+00 1.694810e-08 outer loop vertex 1.616907e+01 3.259960e+00 6.416461e+01 vertex 1.482367e+01 3.259960e+00 4.166459e+01 vertex 1.565149e+01 3.259960e+00 6.416454e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.122607e+01 3.259960e+00 1.132555e+02 vertex 2.051691e+01 3.259960e+00 1.091645e+02 vertex 2.117847e+01 3.259960e+00 1.247413e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.001367e+01 3.259960e+00 1.091644e+02 vertex 2.117847e+01 3.259960e+00 1.247413e+02 vertex 2.051691e+01 3.259960e+00 1.091645e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.258698e+01 3.259960e+00 4.166418e+01 vertex 1.290912e+01 3.259960e+00 4.166435e+01 vertex 1.256451e+01 3.259960e+00 1.916436e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.286029e+01 3.259960e+00 1.916418e+01 vertex 1.256451e+01 3.259960e+00 1.916436e+01 vertex 1.290912e+01 3.259960e+00 4.166435e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.325488e+01 3.259960e+00 6.416420e+01 vertex 1.293286e+01 3.259960e+00 6.416501e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.290912e+01 3.259960e+00 4.166435e+01 vertex 1.258698e+01 3.259960e+00 4.166418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.738110e+01 3.259960e+00 1.316664e+02 vertex 2.914148e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.913940e+01 3.259960e+00 1.091644e+02 vertex 2.914111e+01 3.259960e+00 1.091692e+02 vertex 2.947070e+01 3.259960e+00 8.667551e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.788867e+01 3.259960e+00 1.749902e+01 vertex 3.012976e+01 3.259960e+00 4.166468e+01 vertex 3.027057e+01 3.259960e+00 1.706041e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.708417e+01 3.259960e+00 1.541643e+02 vertex 2.834747e+01 3.259960e+00 1.507044e+02 vertex 2.738110e+01 3.259960e+00 1.316664e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.950848e+01 3.259960e+00 1.316684e+02 vertex 2.738110e+01 3.259960e+00 1.316664e+02 vertex 2.834747e+01 3.259960e+00 1.507044e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.753900e+01 3.259960e+00 6.007571e+01 vertex 2.928491e+01 3.259960e+00 6.416808e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 3.012976e+01 3.259960e+00 4.166468e+01 vertex 2.486829e+01 3.259960e+00 4.166603e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.429431e+01 3.259960e+00 6.416449e+01 vertex 1.460938e+01 3.259960e+00 6.416447e+01 vertex 1.449951e+01 3.259960e+00 5.066468e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.505811e+01 3.259960e+00 6.825552e+01 vertex 1.449951e+01 3.259960e+00 5.066468e+01 vertex 1.460938e+01 3.259960e+00 6.416447e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 9.664185e+00 3.259960e+00 4.280404e+01 vertex 1.258698e+01 3.259960e+00 4.166418e+01 vertex 1.251300e+01 3.259960e+00 2.915182e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.256451e+01 3.259960e+00 1.916436e+01 vertex 1.251300e+01 3.259960e+00 2.915182e+01 vertex 1.258698e+01 3.259960e+00 4.166418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.277222e+01 3.259960e+00 6.416437e+01 vertex 1.274768e+01 3.259960e+00 6.412642e+01 vertex 1.290930e+01 3.259960e+00 8.658751e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.258698e+01 3.259960e+00 4.166418e+01 vertex 1.221771e+01 3.259960e+00 6.055888e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.142206e+01 3.259960e+00 1.092165e+02 vertex 4.141980e+01 3.259960e+00 1.091997e+02 vertex 4.015686e+01 3.259960e+00 1.316640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 4.141492e+01 3.259960e+00 1.091650e+02 vertex 4.015686e+01 3.259960e+00 1.316640e+02 vertex 4.141980e+01 3.259960e+00 1.091997e+02 endloop endfacet facet normal -1.609802e-07 1.000000e+00 1.405504e-08 outer loop vertex 2.520667e+01 3.259960e+00 1.533127e+02 vertex 2.331659e+01 3.259960e+00 1.316646e+02 vertex 2.407867e+01 3.259960e+00 1.573564e+02 endloop endfacet facet normal 2.302910e-07 1.000000e+00 2.448925e-09 outer loop vertex 2.313147e+01 3.259960e+00 1.490728e+02 vertex 2.407867e+01 3.259960e+00 1.573564e+02 vertex 2.331659e+01 3.259960e+00 1.316646e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 1.354980e+01 3.259960e+00 6.416415e+01 vertex 1.413947e+01 3.259960e+00 6.416406e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.413947e+01 3.259960e+00 6.416406e+01 vertex 1.350098e+01 3.259960e+00 4.166497e+01 vertex 1.221771e+01 3.259960e+00 6.055888e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 1.293286e+01 3.259960e+00 6.416501e+01 vertex 1.325488e+01 3.259960e+00 6.416420e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.325488e+01 3.259960e+00 6.416420e+01 vertex 1.354980e+01 3.259960e+00 6.416415e+01 vertex 1.221771e+01 3.259960e+00 6.055888e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 3.013196e+01 3.259960e+00 4.168053e+01 vertex 2.994830e+01 3.259960e+00 5.417537e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.093359e+01 3.259960e+00 3.868018e+01 vertex 3.046429e+01 3.259960e+00 1.918336e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.834747e+01 3.259960e+00 1.507044e+02 vertex 2.870911e+01 3.259960e+00 1.605941e+02 vertex 2.991687e+01 3.259960e+00 1.541666e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.991687e+01 3.259960e+00 1.541666e+02 vertex 2.950848e+01 3.259960e+00 1.316684e+02 vertex 2.834747e+01 3.259960e+00 1.507044e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.992517e+01 3.259960e+00 6.763437e+01 vertex 2.994830e+01 3.259960e+00 5.417537e+01 vertex 2.980066e+01 3.259960e+00 6.416951e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.067480e+01 3.259960e+00 6.417702e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 2.992517e+01 3.259960e+00 6.763437e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221442e+01 3.259960e+00 1.316695e+02 vertex 3.145361e+01 3.259960e+00 1.132628e+02 vertex 3.073077e+01 3.259960e+00 1.316697e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027557e+01 3.259960e+00 1.091724e+02 vertex 3.073077e+01 3.259960e+00 1.316697e+02 vertex 3.145361e+01 3.259960e+00 1.132628e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.738110e+01 3.259960e+00 1.316664e+02 vertex 2.950848e+01 3.259960e+00 1.316684e+02 vertex 2.914148e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027557e+01 3.259960e+00 1.091724e+02 vertex 2.914148e+01 3.259960e+00 1.091722e+02 vertex 2.950848e+01 3.259960e+00 1.316684e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.093359e+01 3.259960e+00 3.868018e+01 vertex 3.221106e+01 3.259960e+00 4.447726e+01 vertex 3.103076e+01 3.259960e+00 1.918351e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.103076e+01 3.259960e+00 1.918351e+01 vertex 3.221106e+01 3.259960e+00 4.447726e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.251392e+01 3.259960e+00 1.550713e+02 vertex 3.245367e+01 3.259960e+00 1.541671e+02 vertex 3.245166e+01 3.259960e+00 1.541674e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.342456e+01 3.259960e+00 1.334942e+02 vertex 3.222046e+01 3.259960e+00 1.316696e+02 vertex 3.251392e+01 3.259960e+00 1.550713e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.185431e+01 3.259960e+00 6.682034e+01 vertex 3.150531e+01 3.259960e+00 6.417757e+01 vertex 3.117950e+01 3.259960e+00 8.430692e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.247839e+01 3.259960e+00 5.461909e+01 vertex 3.221106e+01 3.259960e+00 4.447726e+01 vertex 3.185431e+01 3.259960e+00 6.682034e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221661e+01 3.259960e+00 1.316698e+02 vertex 3.222046e+01 3.259960e+00 1.316696e+02 vertex 3.265460e+01 3.259960e+00 1.115148e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.265460e+01 3.259960e+00 1.115148e+02 vertex 3.298950e+01 3.259960e+00 1.168036e+02 vertex 3.476581e+01 3.259960e+00 1.095643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.221661e+01 3.259960e+00 1.316698e+02 vertex 3.221442e+01 3.259960e+00 1.316695e+02 vertex 3.245081e+01 3.259960e+00 1.541675e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.188422e+01 3.259960e+00 1.541674e+02 vertex 3.245081e+01 3.259960e+00 1.541675e+02 vertex 3.221442e+01 3.259960e+00 1.316695e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.103076e+01 3.259960e+00 1.918351e+01 vertex 3.093628e+01 3.259960e+00 2.561122e+01 vertex 3.093359e+01 3.259960e+00 3.868018e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.046429e+01 3.259960e+00 1.918336e+01 vertex 3.093359e+01 3.259960e+00 3.868018e+01 vertex 3.093628e+01 3.259960e+00 2.561122e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221106e+01 3.259960e+00 4.447726e+01 vertex 3.093359e+01 3.259960e+00 3.868018e+01 vertex 3.135870e+01 3.259960e+00 6.008723e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.067480e+01 3.259960e+00 6.417702e+01 vertex 3.135870e+01 3.259960e+00 6.008723e+01 vertex 3.093359e+01 3.259960e+00 3.868018e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.185516e+01 3.259960e+00 1.057114e+02 vertex 3.197900e+01 3.259960e+00 1.091723e+02 vertex 3.197998e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.145361e+01 3.259960e+00 1.132628e+02 vertex 3.221442e+01 3.259960e+00 1.316695e+02 vertex 3.185516e+01 3.259960e+00 1.057114e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.222046e+01 3.259960e+00 1.316696e+02 vertex 3.221661e+01 3.259960e+00 1.316698e+02 vertex 3.245166e+01 3.259960e+00 1.541674e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.245081e+01 3.259960e+00 1.541675e+02 vertex 3.245166e+01 3.259960e+00 1.541674e+02 vertex 3.221661e+01 3.259960e+00 1.316698e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.135870e+01 3.259960e+00 6.008723e+01 vertex 3.150531e+01 3.259960e+00 6.417757e+01 vertex 3.221106e+01 3.259960e+00 4.447726e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.185431e+01 3.259960e+00 6.682034e+01 vertex 3.221106e+01 3.259960e+00 4.447726e+01 vertex 3.150531e+01 3.259960e+00 6.417757e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.265460e+01 3.259960e+00 1.115148e+02 vertex 3.197998e+01 3.259960e+00 1.091722e+02 vertex 3.221661e+01 3.259960e+00 1.316698e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221442e+01 3.259960e+00 1.316695e+02 vertex 3.221661e+01 3.259960e+00 1.316698e+02 vertex 3.197998e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.197998e+01 3.259960e+00 1.091722e+02 vertex 3.197900e+01 3.259960e+00 1.091723e+02 vertex 3.221442e+01 3.259960e+00 1.316695e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.185516e+01 3.259960e+00 1.057114e+02 vertex 3.221442e+01 3.259960e+00 1.316695e+02 vertex 3.197900e+01 3.259960e+00 1.091723e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.251392e+01 3.259960e+00 1.550713e+02 vertex 3.222046e+01 3.259960e+00 1.316696e+02 vertex 3.245367e+01 3.259960e+00 1.541671e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.245166e+01 3.259960e+00 1.541674e+02 vertex 3.245367e+01 3.259960e+00 1.541671e+02 vertex 3.222046e+01 3.259960e+00 1.316696e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.914148e+01 3.259960e+00 1.091722e+02 vertex 2.914111e+01 3.259960e+00 1.091692e+02 vertex 2.913940e+01 3.259960e+00 1.091644e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.913940e+01 3.259960e+00 1.091644e+02 vertex 2.572559e+01 3.259960e+00 1.091654e+02 vertex 2.914148e+01 3.259960e+00 1.091722e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.046429e+01 3.259960e+00 1.918336e+01 vertex 3.046387e+01 3.259960e+00 1.918039e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.012976e+01 3.259960e+00 4.166468e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 3.046387e+01 3.259960e+00 1.918039e+01 endloop endfacet facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 outer loop vertex 3.013196e+01 3.259960e+00 4.168053e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 2.980066e+01 3.259960e+00 6.416951e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.928491e+01 3.259960e+00 6.416808e+01 vertex 2.980066e+01 3.259960e+00 6.416951e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.980066e+01 3.259960e+00 6.416951e+01 vertex 2.994830e+01 3.259960e+00 5.417537e+01 vertex 3.013196e+01 3.259960e+00 4.168053e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.992517e+01 3.259960e+00 6.763437e+01 vertex 3.013226e+01 3.259960e+00 4.167546e+01 vertex 2.994830e+01 3.259960e+00 5.417537e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.027057e+01 3.259960e+00 1.706041e+01 vertex 3.012976e+01 3.259960e+00 4.166468e+01 vertex 3.046216e+01 3.259960e+00 1.917558e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.046387e+01 3.259960e+00 1.918039e+01 vertex 3.046216e+01 3.259960e+00 1.917558e+01 vertex 3.012976e+01 3.259960e+00 4.166468e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.317181e+01 3.259960e+00 1.563826e+02 vertex 4.287921e+01 3.259960e+00 1.541813e+02 vertex 4.287616e+01 3.259960e+00 1.541817e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.466748e+01 3.259960e+00 1.457045e+02 vertex 4.281769e+01 3.259960e+00 1.316991e+02 vertex 4.317181e+01 3.259960e+00 1.563826e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.186926e+01 3.259960e+00 1.290499e+02 vertex 4.281769e+01 3.259960e+00 1.316991e+02 vertex 4.340887e+01 3.259960e+00 1.191035e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.558978e+01 3.259960e+00 1.087429e+02 vertex 4.340887e+01 3.259960e+00 1.191035e+02 vertex 4.281769e+01 3.259960e+00 1.316991e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.340887e+01 3.259960e+00 1.191035e+02 vertex 4.274689e+01 3.259960e+00 1.092161e+02 vertex 4.186926e+01 3.259960e+00 1.290499e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.142206e+01 3.259960e+00 1.092165e+02 vertex 4.186926e+01 3.259960e+00 1.290499e+02 vertex 4.274689e+01 3.259960e+00 1.092161e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 4.281769e+01 3.259960e+00 1.316991e+02 vertex 4.186926e+01 3.259960e+00 1.290499e+02 vertex 4.287616e+01 3.259960e+00 1.541817e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.093958e+01 3.259960e+00 1.541818e+02 vertex 4.287616e+01 3.259960e+00 1.541817e+02 vertex 4.186926e+01 3.259960e+00 1.290499e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.317181e+01 3.259960e+00 1.563826e+02 vertex 4.281769e+01 3.259960e+00 1.316991e+02 vertex 4.287921e+01 3.259960e+00 1.541813e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.287616e+01 3.259960e+00 1.541817e+02 vertex 4.287921e+01 3.259960e+00 1.541813e+02 vertex 4.281769e+01 3.259960e+00 1.316991e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.251300e+01 3.259960e+00 2.915182e+01 vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 8.463074e+00 3.259960e+00 2.654071e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 vertex 1.208087e+01 3.259960e+00 1.440757e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.258698e+01 3.259960e+00 4.166418e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 vertex 1.221771e+01 3.259960e+00 6.055888e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 1.274768e+01 3.259960e+00 6.412642e+01 vertex 1.277222e+01 3.259960e+00 6.416437e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.277222e+01 3.259960e+00 6.416437e+01 vertex 1.293286e+01 3.259960e+00 6.416501e+01 vertex 1.221771e+01 3.259960e+00 6.055888e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 5.410767e+00 3.259960e+00 1.989366e+01 vertex 8.463074e+00 3.259960e+00 2.654071e+01 vertex 8.429504e+00 3.259960e+00 1.582182e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 8.429504e+00 3.259960e+00 1.582182e+01 vertex 8.463074e+00 3.259960e+00 2.654071e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.247839e+01 3.259960e+00 5.461909e+01 vertex 3.397797e+01 3.259960e+00 6.221800e+01 vertex 3.359320e+01 3.259960e+00 4.179829e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.683447e+01 3.259960e+00 4.246537e+01 vertex 3.359320e+01 3.259960e+00 4.179829e+01 vertex 3.397797e+01 3.259960e+00 6.221800e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.251392e+01 3.259960e+00 1.550713e+02 vertex 3.299811e+01 3.259960e+00 1.545004e+02 vertex 3.342456e+01 3.259960e+00 1.334942e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.339746e+01 3.259960e+00 1.469616e+02 vertex 3.342456e+01 3.259960e+00 1.334942e+02 vertex 3.299811e+01 3.259960e+00 1.545004e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.222046e+01 3.259960e+00 1.316696e+02 vertex 3.342456e+01 3.259960e+00 1.334942e+02 vertex 3.316797e+01 3.259960e+00 1.227571e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.476581e+01 3.259960e+00 1.095643e+02 vertex 3.316797e+01 3.259960e+00 1.227571e+02 vertex 3.342456e+01 3.259960e+00 1.334942e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.236847e+01 3.259960e+00 8.706161e+01 vertex 3.339368e+01 3.259960e+00 7.848862e+01 vertex 3.397797e+01 3.259960e+00 6.221800e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.451251e+01 3.259960e+00 7.379582e+01 vertex 3.397797e+01 3.259960e+00 6.221800e+01 vertex 3.339368e+01 3.259960e+00 7.848862e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.141229e+01 3.259960e+00 1.091250e+02 vertex 4.052136e+01 3.259960e+00 1.023950e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.952838e+01 3.259960e+00 1.007040e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 4.052136e+01 3.259960e+00 1.023950e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 vertex 9.854675e+00 3.259960e+00 5.593446e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.317181e+01 3.259960e+00 1.563826e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 vertex 4.466748e+01 3.259960e+00 1.457045e+02 endloop endfacet facet normal -1.799101e-07 1.000000e+00 -1.359378e-08 outer loop vertex 4.608637e+01 3.259960e+00 1.444647e+02 vertex 4.466748e+01 3.259960e+00 1.457045e+02 vertex 4.361121e+01 3.259960e+00 1.596840e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.281769e+01 3.259960e+00 1.316991e+02 vertex 4.466748e+01 3.259960e+00 1.457045e+02 vertex 4.849786e+01 3.259960e+00 1.307503e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 4.849786e+01 3.259960e+00 1.307503e+02 vertex 4.553461e+01 3.259960e+00 1.240155e+02 vertex 4.281769e+01 3.259960e+00 1.316991e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.477759e+01 3.259960e+00 1.599006e+02 vertex 3.763220e+01 3.259960e+00 1.766644e+02 vertex 3.667450e+01 3.259960e+00 1.568537e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.449249e+01 3.259960e+00 1.431355e+02 vertex 3.477759e+01 3.259960e+00 1.599006e+02 vertex 3.582190e+01 3.259960e+00 1.431386e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.451251e+01 3.259960e+00 7.379582e+01 vertex 3.579980e+01 3.259960e+00 7.601591e+01 vertex 3.631812e+01 3.259960e+00 5.924049e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.631812e+01 3.259960e+00 5.924049e+01 vertex 3.631909e+01 3.259960e+00 5.926157e+01 vertex 3.632147e+01 3.259960e+00 5.927233e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.299811e+01 3.259960e+00 1.545004e+02 vertex 3.321429e+01 3.259960e+00 1.598950e+02 vertex 3.339746e+01 3.259960e+00 1.469616e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.380151e+01 3.259960e+00 1.408937e+02 vertex 3.339746e+01 3.259960e+00 1.469616e+02 vertex 3.321460e+01 3.259960e+00 1.598899e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.395190e+01 3.259960e+00 8.960912e+01 vertex 3.500818e+01 3.259960e+00 9.071591e+01 vertex 3.579980e+01 3.259960e+00 7.601591e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.580188e+01 3.259960e+00 7.603432e+01 vertex 3.579980e+01 3.259960e+00 7.601591e+01 vertex 3.500818e+01 3.259960e+00 9.071591e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.342456e+01 3.259960e+00 1.334942e+02 vertex 3.339746e+01 3.259960e+00 1.469616e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.424841e+01 3.259960e+00 1.263395e+02 vertex 3.439667e+01 3.259960e+00 1.215594e+02 vertex 3.476678e+01 3.259960e+00 1.095864e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.359320e+01 3.259960e+00 4.179829e+01 vertex 3.297119e+01 3.259960e+00 3.390515e+01 vertex 3.221106e+01 3.259960e+00 4.447726e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.221106e+01 3.259960e+00 4.447726e+01 vertex 3.247839e+01 3.259960e+00 5.461909e+01 vertex 3.359320e+01 3.259960e+00 4.179829e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.397797e+01 3.259960e+00 6.221800e+01 vertex 3.247839e+01 3.259960e+00 5.461909e+01 vertex 3.237628e+01 3.259960e+00 6.617604e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.185431e+01 3.259960e+00 6.682034e+01 vertex 3.237628e+01 3.259960e+00 6.617604e+01 vertex 3.247839e+01 3.259960e+00 5.461909e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.316797e+01 3.259960e+00 1.227571e+02 vertex 3.298950e+01 3.259960e+00 1.168036e+02 vertex 3.222046e+01 3.259960e+00 1.316696e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.265460e+01 3.259960e+00 1.115148e+02 vertex 3.222046e+01 3.259960e+00 1.316696e+02 vertex 3.298950e+01 3.259960e+00 1.168036e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.449249e+01 3.259960e+00 1.431355e+02 vertex 3.582190e+01 3.259960e+00 1.431386e+02 vertex 3.548639e+01 3.259960e+00 1.263756e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.548639e+01 3.259960e+00 1.263756e+02 vertex 3.672046e+01 3.259960e+00 1.263758e+02 vertex 3.771240e+01 3.259960e+00 1.206745e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.670056e+01 3.259960e+00 7.385124e+01 vertex 3.616217e+01 3.259960e+00 7.912862e+01 vertex 3.611237e+01 3.259960e+00 9.284691e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.611237e+01 3.259960e+00 9.284691e+01 vertex 3.529059e+01 3.259960e+00 9.284961e+01 vertex 3.602386e+01 3.259960e+00 1.087210e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.477759e+01 3.259960e+00 1.599006e+02 vertex 3.667450e+01 3.259960e+00 1.568537e+02 vertex 3.582190e+01 3.259960e+00 1.431386e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.743536e+01 3.259960e+00 1.431385e+02 vertex 3.582190e+01 3.259960e+00 1.431386e+02 vertex 3.667450e+01 3.259960e+00 1.568537e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.580188e+01 3.259960e+00 7.603432e+01 vertex 3.573480e+01 3.259960e+00 7.828700e+01 vertex 3.632147e+01 3.259960e+00 5.927840e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632147e+01 3.259960e+00 5.927840e+01 vertex 3.650146e+01 3.259960e+00 5.930606e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 endloop endfacet facet normal -0.000000e+00 -1.000000e+00 -0.000000e+00 outer loop vertex 3.321460e+01 3.259960e+00 1.598899e+02 vertex 3.321429e+01 3.259960e+00 1.598950e+02 vertex 3.380151e+01 3.259960e+00 1.408937e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.449249e+01 3.259960e+00 1.431355e+02 vertex 3.380151e+01 3.259960e+00 1.408937e+02 vertex 3.321429e+01 3.259960e+00 1.598950e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.339746e+01 3.259960e+00 1.469616e+02 vertex 3.380151e+01 3.259960e+00 1.408937e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.424872e+01 3.259960e+00 1.263567e+02 vertex 3.410266e+01 3.259960e+00 1.311550e+02 vertex 3.425342e+01 3.259960e+00 1.263752e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.528546e+01 3.259960e+00 9.281812e+01 vertex 3.528436e+01 3.259960e+00 9.280711e+01 vertex 3.476581e+01 3.259960e+00 1.095643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.580597e+01 3.259960e+00 7.607060e+01 vertex 3.573480e+01 3.259960e+00 7.828700e+01 vertex 3.528546e+01 3.259960e+00 9.281812e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632147e+01 3.259960e+00 5.927840e+01 vertex 3.632147e+01 3.259960e+00 5.927233e+01 vertex 3.580188e+01 3.259960e+00 7.603432e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.579980e+01 3.259960e+00 7.601591e+01 vertex 3.580188e+01 3.259960e+00 7.603432e+01 vertex 3.632147e+01 3.259960e+00 5.927233e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.424872e+01 3.259960e+00 1.263567e+02 vertex 3.439667e+01 3.259960e+00 1.215594e+02 vertex 3.424841e+01 3.259960e+00 1.263395e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.424841e+01 3.259960e+00 1.263395e+02 vertex 3.342456e+01 3.259960e+00 1.334942e+02 vertex 3.424872e+01 3.259960e+00 1.263567e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.573480e+01 3.259960e+00 7.828700e+01 vertex 3.580188e+01 3.259960e+00 7.603432e+01 vertex 3.528357e+01 3.259960e+00 9.280011e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.500818e+01 3.259960e+00 9.071591e+01 vertex 3.528357e+01 3.259960e+00 9.280011e+01 vertex 3.580188e+01 3.259960e+00 7.603432e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.743536e+01 3.259960e+00 1.431385e+02 vertex 3.672046e+01 3.259960e+00 1.263758e+02 vertex 3.582190e+01 3.259960e+00 1.431386e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.548639e+01 3.259960e+00 1.263756e+02 vertex 3.582190e+01 3.259960e+00 1.431386e+02 vertex 3.672046e+01 3.259960e+00 1.263758e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.380151e+01 3.259960e+00 1.408937e+02 vertex 3.449249e+01 3.259960e+00 1.431355e+02 vertex 3.425342e+01 3.259960e+00 1.263752e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.548639e+01 3.259960e+00 1.263756e+02 vertex 3.425342e+01 3.259960e+00 1.263752e+02 vertex 3.449249e+01 3.259960e+00 1.431355e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.580597e+01 3.259960e+00 7.607060e+01 vertex 3.616217e+01 3.259960e+00 7.912862e+01 vertex 3.632666e+01 3.259960e+00 5.932312e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.670056e+01 3.259960e+00 7.385124e+01 vertex 3.632666e+01 3.259960e+00 5.932312e+01 vertex 3.616217e+01 3.259960e+00 7.912862e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.529059e+01 3.259960e+00 9.284961e+01 vertex 3.513947e+01 3.259960e+00 9.762440e+01 vertex 3.476678e+01 3.259960e+00 1.095864e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.611237e+01 3.259960e+00 9.284691e+01 vertex 3.616217e+01 3.259960e+00 7.912862e+01 vertex 3.528699e+01 3.259960e+00 9.283090e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.321429e+01 3.259960e+00 1.598950e+02 vertex 3.341852e+01 3.259960e+00 1.646890e+02 vertex 3.477759e+01 3.259960e+00 1.599006e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.477759e+01 3.259960e+00 1.599006e+02 vertex 3.449249e+01 3.259960e+00 1.431355e+02 vertex 3.321429e+01 3.259960e+00 1.598950e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.528357e+01 3.259960e+00 9.280011e+01 vertex 3.528436e+01 3.259960e+00 9.280711e+01 vertex 3.573480e+01 3.259960e+00 7.828700e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.528546e+01 3.259960e+00 9.281812e+01 vertex 3.573480e+01 3.259960e+00 7.828700e+01 vertex 3.528436e+01 3.259960e+00 9.280711e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632666e+01 3.259960e+00 5.932312e+01 vertex 3.632587e+01 3.259960e+00 5.931717e+01 vertex 3.580597e+01 3.259960e+00 7.607060e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.573480e+01 3.259960e+00 7.828700e+01 vertex 3.580597e+01 3.259960e+00 7.607060e+01 vertex 3.632587e+01 3.259960e+00 5.931717e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.425342e+01 3.259960e+00 1.263752e+02 vertex 3.410266e+01 3.259960e+00 1.311550e+02 vertex 3.380151e+01 3.259960e+00 1.408937e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.424872e+01 3.259960e+00 1.263567e+02 vertex 3.380151e+01 3.259960e+00 1.408937e+02 vertex 3.410266e+01 3.259960e+00 1.311550e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.616217e+01 3.259960e+00 7.912862e+01 vertex 3.580597e+01 3.259960e+00 7.607060e+01 vertex 3.528699e+01 3.259960e+00 9.283090e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.528546e+01 3.259960e+00 9.281812e+01 vertex 3.528699e+01 3.259960e+00 9.283090e+01 vertex 3.580597e+01 3.259960e+00 7.607060e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.743890e+01 3.259960e+00 1.431385e+02 vertex 3.744336e+01 3.259960e+00 1.431384e+02 vertex 3.734436e+01 3.259960e+00 1.263750e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.771240e+01 3.259960e+00 1.206745e+02 vertex 3.734436e+01 3.259960e+00 1.263750e+02 vertex 3.744336e+01 3.259960e+00 1.431384e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.670056e+01 3.259960e+00 7.385124e+01 vertex 3.821881e+01 3.259960e+00 8.121172e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.975647e+01 3.259960e+00 6.458598e+01 vertex 3.694470e+01 3.259960e+00 5.932310e+01 vertex 3.821881e+01 3.259960e+00 8.121172e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.740778e+01 3.259960e+00 9.485211e+01 vertex 3.714221e+01 3.259960e+00 9.284941e+01 vertex 3.724048e+01 3.259960e+00 1.096123e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.865027e+01 3.259960e+00 9.114841e+01 vertex 3.821881e+01 3.259960e+00 8.121172e+01 vertex 3.740778e+01 3.259960e+00 9.485211e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.778381e+01 3.259960e+00 1.598729e+02 vertex 3.753741e+01 3.259960e+00 1.599014e+02 vertex 3.753540e+01 3.259960e+00 1.599017e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.851282e+01 3.259960e+00 1.425051e+02 vertex 3.744336e+01 3.259960e+00 1.431384e+02 vertex 3.778381e+01 3.259960e+00 1.598729e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.733740e+01 3.259960e+00 1.263750e+02 vertex 3.733948e+01 3.259960e+00 1.263757e+02 vertex 3.734052e+01 3.259960e+00 1.263756e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.672046e+01 3.259960e+00 1.263758e+02 vertex 3.743536e+01 3.259960e+00 1.431385e+02 vertex 3.733740e+01 3.259960e+00 1.263750e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.694470e+01 3.259960e+00 5.932310e+01 vertex 3.679596e+01 3.259960e+00 6.411270e+01 vertex 3.670056e+01 3.259960e+00 7.385124e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632666e+01 3.259960e+00 5.932312e+01 vertex 3.670056e+01 3.259960e+00 7.385124e+01 vertex 3.679596e+01 3.259960e+00 6.411270e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.821881e+01 3.259960e+00 8.121172e+01 vertex 3.670056e+01 3.259960e+00 7.385124e+01 vertex 3.701160e+01 3.259960e+00 8.980180e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.611237e+01 3.259960e+00 9.284691e+01 vertex 3.701160e+01 3.259960e+00 8.980180e+01 vertex 3.670056e+01 3.259960e+00 7.385124e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.743890e+01 3.259960e+00 1.431385e+02 vertex 3.743536e+01 3.259960e+00 1.431385e+02 vertex 3.753430e+01 3.259960e+00 1.599019e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.667450e+01 3.259960e+00 1.568537e+02 vertex 3.753430e+01 3.259960e+00 1.599019e+02 vertex 3.743536e+01 3.259960e+00 1.431385e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.734436e+01 3.259960e+00 1.263750e+02 vertex 3.734052e+01 3.259960e+00 1.263756e+02 vertex 3.743890e+01 3.259960e+00 1.431385e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.743536e+01 3.259960e+00 1.431385e+02 vertex 3.743890e+01 3.259960e+00 1.431385e+02 vertex 3.734052e+01 3.259960e+00 1.263756e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.701160e+01 3.259960e+00 8.980180e+01 vertex 3.714221e+01 3.259960e+00 9.284941e+01 vertex 3.821881e+01 3.259960e+00 8.121172e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.740778e+01 3.259960e+00 9.485211e+01 vertex 3.821881e+01 3.259960e+00 8.121172e+01 vertex 3.714221e+01 3.259960e+00 9.284941e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.744336e+01 3.259960e+00 1.431384e+02 vertex 3.743890e+01 3.259960e+00 1.431385e+02 vertex 3.753540e+01 3.259960e+00 1.599017e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.753430e+01 3.259960e+00 1.599019e+02 vertex 3.753540e+01 3.259960e+00 1.599017e+02 vertex 3.743890e+01 3.259960e+00 1.431385e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.734052e+01 3.259960e+00 1.263756e+02 vertex 3.733948e+01 3.259960e+00 1.263757e+02 vertex 3.743536e+01 3.259960e+00 1.431385e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.733740e+01 3.259960e+00 1.263750e+02 vertex 3.743536e+01 3.259960e+00 1.431385e+02 vertex 3.733948e+01 3.259960e+00 1.263757e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.778381e+01 3.259960e+00 1.598729e+02 vertex 3.744336e+01 3.259960e+00 1.431384e+02 vertex 3.753741e+01 3.259960e+00 1.599014e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.753540e+01 3.259960e+00 1.599017e+02 vertex 3.753741e+01 3.259960e+00 1.599014e+02 vertex 3.744336e+01 3.259960e+00 1.431384e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.631812e+01 3.259960e+00 5.924049e+01 vertex 3.579980e+01 3.259960e+00 7.601591e+01 vertex 3.631909e+01 3.259960e+00 5.926157e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632147e+01 3.259960e+00 5.927233e+01 vertex 3.631909e+01 3.259960e+00 5.926157e+01 vertex 3.579980e+01 3.259960e+00 7.601591e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.528699e+01 3.259960e+00 9.283090e+01 vertex 3.513947e+01 3.259960e+00 9.762440e+01 vertex 3.529059e+01 3.259960e+00 9.284961e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.529059e+01 3.259960e+00 9.284961e+01 vertex 3.611237e+01 3.259960e+00 9.284691e+01 vertex 3.528699e+01 3.259960e+00 9.283090e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.632147e+01 3.259960e+00 5.927840e+01 vertex 3.573480e+01 3.259960e+00 7.828700e+01 vertex 3.632587e+01 3.259960e+00 5.931717e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.632587e+01 3.259960e+00 5.931717e+01 vertex 3.650146e+01 3.259960e+00 5.930606e+01 vertex 3.632147e+01 3.259960e+00 5.927840e+01 endloop endfacet facet normal -9.284356e-06 2.406875e-04 -1.000000e+00 outer loop vertex 3.012207e+01 3.135961e+00 2.899170e-04 vertex 1.424457e+01 1.318960e+00 0.000000e+00 vertex 2.902246e+01 3.259960e+00 3.299713e-04 endloop endfacet facet normal 4.411311e-05 2.044421e-04 -1.000000e+00 outer loop vertex 1.183417e+01 1.071960e+00 4.692078e-04 vertex 1.055579e+01 9.559600e-01 3.890991e-04 vertex 1.120618e+01 3.259960e+00 8.888245e-04 endloop endfacet facet normal -1.420607e-04 2.094039e-05 -1.000000e+00 outer loop vertex 1.424457e+01 1.318960e+00 0.000000e+00 vertex 1.289252e+01 1.163960e+00 1.888275e-04 vertex 1.320148e+01 3.259960e+00 1.888275e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 9.893677e+00 3.259960e+00 7.806480e+00 vertex 1.224518e+01 3.259960e+00 2.803802e-04 vertex 1.195227e+01 3.259960e+00 3.051758e-05 endloop endfacet facet normal -0.000000e+00 -1.000000e+00 0.000000e+00 outer loop vertex 1.224518e+01 3.259960e+00 2.803802e-04 vertex 1.226947e+01 3.259960e+00 9.002686e-04 vertex 1.195227e+01 3.259960e+00 3.051758e-05 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.226947e+01 3.259960e+00 9.002686e-04 vertex 1.231287e+01 3.259960e+00 8.602142e-04 vertex 1.195227e+01 3.259960e+00 3.051758e-05 endloop endfacet facet normal 2.300899e-03 -3.246948e-04 -9.999973e-01 outer loop vertex 1.231287e+01 3.259960e+00 8.602142e-04 vertex 1.183417e+01 1.071960e+00 4.692078e-04 vertex 1.195227e+01 3.259960e+00 3.051758e-05 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.257062e+01 3.259960e+00 8.513611e+00 vertex 1.243707e+01 3.259960e+00 5.702972e-04 vertex 1.231287e+01 3.259960e+00 8.602142e-04 endloop endfacet facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 outer loop vertex 1.243707e+01 3.259960e+00 5.702972e-04 vertex 1.251300e+01 3.259960e+00 1.029968e-03 vertex 1.231287e+01 3.259960e+00 8.602142e-04 endloop endfacet facet normal 8.482003e-04 5.548885e-04 -9.999995e-01 outer loop vertex 1.251300e+01 3.259960e+00 1.029968e-03 vertex 1.289252e+01 1.163960e+00 1.888275e-04 vertex 1.231287e+01 3.259960e+00 8.602142e-04 endloop endfacet facet normal -2.858938e-04 2.412538e-04 -9.999999e-01 outer loop vertex 1.289252e+01 1.163960e+00 1.888275e-04 vertex 1.183417e+01 1.071960e+00 4.692078e-04 vertex 1.231287e+01 3.259960e+00 8.602142e-04 endloop endfacet facet normal 2.325054e-04 3.264922e-03 -9.999947e-01 outer loop vertex 3.074341e+01 3.259960e+00 8.392334e-04 vertex 3.012207e+01 3.135961e+00 2.899170e-04 vertex 3.039886e+01 3.259960e+00 7.591248e-04 endloop endfacet facet normal -1.147689e-01 5.786616e-01 -8.074520e-01 outer loop vertex 3.074530e+01 3.259960e+00 5.702972e-04 vertex 3.012207e+01 3.135961e+00 2.899170e-04 vertex 3.074341e+01 3.259960e+00 8.392334e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.084106e+01 3.259960e+00 6.972908e+00 vertex 3.123108e+01 3.259960e+00 9.593964e-04 vertex 3.074530e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.123108e+01 3.259960e+00 9.593964e-04 vertex 3.123309e+01 3.259960e+00 6.790161e-04 vertex 3.074530e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal 2.209770e-04 1.303691e-01 -9.914656e-01 outer loop vertex 3.123309e+01 3.259960e+00 6.790161e-04 vertex 3.124109e+01 3.258960e+00 5.493164e-04 vertex 3.074530e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal -3.737873e-05 2.449000e-03 -9.999970e-01 outer loop vertex 3.124109e+01 3.258960e+00 5.493164e-04 vertex 3.012207e+01 3.135961e+00 2.899170e-04 vertex 3.074530e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal -1.221741e-03 1.800902e-04 -9.999993e-01 outer loop vertex 1.251300e+01 3.259960e+00 1.029968e-03 vertex 1.320148e+01 3.259960e+00 1.888275e-04 vertex 1.289252e+01 1.163960e+00 1.888275e-04 endloop endfacet facet normal 8.921304e-06 1.020779e-04 -1.000000e+00 outer loop vertex 1.320148e+01 3.259960e+00 1.888275e-04 vertex 2.902246e+01 3.259960e+00 3.299713e-04 vertex 1.424457e+01 1.318960e+00 0.000000e+00 endloop endfacet facet normal -1.150400e-03 -1.384022e-04 -9.999993e-01 outer loop vertex 1.120618e+01 3.259960e+00 8.888245e-04 vertex 1.195227e+01 3.259960e+00 3.051758e-05 vertex 1.183417e+01 1.071960e+00 4.692078e-04 endloop endfacet facet normal 3.117918e-04 3.087940e-03 -9.999952e-01 outer loop vertex 2.902246e+01 3.259960e+00 3.299713e-04 vertex 3.039886e+01 3.259960e+00 7.591248e-04 vertex 3.012207e+01 3.135961e+00 2.899170e-04 endloop endfacet facet normal 1.091442e-01 -9.939207e-01 -1.446094e-02 outer loop vertex 3.382806e+01 3.257960e+00 1.958613e+01 vertex 2.614227e+01 2.413960e+00 1.958678e+01 vertex 3.012207e+01 3.135961e+00 2.899170e-04 endloop endfacet facet normal 1.092513e-01 -9.939086e-01 -1.448128e-02 outer loop vertex 3.382806e+01 3.257960e+00 1.958613e+01 vertex 3.012207e+01 3.135961e+00 2.899170e-04 vertex 3.124109e+01 3.258960e+00 5.493164e-04 endloop endfacet facet normal 1.136865e-01 -9.934247e-01 -1.351970e-02 outer loop vertex 1.424457e+01 1.318960e+00 0.000000e+00 vertex 3.012207e+01 3.135961e+00 2.899170e-04 vertex 2.614227e+01 2.413960e+00 1.958678e+01 endloop endfacet facet normal 1.138824e-01 -9.934020e-01 -1.353652e-02 outer loop vertex 1.424457e+01 1.318960e+00 0.000000e+00 vertex 1.685187e+01 1.350960e+00 1.958677e+01 vertex 1.289252e+01 1.163960e+00 1.888275e-04 endloop endfacet facet normal 1.136671e-01 -9.934271e-01 -1.350783e-02 outer loop vertex 2.614227e+01 2.413960e+00 1.958678e+01 vertex 1.685187e+01 1.350960e+00 1.958677e+01 vertex 1.424457e+01 1.318960e+00 0.000000e+00 endloop endfacet facet normal 8.674356e-02 -9.961983e-01 -8.031834e-03 outer loop vertex 1.685187e+01 1.350960e+00 1.958677e+01 vertex 9.582214e+00 7.179599e-01 1.958651e+01 vertex 1.183417e+01 1.071960e+00 4.692078e-04 endloop endfacet facet normal 8.659635e-02 -9.962114e-01 -7.993936e-03 outer loop vertex 1.685187e+01 1.350960e+00 1.958677e+01 vertex 1.183417e+01 1.071960e+00 4.692078e-04 vertex 1.289252e+01 1.163960e+00 1.888275e-04 endloop endfacet facet normal 9.036628e-02 -9.958795e-01 -7.609543e-03 outer loop vertex 9.582214e+00 7.179599e-01 1.958651e+01 vertex 1.055579e+01 9.559600e-01 3.890991e-04 vertex 1.183417e+01 1.071960e+00 4.692078e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.123309e+01 3.259960e+00 6.790161e-04 vertex 3.123108e+01 3.259960e+00 9.593964e-04 vertex 3.381091e+01 3.259960e+00 1.958652e+01 endloop endfacet facet normal 1.154614e-01 9.931957e-01 -1.519662e-02 outer loop vertex 3.123309e+01 3.259960e+00 6.790161e-04 vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.382806e+01 3.257960e+00 1.958613e+01 endloop endfacet facet normal 1.238161e-01 9.921712e-01 -1.630368e-02 outer loop vertex 3.124109e+01 3.258960e+00 5.493164e-04 vertex 3.123309e+01 3.259960e+00 6.790161e-04 vertex 3.382806e+01 3.257960e+00 1.958613e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.902246e+01 3.259960e+00 3.299713e-04 vertex 1.320148e+01 3.259960e+00 1.888275e-04 vertex 2.087518e+01 3.259960e+00 2.019086e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.434497e+01 3.259960e+00 2.386200e+01 vertex 1.512030e+01 3.259960e+00 2.019086e+01 vertex 1.251300e+01 3.259960e+00 1.029968e-03 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.385358e+01 3.259960e+00 2.019111e+01 vertex 1.434497e+01 3.259960e+00 2.386200e+01 vertex 1.251300e+01 3.259960e+00 1.029968e-03 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.385358e+01 3.259960e+00 2.019111e+01 vertex 1.251300e+01 3.259960e+00 1.029968e-03 vertex 1.243707e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.369562e+01 3.259960e+00 1.916494e+01 vertex 1.385358e+01 3.259960e+00 2.019111e+01 vertex 1.243707e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.324200e+01 3.259960e+00 1.916406e+01 vertex 1.369562e+01 3.259960e+00 1.916494e+01 vertex 1.243707e+01 3.259960e+00 5.702972e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.324200e+01 3.259960e+00 1.916406e+01 vertex 1.243707e+01 3.259960e+00 5.702972e-04 vertex 1.257062e+01 3.259960e+00 8.513611e+00 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.324200e+01 3.259960e+00 1.916406e+01 vertex 1.257062e+01 3.259960e+00 8.513611e+00 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 vertex 1.324200e+01 3.259960e+00 1.916406e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.257062e+01 3.259960e+00 8.513611e+00 vertex 1.231287e+01 3.259960e+00 8.602142e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.324200e+01 3.259960e+00 1.916406e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 vertex 1.326251e+01 3.259960e+00 1.916437e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.231287e+01 3.259960e+00 8.602142e-04 vertex 1.226947e+01 3.259960e+00 9.002686e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.788867e+01 3.259960e+00 1.749902e+01 vertex 3.027057e+01 3.259960e+00 1.706041e+01 vertex 3.074341e+01 3.259960e+00 8.392334e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.788867e+01 3.259960e+00 1.749902e+01 vertex 3.074341e+01 3.259960e+00 8.392334e-04 vertex 3.039886e+01 3.259960e+00 7.591248e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.084106e+01 3.259960e+00 6.972908e+00 vertex 3.074341e+01 3.259960e+00 8.392334e-04 vertex 3.027057e+01 3.259960e+00 1.706041e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.251300e+01 3.259960e+00 2.915182e+01 vertex 1.256451e+01 3.259960e+00 1.916436e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.224518e+01 3.259960e+00 2.803802e-04 vertex 9.893677e+00 3.259960e+00 7.806480e+00 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.256451e+01 3.259960e+00 1.916436e+01 vertex 1.286029e+01 3.259960e+00 1.916418e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 1.226947e+01 3.259960e+00 9.002686e-04 vertex 1.224518e+01 3.259960e+00 2.803802e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.046387e+01 3.259960e+00 1.918039e+01 vertex 3.046429e+01 3.259960e+00 1.918336e+01 vertex 3.103076e+01 3.259960e+00 1.918351e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.046429e+01 3.259960e+00 1.918336e+01 vertex 3.093628e+01 3.259960e+00 2.561122e+01 vertex 3.103076e+01 3.259960e+00 1.918351e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027057e+01 3.259960e+00 1.706041e+01 vertex 3.103076e+01 3.259960e+00 1.918351e+01 vertex 3.084106e+01 3.259960e+00 6.972908e+00 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 3.074530e+01 3.259960e+00 5.702972e-04 vertex 3.074341e+01 3.259960e+00 8.392334e-04 vertex 3.084106e+01 3.259960e+00 6.972908e+00 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.103076e+01 3.259960e+00 1.918351e+01 vertex 3.381091e+01 3.259960e+00 1.958652e+01 vertex 3.123108e+01 3.259960e+00 9.593964e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.103076e+01 3.259960e+00 1.918351e+01 vertex 3.123108e+01 3.259960e+00 9.593964e-04 vertex 3.084106e+01 3.259960e+00 6.972908e+00 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 8.429504e+00 3.259960e+00 1.582182e+01 vertex 1.208087e+01 3.259960e+00 1.440757e+01 vertex 9.893677e+00 3.259960e+00 7.806480e+00 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.052673e+00 3.259960e+00 7.490189e+00 vertex 9.893677e+00 3.259960e+00 7.806480e+00 vertex 1.195227e+01 3.259960e+00 3.051758e-05 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.512030e+01 3.259960e+00 2.019086e+01 vertex 2.087518e+01 3.259960e+00 2.019086e+01 vertex 1.320148e+01 3.259960e+00 1.888275e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.512030e+01 3.259960e+00 2.019086e+01 vertex 1.320148e+01 3.259960e+00 1.888275e-04 vertex 1.251300e+01 3.259960e+00 1.029968e-03 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027057e+01 3.259960e+00 1.706041e+01 vertex 3.046387e+01 3.259960e+00 1.918039e+01 vertex 3.103076e+01 3.259960e+00 1.918351e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.052673e+00 3.259960e+00 7.490189e+00 vertex 8.429504e+00 3.259960e+00 1.582182e+01 vertex 9.893677e+00 3.259960e+00 7.806480e+00 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.052673e+00 3.259960e+00 7.490189e+00 vertex 1.195227e+01 3.259960e+00 3.051758e-05 vertex 1.120618e+01 3.259960e+00 8.888245e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.902246e+01 3.259960e+00 3.299713e-04 vertex 2.788867e+01 3.259960e+00 1.749902e+01 vertex 3.039886e+01 3.259960e+00 7.591248e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.087518e+01 3.259960e+00 2.019086e+01 vertex 2.788867e+01 3.259960e+00 1.749902e+01 vertex 2.902246e+01 3.259960e+00 3.299713e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 3.027057e+01 3.259960e+00 1.706041e+01 vertex 3.046216e+01 3.259960e+00 1.917558e+01 vertex 3.046387e+01 3.259960e+00 1.918039e+01 endloop endfacet facet normal -9.903807e-01 7.379727e-03 1.381722e-01 outer loop vertex 2.482861e+01 3.257960e+00 1.766647e+02 vertex 2.482861e+01 3.259960e+00 1.766646e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -9.902667e-01 -2.824042e-05 1.391826e-01 outer loop vertex 2.482861e+01 3.259960e+00 1.766646e+02 vertex 2.435309e+01 3.259960e+00 1.732813e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -9.902659e-01 -5.628790e-05 1.391881e-01 outer loop vertex 2.435309e+01 3.259960e+00 1.732813e+02 vertex 2.405042e+01 3.259960e+00 1.711279e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -9.902735e-01 1.404199e-04 1.391344e-01 outer loop vertex 2.405042e+01 3.259960e+00 1.711279e+02 vertex 2.368750e+01 3.259960e+00 1.685449e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -9.902660e-01 3.648982e-05 1.391880e-01 outer loop vertex 2.368750e+01 3.259960e+00 1.685449e+02 vertex 2.333941e+01 3.259960e+00 1.660684e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -9.902673e-01 3.921458e-05 1.391784e-01 outer loop vertex 2.333941e+01 3.259960e+00 1.660684e+02 vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -6.252236e-03 -9.999802e-01 8.786992e-04 outer loop vertex 2.333337e+01 3.259960e+00 1.660257e+02 vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.333941e+01 3.259960e+00 1.660684e+02 endloop endfacet facet normal 0.000000e+00 -1.000000e+00 -0.000000e+00 outer loop vertex 2.333069e+01 3.259960e+00 1.660068e+02 vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.333337e+01 3.259960e+00 1.660257e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.273291e+01 3.259960e+00 1.589459e+02 vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.333069e+01 3.259960e+00 1.660068e+02 endloop endfacet facet normal -9.902684e-01 2.040887e-05 1.391703e-01 outer loop vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.166638e+01 3.259960e+00 1.541644e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 endloop endfacet facet normal -9.902681e-01 2.067051e-05 1.391729e-01 outer loop vertex 2.166638e+01 3.259960e+00 1.541644e+02 vertex 2.083136e+01 3.259960e+00 1.482229e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 endloop endfacet facet normal -9.902686e-01 8.736492e-06 1.391696e-01 outer loop vertex 2.083136e+01 3.259960e+00 1.482229e+02 vertex 2.035321e+01 3.259960e+00 1.448206e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 endloop endfacet facet normal -9.902678e-01 4.193096e-05 1.391756e-01 outer loop vertex 2.035321e+01 3.259960e+00 1.448206e+02 vertex 1.943536e+01 3.259960e+00 1.382899e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 endloop endfacet facet normal -9.902681e-01 3.235506e-06 1.391733e-01 outer loop vertex 1.943536e+01 3.259960e+00 1.382899e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 0.000000e+00 0.000000e+00 3.890991e-04 endloop endfacet facet normal -9.902209e-01 -9.217175e-03 1.392039e-01 outer loop vertex 1.929657e+01 3.259960e+00 1.373026e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.943536e+01 3.259960e+00 1.382899e+02 endloop endfacet facet normal -9.902676e-01 1.663298e-03 1.391662e-01 outer loop vertex 1.850421e+01 3.259960e+00 1.316644e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.929657e+01 3.259960e+00 1.373026e+02 endloop endfacet facet normal -9.901671e-01 -1.370242e-02 1.392173e-01 outer loop vertex 1.837537e+01 3.259960e+00 1.307480e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.850421e+01 3.259960e+00 1.316644e+02 endloop endfacet facet normal -9.882792e-01 6.394136e-02 1.386204e-01 outer loop vertex 1.835626e+01 3.259960e+00 1.306118e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.837537e+01 3.259960e+00 1.307480e+02 endloop endfacet facet normal -9.902281e-01 -8.411893e-03 1.392035e-01 outer loop vertex 1.829376e+01 3.259960e+00 1.301672e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.835626e+01 3.259960e+00 1.306118e+02 endloop endfacet facet normal -9.901084e-01 1.856617e-02 1.390710e-01 outer loop vertex 1.828827e+01 3.259960e+00 1.301281e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.829376e+01 3.259960e+00 1.301672e+02 endloop endfacet facet normal -9.254720e-01 3.563422e-01 1.285378e-01 outer loop vertex 1.828796e+01 3.259960e+00 1.301259e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.828827e+01 3.259960e+00 1.301281e+02 endloop endfacet facet normal -7.179567e-01 -6.882967e-01 1.038554e-01 outer loop vertex 1.828656e+01 3.259960e+00 1.301162e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.828796e+01 3.259960e+00 1.301259e+02 endloop endfacet facet normal -2.306756e-01 9.726207e-01 2.824600e-02 outer loop vertex 1.828638e+01 3.259960e+00 1.301147e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.828656e+01 3.259960e+00 1.301162e+02 endloop endfacet facet normal -9.902682e-01 5.581940e-04 1.391707e-01 outer loop vertex 1.705981e+01 3.259960e+00 1.213871e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.828638e+01 3.259960e+00 1.301147e+02 endloop endfacet facet normal -9.902658e-01 -1.592846e-03 1.391802e-01 outer loop vertex 1.667950e+01 3.259960e+00 1.186812e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.705981e+01 3.259960e+00 1.213871e+02 endloop endfacet facet normal -9.902681e-01 1.065500e-03 1.391680e-01 outer loop vertex 1.640106e+01 3.259960e+00 1.166999e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.667950e+01 3.259960e+00 1.186812e+02 endloop endfacet facet normal -9.902660e-01 -1.463136e-03 1.391799e-01 outer loop vertex 1.615668e+01 3.259960e+00 1.149611e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.640106e+01 3.259960e+00 1.166999e+02 endloop endfacet facet normal -9.902672e-01 2.199181e-03 1.391622e-01 outer loop vertex 1.544586e+01 3.259960e+00 1.099030e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.615668e+01 3.259960e+00 1.149611e+02 endloop endfacet facet normal -4.075126e-01 -9.110993e-01 6.190065e-02 outer loop vertex 1.544568e+01 3.259960e+00 1.099018e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.544586e+01 3.259960e+00 1.099030e+02 endloop endfacet facet normal -9.873458e-01 7.747503e-02 1.383691e-01 outer loop vertex 1.544208e+01 3.259960e+00 1.098761e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.544568e+01 3.259960e+00 1.099018e+02 endloop endfacet facet normal -9.872432e-01 -7.739896e-02 1.391416e-01 outer loop vertex 1.544080e+01 3.259960e+00 1.098670e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.544208e+01 3.259960e+00 1.098761e+02 endloop endfacet facet normal -9.075870e-01 4.006636e-01 1.255174e-01 outer loop vertex 1.543842e+01 3.259960e+00 1.098498e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.544080e+01 3.259960e+00 1.098670e+02 endloop endfacet facet normal -9.892728e-01 -4.411891e-02 1.392582e-01 outer loop vertex 1.540771e+01 3.259960e+00 1.096317e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.543842e+01 3.259960e+00 1.098498e+02 endloop endfacet facet normal -9.902219e-01 -8.964713e-03 1.392125e-01 outer loop vertex 1.534210e+01 3.259960e+00 1.091650e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.540771e+01 3.259960e+00 1.096317e+02 endloop endfacet facet normal -9.902683e-01 3.965320e-04 1.391712e-01 outer loop vertex 1.482172e+01 3.259960e+00 1.054622e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.534210e+01 3.259960e+00 1.091650e+02 endloop endfacet facet normal -9.902683e-01 4.781638e-04 1.391707e-01 outer loop vertex 1.459302e+01 3.259960e+00 1.038349e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.482172e+01 3.259960e+00 1.054622e+02 endloop endfacet facet normal -9.902670e-01 -9.091157e-04 1.391780e-01 outer loop vertex 1.423737e+01 3.259960e+00 1.013044e+02 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.459302e+01 3.259960e+00 1.038349e+02 endloop endfacet facet normal -9.902679e-01 1.771181e-03 1.391634e-01 outer loop vertex 1.377460e+01 3.259960e+00 9.801141e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.423737e+01 3.259960e+00 1.013044e+02 endloop endfacet facet normal -9.902480e-01 7.205426e-03 1.391296e-01 outer loop vertex 1.361090e+01 3.259960e+00 9.684631e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.377460e+01 3.259960e+00 9.801141e+01 endloop endfacet facet normal -9.894488e-01 -3.987024e-02 1.392887e-01 outer loop vertex 1.354108e+01 3.259960e+00 9.635031e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.361090e+01 3.259960e+00 9.684631e+01 endloop endfacet facet normal -9.900138e-01 2.348255e-02 1.390010e-01 outer loop vertex 1.342010e+01 3.259960e+00 9.548871e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.354108e+01 3.259960e+00 9.635031e+01 endloop endfacet facet normal -9.902520e-01 -4.928057e-03 1.392006e-01 outer loop vertex 1.300476e+01 3.259960e+00 9.253401e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.342010e+01 3.259960e+00 9.548871e+01 endloop endfacet facet normal -9.896960e-01 3.483482e-02 1.388825e-01 outer loop vertex 1.299811e+01 3.259960e+00 9.248660e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.300476e+01 3.259960e+00 9.253401e+01 endloop endfacet facet normal -9.900035e-01 -2.228796e-02 1.392706e-01 outer loop vertex 1.299487e+01 3.259960e+00 9.246361e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.299811e+01 3.259960e+00 9.248660e+01 endloop endfacet facet normal -9.879793e-01 -6.711599e-02 1.392567e-01 outer loop vertex 1.298859e+01 3.259960e+00 9.241901e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.299487e+01 3.259960e+00 9.246361e+01 endloop endfacet facet normal -9.902181e-01 1.091818e-02 1.391000e-01 outer loop vertex 1.295197e+01 3.259960e+00 9.215831e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.298859e+01 3.259960e+00 9.241901e+01 endloop endfacet facet normal -9.902648e-01 3.540324e-03 1.391513e-01 outer loop vertex 1.247742e+01 3.259960e+00 8.878120e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.295197e+01 3.259960e+00 9.215831e+01 endloop endfacet facet normal -9.902241e-01 -8.576763e-03 1.392217e-01 outer loop vertex 1.237616e+01 3.259960e+00 8.806100e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.247742e+01 3.259960e+00 8.878120e+01 endloop endfacet facet normal -9.902408e-01 -6.579804e-03 1.392114e-01 outer loop vertex 1.225769e+01 3.259960e+00 8.721831e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.237616e+01 3.259960e+00 8.806100e+01 endloop endfacet facet normal -9.902545e-01 -4.431469e-03 1.391996e-01 outer loop vertex 1.194788e+01 3.259960e+00 8.501431e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.225769e+01 3.259960e+00 8.721831e+01 endloop endfacet facet normal -9.902683e-01 1.119882e-04 1.391717e-01 outer loop vertex 9.706177e+00 3.259960e+00 6.906363e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.194788e+01 3.259960e+00 8.501431e+01 endloop endfacet facet normal -9.902687e-01 1.473091e-03 1.391608e-01 outer loop vertex 8.646301e+00 3.259960e+00 6.152155e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 9.706177e+00 3.259960e+00 6.906363e+01 endloop endfacet facet normal -9.902686e-01 8.992685e-04 1.391660e-01 outer loop vertex 7.896606e+00 3.259960e+00 5.618692e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 8.646301e+00 3.259960e+00 6.152155e+01 endloop endfacet facet normal -9.902050e-01 -9.961613e-03 1.392649e-01 outer loop vertex 7.728271e+00 3.259960e+00 5.499002e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 7.896606e+00 3.259960e+00 5.618692e+01 endloop endfacet facet normal -9.902576e-01 6.217706e-03 1.391081e-01 outer loop vertex 7.624207e+00 3.259960e+00 5.424922e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 7.728271e+00 3.259960e+00 5.499002e+01 endloop endfacet facet normal -9.902665e-01 -8.164262e-04 1.391817e-01 outer loop vertex 6.327759e+00 3.259960e+00 4.502510e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 7.624207e+00 3.259960e+00 5.424922e+01 endloop endfacet facet normal -9.902685e-01 1.362075e-04 1.391702e-01 outer loop vertex 5.050171e+00 3.259960e+00 3.593439e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 6.327759e+00 3.259960e+00 4.502510e+01 endloop endfacet facet normal -9.902681e-01 -8.922103e-05 1.391736e-01 outer loop vertex 3.547363e+00 3.259960e+00 2.524140e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 5.050171e+00 3.259960e+00 3.593439e+01 endloop endfacet facet normal -9.902689e-01 1.869022e-04 1.391676e-01 outer loop vertex 2.290710e+00 3.259960e+00 1.629949e+01 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 3.547363e+00 3.259960e+00 2.524140e+01 endloop endfacet facet normal -9.902685e-01 1.190524e-04 1.391699e-01 outer loop vertex 1.052673e+00 3.259960e+00 7.490189e+00 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 2.290710e+00 3.259960e+00 1.629949e+01 endloop endfacet facet normal -9.902682e-01 8.353571e-05 1.391725e-01 outer loop vertex 6.103516e-05 3.259960e+00 4.291534e-04 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.052673e+00 3.259960e+00 7.490189e+00 endloop endfacet facet normal -9.902675e-01 0.000000e+00 1.391775e-01 outer loop vertex 2.327948e+01 1.732855e+00 1.656424e+02 vertex 2.482861e+01 3.023743e+00 1.766647e+02 vertex 2.482861e+01 3.257960e+00 1.766647e+02 endloop endfacet facet normal -9.689869e-01 2.068884e-01 1.351352e-01 outer loop vertex 2.752686e+00 9.932685e-02 1.958651e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 2.321960e+00 8.375192e-02 1.652183e+01 endloop endfacet facet normal -9.817632e-01 -1.300736e-01 1.386428e-01 outer loop vertex 4.905884e+00 1.772850e-01 3.490736e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 2.752686e+00 9.932685e-02 1.958651e+01 endloop endfacet facet normal -9.902682e-01 7.396636e-04 1.391702e-01 outer loop vertex 5.974182e+00 2.340319e-01 4.250856e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 4.905884e+00 1.772850e-01 3.490736e+01 endloop endfacet facet normal -9.902298e-01 -8.039952e-03 1.392131e-01 outer loop vertex 6.292786e+00 2.533290e-01 4.477591e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 5.974182e+00 2.340319e-01 4.250856e+01 endloop endfacet facet normal -9.902683e-01 8.695701e-04 1.391682e-01 outer loop vertex 7.119568e+00 3.035910e-01 5.065867e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 6.292786e+00 2.533290e-01 4.477591e+01 endloop endfacet facet normal -9.902639e-01 -2.180659e-03 1.391858e-01 outer loop vertex 9.076965e+00 4.152379e-01 6.458670e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 7.119568e+00 3.035910e-01 5.065867e+01 endloop endfacet facet normal -9.902326e-01 9.421946e-03 1.391068e-01 outer loop vertex 1.053320e+01 4.983230e-01 7.494731e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 9.076965e+00 4.152379e-01 6.458670e+01 endloop endfacet facet normal -9.902516e-01 -4.881374e-03 1.392047e-01 outer loop vertex 1.217987e+01 5.923378e-01 8.666441e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.053320e+01 4.983230e-01 7.494731e+01 endloop endfacet facet normal -9.902679e-01 -1.088068e-04 1.391742e-01 outer loop vertex 1.523792e+01 7.955410e-01 1.084235e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.217987e+01 5.923378e-01 8.666441e+01 endloop endfacet facet normal -9.902322e-01 -7.536674e-03 1.392238e-01 outer loop vertex 1.528271e+01 7.985361e-01 1.087423e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.523792e+01 7.955410e-01 1.084235e+02 endloop endfacet facet normal -9.902385e-01 9.855493e-03 1.390343e-01 outer loop vertex 1.535437e+01 8.033020e-01 1.092523e+02 vertex 1.838556e+01 1.095742e+00 1.308205e+02 vertex 1.528271e+01 7.985361e-01 1.087423e+02 endloop endfacet facet normal -9.902676e-01 -3.765097e-04 1.391761e-01 outer loop vertex 1.838556e+01 1.095742e+00 1.308205e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.528271e+01 7.985361e-01 1.087423e+02 endloop endfacet facet normal -9.902672e-01 -6.323961e-04 1.391782e-01 outer loop vertex 2.036926e+01 1.304197e+00 1.449357e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.838556e+01 1.095742e+00 1.308205e+02 endloop endfacet facet normal -9.902688e-01 7.126352e-04 1.391663e-01 outer loop vertex 2.160699e+01 1.491700e+00 1.537421e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 2.036926e+01 1.304197e+00 1.449357e+02 endloop endfacet facet normal -9.902681e-01 -2.720468e-05 1.391734e-01 outer loop vertex 2.169189e+01 1.504561e+00 1.543462e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 2.160699e+01 1.491700e+00 1.537421e+02 endloop endfacet facet normal -9.902681e-01 1.390820e-05 1.391735e-01 outer loop vertex 2.327948e+01 1.732855e+00 1.656424e+02 vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 endloop endfacet facet normal -9.902675e-01 0.000000e+00 1.391774e-01 outer loop vertex 2.482861e+01 2.042346e+00 1.766647e+02 vertex 2.482861e+01 3.023743e+00 1.766647e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal -9.902681e-01 1.771680e-05 1.391730e-01 outer loop vertex 1.943536e+01 3.259960e+00 1.382899e+02 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 2.169189e+01 1.504561e+00 1.543462e+02 endloop endfacet facet normal 9.021014e-02 -9.958937e-01 -7.610695e-03 outer loop vertex 4.905884e+00 1.772850e-01 3.490736e+01 vertex 2.752686e+00 9.932685e-02 1.958651e+01 vertex 9.582214e+00 7.179599e-01 1.958651e+01 endloop endfacet facet normal 9.021018e-02 -9.958936e-01 -7.610675e-03 outer loop vertex 4.905884e+00 1.772850e-01 3.490736e+01 vertex 9.582214e+00 7.179599e-01 1.958651e+01 vertex 6.945618e+00 3.039598e-01 4.250853e+01 endloop endfacet facet normal 7.179803e-02 -9.974157e-01 -2.644506e-03 outer loop vertex 5.974182e+00 2.340319e-01 4.250856e+01 vertex 4.905884e+00 1.772850e-01 3.490736e+01 vertex 6.945618e+00 3.039598e-01 4.250853e+01 endloop endfacet facet normal 6.749024e-02 -9.977188e-01 -1.480241e-03 outer loop vertex 1.879730e+01 1.039960e+00 8.666481e+01 vertex 1.053320e+01 4.983230e-01 7.494731e+01 vertex 1.287286e+01 6.719599e-01 6.458647e+01 endloop endfacet facet normal 6.748866e-02 -9.977189e-01 -1.479116e-03 outer loop vertex 1.217987e+01 5.923378e-01 8.666441e+01 vertex 1.053320e+01 4.983230e-01 7.494731e+01 vertex 1.879730e+01 1.039960e+00 8.666481e+01 endloop endfacet facet normal 6.767082e-02 -9.977077e-01 -1.841316e-04 outer loop vertex 1.535437e+01 8.033020e-01 1.092523e+02 vertex 1.528271e+01 7.985361e-01 1.087423e+02 vertex 2.064087e+01 1.161960e+00 1.087421e+02 endloop endfacet facet normal 6.767067e-02 -9.977078e-01 -1.858364e-04 outer loop vertex 1.535437e+01 8.033020e-01 1.092523e+02 vertex 2.064087e+01 1.161960e+00 1.087421e+02 vertex 2.248547e+01 1.282960e+00 1.308202e+02 endloop endfacet facet normal 4.561568e-02 -9.989336e-01 7.133577e-03 outer loop vertex 1.838556e+01 1.095742e+00 1.308205e+02 vertex 1.535437e+01 8.033020e-01 1.092523e+02 vertex 2.248547e+01 1.282960e+00 1.308202e+02 endloop endfacet facet normal 4.546246e-02 -9.929230e-01 1.097141e-01 outer loop vertex 2.759039e+01 1.707960e+00 1.537428e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 vertex 2.379041e+01 1.533960e+00 1.537427e+02 endloop endfacet facet normal 4.901916e-04 -9.996078e-01 2.799870e-02 outer loop vertex 2.482861e+01 2.042346e+00 1.766647e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 vertex 2.814886e+01 2.043960e+00 1.766642e+02 endloop endfacet facet normal 1.516572e-04 -0.000000e+00 1.000000e+00 outer loop vertex 2.814886e+01 2.043960e+00 1.766642e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 vertex 2.482861e+01 3.257960e+00 1.766647e+02 endloop endfacet facet normal 1.516572e-04 0.000000e+00 1.000000e+00 outer loop vertex 2.814886e+01 2.043960e+00 1.766642e+02 vertex 2.482861e+01 3.257960e+00 1.766647e+02 vertex 2.482861e+01 3.023743e+00 1.766647e+02 endloop endfacet facet normal 1.516572e-04 0.000000e+00 1.000000e+00 outer loop vertex 2.482861e+01 3.023743e+00 1.766647e+02 vertex 2.482861e+01 2.042346e+00 1.766647e+02 vertex 2.814886e+01 2.043960e+00 1.766642e+02 endloop endfacet facet normal 4.567013e-02 -9.989217e-01 8.349814e-03 outer loop vertex 2.248547e+01 1.282960e+00 1.308202e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 vertex 2.036926e+01 1.304197e+00 1.449357e+02 endloop endfacet facet normal 4.561533e-02 -9.989243e-01 8.341603e-03 outer loop vertex 2.248547e+01 1.282960e+00 1.308202e+02 vertex 2.036926e+01 1.304197e+00 1.449357e+02 vertex 1.838556e+01 1.095742e+00 1.308205e+02 endloop endfacet facet normal 3.600503e-02 -9.992369e-01 1.513418e-02 outer loop vertex 2.169189e+01 1.504561e+00 1.543462e+02 vertex 2.759039e+01 1.707960e+00 1.537428e+02 vertex 2.327948e+01 1.732855e+00 1.656424e+02 endloop endfacet facet normal 1.934305e-02 -9.996406e-01 1.856357e-02 outer loop vertex 2.379041e+01 1.533960e+00 1.537427e+02 vertex 2.169189e+01 1.504561e+00 1.543462e+02 vertex 2.160699e+01 1.491700e+00 1.537421e+02 endloop endfacet facet normal 1.934305e-02 -9.996405e-01 1.856538e-02 outer loop vertex 2.160699e+01 1.491700e+00 1.537421e+02 vertex 2.036926e+01 1.304197e+00 1.449357e+02 vertex 2.379041e+01 1.533960e+00 1.537427e+02 endloop endfacet facet normal 6.748866e-02 -9.977200e-01 -1.674427e-04 outer loop vertex 1.523792e+01 7.955410e-01 1.084235e+02 vertex 1.217987e+01 5.923378e-01 8.666441e+01 vertex 1.879730e+01 1.039960e+00 8.666481e+01 endloop endfacet facet normal 7.179821e-02 -9.974179e-01 -1.600042e-03 outer loop vertex 6.292786e+00 2.533290e-01 4.477591e+01 vertex 5.974182e+00 2.340319e-01 4.250856e+01 vertex 6.945618e+00 3.039598e-01 4.250853e+01 endloop endfacet facet normal 6.747710e-02 -9.977197e-01 -1.483224e-03 outer loop vertex 1.053320e+01 4.983230e-01 7.494731e+01 vertex 9.076965e+00 4.152379e-01 6.458670e+01 vertex 1.287286e+01 6.719599e-01 6.458647e+01 endloop endfacet facet normal 6.767438e-02 -9.977075e-01 -1.369213e-04 outer loop vertex 1.528271e+01 7.985361e-01 1.087423e+02 vertex 1.523792e+01 7.955410e-01 1.084235e+02 vertex 1.879730e+01 1.039960e+00 8.666481e+01 endloop endfacet facet normal 6.767082e-02 -9.977077e-01 -1.374892e-04 outer loop vertex 1.528271e+01 7.985361e-01 1.087423e+02 vertex 1.879730e+01 1.039960e+00 8.666481e+01 vertex 2.064087e+01 1.161960e+00 1.087421e+02 endloop endfacet facet normal 6.747711e-02 -9.977197e-01 -1.485293e-03 outer loop vertex 7.119568e+00 3.035910e-01 5.065867e+01 vertex 1.287286e+01 6.719599e-01 6.458647e+01 vertex 9.076965e+00 4.152379e-01 6.458670e+01 endloop endfacet facet normal 6.747720e-02 -9.977197e-01 -1.485332e-03 outer loop vertex 6.945618e+00 3.039598e-01 4.250853e+01 vertex 1.287286e+01 6.719599e-01 6.458647e+01 vertex 7.119568e+00 3.035910e-01 5.065867e+01 endloop endfacet facet normal 7.187058e-02 -9.974127e-01 -1.579087e-03 outer loop vertex 7.119568e+00 3.035910e-01 5.065867e+01 vertex 6.292786e+00 2.533290e-01 4.477591e+01 vertex 6.945618e+00 3.039598e-01 4.250853e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.273291e+01 3.259960e+00 1.589459e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 endloop endfacet facet normal 7.338070e-05 1.000000e+00 -4.796207e-06 outer loop vertex 2.333337e+01 3.259960e+00 1.660257e+02 vertex 2.333941e+01 3.259960e+00 1.660684e+02 vertex 2.255811e+01 3.259960e+00 1.541643e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.435309e+01 3.259960e+00 1.732813e+02 vertex 2.482861e+01 3.259960e+00 1.766646e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.405042e+01 3.259960e+00 1.711279e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.520667e+01 3.259960e+00 1.533127e+02 endloop endfacet facet normal 1.514413e-04 5.333361e-02 9.985767e-01 outer loop vertex 2.482861e+01 3.259960e+00 1.766646e+02 vertex 2.482861e+01 3.257960e+00 1.766647e+02 vertex 2.814886e+01 3.257960e+00 1.766642e+02 endloop endfacet facet normal 1.197428e-04 4.239250e-04 9.999999e-01 outer loop vertex 2.814886e+01 3.257960e+00 1.766642e+02 vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.482861e+01 3.259960e+00 1.766646e+02 endloop endfacet facet normal 1.123631e-07 1.000000e+00 1.265346e-08 outer loop vertex 2.313147e+01 3.259960e+00 1.490728e+02 vertex 2.255811e+01 3.259960e+00 1.541643e+02 vertex 2.333941e+01 3.259960e+00 1.660684e+02 endloop endfacet facet normal -4.270987e-07 1.000000e+00 -3.624158e-08 outer loop vertex 2.407867e+01 3.259960e+00 1.573564e+02 vertex 2.333941e+01 3.259960e+00 1.660684e+02 vertex 2.368750e+01 3.259960e+00 1.685449e+02 endloop endfacet facet normal 1.444863e-07 1.000000e+00 1.226043e-08 outer loop vertex 2.407867e+01 3.259960e+00 1.573564e+02 vertex 2.313147e+01 3.259960e+00 1.490728e+02 vertex 2.333941e+01 3.259960e+00 1.660684e+02 endloop endfacet facet normal 1.214458e-07 1.000000e+00 -1.706326e-08 outer loop vertex 2.407867e+01 3.259960e+00 1.573564e+02 vertex 2.368750e+01 3.259960e+00 1.685449e+02 vertex 2.405042e+01 3.259960e+00 1.711279e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.289960e+01 3.259960e+00 1.594247e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 vertex 2.273291e+01 3.259960e+00 1.589459e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.289960e+01 3.259960e+00 1.594247e+02 vertex 2.273291e+01 3.259960e+00 1.589459e+02 vertex 2.333069e+01 3.259960e+00 1.660068e+02 endloop endfacet facet normal -9.550816e-08 1.000000e+00 1.174675e-08 outer loop vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.361298e+01 3.259960e+00 7.718262e+01 vertex 1.300476e+01 3.259960e+00 9.253401e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.377460e+01 3.259960e+00 9.801141e+01 vertex 1.423737e+01 3.259960e+00 1.013044e+02 endloop endfacet facet normal 5.244101e-07 1.000000e+00 3.630764e-08 outer loop vertex 1.361298e+01 3.259960e+00 7.718262e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 vertex 1.300476e+01 3.259960e+00 9.253401e+01 endloop endfacet facet normal -2.739280e-07 1.000000e+00 -4.218510e-08 outer loop vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.300476e+01 3.259960e+00 9.253401e+01 vertex 1.342010e+01 3.259960e+00 9.548871e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.519098e+01 3.259960e+00 1.035705e+02 vertex 1.477911e+01 3.259960e+00 8.666402e+01 vertex 1.482172e+01 3.259960e+00 1.054622e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.519098e+01 3.259960e+00 1.035705e+02 vertex 1.482172e+01 3.259960e+00 1.054622e+02 vertex 1.534210e+01 3.259960e+00 1.091650e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.459302e+01 3.259960e+00 1.038349e+02 vertex 1.482172e+01 3.259960e+00 1.054622e+02 vertex 1.477911e+01 3.259960e+00 8.666402e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.361090e+01 3.259960e+00 9.684631e+01 vertex 1.377460e+01 3.259960e+00 9.801141e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.354108e+01 3.259960e+00 9.635031e+01 vertex 1.361090e+01 3.259960e+00 9.684631e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 9.706177e+00 3.259960e+00 6.906363e+01 vertex 1.194788e+01 3.259960e+00 8.501431e+01 vertex 1.290930e+01 3.259960e+00 8.658751e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 9.706177e+00 3.259960e+00 6.906363e+01 vertex 1.290930e+01 3.259960e+00 8.658751e+01 vertex 1.221771e+01 3.259960e+00 6.055888e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.295648e+01 3.259960e+00 8.666470e+01 vertex 1.290930e+01 3.259960e+00 8.658751e+01 vertex 1.225769e+01 3.259960e+00 8.721831e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.295648e+01 3.259960e+00 8.666470e+01 vertex 1.295197e+01 3.259960e+00 9.215831e+01 vertex 1.298859e+01 3.259960e+00 9.241901e+01 endloop endfacet facet normal 3.776113e-05 1.000000e+00 -2.699882e-07 outer loop vertex 1.299811e+01 3.259960e+00 9.248660e+01 vertex 1.300476e+01 3.259960e+00 9.253401e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.299487e+01 3.259960e+00 9.246361e+01 vertex 1.299811e+01 3.259960e+00 9.248660e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.194788e+01 3.259960e+00 8.501431e+01 vertex 1.225769e+01 3.259960e+00 8.721831e+01 vertex 1.290930e+01 3.259960e+00 8.658751e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 7.896606e+00 3.259960e+00 5.618692e+01 vertex 8.646301e+00 3.259960e+00 6.152155e+01 vertex 9.854675e+00 3.259960e+00 5.593446e+01 endloop endfacet facet normal 5.951800e-07 1.000000e+00 2.473651e-07 outer loop vertex 1.237616e+01 3.259960e+00 8.806100e+01 vertex 1.247742e+01 3.259960e+00 8.878120e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal -4.994891e-07 1.000000e+00 -4.106580e-10 outer loop vertex 1.247742e+01 3.259960e+00 8.878120e+01 vertex 1.295197e+01 3.259960e+00 9.215831e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal -2.754550e-07 1.000000e+00 -1.787770e-08 outer loop vertex 2.520667e+01 3.259960e+00 1.533127e+02 vertex 2.407867e+01 3.259960e+00 1.573564e+02 vertex 2.405042e+01 3.259960e+00 1.711279e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.814178e+01 3.259960e+00 1.766642e+02 vertex 2.405042e+01 3.259960e+00 1.711279e+02 vertex 2.435309e+01 3.259960e+00 1.732813e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255811e+01 3.259960e+00 1.541643e+02 vertex 2.289960e+01 3.259960e+00 1.594247e+02 vertex 2.333069e+01 3.259960e+00 1.660068e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255811e+01 3.259960e+00 1.541643e+02 vertex 2.333069e+01 3.259960e+00 1.660068e+02 vertex 2.333337e+01 3.259960e+00 1.660257e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.166638e+01 3.259960e+00 1.541644e+02 vertex 2.219476e+01 3.259960e+00 1.579241e+02 vertex 2.255292e+01 3.259960e+00 1.541640e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.828796e+01 3.259960e+00 1.301259e+02 vertex 1.829376e+01 3.259960e+00 1.301672e+02 vertex 1.835626e+01 3.259960e+00 1.306118e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.850421e+01 3.259960e+00 1.316644e+02 vertex 1.929657e+01 3.259960e+00 1.373026e+02 vertex 1.925891e+01 3.259960e+00 1.254678e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.705981e+01 3.259960e+00 1.213871e+02 vertex 1.828638e+01 3.259960e+00 1.301147e+02 vertex 1.733539e+01 3.259960e+00 1.091642e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.763190e+01 3.259960e+00 1.047938e+02 vertex 1.733636e+01 3.259960e+00 1.091641e+02 vertex 1.828796e+01 3.259960e+00 1.301259e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.829376e+01 3.259960e+00 1.301672e+02 vertex 1.828796e+01 3.259960e+00 1.301259e+02 vertex 1.828827e+01 3.259960e+00 1.301281e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.828656e+01 3.259960e+00 1.301162e+02 vertex 1.828796e+01 3.259960e+00 1.301259e+02 vertex 1.733636e+01 3.259960e+00 1.091641e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.733636e+01 3.259960e+00 1.091641e+02 vertex 1.733539e+01 3.259960e+00 1.091642e+02 vertex 1.828656e+01 3.259960e+00 1.301162e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.733539e+01 3.259960e+00 1.091642e+02 vertex 1.670502e+01 3.259960e+00 1.027130e+02 vertex 1.667950e+01 3.259960e+00 1.186812e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.733539e+01 3.259960e+00 1.091642e+02 vertex 1.828638e+01 3.259960e+00 1.301147e+02 vertex 1.828656e+01 3.259960e+00 1.301162e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.544208e+01 3.259960e+00 1.098761e+02 vertex 1.544586e+01 3.259960e+00 1.099030e+02 vertex 1.587061e+01 3.259960e+00 1.053373e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.540771e+01 3.259960e+00 1.096317e+02 vertex 1.543842e+01 3.259960e+00 1.098498e+02 vertex 1.519098e+01 3.259960e+00 1.035705e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.561078e+01 3.259960e+00 1.011122e+02 vertex 1.542181e+01 3.259960e+00 1.091645e+02 vertex 1.544208e+01 3.259960e+00 1.098761e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.544586e+01 3.259960e+00 1.099030e+02 vertex 1.544208e+01 3.259960e+00 1.098761e+02 vertex 1.544568e+01 3.259960e+00 1.099018e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.542181e+01 3.259960e+00 1.091645e+02 vertex 1.542902e+01 3.259960e+00 1.094730e+02 vertex 1.544080e+01 3.259960e+00 1.098670e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.542181e+01 3.259960e+00 1.091645e+02 vertex 1.544080e+01 3.259960e+00 1.098670e+02 vertex 1.544208e+01 3.259960e+00 1.098761e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.542902e+01 3.259960e+00 1.094730e+02 vertex 1.519098e+01 3.259960e+00 1.035705e+02 vertex 1.543842e+01 3.259960e+00 1.098498e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.542902e+01 3.259960e+00 1.094730e+02 vertex 1.543842e+01 3.259960e+00 1.098498e+02 vertex 1.544080e+01 3.259960e+00 1.098670e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.837537e+01 3.259960e+00 1.307480e+02 vertex 1.850421e+01 3.259960e+00 1.316644e+02 vertex 1.925891e+01 3.259960e+00 1.254678e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.837537e+01 3.259960e+00 1.307480e+02 vertex 1.925891e+01 3.259960e+00 1.254678e+02 vertex 1.861346e+01 3.259960e+00 1.176968e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 1.925891e+01 3.259960e+00 1.254678e+02 vertex 1.929657e+01 3.259960e+00 1.373026e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 1.943536e+01 3.259960e+00 1.382899e+02 vertex 2.035321e+01 3.259960e+00 1.448206e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.929657e+01 3.259960e+00 1.373026e+02 vertex 1.943536e+01 3.259960e+00 1.382899e+02 vertex 2.026886e+01 3.259960e+00 1.337147e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.423737e+01 3.259960e+00 1.013044e+02 vertex 1.459302e+01 3.259960e+00 1.038349e+02 vertex 1.477911e+01 3.259960e+00 8.666402e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255292e+01 3.259960e+00 1.541640e+02 vertex 2.026886e+01 3.259960e+00 1.337147e+02 vertex 2.083136e+01 3.259960e+00 1.482229e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.255292e+01 3.259960e+00 1.541640e+02 vertex 2.083136e+01 3.259960e+00 1.482229e+02 vertex 2.166638e+01 3.259960e+00 1.541644e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.035321e+01 3.259960e+00 1.448206e+02 vertex 2.083136e+01 3.259960e+00 1.482229e+02 vertex 2.026886e+01 3.259960e+00 1.337147e+02 endloop endfacet facet normal 7.430116e-07 1.000000e+00 1.187124e-09 outer loop vertex 1.670502e+01 3.259960e+00 1.027130e+02 vertex 1.637360e+01 3.259960e+00 1.093096e+02 vertex 1.667950e+01 3.259960e+00 1.186812e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.733539e+01 3.259960e+00 1.091642e+02 vertex 1.667950e+01 3.259960e+00 1.186812e+02 vertex 1.705981e+01 3.259960e+00 1.213871e+02 endloop endfacet facet normal -2.357928e-07 1.000000e+00 3.313731e-08 outer loop vertex 1.640106e+01 3.259960e+00 1.166999e+02 vertex 1.667950e+01 3.259960e+00 1.186812e+02 vertex 1.637360e+01 3.259960e+00 1.093096e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.342010e+01 3.259960e+00 9.548871e+01 vertex 1.354108e+01 3.259960e+00 9.635031e+01 vertex 1.477911e+01 3.259960e+00 8.666402e+01 endloop endfacet facet normal -2.732494e-07 1.000000e+00 -2.542017e-08 outer loop vertex 1.637360e+01 3.259960e+00 1.093096e+02 vertex 1.587061e+01 3.259960e+00 1.053373e+02 vertex 1.544586e+01 3.259960e+00 1.099030e+02 endloop endfacet facet normal -2.357717e-07 1.000000e+00 3.313723e-08 outer loop vertex 1.637360e+01 3.259960e+00 1.093096e+02 vertex 1.615668e+01 3.259960e+00 1.149611e+02 vertex 1.640106e+01 3.259960e+00 1.166999e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.587061e+01 3.259960e+00 1.053373e+02 vertex 1.561078e+01 3.259960e+00 1.011122e+02 vertex 1.544208e+01 3.259960e+00 1.098761e+02 endloop endfacet facet normal -2.357954e-07 1.000000e+00 3.313632e-08 outer loop vertex 1.637360e+01 3.259960e+00 1.093096e+02 vertex 1.544586e+01 3.259960e+00 1.099030e+02 vertex 1.615668e+01 3.259960e+00 1.149611e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.861346e+01 3.259960e+00 1.176968e+02 vertex 1.812646e+01 3.259960e+00 1.088228e+02 vertex 1.828796e+01 3.259960e+00 1.301259e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.861346e+01 3.259960e+00 1.176968e+02 vertex 1.835626e+01 3.259960e+00 1.306118e+02 vertex 1.837537e+01 3.259960e+00 1.307480e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 outer loop vertex 1.812646e+01 3.259960e+00 1.088228e+02 vertex 1.763190e+01 3.259960e+00 1.047938e+02 vertex 1.828796e+01 3.259960e+00 1.301259e+02 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.861346e+01 3.259960e+00 1.176968e+02 vertex 1.828796e+01 3.259960e+00 1.301259e+02 vertex 1.835626e+01 3.259960e+00 1.306118e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.534210e+01 3.259960e+00 1.091650e+02 vertex 1.540771e+01 3.259960e+00 1.096317e+02 vertex 1.519098e+01 3.259960e+00 1.035705e+02 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.298859e+01 3.259960e+00 9.241901e+01 vertex 1.299487e+01 3.259960e+00 9.246361e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 9.854675e+00 3.259960e+00 5.593446e+01 vertex 8.646301e+00 3.259960e+00 6.152155e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.221771e+01 3.259960e+00 6.055888e+01 vertex 8.646301e+00 3.259960e+00 6.152155e+01 vertex 9.706177e+00 3.259960e+00 6.906363e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 8.463074e+00 3.259960e+00 2.654071e+01 vertex 5.410767e+00 3.259960e+00 1.989366e+01 vertex 3.547363e+00 3.259960e+00 2.524140e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 8.463074e+00 3.259960e+00 2.654071e+01 vertex 3.547363e+00 3.259960e+00 2.524140e+01 vertex 5.050171e+00 3.259960e+00 3.593439e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 5.050171e+00 3.259960e+00 3.593439e+01 vertex 6.327759e+00 3.259960e+00 4.502510e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 2.290710e+00 3.259960e+00 1.629949e+01 vertex 3.547363e+00 3.259960e+00 2.524140e+01 vertex 5.410767e+00 3.259960e+00 1.989366e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.225769e+01 3.259960e+00 8.721831e+01 vertex 1.237616e+01 3.259960e+00 8.806100e+01 vertex 1.295648e+01 3.259960e+00 8.666470e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 6.327759e+00 3.259960e+00 4.502510e+01 vertex 7.624207e+00 3.259960e+00 5.424922e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 9.664185e+00 3.259960e+00 4.280404e+01 vertex 8.463074e+00 3.259960e+00 2.654071e+01 vertex 5.050171e+00 3.259960e+00 3.593439e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 9.664185e+00 3.259960e+00 4.280404e+01 vertex 7.624207e+00 3.259960e+00 5.424922e+01 vertex 7.728271e+00 3.259960e+00 5.499002e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 7.728271e+00 3.259960e+00 5.499002e+01 vertex 7.896606e+00 3.259960e+00 5.618692e+01 vertex 9.854675e+00 3.259960e+00 5.593446e+01 endloop endfacet facet normal -0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 7.728271e+00 3.259960e+00 5.499002e+01 vertex 9.854675e+00 3.259960e+00 5.593446e+01 vertex 9.664185e+00 3.259960e+00 4.280404e+01 endloop endfacet facet normal 1.982028e-06 -2.188571e-05 -1.000000e+00 outer loop vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.055579e+01 9.559600e-01 3.890991e-04 endloop endfacet facet normal 4.101966e-05 1.776467e-04 -1.000000e+00 outer loop vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 6.103516e-05 3.259960e+00 4.291534e-04 vertex 1.120618e+01 3.259960e+00 8.888245e-04 endloop endfacet facet normal 3.962153e-05 2.057100e-04 -1.000000e+00 outer loop vertex 1.654291e-16 2.701663e+00 3.299713e-04 vertex 1.120618e+01 3.259960e+00 8.888245e-04 vertex 1.055579e+01 9.559600e-01 3.890991e-04 endloop endfacet facet normal 9.019092e-02 -9.958953e-01 -7.627156e-03 outer loop vertex 2.321960e+00 8.375192e-02 1.652183e+01 vertex 0.000000e+00 0.000000e+00 3.890991e-04 vertex 1.055579e+01 9.559600e-01 3.890991e-04 endloop endfacet facet normal 9.021014e-02 -9.958937e-01 -7.617371e-03 outer loop vertex 2.321960e+00 8.375192e-02 1.652183e+01 vertex 9.582214e+00 7.179599e-01 1.958651e+01 vertex 2.752686e+00 9.932685e-02 1.958651e+01 endloop endfacet facet normal 9.021016e-02 -9.958935e-01 -7.617473e-03 outer loop vertex 1.055579e+01 9.559600e-01 3.890991e-04 vertex 9.582214e+00 7.179599e-01 1.958651e+01 vertex 2.321960e+00 8.375192e-02 1.652183e+01 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.052673e+00 3.259960e+00 7.490189e+00 vertex 1.120618e+01 3.259960e+00 8.888245e-04 vertex 6.103516e-05 3.259960e+00 4.291534e-04 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 5.410767e+00 3.259960e+00 1.989366e+01 vertex 8.429504e+00 3.259960e+00 1.582182e+01 vertex 1.052673e+00 3.259960e+00 7.490189e+00 endloop endfacet facet normal 0.000000e+00 1.000000e+00 0.000000e+00 outer loop vertex 1.052673e+00 3.259960e+00 7.490189e+00 vertex 2.290710e+00 3.259960e+00 1.629949e+01 vertex 5.410767e+00 3.259960e+00 1.989366e+01 endloop endfacet endsolid vcg openscad-2019.05/testdata/scad/misc/builtin-invalid-range-test.scad0000644000076500000240000000161113423115164025551 0ustar kintelstaff00000000000000inf = 1/0; nan = inf / inf; tests= [1,0,-1,-inf,nan,inf,"test"]; echo("Primitives"); for(i=tests){ echo(str("i=",i,", primitive test")); cube([1,i,1]); sphere(i); cylinder(h=i); cylinder(r=i); square(i); square([1,i]); square([i,1]); circle(i); polyhedron( points=[ [10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0], // the four points at base [0,0,i] ], // the apex point faces=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4], // each triangle side [1,0,3],[2,1,3] ] // two triangles for square base ); } echo("Transformations"); for(i=tests){ echo(str("i=",i,", transformation test")); scale(i) sphere(); rotate(i); cube(); translate([0,i,0]) cylinder(); } echo("Those are okay"); cylinder(r1=1,r2=0,h=10); cylinder(r1=0,r2=1,h=10); openscad-2019.05/testdata/scad/misc/builtin-tests.scad0000644000076500000240000000002113402025764023213 0ustar kintelstaff00000000000000p = PI; echo(p); openscad-2019.05/testdata/scad/misc/builtins-calling-vec3vec2.scad0000644000076500000240000000122613402025764025273 0ustar kintelstaff00000000000000//Various lengths cube(); //I'm fine cube(2); //I'm fine cube([1]); cube([1,2]); cube([1,2,3]); //I'm fine cube([1,2,3,4]); cube([[1],2,3]); //not numbers cube([1,"test",3]); cube([1,"2",3]); cube(["1.2","2",3]); cube("[1,2,3]"); square(); square(2); //I'm fine square([1]); square([1,2]); square([1,2,3]); square("[1,2]"); mirror() mirror(1) mirror([1,2])//I'm fine mirror([1,2,3])//I'm fine mirror([1,2,3,4]) mirror("[1,2,3]") scale() scale(1)//I'm fine scale([1]) scale([1,2]) //I'm fine scale([1,2,3])//I'm fine scale([1,2,3,4]) scale("[1,2]") cube([3,2,1]); //I'm fine //here we have to decide how to handle it: cube([1,-2,3]); cube([1/0,2,3]); openscad-2019.05/testdata/scad/misc/children-tests.scad0000644000076500000240000000240613402025764023346 0ustar kintelstaff00000000000000 module child1() { echo("child1"); } module child2() { echo("child2"); } module child3() { echo("child3"); } module child4() { echo("child4"); } module child5() { echo("child5"); } module test_children_empty() { echo("Children empty: begin"); children(); echo("Children empty: end"); } test_children_empty() { child1();child2();child3();child4();child5(); } module test_children_scalar() { echo("Children scalar: begin"); children(0); // child1 children(4); // child5 children(2); // child3 children(5); // out children(-1); // out echo("Children scalar: end"); } test_children_scalar() { child1();child2();child3();child4();child5(); } module test_children_vector() { echo("Children vector: begin"); children([4]); // child5 last children([0,3,1]); // child1, child4, child2 children([5,-1]); // out, out echo("Children vector: end"); } test_children_vector() { child1();child2();child3();child4();child5(); } module test_children_range() { echo("Children range: begin"); children([0:4]); // all children([1:2]); // child2, child3 children([0:2:4]); // child1, child3, child5 children([0:-1:4]); // out, out echo("Children range: end"); } test_children_range() { child1();child2();child3();child4();child5(); } // to avoid no object error cube(1.0); openscad-2019.05/testdata/scad/misc/children-warnings-tests.scad0000644000076500000240000000052513427162620025174 0ustar kintelstaff00000000000000child(-1)test(); module childOutRange(num){ child(5); } childOutRange(5)cube(); childOutRange(5){ cube(); sphere(); } module lineup(num, space) { for (i = [0 : num-1]) translate([ space*i, 0, 0 ]) children([0:10000]); } module testStr(){ children("test"); } lineup(1, 65){ sphere(30);cube(35);} testStr()cube();openscad-2019.05/testdata/scad/misc/chr-tests.scad0000644000076500000240000000132313402025764022327 0ustar kintelstaff00000000000000function f(x) = x; s = "string"; smiley = 9786; // empty, inf, -inf, nan echo(chr(), chr(1/0), chr(-1/0), chr(0/0)); // invalid values echo(chr(0), chr(-0), chr(0.5), chr(-0.9), chr(-100), chr(2097152), chr(1e10), chr(-2e10)); // valid values echo(chr(f(33)), chr(49), chr(65), chr(97), chr(smiley), chr(128512)); // multiple values echo(chr(90, 89, 88), chr(65, "test", false, -5, 0, 66, [67:69], [70, 71, 72, 73], smiley)); // ranges echo(chr([48:57]), chr([70 : 2 : 80])); // vectors echo(chr([65, 66, 67, 97, 98, 99]), chr([49, "test", true, -1, 50])); // other (not supported) types echo(chr(undef), chr(true), chr("test"), chr(s)); // (unevenly) nested vectors and ranges echo(chr([65,[66,[67],[[68:70]]]])); openscad-2019.05/testdata/scad/misc/concat-tests.scad0000644000076500000240000000246713402025764023034 0ustar kintelstaff00000000000000u = undef; echo("--- empty"); echo(concat()); echo(concat([])); echo(concat([], [])); echo(concat([], [], [])); echo("--- single elements"); echo(concat(u)); echo(concat(true)); echo(concat(3)); echo(concat("abc")); echo(concat([0:1:10])); echo("--- single vectors"); echo(concat([1, 2, 3])); echo(concat([[1, 2, 3]])); echo(concat([[[1, 2, 3]]])); echo(concat([[[1, 2, [3, 4], 5]]])); echo("--- multiple elements"); echo(concat(3, 3)); echo(concat(1, 2, 3)); echo(concat(1, 2, 3, 4, 5)); echo(concat(1, "text", false, [1:0.5:3])); echo("--- vector / element"); echo(concat([3, 4], u)); echo(concat([3, 4, 5], 6)); echo(concat([3, 4, 5, 6], true)); echo(concat([3, 4, "5", 6], "test")); echo(concat([3, 4, true, 6], [4:1:3])); echo("--- element / vector"); echo(concat(3, [])); echo(concat(3, [3, 4])); echo(concat(true, [3, [4]])); echo(concat("9", [1, 2, 3])); echo(concat([6:2:9], [3, [4]])); echo("--- vector / vector"); echo(concat([], [3, 4])); echo(concat([[]], [3, 4])); echo(concat([[2, 4]], [3, 4])); echo(concat([5, 6], ["d", [3, 4]])); echo(concat([[1, 0, 0], [2, 0, 0]], [3, 0, 0])); echo(concat([[1, 0, 0], [2, 0, 0]], [[3, 0, 0]])); echo(concat([[1, 0, 0], [2, 0, 0], [3, 0, 0]], [[4, 4, 4], [5, 5, 5]])); echo("--- recursive function"); function r(i) = i > 0 ? concat(r(i - 1), [[i, i * i]]) : []; echo(r(10)); openscad-2019.05/testdata/scad/misc/cube10.scad0000644000076500000240000000001213402025764021464 0ustar kintelstaff00000000000000cube(10); openscad-2019.05/testdata/scad/misc/dim-all.dxf0000644000076500000240000003420713402025764021610 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ARC 5 43 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 -100.0 20 0.0 30 0.0 40 60.0 100 AcDbArc 50 30.9637565320735177 51 90.0 0 DIMENSION 5 44 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -109.8639392383214499 20 -59.1836354299286214 30 0.0 11 -101.8494886071852648 21 0.3082481011975488 31 0.0 70 3 71 5 72 1 41 1.0 42 0.0 1 diameter 3 Standard 100 AcDbDiametricDimension 15 -90.1360607616785501 25 59.1836354299286285 35 0.0 40 0.0 0 DIMENSION 5 45 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -100.0 20 60.0 30 0.0 11 0.0 21 0.0 31 0.0 70 2 71 5 72 1 41 1.0 42 0.0 1 arc 3 Standard 100 AcDb2LineAngularDimension 13 -100.0 23 0.0 33 0.0 14 -48.5504244572473453 24 30.8697453256515857 34 0.0 15 -100.0 25 0.0 35 0.0 16 -50.0 26 50.0 36 0.0 0 DIMENSION 5 46 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -93.5543529011625736 20 -10.7427451647290511 30 0.0 11 -68.7942446712128515 21 6.2999267338077694 31 0.0 70 1 71 5 72 0 41 1.0 42 0.0 1 aligned 3 Standard 100 AcDbAlignedDimension 13 -100.0 23 -0.0000000000000142 33 0.0 14 -48.5504244572473453 24 30.8697453256515857 34 0.0 0 DIMENSION 5 47 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -110.0 20 30.8697453256515928 30 0.0 11 -111.875 21 45.4348726628257964 31 0.0 70 0 71 5 72 0 41 1.0 42 0.0 1 linearY 3 Standard 100 AcDbAlignedDimension 13 -100.0 23 60.0 33 0.0 14 -48.5504244572473453 24 30.8697453256515857 34 0.0 50 90.0 100 AcDbRotatedDimension 0 DIMENSION 5 48 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -48.5504244572473453 20 80.0 30 0.0 11 -74.2752122286236727 21 81.875 31 0.0 70 0 71 5 72 0 41 1.0 42 0.0 1 linearX 3 Standard 100 AcDbAlignedDimension 13 -100.0 23 0.0 33 0.0 14 -48.5504244572473453 24 30.8697453256515857 34 0.0 50 0.0 100 AcDbRotatedDimension 0 LEADER 5 49 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbLeader 3 Standard 71 1 72 0 73 3 74 0 75 0 40 1.0 41 10.0 76 3 10 -100.0 20 60.0 10 -110.0 20 80.0 10 -140.0 20 80.0 0 DIMENSION 5 4A 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -100.0 20 0.0 30 0.0 11 0.0 21 0.0 31 0.0 70 4 71 5 72 1 41 1.0 42 0.0 1 radius 3 Standard 100 AcDbRadialDimension 15 -48.5504244572473453 25 30.8697453256515857 35 0.0 40 0.0 0 DIMENSION 5 4B 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -69.1754244572473453 20 60.8697453256515857 30 0.0 11 -2.0226466794695739 21 50.8697453256515857 31 0.0 70 6 71 5 72 1 41 1.0 1 ordinateY 3 Standard 100 AcDbOrdinateDimension 13 -49.1754244572473453 23 30.8697453256515857 33 0.0 14 -9.1754244572473453 24 50.8697453256515857 34 0.0 0 DIMENSION 5 4C 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 -69.1754244572473453 20 60.8697453256515857 30 0.0 11 -9.1754244572473453 21 62.7449999999999974 31 0.0 70 70 71 5 72 1 41 1.0 1 ordinateX 3 Standard 100 AcDbOrdinateDimension 13 -49.1754244572473453 23 30.8697453256515857 33 0.0 14 -9.1754244572473453 24 60.8699999999999974 34 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4D 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4D 100 AcDbDictionary 281 1 3 DIMASSOC 350 4F 3 HIDETEXT 350 4E 0 DICTIONARYVAR 5 4E 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4F 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/scad/misc/dim-all.scad0000644000076500000240000000063413402025764021736 0ustar kintelstaff00000000000000dxf="dim-all.dxf"; echo(linearX=dxf_dim(file=dxf, name="linearX")); echo(linearY=dxf_dim(file=dxf, name="linearY")); echo(aligned=dxf_dim(file=dxf, name="aligned")); echo(ordinateX=dxf_dim(file=dxf, name="ordinateX")); echo(ordinateY=dxf_dim(file=dxf, name="ordinateY")); echo(radius=dxf_dim(file=dxf, name="radius")); echo(diameter=dxf_dim(file=dxf, name="diameter")); echo(arc=dxf_dim(file=dxf, name="arc")); openscad-2019.05/testdata/scad/misc/dxf-export.scad0000644000076500000240000000041013402025764022507 0ustar kintelstaff00000000000000circle(r=5); translate([15,0,0]) square(size=[10,10], center=true); translate([30,0,0]) polygon(points=[[-5,-5],[5,-5],[0,5]], paths=[[0,1,2]]); translate([0,-15,0]) { difference() { circle(r=5); translate([0,-6,0]) square([12,12], center=true); } }openscad-2019.05/testdata/scad/misc/echo-tests.scad0000644000076500000240000000073413402025764022476 0ustar kintelstaff00000000000000echo(undef); echo("string"); s = "stringvar"; echo(s); echo(a = 1, b = 2.0, true, c = false); v = [1, "vecstr", 2.34, false]; echo(v); r = [1:2:10]; echo(r); echo(vec = [1,2,3]); echo(range = [0:2]); echo(str("string generated by str()")); // https://github.com/openscad/openscad/issues/158 rept by nop head // 0.8 should print 0.8 not 0.80000...004 (regardless of internal representation) echo(0.8); // Test parallel vs. sequential lookup u = 23; echo(u = 2, v = 2 * u); openscad-2019.05/testdata/scad/misc/empty-shape-tests.scad0000644000076500000240000000052513402025764024012 0ustar kintelstaff00000000000000linear_extrude(h=1) { square(0); circle(0); polygon(); import(); } cube(0); sphere(0); cylinder(0); polyhedron(); import(); surface(); rotate_extrude(); linear_extrude(); translate(); color(); hull(); minkowski(); union(); difference(); intersection(); render(); projection(); assign(); if(1) { } intersection_for(); for(); openscad-2019.05/testdata/scad/misc/empty-stl.scad0000644000076500000240000000026413432700636022355 0ustar kintelstaff00000000000000// openscad should exit normally. // it should not crash and/or freeze and/or gobble RAM import("../../stl/empty.stl"); import("../../stl/empty2.stl"); echo("empty stl test ok"); openscad-2019.05/testdata/scad/misc/empty-union.scad0000644000076500000240000000005413402025764022677 0ustar kintelstaff00000000000000union() { polyhedron(); polyhedron(); } openscad-2019.05/testdata/scad/misc/errors-warnings-included.scad0000644000076500000240000000037413402025764025347 0ustar kintelstaff00000000000000echo("include"); include; include<../3D/features/for-tests.scad>; echo("mainfile"); echo(notDefinedVariable); echo("use"); use; moduleWithError(); use; sub2(); include;openscad-2019.05/testdata/scad/misc/errors-warnings-use.scad0000644000076500000240000000013413402025764024346 0ustar kintelstaff00000000000000module moduleWithError(){ echo(a); polygon(points=[[0,0],[100,0],[130,50],[30]]); } openscad-2019.05/testdata/scad/misc/errors-warnings.scad0000644000076500000240000000426613434420302023556 0ustar kintelstaff00000000000000echo(a); polygon(points=[[0,0],[100,0],[130,50],[30]]); polyhedron( points=[ [10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0], [0] ], faces=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4], [1,0,3],[2,1,3] ] ); //file does not exist - we only care about the file ending import("doesNotExist.aaa"); //file does not exist an thus creates a warning import("doesNotExist.off", origin="string"); //unknown module hello(); //unknown function b=test(); //radius is ignored as a diameter is defined circle(r=1,d=4); cylinder(r1=1,d1=1); rotate(1/0) rotate([1/0,1/0]) rotate((1/0)/(1/0)) cube(); circle(rad=5); //too many unnamed arguments cube(1,2,3,4,5,6); //either r or r1 and r2 cylinder(r1=1,r2=2,r=3); cylinder(r=0,r1=1,r2=2); cylinder(d=0,r1=1,r2=2); cylinder(5,r1=1,r2=2); $vpr="[1,2,3]"; $vpt=[1,2,3,4]; $vpd=[1]; color([-1,0,1,2]) color("notAName") box(); cylinder($fs=0); cylinder($fa=0); cylinder($fn=0); cylinder($fs=1/0); cylinder($fa=1/0); cylinder($fn=1/0); cylinder($fs="test"); cylinder($fa="test"); cylinder($fn="test"); cube(10,center=true,center=false); sphere(r=1,r=2); rotate_extrude(convexity = 10, origin="test") translate([2, 0, 0]) circle(r = 1); linear_extrude(height = 10, center = true, convexity = 10, origin="test", scale=1/0) translate([2, 0, 0]) circle(r = 1); table1 = [[10,10],[20,20]]; echo(lookup(0, table1)); //OK, but limited to 10 echo(lookup(15, table1)); //OK echo(lookup(30, table1)); //OK, but limited to 20 echo(lookup("test", table1)); //invalid first parameter echo(lookup(1, table1, 3)); //to many arguments echo(lookup(1)); //not enough arguments nan = (1/0)/(1/0); OriginPoint = dxf_cross(file="doesNotExist.dxf", layer="SCAD.Origin", origin=[1/0, nan], scale=1); TotalWidth = dxf_dim(file="doesNotExist.dxf", name="TotalWidth", layer="SCAD.Origin", origin=[1,2,3], scale=1); dxf="dim-all.dxf"; // this does exist echo(dxf); OriginPoint2 = dxf_cross(file=dxf, layer="SCAD.Origin", origin=[1/0, 0], scale=1, notSupported="test"); TotalWidth2 = dxf_dim(file=dxf, name="TotalWidth", layer="SCAD.Origin", scale=1, notSupported="test"); cube() cylinder(); sphere() cylinder() cube(); openscad-2019.05/testdata/scad/misc/escape-test.scad0000644000076500000240000000011313402025764022624 0ustar kintelstaff00000000000000import(file="B-\" C-\t D-\n E-'", layer="A:\\ B:\" C:\t D:\n E:' F:\\\\"); openscad-2019.05/testdata/scad/misc/expression-evaluation-tests.scad0000644000076500000240000000316413402025764026124 0ustar kintelstaff00000000000000values = [ undef, // special undefined value 1/0, // infinity -1/0, // -infinity 0/0, // not a number 0, -4.2, -2, 3, 42.42, 242, // number true, false, // boolean "", "text", // string [], [ 0 ], [ 1 ], // vector [ 0 : 0 ], [ 1 : 2 ] // range ]; array = [ "a", "b", "c", "d" ]; for (v = values) { echo(v = v, op = "not v", result = !v); echo(v = v, op = "-v", result = -v); echo(v = v, op = "v *", result = v * 3); echo(v = v, op = "* v", result = 2 * v); echo(v = v, op = "v /", result = v / 3); echo(v = v, op = "/ v", result = 2 / v); echo(v = v, op = "v %", result = v % 3); echo(v = v, op = "% v", result = 2 % v); echo(v = v, op = "v +", result = v + 3); echo(v = v, op = "+ v", result = 2 + v); echo(v = v, op = "v -", result = v - 3); echo(v = v, op = "- v", result = 2 - v); echo(v = v, op = "v and true", result = v && true); echo(v = v, op = "v and false", result = v && false); echo(v = v, op = "v or true", result = v || true); echo(v = v, op = "v or false", result = v || false); // echo(v = v, op = "<", result = v < 3); // echo(v = v, op = "<=", result = v <= 3); // echo(v = v, op = "==", result = v == 3); // echo(v = v, op = "!=", result = v != 3); // echo(v = v, op = ">=", result = v >= 3); // echo(v = v, op = ">", result = v > 3); echo(v = v, op = "[v]", result = array[v]); echo(v = v, op = "v[0]", result = v[0]); echo(v = v, op = "v[4]", result = v[4]); } openscad-2019.05/testdata/scad/misc/expression-precedence.scad0000644000076500000240000000023513452415427024712 0ustar kintelstaff00000000000000echo(2 + 3 * 5); echo(2 * 3 + 5); echo(2 - 3 * 5); echo(2 * 3 - 5); echo(2 - -3 * 5); echo(2 * -3 - 5); echo(2 / 2 / 2); echo(2 / -2 / 2); echo(2 / +2 / 2); openscad-2019.05/testdata/scad/misc/expression-shortcircuit-tests.scad0000644000076500000240000000051713402025764026476 0ustar kintelstaff00000000000000function foo() = search(undef,undef); if (false && foo()) { echo("Fail"); } else { echo("Pass"); } if (true || foo()) { echo("Pass"); } else { echo("Fail"); } if (true && true) { echo("Pass"); } if (false || true) { echo("Pass"); } function ternarytest() = true ? true : foo(); if (ternarytest()) { echo("Pass"); } openscad-2019.05/testdata/scad/misc/for-c-style-infinite-loop.scad0000644000076500000240000000003613424454746025343 0ustar kintelstaff00000000000000echo([for(b=0; b!=1; b=0) b]);openscad-2019.05/testdata/scad/misc/ifelse-ast-dump.scad0000644000076500000240000000106613440766524023426 0ustar kintelstaff00000000000000// This tests many variations of if/else with single/multiple children // to verify AST dump indentation behavior. if (true) { cube(); sphere(); translate([10,10,10]) if (false) { cylinder(); cube(); } else { sphere(); cube(); } } else { echo("hi"); } if (true) cube(); else sphere(); if (true) { if (false) { if (true) { echo("hello"); echo("world"); } else { if (true) echo("hello"); else echo("bye bye"); echo("world"); } assert(true); } else { echo("hello world"); } echo("!"); } openscad-2019.05/testdata/scad/misc/include test6.scad0000644000076500000240000000015213402025764023063 0ustar kintelstaff00000000000000module test6() { difference() { cube(center=true); cylinder(r=0.4, h=2, center=true); } } openscad-2019.05/testdata/scad/misc/include-overwrite-after.scad0000644000076500000240000000003513402025764025160 0ustar kintelstaff00000000000000echo("after"); after = true; openscad-2019.05/testdata/scad/misc/include-overwrite-before.scad0000644000076500000240000000003713402025764025323 0ustar kintelstaff00000000000000echo("before"); before = true; openscad-2019.05/testdata/scad/misc/include-overwrite-main.scad0000644000076500000240000000074413402025764025012 0ustar kintelstaff00000000000000echo(str("Can a variable be used when it assigned later? ",later)) echo(str("Is overwritting possible? ", overwritten)); echo(str("Does an include before the assigment take priority? ", before)); echo(str("Does an include after the assigment take priority? ", after)); use ; include ; overwritten=false; main = true; before=false; after=false; overwritten=true; include ; later=true; openscad-2019.05/testdata/scad/misc/include-overwrite-use.scad0000644000076500000240000000005213402025764024652 0ustar kintelstaff00000000000000overwriteInuse=false; overwriteInuse=true;openscad-2019.05/testdata/scad/misc/include-recursive-test.scad0000644000076500000240000000023013402025764025014 0ustar kintelstaff00000000000000include include <../misc/include-recursive-test.scad> include <../../scad/misc/include-recursive-test.scad> echo("INC"); openscad-2019.05/testdata/scad/misc/include-test5.scad0000644000076500000240000000005313402025764023077 0ustar kintelstaff00000000000000module test5() { sphere(r=0.5, $fn=8); } openscad-2019.05/testdata/scad/misc/internal-cavity-polyhedron.scad0000644000076500000240000000132613402025764025710 0ustar kintelstaff00000000000000// In CGAL mode, there should be a cavity // The problem appears to be that we don't create a correct Nef Polyhedron from // the polyset, probably already being wrong when converting to a Polyhedron difference() { polyhedron(convexity=2, faces=[[2,1,0],[3,1,2],[4,0,1],[4,1,5],[4,2,0],[6,2,4],[6,3,2],[7,3,6],[5,1,3],[5,3,7],[6,4,5],[6,5,7],[9,10,8],[9,11,10],[8,12,9],[9,12,13],[10,12,8],[10,14,12],[11,14,10],[11,15,14],[9,13,11],[11,13,15],[12,14,13],[13,14,15]], points=[[-5,-5,-5],[-5,-5,5],[-5,5,-5],[-5,5,5],[5,-5,-5],[5,-5,5],[5,5,-5],[5,5,5],[-2.5,-2.5,-2.5],[-2.5,-2.5,2.5],[-2.5,2.5,-2.5],[-2.5,2.5,2.5],[2.5,-2.5,-2.5],[2.5,-2.5,2.5],[2.5,2.5,-2.5],[2.5,2.5,2.5]]); translate([0,0,10]) cube(20, center=true); }openscad-2019.05/testdata/scad/misc/internal-cavity.scad0000644000076500000240000000104713402025764023527 0ustar kintelstaff00000000000000// The inner cube won't render correctly in OpenCSG mode as long as this bug is present // Note: This causes a different bug in unstable: // If we render a preview first, the render() node will be cached as a PolySet. This will // cause the same problems as in issue495.scad. If we clear cache and render using CGAL, // it doesn't trigger the bug since we stay in CGAL all the time difference() { render(convexity=2) difference() { cube(20, center = true); cube(10, center = true); } translate([0, 0, 15]) cube(30, center=true); } openscad-2019.05/testdata/scad/misc/intersection-prune-test.scad0000644000076500000240000000035013432700636025225 0ustar kintelstaff00000000000000// This tree cannot be pruned inline, but will still result in an empty CSG tree // Crashes OpenSCAD-2011.12. Bug fixed in 14e4f3bb intersection() { union() { cube(); translate([4,0,0]) cube(); } translate([2,0,0]) cube(); } openscad-2019.05/testdata/scad/misc/isbool-test.scad0000644000076500000240000000065713432700636022671 0ustar kintelstaff00000000000000echo("resulting in true:"); echo(is_bool(true)); echo(is_bool(false)); echo("resulting in false:"); echo(is_bool([])); echo(is_bool([1])); echo(is_bool("test")); echo(is_bool(0.1)); echo(is_bool(1)); echo(is_bool(10)); echo(is_bool(0/0)); //nan echo(is_bool((1/0)/(1/0))); //nan echo(is_bool(1/0)); //inf echo(is_bool(-1/0)); //-inf echo(is_bool(undef)); echo("resulting in warnings:"); echo(is_bool(1,2,3)); echo(is_bool()); openscad-2019.05/testdata/scad/misc/islist-test.scad0000644000076500000240000000062113427162620022677 0ustar kintelstaff00000000000000echo("returning true"); echo(is_list([])); echo(is_list([1])); echo(is_list([1,2])); echo(is_list([true])); echo(is_list([1,2,[5,6],"test"])); echo("--------"); echo("returning false"); echo(is_list(1)); echo(is_list(1/0)); echo(is_list(((1/0)/(1/0)))); echo(is_list("test")); echo(is_list(true)); echo(is_list(false)); echo("--------"); echo("causing warnings:"); echo(is_list()); echo(is_list(1,2));openscad-2019.05/testdata/scad/misc/isnum-test.scad0000644000076500000240000000071313432700636022526 0ustar kintelstaff00000000000000echo("a number is a number:"); echo(is_num(0.1)); echo(is_num(1)); echo(is_num(10)); echo("inf is a number:"); echo(is_num(+1/0)); //+inf echo(is_num(-1/0)); //-inf echo("nan is not a number:"); echo(is_num(0/0)); //nan echo(is_num((1/0)/(1/0))); //nan echo("resulting in false:"); echo(is_num([])); echo(is_num([1])); echo(is_num("test")); echo(is_num(false)); echo(is_num(undef)); echo("resulting in warnings:"); echo(is_num(1,2,3)); echo(is_num()); openscad-2019.05/testdata/scad/misc/isstring-test.scad0000644000076500000240000000071313432700636023235 0ustar kintelstaff00000000000000echo("resulting in true:"); echo(is_string("")); echo(is_string("test")); echo("resulting in false:"); echo(is_string(0.1)); echo(is_string(1)); echo(is_string(10)); echo(is_string([])); echo(is_string([1])); echo(is_string(false)); echo(is_string(0/0)); //nan echo(is_string((1/0)/(1/0))); //nan echo(is_string(1/0)); //inf echo(is_string(-1/0)); //-inf echo(is_string(undef)); echo("resulting in warnings:"); echo(is_string(1,2,3)); echo(is_string()); openscad-2019.05/testdata/scad/misc/isundef-test.scad0000644000076500000240000000160413402025764023027 0ustar kintelstaff00000000000000echo("Normal variables"); echo(is_undef(a)); //no warning b="hallo"; echo(is_undef(b)); c=undef; echo(is_undef(c)); echo(a); //warns echo(b); echo(c); echo("Test with scopes"); if(true){ echo(is_undef(b)); d=true; echo(is_undef(c)); echo(d); } echo(is_undef(d)); echo(d); echo("Special variables"); echo(is_undef($a)); //no warning $b=132465; echo(is_undef($b)); $c=undef; echo(is_undef($c)); echo($a); echo($b); echo($c); echo("constants resulting in true"); echo(is_undef(undef)); echo("constants resulting in false"); echo(is_undef("Test")); echo(is_undef(123456)); echo("constants resulting in undef"); echo(is_undef()); echo(is_undef("Test",123)); echo(is_undef(123,456)); echo("functions resulting in true"); echo(is_undef(len("test","upps"))); echo(is_undef(is_undef())); echo("functions resulting in false"); echo(is_undef(sin(1))); echo(is_undef(len("test"))); openscad-2019.05/testdata/scad/misc/let-module-tests.scad0000644000076500000240000000040613402025764023623 0ustar kintelstaff00000000000000a = 1; b = 2; c = 3; echo(a, b, c); let (a = 5, b = a + 8, c = a + b) { echo(a, b, c); difference() { cube([a, b, c], center = true); let (b = 2 * a, c = b * 2) { echo(a, b, c); rotate([0, 90, 0]) cylinder(d = b, h = c, center = true); } } } openscad-2019.05/testdata/scad/misc/localfiles-test.scad0000644000076500000240000000010213402025764023477 0ustar kintelstaff00000000000000use localfiles_module(); openscad-2019.05/testdata/scad/misc/localfiles_dir/localfile.dat0000644000076500000240000000001013402025764025146 0ustar kintelstaff000000000000000 1 2 3 openscad-2019.05/testdata/scad/misc/localfiles_dir/localfile.dxf0000644000076500000240000002735513402025764025204 0ustar kintelstaff00000000000000999 dxflib 2.2.0.0 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 9 $DIMGAP 40 0.625 9 $PLIMMAX 10 210.0 20 297.0 9 $INSUNITS 70 4 9 $DIMSTYLE 2 Standard 9 $CLAYER 8 0 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $CLAYER 8 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 420 0 6 CONTINUOUS 370 25 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 43 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 100.0 30 0.0 11 210.0 21 100.0 31 0.0 0 LINE 5 44 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 210.0 20 100.0 30 0.0 11 210.0 21 -100.0 31 0.0 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 210.0 20 -100.0 30 0.0 11 10.0 21 -100.0 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 10.0 20 -100.0 30 0.0 11 10.0 21 100.0 31 0.0 0 DIMENSION 5 47 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 10.0000000000000018 20 150.0 30 0.0 11 110.0 21 151.875 31 0.0 70 1 71 5 72 1 41 1.0 42 0.0 1 localfile 3 Standard 100 AcDbAlignedDimension 13 10.0 23 130.0 33 0.0 14 210.0 24 130.0 34 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 48 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 48 100 AcDbDictionary 281 1 3 DIMASSOC 350 4A 3 HIDETEXT 350 49 0 DICTIONARYVAR 5 49 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4A 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF openscad-2019.05/testdata/scad/misc/localfiles_dir/localfiles-compatibility-test.scad0000644000076500000240000000011313402025764031323 0ustar kintelstaff00000000000000use localfiles_submodule(); openscad-2019.05/testdata/scad/misc/localfiles_dir/localfiles_module.scad0000644000076500000240000000054613402025764027056 0ustar kintelstaff00000000000000module localfiles_module() { linear_extrude(h=100) import("localfile.dxf"); translate([-250,0,0]) linear_extrude(file="localfile.dxf"); translate([0,350,0]) rotate_extrude(file="localfile.dxf"); translate([250,0,0]) scale([200,200,50]) surface("localfile.dat"); translate([0,-200,0]) sphere(r=dxf_dim(file="localfile.dxf", name="localfile")/2); } openscad-2019.05/testdata/scad/misc/localfiles_dir/localfiles_subdir/localfiles_submodule.scad0000644000076500000240000000055113402025764033251 0ustar kintelstaff00000000000000module localfiles_submodule() { linear_extrude(h=100) import("localfile.dxf"); translate([-250,0,0]) linear_extrude(file="localfile.dxf"); translate([0,350,0]) rotate_extrude(file="localfile.dxf"); translate([250,0,0]) scale([200,200,50]) surface("localfile.dat"); translate([0,-200,0]) sphere(r=dxf_dim(file="localfile.dxf", name="localfile")/2); } openscad-2019.05/testdata/scad/misc/lookup-tests.scad0000644000076500000240000000066513402025764023074 0ustar kintelstaff00000000000000echo(lookup(undef, undef)); echo(lookup(undef, [undef])); echo(lookup(undef, [[undef]])); echo(lookup(undef, [[undef, undef]])); echo(lookup(0, [[0, 0]])); echo(lookup(0.5, [[0, 0], [1, 1]])); table = [[-1, -5], [-10, -55], [0, 0], [1, 3], [10, 333]]; indices = [-20,-10,-9.9, -0.5, 0, 0.3, 1.1, 10, 10.1]; for (i=[0:len(indices)-1]) { echo(lookup(indices[i], table)); } openscad-2019.05/testdata/scad/misc/nbsp-latin1-test.scad0000644000076500000240000000006313402025764023520 0ustar kintelstaff00000000000000a=1;//Latin-1NBSP(no-breakspace) echo(a); openscad-2019.05/testdata/scad/misc/nbsp-utf8-test.scad0000644000076500000240000000007213402025764023216 0ustar kintelstaff00000000000000a = 1;   // UTF-8 NBSP (no-break space) echo(a); openscad-2019.05/testdata/scad/misc/no-break-space-test.scad0000644000076500000240000000003113402025764024152 0ustar kintelstaff00000000000000echo ("A"); echo ("B"); openscad-2019.05/testdata/scad/misc/nonmanifold-polyhedron.scad0000644000076500000240000000027513402025764025105 0ustar kintelstaff00000000000000polyhedron(points=[ [0,0,0], [10,0,0], [10,10,0], [0,10,0], [0,-20,20], [10,-20,20], [10,-20,30], [0,-20,30] ], faces = [[0,1,2,3],[4,5,6,7], [1,2,5,4], [2,3,6,5], [3,0,6,5], [0,1,4,7] ]); openscad-2019.05/testdata/scad/misc/normal-nan.scad0000644000076500000240000000054713402025764022464 0ustar kintelstaff00000000000000/* When exporting this to STL, null polygons appear, causing problems normalizing normal vectors (nan output in STL files) */ $fs=0.2; difference() { cube(8); translate([0,20,4]) rotate([90,0,0]) union() { translate([0,-3,14.5]) cube([5.4,6,2.4],center=true); translate([0,0,13.3]) rotate([0,0,30]) cylinder(r=3.115,h=2.4,$fn=6); } } openscad-2019.05/testdata/scad/misc/null-polygons.scad0000644000076500000240000000022113402025764023231 0ustar kintelstaff00000000000000linear_extrude(height=1) import_dxf("../../dxf/null-polygons.dxf"); translate([0,20,0]) linear_extrude("../../dxf/null-polygons.dxf", height=1); openscad-2019.05/testdata/scad/misc/operators-tests.scad0000644000076500000240000000067213402025764023577 0ustar kintelstaff00000000000000nan = 0/0; inf = 1/0; for (lhs = [false,true,-1,0,1,nan,inf,"alpha","beta",[1,2,3],[1,2,4],[0:3],[0:1],undef], rhs = [false,true,-1,0,1,nan,inf,"alpha",[1,2,3],[0:3],undef]) { echo(lhs," == ",rhs,"->",lhs == rhs); echo(lhs," > ",rhs,"->",lhs > rhs); echo(lhs," >= ",rhs,"->",lhs >= rhs); echo(lhs," < ",rhs,"->",lhs < rhs); echo(lhs," <= ",rhs,"->",lhs <= rhs); echo(lhs," != ",rhs,"->",lhs != rhs); } openscad-2019.05/testdata/scad/misc/ord-tests.scad0000644000076500000240000000246113402025764022343 0ustar kintelstaff00000000000000// // WARNING: this file contains some invalid UTF-8 chars // at the end of the file. When editing make sure those // are still unchanged. // echo(ord("a")); echo(ord("abc")); echo(ord()); echo(ord("")); echo(ord(undef)); echo(ord(1/0)); echo(ord(-1/0)); echo(ord(0/0)); echo(ord(3.1416)); echo(ord([])); echo(ord([1, 2, 3])); echo(ord(["a", "b"])); echo(ord([1 : 5])); echo(ord("foo", "bar")); echo([for (c = "test") ord(c)]); echo(chr([for (c = "test") ord(c)])); a1 = "abcdefäöüß"; a2 = "012345!§$%"; u1 = "\u2190\u2191\u2193\u2192\U01F640\U01F0A1\U01F0D1"; u2 = "\U01F603"; echo(text = a1, codepoints = [for (c = a1) ord(c)]); echo(text = a2, codepoints = [for (c = a2) ord(c)]); echo(text = u1, codepoints = [for (c = u1) ord(c)]); echo(text = u2, codepoints = [for (c = u2) ord(c)]); ra1 = chr([for (c = a1) ord(c)]); ra2 = chr([for (c = a2) ord(c)]); echo(equals = a1 == ra1, len_input = len(a1), len_output = len(ra1)); echo(equals = a2 == ra2, len_input = len(a2), len_output = len(ra2)); ru1 = chr([for (c = u1) ord(c)]); ru2 = chr([for (c = u2) ord(c)]); echo(equals = u1 == ru1, len_input = len(u1), len_output = len(ru1)); echo(equals = u2 == ru2, len_input = len(u2), len_output = len(ru2)); // invalid utf-8 string, text €ÄÖÜß as latin15 (bytes: A4 C4 D6 DC DF) echo([for (c = "") ord(c)]); openscad-2019.05/testdata/scad/misc/override.scad0000644000076500000240000000012113402025764022225 0ustar kintelstaff00000000000000// Used to test variable override with the -D parameter a = 1; b = 2; echo(a,b); openscad-2019.05/testdata/scad/misc/parent_module-tests.scad0000644000076500000240000000077713402025764024425 0ustar kintelstaff00000000000000/* $parent_modules should return the number of module in the module instantiation stack. The stack is independent on where the modules are defined. It's where they're instantiated that counts. parent_module(N) returns the Nth module name in the stack */ module print(name) { echo("name: ", name); for (i=[1:$parent_modules-1]) echo(parent_module(i)); } module yyy() { print("yyy"); } module test() { module xxx() { print("xxx"); yyy(); } print("test"); xxx(); } test(); openscad-2019.05/testdata/scad/misc/parser-tests.scad0000644000076500000240000000020213402025764023042 0ustar kintelstaff00000000000000// Number literals a = .1; echo(a); b = 2.; echo(b); c = 11e+2; echo(c); d = 21.e-3; echo(d); e = .11e-12; echo(e); openscad-2019.05/testdata/scad/misc/preview_variable.scad0000644000076500000240000000037713402025764023751 0ustar kintelstaff00000000000000echo($preview=$preview); // true when doing openCSG preview, false otherwise if($preview) color("red") sphere(50); else cube(50); translate([100, 0]) render() { if($preview) color("red") sphere(50); else cube(50); } openscad-2019.05/testdata/scad/misc/range-tests.scad0000644000076500000240000000255413402025764022656 0ustar kintelstaff00000000000000echo("[a01] ----- [1:4]"); for (a = [1:4]) echo ("[a01] ", a); echo("[a02] ----- [4:1]"); for (a = [4:1]) echo ("[a02] ", a); echo("[a03] ----- [0:0]"); for (a = [0:0]) echo ("[a03] ", a); echo("[a04] ----- [0:3]"); for (a = [0:3]) echo ("[a04] ", a); echo("[a05] ----- [-3:0]"); for (a = [-3:0]) echo ("[a05] ", a); echo("[a06] ----- [0:-3]"); for (a = [0:-3]) echo ("[a06] ", a); echo("[a07] ----- [-2:2]"); for (a = [-2:2]) echo ("[a07] ", a); echo("[a08] ----- [2:-2]"); for (a = [2:-2]) echo ("[a08] ", a); echo("[b01] ----- [1:1:5]"); for (a = [1:1:5]) echo ("[b01] ", a); echo("[b02] ----- [1:2:5]"); for (a = [1:2:5]) echo ("[b02] ", a); echo("[b03] ----- [1:-1:5]"); for (a = [1:-1:5]) echo ("[b03] ", a); echo("[b04] ----- [5:1:1]"); for (a = [5:1:1]) echo ("[b04] ", a); echo("[b05] ----- [5:2:1]"); for (a = [5:2:1]) echo ("[b05] ", a); echo("[b06] ----- [5:-1:1]"); for (a = [5:-1:1]) echo ("[b06] ", a); echo("[b07] ----- [0:0:0]"); for (a = [0:0:0]) echo ("[b07] ", a); echo("[b08] ----- [1:0:1]"); for (a = [1:0:1]) echo ("[b08] ", a); echo("[b09] ----- [1:0:5]"); for (a = [1:0:5]) echo ("[b09] ", a); echo("[b10] ----- [0:1:0]"); for (a = [0:1:0]) echo ("[b10] ", a); echo("[b11] ----- [3:-.5:-3]"); for (a = [3:-.5:-3]) echo ("[b11] ", a); openscad-2019.05/testdata/scad/misc/recursion-test-function.scad0000644000076500000240000000011413402025764025221 0ustar kintelstaff00000000000000function crash() = crash(); // Recursion as module parameter echo(crash()); openscad-2019.05/testdata/scad/misc/recursion-test-function2.scad0000644000076500000240000000010413402025764025302 0ustar kintelstaff00000000000000// Recursion as assignment function crash() = crash(); a = crash(); openscad-2019.05/testdata/scad/misc/recursion-test-function3.scad0000644000076500000240000000044313402025764025311 0ustar kintelstaff00000000000000//Example without tail-recursion //https://en.wikibooks.org/w/index.php?title=OpenSCAD_User_Manual/User-Defined_Functions_and_Modules&oldid=3379916#Recursive_functions function add_up_to(n) = ( n==0 ? 0 : n + add_up_to(n-1) ); echo(sum10=add_up_to(10)); echo(sum=add_up_to(-1)); openscad-2019.05/testdata/scad/misc/recursion-test-module.scad0000644000076500000240000000006513402025764024666 0ustar kintelstaff00000000000000// Module recursion module crash() crash(); crash(); openscad-2019.05/testdata/scad/misc/recursion-test-vector.scad0000644000076500000240000000021613402025764024701 0ustar kintelstaff00000000000000// Test for recursion crashing when vectors are parameters to a module // See github issue1407 rec(); module rec(a=1) { rec([a,10,10]); } openscad-2019.05/testdata/scad/misc/rotate-empty-bbox.scad0000644000076500000240000000051613402025764024000 0ustar kintelstaff00000000000000// rotate([90,0,0]) results in a matrix with some close-to-zero values // Transforming an empty boundingbox by this matrix has caused a problem resulting // in the union being evaluated to nothing. rotate([90,0,0]) difference() { cube(60, center=true); union() { translate([0,0,40]) cube(50, center=true); cube(0); } } openscad-2019.05/testdata/scad/misc/rotate_extrude-hole.scad0000644000076500000240000000032313402025764024375 0ustar kintelstaff00000000000000module donut() { rotate_extrude(convexity=2) translate([5,0,0]) difference() { circle(r=2); circle(r=1); } } difference() { donut(); translate([-10,-10,0]) cube(10); } openscad-2019.05/testdata/scad/misc/scope-assignment-tests.scad0000644000076500000240000000271413414440252025033 0ustar kintelstaff00000000000000echo("union scope"); a = 4; union() { a = 5; echo("local a (5):", a); } echo("global a (4):", a); echo("module scope:"); module mymodule(b=6) { b = 7; echo("local b (7)", b); } mymodule(); mymodule(8); echo("module children scope:"); module mymodule2(b2=6) { b2 = 2; children(0); } mymodule2(b2=7) { b2 = 3; echo("b2 (3)", b2); } echo("for loop (c = 0,1,25):"); for (i=[0:2]) { c = (i > 1) ? i + 23 : i; echo("c", c); } echo("if scope:"); if (true) { d = 8; echo("d (8)", d); } echo("else scope:"); if (false) { } else { d = 9; echo("d (9)", d); } echo("anonymous inner scope (scope ignored):"); union() { e = 2; echo("outer e (3)", e); { e = 3; echo("inner e (3)", e); } } echo("anonymous scope (scope ignored):"); f=1; echo("outer f (2)", f); { f=2; echo("inner f (2)", f); } echo("anonymous scope reassign:"); { g=1; echo("g (2)", g); g=2; } echo("anonymous reassign using outer (scope ignored)", h); h=5; { h=h*2; // Not allowed echo("h (undef)", h); } echo("override variable in assign scope:"); assign(i=9) { i=10; echo("i (10)", i); } echo("group scope:"); group() { a=11; echo("local a (11)", a); } echo("legimate case for module parameter overwrite: (see #2628)"); function clamp(a) = a > 10 ? 10 : a < 0 ? 0: a; module mytest(a=5){ a=clamp(echo("parameter a(20)", a) a); echo("local a(10)", a); } mytest(20);openscad-2019.05/testdata/scad/misc/search-tests-unicode.scad0000644000076500000240000001144213402025764024447 0ustar kintelstaff00000000000000//Test search with unicode strings //Helper function that pretty prints our search test //Expected result is checked against execution of a search() invocation and OK/FAIL is indicated module test_search_and_echo( exp_res, search_to_find, search_to_search, search_up_to_num_matches = undef) { if (undef != search_up_to_num_matches) { test_res = search(search_to_find, search_to_search, search_up_to_num_matches); echo(str("Expect ", exp_res, " for search(", search_to_find, ", ", search_to_search, ", ", search_up_to_num_matches, ")=", test_res, ". ", (exp_res == test_res)?"OK":"FAIL" )); } else { test_res = search(search_to_find, search_to_search); echo(str("Expect ", exp_res, " for search(", search_to_find, ", ", search_to_search, ")=", test_res, ". ", (exp_res == test_res)?"OK":"FAIL" )); } } //"Normal" text for comparison echo ("----- Lookup of 1 byte into 1 byte"); //Hits - up_to_count 1 test_search_and_echo( [0], "a","aaaa" ); test_search_and_echo( [0], "a","aaaa",1 ); test_search_and_echo( [0,0], "aa","aaaa" ); test_search_and_echo( [0,0], "aa","aaaa",1 ); //Hits - up to count 1+ (incl 0 == all) test_search_and_echo( [[0,1,2,3]] , "a","aaaa",0 ); test_search_and_echo( [[0,1]], "a","aaaa",2 ); test_search_and_echo( [[0,1,2]], "a","aaaa",3 ); test_search_and_echo( [[0,1,2,3]] , "a","aaaa",4 ); test_search_and_echo( [[0,1,2,3],[0,1,2,3]] , "aa","aaaa",0 ); //Misses test_search_and_echo( [], "b","aaaa" ); test_search_and_echo( [], "b","aaaa",1 ); test_search_and_echo( [[]], "b","aaaa",0 ); test_search_and_echo( [[]], "b","aaaa",2 ); test_search_and_echo( [], "bb","aaaa" ); test_search_and_echo( [], "bb","aaaa",1 ); test_search_and_echo( [[],[]], "bb","aaaa",0 ); test_search_and_echo( [[],[]], "bb","aaaa",2 ); //Miss - empties test_search_and_echo( [], "","aaaa" ); test_search_and_echo( [], "","" ); test_search_and_echo( [], "a","" ); //Unicode tests echo ("----- Lookup of multi-byte into 1 byte"); test_search_and_echo( [], "Л","aaaa" ); test_search_and_echo( [], "🂡","aaaa" ); test_search_and_echo( [[]], "Л","aaaa",0 ); test_search_and_echo( [[]], "🂡","aaaa",0 ); test_search_and_echo( [], "ЛЛ","aaaa" ); test_search_and_echo( [], "🂡🂡","aaaa" ); test_search_and_echo( [[],[]], "ЛЛ","aaaa",0 ); test_search_and_echo( [[],[]], "🂡🂡","aaaa",0 ); echo ("----- Lookup of 1-byte into multi-byte"); test_search_and_echo( [] , "a","ЛЛЛЛ" ); test_search_and_echo( [] , "a","🂡🂡🂡🂡" ); test_search_and_echo( [] , "a","ЛЛЛЛ",1 ); test_search_and_echo( [[]] , "a","🂡🂡🂡🂡",0 ); test_search_and_echo( [[]] , "a","🂡🂡🂡🂡",2 ); echo ("----- Lookup of 1-byte into mixed multi-byte"); test_search_and_echo( [0], "a","aЛaЛaЛaЛa" ); test_search_and_echo( [0], "a","a🂡a🂡a🂡a🂡a" ); test_search_and_echo( [0], "a","a🂡Л🂡a🂡Л🂡a" ); test_search_and_echo( [[0,2,4,6,8]], "a","aЛaЛaЛaЛa",0 ); test_search_and_echo( [[0,2,4,6,8]], "a","a🂡a🂡a🂡a🂡a", 0 ); test_search_and_echo( [[0,4,8]] , "a","a🂡Л🂡a🂡Л🂡a", 0 ); echo ("----- Lookup of 2-byte into 2-byte"); test_search_and_echo( [0] , "Л","ЛЛЛЛ" ); test_search_and_echo( [[0,1,2,3]] , "Л","ЛЛЛЛ",0 ); echo ("----- Lookup of 2-byte into 4-byte"); test_search_and_echo( [] , "Л","🂡🂡🂡🂡" ); echo ("----- Lookup of 4-byte into 4-byte"); test_search_and_echo( [0] , "🂡","🂡🂡🂡🂡" ); test_search_and_echo( [[0,1,2,3]], "🂡","🂡🂡🂡🂡",0 ); echo ("----- Lookup of 4-byte into 2-byte"); test_search_and_echo( [] , "🂡","ЛЛЛЛ" ); echo ("----- Lookup of 2-byte into mixed multi-byte"); test_search_and_echo( [1] , "Л","aЛaЛaЛaЛa",1 ); test_search_and_echo( [] , "Л","a🂡a🂡a🂡a🂡a", 1 ); test_search_and_echo( [2] , "Л","a🂡Л🂡a🂡Л🂡a", 1 ); test_search_and_echo( [[1,3,5,7]] , "Л","aЛaЛaЛaЛa",0 ); test_search_and_echo( [[]] , "Л","a🂡a🂡a🂡a🂡a", 0 ); test_search_and_echo( [[2,6]] , "Л","a🂡Л🂡a🂡Л🂡a", 0 ); echo ("----- Lookup of 4-byte into mixed multi-byte"); test_search_and_echo( [] , "🂡","aЛaЛaЛaЛa",1 ); test_search_and_echo( [1] , "🂡","a🂡a🂡a🂡a🂡a", 1 ); test_search_and_echo( [[]] , "🂡","aЛaЛaЛaЛa",0 ); test_search_and_echo( [[1,3,5,7]] , "🂡","a🂡a🂡a🂡a🂡a", 0 ); test_search_and_echo( [[1,3,5,7]] , "🂡","a🂡Л🂡a🂡Л🂡a", 0 ); echo ("----- Lookup of mixed multi-byte into mixed multi-byte"); test_search_and_echo( [[0,2,4,6,8],[1,3,5,7],[]], "aЛ🂡","aЛaЛaЛaЛa",0 ); test_search_and_echo( [[0,2,4,6,8],[],[1,3,5,7]], "aЛ🂡","a🂡a🂡a🂡a🂡a", 0 ); test_search_and_echo( [[0,4,8],[2,6],[1,3,5,7]] , "aЛ🂡","a🂡Л🂡a🂡Л🂡a", 0 ); test_search_and_echo( [[1,3,5,7],[0,4,8],[2,6]] , "🂡aЛ","a🂡Л🂡a🂡Л🂡a", 0 ); openscad-2019.05/testdata/scad/misc/search-tests.scad0000644000076500000240000000657413414440264023034 0ustar kintelstaff00000000000000// string searches simpleSearch1=search("a","abcdabcd"); echo(str("Characters in string (\"a\"): ",simpleSearch1)); simpleSearch2=search("adeq","abcdeabcd",0); echo(str("Characters in string (\"adeq\"): ",simpleSearch2)); sTable1=[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9] ]; s1= search("abe",sTable1); echo(str("Default string search (\"abe\"): ",s1)); sTable2=[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9],["a",10],["a",11] ]; s2= search("abe",sTable2,0); echo(str("Return all matches for string search (\"abe\"): ",s2)); sTable3=[ ["a",1],["b",2],["c",3],["d",4],["a",5],["b",6],["c",7],["d",8],["e",9],["a",10],["a",11] ]; s3= search("abe",sTable3,2); echo(str("Return up to 2 matches for string search (\"abe\"): ",s3)); sTable4=[ [1,"a",[20]],[2,"b",21],[3,"c",22],[4,"d",23],[5,"a",24],[6,"b",25],[7,"c",26],[8,"d",27],[9,"e",28],[10,"a",29],[11,"a",30] ]; s4= search("aebe",sTable4,2,1); echo(str("Return up to 2 matches for string search; alternate columns (\"aebe\"): ",s4)); // s5= search("abe",sTable4,2,1,3); // bounds checking needs fixing. // echo(str("Return up to 2 matches for string search; alternate columns: ",s4)); // Value searches vTable1=[1,2,3]; v1 = search(3, vTable1); echo(str("Default value search (3): ", v1)); vTable1=[1,2,3]; v2 = search(4, vTable1); echo(str("Value not found (4): ", v2)); vTable2=[[0,1],[1,2],[2,3]]; v3 = search([[1,2]], vTable2); echo(str("Value vector ([1,2]): ", v3)); // number searches nTable1=[ [1,"a"],[3,"b"],[2,"c"],[4,"d"],[1,"a"],[7,"b"],[2,"c"],[8,"d"],[9,"e"],[10,"a"],[1,"a"] ]; n1 = search(7,nTable1); echo(str("Default number search (7): ",n1)); n2 = search(1,nTable1,0); echo(str("Return all matches for number search (1): ",n2)); n3 = search(1,nTable1,2); echo(str("Return up to 2 matches for number search (1): ",n3)); // list searches lTable1=[ [1,"a"],[3,"b"],[2,"c"],[4,"d"],[1,"a"],[7,"b"],[2,"c"],[8,"d"],[9,"e"],[10,"a"],[1,"a"] ]; lSearch1=[1,3,1000]; l1=search(lSearch1,lTable1); echo(str("Default list number search (",lSearch1,"): ",l1)); lTable2=[ ["cat",1],["b",2],["c",3],["dog",4],["a",5],["b",6],["c",7],["d",8],["e",9],["apple",10],["a",11] ]; lSearch2=["b","zzz","a","c","apple","dog"]; l2=search(lSearch2,lTable2); echo(str("Default list string search (",lSearch2,"): ",l2)); lTable3=[ ["cat",1],["b",2],["c",3],[4,"dog"],["a",5],["b",6],["c",7],["d",8],["e",9],["apple",10],["a",11] ]; lSearch3=["b",4,"zzz","c","apple",500,"a",""]; l3=search(lSearch3,lTable3); echo(str("Default list mixed search (",lSearch3,"): ",l3)); l4=search(lSearch3,lTable3,0); echo(str("Return all matches for mixed search (",lSearch3,"): ",l4)); lSearch5=[1,"zz","dog",500,11]; l5=search(lSearch5,lTable3,0,1); echo(str("Return all matches for mixed search; alternate columns (",lSearch5,"): ",l5)); // causing warnings lTableW1=[ ["a",1],123 ]; echo(search("a", lTableW1, num_returns_per_match=0)); lTableW2=[ ["a",1],"string" ]; echo(search("a", lTableW2, num_returns_per_match=0)); lTableW3=[ ["b",1] ]; echo(search("a", lTableW3, num_returns_per_match=0)); lTableW4=[ ["a",1] ]; echo(search("abcd", lTableW4, num_returns_per_match=0)); echo(search("abcd", "xyz", num_returns_per_match=0)); lTableW5=[ ["a",1],undef,1/0,-1/0 ]; echo(search("a", lTableW5, num_returns_per_match=0)); lTableW6=[ ["a",1],-1/0]; echo(search("a", lTableW6, num_returns_per_match=0)); // for completeness cube(1.0); openscad-2019.05/testdata/scad/misc/sfære.scad0000644000076500000240000000005213402025764022121 0ustar kintelstaff00000000000000include sphere(radius); openscad-2019.05/testdata/scad/misc/special-consts.scad0000644000076500000240000000314713402025764023350 0ustar kintelstaff00000000000000a=undef; b=undef; echo("-- comparing undef --"); if(undef == undef){ echo("undef is undef"); } if(a == undef){ echo("a is undef"); } if(undef == a){ echo("undef is a"); } if(a == b){ echo("a is b"); } if(c == undef){ echo("c is undef"); } if(undef == c){ echo("undef is c"); } if($customSpecialVariable == undef){ echo("$customSpecialVariable is undef"); } echo("-- comparing undef --"); if(a){ echo("undef evaluates true"); }else{ echo("undef evaluates false"); } echo(str("undef evaluates ",c ? true:false)); echo("-- echo undef --"); echo(a); echo(c); echo("-- calculating with undef --"); echo(a/1); echo(a/0); echo(1/a); echo("-- calculating resulting in +inf --"); echo(1/0); echo(-1/-0); echo("-- calculating resulting in -inf --"); echo(1/-0); echo(-1/0); d = 10/0; e = -1/-0; echo("-- comparing inf --"); if(d==e){ echo("inf == inf"); }else{ echo("inf != inf"); } echo("-- calculating with inf --"); f = d+1; echo(str("inf + 1 is ",f)); g = e -1000; echo(str("inf - 1000 is ",g)); echo(str("inf * inf is ",d*e)); echo(str("inf / -0 is ",d/-0)); echo(str("inf / inf is ",d/e)); echo("-- comparing nan --"); NotANumber = d/e; if(NotANumber == NotANumber){ echo("nan = nan"); }else{ echo("nan != nan"); } //Do not output NotANumber in a test case //as the precise output varies with different c++ compilers. //echo(NotANumber); //circle(NotANumber); echo("-- 3d objects --"); cube(a); sphere(e); cylinder(r=-1/0,h=e); echo("-- for loops --"); for(y = [0:NotANumber]){ echo(y); } for(j = [a : b]){ echo(j); } for(i = [-1/0 : 1/0]){ echo(i); } openscad-2019.05/testdata/scad/misc/square10.scad0000644000076500000240000000001413402025764022050 0ustar kintelstaff00000000000000square(10); openscad-2019.05/testdata/scad/misc/string-indexing.scad0000644000076500000240000000037613402025764023533 0ustar kintelstaff00000000000000test = "test"; // Correct usage cases for(i = [0:len(test)-1]) { echo(test[i]); } // Out of bounds echo(test[-1]); echo(test[len(test)]); // Invalid index type echo(test["test"]); echo(test[true]); echo(test[false]); echo(test[[0]]); echo(test[1.7]);openscad-2019.05/testdata/scad/misc/string-test.scad0000644000076500000240000000014513402025764022677 0ustar kintelstaff00000000000000echo("The quick brown fox \tjumps \"over\" the lazy dog.\rThe quick brown fox.\nThe \\lazy\\ dog."); openscad-2019.05/testdata/scad/misc/string-unicode.scad0000644000076500000240000000315713402025764023354 0ustar kintelstaff00000000000000//Test length reporting text_1bytes_len = "1234"; text_2bytes_len = "ЛЛЛЛ"; text_4bytes_len = "🂡🂱🃁🃑"; echo( "text_1bytes_len = ", text_1bytes_len, " len = ", len(text_1bytes_len) ); echo( "text_2bytes_len = ", text_2bytes_len, " len = ", len(text_2bytes_len) ); echo( "text_4bytes_len = ", text_4bytes_len, " len = ", len(text_4bytes_len) ); //Test how well arrays of unicode string are accessed. texts_array = [ "DEADBEEF", "Ленивый рыжий кот", "كسول الزنجبيل القط", "懶惰的姜貓", "äöü ÄÖÜ ß", "😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐", "⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏", "🂡🂱🃁🃑", ]; text_2bytes = "Ленивый рыжий кот"; text_4bytes = "🂡🂱🃁🃑"; //Test all the normal accesses for (text_array_idx = [0:(len(texts_array)-1)]) { echo( "[", text_array_idx, "] = ", texts_array[text_array_idx], " of len=", len(texts_array[text_array_idx]), ":" ); for (text_idx = [0:(len(texts_array[text_array_idx])-1)]) { echo( " [", text_idx, ,"]=", texts_array[text_array_idx][text_idx] ); } } //Test one past the last element of (x-byte unicode). This will be one past the length but inside the char length of the string echo( "Past end of unicode only 2-byte ", text_2bytes[len(text_2bytes)] ); echo( "Past end of unicode only 4-byte ", text_4bytes[len(text_4bytes)] ); //Test past the last element of (x-byte unicode). Outside both lengths. echo( "Past end of both 2-byte ", text_2bytes[ len(text_2bytes) * 2 ] ); echo( "Past end of both 4-byte ", text_4bytes[ len(text_4bytes) * 4 ] ); openscad-2019.05/testdata/scad/misc/størrelse.scad0000644000076500000240000000001313402025764023044 0ustar kintelstaff00000000000000radius=10; openscad-2019.05/testdata/scad/misc/sub1/errors-warnings-incuse.scad0000644000076500000240000000014313402025764025712 0ustar kintelstaff00000000000000module moduleWithErrorIncUse(){ echo(xyz); circle(r=1,d=test()); } moduleWithErrorIncUse();openscad-2019.05/testdata/scad/misc/sub1/included.scad0000644000076500000240000000021513402025764023053 0ustar kintelstaff00000000000000echo("included.scad"); // Issue #837 - non-existing file causes subsequent include to fail include include openscad-2019.05/testdata/scad/misc/sub1/included2.scad0000644000076500000240000000003013402025764023130 0ustar kintelstaff00000000000000echo("included2.scad"); openscad-2019.05/testdata/scad/misc/sub1/sub2/sub3/include-test4.scad0000644000076500000240000000007313402025764025501 0ustar kintelstaff00000000000000module test4() { cylinder(r=0.5, $fn=10, center=true); } openscad-2019.05/testdata/scad/misc/sub1/sub2/sub3/sub4/include-test2.scad0000644000076500000240000000026213402025764026354 0ustar kintelstaff00000000000000//Test nested include include //Test relative file location include <../include-test4.scad> test2_variable = 0.7; module test2() { cube(center=true); } openscad-2019.05/testdata/scad/misc/sub1/sub2/sub3/sub4/include-test3.scad0000644000076500000240000000007413402025764026356 0ustar kintelstaff00000000000000module test3() { cylinder(r1=0.7, r2=0.2, center=true); } openscad-2019.05/testdata/scad/misc/sub1/sub2/sub3/sub4/use-test2.scad0000644000076500000240000000033313402025764025524 0ustar kintelstaff00000000000000//Test nested use use //Test relative file location use <../use-test4.scad> test2_variable = 0.7; module test2() { translate([2,0,0]) test3(); translate([2,-2,0]) test4(); cube(center=true); } openscad-2019.05/testdata/scad/misc/sub1/sub2/sub3/sub4/use-test3.scad0000644000076500000240000000007413402025764025527 0ustar kintelstaff00000000000000module test3() { cylinder(r1=0.7, r2=0.2, center=true); } openscad-2019.05/testdata/scad/misc/sub1/sub2/sub3/use-test4.scad0000644000076500000240000000007313402025764024652 0ustar kintelstaff00000000000000module test4() { cylinder(r=0.5, $fn=10, center=true); } openscad-2019.05/testdata/scad/misc/sub2/incuse.scad0000644000076500000240000000012313402025764022551 0ustar kintelstaff00000000000000use<../sub1/errors-warnings-incuse.scad>; unknownIncuse(); moduleWithErrorIncUse();openscad-2019.05/testdata/scad/misc/sub2/test7.scad0000644000076500000240000000006513402025764022336 0ustar kintelstaff00000000000000module test7() { cube([0.5,0.5,1], center=true); } openscad-2019.05/testdata/scad/misc/sub2/useuse.scad0000644000076500000240000000013013402025764022572 0ustar kintelstaff00000000000000use<../errors-warnings-use.scad>; module sub2(){ unknown(); moduleWithError(); }openscad-2019.05/testdata/scad/misc/tail-recursion-tests.scad0000644000076500000240000000241313402025764024514 0ustar kintelstaff00000000000000function substring(text, start, end = -1, idx = -1, res = "") = idx < end && idx < len(text) ? substring(text, start, end, idx < 0 ? start + 1 : idx + 1, str(res, text[idx < 0 ? start : idx])) : res; // normal recursion, no tail-recursion elimination possible function f3a(a, ret = 0) = a <= 0 ? 0 : a + f3a(a - 1); echo("without tail-recursion eliminiation: ", f3a(100)); // this allows tail-recursion eliminiation function f3b(a, ret = 0) = a <= 0 ? ret : f3b(a - 1, ret + a); echo("with tail-recursion eliminiation: ", f3b(100)); // check tail-recursion eliminiation by using a high loop count function f3c(a, ret = 0) = a <= 0 ? ret : f3c(a - 1, ret + a); echo("with tail-recursion eliminiation: ", f3c(2000)); // use nested function call function f1(x, y = []) = x <= 0 ? y : f1(x - 1, concat(y, [[x, x]])); echo(f1(2000)[20]); // recursion in the "false" part of the ternary operator function c(a, b) = chr(a % 26 + b); function f2a(x, y = 0, t = "") = x <= 0 ? t : f2a(x - 1, y + 2, str(t, c(y, 65))); s1 = f2a(50000); echo(len(s1), substring(s1, 0, 40)); // recursion in the "true" part of the ternary operator function f2b(x, y = 0, t = "") = x > 0 ? f2b(x - 1, y + 1, str(t, chr((y % 26) + 97))) : t; s2 = f2b(50000); echo(len(s2), substring(s2, 0, 40)); openscad-2019.05/testdata/scad/misc/unicode-tests.scad0000644000076500000240000000057613402025764023212 0ustar kintelstaff00000000000000echo("A"); // \x only allows \x01 - \x7f, everything outside that range is not handled echo("\x30\x31\x3a\x3A\x80\xFF"); echo("\u0 \U0"); echo("\u00 \U00"); echo("\u000 \U000"); echo("\u0000\u0030\u0031\u003a\u003A \u2698 \u27BE \U0000"); echo("\u00000 \U00000"); echo("\U000000\U000030\U000031\U00003a\U00003A \U01F638 \U01F0A1 "); echo("\u0000000 \U0000000"); echo("B"); openscad-2019.05/testdata/scad/misc/use test6.scad0000644000076500000240000000015213402025764022234 0ustar kintelstaff00000000000000module test6() { difference() { cube(center=true); cylinder(r=0.4, h=2, center=true); } } openscad-2019.05/testdata/scad/misc/use-test5.scad0000644000076500000240000000005313402025764022250 0ustar kintelstaff00000000000000module test5() { sphere(r=0.5, $fn=8); } openscad-2019.05/testdata/scad/misc/utf8-tests-inc.scad0000644000076500000240000000013513402025764023210 0ustar kintelstaff00000000000000m1 = "☺ - text - 😀 - more text!"; module m1() { echo("utf8-1: ☺ - ⚀⚁⚂⚃"); } openscad-2019.05/testdata/scad/misc/utf8-tests-use.scad0000644000076500000240000000016413402025764023235 0ustar kintelstaff00000000000000m2 = "☺ - text - 😀 - more text!"; function f_m2() = m2; module m2() { echo("utf8-2: ☺ - ⚀⚁⚂⚃"); } openscad-2019.05/testdata/scad/misc/utf8-tests.scad0000644000076500000240000000066213402025764022446 0ustar kintelstaff00000000000000// Check import<> and use<> all handle UTF-8 correctly for both // string usage and comparison. // // https://github.com/openscad/openscad/issues/875 include use m = "☺ - text - 😀 - more text!"; echo("main: ☺ - ⚀⚁⚂⚃ - 😀 - "); m1(); m2(); if (m == m1) { echo("m1 ok"); } else { echo("m1 not ok"); } if (m == f_m2()) { echo("m2 ok"); } else { echo("m2 not ok"); } openscad-2019.05/testdata/scad/misc/value-reassignment-tests.scad0000644000076500000240000000046413402025764025371 0ustar kintelstaff00000000000000// Test reassignment which depends on a previously assigned variable, // as this could be messed up if order of assignment evaluation // changes myval = 2; i = 2; myval = i * 2; // This is not (yet) allowed as it will be evaluates in place of the first assignment echo(myval, i); // Should output undef, 2 openscad-2019.05/testdata/scad/misc/value-reassignment-tests2.scad0000644000076500000240000000117413402025764025452 0ustar kintelstaff00000000000000// Test reassignment where another variable has used the previous // value before the reassignment. This could get messed up if order of // assignment evaluation changes myval = 2; i = myval; myval = 3; echo(myval, i); // Should output 3, 3 // NB! This feels wrong, but it's a simulation of what happens // when overriding a variable on the cmd-line: openscad -Dmyval=3 myfile.scad // Since the intention is to override a top-level variable, the evaluation of the // new expression must be done in the same place as the old. // This is currently solved by appending the text given to the -D parameter to the end // of the main file. openscad-2019.05/testdata/scad/misc/variable-scope-sub.scad0000644000076500000240000000067113402025764024103 0ustar kintelstaff00000000000000sub_global = 15; module submodule() { echo($children); echo(submodule_var); submodule_var = 16; module subsubmodule() { echo($children); subsubmodule_var = 17; echo(subsubmodule_var); child(0); } subsubmodule() {child(0); sphere();} } module submodule2() { echo(sub_global); echo($children); } module submain() { echo(global_var); // Undefined global var submodule() {submodule2() sphere(); cube();} } openscad-2019.05/testdata/scad/misc/variable-scope-tests.scad0000644000076500000240000000350113402025764024447 0ustar kintelstaff00000000000000echo("special variable inheritance"); module special_module(a) { echo(a, $fn); special_module2(a); } module special_module2(b) { echo(a); echo(b, $fn); } special_module(23, $fn=5); echo("$children scope"); module child_module_2() { echo("$children should be 4: ", $children); for(i=[0:$children-1]) children(i); } module child_module_1() { echo("$children should be 1: ", $children); child_module_2() { echo("$children should be 1: ", $children); children(0); echo("child_module_2 child 0"); echo("child_module_2 child 1"); } } child_module_1() echo("child_module_1 child"); echo("copy $children"); module copy_children_module() { kids = $children; echo("copy_children_module: ", kids, $children); } copy_children_module() { cube(); sphere(); } echo("inner variables shadows parameter"); module inner_variables(a, b) { b = 24; echo(a, b); } inner_variables(5, 6); echo("user-defined special variables as parameter"); module user_defined_special($b) { echo($b); user_defined_special2(); } module user_defined_special2() { echo($b); } user_defined_special(7); echo("assign only visible in children's scope"); module assigning() { echo(c); } module assigning2(c) { echo(c); } assign(c=5) { assigning(); assigning2(c); } echo("undeclared variable can still be passed and used"); module undeclared_var() { echo(d); } undeclared_var(d=6); echo("attempt to assign from a not-yet-defined variable which also exists globally"); globalval = 1; // Test that b = a turns into b = 1, heeding the order of the assignments // See issue #399 for more discussion module global_lookup() { b = globalval; // Should be assigned 1 since the local one isn't yet defined globalval = 5; // Overrides the value for the local scope only echo(globalval,b); // Should output 5, 1 } global_lookup(); openscad-2019.05/testdata/scad/misc/vector-values.scad0000644000076500000240000000157013402025764023216 0ustar kintelstaff00000000000000// Value vector tests. a1=[0,1,2]; b1=[3,4,5]; c1=a1*b1; echo(str("Testing vector dot product: ",c1)); d1=[1,0]; echo(str(" Bounds check: ",a1*d1)); m2=[[0,1],[1,0],[2,3]]; v2=[2,3]; p2=m2*v2; echo(str("Testing matrix * vector: ",p2)); d2=[0,0,1]; echo(str(" Bounds check: ",m2*d2)); m3=[[1,-1],[1,0],[2,3]]; v3=[1,2,3]; p3=v3*m3; echo(str("Testing vector * matrix: ",p3)); echo(str(" Bounds check: ",m3*v3)); ma4=[ [1,0],[0,1] ]; mb4=[ [1,0],[0,1] ]; echo(str("Testing id matrix * id matrix: ",ma4*mb4)); ma5=[ [1, 0, 1] ,[0, 1,-1] ]; mb5=[ [1,0] ,[0,1] ,[1,1] ]; echo(str("Testing asymmetric matrix * matrix: ",ma5*mb5)); echo(str("Testing alternate asymmetric matrix * matrix: ",mb5*ma5)); echo(str(" Bounds check: ",ma5*ma4)); ma6=[ [ 1, 2 ], undef ]; mb6=[ [ 4 ], [ 5 ] ]; echo(str("Testing matrix * matrix with undef elements: ",ma6*mb6)); cube(1.0); openscad-2019.05/testdata/scad/nef3/nef3_broken.scad0000644000076500000240000000025013417146624022511 0ustar kintelstaff00000000000000//https://github.com/CGAL/releases/blob/master/examples/Minkowski_sum_3/cube.nef3 //broken by changing an arbitrary digit to a letter import("../../nef3/broken.nef3"); openscad-2019.05/testdata/scad/nef3/nef3_cube.scad0000644000076500000240000000016213417146624022151 0ustar kintelstaff00000000000000//https://github.com/CGAL/releases/blob/master/examples/Minkowski_sum_3/cube.nef3 import("../../nef3/cube.nef3"); openscad-2019.05/testdata/scad/non-aff-matrix.scad0000644000076500000240000000027313402025764022311 0ustar kintelstaff00000000000000multmatrix(m = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, -0.02, 1]]) linear_extrude(height=20) circle(r=10); openscad-2019.05/testdata/scad/stl/stl-export.scad0000644000076500000240000000004613402025764022404 0ustar kintelstaff00000000000000translate([1,1,9]) cube(8); cube(10); openscad-2019.05/testdata/scad/svg/box-w-holes-2d.scad0000644000076500000240000000007213454517233022732 0ustar kintelstaff00000000000000import("../../svg/box-w-holes.svg", center=true, dpi=72); openscad-2019.05/testdata/scad/svg/extruded/box-w-holes.scad0000644000076500000240000000105613454517233024256 0ustar kintelstaff00000000000000// Box should have 50 mm sides // Holes should be 5 mm in diameter // linear_extrude(height = 2, center = true) import("../../../svg/box-w-holes.svg", center=true, dpi=72); color("black") difference() { cube([56, 56, .1], center = true); cube([55, 55, 1], center = true); } color("red") { translate([15, 15, 0]) cylinder(r = 2, h = .1, $fn = 32); translate([15, -15, 0]) cylinder(r = 2, h = .1, $fn = 32); translate([-15, 15, 0]) cylinder(r = 2, h = .1, $fn = 32); translate([-15, -15, 0]) cylinder(r = 2, h = .1, $fn = 32); } openscad-2019.05/testdata/scad/svg/extruded/simple-center.scad0000644000076500000240000000040313454517233024654 0ustar kintelstaff00000000000000linear_extrude(1, center = true) import("../../../svg/simple.svg", center = true); color("red") cylinder(r = 2, h = 0.4, center = true, $fn = 32); color("green") difference() { cube([25, 25, 0.2], center = true); cube([23, 23, 1], center = true); } openscad-2019.05/testdata/scad/svg/extruded/viewbox-test.scad0000644000076500000240000000047613454517233024557 0ustar kintelstaff00000000000000file = ""; difference() { union() { cube([200, 160, 4], center = true); } translate([-75, -50, 0]) linear_extrude(10, center = true, convexity = 3) import(file); } color("black") difference() { cube([152.1, 102.1, 10], center = true); cube([149.9, 99.9, 12], center = true); } openscad-2019.05/testdata/scad/svg/simple-center-2d.scad0000644000076500000240000000005713454517233023340 0ustar kintelstaff00000000000000import("../../svg/simple.svg", center = true); openscad-2019.05/testdata/scad/svg/svg-spec/spec-paths-arcs01.scad0000644000076500000240000000006713437640540025153 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-paths-arcs01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-paths-arcs02.scad0000644000076500000240000000006713437640540025154 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-paths-arcs02.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-paths-cubic01.scad0000644000076500000240000000007013437640540025302 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-paths-cubic01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-paths-cubic02.scad0000644000076500000240000000007013437640540025303 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-paths-cubic02.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-paths-quad01.scad0000644000076500000240000000006713437640540025155 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-paths-quad01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-paths-triangle01.scad0000644000076500000240000000007313437640540026025 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-paths-triangle01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-circle01.scad0000644000076500000240000000007213437640540025624 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-circle01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-ellipse01.scad0000644000076500000240000000007313437640540026021 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-ellipse01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-line01.scad0000644000076500000240000000007013437640540025310 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-line01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-polygon01.scad0000644000076500000240000000007313437640540026053 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-polygon01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-polyline01.scad0000644000076500000240000000007413437640540026220 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-polyline01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-rect01.scad0000644000076500000240000000007013437640540025316 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-rect01.svg"); openscad-2019.05/testdata/scad/svg/svg-spec/spec-shapes-rect02.scad0000644000076500000240000000007013437640540025317 0ustar kintelstaff00000000000000import("../../../svg/svg-spec/spec-shapes-rect02.svg"); openscad-2019.05/testdata/scad/templates/import_3mf-tests-template.scad0000644000076500000240000000037013402025764026507 0ustar kintelstaff00000000000000translate([4,0,0]) import("import.3mf"); translate([0,4,0]) import("@CMAKE_SOURCE_DIR@/../testdata/scad/3D/features/import.3mf"); translate([4,4,0]) { difference() { import("not-found.3mf"); cube([1,1,4], center=true); } } openscad-2019.05/testdata/scad/templates/import_dxf-tests-template.scad0000644000076500000240000000146213450037261026604 0ustar kintelstaff00000000000000import("notfound.dxf"); import(); translate([-210,0,0]) import(file="../../../dxf/polygons.dxf"); translate([-210,0,0]) import(file="../../../dxf/polygons.dxf", origin=[0,110]); translate([-210,0,0]) import(file="../../../dxf/polygons.dxf", origin=[110,110], scale=0.5); import(file="../../../dxf/multiple-layers.dxf"); translate([-200,200,0]) import(file="../../../dxf/multiple-layers.dxf", layer="0"); translate([0,200,0]) import(filename="../../../dxf/multiple-layers.dxf", layername="0"); translate([200,200,0]) import(file="../../../dxf/multiple-layers.dxf", layer="noname"); translate([0,200,0]) import(file="../../../dxf/multiple-layers.dxf", layer="Layer with a pretty long name including \\ \"special\" /'\\\\ characters"); translate([200,0,0]) import(file="@CMAKE_SOURCE_DIR@/../testdata/dxf/polygons.dxf"); openscad-2019.05/testdata/scad/templates/import_stl-tests-template.scad0000644000076500000240000000063213402025764026625 0ustar kintelstaff00000000000000translate([2,0,0]) import("import.stl"); translate([4,0,0]) import("import_bin.stl"); // Test binary STLs which happen to start with the string "solid" translate([0,4,0]) import("import_bin_solid.stl"); translate([0,2,0]) import("@CMAKE_SOURCE_DIR@/../testdata/scad/3D/features/import.stl"); translate([2,2,0]) { difference() { import("not-found.stl"); cube([1,1,4], center=true); } } openscad-2019.05/testdata/scad/templates/include-tests-template.scad0000644000076500000240000000242713402025764026060 0ustar kintelstaff00000000000000//Test that the entire path is pushed onto the stack upto the last '/' include //Subdir include //Test that a non existent path/file doesn't screw things up include //Test with empty path include //Test without preceding space include //Test that filenames with spaces work include //Test with empty file include //Test with empty path and file include //Test with absolute path include <@CMAKE_SOURCE_DIR@/../testdata/scad/misc/sub2/test7.scad> // Test simple MCAD include include // Test MCAD include which includes another file include // Test MCAD include which uses another file include module test1() { test2(); translate([2,0,0]) test3(); translate([2,-2,0]) test4(); translate([-2,0,0]) test5(); translate([-2,-2,0]) test6(); translate([0,2,0]) test7(); //Just to give a top level object translate([0,-2,0]) sphere(test2_variable, $fn=16); // MCAD translate([0,-4,0]) cube([TAU/4,0.5,0.5], center=true); translate([-2,-4,0]) cube([deg(0.5)/20,0.5,0.5], center=true); translate([2,-4,-0.5]) scale(0.05) alignds420([0,0,0], [0,0,0]); } test1(); openscad-2019.05/testdata/scad/templates/use-tests-template.scad0000644000076500000240000000244613402025764025232 0ustar kintelstaff00000000000000//Test blank use <> //Test that the entire path is pushed onto the stack upto the last '/' use //Test that a non existent path/file doesn't screw things up use //Test with empty path use //Test without preceding space use //Test that filenames with spaces work use //Test with empty file use //Test with empty path and file use //Test with absolute path use <@CMAKE_SOURCE_DIR@/../testdata/scad/misc/sub2/test7.scad> // Test simple MCAD library use // Test MCAD library which includes another file use // Test MCAD library which uses another file use module test1() { test2(); // test3() and test4() are not directly included and thus not imported into // this scope translate([4,0,0]) test3(); translate([4,-2,0]) test4(); translate([-2,0,0]) test5(); translate([-2,-2,0]) test6(); translate([0,2,0]) test7(); // test2_variable won't be visible translate([0,-2,0]) sphere(test2_variable, $fn=16); // MCAD translate([0,-4,0]) teardrop(0.3, 1.5, 90); translate([-2,-4,0]) cube([deg(0.5)/20,0.5,0.5], center=true); translate([2,-4,-0.5]) scale(0.05) alignds420([0,0,0], [0,0,0]); } test1(); openscad-2019.05/testdata/stl/adns2610_dev_circuit_inv.stl0000644000076500000240000013003413432700636023735 0ustar kintelstaff00000000000000VCG L@AAL@AL@L@ A AL@L@ AWAA AAA333σBA? A33σBA333++ A+̿+ A̿֨SA֨SA̿֨S333A֨SAff濚MALMAC=?AσBAff濚MA33σBA33dXAAdXA33?σBA~@wzA?σBA?dXAdXA AAff濚MAA33dXAdXAAff̎AdXAff̎A33AA@ A@\1dXA33AAAAY@WA AA33s@̎Aff&@WAL̎A AA33WAAWAfff@֨S>\1̌@֨Sff̎AA33WA33σBAL̾\1?$`4h@پ̠@L̾\1~@D>@33@\1?Y@@@\1 A?\133?WAY@AAff?}AL33σBA̾\1?̾\1?33σBAL@̾\1?L@$`4h@L@33σBA$`4I@ڪ@L?>\1?L>MALMA?dXAfff@\1?C=?*n@@h@$`4I@33σBAپff@̬@dXA AA@MAپff@33σBAڪ@? AσBAC=?AY@AA AAff?}Aڪ@>\1?پ̠@?σBALMAL>MA33?WAff&@AAY@AA~@wzALMA?σBA?dXA AA33?dXAY@dXA AA33s@MAff&@dXAff?MA AAff?MA33?dXA AALMAdXA?dXAdXAAAL>}AdXAL>}A?σrAdXA?σrA33?σrAdXA33?σrA AA33?σrAff?}A AA?WAAA33?WA33s@̎A AAY@AAL>}AAA?WAL?ڪ@?>\1L??\1̌@֨S?\1 A @MA33?σBAff&@dXA?\1?ڪ@@\1? @̎AAAff&@WA@\1333@ Ǎ@\1 Afff@\1?ڪ@?\1?~@wzA33?σBA @MAff&@WA AAY@WA~@wzA @MAff&@σBA~@wzAff&@σBAY@σBA33@dXAY@σBA AAY@σBA33s@MA AAff&@dXA AAY@dXA33?σBAff?MAff&@dXA33?WAAA @̎A?\1L??ff&@AA33?WA @̎A@ Ǎ@+WA AAL̎A̾\1L@L@?@fff@\1?L@fff@+fff@+ Afff@+̌@+ AL@ڪ@?@̌@֨S A@>\1?\1̌@֨Sfff@֨S̾\1>\1L@̾\1fff@֨S@\1?ڪ@L@333@@\1?fff@\1333@fff@\1 Afff@\1@\1?L@@ Ǎ@\1̌@\1?_a.@*n@@fff@\1?@h@̌@\1?@h@_a.@*n@̌@\1??@C=?*n@fff@\1?~@wzAY@σBAff@MAff@Y@@33@\1?~@wzAff@MA33@σBA~@wzA33@σBA̬@σBA~@wzA̬@σBA@MA~@wzA@MA AA33@dXA AA̬@dXAff@MAY@σBA33@dXAff@_a.@*n@Y@@@_a.@*n@ff@@\1?@̠@@@ff@33@\1@33@\1 A33@\1?~@D>@@\1? A@@h@ A̿+L̎Aff&@WAAA̾\1?پ̠@>\1?ڪAL@ffMAL@??L@L@̌L@?ff&@L@@L@ff&@г]L@?\@nsL@@L@ AL@?/AL@ff>[>AL@ff澣[>AL@?ff@L@33@SL@ AL@?@@\1L@@L@\@nsL@?ff?[>AL@@[>AL@@'JAL@?@\1>L@ff@ns?L@@ns?L@?/AL@33c@[>AL@@[>AL@?̾AAL@̾t[AL@ _PAL@?@\1L@@nsL@ff@nsL@?ff@?L@33@L@ AL@?33@L@@nsL@ AL@?@nsL@ff@nsL@ AL@?ff@nsL@@nsL@ AL@?@L@@}XKL@33@}XKL@?@@\1L@ff&@г]L@@L@?@SL@@L@ AL@?33@}XKL@ff@L@ AL@?@@\1>L@\@ns?L@33#@ns?L@?@nsL@\@nsL@ AL@?@L@33@}XKL@ AL@??L@/AL@AL@?33@SL@@SL@ AL@?L@L@@L@?/AL@ffMAL@AL@?ffSL@L@L@?AL@L@?L@?/AL@ff?[>AL@ff>[>AL@?/AL@ff澣[>AL@ffƿ[>AL@?Ŀ33AL@kAL@̿33AL@? AAL@ff@?L@ AL@?/AL@ff@[>AL@33c@[>AL@?/AL@@[>AL@ff?[>AL@?̎AL@AL@̿AAL@?@}AL@@AAL@?33AL@?̎AL@>WAL@>33AL@?fff@AAL@fff@t[AL@ff@\AL@?̿33AL@AL@̿WAL@?kAL@AL@̿33AL@?̎AL@{>33AL@?kAL@? AAL@AL@kAL@?q@33AL@ @kAL@@33AL@??33AL@@AAL@̾33AL@?fff@WAL@@̎AL@ AAL@? AAL@kAL@̾33AL@?̎AL@>33AL@{>33AL@?ff@\AL@@\AL@fff@AAL@?@ _PAL@@t[AL@?t[AL@? @kAL@`@kAL@ AAL@?̾33AL@̾WAL@?kAL@?kAL@kAL@ AAL@?{33AL@̾33AL@kAL@?@}AL@?33AL@?WAL@?@t[AL@@}AL@?σrAL@?@[>AL@ff@[>AL@ff@/AL@??33AL@?33AL@?kAL@?̾33AL@?kAL@?33AL@??σrAL@?t[AL@@t[AL@?}AL@>t[AL@>σrAL@??kAL@?kAL@̎AL@?@t[AL@@AAL@@}AL@?@ _PAL@ff@\AL@fff@t[AL@?@̎AL@̾33AL@@AAL@?@WAL@̾33AL@@̎AL@?@33AL@̾33AL@@WAL@? @kAL@̾33AL@@33AL@? AAL@̾33AL@ @kAL@? AAL@`@kAL@pb@33AL@? AAL@pb@33AL@fff@33AL@? AAL@fff@33AL@fff@WAL@? AAL@@̎AL@ff@/AL@?@̎AL@fff@AAL@ff@/AL@?̎AL@?kAL@̾WAL@?fff@AAL@@\AL@ff@/AL@?@\AL@33@MAL@ff@/AL@?33@MAL@@[>AL@ff@/AL@?@'JAL@33c@[>AL@ff@[>AL@?/AL@ff@/AL@ff@[>AL@?<L@ff}XKL@AL@??\1>L@?ns?L@ ?ns?L@?'JAL@ff澣[>AL@ff>[>AL@?̾AAL@>t[AL@}AL@?̎AL@̾AAL@>WAL@? _PAL@>t[AL@̾AAL@?}AL@>WAL@̾AAL@?̎AL@̿WAL@AL@?̿t[AL@̿AAL@AL@?ffMAL@̿t[AL@AL@?ff@/AL@ff@?L@ AAL@?ff@?L@@ns?L@33@L@?ff@?L@ff@ns?L@@ns?L@?ff@?L@@ns?L@ff@ns?L@?ff@?L@\@ns?L@@ns?L@?ff@?L@33#@ns?L@\@ns?L@?ff@?L@?ns?L@33#@ns?L@?ff@?L@ ?ns?L@?ns?L@?ff@?L@ ns?L@ ?ns?L@? ns?L@?L@̌L@?ff@?L@?L@ ns?L@? AL@ A AA? AAL@ AL@ AA׳]?֨S֨S@333@׳]?333֨S333@׳]??333@+@+׳]??333333@+̿֨S̿֨S@֨S@֨S̿֨S֨S@ֳ]@̿֨S@ֳ]̿֨S@̿֨Sֳ]?@̿+@ֳ]?̿+@̿+?̿+@̿++@?+@̿++Գ]?33dXA33dXA@ff濚MA@Գ]?ff濚MA33dXAff濚MA@ٳ]?>ff濚MA@33σBA@33σBAٳ]?>ff濚MAff濚MA@33σBAdXAdXA@33dXA@33dXAdXA33dXA@ӳ]LMA@dXA@LMAӳ]LMAdXA@dXAٳ]>LMA@LMAσBA@ٳ]>σBA@LMAσBA?σBA@σBA33σBA@?33σBA@σBA33σBAԳ]?33WA33WA@ff̎A@Գ]?ff̎A33WAff̎A@Գ]??ff̎A@33AA@33AAԳ]??ff̎Aff̎A@33AAWAWA@33WA@33WAWA33WA@ӳ]L̎A@WA@L̎Aӳ]L̎AWA@WAӳ]?L̎A@L̎AAA@ӳ]?AA@L̎AAA?AA@AA33AA@?33AA@AA33AAֳ]?̾\1?̾\1?@L@ֳ]?L̾\1?L@ֳ]??L@̾\1@̾\1ֳ]??LL@̾\1>\1?>\1?@̾\1?@̾\1?>\1?̾\1?@ֳ]L?@>\1?@L?ֳ]L?>\1?@>\1?ֳ]?L?@L?>\1@ֳ]?>\1@L?>\1?>\1@>\1̾\1@?̾\1@>\1̾\1S}?ͨ$`4I@$`4I@@L@@S}?ͨL@$`4I@L@@S}?Ǩ>L@@$`4h@@$`4h@S}?Ǩ>L@L@@$`4h@`l? þپff@پff@@$`4I@@`l? þ$`4I@پff@$`4I@@4K?ڪ`lC=?AC=?A@? A@>`l? AC=?A? A@>S}@A@A@C=?A@>S}C=?A@AC=?A@R}_a.@A_a.@A@@A@R}@A_a.@A@A@þ`lY@ AY@ A@_a.@A@þ`l_a.@AY@ A_a.@A@3K~@wzA~@wzA@Y@ A@3KY@ A~@wzAY@ A@3K@ff@@~@wzA@@ff@3K@ff@~@wzA@~@wzA^lþ@I@@@ff@@@I@^lþ@I@@ff@@@ff@S}Ǩ@@@@I@@@@S}Ǩ@@@I@@@I@S}>@@@@@@h@@S}>@h@@@@@h@^l>@h@@@h@@̠@@^l>@̠@@@h@@̠@8K?@̠@@@̠@~@D>@@8K?~@D>@@@̠@~@D>@:K?~@D>@@~@D>@Y@@@:K?Y@@@~@D>@Y@@þ`l?Y@@@Y@@_a.@*n@@þ`l?_a.@*n@@Y@@_a.@*n@ĨS}?_a.@*n@@_a.@*n@@h@@ĨS}?@h@@_a.@*n@@h@ƨ>S}?@h@@@h@C=?*n@@ƨ>S}?C=?*n@@@h@C=?*n@>`l?C=?*n@@C=?*n@?@@>`l??@@C=?*n@?@?;K??@@?@ڪ@@?;K?ڪ@@?@ڪ@9K??پ̠@@ڪ@@ڪ@9K??پ̠@پ̠@@ڪ@`l? >$`4h@@پ̠@@پ̠@`l? >$`4h@$`4h@@پ̠@ӳ]??dXA?dXA@L>MA@ӳ]?L>MA?dXAL>MA@ٳ]?>L>MA@?σBA@?σBAٳ]?>L>MAL>MA@?σBA33?dXA33?dXA@?dXA@?dXA33?dXA?dXA@Գ]ff?MA@33?dXA@ff?MAԳ]ff?MA33?dXA@33?dXAٳ]>ff?MA@ff?MA33?σBA@ٳ]>33?σBA@ff?MA33?σBA?33?σBA@33?σBA?σBA@??σBA@33?σBA?σBAӳ]??WA?WA@L>}A@ӳ]?L>}A?WAL>}A@ٳ]?>L>}A@?σrA@?σrAٳ]?>L>}AL>}A@?σrA33?WA33?WA@?WA@?WA33?WA?WA@Գ]ff?}A@33?WA@ff?}AԳ]ff?}A33?WA@33?WAٳ]>ff?}A@ff?}A33?σrA@ٳ]>33?σrA@ff?}A33?σrA?33?σrA@33?σrA?σrA@??σrA@33?σrA?σrAֳ]??\1??\1?@?@ֳ]???\1??@ֳ]???@?\1@?\1ֳ]????@?\1@\1?@\1?@?\1?@?\1?@\1??\1?@׳]333@@@\1?@333@׳]333@@\1?@@\1?׳]?333@@333@@\1@׳]?@\1@333@@\1?@\1@@\1?\1@??\1@@\1?\1ճ]?ff&@dXAff&@dXA@ @MA@ճ]? @MAff&@dXA @MA@ڳ]?> @MA@ff&@σBA@ff&@σBAڳ]?> @MA @MA@ff&@σBAY@dXAY@dXA@ff&@dXA@ff&@dXAY@dXAff&@dXA@ճ]33s@MA@Y@dXA@33s@MAճ]33s@MAY@dXA@Y@dXAڳ]>33s@MA@33s@MAY@σBA@ڳ]>Y@σBA@33s@MAY@σBA?Y@σBA@Y@σBAff&@σBA@?ff&@σBA@Y@σBAff&@σBAճ]?ff&@WAff&@WA@ @̎A@ճ]? @̎Aff&@WA @̎A@ճ]?? @̎A@ff&@AA@ff&@AAճ]?? @̎A @̎A@ff&@AAY@WAY@WA@ff&@WA@ff&@WAY@WAff&@WA@ճ]33s@̎A@Y@WA@33s@̎Aճ]33s@̎AY@WA@Y@WAճ]?33s@̎A@33s@̎AY@AA@ճ]?Y@AA@33s@̎AY@AA?Y@AA@Y@AAff&@AA@?ff&@AA@Y@AAff&@AA׳]?fff@֨Sfff@֨S@L@@׳]?L@fff@֨SL@@׳]??L@@fff@+@fff@+׳]??L@L@@fff@+̌@֨Š@֨S@fff@֨S@fff@֨Š@֨Sfff@֨S@ճ]@@̌@֨S@@ճ]@̌@֨S@̌@֨Sճ]?@@@̌@+@ճ]?̌@+@@̌@+?̌@+@̌@+fff@+@?fff@+@̌@+fff@+׳]?fff@\1?fff@\1?@L@@׳]?L@fff@\1?L@@׳]??L@@fff@\1@fff@\1׳]??L@L@@fff@\1̌@\1?̌@\1?@fff@\1?@fff@\1?̌@\1?fff@\1?@ճ]@@̌@\1?@@ճ]@̌@\1?@̌@\1?ճ]?@@@̌@\1@ճ]?̌@\1@@̌@\1?̌@\1@̌@\1fff@\1@?fff@\1@̌@\1fff@\1׳]?>ff@MA@33@σBA@33@σBA׳]?>ff@MAff@MA@33@σBAӳ]?33@dXA33@dXA@ff@MA@ӳ]?ff@MA33@dXAff@MA@̬@dXA̬@dXA@33@dXA@33@dXA̬@dXA33@dXA@ӳ]@MA@̬@dXA@@MAӳ]@MA̬@dXA@̬@dXA׳]>@MA@@MA̬@σBA@׳]>̬@σBA@@MA̬@σBA?̬@σBA@̬@σBA33@σBA@?33@σBA@̬@σBA33@σBAճ]?33@\1?33@\1?@ff@@ճ]?ff@33@\1?ff@@ճ]??ff@@33@\1@33@\1ճ]??ff@ff@@33@\1@\1?@\1?@33@\1?@33@\1?@\1?33@\1?@ճ]@@@\1?@@ճ]@@\1?@@\1?ճ]?@@@@\1@ճ]?@\1@@@\1?@\1@@\133@\1@?33@\1@@\133@\1ճ]??<L@ffSL@ffS@ճ]??<@<L@ffS@?SL@S@ffSL@?ffSL@S@ffS@?S@SL@L@?@S@L@?@L@@@L@?L@@@@@SL@@S@@L@@L@@S@@@?33@SL@33@S@@SL@?@SL@33@S@@S@ֳ]?ff@L@ff@@33@SL@ֳ]?33@SL@ff@@33@S@س]ff@L@33@}XKL@ff@@س]ff@@33@}XKL@33@}XK@33@}XK@33@}XKL@@}XKL@@}XK@33@}XK@@}XKL@@L@@@@}XKL@@}XKL@@@@}XK@@@@L@ff&@L@ff&@@@@ff&@L@ff&@г]L@ff&@г]@ff&@L@ff&@L@ff&@г]@ff&@@Գ]?@@\1L@@@\1@ff&@г]L@Գ]?ff&@г]L@@@\1@ff&@г]@س]??@@\1L@\@nsL@\@ns@س]??@@\1@@@\1L@\@ns@?@nsL@@ns@\@nsL@?\@nsL@@ns@\@ns@ڳ]>@\1L@@\1@@nsL@ڳ]>@nsL@@\1@@ns@ڳ]?>@\1L@ff@nsL@ff@ns@ڳ]?>@\1@@\1L@ff@ns@?@nsL@@ns@ff@nsL@?ff@nsL@@ns@ff@ns@ڳ]>33@L@33@@@nsL@ڳ]>@nsL@33@@@ns@ڳ]33@L@@ns?L@33@@ڳ]33@@@ns?L@@ns?@@ns?@@ns?L@ff@ns?L@ff@ns?@@ns?@ff@ns?L@ڳ]?ff@ns?@ff@ns?L@@\1>L@ڳ]?@\1>@ff@ns?@@\1>L@ڳ]@\1>L@@ns?L@@\1>@ڳ]@\1>@@ns?L@@ns?@@ns?@@ns?L@\@ns?L@\@ns?@@ns?@\@ns?L@س]?\@ns?@\@ns?L@@@\1>L@س]?@@\1>@\@ns?@@@\1>L@س]@@\1>L@33#@ns?L@@@\1>@س]@@\1>@33#@ns?L@33#@ns?@33#@ns?@33#@ns?L@?ns?L@?ns?@33#@ns?@?ns?L@س]??ns?@?ns?L@?\1>L@س]??\1>@?ns?@?\1>L@س]?\1>L@ ?ns?L@?\1>@س]?\1>@ ?ns?L@ ?ns?@ ?ns?@ ?ns?L@ ns?L@ ns?@ ?ns?@ ns?L@׳]? ns?@ ns?L@̌L@׳]?̌@ ns?@̌L@ֳ]??̌L@г]L@г]@ֳ]??̌@̌L@г]@?г]@г]L@L@?@г]@L@@L@L@@@L@?@L@}XKL@?}XK@@}XKL@}XK@}XKL@ff}XKL@ff}XK@}XK@ff}XKL@ֳ]?ff}XK@ff}XKL@<L@ֳ]?<@ff}XK@<L@?/A@/AL@?L@??@/A@?L@?ff@?L@ff@?@?L@??L@ff@?@?@ff@/AL@ff@/A@ff@?L@ff@?L@ff@/A@ff@?@ff@/A@ff@/AL@/AL@/A@ff@/A@/AL@ٳ]?>ffMAL@ffƿ[>AL@ffƿ[>A@ٳ]?>ffMA@ffMAL@ffƿ[>A@ֳ]?̿t[A@̿t[AL@ffMAL@ֳ]?ffMA@̿t[A@ffMAL@?ff澣[>AL@ff澣[>A@ffƿ[>AL@?ffƿ[>AL@ff澣[>A@ffƿ[>A@׳]?'JAL@'JA@ff澣[>AL@׳]?ff澣[>AL@'JA@ff澣[>A@׳]??'JAL@ff>[>AL@ff>[>A@׳]??'JA@'JAL@ff>[>A@?ff?[>AL@ff?[>A@ff>[>AL@?ff>[>AL@ff?[>A@ff>[>A@׳]?@'JAL@@'JA@ff?[>AL@׳]?ff?[>AL@@'JA@ff?[>A@׳]??@'JAL@@[>AL@@[>A@׳]??@'JA@@'JAL@@[>A@?33c@[>AL@33c@[>A@@[>AL@?@[>AL@33c@[>A@@[>A@׳]?@'JAL@@'JA@33c@[>AL@׳]?33c@[>AL@@'JA@33c@[>A@س]?>@'JAL@ff@[>AL@ff@[>A@س]?>@'JA@@'JAL@ff@[>A@?@[>AL@@[>A@ff@[>AL@?ff@[>AL@@[>A@ff@[>A@ڳ]>33@MAL@33@MA@@[>AL@ڳ]>@[>AL@33@MA@@[>A@׳]33@MAL@@\AL@33@MA@׳]33@MA@@\AL@@\A@@\A@@\AL@ff@\AL@ff@\A@@\A@ff@\AL@س]?ff@\A@ff@\AL@@ _PAL@س]?@ _PA@ff@\A@@ _PAL@س]@ _PAL@fff@t[AL@@ _PA@س]@ _PA@fff@t[AL@fff@t[A@fff@AAL@fff@AA@fff@t[AL@fff@t[AL@fff@AA@fff@t[A@ҳ]?@̎AL@@̎A@fff@AAL@ҳ]?fff@AAL@@̎A@fff@AA@ҳ]@̎AL@fff@WAL@@̎A@ҳ]@̎A@fff@WAL@fff@WA@fff@33AL@fff@33A@fff@WAL@fff@WAL@fff@33A@fff@WA@fff@33A@fff@33AL@pb@33AL@pb@33A@fff@33A@pb@33AL@]dpb@33AL@`@kAL@pb@33A@]dpb@33A@`@kAL@`@kA@`@kA@`@kAL@ @kAL@ @kA@`@kA@ @kAL@]?d @kA@ @kAL@q@33AL@]?dq@33A@ @kA@q@33AL@q@33A@q@33AL@@33AL@@33A@q@33A@@33AL@?@33A@@33AL@@WAL@?@WA@@33A@@WAL@ҳ]?@WA@@WAL@@̎AL@ҳ]?@̎A@@WA@@̎AL@ҳ]??@̎AL@@AAL@@AA@ҳ]??@̎A@@̎AL@@AA@?@AA@@AAL@@t[AL@?@t[A@@AA@@t[AL@س]?@t[A@@t[AL@@ _PAL@س]?@ _PA@@t[A@@ _PAL@ٳ]@ _PAL@?t[AL@@ _PA@ٳ]@ _PA@?t[AL@?t[A@?σrAL@?σrA@?t[AL@?t[AL@?σrA@?t[A@ٳ]>@}AL@@}A@?σrAL@ٳ]>?σrAL@@}A@?σrA@ӳ]@}AL@?WAL@@}A@ӳ]@}A@?WAL@?WA@?33AL@?33A@?WAL@?WAL@?33A@?WA@?33A@?33AL@?33AL@?33A@?33A@?33AL@]d?33AL@?kAL@?33A@]d?33A@?kAL@?kA@?kA@?kAL@?kAL@?kA@?kA@?kAL@]?_?kA@?kAL@{>33AL@]?_{>33A@?kA@{>33AL@{>33A@{>33AL@>33AL@>33A@{>33A@>33AL@?>33A@>33AL@>WAL@?>WA@>33A@>WAL@ӳ]?>WA@>WAL@}AL@ӳ]?}A@>WA@}AL@ٳ]?>}AL@>σrAL@>σrA@ٳ]?>}A@}AL@>σrA@?>σrA@>σrAL@>t[AL@?>t[A@>σrA@>t[AL@ٳ]?>t[A@>t[AL@ _PAL@ٳ]? _PA@>t[A@ _PAL@ٳ] _PAL@̾t[AL@ _PA@ٳ] _PA@̾t[AL@̾t[A@̾AAL@̾AA@̾t[AL@̾t[AL@̾AA@̾t[A@ӳ]?̎AL@̎A@̾AAL@ӳ]?̾AAL@̎A@̾AA@ӳ]̎AL@̾WAL@̎A@ӳ]̎A@̾WAL@̾WA@̾33AL@̾33A@̾WAL@̾WAL@̾33A@̾WA@̾33A@̾33AL@{33AL@{33A@̾33A@{33AL@]_{33AL@kAL@{33A@]_{33A@kAL@kA@kA@kAL@kAL@kA@kA@kAL@]?dkA@kAL@Ŀ33AL@]?dĿ33A@kA@Ŀ33AL@Ŀ33A@Ŀ33AL@̿33AL@̿33A@Ŀ33A@̿33AL@?̿33A@̿33AL@̿WAL@?̿WA@̿33A@̿WAL@ӳ]?̿WA@̿WAL@̎AL@ӳ]?̎A@̿WA@̎AL@ӳ]??̎AL@̿AAL@̿AA@ӳ]??̎A@̎AL@̿AA@?̿AA@̿AAL@̿t[AL@?̿t[A@̿AA@̿t[AL@?@@S@@?@S@S@@@?@\1@33@\1@@ns@?fff@+@S@@S@?̌@+@@S@33@S@?@@̌@+@ff@@?̾\1@L@г]@?@\1@?\1@33?г]@?@@@ff&@@?@fff@֨S@@}XK@?fff@\1@@@\1@\@ns@?33@\1@@\1@ff@ns@?@̿+@fff@֨S@??\1>@ ?ns?@L?@?\@ns?@@@\1>@@@\1@?33?г]@33?@ff&@г]@?̌@L@ ns?@?̌@г]@L@?>\1?@L?@ ?ns?@??г]@?\1@>\1@?>\1@̾\1@@?̿֨S@?г]@>\1@?+@333@ffS@?L?@>\1@?\1>@?֨S@̿֨S@}XK@?<@333@ff}XK@?<@ffS@333@?333@֨S@ff}XK@?L@̾\1?@ ns?@?33?@@ff&@@?L@@fff@֨S@̿+@̿֨S@>\1@@?33?@?@̿֨S@? ns?@̾\1?@ ?ns?@?̾\1?@>\1?@ ?ns?@?@}XK@̿֨S@?}XK@ff}XK@֨S@?fff@\1@L@@@@\1@?333@@@@\1@@@\1>@??@?\1?@?\1>@?@@@\1@33@@?@\1?@333@@@@\1>@??\1>@>\1@?\1@?33?г]@ff&@г]@@\1@?ff&@г]@33?@ff&@@?̌@\1@fff@\1@@ns@?33?@̿֨S@@??\1?@@\1?@33#@ns?@??\1>@?\1@?@??ns?@?\1?@33#@ns?@??ns?@?\1>@?\1?@?fff@+@ffS@S@?@@}XK@?г]@@̾\1@?@@\1@@\1@ff&@г]@?@@}XK@@@??@?г]@̿֨S@?fff@֨S@̌@֨S@33@}XK@?@}XK@fff@֨S@33@}XK@?̿+@+@ffS@?33@}XK@̌@֨S@ff@@?̌@+@fff@+@@S@?̌@֨S@@@ff@@?ff@@̌@+@33@S@?@@̌@\1@@\1@?33@\1?@@\1?@@ns?@?̌@\1?@@@@\1>@?\@ns?@@@\1@L@@?\@ns?@fff@\1?@@ns?@?\@ns?@L@@fff@\1?@?fff@\1?@̌@\1?@@ns?@?33@\1@ff@@@\1@?@\1@̌@\1@@ns@?@ns@fff@\1@\@ns@?@\1>@@@ff@@?ff@ns?@33@\1?@@ns?@?@\1>@@ns?@̌@\1?@?@ns?@@\1?@33@@?@\1?@@@33@@?33@@@\1@@ns@?@ns@33@\1@ff@ns@?ff@@33@\1?@@\1>@?ff@ns?@@\1>@33@\1?@?fff@+@̿+@ffS@?333@@@\1@@@\1@?@@\1>@33#@ns?@@\1?@?@@@\1@ff@@?fff@+@L@@̿+@??\1@?@?\1@??\1@?\1@33?г]@?σBA@ff澣[>A@'JA@? @MA@ff&@dXA@@ _PA@?33@dXA@̬@dXA@@\A@?@ _PA@fff@t[A@Y@dXA@?ff&@σBA@ff?MA@@'JA@?̬@dXA@@MA@33@MA@>σrA@33?σrA@?σrA@?L>MA@?dXA@'JA@?̿t[A@ffMA@ff濚MA@?@33A@@WA@q@33A@?`@kA@ @kA@q@33A@?>WA@L>}A@{>33A@?}A@L>}A@>WA@?`@kA@q@33A@@WA@?}A@>σrA@L>}A@?ff&@WA@@WA@@̎A@? @̎A@ff&@WA@@̎A@?WA@̾33A@{33A@?fff@t[A@fff@AA@@t[A@??σrA@L>}A@>σrA@??dXA@33?dXA@?t[A@?@}A@?WA@ff?}A@?33?WA@?33A@?33A@?σBA@33σBA@ffƿ[>A@?33σBA@ff濚MA@ffƿ[>A@?33?dXA@ff?MA@@ _PA@?ff̎A@kA@Ŀ33A@?̾t[A@̾AA@dXA@?ff&@AA@ @̎A@@AA@?33?WA@?WA@?33A@?33?WA@ff?}A@?WA@?ff?}A@33?σrA@@}A@?{>33A@>33A@>WA@??σBA@L>MA@'JA@?ff濚MA@33dXA@̿t[A@?Y@σBA@ff&@σBA@33c@[>A@??dXA@>t[A@'JA@?>t[A@ _PA@'JA@?33dXA@̾AA@AA@?dXA@ _PA@̾t[A@?33AA@̿AA@̿t[A@?Y@WA@fff@33A@pb@33A@?WA@L̎A@̾WA@?33AA@ff̎A@̿AA@?33AA@̿t[A@33dXA@?dXA@LMA@ _PA@?ff̎A@̎A@̿AA@?33dXA@dXA@̾AA@?ff濚MA@ffMA@ffƿ[>A@?ff̎A@33WA@kA@?̿WA@Ŀ33A@̿33A@?33?σBA@?σBA@ff?[>A@?WA@̾WA@̾33A@?{>33A@L>}A@?kA@? _PA@LMA@'JA@?ff?MA@33?σBA@@'JA@?ffƿ[>A@ff澣[>A@σBA@?ff̎A@Ŀ33A@̿WA@??WA@33?WA@?kA@?̿WA@̎A@ff̎A@?kA@kA@33WA@? @MA@@ _PA@ff?MA@?kA@33WA@WA@?̎A@L̎A@̾AA@?̎A@̾WA@L̎A@?AA@33AA@33dXA@?L̎A@AA@̾AA@?ff&@dXA@Y@dXA@fff@t[A@?@t[A@@ _PA@ff&@dXA@??t[A@?σrA@>t[A@Y@dXA@ff@MA@@ _PA@?ff?[>A@@'JA@33?σBA@?ff>[>A@?σBA@'JA@?ff>[>A@ff?[>A@?σBA@?WA@{33A@kA@??WA@?kA@L>}A@?̬@σBA@33@σBA@@[>A@??33A@?kA@33?WA@?33?σrA@>t[A@?σrA@?>σrA@>t[A@33?σrA@?33s@̎A@Y@AA@@̎A@?ff&@σBA@ @MA@ff?MA@?@ _PA@?t[A@33?dXA@?fff@t[A@@t[A@ff&@dXA@?Y@dXA@33s@MA@ff@MA@?33c@[>A@@'JA@Y@σBA@?@[>A@ff&@σBA@@'JA@?@[>A@33c@[>A@ff&@σBA@??t[A@>t[A@?dXA@?ff&@WA@Y@WA@`@kA@?`@kA@@WA@ff&@WA@?Y@WA@fff@WA@fff@33A@?pb@33A@`@kA@Y@WA@?@̎A@fff@WA@33s@̎A@??kA@?kA@?WA@?fff@AA@@̎A@Y@AA@?33@MA@@\A@̬@dXA@?33s@MA@Y@σBA@@'JA@?ff@MA@33@dXA@@ _PA@?@[>A@33@MA@̬@σBA@?ff@[>A@33@σBA@@'JA@?ff@[>A@@[>A@33@σBA@?@̎A@@AA@ @̎A@?ff@\A@33@dXA@@\A@?ff@\A@@ _PA@33@dXA@?LMA@σBA@'JA@??σrA@@}A@33?σrA@?Y@WA@33s@̎A@fff@WA@?33@σBA@33s@MA@@'JA@?33@σBA@ff@MA@33s@MA@?@MA@̬@σBA@33@MA@@AA@Y@AA@ff&@AA@?Y@AA@@t[A@fff@AA@?@AA@@t[A@Y@AA@?C=?A@ff@/A@/A@?C=?A@@A@ff@/A@??@L@@/A@?L@@$`4I@@/A@?_a.@*n@@@h@@?@?$`4I@@پff@@/A@?پff@@ڪ@@??@ڪ@@پ̠@@??@$`4h@@L@@??@پ̠@@$`4h@@?~@D>@@Y@@@ff@?@?ڪ@@ff@?@?г]L@?г]@?L@?L@?г]@?@ճ]??\1L@?\1@?г]L@ճ]??г]L@?\1@?г]@33?@33?L@?L@?@33?@?L@?33?г]@33?г]L@33?L@?33?@33?г]@33?L@ճ]???\1L@33?г]L@33?г]@ճ]???\1@?\1L@33?г]@??г]L@?L@33?L@??\1L@?г]L@33?г]L@?33?г]L@?г]L@33?L@openscad-2019.05/testdata/stl/empty.stl0000644000076500000240000000000013402025764020365 0ustar kintelstaff00000000000000openscad-2019.05/testdata/stl/empty2.stl0000644000076500000240000000005613402025764020462 0ustar kintelstaff00000000000000solid OpenSCAD_Model endsolid OpenSCAD_Model openscad-2019.05/testdata/svg/box-w-holes.svg0000644000076500000240000000204013437640540021376 0ustar kintelstaff00000000000000 openscad-2019.05/testdata/svg/simple.svg0000644000076500000240000000421613437640540020532 0ustar kintelstaff00000000000000 image/svg+xml openscad-2019.05/testdata/svg/svg-spec/spec-paths-arcs01.svg0000644000076500000240000000160313423115164024115 0ustar kintelstaff00000000000000 Example arcs01 - arc commands in path data Picture of a pie chart with two pie wedges and a picture of a line with arc blips openscad-2019.05/testdata/svg/svg-spec/spec-paths-arcs02.svg0000644000076500000240000000434313423115164024122 0ustar kintelstaff00000000000000 Example arcs02 - arc options in paths Pictures showing the result of setting large-arc-flag and sweep-flag to the four possible combinations of 0 and 1. Arc start Arc end large-arc-flag=0 sweep-flag=0 large-arc-flag=0 sweep-flag=1 large-arc-flag=1 sweep-flag=0 large-arc-flag=1 sweep-flag=1 openscad-2019.05/testdata/svg/svg-spec/spec-paths-cubic01.svg0000644000076500000240000000350113423115164024251 0ustar kintelstaff00000000000000 Example cubic01- cubic Bézier commands in path data Picture showing a simple example of path data using both a "C" and an "S" command, along with annotations showing the control points and end points M100,200 C100,100 250,100 250,200 S400,300 400,200 openscad-2019.05/testdata/svg/svg-spec/spec-paths-cubic02.svg0000644000076500000240000001035213423115164024254 0ustar kintelstaff00000000000000 Example cubic02 - cubic Bézier commands in path data Picture showing examples of "C" and "S" commands, along with annotations showing the control points and end points M100,200 C100,100 400,100 400,200 M100,500 C25,400 475,400 400,500 M100,800 C175,700 325,700 400,800 M600,200 C675,100 975,100 900,200 M600,500 C600,350 900,650 900,500 M600,800 C625,700 725,700 750,800 S875,900 900,800 openscad-2019.05/testdata/svg/svg-spec/spec-paths-quad01.svg0000644000076500000240000000201313423115164024113 0ustar kintelstaff00000000000000 Example quad01 - quadratic Bézier commands in path data Picture showing a "Q" a "T" command, along with annotations showing the control points and end points openscad-2019.05/testdata/svg/svg-spec/spec-paths-triangle01.svg0000644000076500000240000000071413423115164024774 0ustar kintelstaff00000000000000 Example triangle01- simple example of a 'path' A path that draws a triangle openscad-2019.05/testdata/svg/svg-spec/spec-shapes-circle01.svg0000644000076500000240000000065413423115164024577 0ustar kintelstaff00000000000000 Example circle01 - circle filled with red and stroked with blue openscad-2019.05/testdata/svg/svg-spec/spec-shapes-ellipse01.svg0000644000076500000240000000105113423115164024763 0ustar kintelstaff00000000000000 Example ellipse01 - examples of ellipses openscad-2019.05/testdata/svg/svg-spec/spec-shapes-line01.svg0000644000076500000240000000136313423115164024263 0ustar kintelstaff00000000000000 Example line01 - lines expressed in user coordinates openscad-2019.05/testdata/svg/svg-spec/spec-shapes-polygon01.svg0000644000076500000240000000123113423115164025015 0ustar kintelstaff00000000000000 Example polygon01 - star and hexagon openscad-2019.05/testdata/svg/svg-spec/spec-shapes-polyline01.svg0000644000076500000240000000127013423115164025164 0ustar kintelstaff00000000000000 Example polyline01 - increasingly larger bars openscad-2019.05/testdata/svg/svg-spec/spec-shapes-rect01.svg0000644000076500000240000000065213423115164024271 0ustar kintelstaff00000000000000 Example rect01 - rectangle with sharp corners openscad-2019.05/testdata/svg/svg-spec/spec-shapes-rect02.svg0000644000076500000240000000106013423115164024264 0ustar kintelstaff00000000000000 Example rect02 - rounded rectangles openscad-2019.05/testdata/svg/viewbox/viewbox-tests.svg.in0000644000076500000240000000602113437640540024150 0ustar kintelstaff00000000000000 image/svg+xml openscad-2019.05/testdata/ttf/amiri-0.106/OFL-FAQ.txt0000644000076500000240000012540413402025764022047 0ustar kintelstaff00000000000000OFL FAQ - Frequently Asked Questions about the SIL Open Font License (OFL) Version 1.1-update2 - 23 August 2010 (See http://scripts.sil.org/OFL for updates) CONTENTS OF THIS FAQ 1 USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL 2 USING OFL FONTS FOR WEB PAGES AND ONLINE WEBFONT SERVICES 3 MODIFYING OFL-LICENSED FONTS 4 LICENSING YOUR ORIGINAL FONTS UNDER THE OFL 5 CHOOSING RESERVED FONT NAMES 6 ABOUT THE FONTLOG 7 MAKING CONTRIBUTIONS TO OFL PROJECTS 8 ABOUT THE LICENSE ITSELF 9 ABOUT SIL INTERNATIONAL APPENDIX A - FONTLOG EXAMPLE 1 USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL 1.1 Can I use the fonts for a book or other print publication? Yes. You can mention the font and author in the book's colophon if you wish, but that is not required. 1.2 Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions? Yes! Fonts licensed under the OFL can be freely included alongside other software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are typically aggregated with, not merged into, existing software, there is little need to be concerned about incompatibility with existing software licenses. You may also repackage the fonts and the accompanying components in a .rpm or .deb package and include them in distribution CD/DVDs and online repositories. (Also see section 5.9 about rebuilding from source.) 1.3 I want to distribute the fonts with my program. Does this mean my program also has to be Free/Libre and Open Source Software? No. Only the portions based on the Font Software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well. 1.4 Can I sell a software package that includes these fonts? Yes, you can do this with both the Original Version and a Modified Version of the fonts. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, games and entertainment software, mobile device applications, etc. 1.5 Can I include the fonts on a CD of freeware or commercial fonts? Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself. 1.6 Why won't the OFL let me sell the fonts alone? The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honour and respect their contribution! 1.7 What about sharing OFL fonts with friends on a CD, DVD or USB stick? You are very welcome to share open fonts with friends, family and colleagues through removable media. Just remember to include the full font package, including any copyright notices and licensing information as available in OFL.txt. In the case where you sell the font, it has to come bundled with software. 1.8 Can I host the fonts on a web site for others to use? Yes, as long as you make the full font package available. In most cases it may be best to point users to the main site that distributes the Original Version so they always get the most recent stable and complete version. See also discussion of webfonts in Section 2. 1.9 Can I host the fonts on a server for use over our internal network? Yes. If the fonts are transferred from the server to the client computer by means that allow them to be used even if the computer is no longer attached to the network, the full package (copyright notices, licensing information, etc.) should be included. 1.10 Does the full OFL license text always need to accompany the font? The only situation in which an OFL font can be distributed without the text of the OFL (either in a separate file or in font metadata), is when a font is embedded in a document or bundled within a program. In the case of metadata included within a font, it is legally sufficient to include only a link to the text of the OFL on http://scripts.sil.org/OFL, but we strongly recommend against this. Most modern font formats include metadata fields that will accept the full OFL text, and full inclusion increases the likelihood that users will understand and properly apply the license. 1.11 What do you mean by 'embedding'? How does that differ from other means of distribution? By 'embedding' we mean inclusion of the font in a document or file in a way that makes extraction (and redistribution) difficult or clearly discouraged. In many cases the names of embedded fonts might also not be obvious to those reading the document, the font data format might be altered, and only a subset of the font - only the glyphs required for the text - might be included. Any other means of delivering a font to another person is considered 'distribution', and needs to be accompanied by any copyright notices and licensing information available in OFL.txt. 1.12 So can I embed OFL fonts in my document? Yes, either in full or a subset. The restrictions regarding font modification and redistribution do not apply, as the font is not intended for use outside the document. 1.13 Does embedding alter the license of the document itself? No. Referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL. 1.14 If OFL fonts are extracted from a document in which they are embedded (such as a PDF file), what can be done with them? Is this a risk to author(s)? The few utilities that can extract fonts embedded in a PDF will typically output limited amounts of outlines - not a complete font. To create a working font from this method is much more difficult and time consuming than finding the source of the original OFL font. So there is little chance that an OFL font would be extracted and redistributed inappropriately through this method. Even so, copyright laws address any misrepresentation of authorship. All Font Software released under the OFL and marked as such by the author(s) is intended to remain under this license regardless of the distribution method, and cannot be redistributed under any other license. We strongly discourage any font extraction - we recommend directly using the font sources instead - but if you extract font outlines from a document, please be considerate: use your common sense and respect the work of the author(s) and the licensing model. 1.15 What about distributing fonts with a document? Within a compressed folder structure? Is it distribution, bundling or embedding? Certain document formats may allow the inclusion of an unmodified font within their file structure which consists of a compressed folder containing the various resources forming the document (such as pictures and thumbnails). Including fonts within such a structure is understood as being different from embedding but rather similar to bundling (or mere aggregation) which the license explicitly allows. In this case the font is conveyed unchanged whereas embedding a font usually transforms it from the original format. The OFL does not allow anyone to extract the font from such a structure to then redistribute it under another license. The explicit permission to redistribute and embed does not cancel the requirement for the Font Software to remain under the license chosen by its author(s). 1.16 What about ebooks shipping with open fonts? The requirements differ depending on whether the fonts are linked, embedded or distributed (bundled or aggregated). Some ebook formats use web technologies to do font linking via @font-face, others are designed for font embedding, some use fonts distributed with the document or reading software, and a few rely solely on the fonts already present on the target system. The license requirements depend on the type of inclusion as discussed in 1.15. 1.17 Can Font Software released under the OFL be subject to URL-based access restrictions methods or DRM (Digital Rights Management) mechanisms? Yes, but these issues are out-of-scope for the OFL. The license itself neither encourages their use nor prohibits them since such mechanisms are not implemented in the components of the Font Software but through external software. Such restrictions are put in place for many different purposes corresponding to various usage scenarios. One common example is to limit potentially dangerous cross-site scripting attacks. However, in the spirit of libre/open fonts and unrestricted writing systems, we strongly encourage open sharing and reuse of OFL fonts, and the establishment of an environment where such restrictions are unnecessary. Note that whether you wish to use such mechanisms or you prefer not to, you must still abide by the rules set forth by the OFL when using fonts released by their authors under this license. Derivative fonts must be licensed under the OFL, even if they are part of a service for which you charge fees and/or for which access to source code is restricted. You may not sell the fonts on their own - they must be part of a larger software package, bundle or subscription plan. For example, even if the OFL font is distributed in a software package or via an online service using a DRM mechanism, the user would still have the right to extract that font, use, study, modify and redistribute it under the OFL. 1.18 I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions? Consult the copyright statement(s) in the license for ways to contact the original authors. Consult the FONTLOG for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgement section. Please consider using the Original Versions of the fonts whenever possible. 1.19 What do you mean in condition 4? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement? The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a grey area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not. 2 USING OFL FONTS FOR WEBPAGES AND ONLINE WEBFONT SERVICES 2.1 Can I make webpages using these fonts? Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. Your three best options: - referring directly in your stylesheet to open fonts which may be available on the user's system - providing links to download the full package of the font - either from your own website or from elsewhere - so users can install it themselves - using @font-face to distribute the font directly to browsers. This is recommended and explicitly allowed by the licensing model because it is distribution. The font file itself is distributed with other components of the webpage. It is not embedded in the webpage but referenced through a web address which will cause the browser to retrieve and use the corresponding font to render the webpage (see 1.11 and 1.15 for details related to embedding fonts into documents). As you take advantage of the @font-face cross-platform standard, be aware that webfonts are often tuned for a web environment and not intended for installation and use outside a browser. The reasons in favour of using webfonts are to allow design of dynamic text elements instead of static graphics, to make it easier for content to be localized and translated, indexed and searched, and all this with cross-platform open standards without depending on restricted extensions or plugins. You should check the CSS cascade (the order in which fonts are being called or delivered to your users) when testing. 2.2 Can I make and use WOFF (Web Open Font Format) versions of OFL fonts? Yes, but you need to be careful. A change in font format normally is considered modification, and Reserved Font Names (RFNs) cannot be used. Because of the design of the WOFF format, however, it is possible to create a WOFF version that is not considered modification, and so would not require a name change. You are allowed to create, use and distribute a WOFF version of an OFL font without changing the font name, but only if: - the original font data remains unchanged except for WOFF compression, and - WOFF-specific metadata is either omitted altogether or present and includes, unaltered, the contents of all equivalent metadata in the original font. If the original font data or metadata is changed, or the WOFF-specific metadata is incomplete, the font must be considered a Modified Version, the OFL restrictions would apply and the name of the font must be changed: any RFNs cannot be used and copyright notices and licensing information must be included and cannot be deleted or modified. You must come up with a unique name - we recommend one corresponding to your domain or your particular web application. Be aware that only the original author(s) can use RFNs. This is to prevent collisions between a derivative tuned to your audience and the original upstream version and so to reduce confusion. Please note that most WOFF conversion tools and online services do not meet the two requirements listed above, and so their output must be considered a Modified Version. So be very careful and check to be sure that the tool or service you're using is compressing unchanged data and completely and accurately reflecting the original font metadata. 2.3 What about other webfont formats such as EOT/EOTLite/CWT/etc.? In most cases these formats alter the original font data more than WOFF, and do not completely support appropriate metadata, so their use must be considered modification and RFNs may not be used. 2.4 Can I make OFL fonts available through webfont online services? Yes, you are welcome to include OFL fonts in online webfont services as long as you properly meet all the conditions of the license. The origin and open status of the font should be clear among the other fonts you are hosting. Authorship, copyright notices and license information must be sufficiently visible to your users or subscribers so they know where the font comes from and the rights granted by the author(s). Make sure the font file contains the needed copyright notice(s) and licensing information in its metadata. Please double-check the accuracy of every field to prevent contradictory information. Other font formats, including EOT/EOTLite/CWT and superior alternatives like WOFF, already provide fields for this information. Remember that if you modify the font within your library or convert it to another format for any reason the OFL restrictions apply and you need to change the names accordingly. Please respect the author's wishes as expressed in the OFL and do not misrepresent original designers and their work. Don't lump quality open fonts together with dubious freeware or public domain fonts. Consider how you can best work with the original designers and foundries, support their efforts and generate goodwill that will benefit your service. (See 1.17 for details related to URL-based access restrictions methods or DRM mechanisms). 2.5 Can I make and publish CMS themes or templates that use OFL fonts? Can I include the fonts themselves in the themes or templates? Can I sell the whole package? Yes, you are very welcome to integrate open fonts into themes and templates for your preferred CMS and make them more widely available. Be aware that you can only sell the fonts and your CMS add-on as part of a software bundle. (See 1.4 for details and examples about selling bundles). 2.6 Some webfont formats and services provide ways of "optimising" the font for a particular website or web application; is that allowed? Yes, it is permitted, but remember that these optimised versions are Modified Versions and so must follow OFL requirements like appropriate renaming. Also you need to bear in mind the other important parameters beyond compression, speed and responsiveness: you need to consider the audience of your particular website or web application, as choosing some optimisation parameters may turn out to be less than ideal for them. Subsetting by removing certain glyphs or features may seriously limit functionality of the font in various languages used by your users. It may also introduce degradation of quality in the rendering or specific bugs on the various platforms compared to the original font. In other words, remember that one person's optimised font may be another person's missing feature. Various advanced typographic features are also available through CSS and may provide the desired effects without the need to modify the font. 3 MODIFYING OFL-LICENSED FONTS 3.1 Can I change the fonts? Are there any limitations to what things I can and cannot change? You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could put additional information into it that covers your contribution. 3.2 I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine? Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license. 3.3 Can I charge people for my additional work? In other words, if I add a bunch of special glyphs and/or OpenType/Graphite code, can I sell the enhanced font? Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package. 3.4 Can I pay someone to enhance the fonts for my use and distribution? Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefited from the contributions of others. 3.5 I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use? No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way beyond what the OFL permits and requires. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefited from the contributions of others. 3.6 Do I have to make any derivative fonts (including extended source files, build scripts, documentation, etc.) publicly available? No, but please consider sharing your improvements with others. You may find that you receive in return more than what you gave. 3.7 If a trademark is claimed in the OFL font, does that trademark need to remain in modified fonts? Yes, any trademark notices must remain in any derivative fonts to respect trademark laws, but you may add any additional trademarks you claim, officially registered or not. For example if an OFL font called "Foo" contains a notice that "Foo is a trademark of Acme", then if you rename the font to "Bar" when creating a Modified Version, the new trademark notice could say "Foo is a trademark of Acme Inc. - Bar is a trademark of Roadrunner Technologies Ltd.". Trademarks work alongside the OFL and are not subject to the terms of the licensing agreement. Please refer to the appropriate trademark laws. 4 LICENSING YOUR ORIGINAL FONTS UNDER THE OFL 4.1 Can I use the SIL OFL for my own fonts? Yes! We heartily encourage everyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. The licensing model is used successfully by various organisations, both for-profit and not-for-profit, to release fonts of varying levels of scope and complexity. 4.2 What do I have to do to apply the OFL to my font? If you want to release your fonts under the OFL, we recommend you do the following: 4.2.1 Put your copyright and Reserved Font Names information at the beginning of the main OFL.txt file in place of the dedicated placeholders. Include this file in your release package. 4.2.2 Put your copyright and the OFL text with Reserved Font Names into your font files (the copyright and license fields). A link to the OFL text on the OFL web site is an acceptable (but not recommended) alternative. Also add this information to any other components (build scripts, glyph databases, documentation, test files, etc). Depending on the format of your fonts and sources, you can use template human-readable headers or machine-readable metadata. 4.2.3 Write an initial FONTLOG.txt for your font and include it in the release package. 4.2.4 Include the relevant practical documentation on the license by including the OFL-FAQ.txt in your package. 4.3 Will you make my font OFL for me? We won't do the work for you. We can, however, try to answer your questions, unfortunately we do not have the resources to review and check your font packages for correct use of the OFL. 4.4 Will you distribute my OFL font for me? No, although if the font is of sufficient quality and general interest we may include a link to it on our partial list of OFL fonts on the OFL web site. You may wish to consider other open font catalogs or hosting services, such as the Unifont Font Guide (http://unifont.org/fontguide), The League of Movable Type (http://theleagueofmovabletype.com), Kernest (http://kernest.com/) or the Open Font Library (http://openfontlibrary.org/), which despite the name has no direct relationship to the OFL or SIL. We do not endorse any particular catalog or hosting service - it is your responsibility to determine if the service is right for you. 4.5 Why should I use the OFL for my fonts? - to meet needs for fonts that can be modified to support minority languages - to provide a legal and clear way for people to respect your work but still use it (and reduce piracy) - to involve others in your font project - to enable your fonts to be expanded with new weights and improved writing system/language support - to allow more technical font developers to add features to your design (such as OpenType and Graphite support) - to renew the life of an old font lying on your hard drive with no business model - to allow your font to be included in Libre Software operating systems like Ubuntu - to give your font world status and wide, unrestricted distribution - to educate students about quality typeface and font design - to expand your test base and get more useful feedback - to extend your reach to new markets when users see your metadata and go to your website - to get your font more easily into one of the webfont online services - to attract attention for your commercial fonts - to make money through webfont services - to make money by bundling fonts with applications - to make money adjusting and extending existing open fonts - to get a better chance that foundations/NGOs/charities/companies who commission fonts will pick you - to be part of a sharing design and development community - to give back and contribute to a growing body of font sources 5 CHOOSING RESERVED FONT NAMES 5.1 What are Reserved Font Names? These are font names, or portions of font names, that the author has chosen to reserve for use only with the Original Version of the font, or for Modified Version(s) created by the original author. 5.2 Why can't I use the Reserved Font Names in my derivative font names? I'd like people to know where the design came from. The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Names ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name, be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. Any substitution and matching mechanism is outside the scope of the license. 5.3 What do you mean by "primary name as presented to the user"? Are you referring to the font menu name? Yes, this applies to the font menu name and other mechanisms that specify a font in a document. It would be fine, however, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement). Users who install derivatives (Modified Versions) on their systems should not see any of the original Reserved Font Names in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake one font for another and so expect features only another derivative or the Original Version can actually offer. 5.4 Am I not allowed to use any part of the Reserved Font Names? You may not use individual words from the Reserved Font Names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute. 5.5 So what should I, as an author, identify as Reserved Font Names? Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". You also need to be very careful about reserving font names which are already linked to trademarks (whether registered or not) which you do not own. 5.6 Do I, as an author, have to identify any Reserved Font Names? No, but we strongly encourage you to do so. This is to avoid confusion between your work and Modified Versions. 5.7 Are any names (such as the main font name) reserved by default? No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement(s). 5.8 Is there any situation in which I can use Reserved Font Names for a Modified Version? The Copyright Holder(s) can give certain trusted parties the right to use any of the Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion. 5.9 Do font rebuilds require a name change? Do I have to change the name of the font when my packaging workflow includes a full rebuild from source? Yes, all rebuilds which change the font data and the smart code are Modified Versions and the requirements of the OFL apply: you need to respect what the Author(s) have chosen in terms of Reserved Font Names. However if a package (or installer) is simply a wrapper or a compressed structure around the final font - leaving them intact on the inside - then no name change is required. Please get in touch with the author(s) and copyright holder(s) to inquire about the presence of font sources beyond the final font file(s) and the recommended build path. That build path may very well be non-trivial and hard to reproduce accurately by the maintainer. If a full font build path is made available by the upstream author(s) please be aware that any regressions and changes you may introduce when doing a rebuild for packaging purposes is your responsibility as a package maintainer since you are effectively creating a separate branch. You should make it very clear to your users that your rebuilt version is not the canonical one from upstream. 5.10 Can I add other Reserved Font Names when making a derivative font? Yes. List your additional Reserved Font Names after your additional copyright statement, as indicated with example placeholders at the top of the OFL.txt file. Be sure you do not remove any exiting RFNs but only add your own. 6 ABOUT THE FONTLOG 6.1 What is this FONTLOG thing exactly? It has three purposes: 1) to provide basic information on the font to users and other developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge authors and other contributors. Please use it! 6.2 Is the FONTLOG required? It is not a requirement of the license, but we strongly recommend you have one. 6.3 Am I required to update the FONTLOG when making Modified Versions? No, but users, designers and other developers might get very frustrated with you if you don't. People need to know how derivative fonts differ from the original, and how to take advantage of the changes, or build on them. There are utilities that can help create and maintain a FONTLOG, such as the FONTLOG support in FontForge. 6.4 What should the FONTLOG look like? It is typically a separate text file (FONTLOG.txt), but can take other formats. It commonly includes these four sections: - brief header describing the FONTLOG itself and name of the font family - Basic Font Information - description of the font family, purpose and breadth - ChangeLog - chronological listing of changes - Acknowledgements - list of authors and contributors with contact information It could also include other sections, such as: where to find documentation, how to make contributions, information on contributing organizations, source code details, and a short design guide. See Appendix A for an example FONTLOG. 7 MAKING CONTRIBUTIONS TO OFL PROJECTS 7.1 Can I contribute work to OFL projects? In many cases, yes. It is common for OFL fonts to be developed by a team of people who welcome contributions from the wider community. Contact the original authors for specific information on how to participate in their projects. 7.2 Why should I contribute my changes back to the original authors? It would benefit many people if you contributed back in response to what you've received. Your contributions and improvements to the fonts and other components could be a tremendous help and would encourage others to contribute as well and 'give back'. You will then benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute. 7.3 I've made some very nice improvements to the font. Will you consider adopting them and putting them into future Original Versions? Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes - the use of smart source revision control systems like subversion, svk, mercurial, git or bzr is a good idea. Please follow the recommendations given by the author(s) in terms of preferred source formats and configuration parameters for sending contributions. If this is not indicated in a FONTLOG or other documentation of the font, consider asking them directly. Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. Keep in mind that some kinds of changes (esp. hinting) may be technically difficult to integrate. 7.4 How can I financially support the development of OFL fonts? It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version. 8 ABOUT THE LICENSE ITSELF 8.1 I see that this is version 1.1 of the license. Will there be later changes? Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL. 8.2 Does this license restrict the rights of the Copyright Holder(s)? No. The Copyright Holder(s) still retain(s) all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version. Only the Copyright Holder(s) can do this. 8.3 Is the OFL a contract or a license? The OFL is a license and not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license. 8.4 I really like the terms of the OFL, but want to change it a little. Am I allowed to take ideas and actual wording from the OFL and put them into my own custom license for distributing my fonts? We strongly recommend against creating your very own unique open licensing model. Using a modified or derivative license will likely cut you off - along with the font(s) under that license - from the community of designers using the OFL, potentially expose you and your users to legal liabilities, and possibly put your work and rights at risk. The OFL went though a community and legal review process that took years of effort, and that review is only applicable to an unmodified OFL. The text of the OFL has been written by SIL (with review and consultation from the community) and is copyright (c) 2005-2010 SIL International. You may re-use the ideas and wording (in part, not in whole) in another non-proprietary license provided that you call your license by another unambiguous name, that you do not use the preamble, that you do not mention SIL and that you clearly present your license as different from the OFL so as not to cause confusion by being too similar to the original. If you feel the OFL does not meet your needs for an open license, please contact us. 8.5 Can I translate the license and the FAQ into other languages? SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and its use. Making the license very clear and readable has been a key goal for the OFL, but we know that people understand their own language best. If you are an experienced translator, you are very welcome to translate the OFL and OFL-FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translation ambiguities could be abused and create problems. SIL gives permission to publish unofficial translations into other languages provided that they comply with the following guidelines: - Put the following disclaimer in both English and the target language stating clearly that the translation is unofficial: "This is an unofficial translation of the SIL Open Font License into . It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. However, we recognize that this unofficial translation will help users and designers not familiar with English to better understand and use the OFL. We encourage designers who consider releasing their creation under the OFL to read the OFL-FAQ in their own language if it is available. Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying OFL-FAQ." - Keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion. If you start such a unofficial translation effort of the OFL and OFL-FAQ please let us know. 9 ABOUT SIL INTERNATIONAL 9.1 Who is SIL International and what do they do? SIL serves language communities worldwide, building their capacity for sustainable language development, by means of research, translation, training and materials development. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment. 9.2 What does this have to do with font licensing? The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack), so SIL developed the SIL Open Font License with the help of the Free/Libre and Open Source Software community. 9.3 How can I contact SIL? Our main web site is: http://www.sil.org/ Our site about complex scripts is: http://scripts.sil.org/ Information about this license (and contact information) is at: http://scripts.sil.org/OFL APPENDIX A - FONTLOG EXAMPLE Here is an example of the recommended format for a FONTLOG, although other formats are allowed. ----- FONTLOG for the GlobalFontFamily fonts This file provides detailed information on the GlobalFontFamily Font Software. This information should be distributed along with the GlobalFontFamily fonts and any derivative works. Basic Font Information GlobalFontFamily is a Unicode typeface family that supports all languages that use the Latin script and its variants, and could be expanded to support other scripts. NewWorldFontFamily is based on the GlobalFontFamily and also supports Greek, Hebrew, Cyrillic and Armenian. More specifically, this release supports the following Unicode ranges... This release contains... Documentation can be found at... To contribute to the project... ChangeLog 1 August 2008 (Tom Parker) GlobalFontFamily version 1.2.1 - Tweaked the smart font code (Branch merged with trunk version) - Provided improved build and debugging environment for smart behaviours 7 February 2007 (Pat Johnson) NewWorldFontFamily Version 1.3 - Added Greek and Cyrillic glyphs 7 March 2006 (Fred Foobar) NewWorldFontFamily Version 1.2 - Tweaked contextual behaviours 1 Feb 2005 (Jane Doe) NewWorldFontFamily Version 1.1 - Improved build script performance and verbosity - Extended the smart code documentation - Corrected minor typos in the documentation - Fixed position of combining inverted breve below (U+032F) - Added OpenType/Graphite smart code for Armenian - Added Armenian glyphs (U+0531 -> U+0587) - Released as "NewWorldFontFamily" 1 Jan 2005 (Joe Smith) GlobalFontFamily Version 1.0 - Initial release Acknowledgements If you make modifications be sure to add your name (N), email (E), web-address (if you have one) (W) and description (D). This list is in alphabetical order. N: Jane Doe E: jane@university.edu W: http://art.university.edu/projects/fonts D: Contributor - Armenian glyphs and code N: Fred Foobar E: fred@foobar.org W: http://foobar.org D: Contributor - misc Graphite fixes N: Pat Johnson E: pat@fontstudio.org W: http://pat.fontstudio.org D: Designer - Greek & Cyrillic glyphs based on Roman design N: Tom Parker E: tom@company.com W: http://www.company.com/tom/projects/fonts D: Engineer - original smart font code N: Joe Smith E: joe@fontstudio.org W: http://joe.fontstudio.org D: Designer - original Roman glyphs Fontstudio.org is an not-for-profit design group whose purpose is... Foobar.org is a distributed community of developers... Company.com is a small business who likes to support community designers... University.edu is a renowed educational institution with a strong design department... ----- openscad-2019.05/testdata/ttf/amiri-0.106/OFL.txt0000644000076500000240000001046213402025764021437 0ustar kintelstaff00000000000000Copyright (c) 2010-2013, Khaled Hosny () This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL --------------------------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 --------------------------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. openscad-2019.05/testdata/ttf/amiri-0.106/README.txt0000644000076500000240000000052413402025764021752 0ustar kintelstaff00000000000000designer: Khaled Hosny url: http://amirifont.org license: OFL description: Amiri is a classical Arabic typeface in Naskh style for typesetting books and other running text. Its design is a revival of the beautiful typeface pioneered in early 20th century by Bulaq Press in Cairo, also known as Amiria Press, after which the font is named. openscad-2019.05/testdata/ttf/amiri-0.106/amiri-regular.ttf0000644000076500000240000224560413402025764023547 0ustar kintelstaff00000000000000 DSIG FFTM KhGDEF>%Z(GPOSzRdGSUB; OS/2|`cmapecvt Dkgaspglyf&.dheadT~,6hhea`md$hmtxhEcloca4@kdmaxpp name<9Iw ApostӶprephk"?_<ͽ<ͽ"t`BlB$BBBdBBB|BBtL<j`pbTD`TT.T`TTr0"ThT0RbHSbSb48F,>Z z^JNNN\Ph2.$@ $$,@(@RN@Rn(~D."."tpj|ZX|@4rLd&p^RdZv&pf$LHDO|Nd:DldHNLRhvDJxFRDbTTTTKTT8TRbbbbbnb4444HT22^J^J^J^J^J^JJNN\P\P\P\P)@@  P(@RRRRRxT^J^J^JD`NND`NND`NND`NNT(NTNT\PT\PT\PT^PT\P`.`.`.`.TT$A7R#TOT8T@vR@r0"T $*@hT$hT"T"$hT$hC$R(@R(>R(@(R@bRbRbRbRS@S>S@bRbRbTbRn*n(n(444444F~DF~DF~D"2`.T<*<<<ld|dd<ddD& Z R0xb <C<S<88Zdd\Z_Pz]oEUNU5Vki|iiKKK3V3V WWSS C5VD!!DPW JJdfZfg\Wi@!5ViiiiiiiiKKKKKKK3V3V3V3V3V3V3V3V3V WS 2CCCC K|5V5V5V5V5V5V5V5V5V G G+w <Z8ZN\Br")`Z v3V SiiiiiiiKK3VS~SS 3V3VKK3VK5V5V G GKCi~RRNRNRNRN.Rh2T"T$T"0,@HQbRbTn(n*n*F~B"nU,uvv"thxxxZF((ZF((FN^``u7X@b bRj<hV G.I|pZ`0(2T2^46:iiiiii ] ]K?K?K?K?3VV3VVCFCFCFCFmm   . G Gq4q4F4F424242424e4e4244u355CF5Vh5Vh5Vh5Vh5Vh5Vh\VVJhhJhhJhhJhh~~/z/zK~~/z/z/zK~~/z/z/zK~~/zK~~z mz mzz m5z5z5zHzzzz szszzzz~~z~~57zzz EK~~zzzK~~PzPzPzK~~/z/z/zK~~z~~/z/z/zK~~3VXXXXXXhVhV}hVhV}hVhV}hVhV}8~8~8~8~7 kRRVhVhV}hVhV}%%%A%%%A%%%A mABBB$B$=%%%A/Y%%%ACCA||| ; ;~~~~~~~~~~    5z5z5zH0V0VVV   zVzVVVrrA o o o o o o  Y0i? ??<<< H H z z a { { q O N a { q OZ > # _ T T T  ' '` 4  H   ; ? ? Z Z 9 Z Z Ht HZZ 'r Z  m 4 T  H4 o tt H m  N  lV GW q c[|X|XXX|X|X|X|X|QX5VhkkVi| .iiK?K?K?3VV3VV t tWjWjSS ]]CF(h.  5Vh%W[%%%MVSi ]?K   FC(h.  .3V t Wja jzi~ qd]|pT/k(?/YI.::`gjkau&_d'W]<bv?Jcd/MuqdJoXxqv`VZ&z G D.{ {2 AS{{,IqqD]z{deDPLM>)E{{Pm?pp>/}<^5X75eALbWbfd*;!<VhhLz5q4q?jd ~!KdGU~.EjjH}b}4V'QXVt:9ha         ]]]]]]]]]]]]]?????????????????   .  .             FFFFFFFFFFFFFFF~FFFm~m((((((hh_hhhh~...VVVVVVVVVVVVVVVV t t t t tjjjhhhhhhhhhhhhhhk      jjjjjejjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVeVVVVVVVVVVVXVVVVzzzzzziiiiiiiiiiiii~~~~~~~~~~~/~~~M={ q q P q ^ U  U q q 2 q q q   q - q q q d ) q  q  q a )  q # q  q q q q q qd]])].]]p]]T].].]8]]]].]]]x]]>]]]]]]8]8]]].]]]]]]].]>]]].].|p|p|p|p|p|p||p|p|p|p|p|p|p|F|H|p|p|p|p|p|p|p|p|g|p|g|p|p|p|F|p|m|p|g|p|p|p|p|p|p:lP{oo{lo?qZyyqygr=IqDTT/kkkkkk  WEw(?????????????????/YYYYY%YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYIIIIIIIlxxM:::::::::::::::::::::::```````````gjjjjj&jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjwwwk1cecVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV;;GGG;55V5V5V5V5V5V5V5V5V5V5V5V5V5V5Vuu5&&&&&&&&&&&&&&& &______=__________________________________d'''''''''''EEQQQE++V+V+V+V+V+V+V+V+V+V+V+V+V+V+V]]]]]]]lJ<<<<.>>>>>>>:>>>::>.}/P//}/}/}/}=R~ca>=R`ca~rV:XrrVrtrrVD'EDCCj q]l|pYj_J{c/MuhovZ.I!~j]l|pj_JzM.I!TD<PIfcfSf9f9ddIfcff_C9f9ddfk}XfCCCCCCCCCCCC  < < q;*ZYUIIqU;bIN###########################################???????????sd66N6z6X868468>DP(&h.: ,Dl@BDDf0p\@X&eXX6zXJX!^XJX<X0rXIX=z\&x.C(4,\U``|@<~7 #(.1%+AWco  " $ & 0 3 : > B D ""%?rt 7 #&.1P $(@V`j  $ & ( 2 8 > B D ""%PPptv[ qpoMLGE861/a_] }ywcOGA1%#E)`_zbcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aqcdhwojuirfvk{bml|9xpIJyLKHD((((@lXxL\0Tx  \ \ `\H<(D( `P4` |!4!# $L%@%&@&&'8'l'(D()*@*+,-t--./$01t123h4$45H6679 9:<:; ;<<`?H?@@ABpBC(C8D\DpDE0EFhF|G@H4HXHlHI4IJKMMMMMNN,NDOOPP P8PPPhPPPPPPQQ(Q@QXQQQRR,RDR\S8T`TxTTTTTVV,VDV\VtVVVVVWWWWX X$X<X\XtXXXXXYYYZZ Z8[p\|\\\\\] ]$]<]T]l]]]]]]^^,_`\`t`````aaa4aLada|aaaaab b$b<cc(c@ccddd0dHd`eleeeeeeff,fDf\ftfffffghhii,iDi\i|ijkkkll(l@lXlplllllmmm0mHm`mxmmmmmnn n8nPnhnnopppq q$q<qTqlqqqqrprrs s s4slsssssttPttuHutuvv$vhvvwwhwwxxhxxxy`z<z{L{h{|P|x||}}\}~ TPlH`x4L\t$<Ld| $<L\t <84H\p@0HD$p@d 8H`|4Ld| $<Tl4Ld|<Tl,D\l|4Tt4D\|8Tp $<Xp@<Hl$$,DTdtDTdt4Tl ,D\t4Ld $<\|$@\x 8(@Xp0H`x 8Ph(@XpDx \Xl Td4d8xD¬,PÄtĤx$04Θΰ(@XpψϠϸ0H`xАШ 8PhрјѰ(@Xp҈ҠҸ0H`xӐӨ <TpԀԐԠ԰0PpՐհ 0H`x֐֨ 0@P`׀נ״,@Th|ؐؤظ 8Plو٤4Plڈڤ 0@`ۀ۠4`܌ܸ8`݈ݨ 8`ހޠ0Xxߘ0Pp(Hh(@`0\t ,Tt$Dd,Dd ,Dd|$Dd$Dl $<Tl(Pp 4T|8`Dh0Hh<` 8\<\| ,Tt<\t,Dd| $Dd| 4Tt<Tt<\<\$DdD\t ,Ll$DlDd,Tt$H` Hp @h0Px$Ll4Ll,D p    ( P     0 X    8X Hp0X @hHp @h8Xx8h0X@h0h Hp Px8h0`0` @h8p  L x %%''','<'P'`'x''''''(((,(D(`(x((((())()@)X)h)x)))))** *8*P*h******++(+8+H+X+h++++++,,,(,<,T,p,,,,,,,-- -0-@-P-h-------.. .8.P.`.p......// /8/P/h//////000 000@0P0`0p000000111 141H1X1h1111122(2H2h22230334l4556d677l78X89h: :;P; >|?0?@A AB(BCCCDEEhEFxGG|HHlI IJJJKLlM0MNOHPPQhR$RSTTUUVV(VhVW@WXXXYY|YYYZxZ[D[[\l\]]$]X]^D^_$__`H``alab0bbc@ccd$d4deefLffg,ggh8hi0ij(jkkkllTldmm|mnXooxopp ppqTqrrtrs0sstttdtuutuv,vtvw<wxxy$yzzz{d{x{|x||}D}}~~D4<0Dd|0T,H|L\lDTd@P`LXP@Tl$8HXlTd8<Pt`HHP, <@(8\<L@`\td@Xl` 8Tl4L\|$<Tl4Tl,D\t4Tt 8Ph 8Ph(H`x @Xp,D\tŒ¤¼$<\tÌä4DdĄĜĴ4Ld|ŔŤ,D\tƌƤƴ4D\tnjǤǼ4LdtȌȤȼ4Ld|ɔɬɼ4Ldʄʜʴ 8P`xː˨(@Xx̬̔4Ld|͔ͬ8Ph΀ΐΠθ 8PpψϠ @`ЀИШ0H`xшѨ0H`pҐҨ(@PpӐӰ(8XpԈԨ0H`pՈՠո(@Xhր֘֨8Hh׀נ(@Pl؈ؤ8Tpٌ٨0Phڀڐڨ @Xpۀ۠۸4Ll܄ܤ 8Xpݐݨ(D\|ޔ޴,DTl߄ߔ߬8Tp8Lh$@Xh 8Pd ,Lp(@Xp(@`x 8Ph,Pl0Lh (D`|(D`|(@Xp0Hd (<Xt(8Ph 0H`x(Hd|$<Tt(@Xp @Xp(Hh4Ldt0Tt 8H`x 8Xp(Hhx8Hd|0Tl $<Tl $D\t4Ld$D\|4Tl(@Xp8Pp(HXx(@Ph0Hh$D\t0H`x  ( @ ` x       8 H h       $ < `       , D T l        , D d |    4Tt $D`x 8P`x0Hd| <Td| $4Tt <Tl4Tt 8Ph 8Ph(H`x 8P`x,H`x0H`x0Ph0Hl 8P`x 8Pp  ( @ `     !!!0!P!p!!!!!!"" "8"P"h"""""###0#H#`######$$$0$H$X$p$$$$$%%%0%H%`%x%%%%%&&0&L&d&|&&&&&'''4'L'd'''''(( (8(P(h(x((((()))8)P)`)x))))***<*L*h****++(+L+p+++++,,,,H,d,,,,,--8-T-p----. .0.D.h...../ /8/X/h////00000H0`0x000011101H1`1p1111122(2L2l222233303@3X3p3333344404P4h4444455 5@5`5p555556606P6h6x666667747T7p7777788<8`8x8888899909H9`9x9999:::0:P:h:::::;;(;@;X;p;;;;<<<@<\>(>@>X>p>>>>>?? ?<?X?t????@@$@@@\@x@@@@AAA(A@AXApAAAAAAABB(B@BXBpBBBBBCC,CDC`CxCCCCD D,DPDhDDDDDDEE E8EPEhEEEEEFF F@FXFpFFFFGGG0GHG`GGGGGGH H$HDH\H|HHHHHII$IDIdIIIIIIJ J,JDJ\J|JJJJKK,KHKdKKKKKL L(LDLdL|LLLLLMMM4MLM\M|MMMMNNN4NDNdN|NNNNOOO4OLOdO|OOOOOPPP0PHP`PpPPPPPPQQ Q8QPQhQQQQQRR$R<RTRlRRRRRRS SS8STSlSSSSSSTT$T<TTTlTTTTTUU$U<UTUtUUUUUVV(V@VXVpVVVVVWW W@WXWpWWWWWXX(XHXhXXXXXYYY@Y`YxYYYYZ Z$Z4ZLZdZ|ZZZZZ[ [$[D[\[|[[[[[\\4\T\d\\\\\]]$]<]L]d]|]]]]]^^,^D^d^^^^^^_ _@_X_p____```,`D`\`t`````aa$a<a\ataaaaabb4bDbdbbbbbccc0cHclcccccd d8dPd`dxdddddee e8ePepeeeeeff(f@f`fffffggg0gPgpggggghh(hHh`hxhhhhhiii0iLidiiiiijj<jTjlj|jjjjjk k$k<kTklkkkkkl l,lDl\l|llllmmm4mLmlmmmmmnn4nTnxnnnnnooo0oHo`oxooooppp0pHphpppppqq(q@qXqpqqqqqrrr(rHrhrrrrrsss0sHs`ssssstt(tHthttttttuu,uDu\utuuuuuvv,vDv\v|vvvvvww<wTwlwwwwwxx4xLxdxxxxxyy y8yPyhyyyyyyzz0zPzhzzzzz{{({8{X{x{{{{{||0|@|`|x||||}}}0}H}`}x}}}}}~~0~L~d~|~~~~ D`|$@\l| <Xt$@\4D\l4Ld@`x $4Ld| $D\|4Td$@Xt0@Xp <X|,Hd (Lh <`4Pt(@`x$Hd(D`(Hh<\x$Dh 8Ph 8Xp0H`x(@`,D\t ,D\t4Tl,Ld| 8Ph0Hh @Pp(8Ph0Pl $<Tl(@Xp0H`x(@Xx,DTl4Ll0Ld,<Tp0Ph$<`,DTl,Dd|4Tt $D`x ,Ph 8Ph @Xp0H`4Ll8Ph $<Tl4Tl ,<\|$<Tl<Xp(@Xp,DTdt,Dd|8Ph0H`x4Ldt$D\tŒ¤¼<TlÄÜì $<TlĄĔĴ,TtŜŴDdƄƤ <dnjǼ,D\tȄȜȴ,<\|ɜɴ$D\tʔʬ4L\tˌˤ˼,D\l̴̜̄0Ld|͔ͬ <\|Δά$<TtόϤϼ$D\tЌФм<Ld|ьѤѼ,D\t҄ҠҼ $<TlӄӜӴ$<TlԄԜԬ4Ld|Ռլ4Ldt֔֬,D\t׌פ׼<Tl؄؜ش $<Td|ٔ٬ټ $<Tlڄڜڬ4Ld|۔۬4Ld|ܔܬܼ ,D\t݌ݜݼ,D\tބޤ޼,D\tߌߜ߬ $4Ll $<Tl (@Xp4Tl,<L\t ,D\t$@X| 0H`p0H` 8Pp(@`x0Ph,DTl,D\t 4L\t,D\t(@Xp(@Xp 8H`x 8Xx $<Tl$<Tl ,Ld| Dd|(8Ph(H`8Xh(8Phx0Hd|0Tl $<Tl $D\t4Ld,Ll0H`x0H` @Xp(@Ph 8P`x0X@p  8 h      ( @ X p        ( 8 P h        0 X x     H h    @h0H`x(@Xp 8Ph 0H`x0Hh4D\t $<\x 8Ph<Tl4Tl<X|(H`x0H`4Tt4Ld| Dh(@`  ( H h     !!<!T!t!!!!!""0"L"h""""##(#L#h####$ $($D$h$$$$$% %$%<%\%|%%%%&&0&P&h&&&&&''('@'X'p'''''( (D(\(t(((()))<)\)t)))))**$*D*`*****++0+P+h+++++,, ,8,P,h,,,,- -$-<-\-|----..$.<.T.l...../ /(/L/p/////0000H0h000001 1(1D1h11112 2(2L2p22223 303L3h3333344 4<4`444445 5,5D5\5|5555566,6D6d666677787X7p777788808H8`8x888899(9L9d9|9999: :$:D:d:|:::::; ;,;L;h;;;;<< <8>,>D>d>>>>>? ?,?D?\?t?????@@0@T@x@@@@AA A8APApAAAAABB B8BXBxBBBBC C,CLCdCCCCCD D$D<DTDlDDDDDEEE0ELEdE|EEEEEF F`FpFFFFFGG(G<GPGdGxGGGGGGHHH,H@HTHhH|HHHHHIDIJ8JPJhJKKtKKL L L`LpLLMTMxMMMMMN N<N`N|NNNNOO,OPPQTQRR$R@R\RlR|RRRRRSS0SHShSSSSSTTTUUDUUVVVVVVWW(WHWhWWWWWWXX(X@X`X|XXXXYY(YHYlYYYYYYZ Z$Z<ZTZlZZZZZ[ [$[<[\[t[[[[[\\4\L\d\|\\\\\]]$]<]T]l]|]]]]]^^^<^T^l^^__``X`t``````aa a8aPahaaaaabb b<bTblbbbbbccc,cccddddeeeeeeffg<gLg\gtgggggghhh(h<hPhdhxhhhhhhiii,i@iTihiiijjj,jDj\jtjjjk`kpkkkkklll0lHl`lxlllllm m$m<mTmlmmmmmnnn0nHn`nxnnnnnoo o8oPohoooooopp0pHp`pxpppppqqtqqqqqqqrrr r4rHr\rlr|rrrrrrrsss(s@spssssttt8tXt|tttttuuu4uLudu|uuuuvvv4vLvlvvvvvw w,wDw\wtwwwwwx x$xDxdxxxxxyy8yPypyyyyyzz0zPzxzz{{0{`{{{| |P||||} }H}p}}}~~t8Pt(@Xh(@Xx0Hh 8Xt$D\t0H`x(@`x8Hh 8Ph $4Ld|0 XD$HXl|,@Th|0DXl<l@l0|DdU3!%!!D $hUD^T&ܰNv 2"'&546#2"'&546  F<  F<v,M 32!7>3232##   #! #  -    $   #  p-.,0)2.0    ,0fVGWd2#"'.'#"'"&57&'.5>32.54>32 32654.'&#"HFh%   K9M F*C*2th!!1 ! *N3R.8T44la"2O"_  (4CK*P ,8F"32>54.'2#"&546"32>54.'2#"&546 #"'632t8MoI)> (P*EW}8N qI)= 'O*}r:+  Nm?k-LT/EZ0Q]8Nm?k-LT/EZ0n j  g%./326">54&'2>54.#&6732>7#"32672#"./#"&54>7.546,:55,)Bx>B\hEN3PJ/][Cu2@$5BY"`4d5.$;&B  &,L+!H7. L_5ggI%(';PP;2I*<LVD(CmJHlHukAp_E)L 5 W>0%5C 1#**CSEu^C%@M@sNv 2"'&546  F<v,M '.'.'.7>76'&&'&6767676'.'&6767>[=$!.$# >!,j )! B"}3&>,&2% _7 @>!E 7 g $2'16&1$ <  / e, B#-"z> 632!2!#"&5!"5467!;   v9 f  f 3 l  E ",72"&5>54&546$N 0BC>NT+ 9L- Z(#?t~" $72"54B)G 57.`<6462"`CZ??Z-Z??ZC2#"&/>j  &%  l"32654.'2#"&6,R}A?uHV|:>rTceɆgeJ߱޲"`"$'%4&#"&547>;23&#"&672676!kEd _ _ (*"( T/ Hzt * *&*0!.57>54&#""&5>32!267632,@L=9'|`8gH+ :[Ir:M!,k_TRh)>1R`ÊJP D2#"'.5463232>54&#"&547>54&#""&5>4(YP5%=:-^V7X^p\ 2"&*2b*PG+f-5 @j[3oU+U0. 7#>e:.YD10NxFcq?./*672"E}Rw /Gf>Pj'*2Qqd232##"5!&5>!,v NH %u@4 X T"A2#"'.5463232>54.#""&57!26?+> U^4X^p\ 2"&*2b*PG+2HnC"o l($\ %px (?e~@cq?./*672!E}S'PO>&  (* d (x2+32654.#"72#".5476$72>F7^9_}1uV{PP6Wb8b^f- 7c2d8PFPY]b5Qic.PRgp#+{*0|2632#"&56?!"#"'670h ?\``:?< 3 #GS m%K%2654.'&#""327654&'2#"&54>36'.546 cu2>V(SKUHd%G4'nJ)M=- i噥  -22 N~6xf/aCC 5_uZ4WB#Z]F7aM/ ;c͵2)-(# /d+654.#"32$#".54632"&7^9^|0tV{ c26PO6Wb8b^fӅ 8PFPZ]*05Qja/PRgp#+tP^6462"462"tCZ??ZCCZ??Z-Z??ZCZ??ZCLV^72"&5>54&546462"$N 0BCQCZ??Z>NT+ 9L- Z(#?Z??ZC<x\%#"'&547632 x$$tFV|=v^ ~ %0!&>7!!&>7!  &   & -8+8-8+8`\746? &54632#"&`v""FPJG>Upl86462""&547632&'&54>767>54&"~CZ??Z=D)fjY8[o*i  2 )!9Xx]-Z??ZC^8,1@VzCg@S '8Cs(E,.-!2KY*bGU2#"&547#"&54>3232>54.#"#"'&54>"32>?&Dr‰a.ksMY8L\)YegdKGz5+/aM1&Ruewԛs9sLJ5/?8{b?f0w^(Dv_TX7% QX;pkެm.,K{[Sh=ViC,  5?vѡ^UTč`.EQ>323&#"&67267654&/&#&#"3.#"&47267633272675z7 2 c)GX M D""~Z 8"%5& D:')?L"R *hNK]7+ԁ% ) * TT`R< - , 7TQ, B3 !'32654&#"72!&67267654'.#.7326 I@>z}~[ :llO1C 'b]@}4h h"Nb &8L`y+BiBg.O}Fqh* tVt * `6(2"'!"327676!".54>. 9v)UyemZ #3cf6* $_zH`Q&ZjoT',532>54.#"72#!&67267654'.#.7326 mU=hY ̡ a*i h h&:EݎՎ`+&|ck~L* tVt * T_0d2$3#"'.+";2>767632#"'.'&#*;267>7632"$#"#&67267654'.#.7GZq- oZ 0'j281  ( 5G`H)+4& *gH1%h h": oM&h (  O+ #`]S rGZ* tVt * T0O2$3#"'.+";2>767632#"'.'&#"3&"#&67267654'.#.7GZq- oZ 0'j281   y!b%h h": oM n (  O+ t * * tVt * `m6A4'.#.7327"#".54>32"'!"32765. fa 54'.#.7<h EhU2. .,"4, h" * tN 1? *3}Vt * T-,q27"67>7654.*#&473267# "'&'&&#"3&#"&67267654'.#.7Gh 4t\.  aM!4,%+=~P) VM D%:*1+cL?N:7u  hh h" 0&nr sb;%  '  5 BN'e Y%M(?+1(. ):6t 0 0 tJt 0 T_,7%;26767632"$#"#&67267654'.#.7327" 5Gr?'R,& *gH1%h hh  8 rGZ* tVt * *&n0,l27327?327"3&#".7267654&5'4&#"' 3.#".72676754'.#"47E4n8$X|dk  g&)J^Z . 4 t"PB')GZ !u m#G;" 6#: 6=aY6 & ) JWh rPM )*) F:7R2J2754&'.#.732>7"#"&'3&#"&7267>54&'.#&7`82lrs)?L"w  )q)?L"w  w (N t>6 ( !6=Ҭh Nt>6 ( !6=d=6! bv6)"32>54.'2#".54>W_BAvpW_CBwRiihhCnSvtCoSvsDekelS ,=#"'&54>32654&#"3&#"&67267654'.#.732632 6 3|[ hh h"@m~~t * * tVt * Qb69"32>54.'23272#".'&54>W_BAvpW_CBwRi7DsId* `T<{ttGhCnSvtCoSvsDe@L& 33+DHG6elS,>J2"'&'&'&'&+3&#"&67267674'.#.73264&#"326bFyKj-ePE@"W,j hh h"[ k{&-TRg$;7 )#0t * *{Vt * ~^b4Y2#"'.#"#".'.563232654.'.54> ,M2^%  2?X1:Y0' 8$AH-E,4FuP/mHo4ErDf #3%?*PC,q4 W JN?()DJ'6*+'' ,1'96E$P^5OA\F2q6('!"  24#82?!fVL42676'"'.+3&#"&6726765!"#'6763NbH hh HbF* ч ot * * to  4.;27"3 4&'.#.732>7"#"'&54'.#.7'h b^|k)?L"w ۊ h" * tzt>6 ( !6=Ht * ,@27"67654.#&4732>7#"#"&/&'&'.#"470 "- #oh7$!1& <);CT&>0(W0,X XG" 0 )_z\0"/2,ZD h}C7,`2>7"67>32667654.#&4732>7#"#"&'& .#"&'&'.'.#"47'DS "- $2. 7U>!#1( )8@T%#.:1 WWL2571 C&  K" 0 &o[zY' Ģh(~`,"/ 2y}*Q*z/ # 7 <,f27#">7654.#.7327"3.#"&432654'3&#"&67267>7.'.#"47?823 n?D @4Jdx3Uq9O?%2Zr&Y ` H5)."$C~3$7)D"`L" 1 "+S_ / + ((( ,2ր( . +*.VD8;2,Q%4'&'.'.#"47327#"67654.#"&732>7#"3&#"&672676 >59,D"`L,823DC4/EN>7=  hh .q*_6;2 1 ' zO= 6  1 $k%,t * * F>0"#"&'673!2% !27>5632!"&7d" "/p4Y uE #R}  G !& *-q9K$ ,!0%0#00'&#&'476R2LA#B2#"'&'6X&    Z2"/&5476?&'"'&54? !76t $@\ )n#"~\ XC$  Gr-+++`2uG 63!2#!" B\ I(XM4JDh D%265232>32#"&'#"&5467>7>=4&#"#"&5467>v1}9ANW>   c*F .c?%!u eG21 M& >\A. O78T rd^7Q1ia9Y <* 6Gy=?`4 !:jl0?"'.""&5654'&#"&6767267>32"2>54&+i   k)1VY0KH$` t|H # 5_P$B @nv NLzFaM& =QcPNl,#".'.#"32672#".54>32.(- "+%VHm 0He7uc=e~?lH 1/)B$48$tiTtW-0#Nl7D22=4'&#"&676723#"=&#"&54>"32654&*\ k&&# KA8@bm@nl*P$B @n!  &F  X]xITDž6#?Pl30!276.#"32672#"&54>32F+$D+/N- Hu 0He7JrBDn@*)K:.<@,0EE0JF$48$a|K*=N@./ 2r=2#"'&#"32#3&#"&6726765#"5467354>+  (!1>  d#AT] t ,JJkwr##cY t * * t 3&gdžR.:n Z"32654&"32>54.72.54>7.5>7.546327'"#"&'3Q_iWN\c,L}D]gAZ:! ] #AT] Qs"]? ] #AT] k(l">l\t * * tȽ04 ^t * * ttP$B @n<,f@'T Z2`'TZC$lZ%3&#"&67267654'&#"&6767267>4.#&67327"7#"&'&'./M ] #AT] k$B'%a_gIcg9m$g-fPrt * * ttP$B @n8 m7!  , +W=v# :| $l&4'&#"&676723&#"&6726765 k ] #AT] \P$B @nJt * * t@p26323&#"&672676=4.#"3&#"&672676=4&#"3&#"&67267654'.#.7672327676[roAZ:! ] #AT] )D0,a7 ] #AT] Pl=} ] #AT] @+s ];<lNX">l\t * * t@ZS045 3[t * * t̸V^t * * tlX(=TN@pS23&#"&672676=4&#"3&#"&67267654'.#.7672327>AZ:! ] #AT] Qs"]? ] #AT] @+s (l">l\t * * tȽ04 ^t * * tlX(=T,fRn"32>54.'2#"&54Ql+>VQl+??,h\eh[dB<p=K2#"'3&#"&67267674'.#.7672327>"32>54&EXU-STFF ] #AT] @+s/ :nyAO{<lO~C^N t * *{2P(=G (Jv7 FLfSN:lB"32654&'232723&#"&67267654&#".54>Ck< 9gs " ] #AT] #8BvR==g$Ejn18=OH2# 5_t * * t( S3Ulr6OrX.@p>2#".'&#"3&#"&67267674'.#.767267>_'E. #$&:f #+] @+s "j"17 +t * *{tP(= JRj=2#"'.#"#".'.563232654.'.546- \:EI+> >7!})G_  zJ?Q:.^FRjZ CuF8+"#$%+/w ( GwMC#801 (eIk(Ll)!2#327#".5#"546735>7>@ B@1\-)F>#t ,J<, ` . +-.X>D3~A0pG4'&#.76723#"&='#".54'&#.7672326'Zn&'% KA8 .H=\5! Zn`hAxN('"' f\WA   \ 1S4Npc9N('" nVРI%\82>7#"7654&#"4732>7#"#"'&&'&#&7"=M '.fL @462%"6DUV& /d1[ J=R 1  #"2 1 $ oFd(\_2>7">54&'&#&47327"7654.'.732>7"#"' "'&#&47"=M&/ >  >n/d"$> /c/"5C]r "YH<R .7K=OR% H&. *@4W[IsM  - 1"&C Bb, ( \m27">54.#.7327#32.#"&63>54'&'32.#"&67>77.#"&67\nP S+!$*L=$ZF}fA2hH9!&DW7h6 e %F9#"9F( % Q&nR ("rH2 2%#Z H 0P3   '   Z 8\:27#"7654&#"47327#"#"547267>7'&#"47sU '.fL @4KiDdUV B2!LbWPZ8Er[_R 1  #"2 1 $l0pV'K(7 DFn'!27!26762!.47%"#"567(qUs <v . j^ &kI  \$% Y" ('&&7676'56'&'&776<8  8; ;d{{d;4v>^@^@tOaVXb#"'465076763T .   " (&'&767&'&7676'&76'&76;d{{d; ;8  8<4ObXVaOt@^@^>vp%.#"&5463232>7#"./4Y*5T-R,_-6/5Z, "[.\;*/) 6f 3ijBF\462""&54>767j?ZCCZ%+-  <7ZCCZ?G-QN-GZ&F XpY2#".'.#"!!63232>72#".#""&547>54'#&6;&'&>t07) .!!2?Ky9 &$F5a<&H3   1Ji79mDR"'" d+A )l Ak#1/" LpJNz *b4$&=+  IO5$*$'< 8d+G ?Yc{I 32654&#"76'#"'.'7&547'&>7632LYq_Ys/v"!x:Bl0h_ucj"!l4i#&6;&'&'.'.#"47327#"67654.#"&732>7#"3#3#3&#"&672676=#&6;Z # >59,D"`L,823FI3/EN>7= hh # Aq*_6;2 1 '$Q6 6  1 $k%! V ,t * * t, A##".65&7632&7632#".6Q  "+g "+Q     L  .  Ld(Ck276767654.'.54>3232654'&#"#"'.#"654.'&54>767f @Qb)JG._9G"   1 %-f @Qb)JG._9G"   1 %'8@ '8@ T 6sd=xjO*W=#4 2T 6sd=xjO*W=#4 26*79:*,6*79:*,dfUnp&2>#"&54632#"'.#"327>32 >. 32#" ^vyz}c  'K2PpOg) %%߂@( o&wz&r  &|Tp|& !߂߂@^nX @26=232>?2#"&'#"&546767>=4&#"#"&547>.!W ;- V7q<\* E1xE], @6## 5 )<7 "B';nNB  '8"I\D'= R &2J%)B$ 'Id%'.547676'.547676Ƕ wCEu f wCEu TҜ <~mp9 Ҝ <~mp9 Z4H #&'!"563. H   \v"p P9FRa2"'&'&'&+3&#"&67267654'.#.73264&#"626$ >. 432#".BsB-7654&#"&7>3232>767220 wc$`F>*H$$Bi\'%xk1_@P"# ?[x^\n# N2 =22#"&'&5463232654&#"#&'&7>54&#".76DEiJ*3$T%0AOW9"Pj?'   P RH;XpX %$]YHd  ]E'? xdXN4:jE32>7=6323272#.'#"'#"&5474&=632 420[G6X JB7/ k;!5=Na2Y%XX.32326?"6?2 0, [0*02N d2F&a [[2gS;L;;232."&4326765[]: SzZV  ?'  'J#.TN`9% .. =LT "32654.'2#"&546vPPf\LN&X,$`n^EzW0}~}h%4'&76'&76%4'&76'&76 uECw  uECw Tݑ 9pm~< ݑ 9pm~< D'BQ203##"'5!&'603."&67267654&#"&'67./> F L64 O*,PbXqK 3    N".  - "459t8*  ! *2t) bm  J*Q`232>7672!"&7>7654&#"&7>3."&67267654&#"&'67%'./>ri\' 20  0pF>*H$$2PbXqK 3   N" x^\n#  %54&#".76'./> F L64 O*,EiJ*3$T%0AOW9"Pj?'   PN" .  - "459RH;XpX %$]YHd ]E'? x  RBN\8"&4622632#".5467>7>&567@CZ??Z2 )!9Xx]=D)fjY8[o*i  Z??ZCCs(E,.-!2KY*8,1@VzCg@S '8'$'$'$V'|$x&$8 '|$0!".632676=&#"3.#"&4726767654&#&6732$3#"'.+";2>767632#"'.'&#*;267>7632"$332P"2! D:')32#"'&54>32654&#"3&#"&67267654'.#.7Gh !lE>uJ6 3|}b hh h" *&n~1WSn&* * tVt * 2jo2#"&'4763232654.'.54>7654&#"3&#"&6726765#"5467354>I|c8vI# C4.%-C&pT<  &57E9,+5* "B_f^+B)  d#AT] t ,Jgj>hDxl< .52 30G(x8Z 9XJ!5. !%"-;%Ajdz;B\J02t * * t&3 wJD'MtDJD'NDJD 'ODJD'PDJD'UDJDH'VDJle3265&'&5"3!276.'2#32672#"&'#"&54676$7>7654&#"#"&547>32>j8BN8:~ q/N- F+$D Dn@*)KHu 0He7a1,0c5'9  UE21 .'&5`"32654&'&u5Q0  Uj  WJk{EtP5cJ:V1@|NrvQn 2@z.  .v7+ #V -DU{v~ESQB;g|HdxśP @'PQR'MRR'N*RR 'O RR'PRR'URx 8'TZ&'TZ$Tn&R'MX'N7X 'OX'UX8'NO\<l<J2#"'3&#"&67267654'&#"&67672327>"32>54&'XU-STFF ] #AT] k/ :nyAO{<lO~C^N t * * t2P$B @nb (Jv7 FLfS8'U\<'~8$JDn'Q6D'$JD'SDB._k.'32>32#".5467#"&67267654&/&#&#"3.#"&4726767>32333272675cN%-#?" dn4D[M D""~Z 8"%5% E:&)?L"R *4z7 2 cVhNK]/<7  9A M9 * TT`R< - , 77+ԁ% ):JBDh c%2657#"&5467>7>=4&#"#"&5467>3232>3232>32#".5467.v1}9AN.c?%!u eG21 M& >aW>   < 74'%-#?" dn4D~P*\A. O78Tia9Y <* 6Gy=?`4 !:jrd^*')*!)7  9A >?A`'&N'NF`'&N 'OF`x'T&N'TZF`&&N'XFT'&'N'ZRGT',&'Nl&GT_<'8(Pn'Q6HT_'N(P'SHT_x'TL(P'TZHT@_0~2$3#"'.+";2>767632#"'.'&#*;267>7632"32>32#".5467"$#"#&67267654'.#.7GZq- oZ 0'j281  ( 5G`H)+4& *T%-#?"dn4D{U1%h h": oM&h (  O+ #`]S rGZE7  9A H;* tVt * P@l=K%32>32#".5467#"&54>32#32672!276.#"]g%-#?"dn4D]?JrBDn@*)KHu F+$D+/N- 3OO7  9A 9@a|K*=N@./ F$+.<@,0EE0T_&(VP'XH`m'*.:H'O2J`m'*.:'SJ`mx'T*.:'TZJ`6m6'\*.:0'YJTZ'+'KTZ,&+$l&KAtV'G,75'P%RY<'V8,# n'Q6T8'O,O'S;T@8,L27#"32&'32>32#".5467#"&543267654'.#"547L hhZP%-#?"dn4D]$)J^ef^J" EuuE 0<7  9A J=6||68@'TZT8x'TD,@p(3&#"&67267674'.#.7672k ] #AT] @+s^t * *{tP(=b"R:1,&,-@24&'T Z'CTZ0:-'D-2 'OCT6-,'\.$6l'\N@"p[67>4.#&67327"7#"&'&'./3&#"&67267674'.#.7672k$B'%a_gIcg9m$g-fPr ] #AT] @+s m7!  , +W=v# :| t * *{tP(=bT_'/$'OOT6_,'\{/"6l'\OT_6'Z/$l'Z(OT_,'T},/$l'T|OC_,&/$l&OR'$1@ 'NaQR62'\1>6p'\#QR&1@'X;QD'ZQR:2_%3&#"&7267>54&'.#&732754&'.#.732>7"#"&'&5463232>q)?L"w  w &`82lrs)?L"w EhU2. .,;=-K't>6 ( !6=d=6! N t>6 ( !6=N 1? *'[@2pM%.#"3&#"&67267674'.#.7672327>32&'&47>Ps"]? ] #AT] @+s (@AZ:! /FaV.4@E"\T04 ^t * *{tP(=T,f">l\n}e7  %Asbv<'82Rn'Q6Rbv'2R'SRbv' ' 2R'N'NRb6^v!"#"$54>3272$3#"'.+";2>767632#"'.'&#*;267>7632"$"3267>54'.Wxjߦi} kLZq- oZ 0'j281  ( 5G`H)+4& *gHT`B@vpgF.4l: oM&h (  O+ #`]S rGZBoRvt/"S?DhyK0 Rn M"3!276.%"32>54.2672#"&'#"&5432>32p/N- F+$DKQl+>VQl+?Hu 0He7j6:fx76p'\US']5@ 'X Ub'X6R'NVb'6R 'OVb4&:6Tj']tVb'6R'XVL'7*Nl']bW'_7(X'Z`WL&7(Ll&W4V'8'PX4<'88n'Q6X4'8'SX4'8H'VX4' ' 8'N'NX4@._27"3 4&'.#.732>7"32>32#".5467#"'&54'.#.7'h b^|k)?L"w 6_R-4!/%-#?" fl4DW&Yۊ h" * tzt>6 ( !6=|=!),%)(7  9A M6 Ht * :dd3#"32>32#".5467"&='#".=4'.54767263232654'.547672632B&'%  >%-#?" dn4DDH 4E=]4! ;& @ ]g=k;& @ pWA  K7  9A ?/ f 8V4MiZ0N0!"`4]#vN0!"`{': 'O(Z{'v<8 'O\x'* <F'=DF'N]Fx'T=DF'TZ]F'=DF'X]2r83&#"&6726765#"54673=4>32#"'&#"[ d#AT] t ,JJkw.+  (!1>`t * * t&3gdžR##cY`m'*.:H'X2J2`p#74'.#.7672&'&47> @+s/FaV.)5?$ZP(=b"Dn}e7  /Ub<"Y<DZd<lJt2654&#&72#&DE[XPnm rNUk $ji<lJt"&5463"B mnPX[*ij$ kUNrd X4dSD.d,TdLT^dX'N4N4D$2#".54>  0 #$< g $2#"5467>x # 0 $ g <&2#'"&5>7 # /vF/ #(*0= `8 =0*(232>72#".'&#""54761L( 0 7E/O' ,5 0"*"*J 2#)&$H 80!&67!@  C =ZD463!2!"Z x W@ 267432#"&'4&54632~` {OPz >OA RvtV Af462":T::TT::T:  2"&46!2"&46%78L8:%78L8:8&%57J78&%57J7RJ2654&"462"&AZ??Zhffh\BA/.@nIihjj$$'NlNd0"'.'463672  # /nN/ #(*0= bD =0*(vN#.54>7632dLR$82 ..R,BC0Z>(  (6!D2"&5654&546BM? >89D /AHEOS2M6fTx6^2.5>54.546 #tR I6\4T#M'&?!32#"'4&5463232654&#""&7>732&2lP) .(.'#/ *6:(ES '!# JbLT!%232>32#".54>6  `QF%-#?" fl4DPieT D@`,7  9A .nN S LQ<( 0'&547632! '&/&4 ;dmG< , < T;V+C "t=}yOl"nO#"J (<'H2&7>7&"! $'&#"'.".54632767632327632! %6$ C B= LF O<,4 8H-+MJ FLY15%KId(* gr&lH/q^F`GG.cIWBGvv ^)Q Wv8D ]X,//#qyS-j!"4.54762!$%6 IE"S(;K2Y#7Q.U&/N5 F/jV8 1>:: ><^W%/"47&'! %&/&4! 7672#"'&"26764lB8>C "O+WoK lI?9s_^?D .hGJ Zc1Hp RPa8.&E|&f8.&Ez&fZ<%&6'&'&763276'&?'&'&7?6767676C, ?EgG9~-pMH  gf )IJ~h"2[zu?g&1A9>0?%0Cd5'H!+P /J@[c@N- -09[^#d zZ %''&'&7676%&-2MO^6tLBQ(+LL' 2}P{0""4.5476276%6! IE"S(;K2Y#7R.U&/N5 F/jV8 1>:: >]03<&'&767676'$76767667$?6%!$6Q3+az<#1 !?'-Sٓ.B&8lr) #  fs=&@G$`O;c2 5 &: ]R\?k0/}WD|{&%>36'&76'&?6>?t+MY4N!,Jg^* #D :%Z )[\ZP aoxT-|P(&76'&?67&'&>'&76o+ #D &Bi zyb  gh- MCh&(_aoxT ['4bwU  (&z @Ssj/Q jf j/Q &o a%&767676'&?6E""؝ WW  -mr9BC&4Oe  }06.?&?667&f7|@ ID\ YQ- :6 NN(` n @< O5*(0,lPaox K '#76&?6%6'&'&676'&'&?6 !#.% \)t$4[ KWe< 1/4P -6 ,V@Lc $ p( "6&'&76'&67676'&'&79&;N00s T=lN("]/1 ? Aa %6?6$_ # 9x Eno6'&767&76&'" :\K"*P@e%-F<0oJN("w)9U1N`q, U{OwFT-'kbUZ&[0&'c'&7&76763'&7>76w  # tG1i -\(,tG^J' 6 #j=fTQr)KX8?8"+5iB&&V=4'%k)p&JHe&'p&|m&p&& & 4  &,&$V2;V2&H)o)o&, .%, .&"&"\MMJ&rBy #<'VM5 # &M:e&'e&'Je&'J515]&&T&l|O }&&mV=R%e0'0&' 6?676?67B +c: "E ->@ -'%64"(<'  ">'&''&767.>&'&6'&'&7676'&b" +# X/1KG$C'"  $# RQ7OF &VY, C  624,D, D<L6%/&76&% _\(lL @)) aj;!mf'&7&'&76.26o\ iL UVa> <*Q.DT!'8 %A&0SvuTB6@ R!  $#(676'&.|( 7u , !~i`* ?67!6>(4*>(4*&0&0D$0#"'&'&547667632&d#uB N*X 8  y  "KkP(#'&''&'4767676 c:? 0e0u  aN#   u  W_`aY  , '&'/&767&76>'&b;2:l-($' !438 B% ,5/lZ, O&= ' /,& &67&'&76.26'&&7676, L UVa> <*Q.DT!%#4j3I*G3/1\&0SvuTB6@ R!J+3> z#  60/&7/%A5+m.4 n-C2 6&5&75y)7H 6#2Uzt % =,FT676762'&'&7:d9&@f<""$ +]p%.['}9)G%e%62'&'''&'&?67676@)6<,ay<" "* 35w9Xz*0 ou@%=}=!j  "h>'HO! (4J9tc+632'&'&?67&'&?6U %t'u2$#wC+3:; ").nq:/A=V  )2!Z =P/PO3!m6}MK(M'de 6 &5&7676} !֨ S  +$ k<A9t#AVU>'&/&763 !֨ S  8 k<|A96#p6''&&'&76Žyac%-w? #[n&1D27.dl+0mxB+ d'@&ZDB6767676/&7)] ܂~W_W*+`- ,K5L?\wj  /g '&7676=] ܂~WxfY(+`- K5L?W|m  /WL !!%WgppgooUU$ K 6'&'&7 > K "բ&& @n)p&J!mf&6V= 4'%*=xV&%'e&'&&,&&&'Z&I&N&^&X 4& & &VA &H & &$ &>&L&nN&HN&'LHZ&$&/&$%&$J&$V2&HxV2&zVB;&V];&0WVR;&V];&'0W0V2T&yV2)&yV2D&y)o&'@o&Oo&'O, .%&}, .&&"\MM&rB]]&N]&'H]&&]&&&y # MT&'lXdT&'l&'lT&'l]y '&MbOy ''&MbOy ''V'bOM '' &MbO ''&MbOy ''['bOM|O&|O&|O/&1$+O&0&'&=}}P&&&'&=}&&cl &'$m&pmm&p|m&pV=R'%V=<R'%BV='%V=V'%V='%aV='%V=.'%V='%e0'e0&'+e&'V='%0&'0&'''>P %#!&?63D$w6$$w6m  ?E&'&'&?6767667676''&'7676'&'&7676%&76&2/=EH|\7%:y* DA,('X_1". w. #'tKv 7:my' $9B,?E +Co,-U~S2 =8(OZ?>6E $85:RP1 =U67&'&'&76'"'7676'&'&7676'&'&'&?6676'&''&'&7oR 9[-HX@#I('X_r". w. #'t&n(*B9<- : S!Cp;JunPp?8vZ?>6 E $85:Rb:my' $9B,>s ?+Y$G (+ oz '&7676'&r, +_+lx#d i. `M  d.66&7>'&'&760767&'/&?63607&N #! e"'n T4w R mS'? C. -E'"VDC 3$ /P Xh.' " 3 36&'&7#76$7&&567676676q/$9Jkr1NS H)=mP  \.Ȋe" t!Z-@ &Jr@"  $o'/>'w n ( (6&'&76'&'&7'6'&'&7l <*dZ <)d c<*d b '"6lQb"6k [f"6k [  W962'''&'&67>76'&7676767>76&7* 7I5d2>/ #6J+i5 ' == /:  K 6WC ,_f1j.e 1[r 6 B 2X <#Z Uaq'&767&'$&''&7&'.7&6767&76>%67&'&76676'&676'&'&7676'&%&7676'&&7676'&%&7676'&.7#$'$%6%2&>763"'6765&'/A9(4ߍ&33&4(9A/rhhr/A93#&33&#39A/rhhUU3LG(FM22MF(GL3P('6  6'(P(MRL(R( (~6  6~( (R(LMPlqddql!!!!b 8 Χ 9 9 !ͨ 8kmpg~~grkZ/6%6'%'#"7'&7%54%&76&32G:;Wpp(W:;G% RS %G;:W)ppW;:G% SR %W:;G% RS %G;;X)pp~W;:H% SR %G;:W~pp 6'&766'&'&K|[8#[ %/24PKXBQe4"2f22?  4'&#376'47632#"'& 4. 04 229<2222<922y+76&~{+67+{vEFFFuwFFFF/'&76767&'&'&7676/ I( (C[ e?372 2'/L 7 I    P >%N+7>'&'&767&-RG6  U (* +n$2BV) ;DOe(#3mpQ)2U9Wi16%/&76At LJ#13t ! NT/\B!&'&'&767632'&7676 C"6f"1#N*V58nsb|S5F@#aŀQ1 ? +5r 632"'&'"%6$'&7676#5D=+*9HN4\#q3m4+.QR:VhPlT 4;2H#aOS"C)2 )6&'&7&676367656&'&?6/%9K*4 E{ C  IZ_E$ !Y -\Mg7)l x] {f7) XZ'/7?GOW_gow/7&?6'%&76&6/6&76/&%?6&&6'$&?6/&$?6&6/42'&"&7%64'6"2767&'67632#"'&566666'''''47632#"'&'#"54'&'#"'&547632767&7'&7'&7'&754&76&76&76&7&'&#"'&547632676543267&{= 3Z  Q{< 3Z  aZ3N  ={1 Y3N  <{1 ^5 ^K  ^6 ^J ZZ + 4ZZ , /+,0+3Y_(-7.*q9 -hR@bL:h#7+wx\FVIrW' 9q*.7-(_Y33Y_(-7.*q9 +hR?`Mz  $4G 5xQo B; -0cvGS$*+7676'&7%$'&767632'&'&1&]>65# }6 &PICP Dr\Hn"5@Q2 <3c()t^GWD F*EDVUp)o&'@, .&'MJ&'rBc&~~n& c&l&&'I&DI&'D&'&R& .& &"&'LU&V2;&)o&~Mx&rBMC&rBM&rB&& y #'sMy #'tMY # 'TM& & ?&'&B}&'&n}&'&|&8V2z&HV2Z&z)oh& &H &'H>j)o&'dV2H&'ye &w&dx &ex e&'C e&'B 0&'e V=0'% V=>'% &R &Q  & )o& )o&xT&'l&R I 6?676?67B + ; "G->@ -'!%64!)=' ~@'j@e7ROx'T$%'TER%x'T'N'TGR%,'T'Nl'T2GR,%,'QH'N&l'QRBGR%,''Nl']GRx'TN)2'TITZ,'T+"l'TKTZ,&̄+$l'] KTZ,'S+"l'SK0x'T0@'TPQ x'T.3<'TSbx'T6R'TVb4'T6Tj'TbV'T7(Lj'T4WL'Tt7*Nl'TNW,L'QH7*$[l'Qv@W'_:'MZ':'N,Zx'W :'UZF>'T=BDn'T]",l'QHK`'UW'<8('M\V#<VVu#7'7'77<a*aa*aa*aa*6ba*aa*aa*aa* #'73#<+BC*6ʌ*B++>&@4@.8%b  w%8.@4@^,c3272#&#"#"&5>5.#""&4633265&'67&'674&#""&46332674&'46323272#&#" )%j8--@b#0 #1b@--8j#1  & 1#j8--@b1# 0#b@--8j%) %Bb%8.@4@&>++>@4@.8%w%'2w%8.@4@>++>&@4@.8%b/6N462"~~`D 7462#"&`@`DD0/AZ0BB`FE`,$462"$462"$462"DF`BB`HF`BB`HF`BB`*`BB`FF`BB`FF`BB`F 3#'7'7<<3*``+VV*a`* 77#+``*<V*`a*Vu #7''7<*aa*6U*aa* 3#'7'7'7'7<<*``+**``+VV*a`**a`*7 7?7#7+``*)+``*<V*`a**`a*VX +7GSa"32>54.'2#"&546"32>54.'2#"&546"32>54.'2#"&546 #"'632Z8N qI)> (P*}8N qI)> (P*}8N qI)= 'O*}r:+  BNm?k-LT/EZ0hNm?k-LT/EZ08Nm?k-LT/EZ0n bv2#"&54>7>2-+(  Ev0,[N g0/bv#2#"&54>7>#2#"&54>7>0+-&  E2-+(  Ev0,aJ i0/0,[N g0/"&'#"&'5>7>32t8. N` .'>2Hn86p Al= K,9*<N!.'&547>.#W '  J̓u=N  &R & AU$F8V0N#7.54>?.'.54>7 & Y >tsU  % V" 9F!KH DRG2*' |'  . #"&/632F+z IR2#"'.#"!2!!2!3 2!".'&'#"7673&547#"767367>Aٽ,( ;InBgv"   1 xy/C  20 } Os e 1(>-9$ab *+) *jf2#Vfs24-*(-''yjA$ 0!&>7!x   .9,9|:H2!".7>3"#".654#!"547>73!25&76323!2#!"  -( r ~  7   % 4".  7 | pI..547>763#"'.3 $ J2!!P{  3 l( Z #/;GS_kw#"&54632'#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632'#"&54632r01jk50hHRTIh0rXm"32#3&#"&6726765!3&#"&6726765#"546;54>32>32#"&'&>4'.#"!546  d#AT] d#AT] t)@\S,G0 -& )G+:V0d t * * t&t * * t& 5 jԄ-9S '1  (;hxGDu2r`2726323&#"&67267654'&+3&#"&6726765#"546;54>32#"'.'.#"A^ ] #AT] | d#AT] t)@lo?x#B2&? 62TzF"P@>t * * tz?-&t * * t  5t;%B>!1H %`23nb754+"546;2=4>3232>;232&#"&43267654&'.#";2#"32&#"&432676 jR HqFC,` ^ D:V( ` ^@ > i‡P. @npt>1 2:Ro,nm\f 02.1 2:4;n%4'.+"32&#"&5432676554#!"32&#"&5432676554+"546;2=4>32>32#"'.#";27263232&#"&432676"3!2=47654/.B4Y%@QX Y%@QX jR N{G4]>% ;KX\l0*; % 5;Y)K ` ^^h  2N;# 2t>1 Fl2t>1 Fl > h{H 0(MW.8@*4,1kZf.P@dt>1 2:nf qQ  )26an%4&'.#";2#"32&#"&543267654#!"32&#"&543267654+"546;2=4>32>3232>;232&#"&432676'.#"3!27676546 D:V(Y%@QX Y%@QX jR N{G4]>% 9LC,` ^ 2N0^ho,nm\f 02t>1 Fl 2t>1 Fl > h{H 0(MW. @npt>1 2:)2f6  'c'4d,'&@ '^V1'X^P',XI'N @ '1'{P'^'X"@ ',1'&P'-'^@'3'''^@''~'X'^@'$'']'R>g'\'/'$]'R>'\'J'$ 'H'Hv' ' 'VA'$'f{ '\ '$'$l'f '\ '>'>v' 'v'Q'KZ'$'/'$''L'V2)'yV'eV2'HxV'dfy # My >N y ''bOMy >&N' O' ''bO&M >'&N'6' O''y '&M'bOVy >'&NVm2 'mw'am ''a}O7}P'&O'$''m'p3'm3H)<cl)Js7c)<7&'>&'.4=4J=LD4(4Jz(D444441G41G2S4e4Je D3C5\DJ5h\Jh''l%'>'r')'V=V'%h'N$V='%h6'$V='a%h'ZE$=xV''%V='%h'y$V=<R'B%h '$V='%h:'$0''\'&^V1'X^P',X1PVd&'jV&'.&'j #&'. hR'$'sjh'$'.hR'N'$'sjh'N'$'.hR''$'sjh''$'.hR'ZE'$'sjh'ZE'$'.~h'&'J^'&'(j`F'&M'g}Y~Hh&'J^X&'(j`F&M'g}Ye0'G\&1'QP'KzC'1 &'rzC&'rK?&'^~Hh&'J^~hh'b&'J^z'1 &'z&'z'G&'K&'~,&'&&~h'b&'&&z='1 &'rz=&'rz='G&'rKH&'^~Hh&'#~hh'b&'#z'1 &'rK@&'^~Hh&'#~hh'b&'#zL&'a& '.z!'1 &a& .zL'1 &'zL&'a2& '*.z%'1 &Vz%&Vz'G&V'4'rz&6H'4'rz'1 &'u6z&'u6z'G&'u6Hd'4'r'\ #&!a3& !.a3& '+\!.z'1 &ka~-& .zI'1 &'Aka~& 'Z.zb'1 &'pZQzb&'pZQzb'!&'pZQa & '.~Hh&' ~hh'b&' z&'{ZQa (& '.~Hh@&' ~hh@'b&' 7p9&z'1 &z&z'!&9&K&~HX&~hX'b&z'1 &.z&.z'!&.K&~Hh&~hh'b&zV'1 & zV& z'G& a&  .~HdJ&~hdJ'b&z'1 &'rz&'rz'G&'rK?&'^~Hh&'J~hh'b&'JzV'1 &%&aGH& .~H4&~h4'b&z'1 &'Vz&'Vz'G&'VK&'N~&'*~h'b&'* K&'$V2 K&eA'' 'B0 '7 ;'h A'  'L a' Vh'_'n2^VVh'b'_'n2^V'r'8j4dA$'|&'XX&'(j`l'f&'(j`Vz'_'d^VV''b'_'d^V'r'04A'|&'XZ&'T`l'f&'T`Vh'_'y\^VVh'b'_'y\^V'r'84dA'|&'XX&'3`l'f&'3`Vhg'_'y\^VVhg'b'_'y\^V'r'84dA'|&'XX&'3`l'f&'3`~O,''$/~ O,'''$/~OZ''$/~ OZ'''$/7}& ,}&ka' vZJJ&mlJJ'&ml'F("&CB2',&CBV&a & .Vhd'_'n\^VVhd'b'_'n\^V'r'84dA'|&'XX&'(`l'f&'(`G\'&V3z'_'h-^VV3''b'_'h-^V'r'r43A'|&'-X+M&'c%`lM'f&'c%`v('p&'7q(&'7q('\&'7qj&9'fd4&&'$.j'p&'qj&'qj'\&'q &9'fd&&'/$.v"'p&'7q"&'7q"'\&'7qd&9'.fd.&&'$.9&9'.fdH&'{SqfXT& 'e` b$'\&SqXT&  bH6'\&'.SqX& ' v'p&hq&hqd'\&hq&9dgV&qgd'\&qk&9dvg'p&'qg&'qg'\&'q&9'gd&!&'\!v'p&kq'F&  v{'p&'skq';& '3 vb' p&'ZQb&'ZQb'&'ZQ$& ' &'ZQR& ' vw' p&w&w'&x9&z& v' p&.&.'&.Y&GF/7&cbv('p&Wq(&Wqd'\&WqS&9dv'p&'7q&'7q'\&'7q6&9'.fd&&'$.v0'p&q&   K&͡vj'p&',}qj&',}qj'\&',}qw&9'fd&&'4U$.&'.4&&'%.&'&&'%.&'X.&&'%.c&'X&&'%.f&'%-&&f&' }'%-&&'}}&i& f&ts&'&&'%.Q&'K&&')%. ;'h' A''  'L'G&&!f'`&&!~HY&~hY'b&~H&'~h'b&'X'b&l'f'b&X'b&'l'f'b&'~H<"&~h<"'b&~H<"&'t~h<"'b&'t~H<&'~h<'b&'X 'b&l 'f'b&X d'b&'\l d'f'b&'\zs'1 &'ChVzs&'ChVzs'G&'ChV'4'r'cVv''KnVv'nVv0'nVv0d''\nG @&&#f @'`&&#?&mN?'&mN?2&m'k*N?2'&m'k*NX 'b&l 'f'b&X 'b&'}l 'f'b&'}G &&f '`&&G &&'f '`&&'G 2&&':*f 2'`&&':*X 'b&l 'f'b&X P'b&'Hl P'f'b&'H ' 4&'q} &'q} '&'q}'4'r'h}Vv''P}nVv'nVv'nVvP''Hnv"'p&'hq"&'hq"'\&'hq&9'ld'%-&&'%-&&'&! 'X& & 2'*& 'X&'5} &'5} '*&'5}F&#F&'r\#Y'S'0N\q327654'&#"76/'&'&?&'&'&'&767676367'&76766'>37&75.>75'%6?67&/&'67'#"&'6')D*$8)D*$8%,I  ?/ .@ I,\#H2rZ\&  A..@  \[r73G#ԔT nUXt' t01//""/C30."!/V20t& sWVm5  T+#8)D*$8)T CC>>u  7D2B $ *DC>>DB $ A1E6|y\ {03P<=u $ u;< (( %u=< (( <;uD21v 6i\q4'&#"3276&6176/&&7.?47&''&'&'&76767667&5'&63>7&/&'0767&/&'6%5'075.667767'"&'#8$*D*8$*D(X"G36r\\  @..@  &\Zr2I#\,I @. .@  Hh20t &tXTn *.""..1ܞ0 ".03sd  6lVVr &t0TD)8$*D)8#]56E1u $ BD>>CD* $ s2D7%q  u>>CC30<  (( <;u $ u=u;< (( <=u% ]] ?12& '''rtj ' 4&'' X "'X&''S& ''rtj& 'ry''rtjh'8&'='2<h&'='2<h'&'='2< &'' ,f :T&' ' G` f o'`&&'fG o&&'f 'X&'hSv &'p'hSGB&&'' &' &'9F 'X&'9Fa & '.&'9&' IV&'Sa & '.a & '.' c} "&''{h'fB'`&&''' } '&'' '} '*&'9'NFa & '.' 7}&'9'"GpW&&'' ZO aW& '*'.' O  &'j\''' d&'# &'! q&'!lf '`&&'#fa <& ''. a & '.F&'  rG &&'fa d& '.'\f d'`&&'' j\fG d&&'' j\fa .,& '*'.' $ nb&'''ZQK Z&'' o$a Z& '.' $a }& '. f A}'`&&' G A}&&' b"'\&'\'v }' 4&'v' a }& '*'. &L''K/Jn&'ts &&ovn ('X&'WSU& 'dLf p'`&&' v (&'p'WS{U& 'u'dL d'X&'\'WS& ''dLv 2'*&'p'WS 'X&'  &'  r|& ''rtjG &&''  a *& ''.'  |& '''rtjG &&'''  f '`&&'' `fG &&'' `fa & '.'K-&'9'Cff 2'`&&':*''  f '`&&''' yX G &&''' yX f 2'`&&':*'' yX G 2&&':*'' yX f '`&&'' MXfG &&'' MXff o'`&&'' fG&&''  G o&&'' fGB2&&':*' fp'`&&' fB'`&&'' } fpW'`&&'' ZO f A}'`&&'' f'`&&'tsf '`&&'' K f '`&&''' K f '`&&'' yKff D'`&&'ff Z'`&&'' $ff '`&&''  R&' ' &L'K/Jnf '`&&'ff '`&&' lv &'p''Sf p2'`&&':*' &L'~'K/Jna & ' .a }& ''.  &'v''  f'`&&''  f'`&&'' f p'`&&'' f ,'`&&'' K$ff '`&&''  @z&' rvn&'np'k' k&'9fB2'`&&':*' f '`&&'''  <}&' '}&' ''&w'^'H'v'uV  '_'d'^V'h NU&' 'da }& '.' &'$' $Q E}&'K' '  'F'('%>" g&C'BRqLUf :>#67>'&/&76767>67632#&'"'567."&' '&67$7&.674"54'&/&?626263'#"54>6.?667&&?6"&'&''&6767'5676'67&'&?6! 7674?67.76'&7676$''&'! ''&'>7667&'6'&'4'&57662>7&''"'47672&5&6'&6#"'&'!$+&''&'676'547676=54?6$7676763&#"6?67%6?67)/ Htl{R $V01W aB jC; ;/ UO@nA EI =)7g(%6*5/ ! 00IE ;A3@,%\778C* RY   |O\4 ,%&C  nm7Q( I"( J"-%f= Q86+|FDx L] (78Scs3d8R5i)YNiv/6W "=P;|)A>T+6+9$_ 5)L$, 0\0;;xr6&_0/8 >iw( oG {syZFQ 3A &&:~J)'M\ ":c=,S 9k6  W#E5S7/-V&7nk>V 60 SK']$[9s>U;a3T`&F. [<P:v 1 ?Yk )1*K4"FG #/"FG #] &''OW'0!['>|'>Vu7'6'~'# '' k'"'v'd'3'!E'>' 'f'n[''#Z'Xc'jr''$6'''Z'x' y'w''w'v g'u"A' H' 7,,' , ,' xL 'L  ''Mc~iB' B'F'Xz'7{V=4'%h'O$k)p'JH'*e''kG\'J>&'j'.pV'@ '.1'P'|m'p.3'"'^@'''X'^@''c'X ' 4' 4'b 'X   ''2'b* 2'*,'$'V2;V/V2'HV'f)o4 H)o'4m';b ''S}, .% DH^, .' ~'vD'z^W'O"*, !#'\"*,'\ '\!'\#MP-,MJ'rB2'X*P',,d'\]'R>d'x\','$''X('Z'$T'l'r |O N}  aa  }'&O'3''m3H)<V=R%h$e0'G\&0''f\'`&1'QP'KW-'&IH['t&rq'&IH'&&rq')&IHf'&rq&IHf&rq 2%6'&'&'7676XD/DEF (Bem :& :M-)?y {xk?C+V6# '& '&7 & 5  % $CUX Hn!p60&76'&7/OX %,lHDN""#,#"'&%6'$%>'&'&7676X] S1 afK> rACJ R2+$5M: 'P8hS :In ntC0-o2{E`)- a3|P-"00"&767&7%6'&7676P*y)-!N ^52=x$v8,"9 ,J̗"7Qj qVF& 1DV!i !M/6'$767676%6%6'$%&'&7676<#1 !?&.%jP H>3+^c2 3 &5 J/ tA,f@G$`O,%2''&'&767&'&7676H .u1QsBx `h IIm MhOA@R?xWI^@ 6%$%676#"'& '& ID(t:@5 ![Ka/^fE `*a?w^x176#"'&76'&'&z:Q31;y= +'&hSF ;< '&7676$%&'&676:(19)mM N  %+ HN[$ B!1ІKU )_#Mv^LP%#'/&676762"np[L "C q}o  U.u&\%%'&'&'&'&>7676&76760@dڪS *'ġP? " 2;]UD)3 ; *@ Q[G!R67676767676'&%&]!.& 1 'rM&(dl d! .sR>"+676'%.762%$%&67&67&HYp& 1L22ڋ{J~y R#u,J1S: ::`BOdJ^ BwCT>5 Au6A "92F!2!&67$7.7>67&' :#G / (V /F"L_Y=(Y0mM  J]%-6 &676%$%67&'&'&766'&_S 6s#*C  yzo ,8T"HI) :T:tF8^ h7-8J2# l i4>J 2&2'&6767&7676&276C 1>,_ #J%te'?@1aQZxKRBA/2$Q[[#[h~0qzN56%676'&7%$76'&%$&56O3</g )]&!+ ك&!-7X#' 43 4j/;`ZFF3UjzQ.,kG1,>Z >76'&#"'&67$7$& f;-9 !t &?u+; '~' B+ 3'676&'.>767.7767& 46 :$ um;<)L BmF T &8'k%"X` o NL,O*ur%K)<",4%6''7#"'&767676"676'&76'&E,n  iYD fG-;e9(>r~RLI }'< $`NPLB̽ <:GHIb3,,ݸYGMW%ߣ*!0n*6#"'&7676%67>5&7 -#4R)&&#G[jz Y ,c7 : !Rc [QfR$x 68ɓ >p'Qr) 25%$%6'&'& %&'&767%6 %,%.6yT JxY)6AQ`" ke 3LLRW!%4>| PI$U sCVNz Ky|& -\^ &576'&%&'&7%632'&'&54P~"C# ( =>Zդ0̘n< ōST502GT#0%&'&'&7676.?6*C% 91{  QO &BZ5=Fdo 1  XGƂ= N -'2267&%&'&7632'"&'!"&54 NE0*  8)ֈ1_e .OGR QPkx*QH  9![^KRGt@ N!#"''&76%67&?6.0 W1tt5  BPd %!( ]J}qr qD"z&O>276767&/&  :- E@$o,Y HK#[:?scp/ OMs|O%62'$&76%$7&'47$0)< F+x m X(Ta4>&ѦhS \  D }%'&'&"'&7676'&?6tW#2IG% $ ; 06-44,G E$cS1&%6'&'& 67.7676u6Q(5\ |#7[3HydU'EZ+k=-{:0^PҞ9=F+b/Xaa"'&'&'&'&767>fB#  Vymu$q "J?JC 'ykR Fjvm0,%t\$:'&'#'&7676766&݉5 pw^-L_VgF5Io{ .e+p%GX:!67&>76'$'&76?KhI)8tuD`I<I>\LBzN > $t>N-P& 8u)6#"''&'&'&767676&'& K('$ec +Zz ? Ig, n/fn$ "\'[h# = 8 &#6%&&>%$%$65&'&7 ,5;A .H8qmZp"  S2 /<&lExaufV  L : [n O7 632#&>76'&77 )*<+ $? c7T!I /,A'Wa 9 N V  %,&6%$%676'&'&?6 :0.:U(p= NcK k[Lj\rrQ&zK@Rm ~ }&767$7656'&?6HZ.xt~ x1> _Ho `AG'.632+'&'&?6$76'"&76&76*FO5*IJ~h":;  ' vhC\`D kU7S C]\8'H''&&"&0k$*e#  e 9,BP$:uu} Kl  P9,81*_T!!'&'&7>7677676.vk9X40s /( TAA=H^' ]\OH^PR+-,l 91%P>/%763'"&'.6767676'&@ #=000""x dЮJV">8 $< !,RS4WV2;6'&'&4667676'&'&7PP 4.: ̄X;R튲2Q$ +Ul  @"$7&'76763 7676'&'&?6676'խpMD|-J iD&T@K>gMv k ~_ #guIFSX/G# g-S y$'wP` /21DH&02!&'&767&'&"#"'&67676676&$760:jyi(B (k= ;Q jH:?XTu9)v+ H!I`.IJR e-bJj *04 , .%166'&7676767676'&'&?66&OD[l)ZbW$  @/'M$K?LHi~%6"+](NgB(  +=x-Z h #,tK^ 3&7676'&7.''&7676676'ʚD؋t  ) ?@T)mn ^}]vetQ$Qz\ #YeB+X [S ;5 $K4 g qKk,2x4C67676#"'&''%$&7>$76'&?6767>76cn< #` 340yem:(PZ7g ~7JoZ-w 1 b7 RSv )vEa^x~^<O  `&(1BDgC<&- H&6''#&76762>6'&*AiHl`4m  )"T+H 0MmB K>  W-0;[ )o9>''%$&7>6'&7676767>76&7% H`~\ VlR=^ K7 \ ,Cik)$ Rd-^uMU P*  T  ^, rW" h<  .>7>6762#"'&'"'#"'&76 c G+Jz M$F-IO:QX' 3K ="f E.!I 82L|Zs_PP**,06%'&'&?6'676267676$%&Fd4aI ܼ -$  .' 0 #r9X6 {\ + ~N1'8( Z aE. [/4]5#q'Y )QBp,66$76&676?676&'&76"$76'&3%) +L0L: $E0"W0s˽ S  v)4g+{'o#iJ$W\\o=>) CPB!U |&,>>76.?6 &$7&P')' . N*5ol#4r8# ,. Da^ 7=-34g !Hz$6kc_(R-/.6%'&'&?&'&76>76&$%&1*HXqF 9*,# 4 "Ab8 o + Ȳt^q11.z*Qn  n*- ]Evs&c((QB_P_' ,%&72'&6%674'.767>676##c';$  m ^@TO ,:;V )&  Y}Qv&]PR0.^ =R62$'&6767&'&%&Ga:f[>WG M ;D4- !aT wz`W:G\%>76%$%6.'&7676#"'&Z.%Mo0aw eKZ> $O;mue>ۘ7t?Tv6 >I le0)&&7676%$76'&$&767676_{{/ + p>-c6K F[@!p?%ImM6NBjFcOZ]t\(qޚO 6*'&7676 '&?6#"w(P. / + a>\; , VM]U?Zi1|F6'&70766'+^uS9  6y\ 43N RQj'.67$654'&?64 |Ѳ bd6  Amns ,@3$-08!60#"'&767676&7 (;.+^6 < nk!$  P  )F*`v! :M,0`@j '.67$6'&76._ /^ W(qm9%%bQTT ULI G1(&'&6767>7676H2)G+ ;3:V$#V?OTF OJ: M j+3#6763272"''76%&&276S?@+ 1>,S #<3?'aQZxK~0RBA53t^qzN~hg5>&&?6!%M0L!,5+75;MY f3== 6?67$76'.'&?6 ) ?ﲓM >c  >*;P/X:s 4Hu K q#"'&&676F_0&uJ fQBm3@L@l(W)@(2]rpI&2%'&7&'767>7>67&'&W76$0|2N 6)=vF)DFp|@$< S5V˹Wmzn!&7,.6'.7637&'&/&767 G,:M</ =  GC>ᄄlWa#"dB$j+)FqA1'&767676'&'&'&\ ) XU[)D/&&-cW$%6`KJ t[)(ML`9'.#"&6767&76 5)6Nr5w=6,&#';smZbPH(9  ."&"'&7>7676&?6-h2BLj  ,LTbFB(O)(:Og !y1P\$) 2)14T1*o@pPF6'&&'&5476jP 4 SQ :#)CLFY%I P + 5;WZƄ@N#,'&'&76,dLy6 4dP6 "l7  b}0' >676>6 >hp 36&'"'&676760'&67>4 &6##S(PyM"j WM SO/9 z9'^9'E OBG)["@67'&'&>%67&%6( x98aɌZG l.P@G $ !aN,})f, $EW%0D9A:3CYu+7&&67676'&gp$\Gg,0l [`k@"T6'&&/&76765;L/6 % M ޢ6.W.A^&?$"JR,#)Y6'.#"'&767&!6 H""oC% 1M" 6-C@ n)W) ?}/767$6'&7>u=U61K. +<9;En<,OM wE;%7&'/&?676'&'&76;'U_*"D$/{ wZ5#-Ht1$ Y=(>20&7676'&'&W $>4 8!}XrF*"vJ c>F;$5a d2/>'&'&&76%65&$}OW5Bi ) {T3L4/ Ł?W#!K9i$0EY,6'&'#'&76767676 4:<$b[d v2$+8)RKL2PML5%'&''&7676,&6~t+ CL !DO)[Xd:y 6762#"'&'&7676%&'&MƦV#LW`8!u ÙCGQ?bs0{n9AX88Cvfa!'>u8 M/5676/&7676&547u$#{VQUrzr&=1 y11.Q-<$);.0#_T.'&676%&76767$7.f7_`P4p1Dt ,tK 5 23)D0C !PVT]# :sH3+ 676'&'$'6%6'.-^;05~PPl0h) w05iba Z, Y 6#"'&767676'&7(%kY::`1\* # 5)%  :SHm?  @K#  u[e"II (767627$76'.76&76 5'b O v=UMwL+$bI4 %VB6p  w&g &HaU &f 16'&'&&'.76766767676726'&7 .x%5 YpMZ=, iYP߉)$B6d1= $  * 5V| jTk 4M. ;5dHf3;h"' FP'&76%'&7676+.l$' ?!@ X&PB9#RA'.u.*XQ %'$4767627676'&?6_Fu5,/ ]Pu] > [pPR`M}V I y+ 0#'&76767&'&76767$%6? ^,`:L, k1gJ0+ ;F#>#GI!  GdG#Ec0L#ka  v?#&'.6325&&6762+,"h  Bb/d\Q7 K  -'&&'&'&#"'&767>76767676  A7lg;od PeaX2\ %f@8.r<"Jl   F "1^2% Dz#"'.'&6767E& <+ES 4, :**|?fAkz?RG<  4#h.67$765&'&?6ǖ wh;175t :;gL"QZ< [)#"''#"&767&'&6?6%$%6)`PJ ^p-*d.2$ |b;9s%9w}8I-$U%m2+GbJWEfFx2'&'&66$76'&?6 H,  0ZR+l7 5, *hfh8 u  z8Euo6760'&''&'& @3 $O U$7.4,  ZL5  "A0$8*XX&^7!*7&>$''&6">&7>'&p ,!C (+,{j{ + r$ta/.iIr =KJ ]Hn*,&F") VdG<)FdkU# KiU7676%'&7676nk' 6*@ U Bp^9u-RA'6m&L_'&776'&N1/nhQ zl;>[P: S[1l76767>726&7 X91m, sM> :!L#( /jH !D.3   (d5 R +N{c;)TS  T2; 5'&76&'.77$%67!)BBd;^ =n?m_Dci(TB'&'.66$76&'&?>!$Q Sd* թ$=*=U(U=r  '&76%.>'&76J ^& LI?I^V zTQ] t#o [r9jþ })} oJ.#"'&'&'?6767&&'.76767$%6 2 bx7HU#< B2 ;7*+-v, 0DetoptTT"i]HC**LG p %'&676%6767&%&?68 N(uy## $,KNT?#y B]7H<4*0? i 6&'&'&7<'8)-%DL /   a4"< <`V!D9'&'&7OS   d3&9= fM{ YMf!76#"'&&'&'&47676&7"7gm;#;"2 3ZnN :N=T5Ln*y `.];2r'%&/&/46/ O''2f)3'){" 6'.''&6676&7PJ7'Re \AaP82Zgw  1$hAmQ8? -6$Kfmf'.'.'&767>76A.Y ,a(O  ,+:)71bRR>1 f!(">BU7H.#.67&'&767'&7676'767&(C$[!&v#$4)!p4ijd!B4weHH ";$I(6 &6767>*)c *6[W \636'&'&76767676i>+=".0O%ol/OD:>V^df.XZ2 J>98DJcF767676'&'&'&S"+%s*s-,pR6S#TKMQlA %5H/A*h,A999 {'&767254'&7076228 - 0$ -k$QOs $ []x)N"'&%$'&767676767>:,&= :  E !& .*_@ ihd? VRC#$"[ L &62676'*#SF ("'aqX6&'&'&767632 ]~1]E'$T@`*,!H%NN < nJ8s ^H( Bg  <0(*^y '&''&767>M,{@Z] :r96!n$&O 0Hk!.&'&76[N'AtGDO '&'&?6J2cC)UO32!0<: n/SfFQA 'pGQ/|N#Y76'&7p 6(#d  a;?Z *E&wKTrv"2 0&067632'&'7>$7&7>7&'&6'&&'&!Au 2 ;vJ^ SJH B6DG,;^KR " i^J0 8Yr8+w' ]?/ <0*&vh::[:06'.7>676'.? N&5 X1%86/4S) )/$[(Qat16  ('AAp'Xh'&67676&'&?>m# 8NQ"tE C 0*`2 bbD@ V%,0&67.'&767>7667672'$7&I %#)M :\$$>,76V = nKZm F$SLB nSEqd,(*Z %'.'&>76v=;ij^ !5M1q ;u3u&x2SX%.76&767$%6&$|O L:^e(2Ct)Fv yVnNN ljSA8P #`j&Gba0,ji 0ӜM "?|\ver!&''&76767>7>X  K0riVh! 3m9P& ' fJ =l-Q('* z_uH$m LQv8(!"&'.'&66$76'&'&767676FMz(B( OtD(6 +;./2 !]W ޛR5 E,,:\XX'b.67>32&'& ,fK=-,$7 *M"'`69p8V1NŔ`nj&'&'&'&7676767676n-T}]$-ᣔD65h %t+"Ve[.l6&76'&767$7676h*z:͇B^I4v| .)nEO-<&L>'$'6%.1C`@4Q-*l*~̇1VA! KOBUG#:*z$%6%676'$67%&76762  ne Ns!G'O9=k[)g= 4 <ZG'l2"67676.6B2!%t3 XJ<ê=y(P676'&76$67&"76 #mztD Ʀre  ,5u .OxB PBU6 72'$#"'&7$7.&6S+8 =0BU8 -U[B &14W< , &)>)9 Q''&767&'&7676'&?69 |ºi3#9 nxsrTFI9=E N{ X53Z\J`ku KG-.nr T(- X: 72'&'&7676&'"%7>~Tr %&olϜ? 8Kwhu@j _X &?Q@ 0$f n^I_YD fG!(>32'&76'&7#&7%&76F?  +S bA" F'R-&ش@+Kt/ * +6z#y!B]jx\? @6'#"'&7>762&'&7 K%Jqbn5r'(nK  JG| t* \1>$' 0)52767>767632#"'&''&:"#!(Ga  L$F-I^Z*A(T E.!!( @.&"|Zs[/ >'&7"'&'&7&$76.Tc1 Y#$ +YL/e |;^.t M, s/!T^)@x <",%%&465.677676.6$76H$*!$<e@ae2 X}g ! 7.ɮ> 6A M+7?[Q"AS)z 'G6%/?w9  647.7d '-?(&I WF{ 6&'&7! Q@ b9 N 66'&'&'&?6E Q@ b gMd C829 >z N, #6&'&76'&'&'&?6P Q@ b Q@ b YHd ;29 N@9 6r N${5%%$%6'&'& %&'&767%6 %,%.'&{Z JxY)6AQ`" ke 3LLR8l4y"5>{ PI$U sCVNz Ky|& 5%$%6'&'&%&'&767%6%$%$76#"'&7%.6F  My H*3?I\# meVb勴 \n,K'6A&$&%QKr c0/ T tD^ Tzr I JK|1~g \\ %fNO^[ * 2&'&4767676&/.7, 9 T>-Q>4V# ;18=*l " >% =# %$%676'-!< f /sB%%$%6'&'& %&'&767%6 %,#"'&75%.'&V JxR)6AQ`" ke < dd'#+ HGT:j4y"5>{ PH#T sCVNz Ky|#ZO \\ 'qCAP\ oE. 5 #'&'&?6''&'&?676'&'N Q@ b Q@ b YHd ;29 N@9 6r N$ >7$%6.:X4 U!/ H7e b&676'&&.7676&, 3'YEZ7DvV Tl.?6&667&C)?z..-L{5E LP6)&v"h wDZn`F <58~nAES6&'&?&'&7I Q@ B8/ bJ$K9 h* Nn-{H(B '&7>&'&76z H4'J.-&4 gd?,z@[ 4@>'&/&''!"767>$76'&?>7676760Ld6$c^ 340yembP)"g y$;XZ/y1,z9  TQv*'@:.a^x<ذ  ؝ /< <&.'4r= %6'&'&@'*C 6 6{, >7$%65&4D J xM= m n %>7$%64>e@ ]" C2u]B76%&'&767&'&=:21d& A?XW!%$TVA; 4H+]%%&'&7&76'&F* D+"'6 H""om%9 .y} 6-C: n0PoL676'&#67$%6'&'&;&P@/( n\!.ZOYخ f.V  ^B9 Z' kzWM'&76%'&7676$3c' 6*@ S Q"^d9u-RA'6ge$%&7676767&'&/&767$%6' 1%@%EL < %e A$>] |V \# *4p  z+gSԠ & (676'&'&'&?&'&7707&' D8J Q@ ]A6 b gMc!^IHH5,n9 0 >z N9m+s&/G6 67676'&''&'&'&7 6)N 6)N J3 KU KUo5 -L -L,D  FY FYfK 76?676q  !F$'g]DT0PX0hJ 76'&?676'&?6 4!  4 4!  4GU7J}V$'U7J}V$d76'"67672'&'&'&76Y[:-F*85P +uE@ UH$-Haf&1C;E +%  6/&7+P8''}=5+u"L /60&?6706&?670(! m(   ( v 66   M %6?6q$ -/G~& 176'&767&76&%6'&767&76&!  9\J"*P@e%,F;0!  9\J"*P@e%,F;0KN)"w)8V1O`q, KN)"w)8V1O`q, >q 6''&767&76&X *$  Hs]* 4dP~.8WJ < ]b3+3%Gk=bx7"  )( 676.7&76'&84|X1p N?  j_+xm5Ubz/-3  60/&7$( SX  < Epm &,dicZa6"&462a9P99PP99P96462"CZ??Z-Z??ZC &EA{{H(B&KPX0}'!!2>}}m  ?  oK oK D"#"'&7676676'&''&E<9pS} / B g;2 0իȿn 7 |o-GS6?6$'& 4678 .fA% #|U-H h=>9!%&'&7676'&%&5&76%$%6rIxeN ؞ y*FS19 ([zsq))7.J" h `M0z7 Ri)%'&&676$7?632J8 Af|i%" * 3cNHE,,'7@&#%U D$/'g6 TP^LHM#"'&767654?6'&*Y]3&" )  1 "T. G<#V;+Y  Y} }f"%'&'&7632767676?6/, ECy]: "w$"  + 1$" Y{ >.g?37pff70Y ^[})57%&476%$%6'"&'&76C MS19 *]L &مK+ _e *K| / z7 Rs`{π#'^K?Z3mh<nI7767676'&?6'&|H "3 'N8 -'gIB3>Xj O+,Q08!k<2=ec "%'&766&?66-'-( 6A +.1p\~bXJL`1J,,gW'%'&'&. &7$64?64[=K  "\_6424+ :#.18> M\y, F,!fUl.ЕV3  %&76%67&?6'&'/@i5  EPd % 6*xF%z7@  qD"z%N$!67%'&'&6''&?6G ]\Bo ; 7)( r` FrCK^"}SS5RI)&76$76'&%&'&767663Y5V21"T7 #^lO \5I{vt3* I nks_1(  bAI3#"'''&7676!256'&%&7676766[8LK:m% #" S3'D'V7 #oxHr8 2L >9//>JNeC1>qt3* yR&676'$'&76<8 > ?2$"$>+8'&'#"'&7676'&?6N)&(*^,N{6Z+'5a]b<(zL) r8F4~'%'&''$&762$7&7676"4= ,Odz&hN N1SG(3:J)3/&"N}ZBwv(l=~  9]AGI3?Wo'&'&&?6**&_D7A( /8"/" b'2b?&547!2"&567654'&#"776'$?64cU|xȒB5JLsjw{@<9_=͒O=E9 u/VM<9  ,CO+nXVWB= ' W]*w(- {cS%6'&'&767&/&6767$2  7ݏ.1V0*6  b6H&S4\5ˮx(7vdW)u  o #k3*,2#"&'&7667&767$%6uMUM/P4uw! .Pn|F_$/7ND+ $޲n $aM5\?ULa$3(W#A!%'&&'&76767'&?6'76'&/&l0+v/` K %c"] #Lo 6'&767676'&''&6&"76 TDg%V'{ or< ;<7?#M :JoSF & B ~%*6'5- z{T2'&'&'&76%&&76wCBCJ1 / Ꞧ_*}B mT$$460IJ"d2 w",46#&''&767&'&7&'&76&>776'&I"NX: >rCC- [ )HkW(/ :(.J;< +1+ 94H-~gS-.e'?+ G( 3# nLg~p.+#nbh) xw&&%67676#&'#'&3276v2v#15sGV) \d )Rn:XIIP .:C& ZmDU4 p.A%q-'&76767676'&?6'&'&'&'&'&c Y5/,K"% q<6JA2@_ :`j)J!c# =74 m {p?%@J0'&7676'676+60/ `Tk 4Y鉘#)${;AR?p( frT:}Q$!"76767676'&''&767676'jF &@,.uF97Ul3v7 >> ~TF.C &d":6V>hW"-8 CY '4767&76$76'$76 n7]51  GWz>3XB@ LaNn`5 Wq$@9&67>'&/&7> l?W }g  $=*q*$>3#Rr L$Z7AsP4",6'&'76767&767&'&65&'&7&76'&0xW,? va!+l.;8SFG@-lh4@0| BL3f_!&k X0w:rI L~Hh6%.766'&%"7w7IJ3^\ }b? 4@b7 \w"0CH"$76767&'&/&76767$%6"'t*5H&i 2 ?t )O&WI,؂|J&(FRX/Q T9 "O%.E6'&'&767& '&7  [+5  Ij)D  HE.B63;C@$$;v)[y'&'&'&767$2#=MU! "~-Hq4,.O@A 18#PVK">'&'&76&>7.-1 z$ ۪g.. " `HpT%&'a\/^ &.1 |ܩNj4y( 7V>76'&'&6 pT55~F" A!Z6NZz; Z O1 :]]|ALk'&7636#"'&H T(%;N31b$I" BOBkfP7;/7V'&'&6&7676p:" A!Z6 I* :]]|AL<\P(:7zk&! eU.'&?60C8 .L 1R d4Wl%&&767676-lti^K$! uFA'_ 71%DOe7 !% P& P Xd/Gexjli` F&'"'&7>7&?61f/&K3=@l;K2 \.69pZL3X jJ"&'&!"76767676&?6p"*"  H"NAڌ @M,2 Q. 2`4R @n2Xv?*6&'&767627$76'&7 R%'B ;S- ? oqP &?%6@;&Dl!#3r4cBr Vj; ($4#'!"'&76%67&?6P^soB  =Jl&! 2,[$f#zv  w?&h[u(%gb%6#"''.67&'&'&76 p$TBNA`#28 A hH`,.~}L2q9Z 4b4k.767&0&?6#"'#;4Om%!?3L8=iL|S7,=AQ*91b*_0jJ"2'&&!"76767676&?6`-1 [&JAڌ @M,2 N??%@l @n2XF'&#"'&7>7&?6->< + G=@l;K2 \dH Rpk9pZL2XC$6'&'&7676%$76'&7m CUH $R{G3 Pr $+CewEfxn0ghr E^!$(!"'&7676%67&?6'&Hso!  =Jl&! 2/ 5 + ZMzvŰ  w?&h[uw5Mu}E$'&763276'&&'&?6'&>Dzy]: "w$  + .2+ph0&FJKBd..g?37knf&!Y 26 AA<97767676'&&?6'&|H "3 $R 3[%vf.&KE2j O+,Q-]X)1q!6B0"?766&'&?6&( -41$.&th/&K ~eXLJzK((<6}VE$'&'&763276'&&'&?68 + OBy]: "w$  + .1t8Mub0.g?37knf&!Y 2<l97767676'&&?6'&{H "3 $ E 3q8 + d O+,Q-]X)1bbt8Mu"?%'&766&'&?6~ + G- .31$2Muk~eXKKzK((<&*V(' '' Xz&{7 B'FV&Nt&~ P&c&d42&'X*X2&X*+&Y*`&Y*&X*5&Y*P&',P&,P&-P&-P&,P&-P-,d&'\@,d&\,]&\,&\,"&\,g&\,@&'@ &U @&'"@ &^@&@&'^@&^@&J@&'l^@& @ &^@ ^@&@ &\ ^@& @ &@ &@ &^@&n1& ,1&&>&/ :k&'91&|j&jh&'}&'j0&/ 1&&j1k1&1&$&&#E1&&1&^V1&X.1&3&&'3&&'1&&&j&'j&$&3&'8&'}1:&'&'1&^V1&X3&1&&'nP& P&-Q &'K &'xaHP&R&.&'jQR&'K.Q&'K {P&v&.PP&jQP&K&~&X#P&Y&X{P&^P&,XP&&c&'X&{&'Xv{P&v&X=&^.QV&'K.c&X&&'&'P&'XxQ&'K{P&^P&,X&QP&KQ&'K&"&&x&&&&'&&'z&z&&Q&K>&I>&DR>d&x\R>N>&H>d&'x\R>g&\I>&NR>&\FIF&9D%F&;(&&&FNF&,HN&',H&I!F&;N&&I&D&Z&$,&$/&$N&rHN,&'$rH/&$I&NJ&$,&$&4&&>v&& 4&.&&Hv&'>&&$&'$l&~ &"&&$l2&b*f&b&5&c*&b&b*`&m*&&'&&f{2&'b*f&]` &d&b&f 2&*  f& &v 5&* &X &* `&* & &' & &\ 2&'*\ &Sl  &Z & &\33.3&"3.3&"HH)<)<y >'1N5 >&N:P&'r>Y >&NT&ry >'?'N >'&N >'&N &'r("&'r>%&'r>{&'ry >'Ny >Ny >'[&Ny >)&N[y >'0Ny >'V&N<& &<& & &' Ol&' O6&' O &l&& && O ~2&'mwf&&m2 &'amw&&&&&'?&'&'}&?&)&&&~ &'f)&&m &'a N&f Ng&\ NN& N,&X$ N&d &Pi_)&G&&P~r&xh& D& y} }& & }& aa.& &aa aa& v &  & ~&v&O&h&'(bO7Q&'#O&O&'v&'#O&'vO&c&X`&X&XV'dfV'dxV/'"V/'V/'V/''V'eV'eV'eV/'V'dxV'fV''eQdV/Vh'fV'fx & ~&'vH ~&v &v H&/&'z D&zD&zDH&/W&'O ^W&O^Z&O^4m&';b@4(&;b44`&;84&6v 4m&;b4&';b'$4&;b4j&';b@&Om&';bO &' & H & q&  & "&'v & &' H& &'&'S}&C&S}{&SS&N &S}&'S}??&S}&'S}&I&5NI&'S}5N*,& \*, *,& \&!\!&!\&#\#&#\h'$yh'$Oh'$yh'$yh'$ h6'$h'$Nh'$~h '$h7'$XO&$'NOh'$ZEh:'$h'$ h$\&&E \&&G\&& v G\s&&hG\X&&G\f&&>G\&&h\&&G\&G\&& { G\&&G\&kG\&&J>\&&f\&&`G\b&&>*&(*<&(1*(&(*9&(1*&(1|F&*b &*1p&*'}= x2&*'*ez&*K$&*"&*'*$&*'}b&*'}8 &*f&**Q&*&*}V&*P&**]&*+&**&*n&*F&*x&**5&*'*x2&**`&*'*&*`&**f&*(&*'}5&**V&*x2&*'*}(&*'**`&*'*2&*'*}&*n&*x2&**&*}2&*'*}Vj&'+VVj'+VV~'+V'+DV'+TV'+'D|oVj0'+UVj'+UVj '+UVj'+Vj'+VVj'+TVj$'+'UAVj+Vj'+TVj6'+V8&,q8 &,8,8&,'8&,8&,V'-V'-~V'-V'-V'- Vh'-DV'-}V'-V4'-:jV7'-X~s&-'}~V'-\tVl'-DV'- V-&.6#&.-.u&.z &.6=&.C*3/ &/E&/G3Z&/$3,&/G$3/&/$3/&/8,&/'G$83/&/$ &/G3J&/$3,&/G$~hg' ~4hg'9~h(' ~h'~h,'~h':~h&'~{hg'u~hg~h6' hi'~hg/h,'~ hg'X|~ hg'~h':M5&1 53&1(51u&1z50&1 (=51&17b&2B&272u&25z?&27&2&4&d&c&o&E&{&o&m&'m&m&I&'I&@l &G&L&I&4 F&4@&4/h &4'&xo&4:&4oj&4'oXo&4'oj&4/i 1&4,&4oj4(&4&4&4oX&4o=&4&4o1&46x&4r6&40Z&4o6&4'0o&4o1&4',o1&4,&4o&4j&4'oj&4o&4oX6&4'0o&4'oo4&4'&xo&4'o1&46x&4r&4o&4&4'o]rI&6I&6'pI&6pI&6pI6e&7{[&7y7!&7;&7x &7qn1&8 q^1&8*XP&8' U qAJ&8'Bh^1&8UA<&8A:&8'BU<&8'qz&8' P qI1&8D2A~&8qA18q1&8 jq1&8An&8Ah&8Bq#1&8-AC&8BqI1&8Nq^1&83Xq1&8 dA&8B)M&8'B qAJ&8BIx&8'BDqI1&8DAx&8BqT~&8ua@&8')AM&8BAn&8qJ&8'B #A@&8'BqA18Ax&8'BhqJ&8'BqI1&8Nq^1&83XqAJ&8Bq1&8qJ&8'B99n=A&:K )^&A&:IA&:"N^A&:xXA&:P<&:v}&:'vP~&:v8I&:'v D8IA&: D&:v&:6J.1r&:'"nJ}&:v&::~&:'vP$t&:'viPA:&:'vdd.~&:'v">IA&:"N^A&:xX~&:v. A&:".~&:'v" .&;yo ."&;p.&;x .&;ps.&; .w&;xo .;.&;'pF .&;yol.&;'pfl.&;f .p&;yo .z&;yo=.&;#7p28F&<F pSF&<ipG9x&<'OATE pk:&<'[2p>'F&<pP,&<[P *&<'[2)pG9,&<'OA[pG9j&<'OAU@ pq/F&<MlpPn&<[pPF<pF&<K.pG9F&<OAFm^&<[HPX&<[2pF&<#HpP3&<[2pq5F&<Ovp"F&<spF&<KpP&<[2p=&<'[2KpP:&<[2gq/h&<'[2Mlpq/F&<MlgPh&<[2pn&<#pG90&<'OA[pP=&<[2Fm^&<[p:&<'[2KmP 0&<'[2) pPF<gkh&<'[2pG9:&<'[2OApq5F&<Ovp"F&<spP:&<[2pG9F&<OApG9:&<'[2OAN#=&&&V&&8&&&`&'`&`e&<_&'<&3D &:&L&<&? n&?h/&?')zx * m&?'e{&W&?<_&?;:a]&?'eO/i_&?');/i&?'){s Y_&?}T`&?;?P"&?/i&?)ld&?PM&?cee.&?kIf&?ceYe&?^?&?^&?X+&?e{^Ep&?'ceXm&?eoY_&?'ce}TY_&?}ToM&?ceU&?v;/ic&?');{Ep&?celd&?^m&?'eX c&?'eO??o*M&?'ce{/im&?'e)Ye&?^?&?m&?e/i&?)/im&?'e)a&@ ,&@BO&@'( 3&@' p\&@3&@?3&@' T&@'(A&@'( &@&3E&@3@&@]&@(q3&@Z3/&@m &@w3 &@m &@(Q&@K&@ 3&@ &@'m  3&@ y ?&@'m & &@&y3?&@m 3E&@&@'(3&@m q3&@&@'  3&@' T3@y3?&@'m p\&@' ( &@(Q&@K3&@ &@(&@' (Q &A  &A &A5  &A# &Ae &Ae &A#A &A; A &A4  &A Ag &AFe &AM &A &Aer&b&B.>=&&B%&B&B&&B.I&&BC@&C \@&Ca"@&C@ "@&CG"@&Ca"@&Ca"@&CG@&C"@C"@&C? "@&C"@C"@&C~aS@&C2@&C,"@&Ca@I&D^I&DE @I&D^I&DC@ID@T&D'aNT&D'aHT&D'aE@I&D@If&D<^@Ii&D^I&DE @T&Da@ID@Ti&D'a^@Ii&D^@If&D<^@T&D'a^n+&E +&EqQ &E'K+ X&E'2H+&EV&EP^&E'2TQ&E'KP^Q&E'K, {+&Ev&E^+E"+&E~Q+&EK"&E&E#+&E&E{+&E^+&EX+&E&E2&E'&E2{&E'v{+&Ev&E&EQ&E'KP^&E"&E&E'2D&E'2+EX&E'Q&E'2K{+&E^+&EX&E2Q+&EKQ&E'2KN&F`l&FT6FT&F6&F&FYG/&Ho/_&H}/Hq&H/ /&H'/&H&I)I_&IP{ ^&IO{ &IW-&I&ISE&IO &I)&IU&J~wA&J_ (J&J&Jh &J&K/K&K/&K&K/&K~&K&K/&K |/&K' /v/&K U/&KO&K'/&K4 /&Kz&KL/&KL5&M_ 5&My&M's Xj&M'b%p5&MhA&M&M'\y&M'sy&M's 5&M&M5M@5&Mdy5&Ms \&M&MU5&M<&M5&M5&MN5&MdH&MN&M'dH&M&M'5&M&M=&M^y&M's&M \&MN&M'dH&M'5M:&M'yj&M'bs5&M5&M&My5&Msy&M'sy2&N'*Xy2&N*y+&N*y`&N*y&N*y5&N*yNMN&OFM/OM/&O_@'t_F't"' 'u'''N_'_'_'_'_J't"_'t_ ''__'t_'u"Qmy&Qh&Q=l&Q`Zb&QUZxe&Q`ZQ&QXb&Q'UZXxe&Q`Zm&QrM&Q`Zb&QUZ&4&&'&v& p&.&&1n&'1Sh&1G& Aq&' v&& q& l&q& v6&SS.S2j&SSf&S|@9&S^.&SS{&SS.Hd&S^.&S{y&S'{s&S{RL&SbL|H6&S'S.b@&SN1 |B&S`we"&SS|H&SbY&TY!&T YTY&T;Y&TY&TbI&UI&UI &UIIUn&V'ncf)&Vncf Vfa&Vn9f&Viw fn&Vncf&V'ncZ%f&Vnck&V'nc &Vn&V'ncFPW'* '*e'*'_ ,P'*'&\'*i-.~'*Z.|'*'e~'*'_Ze'*'_ '*.'*Z.*"c'*~e'*_.'*H.'*7o'*.'*'*r'*l0X'**.PJ'*0'*'*.P'*'*''*.'*.s'*Ze'*'_Z.'*.'*H0X'*'*.U'*'^.*,'*'e'*'_'*r'*l.P'*e'*_e'*'_X&Y&Y'&XQYZ&Y'!X&Y X&Y'b&Y'!X&Y'bX &Yw&Zk&Zw&Zk&ZZ&Z'HX&Z'H&Z'H}&ZX&Zj&Zk&Z&ZHZ&Z'Hk&Zk&Zjw&Z'Hkka  v&\#0 ;&\QQ!2&\'7Kq C&\'xH&\?&\x1X&\'xF|Q!&\'7KxQ!$&\'7Kr {&\5vW(&\x?\r&\(Q!&\7Kc&\xeb&\x&\^&\x{&\7&\P&\(z?&\x&\'x(z?&\x{"&\'x5v{&\5vb"&\x(&\@Q!&\'7KxZ&\xc&\x&\'x(z?&\'xF?\b"&\'xQ!&\'x7K{&\7&\P?&\xQ!&\7KQ!&\'x7KN &]'wvH &]v ] &]v 5&]q  &]w &]'wc~ &]wN &]'vvH &] &]'wPDz&^ rDz&^,l3D&^'-o Dd&^'\*Dz&^DV&^2DT&^'\3DV&^'-23D&^'-j ]Dz&^XD&^2Dz^Dz&^L3Dz&^-D&^ D&^#\Dz&^fD]&^#\]Dz&^b@Dz&^6:Dz&^D"&^\Dg&^'#\Dd&^\]D&^'#\X]Dz&^XD&^#\[&^|23DZ&^'-2Dg&^#\D&^ Dd&^'\DZ&^'\6Dz^D&^'#\3Dd&^'\-]Dz&^b@Dz&^6:Dd&^\3Dz&^-3Dd&^'\-VhK'_bVh'_bV~'_V'_V'_:V'_'t^VhU'_bVh*'_bVhE'_bVh'_Vh'_bVh''_bVhI'_'bNVh_Vh'_bVh['_b;&`/9[&`>;&`/9[&`4[`*>&`'F*>&`'z*>&`' [&`F&`.G&`/9[&`>*>&`[`G*&`'/G&`/&`.;*>&`'/L'aVL'adVL'aHVN'aV]'a:VN'a'xVL'ahVLs'ahVL'ahV'aBVL'adVLp'ahVL'a'h*VLaVL.'ahVL'a>ur&bN&buobuY&bs5o&b&b7c7ciUd&&&L&&Y&L&8&&)&{L&u&I&&&)&L&B&sL&'Bdm&L&B&LL&F&v&'{&L&+ &vL&q w&&vL&{_n&f _^-&fCX_t&f')}A _6&f'.R_&f_(&f=&&f'.R_(&f')_f&f')~< _I &f'D_j&f_f_&f$j_&f)_&f8_T&f._#&f_/&f._I&f)N_^&fLX_&f$_&f._9&f'.$_6&f._I d&f'.'D_I &f'D_d&f._+j&fL_,&f')_9&f._&f8_6&f'.$_,&f'.R_f_d&f'.R_6&f'.)_I&f)N_^&fLX_6&f._&f)_6&f'.)99 &h'T)&hTcha&hT9&hOw  &hT)&h'T@%&hTk&h'Tc&h &h'TE5&i9u&izE5&i9u&ip5i5&i'K/&i'K/K&i'K/E5&i5&i8Q5&i9u&iz5&iK/5iQ5&i'K/9Q5&i95&i8E5&i'K/9d*'jVd0'jd VdB'jlVlB'jV{B'jHVlB'j'Vd'jVd'jVd'jV%B'j+tVd4'jd Vd'jVd'j'\VdBjVd`'jVd'jp{&k's{&kst&ks&ks9&ks~&ksky&lzCJ&ly&lzCJ&lJlH&l' H&l' H&l'}J&l K&lyCN&lzCJ&lH&lJlN&l'zCN&lzCK&lyCH&l'zCp&m{ p&mp&m p&mwp[&mpu&mMp&mw p&m pmp&m lp&mwpmJp&m)Mp&mp&mpq&mM&n]&nR nWS &nm\UZ&nR &n9od&\&2&g&\&y"&\&\&&'&&}}d&'\}&tb &{P&&}&q&qfqf&qs &qf&q0&rr 8&rbx  *&rax &r&[&rt&rW& &r &r <&r&s\&ssS&sm0&s&sDfm[&tSfmftf&t&hL&xZ &xK&x'Es `Gh&x'`B&xb6~Z&x6|6X&x'`KZ&x'E6K&x'En u&xp6&x66x&x_dK&xE6&x$6&x`&x7~6a&x`u&xzX &xR&x_6G&&x`k&x'`_6Gh&x`u&x'`pu&xp6&x`6j&x6K^&x'E66k&x`6&x$Gh&x'`_6L^&x'`:6x`&x'`Kh&x'`Eu&xzX &xR6Gh&x`K&xEKh&x'`E2&y ^&yX&y'R G&y'?>&yP9&y7&y'?9&y'w&y'M I&yD{&yy&y.&yk&ye&y?&yH@&y?I&yN"&y&y&y?J&y'?G&y?Iu&y'?DI&yDu&y?{&y=&y'J&y?k&yG&y'?=&y'?yu&y'?>G&y'?I&yN"&yG&y?&yG&y'?d&\&2&xg&\&Z"&\&\&&'&&^}d&'\^&Ub &\P&&^cF&{N cF&{o&{'ii j^&{'VXcfF&{s7P&{,QN&{'VfoP&{'i,o&{'id cF&{&{,cF{cmF&{coF&{i&{|&{VcyF&{W&{VcF&{cF&{cbF&{&{Vba&{'V^&{V&{'VcF&{&{V&{,oT&{'i,a&{V&{b^&{'VT&{'Vf0cF{j&{'VXo^&{'VicF&{cF&{^&{VcoF&{io^&{'Vi99d&} "&};&}'( &}'/PC&} &} &}'/=&}'&}') &} &} {}{&}`&} A&}/q &}%&}z  &}% &}T&}N{&} s&}/&}'% &}/ &}'% &} &}% &}&}' &}% A&}/q&}'/ &}'/ {}&}'%P&}'/ &}T&}N &}/&}&}'/N&~'cRN&~5N&~'cT0JN&~pDN&~c N&~'cVN&~cN&~cN&~'c N&~c5N&~T0N~N&~cN&~*>N&~c5N&~V:N&~zN&~RN&~c|L& :L&4&' ?|&'tdXL&Fvn&Jtl&'tn&'J&' %L& &JL@L&xL&&8&t1LL&u&t%L&*l]L&f*5L&$?:&t*&'t$?|&t%&'t %L& &tb&Jr&'J&t&8*?|&'t$Dr&'tNL&'tdX|&'t%L&*l]L&f?|&tL&|&'tqZX&G WhX&jb)"&'P# ;&'\ X&&y&'l)&'P#-)&'P# fSX&NN&qXqX&LV\)X&P#&&qX&$p&lSX&PXqJX&tDqX&L&&'L;&S&'NNfSX&NN&E&$)&'P#&&;&'L&'qX&'\;)&'P#lSX&PXqJX&tD;&\)X&P#;)&'P#99v&v& v&v&vv &' XNv &' X6Hv &' Xv&v&v&v& v & Xvv&' Xv&v&v&' Xn &  &qQ &'K+ :&'2H &`&P^&'2TQ&'KP^Q&'K, { &v&^ " &~Q &K"&&# &&{ &^ &X &&2&'&2{&'v{ &v&&Q&'KP^&"&&'2D&'2 :&'Q&'2K{ &^ &X&2Q &KQ&'2KPk& rk&l3.&'- &'*k&4&b&'wx3&'-3 &'- ]k&X$&kk&L3k&-&&k&wf&]k&b@k&:k&&&'&]&'X]k&X&$& 3&'-&&&'&'wk&'3&'-]k&b@k&:&3k&-3&'-d&|}&'|6wdf&'|1d&|Xd&'|JZ&'|1d&'|Jd&|j!F&>j!bj!z&!b&vj!I&>!b&Mj!&>j!t&>!b&u!b&'u!b&u!b&\}!F&'>\!b&Hb !b&Zj!2&!b&\V)'^HV)~'^ZVB'V'V':V''0V)'aV)'aV)'aV)>'DV)'^ZV)'aV)''aMFV)V)J'aV)'^Z00E &c&v:0u0&z:~&v0&VhP'sVhz'sVz'Vz'Vz'DVz''Vhz\'s&Vhz1's&VhzL's&Vh*'0Vhz"'sVhz.'s&VhzP''s&_VhzVhz's&Vhz`'sKV&Ez&'ht&h&hVd&\&2&g&\v&p"&\&\&n&'*h&G&Aqd&'\v&& q&lP&q&v& j&d+&'% &'@"&&j&'$+&'%j+&'% U&P&jL&+&%&X&a&h&U&Z&Z&TZ&Z&'T&U&'PU&P&&,j+&'%j&&XZ&'T&'n&'@+&'%U&Z&&+&%+&'%&K &X&% X&,X&rX&rX&,&XX&$ X&XX&cr&l&fX&rH|'\v# ;|'\vQ!'\v/qu 7Cj'\v'[xb|'\v?\'\vx81XY'\v'xbF!\'\v'x87!'\v/rp 7|'\v5W'\vx8?|\v|'\v 9!|'\v7c'\vx&eb'\vxb|'\v^^c'\vxb|'\v78|'\vP2|'\v(?('\vxbm'\v'(xb?j'\vxb'\v'5xb|'\v5b'\vxb'\v@8!`'\v'x87Zm'\vxbc'\vx&j'\v'(xb?\'\v'x8xb?|\vb'\v'[xb!j'\v'7xb|'\v78|'\vP2?j'\vxb!|'\v7!j'\v'7xbNeb&'WDHe&WereU&-e&k eb&We&'We}&WNe_&'WDHer&Seb&'WSVvX'nVv&'nV8'V8'V}8'V8''Vvb'n,Vv7'n,VvR'n,Vv8'NBVv*'nVv4'n,VvV''n,ZVv8Vv'n,Vvh'n&'bK &'bX&'b% X&'b,X&'bpX&'bpX&'b,&'bX&bX&'b$ X&'bX&bX&'bcp&'bl&'bfX&'bp&; A&W\'M&'=V }&'S&$X&}&'k\'&'=V\'?&'=V &;|C&.}?&\'&=V3&-&K&&#&=\&4&.&4&'.&=&';&;=&DC&e\'&'=V&3&4&'.&'k.=&'\'&'=V#&=\&.&\'&=V\'&'=V<j& j&2&'} &'zj&LK&&'|&'}$&'} j&(&nj;j&8j&}&&Gj&R&j&,Xj&&0j&n&0&'n&"&'j&"&m(&&'}&&0&'n&'nj"&'&'}j&,Xj&&n&j&}&'}&? &`&'Z -|&'tW&K(.& . l&'t`&'Z `&'Z &.<&.lE&`&Z.&8.&tQ&.u&t&b&:&.:&t:&'t.|&t&'t&.&t.]<&~`&'Z.&t.&8:|&'t.r&'tN.l-&'t`|&'tZ&b&.|&t`&Z`|&'tZ&&y&L&O&L&O&y&L&1 ?&y&y&L&Y&L&'Y{&L&Y&L&5&&'y5&%L&, &L&3m&&L&5z&Gzh&Gz& j&Rz&1 z&G^&Rz&z&'>z& z&"-z&'Glz&, z&b2&GVz&l2& 2n&c2""& 2k& c2"&&'~&~&~&~D&~&~X&rX:XJ&rkX:&veX&r[X:&XUX&rXD&rX:&SX:&'MX:&,X:&\&VX&'r\[X:&S VX:&ZQX&rVX:&\[f7&T/fGfk&TfG&Yf:&U/{fG&:uf&T/fe&U/fG&bsfG&'bmfG&bLfG&?Fvf7&'T/?{fG&5+ vfG&=qf#&TvfG&?{@&'A@&@@&@S& @&@&'@&@&'A@&P@&'PN0&'},H0C&}00{&S0& 0&}0&'}?0&}N0&'},Hq0&;vq0&'};v&Nd&',\Hd&,\g&,\<&<P&'H<P&H<S&H<n & ! &7Q>&'KX &'_xxkH &L&j?&'_-Q&'KjQ0&'KY { &vp&j k &jQ &KJq$&_&#w &}&{ &^ &X` &&_y&'&_{&'v{ &v&8&YjQ&'Kjy&Jq$&_`&'_q&'_- &'xxQ&'_K{ &^ &X&_Q &KQ&'_Kn& ^&3X&' &'g&&|&'h&'&' I&D&&j&&&#&&I&N^&=X&&&'&I&'DI&D&&'&'&&&'&'&'&'I&N^&=X&&&'4o&':dl4*&:d44b&::4&5x 4o&:d4&':d&&4&:d4l&':dl&{o&':d{'r4n& ,I&_&*&/ @}&'uq&S&m&'u*&'@*&/ @*&H&K&j*&@&9&{#&&&2^&1X& s&&'{ }&u&'u*&H&u&K*&'@&{&9}&'u s&'uO&'uq*}&'u@&2^&1X}&u*&@*}&'u@6&R.sj&Rr&lj9&R.b&\&R.^d&R.&Z&'T&3&-]6&'R.b& ]&X="&R]&bd&Z\]&<2&_g&G\v&p"&Z\S&G\&n&'h&G&Aqd&'Z\v&& q&lEP&Zq&v]0P0Pow&oLo&& o&w&owu&o&D&>-&'*=*-&*&&'T& &o&;&I&k'AI&kAB&kAw&kA&kAL&kAkz&!zz&!`z&Pz&,z&1 zP&!z&,z&Yz&'>z&z&6Az&'!6vz&, z&4lz~&!z&6vWM& && &ee&'kDT&'kN&'ke&D[&& &e&ke&'k&[&&'k.9&">59&:.9&">59&0>9>S&'>|S&' v> S&'>9&>9&!:&">59&:>S&>9:S&'":&">9&!.S&'" &' )'@O &' )'&'@O &' )'& 3&'nG' )' 3&'nG' )' 3&'nG' )'}&'ZW&'@OZ&'@O&' 3&'nG' ) &' ) 3&'nG' )'@O &' )'@O &' )'@O 3&'nG' )'@O|&nX}&e&&n&Pf& zf&}f}&}f& }f&=XL[}&@^[}&L[}&@^[}&^[}^[&'/?^[&'/^[&'/}^[}&?^[}&?X[)&@^[}&^[&/^[}X[&'/@X[)&@^[}&?L[&'/@O<n*& <n&<nIaI&f<n& '<nI&!"&~"Q&uF"S&m"N&~F"&[W&W&WW&sWO&GW&&fg&\&,&X$&7=&^H7' '' 7k' B'F7&kt&~ Tn=&^L&x4RI& 5RI&RI& 5RI&5RI5R\&'Z5&R\&'Z 5R\&'Z5RI&5RI& %R& 5RI&5R\&Z5RI%R\&'Z %R& 5RI& R\&'Z I& AuI&zI& AuI&pAIA\&'ZA\&'ZAK\&'EZAI&AI& %& AuI&zA\&ZAI%\&' Z%& AI& \&' ZyR&xU&oJ&R&xJ&4m&vI4~&\4~4~&4~&&$4~&%&WoomX'% 'ol' Woe'6oB'@Wo&~no&x &o&n4S&cIS&NS&cIS&DcSc;&'6@c;&'6 c;&'6cS&@]S&&cIS&Nc;&6cS;&'6&]S&;&'6&B*&}&B*&{**f&'Z*0f&'**f&'}*&Z&BM&B*&}*f&*f&'BM&B&Bf&'B&&~y&xyZ&(2y2&x<yP&(7y2&y&y2ryP&'(ly&0yP&'(*0y2&*y&y&y2&=b&>=&=*Y&s/0=&=&=<|&X<&<&t<&<&0<u<u<u&<u<u&<&Q<r&J&<h&;&<&P<vh&'p<&Q4h&'.4&.<&Q<&Q&0&$u&z0&$u&p&'p:&'pK&'pE&:&#<&$u&z&p<&'p$<&$&#0&'p$My&Az&My&Az&yzy&'*&'*w&'*qyz&y&@Yy&Az&y&*yzYy&'*AYy&Ay&@My&'*AhBk;& 'T3|& T3hkF Lo LCo& >Lo& R& L$& '& Lo LHo& BLH$& 'B'& LCo& HB& L$& z{& z{T z{1& zvT& pz{& zfT& `z{& z{+& zT& z^T& 'XzT& z7T& 1za& 'fzT&  zaT& \z{*& zaT& fw w w q&'eq&(qq&&q&< q&q&'q&q0&'(eq&tq&'tqk&'q&'q&q&qkjS99&I&N&I&D&'"&'&'&"&'&I&N&&''&&&'~D&R _&uE&'[t &'{^3&[?&{^4[&'{IE&'[{^E&'[u ;&YZ&{^?&WzE&[f&{LA?&T3&/p?&TA&[n&h,&W&?N&{l,&'TW&?&{`;&'TY;&Y`?&T &,^E&'[{^l?&Tf&{L,&'{W&?&'{Ib?`&'T^E&'{[A&[n&h?&{E&[E&'{[m& m"mB& m"& m& zm"&tm& m<& m"&rm"&'&$'U &$'hRl&$#&$&$'[&$'U[0&$'U l&$4&$l$l&$8[l&$U$&$&$l&$R&$l&$,l&$)&l&$&$&$'&$.&$'l&$.&$v4&$[&$'U&$$&$&$'&$'l$.&$'h[&$'Ul&$,l&$)&&$[l&$U[&$'ULG&%} nG&%nh/>&%'T)\ &%'c@&G&%&%c&%'c1/&%'T)c/0&%'T)] YG&%RT4&%cG%G&%H/G&%T)&%c&%cG&%Zb&%cYG&%T^<G&%6G&%&%c&%'c&%cY.&%'cRTYG&%RT.&%c4&%/&%'T)c&%c&%c&%'c&%'c1G%.&%'c@/&%'cT)YG&%T^<G&%6&%c/G&%T)/&%'cT)a&a&&&%-&&%-B&(BQ&(FB(&(BN&(FB&(#&)KZ$&)BL)L&)&)KtL&)z $&* &*} F* F&* &* F&*j|&+pXj&+ljJ+jJ&+j&+pjJ&+ K&,' m'E K&,' m'E#&,'E K&,' m'E?&,E B&,'Q' m'gE B&,'Q' m'Ej B&,'Q' m'Ed?&,'E&,'E&,'E?&,'E B&,'Q' mE K&,' mE B&,'Q' m'E K&,' m'E K&,' m'E B&,'Q' m'E$4&-f$4g&-\$4-4&-$4,&-X$$4&-dD&/P _&/Gk/k&/&/Pqk&/k0j|&0pXj&0ljJ0jJ&0j&0pjJ&0$&1&1}F1F&1&1F&1 i&2''GLg i&2''Gl%&2'GLg i&2''GbC&2G `&2'B''G `&2'B''G= `&2'B''G7C&2'G&2'GL&2'GLgC&2'Gl `&2'B'G i&2'G `&2'B''GL i&2''GL i&2''GL `&2'B''GL$&3f$g&3\$3&3$,&3X$$&3dP&4 z&4}E4}E&4}&4 }E&4((O<*&5 <&5<95a9&5f<&5 <<9&56"+&6"&6"?6S?&6m"&6"?&6PV&7 zV&7}VE7}E&7}V&7 }VE&71O<l*&8 <l&8<l98a9&8f<l&8 F<l9&8@"+&9"&9"?9S?&9m"&9"?&9w6&.Pj&r&l9&.bw&\w&.d&.&Z-&'=T-&3&-]6&'.b& ]&X"&]&bU6&P.UqUj&PrU&lhU9&P.bU&\U&P.\Ud&P.U&ZU&'TU&3U&-]U6&'P.bU& ]U&X;U"&P]U&b  '#sh&p&G@=f&p&G1&1&1&1&1&d]}&'Wxu]s&&xKWQ1&_< ]&/q W]&/r W]1&W]1&W]o&&xKW&'duT}1&6%&'u1&1&<]}&'Wxu}&'dxu1&1&&*&*&*n&*F&*]2&*'*W](&*'W&*< ]p&*'W= ]b&*'W8 ]&*W]&*W]$&*'W5&*'*T&*X%`&*'*&*]&*]2&*'*Wx2&*'*&*n&*[XA&:nj4A&:Rp:A&:TA&:xA&:P`]>~&:'vTW`]>r&:'TWnJ=A&:K< `]&:'TW `]z&:'TW `]>A&:TW`]>A&:TW`]>n&:'TWnJ}&:'vPT,A&:%j&:'vRj4A&:RxA&:(`]>~&:'vTW~&:'vPp:A&:TA&:xpSF&<ip/F&<Mp5F&<OpF&<spF&<Kp]9:&<'[2OWp]90&<'OW[p8F&<F< p]9x&<'OWTE p]9j&<'OWU@ p]9F&<OWp]9F&<OWp]9,&<'OW[p=&<'[2KpT'F&<%g/h&<'[2Mp/F&<MpF&<#p]9:&<'[2OWp:&<'[2Kp5F&<OpF&<s&?_&?}e&??&?&?]im&?'eW]ic&?'W;&?< ]&?'Wzx ]i&?'W{s ]i&?W]i&?W]i_&?'W;{Ep&?'ceTW&?%o_&?'ce}_&?}.&?k]im&?'eWm&?'ee&??&?'*'*'*'*X'*]'*'W]'*'WZ'*< ]'*'W ]'*'W ]'*W]'*W]~'*'WZ'*'&T'*i%'*''*o'*]'*'WX'*''*'*;&\Q&\5&\7&\P&\(]!&\'x7W]!&\'7Wx&\#< ]!2&\'7Wq ]!$&\'7Wr ]!&\7W]!&\7W]!&\'7Wx&\'x(T&\%"&\'x5&\5&\]!&\'x7W&\'x(&\7&\P_-&fC_ &f'_&f)_&fL_&f$_]6&f'.)W_],&f')W_&f< _]t&f')W}A _]f&f')W~< _]&f)W_]&f)W_](&f')W_9&f'.$_T&f%_ d&f'.'_ &f'_&f_]6&f'.)W_6&f'.$_&f)_&fL&x&x&x &x&x^]h&x'`W]^&x'W6K&xY< ]&x'Ws ]&x'Wn ]&xW]&xW]Z&x'W6k&x'`^ T&xc%&x'`&x&x6]h&x'`WGh&x'`^&x &x&}&}&}&}{&}{&}'/u{&}'u&}Z {;&}/( u{&}/) u{&}u{&}u{&}'u&}'%9r&}|C&}'%&}&}{&}'/u&}'/&}&}L&L&L&]L&5L&]|&'tW]r&'WJL&< ]&'W ]&'W ]L&W]L&W]n&'WJ&'tTL&F%&'tL&LL&]|&'tW?|&'tL&]L&|'\v%|'\v |'\v |'\v.|'\v]\'\v'T W]R'\v' W*|'\v< ]'\v' Wg ]'\v' Wb ]|'\v W]|'\v W]N'\v' W*_'\v'TYT|'\v%'\v'T |'\v |'\v]\'\v'T W\'\v'T|'\v |'\v.j&j&j&Xj&0j&]&'W]&'Wj&< ]2&'W ]$&'W ]j&W]j&W]&'W0&'Tj&L%"&'j&Gj&]&'W0&'j&Xj&&&&b&:&]|&'tW]&'W_&< ]&'W ]&'W ]&W]&W]&'W_:&'tT&K%&'t&Q&]|&'tW:|&'t&b&! &7 & & &` &]&'_W]&'Wj &< ]>&'WX ]0&'WY ] &W] &W]&'Wjy&'kT &%&' &w &]&'_W`&'_ & &T&j0&N6&P&s&K]:}&'uPW]:&'PW8&F< ]:&'PW ]:&'PW ]:&PW]:&PW]:&'PW&'{KT(&%0&'uN0&N&#]:}&'uPW}&'uK6&P&s_&u;&YA&[&&W]E&'{[W]E&'[W{^D&R< ]E&'[Wt ]E&'[Wu ]E&[W]E&[W]E&'[W{^l&'TWT3&%`;&'TY;&Y&/]E&'{[W&'{WA&[&c&y?&]E&_&&[]I&'_W]I&'_WH&V< ]I%&'_W ]I&'_W ]I&_W]I&_W]I&'_W&'[T7&%?&']?&]&3]I&'_W&'[E&_& l&$ l&$l&$l&$)l&$]&$'W]&$'Wl&$< ]>&$'W ]0&$'W ]l&$W]l&$W]&$'W&$'Tl&$%.&$'l&$l&$]&$'W&$'l&$l&$)~91&~Q&*~A&:Pp~F&<K~"&?~c'*~&\(_~&f$~&x^&}&~@L&~|'\v~;j&~E&~k &~&K~&W~&[~l&$U&Mh'67'&7676'&' <$@ U< 009{'RA'6m hh&Df>8z/N'D',? Y33 %6!&/&XGFGYYH=&f@&fN @&fAC&fA&f\8A7&f9A&f%5A&f#3@&fZ@&f=&f@&fN @&fAC&fLaQB&fA R=&f"C<S?&f%5A&f#3@&fZ@&fO8X&f9A&fDA&fM k 6&?676&?67b(  (!  k6   H ( v Dl O6'&5'476G&(  OG M=*  /56.7676'&76'&767&76& @ JI2F?"!  9\J"*P@e%,F;00Z.VP$ "%% 14--4AKN)"w)8V1O`q, n'B]3'C!8.0'"'&'367676 " "J& a-Ph (A`[/]6| %/&?6E$D$$DH$$H$$z67676#&''&/&76%&&87sGV) 7#?l v2vg@) ZmDU4 pXm47x TIIP .o'&7$76'&76'&&&18҃WS;/A$@;=CF, W-:*u17b$%!+^t,1&/&3276#"E____E___YDDY"'&/&3276_EFYCCY!! %"/&! %6XJF8FEYFEY %6%$%&/&56 7{o6S^+ Y=;Y -:P 3'J'( H'  0' y/  3'( '6' N'(P 'J'K 'PK 3'P'(Y'/S' 'z'z3'((6'&%$2#$$'&767>76"4#9 Xb2"Yo:,$ 1 .-f+oYgE..Wc{)- .S20N"''eNT76$'&767%2# ;,& 1 +6A' [1S0N"'(. 2'&'&%$2#$$'&767>76767636 726&7 X91m, x  /jH !D.3  ? (d5 R !/  !S  T2; R!+&767&'&'&7667672'767&I # P-   9Prמ7676332"Yo:,$ 1 .-3%/=I.,@>(- .S20N"''e'0V:!'&'&'&'&'&?676ʊ   A %  r9 CBb!j$Cv,-J&76'&'4'.' T/# s  \2zSJ'&76'7>67&#V:h2 u$I{, &P ,Lg@4jv.]ߴI  EBSD'&'&/&7>36  "! $=*9]Cqr L$Z7AJj!6'45%&'.'&67z'-S%  $ JIL,/j. M^I M 1A(F&.Jj&"pj&u.Jj&"pj&kJjJ s&'+  s&'F s&'@Jj&+ Jj&!:J&"pj&uJ s&JjJ s&':J&"Jj&!J s&'7&E# &{B&'<{ Rep&'h&9&O Jb&>J `&'hBb&'<>DB&'<v l&gJ&>J&7(B&<J&,J&hz&"Ji&hl&q&r&&J *J.&h&s&'hJ RJp&hl&'hgl&gJ&hJ~&>'Bf&'<>Js&hJ&,R&p&'hJ Jf&'hBJe&'h&RBp&'h&76Qn& <>\s&sA?$j/+2{B 4T!*?'&C &C 5C&FzFz&Fl&D]D<&D]f&D|@&D^&&D] {&D]H&D^g &Da&D'&DnL&DbhH&D']bwJ&DX B&D`o&D]AH&Db5&E'-H5&E-.&E-c&E-&E-8&E-Er",6'&''&767&767&'&65&'&7&76'& 0xW,?c %Ka!+l.;8SFG@-lh4@Y:s3f_!&k X0w:rI Lrere4$%6'&&767676'&'&7676676 /3A!@873%)  M-k+ ?2׵!%g9 &3_cSFDe`) C-  v)4g+`; c"(cg~h&hh&hLc07>'&%">&&'&>76'&'/&76Ir =r$ta/. ,HG"C (+,Жfh,hKlkkU# KdG<)F K%$ ]Hn*- #? 4(7c7"'c)Js)J"'s)<)<"&)J#-5%/&7$7676%6''"676'&76'&N3rWn9-RL)  iYD fG-;F }'< $`NPLS? #ݸY Cɺ <:GHIGMW%ߣ*!0n#'&776325476"'&&'&}Ί@L hI T7' !j` n{ h9ytt!&t%!'%t!mf>G33=*833-933R03H33"E33v33~N33c,#,33a:!:33N33>G33=*833-933R03H33.^UQ33ER33`-]S33c,#,33a:!:33N33733~N33.833V6#"'& '&7 & Y5  % $CUXHn! B'FX&{7&*V &d4t&~ P&V&N'm' n(' D$[ .">&7>'&'&767&767676$r$ta/.iIr =nW %HVG5?^HG"C (+,dG<)FdkU# KQ:qI{Fi%$ ]Hn*,[@ &\ =1&P&U&*+&4q1&8lA&:(pF&<#HS&&?k&@w+&EC5&M<%g'*u&\Dz&^f_&f{ &x7~&yHcqF&{{&}zN&~*>DL&hX&$p &k&wfO&h|'\v^C&gj&RI&o &&2&w!&/&3k& l&$RG&%Zb=1&U&*lA&:(pF&<#&&?kg'*&\_&fz&x6&}DL&|'\vjgj&I&o &&#&/&3l&$h&"DT0<D(!0'&547632! '&/&4! ;dmG< , < T;V*C " =}yOl"nO#"J (P(C2fFJTfGe9cu9e˜fo-âfEDdVUdpiC2fFJTfGefFvQ_g]5RCSfEDdVUdpiDzfo-âkGZSX&{7&d4u >#"'&32?6>Z \]2u& u&&/ J8&'n0u&Byn&L&'0*&'&/ u&l&uJu&`u&L&V&0`u&H1&0u&"qu&Iu&8&0;&'088&0f&'0u&f&0"&C.&';&0L&I8&'0=.&'0 uf&'n08&'0u&"qu&88&0u&8&'0u&u&u&qu&Iu&]8&'W0].&'W2u& ]&/ W]&/ W]u&W]u&W]*&'W;&'0Tu&B%f&'0u&`u&]8&'W0I8&'0u&qu&BV&'Xxl &' rb M'l'Xx& 'r' &Zb M'r'&'Xxl ''Z&' rb M''&'Xxl '>'Z&' rb M']}'&'XxlQ 'K'Z&' rb M''&'Xxl ''Z&' rb M''&'Xxl '>'Z&' rBV''l'Xx '>'r' BV''l'Xx '>'r' BV'['l'Xx{ 'v'r' BV&'Xx'l &' 'r>BV&'Xx'l]{ &' 'ry # -6'&%&'&7%632&676%$g~"C# ( =U#*C  G̘n< ōStV:F8^ h7<y >4&%&'&7632'"&'&676%$o0*  8)ֈ1_e (#*C  Qkx*QH  9![^KRGo:F8^ h7@< ( 0'&547632! '&/&4 0;dmG< , < T;V*C " =}yOl"nO#"J (<^ W%0"47&'! %&/&4! 7672#"'&"276764 B8br>C "*H+WoK lI?9s_e^ ^?D .rQJ dm1Hp RPa 1&/&276#"JK="I*53YK HY%nRa%&'&76h 0k!  ",$!VNO\a&S ~a&Sx? &S'9I &S'Px6a&S6R&SP. &S'Pj?R&S'P.9?&S'9J ia&Sdq&SP.aSa&SFl?a&S9;&SP*~&S=XZua&S YY&S=Xia&Sna&SZna&S2h&SPUnc&S'=X2h&SPIi&S'=Xdia&SdI&S=Xq&SP.?V&S'9P.Uc&S=X;&SPn&S'P2hb&S'PaSI&S'=Xx?&S'P9ia&Sna&SZ&SP?a&S9?&S'P9%X'R% %J'R %nRNca&S u[u& ~<u&Rx?"&/ 898&'n06u&*&(&'0?"*&'89?"&/ 89iu&6dl&u0u&l?"u&89)L&V&0u`u&1&0iu&8nqu&nIu&h&0n;&'h08&0if&'6d0iu&6df&0N&o?".&'89;&0)L&n8&'h0.&'0 uf&'n0?"8&'890iu&8nqu&8&0?"u&89?"8&'890cXu&~&xn&lh&&'&?&p9i2&'l*pn&g i&ndi&pnXu&HXu&,u& 1"7663276v%0% Ý e/8 sk $6nq4&'.#";2#"32&#"&5432676554+"546;2=4>3232>;267>32#"'.""&565"2>54& D:V(Y%@QX jR HqFC,)1VY0Kh+i  8$` t|Hm,nm\f 02t>1 Fl > i‡P. @nv NLzFaM # 5_& =QcP6<n4&'.#";2#"32&#"&543267654#!"32&#"&543267654+"546;2=4>32>3232>;267>32#"'.""&565"2>54&'.#"3!27676546 D:V(Y%@QX Y%@QX jR N{G4]>% 9LC,)1VY0Kh+i  8$` t|H 2N0^h#d,nm\f 02t>1 Fl 2t>1 Fl > h{H 0(MW. @nv NLzFaM # 5_& =QcPf)2f6  6Yn4&'.#";2#"32&#"&5432676554+"546;2=4>3232>;267>4.#&67327"7#"&'&'./3&#"&6726765 D:V(Y%@QX jR HqFC,$B'%a_gIcg9m$g-fPr ] #AT] m+om\f 02t>1 Fl > i‡P. @n8 m7!  , +W=v# :| t * * t6n4&'.#";2#"32&#"&543267674#!"32&#"&543267674+"546;2=4>32>3232>;267>4.#&67327"7#"&'&'./3&#"&6726765.#"3!27676544 D:V(Y%@QX Y%@QX jR N{G4]>% 9LC,$B'%a_gIcg9m$g-fPr ] #AT]  ",=#^hl*pm\f 02t>1 8z 2t>1 8z > h{H 0(MW. @n8 m7!  , +W=v# :| t * * tt%f6  8Kn4&'.#";2#"32.#"&5432676554+"546;2=4>3232>;2327>323&#"&672676=4&#"3&#"&6726765 D:V(UM=$%@QT jR HqFC,(@AZ:! ] #AT] Qs"]? ] #AT] !m,nm\f 02t>- Fl > i‡P. @n<,f">l\t * * tȽ04 ^t * * t6{n4&'.#";2#"32&#"&543267674#!"32&#"&543267674+"546;2=4>32>3232>;2327>323&#"&672676=4&#"3&#"&6726765.#"3!27676546 D:V(Y%@QX Y%@QX jR N{G4]>% 9LC,(@AZ:! ] #AT] Qs"]? ] #AT]  ",=#^hp*pm\f 02t>1 8z 2t>1 8z > h{H 0(MW. @n<,f">l\t * * tȽ04 ^t * * tt%f6  82nk4'.+"32.#"&5432676554+"546;2=4>32#"'.#";272632&'&47>5B4UM=$%@QT jR HqF=]0*; % 5:V(V /FaV.)5?$l;# 2t>- Fl > i‡P.O)*4,1m\f.P@"n}e7  /Ub`62n4'.+"32&#"&543267654#!"32&#"&543267654+"546;2=4>32>32#"'.#";272632&'&47>5'.#"3!2=47654B4Y%@QX Y%@QX jR N{G4]>% ;K=]0*; % 5;Y)V /FaV.)5?$ 2N0^h l8& 2t>1 Fl2t>1 Fl > h{H 0(MW.O)*4,1kZf @P"n}e7  /Ub`)2f qQ  8@dE&43267654'.54767263232.'32>32#".5467"&#"@^;& @ ` 6 P%-#?"dn4D]$ 2:RzN0!"P@dt>1 1:7  9A J>> #".5432\ 2 Hf <%D 467632#"&D2 \ %< fH 2#'"&5676 +{& Н4 &/) `  *P 2654&#"462"CZ??-.jff\BA/.@ihj-d%232>72#"'.#""&54767NV%#9";O7N  09d+0") 'I+ !'G0!&67!  C =(2"&'&546326zzYY M]]M ;AA&\!32#"'.5463232654&#""&7>73<-;^4 5/7.&; 26D0Pb . &* Y.6l 2"&46!2"&46(:;R;=(:;R;=l;)(8:P:;)(8:P::lX462"$462":T::T\:T::TT::T::T::T:,"'.'46372+{& T:%/)  U=)l@9BvD4D4f0xpb\x@&T Z&2&fe-4233&f-62336"&fz2 6 233J&f*6233!6&f^(%9233J&f*9233<&f(> 2330(&fr*,233I&f#7233=&f(> 233>RT 2&'54X,F <TH,N,zX2"5 88 \n!"&67!2vn%<&6.7j/.6  x8& "5467!2    E 5 j .7  ' P` !2!"54 ` "547!2 P   .X` !2!"54: `Cd#~.7 B ~ 0$ *(N.7F   ' %4n!"&67!2vn%<,Lh !2!"548 h!$\ F2%&/&7.7>7&' :) H#G 7$767&'&?6767"&'%76767&'&&7>6'&'&'%$''&'&"'&7676765&7676%&2'&''&''&'%$%'&'&#"'&7676765&7676$%37>7627>765&'&'&'&767&RT) DZRw@\;"|1<d     _ ): ;   p  b  0  B u   0 4) "z 4: : ; < <  <  2< ?Copyright (c) 2010-2013, Khaled Hosny <khaledhosny@eglug.org>. Portions copyright (c) 2010, Sebastian Kosch <sebastian@aldusleaf.org> This Font Software is licensed under the Open Font License, Version 1.1.Copyright (c) 2010-2013, Khaled Hosny . Portions copyright (c) 2010, Sebastian Kosch This Font Software is licensed under the Open Font License, Version 1.1.AmiriAmiriRegularRegularSorts Mill Tools 2.0.0_alpha1 : Amiri : 18-5-2013Sorts Mill Tools 2.0.0_alpha1 : Amiri : 18-5-2013AmiriAmiriVersion 000.106 Version 000.106 Amiri-RegularAmiri-RegularKhaled HosnyKhaled HosnyAmiri is a classical Arabic typeface in Naskh style for typesetting books and other running text. Its design is a revival of the beautiful typeface pioneered in early 20th century by Bulaq Press in Cairo, also known as Amiria Press, after which the font is named.Amiri is a classical Arabic typeface in Naskh style for typesetting books and other running text. Its design is a revival of the beautiful typeface pioneered in early 20th century by Bulaq Press in Cairo, also known as Amiria Press, after which the font is named.http://www.amirifont.orghttp://www.amirifont.orghttp://www.khaledhosny.orghttp://www.khaledhosny.orgCopyright (c) 2010-2013, Khaled Hosny (<khaledhosny@eglug.org>) This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2010-2013, Khaled Hosny () This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL5PAR .NDRBN .NHR/M CNEP+RDP qD4QNER3P %P0R (N2N:N*R JN-R8NIp qD6QN,PJ9O (PGN' FN,RDN'!N EP9R7N'1P. .-BHB 'DF41 2010-2013 .'D/ -3FJ <khaledhosny@eglug.org>. *O1.Q5 (1E,J) 'D.7 G0G (1.5) 'D.7H7 'D-1) 'D%5/'1) 1,1.9'/J%5/'1) 000k106.'D/ -3FJ'D.7 'D#EJ1J GH %-J'! D.7 'DF3. 'D0J 5OEE H'3*./E DDE1) 'D#HDJ AJ E(79) (HD'B ('DB'G1) )*91A #J6' ('DE7(9) 'D#EJ1J)( AJ #H'&D 'DB1F 'D941JF. *EJ2 'D.7 'D#EJ1J F'(9 EF EH2'F*G 'DE*EJ2) (JF ,E'D .7 'DF3. HE*7D('* 'D7('9) 'D1'BJ). 'D.7 'D#EJ1J EH,G #C+1 D7('9) 'DF5H5 'D7HJD) H'DC*(.5PAR .NDRBN .NHR/M CNEP+RDP qD4QNER3P %P0R (N2N:N*R JN-R8NIp qD6QN,PJ9O (PGN' FN,RDN'!N EP9R7N'1P.f  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     uni00ADuni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsGcarongcaronuni0237uni02BBuni02BCuni02BEuni02BF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308uni030Auni030Buni030Cuni0312uni0315 dotbelowcombuni0326uni0327uni0328uni032Euni0331uni0600uni0601uni0602uni0603uni0606uni0607uni0608uni0609uni060Auni060Buni060Cuni060Duni060Euni060Funi0610uni0611uni0612uni0613uni0614uni0615uni0616uni0617uni0618uni0619uni061Auni061Buni061Euni061Funi0620uni0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni063Buni063Cuni063Duni063Euni063Funi0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni0656uni0657uni0658uni0659uni065Auni065Buni065Cuni065Duni065Euni065Funi0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni066Euni066Funi0670uni0671uni0672uni0673uni0674uni0675uni0676uni0677uni0678uni0679uni067Auni067Buni067Cuni067Duni067Euni067Funi0680uni0681uni0682uni0683uni0684uni0685uni0686uni0687uni0688uni0689uni068Auni068Buni068Cuni068Duni068Euni068Funi0690uni0691uni0692uni0693uni0694uni0695uni0696uni0697uni0698uni0699uni069Auni069Buni069Cuni069Duni069Euni069Funi06A0uni06A1uni06A2uni06A3uni06A4uni06A5uni06A6uni06A7uni06A8uni06A9uni06AAuni06ABuni06ACuni06ADuni06AEuni06AFuni06B0uni06B1uni06B2uni06B3uni06B4uni06B5uni06B6uni06B7uni06B8uni06B9uni06BAuni06BBuni06BCuni06BDuni06BEuni06BFuni06C0uni06C1uni06C2uni06C3uni06C4uni06C5uni06C6uni06C7uni06C8uni06C9uni06CAuni06CBuni06CCuni06CDuni06CEuni06CFuni06D0uni06D1uni06D2uni06D3uni06D4uni06D5uni06D6uni06D7uni06D8uni06D9uni06DAuni06DBuni06DCuni06DDuni06DEuni06DFuni06E0uni06E1uni06E2uni06E3uni06E4uni06E5uni06E6uni06E7uni06E8uni06E9uni06EAuni06EBuni06ECuni06EDuni06EEuni06EFuni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni06FAuni06FBuni06FCuni06FDuni06FEuni06FFuni0750uni0751uni0752uni0753uni0754uni0755uni0756uni0757uni0758uni0759uni075Auni075Buni075Cuni075Duni075Euni075Funi0760uni0761uni0762uni0763uni0764uni0765uni0766uni0767uni0768uni0769uni076Auni076Buni076Cuni076Duni076Euni076Funi0770uni0771uni0772uni0773uni0774uni0775uni0776uni0777uni0778uni0779uni077Auni077Buni077Cuni077Duni077Euni077Funi08A0uni08F0uni08F1uni08F2uni1E02uni1E03uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E1Euni1E1Funi1E24uni1E25uni1E28uni1E29uni1E2Auni1E2Buni1E40uni1E41uni1E56uni1E57uni1E60uni1E61uni1E62uni1E63uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6FWgravewgraveWacutewacute Wdieresis wdieresisuni1E92uni1E93uni1E96uni1E97Ygraveygraveuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015 quotereverseduni201Fonedotenleaderuni2028uni2029uni202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2038uni203Euni2042Eurouni2213uni25CCf_ff_if_lf_f_if_f_luniFB50uniFB51uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB82uniFB83uniFB84uniFB85uniFB86uniFB87uniFB88uniFB89uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB96uniFB97uniFB98uniFB99uniFB9AuniFB9BuniFB9CuniFB9DuniFB9EuniFB9FuniFBA0uniFBA1uniFBA2uniFBA3uniFBA4uniFBA5uniFBA6uniFBA7uniFBA8uniFBA9uniFBAAuniFBABuniFBACuniFBADuniFBAEuniFBAFuniFBB0uniFBB1uniFBB2uniFBB3uniFBB4uniFBB5uniFBB6uniFBB7uniFBB8uniFBB9uniFBBAuniFBBBuniFBBCuniFBBDuniFBBEuniFBBFuniFBC0uniFBC1uniFBD3uniFBD4uniFBD5uniFBD6uniFBD7uniFBD8uniFBD9uniFBDAuniFBDBuniFBDCuniFBDDuniFBDEuniFBDFuniFBE0uniFBE1uniFBE2uniFBE3uniFBE4uniFBE5uniFBE6uniFBE7uniFBE8uniFBE9uniFBEAuniFBEBuniFBECuniFBEDuniFBEEuniFBEFuniFBF0uniFBF1uniFBF2uniFBF3uniFBF4uniFBF5uniFBF6uniFBF7uniFBF8uniFBF9uniFBFAuniFBFBuniFBFCuniFBFDuniFBFEuniFBFFuniFC00uniFC01uniFC02uniFC03uniFC04uniFC05uniFC06uniFC07uniFC08uniFC09uniFC0AuniFC0BuniFC0CuniFC0DuniFC0EuniFC0FuniFC10uniFC11uniFC12uniFC13uniFC14uniFC15uniFC16uniFC17uniFC18uniFC19uniFC1AuniFC1BuniFC1CuniFC1DuniFC1EuniFC1FuniFC20uniFC21uniFC22uniFC23uniFC24uniFC25uniFC26uniFC27uniFC28uniFC29uniFC2AuniFC2BuniFC2CuniFC2DuniFC2EuniFC2FuniFC30uniFC31uniFC32uniFC33uniFC34uniFC35uniFC36uniFC37uniFC38uniFC39uniFC3AuniFC3BuniFC3CuniFC3DuniFC3EuniFC3FuniFC40uniFC41uniFC42uniFC43uniFC44uniFC45uniFC46uniFC47uniFC48uniFC49uniFC4AuniFC4BuniFC4CuniFC4DuniFC4EuniFC4FuniFC50uniFC51uniFC52uniFC53uniFC54uniFC55uniFC56uniFC57uniFC58uniFC59uniFC5AuniFC5BuniFC5CuniFC5DuniFC5EuniFC5FuniFC60uniFC61uniFC62uniFC63uniFC64uniFC65uniFC66uniFC67uniFC68uniFC69uniFC6AuniFC6BuniFC6CuniFC6DuniFC6EuniFC6FuniFC70uniFC71uniFC72uniFC73uniFC74uniFC75uniFC76uniFC77uniFC78uniFC79uniFC7AuniFC7BuniFC7CuniFC7DuniFC7EuniFC7FuniFC80uniFC81uniFC82uniFC83uniFC84uniFC85uniFC86uniFC87uniFC88uniFC89uniFC8AuniFC8BuniFC8CuniFC8DuniFC8EuniFC8FuniFC90uniFC91uniFC92uniFC93uniFC94uniFC95uniFC96uniFC97uniFC98uniFC99uniFC9AuniFC9BuniFC9CuniFC9DuniFC9EuniFC9FuniFCA0uniFCA1uniFCA2uniFCA3uniFCA4uniFCA5uniFCA6uniFCA7uniFCA8uniFCA9uniFCAAuniFCABuniFCACuniFCADuniFCAEuniFCAFuniFCB0uniFCB1uniFCB2uniFCB3uniFCB4uniFCB5uniFCB6uniFCB7uniFCB8uniFCB9uniFCBAuniFCBBuniFCBCuniFCBDuniFCBEuniFCBFuniFCC0uniFCC1uniFCC2uniFCC3uniFCC4uniFCC5uniFCC6uniFCC7uniFCC8uniFCC9uniFCCAuniFCCBuniFCCCuniFCCDuniFCCEuniFCCFuniFCD0uniFCD1uniFCD2uniFCD3uniFCD4uniFCD5uniFCD6uniFCD7uniFCD8uniFCD9uniFCDAuniFCDBuniFCDCuniFCDDuniFCDEuniFCDFuniFCE0uniFCE1uniFCE2uniFCE3uniFCE4uniFCE5uniFCE6uniFCE7uniFCE8uniFCE9uniFCEAuniFCEBuniFCECuniFCEDuniFCEEuniFCEFuniFCF0uniFCF1uniFCF2uniFCF3uniFCF4uniFCF5uniFCF6uniFCF7uniFCF8uniFCF9uniFCFAuniFCFBuniFCFCuniFCFDuniFCFEuniFCFFuniFD00uniFD01uniFD02uniFD03uniFD04uniFD05uniFD06uniFD07uniFD08uniFD09uniFD0AuniFD0BuniFD0CuniFD0DuniFD0EuniFD0FuniFD10uniFD11uniFD12uniFD13uniFD14uniFD15uniFD16uniFD17uniFD18uniFD19uniFD1AuniFD1BuniFD1CuniFD1DuniFD1EuniFD1FuniFD20uniFD21uniFD22uniFD23uniFD24uniFD25uniFD26uniFD27uniFD28uniFD29uniFD2AuniFD2BuniFD2CuniFD2DuniFD2EuniFD2FuniFD30uniFD31uniFD32uniFD33uniFD34uniFD35uniFD36uniFD37uniFD38uniFD39uniFD3AuniFD3BuniFD3CuniFD3DuniFD3EuniFD3FuniFD50uniFD51uniFD52uniFD53uniFD54uniFD55uniFD56uniFD57uniFD58uniFD59uniFD5AuniFD5BuniFD5CuniFD5DuniFD5EuniFD5FuniFD60uniFD61uniFD62uniFD63uniFD64uniFD65uniFD66uniFD67uniFD68uniFD69uniFD6AuniFD6BuniFD6CuniFD6DuniFD6EuniFD6FuniFD70uniFD71uniFD72uniFD73uniFD74uniFD75uniFD76uniFD77uniFD78uniFD79uniFD7AuniFD7BuniFD7CuniFD7DuniFD7EuniFD7FuniFD80uniFD81uniFD82uniFD83uniFD84uniFD85uniFD86uniFD87uniFD88uniFD89uniFD8AuniFD8BuniFD8CuniFD8DuniFD8EuniFD8FuniFD92uniFD93uniFD94uniFD95uniFD96uniFD97uniFD98uniFD99uniFD9AuniFD9BuniFD9CuniFD9DuniFD9EuniFD9FuniFDA0uniFDA1uniFDA2uniFDA3uniFDA4uniFDA5uniFDA6uniFDA7uniFDA8uniFDA9uniFDAAuniFDABuniFDACuniFDADuniFDAEuniFDAFuniFDB0uniFDB1uniFDB2uniFDB3uniFDB4uniFDB5uniFDB6uniFDB7uniFDB8uniFDB9uniFDBAuniFDBBuniFDBCuniFDBDuniFDBEuniFDBFuniFDC0uniFDC1uniFDC2uniFDC3uniFDC4uniFDC5uniFDC6uniFDC7uniFDF0uniFDF1uniFDF2uniFDF3uniFDF4uniFDF5uniFDF6uniFDF7uniFDF8uniFDF9uniFDFAuniFDFCuniFDFDuniFE70uniFE71uniFE72uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFC aAlf.fina.alt aAlf.fina aAlf.isol aAyn.fina aAyn.init aAyn.isol aAyn.medi aBaa.fina aBaa.init aBaa.isol aBaa.medi aDal.fina aDal.isol aFaa.fina aFaa.init aFaa.isol aFaa.medi aHaa.fina aHaa.init aHaa.isol aHaa.medi aHeh.fina aHeh.init aHeh.isol aHeh.medi aKaf.fina aKaf.init.alt aKaf.init aKaf.isol aKaf.medi aLam.fina aLam.init aLam.isol aLam.medi aMem.fina.alt aMem.fina aMem.init aMem.isol aMem.medi aNon.fina.alt aNon.fina aNon.isol.alt aNon.isol aQaf.fina aQaf.isolaRaa.fina.alt2 aRaa.fina aRaa.isol aSad.fina aSad.init aSad.isol aSad.medi aSen.fina aSen.init aSen.isol aSen.medi aTaa.fina aTaa.init aTaa.isol aTaa.medi aWaw.fina aWaw.isol aYaa.fina aYaa.isolaLam.medi_LamMemFinaaMem.fina_LamMemFinaaBaa.init_BaaRaaIsolaRaa.fina_BaaRaaIsolaLam.medi_LamWawFinaaWaw.fina_LamWawFinaaLam.init_LamHaaInitaFaa.medi_FaaYaaFinaaYaa.fina_FaaYaaFinaaLam.init_LamLamHaaInitaLam.medi_LamLamHaaInitaHaa.medi_LamLamHaaInitaBaa.medi_BaaMemFinaaMem.fina_BaaMemFinaaSad.init_AboveHaaaLam.init_LamBaaMemInitaBaa.medi_LamBaaMemInitaMem.medi_LamBaaMemInitaBaa.init_BaaDalaDal.fina_BaaDalaBaa.init_BaaMemHaaInitaMem.medi_BaaMemHaaInitaHaa.medi_BaaMemHaaInitaBaa.init_BaaBaaYaaaBaa.medi_BaaBaaYaaaYaa.fina_BaaBaaYaaaLam.medi_LamYaaFinaaYaa.fina_LamYaaFinaaKaf.init_KafBaaInitaBaa.medi_KafBaaInitaLam.init_LamMemInitaMem.medi_LamMemInitaLam.init_LamAlfIsolaAlf.fina_LamAlfIsolaLam.init_LamHaaMemInitaHaa.medi_LamHaaMemInitaMem.medi_LamHaaMemInitaBaa.medi_BaaBaaInitaAyn.medi_AynYaaFinaaMem.init_MemRaaIsolaRaa.fina_MemRaaIsolaFaa.init_FaaHaaInitaHaa.medi_FaaHaaInitaHaa.init_HaaHaaInitaLam.medi_LamQafFinaaQaf.fina_LamQafFinaaSen.init_AboveHaaaMem.init_MemHaaInitaBaa.init_BaaNonIsolaNon.fina_BaaNonIsolaKaf.medi_KafMemFinaaMem.fina_KafMemFinaaBaa.init_BaaSenInitaSen.medi_BaaSenInitaBaa.medi_BaaRaaFinaaRaa.fina_BaaRaaFinaaKaf.medi_KafRaaFinaaRaa.fina_KafRaaFinaaLam.init_LamHehInitaHeh.medi_LamHehInitaMem.init_MemHaaMemInitaHaa.medi_MemHaaMemInitaBaa.init_BaaMemInitaMem.medi_BaaMemInitaSen.init_SenHaaInitaKaf.init_KafRaaIsolaRaa.fina_KafRaaIsolaAyn.init_AynHaaInitaKaf.medi_KafYaaFinaaYaa.fina_KafYaaFinaaLam.init_LamMemHaaInitaMem.medi_LamMemHaaInitaHaa.medi_LamMemHaaInitaLam.medi_LamAlfFinaaAlf.fina_LamAlfFinaaLam.medi_LamMemMediaMem.medi_LamMemMediuni0644.init_Lellahuni0644.medi_Lellahuni0647.fina_LellahaBaa.init_BaaBaaHaaInitaBaa.medi_BaaBaaHaaInitaHaa.medi_BaaBaaHaaInitaBaa.medi_SenBaaMemInitaMem.medi_SenBaaMemInitaBaa.init_BaaBaaIsolaBaa.fina_BaaBaaIsolaBaa.init_BaaBaaMemInitaBaa.medi_BaaBaaMemInitaMem.medi_BaaBaaMemInitaKaf.medi_KafBaaMediaBaa.medi_KafBaaMediaBaa.medi_BaaNonFinaaNon.fina_BaaNonFinaaHaa.init_HaaRaaIsolaRaa.fina_HaaRaaIsolaHeh.init_HehHaaInitaLam.init_LamRaaIsolaRaa.fina_LamRaaIsolaSad.init_SadHaaInitaHaa.medi_SadHaaInitaBaa.medi_BaaYaaFinaaYaa.fina_BaaYaaFinaaBaa.init_BaaSenAltInitaSen.medi_BaaSenAltInitaRaa.fina_PostToothaYaa.fina_PostToothaBaa.init_AboveHaaaBaa.init_BaaHaaInitaBaa.init_BaaHaaMemInitaHaa.medi_BaaHaaMemInitaHaa.fina_AboveHaaIsolaLam.init_LamHaaHaaInitaHaa.medi_1LamHaaHaaInitaHaa.medi_2LamHaaHaaInitaAyn.init_FinjaniaHaa.init_FinjaniaHaa.medi_FinjaniaSen.init_PreYaaaSen.medi_PreYaaaSad.init_PreYaaaSad.medi_PreYaaaBaa.init_HighDot.a TwoDots.a ThreeDots.aDot.b TwoDots.b ThreeDots.b aKaf.isol.alt aKaf.medi.alt hamza.kafdash.kaf aKaf.fina.alt iThreeDots.a iThreeDots.bdash.gafaBaa.medi_Highsmalltaa.above vTwoDots.a vTwoDots.b ring.belowaSen.fina_BaaSenaMem.fina_PostToothtatwil.one_LamKafdot.alt1 dash.gaf.alt2 dash.gaf.alt1aBaa.init_WideaHaa.medi_HaaHaaInitaHaa.medi_AynHaaInitaMem.medi_LamMemInitTatweelaHeh.init_AboveHaaaHaa.init_AboveHaaaAyn.init_AboveHaaaHaa.fina_AboveHaaIsol2aMem.init_AboveHaaaKaf.init_AboveHaa FourDots.a FourDots.b hThreeDots.a hThreeDots.b aYaa.tailhamza.above.wavy smallv.belowsmallv.below.invertedsmalltaa.belowtwostrokes.below hamza.wasl period.ara uni064B.small uni064E.small uni08F1.small uni064F.smalluni0652.small2uni0650.small2 damma.markhamzadamma.mark aAlf.daggerdot.1dot.2 dash.kaf_gafDot.b.l TwoDots.b.l ThreeDots.b.liThreeDots.b.l vTwoDots.b.l FourDots.b.lhThreeDots.b.lsmallv.below.inverted.lowstroke aTwo.above aThree.above aFour.above aFour.below uni06F4.urd uni06F6.urd uni06F7.urdaKaf.init_KafLamaKaf.fina_KafKafFinaaLam.medi_KafLamaLam.medi_KafLamMemMediaKaf.medi_KafLamaLam.medi_KafLamHehIsolaLam.medi_KafLamYaaaLam.medi_KafLamAlfaLam.fina_KafLamaAlf.fina_KafAlfaKaf.init_KafMemAlfaKaf.medi_KafMemAlfaMem.medi_KafMemAlfaLam.medi_KafMemLamaLam.fina_KafMemLamaAlf.fina_KafMemAlfat.araaKaf.init_KafHehaKaf.medi_KafHehaHeh.fina_KafHehaDal.fina_KafDalaLam.init_LamHehaLam.medi_LamHehaHeh.fina_LamHehaDal.fina_LamDalaKaf.medi_KafMemMediaKaf.init_KafMemInitaAyn.init_AynMemInitaFaa.init_FaaMemInitaHaa.init_HaaMemInitaHeh.init_HehMemInitaMem.medi_KafMemMediaSen.init_SenMemInitaSad.init_SadMemInitaMem.init_MemMemInitaMem.medi_SenMemInitaKaf.init_KafYaaIsolaBaa.init_BaaYaaIsolaHaa.init_HaaYaaIsolaMem.init_MemYaaIsolaFaa.init_FaaYaaIsolaAyn.init_AynYaaIsolaLam.init_LamYaaIsolaHeh.init_HehYaaIsolaYaa.fina_KafYaaIsolaKaf.init_KafMemIsolaLam.init_LamMemIsolaBaa.init_BaaMemIsolaMem.fina_KafMemIsolaMem.medi_MemAlfFinaaBaa.medi_BaaMemAlfFinaaMem.medi_BaaMemAlfFinaaMem.medi_AlfPostToothaAlf.fina_MemAlfFinaaBaa.init_BaaHehInitaBaa.medi_BaaHehMediaHeh.medi_BaaHehMediaHeh.medi_PostToothaLam.medi_KafLamMemFinaaLam.init_LamLamInitaLam.medi_LamLamInitaLam.medi_LamLamAlfIsolaKaf.fina_LamKafIsolaLam.fina_LamLamIsoluni0644.medi_FaLellahaLam.medi_LamLamMediaLam.medi_LamLamAlefFinaaLam.medi_LamLamMedi2aKaf.fina_LamKafFinaaLam.fina_LamLamFinaaLam.medi_LamLamMemInitaLam.medi_LamLamHehIsolaLam.medi_LamLamYaaIsolaLam.medi_LamLamMemMediaLam.medi_LamLamHehFinaaLam.medi_LamLamYaaFina uni0625.fina uni0627.fina uni0774.fina uni0773.fina uni0623.fina uni0622.fina uni0675.fina uni0672.fina uni0673.fina uni0671.fina uni06FC.fina uni063A.fina uni075E.fina uni075D.fina uni075F.fina uni06A0.fina uni0639.fina uni06FC.init uni063A.init uni075E.init uni075D.init uni075F.init uni06A0.init uni0639.init uni06FC.medi uni063A.medi uni075E.medi uni075D.medi uni075F.medi uni06A0.medi uni0639.medi uni0751.fina uni0750.fina uni0753.fina uni0680.fina uni062A.fina uni0754.fina uni062B.fina uni0679.fina uni067C.fina uni0756.fina uni0752.fina uni066E.fina uni067F.fina uni0755.fina uni067D.fina uni067E.fina uni067B.fina uni0628.fina uni067A.fina uni0777.init uni0680.init uni0776.init uni06BC.init uni0750.init uni0756.init uni0768.init uni06CE.init uni0775.init uni06BD.init uni0626.init uni066E.init uni0620.init uni064A.init uni06BB.init uni067F.init uni0755.init uni067D.init uni067E.init uni067B.init uni0628.init uni067A.init uni0751.init uni0646.init uni0753.init uni0752.init uni062A.init uni0678.init uni063D.init uni062B.init uni0679.init uni06B9.init uni0769.init uni0649.init uni067C.init uni0754.init uni06D1.init uni06D0.init uni06BA.init uni06CC.init uni0767.init uni0777.medi uni0680.medi uni0776.medi uni06BC.medi uni0750.medi uni0756.medi uni0768.medi uni06CE.medi uni0775.medi uni06BD.medi uni0626.medi uni066E.medi uni0620.medi uni064A.medi uni06BB.medi uni067F.medi uni0755.medi uni067D.medi uni067E.medi uni067B.medi uni0628.medi uni067A.medi uni0751.medi uni0646.medi uni0753.medi uni0752.medi uni062A.medi uni0678.medi uni063D.medi uni062B.medi uni0679.medi uni06B9.medi uni0769.medi uni0649.medi uni067C.medi uni0754.medi uni06D1.medi uni06D0.medi uni06BA.medi uni06CC.medi uni0767.medi uni0690.fina uni06EE.fina uni0689.fina uni0688.fina uni075A.fina uni0630.fina uni062F.fina uni0759.fina uni068C.fina uni068B.fina uni068A.fina uni068F.fina uni068E.fina uni068D.fina uni0760.fina uni0761.fina uni0641.fina uni06A1.fina uni06A2.fina uni06A3.fina uni06A4.fina uni06A5.fina uni06A6.fina uni066F.init uni0761.init uni0760.init uni0642.init uni0641.init uni06A8.init uni06A1.init uni06A2.init uni06A3.init uni06A4.init uni06A5.init uni06A6.init uni06A7.init uni066F.medi uni0761.medi uni0760.medi uni0642.medi uni0641.medi uni06A8.medi uni06A1.medi uni06A2.medi uni06A3.medi uni06A4.medi uni06A5.medi uni06A6.medi uni06A7.medi uni062E.fina uni062D.fina uni0681.fina uni0687.fina uni0685.fina uni062C.fina uni0682.fina uni0757.fina uni0684.fina uni076F.fina uni076E.fina uni0683.fina uni06BF.fina uni077C.fina uni0758.fina uni0772.fina uni0686.fina uni062E.init uni062D.init uni0681.init uni0687.init uni0685.init uni062C.init uni0682.init uni0757.init uni0684.init uni076F.init uni076E.init uni0683.init uni06BF.init uni077C.init uni0758.init uni0772.init uni0686.init uni062E.medi uni062D.medi uni0681.medi uni0687.medi uni0685.medi uni062C.medi uni0682.medi uni0757.medi uni0684.medi uni076F.medi uni076E.medi uni0683.medi uni06BF.medi uni077C.medi uni0758.medi uni0772.medi uni0686.medi uni0647.fina uni06C1.fina uni06C3.fina uni06D5.fina uni0629.fina uni0647.init uni06C1.init uni0647.medi uni06C1.medi uni063B.fina uni063C.fina uni077F.fina uni0764.fina uni0643.fina uni06B0.fina uni06B3.fina uni06B2.fina uni06AB.fina uni06AC.fina uni06AD.fina uni06AE.fina uni06AF.fina uni06A9.fina uni06B4.fina uni0763.fina uni0762.fina uni06B1.fina uni063B.init uni063C.init uni077F.init uni0764.init uni0643.init uni06B0.init uni06B3.init uni06B2.init uni06AB.init uni06AC.init uni06AD.init uni06AE.init uni06AF.init uni06A9.init uni06B4.init uni0763.init uni0762.init uni06B1.init uni063B.medi uni063C.medi uni077F.medi uni0764.medi uni0643.medi uni06B0.medi uni06B3.medi uni06B2.medi uni06AB.medi uni06AC.medi uni06AD.medi uni06AE.medi uni06AF.medi uni06A9.medi uni06B4.medi uni0763.medi uni0762.medi uni06B1.medi uni06B5.fina uni06B7.fina uni0644.fina uni06B8.fina uni06B6.fina uni076A.fina uni06B5.init uni06B7.init uni0644.init uni06B8.init uni06B6.init uni076A.init uni06B5.medi uni06B7.medi uni0644.medi uni06B8.medi uni06B6.medi uni076A.medi uni0765.fina uni0645.fina uni0766.fina uni0765.init uni0645.init uni0766.init uni0765.medi uni0645.medi uni0766.medi uni0646.fina uni0767.fina uni06BA.fina uni06BC.fina uni06BB.fina uni0768.fina uni06B9.fina uni0769.fina uni06BD.fina uni06A8.fina uni06A7.fina uni0642.fina uni066F.fina uni0691.fina uni0692.fina uni0693.fina uni0694.fina uni0695.fina uni0696.fina uni0697.fina uni0698.fina uni0699.fina uni075B.fina uni06EF.fina uni0632.fina uni0771.fina uni0631.fina uni076B.fina uni076C.fina uni069D.fina uni06FB.fina uni0636.fina uni069E.fina uni0635.fina uni069D.init uni06FB.init uni0636.init uni069E.init uni0635.init uni069D.medi uni06FB.medi uni0636.medi uni069E.medi uni0635.medi uni06FA.fina uni076D.fina uni0633.fina uni077E.fina uni077D.fina uni0634.fina uni0770.fina uni075C.fina uni069A.fina uni069B.fina uni069C.fina uni06FA.init uni076D.init uni0633.init uni077E.init uni077D.init uni0634.init uni0770.init uni075C.init uni069A.init uni069B.init uni069C.init uni06FA.medi uni076D.medi uni0633.medi uni077E.medi uni077D.medi uni0634.medi uni0770.medi uni075C.medi uni069A.medi uni069B.medi uni069C.medi uni0638.fina uni0637.fina uni069F.fina uni0638.init uni0637.init uni069F.init uni0638.medi uni0637.medi uni069F.medi uni06CB.fina uni0624.fina uni06CA.fina uni06CF.fina uni0778.fina uni06C6.fina uni06C7.fina uni06C4.fina uni06C5.fina uni0676.fina uni0677.fina uni06C8.fina uni06C9.fina uni0779.fina uni0648.fina uni0777.fina uni06D1.fina uni0775.fina uni063F.fina uni0678.fina uni063D.fina uni063E.fina uni06D0.fina uni0649.fina uni0776.fina uni06CD.fina uni06CC.fina uni0626.fina uni0620.fina uni064A.fina uni06CE.finauni06B5.medi_LamMemFinauni06B7.medi_LamMemFinauni0644.medi_LamMemFinauni06B8.medi_LamMemFinauni06B6.medi_LamMemFinauni076A.medi_LamMemFinauni0645.fina_LamMemFinauni0777.init_BaaRaaIsoluni0680.init_BaaRaaIsoluni0776.init_BaaRaaIsoluni06BC.init_BaaRaaIsoluni0750.init_BaaRaaIsoluni0756.init_BaaRaaIsoluni0768.init_BaaRaaIsoluni06CE.init_BaaRaaIsoluni0775.init_BaaRaaIsoluni06BD.init_BaaRaaIsoluni0626.init_BaaRaaIsoluni066E.init_BaaRaaIsoluni0620.init_BaaRaaIsoluni064A.init_BaaRaaIsoluni06BB.init_BaaRaaIsoluni067F.init_BaaRaaIsoluni0755.init_BaaRaaIsoluni067D.init_BaaRaaIsoluni067E.init_BaaRaaIsoluni067B.init_BaaRaaIsoluni0628.init_BaaRaaIsoluni067A.init_BaaRaaIsoluni0751.init_BaaRaaIsoluni0646.init_BaaRaaIsoluni0753.init_BaaRaaIsoluni0752.init_BaaRaaIsoluni062A.init_BaaRaaIsoluni0678.init_BaaRaaIsoluni063D.init_BaaRaaIsoluni062B.init_BaaRaaIsoluni0679.init_BaaRaaIsoluni06B9.init_BaaRaaIsoluni0769.init_BaaRaaIsoluni0649.init_BaaRaaIsoluni067C.init_BaaRaaIsoluni0754.init_BaaRaaIsoluni06D1.init_BaaRaaIsoluni06D0.init_BaaRaaIsoluni06BA.init_BaaRaaIsoluni06CC.init_BaaRaaIsoluni0767.init_BaaRaaIsoluni0691.fina_BaaRaaIsoluni0692.fina_BaaRaaIsoluni0693.fina_BaaRaaIsoluni0694.fina_BaaRaaIsoluni0695.fina_BaaRaaIsoluni0696.fina_BaaRaaIsoluni0697.fina_BaaRaaIsoluni0698.fina_BaaRaaIsoluni0699.fina_BaaRaaIsoluni075B.fina_BaaRaaIsoluni06EF.fina_BaaRaaIsoluni0632.fina_BaaRaaIsoluni0771.fina_BaaRaaIsoluni0631.fina_BaaRaaIsoluni076B.fina_BaaRaaIsoluni076C.fina_BaaRaaIsoluni06B5.medi_LamWawFinauni06B7.medi_LamWawFinauni0644.medi_LamWawFinauni06B8.medi_LamWawFinauni06B6.medi_LamWawFinauni076A.medi_LamWawFinauni06CB.fina_LamWawFinauni0624.fina_LamWawFinauni06CA.fina_LamWawFinauni06CF.fina_LamWawFinauni0778.fina_LamWawFinauni06C6.fina_LamWawFinauni06C7.fina_LamWawFinauni06C4.fina_LamWawFinauni06C5.fina_LamWawFinauni0676.fina_LamWawFinauni0677.fina_LamWawFinauni06C8.fina_LamWawFinauni06C9.fina_LamWawFinauni0779.fina_LamWawFinauni0648.fina_LamWawFinauni06B5.init_LamHaaInituni06B7.init_LamHaaInituni0644.init_LamHaaInituni06B8.init_LamHaaInituni06B6.init_LamHaaInituni076A.init_LamHaaInituni066F.medi_FaaYaaFinauni0761.medi_FaaYaaFinauni0760.medi_FaaYaaFinauni0642.medi_FaaYaaFinauni0641.medi_FaaYaaFinauni06A8.medi_FaaYaaFinauni06A1.medi_FaaYaaFinauni06A2.medi_FaaYaaFinauni06A3.medi_FaaYaaFinauni06A4.medi_FaaYaaFinauni06A5.medi_FaaYaaFinauni06A6.medi_FaaYaaFinauni06A7.medi_FaaYaaFinauni0777.fina_FaaYaaFinauni06D1.fina_FaaYaaFinauni0775.fina_FaaYaaFinauni063F.fina_FaaYaaFinauni0678.fina_FaaYaaFinauni063D.fina_FaaYaaFinauni063E.fina_FaaYaaFinauni06D0.fina_FaaYaaFinauni0649.fina_FaaYaaFinauni0776.fina_FaaYaaFinauni06CD.fina_FaaYaaFinauni06CC.fina_FaaYaaFinauni0626.fina_FaaYaaFinauni0620.fina_FaaYaaFinauni064A.fina_FaaYaaFinauni06CE.fina_FaaYaaFinauni06B5.init_LamLamHaaInituni06B7.init_LamLamHaaInituni0644.init_LamLamHaaInituni06B8.init_LamLamHaaInituni06B6.init_LamLamHaaInituni076A.init_LamLamHaaInituni06B5.medi_LamLamHaaInituni06B7.medi_LamLamHaaInituni0644.medi_LamLamHaaInituni06B8.medi_LamLamHaaInituni06B6.medi_LamLamHaaInituni076A.medi_LamLamHaaInituni062E.medi_LamLamHaaInituni062D.medi_LamLamHaaInituni0681.medi_LamLamHaaInituni0687.medi_LamLamHaaInituni0685.medi_LamLamHaaInituni062C.medi_LamLamHaaInituni0682.medi_LamLamHaaInituni0757.medi_LamLamHaaInituni0684.medi_LamLamHaaInituni076F.medi_LamLamHaaInituni076E.medi_LamLamHaaInituni0683.medi_LamLamHaaInituni06BF.medi_LamLamHaaInituni077C.medi_LamLamHaaInituni0758.medi_LamLamHaaInituni0772.medi_LamLamHaaInituni0686.medi_LamLamHaaInituni0777.medi_BaaMemFinauni0680.medi_BaaMemFinauni0776.medi_BaaMemFinauni06BC.medi_BaaMemFinauni0750.medi_BaaMemFinauni0756.medi_BaaMemFinauni0768.medi_BaaMemFinauni06CE.medi_BaaMemFinauni0775.medi_BaaMemFinauni06BD.medi_BaaMemFinauni0626.medi_BaaMemFinauni066E.medi_BaaMemFinauni0620.medi_BaaMemFinauni064A.medi_BaaMemFinauni06BB.medi_BaaMemFinauni067F.medi_BaaMemFinauni0755.medi_BaaMemFinauni067D.medi_BaaMemFinauni067E.medi_BaaMemFinauni067B.medi_BaaMemFinauni0628.medi_BaaMemFinauni067A.medi_BaaMemFinauni0751.medi_BaaMemFinauni0646.medi_BaaMemFinauni0753.medi_BaaMemFinauni0752.medi_BaaMemFinauni062A.medi_BaaMemFinauni0678.medi_BaaMemFinauni063D.medi_BaaMemFinauni062B.medi_BaaMemFinauni0679.medi_BaaMemFinauni06B9.medi_BaaMemFinauni0769.medi_BaaMemFinauni0649.medi_BaaMemFinauni067C.medi_BaaMemFinauni0754.medi_BaaMemFinauni06D1.medi_BaaMemFinauni06D0.medi_BaaMemFinauni06BA.medi_BaaMemFinauni06CC.medi_BaaMemFinauni0767.medi_BaaMemFinauni0645.fina_BaaMemFinauni069D.init_AboveHaauni06FB.init_AboveHaauni0636.init_AboveHaauni069E.init_AboveHaauni0635.init_AboveHaauni06B5.init_LamBaaMemInituni06B7.init_LamBaaMemInituni0644.init_LamBaaMemInituni06B8.init_LamBaaMemInituni06B6.init_LamBaaMemInituni076A.init_LamBaaMemInituni0777.medi_LamBaaMemInituni0680.medi_LamBaaMemInituni0776.medi_LamBaaMemInituni06BC.medi_LamBaaMemInituni0750.medi_LamBaaMemInituni0756.medi_LamBaaMemInituni0768.medi_LamBaaMemInituni06CE.medi_LamBaaMemInituni0775.medi_LamBaaMemInituni06BD.medi_LamBaaMemInituni0626.medi_LamBaaMemInituni066E.medi_LamBaaMemInituni0620.medi_LamBaaMemInituni064A.medi_LamBaaMemInituni06BB.medi_LamBaaMemInituni067F.medi_LamBaaMemInituni0755.medi_LamBaaMemInituni067D.medi_LamBaaMemInituni067E.medi_LamBaaMemInituni067B.medi_LamBaaMemInituni0628.medi_LamBaaMemInituni067A.medi_LamBaaMemInituni0751.medi_LamBaaMemInituni0646.medi_LamBaaMemInituni0753.medi_LamBaaMemInituni0752.medi_LamBaaMemInituni062A.medi_LamBaaMemInituni0678.medi_LamBaaMemInituni063D.medi_LamBaaMemInituni062B.medi_LamBaaMemInituni0679.medi_LamBaaMemInituni06B9.medi_LamBaaMemInituni0769.medi_LamBaaMemInituni0649.medi_LamBaaMemInituni067C.medi_LamBaaMemInituni0754.medi_LamBaaMemInituni06D1.medi_LamBaaMemInituni06D0.medi_LamBaaMemInituni06BA.medi_LamBaaMemInituni06CC.medi_LamBaaMemInituni0767.medi_LamBaaMemInituni0645.medi_LamBaaMemInituni0777.init_BaaDaluni0680.init_BaaDaluni0776.init_BaaDaluni06BC.init_BaaDaluni0750.init_BaaDaluni0756.init_BaaDaluni0768.init_BaaDaluni06CE.init_BaaDaluni0775.init_BaaDaluni06BD.init_BaaDaluni0626.init_BaaDaluni066E.init_BaaDaluni0620.init_BaaDaluni064A.init_BaaDaluni06BB.init_BaaDaluni067F.init_BaaDaluni0755.init_BaaDaluni067D.init_BaaDaluni067E.init_BaaDaluni067B.init_BaaDaluni0628.init_BaaDaluni067A.init_BaaDaluni0751.init_BaaDaluni0646.init_BaaDaluni0753.init_BaaDaluni0752.init_BaaDaluni062A.init_BaaDaluni0678.init_BaaDaluni063D.init_BaaDaluni062B.init_BaaDaluni0679.init_BaaDaluni06B9.init_BaaDaluni0769.init_BaaDaluni0649.init_BaaDaluni067C.init_BaaDaluni0754.init_BaaDaluni06D1.init_BaaDaluni06D0.init_BaaDaluni06BA.init_BaaDaluni06CC.init_BaaDaluni0767.init_BaaDaluni0690.fina_BaaDaluni06EE.fina_BaaDaluni0689.fina_BaaDaluni0688.fina_BaaDaluni075A.fina_BaaDaluni0630.fina_BaaDaluni062F.fina_BaaDaluni0759.fina_BaaDaluni068C.fina_BaaDaluni068B.fina_BaaDaluni068A.fina_BaaDaluni068F.fina_BaaDaluni068E.fina_BaaDaluni068D.fina_BaaDaluni0777.init_BaaMemHaaInituni0680.init_BaaMemHaaInituni0776.init_BaaMemHaaInituni06BC.init_BaaMemHaaInituni0750.init_BaaMemHaaInituni0756.init_BaaMemHaaInituni0768.init_BaaMemHaaInituni06CE.init_BaaMemHaaInituni0775.init_BaaMemHaaInituni06BD.init_BaaMemHaaInituni0626.init_BaaMemHaaInituni066E.init_BaaMemHaaInituni0620.init_BaaMemHaaInituni064A.init_BaaMemHaaInituni06BB.init_BaaMemHaaInituni067F.init_BaaMemHaaInituni0755.init_BaaMemHaaInituni067D.init_BaaMemHaaInituni067E.init_BaaMemHaaInituni067B.init_BaaMemHaaInituni0628.init_BaaMemHaaInituni067A.init_BaaMemHaaInituni0751.init_BaaMemHaaInituni0646.init_BaaMemHaaInituni0753.init_BaaMemHaaInituni0752.init_BaaMemHaaInituni062A.init_BaaMemHaaInituni0678.init_BaaMemHaaInituni063D.init_BaaMemHaaInituni062B.init_BaaMemHaaInituni0679.init_BaaMemHaaInituni06B9.init_BaaMemHaaInituni0769.init_BaaMemHaaInituni0649.init_BaaMemHaaInituni067C.init_BaaMemHaaInituni0754.init_BaaMemHaaInituni06D1.init_BaaMemHaaInituni06D0.init_BaaMemHaaInituni06BA.init_BaaMemHaaInituni06CC.init_BaaMemHaaInituni0767.init_BaaMemHaaInituni0645.medi_BaaMemHaaInituni062E.medi_BaaMemHaaInituni062D.medi_BaaMemHaaInituni0681.medi_BaaMemHaaInituni0687.medi_BaaMemHaaInituni0685.medi_BaaMemHaaInituni062C.medi_BaaMemHaaInituni0682.medi_BaaMemHaaInituni0757.medi_BaaMemHaaInituni0684.medi_BaaMemHaaInituni076F.medi_BaaMemHaaInituni076E.medi_BaaMemHaaInituni0683.medi_BaaMemHaaInituni06BF.medi_BaaMemHaaInituni077C.medi_BaaMemHaaInituni0758.medi_BaaMemHaaInituni0772.medi_BaaMemHaaInituni0686.medi_BaaMemHaaInituni0777.init_BaaBaaYaauni0680.init_BaaBaaYaauni0776.init_BaaBaaYaauni06BC.init_BaaBaaYaauni0750.init_BaaBaaYaauni0756.init_BaaBaaYaauni0768.init_BaaBaaYaauni06CE.init_BaaBaaYaauni0775.init_BaaBaaYaauni06BD.init_BaaBaaYaauni0626.init_BaaBaaYaauni066E.init_BaaBaaYaauni0620.init_BaaBaaYaauni064A.init_BaaBaaYaauni06BB.init_BaaBaaYaauni067F.init_BaaBaaYaauni0755.init_BaaBaaYaauni067D.init_BaaBaaYaauni067E.init_BaaBaaYaauni067B.init_BaaBaaYaauni0628.init_BaaBaaYaauni067A.init_BaaBaaYaauni0751.init_BaaBaaYaauni0646.init_BaaBaaYaauni0753.init_BaaBaaYaauni0752.init_BaaBaaYaauni062A.init_BaaBaaYaauni0678.init_BaaBaaYaauni063D.init_BaaBaaYaauni062B.init_BaaBaaYaauni0679.init_BaaBaaYaauni06B9.init_BaaBaaYaauni0769.init_BaaBaaYaauni0649.init_BaaBaaYaauni067C.init_BaaBaaYaauni0754.init_BaaBaaYaauni06D1.init_BaaBaaYaauni06D0.init_BaaBaaYaauni06BA.init_BaaBaaYaauni06CC.init_BaaBaaYaauni0767.init_BaaBaaYaauni0777.medi_BaaBaaYaauni0680.medi_BaaBaaYaauni0776.medi_BaaBaaYaauni06BC.medi_BaaBaaYaauni0750.medi_BaaBaaYaauni0756.medi_BaaBaaYaauni0768.medi_BaaBaaYaauni06CE.medi_BaaBaaYaauni0775.medi_BaaBaaYaauni06BD.medi_BaaBaaYaauni0626.medi_BaaBaaYaauni066E.medi_BaaBaaYaauni0620.medi_BaaBaaYaauni064A.medi_BaaBaaYaauni06BB.medi_BaaBaaYaauni067F.medi_BaaBaaYaauni0755.medi_BaaBaaYaauni067D.medi_BaaBaaYaauni067E.medi_BaaBaaYaauni067B.medi_BaaBaaYaauni0628.medi_BaaBaaYaauni067A.medi_BaaBaaYaauni0751.medi_BaaBaaYaauni0646.medi_BaaBaaYaauni0753.medi_BaaBaaYaauni0752.medi_BaaBaaYaauni062A.medi_BaaBaaYaauni0678.medi_BaaBaaYaauni063D.medi_BaaBaaYaauni062B.medi_BaaBaaYaauni0679.medi_BaaBaaYaauni06B9.medi_BaaBaaYaauni0769.medi_BaaBaaYaauni0649.medi_BaaBaaYaauni067C.medi_BaaBaaYaauni0754.medi_BaaBaaYaauni06D1.medi_BaaBaaYaauni06D0.medi_BaaBaaYaauni06BA.medi_BaaBaaYaauni06CC.medi_BaaBaaYaauni0767.medi_BaaBaaYaauni0777.fina_BaaBaaYaauni06D1.fina_BaaBaaYaauni0775.fina_BaaBaaYaauni063F.fina_BaaBaaYaauni0678.fina_BaaBaaYaauni063D.fina_BaaBaaYaauni063E.fina_BaaBaaYaauni06D0.fina_BaaBaaYaauni0649.fina_BaaBaaYaauni0776.fina_BaaBaaYaauni06CD.fina_BaaBaaYaauni06CC.fina_BaaBaaYaauni0626.fina_BaaBaaYaauni0620.fina_BaaBaaYaauni064A.fina_BaaBaaYaauni06CE.fina_BaaBaaYaauni06B5.medi_LamYaaFinauni06B7.medi_LamYaaFinauni0644.medi_LamYaaFinauni06B8.medi_LamYaaFinauni06B6.medi_LamYaaFinauni076A.medi_LamYaaFinauni0777.fina_LamYaaFinauni06D1.fina_LamYaaFinauni0775.fina_LamYaaFinauni063F.fina_LamYaaFinauni0678.fina_LamYaaFinauni063D.fina_LamYaaFinauni063E.fina_LamYaaFinauni06D0.fina_LamYaaFinauni0649.fina_LamYaaFinauni0776.fina_LamYaaFinauni06CD.fina_LamYaaFinauni06CC.fina_LamYaaFinauni0626.fina_LamYaaFinauni0620.fina_LamYaaFinauni064A.fina_LamYaaFinauni06CE.fina_LamYaaFinauni063B.init_KafBaaInituni063C.init_KafBaaInituni077F.init_KafBaaInituni0764.init_KafBaaInituni0643.init_KafBaaInituni06B0.init_KafBaaInituni06B3.init_KafBaaInituni06B2.init_KafBaaInituni06AB.init_KafBaaInituni06AC.init_KafBaaInituni06AD.init_KafBaaInituni06AE.init_KafBaaInituni06AF.init_KafBaaInituni06A9.init_KafBaaInituni06B4.init_KafBaaInituni0763.init_KafBaaInituni0762.init_KafBaaInituni06B1.init_KafBaaInituni0777.medi_KafBaaInituni0680.medi_KafBaaInituni0776.medi_KafBaaInituni06BC.medi_KafBaaInituni0750.medi_KafBaaInituni0756.medi_KafBaaInituni0768.medi_KafBaaInituni06CE.medi_KafBaaInituni0775.medi_KafBaaInituni06BD.medi_KafBaaInituni0626.medi_KafBaaInituni066E.medi_KafBaaInituni0620.medi_KafBaaInituni064A.medi_KafBaaInituni06BB.medi_KafBaaInituni067F.medi_KafBaaInituni0755.medi_KafBaaInituni067D.medi_KafBaaInituni067E.medi_KafBaaInituni067B.medi_KafBaaInituni0628.medi_KafBaaInituni067A.medi_KafBaaInituni0751.medi_KafBaaInituni0646.medi_KafBaaInituni0753.medi_KafBaaInituni0752.medi_KafBaaInituni062A.medi_KafBaaInituni0678.medi_KafBaaInituni063D.medi_KafBaaInituni062B.medi_KafBaaInituni0679.medi_KafBaaInituni06B9.medi_KafBaaInituni0769.medi_KafBaaInituni0649.medi_KafBaaInituni067C.medi_KafBaaInituni0754.medi_KafBaaInituni06D1.medi_KafBaaInituni06D0.medi_KafBaaInituni06BA.medi_KafBaaInituni06CC.medi_KafBaaInituni0767.medi_KafBaaInituni06B5.init_LamMemInituni06B7.init_LamMemInituni0644.init_LamMemInituni06B8.init_LamMemInituni06B6.init_LamMemInituni076A.init_LamMemInituni0645.medi_LamMemInituni06B5.init_LamAlfIsoluni06B7.init_LamAlfIsoluni0644.init_LamAlfIsoluni06B8.init_LamAlfIsoluni06B6.init_LamAlfIsoluni076A.init_LamAlfIsoluni0625.fina_LamAlfIsoluni0627.fina_LamAlfIsoluni0774.fina_LamAlfIsoluni0773.fina_LamAlfIsoluni0623.fina_LamAlfIsoluni0622.fina_LamAlfIsoluni0675.fina_LamAlfIsoluni0672.fina_LamAlfIsoluni0673.fina_LamAlfIsoluni0671.fina_LamAlfIsoluni06B5.init_LamHaaMemInituni06B7.init_LamHaaMemInituni0644.init_LamHaaMemInituni06B8.init_LamHaaMemInituni06B6.init_LamHaaMemInituni076A.init_LamHaaMemInituni062E.medi_LamHaaMemInituni062D.medi_LamHaaMemInituni0681.medi_LamHaaMemInituni0687.medi_LamHaaMemInituni0685.medi_LamHaaMemInituni062C.medi_LamHaaMemInituni0682.medi_LamHaaMemInituni0757.medi_LamHaaMemInituni0684.medi_LamHaaMemInituni076F.medi_LamHaaMemInituni076E.medi_LamHaaMemInituni0683.medi_LamHaaMemInituni06BF.medi_LamHaaMemInituni077C.medi_LamHaaMemInituni0758.medi_LamHaaMemInituni0772.medi_LamHaaMemInituni0686.medi_LamHaaMemInituni0645.medi_LamHaaMemInituni0777.medi_BaaBaaInituni0680.medi_BaaBaaInituni0776.medi_BaaBaaInituni06BC.medi_BaaBaaInituni0750.medi_BaaBaaInituni0756.medi_BaaBaaInituni0768.medi_BaaBaaInituni06CE.medi_BaaBaaInituni0775.medi_BaaBaaInituni06BD.medi_BaaBaaInituni0626.medi_BaaBaaInituni066E.medi_BaaBaaInituni0620.medi_BaaBaaInituni064A.medi_BaaBaaInituni06BB.medi_BaaBaaInituni067F.medi_BaaBaaInituni0755.medi_BaaBaaInituni067D.medi_BaaBaaInituni067E.medi_BaaBaaInituni067B.medi_BaaBaaInituni0628.medi_BaaBaaInituni067A.medi_BaaBaaInituni0751.medi_BaaBaaInituni0646.medi_BaaBaaInituni0753.medi_BaaBaaInituni0752.medi_BaaBaaInituni062A.medi_BaaBaaInituni0678.medi_BaaBaaInituni063D.medi_BaaBaaInituni062B.medi_BaaBaaInituni0679.medi_BaaBaaInituni06B9.medi_BaaBaaInituni0769.medi_BaaBaaInituni0649.medi_BaaBaaInituni067C.medi_BaaBaaInituni0754.medi_BaaBaaInituni06D1.medi_BaaBaaInituni06D0.medi_BaaBaaInituni06BA.medi_BaaBaaInituni06CC.medi_BaaBaaInituni0767.medi_BaaBaaInituni06FC.medi_AynYaaFinauni063A.medi_AynYaaFinauni075E.medi_AynYaaFinauni075D.medi_AynYaaFinauni075F.medi_AynYaaFinauni06A0.medi_AynYaaFinauni0639.medi_AynYaaFinauni0765.init_MemRaaIsoluni0645.init_MemRaaIsoluni0766.init_MemRaaIsoluni0691.fina_MemRaaIsoluni0692.fina_MemRaaIsoluni0693.fina_MemRaaIsoluni0694.fina_MemRaaIsoluni0695.fina_MemRaaIsoluni0696.fina_MemRaaIsoluni0697.fina_MemRaaIsoluni0698.fina_MemRaaIsoluni0699.fina_MemRaaIsoluni075B.fina_MemRaaIsoluni06EF.fina_MemRaaIsoluni0632.fina_MemRaaIsoluni0771.fina_MemRaaIsoluni0631.fina_MemRaaIsoluni076B.fina_MemRaaIsoluni076C.fina_MemRaaIsoluni066F.init_FaaHaaInituni0761.init_FaaHaaInituni0760.init_FaaHaaInituni0642.init_FaaHaaInituni0641.init_FaaHaaInituni06A8.init_FaaHaaInituni06A1.init_FaaHaaInituni06A2.init_FaaHaaInituni06A3.init_FaaHaaInituni06A4.init_FaaHaaInituni06A5.init_FaaHaaInituni06A6.init_FaaHaaInituni06A7.init_FaaHaaInituni062E.medi_FaaHaaInituni062D.medi_FaaHaaInituni0681.medi_FaaHaaInituni0687.medi_FaaHaaInituni0685.medi_FaaHaaInituni062C.medi_FaaHaaInituni0682.medi_FaaHaaInituni0757.medi_FaaHaaInituni0684.medi_FaaHaaInituni076F.medi_FaaHaaInituni076E.medi_FaaHaaInituni0683.medi_FaaHaaInituni06BF.medi_FaaHaaInituni077C.medi_FaaHaaInituni0758.medi_FaaHaaInituni0772.medi_FaaHaaInituni0686.medi_FaaHaaInituni062E.init_HaaHaaInituni062D.init_HaaHaaInituni0681.init_HaaHaaInituni0687.init_HaaHaaInituni0685.init_HaaHaaInituni062C.init_HaaHaaInituni0682.init_HaaHaaInituni0757.init_HaaHaaInituni0684.init_HaaHaaInituni076F.init_HaaHaaInituni076E.init_HaaHaaInituni0683.init_HaaHaaInituni06BF.init_HaaHaaInituni077C.init_HaaHaaInituni0758.init_HaaHaaInituni0772.init_HaaHaaInituni0686.init_HaaHaaInituni06B5.medi_LamQafFinauni06B7.medi_LamQafFinauni0644.medi_LamQafFinauni06B8.medi_LamQafFinauni06B6.medi_LamQafFinauni076A.medi_LamQafFinauni06A8.fina_LamQafFinauni06A7.fina_LamQafFinauni0642.fina_LamQafFinauni066F.fina_LamQafFinauni06FA.init_AboveHaauni076D.init_AboveHaauni0633.init_AboveHaauni077E.init_AboveHaauni077D.init_AboveHaauni0634.init_AboveHaauni0770.init_AboveHaauni075C.init_AboveHaauni069A.init_AboveHaauni069B.init_AboveHaauni069C.init_AboveHaauni0645.init_MemHaaInituni0777.init_BaaNonIsoluni0680.init_BaaNonIsoluni0776.init_BaaNonIsoluni06BC.init_BaaNonIsoluni0750.init_BaaNonIsoluni0756.init_BaaNonIsoluni0768.init_BaaNonIsoluni06CE.init_BaaNonIsoluni0775.init_BaaNonIsoluni06BD.init_BaaNonIsoluni0626.init_BaaNonIsoluni066E.init_BaaNonIsoluni0620.init_BaaNonIsoluni064A.init_BaaNonIsoluni06BB.init_BaaNonIsoluni067F.init_BaaNonIsoluni0755.init_BaaNonIsoluni067D.init_BaaNonIsoluni067E.init_BaaNonIsoluni067B.init_BaaNonIsoluni0628.init_BaaNonIsoluni067A.init_BaaNonIsoluni0751.init_BaaNonIsoluni0646.init_BaaNonIsoluni0753.init_BaaNonIsoluni0752.init_BaaNonIsoluni062A.init_BaaNonIsoluni0678.init_BaaNonIsoluni063D.init_BaaNonIsoluni062B.init_BaaNonIsoluni0679.init_BaaNonIsoluni06B9.init_BaaNonIsoluni0769.init_BaaNonIsoluni0649.init_BaaNonIsoluni067C.init_BaaNonIsoluni0754.init_BaaNonIsoluni06D1.init_BaaNonIsoluni06D0.init_BaaNonIsoluni06BA.init_BaaNonIsoluni06CC.init_BaaNonIsoluni0767.init_BaaNonIsoluni0646.fina_BaaNonIsoluni0767.fina_BaaNonIsoluni06BA.fina_BaaNonIsoluni06BC.fina_BaaNonIsoluni06BB.fina_BaaNonIsoluni0768.fina_BaaNonIsoluni06B9.fina_BaaNonIsoluni0769.fina_BaaNonIsoluni06BD.fina_BaaNonIsoluni063B.medi_KafMemFinauni063C.medi_KafMemFinauni077F.medi_KafMemFinauni0764.medi_KafMemFinauni0643.medi_KafMemFinauni06B0.medi_KafMemFinauni06B3.medi_KafMemFinauni06B2.medi_KafMemFinauni06AB.medi_KafMemFinauni06AC.medi_KafMemFinauni06AD.medi_KafMemFinauni06AE.medi_KafMemFinauni06AF.medi_KafMemFinauni06A9.medi_KafMemFinauni06B4.medi_KafMemFinauni0763.medi_KafMemFinauni0762.medi_KafMemFinauni06B1.medi_KafMemFinauni0645.fina_KafMemFinauni0777.init_BaaSenInituni0680.init_BaaSenInituni0776.init_BaaSenInituni06BC.init_BaaSenInituni0750.init_BaaSenInituni0756.init_BaaSenInituni0768.init_BaaSenInituni06CE.init_BaaSenInituni0775.init_BaaSenInituni06BD.init_BaaSenInituni0626.init_BaaSenInituni066E.init_BaaSenInituni0620.init_BaaSenInituni064A.init_BaaSenInituni06BB.init_BaaSenInituni067F.init_BaaSenInituni0755.init_BaaSenInituni067D.init_BaaSenInituni067E.init_BaaSenInituni067B.init_BaaSenInituni0628.init_BaaSenInituni067A.init_BaaSenInituni0751.init_BaaSenInituni0646.init_BaaSenInituni0753.init_BaaSenInituni0752.init_BaaSenInituni062A.init_BaaSenInituni0678.init_BaaSenInituni063D.init_BaaSenInituni062B.init_BaaSenInituni0679.init_BaaSenInituni06B9.init_BaaSenInituni0769.init_BaaSenInituni0649.init_BaaSenInituni067C.init_BaaSenInituni0754.init_BaaSenInituni06D1.init_BaaSenInituni06D0.init_BaaSenInituni06BA.init_BaaSenInituni06CC.init_BaaSenInituni0767.init_BaaSenInituni06FA.medi_BaaSenInituni076D.medi_BaaSenInituni0633.medi_BaaSenInituni077E.medi_BaaSenInituni077D.medi_BaaSenInituni0634.medi_BaaSenInituni0770.medi_BaaSenInituni075C.medi_BaaSenInituni069A.medi_BaaSenInituni069B.medi_BaaSenInituni069C.medi_BaaSenInituni0777.medi_BaaRaaFinauni0680.medi_BaaRaaFinauni0776.medi_BaaRaaFinauni06BC.medi_BaaRaaFinauni0750.medi_BaaRaaFinauni0756.medi_BaaRaaFinauni0768.medi_BaaRaaFinauni06CE.medi_BaaRaaFinauni0775.medi_BaaRaaFinauni06BD.medi_BaaRaaFinauni0626.medi_BaaRaaFinauni066E.medi_BaaRaaFinauni0620.medi_BaaRaaFinauni064A.medi_BaaRaaFinauni06BB.medi_BaaRaaFinauni067F.medi_BaaRaaFinauni0755.medi_BaaRaaFinauni067D.medi_BaaRaaFinauni067E.medi_BaaRaaFinauni067B.medi_BaaRaaFinauni0628.medi_BaaRaaFinauni067A.medi_BaaRaaFinauni0751.medi_BaaRaaFinauni0646.medi_BaaRaaFinauni0753.medi_BaaRaaFinauni0752.medi_BaaRaaFinauni062A.medi_BaaRaaFinauni0678.medi_BaaRaaFinauni063D.medi_BaaRaaFinauni062B.medi_BaaRaaFinauni0679.medi_BaaRaaFinauni06B9.medi_BaaRaaFinauni0769.medi_BaaRaaFinauni0649.medi_BaaRaaFinauni067C.medi_BaaRaaFinauni0754.medi_BaaRaaFinauni06D1.medi_BaaRaaFinauni06D0.medi_BaaRaaFinauni06BA.medi_BaaRaaFinauni06CC.medi_BaaRaaFinauni0767.medi_BaaRaaFinauni0691.fina_BaaRaaFinauni0692.fina_BaaRaaFinauni0693.fina_BaaRaaFinauni0694.fina_BaaRaaFinauni0695.fina_BaaRaaFinauni0696.fina_BaaRaaFinauni0697.fina_BaaRaaFinauni0698.fina_BaaRaaFinauni0699.fina_BaaRaaFinauni075B.fina_BaaRaaFinauni06EF.fina_BaaRaaFinauni0632.fina_BaaRaaFinauni0771.fina_BaaRaaFinauni0631.fina_BaaRaaFinauni076B.fina_BaaRaaFinauni076C.fina_BaaRaaFinauni063B.medi_KafRaaFinauni063C.medi_KafRaaFinauni077F.medi_KafRaaFinauni0764.medi_KafRaaFinauni0643.medi_KafRaaFinauni06B0.medi_KafRaaFinauni06B3.medi_KafRaaFinauni06B2.medi_KafRaaFinauni06AB.medi_KafRaaFinauni06AC.medi_KafRaaFinauni06AD.medi_KafRaaFinauni06AE.medi_KafRaaFinauni06AF.medi_KafRaaFinauni06A9.medi_KafRaaFinauni06B4.medi_KafRaaFinauni0763.medi_KafRaaFinauni0762.medi_KafRaaFinauni06B1.medi_KafRaaFinauni0691.fina_KafRaaFinauni0692.fina_KafRaaFinauni0693.fina_KafRaaFinauni0694.fina_KafRaaFinauni0695.fina_KafRaaFinauni0696.fina_KafRaaFinauni0697.fina_KafRaaFinauni0698.fina_KafRaaFinauni0699.fina_KafRaaFinauni075B.fina_KafRaaFinauni06EF.fina_KafRaaFinauni0632.fina_KafRaaFinauni0771.fina_KafRaaFinauni0631.fina_KafRaaFinauni076B.fina_KafRaaFinauni076C.fina_KafRaaFinauni06B5.init_LamHehInituni06B7.init_LamHehInituni0644.init_LamHehInituni06B8.init_LamHehInituni06B6.init_LamHehInituni076A.init_LamHehInituni0647.medi_LamHehInituni06C1.medi_LamHehInituni0645.init_MemHaaMemInituni062E.medi_MemHaaMemInituni062D.medi_MemHaaMemInituni0681.medi_MemHaaMemInituni0687.medi_MemHaaMemInituni0685.medi_MemHaaMemInituni062C.medi_MemHaaMemInituni0682.medi_MemHaaMemInituni0757.medi_MemHaaMemInituni0684.medi_MemHaaMemInituni076F.medi_MemHaaMemInituni076E.medi_MemHaaMemInituni0683.medi_MemHaaMemInituni06BF.medi_MemHaaMemInituni077C.medi_MemHaaMemInituni0758.medi_MemHaaMemInituni0772.medi_MemHaaMemInituni0686.medi_MemHaaMemInituni0777.init_BaaMemInituni0680.init_BaaMemInituni0776.init_BaaMemInituni06BC.init_BaaMemInituni0750.init_BaaMemInituni0756.init_BaaMemInituni0768.init_BaaMemInituni06CE.init_BaaMemInituni0775.init_BaaMemInituni06BD.init_BaaMemInituni0626.init_BaaMemInituni066E.init_BaaMemInituni0620.init_BaaMemInituni064A.init_BaaMemInituni06BB.init_BaaMemInituni067F.init_BaaMemInituni0755.init_BaaMemInituni067D.init_BaaMemInituni067E.init_BaaMemInituni067B.init_BaaMemInituni0628.init_BaaMemInituni067A.init_BaaMemInituni0751.init_BaaMemInituni0646.init_BaaMemInituni0753.init_BaaMemInituni0752.init_BaaMemInituni062A.init_BaaMemInituni0678.init_BaaMemInituni063D.init_BaaMemInituni062B.init_BaaMemInituni0679.init_BaaMemInituni06B9.init_BaaMemInituni0769.init_BaaMemInituni0649.init_BaaMemInituni067C.init_BaaMemInituni0754.init_BaaMemInituni06D1.init_BaaMemInituni06D0.init_BaaMemInituni06BA.init_BaaMemInituni06CC.init_BaaMemInituni0767.init_BaaMemInituni0645.medi_BaaMemInituni06FA.init_SenHaaInituni076D.init_SenHaaInituni0633.init_SenHaaInituni077E.init_SenHaaInituni077D.init_SenHaaInituni0634.init_SenHaaInituni0770.init_SenHaaInituni075C.init_SenHaaInituni069A.init_SenHaaInituni069B.init_SenHaaInituni069C.init_SenHaaInituni063B.init_KafRaaIsoluni063C.init_KafRaaIsoluni077F.init_KafRaaIsoluni0764.init_KafRaaIsoluni0643.init_KafRaaIsoluni06B0.init_KafRaaIsoluni06B3.init_KafRaaIsoluni06B2.init_KafRaaIsoluni06AB.init_KafRaaIsoluni06AC.init_KafRaaIsoluni06AD.init_KafRaaIsoluni06AE.init_KafRaaIsoluni06AF.init_KafRaaIsoluni06A9.init_KafRaaIsoluni06B4.init_KafRaaIsoluni0763.init_KafRaaIsoluni0762.init_KafRaaIsoluni06B1.init_KafRaaIsoluni0691.fina_KafRaaIsoluni0692.fina_KafRaaIsoluni0693.fina_KafRaaIsoluni0694.fina_KafRaaIsoluni0695.fina_KafRaaIsoluni0696.fina_KafRaaIsoluni0697.fina_KafRaaIsoluni0698.fina_KafRaaIsoluni0699.fina_KafRaaIsoluni075B.fina_KafRaaIsoluni06EF.fina_KafRaaIsoluni0632.fina_KafRaaIsoluni0771.fina_KafRaaIsoluni0631.fina_KafRaaIsoluni076B.fina_KafRaaIsoluni076C.fina_KafRaaIsoluni06FC.init_AynHaaInituni063A.init_AynHaaInituni075E.init_AynHaaInituni075D.init_AynHaaInituni075F.init_AynHaaInituni06A0.init_AynHaaInituni0639.init_AynHaaInituni063B.medi_KafYaaFinauni063C.medi_KafYaaFinauni077F.medi_KafYaaFinauni0764.medi_KafYaaFinauni0643.medi_KafYaaFinauni06B0.medi_KafYaaFinauni06B3.medi_KafYaaFinauni06B2.medi_KafYaaFinauni06AB.medi_KafYaaFinauni06AC.medi_KafYaaFinauni06AD.medi_KafYaaFinauni06AE.medi_KafYaaFinauni06AF.medi_KafYaaFinauni06A9.medi_KafYaaFinauni06B4.medi_KafYaaFinauni0763.medi_KafYaaFinauni0762.medi_KafYaaFinauni06B1.medi_KafYaaFinauni0777.fina_KafYaaFinauni06D1.fina_KafYaaFinauni0775.fina_KafYaaFinauni063F.fina_KafYaaFinauni0678.fina_KafYaaFinauni063D.fina_KafYaaFinauni063E.fina_KafYaaFinauni06D0.fina_KafYaaFinauni0649.fina_KafYaaFinauni0776.fina_KafYaaFinauni06CD.fina_KafYaaFinauni06CC.fina_KafYaaFinauni0626.fina_KafYaaFinauni0620.fina_KafYaaFinauni064A.fina_KafYaaFinauni06CE.fina_KafYaaFinauni06B5.init_LamMemHaaInituni06B7.init_LamMemHaaInituni0644.init_LamMemHaaInituni06B8.init_LamMemHaaInituni06B6.init_LamMemHaaInituni076A.init_LamMemHaaInituni0645.medi_LamMemHaaInituni062E.medi_LamMemHaaInituni062D.medi_LamMemHaaInituni0681.medi_LamMemHaaInituni0687.medi_LamMemHaaInituni0685.medi_LamMemHaaInituni062C.medi_LamMemHaaInituni0682.medi_LamMemHaaInituni0757.medi_LamMemHaaInituni0684.medi_LamMemHaaInituni076F.medi_LamMemHaaInituni076E.medi_LamMemHaaInituni0683.medi_LamMemHaaInituni06BF.medi_LamMemHaaInituni077C.medi_LamMemHaaInituni0758.medi_LamMemHaaInituni0772.medi_LamMemHaaInituni0686.medi_LamMemHaaInituni06B5.medi_LamAlfFinauni06B7.medi_LamAlfFinauni0644.medi_LamAlfFinauni06B8.medi_LamAlfFinauni06B6.medi_LamAlfFinauni076A.medi_LamAlfFinauni0625.fina_LamAlfFinauni0627.fina_LamAlfFinauni0774.fina_LamAlfFinauni0773.fina_LamAlfFinauni0623.fina_LamAlfFinauni0622.fina_LamAlfFinauni0675.fina_LamAlfFinauni0672.fina_LamAlfFinauni0673.fina_LamAlfFinauni0671.fina_LamAlfFinauni06B5.medi_LamMemMediuni06B7.medi_LamMemMediuni0644.medi_LamMemMediuni06B8.medi_LamMemMediuni06B6.medi_LamMemMediuni076A.medi_LamMemMediuni0765.medi_LamMemMediuni0645.medi_LamMemMediuni0766.medi_LamMemMediuni0777.init_BaaBaaHaaInituni0680.init_BaaBaaHaaInituni0776.init_BaaBaaHaaInituni06BC.init_BaaBaaHaaInituni0750.init_BaaBaaHaaInituni0756.init_BaaBaaHaaInituni0768.init_BaaBaaHaaInituni06CE.init_BaaBaaHaaInituni0775.init_BaaBaaHaaInituni06BD.init_BaaBaaHaaInituni0626.init_BaaBaaHaaInituni066E.init_BaaBaaHaaInituni0620.init_BaaBaaHaaInituni064A.init_BaaBaaHaaInituni06BB.init_BaaBaaHaaInituni067F.init_BaaBaaHaaInituni0755.init_BaaBaaHaaInituni067D.init_BaaBaaHaaInituni067E.init_BaaBaaHaaInituni067B.init_BaaBaaHaaInituni0628.init_BaaBaaHaaInituni067A.init_BaaBaaHaaInituni0751.init_BaaBaaHaaInituni0646.init_BaaBaaHaaInituni0753.init_BaaBaaHaaInituni0752.init_BaaBaaHaaInituni062A.init_BaaBaaHaaInituni0678.init_BaaBaaHaaInituni063D.init_BaaBaaHaaInituni062B.init_BaaBaaHaaInituni0679.init_BaaBaaHaaInituni06B9.init_BaaBaaHaaInituni0769.init_BaaBaaHaaInituni0649.init_BaaBaaHaaInituni067C.init_BaaBaaHaaInituni0754.init_BaaBaaHaaInituni06D1.init_BaaBaaHaaInituni06D0.init_BaaBaaHaaInituni06BA.init_BaaBaaHaaInituni06CC.init_BaaBaaHaaInituni0767.init_BaaBaaHaaInituni0777.medi_BaaBaaHaaInituni0680.medi_BaaBaaHaaInituni0776.medi_BaaBaaHaaInituni06BC.medi_BaaBaaHaaInituni0750.medi_BaaBaaHaaInituni0756.medi_BaaBaaHaaInituni0768.medi_BaaBaaHaaInituni06CE.medi_BaaBaaHaaInituni0775.medi_BaaBaaHaaInituni06BD.medi_BaaBaaHaaInituni0626.medi_BaaBaaHaaInituni066E.medi_BaaBaaHaaInituni0620.medi_BaaBaaHaaInituni064A.medi_BaaBaaHaaInituni06BB.medi_BaaBaaHaaInituni067F.medi_BaaBaaHaaInituni0755.medi_BaaBaaHaaInituni067D.medi_BaaBaaHaaInituni067E.medi_BaaBaaHaaInituni067B.medi_BaaBaaHaaInituni0628.medi_BaaBaaHaaInituni067A.medi_BaaBaaHaaInituni0751.medi_BaaBaaHaaInituni0646.medi_BaaBaaHaaInituni0753.medi_BaaBaaHaaInituni0752.medi_BaaBaaHaaInituni062A.medi_BaaBaaHaaInituni0678.medi_BaaBaaHaaInituni063D.medi_BaaBaaHaaInituni062B.medi_BaaBaaHaaInituni0679.medi_BaaBaaHaaInituni06B9.medi_BaaBaaHaaInituni0769.medi_BaaBaaHaaInituni0649.medi_BaaBaaHaaInituni067C.medi_BaaBaaHaaInituni0754.medi_BaaBaaHaaInituni06D1.medi_BaaBaaHaaInituni06D0.medi_BaaBaaHaaInituni06BA.medi_BaaBaaHaaInituni06CC.medi_BaaBaaHaaInituni0767.medi_BaaBaaHaaInituni062E.medi_BaaBaaHaaInituni062D.medi_BaaBaaHaaInituni0681.medi_BaaBaaHaaInituni0687.medi_BaaBaaHaaInituni0685.medi_BaaBaaHaaInituni062C.medi_BaaBaaHaaInituni0682.medi_BaaBaaHaaInituni0757.medi_BaaBaaHaaInituni0684.medi_BaaBaaHaaInituni076F.medi_BaaBaaHaaInituni076E.medi_BaaBaaHaaInituni0683.medi_BaaBaaHaaInituni06BF.medi_BaaBaaHaaInituni077C.medi_BaaBaaHaaInituni0758.medi_BaaBaaHaaInituni0772.medi_BaaBaaHaaInituni0686.medi_BaaBaaHaaInituni0777.medi_SenBaaMemInituni0680.medi_SenBaaMemInituni0776.medi_SenBaaMemInituni06BC.medi_SenBaaMemInituni0750.medi_SenBaaMemInituni0756.medi_SenBaaMemInituni0768.medi_SenBaaMemInituni06CE.medi_SenBaaMemInituni0775.medi_SenBaaMemInituni06BD.medi_SenBaaMemInituni0626.medi_SenBaaMemInituni066E.medi_SenBaaMemInituni0620.medi_SenBaaMemInituni064A.medi_SenBaaMemInituni06BB.medi_SenBaaMemInituni067F.medi_SenBaaMemInituni0755.medi_SenBaaMemInituni067D.medi_SenBaaMemInituni067E.medi_SenBaaMemInituni067B.medi_SenBaaMemInituni0628.medi_SenBaaMemInituni067A.medi_SenBaaMemInituni0751.medi_SenBaaMemInituni0646.medi_SenBaaMemInituni0753.medi_SenBaaMemInituni0752.medi_SenBaaMemInituni062A.medi_SenBaaMemInituni0678.medi_SenBaaMemInituni063D.medi_SenBaaMemInituni062B.medi_SenBaaMemInituni0679.medi_SenBaaMemInituni06B9.medi_SenBaaMemInituni0769.medi_SenBaaMemInituni0649.medi_SenBaaMemInituni067C.medi_SenBaaMemInituni0754.medi_SenBaaMemInituni06D1.medi_SenBaaMemInituni06D0.medi_SenBaaMemInituni06BA.medi_SenBaaMemInituni06CC.medi_SenBaaMemInituni0767.medi_SenBaaMemInituni0645.medi_SenBaaMemInituni0777.init_BaaBaaIsoluni0680.init_BaaBaaIsoluni0776.init_BaaBaaIsoluni06BC.init_BaaBaaIsoluni0750.init_BaaBaaIsoluni0756.init_BaaBaaIsoluni0768.init_BaaBaaIsoluni06CE.init_BaaBaaIsoluni0775.init_BaaBaaIsoluni06BD.init_BaaBaaIsoluni0626.init_BaaBaaIsoluni066E.init_BaaBaaIsoluni0620.init_BaaBaaIsoluni064A.init_BaaBaaIsoluni06BB.init_BaaBaaIsoluni067F.init_BaaBaaIsoluni0755.init_BaaBaaIsoluni067D.init_BaaBaaIsoluni067E.init_BaaBaaIsoluni067B.init_BaaBaaIsoluni0628.init_BaaBaaIsoluni067A.init_BaaBaaIsoluni0751.init_BaaBaaIsoluni0646.init_BaaBaaIsoluni0753.init_BaaBaaIsoluni0752.init_BaaBaaIsoluni062A.init_BaaBaaIsoluni0678.init_BaaBaaIsoluni063D.init_BaaBaaIsoluni062B.init_BaaBaaIsoluni0679.init_BaaBaaIsoluni06B9.init_BaaBaaIsoluni0769.init_BaaBaaIsoluni0649.init_BaaBaaIsoluni067C.init_BaaBaaIsoluni0754.init_BaaBaaIsoluni06D1.init_BaaBaaIsoluni06D0.init_BaaBaaIsoluni06BA.init_BaaBaaIsoluni06CC.init_BaaBaaIsoluni0767.init_BaaBaaIsoluni0751.fina_BaaBaaIsoluni0750.fina_BaaBaaIsoluni0753.fina_BaaBaaIsoluni0680.fina_BaaBaaIsoluni062A.fina_BaaBaaIsoluni0754.fina_BaaBaaIsoluni062B.fina_BaaBaaIsoluni0679.fina_BaaBaaIsoluni067C.fina_BaaBaaIsoluni0756.fina_BaaBaaIsoluni0752.fina_BaaBaaIsoluni066E.fina_BaaBaaIsoluni067F.fina_BaaBaaIsoluni0755.fina_BaaBaaIsoluni067D.fina_BaaBaaIsoluni067E.fina_BaaBaaIsoluni067B.fina_BaaBaaIsoluni0628.fina_BaaBaaIsoluni067A.fina_BaaBaaIsoluni0777.init_BaaBaaMemInituni0680.init_BaaBaaMemInituni0776.init_BaaBaaMemInituni06BC.init_BaaBaaMemInituni0750.init_BaaBaaMemInituni0756.init_BaaBaaMemInituni0768.init_BaaBaaMemInituni06CE.init_BaaBaaMemInituni0775.init_BaaBaaMemInituni06BD.init_BaaBaaMemInituni0626.init_BaaBaaMemInituni066E.init_BaaBaaMemInituni0620.init_BaaBaaMemInituni064A.init_BaaBaaMemInituni06BB.init_BaaBaaMemInituni067F.init_BaaBaaMemInituni0755.init_BaaBaaMemInituni067D.init_BaaBaaMemInituni067E.init_BaaBaaMemInituni067B.init_BaaBaaMemInituni0628.init_BaaBaaMemInituni067A.init_BaaBaaMemInituni0751.init_BaaBaaMemInituni0646.init_BaaBaaMemInituni0753.init_BaaBaaMemInituni0752.init_BaaBaaMemInituni062A.init_BaaBaaMemInituni0678.init_BaaBaaMemInituni063D.init_BaaBaaMemInituni062B.init_BaaBaaMemInituni0679.init_BaaBaaMemInituni06B9.init_BaaBaaMemInituni0769.init_BaaBaaMemInituni0649.init_BaaBaaMemInituni067C.init_BaaBaaMemInituni0754.init_BaaBaaMemInituni06D1.init_BaaBaaMemInituni06D0.init_BaaBaaMemInituni06BA.init_BaaBaaMemInituni06CC.init_BaaBaaMemInituni0767.init_BaaBaaMemInituni0777.medi_BaaBaaMemInituni0680.medi_BaaBaaMemInituni0776.medi_BaaBaaMemInituni06BC.medi_BaaBaaMemInituni0750.medi_BaaBaaMemInituni0756.medi_BaaBaaMemInituni0768.medi_BaaBaaMemInituni06CE.medi_BaaBaaMemInituni0775.medi_BaaBaaMemInituni06BD.medi_BaaBaaMemInituni0626.medi_BaaBaaMemInituni066E.medi_BaaBaaMemInituni0620.medi_BaaBaaMemInituni064A.medi_BaaBaaMemInituni06BB.medi_BaaBaaMemInituni067F.medi_BaaBaaMemInituni0755.medi_BaaBaaMemInituni067D.medi_BaaBaaMemInituni067E.medi_BaaBaaMemInituni067B.medi_BaaBaaMemInituni0628.medi_BaaBaaMemInituni067A.medi_BaaBaaMemInituni0751.medi_BaaBaaMemInituni0646.medi_BaaBaaMemInituni0753.medi_BaaBaaMemInituni0752.medi_BaaBaaMemInituni062A.medi_BaaBaaMemInituni0678.medi_BaaBaaMemInituni063D.medi_BaaBaaMemInituni062B.medi_BaaBaaMemInituni0679.medi_BaaBaaMemInituni06B9.medi_BaaBaaMemInituni0769.medi_BaaBaaMemInituni0649.medi_BaaBaaMemInituni067C.medi_BaaBaaMemInituni0754.medi_BaaBaaMemInituni06D1.medi_BaaBaaMemInituni06D0.medi_BaaBaaMemInituni06BA.medi_BaaBaaMemInituni06CC.medi_BaaBaaMemInituni0767.medi_BaaBaaMemInituni0645.medi_BaaBaaMemInituni063B.medi_KafBaaMediuni063C.medi_KafBaaMediuni077F.medi_KafBaaMediuni0764.medi_KafBaaMediuni0643.medi_KafBaaMediuni06B0.medi_KafBaaMediuni06B3.medi_KafBaaMediuni06B2.medi_KafBaaMediuni06AB.medi_KafBaaMediuni06AC.medi_KafBaaMediuni06AD.medi_KafBaaMediuni06AE.medi_KafBaaMediuni06AF.medi_KafBaaMediuni06A9.medi_KafBaaMediuni06B4.medi_KafBaaMediuni0763.medi_KafBaaMediuni0762.medi_KafBaaMediuni06B1.medi_KafBaaMediuni0777.medi_KafBaaMediuni0680.medi_KafBaaMediuni0776.medi_KafBaaMediuni06BC.medi_KafBaaMediuni0750.medi_KafBaaMediuni0756.medi_KafBaaMediuni0768.medi_KafBaaMediuni06CE.medi_KafBaaMediuni0775.medi_KafBaaMediuni06BD.medi_KafBaaMediuni0626.medi_KafBaaMediuni066E.medi_KafBaaMediuni0620.medi_KafBaaMediuni064A.medi_KafBaaMediuni06BB.medi_KafBaaMediuni067F.medi_KafBaaMediuni0755.medi_KafBaaMediuni067D.medi_KafBaaMediuni067E.medi_KafBaaMediuni067B.medi_KafBaaMediuni0628.medi_KafBaaMediuni067A.medi_KafBaaMediuni0751.medi_KafBaaMediuni0646.medi_KafBaaMediuni0753.medi_KafBaaMediuni0752.medi_KafBaaMediuni062A.medi_KafBaaMediuni0678.medi_KafBaaMediuni063D.medi_KafBaaMediuni062B.medi_KafBaaMediuni0679.medi_KafBaaMediuni06B9.medi_KafBaaMediuni0769.medi_KafBaaMediuni0649.medi_KafBaaMediuni067C.medi_KafBaaMediuni0754.medi_KafBaaMediuni06D1.medi_KafBaaMediuni06D0.medi_KafBaaMediuni06BA.medi_KafBaaMediuni06CC.medi_KafBaaMediuni0767.medi_KafBaaMediuni0777.medi_BaaNonFinauni0680.medi_BaaNonFinauni0776.medi_BaaNonFinauni06BC.medi_BaaNonFinauni0750.medi_BaaNonFinauni0756.medi_BaaNonFinauni0768.medi_BaaNonFinauni06CE.medi_BaaNonFinauni0775.medi_BaaNonFinauni06BD.medi_BaaNonFinauni0626.medi_BaaNonFinauni066E.medi_BaaNonFinauni0620.medi_BaaNonFinauni064A.medi_BaaNonFinauni06BB.medi_BaaNonFinauni067F.medi_BaaNonFinauni0755.medi_BaaNonFinauni067D.medi_BaaNonFinauni067E.medi_BaaNonFinauni067B.medi_BaaNonFinauni0628.medi_BaaNonFinauni067A.medi_BaaNonFinauni0751.medi_BaaNonFinauni0646.medi_BaaNonFinauni0753.medi_BaaNonFinauni0752.medi_BaaNonFinauni062A.medi_BaaNonFinauni0678.medi_BaaNonFinauni063D.medi_BaaNonFinauni062B.medi_BaaNonFinauni0679.medi_BaaNonFinauni06B9.medi_BaaNonFinauni0769.medi_BaaNonFinauni0649.medi_BaaNonFinauni067C.medi_BaaNonFinauni0754.medi_BaaNonFinauni06D1.medi_BaaNonFinauni06D0.medi_BaaNonFinauni06BA.medi_BaaNonFinauni06CC.medi_BaaNonFinauni0767.medi_BaaNonFinauni0646.fina_BaaNonFinauni0767.fina_BaaNonFinauni06BA.fina_BaaNonFinauni06BC.fina_BaaNonFinauni06BB.fina_BaaNonFinauni0768.fina_BaaNonFinauni06B9.fina_BaaNonFinauni0769.fina_BaaNonFinauni06BD.fina_BaaNonFinauni062E.init_HaaRaaIsoluni062D.init_HaaRaaIsoluni0681.init_HaaRaaIsoluni0687.init_HaaRaaIsoluni0685.init_HaaRaaIsoluni062C.init_HaaRaaIsoluni0682.init_HaaRaaIsoluni0757.init_HaaRaaIsoluni0684.init_HaaRaaIsoluni076F.init_HaaRaaIsoluni076E.init_HaaRaaIsoluni0683.init_HaaRaaIsoluni06BF.init_HaaRaaIsoluni077C.init_HaaRaaIsoluni0758.init_HaaRaaIsoluni0772.init_HaaRaaIsoluni0686.init_HaaRaaIsoluni0691.fina_HaaRaaIsoluni0692.fina_HaaRaaIsoluni0693.fina_HaaRaaIsoluni0694.fina_HaaRaaIsoluni0695.fina_HaaRaaIsoluni0696.fina_HaaRaaIsoluni0697.fina_HaaRaaIsoluni0698.fina_HaaRaaIsoluni0699.fina_HaaRaaIsoluni075B.fina_HaaRaaIsoluni06EF.fina_HaaRaaIsoluni0632.fina_HaaRaaIsoluni0771.fina_HaaRaaIsoluni0631.fina_HaaRaaIsoluni076B.fina_HaaRaaIsoluni076C.fina_HaaRaaIsoluni0647.init_HehHaaInituni06C1.init_HehHaaInituni06B5.init_LamRaaIsoluni06B7.init_LamRaaIsoluni0644.init_LamRaaIsoluni06B8.init_LamRaaIsoluni06B6.init_LamRaaIsoluni076A.init_LamRaaIsoluni0691.fina_LamRaaIsoluni0692.fina_LamRaaIsoluni0693.fina_LamRaaIsoluni0694.fina_LamRaaIsoluni0695.fina_LamRaaIsoluni0696.fina_LamRaaIsoluni0697.fina_LamRaaIsoluni0698.fina_LamRaaIsoluni0699.fina_LamRaaIsoluni075B.fina_LamRaaIsoluni06EF.fina_LamRaaIsoluni0632.fina_LamRaaIsoluni0771.fina_LamRaaIsoluni0631.fina_LamRaaIsoluni076B.fina_LamRaaIsoluni076C.fina_LamRaaIsoluni069D.init_SadHaaInituni06FB.init_SadHaaInituni0636.init_SadHaaInituni069E.init_SadHaaInituni0635.init_SadHaaInituni062E.medi_SadHaaInituni062D.medi_SadHaaInituni0681.medi_SadHaaInituni0687.medi_SadHaaInituni0685.medi_SadHaaInituni062C.medi_SadHaaInituni0682.medi_SadHaaInituni0757.medi_SadHaaInituni0684.medi_SadHaaInituni076F.medi_SadHaaInituni076E.medi_SadHaaInituni0683.medi_SadHaaInituni06BF.medi_SadHaaInituni077C.medi_SadHaaInituni0758.medi_SadHaaInituni0772.medi_SadHaaInituni0686.medi_SadHaaInituni0777.medi_BaaYaaFinauni0680.medi_BaaYaaFinauni0776.medi_BaaYaaFinauni06BC.medi_BaaYaaFinauni0750.medi_BaaYaaFinauni0756.medi_BaaYaaFinauni0768.medi_BaaYaaFinauni06CE.medi_BaaYaaFinauni0775.medi_BaaYaaFinauni06BD.medi_BaaYaaFinauni0626.medi_BaaYaaFinauni066E.medi_BaaYaaFinauni0620.medi_BaaYaaFinauni064A.medi_BaaYaaFinauni06BB.medi_BaaYaaFinauni067F.medi_BaaYaaFinauni0755.medi_BaaYaaFinauni067D.medi_BaaYaaFinauni067E.medi_BaaYaaFinauni067B.medi_BaaYaaFinauni0628.medi_BaaYaaFinauni067A.medi_BaaYaaFinauni0751.medi_BaaYaaFinauni0646.medi_BaaYaaFinauni0753.medi_BaaYaaFinauni0752.medi_BaaYaaFinauni062A.medi_BaaYaaFinauni0678.medi_BaaYaaFinauni063D.medi_BaaYaaFinauni062B.medi_BaaYaaFinauni0679.medi_BaaYaaFinauni06B9.medi_BaaYaaFinauni0769.medi_BaaYaaFinauni0649.medi_BaaYaaFinauni067C.medi_BaaYaaFinauni0754.medi_BaaYaaFinauni06D1.medi_BaaYaaFinauni06D0.medi_BaaYaaFinauni06BA.medi_BaaYaaFinauni06CC.medi_BaaYaaFinauni0767.medi_BaaYaaFinauni0777.fina_BaaYaaFinauni06D1.fina_BaaYaaFinauni0775.fina_BaaYaaFinauni063F.fina_BaaYaaFinauni0678.fina_BaaYaaFinauni063D.fina_BaaYaaFinauni063E.fina_BaaYaaFinauni06D0.fina_BaaYaaFinauni0649.fina_BaaYaaFinauni0776.fina_BaaYaaFinauni06CD.fina_BaaYaaFinauni06CC.fina_BaaYaaFinauni0626.fina_BaaYaaFinauni0620.fina_BaaYaaFinauni064A.fina_BaaYaaFinauni06CE.fina_BaaYaaFinauni0777.init_BaaSenAltInituni0680.init_BaaSenAltInituni0776.init_BaaSenAltInituni06BC.init_BaaSenAltInituni0750.init_BaaSenAltInituni0756.init_BaaSenAltInituni0768.init_BaaSenAltInituni06CE.init_BaaSenAltInituni0775.init_BaaSenAltInituni06BD.init_BaaSenAltInituni0626.init_BaaSenAltInituni066E.init_BaaSenAltInituni0620.init_BaaSenAltInituni064A.init_BaaSenAltInituni06BB.init_BaaSenAltInituni067F.init_BaaSenAltInituni0755.init_BaaSenAltInituni067D.init_BaaSenAltInituni067E.init_BaaSenAltInituni067B.init_BaaSenAltInituni0628.init_BaaSenAltInituni067A.init_BaaSenAltInituni0751.init_BaaSenAltInituni0646.init_BaaSenAltInituni0753.init_BaaSenAltInituni0752.init_BaaSenAltInituni062A.init_BaaSenAltInituni0678.init_BaaSenAltInituni063D.init_BaaSenAltInituni062B.init_BaaSenAltInituni0679.init_BaaSenAltInituni06B9.init_BaaSenAltInituni0769.init_BaaSenAltInituni0649.init_BaaSenAltInituni067C.init_BaaSenAltInituni0754.init_BaaSenAltInituni06D1.init_BaaSenAltInituni06D0.init_BaaSenAltInituni06BA.init_BaaSenAltInituni06CC.init_BaaSenAltInituni0767.init_BaaSenAltInituni06FA.medi_BaaSenAltInituni076D.medi_BaaSenAltInituni0633.medi_BaaSenAltInituni077E.medi_BaaSenAltInituni077D.medi_BaaSenAltInituni0634.medi_BaaSenAltInituni0770.medi_BaaSenAltInituni075C.medi_BaaSenAltInituni069A.medi_BaaSenAltInituni069B.medi_BaaSenAltInituni069C.medi_BaaSenAltInituni0691.fina_PostToothuni0692.fina_PostToothuni0693.fina_PostToothuni0694.fina_PostToothuni0695.fina_PostToothuni0696.fina_PostToothuni0697.fina_PostToothuni0698.fina_PostToothuni0699.fina_PostToothuni075B.fina_PostToothuni06EF.fina_PostToothuni0632.fina_PostToothuni0771.fina_PostToothuni0631.fina_PostToothuni076B.fina_PostToothuni076C.fina_PostToothuni0777.fina_PostToothuni06D1.fina_PostToothuni0775.fina_PostToothuni063F.fina_PostToothuni0678.fina_PostToothuni063D.fina_PostToothuni063E.fina_PostToothuni06D0.fina_PostToothuni0649.fina_PostToothuni0776.fina_PostToothuni06CD.fina_PostToothuni06CC.fina_PostToothuni0626.fina_PostToothuni0620.fina_PostToothuni064A.fina_PostToothuni06CE.fina_PostToothuni0777.init_AboveHaauni0680.init_AboveHaauni0776.init_AboveHaauni06BC.init_AboveHaauni0750.init_AboveHaauni0756.init_AboveHaauni0768.init_AboveHaauni06CE.init_AboveHaauni0775.init_AboveHaauni06BD.init_AboveHaauni0626.init_AboveHaauni066E.init_AboveHaauni0620.init_AboveHaauni064A.init_AboveHaauni06BB.init_AboveHaauni067F.init_AboveHaauni0755.init_AboveHaauni067D.init_AboveHaauni067E.init_AboveHaauni067B.init_AboveHaauni0628.init_AboveHaauni067A.init_AboveHaauni0751.init_AboveHaauni0646.init_AboveHaauni0753.init_AboveHaauni0752.init_AboveHaauni062A.init_AboveHaauni0678.init_AboveHaauni063D.init_AboveHaauni062B.init_AboveHaauni0679.init_AboveHaauni06B9.init_AboveHaauni0769.init_AboveHaauni0649.init_AboveHaauni067C.init_AboveHaauni0754.init_AboveHaauni06D1.init_AboveHaauni06D0.init_AboveHaauni06BA.init_AboveHaauni06CC.init_AboveHaauni0767.init_AboveHaauni0777.init_BaaHaaInituni0680.init_BaaHaaInituni0776.init_BaaHaaInituni06BC.init_BaaHaaInituni0750.init_BaaHaaInituni0756.init_BaaHaaInituni0768.init_BaaHaaInituni06CE.init_BaaHaaInituni0775.init_BaaHaaInituni06BD.init_BaaHaaInituni0626.init_BaaHaaInituni066E.init_BaaHaaInituni0620.init_BaaHaaInituni064A.init_BaaHaaInituni06BB.init_BaaHaaInituni067F.init_BaaHaaInituni0755.init_BaaHaaInituni067D.init_BaaHaaInituni067E.init_BaaHaaInituni067B.init_BaaHaaInituni0628.init_BaaHaaInituni067A.init_BaaHaaInituni0751.init_BaaHaaInituni0646.init_BaaHaaInituni0753.init_BaaHaaInituni0752.init_BaaHaaInituni062A.init_BaaHaaInituni0678.init_BaaHaaInituni063D.init_BaaHaaInituni062B.init_BaaHaaInituni0679.init_BaaHaaInituni06B9.init_BaaHaaInituni0769.init_BaaHaaInituni0649.init_BaaHaaInituni067C.init_BaaHaaInituni0754.init_BaaHaaInituni06D1.init_BaaHaaInituni06D0.init_BaaHaaInituni06BA.init_BaaHaaInituni06CC.init_BaaHaaInituni0767.init_BaaHaaInituni0777.init_BaaHaaMemInituni0680.init_BaaHaaMemInituni0776.init_BaaHaaMemInituni06BC.init_BaaHaaMemInituni0750.init_BaaHaaMemInituni0756.init_BaaHaaMemInituni0768.init_BaaHaaMemInituni06CE.init_BaaHaaMemInituni0775.init_BaaHaaMemInituni06BD.init_BaaHaaMemInituni0626.init_BaaHaaMemInituni066E.init_BaaHaaMemInituni0620.init_BaaHaaMemInituni064A.init_BaaHaaMemInituni06BB.init_BaaHaaMemInituni067F.init_BaaHaaMemInituni0755.init_BaaHaaMemInituni067D.init_BaaHaaMemInituni067E.init_BaaHaaMemInituni067B.init_BaaHaaMemInituni0628.init_BaaHaaMemInituni067A.init_BaaHaaMemInituni0751.init_BaaHaaMemInituni0646.init_BaaHaaMemInituni0753.init_BaaHaaMemInituni0752.init_BaaHaaMemInituni062A.init_BaaHaaMemInituni0678.init_BaaHaaMemInituni063D.init_BaaHaaMemInituni062B.init_BaaHaaMemInituni0679.init_BaaHaaMemInituni06B9.init_BaaHaaMemInituni0769.init_BaaHaaMemInituni0649.init_BaaHaaMemInituni067C.init_BaaHaaMemInituni0754.init_BaaHaaMemInituni06D1.init_BaaHaaMemInituni06D0.init_BaaHaaMemInituni06BA.init_BaaHaaMemInituni06CC.init_BaaHaaMemInituni0767.init_BaaHaaMemInituni062E.medi_BaaHaaMemInituni062D.medi_BaaHaaMemInituni0681.medi_BaaHaaMemInituni0687.medi_BaaHaaMemInituni0685.medi_BaaHaaMemInituni062C.medi_BaaHaaMemInituni0682.medi_BaaHaaMemInituni0757.medi_BaaHaaMemInituni0684.medi_BaaHaaMemInituni076F.medi_BaaHaaMemInituni076E.medi_BaaHaaMemInituni0683.medi_BaaHaaMemInituni06BF.medi_BaaHaaMemInituni077C.medi_BaaHaaMemInituni0758.medi_BaaHaaMemInituni0772.medi_BaaHaaMemInituni0686.medi_BaaHaaMemInituni062E.fina_AboveHaaIsoluni062D.fina_AboveHaaIsoluni0681.fina_AboveHaaIsoluni0687.fina_AboveHaaIsoluni0685.fina_AboveHaaIsoluni062C.fina_AboveHaaIsoluni0682.fina_AboveHaaIsoluni0757.fina_AboveHaaIsoluni0684.fina_AboveHaaIsoluni076F.fina_AboveHaaIsoluni076E.fina_AboveHaaIsoluni0683.fina_AboveHaaIsoluni06BF.fina_AboveHaaIsoluni077C.fina_AboveHaaIsoluni0758.fina_AboveHaaIsoluni0772.fina_AboveHaaIsoluni0686.fina_AboveHaaIsoluni06B5.init_LamHaaHaaInituni06B7.init_LamHaaHaaInituni0644.init_LamHaaHaaInituni06B8.init_LamHaaHaaInituni06B6.init_LamHaaHaaInituni076A.init_LamHaaHaaInituni06FC.init_Finjaniuni063A.init_Finjaniuni075E.init_Finjaniuni075D.init_Finjaniuni075F.init_Finjaniuni06A0.init_Finjaniuni0639.init_Finjaniuni062E.init_Finjaniuni062D.init_Finjaniuni0681.init_Finjaniuni0687.init_Finjaniuni0685.init_Finjaniuni062C.init_Finjaniuni0682.init_Finjaniuni0757.init_Finjaniuni0684.init_Finjaniuni076F.init_Finjaniuni076E.init_Finjaniuni0683.init_Finjaniuni06BF.init_Finjaniuni077C.init_Finjaniuni0758.init_Finjaniuni0772.init_Finjaniuni0686.init_Finjaniuni062E.medi_Finjaniuni062D.medi_Finjaniuni0681.medi_Finjaniuni0687.medi_Finjaniuni0685.medi_Finjaniuni062C.medi_Finjaniuni0682.medi_Finjaniuni0757.medi_Finjaniuni0684.medi_Finjaniuni076F.medi_Finjaniuni076E.medi_Finjaniuni0683.medi_Finjaniuni06BF.medi_Finjaniuni077C.medi_Finjaniuni0758.medi_Finjaniuni0772.medi_Finjaniuni0686.medi_Finjaniuni06FA.init_PreYaauni076D.init_PreYaauni0633.init_PreYaauni077E.init_PreYaauni077D.init_PreYaauni0634.init_PreYaauni0770.init_PreYaauni075C.init_PreYaauni069A.init_PreYaauni069B.init_PreYaauni069C.init_PreYaauni06FA.medi_PreYaauni076D.medi_PreYaauni0633.medi_PreYaauni077E.medi_PreYaauni077D.medi_PreYaauni0634.medi_PreYaauni0770.medi_PreYaauni075C.medi_PreYaauni069A.medi_PreYaauni069B.medi_PreYaauni069C.medi_PreYaauni069D.init_PreYaauni06FB.init_PreYaauni0636.init_PreYaauni069E.init_PreYaauni0635.init_PreYaauni069D.medi_PreYaauni06FB.medi_PreYaauni0636.medi_PreYaauni069E.medi_PreYaauni0635.medi_PreYaauni0777.init_Highuni0680.init_Highuni0776.init_Highuni06BC.init_Highuni0750.init_Highuni0756.init_Highuni0768.init_Highuni06CE.init_Highuni0775.init_Highuni06BD.init_Highuni0626.init_Highuni066E.init_Highuni0620.init_Highuni064A.init_Highuni06BB.init_Highuni067F.init_Highuni0755.init_Highuni067D.init_Highuni067E.init_Highuni067B.init_Highuni0628.init_Highuni067A.init_Highuni0751.init_Highuni0646.init_Highuni0753.init_Highuni0752.init_Highuni062A.init_Highuni0678.init_Highuni063D.init_Highuni062B.init_Highuni0679.init_Highuni06B9.init_Highuni0769.init_Highuni0649.init_Highuni067C.init_Highuni0754.init_Highuni06D1.init_Highuni06D0.init_Highuni06BA.init_Highuni06CC.init_Highuni0767.init_Highuni0777.medi_Highuni0680.medi_Highuni0776.medi_Highuni06BC.medi_Highuni0750.medi_Highuni0756.medi_Highuni0768.medi_Highuni06CE.medi_Highuni0775.medi_Highuni06BD.medi_Highuni0626.medi_Highuni066E.medi_Highuni0620.medi_Highuni064A.medi_Highuni06BB.medi_Highuni067F.medi_Highuni0755.medi_Highuni067D.medi_Highuni067E.medi_Highuni067B.medi_Highuni0628.medi_Highuni067A.medi_Highuni0751.medi_Highuni0646.medi_Highuni0753.medi_Highuni0752.medi_Highuni062A.medi_Highuni0678.medi_Highuni063D.medi_Highuni062B.medi_Highuni0679.medi_Highuni06B9.medi_Highuni0769.medi_Highuni0649.medi_Highuni067C.medi_Highuni0754.medi_Highuni06D1.medi_Highuni06D0.medi_Highuni06BA.medi_Highuni06CC.medi_Highuni0767.medi_Highuni06FA.fina_BaaSenuni076D.fina_BaaSenuni0633.fina_BaaSenuni077E.fina_BaaSenuni077D.fina_BaaSenuni0634.fina_BaaSenuni0770.fina_BaaSenuni075C.fina_BaaSenuni069A.fina_BaaSenuni069B.fina_BaaSenuni069C.fina_BaaSenuni0645.fina_PostToothuni0777.init_Wideuni0680.init_Wideuni0776.init_Wideuni06BC.init_Wideuni0750.init_Wideuni0756.init_Wideuni0768.init_Wideuni06CE.init_Wideuni0775.init_Wideuni06BD.init_Wideuni0626.init_Wideuni066E.init_Wideuni0620.init_Wideuni064A.init_Wideuni06BB.init_Wideuni067F.init_Wideuni0755.init_Wideuni067D.init_Wideuni067E.init_Wideuni067B.init_Wideuni0628.init_Wideuni067A.init_Wideuni0751.init_Wideuni0646.init_Wideuni0753.init_Wideuni0752.init_Wideuni062A.init_Wideuni0678.init_Wideuni063D.init_Wideuni062B.init_Wideuni0679.init_Wideuni06B9.init_Wideuni0769.init_Wideuni0649.init_Wideuni067C.init_Wideuni0754.init_Wideuni06D1.init_Wideuni06D0.init_Wideuni06BA.init_Wideuni06CC.init_Wideuni0767.init_Wideuni062E.medi_HaaHaaInituni062D.medi_HaaHaaInituni0681.medi_HaaHaaInituni0687.medi_HaaHaaInituni0685.medi_HaaHaaInituni062C.medi_HaaHaaInituni0682.medi_HaaHaaInituni0757.medi_HaaHaaInituni0684.medi_HaaHaaInituni076F.medi_HaaHaaInituni076E.medi_HaaHaaInituni0683.medi_HaaHaaInituni06BF.medi_HaaHaaInituni077C.medi_HaaHaaInituni0758.medi_HaaHaaInituni0772.medi_HaaHaaInituni0686.medi_HaaHaaInituni062E.medi_AynHaaInituni062D.medi_AynHaaInituni0681.medi_AynHaaInituni0687.medi_AynHaaInituni0685.medi_AynHaaInituni062C.medi_AynHaaInituni0682.medi_AynHaaInituni0757.medi_AynHaaInituni0684.medi_AynHaaInituni076F.medi_AynHaaInituni076E.medi_AynHaaInituni0683.medi_AynHaaInituni06BF.medi_AynHaaInituni077C.medi_AynHaaInituni0758.medi_AynHaaInituni0772.medi_AynHaaInituni0686.medi_AynHaaInituni0645.medi_LamMemInitTatweeluni0647.init_AboveHaauni06C1.init_AboveHaauni062E.init_AboveHaauni062D.init_AboveHaauni0681.init_AboveHaauni0687.init_AboveHaauni0685.init_AboveHaauni062C.init_AboveHaauni0682.init_AboveHaauni0757.init_AboveHaauni0684.init_AboveHaauni076F.init_AboveHaauni076E.init_AboveHaauni0683.init_AboveHaauni06BF.init_AboveHaauni077C.init_AboveHaauni0758.init_AboveHaauni0772.init_AboveHaauni0686.init_AboveHaauni06FC.init_AboveHaauni063A.init_AboveHaauni075E.init_AboveHaauni075D.init_AboveHaauni075F.init_AboveHaauni06A0.init_AboveHaauni0639.init_AboveHaauni062E.fina_AboveHaaIsol2uni062D.fina_AboveHaaIsol2uni0681.fina_AboveHaaIsol2uni0687.fina_AboveHaaIsol2uni0685.fina_AboveHaaIsol2uni062C.fina_AboveHaaIsol2uni0682.fina_AboveHaaIsol2uni0757.fina_AboveHaaIsol2uni0684.fina_AboveHaaIsol2uni076F.fina_AboveHaaIsol2uni076E.fina_AboveHaaIsol2uni0683.fina_AboveHaaIsol2uni06BF.fina_AboveHaaIsol2uni077C.fina_AboveHaaIsol2uni0758.fina_AboveHaaIsol2uni0772.fina_AboveHaaIsol2uni0686.fina_AboveHaaIsol2uni0645.init_AboveHaauni063B.init_AboveHaauni063C.init_AboveHaauni077F.init_AboveHaauni0764.init_AboveHaauni0643.init_AboveHaauni06B0.init_AboveHaauni06B3.init_AboveHaauni06B2.init_AboveHaauni06AB.init_AboveHaauni06AC.init_AboveHaauni06AD.init_AboveHaauni06AE.init_AboveHaauni06AF.init_AboveHaauni06A9.init_AboveHaauni06B4.init_AboveHaauni0763.init_AboveHaauni0762.init_AboveHaauni06B1.init_AboveHaauni063B.init_KafLamuni063C.init_KafLamuni077F.init_KafLamuni0764.init_KafLamuni0643.init_KafLamuni06B0.init_KafLamuni06B3.init_KafLamuni06B2.init_KafLamuni06AB.init_KafLamuni06AC.init_KafLamuni06AD.init_KafLamuni06AE.init_KafLamuni06AF.init_KafLamuni06A9.init_KafLamuni06B4.init_KafLamuni0763.init_KafLamuni0762.init_KafLamuni06B1.init_KafLamuni063B.fina_KafKafFinauni063C.fina_KafKafFinauni077F.fina_KafKafFinauni0764.fina_KafKafFinauni0643.fina_KafKafFinauni06B0.fina_KafKafFinauni06B3.fina_KafKafFinauni06B2.fina_KafKafFinauni06AB.fina_KafKafFinauni06AC.fina_KafKafFinauni06AD.fina_KafKafFinauni06AE.fina_KafKafFinauni06AF.fina_KafKafFinauni06A9.fina_KafKafFinauni06B4.fina_KafKafFinauni0763.fina_KafKafFinauni0762.fina_KafKafFinauni06B1.fina_KafKafFinauni06B5.medi_KafLamuni06B7.medi_KafLamuni0644.medi_KafLamuni06B8.medi_KafLamuni06B6.medi_KafLamuni076A.medi_KafLamuni06B5.medi_KafLamMemMediuni06B7.medi_KafLamMemMediuni0644.medi_KafLamMemMediuni06B8.medi_KafLamMemMediuni06B6.medi_KafLamMemMediuni076A.medi_KafLamMemMediuni063B.medi_KafLamuni063C.medi_KafLamuni077F.medi_KafLamuni0764.medi_KafLamuni0643.medi_KafLamuni06B0.medi_KafLamuni06B3.medi_KafLamuni06B2.medi_KafLamuni06AB.medi_KafLamuni06AC.medi_KafLamuni06AD.medi_KafLamuni06AE.medi_KafLamuni06AF.medi_KafLamuni06A9.medi_KafLamuni06B4.medi_KafLamuni0763.medi_KafLamuni0762.medi_KafLamuni06B1.medi_KafLamuni06B5.medi_KafLamHehIsoluni06B7.medi_KafLamHehIsoluni0644.medi_KafLamHehIsoluni06B8.medi_KafLamHehIsoluni06B6.medi_KafLamHehIsoluni076A.medi_KafLamHehIsoluni06B5.medi_KafLamYaauni06B7.medi_KafLamYaauni0644.medi_KafLamYaauni06B8.medi_KafLamYaauni06B6.medi_KafLamYaauni076A.medi_KafLamYaauni06B5.medi_KafLamAlfuni06B7.medi_KafLamAlfuni0644.medi_KafLamAlfuni06B8.medi_KafLamAlfuni06B6.medi_KafLamAlfuni076A.medi_KafLamAlfuni06B5.fina_KafLamuni06B7.fina_KafLamuni0644.fina_KafLamuni06B8.fina_KafLamuni06B6.fina_KafLamuni076A.fina_KafLamuni0625.fina_KafAlfuni0627.fina_KafAlfuni0774.fina_KafAlfuni0773.fina_KafAlfuni0623.fina_KafAlfuni0622.fina_KafAlfuni0675.fina_KafAlfuni0672.fina_KafAlfuni0673.fina_KafAlfuni0671.fina_KafAlfuni063B.init_KafMemAlfuni063C.init_KafMemAlfuni077F.init_KafMemAlfuni0764.init_KafMemAlfuni0643.init_KafMemAlfuni06B0.init_KafMemAlfuni06B3.init_KafMemAlfuni06B2.init_KafMemAlfuni06AB.init_KafMemAlfuni06AC.init_KafMemAlfuni06AD.init_KafMemAlfuni06AE.init_KafMemAlfuni06AF.init_KafMemAlfuni06A9.init_KafMemAlfuni06B4.init_KafMemAlfuni0763.init_KafMemAlfuni0762.init_KafMemAlfuni06B1.init_KafMemAlfuni063B.medi_KafMemAlfuni063C.medi_KafMemAlfuni077F.medi_KafMemAlfuni0764.medi_KafMemAlfuni0643.medi_KafMemAlfuni06B0.medi_KafMemAlfuni06B3.medi_KafMemAlfuni06B2.medi_KafMemAlfuni06AB.medi_KafMemAlfuni06AC.medi_KafMemAlfuni06AD.medi_KafMemAlfuni06AE.medi_KafMemAlfuni06AF.medi_KafMemAlfuni06A9.medi_KafMemAlfuni06B4.medi_KafMemAlfuni0763.medi_KafMemAlfuni0762.medi_KafMemAlfuni06B1.medi_KafMemAlfuni0645.medi_KafMemAlfuni06B5.medi_KafMemLamuni06B7.medi_KafMemLamuni0644.medi_KafMemLamuni06B8.medi_KafMemLamuni06B6.medi_KafMemLamuni076A.medi_KafMemLamuni06B5.fina_KafMemLamuni06B7.fina_KafMemLamuni0644.fina_KafMemLamuni06B8.fina_KafMemLamuni06B6.fina_KafMemLamuni076A.fina_KafMemLamuni0625.fina_KafMemAlfuni0627.fina_KafMemAlfuni0774.fina_KafMemAlfuni0773.fina_KafMemAlfuni0623.fina_KafMemAlfuni0622.fina_KafMemAlfuni0675.fina_KafMemAlfuni0672.fina_KafMemAlfuni0673.fina_KafMemAlfuni0671.fina_KafMemAlfuni063B.init_KafHehuni063C.init_KafHehuni077F.init_KafHehuni0764.init_KafHehuni0643.init_KafHehuni06B0.init_KafHehuni06B3.init_KafHehuni06B2.init_KafHehuni06AB.init_KafHehuni06AC.init_KafHehuni06AD.init_KafHehuni06AE.init_KafHehuni06AF.init_KafHehuni06A9.init_KafHehuni06B4.init_KafHehuni0763.init_KafHehuni0762.init_KafHehuni06B1.init_KafHehuni063B.medi_KafHehuni063C.medi_KafHehuni077F.medi_KafHehuni0764.medi_KafHehuni0643.medi_KafHehuni06B0.medi_KafHehuni06B3.medi_KafHehuni06B2.medi_KafHehuni06AB.medi_KafHehuni06AC.medi_KafHehuni06AD.medi_KafHehuni06AE.medi_KafHehuni06AF.medi_KafHehuni06A9.medi_KafHehuni06B4.medi_KafHehuni0763.medi_KafHehuni0762.medi_KafHehuni06B1.medi_KafHehuni0647.fina_KafHehuni06C1.fina_KafHehuni06C3.fina_KafHehuni06D5.fina_KafHehuni0629.fina_KafHehuni0690.fina_KafDaluni06EE.fina_KafDaluni0689.fina_KafDaluni0688.fina_KafDaluni075A.fina_KafDaluni0630.fina_KafDaluni062F.fina_KafDaluni0759.fina_KafDaluni068C.fina_KafDaluni068B.fina_KafDaluni068A.fina_KafDaluni068F.fina_KafDaluni068E.fina_KafDaluni068D.fina_KafDaluni06B5.init_LamHehuni06B7.init_LamHehuni0644.init_LamHehuni06B8.init_LamHehuni06B6.init_LamHehuni076A.init_LamHehuni06B5.medi_LamHehuni06B7.medi_LamHehuni0644.medi_LamHehuni06B8.medi_LamHehuni06B6.medi_LamHehuni076A.medi_LamHehuni0647.fina_LamHehuni06C1.fina_LamHehuni06C3.fina_LamHehuni06D5.fina_LamHehuni0629.fina_LamHehuni0690.fina_LamDaluni06EE.fina_LamDaluni0689.fina_LamDaluni0688.fina_LamDaluni075A.fina_LamDaluni0630.fina_LamDaluni062F.fina_LamDaluni0759.fina_LamDaluni068C.fina_LamDaluni068B.fina_LamDaluni068A.fina_LamDaluni068F.fina_LamDaluni068E.fina_LamDaluni068D.fina_LamDaluni063B.medi_KafMemMediuni063C.medi_KafMemMediuni077F.medi_KafMemMediuni0764.medi_KafMemMediuni0643.medi_KafMemMediuni06B0.medi_KafMemMediuni06B3.medi_KafMemMediuni06B2.medi_KafMemMediuni06AB.medi_KafMemMediuni06AC.medi_KafMemMediuni06AD.medi_KafMemMediuni06AE.medi_KafMemMediuni06AF.medi_KafMemMediuni06A9.medi_KafMemMediuni06B4.medi_KafMemMediuni0763.medi_KafMemMediuni0762.medi_KafMemMediuni06B1.medi_KafMemMediuni063B.init_KafMemInituni063C.init_KafMemInituni077F.init_KafMemInituni0764.init_KafMemInituni0643.init_KafMemInituni06B0.init_KafMemInituni06B3.init_KafMemInituni06B2.init_KafMemInituni06AB.init_KafMemInituni06AC.init_KafMemInituni06AD.init_KafMemInituni06AE.init_KafMemInituni06AF.init_KafMemInituni06A9.init_KafMemInituni06B4.init_KafMemInituni0763.init_KafMemInituni0762.init_KafMemInituni06B1.init_KafMemInituni06FC.init_AynMemInituni063A.init_AynMemInituni075E.init_AynMemInituni075D.init_AynMemInituni075F.init_AynMemInituni06A0.init_AynMemInituni0639.init_AynMemInituni066F.init_FaaMemInituni0761.init_FaaMemInituni0760.init_FaaMemInituni0642.init_FaaMemInituni0641.init_FaaMemInituni06A8.init_FaaMemInituni06A1.init_FaaMemInituni06A2.init_FaaMemInituni06A3.init_FaaMemInituni06A4.init_FaaMemInituni06A5.init_FaaMemInituni06A6.init_FaaMemInituni06A7.init_FaaMemInituni062E.init_HaaMemInituni062D.init_HaaMemInituni0681.init_HaaMemInituni0687.init_HaaMemInituni0685.init_HaaMemInituni062C.init_HaaMemInituni0682.init_HaaMemInituni0757.init_HaaMemInituni0684.init_HaaMemInituni076F.init_HaaMemInituni076E.init_HaaMemInituni0683.init_HaaMemInituni06BF.init_HaaMemInituni077C.init_HaaMemInituni0758.init_HaaMemInituni0772.init_HaaMemInituni0686.init_HaaMemInituni0647.init_HehMemInituni06C1.init_HehMemInituni0645.medi_KafMemMediuni06FA.init_SenMemInituni076D.init_SenMemInituni0633.init_SenMemInituni077E.init_SenMemInituni077D.init_SenMemInituni0634.init_SenMemInituni0770.init_SenMemInituni075C.init_SenMemInituni069A.init_SenMemInituni069B.init_SenMemInituni069C.init_SenMemInituni069D.init_SadMemInituni06FB.init_SadMemInituni0636.init_SadMemInituni069E.init_SadMemInituni0635.init_SadMemInituni0645.init_MemMemInituni0645.medi_SenMemInituni063B.init_KafYaaIsoluni063C.init_KafYaaIsoluni077F.init_KafYaaIsoluni0764.init_KafYaaIsoluni0643.init_KafYaaIsoluni06B0.init_KafYaaIsoluni06B3.init_KafYaaIsoluni06B2.init_KafYaaIsoluni06AB.init_KafYaaIsoluni06AC.init_KafYaaIsoluni06AD.init_KafYaaIsoluni06AE.init_KafYaaIsoluni06AF.init_KafYaaIsoluni06A9.init_KafYaaIsoluni06B4.init_KafYaaIsoluni0763.init_KafYaaIsoluni0762.init_KafYaaIsoluni06B1.init_KafYaaIsoluni0777.init_BaaYaaIsoluni0680.init_BaaYaaIsoluni0776.init_BaaYaaIsoluni06BC.init_BaaYaaIsoluni0750.init_BaaYaaIsoluni0756.init_BaaYaaIsoluni0768.init_BaaYaaIsoluni06CE.init_BaaYaaIsoluni0775.init_BaaYaaIsoluni06BD.init_BaaYaaIsoluni0626.init_BaaYaaIsoluni066E.init_BaaYaaIsoluni0620.init_BaaYaaIsoluni064A.init_BaaYaaIsoluni06BB.init_BaaYaaIsoluni067F.init_BaaYaaIsoluni0755.init_BaaYaaIsoluni067D.init_BaaYaaIsoluni067E.init_BaaYaaIsoluni067B.init_BaaYaaIsoluni0628.init_BaaYaaIsoluni067A.init_BaaYaaIsoluni0751.init_BaaYaaIsoluni0646.init_BaaYaaIsoluni0753.init_BaaYaaIsoluni0752.init_BaaYaaIsoluni062A.init_BaaYaaIsoluni0678.init_BaaYaaIsoluni063D.init_BaaYaaIsoluni062B.init_BaaYaaIsoluni0679.init_BaaYaaIsoluni06B9.init_BaaYaaIsoluni0769.init_BaaYaaIsoluni0649.init_BaaYaaIsoluni067C.init_BaaYaaIsoluni0754.init_BaaYaaIsoluni06D1.init_BaaYaaIsoluni06D0.init_BaaYaaIsoluni06BA.init_BaaYaaIsoluni06CC.init_BaaYaaIsoluni0767.init_BaaYaaIsoluni062E.init_HaaYaaIsoluni062D.init_HaaYaaIsoluni0681.init_HaaYaaIsoluni0687.init_HaaYaaIsoluni0685.init_HaaYaaIsoluni062C.init_HaaYaaIsoluni0682.init_HaaYaaIsoluni0757.init_HaaYaaIsoluni0684.init_HaaYaaIsoluni076F.init_HaaYaaIsoluni076E.init_HaaYaaIsoluni0683.init_HaaYaaIsoluni06BF.init_HaaYaaIsoluni077C.init_HaaYaaIsoluni0758.init_HaaYaaIsoluni0772.init_HaaYaaIsoluni0686.init_HaaYaaIsoluni0765.init_MemYaaIsoluni0645.init_MemYaaIsoluni0766.init_MemYaaIsoluni066F.init_FaaYaaIsoluni0761.init_FaaYaaIsoluni0760.init_FaaYaaIsoluni0642.init_FaaYaaIsoluni0641.init_FaaYaaIsoluni06A8.init_FaaYaaIsoluni06A1.init_FaaYaaIsoluni06A2.init_FaaYaaIsoluni06A3.init_FaaYaaIsoluni06A4.init_FaaYaaIsoluni06A5.init_FaaYaaIsoluni06A6.init_FaaYaaIsoluni06A7.init_FaaYaaIsoluni06FC.init_AynYaaIsoluni063A.init_AynYaaIsoluni075E.init_AynYaaIsoluni075D.init_AynYaaIsoluni075F.init_AynYaaIsoluni06A0.init_AynYaaIsoluni0639.init_AynYaaIsoluni06B5.init_LamYaaIsoluni06B7.init_LamYaaIsoluni0644.init_LamYaaIsoluni06B8.init_LamYaaIsoluni06B6.init_LamYaaIsoluni076A.init_LamYaaIsoluni0647.init_HehYaaIsoluni06C1.init_HehYaaIsoluni0777.fina_KafYaaIsoluni06D1.fina_KafYaaIsoluni0775.fina_KafYaaIsoluni063F.fina_KafYaaIsoluni0678.fina_KafYaaIsoluni063D.fina_KafYaaIsoluni063E.fina_KafYaaIsoluni06D0.fina_KafYaaIsoluni0649.fina_KafYaaIsoluni0776.fina_KafYaaIsoluni06CD.fina_KafYaaIsoluni06CC.fina_KafYaaIsoluni0626.fina_KafYaaIsoluni0620.fina_KafYaaIsoluni064A.fina_KafYaaIsoluni06CE.fina_KafYaaIsoluni063B.init_KafMemIsoluni063C.init_KafMemIsoluni077F.init_KafMemIsoluni0764.init_KafMemIsoluni0643.init_KafMemIsoluni06B0.init_KafMemIsoluni06B3.init_KafMemIsoluni06B2.init_KafMemIsoluni06AB.init_KafMemIsoluni06AC.init_KafMemIsoluni06AD.init_KafMemIsoluni06AE.init_KafMemIsoluni06AF.init_KafMemIsoluni06A9.init_KafMemIsoluni06B4.init_KafMemIsoluni0763.init_KafMemIsoluni0762.init_KafMemIsoluni06B1.init_KafMemIsoluni06B5.init_LamMemIsoluni06B7.init_LamMemIsoluni0644.init_LamMemIsoluni06B8.init_LamMemIsoluni06B6.init_LamMemIsoluni076A.init_LamMemIsoluni0777.init_BaaMemIsoluni0680.init_BaaMemIsoluni0776.init_BaaMemIsoluni06BC.init_BaaMemIsoluni0750.init_BaaMemIsoluni0756.init_BaaMemIsoluni0768.init_BaaMemIsoluni06CE.init_BaaMemIsoluni0775.init_BaaMemIsoluni06BD.init_BaaMemIsoluni0626.init_BaaMemIsoluni066E.init_BaaMemIsoluni0620.init_BaaMemIsoluni064A.init_BaaMemIsoluni06BB.init_BaaMemIsoluni067F.init_BaaMemIsoluni0755.init_BaaMemIsoluni067D.init_BaaMemIsoluni067E.init_BaaMemIsoluni067B.init_BaaMemIsoluni0628.init_BaaMemIsoluni067A.init_BaaMemIsoluni0751.init_BaaMemIsoluni0646.init_BaaMemIsoluni0753.init_BaaMemIsoluni0752.init_BaaMemIsoluni062A.init_BaaMemIsoluni0678.init_BaaMemIsoluni063D.init_BaaMemIsoluni062B.init_BaaMemIsoluni0679.init_BaaMemIsoluni06B9.init_BaaMemIsoluni0769.init_BaaMemIsoluni0649.init_BaaMemIsoluni067C.init_BaaMemIsoluni0754.init_BaaMemIsoluni06D1.init_BaaMemIsoluni06D0.init_BaaMemIsoluni06BA.init_BaaMemIsoluni06CC.init_BaaMemIsoluni0767.init_BaaMemIsoluni0645.fina_KafMemIsoluni0645.medi_MemAlfFinauni0777.medi_BaaMemAlfFinauni0680.medi_BaaMemAlfFinauni0776.medi_BaaMemAlfFinauni06BC.medi_BaaMemAlfFinauni0750.medi_BaaMemAlfFinauni0756.medi_BaaMemAlfFinauni0768.medi_BaaMemAlfFinauni06CE.medi_BaaMemAlfFinauni0775.medi_BaaMemAlfFinauni06BD.medi_BaaMemAlfFinauni0626.medi_BaaMemAlfFinauni066E.medi_BaaMemAlfFinauni0620.medi_BaaMemAlfFinauni064A.medi_BaaMemAlfFinauni06BB.medi_BaaMemAlfFinauni067F.medi_BaaMemAlfFinauni0755.medi_BaaMemAlfFinauni067D.medi_BaaMemAlfFinauni067E.medi_BaaMemAlfFinauni067B.medi_BaaMemAlfFinauni0628.medi_BaaMemAlfFinauni067A.medi_BaaMemAlfFinauni0751.medi_BaaMemAlfFinauni0646.medi_BaaMemAlfFinauni0753.medi_BaaMemAlfFinauni0752.medi_BaaMemAlfFinauni062A.medi_BaaMemAlfFinauni0678.medi_BaaMemAlfFinauni063D.medi_BaaMemAlfFinauni062B.medi_BaaMemAlfFinauni0679.medi_BaaMemAlfFinauni06B9.medi_BaaMemAlfFinauni0769.medi_BaaMemAlfFinauni0649.medi_BaaMemAlfFinauni067C.medi_BaaMemAlfFinauni0754.medi_BaaMemAlfFinauni06D1.medi_BaaMemAlfFinauni06D0.medi_BaaMemAlfFinauni06BA.medi_BaaMemAlfFinauni06CC.medi_BaaMemAlfFinauni0767.medi_BaaMemAlfFinauni0645.medi_BaaMemAlfFinauni0645.medi_AlfPostToothuni0625.fina_MemAlfFinauni0627.fina_MemAlfFinauni0774.fina_MemAlfFinauni0773.fina_MemAlfFinauni0623.fina_MemAlfFinauni0622.fina_MemAlfFinauni0675.fina_MemAlfFinauni0672.fina_MemAlfFinauni0673.fina_MemAlfFinauni0671.fina_MemAlfFinauni0777.init_BaaHehInituni0680.init_BaaHehInituni0776.init_BaaHehInituni06BC.init_BaaHehInituni0750.init_BaaHehInituni0756.init_BaaHehInituni0768.init_BaaHehInituni06CE.init_BaaHehInituni0775.init_BaaHehInituni06BD.init_BaaHehInituni0626.init_BaaHehInituni066E.init_BaaHehInituni0620.init_BaaHehInituni064A.init_BaaHehInituni06BB.init_BaaHehInituni067F.init_BaaHehInituni0755.init_BaaHehInituni067D.init_BaaHehInituni067E.init_BaaHehInituni067B.init_BaaHehInituni0628.init_BaaHehInituni067A.init_BaaHehInituni0751.init_BaaHehInituni0646.init_BaaHehInituni0753.init_BaaHehInituni0752.init_BaaHehInituni062A.init_BaaHehInituni0678.init_BaaHehInituni063D.init_BaaHehInituni062B.init_BaaHehInituni0679.init_BaaHehInituni06B9.init_BaaHehInituni0769.init_BaaHehInituni0649.init_BaaHehInituni067C.init_BaaHehInituni0754.init_BaaHehInituni06D1.init_BaaHehInituni06D0.init_BaaHehInituni06BA.init_BaaHehInituni06CC.init_BaaHehInituni0767.init_BaaHehInituni0777.medi_BaaHehMediuni0680.medi_BaaHehMediuni0776.medi_BaaHehMediuni06BC.medi_BaaHehMediuni0750.medi_BaaHehMediuni0756.medi_BaaHehMediuni0768.medi_BaaHehMediuni06CE.medi_BaaHehMediuni0775.medi_BaaHehMediuni06BD.medi_BaaHehMediuni0626.medi_BaaHehMediuni066E.medi_BaaHehMediuni0620.medi_BaaHehMediuni064A.medi_BaaHehMediuni06BB.medi_BaaHehMediuni067F.medi_BaaHehMediuni0755.medi_BaaHehMediuni067D.medi_BaaHehMediuni067E.medi_BaaHehMediuni067B.medi_BaaHehMediuni0628.medi_BaaHehMediuni067A.medi_BaaHehMediuni0751.medi_BaaHehMediuni0646.medi_BaaHehMediuni0753.medi_BaaHehMediuni0752.medi_BaaHehMediuni062A.medi_BaaHehMediuni0678.medi_BaaHehMediuni063D.medi_BaaHehMediuni062B.medi_BaaHehMediuni0679.medi_BaaHehMediuni06B9.medi_BaaHehMediuni0769.medi_BaaHehMediuni0649.medi_BaaHehMediuni067C.medi_BaaHehMediuni0754.medi_BaaHehMediuni06D1.medi_BaaHehMediuni06D0.medi_BaaHehMediuni06BA.medi_BaaHehMediuni06CC.medi_BaaHehMediuni0767.medi_BaaHehMediuni0647.medi_BaaHehMediuni06C1.medi_BaaHehMediuni0647.medi_PostToothuni06C1.medi_PostToothuni06B5.medi_KafLamMemFinauni06B7.medi_KafLamMemFinauni0644.medi_KafLamMemFinauni06B8.medi_KafLamMemFinauni06B6.medi_KafLamMemFinauni076A.medi_KafLamMemFinauni06B5.init_LamLamInituni06B7.init_LamLamInituni0644.init_LamLamInituni06B8.init_LamLamInituni06B6.init_LamLamInituni076A.init_LamLamInituni06B5.medi_LamLamInituni06B7.medi_LamLamInituni0644.medi_LamLamInituni06B8.medi_LamLamInituni06B6.medi_LamLamInituni076A.medi_LamLamInituni06B5.medi_LamLamAlfIsoluni06B7.medi_LamLamAlfIsoluni0644.medi_LamLamAlfIsoluni06B8.medi_LamLamAlfIsoluni06B6.medi_LamLamAlfIsoluni076A.medi_LamLamAlfIsoluni063B.fina_LamKafIsoluni063C.fina_LamKafIsoluni077F.fina_LamKafIsoluni0764.fina_LamKafIsoluni0643.fina_LamKafIsoluni06B0.fina_LamKafIsoluni06B3.fina_LamKafIsoluni06B2.fina_LamKafIsoluni06AB.fina_LamKafIsoluni06AC.fina_LamKafIsoluni06AD.fina_LamKafIsoluni06AE.fina_LamKafIsoluni06AF.fina_LamKafIsoluni06A9.fina_LamKafIsoluni06B4.fina_LamKafIsoluni0763.fina_LamKafIsoluni0762.fina_LamKafIsoluni06B1.fina_LamKafIsoluni06B5.fina_LamLamIsoluni06B7.fina_LamLamIsoluni0644.fina_LamLamIsoluni06B8.fina_LamLamIsoluni06B6.fina_LamLamIsoluni076A.fina_LamLamIsoluni06B5.medi_LamLamMediuni06B7.medi_LamLamMediuni0644.medi_LamLamMediuni06B8.medi_LamLamMediuni06B6.medi_LamLamMediuni076A.medi_LamLamMediuni06B5.medi_LamLamAlefFinauni06B7.medi_LamLamAlefFinauni0644.medi_LamLamAlefFinauni06B8.medi_LamLamAlefFinauni06B6.medi_LamLamAlefFinauni076A.medi_LamLamAlefFinauni06B5.medi_LamLamMedi2uni06B7.medi_LamLamMedi2uni0644.medi_LamLamMedi2uni06B8.medi_LamLamMedi2uni06B6.medi_LamLamMedi2uni076A.medi_LamLamMedi2uni063B.fina_LamKafFinauni063C.fina_LamKafFinauni077F.fina_LamKafFinauni0764.fina_LamKafFinauni0643.fina_LamKafFinauni06B0.fina_LamKafFinauni06B3.fina_LamKafFinauni06B2.fina_LamKafFinauni06AB.fina_LamKafFinauni06AC.fina_LamKafFinauni06AD.fina_LamKafFinauni06AE.fina_LamKafFinauni06AF.fina_LamKafFinauni06A9.fina_LamKafFinauni06B4.fina_LamKafFinauni0763.fina_LamKafFinauni0762.fina_LamKafFinauni06B1.fina_LamKafFinauni06B5.fina_LamLamFinauni06B7.fina_LamLamFinauni0644.fina_LamLamFinauni06B8.fina_LamLamFinauni06B6.fina_LamLamFinauni076A.fina_LamLamFinauni06B5.medi_LamLamMemInituni06B7.medi_LamLamMemInituni0644.medi_LamLamMemInituni06B8.medi_LamLamMemInituni06B6.medi_LamLamMemInituni076A.medi_LamLamMemInituni06B5.medi_LamLamHehIsoluni06B7.medi_LamLamHehIsoluni0644.medi_LamLamHehIsoluni06B8.medi_LamLamHehIsoluni06B6.medi_LamLamHehIsoluni076A.medi_LamLamHehIsoluni06B5.medi_LamLamYaaIsoluni06B7.medi_LamLamYaaIsoluni0644.medi_LamLamYaaIsoluni06B8.medi_LamLamYaaIsoluni06B6.medi_LamLamYaaIsoluni076A.medi_LamLamYaaIsoluni06B5.medi_LamLamMemMediuni06B7.medi_LamLamMemMediuni0644.medi_LamLamMemMediuni06B8.medi_LamLamMemMediuni06B6.medi_LamLamMemMediuni076A.medi_LamLamMemMediuni06B5.medi_LamLamHehFinauni06B7.medi_LamLamHehFinauni0644.medi_LamLamHehFinauni06B8.medi_LamLamHehFinauni06B6.medi_LamLamHehFinauni076A.medi_LamLamHehFinauni06B5.medi_LamLamYaaFinauni06B7.medi_LamLamYaaFinauni0644.medi_LamLamYaaFinauni06B8.medi_LamLamYaaFinauni06B6.medi_LamLamYaaFinauni076A.medi_LamLamYaaFinauni062E.medi_1LamHaaHaaInituni062D.medi_1LamHaaHaaInituni0681.medi_1LamHaaHaaInituni0687.medi_1LamHaaHaaInituni0685.medi_1LamHaaHaaInituni062C.medi_1LamHaaHaaInituni0682.medi_1LamHaaHaaInituni0757.medi_1LamHaaHaaInituni0684.medi_1LamHaaHaaInituni076F.medi_1LamHaaHaaInituni076E.medi_1LamHaaHaaInituni0683.medi_1LamHaaHaaInituni06BF.medi_1LamHaaHaaInituni077C.medi_1LamHaaHaaInituni0758.medi_1LamHaaHaaInituni0772.medi_1LamHaaHaaInituni0686.medi_1LamHaaHaaInituni062E.medi_2LamHaaHaaInituni062D.medi_2LamHaaHaaInituni0681.medi_2LamHaaHaaInituni0687.medi_2LamHaaHaaInituni0685.medi_2LamHaaHaaInituni062C.medi_2LamHaaHaaInituni0682.medi_2LamHaaHaaInituni0757.medi_2LamHaaHaaInituni0684.medi_2LamHaaHaaInituni076F.medi_2LamHaaHaaInituni076E.medi_2LamHaaHaaInituni0683.medi_2LamHaaHaaInituni06BF.medi_2LamHaaHaaInituni077C.medi_2LamHaaHaaInituni0758.medi_2LamHaaHaaInituni0772.medi_2LamHaaHaaInituni0686.medi_2LamHaaHaaInit uni06AA.init uni06AA.medi uni06AA.finauni0625.LowHamzauni0673.LowHamzauni0680.init_LDuni06BD.init_LDuni067E.init_LDuni067B.init_LDuni0628.init_LDuni0767.init_LDuni063D.init_LDuni0777.init_LDuni0776.init_LDuni0775.init_LDuni06CC.init_LDuni064A.init_LDuni06CE.init_LDuni0751.init_LDuni0750.init_LDuni0753.init_LDuni0752.init_LDuni0755.init_LDuni0754.init_LDuni06B9.init_LDuni06D1.init_LDuni06D0.init_LDuni0680.init_BaaRaaIsolLDuni06BD.init_BaaRaaIsolLDuni067E.init_BaaRaaIsolLDuni067B.init_BaaRaaIsolLDuni0628.init_BaaRaaIsolLDuni0767.init_BaaRaaIsolLDuni063D.init_BaaRaaIsolLDuni0777.init_BaaRaaIsolLDuni0776.init_BaaRaaIsolLDuni0775.init_BaaRaaIsolLDuni06CC.init_BaaRaaIsolLDuni064A.init_BaaRaaIsolLDuni06CE.init_BaaRaaIsolLDuni0751.init_BaaRaaIsolLDuni0750.init_BaaRaaIsolLDuni0753.init_BaaRaaIsolLDuni0752.init_BaaRaaIsolLDuni0755.init_BaaRaaIsolLDuni0754.init_BaaRaaIsolLDuni06B9.init_BaaRaaIsolLDuni06D1.init_BaaRaaIsolLDuni06D0.init_BaaRaaIsolLDuni0680.init_BaaDalLDuni06BD.init_BaaDalLDuni067E.init_BaaDalLDuni067B.init_BaaDalLDuni0628.init_BaaDalLDuni0767.init_BaaDalLDuni063D.init_BaaDalLDuni0777.init_BaaDalLDuni0776.init_BaaDalLDuni0775.init_BaaDalLDuni06CC.init_BaaDalLDuni064A.init_BaaDalLDuni06CE.init_BaaDalLDuni0751.init_BaaDalLDuni0750.init_BaaDalLDuni0753.init_BaaDalLDuni0752.init_BaaDalLDuni0755.init_BaaDalLDuni0754.init_BaaDalLDuni06B9.init_BaaDalLDuni06D1.init_BaaDalLDuni06D0.init_BaaDalLDuni0680.init_BaaMemHaaInitLDuni06BD.init_BaaMemHaaInitLDuni067E.init_BaaMemHaaInitLDuni067B.init_BaaMemHaaInitLDuni0628.init_BaaMemHaaInitLDuni0767.init_BaaMemHaaInitLDuni063D.init_BaaMemHaaInitLDuni0777.init_BaaMemHaaInitLDuni0776.init_BaaMemHaaInitLDuni0775.init_BaaMemHaaInitLDuni06CC.init_BaaMemHaaInitLDuni064A.init_BaaMemHaaInitLDuni06CE.init_BaaMemHaaInitLDuni0751.init_BaaMemHaaInitLDuni0750.init_BaaMemHaaInitLDuni0753.init_BaaMemHaaInitLDuni0752.init_BaaMemHaaInitLDuni0755.init_BaaMemHaaInitLDuni0754.init_BaaMemHaaInitLDuni06B9.init_BaaMemHaaInitLDuni06D1.init_BaaMemHaaInitLDuni06D0.init_BaaMemHaaInitLDuni0680.init_BaaBaaYaaLDuni06BD.init_BaaBaaYaaLDuni067E.init_BaaBaaYaaLDuni067B.init_BaaBaaYaaLDuni0628.init_BaaBaaYaaLDuni0767.init_BaaBaaYaaLDuni063D.init_BaaBaaYaaLDuni0777.init_BaaBaaYaaLDuni0776.init_BaaBaaYaaLDuni0775.init_BaaBaaYaaLDuni06CC.init_BaaBaaYaaLDuni064A.init_BaaBaaYaaLDuni06CE.init_BaaBaaYaaLDuni0751.init_BaaBaaYaaLDuni0750.init_BaaBaaYaaLDuni0753.init_BaaBaaYaaLDuni0752.init_BaaBaaYaaLDuni0755.init_BaaBaaYaaLDuni0754.init_BaaBaaYaaLDuni06B9.init_BaaBaaYaaLDuni06D1.init_BaaBaaYaaLDuni06D0.init_BaaBaaYaaLDuni0680.init_BaaNonIsolLDuni06BD.init_BaaNonIsolLDuni067E.init_BaaNonIsolLDuni067B.init_BaaNonIsolLDuni0628.init_BaaNonIsolLDuni0767.init_BaaNonIsolLDuni063D.init_BaaNonIsolLDuni0777.init_BaaNonIsolLDuni0776.init_BaaNonIsolLDuni0775.init_BaaNonIsolLDuni06CC.init_BaaNonIsolLDuni064A.init_BaaNonIsolLDuni06CE.init_BaaNonIsolLDuni0751.init_BaaNonIsolLDuni0750.init_BaaNonIsolLDuni0753.init_BaaNonIsolLDuni0752.init_BaaNonIsolLDuni0755.init_BaaNonIsolLDuni0754.init_BaaNonIsolLDuni06B9.init_BaaNonIsolLDuni06D1.init_BaaNonIsolLDuni06D0.init_BaaNonIsolLDuni0680.init_BaaSenInitLDuni06BD.init_BaaSenInitLDuni067E.init_BaaSenInitLDuni067B.init_BaaSenInitLDuni0628.init_BaaSenInitLDuni0767.init_BaaSenInitLDuni063D.init_BaaSenInitLDuni0777.init_BaaSenInitLDuni0776.init_BaaSenInitLDuni0775.init_BaaSenInitLDuni06CC.init_BaaSenInitLDuni064A.init_BaaSenInitLDuni06CE.init_BaaSenInitLDuni0751.init_BaaSenInitLDuni0750.init_BaaSenInitLDuni0753.init_BaaSenInitLDuni0752.init_BaaSenInitLDuni0755.init_BaaSenInitLDuni0754.init_BaaSenInitLDuni06B9.init_BaaSenInitLDuni06D1.init_BaaSenInitLDuni06D0.init_BaaSenInitLDuni0680.init_BaaMemInitLDuni06BD.init_BaaMemInitLDuni067E.init_BaaMemInitLDuni067B.init_BaaMemInitLDuni0628.init_BaaMemInitLDuni0767.init_BaaMemInitLDuni063D.init_BaaMemInitLDuni0777.init_BaaMemInitLDuni0776.init_BaaMemInitLDuni0775.init_BaaMemInitLDuni06CC.init_BaaMemInitLDuni064A.init_BaaMemInitLDuni06CE.init_BaaMemInitLDuni0751.init_BaaMemInitLDuni0750.init_BaaMemInitLDuni0753.init_BaaMemInitLDuni0752.init_BaaMemInitLDuni0755.init_BaaMemInitLDuni0754.init_BaaMemInitLDuni06B9.init_BaaMemInitLDuni06D1.init_BaaMemInitLDuni06D0.init_BaaMemInitLDuni0680.init_BaaBaaHaaInitLDuni06BD.init_BaaBaaHaaInitLDuni067E.init_BaaBaaHaaInitLDuni067B.init_BaaBaaHaaInitLDuni0628.init_BaaBaaHaaInitLDuni0767.init_BaaBaaHaaInitLDuni063D.init_BaaBaaHaaInitLDuni0777.init_BaaBaaHaaInitLDuni0776.init_BaaBaaHaaInitLDuni0775.init_BaaBaaHaaInitLDuni06CC.init_BaaBaaHaaInitLDuni064A.init_BaaBaaHaaInitLDuni06CE.init_BaaBaaHaaInitLDuni0751.init_BaaBaaHaaInitLDuni0750.init_BaaBaaHaaInitLDuni0753.init_BaaBaaHaaInitLDuni0752.init_BaaBaaHaaInitLDuni0755.init_BaaBaaHaaInitLDuni0754.init_BaaBaaHaaInitLDuni06B9.init_BaaBaaHaaInitLDuni06D1.init_BaaBaaHaaInitLDuni06D0.init_BaaBaaHaaInitLDuni0680.init_BaaBaaIsolLDuni06BD.init_BaaBaaIsolLDuni067E.init_BaaBaaIsolLDuni067B.init_BaaBaaIsolLDuni0628.init_BaaBaaIsolLDuni0767.init_BaaBaaIsolLDuni063D.init_BaaBaaIsolLDuni0777.init_BaaBaaIsolLDuni0776.init_BaaBaaIsolLDuni0775.init_BaaBaaIsolLDuni06CC.init_BaaBaaIsolLDuni064A.init_BaaBaaIsolLDuni06CE.init_BaaBaaIsolLDuni0751.init_BaaBaaIsolLDuni0750.init_BaaBaaIsolLDuni0753.init_BaaBaaIsolLDuni0752.init_BaaBaaIsolLDuni0755.init_BaaBaaIsolLDuni0754.init_BaaBaaIsolLDuni06B9.init_BaaBaaIsolLDuni06D1.init_BaaBaaIsolLDuni06D0.init_BaaBaaIsolLDuni0680.init_BaaBaaMemInitLDuni06BD.init_BaaBaaMemInitLDuni067E.init_BaaBaaMemInitLDuni067B.init_BaaBaaMemInitLDuni0628.init_BaaBaaMemInitLDuni0767.init_BaaBaaMemInitLDuni063D.init_BaaBaaMemInitLDuni0777.init_BaaBaaMemInitLDuni0776.init_BaaBaaMemInitLDuni0775.init_BaaBaaMemInitLDuni06CC.init_BaaBaaMemInitLDuni064A.init_BaaBaaMemInitLDuni06CE.init_BaaBaaMemInitLDuni0751.init_BaaBaaMemInitLDuni0750.init_BaaBaaMemInitLDuni0753.init_BaaBaaMemInitLDuni0752.init_BaaBaaMemInitLDuni0755.init_BaaBaaMemInitLDuni0754.init_BaaBaaMemInitLDuni06B9.init_BaaBaaMemInitLDuni06D1.init_BaaBaaMemInitLDuni06D0.init_BaaBaaMemInitLDuni0680.init_BaaSenAltInitLDuni06BD.init_BaaSenAltInitLDuni067E.init_BaaSenAltInitLDuni067B.init_BaaSenAltInitLDuni0628.init_BaaSenAltInitLDuni0767.init_BaaSenAltInitLDuni063D.init_BaaSenAltInitLDuni0777.init_BaaSenAltInitLDuni0776.init_BaaSenAltInitLDuni0775.init_BaaSenAltInitLDuni06CC.init_BaaSenAltInitLDuni064A.init_BaaSenAltInitLDuni06CE.init_BaaSenAltInitLDuni0751.init_BaaSenAltInitLDuni0750.init_BaaSenAltInitLDuni0753.init_BaaSenAltInitLDuni0752.init_BaaSenAltInitLDuni0755.init_BaaSenAltInitLDuni0754.init_BaaSenAltInitLDuni06B9.init_BaaSenAltInitLDuni06D1.init_BaaSenAltInitLDuni06D0.init_BaaSenAltInitLDuni0680.init_BaaHaaInitLDuni06BD.init_BaaHaaInitLDuni067E.init_BaaHaaInitLDuni067B.init_BaaHaaInitLDuni0628.init_BaaHaaInitLDuni0767.init_BaaHaaInitLDuni063D.init_BaaHaaInitLDuni0777.init_BaaHaaInitLDuni0776.init_BaaHaaInitLDuni0775.init_BaaHaaInitLDuni06CC.init_BaaHaaInitLDuni064A.init_BaaHaaInitLDuni06CE.init_BaaHaaInitLDuni0751.init_BaaHaaInitLDuni0750.init_BaaHaaInitLDuni0753.init_BaaHaaInitLDuni0752.init_BaaHaaInitLDuni0755.init_BaaHaaInitLDuni0754.init_BaaHaaInitLDuni06B9.init_BaaHaaInitLDuni06D1.init_BaaHaaInitLDuni06D0.init_BaaHaaInitLDuni0680.init_BaaHaaMemInitLDuni06BD.init_BaaHaaMemInitLDuni067E.init_BaaHaaMemInitLDuni067B.init_BaaHaaMemInitLDuni0628.init_BaaHaaMemInitLDuni0767.init_BaaHaaMemInitLDuni063D.init_BaaHaaMemInitLDuni0777.init_BaaHaaMemInitLDuni0776.init_BaaHaaMemInitLDuni0775.init_BaaHaaMemInitLDuni06CC.init_BaaHaaMemInitLDuni064A.init_BaaHaaMemInitLDuni06CE.init_BaaHaaMemInitLDuni0751.init_BaaHaaMemInitLDuni0750.init_BaaHaaMemInitLDuni0753.init_BaaHaaMemInitLDuni0752.init_BaaHaaMemInitLDuni0755.init_BaaHaaMemInitLDuni0754.init_BaaHaaMemInitLDuni06B9.init_BaaHaaMemInitLDuni06D1.init_BaaHaaMemInitLDuni06D0.init_BaaHaaMemInitLDuni0680.init_HighLDuni06BD.init_HighLDuni067E.init_HighLDuni067B.init_HighLDuni0628.init_HighLDuni0767.init_HighLDuni063D.init_HighLDuni0777.init_HighLDuni0776.init_HighLDuni0775.init_HighLDuni06CC.init_HighLDuni064A.init_HighLDuni06CE.init_HighLDuni0751.init_HighLDuni0750.init_HighLDuni0753.init_HighLDuni0752.init_HighLDuni0755.init_HighLDuni0754.init_HighLDuni06B9.init_HighLDuni06D1.init_HighLDuni06D0.init_HighLDuni0680.init_WideLDuni06BD.init_WideLDuni067E.init_WideLDuni067B.init_WideLDuni0628.init_WideLDuni0767.init_WideLDuni063D.init_WideLDuni0777.init_WideLDuni0776.init_WideLDuni0775.init_WideLDuni06CC.init_WideLDuni064A.init_WideLDuni06CE.init_WideLDuni0751.init_WideLDuni0750.init_WideLDuni0753.init_WideLDuni0752.init_WideLDuni0755.init_WideLDuni0754.init_WideLDuni06B9.init_WideLDuni06D1.init_WideLDuni06D0.init_WideLDuni0680.init_BaaYaaIsolLDuni06BD.init_BaaYaaIsolLDuni067E.init_BaaYaaIsolLDuni067B.init_BaaYaaIsolLDuni0628.init_BaaYaaIsolLDuni0767.init_BaaYaaIsolLDuni063D.init_BaaYaaIsolLDuni0777.init_BaaYaaIsolLDuni0776.init_BaaYaaIsolLDuni0775.init_BaaYaaIsolLDuni06CC.init_BaaYaaIsolLDuni064A.init_BaaYaaIsolLDuni06CE.init_BaaYaaIsolLDuni0751.init_BaaYaaIsolLDuni0750.init_BaaYaaIsolLDuni0753.init_BaaYaaIsolLDuni0752.init_BaaYaaIsolLDuni0755.init_BaaYaaIsolLDuni0754.init_BaaYaaIsolLDuni06B9.init_BaaYaaIsolLDuni06D1.init_BaaYaaIsolLDuni06D0.init_BaaYaaIsolLDuni0680.init_BaaMemIsolLDuni06BD.init_BaaMemIsolLDuni067E.init_BaaMemIsolLDuni067B.init_BaaMemIsolLDuni0628.init_BaaMemIsolLDuni0767.init_BaaMemIsolLDuni063D.init_BaaMemIsolLDuni0777.init_BaaMemIsolLDuni0776.init_BaaMemIsolLDuni0775.init_BaaMemIsolLDuni06CC.init_BaaMemIsolLDuni064A.init_BaaMemIsolLDuni06CE.init_BaaMemIsolLDuni0751.init_BaaMemIsolLDuni0750.init_BaaMemIsolLDuni0753.init_BaaMemIsolLDuni0752.init_BaaMemIsolLDuni0755.init_BaaMemIsolLDuni0754.init_BaaMemIsolLDuni06B9.init_BaaMemIsolLDuni06D1.init_BaaMemIsolLDuni06D0.init_BaaMemIsolLDuni0680.init_BaaHehInitLDuni06BD.init_BaaHehInitLDuni067E.init_BaaHehInitLDuni067B.init_BaaHehInitLDuni0628.init_BaaHehInitLDuni0767.init_BaaHehInitLDuni063D.init_BaaHehInitLDuni0777.init_BaaHehInitLDuni0776.init_BaaHehInitLDuni0775.init_BaaHehInitLDuni06CC.init_BaaHehInitLDuni064A.init_BaaHehInitLDuni06CE.init_BaaHehInitLDuni0751.init_BaaHehInitLDuni0750.init_BaaHehInitLDuni0753.init_BaaHehInitLDuni0752.init_BaaHehInitLDuni0755.init_BaaHehInitLDuni0754.init_BaaHehInitLDuni06B9.init_BaaHehInitLDuni06D1.init_BaaHehInitLDuni06D0.init_BaaHehInitLDuni0620.initLDuni0620.init_BaaRaaIsolLDuni0620.init_BaaDalLDuni0620.init_BaaMemHaaInitLDuni0620.init_BaaBaaYaaLDuni0620.init_BaaNonIsolLDuni0620.init_BaaSenInitLDuni0620.init_BaaMemInitLDuni0620.init_BaaBaaHaaInitLDuni0620.init_BaaBaaIsolLDuni0620.init_BaaBaaMemInitLDuni0620.init_BaaSenAltInitLDuni0620.init_BaaHaaInitLDuni0620.init_BaaHaaMemInitLDuni0620.init_HighLDuni0620.init_WideLDuni0620.init_BaaYaaIsolLDuni0620.init_BaaMemIsolLDuni0620.init_BaaHehInitLDuni0765.init_MemHehInitaMem.init_MemHehInituni0645.init_MemHehInituni0766.init_MemHehInit uni0670.isol uni0670.medi uni0621.medi uni0621.float uni0640.long1 uni0660.small uni0661.small uni0662.small uni0663.small uni0664.small uni0665.small uni0666.small uni0667.small uni0668.small uni0669.small uni06F0.small uni06F1.small uni06F2.small uni06F3.small uni06F4.small uni06F5.small uni06F6.small uni06F7.small uni06F8.small uni06F9.smalluni06F4.urd.smalluni06F6.urd.smalluni06F7.urd.small uni08F0.smalluni064E.small2 uni064C.small uni06E5.medi uni06E6.medi radical.rtlm dot.percentuni0645.medi_KafMemMediTatweeluni0645.fina_LamMemFinaExtendeduni0645.fina_KafMemFinaExtendedaMem.fina_Extendeduni0645.fina_KafMemIsolExtended uni0640.1uni0627.fina_Tatweel uni0640.2 uni0640.3 uni0640.4uni06FA.init_SenBaaMemInituni076D.init_SenBaaMemInituni0633.init_SenBaaMemInituni077E.init_SenBaaMemInituni077D.init_SenBaaMemInituni0634.init_SenBaaMemInituni0770.init_SenBaaMemInituni075C.init_SenBaaMemInituni069A.init_SenBaaMemInituni069B.init_SenBaaMemInituni069C.init_SenBaaMemInituni069D.init_SenBaaMemInituni06FB.init_SenBaaMemInituni0636.init_SenBaaMemInituni069E.init_SenBaaMemInituni0635.init_SenBaaMemInit aYaaBari.isol aYaaBari.finaaYaaBari.fina_PostToothaSen.init_YaaBariaSad.init_YaaBari uni077B.finauni077B.fina_PostTooth uni077A.finauni077A.fina_PostTooth uni06D2.finauni06D2.fina_PostToothuni06FA.init_YaaBariuni076D.init_YaaBariuni0633.init_YaaBariuni077E.init_YaaBariuni077D.init_YaaBariuni0634.init_YaaBariuni0770.init_YaaBariuni075C.init_YaaBariuni069A.init_YaaBariuni069B.init_YaaBariuni069C.init_YaaBariuni069D.init_YaaBariuni06FB.init_YaaBariuni0636.init_YaaBariuni069E.init_YaaBariuni0635.init_YaaBariaYaaBari.fina_PostAscenderuni0627.fina_WideaBaa.init_YaaBariaFaa.init_YaaBari uni06E5.lowaLam.init_YaaBariaKaf.init_YaaBariuni063B.init_YaaBariuni063C.init_YaaBariuni077F.init_YaaBariuni0764.init_YaaBariuni0643.init_YaaBariuni06B0.init_YaaBariuni06B3.init_YaaBariuni06B2.init_YaaBariuni06AB.init_YaaBariuni06AC.init_YaaBariuni06AD.init_YaaBariuni06AE.init_YaaBariuni06AF.init_YaaBariuni06A9.init_YaaBariuni06B4.init_YaaBariuni0763.init_YaaBariuni0762.init_YaaBariuni06B1.init_YaaBariuni0777.init_YaaBariuni0680.init_YaaBariuni0776.init_YaaBariuni06BC.init_YaaBariuni0750.init_YaaBariuni0756.init_YaaBariuni0768.init_YaaBariuni06CE.init_YaaBariuni0775.init_YaaBariuni06BD.init_YaaBariuni0626.init_YaaBariuni066E.init_YaaBariuni0620.init_YaaBariuni064A.init_YaaBariuni06BB.init_YaaBariuni067F.init_YaaBariuni0755.init_YaaBariuni067D.init_YaaBariuni067E.init_YaaBariuni067B.init_YaaBariuni0628.init_YaaBariuni067A.init_YaaBariuni0751.init_YaaBariuni0646.init_YaaBariuni0753.init_YaaBariuni0752.init_YaaBariuni062A.init_YaaBariuni0678.init_YaaBariuni063D.init_YaaBariuni062B.init_YaaBariuni0679.init_YaaBariuni06B9.init_YaaBariuni0769.init_YaaBariuni0649.init_YaaBariuni067C.init_YaaBariuni0754.init_YaaBariuni06D1.init_YaaBariuni06D0.init_YaaBariuni06BA.init_YaaBariuni06CC.init_YaaBariuni0767.init_YaaBariuni077B.fina_PostAscenderuni077A.fina_PostAscenderuni06D2.fina_PostAscenderuni06B5.init_YaaBariuni06B7.init_YaaBariuni0644.init_YaaBariuni06B8.init_YaaBariuni06B6.init_YaaBariuni076A.init_YaaBariuni066F.init_YaaBariuni0761.init_YaaBariuni0760.init_YaaBariuni0642.init_YaaBariuni0641.init_YaaBariuni06A8.init_YaaBariuni06A1.init_YaaBariuni06A2.init_YaaBariuni06A3.init_YaaBariuni06A4.init_YaaBariuni06A5.init_YaaBariuni06A6.init_YaaBariuni06A7.init_YaaBariaYaaBari.fina_PostAynaHaa.init_YaaBariaAyn.init_YaaBariaMem.init_YaaBariuni077B.fina_PostAynuni077A.fina_PostAynuni06D2.fina_PostAynuni0765.init_YaaBariuni0645.init_YaaBariuni0766.init_YaaBariuni062E.init_YaaBariuni062D.init_YaaBariuni0681.init_YaaBariuni0687.init_YaaBariuni0685.init_YaaBariuni062C.init_YaaBariuni0682.init_YaaBariuni0757.init_YaaBariuni0684.init_YaaBariuni076F.init_YaaBariuni076E.init_YaaBariuni0683.init_YaaBariuni06BF.init_YaaBariuni077C.init_YaaBariuni0758.init_YaaBariuni0772.init_YaaBariuni0686.init_YaaBariuni06FC.init_YaaBariuni063A.init_YaaBariuni075E.init_YaaBariuni075D.init_YaaBariuni075F.init_YaaBariuni06A0.init_YaaBariuni0639.init_YaaBariaHeh.init_YaaBariuni0647.init_YaaBariuni06C1.init_YaaBariaTaa.init_YaaBareeuni0638.init_YaaBariuni0637.init_YaaBariuni069F.init_YaaBariaHehKnotted.isol uni06BE.init uni06FF.init uni06BE.fina uni06FF.fina uni06BE.medi uni06FF.mediaHehKnotted.finaaHeh.medi_HehYaaFinauni0647.medi_HehYaaFinauni06C1.medi_HehYaaFinauni0647.medi_PostToothHehYaauni06C1.medi_PostToothHehYaa hamza.aboveuni0660.mediumuni0661.mediumuni0662.mediumuni0663.mediumuni0664.mediumuni0665.mediumuni0666.mediumuni0667.mediumuni0668.mediumuni0669.mediumuni06F0.mediumuni06F1.mediumuni06F2.mediumuni06F3.mediumuni06F4.mediumuni06F5.mediumuni06F6.mediumuni06F7.mediumuni06F8.mediumuni06F9.mediumuni06F4.urd.mediumuni06F6.urd.mediumuni06F7.urd.mediumaAlf.fina_Narrowuni0622.fina_Narrowuni0623.fina_Narrowuni0625.fina_Narrowuni0627.fina_Narrowuni0671.fina_Narrowuni0672.fina_Narrowuni0673.fina_Narrowuni0675.fina_Narrowuni0773.fina_Narrowuni0774.fina_Narrow smallv.aboveaHehKnotted.init_YaaBariuni06BE.init_YaaBari uni08A0.fina uni08A0.init uni08A0.mediuni08A0.init_BaaRaaIsoluni08A0.medi_BaaMemFinauni08A0.medi_LamBaaMemInituni08A0.init_BaaDaluni08A0.init_BaaMemHaaInituni08A0.init_BaaBaaYaauni08A0.medi_BaaBaaYaauni08A0.medi_KafBaaInituni08A0.medi_BaaBaaInituni08A0.init_BaaNonIsoluni08A0.init_BaaSenInituni08A0.medi_BaaRaaFinauni08A0.init_BaaMemInituni08A0.init_BaaBaaHaaInituni08A0.medi_BaaBaaHaaInituni08A0.medi_SenBaaMemInituni08A0.init_BaaBaaIsoluni08A0.fina_BaaBaaIsoluni08A0.init_BaaBaaMemInituni08A0.medi_BaaBaaMemInituni08A0.medi_KafBaaMediuni08A0.medi_BaaNonFinauni08A0.medi_BaaYaaFinauni08A0.init_BaaSenAltInituni08A0.init_AboveHaauni08A0.init_BaaHaaInituni08A0.init_BaaHaaMemInituni08A0.init_Highuni08A0.medi_Highuni08A0.init_Wideuni08A0.init_BaaYaaIsoluni08A0.init_BaaMemIsoluni08A0.medi_BaaMemAlfFinauni08A0.init_BaaHehInituni08A0.medi_BaaHehMediuni08A0.init_LDuni08A0.init_BaaRaaIsolLDuni08A0.init_BaaDalLDuni08A0.init_BaaMemHaaInitLDuni08A0.init_BaaBaaYaaLDuni08A0.init_BaaNonIsolLDuni08A0.init_BaaSenInitLDuni08A0.init_BaaMemInitLDuni08A0.init_BaaBaaHaaInitLDuni08A0.init_BaaBaaIsolLDuni08A0.init_BaaBaaMemInitLDuni08A0.init_BaaSenAltInitLDuni08A0.init_BaaHaaInitLDuni08A0.init_BaaHaaMemInitLDuni08A0.init_HighLDuni08A0.init_WideLDuni08A0.init_BaaYaaIsolLDuni08A0.init_BaaMemIsolLDuni08A0.init_BaaHehInitLDuni08A0.init_YaaBarismallv.below.low uni0600.4smallv.above.inverted uni0660.prop uni0661.prop uni0662.prop uni0663.prop uni0664.prop uni0665.prop uni0666.prop uni0667.prop uni0668.prop uni0669.prop uni06F0.prop uni06F1.prop uni06F2.prop uni06F3.prop uni06F4.prop uni06F5.prop uni06F6.prop uni06F7.prop uni06F8.prop uni06F9.propuni06F4.urd.propuni06F6.urd.propuni06F7.urd.propuni0623.fina_Wideuni0671.fina_WideaBaa.init_BaaBaaHehuni0777.init_BaaBaaHehuni0680.init_BaaBaaHehuni0776.init_BaaBaaHehuni06BC.init_BaaBaaHehuni0750.init_BaaBaaHehuni0756.init_BaaBaaHehuni0768.init_BaaBaaHehuni06CE.init_BaaBaaHehuni0775.init_BaaBaaHehuni06BD.init_BaaBaaHehuni0626.init_BaaBaaHehuni066E.init_BaaBaaHehuni0620.init_BaaBaaHehuni064A.init_BaaBaaHehuni06BB.init_BaaBaaHehuni067F.init_BaaBaaHehuni0755.init_BaaBaaHehuni067D.init_BaaBaaHehuni067E.init_BaaBaaHehuni067B.init_BaaBaaHehuni0628.init_BaaBaaHehuni067A.init_BaaBaaHehuni0751.init_BaaBaaHehuni0646.init_BaaBaaHehuni0753.init_BaaBaaHehuni0752.init_BaaBaaHehuni062A.init_BaaBaaHehuni0678.init_BaaBaaHehuni063D.init_BaaBaaHehuni062B.init_BaaBaaHehuni0679.init_BaaBaaHehuni06B9.init_BaaBaaHehuni0769.init_BaaBaaHehuni0649.init_BaaBaaHehuni067C.init_BaaBaaHehuni0754.init_BaaBaaHehuni06D1.init_BaaBaaHehuni06D0.init_BaaBaaHehuni06BA.init_BaaBaaHehuni06CC.init_BaaBaaHehuni0767.init_BaaBaaHehuni0680.init_BaaBaaHehLDuni06BD.init_BaaBaaHehLDuni067E.init_BaaBaaHehLDuni067B.init_BaaBaaHehLDuni0628.init_BaaBaaHehLDuni0767.init_BaaBaaHehLDuni063D.init_BaaBaaHehLDuni0777.init_BaaBaaHehLDuni0776.init_BaaBaaHehLDuni0775.init_BaaBaaHehLDuni06CC.init_BaaBaaHehLDuni064A.init_BaaBaaHehLDuni06CE.init_BaaBaaHehLDuni0751.init_BaaBaaHehLDuni0750.init_BaaBaaHehLDuni0753.init_BaaBaaHehLDuni0752.init_BaaBaaHehLDuni0755.init_BaaBaaHehLDuni0754.init_BaaBaaHehLDuni06B9.init_BaaBaaHehLDuni06D1.init_BaaBaaHehLDuni06D0.init_BaaBaaHehLD uni06A9.altuni06A9.alt.fina uni06AF.altuni06AF.alt.fina uni06B0.altuni06B0.alt.fina uni06B1.altuni06B1.alt.fina uni06B2.altuni06B2.alt.fina uni06B3.altuni06B3.alt.fina uni06B4.altuni06B4.alt.fina uni0762.altuni0762.alt.fina uni0763.altuni0763.alt.fina uni0764.altuni0764.alt.fina uni063B.altuni063B.alt.fina uni063C.altuni063C.alt.fina aGaf.isol aGaf.fina uni0600.3 uni0603.3 uni0640.05aYaaBari.fina_PostToothFinaaBaa.medi_YaaBariuni0777.medi_YaaBariuni0680.medi_YaaBariuni0776.medi_YaaBariuni06BC.medi_YaaBariuni0750.medi_YaaBariuni0756.medi_YaaBariuni0768.medi_YaaBariuni06CE.medi_YaaBariuni0775.medi_YaaBariuni06BD.medi_YaaBariuni0626.medi_YaaBariuni066E.medi_YaaBariuni0620.medi_YaaBariuni064A.medi_YaaBariuni06BB.medi_YaaBariuni067F.medi_YaaBariuni0755.medi_YaaBariuni067D.medi_YaaBariuni067E.medi_YaaBariuni067B.medi_YaaBariuni0628.medi_YaaBariuni067A.medi_YaaBariuni0751.medi_YaaBariuni0646.medi_YaaBariuni0753.medi_YaaBariuni0752.medi_YaaBariuni062A.medi_YaaBariuni0678.medi_YaaBariuni063D.medi_YaaBariuni062B.medi_YaaBariuni0679.medi_YaaBariuni06B9.medi_YaaBariuni0769.medi_YaaBariuni0649.medi_YaaBariuni067C.medi_YaaBariuni0754.medi_YaaBariuni06D1.medi_YaaBariuni06D0.medi_YaaBariuni06BA.medi_YaaBariuni06CC.medi_YaaBariuni0767.medi_YaaBariuni077B.fina_PostToothFinauni077A.fina_PostToothFinauni06D2.fina_PostToothFinauni08A0.medi_YaaBariaBaa.init_BaaBaaYaaBariuni0777.init_BaaBaaYaaBariuni0680.init_BaaBaaYaaBariuni0776.init_BaaBaaYaaBariuni06BC.init_BaaBaaYaaBariuni0750.init_BaaBaaYaaBariuni0756.init_BaaBaaYaaBariuni0768.init_BaaBaaYaaBariuni06CE.init_BaaBaaYaaBariuni0775.init_BaaBaaYaaBariuni06BD.init_BaaBaaYaaBariuni0626.init_BaaBaaYaaBariuni066E.init_BaaBaaYaaBariuni0620.init_BaaBaaYaaBariuni064A.init_BaaBaaYaaBariuni06BB.init_BaaBaaYaaBariuni067F.init_BaaBaaYaaBariuni0755.init_BaaBaaYaaBariuni067D.init_BaaBaaYaaBariuni067E.init_BaaBaaYaaBariuni067B.init_BaaBaaYaaBariuni0628.init_BaaBaaYaaBariuni067A.init_BaaBaaYaaBariuni0751.init_BaaBaaYaaBariuni0646.init_BaaBaaYaaBariuni0753.init_BaaBaaYaaBariuni0752.init_BaaBaaYaaBariuni062A.init_BaaBaaYaaBariuni0678.init_BaaBaaYaaBariuni063D.init_BaaBaaYaaBariuni062B.init_BaaBaaYaaBariuni0679.init_BaaBaaYaaBariuni06B9.init_BaaBaaYaaBariuni0769.init_BaaBaaYaaBariuni0649.init_BaaBaaYaaBariuni067C.init_BaaBaaYaaBariuni0754.init_BaaBaaYaaBariuni06D1.init_BaaBaaYaaBariuni06D0.init_BaaBaaYaaBariuni06BA.init_BaaBaaYaaBariuni06CC.init_BaaBaaYaaBariuni0767.init_BaaBaaYaaBariuni08A0.init_BaaBaaYaaBariuni0687.init_BaaYaaBariuni062C.init_BaaYaaBariuni0684.init_BaaYaaBariuni076F.init_BaaYaaBariuni076E.init_BaaYaaBariuni0683.init_BaaYaaBariuni06BF.init_BaaYaaBariuni077C.init_BaaYaaBariuni0758.init_BaaYaaBariuni0686.init_BaaYaaBariaHaa.init_BaaYaaBariuni08A0.init_BaaBaaHehuni08A0.init_BaaBaaHehLDuni0620.init_BaaBaaHehLD uni0657.urd uni0657.smallf_bf_f_bf_kf_f_kf_hf_f_hf_jf_f_jiogonek.dotless gravecomb.cap acutecomb.cap uni0302.cap uni030A.cap tildecomb.cap uni0304.cap uni0306.cap uni0327.capuni0308.narrow uni0308.cap uni030C.cap zero.propone.proptwo.prop three.prop four.prop five.propsix.prop seven.prop eight.prop nine.propi.TRK zero.small zero.medium one.small one.medium two.small two.medium three.small three.medium four.small four.medium five.small five.medium six.small six.medium seven.small seven.medium eight.small eight.medium nine.small nine.medium exclam.ref1 cent.ref1Eth.ref1 Oslash.ref1 divide.ref1 oslash.ref1 dcroat.ref1 Hbar.ref1 hbar.ref1 Lslash.ref1 lslash.ref1 Tbar.ref1 tbar.ref1 uni060B.ref1 uni0612.ref1 uni061F.ref1 uni065E.ref1 uni202A.ref1 uni202D.ref1 uniFDFD.ref1"X    &'()?@@ABCLM^_noyz239:;<ABCDEFFGJKxyyz &.6DRZhp~&0 &L 0` 0X &X &: &j DFLTarab6latn  ARA SND 8URD X      TRK (    caltcaltccmpVccmp^ccmphccmptfinainitligaloclloclloclloclmedipnumrligrtlmss01ss02ss03ss043 '()+,03579;>ACEG4 '()+,03579;>ACEG   (0>FNV^fnv~ (08DLT\dlt "*2:BJRZbjrz "*2:BJRZbjrz"6>R$,6>FNV^fnv~ (0:BJRZbjr6FJ\j J *.2&P^p4n@NTt !(!!"*"l""#.#n#$$@$$% %R%%&,&~&''@'X'v''((.(<(@(D(d(h()j*T+|,D,- -4--.@.d./|/00112J233X4$4P445 5,5466L6T66708f89R99::::;H;<=>>>??$?R?@TA2AbABTBvBCRCCDFDDE F&FxFGG<GH"H\HIKXKLDMMMNPQQRRRSTVWWXYYYZ\]]^^^_`abcd6deeVeeff8fjffg*gTg~ggh.hlhhiiHi~iijjFjjjkk:kdkkkl6lllm m2m^mmmn*nTnnoo,ozop opp<qqr rZs0sjst*t.tuw:x>y yzzJzz{L{r{{{{||$|}V}~~\~~~,B2nrHL8t<@bfQST STH! MV xvQL=>Aiw'yw}~{m PJEFGHIBNDCKgkhjzoum (sKnp|qNMOML@vxrl  tnl ?}}.T))U++V-.WWYY\e\iwfz}uyz} XSOPSoz)!W\WXYZ[T`VU]mqnpq*RrUTV_^Ry{r Q}}.T))U++V-.WWYY\e\iwfz}uyz}  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptz~ "&*.26:>BFJNRVZ^bfjnrvz~?>:;j&]_JE+,/ct|"dCAB@`kiaghe\I8345670<219aebd~o%##$%DpZYc[^fbGFH;:.su}f=<- }})+0.22KLWY\(6",;;;; fl  KXl`!z'*=`grwwzz:JRk,l&)*--//36Ofmrttzz|*+j2vQLAiw'ySX)Soz2)EJ]_j"/ct|=?>:;j&]_JE/ct|"SX)Soz=)LQvy'Aiw~BC~     N Ic~c~2)EJ]_j"/ct|~BC=)LQvy'Aiw"2)EJ]_j"/ct|~BC~BC=)LQvy'Aiw*  B  2"#$%&BH! MVH!z{|}~ MV OPadyar:V MV MV MV:P4 MV MVc:. MVc:$@\x MV MV MV MVabr:V MV MV MVabdP4 MV MVabd. MVabd:Vr MV MV MV:4P MV MVc:. MVc:(D`| MV MV MV MVab">Zv MV MV MVabd4P MV MVabd. MVabdda!z{|}~!z{|}~!z{|}~!z{|}~ba!z{|}~!z{|}~!z{|}~bd!z{|}~!z{|}~!z{|}~wwuv"#iovoo io io& &&io"}}$&(*_rs .t22KLWY]::<BDJYk"&--//36 af tt|6ADc"#2&,&&io"}}$&(*_rs .t22KLWY]::<BDJYk"&--//36 af tt|6ADc"#."(&&;ioKXl"'^b!w(*=@B`grwwzz"#"($"!io"#$*0!!!io"# &,2:!!!io"#$*0$"!io"# &,28!!!io"#"(.4:B!!!io"# &,28$"!io"#"(.4:@!!!io"#$*06<BJ!!!io"#$*0#"!oo"# &,28#%!oo"#"(.4:B#%!oo"# &,28#"!oo"#"(.4:@#%!oo"#$*06<BJ#%!oo"# &,28#"!oo"#"(.4:@#%!oo"#$*06<BJ#%!oo"#"(.4:@#"!oo"#$*06<BH#%!oo"#&,28>DJR#%!oo"#!v"#$*I->@A    Q S T245.:B   M U.6/ **12"#%Z* !"#$%&'()*+,-./01234567l)$l2l)"wxy<=>?AEHI+,.012789:;<OPRTUV[\]^_`&n2l)"wxy<=>?AEHI"wxy<=>?AEHI+,.012789:;<OPRTUV[\]^_`(p2l)"wxy<=>?AEHI"wxy<=>?AEHI"wxy<=>?AEHI+,.012789:;<OPRTUV[\]^_`N     '()*+,-./01234567  "#$%& l!)'(:ww<=BM>44l'()ww+,1<!z: : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r)9&66)l3|)2&88)|\+ tt)*&::)t~<         =N);~<|}~O`);"2<<=N):Caf mr"2==O`):Caf mrh !"#$%&'(       9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` aYeTlR 0@@)) .>N??@l))) $L@))3 9 aIrs Yk<GR0]"@) (8@@l))Yk<GRSY      !"#$%&'()*+,-./012l)*RvxTW,BBlvxRU)*Z*     l)"Dl)0)& M N O P Q R S T U V G H I J K L:Cmr  FFmr:C nmrXqrstuvwxyz{|}~34l)*)tt+,<GW4bcdefg!gl !t7abcdefghijklmn\]^_`89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ["&=`mrtt*wwzz|HIJKLMN      !"#$%&;<=>?@ABCDEFG'()*+,-./01234567UVOPQRST89:WXYZ[\]^_`abcdef KQl0='(N=NPglbvxhk{z:                           ! " # $ % & ' ( ) * + , - . / 0l)9P%{|}~opqrstuvwxyz"&grAF0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D Emr@ L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h @ u v w x y z { | } ~  i j k l m n o p q r s t!grh1 gl)zz/0 Vmr 56789:56789:mrv8                      l)7~<     ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D F G H I J K L M N O P Q R S T U V El!)zz:;d W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  lRb~<OQUVWX_`abcd;<=>?@ABCDEFGHIJKLZYR^TS[]\PMN<-/3456abcdefghijklmnopqr G H I J K L W X Y Z [ \uvwxyz68:<>@BDFHJLr6y{qrstuvklmnop|~}zwx6-/3456abcdefmnopqr G H I J K L W X Y Z [ \uvwxyz68:<>@BDFHJL mr2 mr6 6 7 8 9 : ; < = > ? @ A B C D E F / 0 1 2 3 4 5!glzz   glzz&               :Cgl 6 ' ( ) * + , - . / 0 1 2 3 4 5 6 7 ! " # $ % & 8!glzzU)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{lzzRSe ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  l!Rc( j l m n o p q r s t u v w x y z {wwJ" 89:;<=>?@ABCDEFGH!Cghijklmnopqrstuvwxyz{|}~l=N)gl;ttAB mrN$ !ww '7l3 l|)2,     O`tt mr G L@                      ! " # $ % & ' ( ) * + , - .     / 0 1 2 3 4 5 6 7 8 9l)4?J" s t u v w x y z { | } ~  O` )*gl\+ lzz)*L:C-- // 36 =fmr:66@88A::B<<C>>D@@EBBFDDGFFHHHIJJJLLKJ"     =N6    IJKLMNOPQRSTUVWXYKQ!X) b c d e f g h                   ! " # $ % & ' ( ) * + , - .RXO` W X Y Z [ \ ] ^ _mry{|; zz)*/:H! 2   !gl|;./01234567      ()*+,-"#$%&'!:C=f mr4zz:v !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP@ABCDEFGHIJKLMNOP !"#$%&'()*+,-./0123456789:;<=>?l!)'7:Ktunopqrst | } ~  QRSTUVWXYZ[\]^_`a]^_`abcdefghijklm[\ F G H I J K  KQl0='(_=NaglswwyzJ"uvwxyz{|}~ !@0LKQ'(%=`'zzKCt$lrMmr"wxy<=>?AEHIt"wxy<=>?AEHI&nMmr"wxy<=>?AEHI"wxy<=>?AEHIt"wxy<=>?AEHI(pMmr"wxy<=>?AEHI"wxy<=>?AEHIt"wxy<=>?AEHI"wxy<=>?AEHI&ntMmr"wxy<=>?AEHIt"wxy<=>?AEHI"wxy<=>?AEHI&8MmrGJ"wxy<=>?AEHIt"wxy<=>?AEHI&nMmr"wxy<=>?AEHIGJt"wxy<=>?AEHI$6<MmrGJtGJFt*rxg=Ngl"wxy<=>?AEHIt"wxy<=>?AEHI,tg=Ngl"wxy<=>?AEHI"wxy<=>?AEHIt"wxy<=>?AEHI.v g=Ngl"wxy<=>?AEHI"wxy<=>?AEHIt"wxy<=>?AEHI"wxy<=>?AEHI,tzg=Ngl"wxy<=>?AEHIt"wxy<=>?AEHI"wxy<=>?AEHI,>g=NglGJ"wxy<=>?AEHIt"wxy<=>?AEHI,tg=Ngl"wxy<=>?AEHIGJt"wxy<=>?AEHI*<Bg=NglGJtGJz$lr`gl"wxy<=>?AEHIz"wxy<=>?AEHI&n`gl"wxy<=>?AEHI"wxy<=>?AEHIz"wxy<=>?AEHI(p`gl"wxy<=>?AEHI"wxy<=>?AEHIz"wxy<=>?AEHI"wxy<=>?AEHI&nt`gl"wxy<=>?AEHIz"wxy<=>?AEHI"wxy<=>?AEHI&8`glGJ"wxy<=>?AEHIz"wxy<=>?AEHI&n`gl"wxy<=>?AEHIGJz"wxy<=>?AEHI$6<`glGJzGJDt$lrkO`"wxy<=>?AEHIt"wxy<=>?AEHI&nkO`"wxy<=>?AEHI"wxy<=>?AEHIt"wxy<=>?AEHI(pkO`"wxy<=>?AEHI"wxy<=>?AEHIt"wxy<=>?AEHI"wxy<=>?AEHI&ntkO`"wxy<=>?AEHIt"wxy<=>?AEHI"wxy<=>?AEHI&8kO`GJ"wxy<=>?AEHIt"wxy<=>?AEHI&nkO`"wxy<=>?AEHIGJt"wxy<=>?AEHI$6<kO`GJtGJ&0qHQ=`mr"&&,yyy=`z:Caf mr,6IIIl))*tt&0JJKgl!! LL=`"& MMmrt,NNwwzPOO KQl0='(N=NPglbvxhk&PPl)&QQgrAF "& RRmr SS&0TTTglmr!&6UUUgl)z&0qVu=`mryz{&6qWM=`mrt&XXl),2YYYl)z!,<ZZZl)) ^^mr&,___glz! ``glz aagl:C&0bbbgl!z,<cccl))z,<dddl))!eeweKQ ff!2ggl=N)gl;At hhmr$4ii~w !'7z&jjl)| kkO`t"2ql=`mr G L:C M V $4:ql=`mr G L:C M V &mml)&Iml) nnO` oogl)*&ppl)z qq=`:C-- // 36 afmr rr=N ssKQ!&ttRXO` uumryz{,<vvv)z&??l)Yk<= ww xxgl8Hzz~l)RS!'7zJ{{KQl0'(AwwCDIT,{|=N gl!&}} ,&TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ )*+2 9 a3 \4D      )&),< ) 9 a)R      !"#$%&'()*+,6789:;<=>?@AB012345-./l)=N6glHNOPQ8l)=N6glHNN$^_`abcdMNOPQRSTUVWXYZ[\]fgJKLijkGHI KQ'(vx !"mm#>KQ'(vxmm <z$lr~"wxy<=>?AEHIz"wxy<=>?AEHI&n~"wxy<=>?AEHI"wxy<=>?AEHIz"wxy<=>?AEHI(p~"wxy<=>?AEHI"wxy<=>?AEHIz"wxy<=>?AEHI"wxy<=>?AEHI&nt~"wxy<=>?AEHIz"wxy<=>?AEHI"wxy<=>?AEHI&8~GJ"wxy<=>?AEHIz"wxy<=>?AEHI&n~"wxy<=>?AEHIGJz"wxy<=>?AEHI$6<~GJzGJ8~~KQ'(%=`'z [[gl --//36afmr  G L W \uz$ ]\mr --//36afmr  G L W \uz$J"34)* & )*b;"wxy<=>?AEHIA;>C >C >C"KQ!:C "&--//36Of#mr;A 1 6G M S Y : bk s  G L W \|( :J[Luz^dejv|}~X)hijklmnopqrstuvwxyz{|}~KQ!z:89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop)9&)H!tt & t$ ^DJPV\bhntzghijklmnopqrZ"#$%&'ABCDEFgr    "'AF4gr    "'AF +,..027<O`  s 0 B TJ[fDJPV\bhntzghijklmnopqrZ"#$%&'ABCDEFgr    "'AF6@gr    "'AFDJ8>Hgr    "'AFDJD14 14!(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! (.4:@FLRX^djpv|                  (  |   s  $J[6"JPV\bhntz  Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q'Q(Q)Q*Q+Q,Q-Q.Q/Q0Q1Q2Q3Q4Q5Q6Q7Q '7" '7 : b)RS"2l):C"7);ACCZ*lmnopqrstuvwxyz{|}~7) S Vlmnpstuy|~                    # $ % ( ) , . / 0 2 4 5 8 ; ? @ A C D W X Y [ ^ _ ` c d g i j k m o p s v z { | ~                " % ) * + - . ` a b d g h i l m p r s t v x y |    )*+-012569;<=?ABEHLMNPQqrsuxyz}~   #$')*+-/036:;<>?!"#%'(+.23467  !"#%&   !(,,LLhhxy~~/ ! 0> 7 EN c r] m } !} ~    #$*(%'- )+,"/.01&!92:@>;3=C456?AB8EDFG<7OHPVTQISYJKLUWXN[Z\]RMe^fljg_io`abkmndqprshc{t|}uvwxz~y     ! "#+$,20-%/5&'(134*7689.)A:BHFC;EK<=>GIJ@MLNOD?WPX^\YQ[aRST]_`VcbdeZUmfntrogqwhijsuvlyxz{pk&'-+( *0!"#,./%2134)$lmnpstuy|~                    # $ % ( ) , . / 0 2 4 5 8 ; ? @ A C D W X Y [ ^ _ ` c d g i j k m o p s v z { | ~                " % ) * + - . ` a b d g h i l m p r s t v x y |    )*+-012569;<=?ABEHLMNPQqrsuxyz}~   #$')*+-/036:;<>?!"#%'(+.23467  !"#%&   Pqrstuvwxyz{|}~:Czz    9O Zz\+zz)* z:Cz  8 ] ^ _ {Z1234,2)z:C,2z:C"2<B  .) / 9z:Cz:C#6IK579;=?ACEGJLH:@>86BFD<  opq+,.012789:;<&,[[gl 68:<>@BDFHJL&,]\mr 68:<>@BDFHJL qq=` 68:<>@BDFHJL6.b T^",NbFpZdnL~  &,28>D^SQVUPONMT $XTON] $]`[TX  &,28>DX^TSQUONMT $AX]TSO _][O  &,28>DT^SQPUONMO]X]NT X]NP$*06<WS QUPONMTX]N &,[T!X]ON $`[T%X#] "(.4:@FL3^1W/V-S+Q)PUONM UNM5O M9U7ON [>X<T:N  &,28>D^SQVUPONMT $XTON] $]`[TX  &,28>DX^TSQUONMT $BX]TSO $`_][O$*06<^SQPUONMO]X]NT  X]NP$*06<WSQUPONMTX]N &,[T"X ]ON &,U`[T&X$] "(.4:@FL4^2W0V.S,Q*PUONM UNM6O M8OUN [?X=T;N$358::<=DSUX'ZZ+\],L~ $,4<DLRX^djpIMIKINIEIOILKEMONLII hDFLTarab&latnJARA SND URD  TRK curs kern&marko4opX  &,))VJDA;/A;/A !(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! !(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! !(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! !(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! !(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! PP!(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! &8BHRXbx228dd222`,KQ'(glww(mm+ !(,,"KL#fh%xy(~~*+-;K ! 0Z 7 Ej  y c r  !anj!(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! lnsty #!(,,LLhhxy~~::!BB"#3 ! 0B 7 ER  a  b c rc s  M M U U !..66 (.4:@FLRX^djpv|zz)g nzg >Iy?AI>DJPV\bhntz,hfzhNX,hNc M N 8I$gx6d M N e M N oq =N f M Ng!(,,"KL#fh%xy(~~*+-;K ! 0Z 7 Ej  y c r  !anA h~fll  oq =N  0BT8Ifxgx 2"#$%&\]^_`{|}~flm  oq =N  0BT8Ifxgx 2"#$%&\]^_`{|}~dn  oq =N  0BT8Ifxgx 2"#$%&\]^_`{|}~O!(,,LLhhxy~~/ ! 0> 7 EN c r] m } !8IgxP!(,,LLhhxy~~/ ! 0> 7 EN c r] m } !FQKK fg   an*88IgxFRKK fg   an*8N>  &,hghhh_hQ'tuvwx3456789<=>?ADEHI' "(.4:@FLRX^djpv| (h (hhhh%h9hhqh">%hqh%hHH9h%hhp> ( ( ( ( ({ (M (phphph>h@>h hh%hN>f  &,b^bbb_bQ y@GJ *06<BHNTZ`bbb4bb4&B&.  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| ;J> l6 XB;8EB 8PKf8,8) j S($8Qy8_fZ8$R\L68M8!(|!81Y1X:Jj1^ W[#pB8 8PKf,8j($8Q_f$L68!(|!8JW[#pJJ]#ffl&'*0348:;<>?@ACEIKMRS\^efmprxyz{}~  #$%  a  = x  Z ' [ ' JsYi8_)%D   ^h ~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzX^<<<<X^X^<X^X^<X^X^<<X^ XX^:XX)XXXXXJJJJJXXJXXJXXJ::::::::::::::::|dfhXXFFFFFXXFXXFXXFXX~~~~~XX~XX~XX~d ))))))))))))))))VV^XXc(c(c(c(c(XXc(XXc(XXc(XXc&c&c&c&c&XXc&XXc&XXc&ZTVT_:}})+ -. %'00AACCmm  . E E/ Y h0 @ A  B = =C x xD E F V Z Zf g ' 'h [ [i j  .k { | }~JJssYYap8800Wf))QQAHh8N pv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~pBpBLpB~^,Lrf fx~FlLpBrl0&L.zz~V;.S J<4|do nx[LF~ILXSvxxvH&)9cfht|h c(xc&xGVP rT , dR<;!~!x4f"38P2T{ sk dcEGLLLfff888LXL\XL]A~XPXl/2$%&'*+-/03468:;<>?@ACEIKMPQRSUXY\]^_aefjkmprxyz{}~    #$%,2"#%\]_{|~/CDEIRS y &,28>DJPV9ZU!(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! V!(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! oq =N 0BW!(,,LLhhxy~~/ ! 0> 7 EN c r] m } ! "& bgFXKK fg   an*8 FYKK fg   an*8 oq =N 0BZ l {  oq =N 0BT[ l { 8I$gx6\ l { "& bg] l { [t*^^`}_#!(,,LLhhxy~~::!BB"#3 ! 0B 7 ER  a  b c rc s  M M U U !..66lmnpstuy|~                    # $ % ( ) , . / 0 2 4 5 8 ; ? @ A C D W X Y [ ^ _ ` c d g i j k m o p s v z { | ~                " % ) * + - . ` a b d g h i l m p r s t v x y |    )*+-012569;<=?ABEHLMNPQqrsuxyz}~   #$')*+-/036:;<>?!"#%'(+.23467  !"#%&   FSKQ'(glww(mm+T|)^` :C   M V(.72< )^a :C   M V(.72< ) (z "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " q~Uo//UoUo qqqqqqqqqqqqqqqqq~~UUUUUUoooooo///]/\/]/V/////UUUUUUooooooUUUUUUoooooo)66NNVWZ[hhkkst    ##446799  b h & 2 E  P W _W'7`qQa[td  !!!:^  !!:X !:^!!cX!c<$j!z{|}~!z{|}~!z{|}~!z{|}~d!z{|}~!z{|}~!z{|}~O^!z{|}~!z{|}~aX!z{|}~a<$j!z{|}~!z{|}~!z{|}~!z{|}~bd !!z{|}~!z{|}~!z{|}~b^"#!z{|}~!z{|}~bX$!z{|}~bd%&'!z{|}~!z{|}~!z{|}~P^()!z{|}~!z{|}~dX*!z{|}~dd+,-!!!:^./!!:X0!:^12!!cX3!c$j<4567!z{|}~!z{|}~!z{|}~!z{|}~d89:!z{|}~!z{|}~!z{|}~O^;<!z{|}~!z{|}~aX=!z{|}~a$j<>?@A!z{|}~!z{|}~!z{|}~!z{|}~bdBCD!z{|}~!z{|}~!z{|}~b^EF!z{|}~!z{|}~bXG!z{|}~bdHIJ!z{|}~!z{|}~!z{|}~P^KL!z{|}~!z{|}~dXM!z{|}~d. >>^^$$&&**--22446688DDFFGG HH II LL PQ RR UU VVWWXXYYZZ\\]]                      !!""$$&&(())**++,,--..//00112233446688;;==??@@          >^d$@ ZZ\\6688@ R$ 1z0.,"`H@~h`hHb 6@   ??ll||    #  #(0##$$%%&&')**+,--./0011223344556677 88 99 :: ;; <<==DDFFGGHHIIJJKKLLMMNNOO PQRRSS!TT"UUVV&WW)XX*YY,ZZ-[[.\\/]]+ll *//             &&  &!!""&## $$)%% &&)'' (())) ***++ ,,*-- ..*// 00*11 22*33 44*55 66-7788/99::;;+<<==+>>??+@@CC!&& ) ) ) - - -+)/$%$%0' ?l|^ @ b*jRBP&v&lnnB@nVbjz^zx|xDDEEFFGGHHII JJKK LLMM NN OO PQ RRSSTTUUVVWWXXYYZZ[[\\]]            ""$$&&((**,,..0022446688;;==??CC                #""$$%%&&')**+,--./22334455778899::<< ?? @@DD FFGGHHJJKKMMNNOORRSSTTVV"WW$XX%YY&ZZ'[[(\\)``lloo!  %))     ""  """"##$$$%%&&$''(($))**%++,,%--..%//00%1122%3344%5566'77 88)99 CC""$$$'''$ )  DEFGHIJKLMNOPQRSTUVWXYZ[\]   "$&(*,.02468;=?C ^8?rllpjdzbvrn^ r$ $"<hT46:nTz6\xbF^Ld~frt**dj|\~@ V^8HJLrfJftby$$%%&&''(())**+, -- .. // 00 112233445566778899::;;<<==        !!##%%''))++--//1133557799::<<>>    -  - + 4>2$$%%&&')**+,--./0011223344556677 88 99 :: ;; <<==??@@DDEEFFGGHHII JJ#KK&LLMM'NN&OO(PQRRSS*TT,UUVV1WW5XX8YY:ZZ;[[<\\=]]9``ll$oo0||%  8==####&&'&(((((        11  1!!""1## $$5%% &&5'' ((5)) **8++ ,,8-- ..8// 00811 22833 44855 66;7788=99::;;9<<==9>>??9@@ CC' &&&*11 5 5 5 ; ; ;9&5=././$%  >)76"!32$%&'()*+,-./0123456789:;<=  !#%')+-/13579:<>\ <8H  bbooEE     w  $$%%')+,--./00113355778899 :: ;; << ?? @@GGHHRR   ##%%''))++--//113355 77 99      boEV %%%%%%%%&& &&&&"&(&.&4&:&@&F&L&R&X&^&d&j&p&v&|&&&&&&&&&&&&&&&&&&&&&''' ''''$'*'0'6'<'B'H'N'T'Z'`'f'l'r'x'~'''''''''''''''''''''(((((( (&(,(2(8(>(D(J(P(V(\(b(h(n(t(z(((((((((((((((((((((()) ))))")().)4):)@)F)L)R)X)^)d)j)p)v)|)))))))))))))))))))))*** ****$***0*6*<*B*H*N*T*Z*`*f*l*r*x*~*********************++++++ +&+,+2+8+>+D+J+P+V+\+b+h+n+t+z++++++++++++++++++++++,, ,,,,",(,.,4,:,@,F,L,R,X,^,d,j,p,v,|,,,,,,,,,,,,,,,,,,,,,--- ----$-*-0-6-<-B-H-N-T-Z-`-f-l-r-x-~---------------------...... .&.,.2.8.>.D.J.P.V.\.b.h.n.t.z......................// ////"/(/./4/:/@/F/L/R/X/^/d/j/p/v/|/////////////////////000 0000$0*00060<0B0H0N0T0Z0`0f0l0r0x0~000000000000000000000111111 1&1,12181>1D1J1P1V1\1b1h1n1t1z111111111111111111111122 2222"2(2.242:2@2F2L2R2X2^2d2j2p2v2|222222222222222222222333 3333$3*30363<3B3H3N3T3Z3`3f3l3r3x3~333333333333333333333444444 4&4,42484>4D4J4P4V4\4b4h4n4t4z444444444444444444444455 5555"5(5.545:5@5F5L5R5X5^5d5j5p5v5|555555555555555555555666 6666$6*60666<6B6H6N6T6Z6`6f6l6r6x6~666666666666666666666777777 7&7,72787>7D7J7P7V7\7b7h7n7t7z777777777777777777777788 8888"8(8.848:8@8F8L8R8X8^8d8j8p8v8|888888888888888888888999 9999$9*90969<9B9H9N9T9Z9`9f9l9r9x9~999999999999999999999:::::: :&:,:2:8:>:D:J:P:V:\:b:h:n:t:z::::::::::::::::::::::;; ;;;;";(;.;4;:;@;F;L;R;X;^;d;j;p;v;|;;;;;;;;;;;;;;;;;;;;;<<< <<<<$<*<0<6<<=D=J=P=V=\=b=h=n=t=z======================>> >>>>">(>.>4>:>@>F>L>R>X>^>d>j>p>v>|>>>>>>>>>>>>>>>>>>>>>??? ????$?*?0?6?@D@J@P@V@\@b@h@n@t@z@@@@@@@@@@@@@@@@@@@@@@AA AAAA"A(A.A4A:A@AFALARAXA^AdAjApAvA|AAAAAAAAAAAAAAAAAAAAABBB BBBB$B*B0B6BCDCJCPCVC\CbChCnCtCzCCCCCCCCCCCCCCCCCCCCCCDD DDDD"D(D.D4D:D@DFDLDRDXD^DdDjDpDvD|DDDDDDDDDDDDDDDDDDDDDEEE EEEE$E*E0E6EFDFJFPFVF\FbFhFnFtFzFFFFFFFFFFFFFFFFFFFFFFGG GGGG"G(G.G4G:G@GFGLGRGXG^GdGjGpGvG|GGGGGGGGGGGGGGGGGGGGGHHH HHHH$H*H0H6HIDIJIPIVI\IbIhInItIzIIIIIIIIIIIIIIIIIIIIIIJJ JJJJ"J(J.J4J:J@JFJLJRJXJ^JdJjJpJvJ|JJJJJJJJJJJJJJJJJJJJJKKK KKKK$K*K0K6KLDLJLPLVL\LbLhLnLtLzLLLLLLLLLLLLLLLLLLLLLLMM MMMM"M(M.M4M:M@MFMLMRMXM^MdMjMpMvM|MMMMMMMMMMMMMMMMMMMMMNNN NNNN$N*N0N6NODOJOPOVO\ObOhOnOtOzOOOOOOOOOOOOOOOOOOOOOOPP PPPP"P(P.P4P:P@PFPLPRPXP^PdPjPpPvP|PPPPPPPPPPPPPPPPPPPPPQQQ QQQQ$Q*Q0Q6QRDRJRPRVR\RbRhRnRtRzRRRRRRRRRRRRRRRRRRRRRRSS SSSS"S(S.S4S:S@SFSLSRSXS^SdSjSpSvS|SSSSSSSSSSSSSSSSSSSSSTTT TTTT$T*T0T6TUDUJUPUVU\UbUhUnUtUzUUUUUUUUUUUUUUUUUUUUUUVV VVVV"V(V.V4V:V@VFVLVRVXV^VdVjVpVvV|VVVVVVVVVVVVVVVVVVVVVWWW WWWW$W*W0W6WXDXJXPXVX\XbXhXnXtXzXXXXXXXXXXXXXXXXXXXXXXYY YYYY"Y(Y.Y4Y:Y@YFYLYRYXY^YdYjYpYvY|YYYYYYYYYYYYYYYYYYYYYZZZ ZZZZ$Z*Z0Z6Z[D[J[P[V[\[b[h[n[t[z[[[[[[[[[[[[[[[[[[[[[[\\ \\\\"\(\.\4\:\@\F\L\R\X\^\d\j\p\v\|\\\\\\\\\\\\\\\\\\\\\]]] ]]]]$]*]0]6]<]B]H]N]T]Z]`]f]l]r]x]~]]]]]]]]]]]]]]]]]]]]]^^^^^^ ^&^,^2^8^>^D^J^P^V^\^b^h^n^t^z^^^^^^^^^^^^^^^^^^^^^^__ ____"_(_._4_:_@_F_L_R_X_^_d_j_p_v_|_____________________``` ````$`*`0`6`<`B`H`N`T`Z```f`l`r`x`~`````````````````````aaaaaa a&a,a2a8a>aDaJaPaVa\abahanatazaaaaaaaaaaaaaaaaaaaaaabb bbbb"b(b.b4b:b@bFbLbRbXb^bdbjbpbvb|bbbbbbbbbbbbbbbbbbbbbccc cccc$c*c0c6cdDdJdPdVd\dbdhdndtdzddddddddddddddddddddddee eeee"e(e.e4e:e@eFeLeReXe^edejepeve|eeeeeeeeeeeeeeeeeeeeefff ffff$f*f0f6fgDgJgPgVg\gbghgngtgzgggggggggggggggggggggghh hhhh"h(h.h4h:h@hFhLhRhXh^hdhjhphvh|hhhhhhhhhhhhhhhhhhhhhiii iiii$i*i0i6ijDjJjPjVj\jbjhjnjtjzjjjjjjjjjjjjjjjjjjjjjjkk kkkk"k(k.k4k:k@kFkLkRkXk^kdkjkpkvk|kkkkkkkkkkkkkkkkkkkkklll llll$l*l0l6lmDmJmPmVm\mbmhmnmtmzmmmmmmmmmmmmmmmmmmmmmmnn nnnn"n(n.n4n:n@nFnLnRnXn^ndnjnpnvn|nnnnnnnnnnnnnnnnnnnnnooo oooo$o*o0o6opDpJpPpVp\pbphpnptpzppppppppppppppppppppppqq qqqq"q(q.q4q:q@qFqLqRqXq^qdqjqpqvq|qqqqqqqqqqqqqqqqqqqqqrrr rrrr$r*r0r6rsDsJsPsVs\sbshsnstszsssssssssssssssssssssstt tttt"t(t.t4t:t@tFtLtRtXt^tdtjtptvt|tttttttttttttttttttttuuu uuuu$u*u0u6uvDvJvPvVv\vbvhvnvtvzvvvvvvvvvvvvvvvvvvvvvvww wwww"w(w.w4w:w@wFwLwRwXw^wdwjwpwvw|wwwwwwwwwwwwwwwwwwwwwxxx xxxx$x*x0x6xyDyJyPyVy\ybyhynytyzyyyyyyyyyyyyyyyyyyyyyyzz zzzz"z(z.z4z:z@zFzLzRzXz^zdzjzpzvz|zzzzzzzzzzzzzzzzzzzzz{{{ {{{{${*{0{6{<{B{H{N{T{Z{`{f{l{r{x{~{{{{{{{{{{{{{{{{{{{{{|||||| |&|,|2|8|>|D|J|P|V|\|b|h|n|t|z||||||||||||||||||||||}} }}}}"}(}.}4}:}@}F}L}R}X}^}d}j}p}v}|}}}}}}}}}}}}}}}}}}}}}~~~ ~~~~$~*~0~6~<~B~H~N~T~Z~`~f~l~r~x~~~~~~~~~~~~~~~~~~~~~~~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|ĀʀЀր܀ $*06DJPV\bhntz‚Ȃ΂Ԃڂ "(.4:@FLRX^djpv|ăʃЃփ܃ $*06DJPV\bhntz…ȅ΅ԅڅ "(.4:@FLRX^djpv|ĆʆІֆ܆ $*06DJPV\bhntzˆȈΈԈڈ "(.4:@FLRX^djpv|ĉʉЉ։܉ $*06DJPV\bhntz‹ȋ΋ԋڋ "(.4:@FLRX^djpv|ČʌЌ֌܌ $*06DJPV\bhntzŽȎΎԎڎ "(.4:@FLRX^djpv|ďʏЏ֏܏ $*06DJPV\bhntz‘ȑΑԑڑ "(.4:@FLRX^djpv|ĒʒВ֒ܒ $*06DJPV\bhntz”ȔΔԔڔ "(.4:@FLRX^djpv|ĕʕЕ֕ܕ $*06Ds<BbJDbBLbbLbLb>~ d dbbbbbbbbbbbbbb6bbbDbXbbbbULbbBJDBbbbLbLbLbLbG#Lb d df~H~ dt~>~bbbbbbbbbbbNbNbbbbbbbbb6b6b6b6b6b6bbbb bbbbbbbbbbbDbDbDb XbXbXbXbXbbt~bbbbbbbbbbbbbbbb+XbbbbbbbLbLbLb d ~bbb6b6bbbbXbXbXbDbbbbf~z~bb d^B_BbbbbXX ~bbbbbbb,bbbLbbbbb,b6bJb lb dXbbbbb bb&bbabXbDbbXbbbbbXbXbbb bbbbb bXbblb bbbb b*bbbbbbbbIbbbb,bb&Phb"bbPbbb&b8bb,bbbb&6bbbbdbbbbbbbbDb4bbbXbb(bb"bbbbbb7b>b$bdbbbbbbbbbbb@bbbd|_bWbZbbbbbbLbbhbb'bbMbbbbbbTbTb,bbfbbcb1dbbbbXb:bbrbrbrbb bb bbbbb.bbnb1dbbbbbbbbXbbbbbl|bbbbbdb?bbbbb|bdbbbbeb,bvb2b,bWbXbbbbbb[bDb,bbbcbbbPbbb^bbbbXdbbbbXbbbbbb&bbbwbbb&vbbbbbbb,b,b,b,b,b,b,bbfbbbbbbbbb\bbb@hbbbbbbbbbbbbbbb;bbbbbbbbbbbbbb;bbb@bbbbbbbbbbbbbbbbb,0bbbbbbbbbbbbbbbbb,0bbbbbbbbbbbbbbbbbbbbbbb#b,b7,b,b,b,b,b,b,b,b#,b,bJb}JbJbJbJbJbJbJbJb#JbJb   >z >z  Hzzz4ztz z z tzbbbbbbbbbbbbbbbbbbwbbbbbbbbbbbbbXbXbXbXbXbXbXbXbXbXbXbXbXXbXbXbbbbbbbbbbb bb bbbb b b b bbbbbbb&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&b&bababababababababababababababababababXXXXXbbbbbbbbbbbbbbbbbbbbb87AiXbXbXbXbbbb~~bbbbbbbbbbbbbbbbbbbb b b b b bXbXbXbXbXbXbXbXbXbXbXblblblblblblblblblb## b b bbbbbbbbbbbbbbbbbbbbbbAjS5bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb:$bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbIbIbIbIbIbIbbCwWJbbbbV|V|bbb],Xubbbbbbbbbbbb,b,b,b,b,b,b,b,b,b,b,b,bE,b,b,bZb^bbbbbb"b Jbbbbbbbbb Jb&Phbhbhbhbhbhb @*"b"b"b"b"b"b"b "b"b"b"b"b"b"b`#30"b"b"b"b  "b"b"b"b"b"b"b"b"b"b`#30"b"b"bbP@<PbPbPbPbPbPbPbPbPbPbPbPbPb(Pbr#x0PbPbPbPbPbPbPbPbPbPbPbPbPbPbr#x0PbPbPbbbbbXbbbbbbbbbKbbbbbbbbbbbbbbb#bbsbbbbbbbbbbbbbbbbbsbbb&b8b8b8b8b8b8b8b8b8b[8b8b8b88b8b8b3B8}88$8x#$$88x#88#K bbbmabb6u,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b@bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&&&&&&)|6bbb6b6b6b)|bbbbbbbbbbbbbbbbbbbbbbbdrdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb<:dbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbbbbbbbbbbbbb V,0,bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc=bbb bbbbbbbbbbbbHbbbSbbbbbbbbbDbDbDbDb4bTbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb6bbbb?bbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbb((b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(b(bbbbbbbbbbbb"rb"b"b"b"b"b"b"b/"b"b"b"b"b"b"bb76"b"b"b"b//"b"bhb"b"b"b"b"b"b"bb76"b"b"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb7b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b>b$@C$b$b$b$b$b$b$b%$b$b$b$b$b$b$by#L0$b$b$b$b%%$b$b$b$b$b$b$b$b$b$by#L0$b$b$bdbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb7bbbbb bbbbbkbbbbbbbbbbbbbbbbbybbbybbbbbbbbb@bbb@b@b@bbbbbbbbbb_:_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_bWbWbWbWbWbWbWbWbWbWbWbWbWbWb#WbWbWbWbWbWbWbWbWbWbWbWbWbWb#WbWbWbZbZbZbZbZbZbZbZbZbyZbZbZbZZbZbZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb6bbbbbbbbbbbbbbbE&bbbbbbbbbbbbbbE&bbbb*bRpbbbbbbRbb*bzbbNbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbL,LbLbLbLbLbLbLbLbL%LbLbLbLbLbLb$Lb-tLbLbLbLbL%L%LbLbLbLbLbLbLbLbLbLb-tLbLbLbbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhb@bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"'b'b'b'b'b'b'b'b/'b'b'b'b'b'bw'b7'b'b'b'b//'b'b'b'b'b'b'b'b'b'b7'b'b'bbFLbbbbO~bbMbMbMbMbMbMbMbMbMbyMbMbMbMMbMbMbbbbbbbbbbbbbbbbbbbbbbrbrbrbrbrbrbrbrbrbrbrbrbrbbbbbbTbTbTbTbTbTbTbTbTb:=TbTbTbTbTbTb~ TTT'TTTThFTS/nTTTT''TTTTTTTTS/nTEpY;bbbbbbbbb3bbbbbbbbP bbbb33bbbbbbbbbbP bbb,b,b,b,b,b,b,b,b,b,b,bbbb"Zt"ZbbbbbbbbbbEpY;ffffffffffffffffffffffffffffffffffffffffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbcbcbcbcbcbcbcbcbcbcbcb1cbcbcb1d1d1d 1dO1d1d*2@11dTbbbYbbbbbbbbbXbXbXbXbXbXbXbXbXb"XbXb0XX(Xb0:b:b:b:b:b:b:b:b:bB:b:b:b::b:b:bbbbbbbbbbbbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrb@bbbbbbbbbbbbbbbbb0bbbbbbbbbbbbbbbbb0bbb@3bbbbbbbbbbbbbbi#=0bbbbbbbbbbbbbbi#=0bbbbbbbbbbbbb @_Ob1bbbbObObFbbbObbbb101bb1bbFbbObbb1bbb1bOb10bObOb.b.b.bb.bb.b.bb)bb7/.b7bbbbbbbbb=bbbbbbbM9*R&R1d1d1dP1dO1d1dYF121db8bbbbbbbb8bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbi;bbbbbbbbbbbbbXXXXX^Dbbb%bbb^Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbl|l|l|gl|l|bbbbbbb6#bbbbbbbb6#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdbdbdbdbdb?b?b?bf?b?bbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|b|b|b|b|b|b|bdb,b,bdbdbdbdb,b,bdb,bdbdbbbbbbbbbb-bbbbbbbbbebebebebebebebebebebeb,b,b,b,b,bvb2b,bS#,b,b,b,b,b,b,b,bS#,b,b,b,b,b,bWPurWWWWWWWWWWWWWW/W@WWWWWWWWWWWWWWWW@WWWbbbbbbbbbbbbbbbbbXbXbXbbbbbbbbbbb'bbbb,lbbbbbbbbbbU7bbbbbbbbbbbbbbbbbbb Q[C[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b3 [b[b3[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b[b3[b[b[bDb,b#FA7bbb77#bb#7bbbwK6AbAb##bb7bbAbbb7wK6b77bcbbbbbbbbbbbbbbbbbbbbbbbb)bbbbbbbbbbbbbbbbb)bbbPbPbPbPbPbPbPbPbP+PbPbPbPbPbPbZPb3PbPbPbPbP+P+PbPbPbPbPbPbPbPbPbPb3PbPbPbbbbb^b^b^b 9^b^bbbbbbbbbbbbbbbbbbbXXXXXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbXXXXXbbbbbbbbbi;bbbbbbbbbbbbbbbbi;bbbbbbbbbbbbbbbbM)bbG7/bG7bbbbbbbbb)bb7/b7bb bH<H<<Ya^,,d,,,,,^ZYY<,^a<Ya^,,,,,,,^|YY,^an<PYaxn^d,d,Pd,d,d,d,d,n^ PYPY(d,n^axi<KYasi^_,_,K_,_,_,_,_,i^KYKY#_,i^as<{Ya^,,,,,,,^4{Y{Yk,^a<Y(a^,,,,,,,^YY,^(aQ<3YaPF^G,G,(G,G,G,G,G,F^3Y3YG,F^aPC<%YyaLB^9,9,$9,9,9,9,9,B^%Y%Y9,B^yaL<Y"a|^,,^,,,,,|^YY6,|^"aZw;|JJ2JJJJJ|wwJ|;<Ya^,,,,,,,^jYY,^a%<Y[a.$^,,,,,,,$^YY,$^[a.<Y a^,,,,,,,^pYY,^ a<Y a^,,,,,,,^oYY,^ a7<Yma^-,-,-,-,-,-,-,^YY-,^maj<LYasi^`,`,K`,`,`,`,`,i^LYLY#`,i^asu<WYau^k,k,Wk,k,k,k,k,u^WYWY/k,u^ay<[Yay^o,o,[o,o,o,o,o,y^[Y[Y3o,y^a <YVa)^,,,,,,,^YY,^Va)JJPJKJJJ(J$J^J&tJJJJJKJWJ[JJbbbb,b,b,bbXbXbXbbXbXbXbXbXbXbXbXbXbXbXbbbbbbXbbbbbbbbbbbbbbbbbbbbbbb^bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb^b^b^bbbbbbbbbbbbbbbbbbbb^bbHbXb^b^b^bXbXbXbbbbbbbbbbbbbbbbbHbHbHbHbHbHbHbXbXbXbbbbbbbbbbbbbbbbbbbwb&bb&bbbXbXb\hb(#<(b_bb*b$wh fbw/3Z<<(<#<k<<<<6<f<<<<#</<3<<bwbb,bbbbbbbIbbbbbbQbbbbIIbbbbbbbbbbQbbb<f<<b bb bb bb bb bb bb bb bb bb bb bb bbbb.dZZbbb -R444lAlllll<<1}~)+/-22KLWY\~>@BD    ! Q S U W 2 46 8 or&'),-.?BCDVxX&N'R yJ *06<BHNTZ`bbb ?bb b^ %%%%%%%&&& &&&&$&*&0&6&<&B&H&N&T&Z&`&f&l&r&x&~&&&&&&&&&&&&&&&&&&&&&'''''' '&','2'8'>'D'J'P'V'\'b'h'n't'z''''''''''''''''''''''(( (((("(((.(4(:(@(F(L(R(X(^(d(j(p(v(|((((((((((((((((((((())) ))))$)*)0)6)<)B)H)N)T)Z)`)f)l)r)x)~)))))))))))))))))))))****** *&*,*2*8*>*D*J*P*V*\*b*h*n*t*z**********************++ ++++"+(+.+4+:+@+F+L+R+X+^+d+j+p+v+|+++++++++++++++++++++,,, ,,,,$,*,0,6,<,B,H,N,T,Z,`,f,l,r,x,~,,,,,,,,,,,,,,,,,,,,,------ -&-,-2-8->-D-J-P-V-\-b-h-n-t-z----------------------.. ....".(...4.:.@.F.L.R.X.^.d.j.p.v.|...................../// ////$/*/0/6/
0D0J0P0V0\0b0h0n0t0z000000000000000000000011 1111"1(1.141:1@1F1L1R1X1^1d1j1p1v1|111111111111111111111222 2222$2*20262<2B2H2N2T2Z2`2f2l2r2x2~222222222222222222222333333 3&3,32383>3D3J3P3V3\3b3h3n3t3z333333333333333333333344 4444"4(4.444:4@4F4L4R4X4^4d4j4p4v4|444444444444444444444555 5555$5*50565<5B5H5N5T5Z5`5f5l5r5x5~555555555555555555555666666 6&6,62686>6D6J6P6V6\6b6h6n6t6z666666666666666666666677 7777"7(7.747:7@7F7L7R7X7^7d7j7p7v7|777777777777777777777888 8888$8*80868<8B8H8N8T8Z8`8f8l8r8x8~888888888888888888888999999 9&9,92989>9D9J9P9V9\9b9h9n9t9z9999999999999999999999:: ::::":(:.:4:::@:F:L:R:X:^:d:j:p:v:|:::::::::::::::::::::;;; ;;;;$;*;0;6;<;B;H;N;T;Z;`;f;l;r;x;~;;;;;;;;;;;;;;;;;;;;;<<<<<< <&<,<2<8<>>> >>>>$>*>0>6><>B>H>N>T>Z>`>f>l>r>x>~>>>>>>>>>>>>>>>>>>>>>?????? ?&?,?2?8?>?D?J?P?V?\?b?h?n?t?z??????????????????????@@ @@@@"@(@.@4@:@@@F@L@R@X@^@d@j@p@v@|@@@@@@@@@@@@@@@@@@@@@AAA AAAA$A*A0A6ABDBJBPBVB\BbBhBnBtBzBBBBBBBBBBBBBBBBBBBBBBCC CCCC"C(C.C4C:C@CFCLCRCXC^CdCjCpCvC|CCCCCCCCCCCCCCCCCCCCCDDD DDDD$D*D0D6DEDEJEPEVE\EbEhEnEtEzEEEEEEEEEEEEEEEEEEEEEEFF FFFF"F(F.F4F:F@FFFLFRFXF^FdFjFpFvF|FFFFFFFFFFFFFFFFFFFFFGGG GGGG$G*G0G6GHDHJHPHVH\HbHhHnHtHzHHHHHHHHHHHHHHHHHHHHHHII IIII"I(I.I4I:I@IFILIRIXI^IdIjIpIvI|IIIIIIIIIIIIIIIIIIIIIJJJ JJJJ$J*J0J6JKDKJKPKVK\KbKhKnKtKzKKKKKKKKKKKKKKKKKKKKKKLL LLLL"L(L.L4L:L@LFLLLRLXL^LdLjLpLvL|LLLLLLLLLLLLLLLLLLLLLMMM MMMM$M*M0M6MNDNJNPNVN\NbNhNnNtNzNNNNNNNNNNNNNNNNNNNNNNOO OOOO"O(O.O4O:O@OFOLOROXO^OdOjOpOvO|OOOOOOOOOOOOOOOOOOOOOPPP PPPP$P*P0P6PQDQJQPQVQ\QbQhQnQtQzQQQQQQQQQQQQQQQQQQQQQQRR RRRR"R(R.R4R:R@RFRLRRRXR^RdRjRpRvR|RRRRRRRRRRRRRRRRRRRRRSSS SSSS$S*S0S6STDTJTPTVT\TbThTnTtTzTTTTTTTTTTTTTTTTTTTTTTUU UUUU"U(U.U4U:U@UFULURUXU^UdUjUpUvU|UUUUUUUUUUUUUUUUUUUUUVVV VVVV$V*V0V6VWDWJWPWVW\WbWhWnWtWzWWWWWWWWWWWWWWWWWWWWWWXX XXXX"X(X.X4X:X@XFXLXRXXX^XdXjXpXvX|XXXXXXXXXXXXXXXXXXXXXYYY YYYY$Y*Y0Y6YZDZJZPZVZ\ZbZhZnZtZzZZZZZZZZZZZZZZZZZZZZZZ[[ [[[["[([.[4[:[@[F[L[R[X[^[d[j[p[v[|[[[[[[[[[[[[[[[[[[[[[\\\ \\\\$\*\0\6\<\B\H\N\T\Z\`\f\l\r\x\~\\\\\\\\\\\\\\\\\\\\\]]]]]] ]&],]2]8]>]D]J]P]V]\]b]h]n]t]z]]]]]]]]]]]]]]]]]]]]]]^^ ^^^^"^(^.^4^:^@^F^L^R^X^^^d^j^p^v^|^^^^^^^^^^^^^^^^^^^^^___ ____$_*_0_6_<_B_H_N_T_Z_`_f_l_r_x_~_____________________`````` `&`,`2`8`>`D`J`P`V`\`b`h`n`t`z``````````````````````aa aaaa"a(a.a4a:a@aFaLaRaXa^adajapava|aaaaaaaaaaaaaaaaaaaaabbb bbbb$b*b0b6bcDcJcPcVc\cbchcnctczccccccccccccccccccccccdd dddd"d(d.d4d:d@dFdLdRdXd^dddjdpdvd|dddddddddddddddddddddeee eeee$e*e0e6efDfJfPfVf\fbfhfnftfzffffffffffffffffffffffgg gggg"g(g.g4g:g@gFgLgRgXg^gdgjgpgvg|ggggggggggggggggggggghhh hhhh$h*h0h6hiDiJiPiVi\ibihinitiziiiiiiiiiiiiiiiiiiiiiijj jjjj"j(j.j4j:j@jFjLjRjXj^jdjjjpjvj|jjjjjjjjjjjjjjjjjjjjjkkk kkkk$k*k0k6klDlJlPlVl\lblhlnltlzllllllllllllllllllllllmm mmmm"m(m.m4m:m@mFmLmRmXm^mdmjmpmvm|mmmmmmmmmmmmmmmmmmmmmnnn nnnn$n*n0n6noDoJoPoVo\obohonotozoooooooooooooooooooooopp pppp"p(p.p4p:p@pFpLpRpXp^pdpjpppvp|pppppppppppppppppppppqqq qqqq$q*q0q6qrDrJrPrVr\rbrhrnrtrzrrrrrrrrrrrrrrrrrrrrrrss ssss"s(s.s4s:s@sFsLsRsXs^sdsjspsvs|sssssssssssssssssssssttt tttt$t*t0t6tuDuJuPuVu\ubuhunutuzuuuuuuuuuuuuuuuuuuuuuuvv vvvv"v(v.v4v:v@vFvLvRvXv^vdvjvpvvv|vvvvvvvvvvvvvvvvvvvvvwww wwww$w*w0w6wxDxJxPxVx\xbxhxnxtxzxxxxxxxxxxxxxxxxxxxxxxyy yyyy"y(y.y4y:y@yFyLyRyXy^ydyjypyvy|yyyyyyyyyyyyyyyyyyyyyzzz zzzz$z*z0z6z{D{J{P{V{\{b{h{n{t{z{{{{{{{{{{{{{{{{{{{{{{|| ||||"|(|.|4|:|@|F|L|R|X|^|d|j|p|v|||||||||||||||||||||||}}} }}}}$}*}0}6}<}B}H}N}T}Z}`}f}l}r}x}~}}}}}}}}}}}}}}}}}}}}}~~~~~~ ~&~,~2~8~>~D~J~P~V~\~b~h~n~t~z~~~~~~~~~~~~~~~~~~~~~~ "(.4:@FLRX^djpv| $*06DJPV\bhntzȁ΁ԁځ "(.4:@FLRX^djpv|ĂʂЂւ܂ $*06DJPV\bhntz„Ȅ΄Ԅڄ "(.4:@FLRX^djpv|ąʅЅօ܅ $*06DJPV\bhntz‡ȇ·ԇڇ "(.4:@FLRX^djpv|ĈʈЈֈ܈ $*06DJPV\bhntzŠȊΊԊڊ "(.4:@FLRX^djpv|ċʋЋ֋܋ $*06DJPV\bhntzȍ΍ԍڍ "(.4:@FLRX^djpv|ĎʎЎ֎܎ $*06DJPV\bhntzȐΐԐڐ "(.4:@FLRX^djpv|đʑБܑ֑ $*06DJPV\bhntz“ȓΓԓړ "(.4:@FLRX^djpv|ĔʔД֔ܔ $*06DJPV\bhntz–ȖΖԖږ "(.4:@FL ,f|hODphhhhhhhhLhLhh'h'h h h hhhhXh&hp  tffhvhhhhhhhhh|hh|hhhhhhhhhhhhhLhhxxhxhh'hThhhAh'h'h'h'h'hVXhXhXh&h&x&h&h&hphpphphhhhhhh   hh  XhpWWhhhhhhhhhh|hhhhhxx]h?'hx&h0Xhhhh=jh~ h h hhXhXhhhhxXhhh^hhxhhhhhxhhhhhlhhh"h,hphhh4hhh/hXhPhXhhhhhhhhhh&hhhhhhhvhhhhhhhhhLhhXhhXh hhhhhh]hh$hhhhh,hhhh2hhhhhJhhhhhhhph2hhehhhhhdhhh|hHhh1hhhhDhhhhh hhhh"hhhhhhhhTh,hhhh|hhhqhxhhdhhZRhhhh%hhchhhhh2hhhhhhhhhhhhhhhhhQhhlh<hGhNhhhhrhThhh,hh_hThhPhhhhh.hhnhhEhhhghhh,hhh2hhXhhhhhhhhrh`hJhshhhh^h,Ph2hh,hhhhDhhd!hh^hhhhhh^hhnhhFhhdhhhh~hhhhFhhXhZhFhhhXh,hh2h,hh2hdhbf LfXhXhXhXhXhXhXhhhhhhhh^h^h^h^h^h^h^hhhhhhhhhhhhxhxhxhxhxhxhUxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhxhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhqhh:hhh:h:h{6hxhxhxhxhxhxhxhxhxhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhhhhhhhhhhhhhhhhhh"h"h"h"h"h,h,hhhh'hh'hh'h'h'hhhGh'h'hh'hhhhhhhhhhhhhhhhhhh/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/h/hXhXhXhXhXhXhP$PhPh#PhhhPhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)hhhhhhvhvhvhvhvhhhhhhhhhhhhhhhhhhhhNDhhhhhhhhhhhhhhhhhhhhhhh,h,h,h,h,h,h,h,h,h,hh,h,h,h,hXhXhXhXhRXhXhXhXhXhXhXhXhXhXh*^hhx]hhhhhhhhDhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhThThThThThThThThThThThThFThTh$\,hh+h1h1h1h1h1h1h1h1h1h1hh1h1h1h1h6EhhDh$h$h$h$h$h$h$h$h$h$h$h$h$hhhhhhhhhhhhhhhhh UhhTh!"dhhpchhhhhhhhhhhhhhhhh,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,hhhhh)#hPhhd5h2h2hM2h2h2h\2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2hC2h2h2h2h2h2h2h2h2h2h2hhhhhhhhAhhh<hhhhhhhhhhhhhhhhhhhhihhhhhhhh=hhH:hhhH:hH:hGhhh)^h[ L[[h)hhh3h)Xhhh3_)^GhG[_3)^) hG)^hh)^h)^Jhhhhhhhhhhhhhhhhhhhhhh'hhOhhhh'h1hhhhhhhhDhhhOhhhhhhhhhhhhhh,#hhhThhhhhhhhhhhhhhhhhhhhT[hhhhhhhhhhhh#hhhhhhh#hhh.hhhhhhhxhhhhhhhLhhhphphphphphphph 4phphph44 2h2hnD2h2h2h2h2D2hd2h2h2hDe2ho2h2h2h *2h2h2h2h2h*D2h2h2h2h2h2h2h2h2h2hhhaheho.hhTShhdhQ!QQhd9hhd8hhhhhhhhhhhhhhhhhdhhhhhhhhhhh`hhhhhhhhhhhhhhhh,`hhhhhhhhhhhhhhhhhhhh|x||LbL:&l tBLChhhLhhhhh$hhhhhhhhhhhhhhhhhh1h1h1h1h1h1h1h1h1h1h1h1h1h1h1h+D1hChhBhhhhhhhhn22hhDhhhhhhhrhhhhhhhhhhhhhhhhhhhbhhhhhhhhhhhhhhhhh:hhhWhWhhhhhh8hhh8Wh h hl h hx: x:xl hF h h hP:<D hF h h hP h h h hx:P: hF> h h h h h h h hhhhhhh;hhhhhhhhhhvhhhhhhhhhhhhhhhhhhhJhhhhhhhhhhhhhbhbhbhbhbhbhbhbhbhbhbhbh&kbhbh0"h"h"h"h"h"h"h"h"h"hhhhhhhhhhhhhhhh: hhhhhhhhhhhhhhhhhhhhhhhhhh*HhhhRhhh\hhhhhhhhhhhhhh\hRhhhhhhhhhThThThThTThKThThThTh%:,h%:,h,h,h,h,h,h ,h,h,h  %:hhhhhhhhhhhhhhh.zzz]5hfhfhhhhhhhphhhpphf|h|h|h|h|h|h|h|h|h|h|h |h|h|h<Zhh~hhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqh4xhxh}0xhhdhbhah%h5dhdhdhdhhhhhhhhhizhhhhhhhhhhhVhhhhYhVhhhhhhhhhhhJhhhYhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh>phhfhhhp\hhhhhhhhhhhhhphfhhhhhhhh%hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchchchchchchchchchchchchchchchchchchhhhhahhhhhhhhhDhhhhQDhhhhhhhhhhhhhhhfhhhphhhhhhhhhhhhhhhhphhhh.hhhhhhhhhhhhhhhhphhhpp2h2hnD2h2h2h2h2D2hd2h2h2hDe2ho2h2h2h *2h2h2h2h2h*D2h2h2h2h2h2h2h2h2h2hhhhhhhOhhhw|hhhhhhhhhhhhhhhh|hhhhhhhhhhhhhhhhhh"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh%hh,hh` hhXhhhhhhhhhhhhh7rhhAhhhhhh$hhhhhhhhhhhhhhhhhhhhhhhhhnhhh(hhhhhhhhhhhhhhhh(hhhhhhhhhhhhhhhhh]0hhhhhhh10hhhhhhhh{hxhFhhhP<hhhhhhhhhhhPhhhhhhhhhhhhhhhhhhhhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnh<hhhh].hhhhhhh1.hhhQhQhQhQhUC !UQhkQhQhQhuUa_Qhk-QhQhQhu&4QhQhQhQh3U&4uUQhkYQhQhQhQhQhQhQhQhhhlhh:l :lhhhh:DhhhhOhhhh\:O:h>hhhhhhhhlhlhDlh V  Vlhlhlhlhlhlhlhlh^lhL Vlhlhlhlh<h<h<h<hJ<h<h<h<h<h<h<h<h<h<h<hGhGhGhGhGhGhGhGhGhGhGhGhGhGhGhGh MNhNhNhhhhhhhhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhThThThThThThThThThThThThThThThThThhhhhhh&hhhhhhhhhhhhhh,h,h,h,h,hhhhhh_h_h_h_h_h_h_h_h_h_(_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h'(_h_h_h_h_h_h_h_h_h_h_h_h_hhhhhhhihhhlhhhhhhhhhhhhhhhhlhhhh*hhhhhhhhhhhhhhhhhhh,h,hh,h,h,h,hh,hh,h,h,hh,h,h,h,h,h,h,h,h,h,h,h,hh,h,hh,h,h,h,h,h,h,h,h,h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h*D.hhhhhhhhhhhhhhhhhhhhhEhEhEhEhEhEhEhEhEhEhEhEhEhEhzg+5nhhhhhhhhhhhhhhhhhh=g=gggggg j gggj j  =hhhhhhhhhhhhhhh,h,hhhhhhh|hhh||h,nhh<h 5,h,h,h,hhhhhhhhhhhKhhhKKhh ~hhh~0s2h2hLr2h'e$hhshXhXhXhXhXhXhhhf)Lfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhx4whhFvhvhhhhhhdh.f<Ffh rh rhrhrhrhrhrhlrhrhrhll n`hn`h`h`h`h`h`h`h o`h`h`h o o`hnJhJhJhJhJhshshshshshshshshshshshshshsh5hhhyhhhhhhhh^h^h^h^h^h^h^h^h^h^h^h)))-,-,,,,,,,,,,,-PhPh"Y@,`Ph2h2h2h2h2hI2h2h2hI2ht2hhhhhhhhhhhhhhhh h,h,hhhhhhhhhhhhhhh;hDhh(d(ddddddddddHd(!h!h!h!h{!{{!hI!h!h!hS!h"!h!h!h!h!h!h!h!h{S!hI!h!h!h!h!h!h!h!hhhhhhhhhhhhhhhhhh^h^h^hhhhhh7hhh7hbhhh hhs%hh$hhhhhhhMhhhhhhhhhh^^^^^^^\]^^^]]\`hhhhhhdhhhshhhhhhhhhhhhhhhhTshhhh1hhhhhhhhhnhhhhhhhohhh(hhhhhhhhhhhhhhhh(hhhhhhhhhhhhhFhhdhdh:f2fdhhhhhhhuhhhhhhhhhhhhhhhhhhhehhhhhhhhhhhhhhhhhhh hhh1hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh~h~hhNshhrhKwhhhxhhThpFhFh>FhhhhhhhhhhhhhhhhXhXhXhXhXhXhPhhhpFhFh>FhxhhThhhhhhhhhhhhhhhhXhXhXhXhXhXh 5,h,h,h,h ~hhh2h2hV2h 5,h,h,h,h ~hhh2h2hV2hhhhhhhhhhhhhhhhDhhhhhhhhhhhhhhhh(Dh4hhPhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)^[h[hh[_hGhh)^)^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh h h h h h hx: hlxl h hx: h h h h h h h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhVhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhDhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:hllhh:OhhhhhhhhlhlhlhlhlhlhlhDlhlhlhlhlhlhlhlh_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hhhhhhhhhhhhhhhhhhhhhhh!h!h!h!h!h!h{!h{!h!h{!h!h!h!h!h!h!h!hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhlh_hh!hhh|h|h|h|hxhh,x,xhhhhhhhhhhNlhhhhvhvhvhvhvhXhhh\hhhhhhhhhhKhhhh\h\h\h\hhhhh4Ehhhh} hhjhhhhhhhR`hmjh`hhhhhhh]hhhhhhhhhhhhhhhXhXhhhhXhXhXhhhhhhhhhhhhhhhh5hXhXhSXhZZXhXhXhXhhhhhhhhhhhhhhhththxfdhLf bXhXhhxhhh,h2hhhhh2hhh hhhhhhhchhh2hhhhQhhlh_hhh!hhhhhxhhhhhh hhhhhhhlh_hh!hhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhAGhhAGhhhhhh'hhhhhhhhhh\hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlhlhlhlhlhlhlhlhlhlhlhhhh3}~)+/-22BCKLWY\9;>@AD    ! Q S U W 2 46 8 ork(*-./@CDxE'N(R#uwx<=>?ADHI# $*06<BHNTZhhhhh,h:hhthh,hth,h:h,hhpththth@hz@hhhhN,hN|% 1ͽ<openscad-2019.05/testdata/ttf/liberation-2.00.1/AUTHORS0000644000076500000240000000036213402025764022425 0ustar kintelstaff00000000000000AUTHORS Current Contributors (sorted alphabetically): - Pravin Satpute Project Owner (Current) Red Hat, Inc. Previous Contributors - Steve Matteson Original Designer Ascender, Inc. openscad-2019.05/testdata/ttf/liberation-2.00.1/ChangeLog0000644000076500000240000000144613402025764023133 0ustar kintelstaff00000000000000* Thu Oct 04 2012 Pravin Satpute - Resolved "Glyphs with multiple unicode encodings inhibit subsetting" #851790 - Resolved #851791, #854601 and #851825 - Following GASP table version as per Liberation old version. (Anti-aliasing disabled) - Added support for Serbian glyphs for wikipedia #657849 - In Monospace fonts, isFixedPitch bit set via script for getting it recognized as Monospace in putty.exe * Fri Jul 06 2012 Pravin Satpute - Initial version of Liberation fonts based on croscore fonts version 1.21.0 - Converted TTF files into SFD files to be open source. - Update Copyright and License file - set fsType bit to 0, Installable Embedding is allowed. - Absolute value in HHeadAscent/Descent values for maintaining Metric compatibility. openscad-2019.05/testdata/ttf/liberation-2.00.1/LICENSE0000644000076500000240000001047613402025764022371 0ustar kintelstaff00000000000000Digitized data copyright (c) 2010 Google Corporation with Reserved Font Arimo, Tinos and Cousine. Copyright (c) 2012 Red Hat, Inc. with Reserved Font Name Liberation. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting ? in part or in whole ? any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components,in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. openscad-2019.05/testdata/ttf/liberation-2.00.1/LiberationSans-Regular.ttf0000644000076500000240000125377013402025764026426 0ustar kintelstaff000000000000000FFTMaSWGDEF}t14GPOSr KNGSUBOQ.OS/2˗`cmap[*.cvt JK;fpgm~a0gasp $glyf4(pmaxp  name| posthprepGI8hCW-Y_<̓G̓G j>NC z j  RT\/\33f  Px!1ASC@ Q3>`: 999Ws sIVHh !d9[99sPssgsNs/sRshsisYs`99edesTVVhV9g9 Vs9aV9aV].V  V.V-A999 sjsWsWsVsW9sVsssVssV99sS""\9ss:sqsss-sSd[k3zdA)HLPwPsS88IVVVVVVhVVVV9 9999a9a9a9a9a9GV-VsWsWsWsWsWsWBWsWsWsWsW9 999sVssVsVsVsVsVdA,sssssVsWVsWVsWhWhWhWhWVsVVsWVsWVsWVsWVsW9gsV9gsV9gsV9gsVss 999 9 999\99 Vs[s~sUssssss9asV9asV9asVaV8V]9V]9V]9V]9.9..9ssssss V-V-ASASASs @s@ s [hWz@QsRtVVY^Xs9g  9V s9aa?VaWV sVVbOl C99.[W.->/-F\]\NsZsY.$sNr9 dV +VsW99asVssssssVVsWVsWB9gsV9gsVV9asV9asV-\D dV9gsVFsVsWB9G,VsWVsWVsWVsW9i9W999asV9asVlsisV]9.9\@~!stV]_A1VsWVsW9asV9asV9asV9asVV-zSSVh s.G13V!)X VsD asVV-ssVs~s=MsVsVsWsWWH5 5K9sVsVx^sssVDnsslsVSV?WfV+++ UU999sT`(1T1\D\l9[9W9a@Ix^k.;sV/OV@V V)o)J8c''aaFg(dhWv43eeee3Cw993PBd,3bbP9..:8Y[O?^>LMK8JLD% G5Ot%ttA8SSSSSSScWu>W>9W9F2AVVhX=VA9a9VX 3Z9aVl.V-buV.W9V-VFsj`VtVFVsjsjVsVOVV)`0U3?S`sV`?Ss` .9.9{P?RD9asVrZ;<2 .c edsd VnVnanIG(DbW9aPPVsh [h[VW.UhV]99 u.7V@VUkVcC@9aVh.7vV.UUU.@i`sWx@sWZ1xx ksVUsW#V+zk-+7UsWsWs W99@ s xk r9X.y{zm` _CD9asVm  m  a,U6+ lW rhP %kx@+VsJU]dcZC1 )I(k / >+#hW.#ssV.g1&U+EU+zUs T  T 9cZWh@ kkU+zVsWVsWBVsW^sW^sWcZC1M\Dxx9asV9asV9asVi7777U+zUUV.V.@XsV[V`UM`UG F9gx^.S#RI@ 9asV D+m^`Nh)\DH^jb\D^H)==\\\95BRb?o)3D9F'3P=Fm7H?3) \ {F'3=B@Wii1a06xsV=>A/WCsVsV+UU#`DE?S1kA)U+~ O Q5Q2H1H 0n.Vcf1-4q.o.+4Y--v*o';;-Z;;;80;B^^]];H;;Z [B+] `;:Beg`b <:DssV9ss91s btMI*s` ssV9Vss91sWsVsVsWI54X=s\DW@32'.,;`BBdBdB*BWB3X[[__:7/B"8[W<.%.<bbotVsWVsVsVshWsVsVsVsVsVVsWVsWVsWVsWVsW99gsVssssls9|99VVVssssssss9asV9asV9asV9asVVsVstTV]9V]9V]9V]9V]9.9.9.9.9sssssV V      V.V.V-ASASASs9 sWVsWVsWVsWVs1VsWVsWVsWVsWVsWVsWVsWVsWVsWVsWVsWVsWVs1VsWVsWVsW9Q 99asV9asV9asV9as%9asV9asV9asVa?Va?Va?Va?Va?Vss[[[[[V-V-V-V-VVVVVVVVVV****??FFFFFFllllsjsjsjsjsjsjsjsj*sVsVsVsVsVsV--````````?S?S?S?S?S?S?S?S__VVFFsjsjsVsV``?S?SVVVVVVVVVV****??sjsjsjsjsjsjsjsj?S?S?S?S?S?S?S?S__VVVVVVVVVVVVsjsjsjsjsj"B"B**w99 e eW**``````V-V-Kz?S?S?S?S?Se\'\_/WUs9 LssNk~KKKHssQM7UUXYV`95+-e=6;6shhss: PsV.)+V9gVshE%lX`P"P=];8eV`9d3W1d8dAdd?dAd"g{mmb))s+kUFQ@;@<fB2ssVsP9zsVA1aL -g0UAJ9999ddd)Bo)3P=FmF'=Z3333BBBRb?o)9F'3P=F7H?3\ {F'3=R3PP|ZjZH-/ HjjjHHHXHHjjmzf#:WWWWWMWRWMWMWFFW5W5WOW-WH-W$W%W%W'W/%WWW6W6W0)WOWLWLWLW^LWWWWWPWLWFWLWLLW/W9W?W?W??W6W5W6W6W65WLWLWLWLWLhWLWFWLWLWLLWWWWWVWWWYWWWV\W8W7W7W8W88WGWEWEWEWEEWWW9W9W:9WWWWWLWWWWWLWLWLWLWOOW0W6W6WW)W/W'W%W%W$%WHW-WOW5W5-WFWMWMWRWMFWWWW7YVVVVVVVV````````````hX=k=kF'F'PPP=FB&\tV$~~ou~EMWY[]}  " & 0 4 : < > D ^ o u x  !!!!"!&!.!N!T!^!!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k&o,m,w.!6<>ADO# tz HPY[]_  & * 2 9 < > D ^ j t w  !!!!"!&!.!M!S![!!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&j&o,`,q.8>@CF 80+ zo5!;80/-*'L?0RQHEB?<5.' XUT7541.>;ڜaa7    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk*vjJEsLMgw=@?rHl|[cnDTI>m}b:yqz@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-A! ?9U>9UB@A@;3:U839U@@ O P(F(F*F+_O_ F@FF@36FFUHU2UUHU=UU=U@F<P&(Pp@2F?Oop?а/?Э/?ЪO/o$PoF0@pЏO_oF1ts?sP&on<nF5U3U3U`P&_P&\F1[ZHZF12UU2Ul <Ll|Q@dQ@Q58F@Q%(FPIF HF5GF5FFFF2UU2UU?_/Oo?oOTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststu+++++stu+++t++ssu+++++++++++++++++s+tstusts++tus+stsststtsts^sstssss+ss+++s+tu+++++++++++++t++^s++^st++++ss^ssssss++++++^}y:wW~j`jy"3kkk{Rni`[^^eoz iq4 HjgaAhLLLLXPHld p $ T 0 ,  h4XlD p@ xh !"##&P')x)*<*p*, ,P,-./H0 01234(5\6 689\9:;< ==>@?AC`EG(GILJJJLMNOLP(QSSLTUVVPV`WWXDXYpZdZ[\[[\l\]l]^0^|^___` `P``aaabbLbbbccDdd0ddddde0efdfffg0g`ghiiLiiij$kkkllDlxllmm8n,n\nnno oToppq,q`qqrprrs s<spssst(tXtttuuHu|uuvvwwHwxwwxx0xdxxxy(yXyyyzzDzx{H||L|||}}@}d}}~~0` Hx8h$T <lHp4dDl T0`H|$PP8lt4t\XxHT4L8h|(x<P`x8@xd @(X4Dp(@XLP8p@XŒ4 (XŌ $\Ɣ$<TlǜȀPɄ0`ː(`̐0`͐0`Θ0hϠ8pР HxӬTh\HL|ذ`ٔ8lڰ۰ܰ݀0ht\ tl4\0<HX<`Td$t40H(p  h 0  d  X T$,lh0x`8,4L t !","l#0#$%&(<)8* +H,<--.4./X00(01,1223344(484455`56<6667(7l78848h8899,9`99::X::;0;;<>$>8>>?@8@@AHAAB BXBhBC C@ClCCCCD8DlDEE@EF`FGDGGHXHITIIJLJK8KL LM8MN$NODOP`PQpRRR4RLRRSPSULV V0VW@WXXY<YLYZPZZZ[l[\]^h^__`,`a a0abhc c0c@cPcdeeefXfhfghhijLjk0klLllmTmn noohopqqrrhrstuxvwpxxy\z,{{|0|}\}~d~@D8xTX h\<L$D\T8P84hdX4l\x`p|@H|dDp0”(Ĉ0ń`ƴ(`ǜ lȜDxɜHxʨ,X˄ˬ0\̔ P|ͤ4lΜ,\όϸPhЀЬ(`Ѥ4`ҌҸ 8dӐӸ@pԠ TՄհ4`֌ DL؀4h٘(TڌL|ۤ4lܠ@tݜDlޘ@lߠ(H|Dx(X(X<h8hh$X0d@tL88h8pD0<l@xLDxDt$X(\$P| PDxP4X|4l@d @xHl Dh4d,Pt(X,`8h<p(Lp  @ t    < `      8 l    4 d    , \   (dX(T0hX 8d@lXP|,XP| P8<0l,Pt |8h  h  !!8!\!!"\"#(#\#$,$\$$$%,%\%%%&(&&&''<'l'''((4(\(((((((((((((())d))**T***+H++,,,x--. .8./d/00<0h00101@4484\4|45 5P5|5606677<778l9@9:;4;H;\;p;;?H@dATBpDDF4FGIIJ`L MN8O(PQ0RRS8STUVWLWY(YYYZ<ZZ[<[\T\] ]d]^|__`aDaabb<c cd$dflghphi|ij`jkk`kkllXllm8mmn0nnoDopppqPqr,rsshstDtu(uv(vw(wx xyyzz{T||L||||} @l@l0l 8lhhH$d@P4\8T, XL4|,p(x$4DTdtd$Lp8\,D\<Tl,d$84|0xp ,x 0@Pp 0DXl,@Tdt@PHH@P˜<àXĤHŤ\Ƥ8ǜXȰDɠHʠ`˰P̨x p(ψ4|,ѐHҐ4Ӝ\԰Xմ\,ׄt<ٜ0|DۨHܘXݼh޸ h,,,T,D0L<L@@8@,@`hdhlh |,(pH$L8DT (    T  `   p 8Ph@|2@  ?/993310!!!eL5@  @[  r b T D 2 "           r d T D 4 $   g     y I = -           } o _ K ; +           } k [ M = )   7       @[ y i [ K ; -        { k ; +        ` @   ^]]]]]]]]]_qqqqqqqqqqqq_rrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqq?/+_^]]933310#353gW#@  ?3]2993310#3#3jyE iy@h    !     O?O   /333?33399//]q]q3333222233332222993333999910!!#!##53#5!3!33!!NXnVTnTNYnXkXnX@PjNulhhlqlhhlqrR$,3@- ))##$11$%$ 4522sY)))x11w1- 1)%}@H@ @ H*sY#"pUe/2]]]2+3/+_^]+33]]9]]]]]]]]_]]+393333333333310%$7.546753.'#4.'>VFS%|*zuX.|4b\2coU%wx ,F[hI !^i C*FXxQ AT7%, t;R8I '3W@5" (. 541Y[+Y  Y [%Y?+++???+++933333310#"&54632#3%2#"&5464&#"3264&#"326Ԣ;ߟ]M[[QO[XRLZ^PP\WQp %ưH6#/9u@F4* $!0,2  :;2''QY, 70? 7QYPY?+?+/_^]]q9/999+999333310"'#"&5%.54632673274&#">&'326yKiW!0oq:?`pG.8gdV`dA{?Jy웆G AFϸ>FvZϦ+byH[g[r5NZdy7h @  ?]9310#3 X"@   ??93331073#&!,. X+"@   ??933310#6'3+43!S@2    *%   ?]]999399]]3]]3910% '7%73-ww- ZgIHHIk)dG C@&  _ Y 7?3]]3+33_^]_]933310#!5!3!X`TT "@ [[/++993310%#65#5&({^XۨjA~[Op@Y//]q+99105![Р~@ [/+93103539??33103i P# (@  sY sY?+?+993310#"!2#"32#rckj1 +@ tY?+3?33/39331035!5%3!gMW<g >@   sYtY?+9?+3993331035>54&#"'>32!g3Oys Ksu||Vt}qɹR^FN(c@9" "%)*%tYMMsY sY?3+?+39/_^]+++99333310#"&'7!2654&+532654&#"'>32$fbw 뗐srqzoŰ/7 6@sY ??39/3+399333310#!533!qh4 6??Lw^JR^@5 sYtY sYgs?3]]]+?+9/+933393910#"&'732654&#"#!!632 9쑤I~?/!uѯ.7AZh"P@+  #$uY sY    sY?+?3_^]+9/+39333310#"3 &#">324&#"326?S51s巖~~bRn[_֙Яi  *@ tY ??+39993210 #!5! زY UY$/U@.+ % 01 "("(uY"""uY-uY?+?+9/_^]+999333310#"&54675.546324!"3264&#"!26{st}#)Ŋyħy xwyu}ݍ`$T@. %& !!sYsY sY?3]+?+9/_^]+39333310#"&'732#"546324&#"32>+6(tĜNMz  ZmϱG~:'@ [[?+/+9933105353k: .@   [ [[/++?+93310%#65#553&({^XϜjA~eH<@'?0p?o/]33]2]29105 eZ;dXG?@( YO_ @YP/]]+_^]+9105!5!dXeH<@'0p??o/]33]2]291075 5eZ㚙on^T'"R@,!   #$ ?   [  _Y?+3_^]/+_^]99333310#>54&#"'6$3253',R]PHF'>NPM<%KvdD;4sDEhP?99FX;rz =n?N~@F)8G@@!18OPY JYCY     4<<%Y<0044-Y4/+3_^]?+99//_^]3++3/+9333333310#"&57##"&5463237332>54$#"32$7#"$5!24&#"32676nsclBqR't%QPNԝ)Ƒ*7^neZ_c}(ӤXXF{{̵Y^mٞKWpW[af}xҝ\R[@6   _Y P`0/]]]]]]qq?2?39/+93233999910!!#3 !&'~?6[ 1dS1EW h@:  _Y$M>_Y_Y?+?+9/_^]_]_q++993333910#!! 4&#!!264)!26AQs}rbBshy^@9  _Y@P  _Y  ]?+3/_^]?+3/_^]933310"3 #"$5!2.(WɣlB.G1%NIQ~<{e ,@ _Y_Y ]?+?+993310#!! )!26ef:~ T@2  _Yy_Y _Y ]?+?+9/_^]]]q+933103!!!!!-2< 6@ _Y_Y ]??+9/+93310!!#!ggb@;  _Y_Y _Y0@ `  ]]]?3/]q+?+9/_^]+933310!2.#"32675!5!#"$gpM$O<ӝJ[UpWx6xnTHr}K  r@  _YP@.Iy      p ` P  ]]]]]]]]q?2?39/^]]+]q+99333310!!#3!3asT|@a@0 9p`P@P@p`P@ ]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]??931033 hF@*   _Y _Y@ `P@ ]]]]q?2/]+?+93310 73265!5!C~_hxrtE#? 4@    ?3?399333310!#33 R͸>/@_Y?+?9931033!R@   pdD4 t`T4gtPD$dD4tT47tD$ dK4pP@? ^]]]]]]_]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqqqqq?3?33399333310!47#/#3>73V 1'8!w%3 pe@noT/;(  P@/    p`P ]]]]]]]]q?33?3399333310!#3&53: aXHXa0@ _Y _Y ]]?+?+993310#"$5!2#"32שŦrJ< MR},- <@  _Y_Y  ]q??+9/+9933310#!#!2)! bQ@a}$?@$%&_Y"_Y _Y & &]]/+?3+?+93310327#"&'&$5!2#"32)f7<]U>rJ< #~p  CR},-h W@/    _Y_Yp ]]]?2?+9/+3933339310!!#!24&#!!26I;͗Iվ{]-@ #/. HI Y i  #@9HF#V#f# #  # _YoYK  _Y`RD?3]]]+?3_^]_]]]+99_^]]+]]+9333310! 732654.'.54$!2.#"R г?r`d53EAvgL+f%w{EV8&%J[zOē!pepoAU;++:Tr.0@ _Y{ K ; $       _ O 0  g    _ O       p _ @     o _ ?   7    o P /      o P @        ` @ ?   ^]]]]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqqqrrrrrrr^]]]]_]]]]]]qqqq??+39310#!5!о圜)I@,  _Y p`P ]]]]]]]]q?+?3993310"$&5332653ۭĹӾ~d M>@& P 0 ` / ?3?3]]q9333310!#373TT  @  |H9* xi:JZ) h|k\K<+ m_M/?m}[M;- 8@o{mK[9+ }k]K=+_  ?333?333^]]_qq_qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqq_qqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]qqqq+q933_^]333]]33]310!#&'#3637>3.$a-&?8 "Ttdngו#s.+ @     K    4 D jT d ; $       { d 0 $       p d @ 4   9      D t $ T T d @  0 wx ?2?39]]]_]]qrrrrrr^]]]]]]]]]]]qqqqqqqqqqrrrr^]]q9333310! # 3 3 XYP} h)b-)@ H v b T F 6 $          p d @ 4 $   i        t ` P D           t d T @ 0 $      t T D $   9    p d T 4 $    @3    T 4       p ` 0 /  ]]]]_]]]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]_]qqqqqqqq??39^]33993393910#3 3 HH9aA J@+  _Y_Y p ` P @ ]]]]]?+3?+3393310)5!5!!ZVW)&@ YY?+?+9310!#3Wu9??33103i W&@ YY?+?+931053#5!Ws 7@o )i~FVVfN&6f6vFVHKH@LBEHDTutTATTtUXH@-;>HrpBRbr9`d_^]^]r^]++^]qr^]qr^]++^]qr^]qr^]^]?9333310 #3΢pry i@ Y/+33105!ij)@[/?/]+993310 53WsN#0@V )).21QY )QY?o  PY$PY2222p2`2P2022]qqqqqqqq?+?+3/_^]q9/+9?+93333310"&546?54&#"'!2327#"&'#'2>=pxyn .*;!DGd[EZcYF_;rRZ$.PQpip|gZSY0dQX`#]@7  $%PY !PY%?%%p%%%%%]]]qqqrr?+???+9999333310!"&'##6533>324&#"326r{32zxy"Yc 6YAXhZWNf@E  PY p`p  PY ]?+3/_^]q?3/]+9333103267#"32.#"`ri"hl ZjV"V@1$#  PYPY$p$$$$$]]]qqq?+?+99??99333310%#"!23'3#.532654&#"52z{2xyhZ6Zby6t*pWNw@F PY  PY PY p`P0qqqqqqqqq?+?+9/_^]+9/93333103267!"3 '.#"uaݺ^H- <@h  PY PY/O_?;_/@VdH@',H 0`@]q++]qr^]q??3+3?+929333210##5354632&#"3iK4-#E>Iz F\aVWK .@d! (0/ %PY+PYPY @0 0000 00P00O000/00000^]]]qqqqrrr^]]]]]qq?2^]]+?+?+99?93333310"&'73 5##"32346734.#"32>${d 3wǻs.HS~vUHWKQ;hiia68Ƅed`@; PYp]]]]]]]qqrrr?+?39?9933310>32#4.#"#3=:}*`Ujc/ro4~= =n@H SY       p         O  ]qqqqqqqrrrrrrrrrr?+??933310533 :W=@  PYSYo?oP@0 O?/=pOp]]]]]]]qqqqqqqrrrrrrrrrr^]]]]]]]]qqqqqqqqqrrrr^]]]]?+?+?933321053#"'52653xxM2>E8 Z Hh @g     ?  ? _   ? _  9 @SVH`   `   0 @  ????9^]qqr+^]qr93323993310!#33 0Ima />v@QpOp]]]]]]]qqqqqqqrrrrrrrrrr??9310334#N)~@)! !  +*%PYPY ! d+K+?++++++++++{+o+;++ +j++++++[+O+++++++++d+K++++++++++k+4+++9+++++t+[+K++++ +++++{+[+K+++++++`+O+@ 0+/++^]]]]]]]]_]]qqqqqqqqrrrrrrrrrrr^]]]]]]]]]qqqqqqqqqqqqrrrrrrrrr^]]]]]]]]]]qqqqqq?22??+99?+9933393310!4&#"#4'33>323>32#4&#"Vps:l{8qVpvxS*,9OsZbkm`/xNa@<  PY  p]]]]]]]qqrrr?2??+99933310!4.#"#4'33>329*\Y>ykv4S*,9Op]/VN H@, PYPYp`P0]qqqqqqq?+?+993310#"!24&#"326꽅!0WM$]@7 &%PY "PY&?&&p&&&&&]]]qqqrr?+???+9999333310!"'##4'33>324&#"326rV0ƽzky?{"ʼY61fd]ZVWN"@T$# PY PY@$ $$$$ $$P$$O$$$/$$$$$^]]]qqqqrrr^]]]]]qq?+?+99??99333310"!234673#7#4&#"326{66Ҋxy6We;6k[>N#@  ???3399331034'33>32&#"+pf$%$r%f 9K*d@<" +, "PY PY,,,,,`,,?,,]]]qqqqrr?3+?3+999333310#"&'732654&/.54632.#"!XbJʳnzt0^~I(+WQTT@P"(MnP~HMJK.<*%$=Ja*,E@$   PY    @PY]?+?_^]3+393332310%#"5#53733#327*Y]}5x3?$D҃UN?:_@;  PY  p]]]]]]]qqrrr?2??+3993331032653#.'##"&5:*\Y>y:Rkv4s*,9Op]: \@     ` T D          ` T D   g    T D       [ D       [ K   7    [ K ?          ` T D         ` P /   ^]]]]_]]]]]]qqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqqq?3?39333310!#3?3ew 8#':@(uv:@    vfTF6$fTD6itfF6$iVD6r`T$8tK0$@0{dD4d?^]]_]]]]]]]]qqqqqqqqqrrrrrrrrrr^]]]]_]]]]]]]qqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqq?3?33^]3]93233333310!#'#37373ѽ$ &Ѳ$.Ͱ-0:!J[: T@    v D T d 6 $         v d   & F V g F V  d V D 6 $      & 6 F 7f  @6=BH9 "       t ` T @ 4   @"H   P p  ?3?393^]_]+qqqqqqqqqqr_rr+r^]]]qqqqqqqqr^]]]]]]]]]qqqqqqq9333333310! # 3 3 ! D,[W:@  PYtdRB4$tdVB4$gtdVB4$p`TD0 p`TD0 7@Z`TD `P0 P/^]]]]]]]qqqq_qqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqq_qqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqq?+?33339333310"'532?373J2&.bSLF`CtW +5' ƭSS: b@ PYPY      t d T @ 4            t d T D 4 $        t d T D 4 $   7      d D          d D $        p P   ^]]]]]]]]]_]qqqqqqqqqqqqrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrr?+3?+39331035!5!!S]s&ڋ"W#_@: "$%YO//O Y!Y?+?+9/_^]qr+9933310"&54&'5>546;#";inmj?[MjXYiM[?Wiussujkl^ajmN]A@t`TD4$td hpdTD4t;+oP@0 8p`P@0 p@/^]]]]]]]]]]]]qqqqqqqrrrrrrr^]]]]]]]]]]]]_qqqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqq/?9103N~"W#_@: #$%YO//O ""#Y"Y?+?+9/_^]qr+99333102654675.54&+532+5^[OhYVkO[=#534632.#"!!!27PFYVē"oGrph\M7.yym9@Ks}~w)qs'B@!" ()) Y@%Y /33+22+_^]993333331047'76327'#"''7&732654&#"Ndhcrrah`PRdfermiffNsrqqrdgeRPai`urdieNPiifruvuv@O   QY QY/  @)-H   ??39/]^]33]+q2+3+333933333933223310!!!!#!5!7!5!3 3A}@[sw}/}yN]U@  t ` T D 4 $       t d    h   p d T D 4      t ; +        o P @ 0    8   p `      P @ 0         p @ /   ^]]]]]]]]]]]]qqqqqqqrrrrrrr^]]]]]]]]]]]]_qqqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqqqq?/99//93331033  sT3@@_$4 11+.:++BAy$k$\$8$>>5>7 7z7;7 F    7>$!QYQY?2+/3+9_^]]_]]]]qq]]]]]]]99399333322323102&#"#"&'732654.'.5467.5464&'>L}uȽ`r tLMP©!ܧܨ$#yh!ED#-@Q,!''./(YH H$$Y P  Y///p/`/P/@/]]]]]]]?+3/_^]3/+39/3+++99333333310"&546?54&#"'>32327#"&'#'26=l~FQCQ #1"IQIZvTtgt|7>54&#"'>32!+kaXGJDX zd3gEJDp:>KIDk{nZ\-q'%@O"   &'#  Y?O/?O  YY%5E?3]+?+3_^]]9/_]]+9993933933310# '73254+532654&#"'>32 =9P\JGDT VZ[jt mHA?>733267#"$#5,R]QGF'>NPM<%q2KvdD;4sDEhP?99FX;rz R&$N&%+5+5R&$@ &L%+5+5R&$`@ &%+5+5R&$ ^@ &&%+5+5R&$ l@&%+55+55R&$+@&6ESs"b%+]]]]55?55o@;  _Y _Y  _Y _Y?+??+39/_^]+9/+9992223239910!!#!!!!!#! E !d<?hNy&&z : %+5&(? &  %+5+5&(@  & (  %+5+5&(w & %+5+5&( y@  & %+55+55 &,&%+5+56&,F@ &E%+5+5h&,@ & %+5+54&, @&%+55+55e T@+    _Y  _Y _Y?+?+9/_^]3+399333339103! #!#%)!!!26fj:~!`H9 &1 @ & # %+5+5a&2&ش%+5+5a&2%@ &%%+5+5a&2@ &!!%+5+5a&2 &$$0%+5+5a&2 @ &%+55+55s #@   /q933310 7   bh^^i`fJb`g_iiaG$E@#  &%""_Y_Y &]?3+?3+999933339910#"'#7&!2734'32&#"שxȮrJyɬb;ze|pKR}n[-UX)&8&%+5+5)&8@ &%%+5+5)&8@ &%+5+5)&8 @ &%+55+55-)&<@  & A %+5+5 6@ _Y _Y  ??99//++99333310#!#3!24&#!!26tۖb߀ŏ1m@A,' ', 23$+    $$PY$  PYp3O3?3]]]?+??+99_^]_]]]]]93933210#"/32654&'.5467>54&#"#4632p4E\bUa\[96:5mqO"7R0'1(VO@f:6V=d-0T2M]案gH1&;9 |Ws&DC11&225%+5+5Ws&DvT@ 1&1 14%+5+5Ws&D22&771%+5+5Ws&D11&::F%+5+5Ws{&Dj@ 11&5ʴ53%+55+55Wss&D@ 44&7ȴ71%+55+55BN'4;@^- "4;4455&&&<=5'PY 555 " $$8PY$(QY ?o  PY 0PY PY ?3/]]+?+?+3/_^]q9/+?+999/_^]+99333933399333103267! #"&546?54&#"'!263 %32>5%.#"uafOҒoy~q .cvPÅBd]fW^H-u;oP\$5eJWaYVīWNN&Fz ( %+5W&HC& %+5+5W&Hvp@ &T %+5+5W&H@ &   %+5+5W{&Hj@& %+55+55 &C&´%+5+5/&v?@ &?%+5+5i&@ &  %+5+55{&j@&%+55+55V''s@$   "()   PYP@  H$ 4 D   R    %%PY?+?99//_^]]+]3+3/99939210"54632&'57&'3%4&#"3266^m}mPZ2ӫ<;rr^WG$Bp\j&Q@ &$$0 %+5+5V&RC&%+5+5V&Rvg@ &I%+5+5V&R@ &%+5+5V&R@ & ,%+5+5V{&Rj@&%+55+55A$u J@*   YP @YYO?]++_^]+99933310535!53ި,\"}@N $# PY PY$$$$$$$$$$p$`$P$@$ $$]]]]]]]]]]]]]qqq?3+?3+9999339910#"'#7&5!2734'326%&#"XvdSs[QDCbt֊0[iɅ\X݂U1Q&XC& %+5+5&XvW@ &5 %+5+5&X&!! %+5+5{&Xj@ & %+55+55W&\v@ &6 %+5+5W!>@  "# PY PY??+?+99?9933331033>32!"'##4&#"3260rVzky?{YAXd]ʼYZW{&\j@ & %+55+55R&$hI@ &%+5+5WsS&D11&2ʴ21%+5+5R&$ y@ &%+5+5Ws&D11&4̴4:%+5+5`c&$ ϴ%+5WUsN&D:´::%+5hy&&S@ &~ %+5+5W&Fvg@ &r %+5+5hy&&@ & &  %+5+5W&F@ &  %+5+5hy&&"%@ &' %+5+5W&F,@ & %+5+5hy&& @ &&" %+5+5W&F@ &" %+5+5e&' f&%+5+5V&GK@ ++S++%+5?5eVm*s@-%+,QY/ (PY@ H"PY?,,]r?+?++99?9/_^]3+3?99333339210%#"!23'5!5!533##.532654&#"52z{2,xyhZ6Zby)6t*p&(zI & %+5+5WS&H@ & %+5+5&(  & %+5+5W&H@ &# %+5+5&(% &  %+5+5W&HD@ & %+5+5U&(P´ %+5WUN&H}###%+5&( o & %+5+5W&H&" %+5+5g&*@  &%"%%+5+5VW&J@ 00&55/%+5+5g&* @ &"'"*%+5+5VW&J@ //&228%+5+5g&*5%@ &'!%+5+5VW&J-@ /&//1%+5+5gN&*N #.#%+5VW &J877&//3%+5+5 &+@  &  %+5+5>&K@&%+5+5@#   @(H _Y_Y @ ?2?399//]q33+33+_^]+]q99]]333333333310!!##5353!533#5!fs-  s@#!"@"P"`"@"""""@HQY PY H?++?39?9/3+3+_^]]qr393333310>32#4.#"##5353!!=:}*`U,YjcWro4= &, @ &  %+5+5&@&   %+q5+5 1&,I@ &%+5+5 1S&@ &%+5+5l&, @ &%+5+5l&@ & %+5+5\U&,  %+5U}&L@ %+5]|&,'%@ &%+5+5v: @$t4$n@4$tdk4$8td+{k@0 p`@ ^]]]]]]]]]]qqq_qqqqqqrrrrrrrr^]]]]]]]]]qqqqrrrrrrrr^]]]]]]]]]]q??931033´:I&,-W&LM@o0]55]]55 &-7@ & %+5+5W/ @ [/? PY?/o?oP@0 O?/=pOp]]]]]]]qqqqqqqrrrrrrrrrr^]]]]]]]]qqqqqqqqqrrr^]]]]]]]?+?/_^]+9333393310"'52653#'##53MM2>E8xjihW Hh@nN?&.ʹ  %+5N&NN  %+5: A@%   ?  ?2?39]]39333310!#33 0Il~: //&/&^ %+5+5[>&ON@ &K%+5+5N/&/ %+5~NG&O%+5/&/@  %+5?5i&O$K)@O/p  %+5?5]]q/&/ _%+5&OBT%+5/ F@%   @    _Y?+?9/_^]]9993333310!!573%hyUU I@+   O    p  ]]]]]]??9/]99333331035737zz||DDXHGz &1@ &I %+5+5&Qv@ &a %+5+5N &1 %+5NN&Q[  %+5 &1 & %+5+5&Q&# %+5+5P&Qb$$״$$ %+5?54$=@ !!&%_Y_Y?2+???+9933310"&'732>54&#"#336$32_;ZjIU&wyHMJJsnOBheD=aqWN#;@!!%$ PYPY?+???+9933310"'52654.#"#4'33>32M2>E8*\Y>yxW Hhkv4S*,9Op]a&2I@ &%+5+5VS&R@ &%+5+5a&2 @ &&%+5+5V&R@ & %+5+5a&2 @&]$%+55+55V"&R @&g %+55+55a _@4  !"_Y _Y _Y _Y_Y"]?+?+?+?+9/+9992399310!# !2!!!!!%27&"#"CpFkiLoR4,I OLy <WV2N%,}@E! ,&-.,PY ,,, )PY  PY #PY  PY ?3/]]+?+?+99?+9/_^]+933333993103267! '!"3 6! %4&#"!26.#".uay|u~?*^H-!'S@h&5& %+5+5&Uv@ &J %+5+5Nh&5 %+5NN&U^ %+5h&5 f& %+5+58&U8& %+5+5]-&6vI@ .&.[.1%+5+59&Vv9@ +&+]+.%+5+5]&6r@ //&44.%+5+59&V@ ,,&11+%+5+5]N&6z 2(2.%+59NK&Vz //+%+5]&6 s@ ..&006%+5+59&V@ ++&--3%+5+5.N&7z^   %+5N3,&WzP@))/)_)o))?)O)_)o)))))/)_)))))))/)?)o))))) ))_)o)))))))/)?)o)))))) ))?)O)o))))))) )%+5]^]qr^]qr^].&7 !& %+5+5&WK%+55.J@*   _Y _Y   ]]]??9/3+3+3933310!!#!5!!5!&85@'`pg&6FSs%+]]]55?]55s&X@&!! %+55+55)&8 @&Q%+55+55&X@&d$ %+55+55U)&8 &g@% ) )P)`)p)))))]q+5U:&XW$$$ %+5 &:y&  %+5+5&Z&%+5+5-)&<[ & %+5+5W&\@ & %+5+5-)&< h@ & %+55+55A&=@  & J %+5+5S&]v5@  & ] %+5+5A&=|%@  & %+5+5S&]  %+5A&= 8@  &  %+5+5S&] & %+5+5 c@)`p@"%H?`  PY??+_^]]q+qqrrrrrrr93310!#4632&#">K4-#E> F\ +h@1&&,- )PYQY#PY H??+]q+9/3+3?+99?93333310353!!3>32!"&'##65#4&#"326 12zr{3Uxy9AXhZYc 6f!*\@/ ''"+,''_Y' ' &`Y_Y?+?+399//+99333339310#!#"&5463! 4)!264&#!!26MBsQADG18J=}~rbBs U@  `@#H _Y _Y_Y?+?+9/+_^]+]99333310#!!!!24&#!!26Hy%H@%  &'PY SY #PY?+??+?+99993333310!"&'##65!!3>324&#"326r{32zxy"Yc 6AXhZ 4@  _Y  _Y?+?9/+99333310#!'5%3!24&#!!26uە%8{i!x &@@ !!  '( $PY PY ??+?+99?9933333105%33>32!"&'##654&#"326 32zr{3xy!YAXhZYc 6_[f:@   _Y _Y ?+?+99//9933310%2# '6$3 ! 7ݗX7Bj<-؈* :Nx]1%NIQ~GM<{W$O@(  &%PY "PY PY ?+?+99//9+99333333103267#"32>32&#".#"`j v/4$+B7ri"hl Hy GMZje<@ ! `Y_Y?+?+39/933310#!#"&5463! )!26MBf:~DG18J=Q ?@   _Y  _Y _Y?+?+9/+993333104$3!!5!!"$73!!"Q|R%K@'  '&PY SY #PY?+?+?99//3?+993333310323&5!5!#.5## 32654&#"Rz23{ryx"ZhXA6 cY0VWN>@   !PYPY PY ?+?+?+9933339910!&/.532!4&#"32>dniZDdq}?YWX քUY :@   _Y _Y _Y?+?+9/+9331035!!5!!5!Y2-Ĝ^E@# ! _Y  `Y _Y?+?+99//+993333310%27!&$#"'6$32#"$547 'Ǜ9N30͢~y9M%>X&X@- #$$'(`Y## _Y !_Y?+?+9///+9993333339910".5467$4$32.#"!3#"3 `키 F2~bGGwUgw7Ш=vtevMW:@ _Y_Y _Y/+?+9/+933310!!#"'7325!g=R#3$hCNC@#    PY QY //]+9/3+3993333310&#"3###737>323;<@OF J^-g^a*X@.#** ,+!&_Y!_Y_Y _Y?+?+99//9++933333310.#"32675!5!#"$5! 54632&#"<ӝJ[UppM!z6B8 G>xnTHr}KWx{GM W?@"       _Y/+?3993392310"&54>73 34&'326s*OY?4""4.((.Wz-iivAy9GG:5;:$E@$ "" %& PY PY?+???+9?93333310"&54&#"#3363232653scnyzlɴE|~= ͺyy3>@ ??9310334! ,@  `Y??9/3+39333103#5333#Ħa`?H@$  _Y?3?+?99339933333910!#4632&#"3 R͸BB29~idU@+ SY QY??399//+?+9/33339339103 ##4632&#"IBB2B:/m ,@  PY??9/3+39333103#5333#ppmma`A@!         ?3?99//9993333310#&'#''7'37ʟþ)+D.I6:?Apf.kʽCvE͓9!F@$ #" _Y_Y?+?+?3399?93333310"'# 332653323#'\xc0cXwodw 2gGGCfUQUW 1@ _Y ?2?99/+993333103&53##"'5325 H1,8sHXa֐ VN3@   PY  /???+9993333104.#"#4'33>329*\Y>yVXkv4S*,9Op]aa%H@% &'`Y _Y #_Y?+?+?99//+99333333310#"$5!2>5#53#"32שŦrJLHXEXs} MR},jIj{=jw,-VN G@#  !"  PYPY?+?+?99//99333333310#"!265#534&#"326Xxp!0Aj0GaXL@@    _Y _Y/+?+9/3?3/933310%#"$54$32%3#/&#"327mwȥ:ԣ+d eU45LGG@m..VWNB@"   PY PY??+?+9/3?3933310##"!2%3"327&9QR3D+z@84W?',!0+Ar.B@"  _Y   `Y ??+399//+93333102#!##"&5463)! bMB{@DG18J=VW)F@%$ +* PY SY  'PY?+??+?+999333310!"'##4632&#"3>324&#"326rV6'%8<}0ƽzky?{"ʼY[d]ZCI@%  _Y_Y/??99//++3993339922310 !#3!2 4&#!!26g}uQվ{b*;@% ,+$ (( _Y( `Y?+3?+993993333104>7>54!"'>3 !2>7! $b>xP32^Kvf4~ZgK>Y@w!ĵMuUD()IgMB~%OK%;@!&' ##PY#  PY?+3?+993993333104>7>54#"'>32327!"&OQ\1oҷLd3:L{+[{Q##+=.V`RqN"'/C3ƧlUCW$;@ &%QY SY"QY?+?+9/+9333104632327#"&5#"&732654&#"Co^;:64EA=ThM<01<;20<ZeDK  gU1<<10<<W*,E@$  QY PY SY?+?+?3+393333310#"'5326=#"5#53733#327*CD82<6}5x3?$DBGq҃UN?3@   _Y??+39/933310##"&5463!оMBn圜QLr@@   `Y _Y?+?3399//+9933333310"$&5332653>5#53ۭĹӾysXé~dmt_j:%R@*$ $&' QY   %!PY!??+?339///+39933333331032653>5#53#.'##"&5:*\YsYXÐ>y:Rkv4sb#oej/*,9Op]W#K@& ! !%$ _Y _Y _Y?+?+?+99993399332210 47+5!32654'5!#"'њ6MM6O&Ts _` q&-@ _Y _Y?+??+9933310".53324&#"'632N[:2CNc ]-,@    _Y?+??9933102.#"#3 ><;T^%$1 rT7x-3-0H9aVGW<@  !  !SY PYPY?++?9?+99339910"'532?37>32&#"J2&.bSLF* McQlRDHa3D]W +5' XYj0]>T>G@%   `Y _Y_Y?+?+9/3+39333310!!5!!!!!5!> S l].8/:E@$   PY PYPY?+?+9/3+39333310!!5!!!!!5!/ 84_{iF[-VJ@&  `Y  _Y _Y?+3/+9/9+933333310 !5!#"$'7!2654$+SvGHFVF@% _Y`Y _Y/+?9/9++393333310#"3 # 4%5!!AGcqvS%j؋lHA3ꡜ]U$;F@$QYPY PY/+?+9/9+933333310!#"3267#".54675!KRQQ׍uؽs}\bx mNV:(R@+(#*)PYPY#(&PY/+3?9/99++39333333310#".54>7>54!5!3 7(ҊiUrddtOa4BeL\OnN+*Q:J=*w wRlH+".A0IRZ $N@( &%$$`Y_Y `Y?+3?+9/3+3933333310!>54&#"'>323!!!5>7!ZPJIys {A}d[%lPEOt}qɹ:ppt?WrY&D@$ _Y_Y `Y?+?9/9++393333310#"&'732654&+#5!!32&"#qJN«~uʜ._:G@%  PY PY PY?+3?+9/9+933333104!##5!!32#"&'732ۧ B6Ѽ" \U ]u$)B@" '$  ) +*&"#"QY'#PY?3+?39+3?9333310#"&'732654.'.=#5373[!RLfH2!j$HkFkTD-"*2CR7WQPX1?*+}[NWVM8@  PYPY??+?+999333310#33>32!"> ,pӾppdiEa`RKd@ ??9310334 @ ?2?3993310333344r:R@*   _Y _Y ??99//3+33+39333333310!3!!!!#!5!!rrrtt:̙`4 j7&''=d &+5 a&'']H &+5V&G']d --&+5&/-W &/MW&OM /&1-W&1MW&QMdR&$ c@ &%+5+5Ws&D22&4۴4:%+5+5l&, @ & %+5+5& 2G&@. %Opqr]qr+5+5a&2 &$%+5+5V&R@ & %+5+5)&8 &%+5+5&X&$ %+5+5)+&8 3@& %+555+555k&X'j?@%&& &0&@&P&`&p&&&&&& %+555+55/]q]5)+&8 4@!!& %+555+555&X'jv)@&&&& %+555+55/]5)+&8 5@$$& %+555+555&X'j)@&&&& %+555+55/]5)+&8 6@!!& !%+555+555&X'jCp)@&&&& %+555+55/]5VNA@!  PY PY PY ?+3?+9/+993333104&#"'!2# 53267ZuaX#C^H-?R+&$ 3@&%+555+555Wsk&D'j!@?<<<0<@<<<11&+55/q]5R+&$ 7@&%+55+55Wsk&D'.!@7?77707@7744&+5/q]q5&I&C%+5+5BS&X@ ==&>>?'%+5+5g &j@9%% && (' &&`Y_YO  _Y !_Y ?+?3/+99//_^]]+3+39333333310!5!5!3##"$5!2.#"32675!L[UppM$O<ӝJ\kYr}KWx6xnTHVWhK)6h@81 ** $$78' QY$ @4PY@ H .PYPY?+?+?9/++2+399333393310"&'73267!5!75##"&632346733#4.#"326${dixr3wƼs.QHT~wWKQX\5hiia6v[Ǭg&* @  &""(%+5+5VW&J00&228%+5+5?&. @ & %+5+5&N  &ʹ %+5+5aU&2lVUN&RraU&2'lI@ 0&00/%+5+5VUS&R'r@ ,&,,+%+5+5-V&y !@ &$ %+5+5DW &T@ & % %+5+5W(&@ &W %+5+5 j&'= a&']V&G]dg&*G@ $$& _ #%+5+5VW&Jvk@ 44&0d03%+5+5a@  _YP@Iy `Y ??+??39/_^]]+]q+9333331032653#"&5!#3!3 vu3̲#sTW:@   _Y _Y /??+?+999333310#3>324&#"6Կ?oÐ_V#;H*Xabbu:- &1W& %+5+5&QC & %+5+5R>(.@j " )-  0/0000@0p0000 ))Yp&+++++@ H`++ ?&&&&/3//]]3339/]32/]+]9/]+3/_^]]q993933293310#!#.54632!&'4&#"326573;.á~$1=dd 5jN89NH6 :Lp7aDsc8Z1U&D'UvcZB@&N?NONNNpNNNNFF&IIL%7Դ71%+55+5+55/]]q5&& %+5+5B&v@ <&<&<ٴ<4%+5+5N&(tj@ & %+55+55W&H@ %%&"" %+55+55$&(j& %+5+5W&H:@ %&%% %+5+5ilN&,j@ & δ %+55+55WZ&@ & %+55+55P$&,,j@ &%+5+5B&@ &%+5+5aN&2j@ &&&## %+55+55V&R@ ""&%+55+55a$&2 j@ &&&&%+5+5V&RD@ "&" "%+5+5hN&5lj@ ""&e %+55+55&U@@ & %+55+55h$&5j"&"" %+5+5l&U@ & %+5+5)N&8j@ &ϴ%+55+55i&X@ &&&##  %+55+55)$&8j@ &%+5+5&X2&&&& %+5+5]N&6 228%+59NK&V //5%+5.N&7  %+5N*,&W@!X!!/!}!!/!?!O!o!!!!!!! !!/!_!o!!!!!!! !!/!?!o!!!!!! M!!o!!!!0!!!<@!!! !0!!!!@!!E%+5]qr^]^]qr^]qr^]_^]@U"F@!  $# _Y/3/?+3/9/33993333399105$54&'5,54&#"'>32W^*%IuAs>Uq8U@Pha2I(r𧆉TlOftY\<!V.N$D@ "  &%" PY/3?+3/9/3399333339910%5>54&'5,54&#"'>32.p@)! `eefiyr2@[0X_vGGuhA<ёmeV[!b{8) &+  & %+5+5&K @ &"%+5+5W1@    _Y  /???+999333104.#"#36$32E?yoRJWT}DbRO\VVt!-9g@7.4( " ;: 7PY +PY1PY%PY?+3/+?+99?/3+99333333310%#"!23'3632#"''67532654&#"4&#"32652z{2A G=4?hZ6ZbywSq>u`pU0AP^9]w'2^@2.$(  34!+!+`Y`Y!! 1`Y '`Y?+?+99//++9999333333910#"$54675.546732654&'4&#"3 ~~彩܉ARŢ|%}aSTY^yl|_,'4P@)"  1%+65((QY"!.PY?+?339/+99993333339102654&'7#"&54675.5467"32654.E}QII{po{IIQ}Ij}Q~#qDp ɏԐ pDq#~Q~WNA<@ _Y @_Y?+3?+39333107!5!!2'654&#!AZ|GMV~MM"8 G>1 ::@  PY PY?+3?+39333107!5!!2'654&#!18jGM&psGV"1'?<R&$%@ &%+5+5Ws&DJ44&2۴24%+5+5N&(zWNN&Hz2a+&2 3 @""&  %+555+555Vk&R'j%@!!?!!!0!@!!!&+55/q]5a+&2 8@'&''3%+55+55V&R'J@/22?2O2_2o22&+5/]q5a&26%@ &%+5+5V&RE@ &%+5+5a+&2 7@&!!"%+55+55Vk&R'K!@?0@&+5/q]q5-)&<eI@  & %+5+5WS&\@ & %+5+5V>@ PY   PY ?+?9/99+393933310632#"''674&#"326>D;H{JOnb9:&> G=4?swSq>uV0AP^9VtN(4f@9  /$()(& 56$(""2PY""" "PY ,PY?3/+??+9/_^]+99333333104.#"#4'33>32632#"''674&#"3269*\Y>yD;}H{JOnyl9:&> G=4?kv4S*,9Op]nySq>u`0AP^9,%]@1  '& PY #PYQY@QY?+?+?3+9/3+3933333331053733#632#"''674&#"3265xD;H{JOnyl9:&: D<4?wSq>u`N30ATZ9W=: @  PY?+?39310#"'52653=xxM2>E8 HhS!-9c@6.4( " ;: 7PY1PY +PY%PY?+?+9??+?+?933333333310%#"!23'33>32!"'##532654&#"4&#"32622z{22zrdxyxyhZ6ZbyYAXhZïpSWL!.:_@55)/ " ;<%PY 2PY8PY ,PY?+??+?+?9?+933333333310!"'##7##"!23533>324&#"326%4&#"326rV4}50ƽzky?z*xx ̼YegU6Xdd]ZR f@7  _Y_Y `Y ?3?+9/99+3/+93933333210!!#7#33 3.'3#q¢A?fݢTq6, 1&Pkh1Sqhy%@O  !$ '&#@P @_Y$  _Y ?+3/_^]9?+3/_^]9933333310%&5!273&'3 #"'#"&VwwlBNtz=?p(Wл[I-[{b.Q~1W%NDe& W%e@9 !  '& @PY!  #PY?+3/9?+3/99333333107&323&'3267#"'#&#"I<Ɂ "7Q`tXŎ -0",Y5=VD..#hl %F˰e / ?@   _Y  _Y ??+9/3+399922231033!!!!#qy*W.L@)    _Y _Y ??9+3/+9339933210 ##!5!733#A@C(;iiGVK;R@), 33&&=<3))0PY-)  PYPY?3++9?3+999933333310#"'3267#"/&'&'732654&/.54632.#"!FE"6`8g8~ICM9uXbJʳnzt0^~I(+ !q;*RTaWX=TT@P"(MnP~HMJK.<*%$=Ja1V:;@ PY PYPY?++3?+9933331072327#"./.+5!5!>QBD2 4<`8g81NE:%DN8/P#Dq;18G, $3L8@ `Y `Y??+39/+933310!3 4&#"'6$3 4KT$ ƹuvPN<@  QY PY ??+3/9/+933310!2654&#"'>32bmףۣ{Ï&!&i@5# # ('#`Y#_Y##_Y"_Y?+?+9/+9/3+39993333333399103! #!#%4)!!!264&#!!26!ć\sQA}UGrbBs)M@&   ! _Y_Y?3?+9/33+3399333333331033!33##"$&=#26=!)uuuu)XX~~s M8@ o 0 /  ??39]]]]93333103#'#H?zTT|  @U _Y _Y@ _Y _Yy_Y_Y?+?+9/_^]]]q+3/+?+?+933333933107#!733#!!!!!!3!kLFFS:|kj5<DX&"&*@J' )  "## ,+"#PY""**PY**%%PY)PY ?3+3?+399/+9/3/+?933333933310&323!3267!"'&#"%&'D^JͿX4Bua`PL3?M| E8ppi HhO欬aW#D@" !%$ _Y_Y_Y?++?+?9999333310327#"&=# !27327&#"5873/:NrJàvs sQC[UR}M8gdVWN ,I@&! '.-PY $PY *PY?+?+?993?+9933333310%7##"!234673327#"&54&#"32656{687&02J|xy1k[6We;lQC hO@'  _Y _Y ?3?+9/3+339933339922310!!##53!24&#!!26I;͗IIվ{NE@# SYPY ??9/93+3?+993339333103#5354'33>32&#"3#zz+pf$%$<r%f ϒ-)D@$   `Y  ??39/933+3393932103###53'3!73!ؾғ2?Ha'W:"X@. $#PYPY PY?+?9/993+33/+?9933932103##"'532?#533!3?!yoCtYJ2&.bhuFF+LS +NUUo'N#0W@.) .12QY)QY!)) PY$PY?+?+3/9/9+?+93333331023267!"&54&#"56323>"7>54&֣px{m .|*;!DGd[@]cYF_N;rTXܻPQpipxkZSY0cRX`VN">@ $#  PYPY?+?+99??99333310%#"!23'53#.532654&#"52z{2xyhZ6Zby/6t*p~N">@ $#  PYPY?+?+99??99333310>32!"&'##4'34&#"32682zr{2&xyhZZby/[6t* ,F@%!'' .-$PYPY *PY?+??+?+999333310!"&'##654632&#"3>324&#"326r{3BO:E?E2zxy"Yc 6ӏLHhZ=N6@  PY PY ?+3/?3/+99333104&#"'>32#"&'7326ir٧`"jZẜ lhMN+d@8 $* ,-*'PY   PY  PY?+3/?+9/_^]9+993333310"''67&532.#"63 '2>54&#"1p4#|H%cri" e}Sq=@32cltpt`Z]pi^ʢy!^]W`\NR]C5N3~@G1#// *541PY&,SY/!! &&PY PY?+?+9////_^]q93++9933333339910#"&'732654&+532654&#"'>3273267#"&'cltpt`Z]pi^ʢ"/2%=";~U[!y!^]W`\NR]e\DC4yp7KN&T@- !!'( PY   $$PY$PY?+?+9/_^]+9993339921032654&+532654&#"32#"C~rltpt`Z]pi^y,[^]W`\NR]Co V':<@  QY PY QY??+/+?+9333310733##"'5326=#5۴K4-#E>ӃI F\{VW'5T@,( /6"7$PY ,PY2PY PY?3+?+?+99?+39933333310%!"&'73 5##"3234632&#"4.#"32>;{d 3wǻs. &729@AHS~vUH8KQ;hiia1 NFyedVWKJ^NE@#PY PY PY?+?+99//+993339210!#"32.#"3275#@Kzrig^DK"ZjCW:A@$  PY ?3?+993392310%3 3#"&54>4'326w5>l}kj}%LK'$%'!]umm(Z\SQ.43A 8P@- !4$!,9:4$/++//(PY/ PY PY ?3/+?+?+3/993310%4.'322'&#"#"&54?.#"'>32?> )  GHL8r!??#-3R}kj}P1-#?>"r8Lau)77(u*3L00/]`\o2[55^QjxxjV]055[2o\`WnFFmXo;-@  PY?+?39/9933310%#"&5332653#??;{*`Um`Rro4~4J7@ !PY PY?+?39?+933310>32#4.#"#!2&#"=:}*`UEI5B~ jc/ro4(`?W'B@$ # )( %PY  PY PY?+?+?9?+93333103>32!"'53254.#"#!2&#"C :}3U:=u*`UEI5B~J?jc!ro4( 7@  SY  PY ??9/3+3?+933310333###53qrrqqi/<V: @   SY?+?99310327# 3 97!,2-%QF (#D: 7@  PYPY?+3?+3933310%3!53#5!#Rό#D@" PY  PY ??9/+3/3/3/+339333103&#"#>3332673#"''kT7 Z`#0/h|yB/0rrxZH@%  QYQY   ??99//3+3+393333310###"&546;33!5#"3Zdf3;nYYkc{ <3iW @  PY?+?39310327# 3:977/E-sQC(MWOW@.  !  PY PYQY???9/++3?+9/933333331033!#"&'732>54&+5!璼'7aORn䁘_aS$:)H@%"( (*+) %PYPY ??+?+?339993333331032653#.'##"&'##"&533265Vps:l{8qVpv:Rxs*,9OsZbkm`RxsW:#D@# "" %$ #PYPY ??+?+?3399933331032653##"&'##"&533265Vps7n{8qVpv:RxsXkXbkm`RxsW#N1Q@, 1((-23*/PY*$PY$  PY?3??+99?+?+933333104&#"#4&#"#4'33>323>32!"'5325qVpvVps:l{8q3U2ExxxS*,9OsZbkm`WN":@""$# PY  PY ??+?9?+9933333104'33>32#4.#"!"'5325>y*\Y3U/HvS*,9Op]/kv4 WN"=@ #$PYPY?+???+9399333310327# 4.#"#4'33>32u>,@;*\Y>ys(/kv4S*,9Op]:.@ ?3?39999333310 '3#&'#<%3(!:SJ}:GbAg:VN K@)PY PY PY?+?+9/_^]+99333310#"!2267!"!. I !04XVN!k@: #"QY PY PY PY PY?+?+?+99?+9/_^]+9333333310!!!5#"!25!!4&#"326GWsvq]q!0q]SWN(H@% &&*) ##PY#PY PY?+?+?+9/9933931032654.#"326= #"&'#"5uprwiiwrpUM|ʸzM`úoo䗻`xz}%NVWR@-   PY PY PYPY??+?+??+?+9333333310&%34&'>%ihrqiejlcW2~-fD++:*@ SY ??+?9993310#/##"'53265%"?[E$%$32&#"+pf$%$32&#"327# +pf$%$r%f YQC (N@ SY??+9931034>32&#"\;%$<}mf  WN@ SY ??+993104&#"5632fnx<$%;\W f0: I@%    PYPY ?3?+9/+3933399310!#!2##!254&#Bθؕctk:?\[0: B@!  PY   PY ?+?39/3+9933333991033#!32654#!BLٷ2ls?:O[\9WK5T@-**44$$.4672,PY2)''PY'PY?3+?3+9?+933333331032654&/.54632.#"#"'327# XbJʳnzt0^~I(Эoz9*"$+WQTT@P"(MnP~HMJK.<*%$=Ja>; (WN(@  SY SY?+?+339310"'532>54632&#"O7<96=k,1BMKW,UhiuW F@%!"! PY SYPY SY?+?+?+?+3339933310734632&#"3##"'532>=#Y21BMKO7<96=޲iGF,Uh%W:N(@  SY SY?+?+339310"&54&#"5632327KKB1,W849<7W ffW,VK&Q@*"  '("  $PY SYPY?+?+9/+93399333310/#".54632!2&#"%3265&#"FTQI{I@D$k,1BMKlyvA/>IN9:6VXe=qTv+bi`86_O1A*A@"  QY QY PY?+?9/+3/+39333106323##5#534&#"Y]}5x3?$D}ԃN?W*,6@  QY PY?+?3+3933310#"5#53733#327*Y]}5x3?$DokN?Q:&R@)  ## ('"PYPY ??+?39/933+3399333333310!33##.'##"&=#5326=!:ll>ykk *\://*,9Op]{=Xkv4T6:/M@)$(- -10"%PY"( PY PY?+?+9?+993399332210"547>54&+53232654'&546;#"ET3!++R|YmCDCDnX|R++ 4TԌvH@*gW_tt]]tt_Xf*>Iv:)@  PY?+?39933310#"&533 4'3ŵpA15:;cav: *@   ??3993333103#'#4#':uv>:+@   ?2?9?3933103?3#.'#&'#0ѯ#' /+&:Mg]#.խ"&3,@   PY?+?39933102&#"#.'#>BJ2&.bHD@r +V6O:V :&@ ??39933310!3 3g,5[{K1Wr:;@  PY PY PY?+?+?+3933310327#"5!5!5!!+75%C:,8jsQC (&1N): Y@/ "!PYPYPY ?3+33?9/++39333993310%>32+'7!5!5!%"32654&eav0"78j./dFMF6{gxy^T=u&ڷQf,7'-DW :P@) PY PY PY?+3?3/+9/+393339310!#"&'732654&+5!tsv،RA:Nj wǤlVK; *j@<(#   +,PY#  %PYPY  !QY?+3?99//++9+3933933310'#".54632654&+5!5!%27&#"|_RCsA>CaISxVEzJuDEp8Ii:5=J9<@  PY  PY??+3/9/+933310!32654&#"'>32l.=ir٧ۺjZ~[:@  PYPY ??3/+9/+933310!&532.#"327ri=. Zj93@ PY PY?+?3/+?93310#"&'732654&#" ri=.j꬗Zj9WVN9@PY PY?3/+/+3/9933331032.#"3267#"Wri`Zjjhl a<@   SY SY?+?+99//99393210#"$5!2#"32%53שŦrJ< MR},-:!p@  "#0##@(#H#/## QY PYPY?+?+9/_^]+9_^]+q99333339102#!32654&+32654&#4rmCpw؀mfy:]|k:KU]eSHZRLIN&R@*!! (' PY   $$PY$PY?+?+9/_^]+999393332104&#";#"32>7#"&547.54632]jq\Z`uosms>omӻ,ZUN\`W\_`ƕ੓)"qX^'X@.'' !)(#PY PYPY PY?+?+99//9++923333310.#"3275#5!#"32>32&#""rigKzj v/4$+B7ZjCۉ^DK"Hy GM: W@   @ P ` @   @HQY/   ?3?39/]++_^]qr99333310!3#!#: :6:W) R@+ "!SY PY  PY?+?9/_^]3+3?+99333333310"&546;33#'26=#"53WOV\MAQW}~$%bYkk<98A;nz: >@        ??3939933333991073## n%2:m4i:@PY?+?99310)3!:[VW(G@$ #)* PY  PY&PY?+?+99?+?399333310"!234632&#"#7#4&#"326{66'%8<}6Ҋxy6We k[>/f@9  !QYQYPY?   PY?+3/?99//_^]++3/+9333333310!32654&#"'>32!!#5!/=.=ir٧K ۺjZn{Oc@6   !QYPY? PY??3/+99//_^]+3+39333333310%!#5!5!5&532.#"327!ôKri=.={n ZjV%(c@5 && ' )*''PY  #PY PY&&PY?+3?+?+99??+39333333310!.5##"!23'3!!32654&#" !C2z{2rVxyYt*hZ6Zbynڋ$VV1=@I((8##)8*.2?>.'PY.**PY ;PY PY5PY?++?+99??+3?9/+993333333339310%#"!23'3!# 732654&+5!#.532654&#"52z{2{܋X#oRxyhZ6Zbyn'[P͜26t*pVN&25?@G'33-99"5=@A4#4PY #:PY6PY5PY 0PY*PY?+?+99??+/+?+?3+393333333333310%#"!23'3!3>32+'7!.532654&#"%"32654&52z{2sTeav0"7,xyM/dFMF6hZ6Zbynڪ{gxy^T=ut*pɯ#Qf,7'-)d,"5_@2&. 22 .76&PY 1QY  QY 5PY?+?+?+?3+9993333333310#!"5#5373!632.#"2654&/.547#3d}5xJ\nzt0^~I(IyXbJ(3?+ƒ~HMJK.<*%$=JaFK@P"(MnPYBeNB)W%-d@7( #++# #./PY*QY@ &PY PY?+?+?3+3?+39_^]]333333310"'532>=#"5#5373354632&#"27#O7<96=XY}5x՗k,1BMK&=3W,Uh+҃0iu6 cN?,0<|@E & 5--;(=>#PY (;++8PY++  QY PY1PY?+?+?3+39/+9?3/+933333333310"'#"&5#53733#327&532.#">3 '2>54&#"w~z}5x32!"'53254.#"#'###5354632&#":lV!kv4SdIz F\a.N@)- ''/0 **PY*-PY???3+9?+99933333103332654&/.54632.#"#"&'NXbJʳnzt0^~I(ڊSRQXWQ@P"(MnP~HMJK.<*%$=Ja>G32#4&#"#432&#")oTvs{FRXf{10"/VbMD{qR}h>O udDp.@  YY?+/+?393331053#"'52653hzPS9*0%zyykbb4HFg-@  Y ???+999333104'33>32&#"ktJF%NOJq@bGt}r(.@  Y ??+?93993310#'##"'53265tLF%ONq@`It}6@   Y @Y?++?93993310327#"=#"'53265n&&'3&NH$MO9/ qPEt}d D@"  Y  Y ?+?39/3+9933333991033#!3254+ވ]f}z5x\fse.@   ?3?3393393310#&'#373?3u  y| x'~0IR9<U>M1@     Y/+?99?339933107"'5267373t1#98]+܃C/A_XtZˋh  WH @  /9/933910546733%+y_YaC}v? @  /9/993310#65#5?%+y_Y̒aC}S @  /9/933910##.=MY_y,$}F^x @    /9999331026544#*77*TeeT8117UfWWgx @  /99993310"&5463"3UddU*77*xhVWfU71184>@  Y Y??+9/+3/93331032654&#"'>32*iYWh~pb hs 3<@ Y  Y??+3/9/+9333105.54632&#"327Cq~hWYi* ĥsh eHeH!eF@ /3/9910%# #3FeF@ //39910%#3 3fHK !@  [/+9993310#'##53ih !@ [/+9993310#53373hi/9310#3qqL3XS@ Y/]+9910!5!X%/991053ǂ/9910'53ςj/9310#3qqjLChk/9910!5!h%wj/9910'53jςjj6/991053j:@  ??910#'73e ee e:c:?9910#'e e:\ @    /99993310726544#*77*TeeT8117UfWWg\ @  /99993310%"&5463"3UddU*77*\hVWfU7118 @ /339310%!53533{q{l @ /239310##5#5!{q{gl ,@   /9933933310##5#53533{q{{q{ }}l||/39910!5!pw 1@  P` Y/+_^]]q23910"&'33273)uu P@ Y/+931053 3s J@/  Y     @Y/?O/]+_^]]+993310#"&546324&#"326dddclN89NL;:Ldded8NN87RQPU9@# @ HY P`p/]q+/+993310#"&54673327?LijWD4+1-6=pfUF&-;F'*0@  Y    /   @Yyi[I9+ tbRB2"grbRD4$tdVF6"vfVB0 7@tp`PD4$tdTD4p?/^]]]]]]]_]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]_]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqq/2+_^]]q+3/3310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx $@  [/2+392331053353e @    /999933107327#"324P;~U*N#D<(4 - ,@    /3299939210''7'77XXXXXXXX;@  ?3/3933339331033#"&5474&'32ف*,UIJSJ!34ToH(L[[LT@Cc7 %d@ ??93103dz,'@@!  () Y Y?3+?3+999333310#"&'73254.'.54632&#"lbW!=xg[3znSO6APyW4luVk=9v$- 6M9imXci36(2!6T1N3p@ ??399310!#!5!pp$@ ??9/3993310!#!5!3pHp$@ ??9/3993310!#!5!3pH^p$@ ??9/3993310!#!5!3pHVp@ ?3?99310)5!3p0HbIp@ /399310)3!I_p bIp @  /9/3993310!#3!Ittswp}Xz @  /99993310!5!!5!ppvvPN 0@  /329/39933993210#65#5!#65#5%+y_Y%+y_Y̒aC}ÒaC}%@ /399910#373|Rr``r%@ /299910#'#3%r``rRV@ /9993310%5᪪r``rRV@ /999331057'5窪Rr``rW  @  /32993310#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99 B/9910 53ϱB @     /32339910 53!53cϱGϱB @  /2233991053353lx@    /32993310".#"#>323273*TNG76 [ 0Q?,TNEd\dl%-%>9fi=%-%wx~$@ //99//9333105353| @ /299310!#! QP| @ /299310!#5!W @ /]299310!3! jWPW @ /]299310!53!jW$@ /3]2993310!3!53WPX@ /]2993103!!iYȇ:Xq 8@ @ H @ H  /]3/+2/+9310!#53!qVpp M# /10'53ς  # /1053 K  /32910#'##53KihS Y/+10!5!%#T Y/+105!#$  /2210"&'332673xi cLJciw;IG=zZ Y/+1053Zլ{Y/2+31053!53sӥø+ @ p+/H/+q99104&#"'632#5>3*HFZjQ[pE0"c;U 2x8b  /3210#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--99 /221053353K /2910#53373khi: /10#3:qqLY/3210#3#36qqqqLL /2]210 53!53$G$d  /222/10"&'332673#5xi cLJciw;IG=z$  /32102#.#"#>wibJLc i{>FI;wd /9/10546733e&({^XjA~d /9/10#65#5d&({^X̨jA~d /9/10##.=^X^{(&~@hd /9/10#65#5d&({^X̨jA~[i/]10'53NςiOj/]1053j?_!@_o/]^]9/310#5#5353oo_sqr^_!@_o/]^]9/31033##ooKrqsy /210#!5!y9> /9/10#65#5%+y_Y̒aC}W_  /q9910"&5463"3_UddU*77*WhVWfU7118LW@ /]2310!53533{q{WlMW@ /]3310##5#5!{q{glKW @ o   /]9/33310##5#53533{q{{q{}}l||9c Y/+10!5!9p֍W /]2107!"'53253U2ExW /]2107327# xE2U3(u WY/3+31053!53sӥW8W  /3q210#"&546324&#"326xPPxwQRv`;--<<--;QnoPPnnP-77--999b @    /]9/10#65#53b,(u^XWu/dZJD /29310!"'53254&+739!1%=HAk'^^bV(*dSLU  /210#"&54673327?LijWD@S1-6=pfUF&$}B*0WCo/]10#3CW^Wy/3]210#5!#!yWPc}@   /^]3322310#"&533265332653#"MD^\a..7A\A7..a\^r&5lLCJEEJDKlWE[ @/^]3]2910#'53373ehiWWA[ @   /^]]2910#'##573Aihlr$v @  /^]3210"&'332673xi cLJcirw;IG=zr$v @ /^]22102#.#"#>wibJLc i{>FI;wWgc@    /^]3]29910".#"#>323273*TNG76 [ 0Q?,TNEd\dW%-%>9fi=%-%wx; Y/+10!5!%iT Y/+105!iW9@ 0/]q9910!5!!5!9ppvvg /2299107".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx_/310!5!_BV/310!5!VW} /3/310 'ccba//10 #X N\ @    /]q991026544#]*77*TeeT8117UfWWgWy/3]210!3!53yWPDW/3q210!!5#x_Wx纺^@  /39333/310&#"#4&#"#>32>32J7<\<7Jb ZNp9 N6N_ JJEEJJNZ[3(ZN%r% @   /32910''7'77WVWVUSUSli/3299105>54.5467i/PS,1#_s-0# 1?$ M&*15<"DN L$,25; U0/99105!%5!W ffff /10#5x  N /10#5Nx  ]@  /2/2/9910".#"#323273*GAA%/3 e,IDA$[fi%49%mze /9/10#65#5e%+y_Y̒aC}S   /339/310#553!53u| 쬬W @   /^]q210327#"=3>!,&!p y"/3210#5!#!yP W~@/^]]q99105!5! jjjjGW@ o/3]210#3#33W^^5W/]310!#5!Yuf@  /33229910&#"#>3273273#"''Q(c[ 0Q?>O=a=*d\dU;Q=azfi=0l6lzx1m7bp )@   //99//99399210".#"#>32326735353+QLE72 h 0R?,RKD62je7 '!53Y]6!'!72kլp1@ +.&! /22992/329910".#"#>3232673".#"#>3232673+QLE72 h 0R?,RKD62jeU+QLE72 h 0R?,RKD62je '!53Y]6!'!72k '!53Y]6!'!72kW //99105#'735vvOW@ /q9/3105#7#;v|W %-5=EKQYaiqy@ZNGG0488<ITTX ll$p (tt,x@D \`dhP|4557449 885667775558849*557sNsmmIt}! /91057'5窪xRr``rx\  /2210"&5463"3\UddU*77*xhVWfU7118$ @    /299//3102#.#"#>53wibJLc i{>FI;wO%B @   /32910''7'77WVWVUSUStV/22910%5r``rRtV/3291057'5窪Rr``rV @  /329/291057'5#'#3窪r``rRRr``rx]  /321026544#\*77*TeeT8117UfWWge  /104632#"&8''89&'8'89&'88AV)@   /]2993399333107''7'7'3 ]CKNB^ S3K%z)~)y%L5WE+@ # )/3//3/9910#"'#"&5463263232654&#"4&#"326EiNY33YOhiNZ22ZOh=,,;;,,==,,;;,,=NeIIeNNeHHeN36=,,=6336=,,=68g4 ?10#7!3_q@_q@SW  /3310! 332$7^JK^6svvS2 /3210! 332$7^JK^2svvS/310!5!JSU/310!5!JS /329910#"%$#"#>32327-^t-{Y͑9VUT\(-VS6  /3210#&$#"#! ^^0/ÂvvsSW//99105!5!5ϖlvcHi= ?9/1053332#4&#"#3)oTvs{FRXf{{bMD{qR}h>ppc@  Y ??+/104'33>32&#"tJF%NOJq@bGt}rWw7Y{O @  /3?3910 #33DŽ :r(v6/991053n uWx/9910#5n߈W6>Nb@A  PY p`p o  PY ?+3/_^]?3/^]q+99333104&#"'>32#"&'7326ir٧`"jZẜ lhWN&FG(@4Td%+5/_]]5>N&5(@4Td%+5/_]]5:/991053E!$%A :@   Y ?/]]33/+393331053%53!53EؖB!p%R&$9l|- @%/P0`?5]q]+5~@@w|HRb 0@p@ goHDTcfH\_HW[H@QVH$4D@CFH0$<@ 8;H@+-0H  0  HY/++_^]]]q_qqqr+rr+^]]]+]]q++++r+^]]_]+]q991053'(9(|-@ q@%/]]_]5+]5?5 '+9%|6@Pq@%/o]5+]5?5]U',9|@@ + 4 f@%/O_o]]_]5+]5?5]]&29|%@ ^@ %/]55+]5?5A'<9t|@ (HXhx8X Gg77WgwWw<'g'7GWw '7W 6vV&&Vv@6fv &F@Vfv%Eq%5Ueu %5EUe uA$DTt tbsx   @ ` p @ %]5+]5?5_^]^]q^]qr^]^]qr^]qr^]q^]qr^]q^]qr^]qr^]^]qr^]qr^]&[ 9|6@ +&$$$>@$$!!%_]q5+]5?5]A&k:@/?O/?Oom/8/_ @Ps p= &ܴ %+555+555^]qr^]qr^]r^]qr^]^]qr^]qr^]qr^]qr^]R$%/@_Y??+99310!#/8=>@!   _Y ?2?+33_^]]93333103!7%.'C#3 + ^J oj(A= +aO@+  `  _Y  _Y _Y?+?+9/_^]+_^]9933910#"$5!2#"32!!שŦrJ< KMR},-f|,?. N>@$ vo 0 /  ]]]]?2?3]9333310%#'#3N|TTz? 0 1Z ;@  _Y _Y_Y?+?+9/+99399210!!!5!5}9\a2 ?@     @ H_Y?2?++_^]q993310!!#!ax 3l E@#   _Y  _Y?+3?9+3999932231035 5!!!lmCC|.7-)<u(~@, $ )****$*D*d*****@ H# #`Y &&`Y  ??99//3+33+3+_^]_]]]]9333333310+#5#".54!3533 !#326%;#"SS~HG0884o.+;|@9 D`DT 0 @ H `Y  ??339/]3+3+_^]]]]]]q93333310!#".53;332653+SǬ88ÿS-Iǯ1UW#S@*  ! !$%% _Y _Y?+?3+33333_^]993333993310 ?3!5654&#"!53&5/[QQ[s_`qU&O4&, @&%+55+55-) @     Y H vbTF6$pd@4$it`PD tdT@0$tTD$9pdT4$@8T4p`0/]]]]_]]]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]_]qqqqqqqq??39^]332+393310#3 3%53!53 ӥHH9ayVe&c9!@ '&''*%+5+5Fj&g9@ '&'I'* %+5+5jX&i99@ &d %+5+5&k9@ &    %+]5+5A&w:!@ &"%+555+555VeN&U@- !!('(( !  $PY PY?+?+??9_^]993333333310%#"323673#.'3267.#"K?y~-22T;/#rxwyyywtjbg=!1WI)Y@- # +*  PY &PY PY?+??+9/+999333339910#"'##463232654>54&#"Iܷߔ@Qqyn^rXܷW+1zbpX:M@   @0`@ H  ?2/?933+]q933333103673#674z": @:]?C?[ZtV ?@  !"  PY PY?+?99+39933932104.'326'#"5475!`5ST54.'.55!5!0]6oZ:$/~ *Ss[O7={CS5#"9XD,mO8R$0$&5KeBa#jXNM@  @H PY  ???+9?+_^]]q99333104.#"#4'33>329*\Y$>yXVkv4S{l'i)p]j  U@`@#HPYPY PY?+?+9/+_^]+]99333310#"!22!"!  *#}}t : @    O ?  j   p `      ? `   7     ? /     o      ?   ^]]]]]]qqqqqqrrrrrrrr^]]]qqqqqrrrrrr^]]]]]??933103.53 +% ENAz(: A@%   ?  ?2?39]]39333310!#33 0Im: /D@' 0`   PY ?+?399_^]9333310.#"'632#&'#D++6'#C>kK)+żd; Apf.kw:L@ @H PY?+/?3?99+_^]99333310!.'##"&'##332653^54.'.VܖJzM0]6r^=$/~ -Xs[O7b! qg}kEZ4 CS5#"9XD,mO8R$0$&5KeVNRO+:J@(  !!/! PY PY?+??+33_^]933333310"&5!#6="5>3!#37fsfn4.4:Bk4%*4VMqH+P SLEW;OR@   @#H  PY PY?+??+9_^]]+]9933310#"&'##4324&# 326;n@Վ~7XDK54&'.54>32&FRZn$/~ dMOoeAt_zy?#F,mO8R0B,0qo^6DwdV:/@   PY PY?+?+39933310#")#''#"!260,9QG|Y* %yzc:L@  ? @HPY PY?+3?++_^]]]q9333310"5>3!!37#"&5Bk4D*4VMBsf SLEq:C@ `@H  PY?+?3_^]+]]q993310#"&5332654'3ɵu}F,5:;c.UvUWR"V@.   #$$ PY PY PY??3+3?+3/+_^]933333310#&4746324&#">|WP5i  * ڸDXPp@ $  @(H   H PY ?3?+?9+_^]]^]]+^]]9933922310%#.#"'6323 #IC&"5AVkPi9WJ dGW,<`@:   0`0@p PY  ??3+3?33/_^]]]qq93333310%>53#$&533.򵐸w|kzSO*z@ ""((+,,0,,,@(#H,,, ,@, )) %%PY PY ?3+3?3+39/9_^]]+]qr93393991032654&'7#"&'##"47326=3srfrqzeϾ~""~worfvϹ灊@ λ{&kj@  &ٴ  %+55+55{&wj@ &%+55+55V&R9)@ &F%+5+5&w9@ &%+5+5S&{9@ +&+7+.%+5+5s#'1^@4.("  23%PY0PY 00 00 +PY QY ?+?+99//_^]]9++99333992310>32#"&32#"32654&#"4&#"32;&*c֦l^Yy\NN)s*tK]<${o=tQrƑ6=HHO P+3]@2,**  1$$ 54 PY , PY*,,,''/QY'PY?+?+99//93+3+933333310## 47654#"'6323265&$&5463234&#"Pa:1`jO]hRFg^̪av 1]]#<16cX2]]2BI;av{9 .@     _Y?+??99933102.#"#3 > <;T^%$1 rT7x-3-0H9aVG'|2#?59 & y@ &%+55+55PW+R@-   PY PY PYPY??+?+??+?+9333333310&5%34&'>%_pzzpktujW4q .Zǽ˷+R:-[@/+ (""(/. %PY)) PY PY?+33?+9/?+993333333310!##"&'##"467#2654&'!32653Rl09Ͼ~""~63itt>01-N@+ *&! ./'PY'#SY SY ??+?99?+?+933333310 !4#"'632!327#"'5326=.547tw8"BK|z6$  oyw*2@C+578ca5"PiuI DQdBaW2@  _Y_Y/?3+?+933310$!2#"32rJ< W<R}ep,-VWN 3@  PYQY ??3+?+933310&!24&#"326ܺЅW0erP:@  _Y  _Y ??+99//+933310!&$&54$32.#"37%#X3ߓo =  C~ovIZWN,;@ & .-'# #*PY# PY ?3+?+992993333104.'.532.#"#"&'5326(PgVvi,D\9mW5]2nDvvw)6%ԗ ZjKkL3% B6u˄0{~xt9cVi1@     ??993333933310%54''%&''%%7i.7,F~-GGpj6ΒwqU3X}+Q@*$!* *!,-+"'`Y`Y@`Y?++?+?33999333331032653#!5!26=##"&'## 33265]st`ӯ桙*z{%^[tw |gYXWVc} ~X:-O@)&#, ,#./ -$PY )PY PY?+?++?33999333331032653#!5!26?##"&'##"&533265VpsaӮI8p{8qVpv:Rxs2lm`bkm`Rxsd7@ _Y_Y  ??9/+?+99392310&#"32673##"54632HUww^IݶTx346$~S'&E@& PY  SY ??+?9/_^]9+933310!#"&5!2&#"3265393|3U:=u*`U)[P(|ro4~4X8@ ! _Y_Y?+?9/9+99333310!2>54&#"#3763 #!.Z1UWF$7j"MВ0*P:y> '2]@3, 1$ $ 34 1"/"PYPY// PY (PY?2+?+99//++9?993392210267#".#"#46323 4'# 54>"327&p4#|H%crɅC_H7=mTOWVO "bSq=@7>54&#"'6$!232654'7! $n+NlOl?05c`r?ǻ5CMsT=-($6Q?nqep!ƳNz[K%&8VEzYh6zun,E@#&.-&PY,,)PY?+3/?+3/99933310%! $54>7>54!"'6$3 3267+NlOl?/ 5c`r?ڽ+?۾MsT=-($6Q?il!öNz[K%&8VEy("%V@0 %#$$ # '&%  _Y $ $_Y _Y?2+?+33?+399339102'&#"!5.#"'>327>!L@f"FA)1|;6|2)AE#f@L_t(CB%t>eln3f&.*.&f3nle]qma HA#O@- !$% !PYPY PY?3+?+33?+399331032'&#"!5.#"'>3276cmL8h!B$<@!! %&SY SY ??+?99?+9333310 !4#"'632!327#"&547tw8"BK|z6$  oyw8"BK|z5"PiuIBbWDN,@@!  '.-PY  *PY $PY?+?+9?9/+999933104>32#"'32#.#".4.#"326b6wz`B$O{E%?}paQ없H$VY =lUWNFW=MaP9:G@%  PY    PYPY?+?+9/_^]+99923310)"3!!"!!)9w# 'P9:E@% PY  PY PY ?+?+9/_^]+9333107! !5!4&#!5!2#!P #wUWhy& 9@    ?3?9/993?9333310!##3 3VE=l(UW:5@ ?????999333310!##!67!#?4. Gk}rs W;O&Q@)   '(PY @ $PY?+/9/3/?+9933333310#"&'#!!#5#534324&# 326;n@?zzՎ~7XDK32!"&'7326=4&#"#!5!uT^Eo!!24&#!!26 `13_:%5C:::*~or A)ByP@*  _Y _Y  _Y?+??39/+3/+933333310#!!#3!3!24&#!!26¿>VGsTy./e@<  ` _Y  _Y ?2?+39/3+3_^]]qr993333310!4&#"#!5!!$3 q ?zm2 圜;&@ &% %+5+5&T&%+5+57:&^J@ & %+5+5h G@(        _Y/?+3?3/_^]]q933310!3!3!""hhR$ _@  `@%#H _Y 0  _Y_Y?+?+9/_^]+_^]+]99333310#!!!!24&#!!26!~oHy%/FhEL@*   /  _Y _Y/3?+33?+_^]93333310%3#!#36!! 2Nm%CԺ1%Z?h8a_#Ae(G#@Q #""# #%$/%% %0%@%% !`Y/ #?33?339/]q3+39933_^]^]_]9333333993339910"&'#&'3332>73###R%oU0o`XKKZbk0Um' U#ϧk(k)o1f# {Cp'@B" %%()"  _Y? @ H_Y_Y 0p H?2/+]q+?+3/+9/_^]+9993333339910"$'7!2654&+532654&#"'6$32mVwGG~3FMvw{k{u=ǩ  8@  /  ?22/?3/3]99333310333#47ުdrzZ:&J@ &%+5+5P@)     `Y/ ?2?39/]+39_^]9933333991032>73###KZbk0Um')o1f# {7@_Y _Y?+?+?_^]93310! #"'532>!#^13_:%5C:::*r A)B0 +a2S@   P ` p ]q]3hy&.77=@    _Y?+3?3/993393310"&'732>73 3L>.Q^H3EFfUj}& ;'_z8v(j@< # )**`***?** $ $`Y &&`Y  ??99//3+33+3_^]]]q9333333310+#5#".54!3533 !#326%;#"((~ W o.+;h A@!     _Y/?+3/?3/_^]99333310%#!3!3ŴP@ @H _Y/  ?3/?9/]3+3+_^]q9933310#"&533273#Gھ"R{l1 U@1      p @    _Y?+3/?33_^]]_]]]]]93331033!3!3h/W@0  0@`/   _Y/?+3/3/?33_^]]]93333310%#!3!3!3/-ӺҺ. E@$   _Y _Y _Y?+?+9/+_^]99333310!2#!!5!4&#!!26B5s3-Ҿym R@  @ H_Y_Y?+3/?3/9/++_^]99333310#!3!24&#!!263~oy B@% o@P _Y_Y?+?9/+_^]]9933310#!3!24&#!! ~o@yiyy@J  _Y_ _Y@P  _Y?+3/_^]?3/^]+9/_^]q+93333310"'6$3 # 7327!5!&$ɘ-G.BlVE rv<tNa@8  ! !_Y _Y  0   _Y?+??9/_^]^]+?+_^]93333310# !#3!! #"32ٿ*W6\f;s$E,+`  Y@0     _Y?Oo _Y ?2/?+9/_^]+3993333393103.54$3!#!3!!"`I;_֝IWsNDx? "W@ $#$$$@#H PY   PY?+/_^]39/9++_^]993333104&#"3262#"4>%>.b~]d+ʿûBN|L56b}:!x@  "#0##@/#H#/## QYo PYPY?+?+9/_^]q+9_^]+q99333339102#!32654&+32654&#4rmCpw؀mfy:]|k:KU]eSHZRL:@PY??+99310!#:I:h:F@$ PY PY  /3?+33?+9333333310! !#!#36!3B%Z@FңwKn.mh}nIWNHS:#@I ""##$%%%p%?%o% %%%%P%`%%/%% @) H!PYO_O #?33?339/^]q3+399+33_^]]]]]qqqqq9333333993339910"&'#&'3332>3###SAa#]ؼBH;.04Bü]#aA PEj]$&3\; #1^N$@R  ""%&&  PY    P`pPYPY`p ?2/]]q+?+3/_^]9/]q+9_^]993333339910"&'732654!52654&#"'!2ʧ-5`qc]Yq .KΑgy},^[ȉTXJVJF~e  m: F@+   p   ?33?33]qr993333103#467#< Ŭ:e$:&@ & %+5+5:d@9  /  PY?O?  ?2/?3/9/^]q+3_^]3333933991032>3###04Bü]#aA:&3\; # :M@3 pp 0`p PY PY??+?+_^]qr93310!! #"'5326!h;@JmV2,+7C7#,LϜJ nE:F@&  ? ?333?333]]933333310!##!67!#?4. G,:k}rs: g@   @ P ` @   @!HPY? ?2?39/^]qr++_^]qr99333310!3#!#B紴:6:VNR:C@+  `   PY?3?+_^]]qr993310#!#Ǵ/:I:WMSWNF#:;@" ?    QY?+3?_^]]]]9310!!#!#d:IW:\VW>%2@@g3:,, & BA ##6PY#0PY)PY >PYBBBtBdBTB4BBBBdBTB@B0B BBB]]]]_]]]]]]qqqqqqq?+??+?+??+9933333310#"'##47##"!23'33>32326754&#"4&#"326>O.omp-.rmvzwylnkx^j7zwn"WSYmChZ6Zb\hY\ɿ:[hf: :@    PY ?2/?+3_^]99333310!33#!Bݴ:II:z:8@   PY?2?9/]3+399333103273##"&5.nN~:n/8: W@!  d 0     @ H PY?+3?33+_^]]_]]]93331033!3!3:IIhf:c@;   `@P?    PY?+33?33/_^]]]_]]]9333331033!3!33#:III-: i@ @'#H QY   O   PY  QY?+?+9/_^]q++_^]^]993333102#!!5!32654&+ gʂxtp6\c^W2: R@0  QY   O   QY?+3?39/_^]q+93333102#!332654&+3&gʂxt<p:6\c^W :: j@H /Oo @#'H QY   O   QY?+?9/_^]q++_^]q99333102#!332654&+8U܂xtp:6\c^W7N@B  PY  o     PY `p @""Ho @ H PY?+3/+_^]?3/+^]+9/_^]q+9333331073267!5!.#"'>32#"&7d c ߫; lhNO@+   PY PY    PY?+??9/_^]+?+93333310#"'##33!24&#"326 ޴!׽x~|:6: S@*  QY QY ?3?+9/_^]+399333339310 #&463!##";Xxk|63\]^]W&HC&ʹ %+5+5W{&Hj@& %+55+55 W){@A )) * ++@+P+`+@+++0+@+)PY QY%PY H??++9/3+3?+?9_^]qr]3933333103#5353!!3>32#"'52654.#",:}xxM2>F6*`U= jcљ Hhro4&v@ &U %+5+5WN@\  PYo  PY /   @ H  `p @ "HPY?+3/+_^]?3/+]+9/_^]q+_^]93333310"32&#"!!!2674 ҋc d!ħgm 9KV=L%{&j@ &%+55+55W=M :#}@ %$ %%@5#H%% #QYO PYPYQY?+?+?+9/_^]q+_^]]+q933333102#!! #"'5326!32654&+M>e;@JmV2,+7C7#,xtpLϜJ nE6\c^W,:z@  `@1#HQY PYO  QY ?2?+?9/_^]q+3/+_^]+]93333331032#!!#3!32654&+fNʂxt:6:6E\c^W  o@<!"@"P"`"@""""0"@"QY  PY H?++3?3?9/3+3_^]]qr393333310>32#4.#"##5353!!=:}*`U,YjcWro4= &v?@ &Q %+5+5&C& %+5+5W&\@ &  %+5+5h: L@.   @ P ` @  0 @ P  PY/+3?3/_^]qr93331033!3!#:Ihr F4Z@. '-!!65$$*_Y($1_Y_Y _Y?+3?+?+?3+9/99939333210332#"'>3 # '!"$5!2&#"3267J#tMϓBllBMtO2qLV;,h|GANQ~AG|hXR:8@     ?3?339939333310# #33654'2o S\0:y]x:nnKzM@)  _Y`Y_Y??+99//3+3+93333310!53!!!2#!!4&#!! ut@דҾyK@(  QYQYPY?2+3??+9/+93333310!3!!!2#!!3254&+-*:t:o娟^f@!@K!!  "#@P _Y _Y   _Y/??9/]3+3?3/+?+3/_^]933333393310333! .#"!!3 # #a+2Гz$c1N<~$Mñ]5xN!@Z !!#" p`p PY PY o      QY/??9/]3+3?3/_^]+?+3/_^]q999933323310333>32&#"!!!267#"'#֫ ҋc d:+ħgm R @@     _Y  ?33?9/9+393333310##3###!&'T?6мY 3'YEW: @@    PY   ?33?9/9+393333310!#####3 tpBpp:n$R@*    `Y ?222??9/93+339333333331033!3#####!!&'n)6м 3('YEW:Q@)    PY ?222?39/93+339333333331033!3###### !tp:Bppqny)Y@-     `Y_Y ?33?+9/33+3933333333310#54.'##5%! ![Ƥ[  GCx/ʹ\r\ |}z:_@0  QYPY?33?+99//3+3933333333310!#54.'#"#5467!!;|>ȔMOFDQEFFkƯi~!k@7  ! #"`Y!_Y ?222??+9/33+3393333333333331033!!#54.'##57! !GE[Ƥ[Cx|/ʹ\r\*|v:!$m@8 "#!! &%  PY$#PY ?222??+9/33+3393333333333331033!!#54.'#"#5467!!BȔM;|>8<O:kƯFFDQEFF+Q~`WpT@M)&6KA@ &,,&@KUVC=_YC CCH)`Y2OOH#AHH8_YH#@### `Y#?+3/332/2/+39/93+93/_^]+9333333933104&+532654&#"'>737>32&#"32>32#4#"#"&54>7>GG~37[H6S-B X0Rsm;:kc]-^mJVl~CTlW?#vw{k{u=SC8M> [\;$ 3)l!dM"zWn>%>Y WM@LDC1 - *9*1CONF@PYF FFK5- PYK 'CKK;PYK#'@'''QY'?+3/332/2/+39/9+933/_^]+9333933233104>7>54!52654&#"'6737>32&#"32>32#4#"#"& Hk9c]Yq $Լ[H6S-B [pgyRpO*:\RN-[jJEWlD{Nc<-L=ȉTXJVJF,YC8M>fe  m_P.$t$}hM#C<@  `Y ??339/3+393333310!".'33332653+cr\30PmP8¿S6k-GD̯;UDW:<@    PY  ??3+3?3393333310%>53#.'33w\(#TWwrkQRia.P@+,!0/*_Y$_Y$ *$*$ _Y _Y?+?+99//_^]++99333310#"$5!22$7#".#"">32327&שŦrJ}=Q>}LOq7vcMR}4+5+Is("$%!9VN (N@*" )*PY$ PY $$PYPY?+?+99//_^]++99333310#"!2"3267#".%27.#"632xE= I64WNJ&?= >?2OKO!0#ð !)!!!(! V&@ _Y ??9?+9310!#3?632&#"(,;-LK0TMa37 iN+7)E3GN&@  SY ??9?+9310!#37632&#"ew 8JBrQAT.8:@( [?4L VL&%mh@  &>%+55+55&&@ &Q %+55+55aW (O@*"!! $%% )*# $$!PY _Y _Y?+?+?+?39993333310#"32#"32"'532?3 3J2&.bg2tVwWS|-+ +5vUWN 'M@)! $ ()"## PYQYQY?+?+?+?3999333310# 324&#"326"'532?3 3d|˻crsifnwfFJ2&.bq(~P2 +5v6t0J@&% ("." 21""_Y+(.( (_Y ?33+3?3399+39333310%>32#"&'$>32654'#"&'6X'T43U(YݾV56UX87YZ89Z3+55+~-87-30<<01/1>>1+-I@$#,&   /.  PY) ,& &PY ?33+3?399+3993993321047>32#"&'&7>32>54&'#"&'+R43RR33QU65S{ts{T55S-77,,75+$00<:.ն.:9-7l 1EP{@A2+LFOO< RQE223 # '!"$5!2.#"326732#""&'.#"#>323%#65#5HNR@jˡj@SMKCg5AA4hCferFv ߤAo\ %jSNW#mmLR}# VEEV?, 58?.mp*@91b*<4:bGWw%0D~@F1,/'../;FE1;//+000;++;0>>7QY>> >PY #PY ?3?+?+?3/_^]+9///_^]9/39933933221044#"'#"4>3"3267326#65#5"&'.#"#>323p㻃pٕX1-Z %jSNferFv ߤAo\"ĖSS:-+<rb*<4:bG58?.mp*@91r F& Ph??&@@5!%+5+5& l@  &!! %+5+5hUl4@  _Y _Y?+?3/+933310$!2.#"327n@.G1ٕ(,Uy7T<{ PWL1@ PY PY??+?3/+93310&532.#"327ri=.W" Zj ?@     //993993999333310%%#%7%73)Nd))\M)a~^_`5]^^_{` ?3210#!#"&5463!54632`I5C.2BI5[C.2Bq2<8<@42<8<@L  /333/310#.#"+53267632LY55!B&thfi4X*aFcgJ@&H .}Ib /9/10##.=bYNw#̺^k3rLIb /9/10#65#5b%wNY̒Jm:k^;.  /32210"&'.#"#>323.ferFv ߤAo\>58?.mp*@91% '1;EOh@5F#K>C HH%M2 7 449(-**/KCM79-//-97MCKA</3/39////////33333333333333333333104#"#324#"#324#"#324#"#324#"#324#"#324#"#32%4#"#32rrgrrgrrg-rrgrrgrrgrrgrrgĕ敕&k '1;EO%@OME@C0'%  /3/3/3/33??33/310#65#5546733#"&'5353%32&##&'''.'77'67'77>7EdBKdBKjzD])XQzD])XQ=V0/ G95nEV0/ F95o V1S1Gl:5nV0T1Gn95m;zD])XPzD])XPdBK4dBKW0T1Fm85nV0T1Gm95n>V0/ G:5nV1. G96mf:\@1  _Y p ??399]29?+993333333333103333##47  33273X dr,zZ@[@-  @ SY ??+?99?299933333333331033##467#% 33273< ٬y :Ceg(77:v@N@(  _Y`Y_Y??+99//3+3+993333333103533#!2#!#4&#!! +@דҾyN@(  QYQYQY??+99//3+3+99333333310533#!2#!#532654&+ww ?z.xtl\c^W\@0      _Y_Y??+99//3+399933922910#!#!2)!27'76(wbQVtks~MslflGʟn}`-|ao6W!M-[@1*,$$ /.  PY),++''PY?3+39???+999933333910'#"'##4'33>324&#"327'76^bd^WyV0ƽzky?X8ve_#"jZe6Y61fd]Z*[hb#@ _Y/??+9933103!# %@ PY??+/993310!#!3!B٣8:/ =@     `Y _Y?+?9/3+39933933103!!!!##8\&\@m: ?@  PY  QY ??+9/3+3999222310!3###53˴zz:τW O@)"!_Y_Y _Y?+9?+9/9+93333310#"$'732&#"#!!63 <-α:qj_& !ZM% %1[W: P@*"!PYPY PY?+?9/?+9/9+93333310%#"&'732654.#"#!!632tӋ.yfUbtfaSts|\{ TKpV c:t#uhN'|@@" &&' ' ')("%`Y! !_Y! '?3?33/?+9///3+3339333399333339910"&'#&'3332>733####R%oU0o`XKKZbk0p1Um' U#ϧk(k)o1f# {hS:'|@@!#  #)(!  QYQY  ''"QY'% ?3?33/?+99//3+3+33933333399339910##"&'#&'3332>33##uAAa#]ؼBH;.04Bü]#N% # PEj]$&3\;3CWp5o@:(%%+0 +763`Y3.@(`Y".. `Y .""_Y"?+3/?33/+9/+9+9333333399103254'.'7!2654&+532654&#"'6$32#"'7YVQwGG~3FtsS#PAMvw{k{u=ǩ |R_n"1W^N3r@;%" ."")) 45%PYPY1QY1@, PY ?3/+3+?+3/9/+993333333991032654'.'732654!52654&#"'!2#"'WN@;,5`qc]Yq .KΑgy!wxgT"=?OG|~,^[ȉTXJVJF~e  m}kVkq!hQ@( `Y _Y?2/?+99//+?99333333991032>733####KZbk0m.Um')o1f# {h:T@+ QYQY QY?2/?+9/++?33333933991032>33####04Bü]#N%A:&3\;3 #\@.   `Y   ?3?39///333+339933339933310##3273>3##:1@+s!v0s{'.f#k:\@.    PY    ?3?39///333+339333339933310##32733##%(iݼ]#ai#:& IvU@+ `Y`Y ?3?399//3+333+9933333399103533#2>73####KZbk0Um'ד)o1f# { [@. QY QY ??9/3+3?39/3+33339333339910353!!2>3#### 004Bü]#aA93\; #)N@(  `Y  _Y?+??39/3+39333339910!2>73###!)KZbk0Um'?)o1f# {(O:G@$  QY  PY?+??39/3+99333339910!2>3###!(04Bü]#aA:&3\; #hC@#  _Y _Y ??3/?+9/+93333310!#3!33##asThW:F@$     QYQY??3/?9/++39933333310!#3!373##)y:6G =@  _Y _Y ?3??+9/+9333310!!#3!!!a@sT : =@    QY PY?+?39/+?9333310!!!#!#BӴ:6ʋQ:W!S@+ !! #" _Y _Y_Y?3+9?+9/9+933333310!!#!63 #"$'732&#"ax <-αJ[ZM% $31W:"V@- !!$#PY!""PY" ! PY ?+?39/?+9/9+933333310632#"&'732654.#"#!#ts|tӋ.yfUbtf":#uޗ{ TKpV cN:>+7Z@3 //5$$'2 892' ,_Y  _Y _Y)_Y?+?+?+3/+99333310%#"'# 4632&#"327&5432327"654&kȀ眄WOFkZRQhII@ 5j{2DGvy0D07./46/.5#7%%-Nu޲'xvti44hWy'v@E%$$  )(% %%!!_Y!`Y @P  _Y ?+3/_^]3/+9?+3/_^]93333310"3 #"'53254'&$5!2.(KtsSYV֝lB.G1%N|R_n"#PAHQ~<{WWN(@R# *) p`p &&QY&!!QY! PY ??3/+?+3/?+9/_^]q]9333331032654'&32.#"3267#"'WN@;ri`{"wxgT"=?OG Zjhl wNkq!.h 4@   _Y _Y?+?+3933103##!5!Ќ圜#h: 5@    QY QY?+3?+93310!5!!3##{dt_ "@   ??39933310#373<&--'HH9gfAW: @   ??399333103?3e 8:]W8P(5W_6@   _Y ?3?9/33+393333310!373!!#!>F&--'FffgfA_HW:6@  PY ?2+3?39?933333103!3?3!!#!d>e 8:]>´:P(5Ɗ.hBO@*      _Y ??3/?+9993333333910 # 3 3 3##P}6h)bh:O@*      QY ??3/?+9993333333910 # 3 3 3## *d.D,[U1h9>@!    _Y _Y?+3??+3933310!!!33#!!1&h^;?@!    QY PY?+3??+39333310!!!33#!!&Lݴ;Ih:<@  _Y _Y?3?+9/+9333310#"&5332733##Gھ"R{l1E&:@ PY PY?+?39/+9333310###".5332733nJ?Y8ft-4ouɅaD$6nV@-  `Y  _Y  ?3?9///3+33/+933333310"&533673##W۾z{xj{³Rxl1 ") z:V@-  QY  PY  ?3?9///3+33/+933333310"&533673##6pBvwApyn 0"/-@  _Y  ?3?9/+9933310!4&#"#3$3  ?zm2 ;K ")^@1& ' *+_Y&  #`Y _Y ?+3/?+99//_^]3+39333333103267# #"&5473;!2"!& Λ9RCvz'f!4_ ryFU1:;;2p.X$?  N$V@,$  &%  PY$ !PY PY ?+3/?+99//3+39333333103267!"#"5473;>3 '.#"ua 4zݺ^H-=>;2p %,m@9)) *## -._Y)  &`Y @  _Y ?+3/3?+99//_^]3+393333333103267#$#"&5473;!2"!& Λ9IÆCvz'f!4_ ryF$S:;;2p.X$?  N&k@7&   '(PY& #PY @  QY ?+3/3?+99//3+39333333333103267#$#"5473;>3 '.#"uXۆr4zݺ^H-&(=>;2p|,G+&];@ $$&&&,%+5+5S&Y@ $$&&&,%+5+5W"S@) $# `Y _Y?+9?39/+3993333333910%#"$'73254$!##32>73<.~ǿKZbkp45Ѽߝ]Ox)o1f2W:#V@+!%$!QY PY?+?9/?39/+3993333333910%#"&'732654.+#32>3rҎ.yfn|04BüT&\z TK] :&3\;|$fR:@ _Y_Y _Y?+?+?+933310! #"'532>!3##^18`~:%5C:::*Z A)B, ::@ QY PY SY?+?+?+9333310#! #"'5326!3Y~;@JmV2,+7C7#,Ϊ7LϜJ nEg(W F@#   _Y   _Y ?+9?39/+993333331032!#3!3!"$'p.Լ9h\NsTlW:M@&   PY QY   ??39/+?+9/99333333103265!#3!3#"&'Ilk~xų"VJ:6f=@   _Y   _Y?+??39/+993333310#!#3!33pfsT,:C@"   QY  SY ?+??39/+9933333310!33##!#B紻¬:6g(7:h@@! _Y @_Y ?3?+9/+9333310%3#"&533273##eGھ\"R{l1hzh:<@   PY  QY ?+?39/+93333103273##3#"&5.n}lN~:n/hJ8f"G@%!#$"  @_Y?+?3?9?933333310%3##4?#./#3>73ļ (' Dw%3 p}"k@pT/;(:G@% @SY ?3?9??+933333310!##!67!3##?4. ¬zG,:k}g(7rs>OR&$ z@ &%+5+5Ws&D11&4Դ4:%+5+5R&$ n@&%+55+55Ws{&Dj@ 88&6д64%+55+55BN&(  & %+5+5W&H@ &# %+5+5^QWN^&Q @ ''&%%#%+55+55W{&j@ !!& %+55+55G& m@ ++&))'%+55+55S{&jk@++&))'%+55+55Cp& )@//&--+%%+55+551^{&j@,,&**("%+55+55MT@+  `Y_Y_Y?2/+?+39/+3933393310"$'7!2654&+5!5!wVw?7M𡇅q ܲuDW :T&I@ &%+5+5S&@ &  %+5+5& @ &%+55+55{&j@ & %+55+55a&2 @""&  %+55+55V{&Rj@&%+55+55a?@ _Y _Y _Y?+?+9/+99333310#"$5!227!"!&$שŦrJ~_τz.WKG@& _Y?+?9?99333333910#"'532654. # 3 3 K;I:=5CUP}LtX 4@ _Y  _Y ??+9/+99333104>3!3!"$7)! XsܖH{}m%,VG[9 &N@(! !!('$`Y$ _Y `Y?+?9/9+3/?+993933931032>=!"#"$54$3!332653#"&|UL~q後QnbW⻾T7śEoV{)U@,$ $+*  'PY !PY PY?+?+?+9/99?9333393103# '#"!23'33265%32654&#"Ƶ_:Ȏ{2q~~pMxyzib6Zby韟j`")Q@* $''*+`Y%%_Y"`Y?+?+3/9/3/+99333310"&54&+532654&#"'6$323 3dݾGG~3F{|~tw{k{u=ǩ :EUN&Q@* !$ $('PY"" PYPY?+?+3/9/3/+99333310 .#52654&#"'!23253O.c]Yq .KΑgz dKgUTXJVJF~e ca{t=`h#S@+ #! $%`Y!##_Y# _Y?+3/?+9/+9933333104.+532654&#"'6$323##JGG~3Fujz5w{k{u=ǩ UhNU@,   ! PY PYQY?+?+3/9/+993333310%3##4춮&#"'!2_wc]Yq .KΑg%jdTXJVJF~e A"C@#  #$ _Y _Y `Y?+?+?+9/933310"&5! #"'532>!32653^18`~:%5C:::*xwTZ A)B6E : C@# !" QY PY PY?+?+?+9/933310"&5! #"'5326!326=3;@JmV2,+7C7#,~y&LϜJ nEzÞG@$   _Y  `Y?+??39/+3/93333310"&5!#3!332653swsT6E:C@# QY  PY?+??399//+93333310!3326=3#"&=!#B~x:6zÞ\:g*^N$.t9@  _Y `Y?+?+39/93310"&5!5!!32653twXҞE#:<@  PYQY?+3?+9/933310!!326=3#"&5!#du~~x뿾:&R&Z@-#$$('`Y _Y ##!_Y?+3/?3/+9/+9993333339910"$5467$54$32.#";#"3 [槛G4{GGuYCФ=r{k{wvMIvN%^@/ "# #'&PY PY "" PY?+3/?3/+9/+99933333399310"&54675.5463 .#"3"327ݿՖ|kѥK. pZ]coe5-l  cFJVJWUfaTf,}W;@!_Y_Y _Y_Y?+++?+93310 #"'532>!#"'5325=18`~:%5C:::*;@,B{Z A)BX W:5@   QYPYPY?+?+?+93310!"'53265! #"'5326!=@,D7:;@JmV2,+7C7#,΁CQ2LϜJ nEa}4VWNT ::ZD!@ @P`/]]29/3310#54&#"#546753f&03'dCFfHC/6..6/1XZ ^^ [W+N #(@ @ H!>?3+]q223104632#"&74632#"&4632#"&+. ".." .. ".." .r. "--" .o -- ".." -- "..".." 00mN >?10#7'7'7vVVVVVVVVVV^N "@ @ H>?3+]q2104632#"&4632#"&`. "0/# .0 0/!".m"--" ..".0 0.`N (@ @ H>?3+]q2104632#"&4632#"&3'." 00 ".. !/." .om"--" .. 0/!"...nN/]2103"&5DtfR\ijhX >?10'7P+! @    >?]99//3310"&5463232654'7#"&'.%9mRA/Q5(7 %9mQ>2S4,19&%@H&xAR5J9/&%@H)uAR6I>*N>?]21044oqhN\hmB/10#'73B)@ @ /3]29/10#52654632#"&ev. !/." .Rji\ 0/!"..NH>?]210463"fsNme_NHNH@ >?2]22310463"!463"fsIfsNme_me_; )+7!@//))55 P##/]333]223104632#"''7&732654&#"'#"&546324&#"326Z~Y[~|];-XRXy7'(:<&$:XRX-;\}~[Y~y:$&<:(&8RY~}ZY~XTX/<(89''98(?]29/310#"'#3326=WW"ee !0&2Xf fL -72D!@@P` /3]]9/3310#5.=3326=3EFfCFd'30&ffZZ \\ Z[1150051H/]210!535#j^/10#'73j/]210#5265ftRjj[H@ /2]22310#5265!#5265grgrRjkZjkZb @/]1057'%㍪3P3L\N;)@ /  P/]3]210'#"&546324&#"326=XTV28YXWw:&':8)(8R=.XTX|[Z}~Y(89'(88D^N >?10#'73NHN>?3]10!535jHP){) / /3]2104632#"&732654&#"~YY~|[[|w8((8:&&:RY~~YY~~Y(88((88P @ @ /3]q2104632#"&4632#"&P/!".0 00 0/!".b!/0 ..".0 0.- #/;'@39!@!!!- '/33333]q223104632#"&74632#"&4632#"&%4632#"&4632#"&. ".." .. ".." .r- #--# -I. ".." .0 0/!".` .. ".." .. "..".." 00".." ..".0 0.@@ /3]q29/3105!74632#"&4632#"&G8-# // #-- #--# -mm@".." .. 00 "..!@@ /3]q29/33105#5!#74632#"&4632#"&nGj-# // #-- #--# -rmmr".." .. 00 "..PB  /3104632#"&P/!".0 0!/0 ..=D  /333104632#"&74632#"&0 0/!".. !/." .".0 0." 0/!"..= #@!@!!! /333]q2104632#"&74632#"&4632#"&."".0 0. ".0 .u0 0/!".b".0 0/!".."".0 .. 00\ /]310!!H}j\/105#5!#5oHkujjuPF  ??3104632#"&P0 0/!". 00 00PF #@ @!!! /3]29/3104632#"&4632#"&4632#"&. ".." .0 0/!".0 0/!".`".." ..I 00 00H".0 0.qP  /3104632#"&P0 00 0#--# --7/310537nyL/33310!!<L\+ /]310!!H+j`//9103` wPFPF91@  CYCY:?++9333105353jP  /3104632#"&P0 00 0f 00 "--jP  /3104632#"&P/!".0 0!/0 ..6@  A @Y9 @Y:?+?+3339104>;#"!!CIN!yY:5 /10##57#5!m͠kBK@       :9?2?39933333323339999103673##>7}Ö 7.+5aiD94qTM2!#.Hl24>9E ~J}Ɖ//}Nvvif9=??93103#Hy6@  A @Y 9@Y:?+?+333910)5!4.+532yy!NJD;Y˷3A@  @Y ;@Y9?+3?+333933310467#5! ! 32654&#;'Cy3X5?w5X)B 3@    <9?3?399333393107 7363)HzCi3Xd1X=@   @Y = @Y9?+?9/+3333910 #4&#!3!VRRqL@ @Y A @Y 9@Y:?+?+9/+333393104&#!3!! )5!265R ]R 6@  9=??39/33333393310#4.3>?3,f٬c \h5 YwP}, G@  9@Y:?+3?39333333993310)5!3>?3P}MF 7f]?!!ی`%P{H?@  A ;=@Y9?+??39/33339310#!25654&#!f3ub)x^OІf' &  :@Y9?+?33910!#4&#!5! yѶ3P@BY9AY:?+?339/+933993310332>7337>73dt1M?@r{IlV Q#/d ?y=A@@Y: @Y9?+3?3+33339310#5! #4&#!+532>5𸕹C FP"!1ѸY3lmd&d& Fd&  H@ 6?933310#3`{-@ 6?329933333310#3#3`׉{{: ?@!   PY /   ?3?99//]9+9993310!#!#3 vutF5:3:^@4   PYPY PY    PY?+??99//_^]+++39339933310)!#!!!!!!#Kb? @^L:KBL'4;@R-" ;(;5&&;=<$8PY$'5PY(QY '"( ('('(   PY 0PY PY ?+3/?+?+3/_^]99//]99++?+933333399333105!"'! >323267#"'# 57>54&#"3267< uaXAfOҒoy~q cv#ÀLd]fV Cq^H-u;oP\?/bRWaYWī):&^@0#  (' PY PYPY?+?+9/_^]33+33993333333333103!23##!#!!2654&#32654&#uK!-2u)yfnqyffyb؞dF]3RRYSURRVWNF:(@  PY PY?+?+993310)! 4&+326n(ĸ-:ʵ: P@)    PY   PY PY?+?+9/_^]3+399392223103! )#%4&+3#326n(dĸ񻷷pIʵŠ: G@%   PY PY PY?+?+9/_^]+99923310)!!!!!$d:1^N$b@2  ""&%&  PY PYPY?2/+?+3/9/+9_^]993333339910"&'732654!52654&#"'!2ʧ-5`qc]Yq .KΑgy},^[ȉTXJVJF~e  mn=: @ ??933310#5#=欬 :0:.@  PY PY?2/+?+9939210 73265#5!{4_@O^'dZhrc:: <@       PY?+?99//99333310)5737!wwweep:A@% ? ??3?39]]9333310!##!67!#?4. G,:k}rs: H@,   p   ?3?399]qr993333103#467#< Ŭ:e$:VNR=N>1 &@SY SY/+/+993310 ! 4$"32654&n꽅Ak*@  SY /333/+93310".54$! '>54&whl Zj"`ri/^"D@'   $# SY SY/2+/3+99333310% $547'563 ''27"654&sbt֊0[iɅ\X݂U1Q2vdSs[QDMCW3N%,m@:& ,!,-.&PY  )PYPY #PY  PY ?+3/?+?+?+9/99+933399333104&#"'! 6!2# '! 53265!"3267[uaXz|u~#֤C^H-籱?'Cd:%E@!  &'@  #QY ?+?39/99993333339910#"&54675.5332#"326MyСxyf\!lrtnmq:ҿC VN &@   PY ?+29933104&#"#!2`0V &@   PY ?+299331032653#"!: 4@  PY  PY??+9/+9933310!#!2#!!2654&#Bβظivuj:ze`^c: I@$  QYQY ?3?+9/+399333339910 #&463!##";Xxk|63\]^]: D@"   QY  QY?+?39/3+993333399103!"&573#";P;|kxpƖ36}]^]\#:;@" ?    QY?+3?_^]]]]9310!!#!#d:I:wDX*@  /2/993333310!2>54&#!5!27#!Dkv4S*,9Op]/ *\Y>yEX"H@" !"$#"  /2/99//93333333310!2>54&#!5!27#!3#3#\kv4S*,9Op]/鸸 *\Y>y>-?Y)<@ ! %!*+) !  /2/9/3993333339910!2654&#!5!27#!5!2654&#!?xS*,9OsZbkm`/x|Vps:l{8qVpv:Y:ZS:]1^:R@)  QYPYPY?2/+?+39/+399333339910"&'732654&+5!5!ʧ-5`y06},dZkb)A+L'd@5 $$()'QYQY '!'' !!PY! PY ?+3?+399//99++9333333310#"327#"&5467532654&#"'>32;xgbT5˗š;xgbT5˗šPQ@Vt|PQ@Vt)M+D@$( !!-,(  $$PY$PY?2+??+399933910"&'7326?'.546323267#"&/-Wu8X!Z-"G]J:ù:J]G"-Z!X9sXWz:779y7?s'4"#[CCZ#"4's?7G[UUZH:@QY??+99310!#:I::N:C@+   `   QY?3?+_^]]qr993310#!#Ǵ/:I::8~6:@@!  PY/   ??339/]3+393333310!".53332653#|6lwc̛4yj :R@7 pp 0`p QY PY PY??++?+_^]qr93310!! #"'5326!h;@JmV2,+7C7#,LϜJ nE5@  Y?  ?3?39/]+33339910!#3 !&mXo/ V{!!e"\AR 6k@;  Y Y    Y Y?+??+399//_^]]++93333993310!#!!!!!#!=&UZ/6!trtug75 P@) Y YY?+?+9/_^]+9993333310#!! 4&+324+326{[VUUosha7rkO{fOBXa"X@,    #$ Y YY?+?+9/33+3399333333399103! 3##!#4+3264&+32$^[VFL{^rj6ha-jBxDm˧XOB2n (@ YY?+?+993310#!!24&+326nt؊< ɠz궿1' E@$  Y Y Y?+?+9/_^]+99333310!!!!!1%itrt  E@$  Y  Y Y?+?+9/_^]+993333105!!5!!5! i%tRr6t0C@# YY Y?+?+99//+9333310432.#"32675!5!#"04)jX5H s{)TO̻73wN\.A 3@   Y ?3?39/+99333310!#3!3 6^c@ ??9310#3V4@   Y Y?+?+9/93310"73265#5!70 R>CND TZb`GtH1[ >@     ?3?39399333339910 #33 väg]P-@Y?+?993103!-t45@     ?33?9?933331047#&'#3?3_!d  z$gGMDiRj!a.A .@   ?3?39999333310 #3&53 6lT\.A ,@    ?2?3999933331033#47.u;ZH+ (@  Y Y?+?+993310#"54324&#"326 ̻4%J@$#  &'Y  Y ?+/39/+999933333399102653#"&5467.53"32654&SbSGVa`WHR^YcseqqcrĀply{rvzcxx- 4@ YY??+9/+9933310#!#!24+!2⡍-r Q@)      Y Y?3?+9/_^]+399333339910!#!24#!!26Ǧ{l3_pf☆mUí_*F$@ Y??+39310#!5!Xntt'F%@   Y?+?3993310"&5332653ԍ|ɯxd&@   ?3?39?910#&'#3?33%ȓvPbpquiVM;#/k@:- ((01 *Y/ YY$Y?+3/+?+3/_^]9/+9933333310"&546?54&#"'6!2327#"&'#'2>=poMQQL (3,F;/y@Bi=}bAyjx~*_N:? ΄}99O LMVJ_@m<>OQ?C#/g@%) -01)Y )@ H))Y@H Y$Y?+?+3/+?+9/+9+93333331023267!"&54&#"56323>"7>54&poMQNL (3,F;*}ADi;}bAyjx~*_N5D ΄}H99O LMSM_An:>OQ?C;"=@ $#  YY?3+?+99?99333310#"&5!23473#&532654&#"/#oTTp#uuQ]h^^g\SeJ?AE3F*e8*Q-(4;@.5( #;4;-;(<=(5Y((% )Y #!)@ H))!@"H!!Y!!%%8Y%0Y Y ?+3/?+?+3/+3/+9/+99+9/+9333339933105.#"'>32>323267!"'# 57>54&#"32674g^P`k%oG7crrLRRO CQgD?Fj9 a]Vc B3 _UcRyjx~*_N6C bbRN=EAl324&#"326To#vz#oTQ]h^^g\Skq?E'"8eylJ?ʝ;"?@#$  YY?3+?+99?993333310#"&5!235'3#&532654&#"/#oTTo#zuQ]h^^g\SeJ?@E?323632#4&#" 8NN\zs&eLTaCpey8ON[kXzsFX`#NCFKkXwvF]8@   YY?+??9?+933310#"'53254&#"#'33>32)*-PBWWg{s,mS{n t h5lWzsFX`#PA; (@  YY?+?+993310!"&5!24&#"326J[jl`^fn_htƞH6@  Y Y ?+3/?3/+99333104&#"'>32#"&'732!Wb~ou{ XBk nv̿˃nLI;h &@   Y ?+29933104&#"#!2L[jl`Jh;h '@   @ Y/+2993310!"&533265^fn_htɖZ$=@  %&Y "Y?+???+9999333310!"'##/33>324&#"326<zv"lVTZk[^g\SkqG$*I?ˢ 9@  Y @Y?+?3+39333310#"5#53733#327<@UZ$R"+-]]7, [1@    Y?+3?39993331032653#'##"&5BWWgzt*nT{nnUzsLD+ f6@  Y  Y /3+3/+993333310!2654&#!5!7#!+nUzsZDMCBWWgzt*nT{n]-&J@%  %% ('& Y"Y?+3/+3?33999333331032653#/##"&'##"&5332658NN\zs+bJTa hWqdy8ON[kXzs`#S>FKCNkXwv @   ??3933910#3>304C!'C@#  )( Y $ Y?+?9/9993?+999310"&'732?'&546323267#".'3S+<4>7 EhY%4b@"4=;+R3';4DI27#2RA)Wndgwwf-aE{W.$R2#,]`+`(X@. " )*Y  %Y Y?+??+9/_^]93+99333339910#"'##463232654>54&#"ꥒ{]{es&qMtefp;6bnex ɾ`(˯e6@  Y ?3?+?93233910#'.#"'6323#g,t/."/9H9`-Fd6\By|ex'gxu`jsxxs{ba(W@- " )*Y  %Y Y/+//+9/_^]3+993333339910%#"'##463232654>54&#"륒{]zfr$v9beuoWLTIbZB먚u@'o]eodbVGMkx`r$@  /3/933993103>3#67 " .1 /r$fA*d<`#I@' %$ Y!Y @ HY/+/99//+9++9933333107!2!"&'32#.#".4&#"326<JPh%bo7B[jl`_en_s51^8Ue:aM"L@&   $# Y YY//+3/+/+33933333310#.546746324&#">MtSXdfikp:7bne `˰eMN#*l@8 *$##+,*PY** 'PY  PY PY ?+?+?399?+9/+9/933333393103267!"'#"&533265363 '.#"횔ua~3˵-e`s|ݺ^H-PIRmt4}Vj-9l@7%44    . :;#  '++1PY+ 7PY?+???+9999//9933933333333310!"&'##65&#"#>35332673#'3>324&#"326r{3'kT7Z`72zxy"Yc 60/h|i/0rrtAXhZV,8f@4 33& !!&-&:9($!! 6PY0PY?+?+99?99//9933?933333333310%#"!23'5&#"#>35332673#'#.532654&#"52z{2'kT7Z`7xyhZ6Zby0/h|i/0rrF6t*pZ+m@7*##- )  ,- ) )QY) %PY QY ??+?+?+99//993393333333333331032673#'#&#"#>3#5354632&#"3iZ`7'kT7K4-#E>m/0rrb0/h|Oz F\aN/9B@M3++&"*9//=: *DC+6PY.00<<: :),,#2%:22:%@PY????+9////3333333333?+?999333333339333310!$'##46754'33>323>32653#&%54&#"%54&#"ЏEmZ:l{8q?b_-VpvVpt: RXܽ*,9OsZbkm`$|wH 4w9 x 7yxN'3h@5-#'( '54& , ( ,##, 1PY????+9////33333399933333333310!.'##46754'33>3265354.#"9A{:,-za>yNoaT_?*\YM (.- ;&]ٽ*,9Op]$}wp=? kv4WM.;]@0/6$ =<(,,2PY,# 9PY?+?99//9933??+999333333310!"'#32673#"'#5&#"#>34'33>324&#"326rV Z`#'kT30ƽzky?{"ʼ/0rrv0/h|ǧ61fd]ZN*L@&** $,+* ' $$*SY??+?99//99339933333103&#"#>34'33>32&#"32673#"''kT/+pf$%$32&#"32673#"'#&#"#>3\;%$<|nZ`#'kT/f /0rr0/h|K7Q@)(64! 89640 0(%PY" PY?3+?3+933333993333333310#"&'732654&/.#"#67&54632.#"32673!TgU+Kʳnzt+MlAK/a!+WQTT>L%(i)5J~HMJK)7((3,<K,,`@0 ,'' ,.- #    QY@QY*PY?+?+?+99//9933993333333310%#"5'"#>3#53733#32673#"&'327*Y]&'kT)}5x3Z`:3?$D0/h|5/0rrN?1:![@0"#PY PY?+3?99//9933+393333910"'!!5&#"#>32!5!326733{38'oU5~8J*Z'w 0/h| =00rrW K,K@&& .- )PY #PYPY?2+?3/+9/99+99333333102.# 3632#"&'##6532654&#"R{diǻs. HS~vUHKKQŮiafS6;:edb ?@!  Y@ H  ?3/?3/9/++99333310!#3!31wwXxC(3MW/: ,Q@*** $ .-!PY  'PY PY ?+3?+9/9+933333331074>3.546?!5!#"."32654&M~ރ )+9%-=]k]=玏{횣8y <&)<,$6CUtexw履*3@H%%& ,& 3&54 2//*PY/%'!PY QY@ QY?+?+??+?9??+9993333333333923107&5#53733#33632#4.#"#327#"'# }5x]9E*`UC$DY]I0.}-;҃u~^T/ro4&D: 2@    PY ??9/3+393333310333###mrrmi/:WiM%,l@7*"")#.-#@))   PY &PY ??+?+9/_^]9933/22?99333333333310354'33>323#!"'###267!"!.l0 NMVlA}|  {i61fd]YQB:U@+    PY PY?3?+9/_^]33+3399333333331033!33##"&=#26=!geegwwi//{Ÿ{XX :#,k@8 '' **#!!.-)##PY  $PYPY?3+3?+9/_^]33+339933393322223103>7!5!!.'5!!3##"=#26=! ][iNwMwNg\_LJ;iQf&zy&eR$ W$0S@,%++ 21""(PY".PY PY?+?+???+999933333210!"'532=#"&'##6533>324&#"326^;I2E}?H{32zxy"wYc 6YAXhZVWB ,W@/''!.-PYPY *PY$PY?+?+99??+?+933333310%#"!23'33!"'532=#.532654&#"52z{2Y;I2E}VxyhZ6Zbywt*pW<!P@,  #"QYPYQYPY PY?+?+?+?+?+933323103!"'532=##5354632&#"3iT6E/?}_K4-#E>wz F\aVWK.<w@@)(/ 6 )>=%(PY ((3PY9PY,PY,, PY5 &  ?3]]+3/+?+?+9/99+?9333333331032=!!"&'73 5##"3234673!!"'4.#"32>+-(v;{d 3wǻs.).HS~vUH f8KQ;hiia6MedWS@,  PY   PY?+???9339?+99333339102=##33 3!"'5}'IZq;I2wma /2W-@   PY  PY?+??+9331032=#33!"'+5dW-@ w WN5c@6- +"55 &"76- PY-$)PY$1PY PY  ?3??+99?+?+?+93333333310!4&#"#4'33>323>323!"'532=#4&#"Vps:l{8qb;I2E}kVpvxS*,9OsZbkm`wxWHN&N@)$   ('"PY" PYPY?+???+9?+993333333102=#4.#"#4'33>323!"'5"}f*\Y>yZ;I2wkv4S*,9Op]WM%2W@.&-  43##)PY#0PY PY?+?+???+99939933333210!"'5326=#"'##4'33>324&#"326|;I2E=@67V0ƽzky?{"ËCQp Y61fd]ZWNI@& ! PY SYPY?+??+9?+99339333102=#4'33>32&#"3!"'5o}^+pf$%$r%f g9WK4Q@)%$$ +65+ !!(PY%! PY PY?+?3+?3+99993933232310!"'532=#"&'732654&/.54632.#";I2E}l!XbJʳnzt0^~I(3WQTT@P"(MnP~HMJK.<*%$=Ja>W%N@+  '&PYPY # #PY# PY ?+?+9///++3933331032>5!2&#"!!"'532=!#"'Y5!6;=pxyn .]!v(-.) EZcYF_;rRZ$. (y |gZSY0dQX`VVN"._@2 ##!! )0/ &PYPYSY,PY !PY ?+?+++?+99?99333333310327# 5#'5##"!23467334&#"326-v(-.)Q6{6Dxyx (w;k[6We;jVW".R@+)""#0/ PY PY  ,PY &PY?+?+99?+?+9933333310%##"!23'5!2&#"327# 32654&#"92z{2AF:;yz@*?=xyhZ6Zby((WWN$[@. $$&%$PY$$!PYPY PY?+?+?+9/+9/993333333103267327# 5#"3 '.#"uz@*?=hݺ^H-(D IWZN/s@;"--$ ($ $10+&PY+PY PY ."" PY?+3/9?3/+9/+9?+993333339933310"&54675.5463 .#"3"327327# 5ݿՖ|kѥK. pZ]coe5z@*?=cl  cFJVJWUfaTf,(<5WbN/j@7&##* *10&PY /- -- PY- PY PY?+?+3/?+3/99/+993333339910327# 732654춮&#"'!2#"'z@*?=5eoc]Yq .KҎj{c{(k,eUafTXJVJFc  m<XWN%`@1%% '&PY  "PYPY PY ?+3/?+?+9/3+39933333333104&#"'!23327# # 53267\uaX z@*?=#C^H-D(;?W|?@! SYSY PY?+?+??+933333310 5#3332753_[z@*?LW(:aɬ=WN#F@% ""%$ PY PY  PY?+3/?+3/9?+93331032654&#"'>32#"'327# `ir٧fz@*?=NlhjZG(WG!?@ #""PY PY PY ?+?+9/+33993310%327#"&=32>54632&#"<|/;@*?=<927k,1BMKέ B:'NgiW:$K@'  # #&% PY  PYPY ???+?+?+99933333310326533327# 5#.'##"&5:*\YYzA$?8M>y:Rkv4sa(,9Op]DW :%s@>   $$'&PY  QY@ H ""PY"  PY?+3?+99//_^]++3+3/99933333910732654&+5!5!#"'327# RvUsy׊vD>@*?=̃ugUgel2IK(AW!A@! #" YY?+???+999933333310>32!"&'##4'34&#"326"oTTo"{uvP]h^^fZUjJ?p@EU!]1J@.@  Y Y ?+3?3+9933103267#"&54632&#"BV |wr~bVlILmľxl 3'S@."&)($Y& Y Y`?]+?3+9/9+93333310"''7&54632&#"632'2>54#"|lM#TJCr~aW?y[8M)Tpc/874Aufxl _E=^9^0K32'Z@/   ")(    Y%Y?+?9/9+33/99933393310"&54632&'57&'374&#"326y^@JV̔?f4?Аp{(]mn_bbodݵ*P]PB5;0]OAia}}}'Q%x@D#!! '&#Y@H@ H@HY Y@?3/]+?+3/+_^]9/+++9993333339910#"&'732654&+532654&#"'>32Q| y KMMNA=?MCEuz oxRXduwz E?=DdA76E jyra}0b.E@#  YY Y ??+9/+3/+993333310##5354632'"3{ggX\96/*a\Uh\a1AD\,D@"  YY Y ?/+9/+3/+99333331033##"'526=#5{ggX\96/*\h\a1A\;m`9@  YO _ o  ?3?9/]9+99333310#"&5332653#475)oTwr{GQXf{{MD}tO}hp. @@!   Y@ H??9/+3+3?39333333310#5333#53dSSyQQyyjX9Xyyd@ ??93103dyd@ ??93103dy. 6@   Y@ H??9/+3+393333310#5333#dSSyQQjX9X%T@,  ! Y Y  Y?+?9/_^]3+3?+339333333107"&546;33#'26=#"53m|ckz]]yz;>}4,7zaYYZGbjdMJ))'.dyyWd $@  YY?++?39310327#"53'%$","{9/ r q 4@   Y @ Y?++?933331032=#33#"' "VDz<(#6hTWX@Y?+?99310!3!Sx5n[*-Q@,-$$(./&+Y& Y  Y?3?99?+?+?+9333333104&#"#4&#"#'33>323632#"'53258NN\y8NN\ys&eLSaCpd*2%,QlXwvFlX{rFX`#NCFK s i[&#M@' "" %$ #YY ??+3/+?339939333331032653##"&'##"&533265}9MN\yx&eKSa iWpdy9MN\mVzsL=EKBN~mVwv:@  !Y Y ??+?9?+9933333104'33>32#4&#"#"'5325bt,mSzo{BVWg(5"/PB`#PApT{r r i_F:@   YY?+??9?+993333310327#"54&#"#'33>32P+**BUXgzs,mR{ni t >pT{rFX`#PA_.@  ?3?39999333310'3#&'#=tr s.X@s,: K@* Y@H@ HY Y?+?+9/+++99333310!"&5!2267!"!.Jf^s_dc`[is {}\{}w7S@+   Y YY??3+3?+3/+?9333333310%.5%34&'>%D pHLKIoID!d$÷ $N/1S@*, !'0!032.)Y.$&$$$Y$Y?3/+?+3/999+99393322103254.'.54632&#"#"'327#"5bW!=xg\2znSO6APyW4sOS $+"=9v$- 6O8hmXci36(2!6T>lu*per2@  Y Y YY?++?++9333107"'532>54632&#" 1*0 $)efI#+62 q:L7y vKY"I@%  Y Y Y?+?+?3+3?99333333310#"'5326=#"5#53733#327,0%$#* UY$R",( q (9O\\8, !\@0   #" Y @ H Y ??+?39/+933+3339933333333310!33##'##"&=#5326=!WzIIt,nQ{oHHXgBG^Q?~W^GZs>nU81I@$ *!!&//23' Y*$ Y?+?399+3993333333310"&54>54&+53232654.546;#"$*$8TWC5bF?/FAE.qr.EAF/?Fb5CW>[%@   Y?+?3993310"&533253{{ݎ%W)@  Y?+?39933310#"&53324&'3{LW)%!+}ٓ)gh;]LH @    ??39339103#'# 04C< 5@  YY?+3?+3993333105!5!!<Y1>`9b`b.J@'  Y  Y YY?++?+3?+39933333310327#"=!5!5!!&!1$Y1>90q [`9ba%mT@+  !YYY ?3+33?9/++3993993332210>32+'7#5!5!%"32654&$FBRZ^h^%Z0>{BQu40&LyoXHTV:C+Ra8b`ǁ &.M@'  Y Y Y?+3?3/+9/+99333339910!#"&'732654&+5!NYyer{p8 "~‰ une< G@%Y Y Y?+?+9/_^]+99333310#"!2267!"!.=aYXbaXsUAkɺP) @  /2/2/99105375353,Ҿ_6`B%!}) @  /3299//1053%5353_!F%Nf,)/910"54>54.54>54#"'632Z!)!!)!$*$1+/ <   ] /32310#"#"&5332>;]"8``g@mB94Z]iC#Z%-%m9G(0(,Y/+10!5!7,:h:@ Y//]+10!%7!:@:Ԕl,@ Y//]+10'!5!WԀ:@ Y//]+10!'%!:@WTlb@ /332310'%77==Amzzmb@ /22322310''%7v=,=ԀmzzmoWl  /339104'33>3&#"T71$=5W>J0!ZG7t}! /910%5!r``rRV @  /93/391057'5#373窪Rr``rRr``rWR&$@ %+55WWsN&D97Դ71%+55&%%""& ˴ "%+5+5&E ''&+5&%  "%+5&E  % %' %+5&%!!"%+5&E7&&' %+5hNy'&&z& 4]+5Wb'z&Fvg22&4]+5e&'%&%+5+5V&G ##&+5e&' H%+5V&G $$&%+5e&'%+5V&G) %%&%+59e&'%+5V9&G'',%+5We&'%+5VW&G**$%+5+&( @ & %+55+55W&H'C!@0&+5/]q5+&( & %+55+55W&H'vn!@0 &+5/]q5W&(  %+5WWN&HI ! ! %+5W&(! %+5WWN&H6##/ %+5NP&('jz@  &%+5+5WN&H'z*@ &# %+5+5&)%@  & %  %+5+5<&I%@ &K%+5+5g&*I@  &!!"%+5+5VWS&J@ 00&1 12%+5+5 &+%@ &   %+5+5&K~%@ &6%+5+5 &+ k  %+5&K %+5 &+ @ & %+55+55&Kj"j@ &'%+55+55N &+zlN&Kzr &+ %+5r&K> $%+5W&, %+5|WI&L %+5M+&, 4"@& %+555+555{&&jv#@/o&+55/]q5?&.@ &   %+5+5&N(& q  %+5+5?&. A  %+5&N  Ǵ  %+5?&.´ %+5&N&ߴ %+5/&/    %+5>&O z%+5/&/' 'I  &+5&O' {N &+5/&/i %+5&O %+5W/&/d %+5W&&O %+5&0@  &O%+5+5#&Pv@ //&+}+. %+5+5&0c%@ &%+5+5#&Pc@ --&++- %+5+5&0  %+5#N&P  ++- %+5 &1%& %+5+5&QT@ & %+5+5 &1 q %+5N&Q  %+5 &1 %+5N&Q: %+5W &1 %+5WN&Q:"" %+5a+&2 #@#&##/%+55+55V&R' *@444P444& ,%+55+5/]]5a+&2  @+&++7%+555+555V&R'  ]@I4/4?4_44/4?4O4_4o44444/4?4_4o4444 44&332 ,% ,%+5+55+5/]]qr55a+&2 @ ""&##$%+55+55V&R'C.@ 0&%+55+5/]q5a+&2 $&$$#%+55+55V&R'v_.@ 0&%+55+5/]q5&3&%+5+5W&Svm@ **&&8&) %+5+5&3%&%+5+5W&Ss@ ((&&&( %+5+5h&5%& %+5+5&U@ & %+5+5h&5 fǴ %+5N&U  %+5h&5'I f@ & %+5+5tS&U' A@ & %+5+5h&5 %+5TN&Ugߴ %+5]&6%@ 11&//1%+5+59&V@ ..&,,.%+5+5]&6 D //1%+59K&V  ,,.%+5]&6 @77&0j06%+55+559&V @44&-7-3%+55+55]+&6 @ 33&55;%+55+559&V @00&228%+55+55]&6'% C@ ..&//1%+5+59&V' @ ..&,,.%+5+5.&7{%@  & %+5+5*&W% &%+5+5.&7   %+5*,&W  8%+5.&7p %+5`,&WN )%+5.W&7q %+5W,&WS )%+5W)&8%+55W:&X:@    %+55W)&8 )%+5W:&X9 $$0 %+5W)&8%+5W:&X&"" %+5)+&8 @&(%+55+55&X'c *@555P555&$$0 %+55+5/]]5)+&8 !@ &%+555+555u&X'jE@2$/$?$O$o$$?$$$$$$&##"% %+5+55+5/]]q55 M&9 a@ &%+5+5&Y&  %+5+5 M&9 @ %+5:&Y   %+5 &:A& %+5+5&ZCH&%+5+5 &:@ &K %+5+5&Zv&@ &]%+5+5 &: @& %+55+55{&Zj@&%+55+55 &:%@ & %+5+5&Z@ &%+5+5 &: _  %+5:&Z | %+5.+&;%@ &   %+5+5&[ &  %+5+5.+&; o@& %+55+55{&[j@ & %+55+55-)&<%@  &  %+5+5W&\@ & %+5+5A&=A@ &  %+5+5S&]&  %+5+5A&=   %+5S:&]   %+5A&=r   %+5S:&]  %+5&K<%+5 8&Wj @ &%+55+55s&Z@ &%+55+55Ws&\@&  %+55+55Ws&D>&>>;%+5+5&AP%&%+5+5C%Q@*#""" &'##`Y##  _Y  _Y?+??+9/9+3993333910#"'732654&+5.#"#! CwݎkE52VcP%df '{_7A.^(I%R&$ 4%+5WsN&D 2̴24%+5R+&$@  &%+5+5Ws&D4@@&77;%+5+5R+&$ @&f%+55+55Ws&&D E@==&>D>3%+55+55R+&$ @ &%+55+551s&&D E@ ??&5y5:%+55+55R+&$ @((&)=)%+55+55Wsu&D 1@II&JJ:%+55+55R+&$ @11&%%+55+55Ws&D 1@ 99&CʴC4%+55+55R&$'` C@ &%+5+5Ws&D' @ 66&772%+5+5R+&$ @&"%+55+55Ws&D 1@ 11&4̴4:%+55+55R+&$ @&"%+55+55Ws&D 1@ 11&4̴4:%+55+55R+&$ @&%+55+55Ws+&D 1@ 11&4̴4:%+55+55R+&$ @&%%2%+55+55Ws&D 1@ 11&4̴4:%+55+55R&$' v 4$@&% !%+5+5+5Ws&D' $@11&44:%>̴>@%+5+5+5&( \  %+5WN&H    %+5+&(& %+5+5W&HR@ ))& $ %+5+5&( @ &! %+5+5W&H@ #&##/ %+5+5+&( @&f %+55+55WV&&H E@&&&'q' %+55+55+&( @ & %+55+551&&H E@ ((&# %+55+55+&( @##&$)$ %+55+55Wu&H ;@22&3O3# %+55+55+&( @ ,,&  %+55+55W&H 1"&,, %+55+55&('w \$@& % %+5+5+5W&H'  &+5Q+&,:^@N& % 0@9@P`p@P @P`p]qr^]^]+5+5  & 2D@6& %Opqr]qr+5+5|&, %+5=&L z  %+5a&2 %+5VN&R %+5a+&28@ **&! !%%+5+5V &RG&&&!%+5+5a+&2 @''&(d(%+55+55VJ&&R 9@##&$c$%+55+55a+&2 @ ''&"%+55+55%&&R 9@ %%& %+55+55a+&2 @22&3;3$%+55+55Vu&R 1@//&0C0 %+55+55a+&2 @;;&##/%+55+55V&R 1@ &))%+55+55a&2' $@ &""%&&'%+5+5+5V&R' $@&%""#%+5+5+5a&b9++&'δ'*%+5+5V&cve&&&"մ"%%+5+5a&b++&(c(+%+5+5V&cC&&&#;#&%+5+5a+&b855&,,0%+5+5V &cG00&''+%+5+5a&b /&//;%+5+5V&c*&**6%+5+5a&b '')%+5VN&c ""$%+5)&8 n%+5:&X ٴ %+5)+&8##&%+5+5 &XG**&!!% %+5+5&q$$& #%+5+5&rv++&'մ'*%%+5+5&qZ$$&! !$%+5+5&rC++&((+%%+5+5+&q..&%]%)%+5+5 &rG55&,f,0%%+5+5&q (&(i(4%+5+5&r/&/o/;%%+5+5&q j D "%+5:&r 'F')%%+5-)&<" & %+5+5W&\Ci& %+5+5-)&< B  %+5W:&\ -)+&<@ &%+5+5W &\@ &&&! %+5+5-)&< h@ & %+5+5W&\@  &  , %+5+5Ve0&cd,&,״,(%+5+5Ve0&cd--&1´1,%+5+5Ve0&cd2&2˴2(%+55+55Ve0&cd@ 33&77(%+55+55Ve0&cd@2&2 2)%+55+55Ve0&cd@33&7 7)%+55+55Ve,&cF@ EE&0ʴ0=%+55+55Ve"&c<@ FF&0ʴ0=%+55+55R&$?5R&$̓?5*~'$, ?55*~'$, ?55*~'$, ?55*~'$, ?55?~'$,P 4?55?~'$,P 4?55Fj0&gd@ ,&,,( %+5+5Fj0&gd@ --&1 1, %+5+5Fj0&gdd2&2ش2( %+55+55Fj0&gdd@ 33&7ش7( %+55+55Fj0&gd@2&22) %+55+55Fj0&gd@33&77) %+55+55'( ?5'( ?5V'(X ?55V'(X ?55V'(X  ?55V'(X  ?55jX0&id@ & %+5+5jX0&id@  &$$ %+5+5jX0&id%&%% %+55+55jX0&id@ &&&** %+55+55jX0&i6d@%&%[% %+55+55jX0&i d@&&&*/* %+55+55jX"&i<@88&# #0 %+55+55jX"&i<@99&##0 %+55+55'+ ?5'+ ?5x'+X ?55*x'+X ?55x'+X  ?55x'+X  ?55x'+X /?55x'+X /?550&kd&  %+5+50&k̝d& %+5+50&kd&ʴ  %+55+550&kd@ &ʴ  %+55+55Q0&kd@&  %+55+55Q0&kd@&  %+55+55YJ&kd@ ((&  %+55+55YJ&kd@ ))&  %+55+55D',?5D',?5',X  ?55',X  ?55',X ?55',X ?55',X '?55',X '?55V0&Rd&%+5+5V0&Rd&!!%+5+5V0&Rd"&"۴"%+55+55V0&Rd@ ##&'۴'%+55+55V0&Rd@"&"/"%+55+55V0&Rd@##&'/'%+55+55;&2d?5;&2d%?5'2 +?55'2 +?55g'2 +?55g'2 +?550&wd&%+5+50&wd& %+5+50&wd!&!Ӵ!%+55+550&wd@ ""&&Ӵ&%+55+550&w,d@!&!;!%+55+550&w,d@""&&;&%+55+55"&w<@ 44&,%+55+55"&w<@ 55&,%+55+55U'<,?5'<X ?55'< ?55'<X "?55S0&{d0&00,%+5+5S0&{d11&550%+5+5S0&{d6&66,%+55+55S0&{d@ 77&;;,%+55+55S0&{d@6&6&6-%+55+55S0&{d@77&;&;-%+55+55SJ&{d@ II&44A%+55+55SJ&{d@ JJ&44A%+55+55&[d.?5&[d.?5'[ 4?55'[ 4?553'[ 4?553'[ 4?553'[ G?553'[ G?55Ve&c,,&)),%+5+5Ve&c9,,&((+%+5+5Fj&g1,,&)), %+5+5Fj&g9@ ,,&("(+ %+5+5jX&i&д %+5+5jX&i9#@ &N %+5+5&kE&  %+5+5&k9@ &  %+5+5V&R&%+5+5V&R9 @ &(%+5+5&w&%+5+5&w9@ &%+5+5S&{o00&--0%+5+5S&{9@ 00&,K,/%+5+5VWe0&c'd,&,״,(%+5+5VWe0&c'd--&1´1,%+5+5VWe0&c'd2&2˴2(%+55+55VWe0&c'd@ 33&77(%+55+55VWe0&c'd@2&2 2)%+55+55VWe0&c'd@33&7 7)%+55+55VWe"&c'<@ EE&0ʴ0=%+55+55VWe"&c'<@ FF&0ʴ0=%+55+55WR&$&?5WR&$&̝?5*W~'$,& ?55*W~'$,& ?55*W~'$,& ?55*W~'$,& ?55?W~'$,&P 4?55?W~'$,&P 4?55jW0&i'd@ & %+5+5jW0&i'd@  &$$ %+5+5jW0&i'd%&%% %+55+55jW0&i'd@ &&&** %+55+55jW0&i'6d@%&%[% %+55+55jW0&i'6d@&&&*/* %+55+55jWJ&i'd@88&# #0 %+55+55jWJ&i'd@99&##0 %+55+55W'+' ?5W'+' ?5Wx'+X&< ?55Wx'+X&< ?55Wx'+X&<  ?55Wx'+X&<  ?55Wx'+X&< %?55Wx'+X&< %?55SW0&{'d 0&00,%+5+5SW0&{'d 0&00,%+5+5SW0&{'d 6&66,%+55+55SW0&{'d @ 77&;;,%+55+55SW0&{'d @6&6&6-%+55+55SW0&{'d @77&;&;-%+55+55SW"&{'< @ II&44A%+55+55SW"&{'< @ JJ&44A%+55+55W&[d'`.?5W&[d'`.?5W'[& 4?55W'[& 4?55W3'[& 4?55W3'[& 4?55W3'[& G?55W3'[& G?55Ve&c''&**0%+5+5VeS&c((&)Ĵ)*%+5+5VWe&c&~,,&)),%+5+5VWeN&c22-%+5VWe&c'9,,&((+%+5+5Ve&c0&0Ĵ0<%+5+5VWe&c'0&0Ĵ0<%+5+5R&$ v@ &%+5+5R&$hI@ &%+5+5R&$i?5R&$9?5WR&$ .%+5 @  /9/933910#>5#5--.WMWn53L#W @   ?999310327#"=3!,&!p  @  /9/933910#>5#5--.WMWn53L#$@  /2299333310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx:@ ! /322/329999399332105353".#"#>323273&LFA30S ]N(LF@[S *Hĸ "("84r"("l_^6jW&i'& %+5+5jWN&ijW&i'9#& %+5+5jX&i@ #&##/ %+5+5jW&i'@ #&##/ %+5+5"*'(,Wr%+5?5B*'(,9u?5"L'+,W?5BL'+,9u?5W &+ * %+5*n2@    /3/2/9/99333910#53!#>5#5nr--.W MWn53L#*x2@    /3/2/9/993393103#5#>5#5rT--.W  MWn53L#{#N@'!##$%% $! @ H ##/]2/3/33/+33/93333933910".#"#>3232673#>5#5*TNG76 [ /R?,UPG62\c--.W$49ac9%58n,MWn53L#0&k & ش  %+5+5S&k & ״  %+5+5&k&j&F@3/Oo?@P`p& %+555+55/]]q_]5&k&j9F@3/Oo?@P`p& %+555+55/]]q_]5wD&k&Ӵ %+5+5,&k!@ &ܴ& %+555+555dP&,j& %+5+5 1&,N@ &%+5+5 ',,U?5W',,9?5*n0@   /3/2/9/9939310#53!##.=nrW.-- #L36nVM*x0@   /3/2/9/99393103#5##.=rXW.--  #L36nVM{#)@ @ H ##/]2/3/33/+33/10".#"#>3232673##.=*TNG76 [ /R?,UPG62\cW.--$49ac9%58n,#L36nVM&w&ݴ%+5+5S&w&%+5+5&w'j\F@3!!/!O!o!!?!!!@!P!`!p!!!&%+555+55/]]q_]5&w'j9F@3!!/!O!o!!?!!!@!P!`!p!!!&%+555+55/]]q_]5W;0&sd$&$$ %+5+5W;0&sd%%&))$ %+5+5&w&+%+5+5&w@&''2%+555+555-)&< r & %+5+5-)&<lI@  &  %+5+5K'< ?5z'<9 ?5'3?5 *@   /339/333333310#53#53#53uк   *@   /339/333333310#53%3#5#53u<кY /991053E %!SW&{'o SWO&{ 6+61%+5SW&{'9 @ +&+7+.%+5+5S&{4&44@%+5+5SW&{' 4&44@%+5+5\&2,?5;'92d?5\&[,?5/'9b[d?5WW&[ /+/* %+5D/991053 "@  /9/933910##.=W.--̥#L36nVM* /2/10#*T "@   /?933910#'7'77'*T7777Y7887 @  /?9/3310'7##!'77RJ77}m}8L( @   /?9/33]10##'7!(R77J}78}rLrL1@"Y?O/?o@&+H/+]q+99105!rÉL1@"Y?O/?o@&+H/+]q+99105!ÉL1@"Y?O/?o@&+H/+]q+33105!ÉN&BB1@% ?O_o/]]q5/]q5H #@  [[?++933310546733%+y_YaC}H #@ [[?++933310#65#53H&({^Xi@|H "@ [[/++933310%#65#53H&({^X3jA~~G #@ [ Y ?++993310##.=AX^{(&|@gK_ J@&     [  []]?3+3/+39933333310546733!546733$*z^X%+y_Y_C~ÒaC}K_ J@&    [  []]?3+3/+39933333310#65#53#65#53_"-y^X&({^X]I~Ñi@~K_ J@%   [[]]/3+3/+3/9333333310%#65#53#65#53_#,y^X&({^X3_G~ÐjA~HF&v 7@  Y YYY/?++++9333333310#53%s`arxsa@<   Y[ Y [Y[Y[?++++/++++93333333331053%%%%#5hihixxGQ| @ 0  /]]]9910#"&54632|vqptqss .@    [/33+33933310!53!53!53( //310#!*SmOM) /3/105!#MSO/?9/310###!T @  /?39/3310###!!!TuO @   ?3/9/3310!!5!###uTON7'3?K@.%%[(( F=7=[@7 [ 7 ML4CY:4[:IY:+Y"["1Y" Y [YyMiM]MIM9M+MMMMMMM{MfMIM6MM MiMMMMMyMkMIM;MM MMMMMMMyMkM[M9M+MMMMMMMyMkM9M&M M8MMMMMM@RYMFM)MMMMMMMM{MdMKM?MMMMMMMMpM_M@MMM^]]]]]]]_]]]qqqqqqq_qqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]qqqqqqq???+++?+++?+++993+33+3939933+310!#3%2#"&5464&#"3262#"&5464&#"3262#"&5464&#"3260.COTFIOKI.COTFIOKI.COTFIOKI xwy|׷xwy|귲xwy|UzY@ ?9933103U@ĞzUz&V `]5z'O&dzXQ%@ [/o/]+9310%53 PQm?sYR%@ [/o/]+9310%#5 53RQot?G&@ //]55]55T/3310!5!+u`b??3310!#3q~ H@&   Y Y YY?+?+99//++9333333310353535353[Y@   ?33/9/3103#5!#3###TOON @  ?3/9/3310!!!##:QTN/?9310#!*T&n/?9/310##*TG "@   /?39333310#'77'*TT~~~ݵqqp @    ?3/9/3103#5!3###TON3 N@.Y_o ??39/]q33+3993333310#5!533!'jo=岲o-q(_h5(|t@C  YDTd5  Y Y?+?+9/99_^]_]]+993333333_^]_]10#"&'732654&#"#!!>32|w S@GVQK[CF@;АLFSLKHvuQr lIbwvdIl meb@    Y @# H K[@H@H/?/_]]]++]3/+]2+399333104&#"#'33>326FHUw#cJnaZFd^oA:lyO=g ~c6ji;irxs1N6ijgl@>   `Y`Y O   `Y`Y?+?3+99//_^]3+3+933333310&#"!!!!!!&432-_U|$ĸՊhy"(.x@<# " /0"@%,._Y)  @ +_Y ?33+23/99?+333/9299333993333332107&5%7373&'$+#7&'&'0=L0!"UH*9G?W SF*}EV@Uqa8B{tvY32&#"$#"$5!2.+pf$%$=#535#5354632.#"!!!!!27PFYVē"oGrphh\M7.yym9@Ks}w)8#@.c@5. ++,##"", /0'PY@- PY+# ?33??+9?+9333333333331054&#"#4'33>323632#4&#"#5}Vps:l{ߞ{*Vp-$oxS*,9OsZbk/x ;#&)@K)(' %$$! & *+%_Y  # _Y'&)(((?3?39///99333+333333+333993333393332223333231033!33#3##!##535#!5!!'##3'󬎎?\oo`"owqq++՛~)g 'N@&CBB( <""/..H<< 44((POH@H4HH4?++2PY/+%PY_Y?FPY9CCC/C C??!PY?@ H_Y@P0P PPPPPPPPPpP`PPPPPPPP0P PPP;PPPPPPPpP`PPP@PPPoP0P PPP^]]]]]]]qqqqqrrrrrr^]]]]]]]]]qqqqqqqqqrrrrr??+99//_^]+]3/3+33/3_^]_]++?+?3+99++99393333333993333310+#!2!#3 #"&5#53733#327%#"&'73254.'.54632.#"+iq@{LQi]ho5n)7=跪cX$Gmh8 VFWrl<L{zŃbNIbxnx=:i* ;W>pwit04U&7<] &5VQ|#'+.14@A.2165+'#_Y40, _Y($ 21.  ?3?3399//9993333+33333333+3333993333339103#3!#!#!53'#533!3!337!37!!'###3 mBBmslpok>@!>CGG/]**֛qq. ]@  !A9: @Y9@Y:?+?+??9/9/33339933102#54.#!#3!2>53#Y1rpToq0[jG5GRh~)-g@-$$,-,./' @ H !@ H*P--?/]3+2299//]+99333399333333310# 46323'5#53533##&5%32654&#"!!#lV╌Vi#xx~\\xPbo]\obQ27I?{?E6\gg\Pd8a]V+@i '')$$  ,-"QY) QY&    @'/H   @_ sYsY?3+?3+9/_^]qr3^]+q2+3+39933333333339310%267#"#73'7#73632.#"!!!!dxۮ(x( ۯyj(c(l~d[NV[d>(&õ?R@)    _Y ?3?39/933+3399333333339103333!!####j=D#-TTsq.M@(     _Y   ??9+3933333333310%%#5%55%!5!GGGG]@ǜ)is:FU_@S[*VM#133'7S;AS '#V`a'G3GaYMV#  XaY>`Y  03@-3**3^aY O`YD`Y?+?+?+?3/399//+9+9+393333333310#"'#>7>32".'#"&546327756%7674&#"32632654&#"32lV8&2 q$~4Dcn>&JX]dQ&V ;[~B2&O0LNyUHL\XGI],H=4F2wvg@I+=9-p6M=9&ĕQ?7ENSQFXnt2$A\)YXLs߸aqt^atxJyy_*{*)11-W!-M@*"+(/.++%`Y `Y/+?3?+99339393210#"'532654' #546324&#">HPSE>@z&~>30@5)7L\N@~"<73B[D쐀r5FC8N~A %*@f'##  &%  ,+%`Y$   @&0%@%P%0 @ P /   %  % *_Y ??+9///_^]]]]33]2233]22+9933333333933333333103##!##535#535!23#'!!627!!&#!Z}3bQ1wY@NtR8ub~{,,bddcg,#%i@8 "'&""_Y_Y@ _Y #_Y?+?3/+?39/9++3933333333310%53.'>75#5!#5$gQ6|K5pIdݯ|Hv 6jl NDf| BnW"p@;    #$_Y _Y  ??99//933+3333+33?9933333393310!3!!3##!##537)!3&/پ}[檥á~ƨ\]WE !&ddvDSne5@C.55 4/*#$$* 76##,',/_Y  _Y4' ' `Y' `Y ?+/+99//3+39/+339/933339233310!3267!"$547#53>?!5!654&#"'>323#!YDY?u'E zo( (pG(Dy~%/)?\1+Ap~xm!--/G*"h,y ^@0  ! _Y @_Y@_Y?+3/3+?33/+39333333310$%53.'$#F |+R|\?>y\Bu}fov7<",! Aa`_: 6@  PYPY??+9/+99339103!5!!5!K$:Ƌ?P{&{'u?5"&t'u#?5PN&{'3@!/o  @ ` p /A)?555]]]5]555=N''u"3@!/o@`p/\?555]]]5]555]N''(3@!/o@`p/T?555]]]5]555N''f+@/o/B?555]]]5]555;Nb@A  PY p`p o  PY ?+3/_^]?3/^]q+99333104&#"'>32#"&'7326ir٧`"jZẜ lhd^D $@     /3299339910#&'5673!9>HH>9)CI$ICV $@  /299/9333105673&'#CI$ICV9>HH>9#d^D $@     /3299339910&'3#67!59>HH>9#CI$ICV "@    /299933310%67#&'53+CI$ICV9>HH>9d^D<@     /2333993399339910#&'5673!&'3#679>HH>99>HH>9)CI$ICCI$IC6@   /299/299933333105673&'67#&'5CI$ICCI$IC9>HH>99>HH>9H>@   /299/2999333333310!!5673&'67#&'5 CI$ICCI$IChPX9>HH>99>HH>98*Y@3$,+PY QY /o 'PY/,]?+/_^]q9/3++3993333910 #"&54632374&#"7632.#"326Hք~T 5{.$qpmEQWZRN_˴>cTu(#>Xss @| _Y H  /p ?:`@_pP ]]]]]]]]qqrrrrrrr^]]]qqqqqqqrrr?2^]+?+333993933103!7%.' #3 + ^J ojN"@ _Y/2?+993310!#!No3N0 E@$   _Y _Y ]/+9?99+993333105 5!! !{BHNm0,je`H@ Y?+99105!e``b~#@Y@&H/+]+9310533bT@l Y   p P 0  o 0   O /  9       p   o O / ]]]]]qqqqqrrr^]]]]qqqqrrrrr/3?9/^]+9933933210##5!3njuNW]!-R@1"( /.%%++"?@HP/]3]+q29]2]29939210#"#"&54632>32%"32654&.#"326]˄DXɀAaFw83wMSmm33wNTihWFxNӰ傓S~qkop~`@ //993103!!^j8^@   ?2/9933104>32#4&#"tтwgĠN@ PY @   PYtfTD6&I9) gv) {k[K;) {k[I9) 7{m_@0 p@'`Pp`/^]]]]]]]]]qqqqq_qqqqqqqrrrrrr_rrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrr^]]]]]]qqqqqqqq/+/_^]+933310"'53254632&#"$O7<9W,1BSYNwrB8P,,@ *-.'Y#T"@  //999310#4632#"'&'&#"~?K3% &!$ V?0(4 *''#i@  //9993103#"&546323265";N2$! =/'5)%3%Y?+33105! %iH[??+3103#ؑHK&[Y?+?3+310!!#(in&[Y?+?3+3105!# (%%H$[Y??+3+3103!!Hn%H&[Y?+?3+3105!3 %H-[ Y??+?3+33103!!#iHnnH,@ [Y?+??3+33105!3# %K/ @ [Y?+3?3+33105!!# i%n%H/ @ [Y?+3?3+33105!3! %nH ;@   @ [   Y?3+3??3+3333105!3!!# i%nnqj.@  YY?+?+3333105!5! AّH([[?2?3+3+3103#3#ّhHK Kj < @ [ YY?+?+?33+3310!!!!#(iijב" 8 [ [  Y ?3?+33+3+310!###בnn#j D  [ [  Y Y?+?3?+33+3+310!!#!!#htjo"j :  @ [ Y Y?+?+?33+33105!5!5!# i(qב) : [ @ [ Y?+3?33+3+3105!### ܑב%nj D  [ [ Y Y?+?3?+33+3+310#!5#!5!ґttj)F)ޑqH 9 [  YY??+?+33+33103!!!!iH"ב%H 5 [ [ Y?3?3+3+3+3103!!33A$Hn#nqH D [ [   YY?2?+?+33+3+3103!!3!!ّK$hH"qH :  @ [ Y Y?+?+?33+33105!5!5!3 iqב)%H : [ @ [ Y?+3?33+3+310!5!333$ב%nqH D [ [  Y Y?+?3?+33+3+310!5!3!3!5!$KqFH A @ [  YY??+?+?33+333103!!!!#iiH"ב"H ? [ @ [  Y?+?3?33+33+3103!!#3#AHnn KH P   [[ Y @ Y  ?3?3?+?+33+3+33310#3!!#3!!jt " "H ?  @ [ Y Y?+?+??33+333105!5!5!3# iqבKH = [ @ [ Y?+?3?33+33+3105!3#3# 㑑h%K#KH O  [[  Y Y ?3?+?3?+33+3+333103#3!5!#!5!A㑑tHK )ޑj B   [ @ Y Y?+3??+33+333105!!#5! iiq"h @  [ @ [  Y?+33?33+3+33105!!### ב%nnj S @ [[ Y Y ?3?3+3?+33+333+310#!5!3!!#!5jtttAޑ"בqH B  [ @ Y Y?+3??+33+333105!3!5! Aّ"%H @  [ @ [  Y?+33?33+3+33105!333! ב%nnqH R   [[ Y  Y ?3?3+3?+33+3+333103!!3!5!5!AH"oHZ@  @ [ Y Y ?3+3?3+3??33+3333333105!5!5!3!!!!# iiiqב"ב"HV@    [@ [    Y ?3?33+33?33+333+3333103!!###!5!33AבHnnnnH m  @ [  @ [@ Y Y ?3?3+3?3?3+333+33333+333103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??3910!!* H??3910!!* *g #'+/37;?CGKOSW[_cgkosw{3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#%3#%3#3#3#3#3#3#3#ghhhhgghhhhhhgg`hhbhh hhahhahhhhhhgghhahhahhhhhhgghhhhhhgg`hhbhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhh"bbbbba```````````c```````````c``````aaaaab^^^^^baaaaa``````bbbbb#`````b``aa`T #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKO3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#%3#73#73#73#%3#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#'3#'3#'3#'3#'3#3#73#73#73#73#73#3#73#73#73#73#73#3#73#73#73#73#73#3#3#3#3#3#3#3#3#3#3#3#3#ghhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggggghhhhggZhhhhhhhhhhhhgggghhhhgggghhhhhhhhhhhhggggggghhhhggghhhhhhhhhhhhggggggghhhhgggggggghhhhggZhhhhhhhhhhhhhhgggghhgggghhgggghhgggghhgggggghh"bbbbbbbbbbba```````````````````````c```````````````````````c````````````aaaaaaaaaaab^^^^^^^^^^^baaaaaaaaaaa````````````bbbbbbbbbbb#```````````ba```c```c``ab^ba``b#`CIMQUY]aeimquy}  !%)-159=AEIMQ!35#35#35#35#35#353353353353353353353#3#3#3#3#3#335335335335#3'#3'#3'#335335335335#373533533535!355#%355##5##5##5#353353353355##5##5##5#35335335335#3'#3'#3'#3#3'#3'#3'#335335#3'#335335#3735355#5##5#353355##5#35335#3'#3#3'#3+jjjjjjjjjjjkjkjkkkkkjkjkkkkkkkkkkkkkkjkjkkkkkkkkjjjjkjkjkkkjjkjkkkkk?kkkkkkkkjkjkkjkjkkkkkkkkjkjkkjkjkkkkkkkkjjjjkkkkkkkkkjkjjjjjkjkkjjkjVkkjkjkkjkjjkjkkjkjjjjjkkkkk"a"a#`!b!b!`````````````b```^`j````````bbbbbbba``````````````````````````aaaaaaaab^^^^^^^^aaaaaaaa`````````bbbbbbb"bbbbbbb````bbba`````````````aaaab^^^^aaaa`````bbb"bbb{uZT//9910!!{!T!@  //993310!!!7L17}1mi{@ P/]/9910!!imi{*@ P/]/q993310!!!iLPbh?9910!!hL@ ?910! XVRZ?9910 7L@ ?910 LRZ?9910Z79e 1@  /3?39933933310!# 3 #R7Rb`15>.)@  ! /9933104>32#".732>54.#"xyzyy{zxVbcbdbbabdzyyyyxxzba`bbbbbV_R'/7?GOW_gow#"5432'#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432#"5432%#"5432#"5432'#"5432488448847575$4884766667557R75576666488448844866$48846666\666675576666666,557775666775Z557w557639D557448775666775557848*557# @  /]99102#"54>jnrotjlw)@ //9933103!32>54.#")vwvvvwvu}Avvvuvvw)#*@ %$ //993333103!4>32#".'32>54.#")QbaabbaabMvwvvvwvu}Aabbaabbavvvuvvwscu (@@   //]]993310#".546324&#"326caDpDegGJLfFFfbJM_}kArEgJGgFffFGeiy $0:p@? :6+%%<;("."51h1Y1G11138"_"o"8@ H"8"8  /]99//+^]3]]]]332993993333210"'4! 4'"2#"&54632#"&54632327#"'ybbZڗ20[. -- ., // ,LL>bbHfj24V .. -- .. --# #-d@9$ (./!)-h-Y-K-=--+&_oO&_&&& /99//]^]3]]]]3329999333310"'4! 4&#"326%4&#"326327'#"'bb. -- ., // ,bb>LLHfjz -- .. -- ..ܺ#Fs;*7~@C5  **.&"## 98+** !"1%*"*""*'o/]33/]339///999933/393333333333310373#'#5&''7&'#5367'767"327654&BBc<-VK1$J>5Byd+N P(nqÉ`c;'--qt>}`+*I-d}>_1M =ƈaaP&'\@3$  )(  /   @@%(H/+/]99//]q2329333333310.54632!!#!5!"327654.LkDrvSVjJ#8\9{RW;=9]B LzK~VSzm FF5_9Vy>=T:_4Q,8>@!0,'6!'!9:,*3$$$-  **/^]]]9999339210&'&54763327632".'#"&54632"32654&+!D;X)$  %$ TttzGSY|~WYz|++   =#"&5467> `FWcO|WZYYc`~G`^ %%a\YRw<48@4((56$+/     //99//]92393310)7>5'#".54672&'&5463267632#".'Fw_59YMF]>d& qtET'iDIt8v_=1mr#6xL/xvL~Ms3A(%&ykVb(NLtt1Ri~x5fZy@    //399310./.54632>32b[ZK6eW&"XaXoV{dBkrxwubVB @   //9/3933310&&'6H zDS%Ut}FiGfY;.@  //9/939333103#654&'#"&54632Lm^/9r@k9:}N,.dyxx {6.Mt \@ "! H@ H  /3/]/3339/++3339333310#"&54632#"&5462%%56{I99zN0*ډs9:|O--&DNqT6/Qovu5-Lxgu28h@7  !     ?/9////////////3993993333333333210##57573%377```L`Y=>YYYYG\YY Y /w@G  `Y`Y@H@ /O_  _Y?+?9/_^]3]+2+3+3933333333103#535#533!!!!!||䅔`@7  PYPY@H / ??9/]3]+2+3+39333333333103#535#5333#3#nnnnnnnn "ޅ@G@%   @ H _Y?+?9/+233/393333103'"#>3332673#"'!#'kT&Z`!0/h|Bv/0rr*L@(   _Y`Y _Y?+?99//3+3+9333333103!2#!##%)!!! Qb\@rMمWh P@) "!_Y_Y _Y ?+?+9/+39339922310!!327#"&5!24&#!!26I/4<2F>;͗IJQLվ{PXs)06;@P7#..43 )1=<3*'*PY40:0QY#'::)@' QY 9  PY_ /  ?3/]q3+3?+?39/93+3+39933333333933310&54673&#"'!23327#"&'#+>=4'7P0Myn .dQr*;!DGd[E aU@{l M[XBꨴRZ$,^.PQpip|gl_QYg/wn@I(zXT`@2   PYQY @QY?+?+?+9?99333333333310#537333327#"'#"}5xIJ3?$DY]h6GXЃp0N?80HhG@$  _Y  _Y?+??39/+9933333310!#!#3!33#sThcH@$    QY PY?+?+93??9933333310>323##4.#"#3=:}u*`Ujcro4~= hAR@(      _Y?+??399339933333339910 3###33>͸>hQ@(      QY????+99339933333993310#33 3##„Iga/ma /Ah :@   _Y  _Y?+3?+3933310#!5!5!!OZhV1h: ;@  PYPY ?+3?+399333331035!5!!#18j&a5:@  _Y _Y??+?+?999933310!5# !273%27&#"vrJàvs G[UR}M8gdN0@ SY ??9?3/+39933310!#3?>32.#"ew 8:*zh`j);$*2:@(5Љ}d<':D $7@%& _Y?2+???9?393102&#"#.'#363767>bqBI2<- 5a-&?8 9#kc9E52ongו#CzN"8@ #$ #SY ????9?3+333910!#'#37367>32.#"ѭ4/Ѳ "#.C\TJz5j?+,6#J:'!ĊBXh.FUd-6>@-E#R@+  %$QY !PY ??+?9/93+3933933310 #'67&54632?654&#"lj3F)&l\qcnU$:"i"/:#$rHfxcY4155-U;M"+'a'@ _Y??9/+993310!#3!as):'@ QY??9/+993310!!#B:6:UR9@   PY PY?+3?3?+9333310! 4746324&#">|WP5* ڸ AAj$@ //99//9933105%5%j))J@/9/10533U{s/2/9/10 '53WmdVm_/39/10!5!%53$_ya_ /310!53!}hv @  /9/39310!#!53h[c Uhv @  /9/39310 #5!3!h]U"@ //9/993310#353Si8٘$@ //39/933310#3#58i4, @  //9933310#3#58i4,i8  /32210##5##!8}}Oc8c /23310)335338h}}cWt@ /^]9103#'⪕W㾾~:@  /3/39333105353k^dj@  /3/39933105!5!dH֔dY?9310#535Q3ndP?9310#535Q3evV@, SY PY PY?3?3+3?+?+?9933333333310##5354632&#"3533iK4-#E>ӆIz F\ai:wH@$  PY PY?3?3+3?+?99333333310##5354632&#"33iK4-#E>ӇIz F\aI4&f&  J  ??3]210#"&533265JZNM[㑬M]`J<d& '  #)BB)7oP F  '=Z'h,@  AY7?+3999310!5!3!'3T3F&- $%+53F&3F&'P*@_****{*T**$%+5]]]]5]53F&'@_{T]]]]5]5B&B&B&9`#0##]]5R& ]5?-&LO$/$$]]5)7& ]5o& ]5f& ]5y& ]5& $$]5Ff&  @/]]]]]5'&    ]5P&  ]5F& @ ]5]57&@ 0"""d""]5]]5Hy& ]53& ""]5X&5q&- &H@ /$]]5]5{H&Td0]]5'& ]53&@_{T]]]]5]5=& ]5fF& R+&P+& q+&BPJ@ A : 996??3?/?93333393310#33673#VÖ 32`F[q> ܺw).2}5  /31032673#"&'aEmzNX*4Cfq5" !%)/AOW_jv@ qe*`kU]]FMJPBX?::<3XPFk*e + x"..+''+&&#++w( ..+nhhG5#53H,(u-1XWk/0V. %@  Y/+2323310 33273T @|E ,@ YP`?]q+993310#65#53E,(u^XWu/dZK 7@"   Y_oP  ?   /]q]q+99331046733#,(u^X%Wu/dZj&@/?_/]]9910%53H&@/?_/]]9910573H 4@  /?_/]3]99993310#'##573ih 0@ /?_/]]9993310#'53373hi-Z$@ Y/3+399331053!53ӥI@*  Y    /   @Y/2+_^]]q+3333310".#"#>323273*TNG76 [ 0Q?,TNEd\d%-%>9fi=%-%wx  -@  /?_/]2]29105733573  &@  /]2323310"&'3326734um[[kuo5<=4rjCjCjCHvHvHv+ /99104&#"'632#5>3*HFZjQ[pE0"c;U 2x+ /99104&#"'632#5>3*HFZjQ[pE0"c;U 2xX + /99104&#"'632#5>b3*HFZjQ[pE0"c;U 2xwu/1053ɬHvHvjCjC++u ?u |u u Zu m!u ^8u u~u u z.u kfu WRu #u :u +<&@ ??931033&++ %@  @ H o/r2232/+]31053!53%!5!%++ U@  k@!H0@Pp/]]]q+q_qr/r3/99//3103#553!53>+ ָ3+ [@   k  @!H0@Pp/]]]q+q_qr2//r399//39103#'5353!53ћ+ a޸++ S@  k  @!H0@Pp/]]]q+q_qr/r399//310#%5353!53h~ }+'@_@ HP/q22/+]q310537!5!W%?+7@$ 0@ o@H/+]3q/339/q3310!5!"'&#"#>3232673%3TU$--[ +L?7SS"0+\ *K&%#(RH(%&&%QJ' '@ ??39/?993310!#!5!3e*\* '@ ??39/?993310!#!5!3e*$E '@ ??39/?993310!#!5!3o ZZ#@ ??39/?99310!#!5!3o DM%@ ??9/3?399310!# 7 3f\>Ha4R '@ ??9/3?993310!#!7!3bG4oaRM'@ ??9/3?993310!#73_J^rM '@ ??9/3?993310!#5 73fS܈kh/iF$@ ??3/9/99310!# 73pZzfjFp'@ ??9/3?993310!#73p^ZHd(5%@ ??9/3?399310!# 7 3RkGHyN!5 1@ ??9/933?993310!# 7 3Rka.K- O &@ ??39/3993310!#!7!3xtdH^- &@ ??39/3993310!# 73`vcFFH @??39/99310!#73wp=Dg-p&@ ??39/3993310!#73pEsHVH!$%@ ??9/3?399310!# 7 3=|GHY2#% 0@ ??39/933993310!# 7 534~X4(5f% 0@ ??39/933993310!# 7 3C{sVH2}q' &@ ??39/3993310!#!7!3cy Q2X/@  ?3?399310!# 73HԈG7%p&@ ??39/3993310!#573p={H\2#"@ ?3?39999310!# 7 36}MH)Q0) *@ ?3?399//993310!# 7 530~YAuO/l6 *@ ?3?399//993310!# 7 3ON,qS-m6 *@ ?3?399//993310!# 7%3O~t8S-{0@ ??39310)733+NS.)p @??39/99310!#73pA>S.)O"@ ??39/9310!#!'!ataoL 0@ ??3399//393310!# ' 3[H5fy4L .@ ??3399//393310!# ' 3UH)hy?L ,@ ??3399//93310!#5' 3SHhy-^(@ ??3399//9310!#' 3Q6fy=Lp @??39/99310!#'3p^iy"@ ??39/399310!#!5!3pT; .@ ??99//33993310!#!5!3a.izT *@ ??99//3993310!#!5!35$&@ ??99//399310!#!5!3?P(@ ??399//39310!# 7 3h`axbVL 6@ ??99//93393310!# 7 3e`;H`GF (@ ??99//3993310!#!7!3fb*]v\^L(@ ??99//3993310!#73^'c{L"@ ??99//99310!# 73e[؈scSc[Lp(@ ??99//3993310!#73pd]?de[/(@ ??399//39310!# 7 3Gu7TaF?9 6@ ??99//93393310!# 7 53Rv8HqGG? 4@ ??99//93393310!# 7 3Nw]sX=U8H? *@ ??99//393310!#!7!3mwo V=2? @ ?3?9/99310!# 73\w߈5:=?p&@ ??99//993310!#73pWw2-B=+6&@ ?3?9/999310!# 7 3O}4H) 0q5 .@ ?3?9/99393310!# 7 53N}<Au 1[l6 .@ ?3?9/99393310!# 7 3ON,q -+m6 .@ ?33?9/9393310!# 7%3O~t8 -6"@ ?3?9/9310)7330O~ -Q5p @??9/999310!#73pM4 -zL"@ ??39/9310!#!'!owKzL 0@ ??3399//393310!# ' 3oH Kz4L 0@ ??3399//393310!# ' 3oH)S@Kz?L .@ ??3399//393310!#5 ' 3oHu^Kz-L&@ ??3399//99310!# ' 3o6RjKz=hp @??39/99310!#'3po~32326733#53TU$--[ +L?7SS"0+\ *K&%#(RH(%&&%QJ'h ?+v @ H@6H @P``p@P/]]]qqqqr3+qq2/39/+39910#5##5"'&#"#>3232673wwX3TU$--[ +L?7SS"0+\ *K+&%#(RH(%&&%QJ'YX @ /]99//10#5353 0K+   @ H/+39910#53#'53373D'hi++ 3@#  P`p@Pp/]q3/9/9310#5!#5!5!+=%+: 2@    PY ??9/3+393333310333###mrrmi/Ve*&c'^6@&0/0O00000000(&(('%+555+5/]]q55Ve*&c'^6@&;/;O;;;;;;;;(&(('%+555+5/]]q55Ve*&c'^6@&;/;O;;;;;;;;(&(('%+555+5/]]q55Ve*&c'^6@&;/;O;;;;;;;;(&(('%+555+5/]]q55Ve*&c'^0@ /E?EOEEEEE''&**2%+555+5/]]55Ve*&c'^0@ /7?7O7777788&;;C%+555+5/]]55Ve*&c'^0@ /7?7O7777788&;;C%+555+5/]]55Ve*&c'^0@ /7?7O7777788&;;C%+555+5/]]55*&k&^8@'/O & %+555+5/]]q55$*&k&^8@'/O & %+555+5/]]q55*&k&^8@'/O & %+555+5/]]q553*&k&^8@'/O & %+555+5/]]q55 *&k'^0@ /?O&&%+555+5/]]55*&k'^0@ /?O&&%+555+5/]]55 *&k'^0@ /?O&&%+555+5/]]55*&k'^0@ /?O&&%+555+5/]]55*&w'^8@'*/*O********& %+555+5/]]q55*&w'^8@'&/&O&&&&&&&&((&))* %+555+5/]]q55*&w'^8@'&/&O&&&&&&&&((&))* %+555+5/]]q55*&w'^8@'&/&O&&&&&&&&((&))* %+555+5/]]q55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55*&w'^0@ /&?&O&&&&&''&**2%+555+5/]]55+&k&j' X@+;k{ +;[;{/o/?_?_o  _   0 @  @ P ` p & %+5555+qrr55/]qr_]5/]q]qr5+&k&j' @+;k{ +;[;{/o/?_?_o  _   0 @  @ P ` p & %+5555+qrr55/]qr_]5/]q]qr5 +&k&j' X@o""""?""""?"O"""""""/o?/?_ 0@ @P`p &% %+55+55+qrr55/]qr5/]q]qr5 +&k&j' @o""""?""""?"O"""""""/o?/?_ 0@ @P`p &% %+55+55+qrr55/]qr5/]q]qr5+&w''j y@+$;$k${$ $$+$;$[$$$;${$$$$$/o/?_?_o _ 0@ @P`p &%+5555+qrr55/]qr_]5/]q]qr5+&w''j @+$;$k${$ $$+$;$[$$$;${$$$$$/o/?_?_o _ 0@ @P`p &%+5555+qrr55/]qr_]5/]q]qr5+&w'j' @{o....?....?.O.......!/!o!!!!!!?!!!!/!?!!!!_ 0@ @P`p &%+5555+qrr55/]qr5/]q]qr5+&w'j'  @{o....?....?.O.......!/!o!!!!!!?!!!!/!?!!!!_ 0@ @P`p &%+5555+qrr55/]qr5/]q]qr5h+&L ;$@   & Y %+5+]]5W]"9@  $# _Y_Y?+?9?+9333310"&'732654&#"#336$32_;ZjjİwyHWJJsnsheD=atW ;@ _Y?+?39999233310#"'532>=#3&53 }zRA4(-1  AS[aXX`]%I@$ ##'&_Y _Y?2/+??+3/99933333310"$&'33254&#"#336$32 ]İwyHyJhe=Mwj2j '@ Y ) Y/?/]q+/_^]+10#"&546324&#"322LSVMNR¾X}c+@//]qr/]q9107573}Yxy}$jA@%  Y)Y/]qr+3/_^]+3/9910%5>7>54&#"'>32!$zd\EF=:S yTQzU}CF|F@S,6865XkpdEv6QE$nj0j#_@:!Y@ H/Y) YP`/?/]q3/]+/_^]+3/_^]9/++910#"&'732654+732654#"'>320HR?3WM yKgzm^p@;jk/1eb[np^!}Ac A@)Y @ H//]qr/]q9/+933+310#5!5333tfq$ T*q5j1[d@ Y@2 HY?_  YP`/?/]q3/]+/_^]q+9/++3/910# '732654&#"#!!>3211O>LWIP?Q ur#T?z};5SGCR(u#i)j"GY@" H Y )  Y/?O/]q+/_^]3/+9/+9+10#"&54632&#">324&#"326)7^N[`HvFQCHIFENow˙L{}"1{KCJDENN|#\ /@  Y/  O  /]q/]q+310#47!5!#}EFح#oj0j"-E@( !&!&Y!@ H!!Y)+Y/?/]q+/_^]+9/++9910#"&54675.546324#"324&#"3260`PKO~QLQaEEQKIPNJBiopgHf ^>VljY=^ bii69:;@7@i*j$F@*Y @ H Y  / ?    "Y/r+/_^]q3/+9/+9+104632#"&'73265#"&732654&#"؜eN+N[`HvLKCHIFENdwSM)'x}"1}R@LFEJJ+@ @  /329/]103#5#'##538`tih+ C+@ @  /329/]10#'53#'##53`~ihy +#@ @/329/]]99104#"'632##52#'##53T;3(:CC6=Kih#@`,8N?+ /@   @ H  /3]22/33+q2210"'&#"#>3232673#573#3TU$--[ +L?7SS"0+\ *KЛi&%#(RH(%&&%QJ'pC 9+D@( P` @ P `  @  H /+]qr29/r9]103#5"&'332673#݂YkjTThk+ tD78Cx9+D@( P` @ P `  @  H /+]qr29/r9]10#'53"&'332673\ kjTThk tD78Cx9+ X@&@H @P` HH H/+++qr29+9/99910"&'3326734#"'632+52kjTThkc;3(:CJI#KtD78Cx#@`047?+ $K@  P`p@*/Ho@/2/]]+]qr339/33/3310"&'332737".#"#>3232673fUU#DA=Q[ *K@$F@;0+\ *Lj]SSdc#'##53YL=5FYBI[*5ih,Pp0E &^F !5@@H@ H@ @ H /322/+33++22103#'##5"'&#"#>3232673fhi3TU$--[ +L?7SS"0+\ *Kh&%#(RH(%&&%QJ'M /222/10"&'33273573uuIM  /222/10"&'33273%53uuIM+ @  /222/29910"&'332734#"'632#5>uuR]HFZjQ[pE07c;U (nM #)@@ H@ /2]22/33+2210"&'33273"'&#"#>3232673uu 3TU$--[ +L?7SS"0+\ *K|&%#(RH(%&&%QJ'6+/9910'53E6%!6+/9910573E6!%k& &k& '& J'& +P&P&P&F B&9`#0##]]5&i #/;?3@-3'99? !!?>''>>>/3/3/3/2/93/99014632#"&74632#"&4632#"&%4632#"&4632#"&3&. ".." .. ".." .r- #--# -2. ".." .. 0/!",n` .. ".." .. "..".." 00".." ..".0 0..o!@ /3/33/2/99015!%4632#"&4632#"&3G"-# // #-- #--# -nmm@".." .. 00 "...o\d#4@ #"@ "H"/3/+933/2/99015#5!#%4632#"&4632#"&3nGj-# // #-- #//# -nrmmr".." .. 00 "...oV04.'32> #".54>75$&`1ELIf<#IoMQpEr/Z3O1@{sr}BI`.UsVQr[L`76_`:anHDspa!:wTSV H$7<;DGNVW]h$$7h$9h$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                          uni00A0uni00AD overscoremu1middotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5uni01E6uni01E7uni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236 j.dotlessuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0uni03D1uni03D2uni03D3uni03D4uni03D5uni03D6uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0591uni0592uni0593uni0594uni0595uni0596uni0597uni0598uni0599uni059Auni059Buni059Cuni059Duni059Euni059Funi05A0uni05A1uni05A2uni05A3uni05A4uni05A5uni05A6uni05A7uni05A8uni05A9uni05AAuni05ABuni05ACuni05ADuni05AEuni05AFsheva hatafsegol hatafpatah hatafqamatshiriqtseresegolpatahqamatsholamuni05BAqubutsdageshmetegmaqafrafepaseqshindotsindotsofpasuq upper_dotlowerdotuni05C6 qamatsqatanalefbetgimeldalethevavzayinhettetyodfinalkafkaflamedfinalmemmemfinalnunnunsamekhayinfinalpepe finaltsaditsadiqofreshshintavvavvavvavyodyodyodgeresh gershayimuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D15uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D24uni1D25uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D2Funi1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Cuni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D6Buni1D6Cuni1D6Duni1D6Euni1D6Funi1D70uni1D71uni1D72uni1D73uni1D74uni1D75uni1D76uni1D77uni1D78uni1D79uni1D7Auni1D7Buni1D7Cuni1D7Duni1D7Euni1D7Funi1D80uni1D81uni1D82uni1D83uni1D84uni1D85uni1D86uni1D87uni1D88uni1D89uni1D8Auni1D8Buni1D8Cuni1D8Duni1D8Euni1D8Funi1D90uni1D91uni1D92uni1D93uni1D94uni1D95uni1D96uni1D97uni1D98uni1D99uni1D9Auni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC0uni1DC1uni1DC2uni1DC3uni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1DCAuni1DFEuni1DFFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9E Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookabove Uhornacute uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2012uni2015uni2016 underscoredbl quotereverseduni201Funi202Auni202Buni202Cuni202Duni202Euni202Fminuteseconduni2034 exclamdbl radicalexuni205Euni206Auni206Buni206Cuni206Duni206Euni206F foursuperior fivesuperior sevensuperior eightsuperior nsuperioruni2090uni2091uni2092uni2093uni2094uni20A0uni20A1uni20A2lirauni20A5uni20A6pesetauni20A8uni20A9sheqeldongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20F0uni2105uni2113uni2116uni2117Ohm estimateduni214Duni214Eonethird twothirds oneeighth threeeighths fiveeighths seveneighthsuni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206uni2215 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtuni2500uni2502uni250Cuni2510uni2514uni2518uni251Cuni2524uni252Cuni2534uni253Cuni2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cupblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxuni25A1uni25AAuni25AB filledrecttriaguptriagrttriagdntriaglfcircleuni25CCuni25CF invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluni266Funi2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2E17uniA717uniA718uniA719uniA71AuniA71BuniA71CuniA71DuniA71EuniA71FuniA720uniA721uniA788uniA789uniA78AuniA78BuniA78CuniFB01uniFB02uniFB1DuniFB1E yodyod_patahalternativeayinalefwide daletwidehewidekafwide lamedwide finalmemwidereshwidetavwide alt_plussign shinshindot shinsindotshindageshshindotshindageshsindot alefpatah alefqamats alefmapiq betdagesh gimeldagesh daletdageshhedagesh vavdagesh zayindagesh tetdagesh yoddageshfinalkafdagesh kafdagesh lameddagesh memdagesh nundagesh samekhdagesh finalpedageshpedagesh tsadidagesh qofdagesh reshdagesh shindagesh tavdageshvavholambetrafekafrafeperafe aleflameduniFE20uniFE21uniFE22uniFE23uniFFFC commaaccent breve.cyrcaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc grave.alt1 grave.alt2 grave.alt3 acute.alt1 acute.alt2 acute.alt3hookabove.alt1hookabove.alt2hookabove.alt3 tilde.alt1 tilde.alt2 breve.alt1circumflex.alt1 dotbelow.alt1 acute.alt4 acute.alt5 grave.alt4 grave.alt5hookabove.alt4hookabove.alt5 tilde.alt3 tilde.alt4 tilde.alt5 tilde.alt6 tilde.alt7 tilde.alt8 dotbelow.alt2 dotbelow.alt3 dotbelow.alt4 dotbelow.alt5 dotbelow.alt6 tilde.alt9 dotbelow.alt7 dotbelow.alt8 dotbelow.alt9dotbelow.alt10dotbelow.alt11dotbelow.alt12dotbelow.alt13dotbelow.alt14dotbelow.alt15 tilde.alt10 tilde.alt11 tilde.alt12 tilde.alt13 dotlessi.alt1uni03080304.capuni03080301.capuni0308030C.capuni03080300.capuni03070304.capuni03030304.capuni02E502E502E6uni02E502E502E7uni02E502E502E8uni02E502E502E9uni02E502E602E5uni02E502E602E6uni02E502E602E7uni02E502E602E8uni02E502E602E9 uni02E502E6uni02E502E702E5uni02E502E702E6uni02E502E702E7uni02E502E702E8uni02E502E702E9 uni02E502E7uni02E502E802E5uni02E502E802E6uni02E502E802E7uni02E502E802E8uni02E502E802E9 uni02E502E8uni02E502E902E5uni02E502E902E6uni02E502E902E7uni02E502E902E8uni02E502E902E9 uni02E502E9uni02E602E502E5uni02E602E502E6uni02E602E502E7uni02E602E502E8uni02E602E502E9 uni02E602E5uni02E602E602E5uni02E602E602E7uni02E602E602E8uni02E602E602E9uni02E602E702E5uni02E602E702E6uni02E602E702E7uni02E602E702E8uni02E602E702E9 uni02E602E7uni02E602E802E5uni02E602E802E6uni02E602E802E7uni02E602E802E8uni02E602E802E9 uni02E602E8uni02E602E902E5uni02E602E902E6uni02E602E902E7uni02E602E902E8uni02E602E902E9 uni02E602E9uni02E702E502E5uni02E702E502E6uni02E702E502E7uni02E702E502E8uni02E702E502E9 uni02E702E5uni02E702E602E5uni02E702E602E6uni02E702E602E7uni02E702E602E8uni02E702E602E9 uni02E702E6uni02E702E702E5uni02E702E702E6uni02E702E702E8uni02E702E702E9uni02E702E802E5uni02E702E802E6uni02E702E802E7uni02E702E802E8uni02E702E802E9 uni02E702E8uni02E702E902E5uni02E702E902E6uni02E702E902E7uni02E702E902E8uni02E702E902E9 uni02E702E9uni02E802E502E5uni02E802E502E6uni02E802E502E7uni02E802E502E8uni02E802E502E9 uni02E802E5uni02E802E602E5uni02E802E602E6uni02E802E602E7uni02E802E602E8uni02E802E602E9 uni02E802E6uni02E802E702E5uni02E802E702E6uni02E802E702E7uni02E802E702E8uni02E802E702E9 uni02E802E7uni02E802E802E5uni02E802E802E6uni02E802E802E7uni02E802E802E9uni02E802E902E5uni02E802E902E6uni02E802E902E7uni02E802E902E8uni02E802E902E9 uni02E802E9uni02E902E502E5uni02E902E502E6uni02E902E502E7uni02E902E502E8uni02E902E502E9 uni02E902E5uni02E902E602E5uni02E902E602E6uni02E902E602E7uni02E902E602E8uni02E902E602E9 uni02E902E6uni02E902E702E5uni02E902E702E6uni02E902E702E7uni02E902E702E8uni02E902E702E9 uni02E902E7uni02E902E802E5uni02E902E802E6uni02E902E802E7uni02E902E802E8uni02E902E802E9 uni02E902E8uni02E902E902E5uni02E902E902E6uni02E902E902E7uni02E902E902E8cyrillic_otmarkuni03040300.capuni03040301.capuni03030301.capuni03030308.capuni03010307.capuni030C0307.capuni03040308.cap bari.dotlessuni03B1030403130300uni03B1030403130301uni03B1030403140300uni03B1030403140301uni03B1030603130300uni03B1030603130301uni03B1030603140300uni03B1030603140301uni03B9030403130300uni03B9030403130301uni03B9030403140300uni03B9030403140301uni03B9030603130300uni03B9030603130301uni03B9030603140300uni03B9030603140301uni03C5030403130300uni03C5030403130301uni03C5030403140300uni03C5030403140301uni03C5030603130300uni03C5030603130301uni03C5030603140300uni03C5030603140301uni03B9030803040300uni03B9030803040301uni03B9030803060300uni03B9030803060301uni03C5030803040300uni03C5030803040301uni03C5030803060300uni03C5030803060301 dottediacuteEng.alt1Eng.alt2Eng.alt3zero.altone.alttwo.alt three.altfour.altfive.altsix.alt seven.alt eight.altnine.altcircumflexacutecircumflexgravecircumflexhookcircumflextilde breveacute brevegrave brevehook brevetildecircumflexacute.lccircumflexgrave.lccircumflexhook.lccircumflextilde.lc breveacute.lc brevegrave.lc brevehook.lc brevetilde.lc uni1FEF.short tonos.shortlamedholamdagesh lamedholamfinalkafqamats finalkafshevaaleflamedhatafsegolaleflamedsegolaleflamedtserealternativelamed alefdagesh uni05B105BD uni05B205BD uni05B305BDS_BEx          bcyrlgrek2hebr>latnLMKD SRB ccmpccmp dlig(locl.&.604D@8 8BLV`jt~ (2<FP           (06< ", j"4FX:BJRZbjrz S R Q P O M L K J I G F E D C A @ ? > = < ; : 9 N T B H:BJRZbjrz o n m l k i h g f e c b a ` _ ^ ] \ [ Y X W V U p d Z j:BJRZbjrz             ~ } { z y x w u t s r q   v |:BJRZbjrz                            :BJRZbjrz                            J",6@   bcyrlgrek2hebr>latnLMKD SRB kernkernmark  6>FNV^fn|&.6>     jx|8  #j&&&'8''(F( () )<)l)))*,*\***++,+Z+~;;>pB0ElI,I4IP1lll~.6llL.llll....llll..lll    ))     ))          ,             ))     -              1          n L $*06<BHNTZ`flrx~ &,28>DJPV\<<<<<<<~<<<<<<<<PPd<<<~<<<<<<<<<<~<<<<< (  H" X &,28>DJPV\bhntz x  XX&|vll  L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntzFFhFhFXFXFFFFFFFXFXF F F@F@FXFXXFXXFXFF0F0FFFFFFXFXFFFXFXFXFXFFFFFFFFFFFhFhFXFXFFFFFFXFX F @F@FXFXXFXF0F0FFF00XFXXFXFF (  HFLRX^djpv|FFFFFFFFFFFFFn. L28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz00>>,,hhXX00\l4XX>04hh00>0,,ThhXXXX\l400XXTT (  H   jpv|-22<2  !<  !J`    J`      J`     !   J`     ! 4<4J4<  !4J  !Jl      Jb    Jl        !Jb      !n L $*06<BHNTZ`flrx~ &,28>DJPV\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFdFFFFLFLFFF (  HFFFn L $*06<BHNTZ`flrx~ &,28>DJPV\8FFFFFhFFFFhF F FpFFFhFFFFFFFFF\FFLF F F FF F8FFF F FF\FLFFFFF8F8F8FFFFFhFFFhF F F FFFFFFFF\FFLFFF FF F F F F (  H FFn L $*06<BHNTZ`flrx~ &,28>DJPV\$HD88\ X88$888888$$$HD$ X8$H (  H ( >       $*    $*    $*    $*    $*    $*    "    $*$*$*$*$*$*$*$*$*$*$*$*$*"("(pi 2@^p4r|&Tv.8,:dR>TZ`6  . < b 0 H j  @ R  , > l .p(FLZ $7<;DGNVW]h 7h9h:DJPV\`88ppp8LL8\Ppppp`pp\PP```pppLL8\PLpppp (  H n L $*06<BHNTZ`flrx~ &,28>DJPV\&0,ThXXXlhhhXh000,ThXXl0XTT (  H   flrx~888888888n L $*06<BHNTZ`flrx~ &,28>DJPV\FFhFFXFFFFFFFFFF FF@FFXFXFXFFF0FFFFFFFXFFF0FFFFFFFF FF FFFFFhFFXFFFFFFFF F@FFXFXFF0FFFFFhF,FFFFFF (  H:@FLRX^djpv|FF,FFF,FhF,FFFFFFnn L $*06<BHNTZ`flrx~ &,28>DJPV\0h,|hXX,XX0h,|hXXXh0X (  H   flrx~h@,,x|,|@p 8=@̑openscad-2019.05/testdata/ttf/liberation-2.00.1/README0000644000076500000240000000367113402025764022243 0ustar kintelstaff00000000000000 1. What's this? ================= The Liberation Fonts is font collection which aims to provide document layout compatibility as usage of Times New Roman, Arial, Courier New. 2. Requirements ================= * fontforge is installed. (http://fontforge.sourceforge.net) 3. Install ============ 3.1 Decompress tarball You can extract the files by following command: $ tar zxvf liberation-fonts-[VERSION].tar.gz 3.2 Build from the source Change into directory liberation-fonts-[VERSION]/ and build from sources by following commands: $ cd liberation-fonts-[VERSION] $ make The built font files will be available in 'build' directory. 3.3 Install to system For Fedora, you could manually install the fonts by copying the TTFs to ~/.fonts for user wide usage, or to /usr/share/fonts/truetype/liberation for system-wide availability. Then, run "fc-cache" to let that cached. For other distributions, please check out corresponding documentation. 4. Usage ========== Simply select preferred liberation font in applications and start using. 5. License ============ This Font Software is licensed under the SIL Open Font License, Version 1.1. Please read file "LICENSE" for details. 6. For Maintainers ==================== Before packaging a new release based on a new source tarball, you have to update the version suffix in the Makefile: VER = [VERSION] Make sure that the defined version corresponds to the font software metadata which you can check with ftinfo/otfinfo or fontforge itself. It is highly recommended that file 'ChangeLog' is updated to reflect changes. Create a tarball with the following command: $ make dist The new versioned tarball will be available in the dist/ folder as 'liberation-fonts-[NEW_VERSION].tar.gz'. 7. Credits ============ Please read file "AUTHORS" for list of contributors. openscad-2019.05/testdata/ttf/liberation-2.00.1/TODO0000644000076500000240000000053613402025764022050 0ustar kintelstaff00000000000000Here are todo for next release 1) Serbian glyph for wikipedia https://bugzilla.redhat.com/show_bug.cgi?id=657849 - Improving shape of S_BE https://bugzilla.redhat.com/show_bug.cgi?id=657849#c96 2) Liberation Mono not recognizing as Mono in Windows application #861003 - presently it is patch, we have to update zero width characters to fixed width openscad-2019.05/testdata/ttf/marvosym-3.10/FILE_ID.DIZ0000644000076500000240000000150613402025764022411 0ustar kintelstaff00000000000000MARVOSYM.TTF Version 3.10 Free Windows True type symbol font for school and office: fax machine, Euro currency symbols, CE-symbol, answering machine, peace dove, textile care symbols, biohazard, coffee cup, e-mail-symbols, cellular phone, corresponds-to-sign, restroom symbols, scissors and cutting lines, civil engineering symbols, and loads more! You can download the latest version from http://www.marvosym.com MARVOSYM.TTF Version 3.10 Kostenlose Symbole fuer Schule, Studium und Buero im Windows True Type Format: Fax, Euro-Logo, CE-Pruefzeichen, Anrufbeantworter, Friedenstaube, Waeschesymbole, Entspricht-Zeichen, Kaffeetasse, Handy, Scherensymbole, statische Kraft- und Auflagersymbole, Stahlbauprofile, Vektorpfeile u.v.m. Die jeweils aktuellste Version gibt es auf http://www.marvosym.de openscad-2019.05/testdata/ttf/marvosym-3.10/liesmich.txt0000644000076500000240000000110413402025764023276 0ustar kintelstaff00000000000000MarVoSym.ttf unterliegt der SIL Open Font Lizenz, Version 1.1. Die Bedingungen dieser Lizenz sind einsehbar unter http://scripts.sil.org/OFL Die wichtigsten Punkte aus dieser Lizenz: - Der Font darf kostenlos verwendet und weitergegeben werden. - Sie drfen den Font verndern und fr Ihre eigenen Zwecke anpassen. - Sie drfen abgeleitete Werke herstellen - beispielsweise TeX-Fontpakete. Wenn Sie Vorschlaege fuer weitere Symbole haben, wenden Sie sich einfach an den Autor: Martin Vogel Stockumer Str. 445 44227 Dortmund Deutschland mail@martinvogel.de openscad-2019.05/testdata/ttf/marvosym-3.10/marvosym.ttf0000644000076500000240000021024013402025764023337 0ustar kintelstaff00000000000000pFFTM2.POS/2LxVcmapix,cvt jZW` Nfpgm^Ldgasp|glyf~ headd&6hhea4$hmtxS+4_\locaXh maxp X name%l>post 2 prepQ_< \p\plIggIlzR@ * VOG @fg"""""m_C`w6gbMt9G"XdOc mT d e8dl';)t'.I;Dja3MwRdk0 P3/|a/\jw_RV; vUl)Z)Zd`e]dqZQcqcSzZWdIS^>\ bN   ,JPY|c|_aKhgE[g gefc [gh[`?&&2fLJ XIXXN\ Vxxxx%. \4^^^4^ \T0T0CC|YvSb?[N*YV`l=cUZC=1gP'P&P'P(P&           2BLSjd?N<EVX<]F:Bb:]X\ ."}6 ~Sax~    " & 0 : !"" R`x~    & 0 9 !"" gD>߹[ނ16*, $((  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdqo~uvgwxiklyp  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@,vE %E#ah#h`D-,E %E#ah#h`D-, 8@68-, @868-,Fv Gh#Fah X %#8%6e8Y-@""!!EvEhDF+F+F+F+F+F+F+ F+ F+ F+ F+ F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+F+ F+EhDEhDEhDEhDEhDd2E/<>N6pXQ!m$2!vDlt]F.0J!iUnU^h .aISW`JclxzPFj};(+47Bf\@rt96&dL>Z4 <.(hTnF^"j4Ljb<z  <ZpZzN4`p  d!!#2##$6$L'l')2)D))*l**+,,--.--..v..//|/0P0j011p12F2334l4444445 5"545N555566667789:::;;|>?,?@@|@@@@@@AAA*A@AB4BBCCJCCCDBDDEEEEF@FGG|GHIxJ>K KLrMMNOPBQ:RFRRRSTSTTNTTUUUUV^VVW^[] _ '/6=V !!!! !!&'#3572'4&65#33#536.6.7667."&'6TT_dgB+WY`qW6t~ P7#7)@HGI@>&+103>0me 3loT_TBdfWY/8iZГoDOO~AB@H:6k2:2T?Q0T0B'}X / 5!!5!!5!!Vu%//2)"'&'&547632.#"32767654  , '2@x{F0 &/A>0 ,$=1 ~0FTN:KB2RL;# M,!!>1 -$; 536!"'&'&547632!5!.#"32767654 ' , (2Ay|F1 '/~@ >1 ,$>1 1FUO:KC2RM;$ ,"">1 -#<} $(?B!"'&'&547632 ####### .#"32767654  , '2@x{E1 &.uA=1 ,#=1 }0FTN:KB2RL:$ aaaaE,!!>0 -#; Ce&%7"/&'&'&5%"7e c@3/ m:! s`XF` -R JN714 ,s41(.)Oq,A`2767>5'&'?'7l&26=a KVdK-2 >員9235MCNa<~7(13 <  #5<CH 8 #g͋SslH w4V632 632#"' #"'5!Bj!BKK!B`!CJUKK@``LkJL6 3!!#!5!K<%3#\Ջ`!! `%3#g #+u*b $5'&'$7&'KUhIJ EcQ> 8}5D-+ 7673## + @@@k~!!5$'&'$#!@, iO۞24+~"# 537'&!576%$#4 H2-uyHH H-]4 "HE4=4 SmM !!#!5 !J6VuV5a!6# 53%6767'&#~')w'G6s 5 j? <^_.*LVq) *IQ4 U_Ut&3 #7$# '&'&5767%$Y 55Q)$y_K T?;}~~*'\a?; T ^!5!3##!59c$mc.#/7632#"'# &54767$67627676%"6%$/* +W1!W 61Rl$@Wc8!b5! GJKWgsH5Yh_Q 5>s?^5)]=3+]?~*63 # 53765'&'5767'&*&: _|?)sJ* i(@ s5 NQ Y*)+Ihhs/^ J T>t9s !!5!!c:K]GBG 57!5!7'!5!'ksMl|yyPiIFiS0 3!!5!!vmm0 %5!!!!}   ~~ll0 !5!53!5!mbbm" !'5 57!!7'!b c9`d4UUUU8:SU8:S1142dn@Q3! $54$!2!"&'#"&54763273327>54!"32$32767>54&#"SXXX]..JI huޜM +CZpU/[D2,"!.E]GLDft׭Pa23eʩϭxb> 4By%΍vnl&5ZdkuOB+#"&''7&/&54324#"732?>7676fMxSz6# DGzWXu\I$ ';+=3276=354&+532#"'&'&=3;#!54&'&+5326=3%#33+=327>=3331#1X@'#5'?X2A*$m.|wO;>1 5 Fs|r. $4' 3 $4' 3 $3& '3 %5 %0& '3 %*&3 %*3 $1&0 %*3 $**3 $ .+4 % \(   % hA (?"2:3=sڝd%,!%_G9RM>>u>Z3,@B;1!TjZ<,p~X@"9_0[cBI5*P ,'(XuB1S6@9;1SKR53.3hD/*1ISeT>K=PH+5 ,/ -  (&5 " D^Z-&mLIm 14-5 6 # ,v# &562!%Kf-KsqGX0(;2!-8;EE<15D! %0/#!&# BO[ 9jKh)?b&V nW40I;!*02e 29.6#&'&6%&!6&'!#!".'#&[r+cRYDXc=39E3Oٱ7O<;II&6c!a ~w!eR6CA3[O*z< ƾ8Z^UB'5HGLN|>'Gq= Dm8AgA6DW`3 3!3 3!7 !5!ϞǞÝW [ [ VddR !2@I[ay'7;gv )-1JNb#ATXp (1;CS]iw ,EOdy54&+53253"#54>;+=3276=354&+532#"'&'&=3;#!54&'&+5326=3%#33+=327>=33354+"#54&+"#53>;26;2!5+"&=3;2753!54+"#3>;2'+"&=46;2#4+";2653#7'373%53;#"&=#53533+"&=46;253+"&53;26=4+"&=46;2#4&+";2+32+"&73;2=4+"&=46;2#4&+";2;273+"&=46;2"#536;+"&=46;2#;25+"&=46;2#5.+";27"&=3;53#'3735+"&=3;2=3535354+"#367>;253+"&=3;26=3+"&=46;2#4+";2653+"&'3;2=4/.=46;2#.+"+"&53;2=4+"&=46;2#4+";254+"#3>;254&+"#54&+"#53>;2>;25+"&=46;253+"&=46;2#4+";26535+"=3;2=353;273+"&=46;2+"&=46;25354&+"#3>;2"&=3;5##3353+"'#3>;2+"'#3>;2+32'##3%#5#53546;#"3+"&=46;24+";25'4+3254&+3254&+"34+"34&+";265'4&+"34+";254&+";25'4&+";254&+3265#34&+32654+";25%;273+"&=46;2'4&+"3+"&=46;2#5.+";27+"&=46;2'4+";25+"&=46;2#5.+";27%;273+"&=46;2'4&+"354+"#53>;254+"#53>;2y/!/S=&!3%9P 31!/S=&$P9>  O%6!1)$> V>9P1  11 %v '13 33 ''! +) !)3 3W!K#77!a%t %'' >2+ )) +-E C ?$3 3?-  -E!A?"3! 3A"!&'%"%b %)!++)!$%&(!)!#!$` +3%#G$54")31<%M 33!%^ )@%!= )  )) "'1 11% :%!"6&X++) +n##=#3 9 5##/%3 - < 33 %!   ':'% , )' !!*3 3C'#"&X'!!#'(&#')++)p &!!  '!%!  b55b5)""   %'  %;#""#$_3Z\'')?*!')!* JJ JJb"l5N"" !ly! #!%!$!%;dd7r&dd%!!% i!!%'%"%"l#%%'!) !#!#)!')!)%!!%$%&(!)!#!$!" %'% !& !l#&  )C#% )!/%=T/:P6P/!/T=%t#N---w9!/%=T/@_6$--N#' w-pW0 0/!0R4P 00Pb#N---w zw-  ()ޛ 2d(E)+R)&T wPج3%%Tv(v!TT!)+R))s@ ! "+2- " !Y''9P!v$+R))C#'W''W !)/%%ز)%%ۛ2d(6!"()+R)&T )%!%' '# 1+$$  ""  M 2d(   ' 'W'g,)+R)&T C%%!%Y''=)+R))0h ' #邂2}}Y!!d. 'W%d. '(0) !"::1ϸ'v)%`!VLd Qc /^ b  Vnd!!^d!!lQjb"\# !Y''99=#'W'!'W !*&`! "\#$(V'!(V!! !X''99z& " % !R7$(:>bo,04HZ^w 3EI]im(48DJ]iqw "3?Kcu732#54+"#54+"#536;#7'373'53;#"=#5353353+"53;2=4+"=4;2#4+";2+532+"53;2=4+"=4;2#4+";2;273+"=4;2'"#536;'+"=4;2#;25"=4;2#4+";253#'+"=4;2#;27'"=3;2#54+"#5363'53#'373'+"=3;2=3#53534;2#;273+"5'6732#54+"#5353#"=4;2#4+";253#'+"=3;2=3+"53;2=4/&=4;2#4+"+"53;2=4+"=4;2#4+";2'732#54+"#5354+"#54+"#536;26;254&+5325+"=4;253+"=4;2#4+";255+"=3;2=353+"=4;2#;27+"=4;253'54+"#536;2"=3;5##533533+"=4;2#4+";25+"'#536;2"#546;+"=4;2+"'#536;2'+532'##73'#5#5354;#"3"=4;2#+5326=354&+5323"&=3;#!54&+5326=3+5326=3%#33334+3254+3254+"34+"34+"34+"3%4+";25'4+"34+";254+";25'4+";254+";25'4+3253'4+3254+";25+"=4;2#4+";25%732#54+"#53+"=4;2#4+";253+"=4;2#4+";25+"=3;2=3#%732#54+"#53    a   )  L    { --  c      - L   3 @  5    b  1     C      u  $   % }   #jvF`:   l      J R 3y  5   r##yv      "w`Fw     -- +!!  ``Fvj#v!juE`iw/F`w"kw!jj!v77`EuuvwwwI  2 %M  ') %  P 'h      !! % !!      v t     c      R 77777PN>>+ -  CNN  { l    ! 5N     VT55 7N^NDDf58:PNNP + 55 7NNN  VV V   T/779l5 77 7N 5k#w`Fw#lv88 8NP N! dkNN5 7l' 5TT ^//l--l  #k#kwF`w!#kl  llCCC   C{F`v#jyk#w`Fw`Fvj#v;w##v! H--J#F`vv_FvVv #  h ! ! h # ! # % D) ^2779lT58:PJ779ldr !!7!!d+H 3lg7!5!'4Ç}|;)07'%#"'&547>$7&''&54767632%6.6.6rcGG9-<&NGqL.=F3PLz$b~ O ZOqWI 8W.$>\1 _S4/Z h;NFDv ;<V*3WLd>(t2 !5!!5!!5!?: 944444.)07%6>&7632'#"&>&''6.>&P3F=.LqGN&<,:GGcr~b$zLZ O 3vDFN;h Z/4S_ 1\>$.W8 IWq*V<;(>dLWIw<DLTa'&57'&'&'!5?6767676765''?676?2'&5%5&64'&#"326w@?/@=>"'%< (M.07."Ѵ*|agml} c@kF@FBh\db;  ;+S(0-O4=:)!%1c=Mf(A732^Z+G  /((6;#"T- TY63s3:-=&!9?66V7>?!4'.'.#"3 '#53#53 %7 #53#53@!,ka)*( !`@$+j=^?9;_-B0Y臂_+1+Ct u+ffdd9|I#ffddFP(M,nuo % * MMN#  I~5ui+0Dj6c0\j\]+#1uce&\*sc{fjp !!6!#'#?65!!3'#jD"fV]^3oD;"DSN*" Dw D""O faY%%%'67 3&/?6'Q:  ! D6:XM{ 10  3dYOFt ]8Ty0?5hL2OQ92SbD3m %,!!/!'6'7"?7&7775!3#!'"f*"<]3D+<<33+*;*#"V !"; E]w"]+3"*!" ND4x"M4 -94&#"326#"'&546324&# !5$7&6726! ! ;()9&%> %&:((;ي]CКCA;8%<9('6'(&::bWÝD:1CRM%N]t#"/&/#"&/&'&'.'&/#'%26?2!224'./#'#%24'"'226?>4'";?64&'";2727>764'&/&'"#'3235.'&5"'*/7267'76%2/A  @ *F&.9 -P?Q6   $#/>{.1/<*H6!*;9C5 (,1c8 '.+6-P  "3CFF5+" YQ D*40"`"  XC&O #$ "BE ?6/830 +b;!.DK<J)2"%# 1LHYZ&=8:  P(  -&J GG*    h/A#= 9 ' !" 'Q%  6z)  1 %]  $ 6 .$;D ! z*+ "!*o   ."n#/(3#TF 33##@h? C d0 !5!5!5LLpuurtuuk#3!!!!!!#5!5!5!5!5!5!Stt#x~yy~x #+u*#5;B6&3#7'&767&76>7&&''5267.'%! !'! !5KQUueoh&X\QXqVg YT"B`*2I@$2.g48b9920M +89{BVE^aOipMAi%o wk-j/ff.lIN6xpiP @v7'%775'77577'773?737%7#!!'%''/##''7''5'#'7''%3''?'!5!6/J +&l C1( , R.22E#l)  c g& C 2,,R/.1 F#)l Zd1F# f) W +D& C 1) ,R/11 F#)dZ &l C1,, R/3Z<sz'"&#"/'?'? 7632374/22?"65'4'72?:2?46%276/"3?>?474'26/.'?6Z&K;xl lN#X@ %[}%   ,#%:*,*%sK"3< 2   ' P7 L  !KD, П+*( 3k ( 0$,  E1&  3"#'Ij k#q?  @BYW>.D'"%  -j(;%^ 0  E  (Z   !R0GJC  dw%T[9r(!#K . I 56 /:#63 &!!!!$7 #75#73673SR5 9 @` 5Pj:eEjBĕ4ܬda13256'5&!!!!76!"'$#&5473&7#&5473o20,4V-.6 >:dR04!#!%LV64$*>600D>.2xP1>D/J&3 %!!!$7#"'&'73&7#736O T\l;* z3[`52Uj^@!`FBb˅N { `FB`O\K2'&%66636?'?67?676/4//&7333?&76727&?63767'?'&5&?676/7'6'/7&##/ '&7#'&/"/'"/&/&'#&63 +"'$'&'&54767676 _      $+         % -# &   .&  5"& !  2   #/v;3 'D_osT&7Xű     &" +  +  "      3   #.      *    &    & "9 &    (<  uuuÅx*U@400`Kw<_!5y}}j2d/&&'547676?67&?676;6/&'&'6&'567676/&72767657/&''&'&'767676'&'&/6&'67676'6%2'&'&'&IF! T& T%0+Un`1 , /I$T )RHq8 VCT 0:6\B22+>4"O=9G8B)7_=?Z;1B&U_B ,OxWXch(jLRP>^B+= ?^ >=#q &g+b;01b@1//1 aE))DD,/Q[dB217MQB7@$ *A6 !#I2*1 Dl0Ta:D0MbRF+A Q!#[0Yta#B*/"Y0'RF2;.HS(/() $_'9C%#!"/463!24#!"3!2#"&54632!53#5!3)JG/ WJyA00'z||yz%EG^]c_G  Kwtt .+%oK[0+KoLVNDbcC %'E%BRz$ 4.6.'7+&'6E7AWQyd\ȿleB=9>׳3!eRlRTy] HdlEn W$&3m`V "&)!! !! '7'%'%!%7#'$ . r+79^78^Kg!|=W_' Rk\Ͼv '!3tw88 ;'(632#&/&'&'&'677676?6767675&'&/&/#'?''7'2/'/&77/&&/&'57#/'&#/2#737'/&'5&7/?/6/#'/6'7656'766?637&737?''&'6'''6/#'#'575/6''##'5'5?36/67&?6/773373?''?6?3&37/&?377'7'7'73776/65'&'###/'?676'#'6'73677'7&?6'#'/'73637/&5&'76/76/7'&3/5'5'"=7'67/757%37/ANP>mf>g*-(,=MQFmEci>1n 9Ǻ8wkmn09-K -F;B*HM*D1 )8 /     !) + !B m(  *#% # C -'  # *  *B  D#!   (         )%$,  :! !$ * &/; /1w)jWl 7d !      " u    X A #V #Q %  $  &$7H?xoD 7NkO/gWc@;** "5 #K,!''732! $4 *,*$A  ?4D5   E !(/% 7!  $1 P1 /  ' E!!  *.     '         *    # 3* &    4 =.  . &%T غoo\         r, ,' ! " )- D # %,*6( 3  '-! ! ! '! 373#/#757!#3#3!33!QYYN^G|]FE]v\L O\Ȼ[L%!B:  LfL|LL U.,AYn|##"/&'&5?676$3254/&/?'&/.#"3264&+2?6'67>/&#"2?6'&/" 32?6?&'&#"3276?6/.#"32?&>%/&'&'&/?.i:$DX?1% 7!.3bfJ "(gW6e[W0ME*, 3T(n   g1;Va%G -c:1-( ((R *d%#'('*$9- /=4  7WG;: 38#)%K/ P ' 'a_PA4HS3p7%'.&d&%?Pc !p1#2D G7-v(""&#\R3!t%&&3 l s-* %%W ,0&'1" 2/06(NQ(Tnv 3^|wdB}7@Y *FC%$  # 4438 Rml/7!5!'4rÇ}|ZP;KY!5!!53'"&54?6?/.5463267676324'.#"32764#"26Q?b+sKtr;+%&O^oa)(ar6'*7]LYsvNCD'.1]9 .9!0XB-!fHU8b5C,o550[']D)G9W6+KX'>N+8KWB]C/!) ++:O11! 0Q !5!!5!!5!Q?: :55555P :>N\%#"&547&/3!57632>7&54632%!5!4&'&#"3264/"326 \PStruNDLtư+H " 2<BYvsXK_ ,&7r)(anI? /E,.5@Y,#e]=269GTCZ!%0& 055o   '+@a@YI:)(>'Xu+0X5-!:}0 O+5*!# #'##333#3##! nbbo(#ef^mRSm׹]4FJR?).Tt%Z%(%!!!%# #33###3!!!#! 9CQZVWYhO6:N[ JzSZ:~i7&!VSL['1>KQ\cjqx##!'5?3763775!3'!75!5?5# 3#'%!767675!/!!!?%!!6!675!%3?5#3?5#3?5#375#375#375#?5?5#?5#&Xe*V(RkYl5 hj+1 S2RKmH<3^t \H$A/Ey^`aK-#u!<2hZ-Y`<$>JX)66#1-6#1-4%1,V=#8(<#8'<$8(kD=C:"B:!T);ZV2-D)3z: 2Qj$(#~8 : ;Qx!dGeDJ"?@?@?@HIHIHIEGEIEI`:BU632'#&/&'&'!57347676?75'4'&76375767676'&/#!% LM! "@VV:4 U}[)FH hN*3MQXFO2"F=-,S5;)LJV@  +5 P 55>K39;&,.;E(26%!G76-E5IƑN?>oyS~.1P G:'":eJ0&V=B*e!%)632#&/&5&76#!#%## GN; 7/1B;2'<1jjZjj:=8U(0./# (37-[D4D_=XX]"'&/?6!!#7#bD..( 3nbL&D:ȏ~l~l"3?:iUqZ @m` ^V0 k^T[KoD4ˆʆ&osmB8hbt&;" ^\f\cp3&:6323##5#535&'&'&'&547676767676'&'&'& ({ɇzH5 $|zm7 -Q?bQB iQ2v~$50iU/ k^T[KoD4ˆʆ&osmB8Zk.&6323##5#535&'&'&'&547676  ({ɇzH5 $|z-v~$503.6 OAM^SI8 @LL$'nxP,Z"#[G9F;  <363?6?673! !5&/&/&/] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstPP07 ='$c !3G # : `'  <@363?6?673! !5&/&/&/!!] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP#}P07 ='$c !3G # : `'$  <@D363?6?673! !5&/&/&/!!%!!] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstPP07 ='$c !3G # : `'$J*G/&'&'&'&/5463267>324&#".#"767> 6HXJ~d/ ."4%ʤYSHPCS(V.̄tKKFKnt-{=@G/ ={7  %rc343dYgTw<$$C7]tg5"2+oc6ُhohoPHLN4"Tcc7NY2G2!"32767673!"'&'&'&'&5476763!254'&'&#"Y\f!)CF*B3p`^th<*R{a)[z7,(`F0XX6IN [*M_!(Q_-%(# -+,Uj%1W.,j(͢m[R(N+EF7>c$A67675!3!!#!!7!'&/&'#?67$6'&'&'&'&-%*R<@e$B(UpGFbKUI91 X6R/ eI|U[E:?j -š[-9\QIIZ_F[-IErEF&5MIC+ +\QF^<`X 133ORD _)!6=BP\`ix}!!'7'6'7676?5!?'#736'&'&'&#&%375!35&735'367'&/#7'#!/&'#676?'35!5/##h H v :NF6--76F$dO0I|f6X-R 0T!R7 -B*7!aKN@L 0іI@KBo7E!d- !@Hq    | Q0!!!f.>c= !!!!!!c8=[F$76!2$76&',n| ֕F `%ƖĚg=!!!!g8=*h@ 632!!hIP2=1T *T[4"!76?676'&/&'&54\JJ -% 1"18-457636767632$'6776.'67>&'.#%&6KB)>}Z(&LC95 /FV(+GO}iA1a5DVa8=v@PUۆdr* -/)+]c=M2*`> ׀,*'3}5'!+JslģL&<G#"'.>&'.'&547>>7.>>.Ȁ`%*P @(\7632,>>2#"'&'.7.'&547> >7">.QR;! bu(j}N B?$C/^' +jRI >ET7r}bF/} X<H|l`4LTH$hxd<DV7/?#V+F/Br:7? fur7 Fy &/jjNf!3N49Z]HP@< 8xTDL)32&%!!!$7#"'&#73&7#736p2 74G 4Q=249s7;o ><]==>Jqr$8CTblu>632632$$%$'&&56'666&2$6'.7$&'676'&'6%>7'.47&7&6&&#"6&#"66'654654'6Jg0?Hy;N-(~|\dQ|TfgdUxxjrY`D'&R|E4='o#*6dg7lQk"~U@<$ <_U$ 15/895gTc+?i@|K+Cr &F2y/|J? 5@95JVa@\{.N+`&x+u/2"")@= <OYdow22/#"/5&'&'&'&7676&'&'&76?632/76#/&'375'#'7/#'%67676'&/#'3CtW:Htf&2q&. C[i .{UxlB P~#z! $,*+! % Q<4%0f   ) $S )niQ]H|1) .X1 S [;Vf[91#  ))( 1-P  !)C&EW3"#/0|$*X:#:GS"'.'4?2"/4?6765'.# 676?236! ! %%$ . 1 6 ^݈ Bh&( FI<2# #   ^] CHHeJ=/II==MZhy327'##"/&/#'?&/6767'77676?676'&'735'#65674/# 276?4'*Vi}7]TJovQ1suEA`WdUWhjmT;QTpmJ1vv WAN`T~NXAW)> "S 9 D &6mW^y8> HpWs,BJT KQx}]mJ[HK2N7>&)(,HlKH zz|ZETJ K];2/2(: W  !?(M z'1rTQ;zmX@KW2Q 7M]#%X8 +=O! ! '.# ! "'.'4?2"/4?67&&'6&'#"8FI;1v]އtt%%% . 1 5 # K*)D $K=/I^]o$  #!    e-B[B.X? $'&5$7!!%RIA Vt !;LS^CN/?HN32&'&/$76767676767674'&'&'&'&3&#!#3&Vi ,]zmH`R B]Dwcpp>8 4+TpsNA?{2a>H&@W]N8=mfD;Ui|j 28Tm;bNWvr?AcBA  /#LHqW~TqZo?247_(\??KR32&'&/$76767676767674'&'&'&'&'#3676'#5Vi ,]znH`Q B]Dwcqo?8 5,TotNA?|1b=H&AW]KZ vT qDνUj{j 28Tm;aNWwr?AdAA  .#MHqWTqZp?1>?,v N{ V b,9BHLR$'.'.+##"'&5327676765%746767%6;&''"63$/.'&'&##"/47>7.#"32?>5"'&'75'363276765&=?#"&/&'&'&/5432?#"3"&54!!7'5%#>32#"'./#"'#/5? +>"-57=6$,$5A  g I{pf5$+>U66r(;)$,*H&'F,a  V% 6H-&'5nk@_5e3+C<4rw#  &1 w- GO$6(  "aAw=t97 0 !I?A"},/E`t&Y*"t!&_)5e6E:{B$!r9]L + &!)"(9&9 2*Xm /'! : 4,V0bo=$'+7pf=(  %Rb1Z:B{9r]]8?Q$~   Z>"+|>m2i=!A΀+ (  #= )0?c"A*L!P3dfDC#=9X&H""* ,97A!GGB3 /XE"5'   !!A}>}@x6Qv-J1 ;Gh*!!?67676?!%!%2"'&'476F(S:MY.kcٲ \_oP7}D1~(M%%C\Cu7G=C" DQ%44iY(\L%={ (M11(h*8!!?67676?!%!%2"'&'476%2"'&'476F(S:MY.kcٲ \_oP7}D1~(M%%C1~(M%%C\Cu7G=C" DQ%44iY(\L%={ (M11(%={ (M11(h*8F!!?67676?!%!%2"'&'476%2"'&'476%2"'&'476F(S:MY.kcٲ \_oP7}D1~(M%%C1~(M%%D1~(L$%C\Cu7G=C" DQ%44iY(\L%={ (M11(%={ (M11(%={ (M11(h"'29?!7%'!'7#?676767!%'%!'#3'!#3!4 ZbM~xMc$E(S:MYbdy7Pn\_oP7xG@xiÍ  1PP4dCu7G=  D%44iY(\+n6.735' /77%'&/'//&7 &/Kc~n`ʴ QWO4+& J %eVGzNʶRVOq"&.  ( F"jos>\ Y ! #3 YQ|T}zz z~^! #3T}z~^! Tz~^ ^T^ 3#^T\ Y  3#\QT0(R 0z~T0(R (RTC@w 5!Hz~TC@w !5@wT}Y<?I32&'&/$76767676767674'&'&'&'&!!!!#2Vi ,]znH`Q B]Dwcqo?8 5,TotNA?|1b=H&AW]/MDνUj{i 28Tm;aNWwr?AdB@  .#MHpX~TqZp?1ʼnS 3?CM32&'&/$76767676767674'&'&'&'&!!!!!!#+Uj +]znGaQ A^Dvcqo?8 5,TotNA?{2a>H%AW]  MD;Ui|i 18Sm;bNWvr?AcB@  .#MGqW~Tp[o?1݋WĉbL%-63 # '&&576&'$6'&;8!a;8VH : c73uD998+f-fG9ddr[$63 #"'567%'$767%$$v61iFR$Q +}|@+_B)WbuN8(!6?3##5#535&/&7&'75&'&N3XI,:I:u;_,;uJXf}#%f;;g+uf,Y "7%&763 3##5#53$47cF'؜chiӹUƛc9"b9B:|99Ev8(V!$-3 #"'&'&5'&'&'m4@*̶)'۲z F qq D**Z G8`:6763 !?3##!%&9S(*~Gԛԩ7(3Rl3!!#$65/&#!5!3о f̽H+,HVW+ 9A,)Ue:ez9c#+3332#&7'# &767#7%&cI$oseLHw+tWx:tVZL мHW+1e[>Z(7'77#!3###53%&'7'3c cccGdcG*+c+::TGU="73##5#53$632$=8Ym88śW&#z*H) 4rI88n<cT'+g "6'&'&# &5%#53533#%cG(*ciiԹHU ǜc9#9VB:)99wp~ 7!''C-~`ZP~G Vt{ 9?3'!'3'#7%35' '!#'? 77G$`p| L're$1  xg '*=} {{7 'hFECf$2D6!%632!!!&#"4!!3#3# 7|)gG-l1mChY 1(쎎 #=NCw) '* #'+7C!!7!!3#'&7&6>74&'&3#3#%>74&'&'&7&6'TZNWW=x}hd>SNQ4lZvSSSS?SNR3lZx}gdS6"PggkcCT7jUPAZVDT7iUPAZQggk&* #'+/37;?CGKOSW[_cgy73#53#53#3#53#53#3#53#53#3#53#53#3#53#53#3#53#53#3#53#53#3#53#3#53#!%$%$3!!6'SSSSSSWWWWWWXXXXXXWWWWWWXXXXXXWWWWWWTTTTTTSSSSWWWWpZ/7J1*3TWWTWWTWWTWWTWWTWWTWWTWOTWF8%?5m F2'(!!7!!!55!''WV!X6YW~~OO() #/;C!!73'35'7#!'35'7!#7!'35'7!#7!'35'7!#7!'35'7!#73##7(SwORz=wOO{wPP=wST|wOQ8vSU}wSR9wTT{wSOқwOLXOOOOOOOOO6O &* %)-159%632!!3!#3!535#3#!&#"'55!!!!!!ߩ ކZh@;JTTjƋg[DJ>an7,,qX8u:`-.}-./L/L+ ;Sb363?6?673! !5&/&/&/6'537675'&'6?4'&'&%!#76'536?6'&#] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP7 -1MJ=]*=-737 1:- ;4j7: *TJ*7#W9 *JP07 ='$c !3G # : `'DW @ 6 >{#G-$3>#:#*-dSW * D} * #?Wf!!363?6?673! !5&/&/&/6'537675'&'6?4'&'&%!#76'536?6'&#+}] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP7 -1MJ=]*=-737 1:- ;4j7: *TJ*7#W9 *Jj>P07 ='$c !3G # : `'DW @ 6 >{#G-$3>#:#*-dSW * D} *  <Wbn}363?6?673! !5&/&/&/7676#&763'&'&7?6'&&'&576'&'&] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP -WJ173:^ - GtG$& ]n0 , :-cq:0 $AJ&  P07 ='$c !3G # : `'` zt4-z7):=m Pa&p:0]CPM^$`G&3fq@'  <Wbn}363?6?673! !5&/&/&/7676#&763'&'&7?6'&&'&576'&'&!!] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP -WJ173:^ - GtG$& ]n0 , :-cq:0 $AJ&  }P07 ='$c !3G # : `'` zt4-z7):=m Pa&p:0]CPM^$`G&3fq@'  <@am|363?6?673! !5&/&/&/!!!#76'536?6'&#&'&576'&'&] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP#}M;3j7: *SJ)7#W: *J} :-cq:0 #@J&  P07 ='$c !3G # : `'$9$)-dTV * C~ *L]CPM^$`G&3fq@'  <GMYh363?6?673! !5&/&/&/33##5#53&'&576'&'&] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP]ggFC ` :-cq:0 $AJ&  P07 ='$c !3G # : `'=J ^]CPM]$aF'3gp@'  <GMYhl363?6?673! !5&/&/&/33##5#53&'&576'&'&!!] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP]ggFC ` :-cq:0 $AJ&  }P07 ='$c !3G # : `'=J ^]CPM]$aF'3gp@'  <GMYhlp363?6?673! !5&/&/&/33##5#53&'&576'&'&!!%!!] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP]ggFC ` :-cq:0 $AJ&  P07 ='$c !3G # : `'=J ^]CPM]$aF'3gp@'  <@jv363?6?673! !5&/&/&/!!47676"'&'53767'&/576'&%&'&576'&'&] t`Jg`JtT}4]}TGItM&W0mT7sQ -Z*c7`Wd}JstP#}m4)G DZ 1w#*P7&J#M4 *Tw Z6 $ F :-dp:0 #@J'  P07 ='$c !3G # : `'$IM# #Z*0)d* G]=3-:`D 3]DQM]$`G'4gq@& p>v76''?6?67%373!5366?4?7''4'#/'&7#"'&?'&7"/!5&/&/27677676767676?'? |B`T}4]}(9ItM&W0] t`JgC8-# wcKPx0!  7#& =4 7 ' 0  'ZG }JstPmT7H8 -Z*c7  JA7 =7 9M77 C *-' D`P ='0$c !P07  zQ ?0AF7 'W$0 p 6 c&)-G=JA>`'b3G # : w@&w '0W v7'S +FNT`g372??6%737%!'%'77/&'&/#&' 775'#!'$'75&'& ?53-] $ggz$SJDjgJ Zqm@*JRr vQsQ -Z*c7`Wd}J a6 J3G ԍ' 3P*J 0 4 'Gf0H46O[M J# # : `0 5%   [a V /=IUk67%367676'7376775'!7 %75'&#3/&& !5%&'%%&/&''4?' 3%#&77#7'%67ce  œ ) *  u!$"q%'b'4>95 6)XJJ`L<'"3 ^S #|;. ^7-M:;6U",? UUP 2 ,7,hGe   !"YKT#F{:O(& D vsX(*w3(*' vP{Q  #3535353535353535353'&'&'&'&?6?6765'5?676767674/&/&'&+/&'&'&7676?67676767627-/5;6C6pX -p#C-iBUIUI=%$E#)Il1B;C@743',2jO8.5@?;58,3"X/' *2ʜK%,(/[0*WIWU98,p)-  Hh}% _;@|f8'  .1>'=,Bt@kGTt[V70**'L4߳*9 = 0-%*WfJoJ!#(.1B/jF &TsasNA68=2"-+y A$ "-kvwQ  %&.){ngfoG$ %F+'eT=8,=B!49(# L%&'&5%3632'7654'##%& bG"D8*pԍqqKq)q0,UqEhPGYRpaT qSt!%&# &54763$gu,:IXX40~ c:WŰfX.3X34md5%3!765&!7'!epcLpPOGG8 ~>a8baFEE1N4%63 '&?3?%$$#6'&'&# &5643T*UT7p#7Pp*E~ 4!51 3lSw*&?)Ta+UpGAGN*appF8aU b,(E563 7'&"'&76# '56%&'&547376TK; G8b +bT-5 b*8~TG*b8F9Gc) >}cÌv8;8G**V5=67632632632/#67'7&7636'&#&##&3'&V.& j?%&9GVH9ceHHdd9+rVU+HVVdd+ds88:d=:VH'dSGX-VH\V9T +;H++c`G;e:UTVGp*8s::Gs::76?6''3' #B^& AO.{8-,;g, Mq2oz+%""),R! ! T<Tz~]f K6'./76767#"''67"7>7$=76;2>''#B&*N:X6 ,_!(# t 1Ey8s^J.u$/ 8s ANNF9 +/| $E=RJD 5Lr^T=/HiU⺾p(X 8?KRV32&'&/$76767676767674'&'&'&'&'#3676'#!!0Uj +]znGaQ A^Dvcqo?8 5,TotNA?{2a>H%AW]KY w󮮃T pa D;Ui|i 18Sm;bNWvr?AcBA  .#LHqW~TpZp?1>?,u N{\r!33#\3. fE=&&576&6'6%'66&7632>76326$63&$5&&"{b?'\Icl4@Fд&H <+-/&  3#A)1[.%%kLe?oC6Z1oE7 ,&XDvbA3&'3#7.'7'.54#""363#"'&##"'&54654'>54&#"#"'.##&'6767&'&'67654&#"#.5465'&54654'&'&'&'.#">52632#"'&#"''#"'">7.#"#&67&'&#"67'#7&'&5654&##&'&5467>7.'>7&'>7&5&'63>74'67676=&567676767654'67675&#"6765&'&'4767.'26'6767>32327>327632>532673.'.''"#5&'#"'&'53>32#>7>5%"'&'232676&/26'632#&'2'672&'632&'672&#623266#67&5676+&5632.''5&'65'6%4&5<7>7>=&5.#67.''65'#32635&#"&'&53b    ; *[ 0     M    %  W  )6f  #'= <   ( > 1# !AN   4D$"J 4                +>  '   #  -6      2 !   0Z /')5@,  >DDW.  - a    )!$ >,9< '5)< %q+"    c  s p  |  I  hEJ  8+ 4     65@ T+')  $*  Q Z  ]" 8 . 3 ~     %   9  A Ho 61*     &:     LPaf   #$    2I(96         A !       6-&   $   - 9  3  7  >DCY9  %  -  )  XP0L$6 C*d x\      ;w  K-%   1      " 0 |  7   jU- R }iQ  1@[}"2?5'.'>&'6767&'&#>7'6767.#67654'&#'276767267676732767327675'+"'&'>7&'&#"&'&'7676765676732767.'654&'22654&'7'6767>327>32"&'"#57&#"&'&#""'&'7672767>54&56767.546732636767&'&#"#6'&'7232#"'&'67632#>7.#"6767327#"#>7'4&5467&'&54632>6767   [ '    O  )O5     ")  =%& ')  x ( 2 7A#'+.D/ &C>%&?.?H%   LW)2 Wa 446 &J*+d I   B;|Y    kN5#T%+GE5$(*0"!>&=3-Bw  03__ $"3:&-O'&+ˡ #:  y-4 ;(     # 6  & & + 3(  "   : /6      ",B8 0Eja4'-+J2C/4 &P!("=&532$16.6%;# /!C)oc   7 I)}e $'6&&! *$  K 7=\nw0f5(C 4 n % "0-"v2c   :l  ) B*?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni000Duni001Duni001FMVspaceStopsignBeamBearing LooseBearing FixedBearing LeftTorque RightTorque MVLeftBracketMVRightBracketMVMultiplicationMVPlusMVCommaMVMinusMVPeriod MVDivisionMVZeroMVOneMVTwoMVThreeMVFourMVFiveMVSixMVSevenMVEightMVNine MVRightArrow Conclusion LessOrEqual Corresponds LargerOrEqual EquivalenceMVAtPickupLetterCESignEurDig LightningBOLogoBarOver MobilefoneIndustry Estatically CoffeecupLineloadBOLogoLBOLogoP HollowBox ArrowOver LeftScissors CuttingLine RightScissorsTelefon ClockLogo CheckedBox AngleSign CrossedBoxYinYang PointingHandDivides DividesNot Congruent NotCongruentStrikingThrough Explosionsafe Laserbeam WritingHandEurHvEurCrEurTm PeaceDovebarOver BiohazardInfo RadioactivityEMail MVArrowDownMundusBSEFreeFootball arrowOverCutLeftCutLineCutRightfaxFAXFax Wheelchair Gentsroom LadiesroomEmailCTNeutralMale HermaphroditeFemale HERMAPHRODITEFEMALEMALEMaleMale FemaleFemale FemaleMaleCross CeltCrossAnkh WashCottonWashSyntheticsWashWoolHeart EstimatedSignTumbler NoTumbler OktoSteel HexaSteel SquareSteel RectSteel CircSteel FlatSteel SquarePipeRectPipeLSteelTTSteelCircPipeTSteel RoundedLSteelRoundedTTSteel RoundedTSteel NoBreakSpaceShillingDeleaturPfundEURBouquet EyesDollarFrownyNoChemicalCleaningSmileyCircledA CleaningA CleaningP SoftHyphenBicycleironingIroningIRONING NoIroningMineSign RewindToIndex RewindToStartRewindForward ForwardToEndForwardToIndexMoveUpMoveDownToTopToBottom CleaningF CleaningFFSunMoonMercuryVenusMarsJupiterSaturnUranusNeptunePlutoEarthBleechNoBleech ComputerMouseSerialInterfaceKeyboard SerialPort ParallelPortPrinter AtNinetyFiveShortNinetyfiveAtSixty ShortSixty ShortFiftyAtForty ShortForty SpecialForty ShortThirtyHandWashNoWash Recycling PackingWasteAriesTaurusGeminiCancerLeoVirgoLibraScorpio Sagittarius CapricornAquariusPiscesValveFlorin CleaningPPMultiplicationDotBat WomanFaceManFaceŽID [openscad-2019.05/testdata/ttf/marvosym-3.10/readme.txt0000644000076500000240000000243013402025764022741 0ustar kintelstaff00000000000000MARVOSYM.TTF ~~~~~~~~~~~~ 1. The purpose ~~~~~~~~~~~~~~ The Windows True Type Symbol Font MARVOSYM.TTF is a valuable addition for any office or civil engineering purpose. It contains often-needed but rarely available symbols as Fax Machine, Answering Machine, Cellular Phone, Steel Profile Symbols, the original Euro Currency Symbol and lots more. 2. How to install ~~~~~~~~~~~~~~~~~ In Windows XP, all you need to do is to copy MARVOSYM.TTF into the directory C:\WINDOWS\FONTS. Alternatively, you can follow the menu path Start / Settings / Control Panel / Fonts / File / Install New Font. In Ubunbtu Linux, type sudo cp marvosym.ttf /usr/share/fonts/truetype at the console. 3. The status ~~~~~~~~~~~~~ MarVoSym.ttf is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at http://scripts.sil.org/OFL 4. The distribution status ~~~~~~~~~~~~~~~~~~~~~~~~~~ The Archive MARVOSYM.ZIP is freely distributable. The latest version of the file can be downloaded from http://www.marvosym.de 5. How to contact the author in the event of questions or problems. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can contact me by e-mail: mail@martinvogel.de 6. Known problems ~~~~~~~~~~~~~~~~~ None :-) openscad-2019.05/tests/CMakeLists.txt0000644000076500000240000016021413454517233020014 0ustar kintelstaff00000000000000# instructions - see ../doc/testing.txt #set(DEBUG_OSCD 1) # print debug info during cmake cmake_minimum_required(VERSION 2.8) if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_GREATER 2.8.3) # Explicitly use new include policy to avoid globally shadowing included modules # http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0017 cmake_policy(SET CMP0017 NEW) endif() # Needed for cmake < 2.8.3 include(CMakeParseArguments.cmake) project(tests) set(CMAKE_MODULE_PATH {$CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../cmake/Modules/") # MCAD if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../libraries/MCAD/__init__.py) message(FATAL_ERROR "MCAD not found. You can install from the OpenSCAD root as follows: \n git submodule update --init") endif() # Image comparison - expected test image vs actual generated image # Imagemagick if (SKIP_IMAGEMAGICK) if (NOT DIFFPNG) # cross-building depends on this set(IMAGE_COMPARE_EXECUTABLE "/bin/echo") endif() else() find_package(ImageMagick COMPONENTS convert) if (ImageMagick_convert_FOUND) message(STATUS "ImageMagick convert executable found: " ${ImageMagick_convert_EXECUTABLE}) set(IMAGE_COMPARE_EXECUTABLE ${ImageMagick_convert_EXECUTABLE}) else() message(STATUS "Couldn't find imagemagick 'convert' program") set(IMAGEMAGICK_NOBINARY 1) set(DIFFPNG 1) endif() endif() if ( not ${IMAGEMACIK_NOBINARY} ) if ( "${ImageMagick_VERSION_STRING}" VERSION_LESS "6.5.9.4" ) message(STATUS "ImageMagick version less than 6.5.9.4, cannot use -morphology comparison") message(STATUS "ImageMagick Using older image comparison method") set(COMPARATOR "old") endif() execute_process(COMMAND ${IMAGE_COMPARE_EXECUTABLE} --version OUTPUT_VARIABLE IM_OUT ) if ( ${IM_OUT} MATCHES "OpenMP" ) # http://www.daniloaz.com/en/617/systems/high-cpu-load-when-converting-images-with-imagemagick message(STATUS "ImageMagick: OpenMP bug workaround - setting MAGICK_THREAD_LIMIT=1") set(CTEST_ENVIRONMENT "${CTEST_ENVIRONMENT};MAGICK_THREAD_LIMIT=1") endif() message(STATUS "Comparing magicktest1.png with magicktest2.png") set(IM_TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/magicktest1.png" "${CMAKE_CURRENT_SOURCE_DIR}/magicktest2.png") set(COMPARE_ARGS ${IMAGE_COMPARE_EXECUTABLE} ${IM_TEST_FILES} -alpha On -compose difference -composite -threshold 10% -morphology Erode Square -format %[fx:w*h*mean] info:) # compare arguments taken from test_cmdline_tool.py message(STATUS "Running ImageMagick compare: ${COMPARE_ARGS}") execute_process(COMMAND ${COMPARE_ARGS} RESULT_VARIABLE IM_RESULT OUTPUT_VARIABLE IM_OUT ) message(STATUS "Result: ${IM_RESULT}") if ( NOT ${IM_RESULT} STREQUAL "0" ) message(STATUS "magicktest1.png and magicktest2.png were incorrectly detected as identical") message(STATUS "Using alternative image comparison") set(DIFFPNG 1) endif() endif() if ( ${DIFFPNG} ) set(IMAGE_COMPARE_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/diffpng) set(COMPARATOR "diffpng") include_directories(../src/ext/lodepng) add_executable(diffpng diffpng.cpp ../src/ext/lodepng/lodepng.cpp) message(STATUS "using diffpng for image comparison") endif() # Search for MCAD in correct place set(CTEST_ENVIRONMENT "${CTEST_ENVIRONMENT};OPENSCADPATH=${CMAKE_CURRENT_SOURCE_DIR}/../libraries") # Platform specific settings # # GUI binary tests # if(EXISTS "$ENV{OPENSCAD_BINARY}") set(OPENSCAD_BINPATH "$ENV{OPENSCAD_BINARY}") elseif(APPLE) set(OPENSCAD_BINPATH "${CMAKE_CURRENT_SOURCE_DIR}/../OpenSCAD.app/Contents/MacOS/OpenSCAD") elseif (MINGW_CROSS_ENV_DIR) set(OPENSCAD_BINPATH "${CMAKE_CURRENT_SOURCE_DIR}/../mingw32/release/openscad.exe") elseif(WIN32) set(OPENSCAD_BINPATH "${CMAKE_CURRENT_SOURCE_DIR}/../Release/openscad.exe") elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../bin/openscad") set(OPENSCAD_BINPATH "${CMAKE_CURRENT_SOURCE_DIR}/../bin/openscad") else() set(OPENSCAD_BINPATH "${CMAKE_CURRENT_SOURCE_DIR}/../openscad") endif() if(EXISTS "${OPENSCAD_BINPATH}") message(STATUS "Found OpenSCAD binary: ${OPENSCAD_BINPATH}") else() message(STATUS "Couldn't find the OpenSCAD binary: ${OPENSCAD_BINPATH}") message(FATAL_ERROR "Please build the OpenSCAD binary and place it here: ${OPENSCAD_BINPATH}" ) endif() # # Tags tests as disabled. This is more convenient than removing them manually # from the lists of filenames # macro(disable_tests) foreach (TESTNAME ${ARGN}) # message("Disabling ${TESTNAME}") list(APPEND DISABLED_TESTS ${TESTNAME}) endforeach() endmacro() # # Tags tests as experimental. This will add all the --enable= # options for the tagged tests. # macro(experimental_tests) foreach (TESTNAME ${ARGN}) # message("Marking as experimental ${TESTNAME}") list(APPEND EXPERIMENTAL_TESTS ${TESTNAME}) endforeach() endmacro() # # Tags the given tests as belonging to the given CONFIG, i.e. will # only be executed when run using ctest -C # # Usage example: set_test_config(Heavy dumptest_testname opencsgtest_testname2) # function(set_test_config CONFIG) list(APPEND ${CONFIG}_TEST_CONFIG ${ARGN}) list(FIND TEST_CONFIGS ${CONFIG} FOUND) if (FOUND EQUAL -1) list(APPEND TEST_CONFIGS ${CONFIG}) # Export to parent scope set(TEST_CONFIGS ${TEST_CONFIGS} PARENT_SCOPE) endif() # Export to parent scope set(${CONFIG}_TEST_CONFIG ${${CONFIG}_TEST_CONFIG} PARENT_SCOPE) endfunction() # # Returns a list of test configs # function(get_test_config TESTNAME CONFIGS) foreach(CONFIG ${TEST_CONFIGS}) list(FIND ${CONFIG}_TEST_CONFIG ${TESTNAME} IDX) if (${IDX} GREATER -1) list(APPEND ${CONFIGS} ${CONFIG}) endif() endforeach() if (${CONFIGS}) # Convert to a format understood by add_test() string(REPLACE ";" "|" ${${CONFIGS}} ${CONFIGS}) # Export to parent scope set(${CONFIGS} ${${CONFIGS}} PARENT_SCOPE) endif() endfunction() # # Returns into the FULLNAME variable the global full test name (identifier) # given a test command and source filename # function(get_test_fullname TESTCMD FILENAME FULLNAME) get_filename_component(TESTCMD_NAME ${TESTCMD} NAME_WE) get_filename_component(TESTNAME ${FILENAME} NAME_WE) string(REPLACE " " "_" TESTNAME ${TESTNAME}) # Test names cannot include spaces set(${FULLNAME} ${TESTCMD_NAME}_${TESTNAME}) # Export to parent scope set(${FULLNAME} ${${FULLNAME}} PARENT_SCOPE) endfunction() # # Check if a test file is a 2D test # function(is_2d FULLNAME RESULT) list(FIND ALL_2D_FILES ${FULLNAME} IDX) if (${IDX} GREATER -1) set(${RESULT} 1 PARENT_SCOPE) else() set(${RESULT} PARENT_SCOPE) endif() endfunction() # # This functions adds cmd-line tests given files. # # Usage add_cmdline_test(testbasename [EXE ] [ARGS ] # [SCRIPT